From 97c5634354eaf0eaff043b1bf91039398507db60 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 10 Dec 2019 17:45:47 +0100 Subject: [PATCH 001/560] Fixes #7171 --- radio/src/io/bootloader_flash.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/radio/src/io/bootloader_flash.cpp b/radio/src/io/bootloader_flash.cpp index 0df79800f..1dd5188b6 100644 --- a/radio/src/io/bootloader_flash.cpp +++ b/radio/src/io/bootloader_flash.cpp @@ -37,10 +37,13 @@ bool isBootloader(const char * filename) void bootloaderFlash(const char * filename) { FIL file; - f_open(&file, filename, FA_READ); uint8_t buffer[1024]; UINT count; + pausePulses(); + + f_open(&file, filename, FA_READ); + static uint8_t unlocked = 0; if (!unlocked) { unlocked = 1; @@ -69,6 +72,7 @@ void bootloaderFlash(const char * filename) } watchdogSuspend(0); + WDG_RESET(); if (unlocked) { lockFlash(); @@ -76,4 +80,6 @@ void bootloaderFlash(const char * filename) } f_close(&file); + + resumePulses(); } From 249576f79b8be9abb923ce0ce66c2576f18acc40 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 10 Dec 2019 22:19:04 +0100 Subject: [PATCH 002/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 25c8f1344..298dc3f45 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1666,3 +1666,4 @@ Justin Farnsworth James Snodgrass Peter Schneider Norman Schenck +Boris Hemmer From b06e8651413bebfbc013afc5d768b2a49a64dc77 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 12 Dec 2019 14:44:34 +0100 Subject: [PATCH 003/560] Wismy/x7 access (#7182) X7 ACCESS --- companion/src/CMakeLists.txt | 4 +- companion/src/firmwares/boards.cpp | 5 + companion/src/firmwares/boards.h | 10 +- .../src/firmwares/opentx/opentxinterface.cpp | 10 ++ companion/src/simulation/simulatorwidget.cpp | 1 + radio/src/gui/128x64/lcd.cpp | 2 +- radio/src/gui/128x64/model_setup.cpp | 6 +- radio/src/lua/CMakeLists.txt | 23 ++-- radio/src/lua/api_general.cpp | 2 + radio/src/switches.cpp | 4 +- .../common/arm/stm32/bluetooth_driver.cpp | 8 +- radio/src/targets/simu/opentxsimulator.cpp | 2 + radio/src/targets/taranis/CMakeLists.txt | 78 ++++++++----- radio/src/targets/taranis/board.h | 17 ++- radio/src/targets/taranis/hal.h | 110 ++++++++++++++++-- radio/src/targets/taranis/keys_driver.cpp | 6 + radio/src/targets/taranis/lcd_driver_spi.cpp | 2 +- tools/build-frsky.py | 11 ++ 18 files changed, 240 insertions(+), 61 deletions(-) diff --git a/companion/src/CMakeLists.txt b/companion/src/CMakeLists.txt index 16245c848..413756985 100644 --- a/companion/src/CMakeLists.txt +++ b/companion/src/CMakeLists.txt @@ -341,7 +341,9 @@ endif() # the current flavour is not automatically added if build in the current cmake iteration, so always # add its library name to be sure -if(PCB STREQUAL X7 AND PCBREV STREQUAL T12) +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 X9D+ AND PCBREV STREQUAL 2019) set(FLAVOUR x9d+2019) diff --git a/companion/src/firmwares/boards.cpp b/companion/src/firmwares/boards.cpp index 726cae256..9f42fa9c3 100644 --- a/companion/src/firmwares/boards.cpp +++ b/companion/src/firmwares/boards.cpp @@ -66,6 +66,7 @@ uint32_t Boards::getFourCC(Type board) case BOARD_TARANIS_XLITES: return 0x3B78746F; case BOARD_TARANIS_X7: + case BOARD_TARANIS_X7_ACCESS: return 0x3678746F; case BOARD_TARANIS_X9E: return 0x3578746F; @@ -116,6 +117,7 @@ int Boards::getEEpromSize(Board::Type board) case BOARD_TARANIS_XLITES: case BOARD_TARANIS_XLITE: case BOARD_TARANIS_X7: + case BOARD_TARANIS_X7_ACCESS: case BOARD_TARANIS_X9LITE: case BOARD_TARANIS_X9LITES: case BOARD_TARANIS_X9D: @@ -154,6 +156,7 @@ int Boards::getFlashSize(Type board) case BOARD_TARANIS_XLITES: case BOARD_TARANIS_XLITE: case BOARD_TARANIS_X7: + case BOARD_TARANIS_X7_ACCESS: case BOARD_TARANIS_X9LITE: case BOARD_TARANIS_X9LITES: case BOARD_TARANIS_X9D: @@ -497,6 +500,8 @@ QString Boards::getBoardName(Board::Type board) return "MEGA2560"; case BOARD_TARANIS_X7: 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: diff --git a/companion/src/firmwares/boards.h b/companion/src/firmwares/boards.h index c3cd3ff59..1057d3706 100644 --- a/companion/src/firmwares/boards.h +++ b/companion/src/firmwares/boards.h @@ -40,6 +40,7 @@ namespace Board { BOARD_9XRPRO, BOARD_AR9X, BOARD_TARANIS_X7, + BOARD_TARANIS_X7_ACCESS, BOARD_TARANIS_X9D, BOARD_TARANIS_X9DP, BOARD_TARANIS_X9DP_2019, @@ -241,7 +242,12 @@ inline bool IS_TARANIS_XLITES(Board::Type board) inline bool IS_TARANIS_X7(Board::Type board) { - return board == Board::BOARD_TARANIS_X7; + return board == Board::BOARD_TARANIS_X7 || board == Board::BOARD_TARANIS_X7_ACCESS; +} + +inline bool IS_TARANIS_X7_ACCESS(Board::Type board) +{ + return board == Board::BOARD_TARANIS_X7_ACCESS; } inline bool IS_TARANIS_X9LITE(Board::Type board) @@ -321,7 +327,7 @@ inline bool HAS_EXTERNAL_ANTENNA(Board::Type board) inline bool IS_ACCESS_RADIO(Board::Type board, QString &id) { - return (IS_TARANIS_XLITES(board) || IS_TARANIS_X9LITE(board) || board == Board::BOARD_TARANIS_X9DP_2019 || board == Board::BOARD_X10_EXPRESS || + return (IS_TARANIS_XLITES(board) || IS_TARANIS_X9LITE(board) || board == Board::BOARD_TARANIS_X9DP_2019 || board == Board::BOARD_X10_EXPRESS || IS_TARANIS_X7_ACCESS(board) || (IS_HORUS(board) && id.contains("internalaccess"))); } diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 9509c3c28..aaff3123b 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -80,6 +80,8 @@ const char * OpenTxEepromInterface::getName() return "OpenTX for FrSky Taranis X9E"; case BOARD_TARANIS_X7: return "OpenTX for FrSky Taranis X7"; + case BOARD_TARANIS_X7_ACCESS: + return "OpenTX for FrSky Taranis X7 Access"; case BOARD_TARANIS_X9LITES: return "OpenTX for FrSky Taranis X9-Lite S"; case BOARD_TARANIS_X9LITE: @@ -330,6 +332,9 @@ int OpenTxEepromInterface::save(uint8_t * eeprom, const RadioData & radioData, u else if (IS_TARANIS_X9LITE(board)) { variant |= TARANIS_X9LITE_VARIANT; } + else if (IS_TARANIS_X7_ACCESS(board)) { + variant |= TARANIS_X7_VARIANT; + } else if (IS_TARANIS_X7(board)) { variant |= TARANIS_X7_VARIANT; } @@ -1254,6 +1259,11 @@ void registerOpenTxFirmwares() addOpenTxTaranisOptions(firmware); registerOpenTxFirmware(firmware); + /* FrSky X7 Access board */ + firmware = new OpenTxFirmware("opentx-x7access", Firmware::tr("FrSky Taranis X7 / X7S Access"), BOARD_TARANIS_X7_ACCESS); + addOpenTxTaranisOptions(firmware); + registerOpenTxFirmware(firmware); + /* FrSky X-Lite S/PRO board */ firmware = new OpenTxFirmware("opentx-xlites", Firmware::tr("FrSky Taranis X-Lite S/PRO"), BOARD_TARANIS_XLITES); addOpenTxTaranisOptions(firmware); diff --git a/companion/src/simulation/simulatorwidget.cpp b/companion/src/simulation/simulatorwidget.cpp index c96cd480e..2a472fc00 100644 --- a/companion/src/simulation/simulatorwidget.cpp +++ b/companion/src/simulation/simulatorwidget.cpp @@ -64,6 +64,7 @@ SimulatorWidget::SimulatorWidget(QWidget * parent, SimulatorInterface * simulato radioUiWidget = new SimulatedUIWidgetX9LITE(simulator, this); break; case Board::BOARD_TARANIS_X7: + case Board::BOARD_TARANIS_X7_ACCESS: radioUiWidget = new SimulatedUIWidgetX7(simulator, this); break; case Board::BOARD_TARANIS_X9D: diff --git a/radio/src/gui/128x64/lcd.cpp b/radio/src/gui/128x64/lcd.cpp index 15d543e72..91baa3d19 100644 --- a/radio/src/gui/128x64/lcd.cpp +++ b/radio/src/gui/128x64/lcd.cpp @@ -20,7 +20,7 @@ #include "opentx.h" -display_t displayBuf[DISPLAY_BUFFER_SIZE]; +display_t displayBuf[DISPLAY_BUFFER_SIZE] __DMA; void lcdClear() { diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 5860bf2ca..be933710b 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -259,7 +259,11 @@ void onModelAntennaSwitchConfirm(const char * result) #define EXTERNAL_ANTENNA_ROW #endif -#if defined(PCBX7) || defined(PCBX9LITE) +#if defined(PCBX7ACCESS) + #define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)) + #define TRAINER_PPM_PARAMS_ROW (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW) + #define TRAINER_ROWS LABEL(Trainer), 0, IF_BT_TRAINER_ON(TRAINER_BLUETOOTH_ROW), TRAINER_CHANNELS_ROW, TRAINER_PPM_PARAMS_ROW +#elif defined(PCBX7) || defined(PCBX9LITE) #if defined(BLUETOOTH) #define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)), #else diff --git a/radio/src/lua/CMakeLists.txt b/radio/src/lua/CMakeLists.txt index f0ed96e94..abdf0f11e 100644 --- a/radio/src/lua/CMakeLists.txt +++ b/radio/src/lua/CMakeLists.txt @@ -16,15 +16,16 @@ set(LUA_INCLUDES ) if(PYTHONINTERP_FOUND) - add_lua_export_target(x9lite ${LUA_INCLUDES} -DPCBTARANIS -DPCBX9LITE -DPCBX9) - add_lua_export_target(x9lites ${LUA_INCLUDES} -DPCBTARANIS -DPCBX9LITES -DPCBX9LITE -DPCBX9) - add_lua_export_target(x7 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_X7) - add_lua_export_target(xlite ${LUA_INCLUDES} -DPCBTARANIS -DPCBXLITE) - add_lua_export_target(xlites ${LUA_INCLUDES} -DPCBTARANIS -DPCBXLITES -DPCBXLITE -DGYRO) - add_lua_export_target(x9d ${LUA_INCLUDES} -DPCBTARANIS -DPCBX9D -DPCBX9) - add_lua_export_target(x9e ${LUA_INCLUDES} -DPCBTARANIS -DPCBX9E -DPCBX9) - 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(t16 ${LUA_INCLUDES} -DPCBHORUS -DPCBX10 -DRADIO_T16) + add_lua_export_target(x9lite ${LUA_INCLUDES} -DPCBTARANIS -DPCBX9LITE -DPCBX9) + add_lua_export_target(x9lites ${LUA_INCLUDES} -DPCBTARANIS -DPCBX9LITES -DPCBX9LITE -DPCBX9) + add_lua_export_target(x7 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_X7) + add_lua_export_target(x7access ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7ACCESS -DPCBX7 -DRADIO_X7) + add_lua_export_target(xlite ${LUA_INCLUDES} -DPCBTARANIS -DPCBXLITE) + add_lua_export_target(xlites ${LUA_INCLUDES} -DPCBTARANIS -DPCBXLITES -DPCBXLITE -DGYRO) + add_lua_export_target(x9d ${LUA_INCLUDES} -DPCBTARANIS -DPCBX9D -DPCBX9) + add_lua_export_target(x9e ${LUA_INCLUDES} -DPCBTARANIS -DPCBX9E -DPCBX9) + 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(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 ea2ce80a4..f49025745 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -34,6 +34,8 @@ #include "lua/lua_exports_x10.inc" #elif defined(PCBX9E) #include "lua/lua_exports_x9e.inc" +#elif defined(PCBX7ACCESS) + #include "lua/lua_exports_x7access.inc" #elif defined(RADIO_X7) #include "lua/lua_exports_x7.inc" #elif defined(RADIO_T12) diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index 6067f4d8c..b02c05861 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -162,7 +162,9 @@ void getSwitchesPosition(bool startup) CHECK_2POS(SW_SI); #endif -#if defined(PCBHORUS) || defined(PCBX7) +#if defined(PCBX7ACCESS) + CHECK_2POS(SW_SI); +#elif defined(PCBHORUS) || defined(PCBX7) CHECK_2POS(SW_SI); CHECK_2POS(SW_SJ); #endif diff --git a/radio/src/targets/common/arm/stm32/bluetooth_driver.cpp b/radio/src/targets/common/arm/stm32/bluetooth_driver.cpp index 1d861e1d6..1d4bee5e0 100644 --- a/radio/src/targets/common/arm/stm32/bluetooth_driver.cpp +++ b/radio/src/targets/common/arm/stm32/bluetooth_driver.cpp @@ -24,7 +24,9 @@ Fifo btTxFifo; Fifo btRxFifo; -#if defined(PCBX7) || defined(PCBXLITE) +#if defined(PCBX7ACCESS) +//nothing to do +#elif defined(PCBX7) || defined(PCBXLITE) volatile uint8_t btChipPresent = 0; #endif @@ -117,7 +119,9 @@ extern "C" void BT_USART_IRQHandler(void) uint8_t byte = USART_ReceiveData(BT_USART); btRxFifo.push(byte); TRACE("BT %02X", byte); -#if defined(PCBX7) || defined(PCBXLITE) +#if defined(PCBX7ACCESS) + //nothing to do +#elif defined(PCBX7) || defined(PCBXLITE) if (!btChipPresent) { // This is to differentiate X7 and X7S and X-Lite with/without BT btChipPresent = 1; diff --git a/radio/src/targets/simu/opentxsimulator.cpp b/radio/src/targets/simu/opentxsimulator.cpp index 4a948da00..be01f250e 100644 --- a/radio/src/targets/simu/opentxsimulator.cpp +++ b/radio/src/targets/simu/opentxsimulator.cpp @@ -605,6 +605,8 @@ class OpenTxSimulatorFactory: public SimulatorFactory return Board::BOARD_HORUS_X12S; #elif defined(PCBX10) return Board::BOARD_X10; +#elif defined(PCBX7ACCESS) + return Board::BOARD_TARANIS_X7_ACCESS; #elif defined(PCBX7) return Board::BOARD_TARANIS_X7; #elif defined(PCBX9LITES) diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 6715cc46a..26fee42b1 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -52,39 +52,39 @@ elseif(PCB STREQUAL X9D+) if (${PCBREV} STREQUAL 2019) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" OFF) option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" ON) - set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") + set(FLAVOUR x9d+2019) set(CPU_TYPE STM32F4) set(CPU_TYPE_FULL STM32F407xE) # for size report + set(LINKER_SCRIPT targets/taranis/stm32f4_flash.ld) + set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} startup_stm32f40_41xxx.s ) - set(LINKER_SCRIPT targets/taranis/stm32f4_flash.ld) add_definitions(-DSTM32F40_41xxx) add_definitions(-DSOFTWARE_VOLUME -DPWR_BUTTON_${PWR_BUTTON} -DHARDWARE_POWER_MANAGEMENT_UNIT) set(STATUS_LEDS YES) set(PXX2 ON) set(PXX_FREQUENCY "HIGH") - set(FLAVOUR x9d+2019) else() option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON) option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" OFF) + set(FLAVOUR x9d+) set(CPU_TYPE STM32F2) set(CPU_TYPE_FULL STM32F205xE) # for size report set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) set(AUX_SERIAL_DRIVER ../common/arm/stm32/aux_serial_driver.cpp) set(STATUS_LEDS NO) - set(FLAVOUR x9d+) endif() elseif(PCB STREQUAL X9D) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON) option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" OFF) + set(FLAVOUR x9d) set(CPU_TYPE STM32F2) set(CPU_TYPE_FULL STM32F205xE) # for size report set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) option(HAPTIC "Haptic support" OFF) set(LUA_EXPORT lua_export_x9d) - set(FLAVOUR x9d) add_definitions(-DPCBX9D -DPCBX9) add_definitions(-DEEPROM_VARIANT=0) set(GUI_DIR 212x64) @@ -97,34 +97,58 @@ elseif(PCB STREQUAL X9D) set(STATUS_LEDS NO) elseif(PCB STREQUAL X7) set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") - set(CPU_TYPE STM32F2) - set(CPU_TYPE_FULL STM32F205xE) # for size report - set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) set(HAPTIC YES) - if(PCBREV STREQUAL T12) - set(LUA_EXPORT lua_export_t12) - set(FLAVOUR t12) - set(NAVIGATION_TYPE 9x) - add_definitions(-DRADIO_T12) - add_definitions(-DEEPROM_VARIANT=0x4001) - option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" OFF) - else() - option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON) - option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" OFF) - set(LUA_EXPORT lua_export_x7) - set(FLAVOUR x7) - set(NAVIGATION_TYPE x7) - add_definitions(-DRADIO_X7) - add_definitions(-DEEPROM_VARIANT=0x4000) - endif() - add_definitions(-DPCBX7 -DSOFTWARE_VOLUME) - add_definitions(-DPWR_BUTTON_${PWR_BUTTON}) set(GUI_DIR 128x64) set(BITMAPS_TARGET 9x_bitmaps) set(FONTS_TARGET 9x_fonts_1bit) set(LCD_DRIVER lcd_driver_spi.cpp) set(GVAR_SCREEN model_gvars.cpp) set(STATUS_LEDS YES) + add_definitions(-DPCBX7 -DSOFTWARE_VOLUME) + add_definitions(-DPWR_BUTTON_${PWR_BUTTON}) + if(PCBREV STREQUAL T12) + option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" OFF) + set(FLAVOUR t12) + 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_t12) + add_definitions(-DRADIO_T12) + add_definitions(-DEEPROM_VARIANT=0x4001) + elseif(PCBREV STREQUAL ACCESS) + option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" OFF) + option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" ON) + set(FLAVOUR x7access) + set(NAVIGATION_TYPE x7) + set(CPU_TYPE STM32F4) + set(CPU_TYPE_FULL STM32F407xE) # for size report + set(LINKER_SCRIPT targets/taranis/stm32f4_flash.ld) + set(LUA_EXPORT lua_export_x7access) + add_definitions(-DRADIO_X7) + add_definitions(-DEEPROM_VARIANT=0x4000) + add_definitions(-DPCBREV=${PCBREV}) + add_definitions(-DPCBX7ACCESS) + set(FIRMWARE_TARGET_SRC + ${FIRMWARE_TARGET_SRC} + startup_stm32f40_41xxx.s + ) + add_definitions(-DSTM32F40_41xxx) + set(PXX2 ON) + set(PXX_FREQUENCY "HIGH") + add_definitions(-DHARDWARE_POWER_MANAGEMENT_UNIT) + else() + option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON) + option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" OFF) + set(FLAVOUR x7) + 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(LUA_EXPORT lua_export_x7) + add_definitions(-DRADIO_X7) + add_definitions(-DEEPROM_VARIANT=0x4000) + endif() elseif(PCB STREQUAL X9LITE) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" OFF) option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" ON) @@ -229,7 +253,7 @@ if(PCB STREQUAL XLITES) ) endif() -if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES OR PCB STREQUAL X9LITE OR PCB STREQUAL X9LITES OR (PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019)) +if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES OR PCB STREQUAL X9LITE OR PCB STREQUAL X9LITES OR (PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019) OR (PCB STREQUAL X7 AND PCBREV STREQUAL ACCESS)) add_definitions(-DINTERNAL_MODULE_SERIAL) if(PXX_FREQUENCY STREQUAL HIGH) add_definitions(-DPXX_FREQUENCY_HIGH) diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 07b7f3dba..a5d8ca825 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -338,7 +338,11 @@ enum EnumSwitchesPositions SW_SI1, SW_SI2, #endif -#if defined(PCBX7) +#if defined(PCBX7ACCESS) + SW_SI0, + SW_SI1, + SW_SI2, +#elif defined(PCBX7) SW_SI0, SW_SI1, SW_SI2, @@ -396,6 +400,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(PCBX7ACCESS) + #define NUM_SWITCHES 7 + #define STORAGE_NUM_SWITCHES 8 + #define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 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_WITH_DETENT << 2); // S1 = pot without detent, S2 = pot with detent #elif defined(PCBX7) #define NUM_SWITCHES 8 #define STORAGE_NUM_SWITCHES NUM_SWITCHES @@ -689,7 +698,9 @@ extern uint32_t telemetryErrors; void telemetryPortInvertedInit(uint32_t baudrate); // PCBREV driver -#if defined(PCBX7) +#if defined(PCBX7ACCESS) + #define HAS_SPORT_UPDATE_CONNECTOR() true +#elif defined(PCBX7) #define IS_PCBREV_40() (GPIO_ReadInputDataBit(PCBREV_GPIO, PCBREV_GPIO_PIN) == Bit_SET) #define HAS_SPORT_UPDATE_CONNECTOR() IS_PCBREV_40() #elif defined(SPORT_UPDATE_PWR_GPIO) @@ -785,7 +796,7 @@ void bluetoothInit(uint32_t baudrate, bool enable); void bluetoothWriteWakeup(); uint8_t bluetoothIsWriting(); void bluetoothDisable(); -#if defined(PCBX9LITES) +#if defined(PCBX9LITES) || defined(PCBX7ACCESS) #define IS_BLUETOOTH_CHIP_PRESENT() (true) #elif defined(PCBX9LITE) #define IS_BLUETOOTH_CHIP_PRESENT() (false) diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 235e5eefb..8a1aecd2f 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -193,6 +193,23 @@ #define TRIMS_GPIO_PIN_LVU GPIO_Pin_0 // PB.00 #define TRIMS_GPIO_REG_LVD GPIOB->IDR #define TRIMS_GPIO_PIN_LVD GPIO_Pin_1 // PB.01 +#elif defined(PCBX7ACCESS) + #define TRIMS_GPIO_REG_LHR GPIOD->IDR + #define TRIMS_GPIO_PIN_LHR GPIO_Pin_15 // PD.15 + #define TRIMS_GPIO_REG_LHL GPIOC->IDR + #define TRIMS_GPIO_PIN_LHL GPIO_Pin_1 // PC.01 + #define TRIMS_GPIO_REG_LVD GPIOE->IDR + #define TRIMS_GPIO_PIN_LVD GPIO_Pin_6 // PE.06 + #define TRIMS_GPIO_REG_LVU GPIOE->IDR + #define TRIMS_GPIO_PIN_LVU GPIO_Pin_5 // PE.05 + #define TRIMS_GPIO_REG_RVD GPIOC->IDR + #define TRIMS_GPIO_PIN_RVD GPIO_Pin_3 // PC.03 + #define TRIMS_GPIO_REG_RHR GPIOE->IDR + #define TRIMS_GPIO_PIN_RHR GPIO_Pin_3 // PE.03 + #define TRIMS_GPIO_REG_RVU GPIOC->IDR + #define TRIMS_GPIO_PIN_RVU GPIO_Pin_2 // PC.02 + #define TRIMS_GPIO_REG_RHL GPIOE->IDR + #define TRIMS_GPIO_PIN_RHL GPIO_Pin_4 // PE.04 #elif defined(PCBX7) #define TRIMS_GPIO_REG_LHL GPIOD->IDR #define TRIMS_GPIO_PIN_LHL GPIO_Pin_15 // PD.15 @@ -351,8 +368,13 @@ #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 + #if defined(PCBX7ACCESS) + #define SWITCHES_GPIO_REG_C_H GPIOD->IDR + #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_10 // PD.10 + #else + #define SWITCHES_GPIO_REG_C_H GPIOE->IDR + #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_0 // PE.00 + #endif #else #define STORAGE_SWITCH_C #define HARDWARE_SWITCH_C @@ -524,13 +546,19 @@ #endif // X7 P400 P401 headers additionnal momentary switches -#if defined(PCBX7) +#if defined(PCBX7ACCESS) #define STORAGE_SWITCH_I #define HARDWARE_SWITCH_I - #define STORAGE_SWITCH_J - #define HARDWARE_SWITCH_J #define SWITCHES_GPIO_REG_I GPIOC->IDR #define SWITCHES_GPIO_PIN_I GPIO_Pin_13 // PC.13 + #define STORAGE_SWITCH_J +#elif defined(PCBX7) + #define STORAGE_SWITCH_I + #define HARDWARE_SWITCH_I + #define SWITCHES_GPIO_REG_I GPIOC->IDR + #define SWITCHES_GPIO_PIN_I GPIO_Pin_13 // PC.13 + #define STORAGE_SWITCH_J + #define HARDWARE_SWITCH_J #define SWITCHES_GPIO_REG_J GPIOD->IDR #define SWITCHES_GPIO_PIN_J GPIO_Pin_10 // PD.10 #endif @@ -639,6 +667,12 @@ #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(PCBX7ACCESS) + #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 | GPIO_Pin_13) + #define KEYS_GPIOD_PINS (GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_14 | GPIO_Pin_15) + #define KEYS_GPIOE_PINS (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_X7) #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 @@ -898,6 +932,14 @@ #define LED_RED_GPIO_PIN GPIO_Pin_4 // PE.04 #define LED_GREEN_GPIO GPIOE #define LED_GREEN_GPIO_PIN GPIO_Pin_5 // PE.05 +#elif defined(PCBX7ACCESS) + #define STATUS_LEDS + #define GPIO_LED_GPIO_ON GPIO_SetBits + #define GPIO_LED_GPIO_OFF GPIO_ResetBits + #define LED_BLUE_GPIO GPIOB + #define LED_BLUE_GPIO_PIN GPIO_Pin_1 // PB.01 + #define LED_RED_GPIO GPIOC + #define LED_RED_GPIO_PIN GPIO_Pin_4 // PC.04 #elif defined(PCBX7) #define STATUS_LEDS #define GPIO_LED_GPIO_ON GPIO_SetBits @@ -982,6 +1024,26 @@ #define INTMODULE_DMA_STREAM_IRQHandler DMA2_Stream7_IRQHandler #define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF7 #define INTMODULE_DMA_CHANNEL DMA_Channel_4 +#elif defined(PCBX7ACCESS) + #define INTMODULE_RCC_APB1Periph 0 + #define INTMODULE_RCC_APB2Periph RCC_APB2Periph_USART1 + #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2) + #define INTMODULE_PWR_GPIO GPIOC + #define INTMODULE_PWR_GPIO_PIN GPIO_Pin_5 // PC.05 + #define INTMODULE_GPIO GPIOB + #define INTMODULE_TX_GPIO_PIN GPIO_Pin_6 // PB.06 + #define INTMODULE_RX_GPIO_PIN GPIO_Pin_7 // PB.07 + #define INTMODULE_GPIO_PinSource_TX GPIO_PinSource6 + #define INTMODULE_GPIO_PinSource_RX GPIO_PinSource7 + #define INTMODULE_USART USART1 + #define INTMODULE_GPIO_AF GPIO_AF_USART1 + #define INTMODULE_USART_IRQHandler USART1_IRQHandler + #define INTMODULE_USART_IRQn USART1_IRQn + #define INTMODULE_DMA_STREAM DMA2_Stream7 + #define INTMODULE_DMA_STREAM_IRQ DMA2_Stream7_IRQn + #define INTMODULE_DMA_STREAM_IRQHandler DMA2_Stream7_IRQHandler + #define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF7 + #define INTMODULE_DMA_CHANNEL DMA_Channel_4 #elif defined(PCBX9E) || defined(PCBX9DP) || defined(RADIO_X7) #define INTMODULE_PULSES #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) @@ -1051,9 +1113,9 @@ #endif // External Module -#if defined(PCBXLITE) || defined(PCBX9LITE) || (defined(PCBX9DP) && PCBREV >= 2019) +#if defined(PCBXLITE) || defined(PCBX9LITE) || (defined(PCBX9DP) && PCBREV >= 2019) || defined(PCBX7ACCESS) #define EXTMODULE_RCC_APB2Periph (RCC_APB2Periph_TIM8 | RCC_APB2Periph_USART6) - #if defined(PCBX9DP) && PCBREV >= 2019 + #if (defined(PCBX9DP) && PCBREV >= 2019) || defined(PCBX7ACCESS) #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) #define EXTMODULE_PWR_GPIO GPIOD #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // PD.08 @@ -1268,7 +1330,7 @@ #define TELEMETRY_RCC_APB1Periph RCC_APB1Periph_USART2 #define TELEMETRY_DIR_GPIO GPIOD #define TELEMETRY_DIR_GPIO_PIN GPIO_Pin_4 // PD.04 -#if defined(PCBXLITE) || defined(PCBX9LITE) || (defined(PCBX9DP) && PCBREV >= 2019) +#if defined(PCBXLITE) || defined(PCBX9LITE) || (defined(PCBX9DP) && PCBREV >= 2019) || defined(PCBX7ACCESS) #define TELEMETRY_DIR_OUTPUT() TELEMETRY_DIR_GPIO->BSRRH = TELEMETRY_DIR_GPIO_PIN #define TELEMETRY_DIR_INPUT() TELEMETRY_DIR_GPIO->BSRRL = TELEMETRY_DIR_GPIO_PIN #else @@ -1324,6 +1386,13 @@ #define SPORT_UPDATE_PWR_GPIO_PIN GPIO_Pin_8 // PD.08 #define GPIO_SPORT_UPDATE_PWR_GPIO_ON GPIO_SetBits #define GPIO_SPORT_UPDATE_PWR_GPIO_OFF GPIO_ResetBits +#elif defined(PCBX7ACCESS) + #define SPORT_MAX_BAUDRATE 400000 + #define SPORT_UPDATE_RCC_AHB1Periph RCC_AHB1Periph_GPIOB + #define SPORT_UPDATE_PWR_GPIO GPIOB + #define SPORT_UPDATE_PWR_GPIO_PIN GPIO_Pin_3 // PB.03 + #define GPIO_SPORT_UPDATE_PWR_GPIO_ON GPIO_SetBits + #define GPIO_SPORT_UPDATE_PWR_GPIO_OFF GPIO_ResetBits #elif defined(PCBX7) #define SPORT_MAX_BAUDRATE 250000 // < 400000 #define SPORT_UPDATE_RCC_AHB1Periph RCC_AHB1Periph_GPIOB @@ -1372,12 +1441,22 @@ // #define INTMODULE_HEARTBEAT_EXTI_LINE EXTI_Line9 // #define INTMODULE_HEARTBEAT_EXTI_IRQn EXTI9_5_IRQn // #define INTMODULE_HEARTBEAT_EXTI_IRQHandler EXTI9_5_IRQHandler -#elif defined(RADIO_X7) +#elif defined(PCBX7ACCESS) + #define INTMODULE_HEARTBEAT + #define INTMODULE_HEARTBEAT_REUSE_INTERRUPT_ROTARY_ENCODER + #define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOA + #define INTMODULE_HEARTBEAT_GPIO GPIOA + #define INTMODULE_HEARTBEAT_GPIO_PIN GPIO_Pin_7 // PA.07 + #define INTMODULE_HEARTBEAT_EXTI_PortSource EXTI_PortSourceGPIOA + #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) #define INTMODULE_HEARTBEAT #define INTMODULE_HEARTBEAT_REUSE_INTERRUPT_ROTARY_ENCODER #define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOC #define INTMODULE_HEARTBEAT_GPIO GPIOC - #define INTMODULE_HEARTBEAT_GPIO_PIN GPIO_Pin_7 + #define INTMODULE_HEARTBEAT_GPIO_PIN GPIO_Pin_7 // PC.07 #define INTMODULE_HEARTBEAT_EXTI_PortSource EXTI_PortSourceGPIOC #define INTMODULE_HEARTBEAT_EXTI_PinSource GPIO_PinSource7 #define INTMODULE_HEARTBEAT_EXTI_LINE EXTI_Line7 @@ -1646,6 +1725,15 @@ #define I2C_WP_GPIO_PIN GPIO_Pin_7 // PD.07 #define I2C_SCL_GPIO_PinSource GPIO_PinSource8 #define I2C_SDA_GPIO_PinSource GPIO_PinSource9 +#elif defined(PCBX7ACCESS) + #define I2C_RCC_AHB1Periph RCC_AHB1Periph_GPIOB + #define I2C_SPI_GPIO GPIOB + #define I2C_SDA_GPIO_PIN GPIO_Pin_9 // PB.09 + #define I2C_SCL_GPIO_PIN GPIO_Pin_8 // PB.08 + #define I2C_WP_GPIO GPIOB + #define I2C_WP_GPIO_PIN GPIO_Pin_5 // PB.05 + #define I2C_SDA_GPIO_PinSource GPIO_PinSource9 + #define I2C_SCL_GPIO_PinSource GPIO_PinSource8 #elif defined(PCBX9DP) && PCBREV >= 2019 #define I2C_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOF) #define I2C_SPI_GPIO GPIOB @@ -1759,7 +1847,7 @@ #define HAPTIC_CCMR1 TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2 #define HAPTIC_CCER TIM_CCER_CC2E #define BACKLIGHT_BDTR TIM_BDTR_MOE -#elif defined(PCBX9DP) && PCBREV >= 2019 +#elif (defined(PCBX9DP) && PCBREV >= 2019) || defined(PCBX7ACCESS) #define HAPTIC_PWM #define HAPTIC_RCC_AHB1Periph RCC_AHB1Periph_GPIOA #define HAPTIC_RCC_APB2Periph RCC_APB2Periph_TIM1 diff --git a/radio/src/targets/taranis/keys_driver.cpp b/radio/src/targets/taranis/keys_driver.cpp index ccaf60760..424c9345b 100644 --- a/radio/src/targets/taranis/keys_driver.cpp +++ b/radio/src/targets/taranis/keys_driver.cpp @@ -195,6 +195,12 @@ uint32_t switchState(uint8_t index) #elif defined(PCBXLITE) ADD_3POS_CASE(D, 3); // no SWE, SWF, SWG and SWH on XLITE +#elif defined(PCBX7ACCESS) + ADD_3POS_CASE(D, 3); + ADD_2POS_CASE(F); + ADD_2POS_CASE(H); + ADD_2POS_CASE(I); + // no SWJ on XLITE #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 50eb13982..c3ab17629 100644 --- a/radio/src/targets/taranis/lcd_driver_spi.cpp +++ b/radio/src/targets/taranis/lcd_driver_spi.cpp @@ -311,7 +311,7 @@ void lcdInit() issued by the other parts of the code. */ -#if defined(PCBX9DP) && PCBREV >= 2019 +#if (defined(PCBX9DP) && PCBREV >= 2019) || defined(PCBX7ACCESS) #define LCD_DELAY_NEEDED() true #else #define LCD_DELAY_NEEDED() (!WAS_RESET_BY_WATCHDOG_OR_SOFTWARE()) diff --git a/tools/build-frsky.py b/tools/build-frsky.py index 9e538bc4a..3db1e97fb 100755 --- a/tools/build-frsky.py +++ b/tools/build-frsky.py @@ -103,6 +103,17 @@ boards = { "MULTIMODULE": "NO", "CROSSFIRE": "NO", "DEFAULT_MODE": "2", + }, + "X7ACCESS": { + "PCB": "X7", + "PCBREV": "ACCESS", + "LUA": "NO_MODEL_SCRIPTS", + "GVARS": "YES", + "AUTOUPDATE": "YES", + "PXX1": "YES", + "MULTIMODULE": "NO", + "CROSSFIRE": "NO", + "DEFAULT_MODE": "2", } } From aa33b0c52a48f6c1d4ee343ca8bc3399a4f0ec8b Mon Sep 17 00:00:00 2001 From: Alexander Novikov <31191831+mr-pokryshkin@users.noreply.github.com> Date: Thu, 12 Dec 2019 16:45:46 +0300 Subject: [PATCH 004/560] Companion: Russian UI (#7180) * Updated: Russian translation * Updated: Russian translation * Updated: Russian translation --- companion/src/CMakeLists.txt | 2 +- companion/src/translations.cpp | 2 +- companion/src/translations/companion_ru.ts | 15257 +++++++++++-------- 3 files changed, 9224 insertions(+), 6037 deletions(-) diff --git a/companion/src/CMakeLists.txt b/companion/src/CMakeLists.txt index 413756985..0603c40cf 100644 --- a/companion/src/CMakeLists.txt +++ b/companion/src/CMakeLists.txt @@ -123,7 +123,7 @@ configure_file(${COMPANION_SRC_DIRECTORY}/simulator.desktop.in ${CMAKE_CURRENT_B ### Generate .qm files and assemble resource (qrc) file. # available Companion translations (src/translations/*.ts) -set(LANGUAGES cs de en es fi fr it pl sv zh_CN ja) +set(LANGUAGES cs de en es fi fr it pl ru sv zh_CN ja) foreach(language ${LANGUAGES}) list(APPEND companion_TS translations/companion_${language}.ts) endforeach(language) diff --git a/companion/src/translations.cpp b/companion/src/translations.cpp index 03172dac8..76d63b425 100644 --- a/companion/src/translations.cpp +++ b/companion/src/translations.cpp @@ -45,7 +45,7 @@ QStringList const Translations::getAvailableTranslations() //<< "nl_NL" << "pl_PL" //<< "pt_PT" - //<< "ru_RU" + << "ru_RU" << "sv_SE" << "zh_CN" << "ja_JP" ; diff --git a/companion/src/translations/companion_ru.ts b/companion/src/translations/companion_ru.ts index 148edd16c..20cdbc733 100644 --- a/companion/src/translations/companion_ru.ts +++ b/companion/src/translations/companion_ru.ts @@ -1,110 +1,144 @@ - + AileronsPage - + No - + Нет - + Yes, controlled by a single channel - + Да, управляются одним каналом - + Yes, controlled by two channels - + Да, управляются двумя каналами - + <br>First Aileron Channel: - + <br>Первый канал элеронов: - + Second Aileron Channel: - + Второй канал элеронов: AirbrakesPage - + No - + Нет - + Yes, controlled by a single channel - + Да, управляются одним каналом - + Yes, controlled by two channels - + Да, управляются двумя каналами - + <br>First Airbrake Channel: - + <br>Первый канал воздушного тормоза: - + Second Airbrake Channel: - + Второй канал воздушного тормоза: + + + + AppData + + + Application Settings have been saved to + %1 + Настройки приложения сохранены в + %1 + + + + Could not save Application Settings to file "%1" + Не удалось сохранить настройки приложения в файл "%1" + + + + because the file could not be saved (check access permissions). + файл нельзя сохранить (проверьте права доступа). + + + + for unknown reasons. + причина неизвестна. + + + + AppMessages + + + Show this message again at next startup? + Показывать это сообщение при следующем запуске? AppPreferencesDialog - + Edit Settings - + Настройки - + Radio Profile - + Профиль аппаратуры - - - - - - Open Folder - - - - + Default Channel Order - Порядок следов. каналов + Порядок каналов - + Build Options - + Параметры прошивки - + Menu Language - + Язык меню - + Default Stick Mode - Режим стиков + Режим стиков (мода) - + Select Image - + Выбрать картинку - + + + + + + + Select Folder + Выбрать папку + + + Mode selection: Mode 1: @@ -127,1034 +161,1227 @@ Mode 4: - + Mode 1 (RUD ELE THR AIL) - + Mode 2 (RUD THR ELE AIL) - + Mode 3 (AIL ELE THR RUD) - + Mode 4 (AIL THR ELE RUD) - + Splash Screen - + Заставка при включении - - + + The profile specific folder, if set, will override general Backup folder - + Папка с резервными копиями. Относится к выбранному профилю, переопределяет настройки приложения - + Backup folder - + Резервное копирование - + If set it will override the application general setting - + Переопределяет папку, заданную в настройках приложения - + if set, will override general backup enable - + Переопределяет настроки приложения - + <html><head/><body><p>Channel order</p><p><br/></p><p>Defines the order of the default mixes created on a new model.</p></body></html> - + <html><head/><body><p>Порядок каналов</p><p><br/></p><p>Задает порядок микшеров при создании новой модели.</p></body></html> - + R E T A - + R E A T - + R T E A - + R T A E - + R A E T - + R A T E - + E R T A - + E R A T - + E T R A - + E T A R - + E A R T - + E A T R - + T R E A - + T R A E - + T E R A - + T E A R - + T A R E - + T A E R - + A R E T - + A R T E - + A E R T - + A E T R - + A T R E - + A T E R - - Use OpenTX firmware nightly builds - + + Simulator Volume Gain + Усиление звука в симуляторе - - Use Companion nightly builds - + + Profile Name + Название профиля + + + + Clear Image + Убрать картинку + + + + Append version number to FW file name + Добавить номер версии к названию файла прошивки + + + + Offer to write FW to Tx after download + Предложить обновить прошивку после загрузки + + + + Radio Type + Тип передатчика + + + + Other Settings + Другие настройки + + + + General Settings + Основные настройки + + + + SD Structure path + Папка с содержимым SD + + + + Application Settings + Настройки приложения + + + + Show splash screen when Companion starts + Показывать заставку при загрузке Companion + + + + Automatic check for Companion updates + Автоматически проверять наличие обновлений Companion + + + + + Enable automatic backup before writing firmware + Автоматически делать резервную копию перед обновлением прошивки + + + + Automatic check for OpenTX firmware updates + Автоматически проверять наличие обновлений прошивки (OpenTX) + + + + Splash Screen Library + Галерея изображений + + + + Google Earth Executable + Запуск Google Earth + + + + Only show user splash images + Показывать только пользовательские изображения + + + + Show user and companion splash images + Показывать встроенные и пользовательские изображения - Simulator Volume Gain - - - - - Profile Name - - - - - Remove Profile - - - - - Clear Image - - - - - Append version number to FW file name - - - - - Offer to write FW to Tx after download - - - - - Radio Type - - - - - Other Settings - - - - - General Settings - Основные настройки - - - - SD Structure path - - - - - Set voice language. -May be different from firmware language - - - - - Voice Language - - - - - Application Settings - - - - - Show splash screen when Companion starts - - - - - Automatic check for Companion updates - - - - - - Enable automatic backup before writing firmware - - - - - Automatic check for OpenTX firmware updates - - - - - Splash Screen Library - - - - - Files to keep - - - - - Find Executable - - - - - Google Earth Executable - - - - - Only show user splash images - - - - - Show user and companion splash images - - - - User Splash Screens - + Пользовательские заставки - + Automatic Backup Folder - + Папка для резервн. копий - - Use model wizard when creating a new model - - - - + Simulator Settings - + Настройки симулятора - + Simulator BackLight - + Подсветка в симуляторе - + Enable - + Включить - + + most recently used files + часто используемых файлов + + + + Startup Settings + Запуск приложения + + + + Remember + Запомнить + + + + <html><head/><body><p>This option maintains the behaviour from older OpenTx versions where empty model slots are preserved when a model is deleted or moved. </p><p>When this option is de-selected, the other models may be re-arranged to fill the gap left by the removed model.</p></body></html> + <html><head/><body><p>Это опция нужна, чтобы при удалении или перемещении модели сохранить поведение как старых версиях OpenTX. </p><p>Если отключить, то при удалении модели другие модели могут быть перемещены, чтобы убрать пустые слоты</p></body></html> + + + + Remove empty model slots when deleting models (only applies for radios w/out categories) + Удалять пустые слоты при удалении модели (только если нет категорий) + + + + Output Logs Folder + Папка с журналами + + + + Debug Output Logging + Журнал событий + + + + Use model wizard + использовать мастер + + + + Open model editor + открыть редактор + + + + Just create the model + просто создать модель + + + + Select Executable + Указать файл + + + + Action on New Model + Создание новой модели + + + + <html><head/><body><p>Keep a log of all debugging messages generated by the desktop Companion/Simulator applications. An OpenTX developer may request this to help diagnose an issue.</p></body></html> + <html><head/><body><p>Сохранение отладочных сообщений из Companion и симулятора. При поиске проблем разработчики OpenTX могут попросить эти журналы.</p></body></html> + + + + Application (Companion/Simulator) + приложения (Companion/Симулятор) + + + + <html><head/><body><p>Keep a log of all messages generated by the radio firmware when running in Simulator. This is the same information one would also see in the Simulator <span style=" font-style:italic;">Debug Output</span> window.</p></body></html> + <html><head/><body><p>Сохранение всех сообщений прошивки запущенной в симуляторе. Это те же сообщения, что вы можете увидеть в симуляторе, в окне <span style=" font-style:italic;">Debug Output</span></p></body></html> + + + + Radio Firmware (in Simulator) + прошивки передатчика (в симуляторе) + + + + Release channel + Версии обновлений + + + + Releases (stable) + Релизы (стабильные версии) + + + + Release candidates (testing) + Предварительные версии (тестовые) / Release candidates + + + + Nightly builds (unstable) + Ночные сборки (нестабильные версии) + + + Blue - + Синяя - + Green - + Зеленая - + Red - + Красная - + Orange - + Оранжевая - + Yellow - + Желтая - + + Screenshot capture folder + Папка для скриншотов + + + Joystick - + Джойстик - + Calibrate - + Калибровка - - Simulator capture folder - - - - + Only capture to clipboard - + Не сохранять, только копировать в буфер обмена - + Remember simulator switch values - + Запоминать положения тумблеров в симуляторе - + My Radio - + + <p><b>You cannot switch Radio Type or change Build Options while there are unsaved file changes. What do you wish to do?</b></p> <ul><li><i>Save All</i> - Save any open file(s) before saving Settings.<li><li><i>Reset</i> - Revert to the previous Radio Type and Build Options before saving Settings.</li><li><i>Cancel</i> - Return to the Settings editor dialog.</li></ul> + <p><b>Если есть несохраненные изменения, то нельзя поменять тип передатчика и параметры прошивки. Что делать?</b></p> <ul><li><i>Сохранить все</i> - Сохранить все открытые файлы, прежде чем менять настройки.<li><li><i>Сбросить</i> - Перед сохранением вернуть все настройки назад.</li><li><i>Отмена</i> - Ничего не делать, вернуться к настройкам..</li></ul> + + + Select your snapshot folder + Выберите папку + + + + Note: Nightly builds are not available in this version, Release/RC update channel will be used. - - + + No joysticks found - + Джойстик не найден - + EMPTY: No radio settings stored in profile - + ПУСТО: в профиле нет настроек аппаратуры - + AVAILABLE: Radio settings of unknown age - + AVAILABLE: Radio settings stored %1 - + Select your library folder - + Выберите папку - - + + Select your Models and Settings backup folder - + Выберите папку для резервного копирования моделей и настроек - + + Select a folder for application logs + Выберите папку для хранения журнала событий + + + Select Google Earth executable - + Выбрать исполняемый файл Google Earth - + Select the folder replicating your SD structure - + Выберите папку, в которой хранится содержимое SD карточки - - Not possible to remove profile - - - - - The default profile can not be removed. - - - - + Open Image to load - + Выберите изображение - + Images (%1) - + Изображения (%1) - Calibration + BinEepromFormat - - Form + + Error reading %1: %2 + Ошибка чтения %1: %2 + + + + Cannot save EEPROM + Не удалось сохранить EEPROM + + + + Cannot open file %1: +%2. + Не удалось открыть файл %1: +%2. + + + + Error writing file %1: +%2. + Ошибка при записи файла %1: +%2. + + + + Invalid binary EEPROM file %1 + Неправильный бинарный EEPROM файл %1 + + + + Boards + + + Left Horizontal - - SQ + + Left Vertical - - SR + + Right Vertical - - LS2 + + Right Horizontal - - SP + + Aux. 1 - - SO + + Aux. 2 - - S4 + + + Unknown - - RS - - - - - SB - - - - - Serial Port - - - - - - - - - - - - - - Beeper volume - -0 - Quiet. No beeps at all. -1 - No Keys. Normal beeps but menu keys do not beep. -2 - Normal. -3 - Loud. -4 - Extra loud. - Громкость. - -0 - Тишина. -1 - Без кнопок. -2 - Обычная. -3 - Громкая. -4 - Очень громкая. - - - - OFF - ВЫКЛ - - - - S-Port Mirror - - - - - Telemetry - - - - - SBUS Trainer - - - - - Debug - - - - + Rud - - - Mid value - - - - - Pot. 4 - - - - - Pot. 3 - - - - - Pot. 2 - - - - - Pot. 1 - - - - - PPM 1 - - - - - Stick 3 - - - - - - Negative span - - - - - - Positive span - - - - - Stick 1 - - - - - PPM 2 - - - - - Stick 2 - - - - - Stick 4 - - - - - v - В - - - - PPM Multiplier - PPM множитель - - - - PPM 3 - - - - - PPM 4 - - - - - Battery Offset - - - - - Current Offset - - - - - S1 - - - - - S2 - - - - - S3 - - - - - SA - - - - + Ele - - Ail - - - - + Thr - - SC - - - - - LS - - - - - SD - - - - - SE - - - - - SF - - - - - SG - - - - - SH - - - - - SI - - - - - SJ - - - - - SK - - - - - SL - - - - - SM - - - - - SN - - - - - RS2 - - - - - Bluetooth + + Ail CalibrationPanel - - - - None + + Negative span - - 2 Positions Toggle + + Mid value - - 2 Positions + + Positive span + + + + + CategorizedStorageFormat + + + Can't extract RADIO/radio.bin - - 3 Positions + + Can't extract RADIO/models.txt - - Pot with detent - + + Can't extract %1 + Не удалось извлечь %1 - - Multipos switch - - - - - Pot without detent - - - - - Slider with detent + + Error loading models Channels - + Name - + Название - + Min Мин - + Max Макс - + Subtrim - + Субтриммер - + Direction - + Направление - + Curve Кривая - + PPM Center - + Linear Subtrim + Линайный субтриммер + + + + CH%1 - - Channel %1 + + Popup menu available - + + Copy + Копировать + + + + Cut + Вырезать + + + + Paste + Вставить + + + + Clear + Очистить + + + + Insert + Вставка + + + + Delete + Удалить + + + + Move Up + Сдвинуть вверх + + + + Move Down + Сдвинуть вниз + + + + Clear All + Очистить всё + + + --- - + INV + + ChecklistDialog + + + Edit Checklist + + + + + Line nn, Col nn + + + + + &Import... + + + + + &Cancel + + + + + &OK + + + + + Please note, the maximum width displayable is radio model limited. Also, renaming the model will break the link to this checklist file. + + + + + File: unknown + + + + + Open Checklist + + + + + Checklist Files (*.txt) + + + + + + + + + Model Checklist + + + + + Cannot open file for writing %1: +%2. + + + + + Cannot write to file %1: +%2. + + + + + Cannot write file %1: +%2. + Не удается записать файл %1: +%2. + + + + Cannot open file %1: +%2. + + + + + Cannot read file %1: +%2. + + + + + Line %1, Col %2 + + + + + Companion + + + The saved settings could not be imported, please try again or continue with current settings. + + + + + Import from File + + + + + Import from v%1 + + + + + Do not import + + + + + We have found possible Companion settings backup file(s). +Do you want to import settings from a file? + + + + + Import settings from a file, or start with current values. + + + + + We have found existing settings for Companion version: %1. +Do you want to import them? + +If you have a settings backup file, you may import that instead. + + + + + Select %1: + + + + + Save application settings to file... + + + + + Load application settings from file or previous version... + + + + + Reset ALL application settings to default and remove radio profiles... + + + + + Exit before settings initialization and application startup. + + + + + Print version number and exit. + + + + + Print this help text. + + + + + Reset ALL application settings to default values and remove radio profiles, are you sure? + + + + + Would you like to perform a backup first? + + + + + Application settings were reset and saved. + + + + + OpenTX Companion + + + + + Information + + + + + Warning + Звук + + + + Error + Ошибка + + + + files + + + + + Radio and Models settings + + + + + Application Settings + Настройки приложения + + + + Select or create a file for exported Settings: + + + + + Press the 'Retry' button to choose another file. + + + + + Simulator for this firmware is not yet available + + + + + Uknown error during Simulator startup. + + + + + Simulator Error + + + + + Data Load Error + + + + + Error occurred while starting simulator. + + + + + settings + + + + + <p><b>Welcome to OpenTX %1.</b></p><p>As the first step, please configure the initial Radio Profile by selecting your Radio Type, Menu Language, and Build Options.</p><p>You may also want to take this time to review the other available options in the displayed Settings dialog.</p><p>After saving your settings, we recommend you download the latest firmware for your radio by using the <i>File -&gt; Download</i> menu option.</p><p>Please visit <a href='http://www.open-tx.org'>open-tx.org</a> for latest news, updates and documentation. Thank you for choosing OpenTX!</p>- The OpenTX Team. + + + + + <p><b>Thank you for upgrading to OpenTX %1.</b></p><p>This is a major upgrade that adds and modifies a lot of things, so please make sure that you read release notes carefully to learn about the changes, and thoroughly check each of your models for proper function.</p><p>Please visit <a href='http://www.open-tx.org'>open-tx.org</a> for release notes and other documentation.</p>- The OpenTX Team. + + + + + <p>The radio type in the selected profile does not exist. Using the default type instead.</p> <p><b>Please update your profile settings!</b></p> + + + CompareDialog Compare Models - + Сравнение моделей - - Drag first model here - + + To compare models, drag and drop them anywhere in this window. + Чтобы сравнить модели перетащите их в это окно. - - Drag second model here - - - - + Close - + Закрыть - + + Style + Стиль + + + Print - + Печать - + Print to file - + В файл - - No name - + + Unnamed Model %1 + Неизвестная модель %1 - + + Click to remove this model. + Нажмите, чтобы убрать эту модель. + + + Print Document - + Распечатать - + Select PDF output file - + PDF файл для сохранения ConclusionPage - + OK, I understand. - - - - - ContributorsDialog - - - OpenTX Contributors - - - - - Main Developers - - - - - Other contributors - - - - - Companies and projects who have donated to OpenTX - - - - - People who have donated to OpenTX - - - - - Honors go to Rafal Tomczak (RadioClone), Thomas Husterer (th9x) and Erez Raviv (er9x and eePe) - - - - - OpenTX Blacklist - - - - - monthly - + Хорошо, я понял. CopyProcess - - - - Error - Ошибка - - - + Write error - + Cannot write %1 (reason: %2) - + Cannot open %1 (reason: %2) + + CreditsDialog + + + OpenTX Contributors + + + + + Honors go to Rafal Tomczak (RadioClone), Thomas Husterer (th9x) and Erez Raviv (er9x and eePe) + + + + + OpenTX Blacklist + + + + + Main developers + + + + + Translators + + + + + Companies and projects who have donated to OpenTX + + + + + People who have donated to OpenTX + + + + + Other contributors + + + + + monthly + + + + + CurveData + + + CV + + + CurveGroup - + Diff - + Expo - + Func - + Curve Кривая + + CurveReference + + + Diff(%1) + + + + + Expo(%1) + + + + + Function(%1) + + + + + Curve(%1) + + + Curves Fixed X - + Фиксированный X Custom X - + Произвольный X @@ -1168,356 +1395,933 @@ May be different from firmware language - + Curve type - + Тип кривой Curve Creator - + Параметры кривой - + Y at X=0 - + + Point size + Размер точки + + + Y at X=100 - + Both - + Обе - + x>0 - + x<0 - + Apply - + Применить - + Side - + Сторона - + Y at X=-100 - + Coefficient - + Коэффициент Curve name + Название кривой + + + + Curve %1 + Кривая %1 + + + + Popup menu available - - Curve %1 - Кривая %1 - - - + %1 points - + Linear - + Линейная - + Single Expo - + Экспонента - + Symmetrical f(x)=-f(-x) - + Симметричная f(x)=-f(-x) - + Symmetrical f(x)=f(-x) - + Симметричная f(x)=f(-x) - + Copy - + Копировать - + Paste - + Вставить - + Clear - + Очистить - + Clear all curves - + Удалить все кривые - + Are you sure you want to reset curve %1? - + Вы действительно хотите сбросить настройки Кривой %1? - + Are you sure you want to reset all curves? - + Вы действительно хотите удалить все кривые? - + Editing curve %1 + Редактирование кривой %1 + + + + Not enough free points in EEPROM to store the curve. + + + + + CustomFunctionData + + + GF - - Not enough free points in EEPROM to store the curve. + + SF + + + + + Override %1 + + + + + Trainer + + + + + Trainer RUD + + + + + Trainer ELE + + + + + Trainer THR + + + + + Trainer AIL + + + + + Instant Trim + + + + + Play Sound + + + + + Haptic + + + + + Reset + + + + + Set Timer %1 + + + + + Vario + + + + + Play Track + + + + + Play Both + + + + + Play Value + + + + + Play Script + + + + + SD Logs + + + + + Volume + + + + + Backlight + + + + + Screenshot + + + + + Background Music + + + + + Background Music Pause + + + + + Adjust %1 + + + + + SetFailsafe Int. Module + + + + + SetFailsafe Ext. Module + + + + + RangeCheck Int. Module + + + + + RangeCheck Ext. Module + + + + + Bind Int. Module + + + + + Bind Ext. Module + + + + + Timer1 + + + + + Timer2 + + + + + Timer3 + + + + + Flight + + + + + Telemetry + + + + + Rotary Encoder + + + + + REa + + + + + REb + + + + + s + + + + + + + <font color=red><b>Inconsistent parameter</b></font> + + + + + Value + + + + + played once, not during startup + + + + + repeat(%1s) + + + + + DISABLED + + + + + CFN CustomFunctionsPanel - + Switch Тумблер - + Action - + Parameters - + Enable + Включить + + + + Popup menu available - + SF%1 - + GF%1 - + ON - - Error - Ошибка - - - - Unable to find sound file %1! + + Error occurred while trying to play sound, possibly the file is already opened. (Err: %1 [%2]) - - &Delete - Удалить + + Unable to find or open sound file: +%1 + - + + Copy + + + + + Cut + + + + + Paste + + + + + Clear + + + + + Insert + + + + + Move Up + + + + + Move Down + + + + + Clear All + + + + + Value + Значение + + + + Source + Источник + + + + GVAR + + + + + Increment + + + + Delete Удалить + + + CustomizeSplashDialog - - &Copy - Копировать - - - - Ctrl+C + + Transmitter Splash Screen Editor - - &Cut - Вырезать + + + Invert + Инверт - - Ctrl+X + + + Load FW - - &Paste - Вставить + + + Load Pict + - - Ctrl+V + + + Load Profile + + + + + + Save + + + + + + Open Splash Library + + + + + + + + ... + ... + + + + FW: %1 + + + + + Pict: %1 + + + + + Profile image + + + + + Open Firmware File + + + + + Can not load embedded image from firmware file %1. + + + + + Open Image to load + + + + + Images (%1) + Изображения (%1) + + + + Cannot load the image file %1. + + + + + Cannot load profile image %1. + + + + + Cannot load the library image %1. + + + + + File Saved + + + + + The image was saved to the file %1 + + + + + Image Refresh Error + + + + + Failed to refresh image from file %1 + + + + + File Save Error + + + + + Failed to write image to %1 CyclicPage - + 90 - + 15 сек. {90?} - + 120 - + 15 сек. {120?} - + 120x + 15 сек. {120x?} + + + + 140 + 15 сек. {140?} + + + + DataField + + + Conversion error on field %1 - - 140 + + Switch + Тумблер + + + + Switch + + + + + cannot be exported on this board! + + + + + Source + Источник + + + + Source %1 cannot be exported on this board! + + + + + OpenTX only accepts %1 points in all curves + + + + + OpenTx only accepts %1 points in all curves + + + + + + OpenTX on this board doesn't accept this function + + + + + OpenTX doesn't accept this radio protocol DebugOutput - + Debug Output + + + <html><head/><body><p>Enable or disable the filter. If the button won't stay enabled, it is likely there is a syntax error in the Regular Expression entered.</p></body></html> + + + + + Filter: + + + + + <html><head/><body><p>Enter filter text here. Click the help/info button for details about using the filter. </p><p> +To <b>remove a remembered entry</b> from the filter list, first choose it, and then press <code>Shift-Delete</code> (or <code>Shift-Backspace</code>) key combination.</p></body></html> + + + + + Buffer: + + + + + Number of lines to keep in display. + + + + + Filter &Help + + + + + Show information about using the filter. + + + + + Word &Wrap + + + + + Toggle word wrapping on/off. + + + + + &Clear + + + + + Clear the output window of all text. + + + + + Enable &Filter + + + + + Turn the filter on/off. + + + + + <html><head><style>kbd {background-color: palette(alternate-base); font-size: large; white-space: nowrap;}</style></head><body><p>The filter supports two syntax types: basic matching with common wildcards as well as full Perl-style (<code>pcre</code>) Regular Expressions.</p><p>By default a filter will only show lines which match (<b>inclusive</b>). To make an <b>exclusive</b> filter which removes matching lines, prefix the filter expression with a <kbd>!</kbd> (exclamation mark).</p><p>To use <b>Regular Expressions</b> (RegEx), prefix the filter text with a <kbd>/</kbd> (slash) or <kbd>^</kbd> (up caret). <ul><li>Put the <kbd>/</kbd> or <kbd>^</kbd> after the exclusive <kbd>!</kbd> indicator if you're using one.</li><li>By default the match is case-sensitive. To make it insensitive, add the typical <kbd>/i</kbd> (slash i) operator at the end of your RegEx.</li><li>If you use a caret (^) to denote a RegEx, it will become part of the Reg. Ex. (that is, matches from start of line).</li><li>If the RegEx is invalid, the filter edit field should show a red border and you will not be able to enable the filter.</li><li>A useful resource for testing REs (with a full reference) can be found at <a href="http://www.regexr.com/">http://www.regexr.com/</a></li></ul></p><p>To use <b>basic matching</b> just type any text.<ul><li>Wildcards: <kbd>*</kbd> (asterisk) matches zero or more of any character(s), and <kbd>?</kbd> (question mark) matches any single character.</li><li>The match is always case-insensitive.</li><li>The match always starts from the beginning of a log line. To ignore characters at the start, use a leading <kbd>*</kbd> wildcard.</li><li>A trailing <kbd>*</kbd> is always implied (that is, matches anything to the end of the log line). To avoid this, use a RegEx.</li><li>You can match literal wildcard characters by prefixing them with a <kbd>\</kbd> (backslash) character (eg. "foo\*bar" matches "foo*bar").</li></ul></p><p>After <b>editing text</b>, press ENTER or TAB key (or click anywhere outside the box) to update the filter.</p><p>To <b>remove an entry</b> from the filter selector list, first choose it, and while in the line editor press <kbd>Shift-Delete</kbd> (or <kbd>Shift-Backspace</kbd>) key combination. The default filters cannot be removed. Up to 50 filters are stored.</p></body></html> + + + + + Debug Console Filter Help + + - EepromInterface + DownloadDialog - + + Downloading: + + + + + Unable to save the file %1: %2. + + + + + Download failed: %1. + + + + + EEPROMInterface + + Possible causes for this: - + - Eeprom is from a newer version of OpenTX - + - Eeprom is not from OpenTX - + - Eeprom is not from Th9X - + - Eeprom is not from Gruvin9X - + - Eeprom is not from ErSky9X - + - Eeprom is not from Er9X - + - Eeprom size is invalid - + - Eeprom file system is invalid - + - Eeprom is from a unknown board - + - Eeprom is from the wrong board - + - Eeprom backup not supported - + - Something that couldn't be guessed, sorry - + Warning: - - + + - Your radio probably uses a wrong firmware, eeprom size is 4096 but only the first 2048 are used - + - Your eeprom is from an old version of OpenTX, upgrading! - You should 'save as' to keep the old file as a backup. + To keep your original file as a backup, please choose File -> Save As specifying a different name. + + + + + EepeFormat + + + Unable to open %1: %2 - - Warnings! + + Invalid EEPROM file %1 ElevonsPage - + <br>First Elevon Channel: + Первый канал элевонов: + + + + Second Elevon Channel: + Второй канал элевонов: + + + + ExpoData + + + INP - - Second Elevon Channel: + + (@%1) @@ -1526,7 +2330,7 @@ May be different from firmware language Weight - Вес + Вес @@ -1538,42 +2342,42 @@ May be different from firmware language Offset - Смещен. + Смещение The source for the mixer - Источник для микшера + Input name - + Название Входа Flight modes - + Полётные режимы Switch - Тумблер + Тумблер Source - Источник + Источник Line name - + Название строки Stick Side - + Сторона стика @@ -1583,32 +2387,32 @@ May be different from firmware language Include Trim - Исп. трим + Использовать триммер No - + Нет Yes - + Да Curve - Кривая + Кривая Curve applied to the source. - + Кривая применяется к источнику. NEG - + МИНУС @@ -1619,131 +2423,747 @@ May be different from firmware language Switch used to enable the line. If blank then the input is considered to be "ON" all the time. - + Тумблер используется для активации линии. +Если не указан, тогда Вход всегда активен. POS - + ПЛЮС ALL + ОБЕ + + + + Edit %1 + Редактирование %1 + + + + Popup menu available - - Edit %1 + + Clear All + + + + + Set All + + + + + Invert All + Инвертировать всё + + + + ExportableTableView + + + Select All + + + + + Copy selection as TAB-delimited text + + + + + Copy selection as cooma-delimited text (CSV) + + + + + Copy selection as pipe-delimited text + + + + + Copy selection as HTML + + + + + Save selection to file + + + + + Tab-delimited text + + + + + Comma-delimited text + + + + + Pipe-delimited text + + + + + HTML + + + + + Save to file FblPage - + Throttle Channel: - + Yaw Channel: - + Pitch Channel: - + Roll Channel: + + FileSyncDialog + + + Synchronize Files + + + + + Are you sure you wish to abort the sync? + + + + + Source Folder: + + + + + Destination Folder: + + + + + %1%2 Both directions, to destination folder first + + + + + %1%2 Both directions, to source folder first + + + + + %1 Only from source folder to destination folder + + + + + %1 Only from destination folder to source folder + + + + + How to handle overwriting files which already exist in the destination folder. + + + + + Copy only if newer and different (compare contents) + + + + + Copy only if newer (do not compare contents) + + + + + Copy only if different (ignore file time stamps) + + + + + Always copy (force overwite existing files) + + + + + Any size + + + + + Skip files larger than this size. Enter zero for unlimited. + + + + + Minimum reporting level. Events of this type and of higher importance are shown. +WARNING: High log rates may make the user interface temporarily unresponsive. + + + + + Skipped + + + + + Created + + + + + Updated + + + + + Errors Only + + + + + Test-run only + + + + + Run as normal but do not actually copy anything. Useful for verifying results before real sync. + + + + + Log Level: + + + + + Filters: + + + + + The "Include" filter will only copy files which match the pattern(s). +The "Exclude" filter will skip files matching the filter pattern(s). +The Include filter is evaluated first. + + + + + One or more file pattern(s) to exclude, separated by commas. +Blank means exclude none. ?, *, and [...] wildcards accepted. + + + + + One or more file pattern(s) to include, separated by commas. +Blank means include all. ?, *, and [...] wildcards accepted. + + + + + Include: + + + + + Exclude: + + + + + Case sensitive + + + + + + Follow links + + + + + Include hidden + + + + + Recursive + + + + + Skip empty + + + + + Apply filters + + + + + Filter Options: + + + + + Folder Options: + + + + + + Options + + + + + Show extra options + + + + + Reset to defaults + + + + + Close + Закрыть + + + + Sync. Direction: + + + + + Existing Files: + + + + + Max. File Size: + + + + + MB + + + + + KB + + + + + Abort + + + + + Start + + + + + Total: <b>%1</b>; Created: <b>%2</b>; Updated: <b>%3</b>; Skipped: <b>%4</b>; Errors: <font color=%6><b>%5</b></font>; + + + + + Current: <b>%1</b> of + + + + + Source folder not found. + + + + + Destination folder not found. + + + + + Source and destination folders are the same. + + + + + Firmware + + + Possibility to enable FAI MODE (no telemetry) at field + + + + + FAI MODE (no telemetry) always enabled + + + + + Channel values displayed in us + + + + + No OverrideCH functions available + + + + + Removes D8 FrSky protocol support which is not legal for use in the EU on radios sold after Jan 1st, 2015 + + + + + Enable non certified firmwares + + + + + Use alternative SQT5 font + + + + + + Disable HELI menu and cyclic mix support + + + + + + Disable Global variables + + + + + + Enable Lua custom scripts screen + + + + + Support for PPM internal module hack + + + + + Enable HELI menu and cyclic mix support + + + + + Global variables + + + + + Pots use in menus navigation + + + + + In model setup menus automatically set source by moving the control + + + + + In model setup menus automatically set switch by moving the control + + + + + No graphical check boxes and sliders + + + + + Battery graph + + + + + Don't use bold font for highlighting active items + + + + + Enable resetting values by pressing up and down at the same time + + + + + FrSky Taranis X9D+ + + + + + Disable RAS (SWR) + + + + + FrSky Taranis X9D+ 2019 + + + + + FrSky Taranis X9D + + + + + Haptic module installed + + + + + FrSky Taranis X9E + + + + + Confirmation before radio shutdown + + + + + Horus gimbals installed (Hall sensors) + + + + + FrSky Taranis X9-Lite + + + + + FrSky Taranis X9-Lite S + + + + + FrSky Taranis X7 / X7S + + + + + FrSky Taranis X-Lite S/PRO + + + + + FrSky Taranis X-Lite + + + + + FrSky Horus X10 / X10S + + + + + + Support for ACCESS internal module replacement + + + + + FrSky Horus X10 Express / X10S Express + + + + + FrSky Horus X12S + + + + + Use ONLY with first DEV pcb version + + + + + Jumper T12 / T12 Pro + + + + + Enable non certified R9M firmwares + + + + + + Support for MULTI internal module + + + + + Jumper T16 / T16+ / T16 Pro + + + + + Support for bluetooth module + + + + + Turnigy 9XR-PRO + + + + + 9X with AR9X board + + + + + 9X with Sky9x board + + + + + Turnigy 9XR + + + + + Turnigy 9XR with m128 chip + + + + + 9X with stock board + + + + + 9X with stock board and m128 chip + + + + + 9X with Gruvin9x board + + + + + DIY MEGA2560 radio + + + FirmwarePreferencesDialog Downloads - + Загрузки - + Check for updates - + Проверить наличие обновлений - - Voice - - - - - Set voice language. -May be different from firmware language - - - - - Download Voice - - - - - Download FW - - - - + Firmware - + Прошивка - + + Download firmware + Скачать прошивку + + + + Download SD contents + Скачать содержимое SD + + + Latest Download - + Загруженная версия: + + + + Unknown + неизвестная FlapsPage - + No - + Нет - + Yes, controlled by a single channel - + Да, управляются одним каналом - + Yes, controlled by two channels - + Да, управляются двумя каналами - + <br>First Flap Channel: - + <br>Первый канал закрылков: - + Second Flap Channel: - + Второй канал закрылков: FlashEEpromDialog - + Write Models and Settings to Radio - + Записать настройки и модели в передатчик Load... - + Выбрать... @@ -1752,19 +3172,23 @@ May be different from firmware language - Allows Companion to write to older version of the firmware Check Firmware compatibility + Проверить совместимость с передатчиком + + + + <html><head/><body><p>Saves a dated copy of your eeprom to the backup folder you specified in the Companion settings before writing the current model to the radio.</p></body></html> Backup before Write - + Сделать резервную копию @@ -1789,114 +3213,59 @@ May be different from firmware language Cancel - + Отмена Write to TX - + Записать - + Current profile: %1 - + Choose Radio Backup file - + Выберите файл с резервной копией - - - - - - - - - - - - Error - Ошибка - - - - Unable to find file %1! - Невозможно найти файл %1! - - - - - - Error opening file %1: -%2. - - - - - - Invalid Models and Settings File %1 - - - - - Error reading file %1: -%2. - Ошибка при считывании файла %1: -%2. - - - - Invalid Models and Settings file %1 - - - - - - - - Warning - Звук - - - + Wrong radio calibration data in profile, Settings not patched - + Wrong radio setting data in profile, Settings not patched - - + Cannot write file %1: %2. - Не удается записать файл %1: + Не удается записать файл %1: %2. - + Error writing file %1: %2. - Ошибка при записи файла %1: + Ошибка при записи файла %1: %2. - + The radio firmware belongs to another product family, check file and preferences! - + The radio firmware is outdated, please upgrade! - + Cannot check Models and Settings compatibility! Continue anyway? @@ -1906,47 +3275,47 @@ May be different from firmware language Flash Firmware - + Обновление прошивки Load... - + Выбрать... Date & Time - + Дата Variant - + Сборка Version - + Версия Use profile start screen - + Заставка из профиля Use firmware start screen - + Заставка из прошивки Use library start screen - + Заставка из библиотеки Use another start screen - + Другая заставка @@ -1956,228 +3325,205 @@ May be different from firmware language Check Hardware compatibility - + Проверить совместимость с передатчиком Backup and restore Models and Settings - + Сделать резервную копию настроек и моделей Cancel - + Отмена Write to TX - + Записать - + Open Firmware File - + Выбрать файл с прошивкой - - - - Warning - Звук - - - + %1 may not be a valid firmware file - + %1 - не прошивка - - - - - Error - Ошибка - - - The firmware file is not valid. - + Битый файл с прошивкой. - + There is no start screen image in the firmware file. - + Profile image %1 is invalid. - + Open image file to use as radio start screen - + Выбрать картинку для заставки - + Images (%1) - + Изображения (%1) - + Image could not be loaded from %1 - + The library image could not be loaded - + Splash image not found - + Файл с заставкой не найден - + Cannot save customized firmware - + Write Firmware to Radio - + Записать прошивку в передатчик - - + + Firmware check failed - + Не удалось проверить прошивку - + Could not check firmware from radio - + Не удалось проверить прошивку передатчика - + New firmware is not compatible with the one currently installed! - + Conversion failed - + Cannot convert Models and Settings for use with this firmware, original data will be used - + Невозможно сконвертировать модели и настройки для этой прошивки, будут использованы оригинальные данные - + Restore failed - + Could not restore Models and Settings to Radio. The models and settings data file can be found at: %1 - + Flashing done - + Обновление завершено FlashProcess - + Executable %1 not found - + Writing... - + Reading... - + Verifying... - + unknown - + ie: OpenTX for 9X board or OpenTX for 9XR board - + ie: OpenTX for M128 / 9X board or OpenTX for 9XR board with M128 chip - + ie: OpenTX for Gruvin9X board - + Your radio uses a %1 CPU!!! Please check advanced burn options to set the correct cpu type. - + Your radio uses a %1 CPU!!! Please select an appropriate firmware type to program it. - + You are currently using: %1 - - Your radio does not seem connected to USB or the driver is not installed!!! - -Please use ZADIG to properly install the driver. - - - - + Your radio does not seem connected to USB or the driver is not initialized!!!. - + Flashing done (exit code = %1) - + Flashing done with errors - + FUSES: Low=%1 High=%2 Ext=%3 @@ -2187,38 +3533,133 @@ Please use ZADIG to properly install the driver. Fade In - + Переход к режиму Fade Out - + Выход из режима Name - + Название Switch - Тумблер + Тумблер + + + + FlightModeData + + + FM + FlightModePanel + + + Popup menu available + + + + + Trim disabled + Триммер отключен + + Own Trim + Свой триммер + + + + Use Trim from Flight mode %1 + Использовать триммер Полётного режима %1 + + + + Use Trim from Flight mode %1 + Own Trim as an offset + Использовать триммер Полётного режима %1 + 'Свой триммер' как смещение + + + Rotary Encoder %1 - + + Name + Название + + + + Value source + Источник значений + + + + Value + Значение + + + + Unit + Ед. + + + + Prec + Точность + + + + Min + Мин + + + + Max + Макс + + + GVAR%1 - + + 0._ + + + + + 0.0 + + + + + + &Clear + + + + + + Clear + + + + + Clear all current Flight Mode properties? + + + + Popup enabled @@ -2226,39 +3667,71 @@ Please use ZADIG to properly install the driver. FlightModesPanel - + Flight Mode %1 - + Полётный режим %1 - + (%1) - + (%1) - + (default) - + (по умолчанию) FlybarSelectionPage - + Has Flybar - + Flybarless - + Flybar: + + FrSkyAlarmData + + + Yellow + Желтая + + + + Orange + Оранжевая + + + + Red + Красная + + + + FrSkyChannelData + + + + V + + + + + --- + + + FusesDialog @@ -2351,23 +3824,66 @@ p, li { white-space: pre-wrap; } - - + + Reset Radio Fuses - + Read Fuses from Radio + + GVarData + + + % + + + + + ? + + + + + 0._ + + + + + 0.0 + 15 сек. {0.0?} + + + + ?.? + + + + + GV + + + + + Own value + + + + + Flight mode %1 value + + + GeneralEdit - General Edit - Основная настройка + Radio settings + Параметры передатчика @@ -2377,14 +3893,14 @@ These will be relevant for all models in the same EEPROM. Это относится ко всем моделям сохраненным в EEPROM. - + Setup Настройка - + Trainer - + Тренер @@ -2397,40 +3913,52 @@ These will be relevant for all models in the same EEPROM. - + Global Functions - + Глобальные функции - - Hardware / Calibration - + + Hardware + Оборудование - - - Warning - Звук + + Calibration + Калибровка - + Wrong data in profile, radio calibration was not retrieved - + + Wrong data in profile, Switch/pot config not retrieved + + + + Wrong data in profile, hw related parameters were not retrieved - + Do you want to store calibration in %1 profile<br>overwriting existing calibration? - + Calibration and HW parameters saved. - + Параметры оборудования и калибровки сохранены. + + + + GeneralSettings + + + Radio Settings + Параметры передатчика @@ -2486,209 +4014,229 @@ These will be relevant for all models in the same EEPROM. - + Timeshift from UTC - + Смещение от UTC - + Voice Language - + Язык для голоса - + Country Code - + Регион - + Stick reverse - + Реверс стиков - + FAI Mode - + Режим FAI - - - If you enable FAI, you loose the vario, the play functions, the telemetry screen. This function cannot be disabled by the radio. - - - - + Adjust RTC - + Коррекция часов - + Vario pitch at max - + Макс. тон вариометра - - + + Hz - + Гц - + Speaker Volume - + Громкость динамика - + Backlight Switch - + Включение подсветки - + Sound Mode - + Режим звука - + Color 1 - + Цвет 1 - + Color 2 - + Цвет 2 - + Speaker Pitch (spkr only) - + Тон динамика - + If this value is not 0, any keypress will turn on the backlight and turn it off after the specified number of seconds. - Если не равно нулю, то любое нажатие кнопок будет включать подсветку и выключать ее через указанное кол-во секунд. + Если не равно нулю, то любое нажатие кнопок будет включать подсветку и выключать её через указанное кол-во секунд. - + + + sec - сек + сек - + Backlight color - + Цвет фона - + Beeper - + - + Speaker - + Динамик - + BeeperVoice - + SpeakerVoice - - - Beep volume - - - - - Wav volume - - - - - Vario volume - - + Beep volume + Громкость писка + + + + Wav volume + Громкость Wav + + + + Vario volume + Громкость варио + + + Background volume - + Громкость фон. музыки - - + + ms - + мс - + Backlight Auto OFF after - + Отключать подсветку через - + Backlight flash on alarm - + Мигать подсветкой при увед. - + Vario pitch at zero - + Мин. тон вариометра - + Vario repeat at zero - + Повтор если вариометр 0 - + This is the switch selectrion for turning on the backlight (if installed). - Включение подсветки (при ее наличии). + Включение подсветки (при ее наличии). - - + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">LCD Screen Contrast</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Values can be 20-45</span></p></body></html> - Контраст LCD дисплея -Значения в пределах 20-45 + - + Backlight Brightness - + Яркость фона - + RotEnc Navigation - + Навигация крутилкой - + + Backlight OFF Brightness + Яркость отключенной подсветки + + + America - + Америка - + Japan - + Япония - + Europe + Европа + + + + If you enable FAI, only RSSI and RxBt sensors will keep working. This function cannot be disabled by the radio. + Если включить режим FAI, то будут работать только датчики RSSI и напряжения. Эту функцию нельзя отключить в передатчике. + + + + Automatically adjust the radio's clock if a GPS is connected to telemetry. - + + Owner Registration ID + + + + + aaaaaaAA + + + + Mode selection: Mode 1: @@ -2711,389 +4259,431 @@ Mode 4: - + Mode 1 (RUD ELE THR AIL) - + Mode 2 (RUD THR ELE AIL) - + Mode 3 (AIL ELE THR RUD) - + Mode 4 (AIL THR ELE RUD) - + <html><head/><body><p>Channel order</p><p><br/></p><p>Defines the order of the default mixes created on a new model.</p></body></html> - + <html><head/><body><p>Порядок каналов</p><p><br/></p><p>Задает порядок микшеров при создании новой модели.</p></body></html> - + R E T A - + R E A T - + R T E A - + R T A E - + R A E T - + R A T E - + E R T A - + E R A T - + E T R A - + E T A R - + E A R T - + E A T R - + T R E A - + T R A E - + T E R A - + T E A R - + T A R E - + T A E R - + A R E T - + A R T E - + A E R T - + A E T R - + A T R E - + A T E R - + + Power On Delay + Пауза при включении + + + + Jack Mode + Режим разъема наушников + + + + + Ask on Connect + Спросить при подключении + + + + Audio + Звук + + + + Trainer + Тренер + + + + DMS + + + + + Low EEPROM Warning + Предупреждать, если мало памяти (EEPROM) + + + + RSSI Poweroff Warning + Предупреждать, если есть сигнал RSSI + + + Stick Mode - Режим стиков + Режим стиков - + + Power Off Delay + Пауза при выключении + + + Metric - + Метрическая (метры) - + Imperial - + Имперская (мили, футы) - + Default Channel Order - Порядок следов. каналов + Порядок следов. каналов - + GPS Coordinates - + GPS координаты - + Min - Мин + Мин - - + + v - В + В - + Max - Макс + Макс - - Low Memory Warning - - - - + Inactivity Timer - Таймер активности + Таймер активности - + Show Splash Screen on Startup - Показывать заставку + Показывать заставку при включении - + Contrast - Конраст + Конраст - + Battery Meter Range - + Напряжение аккумулятора - + Haptic Strength - + Сила вибрации - + LCD Display Type - + Тип LCD экрана - + "No Sound" Warning - + Предупреждать, если отключен звук - + Battery Warning - Напряж. при разряде + Напряж. при разряде - + Haptic Length - + Продолжительность вибрации - + MAVLink Baud Rate - + Скорость MAVLink - - + + Quiet - тихо + Тихо - + Only Alarms - + Только предупреждения - - + + No Keys - без кнопок + Все, кроме кнопок - - + + All - + Все - + Battery warning voltage. This is the threashhold where the battery warning sounds. Acceptable values are 5v..10v - Предупреждение о разряде. + Предупреждение о разряде аккумулятора. Значение при котором сработает сигнализация. Диапазон 5В..10В - + Standard - + Стандартный - + Optrex - + Optrex - + If not zero will sound beeps if the transmitter has been left without inputs for the specified number of minutes. - Если не равно нулю, начнет бипать при отсутсвии активности через указанное кол-во минут. + Если не равно нулю, то передатчик начнет пищать при отсутсвии активности через указанное кол-во минут. - + min - мин + мин - - + + Show splash screen on startup - Показывать заставку при включении + Показывать заставку при включении - + --- - + 2s - + 2 сек. - + 3s - + 3 сек. - + 4s - + 4 сек. - + 6s - + 6 сек. - + 8s - + 8 сек. - + 10s - + 10 сек. - + 15s - + 15 сек. - + 4800 Baud - + 4800 - + 9600 Baud - + 9600 - + 14400 Baud - + 14400 - + 19200 Baud - + 19200 - + 38400 Baud - + 38400 - + 57600 Baud - + 57600 - + 76800 Baud - + 76800 - + 115200 Baud - + 115200 - - + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -3112,72 +4702,87 @@ p, li { white-space: pre-wrap; } "Тишина" - Предупреждение о "тихом" режиме (без звука) - - + + X-Short - + Очень кратко - - + + Short - + Кратко - - + + Normal - нормально + Нормальная - - + + Long - долго + Долго - - + + X-Long - - - - - hh° (N/S) mm' ss''.dd - + Очень долго - + NMEA - + Play Delay (switch mid position) - + Пауза воспр. (тумблер в сред. полож.) - + + USB Mode + Режим работы USB порта + + + + Joystick (HID) + Джойстик + + + + USB Mass Storage + Съемный диск + + + + USB Serial (CDC) + Последовательный порт + + + Measurement Units - + Система мер - + Haptic Mode - + Режим вибрации - + Beeper Length - + Продолжительность писка - + Beeper Mode - Режим бипов + Уведомления (писк) - + Beeper volume 0 - Quiet. No beeps at all. @@ -3185,25 +4790,145 @@ p, li { white-space: pre-wrap; } 2 - Normal. 3 - Loud. 4 - Extra loud. - Громкость. + Громкость. -0 - Тишина. -1 - Без кнопок. +0 - Тишина. Никаких звуков. +1 - Без кнопок. Обычный писк на уведомления, но кнопки не пищат 2 - Обычная. 3 - Громкая. 4 - Очень громкая. - + Alarms Only - + Только предупреждения GeneralSetupPanel - - If you enable FAI, you loose the vario, the play functions, the telemetry screen. + + OFF + Всегда выключена + + + + Keys + Кнопки + + + + Sticks + Стики + + + + Keys + Sticks + Кнопки + Стики + + + + ON + Всегда включена + + + + English + + + + + Dutch + + + + + French + + + + + Italian + + + + + German + + + + + Czech + + + + + Slovak + + + + + Spanish + + + + + Polish + + + + + Portuguese + + + + + Russian + + + + + Swedish + + + + + Hungarian + + + + + No + Нет + + + + RotEnc A + + + + + Rot Enc B + + + + + Rot Enc C + + + + + Rot Enc D + + + + + Rot Enc E + + + + + If you enable FAI, only RSSI and RxBt sensors will keep working. This function cannot be disabled by the radio. Are you sure ? @@ -3212,18 +4937,366 @@ Are you sure ? GyroPage - + No - + Нет - + Yes, controled by a switch + Да, управляется тумблером + + + + Yes, controlled by a pot + Да, управляется крутилкой + + + + Hardware + + + Form - - Yes, controlled by a pot + + SM + + + + + SC + + + + + Device Name: + + + + + SR + + + + + S4 + + + + + RS2 + + + + + Bluetooth + + + + + Current Offset + + + + + PPM 2 + + + + + SD + + + + + SJ + + + + + SA + + + + + S1 + + + + + S3 + + + + + SP + + + + + SF + + + + + LS + + + + + Battery Offset + + + + + Serial Port + + + + + SG + + + + + S2 + + + + + Ele + + + + + SI + + + + + SL + + + + + SQ + + + + + SO + + + + + PPM 1 + + + + + PPM 4 + + + + + SB + + + + + v + + + + + PPM Multiplier + + + + + Rud + + + + + ADC Filter + + + + + S5 + + + + + Antenna + + + + + PPM 3 + + + + + Ail + + + + + SK + + + + + SE + + + + + LS2 + + + + + Thr + + + + + SH + + + + + OFF + + + + + S-Port Mirror + + + + + Telemetry + + + + + SBUS Trainer + + + + + Debug + + + + + RS + + + + + SN + + + + + RTC Batt Check + + + + + HardwarePanel + + + + + None + + + + + 2 Positions Toggle + + + + + 2 Positions + + + + + 3 Positions + + + + + Pot with detent + + + + + Multipos switch + + + + + Pot without detent + + + + + Slider with detent + + + + + OFF + ВЫКЛ + + + + Enabled + + + + + Telemetry + + + + + Trainer + + + + + Internal + + + + + Ask + + + + + Per model + + + + + Internal + External + + + + + External @@ -3257,22 +5330,22 @@ Are you sure ? 120 - + 15 сек. {120?} 120X - + 15 сек. {120X?} 140 - + 15 сек. {140?} 90 - + 15 сек. {90?} @@ -3303,236 +5376,385 @@ Are you sure ? HeliPage - + Throttle Channel: - + Yaw Channel: - + Pitch Channel: - + Roll Channel: - InputsPanel + HexEepromFormat - - - Move Up + + Invalid EEPROM File %1 - - + + Cannot open file %1: +%2. + + + + + Error writing file %1: +%2. + Ошибка при записи файла %1: +%2. + + + + InputsPanel + + + + Move Up + Сдвинуть вверх + + + + Ctrl+Up - - + + Move Down - + Сдвинуть вниз - - + + Ctrl+Down - + Clear All Inputs - + Очистить все Входы - + Not enough available inputs! - + Delete Selected Inputs? - + Удалить выбранные Входы? - + &Add - Добавить + Добавить - + Ctrl+A - + &Edit - Правка + Редактировать - + Enter - Ввод + - + &Delete - Удалить + Удалить - + Delete - Удалить + - + &Copy - Копировать + Копировать - + Ctrl+C - + &Cut - Вырезать + Вырезать - + Ctrl+X - + &Paste - Вставить + Вставить - + Ctrl+V - + Du&plicate - + Сделать копию - + Ctrl+U - + Clear Inputs? + Очистить Входы? + + + + Really clear all the inputs? + Точно удалить все Входы? + + + + LimitData + + + INV - - Really clear all the inputs? + + NOR + + + + + CH + + + + + LimitsGroup + + + GV + + + + + LogicalSwitchData + + + --- + + + + + a>x + + + + + a<x + + + + + |a|>x + + + + + |a|<x + + + + + AND + + + + + OR + + + + + XOR + + + + + a=b + + + + + a!=b + + + + + a>b + + + + + a<b + + + + + a>=b + + + + + a<=b + + + + + d>=x + + + + + |d|>=x + + + + + a=x + + + + + a~x + + + + + Timer + + + + + Sticky + + + + + Edge + + + + + Unknown + + + + + L + + + + + LSW LogicalSwitchesPanel - + V1 - + V2 - + Duration - + Delay Задержка - + + Popup menu available + + + + + (instant) + + + + + (infinite) + + + + Function Функция - + AND Switch - - L%1 - - - - + &Delete Удалить - - Delete - Удалить - - - + &Copy Копировать - - - (no release) - - - - - (infinite) - - - - - Ctrl+C - - - - + &Cut Вырезать - - Ctrl+X - - - - + &Paste Вставить - - - Ctrl+V - - LogsDialog @@ -3542,146 +5764,166 @@ Are you sure ? - + Filename - + Open LogFile - + Zoom - + + Save session CSV + + + + X - + Y - + Reset - + Fly sessions - + Telemetry logs - + Time (hh:mm:ss) - + Plot Title Change - + New plot title: - + Axis Label Change - + New axis label: - + Graph Name Change - + New graph name: - - Error: no GPS data not found - - - - + The column containing GPS coordinates must be named "GPS". The columns for altitude "GAlt" and for speed "GSpd" are optional - - Error - Ошибка + + Error: no GPS data found + - + Cannot write file %1: %2. Не удается записать файл %1: %2. - + + Cursor A: %1 m + + + + + Cursor B: %1 m + + + + + Time delta: %1 + + + + + Climb rate: %1 m/s + + + + Select your log file - + Available fields - + The selected logfile contains %1 invalid lines out of %2 total lines - + total duration - + duration - + (L1) - + (R1) - + (L2) - + (R2) @@ -3689,119 +5931,81 @@ The columns for altitude "GAlt" and for speed "GSpd" are opt MainWindow - - - - + + File loaded Файл загружен - - - + + Save As - Сохранить как... + Сохранить как - - + + No updates available at this time. - - Unable to check for updates. - - - - + Executable (*.exe) - + + Would you like to launch the installer? - - + + File saved Файл записан - - Display previous warning again at startup ? - - - - + New release available - - - Error - Ошибка - - - + Error opening file %1: %2. - - Compilation server termporary failure, try later - - - - + Compilation server too busy, try later - - - Unknown server failure, try later - - - - - Firmware %1 does not seem to have ever been downloaded. -Release %2 is available. -Do you want to download it now? - -We recommend you view the release notes using the button below to learn about any changes that may be important to you. - - - - - - Yes - - - - - - No - - - - - - Release Notes - - - - Do you want to download release %1 now ? - + Unknown server failure, try later + Неизвестная ошибка, попробуйте позже - + + + Yes + Да + + + + + No + Нет + + + + + Release Notes + Информация + + + A new version of %1 firmware is available: - current is %2 - newer is %3 @@ -3812,725 +6016,887 @@ We recommend you view the release notes using the button below to learn about an - - The selected language will be used the next time you start Companion. - - - - + The new theme will be loaded the next time you start Companion. - - The icon size will be used the next time you start Companion. - - - - - + + Synchronize SD - + Синхронизация содержимого SD - - Firmware updates - - - - - Current firmware does not provide release notes informations. - - - - + OpenTX Home Page: <a href='%1'>%1</a> - + If you've found this program useful, please support by <a href='%1'>donating</a> - + New - + Новый - + Open... - + Открыть... - + Save - + Сохранить - + Save As... - + Сохранить как... - - Copy Model - - - - - Paste Model - - - - - Load backup from file - - - - + Compare models - + Сравнить модели - + Exit the application Выйти из программы - + List available programmers Показать список программаторов - + Show fuses dialog Показать диалог установки фьюзов - + Show the application's About box Показать окно "О программе" - + Set Menu Language - + Язык меню - - Show the list of radio profiles - - - - + Write - + + Use default system language. + Использовать язык системы. + + + + Use %1 language (some translations may not be complete). + + + + %2 - + + Alt+%1 + + + + New Radio - + Checking for updates - + A new version of Companion is available (version %1)<br>Would you like to download it? - - A new release of Companion is available, please check the OpenTX website! - - - - - Not enough memory for all the selected firmware options - - - - - Compilation server requires registration, please check OpenTX web site - - - - + About Companion - + О программе OpenTX Companion - + A monochrome black icon theme - + Монохромная черная тема - + A monochrome white icon theme - + Монохромная белая тема - + A monochrome blue icon theme + Монохромная синяя тема + + + + Diskimage (*.dmg) - + + Would you like to open the disk image to install the new version? + + + + + No Companion release candidates are currently being served for this version, please switch release channel + + + + + No nightly Companion builds are currently being served for this version, please switch release channel + + + + + No Companion release builds are currently being served for this version, please switch release channel + + + + + Companion update check failed, new version information not found. + + + + + A new release of Companion is available, please check the <a href='%1'>OpenTX website!</a> + + + + + Not enough flash available on this board for all the selected options + + + + + Compilation server temporary failure, try later + + + + + Compilation error + + + + + Invalid firmware + + + + + Invalid board + + + + + Invalid language + + + + + No firmware release candidates are currently being served for this version, please switch release channel + + + + + No firmware nightly builds are currently being served for this version, please switch release channel + + + + + No firmware release builds are currently being served for this version, please switch release channel + + + + + Release candidate builds are now available for this version, would you like to switch to using them? + + + + + Channel changed to RC, please restart the download process + + + + + Official release builds are now available for this version, would you like to switch to using them? + + + + + Channel changed to Release, please restart the download process + + + + + This radio (%1) is not currently available in this firmware release channel + + + + + Firmware update check failed, new version information not found or invalid. + + + + + Firmware %1 does not seem to have ever been downloaded. +Version %2 is available. +Do you want to download it now? + +We recommend you view the release notes using the button below to learn about any changes that may be important to you. + Прошивка %1 не была загружена. +Доступна версия %2. +Хотите её скачать? + +Мы рекомендуем вначале воспользоваться кнопкой "Информация", чтобы прочесть обо всех новшествах. + + + + + Do you want to download version %1 now ? + Вы хотите скачать версию %1? + + + + Ignore this version %1? + Игнорировать версию %1? + + + + There are unsaved file changes which you may lose when switching radio types. + +Do you wish to continue? + + + + + No local SD structure path configured! + + + + + No Radio or SD card detected! + + + + + Local Folder + + + + + Radio Folder + + + + + Models and Settings read + + + + + + This function is not yet implemented + + + + + Close + Закрыть + + + + Close Models and Settings file + Закрыть окно с моделями с настройками + + + + List of recently used files + Список недавно открытых файлов + + + + Radio Profiles + Профили передатчиков + + + + Create or Select Radio Profiles + Выбрать профиль передатчика или создать новый + + + + Release notes... + Описание версии ПО... + + + + Show release notes + Показать информацию о текущей версии ПО + + + + Create a new Radio Settings Profile + Создать новый профиль передатчика + + + + Copy Current Radio Profile + Копировать текущий профиль передатчика + + + + Duplicate current Radio Settings Profile + Копировать текущий профиль передатчика + + + + Delete Current Radio Profile... + Удалить текущий профиль передатчика... + + + + Delete the current Radio Settings Profile + Удалить текущий профиль передатчика + + + + Export Application Settings.. + Экспорт настроек приложения... + + + + Save all the current %1 and Simulator settings (including radio profiles) to a file. + Сохранить все текущие настройки %1 и симулятора (включая профиль передатчика) в файл. + + + + Import Application Settings.. + Импорт настроек приложения... + + + + Load %1 and Simulator settings from a prevously exported settings file. + Чтение ранее экспортированных настроек %1 и симулятора из файла. + + + + Tabbed Windows + В виде закладок + + + + Use tabs to arrange open windows. + Использовать закладки для переключения между окнами. + + + + Tile Windows + По горизонтали + + + + Arrange open windows across all the available space. + Выравнивание открытых окон по горизонтали. + + + + Cascade Windows + Каскадом + + + + Arrange all open windows in a stack. + Выравнивание открытых окон каскадом. + + + + Close All Windows + Закрыть все окна + + + + Closes all open files (prompts to save if necessary. + Закрыть все окна (с запросом на сохранение изменений). + + + + Window + Окно + + + + Some text will not be translated until the next time you start Companion. Please note that some translations may not be complete. + Некоторые сообщения не будут переведены, пока вы не перезапустите Companion. Учтите, что не все сообщения переведены на выбранный язык. + + + + Ctrl+Shift+S + + + + + Ctrl+Alt+L + + + + + Ctrl+Alt+D + + + + + Ctrl+Alt+R + + + + Small - + Маленькие - + Use small toolbar icons - + Использовать маленькие иконки - + Use normal size toolbar icons - + Использоват иконки стандартного размера - + Normal - нормально + Стандартные - + Use big toolbar icons - + Использовать большие иконки - + Big - + Большие - + Use huge toolbar icons - + Использовать огромные иконки - + Huge + Огромные + + + + - Copy - + + Companion :: Open files warning + + + + + Please save or close modified file(s) before deleting the active profile. + + + + + Not possible to remove profile + Невозможно удалить профиль + + + + The default profile can not be removed. + Нельзя удалить профиль по умолчанию. + + + + Confirm Delete Profile + + + + + Are you sure you wish to delete the "%1" radio profile? There is no way to undo this action! + + + + + Please save or close all modified files before importing settings + + + + + <html><p>%1 and Simulator settings can be imported (restored) from a previosly saved export (backup) file. This will replace current settings with any settings found in the file.</p><p>An automatic backup of the current settings will be attempted. But if the current settings are useful then it is recommended that you make a manual backup first.</p><p>For best results when importing settings, <b>close any other %1 windows you may have open, and make sure the standalone Simulator application is not running.</p><p>Do you wish to continue?</p></html> + + + + + Confirm Settings Import + + + + + Select %1: + + + + + backup + + + + + Press the 'Ignore' button to continue anyway. + + + + + The settings could not be imported. + Невозможно импортировать настройки. + + + + <html><p>New settings have been imported from:<br> %1.</p><p>%2 will now re-initialize.</p><p>Note that you may need to close and restart %2 before some settings like language and icon theme take effect.</p> + + + + + <p>The previous settings were backed up to:<br> %1</p> + + + + Do you want to write the firmware to the radio now ? - - + + Open Models and Settings file - + Открыть файл с моделями и настройками - + Read Models and Settings From Radio - + Прочитать модели и настройки из передатчика - - Ignore this release %1? - - - - - - - Companion - - - - + Save Radio Backup to File - + Read Radio Firmware to File - + Сохранить прошивку из передатчика в файл - + The OpenTX Companion project was originally forked from <a href='%1'>eePe</a> - + Copyright OpenTX Team - + OpenTX Companion %1 - Radio: %2 - Profile: %3 - + Create a new Models and Settings file - + Создать новую модель и настройки передатчика - - + + Save Models and Settings file - + Сохранить модели и настройки в файл - + Exit - + Выход - - Cut Model - - - - - Cut current model to the clipboard - - - - - Copy current model to the clipboard - - - - - Paste model from clipboard - - - - + Classical - + The classic companion9x icon theme - + Классическая тема companion9x - + Yerico - + Yellow round honey sweet icon theme - + Желтая тема - + Monochrome - + MonoWhite - + MonoBlue - + System language - + Язык ОС - - Use system language in menus - - - - - Czech - - - - - Use Czech in menus - - - - - German - - - - - Use German in menus - - - - - English - - - - - Use English in menus - - - - - Finnish - - - - - Use Finnish in menus - - - - - French - - - - - Use French in menus - - - - - Italian - - - - - Use Italian in menus - - - - - Polish - - - - - Use Polish in menus - - - - - Spanish - - - - - Use Spanish in menus - - - - - Swedish - - - - - Use Swedish in menus - - - - + About... - + О программе... - - Print... - - - - - Print current model - - - - - Simulate... - - - - - Simulate current model - - - - - Alt+S - - - - - Load Backup... - - - - + View Log File... - + Открыть журнал... - + Open and view log file - + Открыть и просмотреть журнал (логи) - + Settings... - + Настройки... - + Edit Settings - + Настройки - + Download... - + Скачать... - + Download firmware and voice files - + Скачать прошивку и содержимое SD карточки - + Check for Updates... - + Поиск обновлений... - + Check OpenTX and Companion updates - + Проверить наличие обновлений OpenTX и Companion - - Companion Changes... - - - - - Show Companion change log - - - - - Firmware Changes... - - - - - Show firmware change log - - - - + Compare Models... - + Сравнить модели... - + Edit Radio Splash Image... - + Редактировать заставку передатчика... - + Edit the splash image of your Radio - + List programmers... - + Fuses... - - + + Read Firmware from Radio - + Скачать прошивку из передатчика - + Read firmware from Radio - + Сохранить прошивку из передатчика в файл - - + Write Firmware to Radio - + Обновить прошивку передатчика - + Write firmware to Radio - + Обновить прошивку передатчика - + Add Radio Profile - + Добавить профиль передатчика - - Create a new Radio Setting Profile - - - - + Manuals and other Documents - + Инструкции и руководства - + Open the OpenTX document page in a web browser - + Открыть инструкцию к OpenTX в браузере - + Write Models and Settings To Radio - + Записать модели и настройки в передатчик - - + Write Models and Settings to Radio - - - - - - Read Models and Settings from Radio - - - - - Configure Communications... - - - - - Configure software for communicating with the Radio - - - - - Write Backup to Radio - - - - - Write Backup from file to Radio - - - - - Backup Radio to File - - - - - Save a complete backup file of all settings and model data in the Radio - - - - - Contributors... - - - - - A tribute to those who have contributed to OpenTX and Companion - - - - - SD card synchronization - - - - - Recent Files - + Записать модели и настройки в передатчик + - Recent Models+Settings - + Read Models and Settings from Radio + Прочитать модели и настройки из передатчика - + + Configure Communications... + Настройка подключения... + + + + Configure software for communicating with the Radio + Настройка подключения к передатчику + + + + Write Backup to Radio + Записать резервную копию из файла в передатчик + + + + Write Backup from file to Radio + Записать резервную копию из файла в передатчик + + + + Backup Radio to File + Сделать резервную копию передатчика + + + + Save a complete backup file of all settings and model data in the Radio + Сделать полную копию всех моделей и настроек, хранящихся в передатчике + + + + Contributors... + Разработчики... + + + + A tribute to those who have contributed to OpenTX and Companion + Показать список тех, кто помогал в разработке OpenTX и Companion + + + + SD card synchronization + Синхронизация содержимого SD карточки + + + + Recent Files + Последние + + + Set Icon Theme - + Стиль иконок - + Set Icon Size - + Размер иконок - - + + File Файл - - + + Edit Правка - + Settings - + Параметры - + Read/Write - + Чтение/Запись - - + + Help - + Помощь - - - Radio Profile - - - - - Show recent Models+Settings documents - - - - + Ready Готово @@ -4538,131 +6904,397 @@ We recommend you view the release notes using the button below to learn about an MdiChild - - - - - - - - - - - - - - - - - - - - Error - Ошибка - - - + Editing model %1: Редактирование модели %1: - - + + <p><b>Currently selected radio type (%1) is not compatible with file %3 (from %2), models and settings need to be converted.</b></p> + + + + + Do you wish to continue with the conversion? + + + + + Choose <i>Apply</i> to convert the file, or <i>Close</i> to close it without conversion. + + + + + <b>The conversion generated some important messages, please review them below.</b> + + + + + Companion :: Conversion Result for %1 + + + + + Unable to find Horus radio SD card! + + + + + Models and Settings written + + + + Unable to find file %1! Невозможно найти файл %1! - - + Error reading file %1: %2. Ошибка при считывании файла %1: %2. - - - - + Error opening file %1: %2. - - free bytes + + Alt+Shift+E - - Companion + + Ctrl+Alt+C - - - Invalid EEPROM File %1 + + Ctrl+Alt+V - - Invalid binary EEPROM File %1 + + Alt+Shift+S + + + Alt+C + + + + + Alt+A + + + + + Alt+R + + + + + Alt+W + + + + + Alt+U + + + + + Alt+S + + + + + %n Model(s) + As in "Copy 3 Models" or "Cut 1 Model" or "Delete 3 Models" action). + + модель + %n модели(ей) + %n модели + + + + + %n Model(s) + As in "Paste 3 Models" or "Insert 1 Model." + + модель + %n модели(ей) + %n модели(ей) + + + + + %n Category(ies) + As in "Delete 3 Categories" or "Delete 1 Category." + + категорию + %n категории(ий) + %n категории(ий) + + + + + Nothing selected + + + + + Rename Category + Переименовать категорию + + + + Edit Model + Редактировать модель + + + + Delete + Удалить + + + + Cut + Вырезать + + + + Copy + Копировать + + + + Paste + Вставить + + + + Insert + Вставить + + Edit Radio Settings + Параметры передатчика + + + + Copy Radio Settings + Копировать настройки передатчика + + - + Paste Radio Settings + Вставить настройки передатчика + + + + Simulate Radio + Симулятор передатчика + + + + Add Category + Добавить категорию + + + + Category + Категория + + + + Add Model + Добавить модель + + + Model + Модель + + + + Restore from Backup + Восстановить из резервной копии + + + + Model Wizard + Мастер по настройке + + + + Set as Default + Модель по умолчанию + + + + Print Model + Распечатать модель + + + + Simulate Model + Симулятор модели + + + + Duplicate Model + Сделать копию + + + + Move to Category + Переместить в категорию + + + + Show Category Actions Toolbar + + + + + Show Radio Actions Toolbar + + + + + Show Model Actions Toolbar + + + + + free bytes + байт свободно + + + + read only + + + + + New category + Translators do NOT use accent for this, this is the default category name on Horus. + + + + + Category index out of range. + + + + + Cannot delete the last category. + Нельзя удалять последнюю категорию. + + + + This category is not empty! + В этой категории есть модели! + + + + Cannot insert model, last model in list would be deleted. + + + + + Cannot add model, could not find an available model slot. + + + + + New model + Translators: do NOT use accents here, this is a default model name. + + + + + Cannot paste model, out of available model slots. + + + + + You are replacing an existing model, are you sure? + Вы действительно хотите перезаписать модель? + + + + Do you want to overwrite radio general settings? + + + + + Delete %n selected model(s)? + + Удалить выбранную модель? + Удалить выбранные модели (%n)? + Удалить выбранные модели (%n)? + + + + + Delete %n selected category(ies)? + + Удалить выбранную категорию? + Удалить выбранные категории? + Удалить выбранные категории (%n)? + + + + + Cannot duplicate model, could not find an available model slot. + + + + Save As - Сохранить как... + Сохранить как - - - - - Cannot write file %1: -%2. - Не удается записать файл %1: -%2. - - - + Open backup Models and Settings file - - - - - Warning - Звук - - - + Invalid binary backup File %1 - + %1 has been modified. Do you want to save your changes? + %1 изменен. +Вы хотите сохранить изменения? + + + + Cannot write temporary file! + Не удается записать временный файл! + + + + MixData + + + MIX - - - Error writing file %1: -%2. - Ошибка при записи файла %1: -%2. - - - - Cannot write temporary file! - Не удается записать временный файл! + + (@%1) + @@ -4671,7 +7303,7 @@ Do you want to save your changes? Dialog ??? - Диалог + Настройки микшера @@ -4684,7 +7316,7 @@ Do you want to save your changes? The source for the mixer - Источник для микшера + Источник данных для микшера @@ -4703,17 +7335,18 @@ Do you want to save your changes? Switch used by the mix. If blank then the mix is considered to be "ON" all the time. The value of the mixer is multiplied by this value and divided by 100. - Значение микшера умножается на это значение и делится на 100 + Микшер можно активировать тумблером. +Если тумблер не указан, тогда микшер будет включен всё время. Offset - Смещен. + Смещение Include Trim - Исп. трим + Использовать триммер @@ -4723,7 +7356,7 @@ If blank then the mix is considered to be "ON" all the time. The curve used by the mix - Кривая используемая микшером + Кривая, используемая микшером @@ -4733,12 +7366,12 @@ If blank then the mix is considered to be "ON" all the time. Yes - + Да No - + Нет @@ -4748,7 +7381,7 @@ If blank then the mix is considered to be "ON" all the time. Name - + Название @@ -4766,14 +7399,23 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If Delay is not zero the actuation of the mix will be delayed by the specified amount of seconds.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If Slow is not zero then the speed of the mix will be set by the value specified -&gt; the value states the number of seconds it takes to transit from -100 to 100.</p></body></html> - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; text-decoration: underline;">Задержка и замедление</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600; text-decoration: underline;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Эти значения управляют скоростью и задержкой применения микшера</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Если задержка больше 0, то микшер будет активирован не сразу, а через указанное время</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Если замедление не равно 0, то это скорость применения микшера. Т.е. значение в секундах для перехода от -100 к +100 (например, плавный выпуск закрылков/шасси)</p></body></html> Mixer warning. Setting this value will cause a beep to be emmitted when this value is active. - Индикация включения. -Когда микшер активируется звучит выбранный сигнал. + Передатчик будет издавать звуки пока микшер активен. @@ -4783,18 +7425,18 @@ Setting this value will cause a beep to be emmitted when this value is active. 1 Beep - 1 бип + 1 сигнал 2 Beep 2 Beeo - 2 бипа + 2 сигнала 3 Beep - 3 бипа + 3 сигнала @@ -4812,31 +7454,31 @@ This determines how mixer values are added. "R" means the value replaces the previous values. If the switch is off the value will be ignored. Мультиплексор -Определяет, каким образом добавляется значение микшера. +Определяет, каким образом вычисляется значение микшера. -"+" - значение текущего микшера добавляется к предыдущему значению на этом же канале. -"*" - значение текущего микшера умножается на предыдущее значение на этом же канале -"R" - значение текущего микшера заменяет предыдущее значение на этом же канале. +"+" - значение текущего микшера добавляется к предыдущему микшеру на этом же канале. +"*" - значение текущего микшера умножается на значение предыдущего микшера на этом же канале +"R" - значение текущего микшера заменяет предыдущее значение. Если тумблер отключен, то значение игнорируется. ADD - ДОБАВИТЬ + СЛОЖЕНИЕ MULTIPLY - УМНОЖИТЬ + УМНОЖЕНИЕ REPLACE - ЗАМЕНИТЬ + ЗАМЕНА Flight modes - + Полётные режимы @@ -4851,153 +7493,209 @@ This determines how mixer values are added. Slow - Замедлен. + Замедление Up - Верх + Вверх Down - Низ + Вниз - - DEST -> CH%1 + + DEST -> %1 + + + + + Click to access popup menu + Нажмите, чтобы открыть меню + + + + Clear All + Убрать всё + + + + Set All + Выбрать всё + + + + Invert All + Инвертировать + + + + MixersListWidget + + + Increase font size + + + + + Decrease font size + + + + + Default font size + + + + + Ctrl+0 MixesPanel - - + + Move Up - + Сдвинуть вверх - - + + Ctrl+Up - - + + Move Down - + Сдвинуть вниз - - + + Ctrl+Down - + Clear Mixes - + Удалить микшеры - + Not enough available mixers! - + Недостаточно микшеров! - + Delete Selected Mixes? - Удалить выбранные микшеры? + Удалить выбранные микшеры? - + &Add - Добавить + Добавить - + Ctrl+A - + &Edit - Правка + Редактировать - + Enter - Ввод + - + &Toggle highlight - + Ctrl+T - + &Delete - Удалить + Удалить - + Delete - Удалить + - + &Copy - Копировать + Копировать - + Ctrl+C - + Ctrl+X - + C&ut - + &Paste - Вставить + Вставить - + Ctrl+V - + Du&plicate - + Сделать копию - + Ctrl+U - + Clear Mixes? + Удалить все микшеры? + + + + Really clear all the mixes? + Вы действительно хотите удалить все микшеры? + + + + ModelData + + + Model: - - Really clear all the mixes? + + Throttle Source @@ -5009,929 +7707,1865 @@ This determines how mixer values are added. Диалог - + Setup - Настройка + Основные - + Heli - + Вертолёт - + Inputs - + Входы - + Logical Switches - + Логические переключатели - + Mixes Микшеры - + Outputs - + Выходы - + Curves Кривые - + Special Functions - + Специальные функции - + Telemetry - + Телеметрия - + Flight Modes - + Полетные режимы Simulate - Симуляция + Симулятор ModelPrinter - - %1 bytes + + Enable - - CH%1 + + Disable - + + True + + + + + False + + + + + Yes + + + + + No + Нет + + + + Y + + + + + N + + + + + ON + + + + + + + + OFF + ВЫКЛ + + + + bytes + + + + Exponential - экспонента + - + Extra Fine - очень точно + - + Fine - точно + - + Medium - средне + - + Coarse - грубо + Грубо - + Unknown - - Enabled - - - - - Disabled - - - - - %1, Channels(%2-%3), PPM delay(%4usec), Pulse polarity(%5) - - - - - %1, Channels(%2-%3) - - - - - Receiver number(%1) - - - - - Slave/Jack - - - - - Master/SBUS Module - - - - - Master/CPPM Module - - - - - Master/SBUS in battery compartment - - - - - Master/Jack - - - - - Rudder - Руддер - - - - Elevator - Элеватор - - - - Throttle - Газ - - - - Aileron - Элероны - - - - Name(%1) - - - - - Persistent - - - - - MinuteBeep - - - - - CountDown(Beeps) + + + Mode - CountDown(Voice) + + Channels + + + + + + Frame length - CountDown(Haptic) + PPM delay - - Off + + + Polarity - - - - - FM%1 + + Protocol + Протокол + + + + + + Delay + + + + + + Receiver - FM%1%2 + Radio protocol + + + + + Subtype + Option value + + + + + Sub Type + + + + + RF Output Power + + + + + 90 + + + + + 120 + + + + + 120X + + + + + 140 + + + + + MULT! + + + + + + Offset + Смещен. + + + + Slow + + + + + Warn + + + + + Flight modes + + + + + Flight mode + + + + + All + + + + + Edge + + + + + instant + + + + + Sticky + + + + + Timer + + + + + missing + + + + + Duration + + + + + Extended Limits + Расш. лимиты + + + + Display Checklist + + + + + Global Functions + + + + + Manual + + + + + Auto + + + + + Failsafe Mode + + + + + + Hold + + + + + No Pulse + + + + + Not set + + + + + No pulses + + + + + Silent + + + + + Beeps + + + + + Voice + + + + + Haptic + + + + + Flight + + + + + Manual reset + + + + + Step + + + + + Display + + + + + Extended + + + + + Never + + + + + On Change + + + + + Always + + + + + + + Source + Источник + + + + Trim idle only + + + + + Warning + Звук + + + + Reversed + + + + + Tmr + + + + + FrSky S.PORT + + + + + FrSky D + + + + + FrSky D (cable) + + + + + Alti + + + + + Alti+ + + + + + VSpeed + + + + + + + A1 + + + + + + + A2 + + + + + + A3 + + + + + + A4 + + + + + + FAS + + + + + Cells + + + + + Calculated + + + + + Add + + + + + Average + + + + + + Min + + + + + + Max + + + + + Multiply + + + + + Totalise + + + + + Cell + + + + + Consumption + + + + + Distance + + + + + Lowest + + + + + Cell %1 + + + + + Highest + + + + + Delta + + + + + Formula + + + + + + Id + + + + + Instance + + + + + + + + Sensor + + + + + + Sources + + + + + + GPS + + + + + Alt. + + + + + + Blades + + + + + Multi. + + + + + F + + + + + Inst + + + + + Alt + + + + + Unit + + + + + Prec + + + + + Ratio + + + + + Multi + + + + + A/Offset + + + + + Filter + + + + + Persist + + + + + Positive + + + + + Log + + + + + Numbers + + + + + Bars + + + + + Script + + + + + Filename + + + + + Error: Unable to open or read file! + + + + + Slave/Jack + + + + + Master/SBUS Module + + + + + Master/CPPM Module + + + + + Master/SBUS in battery compartment + + + + + Master/Jack + + + + + Persistent + + + + + Off + + + + + + + + + + None + + + + + Name + + + + + Countdown + + + + + Minute call + + + + + + + FM%1 + + + + + FM%1%2 + + + + FM%1+%2 - - [I%1] - - - - - Input%1 - - - - + + Weight Вес - + + Switch Тумблер - - + + NoTrim - - Weight(%1) - - - - - Switch(%1) - - - - + No DR/Expo - + Offset(%1) - - Delay(u%1:d%2) - - - - - Slow(u%1:d%2) - - - - - Warn(%1) - - - - + Disabled in all flight modes - - Flight modes(%1) - - - - - Flight mode(%1) - - - - - Edge(%1, [%2:%3]) - - - - - Sticky(%1, %2) - - - - - Timer(%1, %2) - - - - - Duration(%1s) - - - - - Delay(%1s) - - - - + + + Custom - + Standard - + Стандартный ModelSelectionPage - + Plane - + Самолёт - + Multirotor - + Мультикоптер - + Helicopter - + Вертолет - + Model Name: - + Название модели: - + Model Type: - - - - - ModelsListWidget - - - - &Edit - Правка - - - - &Restore from backup - - - - - &Model Wizard - - - - - &Delete - Удалить - - - - Delete - Удалить - - - - &Copy - Копировать - - - - Ctrl+C - - - - - &Cut - Вырезать - - - - Ctrl+X - - - - - &Paste - Вставить - - - - Ctrl+V - - - - - D&uplicate - Дублировать - - - - Ctrl+U - - - - - &Use as default - - - - - P&rint model - - - - - Ctrl+P - - - - - Alt+S - - - - - &Simulate model - - - - - General Settings - Основные настройки - - - - Delete Selected Models? - Удалить выбранные модели? - - - - - Cannot delete default model. - - - - - Cannot cut default model. - - - - - Do you want to overwrite radio general settings? - - - - - You are pasting on an not empty model, are you sure? - You are pasting on an not empty model, are you sure ? - - - - - No free slot available, cannot duplicate - + Тип модели: Module - + Failsafe Mode - + Режим Failsafe - + Start - + Начать с - + PPM delay - + Negative - + Positive - + Polarity - + Полярность - + Trainer Mode - + Тренерский режим - + PPM Frame Length - + Длите. кадра PPM - + CH + Канал + + + + RF Output Power + Выходная мощность передатчика + + + + Receiver 1 + Приёмник 1 + + + + + + X - + + Receiver 2 + Приёмник 2 + + + + Receiver 3 + Приёмник 3 + + + + WARNING: changing RF Output Power needs RE-BIND + + + + + Low Power + + + + us - + + Antenna + Антенна + + + + Option value + + + + + Registration ID + + + + + Multi Radio Protocol + Режим мультипротокольного модуля + + + + Sub Type + Подтип + + + + WARNING: Requires non-certified firmware! + + + + Master/Jack - + Главный (джек) - + Slave/Jack - + Ученик (джек) - + Master/SBUS Module - + Главный (SBUS модуль) - + Master/CPPM Module - + Главный (модуль CPPM) - + Master/SBUS in battery compartment + Главный (SBUS в батарейном отсеке) + + + + Show values in: - + + % + abbreviation for percent + + + + + μs + abbreviation for microseconds + + + + ms - - - - - Channels - Каналы - - - - Not set - - - - - Hold - - - - - Custom - - - - - No Pulses - - - - - Receiver - - - - - Failsafe Positions - + мс - Protocol - Протокол + Channels + Кол-во каналов - - Receiver No. + + Not set + Не задан + + + + Hold + Удержание + + + + Custom + Другой + + + + No Pulses + Без сигнала + + + + Receiver + В приёмнике + + + + Master/Bluetooth + Главный (bluetooth) + + + + Slave/Bluetooth + Ученик (bluetooth) + + + + Master/Multi + Главный (мультимодуль) + + + + Disable Telemetry + Отключить телеметрию + + + + Disable Ch. Map - + + Failsafe Positions + Параметры Failsafe + + + + Protocol + Протокол + + + + Receiver No. + Номер приёмника + + + Output type - + Open Drain - + Push Pull + + ModuleData + + + Trainer Port + + + + + Internal Radio System + Встроенный радиомодуль + + + + External Radio Module + Внешний радиомодуль + + + + Extra Radio System + + + + + Radio System + + + + + 10mW - 16CH + + + + + + 100mW - 16CH + + + + + 500mW - 16CH + + + + + Auto <= 1W - 16CH + + + + + + 25mW - 8CH + + + + + + 25mW - 16CH + + + + + 200mW - 16CH (no telemetry) + + + + + 500mW - 16CH (no telemetry) + + + + + 100mW - 16CH (no telemetry) + + + + + Positive + + + + + Negative + + + ModulePanel - - Trainer Port - - - - - Internal Radio System - - - - - External Radio Module - - - - - - Radio System - - - - - Extra Radio System - - - - + Value Значение - + Hold - + No Pulse + + + Ask + + + + + Internal + + + + + Internal + External + + + + + External + + + + + Autodetect Format + + + + + Bind on channel + + MultiModelPrinter - - General Model Settings - - - - - Name: - - - - - EEprom Size: - - - - - Timer%1: - - - - - Module%1: - - - - - Module: - - - - - Trainer port: - - - - - Throttle Trim: - - - - - Trim Increment: - - - - - Center Beep: - - - - + Flight modes - - + + Flight mode - + + Switch Тумблер - - Fade IN - - - - - Fade OUT - - - - - - FM%1 - - - - - + + GV%1 - + RE%1 - - Limits - Лимиты - - - + Channel - + + + Name - - + + General + + + + + EEprom Size + + + + + Model Image + + + + + Throttle + Газ + + + + Trims + + + + + Center Beep + + + + + Switch Warnings + + + + + Pot Warnings + + + + + Other + + + + + Timers + + + + + Time + + + + + Countdown + + + + + Min.call + + + + + Persist + + + + + Modules + + + + + Trainer port + + + + + Helicopter + + + + + Swash + + + + + + Type + + + + + Ring + + + + + Input + + + + + Weight + Вес + + + + Long. cyc + + + + + Lateral cyc + + + + + Collective + + + + + F.In + + + + + F.Out + + + + + Global vars + + + + + Prec + + + + + Popup + + + + + Outputs + + + + + Subtrim + + + + + Direct + + + + + Curve + Кривая + + + + PPM + + + + + Linear + + + + + Telemetry + + + + Offset Смещен. - + + Protocol + Протокол + + + + Low + + + + + Critical + + + + + Telemetry audio + + + + + Altimetry + + + + + + Vario source + + + + + Vario limits > + + + + + Sink max + + + + + Sink min + + + + + Climb min + + + + + Climb max + + + + + Center silent + + + + + Top Bar + + + + + + Volts source + + + + + Altitude source + + + + + Various + + + + + Serial protocol + + + + + FAS offset + + + + + mAh count + + + + + Persistent mAh + + + + + Current source + + + + + Blades + + + + + Parameters + + + + + Telemetry Sensors + + + + + Telemetry Screens + + + + + GF%1 + + + + + Global Functions + + + + + Checklist + + + + + Min Мин - + + Max Макс - - Invert - Инверт - - - + Global Variables - + Inputs - + Mixers - - CV%1 - - - - + Curves Кривые - + L%1 - + Logical Switches - + SF%1 - + Special Functions - - Telemetry Settings - - - - + Analogs - + + Unit - + Scale - - A%1 + + RSSI Alarms + + + + + Multiprotocols + + + Subtype - - RSSI Alarms + + Video TX frequency + + + + + CC2500 frequency fine tune + + + + + Telemetry + + + + + Radio output power + + + + + Servo output frequency + + + + + Option value + + + + + Fixed ID value + + + + + DEFAULT + + + + + Custom - proto %1) MultirotorPage - + Throttle Channel: - + Yaw Channel: - + Pitch Channel: - + Roll Channel: + + OpenTxEepromInterface + + + Unknown error + + + + + ... plus %1 errors + + + + + Cannot write radio settings + + + + + Cannot write model %1 + + + OptionsPage - + Throttle Cut - + Отсечка газа (throttle cut) - + Throttle Timer + Таймер газа + + + + Flight Timer + Таймер полетного времени + + + + OtxFormat + + + Error opening file %1: +%2. - - Flight Timer + + Error opening OTX archive %1 + + + + + Error initializing OTX archive writer + + + + + Error writing file %1: +%2. + Ошибка при записи файла %1: +%2. + + + + Error creating OTX file %1: +%2. + + + + + Error creating OTX archive + + + + + Error adding %1 to OTX archive @@ -5940,56 +9574,62 @@ This determines how mixer values are added. Close - + Закрыть - Print - + Style + Стили + Print + Печать + + + Print to file - + В файл - + Print Document - + Распечатать - + Select PDF output file - + PDF файл для сохранения - + ODF files (*.odt);;PDF Files(*.pdf);;HTML-Files (*.htm *.html);;All Files (*) - + ODF файлы (*.odt);;PDF файлы (*.pdf);;HTML-файлы (*.htm *.html);;Все файлы (*) ProgressDialog - + Flash Firmware - + + Close - + Закрыть + + + + Cancel + Отмена ProgressWidget - - Form - - - - + Show Details @@ -5997,2339 +9637,158 @@ This determines how mixer values are added. QObject - - Polish + + WARNING - - CH%1 + + <p>Importing JumperTX data into OpenTX 2.3 is <b>not supported and dangerous.</b></p> <p>It is unfortunately not possible for us to differentiate JumperTX data from legitimate FrSky X10 data, but <b>You should only continue here if the file you opened comes from a real FrSky X10.</b></p> <p>Do you really want to continue?</p> + + + RadioData - - No + + Models + + + RadioDataConversionState - - RotEnc A + + is invalid - - Rot Enc B + + converted to - - Rot Enc C + + verify is - - Rot Enc D + + [DBG] - - Rot Enc E + + [NFO] - - Trainer + + [WRN] - - Trainer RUD + + [CVT] - - Trainer ELE + + [ERR] - - Trainer THR + + [INV] - - Trainer AIL + + Event - - Instant Trim + + Origin - - Play Sound + + Comp - - Start Logs + + Sub-Component - - Haptic + + Field - - - - --- + + Type - - Rud Trim + + Old - - Ele Trim + + Action - - Thr Trim + + New - - Ail Trim + + Seq + + + RadioInterface - - Rot Enc - - - - - English - - - - - French - - - - - Italian - - - - - German - - - - - Czech - - - - - Slovak - - - - - Spanish - - - - - Portuguese - - - - - Swedish - - - - - No repeat - - - - - Reset - - - - - mA - - - - - kts - - - - - f - - - - - dB - - - - - rpms - - - - - hours - - - - - minutes - - - - - seconds - - - - - h:m - - - - - m:s - - - - - h:m:s - - - - - - F1 - - - - - - F2 - - - - - - F3 - - - - - - F4 - - - - - - S3 - - - - - - - Timer3 - - - - - RSSI Tx - - - - - RSSI Rx - - - - - A3 - - - - - A4 - - - - - Cells - - - - - dTE - - - - - Hdg - - - - - AirSpeed - - - - - A3- - - - - - A4- - - - - - Speed+ - - - - - Dist+ - - - - - AirSpeed+ - - - - - Cell- - - - - - Cells- - - - - - Vfas- - - - - - Curr+ - - - - - Powr+ - - - - - ACC - - - - - GPS Time - - - - - - L1 - - - - - - L2 - - - - - - L3 - - - - - - L4 - - - - - - L5 - - - - - - L6 - - - - - - L7 - - - - - - L8 - - - - - - L9 - - - - - - L10 - - - - - - L11 - - - - - - L12 - - - - - - L13 - - - - - - L14 - - - - - - L15 - - - - - - L16 - - - - - - L17 - - - - - - L18 - - - - - - L19 - - - - - - L20 - - - - - - L21 - - - - - - L22 - - - - - - L23 - - - - - - L24 - - - - - - L25 - - - - - - L26 - - - - - - L27 - - - - - - L28 - - - - - - L29 - - - - - - L30 - - - - - - L31 - - - - - - L32 - - - - - [I%1] - - - - - LUA%1%2 - - - - - TR%1 - - - - - FM0 - - - - - FM1 - - - - - FM2 - - - - - FM3 - - - - - FM4 - - - - - FM5 - - - - - FM6 - - - - - FM7 - - - - - FM8 - - - - - S31 - - - - - S32 - - - - - S33 - - - - - S34 - - - - - S35 - - - - - S36 - - - - - RudTrim Left - - - - - RudTrim Right - - - - - EleTrim Down - - - - - EleTrim Up - - - - - ThrTrim Down - - - - - ThrTrim Up - - - - - AilTrim Left - - - - - AilTrim Right - - - - - THs - - - - - TH% - - - - - THt - - - - - One - - - - - ??? - - - - - a>x - - - - - a<x - - - - - |a|>x - - - - - |a|<x - - - - - AND - - - - - OR - - - - - XOR - - - - - a=b - - - - - a!=b - - - - - a>b - - - - - a<b - - - - - a>=b - - - - - a<=b - - - - - d>=x - - - - - |d|>=x - - - - - a=x - - - - - a~x - - - - - Timer - - - - - Sticky - - - - - Unknown - - - - - Override %1 - - - - - Set Timer %1 - - - - - Vario - - - - - Play Track - - - - - Play Both - - - - - Play Value - - - - - Play Script - - - - - Volume - - - - - Backlight - - - - - Screenshot - - - - - Background Music - - - - - Background Music Pause - - - - - played once, not during startup - - - - - repeat(%1s) - - - - - DISABLED - - - - - INV - - - - - NOR - - - - - Edge - - - - - SetFailsafe Int. Module - - - - - SetFailsafe Ext. Module - - - - - RangeCheck Int. Module - - - - - RangeCheck Ext. Module - - - - - Bind Int. Module - - - - - Bind Ext. Module - - - - - - - <font color=red><b>Inconsistent parameter</b></font> - - - - - Value - - - - - Decr: - - - - - Incr: - - - - - Played once, not during startup - - - - - %1s - - - - - Adjust GV%1 - - - - - Rotary Encoder - - - - - Value - Значение - - - - Source - Источник - - - - GVAR - - - - - Increment - - - - - Flight - - - - - Finnish - - - - - !Flight mode %1 - - - - - Flight mode %1 - - - - - Flight mode %1 value - - - - - Yellow - - - - - Orange - - - - - Red - - - - - Winged Shadow How High - - - - - Winged Shadow How High (not supported) - - - - - FrSky Sensor Hub - - - - - None - - - - - Imperial - - - - - Metric - - - - - - - Timer1 - - - - - - - Timer2 - - - - - Telemetry - - - - - Own value - - - - - Keys - - - - - Sticks - - - - - Keys + Sticks - - - - - - -GV%1 - - - - - - - - ---- - - - - - - - P1 - - - - - - - P2 - - - - - - - P3 - - - - - MAX - - - - - - Rud - - - - - - Ele - - - - - - Thr - - - - - - Ail - - - - - - - REa - - - - - - - REb - - - - - Alt - - - - - Rpm - - - - - Fuel - - - - - Speed - - - - - Dist - - - - - GPS Alt - - - - - Cell - - - - - A1 - - - - - A2 - - - - - T1 - - - - - T2 - - - - - - Simultaneous usage of expo and curves is no longer supported - - - - - TrmR - - - - - TrmE - - - - - TrmT - - - - - TrmA - - - - - - - - S1 - - - - - - - - - - - V - - - - - - s - - - - - ft - - - - - - - m - - - - - - °C - - - - - - ° - - - - - - % - - - - - - - mph - - - - - - - km/h - - - - - - m/s - - - - - - A - - - - - °F - - - - - - mAh - - - - - - W - - - - - - g - - - - - - - - S2 - - - - - - - - LS - - - - - - - - RS - - - - - - Batt - - - - - SWR - - - - - Vfas - - - - - Curr - - - - - Cnsp - - - - - Powr - - - - - AccX - - - - - AccY - - - - - AccZ - - - - - VSpd - - - - - A1- - - - - - A2- - - - - - Alt- - - - - - Alt+ - - - - - Rpm+ - - - - - T1+ - - - - - T2+ - - - - - - Time - - - - - CYC%1 - - - - - S11 - - - - - S12 - - - - - S13 - - - - - S14 - - - - - S15 - - - - - S16 - - - - - S21 - - - - - S22 - - - - - S23 - - - - - S24 - - - - - S25 - - - - - S26 - - - - - Diff(%1) - - - - - Expo(%1) - - - - - Function(%1) - - - - - Curve(%1) - - - - - !Curve(%1) - - - - - - - GV%1 - - - - - THR - - - - - - - ON - - - - - - - OFF - ВЫКЛ - - - - - Support for frsky telemetry mod - - - - - - Support for jeti telemetry mod - - - - - - Support for receiving ardupilot data - - - - - - Support for receiving NMEA data - - - - - Support for telemetry easy board - - - - - - Support for MAVLINK devices - - - - - Rotary Encoder use in menus navigation - - - - - - - - - - Enable heli menu and cyclic mix support - - - - - - - - - - - - - Enable TEMPLATES menu - - - - - - - - No splash screen - - - - - - - - - - - - - Disable curves menus - - - - - - - - Support for radio modified with regular speaker - - - - - - - - - Used if you have modified your radio with voice mode - - - - - - - - - Used if you have modified your radio with haptic mode - - - - - Channel values displayed in us - - - - - - - - - - - - - In model setup menus automatically set source by moving the control - - - - - - - - - - - - - In model setup menus automatically set switch by moving the control - - - - - Use alternative SQT5 font - - - - - (displaying only first 10 warnings) - - - - - Possibility to enable FAI MODE (no telemetry) at field - - - - - FAI MODE (no telemetry) always enabled - - - - - - - - Support for a third timer - - - - - Instead of Joystick emulation, USB connection is Mass Storage (as in the Bootloader) - - - - - Instead of Joystick emulation, USB connection is Command Line Interface - - - - - Removes D8 and LR12 FrSky protocols that are not legal for use in the EU on radios sold after Jan 1st, 2015 - - - - - Support for PPM internal module hack - - - - - ST7565P LCD or compatible - - - - - ST7565R LCD or compatible - - - - - ERC12864FSF LCD - - - - - ST7920 LCD - - - - - 9X board - - - - - - - - Enable the throttle trace in Statistics - - - - - EEprom write progress bar - - - - - - No Winged Shadow How High support - - - - - - No vario support - - - - - - No GPS support - - - - - - No gauges in the custom telemetry screen - - - - - Allow compensating for offset errors in FrSky FAS current sensors - - - - - - Add support for reversing stick inputs (e.g. needed for FrSky gimbals) - - - - - Power management by soft-off circuitry - - - - - ar9x board / 9X - - - - - 9XR-PRO - - - - - FrSky Taranis - - - - - FrSky Taranis Plus - - - - - FrSky Taranis X9E - - - - - Confirmation before radio shutdown - - - - - - Adds mixers output view to the CHANNELS MONITOR screen, pressing [ENT] switches between the views - - - - - Haptic module installed - - - - - Support for Lua model scripts - - - - - - Support of FrSky PXX protocol - - - - - Disable HELI menu and cyclic mix support - - - - - Disable Global variables - - - - - - - - - Support for DSM2 modules - - - - - - - - - - - - - PPM center adjustment in limits - - - - - - - - - - - - - Symetrical Limits - - - - - - - - - - - Pots use in menus navigation - - - - - No OverrideCH functions available - - - - - - - - - - - - - No flight modes - - - - - - SmartieParts 2.2 Backlight support - - - - - - - - - - Enable resetting values by pressing up and down at the same time - - - - - - - - - - - - - No graphical check boxes and sliders - - - - - - - - - - - - - Battery graph - - - - - - - - - - - - - Don't use bold font for highlighting active items - - - - - - - - - EEprom write Progress bar - - - - - - - - - - Imperial units - - - - - M128 / 9X board - - - - - 9XR - - - - - 9XR with M128 chip - - - - - Gruvin9x board / 9X - - - - - MEGA2560 board - - - - - Sky9x board / 9X - - - - - - - Bluetooth interface - - - - - - - - - - - - - Global variables - - - - - - Support for SD memory card - - - - - Support for DSM2 modules using ppm instead of true serial - - - - - - - Enable HELI menu and cyclic mix support - - - - - - Warning - Звук - - - - EEPROM saved with these warnings: - - - - - Simulator for this firmware is not yet available - - - - - th9x on this board doesn't have Rotary Encoders - - - - - Source %1 cannot be exported on this board! - - - - - OpenTX only accepts %1 points in all curves - - - - - OpenTx only accepts %1 points in all curves - - - - - - - - - OpenTX on this board doesn't accept this function - - - - - OpenTX doesn't accept this telemetry protocol - - - - - - - OpenTX doesn't accept this radio protocol - - - - - OpenTX doesn't allow this number of channels - - - - - Trim disabled - - - - - Own Trim - - - - - Use Trim from Flight mode %1 - - - - - Use Trim from Flight mode %1 + Own Trim as an offset - - - - - FW: %1 - - - - - Pict: %1 - - - - - Profile image - - - - - Simultaneous usage of expo and curves is no longer supported in OpenTX - - - - - Thank you for upgrading to OpenTX 2.0. This is a major upgrade that adds and modifies a lot of things, so please make sure that you read release notes carefully to learn about the changes, and thoroughly check each of your models for proper function. - -The OpenTX Team. - - - - - - - - - Synchronization error - - - - - No SD directory configured! - - - - - No Radio connected! - - - - - GV - - - - - -%1 - - - - - - The directory '%1' doesn't exist! - - - - - Create '%1' failed - - - - - Copy '%1' to '%2' failed - - - - - Open '%1' failed - - - - - Write '%1' failed - - - - - - - Error - Ошибка - - - + Cannot write file %1: %2. Не удается записать файл %1: %2. - - Companion - - - - + <b><u>WARNING!</u></b><br>This will reset the fuses of %1 to the factory settings.<br>Writing fuses can mess up your radio.<br>Do this only if you are sure they are wrong!<br>Are you sure you want to continue? - - + + Could not delete temporary file: %1 - - Radio type + + Unable to find Horus radio SD card! + + + + + RadioKnobWidget + + + <p>Value (input): <b>%1</b></p> - - Which radio type do you want to simulate? + + Right-double-click to reset to center. @@ -8351,10 +9810,712 @@ The OpenTX Team. + + RadioOutputsWidget + + + Form + + + + + View: + + + + + Logical Switches + + + + + Global Variables + + + + + Channel Outputs + + + + + Mix Outputs + + + + + L +o +g +i +c + + + + + G +l +o +b +a +l + + + + + C +h +a +n +n +e +l +s + + + + + M +i +x +e +s + + + + + FM%1 + + + + + GV%1 + + + + + RadioSwitchWidget + + + Latch/unlatch the momentary switch. + + + + + RawSource + + + + + + V + + + + + + + + s + + + + + ft + + + + + + m + + + + + °C + + + + + ° + + + + + % + + + + + + mph + + + + + + km/h + + + + + m/s + + + + + A + + + + + mAh + + + + + W + + + + + g + + + + + TrmR + + + + + TrmE + + + + + TrmT + + + + + TrmA + + + + + Trm5 + + + + + Trm6 + + + + + TrmH + + + + + TrmV + + + + + + Batt + + + + + + Time + + + + + + Timer1 + + + + + + Timer2 + + + + + + Timer3 + + + + + RAS + + + + + RSSI Tx + + + + + RSSI Rx + + + + + A1 + + + + + A2 + + + + + A3 + + + + + A4 + + + + + Alt + + + + + Rpm + + + + + Fuel + + + + + T1 + + + + + T2 + + + + + Speed + + + + + Dist + + + + + GPS Alt + + + + + Cell + + + + + Cells + + + + + Vfas + + + + + Curr + + + + + Cnsp + + + + + Powr + + + + + AccX + + + + + AccY + + + + + AccZ + + + + + Hdg + + + + + VSpd + + + + + AirSpeed + + + + + dTE + + + + + A1- + + + + + A2- + + + + + A3- + + + + + A4- + + + + + Alt- + + + + + Alt+ + + + + + Rpm+ + + + + + T1+ + + + + + T2+ + + + + + Speed+ + + + + + Dist+ + + + + + AirSpeed+ + + + + + Cell- + + + + + Cells- + + + + + Vfas- + + + + + Curr+ + + + + + Powr+ + + + + + ACC + + + + + GPS Time + + + + + REa + + + + + REb + + + + + + ??? + + + + + ---- + + + + + I + as in Input + + + + + LUA%1%2 + + + + + MAX + + + + + CYC%1 + + + + + TR + as in Trainer + + + + + SRC + + + + + RawSwitch + + + ↑ + + + + + ↓ + + + + + - + + + + + ! + + + + + RudTrim Left + + + + + RudTrim Right + + + + + EleTrim Down + + + + + EleTrim Up + + + + + ThrTrim Down + + + + + ThrTrim Up + + + + + AilTrim Left + + + + + AilTrim Right + + + + + Trim 5 Down + + + + + Trim 5 Up + + + + + Trim 6 Down + + + + + Trim 6 Up + + + + + TrmH Left + + + + + TrmH Right + + + + + TrmV Down + + + + + TrmV Up + + + + + REa + + + + + REb + + + + + + OFF + ВЫКЛ + + + + + ON + + + + + THs + + + + + TH% + + + + + THt + + + + + + ??? + + + + + One + + + + + Act + + + + + ---- + + + + + Telemetry + + + + + SW + + + ReleaseNotesDialog - + Companion Release Notes @@ -8362,26 +10523,183 @@ The OpenTX Team. ReleaseNotesFirmwareDialog - + OpenTX Release Notes + + RepeatComboBox + + + Played once, not during startup + + + + + No repeat + + + + + %1s + + + RudderPage - - - No - - - - - Yes - - + No + Нет + + + + Yes + Есть + + + <br>Rudder Channel: + Канал руля направления: + + + + SdcardFormat + + + Error opening file %1: +%2. + + + + + Error opening file %1 in write mode: +%2. + + + + + SensorData + + + + V + + + + + A + + + + + mA + + + + + kts + + + + + m/s + + + + + km/h + + + + + mph + + + + + m + + + + + f + + + + + °C + + + + + °F + + + + + % + + + + + mAh + + + + + W + + + + + mW + + + + + dB + + + + + rpms + + + + + g + + + + + ° + + + + + Rad + + + + + hours + + + + + minutes + + + + + seconds + + + + + TELE @@ -8390,350 +10708,977 @@ The OpenTX Team. Center beep - Бип в центре + Сигнал в центре OFF - ВЫКЛ + ВЫКЛ Model Image - + Изображение модели - + Exponential - экспонента + По экспоненте - + Throttle Trim Idle Only - + Триммировать только холостой ход - + Extra Fine - очень точно + Очень точно - + Fine - точно + Точно - + Medium - средне + Средне - + Coarse - грубо + Грубо - + Display Checklist - + Показать контрольную карту - + Timer 2 - + Таймер 2 Timer 1 - + Таймер 1 - + Timer 3 - + Таймер 3 - + Never - + Никогда Top LCD Timer - + Верхний таймер - + On change - + При изменении - + Always - + Всегда - + Global Functions - + Глобальные функции - + + Edit Checklist... + Редактировать... + + + Throttle Source - + Канал газа - + Trim Step - + Шаг триммирования - + Trims Display - + Показывать триммеры Warnings - + Предупреждения Switch Warnings - + Тумблеры Pot Warnings - + Крутилки Manual - + Вручную Auto - + Автоматически Model - + Модель - + Extended Limits - Расш. лимиты + Расширенные лимиты - + Extended Trims - + Расширенные триммеры - + Throttle Warning - + Предупреждать если не убран - + Reverse throttle operation. If this is checked the throttle will be reversed. Idle will be forward, trim will also be reversed and the throttle warning will be reversed as well. - Реверсировать канал газа (а также триммеры и предупреждения) + Реверс газа +Если выбрана эта опция, то будет включен реверс газа, холостого хода и триммеров. Предупреждение о не нулевом положении стика газа также будет инвертировано. + + - + Reverse Throttle - + Реверс газа SetupPanel - + Timer %1 + + + THR + + + + + Profile Settings + + + + + SD structure path not specified or invalid + + SimpleTailPage - + Elevator Channel: + Канал руля высоты: + + + + SimulatedUIWidget + + + screenshot + Simulator LCD screenshot file name prefix + + + + + ENTER + + + + + S + + + + + PG-UP + + + + + PG-DN + + + + + DEL + + + + + BKSP + + + + + ESC + + + + + INS + + + + + <font size=+3>+</font> + + + + + <font size=+3>-</font> + + + + + <font size=+3>&larr;</font> + + + + + <font size=+3>&rarr;</font> + + + + + <font size=+3>&uarr;</font> + + + + + <font size=+3>&darr;</font> + + + + + <font size=+3>&#x2686;</font> + + + + + <font size=+3>&#x21b6;</font> + + + + + <font size=+3>&#x21b7;</font> + + + + + <font size=+3>&#x21c6;</font> + + + + + + <font size=+3>&#x21d3;</font> + + + + + <font size=+3>&#x21d1;</font> + + + + + <font size=+3>&#x21d5;</font> + + + + + <img src='qrc:/images/simulator/icons/svg/mouse.svg' width=20 height=18 /> + + + + + <img src='qrc:/images/simulator/icons/svg/arrow_click.svg' width=18 height=18 /> + + + + + <pre>[ MENU ]</pre> + + + + + <pre>[ PAGE ]</pre> + + + + + <pre>[ EXIT ]</pre> + + + + + <pre>[ ENT ]</pre> + + + + + <pre>[ SHIFT ]</pre> + + + + + <pre>[ UP ]</pre> + + + + + <pre>[ DN ]</pre> + + + + + <pre>[ <font size=+2>+</font> ]</pre> + + + + + <pre>[ <font size=+2>-</font> ]</pre> + + + + + <pre>[ PgUp ]</pre> + + + + + <pre>[ PgDn ]</pre> + + + + + <pre>[ MDL ]</pre> + + + + + <pre>[ RTN ]</pre> + + + + + <pre>[ SYS ]</pre> + + + + + <pre>[ TELE ]</pre> + + + + + <font size=+3>&#x2261;</font> - SimulatorDialog + SimulatorMain - - - Warning - Звук - - - - Joystick enabled but not configured correctly + + OpenTx Simulator - + + Available profiles: + + + + + ID: + + + + + Name: + + + + + Available radios: + + + + + Radio profile ID or Name to use for simulator. + + + + + profile + + + + + Radio type to simulate (usually defined in profile). + + + + + radio + + + + + Directory containing the SD card image to use. The default is configured in the chosen Radio Profile. + + + + + path + + + + + Data source type to use (applicable to Horus only). One of: + + + + + type + + + + + data-source + + + + + Radio data (.bin/.eeprom/.otx) image file to use OR data folder path (for Horus-style radios). +NOTE: any existing EEPROM data incompatible with the selected radio type may be overwritten! + + + + + [data-source] + + + + + Error: Profile ID %1 was not found. + + + + + Unrecognized startup data source type: %1 + + + + + WARNING: couldn't initialize SDL: +%1 + + + + + ERROR: No simulator libraries available. + + + + + ERROR: Couldn't start simulator, missing radio/profile/data file/folder. + Profile ID: [%1]; Radio ID: [%2]; +Data File: [%3] + + + + + ERROR: Radio profile or simulator firmware not found. +Profile ID: [%1]; Radio ID: [%2] + + + + + Uknown error during Simulator startup. + + + + + SimulatorMainWindow + + + OpenTx Simulator + + + + + View + + + + + Radio Window + + + + + Reload... + + + + + Tools + + + + + Toolbar + + + + + Reload Lua Scripts + + + + + Reload the Lua environment on the simulated radio. + + + + + F7 + + + + + Reload Radio Data + + + + + Reload all radio data without restarting the simulator. + + + + + F9 + + + + + Key Mapping + + + + + Show keyboard maping reference. + + + + + F1 + + + + + Joystick Settings + + + + + Open joystick configuration settings dialog. + + + + + F3 + + + + + LCD Screenshot + + + + + Save a screenshot of the current simulated LCD screen. + + + + + F8 + + + + + Dock In Main Window + + + + + Show the radio in the main window or as a separate "floating" window. + + + + + Menu Bar + + + + + Show or hide the top menu bar. + + + + + Alt+M + + + + + Constrain Width + + + + + Set radio widget width to be a fixed size. + + + + + Constrain Height + + + + + Set radio widget height to be a fixed size. + + + + + ERROR: Failed to create simulator interface, possibly missing or bad library. + + + + + Alt+T + + + + + Radio Outputs + + + + + F2 + + + + + Telemetry Simulator + + + + + F4 + + + + + Trainer Simulator + + + + + F5 + + + + + Debug Output + + + + + F6 + + + + + <b>Simulator Controls:</b> + + + + + <tr><th>Key/Mouse</th><th>Action</th></tr> + note: must match html layout of each table row (keyTemplate). + + + + + <tr><td><kbd>%1</kbd></td><td>%2</td></tr> + note: must match html layout of help text table header. + + + + + Simulator Help + + + + + SimulatorStartupDialog + + + OpenTX Simulator - Startup Options + + + + + Simulator Startup Options: + + + + + Radio Profile: + + + + + Existing radio profiles are shown here.<br /> +Create or edit profiles using the Companion application. + + + + + Radio Type: + + + + + Existing radio simulators are shown here.<br /> +The radio type specified in the selected profile is used by default. + + + + + Data Source: + + + + + Data File: + + + + + Data Folder: + + + + + SD Image Path: + + + + + Radio data (.bin/.eeprom/.otx) image file to use. A new file with a default image will be created if necessary.<br /> +<b>NOTE</b>: any existing EEPROM data incompatible with the selected radio type may be overwritten! + + + + + Select data file... + + + + + + + ... + ... + + + + Directory containing RADIO and MODELS folders to use.<br /> +New folder(s) with default radio/model will be created here if necessary. + + + + + Select data folder... + + + + + Directory containing the SD card image to use.<br/> +The default is configured in the chosen Radio Profile. + + + + + Select SD card image folder... + + + + + Select which of the data sources (File/Folder/SD Card) you would like to start the simulator with. + + + + + File + Файл + + + + Folder + + + + + SD Path + + + + + All files (*.*) + + + + + Select a data file + + + + + Select Data Directory + + + + + Select SD Card Image Folder + + + + + SimulatorWidget + + + Companion Simulator + + + + + Radio Simulator (%1) + + + + + Could not determine startup data source. + + + + + Could not load data, possibly wrong format. + + + + + Data Load Error + + + + + Invalid startup data provided. Plese specify a proper file/path. + + + + + Simulator Startup Error + + + + + Error saving data: could open file for writing: '%1' + + + + + Error saving data: could not get data from simulator interface. + + + + + An unexpected error occurred while attempting to save radio data to file '%1'. + + + + + Data Save Error + + + + Cannot open joystick, joystick disabled - - Simulating Radio (%1) + + Radio firmware error: %1 - - - Outputs - - - - - Firmware %1 error: %2 + + - Flight Mode %1 (#%2) - SimulatorDialog9X + SliderWidget - - Companion Simulator + + <p>Value (input): <b>%1</b></p> - - - - - Right Double Click to Reset - - - - - - Hold X - - - - - - Fix X - - - - - - Fix Y - - - - - - Hold Y - - - - - BEEP - - - - - 9x Simulator - - - - - Outputs - - - - - Outputs2 - - - - - Gvars - - - - - SimulatorDialogTaranis - - - Companion Simulator - - - - - Outputs2 - - - - - Gvars - - - - - S3 - - - - - S4 - - - - - - Hold Y - - - - - - Fix Y - - - - - - Fix X - - - - - - Hold X - - - - - - - - Right Double Click to Reset - - - - - Taranis Simulator - - - - - Outputs + + Right-double-click to reset to center. @@ -8743,30 +11688,20 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi ... - + ... - + Splash Library - page %1 of %2 - - Warning - Звук - - - + Invalid image in library %1 - - Information - - - - + No valid image found in library, check your settings @@ -8774,256 +11709,487 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi StandardPage - + Channel %1 + + Storage + + + Unable to find file %1! + Невозможно найти файл %1! + + + + StyleEditDialog + + + + + + Style Sheet Editor + + + + + &Reset to default + + + + + &Cancel + + + + + &OK + + + + + This feature does not validate your changes and assumes you are familiar with CSS syntax for QT. + + + + + Cannot retrieve style %1 +Error: %2 + + + + + Cannot retrieve default style %1 +Error: %2 + + + + + Cannot update custom style %1 +Error: %2 + + + + + Stylesheet + + + Style sheet data read from '%1' + + + + + Style sheet data unable to be read from '%1' + + + + + Cannot create folder '%1' + + + + + Cannot open file for writing '%1': Error: %2 + + + + + Cannot write to file '%1': Error: %2 + + + + + Cannot flush buffer for file '%1': Error: %2 + + + + + Style sheet written to '%1' + + + + + Custom style sheet deleted: '%1' + + + + + Unable to delete custom style sheet: '%1' + + + SyncProcess - - %1/%2 files + + [TEST RUN] - - Create directory %1 + + Gathering file information for %1... + + + + + No files found in %1 + + + + + Synchronization failed, nothing found to copy. + + + + + Synchronization aborted at %1 of %2 files. + + + + + Synchronization finished with %1 files in %2m %3s. + + + + + Synchronizing: %1 + To: %2 + + + + + Starting synchronization: + %1 -> %2 - - Copy %1 to %2 - + + +Too many errors, giving up. - - Write %1 - + + Skipping large file: %1 (%2KB) + + + + + Skipping filtered file: %1 + + + + + Skipping linked file: %1 + + + + + Aborted synchronization of: + + + + + Finished synchronizing: + + + + + Created: %1; Updated: %2; Skipped: %3; Errors: %4; + + + + + Creating directory: %1 + + + + + Could not create directory: %1 + + + + + Directory exists: %1 + + + + + At least one of the file modification dates is in the future, error on: %1 + + + + + Skipping older file: %1 + + + + + Could not open source file '%1': %2 + + + + + Could not open destination file '%1': %2 + + + + + Skipping identical file: %1 + + + + + Replacing file: %1 + + + + + Could not delete destination file '%1': %2 + + + + + Creating file: %1 + + + + + Copy failed: '%1' to '%2': %3 TailPage - + Rudder Channel: - + Руль направления: - + Elevator Channel: - + Руль высоты: - + Only one channel still available!<br>You probably should configure your model without using the wizard. - + Доступен только один канал!<br>Возможно стоит настроить модель без использования этого мастера. TailSelectionPage - + Elevator and Rudder - + Руль высоты и руль направления - + Only Elevator - + Только руль высоты - + V-tail - + V-образное оперение - + Tail Type: - + Тип хвостового оперения: Telemetry - + A1 - + A2 - + RSSI - + Alarm 1 - - + + ---- - - + + Yellow - - + + Orange - - + + Red - + + Disable telemetry audio warnings + Отключить головые предупреждения + + + Alarm 2 - - Center Silent - + + Source + Источник - + + Center Silent + Тишина в центре + + + Altitude source - + Volts source - + Top Bar - + Верхняя строка - + Serial Protocol - + Sensors - + Disable multi sensor handling - + Volt source - + Напряжение - + Current source - + Датчик тока Protocol - Протокол + Протокол - + None - + FrSky Sensor Hub - + Blades - + Sink Max - + Сниж. макс. - + Climb Max - + Набор макс. - + Sink Min - + Сниж. мин. - + Climb Min - + Набор мин. - + Vario source - + Вариометр - + Vario limits - + Пределы - + Altimetry - + Измерение высоты - + mAh - + A - + Various - + mAh count - + FAS Offset - + Persistent mAh @@ -9055,19 +12221,19 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi Yellow - + Желтая Orange - + Оранжевая Red - + Красная @@ -9121,7 +12287,7 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi Meters (m or ft) - + Temp (°) @@ -9137,7 +12303,7 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi - + Range @@ -9150,22 +12316,22 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi - + None - + Numbers - + Bars - + Script @@ -9193,99 +12359,104 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi TelemetryPanel - + FrSky S.PORT - + FrSky D - + FrSky D (cable) - + Telemetry screen %1 - + + Source + Источник + + + Low Alarm - + Низкий уровень - + Critical Alarm - + Критический уровень - + Winged Shadow How High - + Winged Shadow How High (not supported) - + Alti - + Alti+ - + VSpeed - - - + + + A1 - - - + + + A2 - - + + A3 - - + + A4 - - + + FAS - + Cells - + --- @@ -9298,259 +12469,274 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi - + Custom - + Calculated - + Id - + Instance - + + Rx + + + + Add - + Average - + Min Мин - + Max Макс - + Multiply - + Totalize - + Cell - + Consumption - + Dist - + Cells Sensor : - - - - - - - - + + + + + + + + --- - + GPS Sensor : - + Alt. Sensor : - + Sensor : - + V - + A - + mA - + kt - + m/s - + ft/s - + km/h - + mph - + m - + ft - - + + °C - - + + °F - + % - + mAh - + W - + + mW + + + + dBm - + g - - + + ° - - mL - - - - - US fl.Oz. - - - - - Raw (-) - - - - - RPM - - - - - Precision + + Rad + mL + + + + + US fl.Oz. + + + + + Raw (-) + + + + + RPM + + + + + Precision + + + + Ratio - + Blades - + Offset - Смещен. + - + Multiplier - + Auto Offset - + Filter - + Persistent - + Positive - + Logs @@ -9558,22 +12744,22 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi TelemetrySensorPanel - + Lowest - + Cell %1 - + Highest - + Delta @@ -9581,242 +12767,361 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi TelemetrySimulator - + Telemetry Simulator - - Vario Altitude - - - - - V-ALT - - - - - Vario Vertical Speed - - - - - V-VSPD - - - - - ACCZ - - - - - GPS Time - - - - - GPS-T - - - - - ACCX - - - - - GPS Lat/Lon - - - - - GPS-LL - - - - + VFAS - - FAS-V - - - - - GPS Speed - - - - - GPS-S - - - - - CELLS - - - - - ACCY - - - - - GPS Course - - - - - GPS-C - - - - - GPS Altitude - - - - - GPS-A - - - - - CURRENT - - - - - FAS-C - - - - - 30 - - - - + RSSI - - 75 - - - - - SWR - - - - - FR_ID_AIR_SPEED - - - - - ASPD - - - - + A1 - + A2 - + + Simulate + + + + + RAS + + + + + + + V / ratio + + + + + Db + + + + + RxBt + + + + + + + + + + + + + + + + + <html><head/><body><p><br/></p></body></html> + + + + + Tmp1 + + + + A3 - + A4 - - Temperature 1 + + Tmp2 - - T1 + + Fuel - - Temperature 2 + + + °C - - T2 + + ml - + + % + + + + + + Meters + + + + + Alt + + + + + VSpd + + + + + m/s + + + + + Fuel Qty + + + + + + km/h + + + + + Hdg + + + + + ASpd + + + + + + + G + + + + + GPS + + + + + Lat,Lon +(dec.deg.) + + + + + AccX + + + + + dd-MM-yyyy +hh:mm:ss + + + + + Date + + + + + Amps + + + + + AccZ + + + + + GAlt + + + + + + Volts + + + + + Cels + + + + + Curr + + + + + AccY + + + + + GSpd + + + + + Degrees + + + + + Replay SD Log File + + + + + Replay rate + + + + + Load + + + + + |> + + + + + <| + + + + + > + + + + + <- + + + + + X + + + + + Row # +Timestamp + + + + + 1/5x + + + + + 5x + + + + + No Log File Currently Loaded + + + + + Setting RSSI to zero simulates telemetry and radio link loss. + + + + + Set RSSI to zero when paused. + + + + + Stop sending telemetry data when the Telemetry Simulator window is hidden. + + + + + Pause simulation when hidden. + + + + + RPM - - FUEL - - - - + When enabled, sends any non-blank values as simulated telemetry data. - - simulate + + Log File - - Instance + + LOG Files (*.csv) - - 2 - - - - - <html><head/><body><p>Start with <span style=" font-style:italic;">0x</span> for hex, <span style=" font-style:italic;">0</span> for octal, otherwise decimal.<br/>Numeric entry only. Blank values are not sent.</p></body></html> + + ERROR - invalid file ThrottlePage - + Yes - + Да - + No - + Нет - + <br>Throttle Channel: - + Канал газа: @@ -9824,50 +13129,88 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi Countdown - + Отсчет Minute Call + Ежеминутный сигнал + + + + TimerData + + + TMR + + + Timer %1 + Таймер %1 + + + + TimerEdit + + + Use mouse scroll or UP/DOWN arrow keys to change time in small steps. +CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + Используйте колесо мыши или стрелки ВВЕРХ/ВНИЗ для изменений с небольшим шагом +CTRL+колесо или PAGE UP/DOWN - для изменения с большим шагом. + + + + m + м + + + + h + ч + + + + s + с + TimerPanel - + Silent - + Тихо - + Beeps - + Писком - + Voice - + Голосом - + Haptic - + Вибрацией - + Not persistent - + Сбрасываемый - + Persistent (flight) - + Постоянный (только полет) - + Persistent (manual reset) - + Постоянный (только ручной сброс) @@ -9996,345 +13339,423 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi TrainerSimulator - + Trainer simulator - VTailPage + TreeModel - - First Tail Channel: + + Index + Номер + + + + Name + Название + + + + Size + Размер + + + + RX # - + + Models + Translators do NOT use accent for this, this is the default category name on Horus. + Модели + + + + Model %1 + Translators: do NOT use accents here, this is a default model name. + Модель %1 + + + + VTailPage + + + First Tail Channel: + Первый канал управления: + + + Second Tail Channel: + Второй канал управления: + + + + VirtualJoystickWidget + + + Hld Y + + + + + Hold Vertical stick position. + + + + + Fix Y + + + + + Prevent Vertical movement of stick. + + + + + Fix X + + + + + Prevent Horizontal movement of stick. + + + + + Hld X + + + + + Hold Horizontal stick position. WingtypeSelectionPage - + Standard Wing - + Классическая схема - + Flying Wing / Deltawing - + Летающее крыло WizardDialog - + Model Wizard - + Мастер по настройке модели - + Model Type - + Тип модели - + Enter model name and model type. - + Введите название модели и выберите её тип. - + Throttle - Газ + Газ - + Has your model got a motor or an engine? - + У вашей модели есть двигатель? - + Wing Type - + Тип крыла - + Is your model a flying wing/deltawing or has it a standard wing configuration? - + У вас классический самолет или летающее крыло? - + Ailerons - + Элероны - + Has your model got ailerons? - + У вашей модели есть элероны? - + Flaps - + Закрылки - + Has your model got flaps? - + У вашей модели есть закрылки? - + Airbrakes - + Воздушные тормоза - + Has your model got airbrakes? - + У вашей модели есть воздушные тормоза? - + Flying-wing / Delta-wing - + Летающее крыло - + Select the elevons channels - - - - - Rudder - Руддер - - - - Does your model have a rudder? - - - - - Tail Type - - - - - Select which type of tail your model is equiped with. - - - - - - Tail - - - - - - Select channels for tail control. - - - - - V-Tail - - - - - Select elevator channel. - + Выберите каналы элевонов + Rudder + Руль направления + + + + Does your model have a rudder? + У вашей модели есть руль направления? + + + + Tail Type + Тип хвостового оперения + + + + Select which type of tail your model is equiped with. + Выберите тип хвостового оперения модели. + + + + + Tail + Хвостовое оперение + + + + + Select channels for tail control. + Выберите каналы для хвостового оперения. + + + + V-Tail + V-образное оперение + + + + Select elevator channel. + Выберите канал руля высоты. + + + Cyclic - + Which type of swash control is installed in your helicopter? - + Tail Gyro - + Has your helicopter got an adjustable gyro for the tail? - + Rotor Type - + Has your helicopter got a flybar? - - + + Helicopter - + Вертолет - - + + Select the controls for your helicopter - + Multirotor - + Мультикоптер - + Select the control channels for your multirotor - + Model Options - + Дополнительные опции - + Select additional options - + Выберите необходимое - + Save Changes - + Сохранить изменения - + Manually check the direction of each control surface and reverse any channels that make controls move in the wrong direction. Remove the propeller/propellers before you try to control your model for the first time.<br>Please note that continuing removes all old model settings! - + Вручную проверьте направление движения всех управляющих поверхностей, настройке реверсы там, где это необходимо. <br>Снимите пропеллер перед тестированием.<br>Учтите, что сохранение перезапишет старые настройки модели! - + Enter a name for your model and select model type. - + Введите название модели и выберите её тип. - + Select the receiver channel that is connected to your ESC or throttle servo.<br><br>Throttle - Spektrum: CH1, Futaba: CH3 - - - - - Most aircraft have a main wing and a tail with control surfaces. Flying wings and delta winged aircraft only have a single wing. The main control surface on a standard wing controls the roll of the aircraft. This surface is called an aileron.<br>The control surface of a delta wing controls both roll and pitch. This surface is called an elevon. - + Выберите канал на приемнике, к которому подключен регулятор скорости или сервомашинка для газа.<br><br>Spektrum: Канал1, Futaba: Канал3 + Most aircraft have a main wing and a tail with control surfaces. Flying wings and delta winged aircraft only have a single wing. The main control surface on a standard wing controls the roll of the aircraft. This surface is called an aileron.<br>The control surface of a delta wing controls both roll and pitch. This surface is called an elevon. + Большинство самолетов имеют нормальную аэродинамическую схему (классическую). У летающих крыльев нет хвостового оперения. <br>В классической схеме за крен отвечают элероны.<br>У летающих крыльев элевоны отвечают и за крен и за тангаж. + + + Models use one or two channels to control the ailerons.<br>A so called Y-cable can be used to connect a single receiver channel to two separate aileron servos. If your servos are connected by a Y-cable you should select the single-servo option.<br><br>Aileron - Spektrum: CH2, Futaba: CH1 - + Для управления элеронами используется 1 или 2 канала.<br>Так называемый Y-кабель нужен для подключения одного канала к двум сервомашинкам.<br>Если сервомашнки подключены таким кабелем, то выберите вариант с одним каналом<br><br>Элероны на Spektrum: Канал2. На Futaba: Канал1 - + This wizard assumes that your flaps are controlled by a switch. If your flaps are controlled by a potentiometer you can change that manually later. - + В этом мастере подразумевается, что закрылки управляются тумблером. Если вы используете крутилку, тогда придется настроить её вручную. - + Air brakes are used to reduce the speed of advanced sail planes.<br>They are very uncommon on other types of planes. - + Воздушные тормоза нужны для снижения скорости планеров.<br>Они редко используются на других типах самолетов. - + Models use two channels to control the elevons.<br>Select these two channels - + Для управления элевонами нужно 2 канала. Выберите их - + Select the receiver channel that is connected to your rudder.<br><br>Rudder - Spektrum: CH4, Futaba: CH4 - + Выберите канал, к которому подключен руль направления.<br><br>Руль направления - Spektrum: Канал4, Futaba: Канал4 - + Select the tail type of your plane. - + Нужно выбрать тип хвостового оперения модели. - - Select the Rudder and Elevator channels.<br><br>Rudder - Spektrum: CH4, Futaba: CH4<br>Elevator - Spektrum: CH3, Futaba: CH2 - - - - Select the Elevator channel.<br><br>Elevator - Spektrum: CH3, Futaba: CH2 - + Select the Rudder and Elevator channels.<br><br>Rudder - Spektrum: CH4, Futaba: CH4<br>Elevator - Spektrum: CH3, Futaba: CH2 + Выберите каналы для руля высоты и руля направления.<br><br>Руль направления - Spektrum: Канал4, Futaba: Канал4<br>Руль высоты - Spektrum: Канал3, Futaba: Канал2 - - - - - - - + + Select the Elevator channel.<br><br>Elevator - Spektrum: CH3, Futaba: CH2 + Выберите канал руля высоты.<br><br>Руль высоты - Spektrum: Канал3, Futaba: Канал2 + + + + + + + + + TBD. - + Select the control channels for your multirotor.<br><br>Throttle - Spektrum: CH1, Futaba: CH3<br>Yaw - Spektrum: CH4, Futaba: CH4<br>Pitch - Spektrum: CH3, Futaba: CH2<br>Roll - Spektrum: CH2, Futaba: CH1 - + There is no help available for the current page. - + Model Wizard Help - + Помощь по использованию мастера WizardPrinter - + Plane - + Multicopter - + Helicopter - + Model Name: - + Model Type: - + Options: - + Channel %1: @@ -10342,7 +13763,7 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi burnConfigDialog - + AVRDUDE Configuration Настроить программатор @@ -10497,39 +13918,34 @@ Please only use this if you know what you are doing. There are no error checks - + DFU-UTIL Configuration - + SAM-BA Configuration - - - + + + Select Location Выбрать расположение - + List available programmers Показать список программаторов - + Avrdude help - - Companion - - - - + <b><u>WARNING!</u></b><br>Normally CPU type is automatically selected according to the chosen firmware.<br>If you change the CPU type the resulting eeprom could be inconsistent. @@ -10548,382 +13964,153 @@ m2560 for v4.1 boards - - CustomizeSplashDialog - - - Transmitter Splash Screen Editor - - - - - - Invert - Инверт - - - - - Load FW - - - - - - Load Pict - - - - - - Load Profile - - - - - - Save - - - - - - Open Splash Library - - - - - - - - ... - - - - - - - - Error - Ошибка - - - - Open Firmware File - - - - - Can not load embedded image from firmware file %1. - - - - - Open Image to load - - - - - Images (%1) - - - - - Cannot load the image file %1. - - - - - Cannot load profile image %1. - - - - - Cannot load the library image %1. - - - - - File Saved - - - - - The image was saved to the file %1 - - - - - Image Refresh Error - - - - - Failed to refresh image from file %1 - - - - - File Save Error - - - - - Failed to write image to %1 - - - - - downloadDialog - - - Downloading: - - - - - Unable to save the file %1: %2. - - - - - Companion - - - - - Download failed: %1. - - - joystickDialog Configure Joystick - + Настройки джойстика - + Ch2 - - - - - - - - - Not Assigned - - - - - - - - - - - - Right Vertical - - - - - - - - - - - - Right Horizontal - - - - - - - - - - - - Left Vertical - - - - - - - - - - - - Left Horizontal - - - - - - - - - - - - P1 - - - - - - - - - - - - P2 - - - - - - - - - - - - P3/LS - - - - - - - - - - - - RS - - - - + Ch1 - + Ch4 - + Ch6 - + Ch3 - + Ch5 - + Ch7 - + Ch8 - + Instructions - + Инструкции - + + Enable + Включить + + + Cancel + Отмена + + + + Back + Назад + + + + Start - - Next + + Not Assigned - - Ok + + Stick - + + Knob/Slider %1 + + + + + No joysticks found + Джойстик не найден + + + + Press the Start button to start the stick range calibration procedure. +You may change the channel assignments or inversion at any time. + + + + Move sticks and pots in every direction making full movement -Press next when finished +Press Next when finished - - - Error - Ошибка + + Next + Дальше - - Cannot open joystick. - - - - + Place sticks and pots in middle position. -Press next when done +Press Next when done - + Map joystick channels to controls using comboboxes. -Press next when done +Press Next when done. - - Check inversion checkbox to get maximum at top-right position. -Press next when done + + Check inversion checkbox to if necessary to reverse direction. +Press Next when done. - - Press ok to save configuration -Press cancel to abort joystick calibration + + Press OK to save configuration +Press Cancel to abort joystick calibration without saving. - - Duplicated stick assignment + + Calibration not complete, save anyway? - - - mdiChild - - Simulate Tx - + + Ok + Ок + + + + Cannot open joystick. + Не удалось подключить джойстик. @@ -10937,109 +14124,109 @@ Press cancel to abort joystick calibration ... - + ... Splash library behaviour - + Библиотека заставок Remember simulator switches - + Запоминать положения тумблеров Include companion splashes - + Добавить кортинки Companion Only user defined splashes - + Только пользовательские заставки Custom TX splash screen - + Пользовательская заставка Personal splash library - + Моя библиотека заставок Joystick - + Джойстик Open Folder - + Выбрать папку Simulator capture folder - + Папка для скриншотов Use clipboard only - + Только копировать в буфер обмена Simu BackLight - + Подсветка в симуляторе Blue Blu - + Синяя Green - + Зеленая Red - + Красная Orange - + Оранжевая Yellow - + Желтая Enable - + Включить Calibrate - + Калибровать Open Image - + Выбрать картинку Invert Pixels - + Инверсия From 074bc4475c13a87b617132f708184553bf5445a5 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 12 Dec 2019 14:58:17 +0100 Subject: [PATCH 005/560] Cosmetics --- radio/src/gui/common/stdlcd/radio_sdmanager.cpp | 4 ++-- radio/src/lua/CMakeLists.txt | 2 +- radio/src/lua/api_general.cpp | 2 +- radio/src/sdcard.h | 8 ++++---- radio/src/targets/taranis/CMakeLists.txt | 2 +- radio/src/targets/taranis/hal.h | 12 ++++++------ radio/src/translations/untranslated.h | 6 +++--- 7 files changed, 18 insertions(+), 18 deletions(-) diff --git a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp index d83110fbc..fe387f307 100644 --- a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp +++ b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp @@ -308,7 +308,7 @@ void menuRadioSdManager(event_t _event) REFRESH_FILES(); break; -#if defined(PCBX9) || defined(RADIO_X7) // TODO NO_MENU_KEY +#if defined(PCBX9) || defined(RADIO_X7) || defined(RADIO_X7ACCESS) // TODO NO_MENU_KEY case EVT_KEY_LONG(KEY_MENU): if (SD_CARD_PRESENT() && !READ_ONLY() && s_editMode == 0) { killEvents(_event); @@ -344,7 +344,7 @@ void menuRadioSdManager(event_t _event) break; case EVT_KEY_LONG(KEY_ENTER): -#if !defined(PCBX9) && !defined(RADIO_X7) // TODO NO_HEADER_LINE +#if !defined(PCBX9) && !defined(RADIO_X7) && !defined(RADIO_X7ACCESS) // TODO NO_HEADER_LINE if (menuVerticalPosition < HEADER_LINE) { killEvents(_event); POPUP_MENU_ADD_ITEM(STR_SD_INFO); diff --git a/radio/src/lua/CMakeLists.txt b/radio/src/lua/CMakeLists.txt index abdf0f11e..54afd853f 100644 --- a/radio/src/lua/CMakeLists.txt +++ b/radio/src/lua/CMakeLists.txt @@ -19,7 +19,7 @@ if(PYTHONINTERP_FOUND) add_lua_export_target(x9lite ${LUA_INCLUDES} -DPCBTARANIS -DPCBX9LITE -DPCBX9) add_lua_export_target(x9lites ${LUA_INCLUDES} -DPCBTARANIS -DPCBX9LITES -DPCBX9LITE -DPCBX9) add_lua_export_target(x7 ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7 -DRADIO_X7) - add_lua_export_target(x7access ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7ACCESS -DPCBX7 -DRADIO_X7) + add_lua_export_target(x7access ${LUA_INCLUDES} -DPCBTARANIS -DPCBX7ACCESS -DPCBX7 -DRADIO_X7ACCESS) add_lua_export_target(xlite ${LUA_INCLUDES} -DPCBTARANIS -DPCBXLITE) add_lua_export_target(xlites ${LUA_INCLUDES} -DPCBTARANIS -DPCBXLITES -DPCBXLITE -DGYRO) add_lua_export_target(x9d ${LUA_INCLUDES} -DPCBTARANIS -DPCBX9D -DPCBX9) diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index f49025745..b87d02fc2 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -34,7 +34,7 @@ #include "lua/lua_exports_x10.inc" #elif defined(PCBX9E) #include "lua/lua_exports_x9e.inc" -#elif defined(PCBX7ACCESS) +#elif defined(RADIO_X7ACCESS) #include "lua/lua_exports_x7access.inc" #elif defined(RADIO_X7) #include "lua/lua_exports_x7.inc" diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h index 3f7ed8eda..a37476d3a 100644 --- a/radio/src/sdcard.h +++ b/radio/src/sdcard.h @@ -136,8 +136,10 @@ const char * getBasename(const char * path); #define OTX_FOURCC 0x3B78746F // otx for Taranis X-Lite S #elif defined(PCBXLITE) #define OTX_FOURCC 0x3978746F // otx for Taranis X-Lite -#elif defined(RADIO_X7) - #define OTX_FOURCC 0x3678746F // otx for Taranis X7 +#elif defined(RADIO_T12) + #define OTX_FOURCC 0x3D78746F // otx for Jumper T12 +#elif defined(PCBX7) + #define OTX_FOURCC 0x3678746F // otx for Taranis X7 / X7S / X7 Express / X7S Express #elif defined(PCBX9LITES) #define OTX_FOURCC 0x3E78746F // otx for Taranis X9-Lite #elif defined(PCBX9LITE) @@ -146,8 +148,6 @@ const char * getBasename(const char * path); #define OTX_FOURCC 0x3378746F // otx for Taranis X9D #elif defined(PCBSKY9X) #define OTX_FOURCC 0x3278746F // otx for sky9x -#elif defined(RADIO_T12) - #define OTX_FOURCC 0x3D78746F // otx for Jumper T12 #endif bool isFileAvailable(const char * filename, bool exclDir = false); diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 26fee42b1..c74e350a0 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -125,7 +125,7 @@ elseif(PCB STREQUAL X7) set(CPU_TYPE_FULL STM32F407xE) # for size report set(LINKER_SCRIPT targets/taranis/stm32f4_flash.ld) set(LUA_EXPORT lua_export_x7access) - add_definitions(-DRADIO_X7) + add_definitions(-DRADIO_X7ACCESS) add_definitions(-DEEPROM_VARIANT=0x4000) add_definitions(-DPCBREV=${PCBREV}) add_definitions(-DPCBX7ACCESS) diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 8a1aecd2f..9e91b97e6 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -59,7 +59,7 @@ #define KEYS_GPIO_PIN_LEFT GPIO_Pin_7 // PD.07 #define KEYS_GPIO_REG_RIGHT GPIOD->IDR #define KEYS_GPIO_PIN_RIGHT GPIO_Pin_3 // PD.03 -#elif defined(RADIO_X7) +#elif defined(PCBX7) #define KEYS_GPIO_REG_PAGE GPIOD->IDR #define KEYS_GPIO_PIN_PAGE GPIO_Pin_3 // PD.03 #define KEYS_GPIO_REG_MENU GPIOD->IDR @@ -128,7 +128,7 @@ #define ROTARY_ENCODER_EXTI_PortSource EXTI_PortSourceGPIOE #define ROTARY_ENCODER_EXTI_PinSource1 EXTI_PinSource10 #define ROTARY_ENCODER_EXTI_PinSource2 EXTI_PinSource11 -#elif defined(RADIO_X7) +#elif defined(RADIO_X7) || defined(RADIO_X7ACCESS) #define ROTARY_ENCODER_NAVIGATION #define ROTARY_ENCODER_GPIO GPIOE #define ROTARY_ENCODER_GPIO_PIN_A GPIO_Pin_9 // PE.09 @@ -667,7 +667,7 @@ #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(PCBX7ACCESS) +#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 #define KEYS_GPIOC_PINS (GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_13) @@ -1024,7 +1024,7 @@ #define INTMODULE_DMA_STREAM_IRQHandler DMA2_Stream7_IRQHandler #define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF7 #define INTMODULE_DMA_CHANNEL DMA_Channel_4 -#elif defined(PCBX7ACCESS) +#elif defined(RADIO_X7ACCESS) #define INTMODULE_RCC_APB1Periph 0 #define INTMODULE_RCC_APB2Periph RCC_APB2Periph_USART1 #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2) @@ -1357,7 +1357,7 @@ #define TELEMETRY_EXTI_IRQn EXTI9_5_IRQn #define TELEMETRY_EXTI_TRIGGER EXTI_Trigger_Rising -#if defined(RADIO_X7) +#if defined(RADIO_X7) || defined(RADIO_X7ACCESS) #define TELEMETRY_EXTI_REUSE_INTERRUPT_ROTARY_ENCODER #elif defined(PCBXLITE) || defined(PCBX9LITE) || (defined(PCBX9DP) && PCBREV >= 2019) #define TELEMETRY_EXTI_IRQHandler EXTI9_5_IRQHandler @@ -1441,7 +1441,7 @@ // #define INTMODULE_HEARTBEAT_EXTI_LINE EXTI_Line9 // #define INTMODULE_HEARTBEAT_EXTI_IRQn EXTI9_5_IRQn // #define INTMODULE_HEARTBEAT_EXTI_IRQHandler EXTI9_5_IRQHandler -#elif defined(PCBX7ACCESS) +#elif defined(RADIO_X7ACCESS) #define INTMODULE_HEARTBEAT #define INTMODULE_HEARTBEAT_REUSE_INTERRUPT_ROTARY_ENCODER #define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOA diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h index e5abaedf5..ed569729a 100644 --- a/radio/src/translations/untranslated.h +++ b/radio/src/translations/untranslated.h @@ -41,12 +41,12 @@ #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_X7) - #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" - #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SF\0""\312SH\0""\312SI\0""\312SJ\0" #elif defined(RADIO_T12) #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0" +#elif defined(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" #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" From 55aa99b80b51b2843e76fcd302ceabff40cc1243 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 12 Dec 2019 14:59:03 +0100 Subject: [PATCH 006/560] Cosmetics --- radio/src/targets/taranis/hal.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 9e91b97e6..e189a95d0 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -193,7 +193,7 @@ #define TRIMS_GPIO_PIN_LVU GPIO_Pin_0 // PB.00 #define TRIMS_GPIO_REG_LVD GPIOB->IDR #define TRIMS_GPIO_PIN_LVD GPIO_Pin_1 // PB.01 -#elif defined(PCBX7ACCESS) +#elif defined(RADIO_X7ACCESS) #define TRIMS_GPIO_REG_LHR GPIOD->IDR #define TRIMS_GPIO_PIN_LHR GPIO_Pin_15 // PD.15 #define TRIMS_GPIO_REG_LHL GPIOC->IDR From 14a366ea27ec4587e8ed01bfe6feb0b81c9d189f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 12 Dec 2019 15:07:27 +0100 Subject: [PATCH 007/560] Cosmetics --- .../conversions/conversions_218_219.cpp | 6 ++-- radio/src/switches.cpp | 2 +- radio/src/targets/taranis/CMakeLists.txt | 1 + radio/src/targets/taranis/board.h | 6 ++-- radio/src/targets/taranis/hal.h | 36 +++++++++---------- radio/src/targets/taranis/keys_driver.cpp | 2 +- radio/src/targets/taranis/lcd_driver_spi.cpp | 2 +- 7 files changed, 28 insertions(+), 27 deletions(-) diff --git a/radio/src/storage/conversions/conversions_218_219.cpp b/radio/src/storage/conversions/conversions_218_219.cpp index 793d9931c..fe047ed80 100644 --- a/radio/src/storage/conversions/conversions_218_219.cpp +++ b/radio/src/storage/conversions/conversions_218_219.cpp @@ -249,7 +249,7 @@ void convertModelData_218_to_219(ModelData &model) newModel.moduleData[i].type += 4; if (newModel.moduleData[i].type == MODULE_TYPE_XJT_PXX1) { newModel.moduleData[i].subType = newModel.moduleData[i].rfProtocol; -#if defined(PCBX9DP) && PCBREV >= 2019 +#if defined(RADIO_X9DP2019) if (i == INTERNAL_MODULE) { newModel.moduleData[i].type = MODULE_TYPE_ISRM_PXX2; newModel.moduleData[i].subType = MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16; @@ -389,7 +389,7 @@ void convertRadioData_218_to_219(RadioData & settings) settings.backlightColor = oldSettings.backlightColor; settings.switchUnlockStates = oldSettings.switchUnlockStates; settings.switchConfig = oldSettings.switchConfig; -#if defined(PCBX9DP) && PCBREV >= 2019 +#if defined(RADIO_X9DP2019) settings.switchConfig |= SWITCH_TOGGLE << 16; #endif memcpy(&settings.switchNames[0], &oldSettings.switchNames[0], 8 * LEN_SWITCH_NAME); @@ -440,7 +440,7 @@ void convertRadioData_218_to_219(RadioData & settings) } #endif -#if defined(PCBX9DP) && PCBREV >= 2019 +#if defined(RADIO_X9DP2019) // force re-calibration settings.chkSum = 0xFFFF; setDefaultOwnerId(); diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index b02c05861..c226e8f7b 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -158,7 +158,7 @@ void getSwitchesPosition(bool startup) CHECK_2POS(SW_SH); #endif -#if defined(PCBX9DP) && PCBREV >= 2019 +#if defined(RADIO_X9DP2019) CHECK_2POS(SW_SI); #endif diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index c74e350a0..aeba17982 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -61,6 +61,7 @@ elseif(PCB STREQUAL X9D+) ${FIRMWARE_TARGET_SRC} startup_stm32f40_41xxx.s ) + add_definitions(-DRADIO_X9DP2019) add_definitions(-DSTM32F40_41xxx) add_definitions(-DSOFTWARE_VOLUME -DPWR_BUTTON_${PWR_BUTTON} -DHARDWARE_POWER_MANAGEMENT_UNIT) set(STATUS_LEDS YES) diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index a5d8ca825..4234baf1a 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -333,7 +333,7 @@ enum EnumSwitchesPositions SW_SH1, SW_SH2, #endif -#if defined(PCBX9DP) && PCBREV >= 2019 +#if defined(RADIO_X9DP2019) SW_SI0, SW_SI1, SW_SI2, @@ -426,7 +426,7 @@ enum EnumSwitchesPositions #define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 14) + (SWITCH_3POS << 12) + (SWITCH_2POS << 10) + (SWITCH_3POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0) #define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 0) + (POT_WITH_DETENT << 2); // S1 = pot without detent, S2 = pot with detent #define DEFAULT_SLIDERS_CONFIG (SLIDER_WITH_DETENT << 3) + (SLIDER_WITH_DETENT << 2) + (SLIDER_WITH_DETENT << 1) + (SLIDER_WITH_DETENT << 0) -#elif defined(PCBX9DP) && PCBREV >= 2019 +#elif defined(RADIO_X9DP2019) #define NUM_SWITCHES 9 #define STORAGE_NUM_SWITCHES NUM_SWITCHES #define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 16) + (SWITCH_TOGGLE << 14) + (SWITCH_3POS << 12) + (SWITCH_2POS << 10) + (SWITCH_3POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0); @@ -616,7 +616,7 @@ extern uint16_t adcValues[NUM_ANALOGS]; #define BATT_SCALE 123 #elif defined(PCBX9LITE) #define BATT_SCALE 117 -#elif defined(PCBX9DP) && PCBREV >= 2019 +#elif defined(RADIO_X9DP2019) #define BATT_SCALE 117 #else #define BATT_SCALE 150 diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index e189a95d0..0217d173a 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -77,7 +77,7 @@ #define KEYS_GPIO_PIN_EXIT GPIO_Pin_9 // PE.09 #define KEYS_GPIO_REG_ENTER GPIOE->IDR #define KEYS_GPIO_PIN_ENTER GPIO_Pin_11 // PE.11 -#elif defined(PCBX9DP) && PCBREV >= 2019 +#elif defined(RADIO_X9DP2019) #define KEYS_GPIO_REG_MENU GPIOD->IDR #define KEYS_GPIO_PIN_MENU GPIO_Pin_2 // PD.02 #define KEYS_GPIO_REG_EXIT GPIOD->IDR @@ -115,7 +115,7 @@ #define ROTARY_ENCODER_EXTI_PortSource EXTI_PortSourceGPIOD #define ROTARY_ENCODER_EXTI_PinSource1 EXTI_PinSource12 #define ROTARY_ENCODER_EXTI_PinSource2 EXTI_PinSource13 -#elif defined(PCBX9DP) && PCBREV >= 2019 +#elif defined(RADIO_X9DP2019) #define ROTARY_ENCODER_NAVIGATION #define ROTARY_ENCODER_GPIO GPIOE #define ROTARY_ENCODER_GPIO_PIN_A GPIO_Pin_10 // PE.10 @@ -244,7 +244,7 @@ #define TRIMS_GPIO_PIN_RVD GPIO_Pin_14 // PE.14 #define TRIMS_GPIO_REG_RHL GPIOD->IDR #define TRIMS_GPIO_PIN_RHL GPIO_Pin_9 // PD.09 -#elif defined(PCBX9DP) && PCBREV >= 2019 +#elif defined(RADIO_X9DP2019) #define TRIMS_GPIO_REG_LHL GPIOE->IDR #define TRIMS_GPIO_PIN_LHL GPIO_Pin_3 // PE.03 #define TRIMS_GPIO_REG_LHR GPIOE->IDR @@ -536,7 +536,7 @@ #define SWITCHES_GPIO_PIN_H GPIO_Pin_13 // PE.13 #endif -#if defined(PCBX9DP) && PCBREV >= 2019 +#if defined(RADIO_X9DP2019) #define STORAGE_SWITCH_I #define HARDWARE_SWITCH_I #define SWITCHES_GPIO_REG_I GPIOD->IDR @@ -635,7 +635,7 @@ #define KEYS_GPIOE_PINS (TRIMS_GPIO_PIN_LVU | TRIMS_GPIO_PIN_LVD | SWITCHES_GPIO_PIN_D_H | SWITCHES_GPIO_PIN_D_L| SWITCHES_GPIO_PIN_E_H | SWITCHES_GPIO_PIN_E_L | SWITCHES_GPIO_PIN_F | SWITCHES_GPIO_PIN_I_L | SWITCHES_GPIO_PIN_L_H | SWITCHES_GPIO_PIN_L_L | SWITCHES_GPIO_PIN_M_H | SWITCHES_GPIO_PIN_O_L | SWITCHES_GPIO_PIN_R_L) #define KEYS_GPIOF_PINS (KEYS_GPIO_PIN_ENTER | SWITCHES_GPIO_PIN_C_H | SWITCHES_GPIO_PIN_C_L | SWITCHES_GPIO_PIN_G_H | SWITCHES_GPIO_PIN_G_L | SWITCHES_GPIO_PIN_H | SWITCHES_GPIO_PIN_I_H | SWITCHES_GPIO_PIN_O_H | SWITCHES_GPIO_PIN_P_H | SWITCHES_GPIO_PIN_P_L | SWITCHES_GPIO_PIN_Q_H | SWITCHES_GPIO_PIN_Q_L) #define KEYS_GPIOG_PINS (TRIMS_GPIO_PIN_LHL | TRIMS_GPIO_PIN_LHR| SWITCHES_GPIO_PIN_B_H | SWITCHES_GPIO_PIN_B_L | SWITCHES_GPIO_PIN_J_H | SWITCHES_GPIO_PIN_J_L | SWITCHES_GPIO_PIN_K_H | SWITCHES_GPIO_PIN_K_L) -#elif defined(PCBX9DP) && PCBREV >= 2019 +#elif defined(RADIO_X9DP2019) #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_3 | GPIO_Pin_4 | GPIO_Pin_5) @@ -916,7 +916,7 @@ #define PWR_ON_GPIO_PIN GPIO_Pin_0 // PD.00 #endif -#if defined(PCBX9DP) && PCBREV >= 2019 +#if defined(RADIO_X9DP2019) #define STATUS_LEDS #define GPIO_LED_GPIO_ON GPIO_ResetBits #define GPIO_LED_GPIO_OFF GPIO_SetBits @@ -1004,7 +1004,7 @@ #define INTMODULE_BOOTCMD_GPIO GPIOC #define INTMODULE_BOOTCMD_GPIO_PIN GPIO_Pin_8 // PC.08 #endif -#elif defined(PCBX9DP) && PCBREV >= 2019 +#elif defined(RADIO_X9DP2019) #define INTMODULE_RCC_APB1Periph 0 #define INTMODULE_RCC_APB2Periph RCC_APB2Periph_USART1 #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2) @@ -1113,9 +1113,9 @@ #endif // External Module -#if defined(PCBXLITE) || defined(PCBX9LITE) || (defined(PCBX9DP) && PCBREV >= 2019) || defined(PCBX7ACCESS) +#if defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_X9DP2019) || defined(PCBX7ACCESS) #define EXTMODULE_RCC_APB2Periph (RCC_APB2Periph_TIM8 | RCC_APB2Periph_USART6) - #if (defined(PCBX9DP) && PCBREV >= 2019) || defined(PCBX7ACCESS) + #if defined(RADIO_X9DP2019) || defined(RADIO_X7ACCESS) #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) #define EXTMODULE_PWR_GPIO GPIOD #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_8 // PD.08 @@ -1183,7 +1183,7 @@ #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(PCBX9DP) && PCBREV >= 2019 +#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) #define EXTMODULE_PWR_GPIO GPIOD @@ -1305,7 +1305,7 @@ #endif // Serial Port -#if defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) || (defined(PCBX9DP) && PCBREV >= 2019) +#if defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_X9DP2019) #define AUX_SERIAL_RCC_AHB1Periph 0 #define AUX_SERIAL_RCC_APB1Periph 0 #else @@ -1330,7 +1330,7 @@ #define TELEMETRY_RCC_APB1Periph RCC_APB1Periph_USART2 #define TELEMETRY_DIR_GPIO GPIOD #define TELEMETRY_DIR_GPIO_PIN GPIO_Pin_4 // PD.04 -#if defined(PCBXLITE) || defined(PCBX9LITE) || (defined(PCBX9DP) && PCBREV >= 2019) || defined(PCBX7ACCESS) +#if defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_X9DP2019) || defined(RADIO_X7ACCESS) #define TELEMETRY_DIR_OUTPUT() TELEMETRY_DIR_GPIO->BSRRH = TELEMETRY_DIR_GPIO_PIN #define TELEMETRY_DIR_INPUT() TELEMETRY_DIR_GPIO->BSRRL = TELEMETRY_DIR_GPIO_PIN #else @@ -1359,7 +1359,7 @@ #if defined(RADIO_X7) || defined(RADIO_X7ACCESS) #define TELEMETRY_EXTI_REUSE_INTERRUPT_ROTARY_ENCODER -#elif defined(PCBXLITE) || defined(PCBX9LITE) || (defined(PCBX9DP) && PCBREV >= 2019) +#elif defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_X9DP2019) #define TELEMETRY_EXTI_IRQHandler EXTI9_5_IRQHandler #else #define TELEMETRY_EXTI_REUSE_INTERRUPT_INTMODULE_HEARTBEAT @@ -1407,7 +1407,7 @@ #define SPORT_UPDATE_PWR_GPIO_PIN GPIO_Pin_15 // PE.15 #define GPIO_SPORT_UPDATE_PWR_GPIO_ON GPIO_SetBits #define GPIO_SPORT_UPDATE_PWR_GPIO_OFF GPIO_ResetBits -#elif defined(PCBX9DP) && PCBREV >= 2019 +#elif defined(RADIO_X9DP2019) #define SPORT_MAX_BAUDRATE 400000 #define SPORT_UPDATE_RCC_AHB1Periph RCC_AHB1Periph_GPIOA #define SPORT_UPDATE_PWR_GPIO GPIOA @@ -1461,7 +1461,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(PCBX9DP) && PCBREV >= 2019 +#elif defined(RADIO_X9DP2019) #define INTMODULE_HEARTBEAT #define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOB #define INTMODULE_HEARTBEAT_GPIO GPIOB @@ -1734,7 +1734,7 @@ #define I2C_WP_GPIO_PIN GPIO_Pin_5 // PB.05 #define I2C_SDA_GPIO_PinSource GPIO_PinSource9 #define I2C_SCL_GPIO_PinSource GPIO_PinSource8 -#elif defined(PCBX9DP) && PCBREV >= 2019 +#elif defined(RADIO_X9DP2019) #define I2C_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOF) #define I2C_SPI_GPIO GPIOB #define I2C_SDA_GPIO_PIN GPIO_Pin_9 // PB.09 @@ -1847,7 +1847,7 @@ #define HAPTIC_CCMR1 TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2 #define HAPTIC_CCER TIM_CCER_CC2E #define BACKLIGHT_BDTR TIM_BDTR_MOE -#elif (defined(PCBX9DP) && PCBREV >= 2019) || defined(PCBX7ACCESS) +#elif defined(RADIO_X9DP2019) || defined(RADIO_X7ACCESS) #define HAPTIC_PWM #define HAPTIC_RCC_AHB1Periph RCC_AHB1Periph_GPIOA #define HAPTIC_RCC_APB2Periph RCC_APB2Periph_TIM1 @@ -1915,7 +1915,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(PCBX9DP) && PCBREV >= 2019) +#elif defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITES) || defined(RADIO_X9DP2019) #define STORAGE_BLUETOOTH #define BT_RCC_APB1Periph RCC_APB1Periph_USART3 #define BT_RCC_APB2Periph 0 diff --git a/radio/src/targets/taranis/keys_driver.cpp b/radio/src/targets/taranis/keys_driver.cpp index 424c9345b..ab0a6202d 100644 --- a/radio/src/targets/taranis/keys_driver.cpp +++ b/radio/src/targets/taranis/keys_driver.cpp @@ -215,7 +215,7 @@ uint32_t switchState(uint8_t index) ADD_2POS_CASE(H); #endif -#if defined(PCBX9DP) && PCBREV >= 2019 +#if defined(RADIO_X9DP2019) ADD_2POS_CASE(I); #endif diff --git a/radio/src/targets/taranis/lcd_driver_spi.cpp b/radio/src/targets/taranis/lcd_driver_spi.cpp index c3ab17629..ca66dc1a7 100644 --- a/radio/src/targets/taranis/lcd_driver_spi.cpp +++ b/radio/src/targets/taranis/lcd_driver_spi.cpp @@ -311,7 +311,7 @@ void lcdInit() issued by the other parts of the code. */ -#if (defined(PCBX9DP) && PCBREV >= 2019) || defined(PCBX7ACCESS) +#if defined(RADIO_X9DP2019) || defined(RADIO_X7ACCESS) #define LCD_DELAY_NEEDED() true #else #define LCD_DELAY_NEEDED() (!WAS_RESET_BY_WATCHDOG_OR_SOFTWARE()) From 2864ca49d761c6e7417a03f9396ebddefba7b575 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 12 Dec 2019 15:34:45 +0100 Subject: [PATCH 008/560] Cosmetics --- .../common/arm/stm32/bluetooth_driver.cpp | 8 ++--- radio/src/targets/taranis/CMakeLists.txt | 31 ++++++++++++++++--- radio/src/targets/taranis/board.h | 2 +- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/radio/src/targets/common/arm/stm32/bluetooth_driver.cpp b/radio/src/targets/common/arm/stm32/bluetooth_driver.cpp index 1d4bee5e0..01349d56c 100644 --- a/radio/src/targets/common/arm/stm32/bluetooth_driver.cpp +++ b/radio/src/targets/common/arm/stm32/bluetooth_driver.cpp @@ -24,9 +24,7 @@ Fifo btTxFifo; Fifo btRxFifo; -#if defined(PCBX7ACCESS) -//nothing to do -#elif defined(PCBX7) || defined(PCBXLITE) +#if defined(BLUETOOTH_PROBE) volatile uint8_t btChipPresent = 0; #endif @@ -119,9 +117,7 @@ extern "C" void BT_USART_IRQHandler(void) uint8_t byte = USART_ReceiveData(BT_USART); btRxFifo.push(byte); TRACE("BT %02X", byte); -#if defined(PCBX7ACCESS) - //nothing to do -#elif defined(PCBX7) || defined(PCBXLITE) +#if defined(BLUETOOTH_PROBE) if (!btChipPresent) { // This is to differentiate X7 and X7S and X-Lite with/without BT btChipPresent = 1; diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index aeba17982..f2cc53add 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -36,6 +36,8 @@ if(PCB STREQUAL X9E) set(LCD_DRIVER lcd_driver_spi.cpp) set(GVAR_SCREEN model_gvars.cpp) set(STATUS_LEDS NO) + set(BLUETOOTH YES) + set(ROTARY_ENCODER YES) elseif(PCB STREQUAL X9D+) set(HAPTIC YES) set(LUA_EXPORT lua_export_x9d) @@ -67,6 +69,9 @@ elseif(PCB STREQUAL X9D+) set(STATUS_LEDS YES) set(PXX2 ON) set(PXX_FREQUENCY "HIGH") + set(BLUETOOTH YES) + set(ROTARY_ENCODER YES) + set(INTERNAL_MODULE_SERIAL YES) else() option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON) option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" OFF) @@ -135,9 +140,12 @@ elseif(PCB STREQUAL X7) startup_stm32f40_41xxx.s ) add_definitions(-DSTM32F40_41xxx) + add_definitions(-DHARDWARE_POWER_MANAGEMENT_UNIT) set(PXX2 ON) set(PXX_FREQUENCY "HIGH") - add_definitions(-DHARDWARE_POWER_MANAGEMENT_UNIT) + set(BLUETOOTH YES) + set(ROTARY_ENCODER YES) + set(INTERNAL_MODULE_SERIAL YES) else() option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON) option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" OFF) @@ -149,6 +157,9 @@ elseif(PCB STREQUAL X7) set(LUA_EXPORT lua_export_x7) add_definitions(-DRADIO_X7) add_definitions(-DEEPROM_VARIANT=0x4000) + set(BLUETOOTH YES) + add_definitions(-DBLUETOOTH_PROBE) + set(ROTARY_ENCODER YES) endif() elseif(PCB STREQUAL X9LITE) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" OFF) @@ -173,6 +184,8 @@ elseif(PCB STREQUAL X9LITE) set(LCD_DRIVER lcd_driver_spi.cpp) set(GVAR_SCREEN model_gvars.cpp) set(STATUS_LEDS YES) + set(ROTARY_ENCODER YES) + set(INTERNAL_MODULE_SERIAL YES) elseif(PCB STREQUAL X9LITES) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" OFF) option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" ON) @@ -196,6 +209,9 @@ elseif(PCB STREQUAL X9LITES) set(LCD_DRIVER lcd_driver_spi.cpp) set(GVAR_SCREEN model_gvars.cpp) set(STATUS_LEDS YES) + set(BLUETOOTH YES) + set(ROTARY_ENCODER YES) + set(INTERNAL_MODULE_SERIAL YES) elseif(PCB STREQUAL XLITE) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON) option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" OFF) @@ -218,6 +234,8 @@ elseif(PCB STREQUAL XLITE) set(LCD_DRIVER lcd_driver_spi.cpp) set(GVAR_SCREEN model_gvars.cpp) set(STATUS_LEDS YES) + set(BLUETOOTH YES) + set(INTERNAL_MODULE_SERIAL YES) elseif(PCB STREQUAL XLITES) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" OFF) option(INTERNAL_MODULE_PXX2 "Support for PXX2 internal module" ON) @@ -240,9 +258,12 @@ elseif(PCB STREQUAL XLITES) set(GVAR_SCREEN model_gvars.cpp) set(STATUS_LEDS YES) set(PXX2 ON) + set(BLUETOOTH YES) + set(GYRO YES) + set(INTERNAL_MODULE_SERIAL YES) endif() -if(PCB STREQUAL XLITES) +if(GYRO) add_definitions(-DGYRO) set(TARGET_SRC ${TARGET_SRC} @@ -254,7 +275,7 @@ if(PCB STREQUAL XLITES) ) endif() -if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES OR PCB STREQUAL X9LITE OR PCB STREQUAL X9LITES OR (PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019) OR (PCB STREQUAL X7 AND PCBREV STREQUAL ACCESS)) +if(INTERNAL_MODULE_SERIAL) add_definitions(-DINTERNAL_MODULE_SERIAL) if(PXX_FREQUENCY STREQUAL HIGH) add_definitions(-DPXX_FREQUENCY_HIGH) @@ -270,14 +291,14 @@ elseif(NOT (PCB STREQUAL X7 AND PCBREV STREQUAL T12)) ) endif() -if(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(TARGET_SRC ${TARGET_SRC} ../common/arm/stm32/rotary_encoder_driver.cpp ) endif() -if(PCB STREQUAL X9E OR (PCB STREQUAL X7 AND NOT PCBREV STREQUAL T12) OR PCB STREQUAL XLITE OR PCB STREQUAL XLITES OR (PCB STREQUAL X9D+ AND PCBREV STREQUAL 2019) OR PCB STREQUAL X9LITES) +if(BLUETOOTH) add_definitions(-DBLUETOOTH) set(TARGET_SRC ${TARGET_SRC} diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 4234baf1a..54127d6d1 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -800,7 +800,7 @@ void bluetoothDisable(); #define IS_BLUETOOTH_CHIP_PRESENT() (true) #elif defined(PCBX9LITE) #define IS_BLUETOOTH_CHIP_PRESENT() (false) -#elif (defined(PCBX7) || defined(PCBXLITE)) && !defined(SIMU) +#elif defined(BLUETOOTH_PROBE) && !defined(SIMU) extern volatile uint8_t btChipPresent; #define IS_BLUETOOTH_CHIP_PRESENT() (btChipPresent) #else From 0d6580fb6c0f57679bc6e012cc681ed6e7558ce8 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 12 Dec 2019 16:00:39 +0100 Subject: [PATCH 009/560] Fixes #7185 --- radio/src/gui/480x272/themes/default.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/radio/src/gui/480x272/themes/default.cpp b/radio/src/gui/480x272/themes/default.cpp index 84b23e168..d846fb383 100644 --- a/radio/src/gui/480x272/themes/default.cpp +++ b/radio/src/gui/480x272/themes/default.cpp @@ -46,8 +46,7 @@ class DefaultTheme: public Theme lcdColorTable[SCROLLBOX_COLOR_INDEX] = RED; lcdColorTable[MENU_TITLE_BGCOLOR_INDEX] = DARKGREY; lcdColorTable[MENU_TITLE_COLOR_INDEX] = WHITE; - lcdColorTable[MENU_TITLE_DISABLE_COLOR_INDEX] = - RGB(GET_RED(RED)>>1, GET_GREEN(RED)>>1, GET_BLUE(RED)>>1); + lcdColorTable[MENU_TITLE_DISABLE_COLOR_INDEX] = RGB(GET_RED(RED)>>1, GET_GREEN(RED)>>1, GET_BLUE(RED)>>1); lcdColorTable[HEADER_COLOR_INDEX] = DARKGREY; lcdColorTable[ALARM_COLOR_INDEX] = RED; lcdColorTable[WARNING_COLOR_INDEX] = YELLOW; @@ -277,16 +276,15 @@ class DefaultTheme: public Theme virtual void update() const { uint32_t color = g_eeGeneral.themeData.options[1].unsignedValue; - uint32_t bg_color = UNEXPECTED_SHUTDOWN() ? WHITE : g_eeGeneral.themeData.options[0].unsignedValue; + uint32_t bgColor = globalData.unexpectedShutdown ? WHITE : g_eeGeneral.themeData.options[0].unsignedValue; - lcdColorTable[TEXT_BGCOLOR_INDEX] = bg_color; + lcdColorTable[TEXT_BGCOLOR_INDEX] = bgColor; lcdColorTable[TEXT_INVERTED_BGCOLOR_INDEX] = color; lcdColorTable[SCROLLBOX_COLOR_INDEX] = color; lcdColorTable[CURVE_COLOR_INDEX] = color; lcdColorTable[CURVE_CURSOR_COLOR_INDEX] = color; lcdColorTable[TITLE_BGCOLOR_INDEX] = color; - lcdColorTable[MENU_TITLE_DISABLE_COLOR_INDEX] = - RGB(GET_RED(color)>>1, GET_GREEN(color)>>1, GET_BLUE(color)>>1); + lcdColorTable[MENU_TITLE_DISABLE_COLOR_INDEX] = RGB(GET_RED(color)>>1, GET_GREEN(color)>>1, GET_BLUE(color)>>1); lcdColorTable[TRIM_BGCOLOR_INDEX] = color; lcdColorTable[MAINVIEW_GRAPHICS_COLOR_INDEX] = color; #define DARKER(x) ((x * 70) / 100) From 20cc9f9c3f949b54e4f3287faa5be6eef2835275 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 12 Dec 2019 17:00:33 +0100 Subject: [PATCH 010/560] Font cosmetics --- radio/src/fonts/480x272/font_stdsize.png | Bin 21055 -> 22093 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/radio/src/fonts/480x272/font_stdsize.png b/radio/src/fonts/480x272/font_stdsize.png index 48646859e673a7bc0131cf2e79341005a7f01f8f..e173a61af7fa6d9e6fcfcc374a92129a3fe4aaf6 100644 GIT binary patch literal 22093 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 S=w6}+r>$DCR(>f^dFa2ltE2+} literal 21055 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 From bc8d39adbfd0fa8921ca9529e3b86dfd49fb30ff Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 15 Dec 2019 18:13:36 +0100 Subject: [PATCH 011/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 298dc3f45..afbca29e1 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1667,3 +1667,4 @@ James Snodgrass Peter Schneider Norman Schenck Boris Hemmer +Gilles Arbona From 9abcee430a6ccad267a1b5a00f50185c4a157ec4 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 16 Dec 2019 07:02:17 +0100 Subject: [PATCH 012/560] T16 mute improve (#7193) Introduce mute time on T16 --- radio/src/audio.h | 3 + .../common/arm/stm32/audio_dac_driver.cpp | 58 ++++++++++++++----- radio/src/targets/horus/hal.h | 3 +- 3 files changed, 48 insertions(+), 16 deletions(-) diff --git a/radio/src/audio.h b/radio/src/audio.h index ac356863a..0f4821a82 100644 --- a/radio/src/audio.h +++ b/radio/src/audio.h @@ -512,6 +512,9 @@ class AudioQueue { bool isEmpty() const { return fragmentsFifo.empty(); }; void wakeup(); bool started() const { return _started; }; +#if defined(AUDIO_UNMUTE_DELAY) + tmr10ms_t lastAudioPlayTime = 0; +#endif AudioBufferFifo buffersFifo; diff --git a/radio/src/targets/common/arm/stm32/audio_dac_driver.cpp b/radio/src/targets/common/arm/stm32/audio_dac_driver.cpp index d050382a2..a99020dda 100644 --- a/radio/src/targets/common/arm/stm32/audio_dac_driver.cpp +++ b/radio/src/targets/common/arm/stm32/audio_dac_driver.cpp @@ -88,33 +88,61 @@ void dacInit() NVIC_SetPriority(AUDIO_DMA_Stream_IRQn, 7); } +#if defined(AUDIO_MUTE_GPIO_PIN) +void audioMute() +{ +#if defined(AUDIO_UNMUTE_DELAY) + tmr10ms_t now = get_tmr10ms(); + if (!audioQueue.lastAudioPlayTime) { + // we start the mute delay now + audioQueue.lastAudioPlayTime = now; + } + else if (now - audioQueue.lastAudioPlayTime > AUDIO_MUTE_DELAY / 10) { + // delay expired, we may mute + GPIO_SetBits(AUDIO_MUTE_GPIO, AUDIO_MUTE_GPIO_PIN); + } +#else + // mute + GPIO_SetBits(AUDIO_MUTE_GPIO, AUDIO_MUTE_GPIO_PIN); +#endif +} + +void audioUnmute() +{ +#if defined(AUDIO_UNMUTE_DELAY) + // if muted + if (GPIO_ReadOutputDataBit(AUDIO_MUTE_GPIO, AUDIO_MUTE_GPIO_PIN)) { + // ..un-mute + GPIO_ResetBits(AUDIO_MUTE_GPIO, AUDIO_MUTE_GPIO_PIN); + RTOS_WAIT_MS(AUDIO_UNMUTE_DELAY); + } + // reset the mute delay + audioQueue.lastAudioPlayTime = 0; +#else + GPIO_ResetBits(AUDIO_MUTE_GPIO, AUDIO_MUTE_GPIO_PIN); +#endif +} +#endif + void audioConsumeCurrentBuffer() { if (!nextBuffer) { nextBuffer = audioQueue.buffersFifo.getNextFilledBuffer(); if (nextBuffer) { #if defined(AUDIO_MUTE_GPIO_PIN) - // if muted - if (GPIO_ReadOutputDataBit(AUDIO_MUTE_GPIO, AUDIO_MUTE_GPIO_PIN)) { - // ..un-mute - GPIO_ResetBits(AUDIO_MUTE_GPIO, AUDIO_MUTE_GPIO_PIN); -#if defined(AUDIO_UNMUTE_DELAY) - RTOS_WAIT_MS(AUDIO_UNMUTE_DELAY); + audioUnmute(); #endif - } -#endif - AUDIO_DMA_Stream->CR &= ~DMA_SxCR_EN ; // Disable DMA channel - AUDIO_DMA->HIFCR = DMA_HIFCR_CTCIF5 | DMA_HIFCR_CHTIF5 | DMA_HIFCR_CTEIF5 | DMA_HIFCR_CDMEIF5 | DMA_HIFCR_CFEIF5 ; // Write ones to clear bits + AUDIO_DMA_Stream->CR &= ~DMA_SxCR_EN; // Disable DMA channel + AUDIO_DMA->HIFCR = DMA_HIFCR_CTCIF5 | DMA_HIFCR_CHTIF5 | DMA_HIFCR_CTEIF5 | DMA_HIFCR_CDMEIF5 | DMA_HIFCR_CFEIF5; // Write ones to clear bits AUDIO_DMA_Stream->M0AR = CONVERT_PTR_UINT(nextBuffer->data); AUDIO_DMA_Stream->NDTR = nextBuffer->size; - AUDIO_DMA_Stream->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE ; // Enable DMA channel and interrupt - DAC->SR = DAC_SR_DMAUDR1 ; // Write 1 to clear flag - DAC->CR |= DAC_CR_EN1 | DAC_CR_DMAEN1 ; // Enable DAC + AUDIO_DMA_Stream->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA channel and interrupt + DAC->SR = DAC_SR_DMAUDR1; // Write 1 to clear flag + DAC->CR |= DAC_CR_EN1 | DAC_CR_DMAEN1; // Enable DAC } #if defined(AUDIO_MUTE_GPIO_PIN) else { - // mute - GPIO_SetBits(AUDIO_MUTE_GPIO, AUDIO_MUTE_GPIO_PIN); + audioMute(); } #endif } diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index e7afa6ddb..38f017bcb 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -547,7 +547,8 @@ #endif #if defined(RADIO_T16) - #define AUDIO_UNMUTE_DELAY 150 + #define AUDIO_UNMUTE_DELAY 120 // ms + #define AUDIO_MUTE_DELAY 500 // ms #endif // I2C Bus From b475a7064d1c5fcb67518cfbb4d0a0f72a2c95a2 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 16 Dec 2019 07:48:19 +0100 Subject: [PATCH 013/560] I don't see why <= instead of < here. Untested (#7196) --- radio/src/gui/212x64/radio_diagkeys.cpp | 2 +- radio/src/gui/480x272/radio_diagkeys.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/212x64/radio_diagkeys.cpp b/radio/src/gui/212x64/radio_diagkeys.cpp index 7a9f42499..56b8d102c 100644 --- a/radio/src/gui/212x64/radio_diagkeys.cpp +++ b/radio/src/gui/212x64/radio_diagkeys.cpp @@ -45,7 +45,7 @@ void menuRadioDiagKeys(event_t event) displayKeyState(5 * FW + 2, y, i); } - for (uint8_t i = 0, cnt = 0; i <= NUM_SWITCHES; i++) { + for (uint8_t i = 0, cnt = 0; i < NUM_SWITCHES; i++) { if (SWITCH_EXISTS(i)) { div_t qr = div(cnt++, 6); coord_t x = 4 * FH * qr.quot; diff --git a/radio/src/gui/480x272/radio_diagkeys.cpp b/radio/src/gui/480x272/radio_diagkeys.cpp index c952775a9..9e26ebe86 100644 --- a/radio/src/gui/480x272/radio_diagkeys.cpp +++ b/radio/src/gui/480x272/radio_diagkeys.cpp @@ -61,7 +61,7 @@ bool menuRadioDiagKeys(event_t event) displayKeyState(70, y, i); } - for (uint8_t i = 0; i <= NUM_SWITCHES; i++) { + for (uint8_t i = 0; i < NUM_SWITCHES; i++) { if (SWITCH_EXISTS(i)) { coord_t y = MENU_HEADER_HEIGHT + 1 + FH * i; getvalue_t val = getValue(MIXSRC_FIRST_SWITCH + i); From 16c9a92f497819d1d5b8307a5bb6a29cba428fb9 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 16 Dec 2019 12:22:48 +0100 Subject: [PATCH 014/560] Bluetooth SD logs (#7197) Bluetooth SD logs --- radio/src/bluetooth.cpp | 32 ++++++++++++--------- radio/src/bluetooth.h | 13 +++++++-- radio/src/debug.h | 9 ++++-- radio/src/dump.cpp | 4 +-- radio/src/gui/480x272/themes/default.cpp | 9 +++--- radio/src/opentx.h | 2 +- radio/src/targets/common/arm/CMakeLists.txt | 5 ++++ radio/src/targets/horus/diskio.cpp | 18 ++++++++++++ radio/src/targets/simu/simudisk.cpp | 10 +++++++ radio/src/targets/taranis/diskio.cpp | 15 ++++++++++ radio/src/telemetry/flysky_ibus.cpp | 2 +- radio/src/telemetry/hitec.cpp | 2 +- radio/src/telemetry/multi.cpp | 2 +- radio/src/telemetry/spektrum.cpp | 2 +- 14 files changed, 94 insertions(+), 31 deletions(-) diff --git a/radio/src/bluetooth.cpp b/radio/src/bluetooth.cpp index 18c2a43ea..a977d8990 100644 --- a/radio/src/bluetooth.cpp +++ b/radio/src/bluetooth.cpp @@ -21,6 +21,10 @@ #include "opentx.h" #include "io/frsky_firmware_update.h" +#if defined(LOG_BLUETOOTH) +extern FIL g_bluetoothFile; +#endif + #if defined(PCBX9E) #define BLUETOOTH_COMMAND_NAME "TTM:REN-" #define BLUETOOTH_ANSWER_NAME "TTM:REN" @@ -44,9 +48,9 @@ Bluetooth bluetooth; void Bluetooth::write(const uint8_t * data, uint8_t length) { - TRACE_NOCRLF("BT>"); + BLUETOOTH_TRACE("BT>"); for (int i=0; i %s", str); + BLUETOOTH_TRACE("BT> %s" CRLF, str); while (*str != 0) { btTxFifo.push(*str++); } @@ -77,19 +81,19 @@ char * Bluetooth::readline(bool error_reset) if (!btRxFifo.pop(byte)) { #if defined(PCBX9E) // X9E BT module can get unresponsive - TRACE("NO RESPONSE FROM BT MODULE"); + BLUETOOTH_TRACE("NO RESPONSE FROM BT MODULE" CRLF); #endif return nullptr; } - TRACE_NOCRLF("%02X ", byte); + BLUETOOTH_TRACE("%02X ", byte); #if 0 if (error_reset && byte == 'R' && bufferIndex == 4 && memcmp(buffer, "ERRO", 4)) { #if defined(PCBX9E) // X9E enter BT reset loop if following code is implemented - TRACE("BT Error..."); + BLUETOOTH_TRACE("BT Error..." CRLF); #else - TRACE("BT Reset..."); + BLUETOOTH_TRACE("BT Reset..." CRLF); bufferIndex = 0; bluetoothDisable(); state = BLUETOOTH_STATE_OFF; @@ -104,12 +108,12 @@ char * Bluetooth::readline(bool error_reset) if (bufferIndex > 2 && buffer[bufferIndex-1] == '\r') { buffer[bufferIndex-1] = '\0'; bufferIndex = 0; - TRACE("BT< %s", buffer); + BLUETOOTH_TRACE("BT< %s" CRLF, buffer); if (error_reset && !strcmp((char *)buffer, "ERROR")) { #if defined(PCBX9E) // X9E enter BT reset loop if following code is implemented - TRACE("BT Error..."); + BLUETOOTH_TRACE("BT Error..." CRLF); #else - TRACE("BT Reset..."); + BLUETOOTH_TRACE("BT Reset..." CRLF); bluetoothDisable(); state = BLUETOOTH_STATE_OFF; wakeupTime = get_tmr10ms() + 100; /* 1s */ @@ -137,7 +141,7 @@ char * Bluetooth::readline(bool error_reset) void Bluetooth::processTrainerFrame(const uint8_t * buffer) { - TRACE(""); + BLUETOOTH_TRACE(CRLF); for (uint8_t channel=0, i=1; channel<8; channel+=2, i+=3) { // +-500 != 512, but close enough. @@ -155,7 +159,7 @@ void Bluetooth::appendTrainerByte(uint8_t data) // we check for "DisConnected", but the first byte could be altered (if received in state STATE_DATA_XOR) if (data == '\n') { if (!strncmp((char *)&buffer[bufferIndex-13], "isConnected", 11)) { - TRACE("BT< DisConnected"); + BLUETOOTH_TRACE("BT< DisConnected" CRLF); state = BLUETOOTH_STATE_DISCONNECTED; bufferIndex = 0; wakeupTime += 200; // 1s @@ -285,7 +289,7 @@ void Bluetooth::receiveTrainer() return; } - TRACE_NOCRLF("%02X ", byte); + BLUETOOTH_TRACE("%02X ", byte); processTrainerByte(byte); } diff --git a/radio/src/bluetooth.h b/radio/src/bluetooth.h index 2f4f2e1c6..de7ed7611 100644 --- a/radio/src/bluetooth.h +++ b/radio/src/bluetooth.h @@ -46,8 +46,17 @@ enum BluetoothStates { #define LEN_BLUETOOTH_ADDR 16 #define MAX_BLUETOOTH_DISTANT_ADDR 6 -#define BLUETOOTH_PACKET_SIZE 14 -#define BLUETOOTH_LINE_LENGTH 32 +#define BLUETOOTH_PACKET_SIZE 14 +#define BLUETOOTH_LINE_LENGTH 32 + +#if defined(LOG_BLUETOOTH) + #define BLUETOOTH_TRACE(str, ...) \ + f_printf(&g_bluetoothFile, str, ##__VA_ARGS__); \ + TRACE_NOCRLF(str, ##__VA_ARGS__); +#else + #define BLUETOOTH_TRACE(str, ...) \ + TRACE_NOCRLF(str, ##__VA_ARGS__); +#endif class Bluetooth { diff --git a/radio/src/debug.h b/radio/src/debug.h index 3a5303ef3..2ed2f209b 100644 --- a/radio/src/debug.h +++ b/radio/src/debug.h @@ -24,6 +24,9 @@ #include #include "rtc.h" #include "dump.h" + +#define CRLF "\r\n" + #if defined(CLI) #include "cli.h" #else @@ -56,7 +59,7 @@ uint8_t auxSerialTracesEnabled(); #endif #define TRACE_NOCRLF(...) debugPrintf(__VA_ARGS__) -#define TRACE(f_, ...) debugPrintf((f_ "\r\n"), ##__VA_ARGS__) +#define TRACE(f_, ...) debugPrintf((f_ CRLF), ##__VA_ARGS__) #define DUMP(data, size) dump(data, size) #define TRACE_DEBUG(...) debugPrintf("-D- " __VA_ARGS__) #define TRACE_DEBUG_WP(...) debugPrintf(__VA_ARGS__) @@ -67,7 +70,7 @@ uint8_t auxSerialTracesEnabled(); #define TRACE_ERROR(...) debugPrintf("-E- " __VA_ARGS__) #if defined(TRACE_LUA_INTERNALS_ENABLED) - #define TRACE_LUA_INTERNALS(f_, ...) debugPrintf(("[LUA INT] " f_ "\r\n"), ##__VA_ARGS__) + #define TRACE_LUA_INTERNALS(f_, ...) debugPrintf(("[LUA INT] " f_ CRLF), ##__VA_ARGS__) #define TRACE_LUA_INTERNALS_WITH_LINEINFO(L, f_, ...) do { \ lua_Debug ar; \ @@ -75,7 +78,7 @@ uint8_t auxSerialTracesEnabled(); lua_getinfo(L, ">Sl", &ar); \ debugPrintf("%s:%d: ", ar.short_src, ar.currentline); \ } \ - debugPrintf(("[LUA INT] " f_ "\r\n"), ##__VA_ARGS__); \ + debugPrintf(("[LUA INT] " f_ CRLF), ##__VA_ARGS__); \ } while(0) #else #define TRACE_LUA_INTERNALS(...) diff --git a/radio/src/dump.cpp b/radio/src/dump.cpp index 60152a3af..12a6b3459 100644 --- a/radio/src/dump.cpp +++ b/radio/src/dump.cpp @@ -40,14 +40,14 @@ void dumpBody(const void *data, unsigned int size) dumpPrintf("%.2X ", ((uint8_t *)data)[i]); dumpPosition++; if ((dumpPosition & (32-1)) == 0) { - dumpPrintf("\r\n"); + dumpPrintf(CRLF); } } } void dumpEnd() { - dumpPrintf("\r\n"); + dumpPrintf(CRLF); } #if defined(DEBUG) || defined(CLI) diff --git a/radio/src/gui/480x272/themes/default.cpp b/radio/src/gui/480x272/themes/default.cpp index d846fb383..2ce0999af 100644 --- a/radio/src/gui/480x272/themes/default.cpp +++ b/radio/src/gui/480x272/themes/default.cpp @@ -90,11 +90,10 @@ class DefaultTheme: public Theme void loadIcons() const { -#if defined(LOG_TELEMETRY) || !defined(WATCHDOG) - loadMenuIcon(ICON_OPENTX, "mask_opentx_testmode.png", TEXT_COLOR); -#else - loadMenuIcon(ICON_OPENTX, "mask_opentx.png"); -#endif + if (isAsteriskDisplayed()) + loadMenuIcon(ICON_OPENTX, "mask_opentx_testmode.png", TEXT_COLOR); + else + loadMenuIcon(ICON_OPENTX, "mask_opentx.png"); loadMenuIcon(ICON_RADIO, "mask_menu_radio.png"); loadMenuIcon(ICON_RADIO_SETUP, "mask_radio_setup.png"); loadMenuIcon(ICON_RADIO_SD_MANAGER, "mask_radio_sd_browser.png"); diff --git a/radio/src/opentx.h b/radio/src/opentx.h index cda5378d8..addf87c1a 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1398,7 +1398,7 @@ extern uint8_t latencyToggleSwitch; inline bool isAsteriskDisplayed() { -#if defined(ASTERISK) || !defined(WATCHDOG) || defined(LOG_TELEMETRY) || defined(DEBUG_LATENCY) +#if defined(ASTERISK) || !defined(WATCHDOG) || defined(LOG_TELEMETRY) || defined(LOG_BLUETOOTH) || defined(DEBUG_LATENCY) return true; #endif diff --git a/radio/src/targets/common/arm/CMakeLists.txt b/radio/src/targets/common/arm/CMakeLists.txt index 2fd540afd..97ca896c6 100644 --- a/radio/src/targets/common/arm/CMakeLists.txt +++ b/radio/src/targets/common/arm/CMakeLists.txt @@ -3,6 +3,7 @@ set_property(CACHE TIMERS PROPERTY STRINGS 2 3) option(CLI "Command Line Interface" OFF) option(DEBUG "Debug mode" OFF) option(LOG_TELEMETRY "Telemetry Logs on SD card" OFF) +option(LOG_BLUETOOTH "Bluetooth Logs on SD card" OFF) option(TRACE_SD_CARD "Traces SD enabled" OFF) option(TRACE_FATFS "Traces FatFS enabled" OFF) option(TRACE_AUDIO "Traces audio enabled" OFF) @@ -30,6 +31,10 @@ if(LOG_TELEMETRY) add_definitions(-DLOG_TELEMETRY) endif() +if(LOG_BLUETOOTH) + add_definitions(-DLOG_BLUETOOTH) +endif() + if(TRACE_SD_CARD) add_definitions(-DTRACE_SD_CARD) set(DEBUG ON) diff --git a/radio/src/targets/horus/diskio.cpp b/radio/src/targets/horus/diskio.cpp index b9bcda011..3b3517af5 100644 --- a/radio/src/targets/horus/diskio.cpp +++ b/radio/src/targets/horus/diskio.cpp @@ -310,10 +310,15 @@ DRESULT disk_ioctl ( // TODO everything here should not be in the driver layer ... FATFS g_FATFS_Obj __DMA; // initialized in boardInit() + #if defined(LOG_TELEMETRY) FIL g_telemetryFile = {}; #endif +#if defined(LOG_BLUETOOTH) +FIL g_bluetoothFile = {}; +#endif + #if defined(BOOT) void sdInit(void) { @@ -350,6 +355,13 @@ void sdMount() f_lseek(&g_telemetryFile, f_size(&g_telemetryFile)); // append } #endif + +#if defined(LOG_BLUETOOTH) + f_open(&g_bluetoothFile, LOGS_PATH "/bluetooth.log", FA_OPEN_ALWAYS | FA_WRITE); + if (f_size(&g_bluetoothFile) > 0) { + f_lseek(&g_bluetoothFile, f_size(&g_bluetoothFile)); // append + } +#endif } else { TRACE("f_mount() failed"); @@ -362,9 +374,15 @@ void sdDone() if (sdMounted()) { audioQueue.stopSD(); + #if defined(LOG_TELEMETRY) f_close(&g_telemetryFile); #endif + +#if defined(LOG_BLUETOOTH) + f_close(&g_bluetoothFile); +#endif + f_mount(nullptr, "", 0); // unmount SD } } diff --git a/radio/src/targets/simu/simudisk.cpp b/radio/src/targets/simu/simudisk.cpp index 5e8dfcd82..220b23226 100644 --- a/radio/src/targets/simu/simudisk.cpp +++ b/radio/src/targets/simu/simudisk.cpp @@ -214,6 +214,13 @@ void sdInit(void) f_lseek(&g_telemetryFile, f_size(&g_telemetryFile)); // append } #endif + +#if defined(LOG_BLUETOOTH) + f_open(&g_bluetoothFile, LOGS_PATH "/bluetooth.log", FA_OPEN_ALWAYS | FA_WRITE); + if (f_size(&g_bluetoothFile) > 0) { + f_lseek(&g_bluetoothFile, f_size(&g_bluetoothFile)); // append + } +#endif } else { TRACE_SIMPGMSPACE("f_mount() failed"); @@ -226,6 +233,9 @@ void sdDone() audioQueue.stopSD(); #if defined(LOG_TELEMETRY) f_close(&g_telemetryFile); +#endif +#if defined(LOG_BLUETOOTH) + f_close(&g_bluetoothFile); #endif f_mount(NULL, "", 0); // unmount SD } diff --git a/radio/src/targets/taranis/diskio.cpp b/radio/src/targets/taranis/diskio.cpp index 94f190aa0..f7828f21d 100644 --- a/radio/src/targets/taranis/diskio.cpp +++ b/radio/src/targets/taranis/diskio.cpp @@ -978,10 +978,15 @@ void sdPoll10ms() // TODO everything here should not be in the driver layer ... FATFS g_FATFS_Obj; + #if defined(LOG_TELEMETRY) FIL g_telemetryFile = {}; #endif +#if defined(LOG_BLUETOOTH) +FIL g_bluetoothFile = {}; +#endif + #if defined(BOOT) void sdInit(void) { @@ -1016,6 +1021,13 @@ void sdMount() f_lseek(&g_telemetryFile, f_size(&g_telemetryFile)); // append } #endif + +#if defined(LOG_BLUETOOTH) + f_open(&g_bluetoothFile, LOGS_PATH "/bluetooth.log", FA_OPEN_ALWAYS | FA_WRITE); + if (f_size(&g_bluetoothFile) > 0) { + f_lseek(&g_bluetoothFile, f_size(&g_bluetoothFile)); // append + } +#endif } } @@ -1025,6 +1037,9 @@ void sdDone() audioQueue.stopSD(); #if defined(LOG_TELEMETRY) f_close(&g_telemetryFile); +#endif +#if defined(LOG_BLUETOOTH) + f_close(&g_bluetoothFile); #endif f_mount(nullptr, "", 0); // unmount SD } diff --git a/radio/src/telemetry/flysky_ibus.cpp b/radio/src/telemetry/flysky_ibus.cpp index 0869fb0da..af4d4b82c 100644 --- a/radio/src/telemetry/flysky_ibus.cpp +++ b/radio/src/telemetry/flysky_ibus.cpp @@ -282,7 +282,7 @@ void processFlySkyTelemetryData(uint8_t data, uint8_t * rxBuffer, uint8_t &rxBuf debugPrintf("[%02X %02X %02X%02X] ", rxBuffer[i*4+2], rxBuffer[i*4 + 3], rxBuffer[i*4 + 4], rxBuffer[i*4 + 5]); } - debugPrintf("\r\n"); + debugPrintf(CRLF); #endif if (data == 0xAA) processFlySkyPacket(rxBuffer + 1); else if (data == 0xAC) processFlySkyPacketAC(rxBuffer + 1); diff --git a/radio/src/telemetry/hitec.cpp b/radio/src/telemetry/hitec.cpp index 3d4770b81..febf32900 100644 --- a/radio/src/telemetry/hitec.cpp +++ b/radio/src/telemetry/hitec.cpp @@ -401,7 +401,7 @@ void processHitecTelemetryData(uint8_t data, uint8_t * rxBuffer, uint8_t &rxBuff for (int i=0; i<5; i++) { debugPrintf("%02X ", rxBuffer[4+i]); } - debugPrintf("\r\n"); + debugPrintf(CRLF); #endif processHitecPacket(rxBuffer + 1); rxBufferCount = 0; diff --git a/radio/src/telemetry/multi.cpp b/radio/src/telemetry/multi.cpp index 77ca485fe..9fba4105a 100644 --- a/radio/src/telemetry/multi.cpp +++ b/radio/src/telemetry/multi.cpp @@ -621,7 +621,7 @@ static void processMultiTelemetryByte(const uint8_t data, uint8_t module) debugPrintf("[%02X%02X %02X%02X] ", rxBuffer[i*4+2], rxBuffer[i*4 + 3], rxBuffer[i*4 + 4], rxBuffer[i*4 + 5]); } - debugPrintf("\r\n"); + debugPrintf(CRLF); #endif // Packet is complete, process it processMultiTelemetryPaket(rxBuffer, module); diff --git a/radio/src/telemetry/spektrum.cpp b/radio/src/telemetry/spektrum.cpp index 29229cf2b..a71d5118b 100644 --- a/radio/src/telemetry/spektrum.cpp +++ b/radio/src/telemetry/spektrum.cpp @@ -434,7 +434,7 @@ void processSpektrumTelemetryData(uint8_t module, uint8_t data, uint8_t* rxBuffe debugPrintf("%02X%02X %02X%02X ", rxBuffer[i], rxBuffer[i + 1], rxBuffer[i + 2], rxBuffer[i + 3]); } - debugPrintf("\r\n"); + debugPrintf(CRLF); #endif processSpektrumPacket(rxBuffer); rxBufferCount = 0; From de8ed12570fb035c315a2f4e8c84e5384e2f2008 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Garc=C3=ADa=20Hierro?= Date: Tue, 17 Dec 2019 07:20:41 +0000 Subject: [PATCH 015/560] [build] Fix building with semihosting enabled (#7206) Remove -DSEMIHOSTING from the bootloader CFLAGS unconditionally. -DSEMIHOSTING is passed to the bootloader by the parent project when SEMIHOSTING=ON, however the bootloader wouldn't fit on flash with semihosting enabled. If we leave the -DSEMIHOSTING flag, we would get a compilation error on non-horus radios (since -DDEBUG is removed) and a link time error on horus (since the bootloader won't fit in its allocated flash region). --- radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt index 8e4e8160a..5bc11cc2d 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt +++ b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt @@ -134,6 +134,7 @@ endif() remove_definitions(-DDISK_CACHE) remove_definitions(-DLUA) remove_definitions(-DCLI) +remove_definitions(-DSEMIHOSTING) remove_definitions(-DUSB_SERIAL) remove_definitions(-DWATCHDOG) From 12ab16718dab39d7457468ff659688295f46760e Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 17 Dec 2019 10:23:41 +0100 Subject: [PATCH 016/560] Cosmetics --- radio/src/targets/horus/board.h | 6 +++--- radio/src/targets/horus/pwr_driver.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 7e36df57a..c6cb49e87 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -27,9 +27,9 @@ #include "hal.h" PACK(typedef struct { - uint8_t pcbrev : 2; - uint8_t sticksPwmDisabled : 1; - uint8_t pxx2Enabled : 1; + uint8_t pcbrev:2; + uint8_t sticksPwmDisabled:1; + uint8_t pxx2Enabled:1; }) HardwareOptions; extern HardwareOptions hardwareOptions; diff --git a/radio/src/targets/horus/pwr_driver.cpp b/radio/src/targets/horus/pwr_driver.cpp index aa9e13497..2b08f2b2b 100644 --- a/radio/src/targets/horus/pwr_driver.cpp +++ b/radio/src/targets/horus/pwr_driver.cpp @@ -52,8 +52,8 @@ void pwrInit() GPIO_InitStructure.GPIO_Pin = PWR_SWITCH_GPIO_PIN; GPIO_Init(PWR_SWITCH_GPIO, &GPIO_InitStructure); - // PCBREV #if defined(PCBREV_GPIO_PIN) + // PCBREV GPIO_InitStructure.GPIO_Pin = PCBREV_GPIO_PIN; GPIO_Init(PCBREV_GPIO, &GPIO_InitStructure); hardwareOptions.pcbrev = PCBREV_VALUE(); From bf1198cf8c1fb7880dc63990b5600fc4b71e9f10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Garc=C3=ADa=20Hierro?= Date: Tue, 17 Dec 2019 10:57:40 +0000 Subject: [PATCH 017/560] Use target compiler for generating lua exported definitions (#7186) Include the lua subdirectory only after CMAKE_C_COMPILER has been set to the cross compiler. Otherwise, cmake will use the build machine compiler to preprocess dataconstants.h, which breaks on some systems and can cause problems due to different machine dependent types. --- radio/src/CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 311c6dbd1..39da94311 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -146,7 +146,6 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}) include_directories(${CMAKE_CURRENT_BINARY_DIR}) include_directories(${CMAKE_CURRENT_BINARY_DIR}/bitmaps/${GUI_DIR}) -add_subdirectory(lua) include(gui/CMakeLists.txt) if(RTC_BACKUP_RAM) @@ -551,3 +550,7 @@ if(NOT MSVC) PrintTargetReport("firmware") endif(NOT MSVC) +# Include the lua subdirectory after CMAKE_C_COMPILER has been +# set. Otherwise, the custom commands it includes will use the +# default CMAKE_C_COMPILER instead of the one we set manually +add_subdirectory(lua) From c7b9a149a7261457d8353a2650c973690d941d0d Mon Sep 17 00:00:00 2001 From: Alexander Novikov <31191831+mr-pokryshkin@users.noreply.github.com> Date: Tue, 17 Dec 2019 18:15:33 +0300 Subject: [PATCH 018/560] Updated: Companion Russian UI (#7211) --- companion/src/translations/companion_ru.ts | 579 +++++++++++---------- 1 file changed, 303 insertions(+), 276 deletions(-) diff --git a/companion/src/translations/companion_ru.ts b/companion/src/translations/companion_ru.ts index 20cdbc733..540e00c7d 100644 --- a/companion/src/translations/companion_ru.ts +++ b/companion/src/translations/companion_ru.ts @@ -100,7 +100,7 @@ Radio Profile - Профиль аппаратуры + Профиль передатчика @@ -158,27 +158,45 @@ Mode 4: Right stick: Elevator, Rudder - + Выбор моды передатчика: + +Mode 1: + Левый стик: Руль высоты (Elevator), Руль направления (Rudder) + Правый стик: Газ (Throttle), Элероны (Aileron) + +Mode 2: + Левый стик: Газ (Throttle), Руль направления (Rudder) + Правый стик: Руль высоты (Elevator), Элероны (Aileron) + +Mode 3: + Левый стик: Руль высоты (Elevator), Элероны (Aileron) + Правый стик: Газ (Throttle), Руль направления (Rudder) + +Mode 4: + Левый стик: Газ (Throttle), Элероны (Aileron) + Правый стик: Руль высоты (Elevator), Руль направления (Rudder) + + Mode 1 (RUD ELE THR AIL) - + Mode 2 (RUD THR ELE AIL) - + Mode 3 (AIL ELE THR RUD) - + Mode 4 (AIL THR ELE RUD) - + @@ -214,122 +232,122 @@ Mode 4: R E T A - + R E A T - + R T E A - + R T A E - + R A E T - + R A T E - + E R T A - + E R A T - + E T R A - + E T A R - + E A R T - + E A T R - + T R E A - + T R A E - + T E R A - + T E A R - + T A R E - + T A E R - + A R E T - + A R T E - + A E R T - + A E T R - + A T R E - + A T E R - + @@ -359,7 +377,7 @@ Mode 4: Radio Type - Тип передатчика + Тип передатчика @@ -920,22 +938,22 @@ Mode 4: Edit Checklist - + Редактирование контрольной карты Line nn, Col nn - + Строка nn, столбец nn &Import... - + Импорт... &Cancel - + Отмена @@ -945,22 +963,22 @@ Mode 4: Please note, the maximum width displayable is radio model limited. Also, renaming the model will break the link to this checklist file. - + Учтите, что ширина отображаемого текста ограничена. Переименование модели удалит ссылку на эту контрольную карту. File: unknown - + Файл: неизвестен Open Checklist - + Открыть контрольную карту Checklist Files (*.txt) - + Контрольные карты (*.txt) @@ -1005,7 +1023,7 @@ Mode 4: Line %1, Col %2 - + Строка %1, столбец %2 @@ -2568,47 +2586,47 @@ If blank then the input is considered to be "ON" all the time. %1%2 Both directions, to destination folder first - + %1%2 Оба направления, вначале в папку передатчика %1%2 Both directions, to source folder first - + %1%2 Оба направления, вначале в локальную папку %1 Only from source folder to destination folder - + %1 Только из локальной папки в папку передатчика %1 Only from destination folder to source folder - + %1 Только из папки передатчика в локальную папку How to handle overwriting files which already exist in the destination folder. - + Определяет, как обрабатывать файлы, которые уже существуют. Copy only if newer and different (compare contents) - + Копировать только если новее и отличается содержимое Copy only if newer (do not compare contents) - + Копировать только если новее (не сравнивать содержимое) Copy only if different (ignore file time stamps) - + Копировать только если разные (игнорировать дату файла) Always copy (force overwite existing files) - + Всегда копировать (перезаписывать существующие файлы) @@ -2618,159 +2636,164 @@ If blank then the input is considered to be "ON" all the time. Skip files larger than this size. Enter zero for unlimited. - + Пропускать, если файл больше указанного размера. Поставьте 0, если ограничение не нужно. Minimum reporting level. Events of this type and of higher importance are shown. WARNING: High log rates may make the user interface temporarily unresponsive. - + Уровень журналирования синхронизации. Будут показываться событие выбранного и более высоких уровней. +ПРЕДУПРЕЖДЕНИЕ: высокий уровень журналирования может временно заблокировать интерфейс. Skipped - + Пропущенные Created - + Новые Updated - + Обновленные Errors Only - + Только ошибки Test-run only - + Только тестирование Run as normal but do not actually copy anything. Useful for verifying results before real sync. - + Запускает обычную синхронизацию, только ничего не копирует. Полезно для проверки результатов перед реальной синхронизацией. Log Level: - + Журнал: Filters: - + Фильтры: The "Include" filter will only copy files which match the pattern(s). The "Exclude" filter will skip files matching the filter pattern(s). The Include filter is evaluated first. - + Фильтр "Включить" позволяет копировать файлы соответствующие шаблону(ам). +Фильтр "Исключить" позволяет пропускать файлы соответствующие шаблону(ам). +Вначале учитывается фильтр "Включить". One or more file pattern(s) to exclude, separated by commas. Blank means exclude none. ?, *, and [...] wildcards accepted. - + Один или несколько шаблонов, разделенных запятыми +Пустое поле означает обработку всех файлов, допускаются маски ?, * и [...]. One or more file pattern(s) to include, separated by commas. Blank means include all. ?, *, and [...] wildcards accepted. - + Один или несколько шаблонов, разделенных запятыми +Пустое поле означает обработку всех файлов, допускаются маски ?, * и [...]. Include: - + Включить: Exclude: - + Исключить: Case sensitive - + Чувствительный к регистру Follow links - + Учитывать ссылки Include hidden - + Учитывать скрытые Recursive - + Рекурсивно Skip empty - + Пропускать пустые Apply filters - + Применять фильтры Filter Options: - + Настройки фильтров: Folder Options: - + Параметры папок: Options - + Параметры Show extra options - + Показать дополнительные настройки Reset to defaults - + Использовать настройки по умолчанию Close - Закрыть + Закрыть Sync. Direction: - + Направление синхронизации: Existing Files: - + Существующие файлы: Max. File Size: - + Макс. размер файла: @@ -2785,37 +2808,37 @@ Blank means include all. ?, *, and [...] wildcards accepted. Abort - + Остановить Start - + Начать Total: <b>%1</b>; Created: <b>%2</b>; Updated: <b>%3</b>; Skipped: <b>%4</b>; Errors: <font color=%6><b>%5</b></font>; - + Итого: <b>%1</b>; Создано: <b>%2</b>; Обновлено: <b>%3</b>; Пропущено: <b>%4</b>; Ошибки: <font color=%6><b>%5</b></font>; Current: <b>%1</b> of - + Обработано: <b>%1</b> Всего. Source folder not found. - + Локальная папка (источник) не найдена. Destination folder not found. - + Папка назначения (в передатчике) не найдена. Source and destination folders are the same. - + Выберите разные папки. @@ -5320,7 +5343,7 @@ Are you sure ? Invert - Инверт + @@ -5330,22 +5353,22 @@ Are you sure ? 120 - 15 сек. {120?} + 120X - 15 сек. {120X?} + 140 - 15 сек. {140?} + 90 - 15 сек. {90?} + @@ -6300,12 +6323,12 @@ Do you wish to continue? Local Folder - + Локальная папка Radio Folder - + Папка в передатчике @@ -7767,7 +7790,7 @@ This determines how mixer values are added. Enable - + Вкл. @@ -7787,17 +7810,17 @@ This determines how mixer values are added. Yes - + Да No - Нет + Нет Y - + Да @@ -7815,7 +7838,7 @@ This determines how mixer values are added. OFF - ВЫКЛ + ВЫКЛ @@ -7825,44 +7848,44 @@ This determines how mixer values are added. Exponential - + по экспоненте Extra Fine - + очень точно Fine - + точно Medium - + средне Coarse - Грубо + грубо Unknown - + неизвестно Mode - + Режим Channels - + Каналы @@ -7879,35 +7902,35 @@ This determines how mixer values are added. Polarity - + Полярность Protocol - Протокол + Протокол Delay - + Задержка Receiver - + Приёмник Radio protocol - + Протокол Subtype - + Подтип @@ -7917,12 +7940,12 @@ This determines how mixer values are added. Sub Type - + Подтип RF Output Power - + Выходная мощность передатчика @@ -7958,7 +7981,7 @@ This determines how mixer values are added. Slow - + Замедление @@ -7968,12 +7991,12 @@ This determines how mixer values are added. Flight modes - + Полетные режимы Flight mode - + Полетный режим @@ -8013,73 +8036,73 @@ This determines how mixer values are added. Extended Limits - Расш. лимиты + Расш. лимиты Display Checklist - + Показать контрольную карту Global Functions - + Глобальные функции Manual - + вручную Auto - + автоматически Failsafe Mode - + Режим Failsafe Hold - + удержание No Pulse - + без сигнала Not set - + не задан No pulses - + Без сигнала Silent - + Тихо Beeps - + Писком Voice - + Голосом Haptic - + Вибрацией @@ -8094,54 +8117,54 @@ This determines how mixer values are added. Step - + Шаг Display - + Показывать Extended - + Расширенные Never - + никогда On Change - + при изменении Always - + всегда Source - Источник + Источник Trim idle only - + Триммировать только холостой ход Warning - Звук + Предупреждать Reversed - + Реверс @@ -8357,17 +8380,17 @@ This determines how mixer values are added. Unit - + Ед. измерения Prec - + Точность Ratio - + Коэффициент @@ -8377,7 +8400,7 @@ This determines how mixer values are added. A/Offset - + Авт. смещ. @@ -8392,12 +8415,12 @@ This determines how mixer values are added. Positive - + Положительный Log - + Журнал @@ -8422,32 +8445,32 @@ This determines how mixer values are added. Error: Unable to open or read file! - + Ошибка: невозможно открыть файл! Slave/Jack - + Ученик (джек) Master/SBUS Module - + Главный (SBUS модуль) Master/CPPM Module - + Главный (модуль CPPM) Master/SBUS in battery compartment - + Главный (SBUS в батарейном отсеке) Master/Jack - + Главный (джек) @@ -8467,7 +8490,7 @@ This determines how mixer values are added. None - + Нет @@ -8505,13 +8528,13 @@ This determines how mixer values are added. Weight - Вес + Вес Switch - Тумблер + Тумблер @@ -8532,19 +8555,19 @@ This determines how mixer values are added. Disabled in all flight modes - + Отключен во всех полетных режимах Custom - + Другой Standard - Стандартный + Стандартный @@ -8857,50 +8880,50 @@ This determines how mixer values are added. 10mW - 16CH - + 10 мВт - 16 каналов 100mW - 16CH - + 100 мВт - 16 каналов 500mW - 16CH - + 500 мВт - 16 каналов Auto <= 1W - 16CH - + Автоматически: < 1 Вт - 16 каналов 25mW - 8CH - + 25 мВт - 8 каналов 25mW - 16CH - + 25 мВт - 16 каналов 200mW - 16CH (no telemetry) - + 200 мВт - 16 каналов (без телеметрии) 500mW - 16CH (no telemetry) - + 500 мВт - 16 каналов (без телеметрии) 100mW - 16CH (no telemetry) - + 100 мВт - 16 каналов (без телеметрии) @@ -8966,19 +8989,19 @@ This determines how mixer values are added. Flight modes - + Полетные режимы Flight mode - + Режим Switch - Тумблер + Тумблер @@ -8994,120 +9017,120 @@ This determines how mixer values are added. Channel - + Канал Name - + Название General - + Основные параметры EEprom Size - + Размер Model Image - + Изображение Throttle - Газ + Газ Trims - + Триммеры Center Beep - + Сигнал в центре Switch Warnings - + Проверка тумблеров Pot Warnings - + Проверка крутилок Other - + Прочее Timers - + Таймеры Time - + Время Countdown - + Отсчет Min.call - + Ежеминутный сигнал Persist - + Постоянный Modules - + Радиомодули Trainer port - + Тренерский разъем Helicopter - + Вертолет Swash - + Автомат перекоса Type - + Тип Ring - + Тарелка Input - + Вход @@ -9142,7 +9165,7 @@ This determines how mixer values are added. Global vars - + Глобальные переменные @@ -9157,12 +9180,12 @@ This determines how mixer values are added. Outputs - + Выходы Subtrim - + Субтриммер @@ -9172,7 +9195,7 @@ This determines how mixer values are added. Curve - Кривая + Кривая @@ -9182,12 +9205,12 @@ This determines how mixer values are added. Linear - + Линейный Telemetry - + Телеметрия @@ -9197,79 +9220,79 @@ This determines how mixer values are added. Protocol - Протокол + Протокол Low - + Низкий Critical - + Критический Telemetry audio - + Звук телеметрии Altimetry - + Измерение высоты Vario source - + Вариометр Vario limits > - + Пределы вариометра > Sink max - + Сниж. макс. Sink min - + Сниж. мин. Climb min - + Набор мин. Climb max - + Набор макс. Center silent - + Тишина в 0 Top Bar - + Верхняя строка Volts source - + Напряжение Altitude source - + Высота @@ -9299,7 +9322,7 @@ This determines how mixer values are added. Current source - + Датчик тока @@ -9309,12 +9332,12 @@ This determines how mixer values are added. Parameters - + Параметры Telemetry Sensors - + Датчики телеметрии @@ -9329,44 +9352,44 @@ This determines how mixer values are added. Global Functions - + Глобальные функции Checklist - + Контрольная карта Min - Мин + Мин Max - Макс + Макс Global Variables - + Глобальные переменные Inputs - + Входы Mixers - + Микшеры Curves - Кривые + Кривые @@ -9376,7 +9399,7 @@ This determines how mixer values are added. Logical Switches - + Логические переключатели @@ -9386,7 +9409,7 @@ This determines how mixer values are added. Special Functions - + Специальные функции @@ -9397,7 +9420,7 @@ This determines how mixer values are added. Unit - + Ед. @@ -9407,7 +9430,7 @@ This determines how mixer values are added. RSSI Alarms - + Уровень RSSI @@ -9468,22 +9491,22 @@ This determines how mixer values are added. Throttle Channel: - + Газ: Yaw Channel: - + Рысканье (yaw): Pitch Channel: - + Тангаж (pitch): Roll Channel: - + Крен (roll): @@ -9631,7 +9654,7 @@ This determines how mixer values are added. Show Details - + Подробный отчет @@ -11466,7 +11489,7 @@ Profile ID: [%1]; Radio ID: [%2] OpenTX Simulator - Startup Options - + Настройки симулятора OpenTX @@ -11476,7 +11499,7 @@ Profile ID: [%1]; Radio ID: [%2] Radio Profile: - + Профиль передатчика: @@ -11487,7 +11510,7 @@ Create or edit profiles using the Companion application. Radio Type: - + Тип передатчика: @@ -11498,22 +11521,22 @@ The radio type specified in the selected profile is used by default. Data Source: - + Источник данных: Data File: - + Файл с данными: Data Folder: - + Папка с данными: SD Image Path: - + Папка с образом SD: @@ -11542,7 +11565,7 @@ New folder(s) with default radio/model will be created here if necessary. Select data folder... - + Выберите папку с данными... @@ -11568,22 +11591,22 @@ The default is configured in the chosen Radio Profile. Folder - + Папка SD Path - + Путь к SD All files (*.*) - + Все файлы (*.*) Select a data file - + Выбор файла с данными моделей @@ -11824,141 +11847,145 @@ Error: %2 [TEST RUN] - + [ТЕСТОВЫЙ ЗАПУСК] Gathering file information for %1... - + Собираем информацию о %1... No files found in %1 - + Файлы не найдены: %1 Synchronization failed, nothing found to copy. - + Ошибка синхронизации, файлы не найдены. Synchronization aborted at %1 of %2 files. - + Синхронизация остановлена. Обработано %1 из %2. Synchronization finished with %1 files in %2m %3s. - + Синхронизация завершена %1 файлов за %2 мин %3 с. Synchronizing: %1 To: %2 - + Синхронизация: %1 + в: %2 Starting synchronization: %1 -> %2 - + Начинаем синхронизацию: + %1 -> %2 + Too many errors, giving up. - + +Слишком много ошибок. Skipping large file: %1 (%2KB) - + Пропускаем большой файл: %1 (%2КБ) Skipping filtered file: %1 - + Пропускаем файл из-за фильтра: %1 Skipping linked file: %1 - + Пропускаем ссылку на %1 Aborted synchronization of: - + Синхронизация прервана: Finished synchronizing: - + Синхронизация завершена: Created: %1; Updated: %2; Skipped: %3; Errors: %4; - + Создано: %1; Обновлено: %2; Пропущено: %3; Ошибок: %4; Creating directory: %1 - + Создаем папку: %1 Could not create directory: %1 - + Невозможнос создать папку %1 Directory exists: %1 - + Папка уже существует: %1 At least one of the file modification dates is in the future, error on: %1 - + Как минимум у одного файла дата модификации в будущем, ошибка: %1 Skipping older file: %1 - + Пропускаем старый файл: %1 Could not open source file '%1': %2 - + Невозможно открыть файл '%1': %2 Could not open destination file '%1': %2 - + Невозможно открыть файл в папке передатчика: '%1': %2 Skipping identical file: %1 - + Пропускаем одинаковые файлы: %1 Replacing file: %1 - + Заменяем файл: %1 Could not delete destination file '%1': %2 - + Невозможнос удалить файл в папке передатчика e '%1': %2 Creating file: %1 - + Создаем файл: %1 Copy failed: '%1' to '%2': %3 - + Ошибка копирования: '%1' в '%2': %3 @@ -13617,7 +13644,7 @@ CTRL+колесо или PAGE UP/DOWN - для изменения с больш Select the control channels for your multirotor - + Выберите каналы управления коптером @@ -13709,7 +13736,7 @@ CTRL+колесо или PAGE UP/DOWN - для изменения с больш Select the control channels for your multirotor.<br><br>Throttle - Spektrum: CH1, Futaba: CH3<br>Yaw - Spektrum: CH4, Futaba: CH4<br>Pitch - Spektrum: CH3, Futaba: CH2<br>Roll - Spektrum: CH2, Futaba: CH1 - + Выберите каналы управления коптером.<br><br>Газ: Spektrum: Канал1, Futaba: Канал3<br>Рысканье: Spektrum: Канал4, Futaba: Канал4<br>Тангаж: Spektrum: Канал3, Futaba: Канал2<br>Крен: Spektrum: Канал2, Futaba: Канал1<br> From 8ffda8f96ffa84665483d9194ae97de8f3f838f1 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 17 Dec 2019 16:51:59 +0100 Subject: [PATCH 019/560] Too many params passed to a TRACE call --- radio/src/sdcard.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/sdcard.cpp b/radio/src/sdcard.cpp index 3a16fde9f..be89633f3 100644 --- a/radio/src/sdcard.cpp +++ b/radio/src/sdcard.cpp @@ -102,7 +102,7 @@ bool isFilePatternAvailable(const char * path, const char * file, const char * p fplen = strlen(path); if (fplen > LEN_FILE_PATH_MAX) { - TRACE_ERROR("isFilePatternAvailable(%s) = error: file path too long.\n", path, file); + TRACE_ERROR("isFilePatternAvailable(%s) = error: path too long.\n", path); return false; } From 42adcdef8737647a6bc8790514244fbced8beb00 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 18 Dec 2019 11:35:56 +0100 Subject: [PATCH 020/560] Fix compilation with MULTI=NO --- radio/src/gui/gui_common.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 806ceb751..7e8b3f1a8 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -252,6 +252,7 @@ inline uint8_t MULTIMODULE_HASOPTIONS(uint8_t moduleIdx) #define MULTIMODULE_MODE_ROWS(moduleIdx) (g_model.moduleData[moduleIdx].multi.customProto) ? (uint8_t) 3 : MULTIMODULE_HAS_SUBTYPE(moduleIdx) ? (uint8_t)2 : (uint8_t)1 #define MULTIMODULE_SUBTYPE_ROWS(moduleIdx) isModuleMultimodule(moduleIdx) ? MULTIMODULE_RFPROTO_COLUMNS(moduleIdx) : HIDDEN_ROW, #define MULTIMODULE_OPTIONS_ROW(moduleIdx) (isModuleMultimodule(moduleIdx) && MULTIMODULE_HASOPTIONS(moduleIdx)) ? (uint8_t) 0: HIDDEN_ROW +#define MODULE_POWER_ROW(moduleIdx) (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) || isModuleR9MNonAccess(moduleIdx)) ? (isModuleR9MLiteNonPro(moduleIdx) ? (isModuleR9M_FCC_VARIANT(moduleIdx) ? READONLY_ROW : (uint8_t)0) : (uint8_t)0) : HIDDEN_ROW #else #define MULTIMODULE_STATUS_ROWS(moduleIdx) @@ -263,7 +264,7 @@ inline uint8_t MULTIMODULE_HASOPTIONS(uint8_t moduleIdx) #define FAILSAFE_ROWS(moduleIdx) isModuleFailsafeAvailable(moduleIdx) ? (g_model.moduleData[moduleIdx].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : HIDDEN_ROW #define MODULE_OPTION_ROW(moduleIdx) (isModuleR9MNonAccess(moduleIdx) || isModuleSBUS(moduleIdx) ? TITLE_ROW : MULTIMODULE_OPTIONS_ROW(moduleIdx)) -#define MODULE_POWER_ROW(moduleIdx) (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) || isModuleR9MNonAccess(moduleIdx)) ? (isModuleR9MLiteNonPro(moduleIdx) ? (isModuleR9M_FCC_VARIANT(moduleIdx) ? READONLY_ROW : (uint8_t)0) : (uint8_t)0) : HIDDEN_ROW +#define MODULE_POWER_ROW(moduleIdx) isModuleR9MNonAccess(moduleIdx) ? (isModuleR9MLiteNonPro(moduleIdx) ? (isModuleR9M_FCC_VARIANT(moduleIdx) ? READONLY_ROW : (uint8_t)0) : (uint8_t)0) : HIDDEN_ROW void editStickHardwareSettings(coord_t x, coord_t y, int idx, event_t event, LcdFlags flags); From f65c72e0cdcb5bb049dbc178e32ed941d861dd22 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 18 Dec 2019 15:13:05 +0100 Subject: [PATCH 021/560] Fix x9lite-s having only 5 switches on simu (#7215) Fixes #7207 --- companion/src/firmwares/boards.cpp | 4 +++- companion/src/firmwares/opentx/opentxeeprom.cpp | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/companion/src/firmwares/boards.cpp b/companion/src/firmwares/boards.cpp index 9f42fa9c3..c1fbcb666 100644 --- a/companion/src/firmwares/boards.cpp +++ b/companion/src/firmwares/boards.cpp @@ -329,8 +329,10 @@ int Boards::getCapability(Board::Type board, Board::Capability capability) case Switches: if (IS_TARANIS_X9E(board)) return 18; - else if (IS_TARANIS_X9LITE(board)) + else if (board == Board::BOARD_TARANIS_X9LITE) return 5; + else if (board == Board::BOARD_TARANIS_X9LITES) + return 7; else if (IS_TARANIS_X7(board)) return 8; else if (IS_JUMPER_T12(board)) diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index 10df6d7a3..9632be9e4 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -45,6 +45,9 @@ inline int MAX_SWITCHES(Board::Type board, int version) if (IS_TARANIS_X9D(board)) return 9; + if (IS_TARANIS_X9LITE(board)) + return 7; + if (IS_JUMPER_T12(board)) return 8; From 0f0779b56abda2a9a1cb01f642b881bb5685bf31 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 18 Dec 2019 15:27:02 +0100 Subject: [PATCH 022/560] Fix winbox compile --- radio/src/gui/gui_common.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 7e8b3f1a8..6c52f2fb3 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -260,11 +260,11 @@ inline uint8_t MULTIMODULE_HASOPTIONS(uint8_t moduleIdx) #define MULTIMODULE_SUBTYPE_ROWS(moduleIdx) #define MULTIMODULE_MODE_ROWS(moduleIdx) (uint8_t)0 #define MULTIMODULE_OPTIONS_ROW(moduleIdx) HIDDEN_ROW +#define MODULE_POWER_ROW(moduleIdx) isModuleR9MNonAccess(moduleIdx) ? (isModuleR9MLiteNonPro(moduleIdx) ? (isModuleR9M_FCC_VARIANT(moduleIdx) ? READONLY_ROW : (uint8_t)0) : (uint8_t)0) : HIDDEN_ROW #endif #define FAILSAFE_ROWS(moduleIdx) isModuleFailsafeAvailable(moduleIdx) ? (g_model.moduleData[moduleIdx].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : HIDDEN_ROW #define MODULE_OPTION_ROW(moduleIdx) (isModuleR9MNonAccess(moduleIdx) || isModuleSBUS(moduleIdx) ? TITLE_ROW : MULTIMODULE_OPTIONS_ROW(moduleIdx)) -#define MODULE_POWER_ROW(moduleIdx) isModuleR9MNonAccess(moduleIdx) ? (isModuleR9MLiteNonPro(moduleIdx) ? (isModuleR9M_FCC_VARIANT(moduleIdx) ? READONLY_ROW : (uint8_t)0) : (uint8_t)0) : HIDDEN_ROW void editStickHardwareSettings(coord_t x, coord_t y, int idx, event_t event, LcdFlags flags); From c91bf2afe975486bb9dc5b6c364b1d5d729443a1 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 18 Dec 2019 15:27:43 +0100 Subject: [PATCH 023/560] MSVC compilation fix --- radio/src/bluetooth.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/radio/src/bluetooth.h b/radio/src/bluetooth.h index de7ed7611..51d5cf468 100644 --- a/radio/src/bluetooth.h +++ b/radio/src/bluetooth.h @@ -50,12 +50,12 @@ enum BluetoothStates { #define BLUETOOTH_LINE_LENGTH 32 #if defined(LOG_BLUETOOTH) - #define BLUETOOTH_TRACE(str, ...) \ - f_printf(&g_bluetoothFile, str, ##__VA_ARGS__); \ - TRACE_NOCRLF(str, ##__VA_ARGS__); + #define BLUETOOTH_TRACE(...) \ + f_printf(&g_bluetoothFile, __VA_ARGS__); \ + TRACE_NOCRLF(__VA_ARGS__); #else - #define BLUETOOTH_TRACE(str, ...) \ - TRACE_NOCRLF(str, ##__VA_ARGS__); + #define BLUETOOTH_TRACE(...) \ + TRACE_NOCRLF(__VA_ARGS__); #endif class Bluetooth From 989d4873179060dfa91198ae4f4d7a1b3682a208 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 19 Dec 2019 10:27:40 +0100 Subject: [PATCH 024/560] Align naming for X12S (#7217) --- companion/src/firmwares/boards.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/companion/src/firmwares/boards.cpp b/companion/src/firmwares/boards.cpp index c1fbcb666..acfc70004 100644 --- a/companion/src/firmwares/boards.cpp +++ b/companion/src/firmwares/boards.cpp @@ -457,8 +457,8 @@ QString Boards::getAnalogInputName(Board::Type board, int index) "S1", "6P", "S2", - "S3", - "S4", + "L1", + "L2", "LS", "RS", "JSx", From 833fbb763a73fa07d17444963c3822c58f4fe3dd Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 20 Dec 2019 12:44:36 +0100 Subject: [PATCH 025/560] Fix Mac build server --- tools/build-companion-release.sh | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tools/build-companion-release.sh b/tools/build-companion-release.sh index 81a20b6cd..2959df10d 100755 --- a/tools/build-companion-release.sh +++ b/tools/build-companion-release.sh @@ -40,48 +40,63 @@ cd build cmake ${COMMON_OPTIONS} -DPCB=AR9X ${SRCDIR} make -j${JOBS} libsimulator +rm CMakeCache.txt cmake ${COMMON_OPTIONS} -DPCB=SKY9X ${SRCDIR} make -j${JOBS} libsimulator +rm CMakeCache.txt cmake ${COMMON_OPTIONS} -DPCB=9XRPRO ${SRCDIR} make -j${JOBS} libsimulator +rm CMakeCache.txt cmake ${COMMON_OPTIONS} -DPCB=X9LITE ${SRCDIR} make -j${JOBS} libsimulator +rm CMakeCache.txt cmake ${COMMON_OPTIONS} -DPCB=X9LITES ${SRCDIR} make -j${JOBS} libsimulator +rm CMakeCache.txt cmake ${COMMON_OPTIONS} -DPCB=X7 ${SRCDIR} make -j${JOBS} libsimulator +rm CMakeCache.txt cmake ${COMMON_OPTIONS} -DPCB=X9D ${SRCDIR} make -j${JOBS} libsimulator +rm CMakeCache.txt cmake ${COMMON_OPTIONS} -DPCB=X9D+ ${SRCDIR} make -j${JOBS} libsimulator +rm CMakeCache.txt cmake ${COMMON_OPTIONS} -DPCB=X9D+ -DPCBREV=2019 ${SRCDIR} make -j${JOBS} libsimulator +rm CMakeCache.txt cmake ${COMMON_OPTIONS} -DPCB=XLITE ${SRCDIR} make -j${JOBS} libsimulator +rm CMakeCache.txt cmake ${COMMON_OPTIONS} -DPCB=XLITES ${SRCDIR} make -j${JOBS} libsimulator +rm CMakeCache.txt cmake ${COMMON_OPTIONS} -DPCB=X9E ${SRCDIR} make -j${JOBS} libsimulator +rm CMakeCache.txt cmake ${COMMON_OPTIONS} -DPCB=X10 ${SRCDIR} make -j${JOBS} libsimulator +rm CMakeCache.txt cmake ${COMMON_OPTIONS} -DPCB=X10 -DPCBREV=EXPRESS ${SRCDIR} make -j${JOBS} libsimulator +rm CMakeCache.txt cmake ${COMMON_OPTIONS} -DPCB=X12S ${SRCDIR} make -j${JOBS} libsimulator +rm CMakeCache.txt make -j${JOBS} package From f7957b084541ee958570fa5441e8b7e992236cc2 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 20 Dec 2019 18:51:00 +0100 Subject: [PATCH 026/560] Update CREDITS.txt --- CREDITS.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index afbca29e1..78375a750 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1668,3 +1668,5 @@ Peter Schneider Norman Schenck Boris Hemmer Gilles Arbona +Patrice Germain +BalTrad From b60300b609bbe71bd76235249347a791600f64a6 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 21 Dec 2019 09:36:23 +0100 Subject: [PATCH 027/560] Move nightlies to 2.3.4 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fafd8c537..682659152 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ project(OpenTX) set(VERSION_MAJOR "2") set(VERSION_MINOR "3") -set(VERSION_REVISION "3") +set(VERSION_REVISION "4") set(VERSION_SUFFIX $ENV{OPENTX_VERSION_SUFFIX}) set(VERSION_FAMILY ${VERSION_MAJOR}.${VERSION_MINOR}) set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}${VERSION_SUFFIX}) From 0b0d2977c1a3e2e00c272a4d0e78dfff68d5cd15 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 21 Dec 2019 12:18:45 +0100 Subject: [PATCH 028/560] Update CREDITS.txt --- CREDITS.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CREDITS.txt b/CREDITS.txt index 78375a750..794e18862 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1669,4 +1669,5 @@ Norman Schenck Boris Hemmer Gilles Arbona Patrice Germain -BalTrad +Mart Rogers +Stefan Möst From d5cb5aece1d1f9f1c1c332057e4f0d16c9b39626 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 23 Dec 2019 08:52:43 +0100 Subject: [PATCH 029/560] Fix wrong ifdef --- radio/src/opentx.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 75f52fb5e..d4c6620da 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -885,7 +885,7 @@ void checkFailsafe() void checkRSSIAlarmsDisabled() { if (g_model.rssiAlarms.disabled) { -#if !defined(INTERNAL_MODULE) +#if !defined(HARDWARE_INTERNAL_MODULE) if (!isModuleMultimoduleDSM2(EXTERNAL_MODULE)) #else if (!isModuleMultimoduleDSM2(INTERNAL_MODULE) && !isModuleMultimoduleDSM2(EXTERNAL_MODULE)) From bcaace286e4ad98bba54f7b37e7ed37da219bd31 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 23 Dec 2019 10:53:48 +0100 Subject: [PATCH 030/560] Update CREDITS.txt --- CREDITS.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index 794e18862..6c6deb5a5 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1671,3 +1671,7 @@ Gilles Arbona Patrice Germain Mart Rogers Stefan Möst +John Beech +John Rodgers +Stanton Sweet +Peter Suphan From 3f8a42d270cb48ec18d6b919a19feaa63e0ffdc3 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 23 Dec 2019 11:01:30 +0100 Subject: [PATCH 031/560] Fixes #7232 (#7235) --- radio/src/pulses/pxx1.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/radio/src/pulses/pxx1.cpp b/radio/src/pulses/pxx1.cpp index b9eb75c00..0d5dd3d2c 100644 --- a/radio/src/pulses/pxx1.cpp +++ b/radio/src/pulses/pxx1.cpp @@ -33,7 +33,7 @@ void Pxx1Pulses::addFlag1(uint8_t module, uint8_t sendFailsafe) flag1 |= PXX_SEND_RANGECHECK; } - if (sendFailsafe && g_model.moduleData[module].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[module].failsafeMode != FAILSAFE_RECEIVER) { + if (sendFailsafe) { flag1 |= PXX_SEND_FAILSAFE; } @@ -182,7 +182,7 @@ void Pxx1Pulses::setupFrame(uint8_t module) #if defined(PXX_FREQUENCY_HIGH) if (moduleState[module].protocol == PROTOCOL_CHANNELS_PXX1_SERIAL) { if (moduleState[module].counter-- == 0) { - sendFailsafe = 1; + sendFailsafe = (g_model.moduleData[module].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[module].failsafeMode != FAILSAFE_RECEIVER); moduleState[module].counter = 1000; } add8ChannelsFrame(module, 0, sendFailsafe); @@ -196,12 +196,12 @@ void Pxx1Pulses::setupFrame(uint8_t module) if (moduleState[module].counter & 0x01) { sendUpperChannels = g_model.moduleData[module].channelsCount; if (sendUpperChannels && moduleState[module].counter == 1) { - sendFailsafe = 1; + sendFailsafe = (g_model.moduleData[module].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[module].failsafeMode != FAILSAFE_RECEIVER); } } else { if (moduleState[module].counter == 0) { - sendFailsafe = 1; + sendFailsafe = (g_model.moduleData[module].failsafeMode != FAILSAFE_NOT_SET && g_model.moduleData[module].failsafeMode != FAILSAFE_RECEIVER); } } From acf00938c31e7a47cdd3b07c22a53b485d8cee53 Mon Sep 17 00:00:00 2001 From: Ben Lye Date: Mon, 23 Dec 2019 10:04:29 +0000 Subject: [PATCH 032/560] Fix T16 calibration image in dark blue theme (#7233) * Update darkblue.cpp * Update t16.bmp Removed white background --- radio/sdcard/horus/THEMES/Darkblue/t16.bmp | Bin 164938 -> 164938 bytes radio/src/gui/480x272/themes/darkblue.cpp | 10 +++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/radio/sdcard/horus/THEMES/Darkblue/t16.bmp b/radio/sdcard/horus/THEMES/Darkblue/t16.bmp index ac0d16cf6119ad1d3e791bf88258734cc443d9e0..9c78cb49809c1e8e6265c0507932bcb745b982f2 100755 GIT binary patch delta 7098 zcmeI0e^69a6vx>sDhms{%kHwf;E%*#=okfqpqOa7Q6WQN3W^R9;fkRv7!heA6+;^+ zNI9UUWTp(7?pQB*mcOVbEHzA;9IAOCYix4*F>$*0;Uj``sO8_`(iB<|sa-%uJrFnN^MB^uwIJOQQMt6dae%yo>^`1p6=`#W(LkMvz>uqH>c5mAhU;<*=iu zoOTSAE03e{sZ*$Y<84%qeh-zM@1t_#IaI#Xj>;h&sGR%>DwlQcVg8Zp)~)NeeTVt^ z`AIFGbLcEAEX1Is4izP4GwCC6QC`C0Np_Zh}RRq6-t063jw-p1PB{NfV8m$sEj1Q zsfh%*5k-LLX#{ZIMu5gx0$iF-fRLF4NWOyrWpfD7GLHb>yKvBuovIlv&%ammEOrja zoT7V3q)n8M->2DxrnN7`)8r8u1V~y+fRg0|@H~ivhA~c!U4~puH99p;@rr6z^F}Vj$NOM4D38=_iS@x;7DMX_dSiw>?9oaf+8!`5XaG zZ6?5tS^`ABKmcbw0UCGUpn+T2`M!(BXuE$8 zv17+VadEL4E$^Mm?q_E8P<%sTVj`56mtzJNGb~uJ0JK^y95`@5&5}R6m7CbqL&ap( zs#TDXkN}4dAI6M~6To7zKwMm$ngv_7Y=Jdv)FJ_6%~+@k^;MT?{-|fcFl3_+&M80?AWnGw1xK8>K^Ru>=dg8ZnwK9j_>}^ zS!{ccIiJFC^Z64ePQZ#4DUI(S6r7&&UG)PTN zRsD?q&eNw)t4IInE*d&++&Cp(FLyhbq1QYsD@$2m4jeC)%K#O?(gE^p3x$ z*E>M*D!dn$5*G* ziM{Q+Z)|KVSglsb$;nZYP4ZXiOn0-#0if6GVa}X6zWa*#3g6t^Ts7I)5WARl_8tW& z7os7Xi@m&ZZOEBLGhFP;_srK52 zre%K(7Hj~{lxju0_!V4@>)mjJ|Iph&v@1M39F{FxCI++x^AE4EE2!({7D7Toz+^HFWmist88c=m3pjiBY>0@6 z0JGWrJzozGUvRa~NPeAi%cd2qpl7oV-r~MgFGuFHZN6t^6$~Zod6(~5Cb_+cZS{4A qCV9kTL&-`i^*zffuiwBn`#M8$PuEh$Dtyipw{_Q_Vx?rF#_vzoC01|% delta 9708 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 Q#Y&CO`jk}c$$Odq1tMv`=l}o! diff --git a/radio/src/gui/480x272/themes/darkblue.cpp b/radio/src/gui/480x272/themes/darkblue.cpp index 017175c77..9a6410bb4 100644 --- a/radio/src/gui/480x272/themes/darkblue.cpp +++ b/radio/src/gui/480x272/themes/darkblue.cpp @@ -137,11 +137,15 @@ class DarkblueTheme: public Theme calibTrackpBackground = BitmapBuffer::load(getThemePath("trackp_background.png")); delete calibHorus; -#if defined(PCBX10) - if (STICKS_PWM_ENABLED()) +#if defined(RADIO_T16) + calibHorus = BitmapBuffer::load(getThemePath("t16.bmp")); +#elif defined(PCBX10) + if(STICKS_PWM_ENABLED()) { calibHorus = BitmapBuffer::load(getThemePath("X10S.bmp")); - else + } + else { calibHorus = BitmapBuffer::load(getThemePath("X10.bmp")); + } #else calibHorus = BitmapBuffer::load(getThemePath("horus.bmp")); #endif From c9c33fd7374e20c8ab0c219aee66e43569718fc9 Mon Sep 17 00:00:00 2001 From: Hans Christian Olaussen <41271048+klutvott123@users.noreply.github.com> Date: Mon, 23 Dec 2019 11:05:11 +0100 Subject: [PATCH 033/560] LUA sport/crossfireTelemetryPush protocol detection (#7229) Make sportTelemetryPush/crossfireTelemetryPush return nil if they detect the wrong telemetry protocol. This allows us to differentiate between wrong protocol and telemetry buffer not available. For lua scripts supporting both crossfire and smartport this will let us reliably detect the telemetry protocol using these functions. --- radio/src/lua/api_general.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index b87d02fc2..2a5db1422 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -440,13 +440,15 @@ When called without parameters, it will only return the status of the output buf @retval boolean data queued in output buffer or not. -@status current Introduced in 2.2.0 +@retval nil incorrect telemetry protocol. + +@status current Introduced in 2.2.0, retval nil added in 2.3.4 */ static int luaSportTelemetryPush(lua_State * L) { if (!IS_FRSKY_SPORT_PROTOCOL()) { - lua_pushboolean(L, false); + lua_pushnil(L); return 1; } @@ -637,12 +639,14 @@ When called without parameters, it will only return the status of the output buf @retval boolean data queued in output buffer or not. -@status current Introduced in 2.2.0 +@retval nil incorrect telemetry protocol. + +@status current Introduced in 2.2.0, retval nil added in 2.3.4 */ static int luaCrossfireTelemetryPush(lua_State * L) { if (telemetryProtocol != PROTOCOL_TELEMETRY_CROSSFIRE) { - lua_pushboolean(L, false); + lua_pushnil(L); return 1; } From 4249c047420bf2c6bef0d59e9f3f398cac47342a Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 23 Dec 2019 11:10:19 +0100 Subject: [PATCH 034/560] Bsongis/trainer sbus x9e (#7227) Fixex #5636 --- radio/src/gui/gui_common.cpp | 7 +++++++ radio/src/targets/common/arm/stm32/bluetooth_driver.cpp | 6 ++++++ radio/src/targets/taranis/board.cpp | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index d3b826b28..ca7dc4442 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -724,6 +724,13 @@ bool isTrainerModeAvailable(int mode) return false; #endif +#if defined(PCBX9E) + if (g_eeGeneral.bluetoothMode && mode == TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE) { + // bluetooth uses the same USART than SBUS + return false; + } +#endif + #if defined(PCBTARANIS) && !defined(TRAINER_BATTERY_COMPARTMENT) if (mode == TRAINER_MODE_MASTER_BATTERY_COMPARTMENT) return false; diff --git a/radio/src/targets/common/arm/stm32/bluetooth_driver.cpp b/radio/src/targets/common/arm/stm32/bluetooth_driver.cpp index 01349d56c..cbb9821c0 100644 --- a/radio/src/targets/common/arm/stm32/bluetooth_driver.cpp +++ b/radio/src/targets/common/arm/stm32/bluetooth_driver.cpp @@ -107,6 +107,12 @@ void bluetoothInit(uint32_t baudrate, bool enable) void bluetoothDisable() { GPIO_SetBits(BT_EN_GPIO, BT_EN_GPIO_PIN); // close bluetooth (recent modules will go to bootloader mode) + USART_ITConfig(BT_USART, USART_IT_RXNE, DISABLE); + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitStructure.GPIO_Pin = BT_RX_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_Init(BT_USART_GPIO, &GPIO_InitStructure); + USART_DeInit(BT_USART); } extern "C" void BT_USART_IRQHandler(void) diff --git a/radio/src/targets/taranis/board.cpp b/radio/src/targets/taranis/board.cpp index 2d7a980c7..2dfa0a886 100644 --- a/radio/src/targets/taranis/board.cpp +++ b/radio/src/targets/taranis/board.cpp @@ -116,7 +116,7 @@ void boardInit() BT_RCC_APB2Periph, ENABLE); -#if defined(BLUETOOTH) +#if defined(BLUETOOTH) && !defined(PCBX9E) bluetoothInit(BLUETOOTH_DEFAULT_BAUDRATE, true); #endif From 103db22270f2e67641ce6150ff4857cd13d05f03 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 23 Dec 2019 11:11:17 +0100 Subject: [PATCH 035/560] Provide a manual compilation option to force TRAINER multi Horus with hacked hardware (#7226) --- radio/src/CMakeLists.txt | 5 +++++ radio/src/dataconstants.h | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 39da94311..c16bf7ca2 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -53,6 +53,7 @@ option(MODULE_PROTOCOL_LBT "Add support for EU/LBT modules" ON) option(MODULE_PROTOCOL_FLEX "Add support for non certified FLEX modules" OFF) option(MODULE_PROTOCOL_D8 "Add support for D8 modules" ON) option(FRSKY_RELEASE "Used to build FrSky released firmware" OFF) +option(ALLOW_TRAINER_MULTI "Allow multi trainer" OFF) # since we reset all default CMAKE compiler flags for firmware builds, provide an alternate way for user to specify additional flags. set(FIRMWARE_C_FLAGS "" CACHE STRING "Additional flags for firmware target c compiler (note: all CMAKE_C_FLAGS[_*] are ignored for firmware/bootloader).") @@ -343,6 +344,10 @@ if(FRSKY_RELEASE) set(POPUP_LEVEL 3) endif() +if(ALLOW_TRAINER_MULTI) + add_definitions(-DALLOW_TRAINER_MULTI) +endif() + add_definitions(-DPOPUP_LEVEL=${POPUP_LEVEL}) set(SRC diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index c747b39bb..1af8efdb6 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -205,7 +205,7 @@ enum TrainerMode { }; #endif -#if defined(RADIO_T16) +#if defined(RADIO_T16) || defined(ALLOW_TRAINER_MULTI) #define TRAINER_MODE_MAX() TRAINER_MODE_MULTI #elif defined(BLUETOOTH) #define TRAINER_MODE_MAX() TRAINER_MODE_SLAVE_BLUETOOTH From af69e36ae6e18cc6ea41ff7fcf2d41c3698d25a4 Mon Sep 17 00:00:00 2001 From: Ben Lye Date: Mon, 23 Dec 2019 10:40:38 +0000 Subject: [PATCH 036/560] Call class load method when loading the dark blue theme (#7236) --- radio/src/gui/480x272/themes/darkblue.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/gui/480x272/themes/darkblue.cpp b/radio/src/gui/480x272/themes/darkblue.cpp index 9a6410bb4..3d5e056fb 100644 --- a/radio/src/gui/480x272/themes/darkblue.cpp +++ b/radio/src/gui/480x272/themes/darkblue.cpp @@ -228,6 +228,7 @@ class DarkblueTheme: public Theme virtual void load() const { + Theme::load(); loadColors(); loadMenusIcons(); loadThemeBitmaps(); From 979cd7b719865f15e301036530162d09347a7730 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 24 Dec 2019 08:57:51 +0100 Subject: [PATCH 037/560] Move nightlies to 2.3.5 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 682659152..bcbe62e95 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ project(OpenTX) set(VERSION_MAJOR "2") set(VERSION_MINOR "3") -set(VERSION_REVISION "4") +set(VERSION_REVISION "5") set(VERSION_SUFFIX $ENV{OPENTX_VERSION_SUFFIX}) set(VERSION_FAMILY ${VERSION_MAJOR}.${VERSION_MINOR}) set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}${VERSION_SUFFIX}) From 428c0c635346f4e7968cd41a321214dc5e04caa7 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 24 Dec 2019 10:42:46 +0100 Subject: [PATCH 038/560] Add missing simu --- tools/build-companion-release.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tools/build-companion-release.sh b/tools/build-companion-release.sh index 2959df10d..8ecc343c8 100755 --- a/tools/build-companion-release.sh +++ b/tools/build-companion-release.sh @@ -62,6 +62,10 @@ cmake ${COMMON_OPTIONS} -DPCB=X7 ${SRCDIR} make -j${JOBS} libsimulator rm CMakeCache.txt +cmake ${COMMON_OPTIONS} -DPCB=X7 -DPCBREV=T12 ${SRCDIR} +make -j${JOBS} libsimulator +rm CMakeCache.txt + cmake ${COMMON_OPTIONS} -DPCB=X9D ${SRCDIR} make -j${JOBS} libsimulator rm CMakeCache.txt @@ -90,6 +94,10 @@ cmake ${COMMON_OPTIONS} -DPCB=X10 ${SRCDIR} make -j${JOBS} libsimulator rm CMakeCache.txt +cmake ${COMMON_OPTIONS} -DPCB=X10 -DPCBREV=T16 ${SRCDIR} +make -j${JOBS} libsimulator +rm CMakeCache.txt + cmake ${COMMON_OPTIONS} -DPCB=X10 -DPCBREV=EXPRESS ${SRCDIR} make -j${JOBS} libsimulator rm CMakeCache.txt From af0e708ee1cb6af19f88a88b8f1166f1ca4da7ce Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 24 Dec 2019 14:11:38 +0100 Subject: [PATCH 039/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 6c6deb5a5..f1c43743b 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1675,3 +1675,4 @@ John Beech John Rodgers Stanton Sweet Peter Suphan +FGS From 5d51317ceb080e46eadc7d49f2a6ecec5989a7d7 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 26 Dec 2019 22:27:25 +0100 Subject: [PATCH 040/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index f1c43743b..2991d5b42 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1676,3 +1676,4 @@ John Rodgers Stanton Sweet Peter Suphan FGS +Outward Ideas From 2f793eba325023a6c96c692682b957fba735c891 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 26 Dec 2019 22:29:02 +0100 Subject: [PATCH 041/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 2991d5b42..381adc1f3 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1677,3 +1677,4 @@ Stanton Sweet Peter Suphan FGS Outward Ideas +Sylvie Le Madec From ea1133527313383b84f0ad3e58cb3f0f5463bca6 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 27 Dec 2019 09:42:13 +0100 Subject: [PATCH 042/560] D16 bind option (#7218) D16 bind option, and several fixes that give MULTI live data priority vs OpenTX stored multi definitions Co-authored-by: pascallanger --- radio/src/datastructs.h | 3 +++ radio/src/gui/128x64/model_setup.cpp | 23 +++++++++------- radio/src/gui/212x64/model_setup.cpp | 21 ++++++++------- radio/src/gui/480x272/model_setup.cpp | 19 +++++++------- .../gui/common/stdlcd/model_setup_pxx1.cpp | 26 +++++++++++++------ radio/src/gui/gui_common.cpp | 2 +- radio/src/gui/gui_common.h | 23 +++++++++------- radio/src/pulses/modules_helpers.h | 6 +++-- radio/src/pulses/multi.cpp | 15 +++++++++-- radio/src/telemetry/multi.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/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 +- 20 files changed, 97 insertions(+), 63 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 5733c7f86..9c5e1b652 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -444,6 +444,9 @@ PACK(struct ModuleData { uint8_t autoBindMode:1; uint8_t lowPowerMode:1; int8_t optionValue; + uint8_t receiverTelemetryOff:1; + uint8_t receiverHigherChannels:1; + uint8_t spare:6; } multi); NOBACKUP(struct { uint8_t power:2; // 0=10 mW, 1=100 mW, 2=500 mW, 3=1W diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index be933710b..3a67ba80e 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1461,8 +1461,19 @@ void menuModelSetup(event_t event) if (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx)) { int optionValue = g_model.moduleData[moduleIdx].multi.optionValue; + MultiModuleStatus &status = getMultiModuleStatus(moduleIdx); const uint8_t multi_proto = g_model.moduleData[moduleIdx].getMultiProtocol(); - if (multi_proto < MODULE_SUBTYPE_MULTI_LAST) { + + if (status.isValid()) { + MultiModuleStatus &status = getMultiModuleStatus(moduleIdx); + lcdDrawText(INDENT_WIDTH, y, mm_options_strings::options[status.optionDisp]); + if (attr && status.optionDisp == 2) { + lcdDrawText(MODEL_SETUP_2ND_COLUMN + 23, y, "RSSI(", LEFT); + lcdDrawNumber(lcdLastRightPos, y, TELEMETRY_RSSI(), LEFT); + lcdDrawText(lcdLastRightPos, y, ")", LEFT); + } + } + else { const mm_protocol_definition * pdef = getMultiProtocolDefinition(multi_proto); if (pdef->optionsstr) { lcdDrawText(INDENT_WIDTH, y, pdef->optionsstr); @@ -1473,15 +1484,7 @@ void menuModelSetup(event_t event) } } } - else { - MultiModuleStatus &status = getMultiModuleStatus(moduleIdx); - lcdDrawText(INDENT_WIDTH, y, mm_options_strings::options[status.optionDisp]); - if (attr && status.optionDisp == 2) { - lcdDrawText(MODEL_SETUP_2ND_COLUMN + 23, y, "RSSI(", LEFT); - lcdDrawNumber(lcdLastRightPos, y, TELEMETRY_RSSI(), LEFT); - lcdDrawText(lcdLastRightPos, y, ")", LEFT); - } - } + if (multi_proto == MODULE_SUBTYPE_MULTI_FS_AFHDS2A) optionValue = 50 + 5 * optionValue; diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index c7acddefb..18efa2849 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -1216,8 +1216,17 @@ void menuModelSetup(event_t event) if (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx)) { int optionValue = g_model.moduleData[moduleIdx].multi.optionValue; + MultiModuleStatus &status = getMultiModuleStatus(moduleIdx); const uint8_t multi_proto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(); - if (multi_proto < MODULE_SUBTYPE_MULTI_LAST) { + if (status.isValid()) { + lcdDrawText(INDENT_WIDTH, y, mm_options_strings::options[status.optionDisp]); + if (attr && status.optionDisp == 2) { + lcdDrawText(MODEL_SETUP_3RD_COLUMN+22, y, "RSSI(", LEFT); + lcdDrawNumber(lcdLastRightPos, y, TELEMETRY_RSSI(), LEFT); + lcdDrawText(lcdLastRightPos, y, ")", LEFT); + } + } + else { const mm_protocol_definition * pdef = getMultiProtocolDefinition(multi_proto); if (pdef->optionsstr) lcdDrawText(INDENT_WIDTH, y, pdef->optionsstr); @@ -1227,15 +1236,7 @@ void menuModelSetup(event_t event) lcdDrawText(lcdLastRightPos, y, ")", LEFT); } } - else { - MultiModuleStatus &status = getMultiModuleStatus(moduleIdx); - lcdDrawText(INDENT_WIDTH, y, mm_options_strings::options[status.optionDisp]); - if (attr && status.optionDisp == 2) { - lcdDrawText(MODEL_SETUP_3RD_COLUMN+22, y, "RSSI(", LEFT); - lcdDrawNumber(lcdLastRightPos, y, TELEMETRY_RSSI(), LEFT); - lcdDrawText(lcdLastRightPos, y, ")", LEFT); - } - } + if (multi_proto == MODULE_SUBTYPE_MULTI_FS_AFHDS2A) optionValue = 50 + 5 * optionValue; diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index 93fed1953..405efbfd5 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -1613,23 +1613,24 @@ bool menuModelSetup(event_t event) if (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx)) { int optionValue = g_model.moduleData[moduleIdx].multi.optionValue; + MultiModuleStatus &status = getMultiModuleStatus(moduleIdx); const uint8_t multi_proto = g_model.moduleData[moduleIdx].getMultiProtocol(); - if (multi_proto < MODULE_SUBTYPE_MULTI_LAST) { + if (status.isValid()) { + lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, mm_options_strings::options[status.optionDisp]); + if (attr && status.optionDisp == 2) { + lcdDrawNumber(LCD_W - 10, y, TELEMETRY_RSSI(), RIGHT, 0, "RSSI(", ")"); + } + } + else { const mm_protocol_definition * pdef = getMultiProtocolDefinition(multi_proto); if (pdef->optionsstr) { lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, pdef->optionsstr); - if (attr && pdef->optionsstr == STR_MULTI_RFTUNE) { + if (attr && pdef->optionsstr == STR_MULTI_RFTUNE) { lcdDrawNumber(LCD_W - 10, y, TELEMETRY_RSSI(), RIGHT, 0, "RSSI(", ")"); } } } - else { - MultiModuleStatus &status = getMultiModuleStatus(moduleIdx); - lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, mm_options_strings::options[status.optionDisp]); - if (attr && status.optionDisp == 2) { - lcdDrawNumber(LCD_W - 10, y, TELEMETRY_RSSI(), RIGHT, 0, "RSSI(", ")"); - } - } + if (multi_proto == MODULE_SUBTYPE_MULTI_FS_AFHDS2A) optionValue = 50 + 5 * optionValue; diff --git a/radio/src/gui/common/stdlcd/model_setup_pxx1.cpp b/radio/src/gui/common/stdlcd/model_setup_pxx1.cpp index 24091dcd7..13ad0437c 100644 --- a/radio/src/gui/common/stdlcd/model_setup_pxx1.cpp +++ b/radio/src/gui/common/stdlcd/model_setup_pxx1.cpp @@ -22,27 +22,37 @@ void onBindMenu(const char * result) { uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition - HEADER_LINE); + uint8_t receiverTelemetryOff, receiverHigherChannels; if (result == STR_BINDING_1_8_TELEM_ON) { - g_model.moduleData[moduleIdx].pxx.receiverTelemetryOff = false; - g_model.moduleData[moduleIdx].pxx.receiverHigherChannels = false; + receiverTelemetryOff = false; + receiverHigherChannels = false; } else if (result == STR_BINDING_1_8_TELEM_OFF) { - g_model.moduleData[moduleIdx].pxx.receiverTelemetryOff = true; - g_model.moduleData[moduleIdx].pxx.receiverHigherChannels = false; + receiverTelemetryOff = true; + receiverHigherChannels = false; } else if (result == STR_BINDING_9_16_TELEM_ON) { - g_model.moduleData[moduleIdx].pxx.receiverTelemetryOff = false; - g_model.moduleData[moduleIdx].pxx.receiverHigherChannels = true; + receiverTelemetryOff = false; + receiverHigherChannels = true; } else if (result == STR_BINDING_9_16_TELEM_OFF) { - g_model.moduleData[moduleIdx].pxx.receiverTelemetryOff = true; - g_model.moduleData[moduleIdx].pxx.receiverHigherChannels = true; + receiverTelemetryOff = true; + receiverHigherChannels = true; } else { return; } + if (isModuleMultimodule(moduleIdx)) { + g_model.moduleData[moduleIdx].multi.receiverTelemetryOff = receiverTelemetryOff; + g_model.moduleData[moduleIdx].multi.receiverHigherChannels = receiverHigherChannels; + } + else { + g_model.moduleData[moduleIdx].pxx.receiverTelemetryOff = receiverTelemetryOff; + g_model.moduleData[moduleIdx].pxx.receiverHigherChannels = receiverHigherChannels; + } + moduleState[moduleIdx].mode = MODULE_MODE_BIND; } diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index ca7dc4442..a849dfd7a 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -926,7 +926,7 @@ const mm_protocol_definition multi_protocols[] = { {MM_RF_CUSTOM_SELECTED, 7, true, true, NO_SUBTYPE, STR_MULTI_OPTION}, // Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff) - {0xfe, 0, false, true, NO_SUBTYPE, nullptr} + {0xfe, 0, false, false, NO_SUBTYPE, nullptr} }; #undef NO_SUBTYPE diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 6c52f2fb3..ccbf535eb 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -166,6 +166,11 @@ inline uint8_t MULTI_DISABLE_CHAN_MAP_ROW(uint8_t moduleIdx) if (!isModuleMultimodule(moduleIdx)) return HIDDEN_ROW; + MultiModuleStatus &status = getMultiModuleStatus(moduleIdx); + if (status.isValid()) { + return status.supportsDisableMapping() == true ? 0 : HIDDEN_ROW; + } + uint8_t protocol = g_model.moduleData[moduleIdx].getMultiProtocol(); if (protocol < MODULE_SUBTYPE_MULTI_LAST) { const mm_protocol_definition * pdef = getMultiProtocolDefinition(protocol); @@ -173,11 +178,6 @@ inline uint8_t MULTI_DISABLE_CHAN_MAP_ROW(uint8_t moduleIdx) return 0; } - MultiModuleStatus &status = getMultiModuleStatus(moduleIdx); - if (status.supportsDisableMapping() && status.isValid()) { - return 0; - } - return HIDDEN_ROW; } @@ -239,12 +239,15 @@ inline uint8_t MULTIMODULE_HASOPTIONS(uint8_t moduleIdx) return false; uint8_t protocol = g_model.moduleData[moduleIdx].getMultiProtocol(); - if (protocol < MODULE_SUBTYPE_MULTI_LAST) { - return getMultiProtocolDefinition(protocol)->optionsstr != nullptr; - } - MultiModuleStatus &status = getMultiModuleStatus(moduleIdx); - return status.optionDisp; + + if (status.isValid()) + return status.optionDisp; + + if (protocol < MODULE_SUBTYPE_MULTI_LAST) + return getMultiProtocolDefinition(protocol)->optionsstr != nullptr; + + return false; } #define MULTIMODULE_MODULE_ROWS(moduleIdx) MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW, MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW, MULTI_DISABLE_CHAN_MAP_ROW(moduleIdx), // AUTOBIND, DISABLE TELEM, DISABLE CN.MAP diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h index 2c9a64e94..dfd5a1e24 100644 --- a/radio/src/pulses/modules_helpers.h +++ b/radio/src/pulses/modules_helpers.h @@ -127,7 +127,7 @@ inline bool isModuleISRMD16(uint8_t idx) inline bool isModuleD16(uint8_t idx) { - return isModuleXJTD16(idx) || isModuleISRMD16(idx); + return isModuleXJTD16(idx) || isModuleISRMD16(idx) || IS_D16_MULTI(idx); } inline bool isModuleISRMAccess(uint8_t idx) @@ -469,7 +469,7 @@ inline bool isTelemAllowedOnBind(uint8_t moduleIndex) { #if defined(HARDWARE_INTERNAL_MODULE) if (moduleIndex == INTERNAL_MODULE) - return isModuleISRM(moduleIndex) || isSportLineUsedByInternalModule(); + return true; if (isSportLineUsedByInternalModule()) return false; @@ -557,6 +557,8 @@ inline void resetMultiProtocolsOptions(uint8_t moduleIdx) g_model.moduleData[moduleIdx].multi.disableTelemetry = 0; g_model.moduleData[moduleIdx].multi.disableMapping = 0; g_model.moduleData[moduleIdx].multi.lowPowerMode = 0; + g_model.moduleData[moduleIdx].failsafeMode = FAILSAFE_NOT_SET; + g_model.header.modelId[moduleIdx] = 0; } inline void getMultiOptionValues(int8_t multi_proto, int8_t & min, int8_t & max) diff --git a/radio/src/pulses/multi.cpp b/radio/src/pulses/multi.cpp index b49c61b7d..936da0948 100644 --- a/radio/src/pulses/multi.cpp +++ b/radio/src/pulses/multi.cpp @@ -38,6 +38,7 @@ static void sendFrameProtocolHeader(uint8_t moduleIdx, bool failsafe); void sendChannels(uint8_t moduleIdx); +static void sendD16BindOption(uint8_t moduleIdx); #if defined(LUA) static void sendSport(uint8_t moduleIdx); static void sendHott(uint8_t moduleIdx); @@ -174,10 +175,13 @@ void setupPulsesMulti(uint8_t moduleIdx) | g_model.moduleData[moduleIdx].multi.disableMapping)); // Multi V1.3.X.X -> Send protocol additional data: max 9 bytes -#if defined(LUA) if (getMultiModuleStatus(moduleIdx).isValid()) { MultiModuleStatus &status = getMultiModuleStatus(moduleIdx); if (status.minor >= 3 && !(status.flags & 0x80)) { //Version 1.3.x.x or more and Buffer not full + if (IS_D16_MULTI(moduleIdx) && moduleState[moduleIdx].mode == MODULE_MODE_BIND) { + sendD16BindOption(moduleIdx);//1 byte of additional data + } +#if defined(LUA) // SPort send if (IS_D16_MULTI(moduleIdx) && outputTelemetryBuffer.destination == TELEMETRY_ENDPOINT_SPORT && outputTelemetryBuffer.size) { sendSport(moduleIdx); //8 bytes of additional data @@ -185,9 +189,9 @@ void setupPulsesMulti(uint8_t moduleIdx) else if (IS_HOTT_MULTI(moduleIdx)) { sendHott(moduleIdx); //1 byte of additional data } +#endif } } - #endif } void setupPulsesMultiExternalModule() @@ -345,6 +349,13 @@ void sendFrameProtocolHeader(uint8_t moduleIdx, bool failsafe) sendMulti(moduleIdx, (uint8_t) optionValue); } +void sendD16BindOption(uint8_t moduleIdx) +{ + uint8_t bind_opt = g_model.moduleData[moduleIdx].multi.receiverTelemetryOff ? 1 : 0; + bind_opt |= g_model.moduleData[moduleIdx].multi.receiverHigherChannels ? 2 : 0; + sendMulti(moduleIdx, bind_opt); +} + #if defined(LUA) void sendSport(uint8_t moduleIdx) { diff --git a/radio/src/telemetry/multi.cpp b/radio/src/telemetry/multi.cpp index 9fba4105a..e6b41faae 100644 --- a/radio/src/telemetry/multi.cpp +++ b/radio/src/telemetry/multi.cpp @@ -548,7 +548,7 @@ void MultiModuleStatus::getStatusString(char * statusText) const return; } - if (major == 1 && minor < 3 && SLOW_BLINK_ON_PHASE) { + if (major <= 1 && minor <= 3 && revision <= 0 && patch <= 47 && SLOW_BLINK_ON_PHASE) { strcpy(statusText, STR_MODULE_UPGRADE); } else { diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index df4261a0a..d90d692c7 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -644,7 +644,7 @@ #define TR_MODULE_WAITFORBIND "Párovat při zavedení protokolu" #define TR_MODULE_BINDING TR("Bind...","Párování") #define TR_MODULE_UPGRADE_ALERT TR3("Upg. needed", "Module upgrade required", "Module\nUpgrade required") -#define TR_MODULE_UPGRADE TR("Upg. needed", "Module update recommended") +#define TR_MODULE_UPGRADE TR("Upg. advised", "Module update recommended") #define TR_REBIND "Nutno přepárovat" #define TR_REG_OK "Registrace ok" #define TR_BIND_OK "Úspěšné párovaní" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 89ad37779..de1421c0e 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -646,7 +646,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" #define TR_MODULE_UPGRADE_ALERT TR3("Upg. needed", "Module upgrade required", "Module\nUpgrade required") -#define TR_MODULE_UPGRADE TR("Upg. needed", "Module update recommended") +#define TR_MODULE_UPGRADE TR("Upg. advised", "Module update recommended") #define TR_REBIND "Rebinding required" #define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 0cfa48682..f7600bf4f 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -645,7 +645,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING TR("Bind...","Binding") #define TR_MODULE_UPGRADE_ALERT TR3("Upg. needed", "Module upgrade required", "Module\nUpgrade required") -#define TR_MODULE_UPGRADE TR("Upg. needed", "Module update recommended") +#define TR_MODULE_UPGRADE TR("Upg. advised", "Module update recommended") #define TR_REBIND "Rebinding required" #define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index acdc29090..a52691923 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -669,7 +669,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" #define TR_MODULE_UPGRADE_ALERT TR3("Upg. needed", "Module upgrade required", "Module\nUpgrade required") -#define TR_MODULE_UPGRADE TR("Upg. needed", "Module update recommended") +#define TR_MODULE_UPGRADE TR("Upg. advised", "Module update recommended") #define TR_REBIND "Rebinding required" #define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index c378cb47c..f5e018ead 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -663,7 +663,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" #define TR_MODULE_UPGRADE_ALERT TR3("Upg. needed", "Module upgrade required", "Module\nUpgrade required") -#define TR_MODULE_UPGRADE TR("Upg. needed", "Module update recommended") +#define TR_MODULE_UPGRADE TR("Upg. advised", "Module update recommended") #define TR_REBIND "Rebinding required" #define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index acf1f155f..c8ec87b9f 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -666,7 +666,7 @@ #define TR_MODULE_WAITFORBIND "Binder d'abord" #define TR_MODULE_BINDING "Bind..." #define TR_MODULE_UPGRADE_ALERT "Mise à jour requise" -#define TR_MODULE_UPGRADE TR("Upg. needed", "Module update recommended") +#define TR_MODULE_UPGRADE TR("Upg. advised", "Module update recommended") #define TR_REBIND "Rebind requis" #define TR_REG_OK "Enregistr. ok" #define TR_BIND_OK "Bind ok" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 2b68fe5df..633d83a26 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -651,7 +651,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" #define TR_MODULE_UPGRADE_ALERT TR3("Upg. needed", "Module upgrade required", "Module\nUpgrade required") -#define TR_MODULE_UPGRADE TR("Upg. needed", "Module update recommended") +#define TR_MODULE_UPGRADE TR("Upg. advised", "Module update recommended") #define TR_REBIND "Rebinding required" #define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 0441b2418..339755077 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -664,7 +664,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" #define TR_MODULE_UPGRADE_ALERT TR3("Upg. needed", "Module upgrade required", "Module\nUpgrade required") -#define TR_MODULE_UPGRADE TR("Upg. needed", "Module update recommended") +#define TR_MODULE_UPGRADE TR("Upg. advised", "Module update recommended") #define TR_REBIND "Rebinding required" #define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 998a4e99a..7d51e12f7 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -655,7 +655,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" #define TR_MODULE_UPGRADE_ALERT TR3("Upg. needed", "Module upgrade required", "Module\nUpgrade required") -#define TR_MODULE_UPGRADE TR("Upg. needed", "Module update recommended") +#define TR_MODULE_UPGRADE TR("Upg. advised", "Module update recommended") #define TR_REBIND "Rebinding required" #define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index aeff79192..2c26a7a0a 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -664,7 +664,7 @@ #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" #define TR_MODULE_UPGRADE_ALERT TR3("Upg. needed", "Module upgrade required", "Module\nUpgrade required") -#define TR_MODULE_UPGRADE TR("Upg. needed", "Module update recommended") +#define TR_MODULE_UPGRADE TR("Upg. advised", "Module update recommended") #define TR_REBIND "Rebinding required" #define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" From 01824fa4edb4866ab5187720cd840a767564dd16 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 27 Dec 2019 20:07:20 +0100 Subject: [PATCH 043/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 381adc1f3..9bcf147d4 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1678,3 +1678,4 @@ Peter Suphan FGS Outward Ideas Sylvie Le Madec +James Houck (monthly) From b19b3bcbe7f550329f2b3284674b6bebdee20b51 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 29 Dec 2019 10:43:04 +0100 Subject: [PATCH 044/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 9bcf147d4..3fbd84a7f 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1679,3 +1679,4 @@ FGS Outward Ideas Sylvie Le Madec James Houck (monthly) +Frank Steinmetz From cfc114e8538d3172a00d9e7f5321ed5f40d6647a Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 31 Dec 2019 09:00:08 +0100 Subject: [PATCH 045/560] Update credits --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 3fbd84a7f..b28f50d0e 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -29,6 +29,7 @@ Michael Byrne FrSky (monthly) FlySky (monthly) JumperRC (monthly) +RadioMaster (monthly) Aloft Hobbies Jonathan Modellismo WsTech From 655ac5773d37a503a97bec48028514d9a9b01bdf Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 3 Jan 2020 10:32:06 +0100 Subject: [PATCH 046/560] Fix x7access remote compile (#7257) --- radio/util/build-firmware.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/radio/util/build-firmware.py b/radio/util/build-firmware.py index be3003c88..4488659b0 100755 --- a/radio/util/build-firmware.py +++ b/radio/util/build-firmware.py @@ -96,6 +96,11 @@ def main(): cmake_options["PCB"] = "X7" firmware_options = options_taranis_x9dp maxsize = 65536 * 8 + elif options[optcount] == "x7access": + cmake_options["PCB"] = "X7" + cmake_options["PCBREV"] = "ACCESS" + firmware_options = options_taranis_x9dp + maxsize = 65536 * 8 elif board_name == "xlite": cmake_options["PCB"] = "XLITE" firmware_options = options_taranis_xlite From ef49a9ff77cc417aed4c9b67e5873d76e0bc7586 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 3 Jan 2020 11:54:21 +0100 Subject: [PATCH 047/560] Bsongis/wizard issue when model id already used (#7259) Wizard: popup displayed when modelID already used, but screen not refreshed --- .../taranis-x7/SCRIPTS/WIZARD/wizard.lua | 12 +--- radio/src/gui/212x64/model_setup.cpp | 16 ++--- radio/src/gui/480x272/model_setup.cpp | 4 +- radio/src/main.cpp | 4 +- radio/src/opentx.cpp | 48 ++++++--------- radio/src/pulses/modules_helpers.h | 7 ++- radio/src/storage/modelslist.cpp | 58 ++++++++----------- 7 files changed, 60 insertions(+), 89 deletions(-) diff --git a/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/wizard.lua b/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/wizard.lua index 513ce253a..2568f22b9 100755 --- a/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/wizard.lua +++ b/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/wizard.lua @@ -14,8 +14,6 @@ ---- # GNU General Public License for more details. # ---- # # ---- ######################################################################### --- Navigation variables -local dirty = true -- Model types local modelType = 0 @@ -27,10 +25,8 @@ local MODELTYPE_QUAD = 2 local function fieldIncDec(event, value, max) if event == EVT_ROT_LEFT or event == EVT_UP_BREAK then value = (value + max) - dirty = true elseif event == EVT_ROT_RIGHT or event == EVT_DOWN_BREAK then value = (value + max + 2) - dirty = true end value = (value % (max+1)) return value @@ -38,7 +34,7 @@ end -- Model Type Menu local function modelTypeSurround(index) - if(index<=1) then + if index <= 1 then lcd.drawFilledRectangle(59*(index%2)+12, 13, 43, 23) else lcd.drawFilledRectangle(59*(index%2)+12, 34, 40, 20) @@ -56,10 +52,7 @@ local function drawModelChoiceMenu() end local function modelTypeMenu(event) - if dirty == true then - drawModelChoiceMenu() - dirty = false - end + drawModelChoiceMenu() if event == EVT_ENTER_BREAK then if modelType == MODELTYPE_PLANE then return "plane.lua" @@ -68,7 +61,6 @@ local function modelTypeMenu(event) elseif modelType == MODELTYPE_QUAD then return "multi.lua" end - dirty = true else modelType = fieldIncDec(event, modelType, 2) end diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 18efa2849..2d90d70da 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -1410,15 +1410,15 @@ void menuModelSetup(event_t event) if (old_editMode > 0 && s_editMode == 0) { switch(menuVerticalPosition) { - case ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_BIND: - if (menuHorizontalPosition == 0) - checkModelIdUnique(g_eeGeneral.currModel, INTERNAL_MODULE); - break; + case ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_BIND: + if (menuHorizontalPosition == 0) + checkModelIdUnique(g_eeGeneral.currModel, INTERNAL_MODULE); + break; - case ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_BIND: - if (menuHorizontalPosition == 0) - checkModelIdUnique(g_eeGeneral.currModel, EXTERNAL_MODULE); - break; + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_BIND: + if (menuHorizontalPosition == 0) + checkModelIdUnique(g_eeGeneral.currModel, EXTERNAL_MODULE); + break; } } } diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index 405efbfd5..0b0554336 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -397,7 +397,7 @@ void checkModelIdUnique(uint8_t moduleIdx) // cannot rely exactly on WARNING_LINE_LEN so using WARNING_LINE_LEN-2 size_t warn_buf_len = sizeof(reusableBuffer.moduleSetup.msg) - WARNING_LINE_LEN - 2; - if (!modelslist.isModelIdUnique(moduleIdx,warn_buf,warn_buf_len)) { + if (!modelslist.isModelIdUnique(moduleIdx, warn_buf, warn_buf_len)) { if (warn_buf[0] != 0) { POPUP_WARNING(STR_MODELIDUSED); SET_WARNING_INFO(warn_buf, sizeof(reusableBuffer.moduleSetup.msg), 0); @@ -1754,7 +1754,7 @@ bool menuModelSetup(event_t event) // some field just finished being edited if (old_editMode > 0 && s_editMode == 0) { - ModelCell* mod_cell = modelslist.getCurrentModel(); + ModelCell * mod_cell = modelslist.getCurrentModel(); if (mod_cell) { switch(menuVerticalPosition) { case ITEM_MODEL_SETUP_NAME: diff --git a/radio/src/main.cpp b/radio/src/main.cpp index 0a4d1a346..3f5dbd1ab 100644 --- a/radio/src/main.cpp +++ b/radio/src/main.cpp @@ -469,9 +469,9 @@ void guiMain(event_t evt) lcdRefresh(); - if (mainRequestFlags & (1 << REQUEST_SCREENSHOT)) { + if (mainRequestFlags & (1u << REQUEST_SCREENSHOT)) { writeScreenshot(); - mainRequestFlags &= ~(1 << REQUEST_SCREENSHOT); + mainRequestFlags &= ~(1u << REQUEST_SCREENSHOT); } } #endif diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index d4c6620da..3bf65563f 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -437,36 +437,27 @@ void checkModelIdUnique(uint8_t index, uint8_t module) uint8_t findNextUnusedModelId(uint8_t index, uint8_t module) { - // assume 63 is the highest Model ID - // and use 64 bits - uint8_t usedModelIds[8]; + uint8_t usedModelIds[(MAX_RXNUM + 7) / 8]; memset(usedModelIds, 0, sizeof(usedModelIds)); - for (uint8_t mod_i = 0; mod_i < MAX_MODELS; mod_i++) { - - if (mod_i == index) + for (uint8_t modelIndex = 0; modelIndex < MAX_MODELS; modelIndex++) { + if (modelIndex == index) continue; - uint8_t id = modelHeaders[mod_i].modelId[module]; + uint8_t id = modelHeaders[modelIndex].modelId[module]; if (id == 0) continue; - uint8_t mask = 1; - for (uint8_t i = 1; i < (id & 7); i++) - mask <<= 1; - - usedModelIds[id >> 3] |= mask; + uint8_t mask = 1u << (id & 7u); + usedModelIds[id >> 3u] |= mask; } - uint8_t new_id = 1; - uint8_t tst_mask = 1; - for (;new_id < getMaxRxNum(module); new_id++) { - if (!(usedModelIds[new_id >> 3] & tst_mask)) { + for (uint8_t id = 1; id <= getMaxRxNum(module); id++) { + uint8_t mask = 1u << (id & 7u); + if (!(usedModelIds[id >> 3u] & mask)) { // found free ID - return new_id; + return id; } - if ((tst_mask <<= 1) == 0) - tst_mask = 1; } // failed finding something... @@ -482,7 +473,7 @@ void modelDefault(uint8_t id) memcpy(g_model.modelRegistrationID, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID); -#if defined(LUA) && defined(PCBTARANIS) //Horus uses menuModelWizard() for wizard +#if defined(LUA) && defined(PCBTARANIS) // Horus uses menuModelWizard() for wizard if (isFileAvailable(WIZARD_PATH "/" WIZARD_NAME)) { f_chdir(WIZARD_PATH); luaExec(WIZARD_NAME); @@ -492,23 +483,20 @@ void modelDefault(uint8_t id) #if defined(FRSKY_RELEASE) g_model.moduleData[INTERNAL_MODULE].type = IS_PXX2_INTERNAL_ENABLED() ? MODULE_TYPE_ISRM_PXX2 : MODULE_TYPE_XJT_PXX1; g_model.moduleData[INTERNAL_MODULE].channelsCount = defaultModuleChannels_M8(INTERNAL_MODULE); + #if defined(EEPROM) + g_model.header.modelId[INTERNAL_MODULE] = findNextUnusedModelId(id, INTERNAL_MODULE); + modelHeaders[id].modelId[INTERNAL_MODULE] = g_model.header.modelId[INTERNAL_MODULE] + #endif #endif #if defined(PCBXLITE) g_model.trainerData.mode = TRAINER_MODE_MASTER_BLUETOOTH; #endif -#if defined(EEPROM) - for (int i=0; ivalid_rfData) { + ModelCell* modelCell = modelslist.getCurrentModel(); + if (!modelCell || !modelCell->valid_rfData) { // in doubt, pretend it's unique return true; } - uint8_t modelId = mod_cell->modelId[moduleIdx]; - uint8_t type = mod_cell->moduleData[moduleIdx].type; - uint8_t rfProtocol = mod_cell->moduleData[moduleIdx].rfProtocol; + uint8_t modelId = modelCell->modelId[moduleIdx]; + uint8_t type = modelCell->moduleData[moduleIdx].type; + uint8_t rfProtocol = modelCell->moduleData[moduleIdx].rfProtocol; uint8_t additionalOnes = 0; char* curr = warn_buf; @@ -458,10 +458,10 @@ bool ModelsList::isModelIdUnique(uint8_t moduleIdx, char* warn_buf, size_t warn_ bool hit_found = false; const std::list& cats = modelslist.getCategories(); - std::list::const_iterator cat_it = cats.begin(); - for (;cat_it != cats.end(); cat_it++) { - for (ModelsCategory::const_iterator it = (*cat_it)->begin(); it != (*cat_it)->end(); it++) { - if (mod_cell == *it) + std::list::const_iterator catIt = cats.begin(); + for (;catIt != cats.end(); catIt++) { + for (ModelsCategory::const_iterator it = (*catIt)->begin(); it != (*catIt)->end(); it++) { + if (modelCell == *it) continue; if (!(*it)->valid_rfData) @@ -507,24 +507,21 @@ bool ModelsList::isModelIdUnique(uint8_t moduleIdx, char* warn_buf, size_t warn_ uint8_t ModelsList::findNextUnusedModelId(uint8_t moduleIdx) { - ModelCell* mod_cell = modelslist.getCurrentModel(); - if (!mod_cell || !mod_cell->valid_rfData) { + ModelCell * modelCell = modelslist.getCurrentModel(); + if (!modelCell || !modelCell->valid_rfData) { return 0; } - uint8_t type = mod_cell->moduleData[moduleIdx].type; - uint8_t rfProtocol = mod_cell->moduleData[moduleIdx].rfProtocol; + uint8_t type = modelCell->moduleData[moduleIdx].type; + uint8_t rfProtocol = modelCell->moduleData[moduleIdx].rfProtocol; - // assume 63 is the highest Model ID - // and use 64 bits - uint8_t usedModelIds[8]; + uint8_t usedModelIds[(MAX_RXNUM + 7) / 8]; memset(usedModelIds, 0, sizeof(usedModelIds)); - const std::list& cats = modelslist.getCategories(); - std::list::const_iterator cat_it = cats.begin(); - for (;cat_it != cats.end(); cat_it++) { - for (ModelsCategory::const_iterator it = (*cat_it)->begin(); it != (*cat_it)->end(); it++) { - if (mod_cell == *it) + const std::list & cats = modelslist.getCategories(); + for (auto catIt = cats.begin(); catIt != cats.end(); catIt++) { + for (auto it = (*catIt)->begin(); it != (*catIt)->end(); it++) { + if (modelCell == *it) continue; if (!(*it)->valid_rfData) @@ -536,25 +533,18 @@ uint8_t ModelsList::findNextUnusedModelId(uint8_t moduleIdx) (rfProtocol == (*it)->moduleData[moduleIdx].rfProtocol)) { uint8_t id = (*it)->modelId[moduleIdx]; - - uint8_t mask = 1; - for (uint8_t i = 1; i < (id & 7); i++) - mask <<= 1; - - usedModelIds[id >> 3] |= mask; + uint8_t mask = 1 << (id & 7u); + usedModelIds[id >> 3u] |= mask; } } } - uint8_t new_id = 1; - uint8_t tst_mask = 1; - for (;new_id < getMaxRxNum(moduleIdx); new_id++) { - if (!(usedModelIds[new_id >> 3] & tst_mask)) { + for (uint8_t id = 1; id <= getMaxRxNum(moduleIdx); id++) { + uint8_t mask = 1u << (id & 7u); + if (!(usedModelIds[id >> 3u] & mask)) { // found free ID - return new_id; + return id; } - if ((tst_mask <<= 1) == 0) - tst_mask = 1; } // failed finding something... From fe75834a805f0fa3d4e74309a369b6ad910d779e Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 3 Jan 2020 11:55:03 +0100 Subject: [PATCH 048/560] Missing TrainerChannels in Companion (#7245) --- .../src/firmwares/customfunctiondata.cpp | 2 + companion/src/firmwares/customfunctiondata.h | 1 + .../src/firmwares/opentx/opentxeeprom.cpp | 5 ++- companion/src/modeledit/customfunctions.cpp | 42 +++++++++---------- companion/src/releasenotesfirmwaredialog.cpp | 1 - 5 files changed, 27 insertions(+), 24 deletions(-) diff --git a/companion/src/firmwares/customfunctiondata.cpp b/companion/src/firmwares/customfunctiondata.cpp index c93e0965b..9313ace5a 100644 --- a/companion/src/firmwares/customfunctiondata.cpp +++ b/companion/src/firmwares/customfunctiondata.cpp @@ -55,6 +55,8 @@ QString CustomFunctionData::funcToString(const ModelData * model) const return tr("Trainer THR"); else if (func == FuncTrainerAIL) return tr("Trainer AIL"); + else if (func == FuncTrainerChannels) + return tr("Trainer Channels"); else if (func == FuncInstantTrim) return tr("Instant Trim"); else if (func == FuncPlaySound) diff --git a/companion/src/firmwares/customfunctiondata.h b/companion/src/firmwares/customfunctiondata.h index 2ffce6688..9150035c5 100644 --- a/companion/src/firmwares/customfunctiondata.h +++ b/companion/src/firmwares/customfunctiondata.h @@ -41,6 +41,7 @@ enum AssignFunc { FuncTrainerELE, FuncTrainerTHR, FuncTrainerAIL, + FuncTrainerChannels, FuncInstantTrim, FuncPlaySound, FuncPlayHaptic, diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index 9632be9e4..21e067a2d 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -1395,6 +1395,7 @@ class CustomFunctionsConversionTable: public ConversionTable { addConversion(FuncTrainerELE, val); addConversion(FuncTrainerTHR, val); addConversion(FuncTrainerAIL, val); + addConversion(FuncTrainerChannels, val); val++; addConversion(FuncInstantTrim, val++); @@ -1515,7 +1516,7 @@ class ArmCustomFunctionField: public TransformedField { *((uint16_t *)_param) = fn.param; *((uint8_t *)(_param+3)) = fn.func - FuncOverrideCH1; } - else if (fn.func >= FuncTrainer && fn.func <= FuncTrainerAIL) { + else if (fn.func >= FuncTrainer && fn.func <= FuncTrainerChannels) { *((uint8_t *)(_param+3)) = fn.func - FuncTrainer; } else if (fn.func >= FuncSetTimer1 && fn.func <= FuncSetTimer3) { @@ -1582,7 +1583,7 @@ class ArmCustomFunctionField: public TransformedField { fn.func = AssignFunc(fn.func + index); fn.param = (int)value; } - else if (fn.func >= FuncTrainer && fn.func <= FuncTrainerAIL) { + else if (fn.func >= FuncTrainer && fn.func <= FuncTrainerChannels) { fn.func = AssignFunc(fn.func + index); fn.param = value; } diff --git a/companion/src/modeledit/customfunctions.cpp b/companion/src/modeledit/customfunctions.cpp index c30454bdc..fdba765d8 100644 --- a/companion/src/modeledit/customfunctions.cpp +++ b/companion/src/modeledit/customfunctions.cpp @@ -70,7 +70,7 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model, GenericPanel(parent, model, generalSettings, firmware), functions(model ? model->customFn : generalSettings.customFn), mediaPlayerCurrent(-1), - mediaPlayer(NULL) + mediaPlayer(nullptr) { Stopwatch s1("CustomFunctionsPanel - populate"); lock = true; @@ -84,7 +84,7 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model, if (!firmware->getCapability(VoicesAsNumbers)) { tracksSet = getFilesSet(getSoundsPath(generalSettings), QStringList() << "*.wav" << "*.WAV", firmware->getCapability(VoicesMaxLength)); for (int i=0; igetBoard())) { scriptsSet = getFilesSet(g.profile[g.id()].sdPath() + "/SCRIPTS/FUNCTIONS", QStringList() << "*.lua", firmware->getCapability(VoicesMaxLength)); for (int i=0; i=FuncOverrideCH1 && func<=FuncOverrideCH32) { + if (func >= FuncOverrideCH1 && func <= FuncOverrideCH32) { if (model) { int channelsMax = model->getChannelsMax(true); fswtchParam[i]->setDecimals(0); @@ -403,7 +403,7 @@ void CustomFunctionsPanel::refreshCustomFunction(int i, bool modified) widgetsMask |= CUSTOM_FUNCTION_NUMERIC_PARAM | CUSTOM_FUNCTION_ENABLE; } } - else if (func==FuncLogs) { + else if (func == FuncLogs) { fswtchParam[i]->setDecimals(1); fswtchParam[i]->setMinimum(0); fswtchParam[i]->setMaximum(25.5); @@ -413,13 +413,13 @@ void CustomFunctionsPanel::refreshCustomFunction(int i, bool modified) fswtchParam[i]->setValue(cfn.param/10.0); widgetsMask |= CUSTOM_FUNCTION_NUMERIC_PARAM; } - else if (func>=FuncAdjustGV1 && func<=FuncAdjustGVLast) { + else if (func >= FuncAdjustGV1 && func <= FuncAdjustGVLast) { int gvidx = func - FuncAdjustGV1; if (modified) cfn.adjustMode = fswtchGVmode[i]->currentIndex(); fswtchGVmode[i]->setCurrentIndex(cfn.adjustMode); widgetsMask |= CUSTOM_FUNCTION_GV_MODE | CUSTOM_FUNCTION_ENABLE; - if (cfn.adjustMode==FUNC_ADJUST_GVAR_CONSTANT || cfn.adjustMode==FUNC_ADJUST_GVAR_INCDEC) { + if (cfn.adjustMode == FUNC_ADJUST_GVAR_CONSTANT || cfn.adjustMode == FUNC_ADJUST_GVAR_INCDEC) { if (modified) cfn.param = fswtchParam[i]->value() * model->gvarData[gvidx].multiplierSet(); if (IS_ARM(getCurrentBoard())) { @@ -454,13 +454,13 @@ void CustomFunctionsPanel::refreshCustomFunction(int i, bool modified) widgetsMask |= CUSTOM_FUNCTION_SOURCE_PARAM; } } - else if (func==FuncReset) { + else if (func == FuncReset) { if (modified) cfn.param = fswtchParamT[i]->currentData().toInt(); populateFuncParamCB(fswtchParamT[i], func, cfn.param); widgetsMask |= CUSTOM_FUNCTION_SOURCE_PARAM | CUSTOM_FUNCTION_ENABLE; } - else if (func>=FuncSetTimer1 && func<=FuncSetTimer3) { + else if (func >= FuncSetTimer1 && func <= FuncSetTimer3) { if (modified) cfn.param = fswtchParamTime[i]->timeInSeconds(); RawSourceRange range = RawSource(SOURCE_TYPE_SPECIAL, func - FuncSetTimer1 + 2).getRange(model, generalSettings); @@ -468,39 +468,39 @@ void CustomFunctionsPanel::refreshCustomFunction(int i, bool modified) fswtchParamTime[i]->setTime(cfn.param); widgetsMask |= CUSTOM_FUNCTION_TIME_PARAM | CUSTOM_FUNCTION_ENABLE; } - else if (func>=FuncSetFailsafeInternalModule && func<=FuncBindExternalModule) { + else if (func >= FuncSetFailsafeInternalModule && func <= FuncBindExternalModule) { widgetsMask |= CUSTOM_FUNCTION_ENABLE; } - else if (func==FuncVolume) { + else if (func == FuncVolume) { if (modified) cfn.param = fswtchParamT[i]->currentData().toInt(); populateFuncParamCB(fswtchParamT[i], func, cfn.param); widgetsMask |= CUSTOM_FUNCTION_SOURCE_PARAM | CUSTOM_FUNCTION_ENABLE; } - else if (func==FuncPlaySound || func==FuncPlayHaptic || func==FuncPlayValue || func==FuncPlayPrompt || func==FuncPlayBoth || func==FuncBackgroundMusic) { + else if (func == FuncPlaySound || func == FuncPlayHaptic || func == FuncPlayValue || func == FuncPlayPrompt || func == FuncPlayBoth || func == FuncBackgroundMusic) { if (func != FuncBackgroundMusic) { widgetsMask |= CUSTOM_FUNCTION_REPEAT; fswtchRepeat[i]->update(); } - if (func==FuncPlayValue) { + if (func == FuncPlayValue) { if (modified) cfn.param = fswtchParamT[i]->currentData().toInt(); populateFuncParamCB(fswtchParamT[i], func, cfn.param); widgetsMask |= CUSTOM_FUNCTION_SOURCE_PARAM | CUSTOM_FUNCTION_REPEAT; } - else if (func==FuncPlayPrompt || func==FuncPlayBoth) { + else if (func == FuncPlayPrompt || func == FuncPlayBoth) { if (firmware->getCapability(VoicesAsNumbers)) { fswtchParam[i]->setDecimals(0); fswtchParam[i]->setSingleStep(1); fswtchParam[i]->setMinimum(0); - if (func==FuncPlayPrompt) { + if (func == FuncPlayPrompt) { widgetsMask |= CUSTOM_FUNCTION_NUMERIC_PARAM | CUSTOM_FUNCTION_REPEAT | CUSTOM_FUNCTION_GV_TOOGLE; } else { widgetsMask |= CUSTOM_FUNCTION_NUMERIC_PARAM | CUSTOM_FUNCTION_REPEAT; fswtchParamGV[i]->setChecked(false); } - fswtchParam[i]->setMaximum(func==FuncPlayBoth ? 254 : 255); + fswtchParam[i]->setMaximum(func == FuncPlayBoth ? 254 : 255); if (modified) { if (fswtchParamGV[i]->isChecked()) { fswtchParam[i]->setMinimum(1); @@ -533,7 +533,7 @@ void CustomFunctionsPanel::refreshCustomFunction(int i, bool modified) } } } - else if (func==FuncBackgroundMusic) { + else if (func == FuncBackgroundMusic) { widgetsMask |= CUSTOM_FUNCTION_FILE_PARAM; if (modified) { Helpers::getFileComboBoxValue(fswtchParamArmT[i], cfn.paramarm, firmware->getCapability(VoicesMaxLength)); @@ -543,27 +543,27 @@ void CustomFunctionsPanel::refreshCustomFunction(int i, bool modified) widgetsMask |= CUSTOM_FUNCTION_PLAY; } } - else if (func==FuncPlaySound) { + else if (func == FuncPlaySound) { if (modified) cfn.param = (uint8_t)fswtchParamT[i]->currentIndex(); populateFuncParamCB(fswtchParamT[i], func, cfn.param); widgetsMask |= CUSTOM_FUNCTION_SOURCE_PARAM; } - else if (func==FuncPlayHaptic) { + else if (func == FuncPlayHaptic) { if (modified) cfn.param = (uint8_t)fswtchParamT[i]->currentIndex(); populateFuncParamCB(fswtchParamT[i], func, cfn.param); widgetsMask |= CUSTOM_FUNCTION_SOURCE_PARAM; } } - else if (func==FuncPlayScript) { + else if (func == FuncPlayScript) { widgetsMask |= CUSTOM_FUNCTION_FILE_PARAM; if (modified) { Helpers::getFileComboBoxValue(fswtchParamArmT[i], cfn.paramarm, 8); } Helpers::populateFileComboBox(fswtchParamArmT[i], scriptsSet, cfn.paramarm); } - else if (func==FuncBacklight && IS_TARANIS_PLUS(getCurrentBoard())) { + else if (func == FuncBacklight && IS_TARANIS_PLUS(getCurrentBoard())) { if (modified) cfn.param = (uint8_t)fswtchBLcolor[i]->value(); fswtchBLcolor[i]->setValue(cfn.param); diff --git a/companion/src/releasenotesfirmwaredialog.cpp b/companion/src/releasenotesfirmwaredialog.cpp index bcce6709c..753599c52 100644 --- a/companion/src/releasenotesfirmwaredialog.cpp +++ b/companion/src/releasenotesfirmwaredialog.cpp @@ -50,4 +50,3 @@ void ReleaseNotesFirmwareDialog::replyFinished(QNetworkReply * reply) ui->textEditor->setOpenExternalLinks(true); reply->deleteLater(); } - From a697706a4e8caad352a9af7f4fb411d8db9b0812 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 3 Jan 2020 11:55:59 +0100 Subject: [PATCH 049/560] Fix to some sdcard sync issues ? (#7258) --- companion/src/process_sync.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/companion/src/process_sync.h b/companion/src/process_sync.h index 67a139791..4fffc4d66 100644 --- a/companion/src/process_sync.h +++ b/companion/src/process_sync.h @@ -85,7 +85,7 @@ class SyncProcess : public QObject maxFileSize = 2 * 1024 * 1024; logLevel = QtWarningMsg; flags = OPT_RECURSIVE; - dirFilterFlags = QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot | QDir::Readable; + dirFilterFlags = QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot; } friend inline QDebug operator<<(QDebug debug, const SyncOptions &o) { From 3e4c67b273375254793901f3d9766186319aef72 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 3 Jan 2020 12:01:15 +0100 Subject: [PATCH 050/560] Code cleaning --- radio/src/targets/taranis/board.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 54127d6d1..1112ea0e9 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -529,15 +529,19 @@ enum Analogs { #define NUM_MOUSE_ANALOGS 0 #define STORAGE_NUM_MOUSE_ANALOGS 0 +#if defined(PCBXLITE) + #define NUM_TRIMS_KEYS 4 +#else + #define NUM_TRIMS_KEYS (NUM_TRIMS * 2) +#endif + #if defined(STICKS_PWM) #define NUM_PWMSTICKS 4 #define STICKS_PWM_ENABLED() (!hardwareOptions.sticksPwmDisabled) void sticksPwmInit(); void sticksPwmRead(uint16_t * values); extern volatile uint32_t pwm_interrupt_count; // TODO => reusable buffer (boot section) - #define NUM_TRIMS_KEYS 4 #else - #define NUM_TRIMS_KEYS 8 #define STICKS_PWM_ENABLED() false #endif From abc70f1a5ac8cf04284f33f25e5a01ceb987a9ae Mon Sep 17 00:00:00 2001 From: Andre Bernet Date: Fri, 3 Jan 2020 12:16:26 +0100 Subject: [PATCH 051/560] Buttons for trims T5 and T6 were not working in simu (fix #7167) (#7243) Buttons for trims T5 and T6 were not working in simu (fix #7167) --- radio/src/dataconstants.h | 2 +- radio/src/simu.cpp | 2 +- radio/src/targets/simu/simpgmspace.cpp | 20 ++++++++++---------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 1af8efdb6..c8e5b3ca0 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -581,7 +581,7 @@ enum SwitchSources { #define SWSRC_TRAINER SWSRC_LAST_SWITCH, #endif -#define SWSRC_LAST_TRIM (SWSRC_FIRST_TRIM + 2*NUM_TRIMS - 1) +#define SWSRC_LAST_TRIM (SWSRC_FIRST_TRIM + 2 * NUM_TRIMS - 1) enum MixSources { MIXSRC_NONE, diff --git a/radio/src/simu.cpp b/radio/src/simu.cpp index 80ad85e80..293170127 100644 --- a/radio/src/simu.cpp +++ b/radio/src/simu.cpp @@ -297,7 +297,7 @@ void OpenTxSim::updateKeysAndSwitches(bool start) static FXuint trimKeys[] = { KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_F12 }; #endif - for (unsigned i=0; i<2*NUM_TRIMS; i++) { + for (unsigned i=0; igetKeyState(trimKeys[i])); } diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index 12d5342d7..4e1cdf535 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -149,7 +149,7 @@ void simuSetKey(uint8_t key, bool state) keysStates[key] = state; } -bool trimsStates[NUM_TRIMS * 2] = { false }; +bool trimsStates[NUM_TRIMS_KEYS] = { false }; void simuSetTrim(uint8_t trim, bool state) { // TRACE("simuSetTrim(%d, %d)", trim, state); @@ -486,17 +486,17 @@ void pwrOff() void readKeysAndTrims() { uint8_t index = 0; - uint32_t keys_input = readKeys(); - for (uint8_t i = 1; i != uint8_t(1 << TRM_BASE); i <<= 1) { - keys[index++].input(keys_input & i); + auto keysInput = readKeys(); + for (auto mask = (1 << 0); mask < (1 << TRM_BASE); mask <<= 1) { + keys[index++].input(keysInput & mask); } - uint32_t trims_input = readTrims(); - for (uint8_t i = 1; i != uint8_t(1 << 8); i <<= 1) { - keys[index++].input(trims_input & i); + auto trimsInput = readTrims(); + for (auto mask = (1 << 0); mask < (1 << NUM_TRIMS_KEYS); mask <<= 1) { + keys[index++].input(trimsInput & mask); } - if (keys_input || trims_input) { + if (keysInput || trimsInput) { backlightOn(); } } @@ -515,7 +515,7 @@ uint32_t readKeys() { uint32_t result = 0; - for (int i=0; i Date: Fri, 3 Jan 2020 12:18:52 +0100 Subject: [PATCH 052/560] Rework pwr_driver (#7212) PWR driver rework --- .../arm/stm32/bootloader/CMakeLists.txt | 2 +- .../arm/stm32}/pwr_driver.cpp | 30 +++-- radio/src/targets/horus/CMakeLists.txt | 2 +- radio/src/targets/horus/hal.h | 2 + radio/src/targets/horus/pwr_driver.cpp | 109 ------------------ radio/src/targets/taranis/CMakeLists.txt | 10 +- radio/src/targets/taranis/board.h | 16 +-- radio/src/targets/taranis/hal.h | 30 ++--- 8 files changed, 56 insertions(+), 145 deletions(-) rename radio/src/targets/{taranis => common/arm/stm32}/pwr_driver.cpp (89%) delete mode 100644 radio/src/targets/horus/pwr_driver.cpp diff --git a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt index 5bc11cc2d..86f4594f9 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt +++ b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt @@ -75,7 +75,7 @@ set(BOOTLOADER_SRC ../../../../../targets/${TARGET_DIR}/keys_driver.cpp ../../../../../targets/${TARGET_DIR}/diskio.cpp ../../../../../targets/${TARGET_DIR}/board.cpp - ../../../../../targets/${TARGET_DIR}/pwr_driver.cpp + ../pwr_driver.cpp ../../../../../targets/${TARGET_DIR}/bootloader/boot_menu.cpp ../usbd_usr.cpp ../usbd_storage_msd.cpp diff --git a/radio/src/targets/taranis/pwr_driver.cpp b/radio/src/targets/common/arm/stm32/pwr_driver.cpp similarity index 89% rename from radio/src/targets/taranis/pwr_driver.cpp rename to radio/src/targets/common/arm/stm32/pwr_driver.cpp index 997937d9f..751279da8 100644 --- a/radio/src/targets/taranis/pwr_driver.cpp +++ b/radio/src/targets/common/arm/stm32/pwr_driver.cpp @@ -23,17 +23,14 @@ void pwrInit() { GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - // Board PWR - GPIO_InitStructure.GPIO_Pin = PWR_ON_GPIO_PIN; - GPIO_Init(PWR_ON_GPIO, &GPIO_InitStructure); - #if defined(INTMODULE_BOOTCMD_GPIO) - GPIO_SetBits(INTMODULE_BOOTCMD_GPIO, INTMODULE_BOOTCMD_GPIO_PIN); + INIT_INTMODULE_BOOTCMD_PIN(); GPIO_InitStructure.GPIO_Pin = INTMODULE_BOOTCMD_GPIO_PIN; GPIO_Init(INTMODULE_BOOTCMD_GPIO, &GPIO_InitStructure); #endif @@ -54,23 +51,32 @@ void pwrInit() GPIO_InitStructure.GPIO_Pin = PWR_SWITCH_GPIO_PIN; GPIO_Init(PWR_SWITCH_GPIO, &GPIO_InitStructure); +#if defined(PCBREV_HARDCODED) + hardwareOptions.pcbrev = PCBREV_HARDCODED; +#elif defined(PCBREV_GPIO_PIN) + GPIO_ResetBits(PCBREV_GPIO, PCBREV_GPIO_PIN); + GPIO_InitStructure.GPIO_Pin = PCBREV_GPIO_PIN; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; + GPIO_Init(PCBREV_GPIO, &GPIO_InitStructure); + hardwareOptions.pcbrev = PCBREV_VALUE(); +#endif + #if defined(TRAINER_DETECT_GPIO_PIN) GPIO_InitStructure.GPIO_Pin = TRAINER_DETECT_GPIO_PIN; GPIO_Init(TRAINER_DETECT_GPIO, &GPIO_InitStructure); #endif +#if defined(SD_PRESENT_GPIO_PIN) + GPIO_ResetBits(SD_PRESENT_GPIO, SD_PRESENT_GPIO_PIN); + GPIO_InitStructure.GPIO_Pin = SD_PRESENT_GPIO_PIN; + GPIO_Init(SD_PRESENT_GPIO, &GPIO_InitStructure); +#endif + #if defined(INTMODULE_USART) && defined(TRAINER_MODULE_CPPM_GPIO_PIN) GPIO_SetBits(TRAINER_MODULE_CPPM_GPIO, TRAINER_MODULE_CPPM_GPIO_PIN); GPIO_InitStructure.GPIO_Pin = TRAINER_MODULE_CPPM_GPIO_PIN; GPIO_Init(TRAINER_MODULE_CPPM_GPIO, &GPIO_InitStructure); #endif - -#if defined(PCBREV_GPIO_PIN) - GPIO_ResetBits(PCBREV_GPIO, PCBREV_GPIO_PIN); - GPIO_InitStructure.GPIO_Pin = PCBREV_GPIO_PIN; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; - GPIO_Init(PCBREV_GPIO, &GPIO_InitStructure); -#endif } void pwrOn() diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index 987e4e81f..ef9b75c42 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -207,7 +207,7 @@ set(FIRMWARE_TARGET_SRC ${LCD_DRIVER} board.cpp backlight_driver.cpp - pwr_driver.cpp + ../common/arm/stm32/pwr_driver.cpp sdram_driver.c startup_stm32f42_43xxx.s ../common/arm/stm32/sdio_sd.c diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 38f017bcb..6f226d7b9 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -616,6 +616,7 @@ #define INTMODULE_BOOTCMD_GPIO GPIOI #define INTMODULE_BOOTCMD_GPIO_PIN GPIO_Pin_9 // PI.09 #endif +#define INIT_INTMODULE_BOOTCMD_PIN() GPIO_ResetBits(INTMODULE_BOOTCMD_GPIO, INTMODULE_BOOTCMD_GPIO_PIN); #if defined(PCBX10) || PCBREV >= 13 #define INTMODULE_RCC_APB1Periph RCC_APB1Periph_TIM2 #define INTMODULE_RCC_APB2Periph RCC_APB2Periph_USART1 @@ -635,6 +636,7 @@ // External Module #define EXTMODULE_PWR_GPIO GPIOB #define EXTMODULE_PWR_GPIO_PIN GPIO_Pin_3 // PB.03 +#define EXTERNAL_MODULE_PWR_OFF() GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) #if defined(PCBX10) && defined(PCBREV_EXPRESS) #define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1) #define EXTMODULE_RCC_APB1Periph (RCC_APB1Periph_TIM2 | RCC_APB1Periph_USART3) diff --git a/radio/src/targets/horus/pwr_driver.cpp b/radio/src/targets/horus/pwr_driver.cpp deleted file mode 100644 index 2b08f2b2b..000000000 --- a/radio/src/targets/horus/pwr_driver.cpp +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "board.h" -#include "storage/rtc_backup.h" - -void pwrInit() -{ - GPIO_InitTypeDef GPIO_InitStructure; - - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - - // Internal module PWR - GPIO_ResetBits(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN); - GPIO_InitStructure.GPIO_Pin = INTMODULE_PWR_GPIO_PIN; - GPIO_Init(INTMODULE_PWR_GPIO, &GPIO_InitStructure); - - // External module PWR - GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN); - GPIO_InitStructure.GPIO_Pin = EXTMODULE_PWR_GPIO_PIN; - GPIO_Init(EXTMODULE_PWR_GPIO, &GPIO_InitStructure); - -#if defined(INTMODULE_BOOTCMD_GPIO) - GPIO_ResetBits(INTMODULE_BOOTCMD_GPIO, INTMODULE_BOOTCMD_GPIO_PIN); - GPIO_InitStructure.GPIO_Pin = INTMODULE_BOOTCMD_GPIO_PIN; - GPIO_Init(INTMODULE_BOOTCMD_GPIO, &GPIO_InitStructure); -#endif - - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; - - // PWR SWITCH - GPIO_InitStructure.GPIO_Pin = PWR_SWITCH_GPIO_PIN; - GPIO_Init(PWR_SWITCH_GPIO, &GPIO_InitStructure); - -#if defined(PCBREV_GPIO_PIN) - // PCBREV - GPIO_InitStructure.GPIO_Pin = PCBREV_GPIO_PIN; - GPIO_Init(PCBREV_GPIO, &GPIO_InitStructure); - hardwareOptions.pcbrev = PCBREV_VALUE(); -#endif - - // SD-DETECT PIN - GPIO_ResetBits(SD_PRESENT_GPIO, SD_PRESENT_GPIO_PIN); - GPIO_InitStructure.GPIO_Pin = SD_PRESENT_GPIO_PIN; - GPIO_Init(SD_PRESENT_GPIO, &GPIO_InitStructure); - - // TRAINER DETECT PIN - GPIO_InitStructure.GPIO_Pin = TRAINER_DETECT_GPIO_PIN; - GPIO_Init(TRAINER_DETECT_GPIO, &GPIO_InitStructure); -} - -void pwrOn() -{ - // we keep the init of the PIN to have pwrOn as quick as possible - - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Pin = PWR_ON_GPIO_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_Init(PWR_ON_GPIO, &GPIO_InitStructure); - - GPIO_SetBits(PWR_ON_GPIO, PWR_ON_GPIO_PIN); -} - -void pwrOff() -{ - GPIO_ResetBits(PWR_ON_GPIO, PWR_ON_GPIO_PIN); -} - -bool pwrPressed() -{ - return GPIO_ReadInputDataBit(PWR_ON_GPIO, PWR_SWITCH_GPIO_PIN) == Bit_RESET; -} - -void pwrResetHandler() -{ - RCC->AHB1ENR |= PWR_RCC_AHB1Periph; - - // these two NOPs are needed (see STM32F errata sheet) before the peripheral - // register can be written after the peripheral clock was enabled - __ASM volatile ("nop"); - __ASM volatile ("nop"); - - if (WAS_RESET_BY_WATCHDOG_OR_SOFTWARE()) { - pwrOn(); - } -} diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index f2cc53add..db593064e 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -160,6 +160,14 @@ elseif(PCB STREQUAL X7) set(BLUETOOTH YES) add_definitions(-DBLUETOOTH_PROBE) set(ROTARY_ENCODER YES) + if(DEFINED PCBREV_HARDCODED) + # This *can* be used to prevent messing with PA14 (SWCLK), so stlink can be used + # without interruptions. + if(NOT ${PCBREV_HARDCODED} MATCHES "^[0-1]$") + message(FATAL_ERROR "PCBREV_HARDCODED must be 0 or 1, not '${PCBREV_HARDCODED}'") + endif() + add_definitions(-DPCBREV_HARDCODED=${PCBREV_HARDCODED}) + endif() endif() elseif(PCB STREQUAL X9LITE) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" OFF) @@ -379,7 +387,7 @@ set(FIRMWARE_TARGET_SRC ${LCD_DRIVER} board.cpp i2c_driver.cpp - pwr_driver.cpp + ../common/arm/stm32/pwr_driver.cpp ../common/arm/loadboot.cpp ) diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 1112ea0e9..b10a13186 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -61,6 +61,13 @@ void boardOff(); void init2MhzTimer(); void init5msTimer(); +// PCBREV driver +enum { + // X7 + PCBREV_X7_STD = 0, + PCBREV_X7_40 = 1, +}; + // SD driver #define BLOCK_SIZE 512 /* Block Size in Bytes */ #if !defined(SIMU) || defined(SIMU_DISKIO) @@ -545,16 +552,11 @@ enum Analogs { #define STICKS_PWM_ENABLED() false #endif -#if NUM_PWMSTICKS > 0 PACK(typedef struct { + uint8_t pcbrev:2; uint8_t sticksPwmDisabled:1; uint8_t pxx2Enabled:1; }) HardwareOptions; -#else -PACK(typedef struct { - uint8_t pxx2Enabled:1; -}) HardwareOptions; -#endif extern HardwareOptions hardwareOptions; @@ -705,7 +707,7 @@ void telemetryPortInvertedInit(uint32_t baudrate); #if defined(PCBX7ACCESS) #define HAS_SPORT_UPDATE_CONNECTOR() true #elif defined(PCBX7) - #define IS_PCBREV_40() (GPIO_ReadInputDataBit(PCBREV_GPIO, PCBREV_GPIO_PIN) == Bit_SET) + #define IS_PCBREV_40() (hardwareOptions.pcbrev == PCBREV_X7_40) #define HAS_SPORT_UPDATE_CONNECTOR() IS_PCBREV_40() #elif defined(SPORT_UPDATE_PWR_GPIO) #define HAS_SPORT_UPDATE_CONNECTOR() true diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 0217d173a..2a7ca0ad9 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -986,23 +986,24 @@ #define INTMODULE_PWR_GPIO GPIOD #define INTMODULE_PWR_GPIO_PIN GPIO_Pin_9 // PD.09 #endif - #define INTMODULE_GPIO GPIOB - #define INTMODULE_TX_GPIO_PIN GPIO_Pin_6 // PB.06 - #define INTMODULE_RX_GPIO_PIN GPIO_Pin_7 // PB.07 - #define INTMODULE_GPIO_PinSource_TX GPIO_PinSource6 - #define INTMODULE_GPIO_PinSource_RX GPIO_PinSource7 - #define INTMODULE_USART USART1 - #define INTMODULE_GPIO_AF GPIO_AF_USART1 - #define INTMODULE_USART_IRQHandler USART1_IRQHandler - #define INTMODULE_USART_IRQn USART1_IRQn - #define INTMODULE_DMA_STREAM DMA2_Stream7 + #define INTMODULE_GPIO GPIOB + #define INTMODULE_TX_GPIO_PIN GPIO_Pin_6 // PB.06 + #define INTMODULE_RX_GPIO_PIN GPIO_Pin_7 // PB.07 + #define INTMODULE_GPIO_PinSource_TX GPIO_PinSource6 + #define INTMODULE_GPIO_PinSource_RX GPIO_PinSource7 + #define INTMODULE_USART USART1 + #define INTMODULE_GPIO_AF GPIO_AF_USART1 + #define INTMODULE_USART_IRQHandler USART1_IRQHandler + #define INTMODULE_USART_IRQn USART1_IRQn + #define INTMODULE_DMA_STREAM DMA2_Stream7 #define INTMODULE_DMA_STREAM_IRQ DMA2_Stream7_IRQn #define INTMODULE_DMA_STREAM_IRQHandler DMA2_Stream7_IRQHandler - #define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF7 - #define INTMODULE_DMA_CHANNEL DMA_Channel_4 + #define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF7 + #define INTMODULE_DMA_CHANNEL DMA_Channel_4 #if defined(PCBXLITES) - #define INTMODULE_BOOTCMD_GPIO GPIOC - #define INTMODULE_BOOTCMD_GPIO_PIN GPIO_Pin_8 // PC.08 + #define INTMODULE_BOOTCMD_GPIO GPIOC + #define INTMODULE_BOOTCMD_GPIO_PIN GPIO_Pin_8 // PC.08 + #define INIT_INTMODULE_BOOTCMD_PIN() GPIO_SetBits(INTMODULE_BOOTCMD_GPIO, INTMODULE_BOOTCMD_GPIO_PIN); #endif #elif defined(RADIO_X9DP2019) #define INTMODULE_RCC_APB1Periph 0 @@ -1374,6 +1375,7 @@ #define PCBREV_RCC_AHB1Periph RCC_AHB1Periph_GPIOA #define PCBREV_GPIO GPIOA #define PCBREV_GPIO_PIN GPIO_Pin_14 // PA.14 + #define PCBREV_VALUE() GPIO_ReadInputDataBit(PCBREV_GPIO, PCBREV_GPIO_PIN) #else #define PCBREV_RCC_AHB1Periph 0 #endif From cf7e45d7cd810a3edc0471b02b58b6df6229f87d Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 3 Jan 2020 12:32:14 +0100 Subject: [PATCH 053/560] #7210 merged (thanks Fiam) --- radio/src/opentx.cpp | 8 ++++++++ radio/src/opentx.h | 2 +- radio/src/syscalls.c | 17 ++++++++--------- radio/src/targets/horus/board.cpp | 8 -------- 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 3bf65563f..5805f3161 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1979,12 +1979,20 @@ void opentxInit() WDG_ENABLE(WDG_DURATION); } +#if defined(SEMIHOSTING) +extern "C" void initialise_monitor_handles(); +#endif + #if defined(SIMU) void simuMain() #else int main() #endif { +#if defined(SEMIHOSTING) + initialise_monitor_handles(); +#endif + #if defined(STM32) TRACE("reusableBuffer: modelSel=%d, moduleSetup=%d, calib=%d, sdManager=%d, hardwareAndSettings=%d, spectrumAnalyser=%d, usb=%d", sizeof(reusableBuffer.modelsel), diff --git a/radio/src/opentx.h b/radio/src/opentx.h index addf87c1a..f7e0b411f 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -481,7 +481,7 @@ extern uint8_t flightModeTransitionLast; #if defined(SIMU) inline int availableMemory() { return 1000; } -#elif !defined(SIMU) +#else extern unsigned char *heap; extern int _end; extern int _heap_end; diff --git a/radio/src/syscalls.c b/radio/src/syscalls.c index b80ae58e9..369566877 100644 --- a/radio/src/syscalls.c +++ b/radio/src/syscalls.c @@ -73,7 +73,7 @@ extern int _close(int file) extern int _fstat(int file, struct stat * st) { - st->st_mode = S_IFCHR ; + st->st_mode = S_IFCHR; return 0; } @@ -97,6 +97,12 @@ extern int _write(int file, char *ptr, int len) return 0; } +extern int _getpid() +{ + return -1; +} +#endif + extern void _exit(int status) { TRACE("_exit(%d)", status); @@ -105,12 +111,5 @@ extern void _exit(int status) extern void _kill(int pid, int sig) { - return ; + return; } - -extern int _getpid() -{ - return -1 ; -} -#endif - diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp index 048817c69..ac6e4e1f8 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -41,10 +41,6 @@ void watchdogInit(unsigned int duration) IWDG->KR = 0xCCCC; // start } -#if defined(SEMIHOSTING) -extern "C" void initialise_monitor_handles(); -#endif - #if defined(PCBX10) && !defined(RADIO_T16) void sportUpdateInit() { @@ -70,10 +66,6 @@ void sportUpdatePowerOff() void boardInit() { -#if defined(SEMIHOSTING) - initialise_monitor_handles(); -#endif - RCC_AHB1PeriphClockCmd(PWR_RCC_AHB1Periph | PCBREV_RCC_AHB1Periph | LED_RCC_AHB1Periph | From 653d260a608c8af01a05bc67315c317164cb669f Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 3 Jan 2020 13:21:26 +0100 Subject: [PATCH 054/560] Update companion multi parts to bring in line with radio (#7237) --- companion/src/firmwares/moduledata.h | 4 +++- companion/src/firmwares/multiprotocols.cpp | 9 ++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/companion/src/firmwares/moduledata.h b/companion/src/firmwares/moduledata.h index 6d6795c58..caeaad833 100644 --- a/companion/src/firmwares/moduledata.h +++ b/companion/src/firmwares/moduledata.h @@ -117,7 +117,9 @@ enum MultiModuleRFProtocols { MODULE_SUBTYPE_MULTI_SCANNER, MODULE_SUBTYPE_MULTI_FRSKYX_RX, MODULE_SUBTYPE_MULTI_AFHDS2A_RX, - MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_AFHDS2A_RX + MODULE_SUBTYPE_MULTI_HOTT, + MODULE_SUBTYPE_MULTI_FX816, + MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_FX816 }; enum TrainerProtocol { diff --git a/companion/src/firmwares/multiprotocols.cpp b/companion/src/firmwares/multiprotocols.cpp index f1b37bae0..18b7035a9 100644 --- a/companion/src/firmwares/multiprotocols.cpp +++ b/companion/src/firmwares/multiprotocols.cpp @@ -72,6 +72,8 @@ static const QStringList STR_SUBTYPE_POTENSIC {"A20 Firefly"}; static const QStringList STR_SUBTYPE_ZSX {"JJRC ZSX-280"}; static const QStringList STR_SUBTYPE_FLYZONE {"FZ-410 TX"}; static const QStringList STR_SUBTYPE_FRSKYX_RX {"D16 FCC", "D16 LBT"}; +static const QStringList STR_SUBTYPE_FX816 {"P38"}; +static const QStringList STR_SUBTYPE_ESKY150 {"4CH", "7CH"}; static const QStringList NO_SUBTYPE {STR_MULTI_DEFAULT}; @@ -118,6 +120,11 @@ const Multiprotocols multiProtocols { {MODULE_SUBTYPE_MULTI_ZSX, 0, false, STR_SUBTYPE_ZSX, nullptr}, {MODULE_SUBTYPE_MULTI_FLYZONE, 0, false, STR_SUBTYPE_FLYZONE, nullptr}, {MODULE_SUBTYPE_MULTI_FRSKYX_RX, 1, false, STR_SUBTYPE_FRSKYX_RX, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_ESky, 0, false, NO_SUBTYPE, nullptr}, + {MODULE_SUBTYPE_MULTI_J6PRO, 0, false, NO_SUBTYPE, nullptr}, + {MODULE_SUBTYPE_MULTI_ESKY150, 1, false, STR_SUBTYPE_ESKY150, nullptr}, + {MODULE_SUBTYPE_MULTI_FX816, 0, false, STR_SUBTYPE_FX816, nullptr}, + {MODULE_SUBTYPE_MULTI_HOTT, 0, true, NO_SUBTYPE, STR_MULTI_RFTUNE}, {MM_RF_CUSTOM_SELECTED, 7, true, STR_SUBTYPE_CUSTOM, STR_MULTI_OPTION}, // Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff) @@ -160,7 +167,7 @@ QString Multiprotocols::protocolToString(int protocol, bool custom) "Bayang", "ESky", "MT99XX", "MJXQ", "Shenqi", "FY326", "SFHSS", "J6 PRO","FQ777","Assan","Hontai","Open LRS", "FlySky AFHDS2A", "Q2x2", "Walkera", "Q303", "GW008", "DM002", "Cabell", "ESky 150", "H8 3D", "Corona", "CFlie", "Hitec", "Wfly", "Bugs", "Bugs Mini", "Traxxas", "NCC-1701-A", "E01X", "WL Heli V911S", "GD00X", "Volantex V761", - "KFPlan KF606", "Redpine", "Potensic", "ZXS", "FlyZone", "Scanner", "FrSky RX", "FlySky AFHDS2A RX" + "KFPlan KF606", "Redpine", "Potensic", "ZXS", "FlyZone", "Scanner", "FrSky RX", "FlySky AFHDS2A RX", "HoTT", "Fx816" }); if (protocol == MM_RF_CUSTOM_SELECTED || custom) From 27fad646bd7e22e8a6d133bd86a529549c3ab998 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 4 Jan 2020 00:30:31 +0100 Subject: [PATCH 055/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index b28f50d0e..ce69f45ad 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1681,3 +1681,4 @@ Outward Ideas Sylvie Le Madec James Houck (monthly) Frank Steinmetz +Gary Garland From dc3e9b41539de7323e580cca47d159415a14bf2d Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 6 Jan 2020 09:07:46 +0100 Subject: [PATCH 056/560] Lets pretend it never happened... (#7271) --- companion/src/generaledit/generalsetup.cpp | 4 ++-- companion/src/generaledit/generalsetup.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/companion/src/generaledit/generalsetup.cpp b/companion/src/generaledit/generalsetup.cpp index 5e1bcd13c..38db4d31a 100644 --- a/companion/src/generaledit/generalsetup.cpp +++ b/companion/src/generaledit/generalsetup.cpp @@ -750,11 +750,11 @@ void GeneralSetupPanel::on_blAlarm_ChkB_stateChanged() emit modified(); } -void GeneralSetupPanel::on_ownerID_editingFinished() +void GeneralSetupPanel::on_registrationId_editingFinished() { //copy ownerID back to generalSettings.registrationId QByteArray array = ui->registrationId->text().toLocal8Bit(); - strncpy(generalSettings.registrationId, "pafleraf", 9); + strncpy(generalSettings.registrationId, array, 8); generalSettings.registrationId[8] = '\0'; emit modified(); } diff --git a/companion/src/generaledit/generalsetup.h b/companion/src/generaledit/generalsetup.h index 53a1286eb..34aeaaa71 100644 --- a/companion/src/generaledit/generalsetup.h +++ b/companion/src/generaledit/generalsetup.h @@ -87,7 +87,7 @@ class GeneralSetupPanel : public GeneralPanel void on_vBatMinDSB_editingFinished(); void on_vBatMaxDSB_editingFinished(); void on_contrastSB_editingFinished(); - void on_ownerID_editingFinished(); + void on_registrationId_editingFinished(); void on_pwrOnDelay_valueChanged(); void on_pwrOffDelay_valueChanged(); From 39788e1a788898c302fa756b7376e60c2c73de90 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 6 Jan 2020 09:09:00 +0100 Subject: [PATCH 057/560] Fix display of more the 7 tools in BW screens (#7270) --- radio/src/gui/common/stdlcd/radio_tools.cpp | 23 +++++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/radio/src/gui/common/stdlcd/radio_tools.cpp b/radio/src/gui/common/stdlcd/radio_tools.cpp index b2d13cba5..478c052b3 100644 --- a/radio/src/gui/common/stdlcd/radio_tools.cpp +++ b/radio/src/gui/common/stdlcd/radio_tools.cpp @@ -25,15 +25,20 @@ extern uint8_t g_moduleIdx; bool addRadioTool(uint8_t index, const char * label) { - int8_t sub = menuVerticalPosition - HEADER_LINE; - LcdFlags attr = (sub == index ? INVERS : 0); - coord_t y = MENU_HEADER_HEIGHT + 1 + index * FH; - lcdDrawNumber(3, y, index + 1, LEADING0|LEFT, 2); - lcdDrawText(3*FW, y, label, (sub == index ? INVERS : 0)); - if (attr && s_editMode > 0) { - s_editMode = 0; - killAllEvents(); - return true; + if (index >= menuVerticalOffset) { + uint8_t lineIndex = index - menuVerticalOffset; + if (lineIndex < NUM_BODY_LINES) { + int8_t sub = menuVerticalPosition - HEADER_LINE; + LcdFlags attr = (sub == index ? INVERS : 0); + coord_t y = MENU_HEADER_HEIGHT + lineIndex * FH; + lcdDrawNumber(3, y, index + 1, LEADING0 | LEFT, 2); + lcdDrawText(3 * FW, y, label, (sub == index ? INVERS : 0)); + if (attr && s_editMode > 0) { + s_editMode = 0; + killAllEvents(); + return true; + } + } } return false; } From 89510d26c95dee52ee76684d917dfb737a18eaae Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 6 Jan 2020 09:21:06 +0100 Subject: [PATCH 058/560] Cosmetics --- radio/src/opentx.cpp | 2 +- radio/src/telemetry/telemetry.h | 20 +++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 5805f3161..68b142b24 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -485,7 +485,7 @@ void modelDefault(uint8_t id) g_model.moduleData[INTERNAL_MODULE].channelsCount = defaultModuleChannels_M8(INTERNAL_MODULE); #if defined(EEPROM) g_model.header.modelId[INTERNAL_MODULE] = findNextUnusedModelId(id, INTERNAL_MODULE); - modelHeaders[id].modelId[INTERNAL_MODULE] = g_model.header.modelId[INTERNAL_MODULE] + modelHeaders[id].modelId[INTERNAL_MODULE] = g_model.header.modelId[INTERNAL_MODULE]; #endif #endif diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index 0c0a1c969..a2feefd48 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -105,17 +105,19 @@ void frskyDSetDefault(int index, uint16_t id); extern uint8_t telemetryProtocol; #if defined (MULTIMODULE) -#define IS_D16_MULTI(module) ((g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKY) && (g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16 || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_8CH || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH)) -#define IS_HOTT_MULTI(module) (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_HOTT) -#if defined(HARDWARE_INTERNAL_MODULE) -#define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT || (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE && (IS_D16_MULTI(INTERNAL_MODULE)||IS_D16_MULTI(EXTERNAL_MODULE)))) + #define IS_D16_MULTI(module) ((g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKY) && (g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16 || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_8CH || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH)) + #define IS_HOTT_MULTI(module) (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_HOTT) + #if defined(HARDWARE_INTERNAL_MODULE) + #define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT || (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE && (IS_D16_MULTI(INTERNAL_MODULE)||IS_D16_MULTI(EXTERNAL_MODULE)))) + #else + #define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT || (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE && IS_D16_MULTI(EXTERNAL_MODULE))) + #endif #else -#define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT || (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE && IS_D16_MULTI(EXTERNAL_MODULE))) + #define IS_D16_MULTI(module) false + #define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) #endif -#else -#define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) -#endif -#define IS_SPEKTRUM_PROTOCOL() (telemetryProtocol == PROTOCOL_TELEMETRY_SPEKTRUM) + +#define IS_SPEKTRUM_PROTOCOL() (telemetryProtocol == PROTOCOL_TELEMETRY_SPEKTRUM) #if defined(PCBTARANIS) || defined(PCBHORUS) inline bool isSportLineUsedByInternalModule() From d1255434ed662fe3fc034c79f9a5ecb6de64f2b4 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 6 Jan 2020 09:24:53 +0100 Subject: [PATCH 059/560] Compile fix --- radio/src/telemetry/telemetry.h | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index a2feefd48..9a6872e5a 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -114,6 +114,7 @@ extern uint8_t telemetryProtocol; #endif #else #define IS_D16_MULTI(module) false + #define IS_HOTT_MULTI(module) false #define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) #endif From d9f8b32a645dd533457ae8676734fde72656d989 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 6 Jan 2020 09:45:09 +0100 Subject: [PATCH 060/560] Wrong comment --- radio/src/sdcard.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h index a37476d3a..98dff0e03 100644 --- a/radio/src/sdcard.h +++ b/radio/src/sdcard.h @@ -141,7 +141,7 @@ const char * getBasename(const char * path); #elif defined(PCBX7) #define OTX_FOURCC 0x3678746F // otx for Taranis X7 / X7S / X7 Express / X7S Express #elif defined(PCBX9LITES) - #define OTX_FOURCC 0x3E78746F // otx for Taranis X9-Lite + #define OTX_FOURCC 0x3E78746F // otx for Taranis X9-Lite S #elif defined(PCBX9LITE) #define OTX_FOURCC 0x3C78746F // otx for Taranis X9-Lite #elif defined(PCBX9D) || defined(PCBX9DP) From 71c763f94336d3b501ca27ca6f6011ecba0aa1ea Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 6 Jan 2020 10:28:29 +0100 Subject: [PATCH 061/560] Bsongis/x9lites sources companion fix (#7275) Fixes #7215 Fixes #7244 --- companion/src/firmwares/boards.h | 5 +++++ companion/src/firmwares/opentx/opentxeeprom.cpp | 3 --- companion/src/firmwares/opentx/opentxeeprom.h | 2 +- companion/src/firmwares/opentx/opentxinterface.cpp | 10 ++++++++++ radio/src/storage/eeprom_rlc.cpp | 9 +++++++++ radio/src/targets/taranis/CMakeLists.txt | 2 +- 6 files changed, 26 insertions(+), 5 deletions(-) diff --git a/companion/src/firmwares/boards.h b/companion/src/firmwares/boards.h index 1057d3706..74e690ebf 100644 --- a/companion/src/firmwares/boards.h +++ b/companion/src/firmwares/boards.h @@ -255,6 +255,11 @@ inline bool IS_TARANIS_X9LITE(Board::Type board) return board == Board::BOARD_TARANIS_X9LITE || board == Board::BOARD_TARANIS_X9LITES; } +inline bool IS_TARANIS_X9LITES(Board::Type board) +{ + return board == Board::BOARD_TARANIS_X9LITES; +} + inline bool IS_TARANIS_X9(Board::Type board) { return board==Board::BOARD_TARANIS_X9D || board==Board::BOARD_TARANIS_X9DP || board==Board::BOARD_TARANIS_X9DP_2019 || board==Board::BOARD_TARANIS_X9E; diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index 21e067a2d..18dfc7379 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -45,9 +45,6 @@ inline int MAX_SWITCHES(Board::Type board, int version) if (IS_TARANIS_X9D(board)) return 9; - if (IS_TARANIS_X9LITE(board)) - return 7; - if (IS_JUMPER_T12(board)) return 8; diff --git a/companion/src/firmwares/opentx/opentxeeprom.h b/companion/src/firmwares/opentx/opentxeeprom.h index 95f75ce19..ac1cf09dc 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.h +++ b/companion/src/firmwares/opentx/opentxeeprom.h @@ -28,13 +28,13 @@ #define GVARS_VARIANT 0x0001 #define FRSKY_VARIANT 0x0002 -#define MAVLINK_VARIANT 0x0008 #define M128_VARIANT 0x8000 #define TARANIS_X9E_VARIANT 0x8000 #define TARANIS_X7_VARIANT 0x4000 #define TARANIS_XLITE_VARIANT 0x2000 #define TARANIS_XLITES_VARIANT 0x1000 #define TARANIS_X9LITE_VARIANT 0x0800 +#define TARANIS_X9LITES_VARIANT 0x0801 #define JUMPER_T12_VARIANT 0x4001 #define SIMU_STOCK_VARIANTS (GVARS_VARIANT|FRSKY_VARIANT) diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index aaff3123b..741db16b6 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -329,6 +329,9 @@ int OpenTxEepromInterface::save(uint8_t * eeprom, const RadioData & radioData, u else if (IS_TARANIS_X9E(board)) { variant |= TARANIS_X9E_VARIANT; } + else if (IS_TARANIS_X9LITES(board)) { + variant |= TARANIS_X9LITES_VARIANT; + } else if (IS_TARANIS_X9LITE(board)) { variant |= TARANIS_X9LITE_VARIANT; } @@ -718,6 +721,8 @@ int OpenTxFirmware::getCapability(::Capability capability) return SIMU_M128_VARIANTS; else if (IS_TARANIS_X9E(board)) return TARANIS_X9E_VARIANT; + else if (IS_TARANIS_X9LITES(board)) + return TARANIS_X9LITES_VARIANT; else if (IS_TARANIS_X9LITE(board)) return TARANIS_X9LITE_VARIANT; else if (IS_TARANIS_X7(board)) @@ -991,6 +996,11 @@ bool OpenTxEepromInterface::checkVariant(unsigned int version, unsigned int vari variantError = true; } } + else if (IS_TARANIS_X9LITES(board)) { + if (variant != TARANIS_X9LITES_VARIANT) { + variantError = true; + } + } else if (IS_TARANIS_X9LITE(board)) { if (variant != TARANIS_X9LITE_VARIANT) { variantError = true; diff --git a/radio/src/storage/eeprom_rlc.cpp b/radio/src/storage/eeprom_rlc.cpp index 3d77e3dbe..d1e28254c 100644 --- a/radio/src/storage/eeprom_rlc.cpp +++ b/radio/src/storage/eeprom_rlc.cpp @@ -776,6 +776,15 @@ bool eeLoadGeneral(bool allowFixes) } #endif +#if defined(PCBX9LITES) + if (g_eeGeneral.variant == 0x0800) { + TRACE("Pre release EEPROM detected, variant %d instead of %d for X9LiteS radio. Loading anyway", g_eeGeneral.variant, EEPROM_VARIANT); + g_eeGeneral.variant = EEPROM_VARIANT; + storageDirty(EE_GENERAL); + return true; + } +#endif + #if defined(RADIO_T12) if (g_eeGeneral.variant != (EEPROM_VARIANT & 0xFFFE)) { TRACE("EEPROM variant %d instead of %d", g_eeGeneral.variant, EEPROM_VARIANT); diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index db593064e..fe9a02922 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -207,7 +207,7 @@ elseif(PCB STREQUAL X9LITES) set(FLAVOUR x9lites) add_definitions(-DBOARD_NAME="x9lites") add_definitions(-DPCBX9LITES -DPCBX9LITE -DPCBX9 -DSOFTWARE_VOLUME -DHARDWARE_POWER_MANAGEMENT_UNIT) - add_definitions(-DEEPROM_VARIANT=0x0800) + add_definitions(-DEEPROM_VARIANT=0x0801) add_definitions(-DPWR_BUTTON_${PWR_BUTTON}) set(PXX2 ON) set(GUI_DIR 128x64) From 5a9c8edf64b668eb99f690f637813c813da029fe Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 6 Jan 2020 10:32:26 +0100 Subject: [PATCH 062/560] Basics for TBS firmware (#7274) --- radio/src/CMakeLists.txt | 5 ++ radio/src/stamp.cpp | 2 + tools/build-tbs.py | 118 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 125 insertions(+) create mode 100755 tools/build-tbs.py diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index c16bf7ca2..a4d94a51b 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -53,6 +53,7 @@ option(MODULE_PROTOCOL_LBT "Add support for EU/LBT modules" ON) option(MODULE_PROTOCOL_FLEX "Add support for non certified FLEX modules" OFF) option(MODULE_PROTOCOL_D8 "Add support for D8 modules" ON) option(FRSKY_RELEASE "Used to build FrSky released firmware" OFF) +option(TBS_RELEASE "Used to build TBS released firmware" OFF) option(ALLOW_TRAINER_MULTI "Allow multi trainer" OFF) # since we reset all default CMAKE compiler flags for firmware builds, provide an alternate way for user to specify additional flags. @@ -339,6 +340,10 @@ if(JUMPER_RELEASE) add_definitions(-DJUMPER_RELEASE) endif() +if(TBS_RELEASE) + add_definitions(-DTBS_RELEASE) +endif() + if(FRSKY_RELEASE) add_definitions(-DFRSKY_RELEASE) set(POPUP_LEVEL 3) diff --git a/radio/src/stamp.cpp b/radio/src/stamp.cpp index 842020a8c..2369955b3 100644 --- a/radio/src/stamp.cpp +++ b/radio/src/stamp.cpp @@ -36,6 +36,8 @@ #define DISPLAY_VERSION "FrSky" #elif defined(JUMPER_RELEASE) #define DISPLAY_VERSION "JumperRC" +#elif defined(TBS_RELEASE) +#define DISPLAY_VERSION "TBS" #else #define DISPLAY_VERSION VERSION #endif diff --git a/tools/build-tbs.py b/tools/build-tbs.py new file mode 100755 index 000000000..3c5cb2d1c --- /dev/null +++ b/tools/build-tbs.py @@ -0,0 +1,118 @@ +#!/usr/bin/python3 + +import argparse +import datetime +import os +from builtins import NotADirectoryError +import shutil +import tempfile + + +boards = { + "XLITE": { + "PCB": "XLITE", + }, + "XLITES": { + "PCB": "XLITES", + }, + "X9LITE": { + "PCB": "X9LITE", + }, + "X9LITES": { + "PCB": "X9LITES", + }, + "X9D": { + "PCB": "X9D+", + }, + "X9D+": { + "PCB": "X9D+", + }, + "X9D+2019": { + "PCB": "X9D+", + "PCBREV": "2019", + }, + "X9E": { + "PCB": "X9E", + }, + "X7": { + "PCB": "X7", + }, + "X7ACCESS": { + "PCB": "X7", + "PCBREV": "ACCESS", + }, + "X10": { + "PCB": "X10", + }, + "X10EXPRESS": { + "PCB": "X10", + "PCBREV": "EXPRESS", + }, + "X12S": { + "PCB": "X12S", + }, + "T16": { + "PCB": "X10", + "PCBREV": "T16", + "INTERNAL_MODULE_MULTI": "YES" + }, + "T12": { + "PCB": "X7", + "PCBREV": "T12", + }, +} + +translations = [ + "EN" +] + + +def timestamp(): + return datetime.datetime.now().strftime("%y%m%d") + + +def build(board, translation, srcdir): + cmake_options = " ".join(["-D%s=%s" % (key, value) for key, value in boards[board].items()]) + cwd = os.getcwd() + if not os.path.exists("output"): + os.mkdir("output") + path = tempfile.mkdtemp() + os.chdir(path) + command = "cmake %s -DTRANSLATIONS=%s -DTBS_RELEASE=YES -DTEST_BUILD_WARNING=YES %s" % (cmake_options, translation, srcdir) + print(command) + os.system(command) + os.system("make firmware -j6") + os.chdir(cwd) + index = 0 + while 1: + suffix = "" if index == 0 else "_%d" % index + filename = "output/firmware_%s_%s_%s%s.bin" % (board.lower(), translation.lower(), timestamp(), suffix) + if not os.path.exists(filename): + shutil.copy("%s/firmware.bin" % path, filename) + break + index += 1 + shutil.rmtree(path) + + +def dir_path(string): + if os.path.isdir(string): + return string + else: + raise NotADirectoryError(string) + + +def main(): + parser = argparse.ArgumentParser(description="Build FrSky firmware") + parser.add_argument("-b", "--boards", action="append", help="Destination boards", required=True) + parser.add_argument("-t", "--translations", action="append", help="Translations", required=True) + parser.add_argument("srcdir", type=dir_path) + + args = parser.parse_args() + + for board in (boards.keys() if "ALL" in args.boards else args.boards): + for translation in (translations if "ALL" in args.translations else args.translations): + build(board, translation, args.srcdir) + + +if __name__ == "__main__": + main() From 838bd2f6a07c6c531a5c71f9e7d22fd82cfa6263 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 6 Jan 2020 10:38:10 +0100 Subject: [PATCH 063/560] Rework warning (#7264) --- radio/src/CMakeLists.txt | 6 +++--- radio/src/opentx.cpp | 4 ++-- radio/src/translations.cpp | 6 ++---- radio/src/translations.h | 4 ++-- radio/src/translations/cz.h.txt | 4 ++-- radio/src/translations/de.h.txt | 4 ++-- radio/src/translations/en.h.txt | 4 ++-- radio/src/translations/es.h.txt | 6 +++--- radio/src/translations/fi.h.txt | 4 ++-- radio/src/translations/fr.h.txt | 4 ++-- radio/src/translations/it.h.txt | 4 ++-- radio/src/translations/nl.h.txt | 4 ++-- radio/src/translations/pl.h.txt | 4 ++-- radio/src/translations/pt.h.txt | 4 ++-- radio/src/translations/se.h.txt | 4 ++-- radio/util/build-firmware.py | 2 +- tools/build-companion-nightly.sh | 2 +- 17 files changed, 34 insertions(+), 36 deletions(-) diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index a4d94a51b..8124cf651 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -47,7 +47,7 @@ option(TRACE_SIMPGMSPACE "Turn on traces in simpgmspace.cpp" ON) option(TRACE_LUA_INTERNALS "Turn on traces for Lua internals" OFF) option(FRSKY_STICKS "Reverse sticks for FrSky sticks" OFF) option(NANO "Use nano newlib and binalloc") -option(NIGHTLY_BUILD_WARNING "Warn this is a nightly build" OFF) +option(TEST_BUILD_WARNING "Warn this is a test build" OFF) option(MODULE_PROTOCOL_FCC "Add support for FCC modules" ON) option(MODULE_PROTOCOL_LBT "Add support for EU/LBT modules" ON) option(MODULE_PROTOCOL_FLEX "Add support for non certified FLEX modules" OFF) @@ -316,8 +316,8 @@ if(EEPROM_VARIANT_NEEDED) add_definitions(-DEEPROM_VARIANT=${EEPROM_VARIANT}) endif() -if(NIGHTLY_BUILD_WARNING) - add_definitions(-DNIGHTLY_BUILD_WARNING) +if(TEST_BUILD_WARNING) + add_definitions(-DTEST_BUILD_WARNING) endif() if(MODULE_PROTOCOL_FCC) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 68b142b24..1bf9e8342 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1554,8 +1554,8 @@ void opentxStart(const uint8_t startOptions = OPENTX_START_DEFAULT_ARGS) } #endif -#if defined(NIGHTLY_BUILD_WARNING) - ALERT(STR_NIGHTLY_WARNING, TR_NIGHTLY_NOTSAFE, AU_ERROR); +#if defined(TEST_BUILD_WARNING) + ALERT(STR_TEST_WARNING, TR_TEST_NOTSAFE, AU_ERROR); #endif #if defined(GUI) diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index ba23c2436..8e333fcc4 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -705,10 +705,8 @@ const char STR_MODELS_PATH[] = MODELS_PATH; const char STR_MODELS_EXT[] = MODELS_EXT; #endif -#if defined(NIGHTLY_BUILD_WARNING) -const char STR_NIGHTLY_WARNING[] = TR_NIGHTLY_WARNING; -const char STR_NIGHTLY_NOTSAFE[] = TR_NIGHTLY_NOTSAFE; -#endif +const char STR_TEST_WARNING[] = TR_TEST_WARNING; +const char STR_TEST_NOTSAFE[] = TR_TEST_NOTSAFE; #if LCD_W >= 212 const char * const STR_PHASES_HEADERS[] = TR_PHASES_HEADERS; diff --git a/radio/src/translations.h b/radio/src/translations.h index e1e9e9c0f..239fd7c71 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -552,8 +552,8 @@ extern const char STR_THROTTLEWARN[]; extern const char STR_ALARMSWARN[]; extern const char STR_SWITCHWARN[]; extern const char STR_FAILSAFEWARN[]; -extern const char STR_NIGHTLY_WARNING[]; -extern const char STR_NIGHTLY_NOTSAFE[]; +extern const char STR_TEST_WARNING[]; +extern const char STR_TEST_NOTSAFE[]; extern const char STR_WRONG_SDCARDVERSION[]; extern const char STR_WARN_RTC_BATTERY_LOW[]; extern const char STR_WARN_MULTI_LOWPOWER[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index d90d692c7..fe2f4a921 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -733,8 +733,8 @@ #define TR_ALARMSWARN "ALARMU" #define TR_SWITCHWARN "POZICE" #define TR_FAILSAFEWARN "FAILSAFE" -#define TR_NIGHTLY_WARNING TR("NOČNÍ", "NOČNÍ SESTAVENÍ") -#define TR_NIGHTLY_NOTSAFE "Verze není bezpečná k létání" +#define TR_TEST_WARNING TR("NOČNÍ", "NOČNÍ SESTAVENÍ") +#define TR_TEST_NOTSAFE "Use for tests only" #define TR_WRONG_SDCARDVERSION "Očekávaná ver.: " #define TR_WARN_RTC_BATTERY_LOW "Slabá RTC baterie" #define TR_WARN_MULTI_LOWPOWER "Low power mode" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index de1421c0e..1cfef0aef 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -735,8 +735,8 @@ #define TR_ALARMSWARN "ALARM" #define TR_SWITCHWARN "SCHALTER" #define TR_FAILSAFEWARN "FAILSAFE" -#define TR_NIGHTLY_WARNING TR("NIGHTLY", "NIGHTLY BUILD") -#define TR_NIGHTLY_NOTSAFE "Nicht für Flug geeignet" +#define TR_TEST_WARNING TR("TESTING", "TEST BUILD") +#define TR_TEST_NOTSAFE "Use for tests only" #define TR_WRONG_SDCARDVERSION TR("Erw. Version: ","Erwartete Version: ") #define TR_WARN_RTC_BATTERY_LOW "RTC Battery low" #define TR_WARN_MULTI_LOWPOWER "Low power mode" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index f7600bf4f..9ab4f8725 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -734,8 +734,8 @@ #define TR_ALARMSWARN "ALARMS" #define TR_SWITCHWARN TR("SWITCH", "CONTROL") #define TR_FAILSAFEWARN "FAILSAFE" -#define TR_NIGHTLY_WARNING TR("NIGHTLY", "NIGHTLY BUILD") -#define TR_NIGHTLY_NOTSAFE "Version not safe to fly" +#define TR_TEST_WARNING TR("TESTING", "TEST BUILD") +#define TR_TEST_NOTSAFE "Use for tests only" #define TR_WRONG_SDCARDVERSION TR("Expected ver: ","Expected version: ") #define TR_WARN_RTC_BATTERY_LOW "RTC Battery low" #define TR_WARN_MULTI_LOWPOWER "Low power mode" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index a52691923..3d7a70d43 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -758,9 +758,9 @@ #define TR_ALARMSWARN "ALARMAS" #define TR_SWITCHWARN "INTERPTOR" #define TR_FAILSAFEWARN "FAILSAFE" -#define TR_NIGHTLY_WARNING TR("NIGHTLY", "NIGHTLY BUILD") -#define TR_NIGHTLY_NOTSAFE "Version not safe to fly" -#define TR_WRONG_SDCARDVERSION TR("Expected ver: ","Expected version: ") +#define TR_TEST_WARNING TR("TESTING", "TEST BUILD") +#define TR_TEST_NOTSAFE "Use for tests only" +#define TR_WRONG_SDCARDVERSION TR("Expected ver: ","Expected version: ") #define TR_WARN_RTC_BATTERY_LOW "RTC Battery low" #define TR_WARN_MULTI_LOWPOWER "Low power mode" #define TR_BATTERY "BATTERY" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index f5e018ead..241e4fdcb 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -752,8 +752,8 @@ #define TR_ALARMSWARN "ALARMS" #define TR_SWITCHWARN TR("SWITCH","CONTROL") #define TR_FAILSAFEWARN "FAILSAFE" -#define TR_NIGHTLY_WARNING TR("NIGHTLY", "NIGHTLY BUILD") -#define TR_NIGHTLY_NOTSAFE "Version not safe to fly" +#define TR_TEST_WARNING TR("TESTING", "TEST BUILD") +#define TR_TEST_NOTSAFE "Use for tests only" #define TR_WRONG_SDCARDVERSION TR("Expected ver: ","Expected version: ") #define TR_WARN_RTC_BATTERY_LOW "RTC Battery low" #define TR_WARN_MULTI_LOWPOWER "Low power mode" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index c8ec87b9f..88fa0689f 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -755,8 +755,8 @@ #define TR_ALARMSWARN "SON" #define TR_SWITCHWARN TR("INTERS","CONTROLES") #define TR_FAILSAFEWARN "FAILSAFE" -#define TR_NIGHTLY_WARNING TR("NIGHTLY", "NIGHTLY BUILD") -#define TR_NIGHTLY_NOTSAFE "Version de test uniq." +#define TR_TEST_WARNING TR("TESTING", "TEST BUILD") +#define TR_TEST_NOTSAFE "Version de test uniq." #define TR_WRONG_SDCARDVERSION "Version requise: " #define TR_WARN_RTC_BATTERY_LOW "Batterie RTC faible" #define TR_WARN_MULTI_LOWPOWER "Mode basse puis." diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index f2852ba7b..f0534853d 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -754,8 +754,8 @@ #define TR_ALARMSWARN "ALLARMI" #define TR_SWITCHWARN "CONTROLLI" #define TR_FAILSAFEWARN "FAILSAFE" -#define TR_NIGHTLY_WARNING TR("NIGHTLY", "NIGHTLY BUILD") -#define TR_NIGHTLY_NOTSAFE "Versione non sicura" +#define TR_TEST_WARNING TR("TESTING", "TEST BUILD") +#define TR_TEST_NOTSAFE "Use for test only" #define TR_WRONG_SDCARDVERSION TR("Richiede ver: ", "Richiede versione: ") #define TR_WARN_RTC_BATTERY_LOW "Batteria RTC scarica" #define TR_WARN_MULTI_LOWPOWER "Modalità bassa pot." diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 633d83a26..e67be0298 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -740,8 +740,8 @@ #define TR_ALARMSWARN "ALARM" #define TR_SWITCHWARN "SCHAKELAAR" #define TR_FAILSAFEWARN "FAILSAFE" -#define TR_NIGHTLY_WARNING TR("NIGHTLY", "NIGHTLY BUILD") -#define TR_NIGHTLY_NOTSAFE "Version not safe to fly" +#define TR_TEST_WARNING TR("TESTING", "TEST BUILD") +#define TR_TEST_NOTSAFE "Use for tests only" #define TR_WRONG_SDCARDVERSION TR("Verwachte ver: ","Verwachte versie: ") #define TR_WARN_RTC_BATTERY_LOW "RTC Battery low" #define TR_WARN_MULTI_LOWPOWER "Low power mode" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 339755077..a52b0da24 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -753,8 +753,8 @@ #define TR_ALARMSWARN "ALARM" #define TR_SWITCHWARN TR("Przełą","Kontrola") #define TR_FAILSAFEWARN "FAILSAFE" -#define TR_NIGHTLY_WARNING TR("NIGHTLY", "NIGHTLY BUILD") -#define TR_NIGHTLY_NOTSAFE "Version not safe to fly" +#define TR_TEST_WARNING TR("TESTING", "TEST BUILD") +#define TR_TEST_NOTSAFE "Use for tests only" #define TR_WRONG_SDCARDVERSION TR("Expected ver: ","Expected version: ") #define TR_WARN_RTC_BATTERY_LOW "RTC Battery low" #define TR_WARN_MULTI_LOWPOWER "Low power mode" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 7d51e12f7..2d4d6fc71 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -743,8 +743,8 @@ #define TR_ALARMSWARN "ALARMES" #define TR_SWITCHWARN "CHAVES" #define TR_FAILSAFEWARN "FAILSAFE" -#define TR_NIGHTLY_WARNING TR("NIGHTLY", "NIGHTLY BUILD") -#define TR_NIGHTLY_NOTSAFE "Version not safe to fly" +#define TR_TEST_WARNING TR("TESTING", "TEST BUILD") +#define TR_TEST_NOTSAFE "Use for tests only" #define TR_WRONG_SDCARDVERSION TR("Expected ver: ","Expected version: ") #define TR_WARN_RTC_BATTERY_LOW "RTC Battery low" #define TR_WARN_MULTI_LOWPOWER "Low power mode" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 2c26a7a0a..85b31e4d9 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -752,8 +752,8 @@ #define TR_ALARMSWARN "ALARM" #define TR_SWITCHWARN "BRYTARE" #define TR_FAILSAFEWARN "FAILSAFE" -#define TR_NIGHTLY_WARNING TR("NIGHTLY", "NIGHTLY BUILD") -#define TR_NIGHTLY_NOTSAFE "Version not safe to fly" +#define TR_TEST_WARNING TR("TESTING", "TEST BUILD") +#define TR_TEST_NOTSAFE "Use for tests only" #define TR_SDCARDVERSIONWARN "SD Card Check" #define TR_WRONG_SDCARDVERSION TR("Expected ver: ","Expected version: ") #define TR_WARN_RTC_BATTERY_LOW "RTC Battery low" diff --git a/radio/util/build-firmware.py b/radio/util/build-firmware.py index 4488659b0..9658e605d 100755 --- a/radio/util/build-firmware.py +++ b/radio/util/build-firmware.py @@ -30,7 +30,7 @@ def build_target(target, path, cmake_options): suffix = os.environ["OPENTX_VERSION_SUFFIX"] cmd.append('-DVERSION_SUFFIX="%s"' % suffix) if suffix.startswith("N"): - cmd.append('-DNIGHTLY_BUILD_WARNING=YES') + cmd.append('-DTEST_BUILD_WARNING=YES') cmd.append(srcdir) proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) diff --git a/tools/build-companion-nightly.sh b/tools/build-companion-nightly.sh index ac2004b16..58d64709c 100755 --- a/tools/build-companion-nightly.sh +++ b/tools/build-companion-nightly.sh @@ -25,7 +25,7 @@ done SRCDIR=$1 OUTDIR=$2 -COMMON_OPTIONS="-DALLOW_NIGHTLY_BUILDS=YES -DNIGHTLY_BUILD_WARNING=YES -DGVARS=YES -DHELI=YES -DLUA=YES -DMULTIMODULE=YES -DTELEMETRY=FRSKY -DPPM_LIMITS_SYMETRICAL=YES -DVARIO=YES -DAUTOSWITCH=YES -DAUTOSOURCE=YES -DAUDIO=YES -DGPS=YES -DPPM_CENTER_ADJUSTABLE=YES -DFLIGHT_MODES=YES -DOVERRIDE_CHANNEL_FUNCTION=YES -DFRSKY_STICKS=YES" +COMMON_OPTIONS="-DALLOW_NIGHTLY_BUILDS=YES -DTEST_BUILD_WARNING=YES -DGVARS=YES -DHELI=YES -DLUA=YES -DMULTIMODULE=YES -DTELEMETRY=FRSKY -DPPM_LIMITS_SYMETRICAL=YES -DVARIO=YES -DAUTOSWITCH=YES -DAUTOSOURCE=YES -DAUDIO=YES -DGPS=YES -DPPM_CENTER_ADJUSTABLE=YES -DFLIGHT_MODES=YES -DOVERRIDE_CHANNEL_FUNCTION=YES -DFRSKY_STICKS=YES" if [ "$(uname)" = "Darwin" ]; then COMMON_OPTIONS="${COMMON_OPTIONS} -DCMAKE_PREFIX_PATH=~/Qt/5.7/clang_64/ -DCMAKE_OSX_DEPLOYMENT_TARGET='10.9'" fi From abb1cd473bbba40925b45ca3296efe5c6afa9112 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 6 Jan 2020 11:25:42 +0100 Subject: [PATCH 064/560] Fix some keys no sent to telemetry screens handler (#7263) Fix some keys no sent to telemetry screens handler --- radio/src/gui/128x64/view_telemetry.cpp | 72 +++++++++++-------------- radio/src/main.cpp | 15 ------ 2 files changed, 30 insertions(+), 57 deletions(-) diff --git a/radio/src/gui/128x64/view_telemetry.cpp b/radio/src/gui/128x64/view_telemetry.cpp index 84a0cbf77..f6d5d7301 100644 --- a/radio/src/gui/128x64/view_telemetry.cpp +++ b/radio/src/gui/128x64/view_telemetry.cpp @@ -216,58 +216,46 @@ enum NavigationDirection { #define incrTelemetryScreen() direction = down #if defined(NAVIGATION_XLITE) -#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_LONG(KEY_LEFT) -#define EVT_KEY_NEXT_VIEW EVT_KEY_LONG(KEY_RIGHT) + #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) -#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_LONG(KEY_PAGE) -#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGE) + #define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_LONG(KEY_PAGE)) + #define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_BREAK(KEY_PAGE)) +#elif defined(NAVIGATION_9X) + #define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_LONG(KEY_UP)) + #define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_LONG(KEY_DOWN)) #else -#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_FIRST(KEY_UP) -#define EVT_KEY_NEXT_VIEW EVT_KEY_FIRST(KEY_DOWN) + #define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_FIRST(KEY_UP)) + #define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_FIRST(KEY_DOWN)) #endif void menuViewTelemetryFrsky(event_t event) { enum NavigationDirection direction = none; - switch (event) { - case EVT_KEY_FIRST(KEY_EXIT): + if (event == EVT_KEY_FIRST(KEY_EXIT) && TELEMETRY_SCREEN_TYPE(s_frsky_view) != TELEMETRY_SCREEN_TYPE_SCRIPT) { + killEvents(event); + chainMenu(menuMainView); + } #if defined(LUA) - case EVT_KEY_LONG(KEY_EXIT): + else if (event == EVT_KEY_LONG(KEY_EXIT)) { + killEvents(event); + chainMenu(menuMainView); + } #endif - killEvents(event); - chainMenu(menuMainView); - break; - - case EVT_KEY_PREVIOUS_VIEW: -#if defined(PCBXLITE) - if (IS_SHIFT_PRESSED()) { - decrTelemetryScreen(); - } -#else - if (IS_KEY_LONG(EVT_KEY_PREVIOUS_VIEW)) { - killEvents(event); - } - decrTelemetryScreen(); -#endif - break; - - case EVT_KEY_NEXT_VIEW: -#if defined(PCBXLITE) - if (IS_SHIFT_PRESSED()) { - incrTelemetryScreen(); - } -#else - incrTelemetryScreen(); -#endif - break; - - case EVT_KEY_LONG(KEY_ENTER): - killEvents(event); - POPUP_MENU_ADD_ITEM(STR_RESET_TELEMETRY); - POPUP_MENU_ADD_ITEM(STR_RESET_FLIGHT); - POPUP_MENU_START(onMainViewMenu); - break; + else if (EVT_KEY_PREVIOUS_VIEW(event)) { + killEvents(event); + decrTelemetryScreen(); + } + else if (EVT_KEY_NEXT_VIEW(event)) { + killEvents(event); + incrTelemetryScreen(); + } + else if (event == EVT_KEY_LONG(KEY_ENTER)) { + killEvents(event); + POPUP_MENU_ADD_ITEM(STR_RESET_TELEMETRY); + POPUP_MENU_ADD_ITEM(STR_RESET_FLIGHT); + POPUP_MENU_START(onMainViewMenu); } for (int i=0; i<=TELEMETRY_SCREEN_TYPE_MAX; i++) { diff --git a/radio/src/main.cpp b/radio/src/main.cpp index 3f5dbd1ab..3aee248ef 100644 --- a/radio/src/main.cpp +++ b/radio/src/main.cpp @@ -381,21 +381,6 @@ void handleGui(event_t event) { } else if (luaTask(event, RUN_TELEM_FG_SCRIPT, true)) { // the telemetry screen is active - // prevent events from keys MENU, UP, DOWN, ENT(short) and EXIT(short) from reaching the normal menus, - // so Lua telemetry script can fully use them - if (event) { - uint8_t key = EVT_KEY_MASK(event); -#if defined(PCBXLITE) - // SHIFT + LEFT/RIGHT LONG used to change telemetry screen on XLITE - if ((!IS_KEY_LONG(event) && key == KEY_RIGHT && IS_SHIFT_PRESSED()) || (!IS_KEY_LONG(event) && key == KEY_LEFT && IS_SHIFT_PRESSED()) || (!IS_KEY_LONG(event) && key == KEY_EXIT)) { -#else - // no need to filter out MENU and ENT(short), because they are not used by menuViewTelemetryFrsky() - if (key == KEY_PLUS || key == KEY_MINUS || (!IS_KEY_LONG(event) && key == KEY_EXIT)) { -#endif - // TRACE("Telemetry script event 0x%02x killed", event); - event = 0; - } - } menuHandlers[menuLevel](event); } else From 763b9bedfbb72fef7237660c212ff0177dee38de Mon Sep 17 00:00:00 2001 From: Marco Robustini Date: Mon, 6 Jan 2020 13:48:40 +0100 Subject: [PATCH 065/560] Update it.h.txt (#7276) --- radio/src/translations/it.h.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index f0534853d..0f5e5b047 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -754,8 +754,8 @@ #define TR_ALARMSWARN "ALLARMI" #define TR_SWITCHWARN "CONTROLLI" #define TR_FAILSAFEWARN "FAILSAFE" -#define TR_TEST_WARNING TR("TESTING", "TEST BUILD") -#define TR_TEST_NOTSAFE "Use for test only" +#define TR_TEST_WARNING TR("PER TEST", "BUILD PER TEST") +#define TR_TEST_NOTSAFE "Usare solo per test" #define TR_WRONG_SDCARDVERSION TR("Richiede ver: ", "Richiede versione: ") #define TR_WARN_RTC_BATTERY_LOW "Batteria RTC scarica" #define TR_WARN_MULTI_LOWPOWER "Modalità bassa pot." From f8e159ba5f53f92edee1908cad53b60c44984cd2 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 6 Jan 2020 16:19:29 +0100 Subject: [PATCH 066/560] Quick'n'dirty : greyed companion backup radio non implemented option --- companion/src/mainwindow.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/companion/src/mainwindow.cpp b/companion/src/mainwindow.cpp index e795594cb..dcae212df 100644 --- a/companion/src/mainwindow.cpp +++ b/companion/src/mainwindow.cpp @@ -1078,8 +1078,14 @@ void MainWindow::updateMenus() compareAct->setEnabled(activeChild); writeEepromAct->setEnabled(activeChild); readEepromAct->setEnabled(true); - writeBUToRadioAct->setEnabled(true); - readBUToFileAct->setEnabled(true); + if (IS_HORUS(getCurrentBoard())) { + writeBUToRadioAct->setEnabled(false); + readBUToFileAct->setEnabled(false); + } + else { + writeBUToRadioAct->setEnabled(true); + readBUToFileAct->setEnabled(true); + } editSplashAct->setDisabled(IS_HORUS(getCurrentBoard())); foreach (QAction * act, fileWindowActions) { @@ -1288,8 +1294,9 @@ void MainWindow::createActions() writeEepromAct = addAct("write_eeprom.png", SLOT(writeEeprom())); readEepromAct = addAct("read_eeprom.png", SLOT(readEeprom())); burnConfigAct = addAct("configure.png", SLOT(burnConfig())); - writeBUToRadioAct = addAct("write_eeprom_file.png", SLOT(writeBackup())); - readBUToFileAct = addAct("read_eeprom_file.png", SLOT(readBackup())); + + writeBUToRadioAct = addAct("write_eeprom_file.png", SLOT(writeBackup())); + readBUToFileAct = addAct("read_eeprom_file.png", SLOT(readBackup())); createProfileAct = addAct("new.png", SLOT(createProfile())); copyProfileAct = addAct("copy.png", SLOT(copyProfile())); From 5b16686adbbedbb5f7b560916597bb26028e7574 Mon Sep 17 00:00:00 2001 From: olliw42 <6089567+olliw42@users.noreply.github.com> Date: Mon, 6 Jan 2020 20:57:28 +0100 Subject: [PATCH 067/560] style it, according to majority identing style (#7278) --- radio/src/targets/horus/hal.h | 98 +++++++++++++++++------------------ 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 6f226d7b9..7b6934068 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -120,24 +120,24 @@ // Gimbal switch left #define STORAGE_SWITCH_I #define HARDWARE_SWITCH_I - #define SWITCHES_GPIO_REG_I GPIOH->IDR - #define SWITCHES_GPIO_PIN_I GPIO_Pin_14 // PH.14 + #define SWITCHES_GPIO_REG_I GPIOH->IDR + #define SWITCHES_GPIO_PIN_I GPIO_Pin_14 // PH.14 // Gimbal switch right #define STORAGE_SWITCH_J #define HARDWARE_SWITCH_J - #define SWITCHES_GPIO_REG_J GPIOH->IDR - #define SWITCHES_GPIO_PIN_J GPIO_Pin_15 // PH.15 + #define SWITCHES_GPIO_REG_J GPIOH->IDR + #define SWITCHES_GPIO_PIN_J GPIO_Pin_15 // PH.15 #elif defined(PCBX12S) // Gimbal switch left #define STORAGE_SWITCH_I #define HARDWARE_SWITCH_I - #define SWITCHES_GPIO_REG_I GPIOB->IDR - #define SWITCHES_GPIO_PIN_I GPIO_Pin_1 // PB.01 + #define SWITCHES_GPIO_REG_I GPIOB->IDR + #define SWITCHES_GPIO_PIN_I GPIO_Pin_1 // PB.01 // Gimbal switch right #define STORAGE_SWITCH_J #define HARDWARE_SWITCH_J - #define SWITCHES_GPIO_REG_J GPIOB->IDR - #define SWITCHES_GPIO_PIN_J GPIO_Pin_0 // PB.00 + #define SWITCHES_GPIO_REG_J GPIOB->IDR + #define SWITCHES_GPIO_PIN_J GPIO_Pin_0 // PB.00 #endif // Trims @@ -184,15 +184,15 @@ #define TRIMS_GPIO_REG_RHR GPIOD->IDR #define TRIMS_GPIO_PIN_RHR GPIO_Pin_7 // PD.07 #if defined(RADIO_T16) - #define TRIMS_GPIO_REG_LSU GPIOD->IDR - #define TRIMS_GPIO_PIN_LSU GPIO_Pin_13 // PD.13 - #define TRIMS_GPIO_REG_LSD GPIOJ->IDR - #define TRIMS_GPIO_PIN_LSD GPIO_Pin_8 // PJ.08 + #define TRIMS_GPIO_REG_LSU GPIOD->IDR + #define TRIMS_GPIO_PIN_LSU GPIO_Pin_13 // PD.13 + #define TRIMS_GPIO_REG_LSD GPIOJ->IDR + #define TRIMS_GPIO_PIN_LSD GPIO_Pin_8 // PJ.08 #else - #define TRIMS_GPIO_REG_LSU GPIOJ->IDR - #define TRIMS_GPIO_PIN_LSU GPIO_Pin_8 // PJ.08 - #define TRIMS_GPIO_REG_LSD GPIOD->IDR - #define TRIMS_GPIO_PIN_LSD GPIO_Pin_13 // PD.13 + #define TRIMS_GPIO_REG_LSU GPIOJ->IDR + #define TRIMS_GPIO_PIN_LSU GPIO_Pin_8 // PJ.08 + #define TRIMS_GPIO_REG_LSD GPIOD->IDR + #define TRIMS_GPIO_PIN_LSD GPIO_Pin_13 // PD.13 #endif #define TRIMS_GPIO_REG_RSU GPIOB->IDR #define TRIMS_GPIO_PIN_RSU GPIO_Pin_14 // PB.14 @@ -288,11 +288,11 @@ #define ADC_DMA_Stream DMA2_Stream0 #define ADC_SET_DMA_FLAGS() ADC_DMA->LIFCR = (DMA_LIFCR_CTCIF0 | DMA_LIFCR_CHTIF0 | DMA_LIFCR_CTEIF0 | DMA_LIFCR_CDMEIF0 | DMA_LIFCR_CFEIF0) #define ADC_TRANSFER_COMPLETE() (ADC_DMA->LISR & DMA_LISR_TCIF0) -#if defined(RADIO_T16) - #define ADC_VREF_PREC2 300 -#else - #define ADC_VREF_PREC2 250 -#endif + #if defined(RADIO_T16) + #define ADC_VREF_PREC2 300 + #else + #define ADC_VREF_PREC2 250 + #endif #endif // Power @@ -316,15 +316,15 @@ // PCBREV #if defined(PCBX10) -#define PCBREV_RCC_AHB1Periph RCC_AHB1Periph_GPIOH -#define PCBREV_GPIO_PIN (GPIO_Pin_7 | GPIO_Pin_8) -#define PCBREV_GPIO GPIOH -#define PCBREV_VALUE() (GPIO_ReadInputDataBit(PCBREV_GPIO, GPIO_Pin_7) + (GPIO_ReadInputDataBit(PCBREV_GPIO, GPIO_Pin_8) << 1)) + #define PCBREV_RCC_AHB1Periph RCC_AHB1Periph_GPIOH + #define PCBREV_GPIO_PIN (GPIO_Pin_7 | GPIO_Pin_8) + #define PCBREV_GPIO GPIOH + #define PCBREV_VALUE() (GPIO_ReadInputDataBit(PCBREV_GPIO, GPIO_Pin_7) + (GPIO_ReadInputDataBit(PCBREV_GPIO, GPIO_Pin_8) << 1)) #else -#define PCBREV_RCC_AHB1Periph RCC_AHB1Periph_GPIOI -#define PCBREV_GPIO GPIOI -#define PCBREV_GPIO_PIN GPIO_Pin_11 // PI.11 -#define PCBREV_VALUE() GPIO_ReadInputDataBit(PCBREV_GPIO, PCBREV_GPIO_PIN) + #define PCBREV_RCC_AHB1Periph RCC_AHB1Periph_GPIOI + #define PCBREV_GPIO GPIOI + #define PCBREV_GPIO_PIN GPIO_Pin_11 // PI.11 + #define PCBREV_VALUE() GPIO_ReadInputDataBit(PCBREV_GPIO, PCBREV_GPIO_PIN) #endif // Led @@ -344,22 +344,22 @@ // Serial Port (DEBUG) #if defined(PCBX12S) -#define AUX_SERIAL_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1) -#define AUX_SERIAL_RCC_APB1Periph RCC_APB1Periph_USART3 -#define AUX_SERIAL_GPIO GPIOB -#define AUX_SERIAL_GPIO_PIN_TX GPIO_Pin_10 // PB.10 -#define AUX_SERIAL_GPIO_PIN_RX GPIO_Pin_11 // PB.11 -#define AUX_SERIAL_GPIO_PinSource_TX GPIO_PinSource10 -#define AUX_SERIAL_GPIO_PinSource_RX GPIO_PinSource11 -#define AUX_SERIAL_GPIO_AF GPIO_AF_USART3 -#define AUX_SERIAL_USART USART3 -#define AUX_SERIAL_USART_IRQHandler USART3_IRQHandler -#define AUX_SERIAL_USART_IRQn USART3_IRQn -#define AUX_SERIAL_DMA_Stream_RX DMA1_Stream1 -#define AUX_SERIAL_DMA_Channel_RX DMA_Channel_4 + #define AUX_SERIAL_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1) + #define AUX_SERIAL_RCC_APB1Periph RCC_APB1Periph_USART3 + #define AUX_SERIAL_GPIO GPIOB + #define AUX_SERIAL_GPIO_PIN_TX GPIO_Pin_10 // PB.10 + #define AUX_SERIAL_GPIO_PIN_RX GPIO_Pin_11 // PB.11 + #define AUX_SERIAL_GPIO_PinSource_TX GPIO_PinSource10 + #define AUX_SERIAL_GPIO_PinSource_RX GPIO_PinSource11 + #define AUX_SERIAL_GPIO_AF GPIO_AF_USART3 + #define AUX_SERIAL_USART USART3 + #define AUX_SERIAL_USART_IRQHandler USART3_IRQHandler + #define AUX_SERIAL_USART_IRQn USART3_IRQn + #define AUX_SERIAL_DMA_Stream_RX DMA1_Stream1 + #define AUX_SERIAL_DMA_Channel_RX DMA_Channel_4 #else -#define AUX_SERIAL_RCC_AHB1Periph 0 -#define AUX_SERIAL_RCC_APB1Periph 0 + #define AUX_SERIAL_RCC_AHB1Periph 0 + #define AUX_SERIAL_RCC_APB1Periph 0 #endif // Telemetry @@ -385,8 +385,8 @@ #define TELEMETRY_TIMER_IRQn TIM1_TRG_COM_TIM11_IRQn #define TELEMETRY_TIMER_IRQHandler TIM1_TRG_COM_TIM11_IRQHandler #if defined(PCBX12S) -#define TELEMETRY_DMA_Stream_RX DMA1_Stream5 -#define TELEMETRY_DMA_Channel_RX DMA_Channel_4 + #define TELEMETRY_DMA_Stream_RX DMA1_Stream5 + #define TELEMETRY_DMA_Channel_RX DMA_Channel_4 #endif #define TELEMETRY_DMA_Stream_TX DMA1_Stream6 #define TELEMETRY_DMA_Channel_TX DMA_Channel_4 @@ -590,7 +590,7 @@ #endif #if !defined(RADIO_T16) -#define EXTERNAL_ANTENNA + #define EXTERNAL_ANTENNA #endif #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2) #define INTMODULE_PWR_GPIO GPIOA @@ -717,9 +717,9 @@ #define INTMODULE_HEARTBEAT_EXTI_IRQn EXTI15_10_IRQn #define INTMODULE_HEARTBEAT_REUSE_INTERRUPT_ROTARY_ENCODER #if defined(PXX2) -#define INTMODULE_HEARTBEAT_TRIGGER EXTI_Trigger_Falling + #define INTMODULE_HEARTBEAT_TRIGGER EXTI_Trigger_Falling #else -#define INTMODULE_HEARTBEAT_TRIGGER EXTI_Trigger_Rising + #define INTMODULE_HEARTBEAT_TRIGGER EXTI_Trigger_Rising #endif // Trainer Port From 656b022c7fe369f3d985b19c8f974516a356ddca Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 6 Jan 2020 22:39:03 +0100 Subject: [PATCH 068/560] Update CREDITS.txt --- CREDITS.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index ce69f45ad..e9ed1bac5 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1682,3 +1682,5 @@ Sylvie Le Madec James Houck (monthly) Frank Steinmetz Gary Garland +Stefano Boggia +Jean-Jacques Pointel From 462ba50b0332a3cee5d36ad0cf102a2534ba7fc9 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 7 Jan 2020 07:25:15 +0100 Subject: [PATCH 069/560] Add internalmulti to T16 simu --- tools/build-companion-nightly.sh | 2 +- tools/build-companion-release.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/build-companion-nightly.sh b/tools/build-companion-nightly.sh index 58d64709c..bd5eb97ad 100755 --- a/tools/build-companion-nightly.sh +++ b/tools/build-companion-nightly.sh @@ -94,7 +94,7 @@ cmake ${COMMON_OPTIONS} -DPCB=X10 ${SRCDIR} make -j${JOBS} libsimulator rm CMakeCache.txt -cmake ${COMMON_OPTIONS} -DPCB=X10 -DPCBREV=T16 ${SRCDIR} +cmake ${COMMON_OPTIONS} -DPCB=X10 -DPCBREV=T16 -DINTERNAL_MODULE_MULTI=YES ${SRCDIR} make -j${JOBS} libsimulator rm CMakeCache.txt diff --git a/tools/build-companion-release.sh b/tools/build-companion-release.sh index 8ecc343c8..0529e9154 100755 --- a/tools/build-companion-release.sh +++ b/tools/build-companion-release.sh @@ -94,7 +94,7 @@ cmake ${COMMON_OPTIONS} -DPCB=X10 ${SRCDIR} make -j${JOBS} libsimulator rm CMakeCache.txt -cmake ${COMMON_OPTIONS} -DPCB=X10 -DPCBREV=T16 ${SRCDIR} +cmake ${COMMON_OPTIONS} -DPCB=X10 -DPCBREV=T16 -DINTERNAL_MODULE_MULTI=YES ${SRCDIR} make -j${JOBS} libsimulator rm CMakeCache.txt From 5cf3632879bdebd6123386a5cbe5c2b98525d62e Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 7 Jan 2020 07:56:41 +0100 Subject: [PATCH 070/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index e9ed1bac5..3ed94c926 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1684,3 +1684,4 @@ Frank Steinmetz Gary Garland Stefano Boggia Jean-Jacques Pointel +Ferenc Kunkli From 20a33a93cd3f9afd24c25e262e351481a8f5b89d Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 7 Jan 2020 10:09:52 +0100 Subject: [PATCH 071/560] Move to discord --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ddf9e4e4b..83960bd84 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ## OpenTX 2.3 Branch [![Travis build Status](https://travis-ci.org/opentx/opentx.svg?branch=2.3)](https://travis-ci.org/opentx/opentx) -[![Join the chat at https://chat.open-tx.org](https://camo.githubusercontent.com/3d659054abd6ce21c0e47cf3b83a51bda69ca282/68747470733a2f2f64656d6f2e726f636b65742e636861742f696d616765732f6a6f696e2d636861742e737667)](https://chat.open-tx.org) +[![Join the Discord chat](https://img.shields.io/badge/Discord_Chat-Join_Chat-yellow.svg)](https://discord.gg/pAmmCp2) [![Donate using Paypal](https://img.shields.io/badge/paypal-donate-yellow.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=DJ9MASSKVW8WN) The ongoing development on 2.3.x is done in this branch. From c9e705b729e8a62bf595cceef3fef439b98d4e6f Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 7 Jan 2020 10:11:47 +0100 Subject: [PATCH 072/560] lower case --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 83960bd84..35ebc3e02 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ## OpenTX 2.3 Branch [![Travis build Status](https://travis-ci.org/opentx/opentx.svg?branch=2.3)](https://travis-ci.org/opentx/opentx) -[![Join the Discord chat](https://img.shields.io/badge/Discord_Chat-Join_Chat-yellow.svg)](https://discord.gg/pAmmCp2) +[![Join the Discord chat](https://img.shields.io/badge/discord_chat-join_chat-yellow.svg)](https://discord.gg/pAmmCp2) [![Donate using Paypal](https://img.shields.io/badge/paypal-donate-yellow.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=DJ9MASSKVW8WN) The ongoing development on 2.3.x is done in this branch. From 22dacf7f8551f31f7d21c33db28e109a0570a00d Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 7 Jan 2020 10:13:07 +0100 Subject: [PATCH 073/560] Cosmetics --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 35ebc3e02..c966e7ed4 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ## OpenTX 2.3 Branch [![Travis build Status](https://travis-ci.org/opentx/opentx.svg?branch=2.3)](https://travis-ci.org/opentx/opentx) -[![Join the Discord chat](https://img.shields.io/badge/discord_chat-join_chat-yellow.svg)](https://discord.gg/pAmmCp2) +[![Join the Discord chat](https://img.shields.io/badge/discord-join_chat-yellow.svg)](https://discord.gg/pAmmCp2) [![Donate using Paypal](https://img.shields.io/badge/paypal-donate-yellow.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=DJ9MASSKVW8WN) The ongoing development on 2.3.x is done in this branch. From aba413c4195ab2bc75c60a111dce45d7e2ab0ee0 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 9 Jan 2020 23:06:00 +0100 Subject: [PATCH 074/560] LUA=NO_MODEL_SCRIPTS didn't work on Horus (#7281) --- radio/src/targets/horus/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index ef9b75c42..a6ede5df9 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -15,7 +15,6 @@ set(NAVIGATION_TYPE horus) set(TARGET_DIR horus) set(LINKER_SCRIPT targets/horus/stm32f4_flash.ld) set(RTC_BACKUP_RAM YES) -set(LUA YES) set(PPM_LIMITS_SYMETRICAL YES) set(USB_SERIAL ON CACHE BOOL "Enable USB serial (CDC)") From b035c6bb298b4f1411ca979497f2e95209fc7b16 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 10 Jan 2020 07:13:08 +0100 Subject: [PATCH 075/560] Wording Cosmetics --- companion/src/firmwares/generalsettings.cpp | 8 +++++--- companion/src/mdichild.cpp | 2 +- companion/src/radiointerface.cpp | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/companion/src/firmwares/generalsettings.cpp b/companion/src/firmwares/generalsettings.cpp index 22934cf57..6cb9fdb9f 100644 --- a/companion/src/firmwares/generalsettings.cpp +++ b/companion/src/firmwares/generalsettings.cpp @@ -114,11 +114,13 @@ GeneralSettings::GeneralSettings() speakerVolume = 12; } - if (IS_HORUS(board)) { - strcpy(bluetoothName, "Horus"); + if (IS_JUMPER_T16(board)) + strcpy(bluetoothName, "t16"); + else if (IS_HORUS(board)) { + strcpy(bluetoothName, "horus"); } else if (IS_TARANIS_X9E(board) || IS_TARANIS_SMALL(board)) { - strcpy(bluetoothName, "Taranis"); + strcpy(bluetoothName, "taranis"); } templateSetup = g.profile[g.sessionId()].channelOrder(); diff --git a/companion/src/mdichild.cpp b/companion/src/mdichild.cpp index a5f25d1ca..c31697a9f 100644 --- a/companion/src/mdichild.cpp +++ b/companion/src/mdichild.cpp @@ -1536,7 +1536,7 @@ void MdiChild::writeEeprom() // write to Tx qDebug() << "Searching for SD card, found" << radioPath; if (radioPath.isEmpty()) { qDebug() << "MdiChild::writeEeprom(): Horus radio not found"; - QMessageBox::critical(this, CPN_STR_TTL_ERROR, tr("Unable to find Horus radio SD card!")); + QMessageBox::critical(this, CPN_STR_TTL_ERROR, tr("Unable to find radio SD card!")); return; } if (saveFile(radioPath, false)) { diff --git a/companion/src/radiointerface.cpp b/companion/src/radiointerface.cpp index 63befdd0c..6c2c50052 100644 --- a/companion/src/radiointerface.cpp +++ b/companion/src/radiointerface.cpp @@ -319,7 +319,7 @@ bool readEeprom(const QString & filename, ProgressWidget * progress) qDebug() << "Searching for SD card, found" << radioPath; if (radioPath.isEmpty()) { QMessageBox::critical(progress, CPN_STR_TTL_ERROR, - QCoreApplication::translate("RadioInterface", "Unable to find Horus radio SD card!")); + QCoreApplication::translate("RadioInterface", "Unable to find radio SD card!")); return false; } RadioData radioData; From 013cf6e9682d5b737031104784e0db286e67ff47 Mon Sep 17 00:00:00 2001 From: Offer Shmuely Date: Fri, 10 Jan 2020 17:01:06 +0200 Subject: [PATCH 076/560] update comments (#7287) --- radio/sdcard/horus/WIDGETS/Timer2/main.lua | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/radio/sdcard/horus/WIDGETS/Timer2/main.lua b/radio/sdcard/horus/WIDGETS/Timer2/main.lua index 6354eee4e..ee4661f2d 100644 --- a/radio/sdcard/horus/WIDGETS/Timer2/main.lua +++ b/radio/sdcard/horus/WIDGETS/Timer2/main.lua @@ -14,12 +14,9 @@ local function create(zone, options) end local function update(wgt, options) - if (wgt==nil) then - print("update(nil)") - return - end + if (wgt == nil) then return end wgt.options = options - print("TimerNumB:" .. options.Timer) + --print("TimerNumB:" .. options.Timer) end local function background(wgt) @@ -28,11 +25,11 @@ end ------------------------------------------------------------ --- This size is for top bar wgts +-- Zone size: top bar widgets local function refreshZoneTiny(wgt) end ---- Size is 160x32 1/8th +--- Zone size: 160x32 1/8th local function refreshZoneSmall(wgt) local t1 = model.getTimer(wgt.options.Timer-1) local timerInfo = string.format("T%s: ", wgt.options.Timer) @@ -41,7 +38,8 @@ local function refreshZoneSmall(wgt) return end ---- Size is 225x98 1/4th (no sliders/trim) +--- Zone size: 180x70 1/4th (with sliders/trim) +--- Zone size: 225x98 1/4th (no sliders/trim) local function refreshZoneMedium(wgt) local t1 = model.getTimer(wgt.options.Timer-1) --print(t1.value) @@ -50,7 +48,7 @@ local function refreshZoneMedium(wgt) lcd.drawTimer(wgt.zone.x, wgt.zone.y+3, t1.value, XXLSIZE + CUSTOM_COLOR) end ---- Size is 192x152 1/2 +--- Zone size: 192x152 1/2 local function refreshZoneLarge(wgt) local t1 = model.getTimer(wgt.options.Timer-1) --print(t1.value) @@ -59,8 +57,8 @@ local function refreshZoneLarge(wgt) lcd.drawTimer(wgt.zone.x, wgt.zone.y+15, t1.value, XXLSIZE + CUSTOM_COLOR) end ---- Size is 390x172 1/1 ---- Size is 460x252 1/1 (no sliders/trim/topbar) +--- Zone size: 390x172 1/1 +--- Zone size: 460x252 1/1 (no sliders/trim/topbar) local function refreshZoneXLarge(wgt) local t1 = model.getTimer(wgt.options.Timer-1) --print(t1.value) From 8c3f226a6e209ed46768d2556d5a04a16c2f8bf8 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 13 Jan 2020 23:43:13 +0100 Subject: [PATCH 077/560] Bsongis/modules sync issue 7288 (#7294) Fixes #7288 --- radio/src/gui/480x272/menus.h | 2 +- radio/src/gui/480x272/view_statistics.cpp | 2 +- radio/src/main.cpp | 7 ++-- radio/src/opentx.h | 4 +- radio/src/pulses/modules_helpers.h | 7 +++- radio/src/pulses/pulses.cpp | 37 +++++++++-------- radio/src/pulses/pxx1.cpp | 20 +++++----- radio/src/pulses/pxx1.h | 4 ++ radio/src/storage/storage_common.cpp | 2 +- .../common/arm/stm32/heartbeat_driver.cpp | 6 ++- radio/src/tasks.cpp | 40 ++++++------------- 11 files changed, 68 insertions(+), 63 deletions(-) diff --git a/radio/src/gui/480x272/menus.h b/radio/src/gui/480x272/menus.h index 836029bd4..a3d9574ca 100644 --- a/radio/src/gui/480x272/menus.h +++ b/radio/src/gui/480x272/menus.h @@ -192,7 +192,7 @@ extern const MenuHandlerFunc menuTabModel[MENU_MODEL_PAGES_COUNT]; enum EnumTabRadio { MENU_RADIO_SETUP, MENU_RADIO_SD_MANAGER, -#if defined(LUA) || defined(PXX2) +#if defined(LUA) || defined(PXX2) || defined(MULTIMODULE) MENU_RADIO_TOOLS, #endif MENU_RADIO_SPECIAL_FUNCTIONS, diff --git a/radio/src/gui/480x272/view_statistics.cpp b/radio/src/gui/480x272/view_statistics.cpp index a0cb92392..179bf546c 100644 --- a/radio/src/gui/480x272/view_statistics.cpp +++ b/radio/src/gui/480x272/view_statistics.cpp @@ -27,7 +27,7 @@ bool menuStatsGraph(event_t event) { - switch(event) { + switch (event) { case EVT_KEY_LONG(KEY_ENTER): g_eeGeneral.globalTimer = 0; storageDirty(EE_GENERAL); diff --git a/radio/src/main.cpp b/radio/src/main.cpp index 3aee248ef..6c2520e72 100644 --- a/radio/src/main.cpp +++ b/radio/src/main.cpp @@ -169,7 +169,8 @@ void checkEeprom() { #if defined(RTC_BACKUP_RAM) && !defined(SIMU) if (TIME_TO_BACKUP_RAM()) { - rambackupWrite(); + if (!globalData.unexpectedShutdown) + rambackupWrite(); rambackupDirtyMsk = 0; } #endif @@ -486,10 +487,10 @@ void perMain() periodicTick(); DEBUG_TIMER_STOP(debugTimerPerMain1); - if (mainRequestFlags & (1 << REQUEST_FLIGHT_RESET)) { + if (mainRequestFlags & (1u << REQUEST_FLIGHT_RESET)) { TRACE("Executing requested Flight Reset"); flightReset(); - mainRequestFlags &= ~(1 << REQUEST_FLIGHT_RESET); + mainRequestFlags &= ~(1u << REQUEST_FLIGHT_RESET); } checkBacklight(); diff --git a/radio/src/opentx.h b/radio/src/opentx.h index f7e0b411f..d89609d1f 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -488,10 +488,12 @@ extern uint8_t flightModeTransitionLast; #define availableMemory() ((unsigned int)((unsigned char *)&_heap_end - heap)) #endif +extern uint32_t nextMixerTime[NUM_MODULES]; + void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms); void evalMixes(uint8_t tick10ms); void doMixerCalculations(); -void scheduleNextMixerCalculation(uint8_t module, uint16_t period_ms); +void scheduleNextMixerCalculation(uint8_t module, uint32_t period_ms); void checkTrims(); void perMain(); diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h index 08addbf26..1f1f30fbe 100644 --- a/radio/src/pulses/modules_helpers.h +++ b/radio/src/pulses/modules_helpers.h @@ -345,6 +345,11 @@ inline int8_t defaultModuleChannels_M8(uint8_t idx) return maxModuleChannels_M8(idx); } +inline uint8_t sentModulePXXChannels(uint8_t idx) +{ + return 8 + g_model.moduleData[idx].channelsCount; +} + inline int8_t sentModuleChannels(uint8_t idx) { if (isModuleCrossfire(idx)) @@ -354,7 +359,7 @@ inline int8_t sentModuleChannels(uint8_t idx) else if (isModuleSBUS(idx)) return 16; else - return 8 + g_model.moduleData[idx].channelsCount; + return sentModulePXXChannels(idx); } inline bool isDefaultModelRegistrationID() diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index 21c4d7eee..289485bf2 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -219,21 +219,21 @@ void enablePulsesExternalModule(uint8_t protocol) } } -void setupPulsesExternalModule(uint8_t protocol) +bool setupPulsesExternalModule(uint8_t protocol) { switch (protocol) { #if defined(PXX1) case PROTOCOL_CHANNELS_PXX1_PULSES: extmodulePulsesData.pxx.setupFrame(EXTERNAL_MODULE); scheduleNextMixerCalculation(EXTERNAL_MODULE, PXX_PULSES_PERIOD); - break; + return true; #endif #if defined(PXX1) && defined(HARDWARE_EXTERNAL_MODULE_SIZE_SML) case PROTOCOL_CHANNELS_PXX1_SERIAL: extmodulePulsesData.pxx_uart.setupFrame(EXTERNAL_MODULE); scheduleNextMixerCalculation(EXTERNAL_MODULE, EXTMODULE_PXX1_SERIAL_PERIOD); - break; + return true; #endif #if defined(PXX2) @@ -241,14 +241,14 @@ void setupPulsesExternalModule(uint8_t protocol) case PROTOCOL_CHANNELS_PXX2_LOWSPEED: extmodulePulsesData.pxx2.setupFrame(EXTERNAL_MODULE); scheduleNextMixerCalculation(EXTERNAL_MODULE, PXX2_PERIOD); - break; + return true; #endif #if defined(SBUS) case PROTOCOL_CHANNELS_SBUS: setupPulsesSbus(); scheduleNextMixerCalculation(EXTERNAL_MODULE, SBUS_PERIOD); - break; + return true; #endif #if defined(DSM2) @@ -257,32 +257,33 @@ void setupPulsesExternalModule(uint8_t protocol) case PROTOCOL_CHANNELS_DSM2_DSMX: setupPulsesDSM2(); scheduleNextMixerCalculation(EXTERNAL_MODULE, DSM2_PERIOD); - break; + return true; #endif #if defined(CROSSFIRE) case PROTOCOL_CHANNELS_CROSSFIRE: setupPulsesCrossfire(); scheduleNextMixerCalculation(EXTERNAL_MODULE, CROSSFIRE_PERIOD); - break; + return true; #endif #if defined(MULTIMODULE) case PROTOCOL_CHANNELS_MULTIMODULE: setupPulsesMultiExternalModule(); scheduleNextMixerCalculation(EXTERNAL_MODULE, MULTIMODULE_PERIOD); - break; + return true; #endif #if defined(PPM) case PROTOCOL_CHANNELS_PPM: setupPulsesPPMExternalModule(); scheduleNextMixerCalculation(EXTERNAL_MODULE, PPM_PERIOD(EXTERNAL_MODULE)); - break; + return true; #endif default: - break; + scheduleNextMixerCalculation(EXTERNAL_MODULE, 50/*ms*/); + return false; } } @@ -338,7 +339,9 @@ bool setupPulsesInternalModule(uint8_t protocol) #if defined(PXX1) && defined(INTMODULE_USART) case PROTOCOL_CHANNELS_PXX1_SERIAL: intmodulePulsesData.pxx_uart.setupFrame(INTERNAL_MODULE); -#if !defined(INTMODULE_HEARTBEAT) +#if defined(INTMODULE_HEARTBEAT) + scheduleNextMixerCalculation(INTERNAL_MODULE, INTMODULE_PXX1_SERIAL_PERIOD + 1 /* backup */); +#else scheduleNextMixerCalculation(INTERNAL_MODULE, INTMODULE_PXX1_SERIAL_PERIOD); #endif return true; @@ -351,11 +354,13 @@ bool setupPulsesInternalModule(uint8_t protocol) if (moduleState[INTERNAL_MODULE].mode == MODULE_MODE_SPECTRUM_ANALYSER || moduleState[INTERNAL_MODULE].mode == MODULE_MODE_POWER_METER) { scheduleNextMixerCalculation(INTERNAL_MODULE, PXX2_TOOLS_PERIOD); } -#if !defined(INTMODULE_HEARTBEAT) else { +#if defined(INTMODULE_HEARTBEAT) + scheduleNextMixerCalculation(INTERNAL_MODULE, PXX2_PERIOD + 1 /* backup */); +#else scheduleNextMixerCalculation(INTERNAL_MODULE, PXX2_PERIOD); - } #endif + } return result; } #endif @@ -375,7 +380,8 @@ bool setupPulsesInternalModule(uint8_t protocol) #endif default: - return true; + scheduleNextMixerCalculation(INTERNAL_MODULE, 50/*ms*/); + return false; } } @@ -410,8 +416,7 @@ bool setupPulsesExternalModule() return false; } else { - setupPulsesExternalModule(protocol); - return true; + return setupPulsesExternalModule(protocol); } } diff --git a/radio/src/pulses/pxx1.cpp b/radio/src/pulses/pxx1.cpp index 0d5dd3d2c..4dfa3be95 100644 --- a/radio/src/pulses/pxx1.cpp +++ b/radio/src/pulses/pxx1.cpp @@ -69,17 +69,17 @@ void Pxx1Pulses::addExtraFlags(uint8_t module) } template -void Pxx1Pulses::addChannels(uint8_t port, uint8_t sendFailsafe, uint8_t sendUpperChannels) +void Pxx1Pulses::addChannels(uint8_t moduleIdx, uint8_t sendFailsafe, uint8_t sendUpperChannels) { uint16_t pulseValue = 0; uint16_t pulseValueLow = 0; - for (int8_t i=0; i<8; i++) { + for (uint8_t i = 0; i < 8; i++) { if (sendFailsafe) { - if (g_model.moduleData[port].failsafeMode == FAILSAFE_HOLD) { + if (g_model.moduleData[moduleIdx].failsafeMode == FAILSAFE_HOLD) { pulseValue = (i < sendUpperChannels ? 4095 : 2047); } - else if (g_model.moduleData[port].failsafeMode == FAILSAFE_NOPULSES) { + else if (g_model.moduleData[moduleIdx].failsafeMode == FAILSAFE_NOPULSES) { pulseValue = (i < sendUpperChannels ? 2048 : 0); } else { @@ -92,7 +92,7 @@ void Pxx1Pulses::addChannels(uint8_t port, uint8_t sendFailsafe, u pulseValue = 2048; } else { - failsafeValue += 2*PPM_CH_CENTER(8+g_model.moduleData[port].channelsStart+i) - 2*PPM_CENTER; + failsafeValue += 2*PPM_CH_CENTER(8+g_model.moduleData[moduleIdx].channelsStart+i) - 2*PPM_CENTER; pulseValue = limit(2049, (failsafeValue * 512 / 682) + 3072, 4094); } } @@ -105,7 +105,7 @@ void Pxx1Pulses::addChannels(uint8_t port, uint8_t sendFailsafe, u pulseValue = 0; } else { - failsafeValue += 2*PPM_CH_CENTER(g_model.moduleData[port].channelsStart+i) - 2*PPM_CENTER; + failsafeValue += 2*PPM_CH_CENTER(g_model.moduleData[moduleIdx].channelsStart+i) - 2*PPM_CENTER; pulseValue = limit(1, (failsafeValue * 512 / 682) + 1024, 2046); } } @@ -113,12 +113,12 @@ void Pxx1Pulses::addChannels(uint8_t port, uint8_t sendFailsafe, u } else { if (i < sendUpperChannels) { - int channel = 8 + g_model.moduleData[port].channelsStart + i; + int channel = 8 + g_model.moduleData[moduleIdx].channelsStart + i; int value = channelOutputs[channel] + 2*PPM_CH_CENTER(channel) - 2*PPM_CENTER; pulseValue = limit(2049, (value * 512 / 682) + 3072, 4094); } - else if (i < sentModuleChannels(port)) { - int channel = g_model.moduleData[port].channelsStart + i; + else if (i < sentModulePXXChannels(moduleIdx)) { + int channel = g_model.moduleData[moduleIdx].channelsStart + i; int value = channelOutputs[channel] + 2*PPM_CH_CENTER(channel) - 2*PPM_CENTER; pulseValue = limit(1, (value * 512 / 682) + 1024, 2046); } @@ -186,7 +186,7 @@ void Pxx1Pulses::setupFrame(uint8_t module) moduleState[module].counter = 1000; } add8ChannelsFrame(module, 0, sendFailsafe); - if (sentModuleChannels(module) > 8) { + if (sentModulePXXChannels(module) > 8) { add8ChannelsFrame(module, 8, sendFailsafe); } return; diff --git a/radio/src/pulses/pxx1.h b/radio/src/pulses/pxx1.h index d2f581580..7c9dd8276 100644 --- a/radio/src/pulses/pxx1.h +++ b/radio/src/pulses/pxx1.h @@ -25,8 +25,12 @@ #include "crc.h" struct HeartbeatCapture { +#if !defined(INTMODULE_USART) uint32_t timestamp; +#endif +#if defined(DEBUG_LATENCY) uint32_t count; +#endif uint8_t valid; }; diff --git a/radio/src/storage/storage_common.cpp b/radio/src/storage/storage_common.cpp index b6ae2d301..396ede0df 100644 --- a/radio/src/storage/storage_common.cpp +++ b/radio/src/storage/storage_common.cpp @@ -25,7 +25,7 @@ uint8_t storageDirtyMsk; tmr10ms_t storageDirtyTime10ms; #if defined(RTC_BACKUP_RAM) -uint8_t rambackupDirtyMsk; +uint8_t rambackupDirtyMsk = EE_GENERAL | EE_MODEL; tmr10ms_t rambackupDirtyTime10ms; #endif diff --git a/radio/src/targets/common/arm/stm32/heartbeat_driver.cpp b/radio/src/targets/common/arm/stm32/heartbeat_driver.cpp index 70ce2b394..25544c33a 100644 --- a/radio/src/targets/common/arm/stm32/heartbeat_driver.cpp +++ b/radio/src/targets/common/arm/stm32/heartbeat_driver.cpp @@ -20,9 +20,9 @@ #include "opentx.h" +#if defined(INTMODULE_HEARTBEAT_GPIO) volatile HeartbeatCapture heartbeatCapture; -#if defined(INTMODULE_HEARTBEAT_GPIO) void init_intmodule_heartbeat() { GPIO_InitTypeDef GPIO_InitStructure; @@ -69,11 +69,13 @@ void check_intmodule_heartbeat() { if (EXTI_GetITStatus(INTMODULE_HEARTBEAT_EXTI_LINE) != RESET) { #if defined(INTMODULE_USART) - heartbeatCapture.timestamp = RTOS_GET_MS(); + nextMixerTime[INTERNAL_MODULE] = RTOS_GET_MS(); #else heartbeatCapture.timestamp = getTmr2MHz(); #endif +#if defined(DEBUG_LATENCY) heartbeatCapture.count++; +#endif EXTI_ClearITPendingBit(INTMODULE_HEARTBEAT_EXTI_LINE); } } diff --git a/radio/src/tasks.cpp b/radio/src/tasks.cpp index 9cbe9e2bd..0e7bd7a09 100644 --- a/radio/src/tasks.cpp +++ b/radio/src/tasks.cpp @@ -73,9 +73,9 @@ bool isForcePowerOffRequested() return false; } -bool isModuleSynchronous(uint8_t module) +bool isModuleSynchronous(uint8_t moduleIdx) { - uint8_t protocol = moduleState[module].protocol; + uint8_t protocol = moduleState[moduleIdx].protocol; if (protocol == PROTOCOL_CHANNELS_PXX2_HIGHSPEED || protocol == PROTOCOL_CHANNELS_PXX2_LOWSPEED || protocol == PROTOCOL_CHANNELS_CROSSFIRE || protocol == PROTOCOL_CHANNELS_NONE) return true; #if defined(INTMODULE_USART) || defined(EXTMODULE_USART) @@ -85,16 +85,16 @@ bool isModuleSynchronous(uint8_t module) return false; } -void sendSynchronousPulses() +void sendSynchronousPulses(uint8_t runMask) { #if defined(HARDWARE_INTERNAL_MODULE) - if (isModuleSynchronous(INTERNAL_MODULE)) { + if ((runMask & (1 << INTERNAL_MODULE)) && isModuleSynchronous(INTERNAL_MODULE)) { if (setupPulsesInternalModule()) intmoduleSendNextFrame(); } #endif - if (isModuleSynchronous(EXTERNAL_MODULE)) { + if ((runMask & (1 << EXTERNAL_MODULE)) && isModuleSynchronous(EXTERNAL_MODULE)) { if (setupPulsesExternalModule()) extmoduleSendNextFrame(); } @@ -104,7 +104,6 @@ uint32_t nextMixerTime[NUM_MODULES]; TASK_FUNCTION(mixerTask) { - static uint32_t lastRunTime; s_pulses_paused = true; while (true) { @@ -134,35 +133,22 @@ TASK_FUNCTION(mixerTask) #endif uint32_t now = RTOS_GET_MS(); - bool run = false; + uint8_t runMask = 0; - if (now - lastRunTime >= 10) { - // run at least every 10ms - run = true; - } - -#if defined(INTMODULE_USART) && defined(INTMODULE_HEARTBEAT) - if ((moduleState[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX2_HIGHSPEED || moduleState[INTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PXX1_SERIAL) && heartbeatCapture.valid && heartbeatCapture.timestamp > lastRunTime) { - run = true; - } -#endif - - if (now == nextMixerTime[0]) { - run = true; + if (now >= nextMixerTime[0]) { + runMask |= (1 << 0); } #if NUM_MODULES >= 2 - if (now == nextMixerTime[1]) { - run = true; + if (now >= nextMixerTime[1]) { + runMask |= (1 << 1); } #endif - if (!run) { + if (!runMask) { continue; // go back to sleep } - lastRunTime = now; - if (!s_pulses_paused) { uint16_t t0 = getTmr2MHz(); @@ -197,12 +183,12 @@ TASK_FUNCTION(mixerTask) if (t0 > maxMixerDuration) maxMixerDuration = t0; - sendSynchronousPulses(); + sendSynchronousPulses(runMask); } } } -void scheduleNextMixerCalculation(uint8_t module, uint16_t period_ms) +void scheduleNextMixerCalculation(uint8_t module, uint32_t period_ms) { // Schedule next mixer calculation time, From 27d88bfb9316863e405f2b994aa9b67f16087e4c Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 14 Jan 2020 17:18:34 +0100 Subject: [PATCH 078/560] Bsongis/modules sync issue 7288 (#7296) --- radio/src/gui/480x272/widget.h | 2 + radio/src/lua/CMakeLists.txt | 1 + radio/src/targets/horus/CMakeLists.txt | 37 ++++++++++++++- radio/src/targets/horus/board.h | 4 +- radio/src/targets/taranis/board.h | 4 +- radio/src/telemetry/frsky.h | 4 +- radio/util/generate_datacopy.py | 62 ++++++++++++++++++-------- 7 files changed, 88 insertions(+), 26 deletions(-) diff --git a/radio/src/gui/480x272/widget.h b/radio/src/gui/480x272/widget.h index e0b4fa771..65a19ad2e 100644 --- a/radio/src/gui/480x272/widget.h +++ b/radio/src/gui/480x272/widget.h @@ -22,7 +22,9 @@ #define _WIDGET_H_ #include +#include #include "zone.h" +#include "debug.h" #define MAX_WIDGET_OPTIONS 5 diff --git a/radio/src/lua/CMakeLists.txt b/radio/src/lua/CMakeLists.txt index 54afd853f..9c5a952bb 100644 --- a/radio/src/lua/CMakeLists.txt +++ b/radio/src/lua/CMakeLists.txt @@ -10,6 +10,7 @@ endmacro(add_lua_export_target) set(LUA_INCLUDES -DCPUARM -DLUA -DLUA_INPUTS -DLUA_EXPORT_GENERATION -DSIMU + -I${RADIO_SRC_DIRECTORY} -I${RADIO_SRC_DIRECTORY}/targets/${TARGET_DIR} -I${RADIO_SRC_DIRECTORY}/thirdparty -I${RADIO_SRC_DIRECTORY}/targets/common/arm/stm32 diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index a6ede5df9..a1ac28f08 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -227,11 +227,46 @@ set(STM32LIB_SRC STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dma2d.c ) +MACRO(GET_GCC_INCLUDE_PATH gcc_include_path) + if (WIN32) + execute_process(COMMAND arm-none-eabi-gcc -v -x c -E NUL ERROR_VARIABLE _gcc_output OUTPUT_QUIET) + else() + execute_process(COMMAND arm-none-eabi-gcc -v -x c -E - INPUT_FILE /dev/null ERROR_VARIABLE _gcc_output OUTPUT_QUIET) + endif() + + # Build an array of string from the GCC output + string(REPLACE "\n" ";" _gcc_output "${_gcc_output}") + + set(_capture_include FALSE) + set(_include_path "") + + # Go through the lines and capture between '"#include <...> search starts here:"' and 'End of search list.' + foreach(_line ${_gcc_output}) + if(${_line} STREQUAL "End of search list.") + set(_capture_include FALSE) + endif() + + if(_capture_include) + # Remove the leading and trailing empty characters + string(REPLACE "\r" "" _line ${_line}) + string(SUBSTRING "${_line}" 1 -1 _line) + set(_include_path "${_include_path}" "-I${_line}") + endif() + + if(${_line} STREQUAL "#include <...> search starts here:") + set(_capture_include TRUE) + endif() + endforeach() + set(${gcc_include_path} ${_include_path}) +ENDMACRO() + if(PYTHONINTERP_FOUND) + GET_GCC_INCLUDE_PATH(arm_gcc_include_path) + add_custom_command( OUTPUT ${PROJECT_BINARY_DIR}/radio/src/datacopy.cpp WORKING_DIRECTORY ${RADIO_DIRECTORY}/src - COMMAND ${PYTHON_EXECUTABLE} ${RADIO_DIRECTORY}/util/generate_datacopy.py datastructs.h -DPCBHORUS -DPCBX10 -DCPUARM -DCOLORLCD -DBACKUP -Itargets/horus > ${PROJECT_BINARY_DIR}/radio/src/datacopy.cpp + COMMAND ${PYTHON_EXECUTABLE} ${RADIO_DIRECTORY}/util/generate_datacopy.py datastructs.h -DPCBHORUS -DPCBX10 -DCPUARM -DSTM32F4 -DSTM32F429_439xx -DCOLORLCD -DBACKUP -DSIMU -I. -Itargets/horus -Itargets/common/arm/stm32 -I${THIRDPARTY_DIR} -I${THIRDPARTY_DIR}/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/CMSIS/Device/ST/STM32F4xx/Include ${arm_gcc_include_path} > ${PROJECT_BINARY_DIR}/radio/src/datacopy.cpp DEPENDS ${RADIO_DIRECTORY}/src/datastructs.h ${RADIO_DIRECTORY}/util/generate_datacopy.py ) add_custom_target(datacopy diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index c6cb49e87..c0289331d 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -21,8 +21,8 @@ #ifndef _BOARD_H_ #define _BOARD_H_ -#include "../definitions.h" -#include "../opentx_constants.h" +#include "definitions.h" +#include "opentx_constants.h" #include "board_common.h" #include "hal.h" diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index b10a13186..4f7e2cd87 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -22,8 +22,8 @@ #define _BOARD_H_ #include -#include "../definitions.h" -#include "../opentx_constants.h" +#include "definitions.h" +#include "opentx_constants.h" #include "board_common.h" #include "hal.h" diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index d4a9ab87a..e99c0f237 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -21,9 +21,9 @@ #ifndef _FRSKY_H_ #define _FRSKY_H_ -#include "../definitions.h" +#include "../../definitions.h" #include "telemetry_holders.h" -#include "../io/frsky_pxx2.h" +#include "../../io/frsky_pxx2.h" // Receive buffer state machine state enum enum FrSkyDataState { diff --git a/radio/util/generate_datacopy.py b/radio/util/generate_datacopy.py index 6da1c871b..93f7c79a5 100755 --- a/radio/util/generate_datacopy.py +++ b/radio/util/generate_datacopy.py @@ -1,30 +1,33 @@ #!/usr/bin/env python -from __future__ import print_function - import sys import clang.cindex import time import os -if sys.platform == "darwin": - if os.path.exists('/usr/local/Cellar/llvm/6.0.0/lib/libclang.dylib'): - clang.cindex.Config.set_library_file('/usr/local/Cellar/llvm/6.0.0/lib/libclang.dylib') - elif os.path.exists('/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libclang.dylib'): - clang.cindex.Config.set_library_file('/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libclang.dylib') - elif os.path.exists('/Library/Developer/CommandLineTools/usr/lib/libclang.dylib'): - clang.cindex.Config.set_library_file('/Library/Developer/CommandLineTools/usr/lib/libclang.dylib') -elif sys.platform.startswith("linux"): - for version in ("7", "6.0", "3.8"): - libclang = "/usr/lib/x86_64-linux-gnu/libclang-%s.so.1" % version - if os.path.exists(libclang): - clang.cindex.Config.set_library_file(libclang) - break structs = [] extrastructs = [] +def find_libclang(): + if sys.platform == "darwin": + for path in ("/usr/local/Cellar/llvm/6.0.0/lib/libclang.dylib", + "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/libclang.dylib", + "/Library/Developer/CommandLineTools/usr/lib/libclang.dylib"): + if os.path.exists(path): + return path + elif sys.platform.startswith("linux"): + for version in ("7", "6.0", "3.8"): + path = "/usr/lib/x86_64-linux-gnu/libclang-%s.so.1" % version + if os.path.exists(path): + return path + for path in ("/usr/local/lib/libclang.so", + "/usr/lib/libclang.so"): + if os.path.exists(path): + return path + + def build_struct(cursor, anonymousUnion=False): if not anonymousUnion: structs.append(cursor.spelling) @@ -98,7 +101,28 @@ def header(): print("// This file was auto-generated by %s script on %s. Do not edit this file!\n\n\n" % (os.path.basename(sys.argv[0]), time.asctime())) -index = clang.cindex.Index.create() -translation_unit = index.parse(sys.argv[1], ['-x', 'c++', '-std=c++11'] + sys.argv[2:]) -header() -build(translation_unit.cursor) +def print_translation_unit_diags(diags, prefix=''): + for diag in diags: + print(prefix + str(diag), file=sys.stderr) + print_translation_unit_diags(diag.children, ' ' + prefix) + + +def main(): + libclang = find_libclang() + if libclang: + # print(libclang, file=sys.stderr) + clang.cindex.Config.set_library_file(libclang) + + index = clang.cindex.Index.create() + translation_unit = index.parse(sys.argv[1], ['-x', 'c++', '-std=c++11'] + sys.argv[2:]) + + if translation_unit.diagnostics: + print_translation_unit_diags(translation_unit.diagnostics) + sys.exit(-1) + + header() + build(translation_unit.cursor) + + +if __name__ == "__main__": + main() From 57cd2445ec27cf4c7e94ad2230d59f54bea1e70b Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 15 Jan 2020 09:56:23 +0100 Subject: [PATCH 079/560] Fix wrong default for 128 LS timers --- radio/src/gui/128x64/model_logical_switches.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/model_logical_switches.cpp b/radio/src/gui/128x64/model_logical_switches.cpp index 90fc08481..0ce6bb44b 100644 --- a/radio/src/gui/128x64/model_logical_switches.cpp +++ b/radio/src/gui/128x64/model_logical_switches.cpp @@ -83,7 +83,7 @@ void menuModelLogicalSwitchOne(event_t event) uint8_t new_cstate = lswFamily(cs->func); if (cstate != new_cstate) { if (new_cstate == LS_FAMILY_TIMER) { - cs->v1 = cs->v2 = 0; + cs->v1 = cs->v2 = -119; } else if (new_cstate == LS_FAMILY_EDGE) { cs->v1 = 0; cs->v2 = -129; cs->v3 = 0; From db7d241306c2bd7ff489fa03d4dcf1e31d550bf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Charpentier?= Date: Wed, 15 Jan 2020 10:45:36 +0100 Subject: [PATCH 080/560] Fr Translation (#7297) * initial version * Updated French Translation. --- companion/src/translations/companion_fr.ts | 586 +++++++++++---------- 1 file changed, 298 insertions(+), 288 deletions(-) diff --git a/companion/src/translations/companion_fr.ts b/companion/src/translations/companion_fr.ts index 8f69bf1bb..b4ff19c18 100644 --- a/companion/src/translations/companion_fr.ts +++ b/companion/src/translations/companion_fr.ts @@ -728,58 +728,58 @@ Manche Droit: Profondeur, Direction Boards - + Left Horizontal Gauche Horizontal - + Left Vertical Gauche Vertical - + Right Vertical Droit Vertical - + Right Horizontal Droit Horizontal - + Aux. 1 - + Aux. 2 - - + + Unknown Inconnu - + Rud Dir - + Ele Prf - + Thr Gaz - + Ail @@ -1581,7 +1581,7 @@ Si vous avez un fichier de sauvegarde des paramètres, vous pouvez l'import Trainer - Écolage + Écolage Manches @@ -1605,193 +1605,198 @@ Si vous avez un fichier de sauvegarde des paramètres, vous pouvez l'import + Trainer Channels + Écolage Channels + + + Instant Trim Trims instantanés - + Play Sound Jouer Son - + Haptic Vibreur - + Reset Remise à zéro - + Set Timer %1 Définir chrono %1 - + Vario - + Play Track Jouer fichier - + Play Both Jouer les deux - + Play Value Lire valeur - + Play Script Exécuter script - + SD Logs Logs SD - + Volume - + Backlight Rétroéclairage - + Screenshot Capture d'écran - + Background Music Musique de fond - + Background Music Pause Pause musique de fond - + Adjust %1 Ajuster %1 - + SetFailsafe Int. Module Définir failsafe module interne - + SetFailsafe Ext. Module Définir failsafe module externe - + RangeCheck Int. Module Test portée module interne - + RangeCheck Ext. Module Test portée module externe - + Bind Int. Module Bind module interne - + Bind Ext. Module Bind module externe - + Timer1 Chrono 1 - + Timer2 Chrono 2 - + Timer3 Chrono 3 - + Flight Vol - + Telemetry Télémétrie - + Rotary Encoder Sélecteur Rotatif - + REa - + REb - + s - - - + + + <font color=red><b>Inconsistent parameter</b></font> <font color=red><b>Paramètre inconsistant</b></font> - + Value Valeur - + played once, not during startup !1x Lu une fois, mais pas à la mise en route - + repeat(%1s) Répéter chaque %1s - + DISABLED DESACTIVE - + CFN FPN @@ -2114,13 +2119,13 @@ Si vous avez un fichier de sauvegarde des paramètres, vous pouvez l'import OpenTX n'accepte que %1 points au maximum entre toutes les courbes - - + + OpenTX on this board doesn't accept this function OpenTX ne supporte pas cette fonction sur cette carte - + OpenTX doesn't accept this radio protocol OpenTX ne supporte pas ce protocole radio @@ -2200,12 +2205,12 @@ Pour <b>retirer un filtre de l'historique</b>, sélectionnez-le Basculer le filtre on/off. - + <html><head><style>kbd {background-color: palette(alternate-base); font-size: large; white-space: nowrap;}</style></head><body><p>The filter supports two syntax types: basic matching with common wildcards as well as full Perl-style (<code>pcre</code>) Regular Expressions.</p><p>By default a filter will only show lines which match (<b>inclusive</b>). To make an <b>exclusive</b> filter which removes matching lines, prefix the filter expression with a <kbd>!</kbd> (exclamation mark).</p><p>To use <b>Regular Expressions</b> (RegEx), prefix the filter text with a <kbd>/</kbd> (slash) or <kbd>^</kbd> (up caret). <ul><li>Put the <kbd>/</kbd> or <kbd>^</kbd> after the exclusive <kbd>!</kbd> indicator if you're using one.</li><li>By default the match is case-sensitive. To make it insensitive, add the typical <kbd>/i</kbd> (slash i) operator at the end of your RegEx.</li><li>If you use a caret (^) to denote a RegEx, it will become part of the Reg. Ex. (that is, matches from start of line).</li><li>If the RegEx is invalid, the filter edit field should show a red border and you will not be able to enable the filter.</li><li>A useful resource for testing REs (with a full reference) can be found at <a href="http://www.regexr.com/">http://www.regexr.com/</a></li></ul></p><p>To use <b>basic matching</b> just type any text.<ul><li>Wildcards: <kbd>*</kbd> (asterisk) matches zero or more of any character(s), and <kbd>?</kbd> (question mark) matches any single character.</li><li>The match is always case-insensitive.</li><li>The match always starts from the beginning of a log line. To ignore characters at the start, use a leading <kbd>*</kbd> wildcard.</li><li>A trailing <kbd>*</kbd> is always implied (that is, matches anything to the end of the log line). To avoid this, use a RegEx.</li><li>You can match literal wildcard characters by prefixing them with a <kbd>\</kbd> (backslash) character (eg. "foo\*bar" matches "foo*bar").</li></ul></p><p>After <b>editing text</b>, press ENTER or TAB key (or click anywhere outside the box) to update the filter.</p><p>To <b>remove an entry</b> from the filter selector list, first choose it, and while in the line editor press <kbd>Shift-Delete</kbd> (or <kbd>Shift-Backspace</kbd>) key combination. The default filters cannot be removed. Up to 50 filters are stored.</p></body></html> <html><head><style>kbd {background-color: palette(alternate-base); font-size: large; white-space: nowrap;}</style></head><body><p>Le filtre supporte deux types de syntaxes: la recherche simple utilisant les métacaractères ou la recherche avancée utilisant les expressions régulières (<code>RegEx</code>) de type Perl.</p><p>Par défaut, un filtre ne montre que les lignes qui correspondent (<b>inclusif</b>). Pour faire un filtre <b>exclusif</b> qui supprime les lignes de correspondance, préfixez l'expression du filtre avec un <kbd>!</kbd> (point d'exclamation).</p><p>Pour utiliser les <b>Expressions Régulières</b> (RegEx), préfixez le texte du filtre avec un <kbd>/</kbd> (slash) ou <kbd>^</kbd> (accent circonflexe).<ul><li>Il faut mettre le <kbd>!</kbd> <u>avant</u> le <kbd>/</kbd> ou <kbd>^</kbd> dans le cas d'un filtre exclusif.</li><li>Par défaut, la correspondance est sensible à la casse (ex: a &ne; A). Pour la rendre insensible (ex: a = A), ajoutez l'opérateur typique <kbd>/i</kbd> (slash i) à la fin de votre RegEx.</li><li>Si vous utilisez un <kbd>^</kbd> pour désigner une RegEx, il deviendra une partie de la RegEx (<kbd>^</kbd> est le caractère de début de chaîne).</li><li>Si la RegEx n'est pas valide, le champ d'édition du filtre affichera une bordure rouge et vous ne pourrez pas activer le filtre.</li><li>Une ressource utile pour tester les RegExs (avec une référence complète) peut être trouvée sur le site <a href="http://www.regexr.com/">http://www.regexr.com/</a> (tutoriel en français: <a href="http://perl.mines-albi.fr/DocFr/perlretut.html">Expressions rationnelles/régulières en Perl</a>)</li></ul></p><p>Pour utiliser la <b>recherche simple</b>, tapez simplement le texte recherché.<ul><li>Métacaractères: le quantificateur <kbd>*</kbd> (astérisque) correspond à zéro ou plus de n'importe quel caractère, et le quantificateur <kbd>?</kbd> (point d'interrogation) correspond à un caractère unique.</li><li>La correspondance est toujours sensible à la casse.</li><li>La correspondance commence toujours au début du Log. Pour ignorer les caractères au début, utilisez le métacaractère <kbd>*</kbd>.</li><li>Un métacaractère <kbd>*</kbd> est implicitement ajouté à la fin (ainsi, toutes les correspondances valides soient bien affichées jusqu'à la fin du Log). Si vous voulez éviter ce métacaractère implicite, il faut utiliser une RegEx.</li><li>Pour rechercher un caractère qui est lui-même un métacaractère, il faut préfixer avec un <kbd>\</kbd> (backslash) (ex: "<i>toto\*titi</i>" correspond à "<i>toto*titi</i>").</li></ul></p><p>Quand l'<b>édition</b> est terminée, appuyez sur la touche ENTRER ou TAB (ou cliquez n'importe où à l'extérieur du champ du filtre) afin de mettre à jour le filtre.</p><p>Pour <b>retirer un filtre de l'historique</b>, sélectionnez-le d'abord, puis faite le raccourci clavier <kbd>Shift-Suppr</kbd> (ou <kbd>Shift-Retour Arrière</kbd>). Les filtres par défaut ne peuvent pas être effacés. Jusqu'à 50 filtres peuvent être mémorisés.</p></body></html> - + Debug Console Filter Help Aide sur les filtres pour la console de débogage @@ -2857,267 +2862,272 @@ Blanc signifie "inclure tous".Les métacaractères ?, * et [...] sont Firmware - + Channel values displayed in us Positions de voies affichées en µs - + No OverrideCH functions available Désactive la fonction spéciale "Remplacer VOIExx" - + Possibility to enable FAI MODE (no telemetry) at field Possibilité d'activer le mode FAI (télémétrie désactivée) sur le terrain - + FAI MODE (no telemetry) always enabled Mode FAI (télémétrie toujours désactivée) - + Removes D8 FrSky protocol support which is not legal for use in the EU on radios sold after Jan 1st, 2015 Masque le protocole D8. Légalement obligatoire sur les radios Européennes importées après le 1er janvier 2015 - - + + Disable HELI menu and cyclic mix support Supprimer le menu HELICO et les mixages cycliques - - + + Disable Global variables Supprimer le support des variables globales - - + + Enable Lua custom scripts screen Activer l'écran des scripts Lua personnalisés - + Support for PPM internal module hack Support du remplacement du module interne par un module PPM - + Use alternative SQT5 font Utiliser la police alternative SQT5 - + Disable RAS (SWR) Désactiver le RAS (SWR). Utile uniquement pour les X9D+ avec un RAS/SWR non fonctionnel - + Pots use in menus navigation Support de la navigation dans les menus avec les POTS - + FrSky Taranis X9D+ - + FrSky Taranis X9D+ 2019 - + FrSky Taranis X9D - + Haptic module installed Module vibreur installé - + FrSky Taranis X9E - + Confirmation before radio shutdown Confirmation avant l'arrêt de la radio - + Horus gimbals installed (Hall sensors) Manches Horus à effet HALL installés - + FrSky Taranis X9-Lite - + FrSky Taranis X9-Lite S - + FrSky Taranis X7 / X7S - + + FrSky Taranis X7 / X7S Access + + + + FrSky Taranis X-Lite S/PRO - + FrSky Taranis X-Lite - + FrSky Horus X10 / X10S - - + + Support for ACCESS internal module replacement Prise en charge du module de remplacement interne ACCESS - + FrSky Horus X10 Express / X10S Express - + FrSky Horus X12S - + Use ONLY with first DEV pcb version Exclusivement pour les Horus DEV - + Enable non certified R9M firmwares Activer les firmwares R9M non certifiés - - + + Support for MULTI internal module Prise en charge du module MULTI interne - + Support for bluetooth module Prise en charge du module Bluetooth - + Turnigy 9XR-PRO - + Enable HELI menu and cyclic mix support Activer le menu hélico et les mixages CCPM - + Global variables Variables globales - + Enable non certified firmwares Activer les firmwares non certifiés - + In model setup menus automatically set source by moving the control Sélectionner les sources des mixeurs en bougeant le contrôle désiré - + In model setup menus automatically set switch by moving the control Sélectionner les interrupteurs en bougeant le contrôle désiré - + No graphical check boxes and sliders Pas de cases à cocher et de curseurs graphiques - + Battery graph Graphique de la batterie - + Don't use bold font for highlighting active items Ne pas mettre les lignes actives en gras - + Turnigy 9XR with m128 chip Turnigy 9XR avec une puce m128 - + Turnigy 9XR - + 9X with stock board 9X avec carte mère d'origine - + Enable resetting values by pressing up and down at the same time Permet la remise à zéro des valeurs en pressant haut-bas en même temps, valeur min avec gauche/bas, valeur max avec haut/droite, inversion avec gauche/droite - + 9X with stock board and m128 chip Carte 9x avec un chip m128 - + 9X with AR9X board 9X avec carte AR9X - + Jumper T12 / T12 Pro - + Jumper T16 / T16+ / T16 Pro - + 9X with Sky9x board 9X avec carte Sky9x - + 9X with Gruvin9x board 9X avec carte Gruvin9x - + DIY MEGA2560 radio Radio DIY à base de MEGA2560 @@ -4047,7 +4057,7 @@ Communs à tous les modèles d'une même EEPROM. GeneralSettings - + Radio Settings Paramètres de la radio @@ -6057,14 +6067,14 @@ Les colonnes contenant l'altitude "GAlt" et la vitesse "GSpd MainWindow - - + + Edit Édition - - + + File Fichier @@ -6114,17 +6124,17 @@ Les colonnes contenant l'altitude "GAlt" et la vitesse "GSpd Notes de version - + Compare models Comparer les modèles - + Show fuses dialog Afficher les paramètres des fusibles - + A monochrome black icon theme Thème avec icônes monochromes noires @@ -6147,214 +6157,214 @@ Nous recommandons de lire attentivement les notes de version à l'aide du b - + Synchronize SD Synchroniser la carte SD - + New Nouveau - + Open... Ouvrir... - + A monochrome white icon theme Thème avec icônes monochromes blanches - + A monochrome blue icon theme Thème avec icônes monochromes bleues - + Small Petites - + Use small toolbar icons Petites icônes de barre d'outils - + Use normal size toolbar icons Icônes de barre d'outils normales - + Normal Normales - + Use big toolbar icons Grosses icônes de barre d'outils - + Big Grandes - + Use huge toolbar icons Immenses icônes de barre d'outils - + Huge Immenses - + List programmers... Lister les programmateurs... - + Fuses... Fusibles... - + Read Firmware from Radio Lire le firmware de la radio - + Read firmware from Radio Lire le firmware de la radio - + Write Firmware to Radio Transférer le firmware à la radio - + Write firmware to Radio Transférer le firmware à la radio - + Add Radio Profile Ajouter un profil de radio - + Manuals and other Documents Manuels et documents - + Open the OpenTX document page in a web browser Ouvre la page de documentation d'OpenTX dans un navigateur - + Write Models and Settings To Radio Transférer les paramètres et modèles vers la radio - + Write Models and Settings to Radio Transférer les paramètres et modèles vers la radio - + Read Models and Settings from Radio Lire les paramètres et modèles depuis la radio - + OpenTX Companion %1 - Radio: %2 - Profile: %3 OpenTX Companion %1 - Radio: %2 - Profil: %3 - + List of recently used files Liste des fichiers récemment utilisés - + Radio Profiles Profil radio - + Create or Select Radio Profiles Créer ou Sélectionner un profil radio - + Configure Communications... Configurer les communications... - + Configure software for communicating with the Radio Configurer le programme gérant les communications avec la radio - + Write Backup to Radio Transférer une sauvegarde à la radio - + Write Backup from file to Radio Transférer une sauvegarde à la radio - + Backup Radio to File Sauvegarder la radio - + Save a complete backup file of all settings and model data in the Radio Créer une copie de sauvegarde de tous les paramètres et modèles de la radio - + Contributors... Contributeurs... - + A tribute to those who have contributed to OpenTX and Companion Remerciements à tout ceux qui ont contribué à OpenTX et Companion - + SD card synchronization Synchronisation de la carte SD - + Recent Files Fichiers récents - + Set Icon Theme Choisir le thème d'icônes - + Set Icon Size Choisir la taille des icônes - + Write Ecrire @@ -6374,12 +6384,12 @@ Nous recommandons de lire attentivement les notes de version à l'aide du b Si vous trouvez ce programme utile, merci de le supporter par une <a href='%1'>donation</a> - + Ready Prêt - + Show the application's About box Afficher la fenêtre "A propos" de l'application @@ -6391,7 +6401,7 @@ Nous recommandons de lire attentivement les notes de version à l'aide du b - + Open Models and Settings file Ouvrir un fichier de paramètres et modèles @@ -6402,7 +6412,7 @@ Nous recommandons de lire attentivement les notes de version à l'aide du b Fichier sauvegardé - + Read Models and Settings From Radio Lire les paramètres et modèles depuis la radio @@ -6437,7 +6447,7 @@ Nous recommandons de lire attentivement les notes de version à l'aide du b Language non valide - + Some text will not be translated until the next time you start Companion. Please note that some translations may not be complete. Certains textes ne seront pas traduits avant le prochain redémarrage de Companion. Veuillez noter que certaines traductions peuvent ne pas être complètes. @@ -6493,78 +6503,78 @@ Nous recommandons de lire attentivement les notes de version à l'aide du b - + Create a new Models and Settings file Créer un nouveau fichier de paramètres et modèles - - + + Save Models and Settings file Enregistrer le fichier de paramètres et modèles - + Save Enregistrer - + Save As... Enregistrer sous... - + Close Fermer - + Close Models and Settings file Fermer le fichier de paramètres et modèles - + Exit the application Quitter l'application - + Exit Quitter - + Create a new Radio Settings Profile Créer un nouveau profil de paramètres et modèles - + Copy Current Radio Profile Copier le profil radio actuel - + Duplicate current Radio Settings Profile Dupliquer les paramètres radio du profil actuel - + Delete the current Radio Settings Profile Supprimer les paramètres radio du profil actuel - + Use default system language. Utiliser le langage système par défaut. - + Use %1 language (some translations may not be complete). Utiliser la langue %1 (certaines traductions peuvent être incomplètes). - + Classical Classique @@ -6693,287 +6703,287 @@ Do you wish to continue? Pas de Radio ou carte SD de détectée ! - + Release notes... Notes de version... - + Show release notes Afficher les notes de version - + Delete Current Radio Profile... Supprimer le profil radio actuel... - + Export Application Settings.. Exporter Préférences Application... - + Save all the current %1 and Simulator settings (including radio profiles) to a file. Enregistrez tous les paramètres actuels %1 et du simulateur (y compris les profils radio) dans un fichier. - + Import Application Settings.. Importer les paramètres de l'application... - + Load %1 and Simulator settings from a prevously exported settings file. Charger les paramètres %1 et les paramètres de Simulation depuis un fichier précédemment exporté. - + Tabbed Windows Fenêtres à onglets - + Use tabs to arrange open windows. Utilisez les onglets pour organiser les fenêtres ouvertes. - + Tile Windows Titre de la fenêtre - + Arrange open windows across all the available space. Disposez les fenêtres ouvertes sur tout l'espace disponible. - + Cascade Windows Fenêtres en cascade - + Arrange all open windows in a stack. Organisez toutes les fenêtres ouvertes dans une pile. - + Close All Windows Fermer toutes les fenêtres - + Closes all open files (prompts to save if necessary. Fermer tous les fichiers ouverts (proposer de sauvegarder si nécessaire). - + Window Fenêtre - + Ctrl+Shift+S - + Ctrl+Alt+L - + Ctrl+Alt+D - + Ctrl+Alt+R - + The classic companion9x icon theme Thème d'icônes classique de Companion - + Yerico - + Yellow round honey sweet icon theme Thème d'icônes rondes jaunes - + Monochrome - + MonoWhite Monochrome Blanc - + Alt+%1 - + - Copy - Copier - + Companion :: Open files warning Companion::Ouvrir les fichiers d'avertissement - + Please save or close modified file(s) before deleting the active profile. Veuillez sauvegarder ou fermer le(s) fichier(s) modifié(s) avant de supprimer le profil actif. - + Not possible to remove profile Impossible de supprimer le profil - + The default profile can not be removed. Le profil par défaut ne peut pas être supprimé. - + Confirm Delete Profile Confirmer la suppression du profil - + Are you sure you wish to delete the "%1" radio profile? There is no way to undo this action! Etes-vous sûr de vouloir supprimer le profil radio %1? Cette action est irréversible! - + Please save or close all modified files before importing settings Veuillez sauvegarder ou fermer tous les fichiers modifiés avant d'importer les paramètres - + <html><p>%1 and Simulator settings can be imported (restored) from a previosly saved export (backup) file. This will replace current settings with any settings found in the file.</p><p>An automatic backup of the current settings will be attempted. But if the current settings are useful then it is recommended that you make a manual backup first.</p><p>For best results when importing settings, <b>close any other %1 windows you may have open, and make sure the standalone Simulator application is not running.</p><p>Do you wish to continue?</p></html> <html><p>%1 et les paramètres du simulateur peuvent être importés (restaurés) à partir d’un fichier d’exportation (sauvegarde) préalablement sauvegardé. Ceci remplacera les paramètres actuels par tous les paramètres trouvés dans le fichier.</p><p>Une sauvegarde automatique des paramètres actuels sera tentée. Mais si les paramètres actuels sont utiles, il est recommandé de commencer par une sauvegarde manuelle.</p><p>Pour obtenir de meilleurs résultats lors de l'importation des paramètres,<b> fermez les autres fenêtres %1 que vous avez éventuellement ouvertes et assurez-vous que l'application autonome Simulator n'est pas en cours d'exécution. </p><p>Souhaitez-vous continuer? </p></html> - + Confirm Settings Import Confirmer les paramètres d'importation - + Select %1: Sélectionnez %1: - + backup sauvegarde - + Press the 'Ignore' button to continue anyway. Appuyez sur le bouton 'Ignorer' pour continuer quand même. - + The settings could not be imported. Les paramètres n'ont pas pu être importés. - + <html><p>New settings have been imported from:<br> %1.</p><p>%2 will now re-initialize.</p><p>Note that you may need to close and restart %2 before some settings like language and icon theme take effect.</p> <html><p>Les nouveaux paramètres ont été importés depuis:<br> %1. </p><p>%2 sera maintenant réinitialisé.</p><p>Notez que vous devrez peut-être fermer et redémarrer %2 avant que certains paramètres tels que la langue et le thème d’icône prennent effet.</p> - + <p>The previous settings were backed up to:<br> %1</p> <p>Les paramètres précédents ont été sauvegardés sous:<br> %1 </p> - + MonoBlue Monochrome Bleu - + System language Langue du système - + About... A propos... - + View Log File... Ouvrir un Log... - + Open and view log file Ouvrir et visualiser un log - + Settings... Préférences... - + Edit Settings Éditer les préférences - + Download... Télécharger... - + Download firmware and voice files Télécharger firmware et fichiers son - + Check for Updates... Vérifier les mises à jour... - + Check OpenTX and Companion updates Vérifier les mises à jour d'OpenTX et Companion - + Compare Models... Comparer 2 modèles... - + Edit Radio Splash Image... Éditer l'écran d'accueil de la radio... - + Edit the splash image of your Radio Éditer l'écran d'accueil de la radio - + List available programmers Lister les programmateurs supportés @@ -6990,8 +7000,8 @@ Do you wish to continue? Aucune mise à jour disponible. - - + + Help Aide @@ -7011,27 +7021,27 @@ Do you wish to continue? A propos de Companion - + Set Menu Language Choisir la langue des menus - + Settings Paramètres - + Read/Write Transfert - + %2 - + New Radio Nouvelle radio @@ -7328,11 +7338,6 @@ Do you wish to continue? Companion :: Conversion Result for %1 Companion :: Résultat de conversion de %1 - - - Unable to find Horus radio SD card! - Impossible de trouver la carte SD de la Horus ! - Models and Settings written @@ -7399,6 +7404,11 @@ Do you wish to continue? <p><b>Currently selected radio type (%1) is not compatible with file %3 (from %2), models and settings need to be converted.</b></p> <p><b>Le type de radio actuellement sélectionné (%1) n'est pas compatible avec le fichier %3 (à partir de %2), les modèles et les paramètres doivent être convertis.</b></p> + + + Unable to find radio SD card! + Impossible de trouver la carte SD de la radio! + Open backup Models and Settings file @@ -8961,12 +8971,12 @@ Mixage actif par défaut si non-renseigné. ModuleData - + Positive - + Negative Négative @@ -9047,47 +9057,47 @@ Mixage actif par défaut si non-renseigné. ModulePanel - + Value Valeur - + Hold Maintien - + No Pulse Pas d'impulsion - + Ask Demander - + Internal Interne - + Internal + External Interne + Externe - + External Externe - + Autodetect Format Format Détection auto - + Bind on channel Bind avec VOIE @@ -9589,7 +9599,7 @@ Mixage actif par défaut si non-renseigné. DÉFAUT - + Custom - proto %1) Personnaliser - proto %1) @@ -9620,22 +9630,22 @@ Mixage actif par défaut si non-renseigné. OpenTxEepromInterface - + Unknown error Erreur inconnue - + ... plus %1 errors ... plus %1 erreurs - + Cannot write radio settings Impossible d'écrire les paramètres de la radio - + Cannot write model %1 Impossible d'écrire le modèle %1 @@ -9908,8 +9918,8 @@ Mixage actif par défaut si non-renseigné. - Unable to find Horus radio SD card! - Impossible de trouver la carte SD de la Horus ! + Unable to find radio SD card! + Impossible de trouver la carte SD de la radio! @@ -11025,22 +11035,22 @@ Si cette option est cochée, la voie des gaz est inversée: le ralenti est &apo SetupPanel - + Timer %1 Chrono %1 - + THR GAZ - + Profile Settings Paramètres du profil - + SD structure path not specified or invalid Chemin de la structure SD non spécifié ou invalide @@ -11764,62 +11774,62 @@ La valeur par défaut est configurée dans le profil radio sélectionné.Simulateur Radio (%1) - + Could not determine startup data source. Impossible de déterminer les données source. - + Could not load data, possibly wrong format. Impossible de charger les données, mauvais format. - + Data Load Error Erreur de lecture des données - + Invalid startup data provided. Plese specify a proper file/path. Données de démarrage fournies non valides. Veuillez spécifier un fichier/chemin approprié. - + Simulator Startup Error Erreur de démarrage du simulateur - + Error saving data: could open file for writing: '%1' Erreur de sauvegarde des données: impossible d'écrire le fichier '%1' - + Error saving data: could not get data from simulator interface. Erreur de sauvegarde des données: impossible de récupérer les données depuis l'interface de simulation. - + An unexpected error occurred while attempting to save radio data to file '%1'. Une erreur inattendue s'est produite lors de l'enregistrement des données radio dans le fichier '%1'. - + Data Save Error Erreur de sauvegarde des données - + Cannot open joystick, joystick disabled Impossible d'accéder au Joystick, Joystick désactivé - + Radio firmware error: %1 Erreur firmware radio: %1 - + - Flight Mode %1 (#%2) - Phase de Vol %1 (#%2) From 152a702faaba6bbdb8b5cddb45ec00fe612cc7c5 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 15 Jan 2020 17:40:13 +0100 Subject: [PATCH 081/560] Post 2.3.5 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bcbe62e95..820530334 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ project(OpenTX) set(VERSION_MAJOR "2") set(VERSION_MINOR "3") -set(VERSION_REVISION "5") +set(VERSION_REVISION "6") set(VERSION_SUFFIX $ENV{OPENTX_VERSION_SUFFIX}) set(VERSION_FAMILY ${VERSION_MAJOR}.${VERSION_MINOR}) set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}${VERSION_SUFFIX}) From d152be5e18f5120e73eb80665b322325bc6302b1 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 15 Jan 2020 17:48:20 +0100 Subject: [PATCH 082/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 3ed94c926..b696b8e3d 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1685,3 +1685,4 @@ Gary Garland Stefano Boggia Jean-Jacques Pointel Ferenc Kunkli +Sven Müller From 4d5b5e1c0b1e61bea06f7a0b5611a9918e697b36 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 15 Jan 2020 21:06:44 +0100 Subject: [PATCH 083/560] Fixes #7299 --- radio/src/targets/common/arm/stm32/pwr_driver.cpp | 6 ++++-- radio/src/targets/taranis/hal.h | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/radio/src/targets/common/arm/stm32/pwr_driver.cpp b/radio/src/targets/common/arm/stm32/pwr_driver.cpp index 751279da8..f488d19fa 100644 --- a/radio/src/targets/common/arm/stm32/pwr_driver.cpp +++ b/radio/src/targets/common/arm/stm32/pwr_driver.cpp @@ -54,9 +54,11 @@ void pwrInit() #if defined(PCBREV_HARDCODED) hardwareOptions.pcbrev = PCBREV_HARDCODED; #elif defined(PCBREV_GPIO_PIN) - GPIO_ResetBits(PCBREV_GPIO, PCBREV_GPIO_PIN); + #if defined(PCBREV_GPIO_PULL_DOWN) + GPIO_ResetBits(PCBREV_GPIO, PCBREV_GPIO_PIN); + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; + #endif GPIO_InitStructure.GPIO_Pin = PCBREV_GPIO_PIN; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; GPIO_Init(PCBREV_GPIO, &GPIO_InitStructure); hardwareOptions.pcbrev = PCBREV_VALUE(); #endif diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 2a7ca0ad9..31cf6a4a9 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -1375,6 +1375,7 @@ #define PCBREV_RCC_AHB1Periph RCC_AHB1Periph_GPIOA #define PCBREV_GPIO GPIOA #define PCBREV_GPIO_PIN GPIO_Pin_14 // PA.14 + #define PCBREV_GPIO_PULL_DOWN #define PCBREV_VALUE() GPIO_ReadInputDataBit(PCBREV_GPIO, PCBREV_GPIO_PIN) #else #define PCBREV_RCC_AHB1Periph 0 From cc298988de3340ffdbfe387b01337c636d171109 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 15 Jan 2020 21:39:20 +0100 Subject: [PATCH 084/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index b696b8e3d..b974f0a73 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1686,3 +1686,4 @@ Stefano Boggia Jean-Jacques Pointel Ferenc Kunkli Sven Müller +Taavi Tuisk From 38f13c30e0258b3694568eccdebf1490d9ea5919 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 16 Jan 2020 13:12:27 +0100 Subject: [PATCH 085/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index b974f0a73..e5abc8a23 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1687,3 +1687,4 @@ Jean-Jacques Pointel Ferenc Kunkli Sven Müller Taavi Tuisk +Thomas Floyd From 1737a8433b1a849adc946c8889fbb8c91a975b4c Mon Sep 17 00:00:00 2001 From: Ben Lye Date: Thu, 16 Jan 2020 14:39:02 +0000 Subject: [PATCH 086/560] Fix simulator buttons for T16 (#7300) Lines the clickable overlay up with the button images more accurately. --- .../src/simulation/simulateduiwidgetJumperT16.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/companion/src/simulation/simulateduiwidgetJumperT16.cpp b/companion/src/simulation/simulateduiwidgetJumperT16.cpp index 317fdb24c..66fc7f36e 100644 --- a/companion/src/simulation/simulateduiwidgetJumperT16.cpp +++ b/companion/src/simulation/simulateduiwidgetJumperT16.cpp @@ -34,27 +34,27 @@ SimulatedUIWidgetJumperT16::SimulatedUIWidgetJumperT16(SimulatorInterface *simul // add actions in order of appearance on the help menu act = new RadioUiAction(3, QList() << Qt::Key_Up, SIMU_STR_HLP_KEY_UP, SIMU_STR_HLP_ACT_MDL); - addRadioWidget(ui->leftbuttons->addArea(QRect(10, 70, 80, 35), "JumperT16/left_mdl.png", act)); + addRadioWidget(ui->leftbuttons->addArea(QRect(50, 70, 80, 35), "JumperT16/left_mdl.png", act)); act = new RadioUiAction(6, QList() << Qt::Key_Left, SIMU_STR_HLP_KEY_LFT, SIMU_STR_HLP_ACT_SYS); - addRadioWidget(ui->leftbuttons->addArea(QRect(10, 10, 80, 35), "JumperT16/left_sys.png", act)); + addRadioWidget(ui->leftbuttons->addArea(QRect(25, 10, 95, 35), "JumperT16/left_sys.png", act)); act = new RadioUiAction(5, QList() << Qt::Key_Right, SIMU_STR_HLP_KEY_RGT, SIMU_STR_HLP_ACT_TELE); - addRadioWidget(ui->leftbuttons->addArea(QRect(10, 190, 80, 35), "JumperT16/left_tele.png", act)); + addRadioWidget(ui->leftbuttons->addArea(QRect(50, 190, 80, 35), "JumperT16/left_tele.png", act)); act = new RadioUiAction(4, QList() << Qt::Key_Down << Qt::Key_Delete << Qt::Key_Escape << Qt::Key_Backspace, SIMU_STR_HLP_KEY_DN % "
" % SIMU_STR_HLP_KEYS_EXIT, SIMU_STR_HLP_ACT_RTN); - addRadioWidget(ui->rightbuttons->addArea(QRect(35, 10, 80, 35), "JumperT16/right_rtn.png", act)); + addRadioWidget(ui->rightbuttons->addArea(QRect(50, 10, 95, 35), "JumperT16/right_rtn.png", act)); act = new RadioUiAction(1, QList() << Qt::Key_PageDown, SIMU_STR_HLP_KEY_PGDN, SIMU_STR_HLP_ACT_PGDN); - addRadioWidget(ui->leftbuttons->addArea(QRect(10, 131, 80, 35), "JumperT16/left_page.png", act)); + addRadioWidget(ui->leftbuttons->addArea(QRect(50, 131, 80, 35), "JumperT16/left_page.png", act)); m_scrollUpAction = new RadioUiAction(-1, QList() << Qt::Key_Minus, SIMU_STR_HLP_KEY_MIN % "|" % SIMU_STR_HLP_MOUSE_UP, SIMU_STR_HLP_ACT_ROT_LFT); m_scrollDnAction = new RadioUiAction(-1, QList() << Qt::Key_Plus << Qt::Key_Equal, SIMU_STR_HLP_KEY_PLS % "|" % SIMU_STR_HLP_MOUSE_DN, SIMU_STR_HLP_ACT_ROT_RGT); connectScrollActions(); m_mouseMidClickAction = new RadioUiAction(2, QList() << Qt::Key_Enter << Qt::Key_Return, SIMU_STR_HLP_KEYS_ACTIVATE, SIMU_STR_HLP_ACT_ROT_DN); - addRadioWidget(ui->rightbuttons->addArea(QRect(45, 70, 100, 160), "JumperT16/right_ent.png", m_mouseMidClickAction)); + addRadioWidget(ui->rightbuttons->addArea(QRect(55, 90, 56, 120), "JumperT16/right_ent.png", m_mouseMidClickAction)); addRadioWidget(ui->leftbuttons->addArea(QRect(10, 252, 30, 30), "JumperT16/left_scrnsht.png", m_screenshotAction)); From 3be2af0fb5a9eef16a279c28ef81cc4eddff05a8 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 16 Jan 2020 21:04:39 +0100 Subject: [PATCH 087/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index e5abc8a23..0130f8052 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1688,3 +1688,4 @@ Ferenc Kunkli Sven Müller Taavi Tuisk Thomas Floyd +Matthew LePard From 6bbe04bda42578a7a1acbbd34a2798672e3a2cda Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 18 Jan 2020 23:21:26 +0100 Subject: [PATCH 088/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 0130f8052..3e61c35dc 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1689,3 +1689,4 @@ Sven Müller Taavi Tuisk Thomas Floyd Matthew LePard +Peter Schneider From fdba50f27ef15dc5c8c59157e33b21b00af5a8a4 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 19 Jan 2020 12:59:14 +0100 Subject: [PATCH 089/560] Fix FM edit while scrolling on T12 (#7306) --- radio/src/gui/128x64/model_flightmodes.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/radio/src/gui/128x64/model_flightmodes.cpp b/radio/src/gui/128x64/model_flightmodes.cpp index c803d9dfc..b619121b6 100644 --- a/radio/src/gui/128x64/model_flightmodes.cpp +++ b/radio/src/gui/128x64/model_flightmodes.cpp @@ -113,7 +113,11 @@ void menuModelFlightModeOne(event_t event) lcdDrawTextAlignedLeft(y, STR_TRIMS); for (uint8_t t = 0; t < NUM_STICKS; t++) { drawTrimMode(MIXES_2ND_COLUMN + (t*2*FW), y, s_currIdx, t, menuHorizontalPosition == t ? attr : 0); +#if defined(NAVIGATION_9X) + if (s_editMode > 0 && attr && menuHorizontalPosition == t) { +#else if (s_editMode >= 0 && attr && menuHorizontalPosition == t) { +#endif trim_t & v = fm->trim[t]; v.mode = checkIncDec(event, v.mode==TRIM_MODE_NONE ? -1 : v.mode, -1, k==0 ? 0 : 2*MAX_FLIGHT_MODES-1, EE_MODEL, isTrimModeAvailable); } From 511f8fd7bb5b6605090d7c39e1593693d94b0738 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 19 Jan 2020 12:59:45 +0100 Subject: [PATCH 090/560] Keep frequent mixer runs for USB sim (#7305) --- radio/src/pulses/pulses.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index 289485bf2..42f04fb26 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -380,7 +380,7 @@ bool setupPulsesInternalModule(uint8_t protocol) #endif default: - scheduleNextMixerCalculation(INTERNAL_MODULE, 50/*ms*/); + scheduleNextMixerCalculation(INTERNAL_MODULE, 10 /*ms*/); // used for USB sim for example return false; } } From cd10ba438e7d79765951c995663b333cefccfb66 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 20 Jan 2020 13:47:26 +0100 Subject: [PATCH 091/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 3e61c35dc..6f1feb477 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1690,3 +1690,4 @@ Taavi Tuisk Thomas Floyd Matthew LePard Peter Schneider +Michel Garbarino From d44ec9b218124260bf12a5ea11531ce201148651 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 21 Jan 2020 09:41:08 +0100 Subject: [PATCH 092/560] Display baudrate choice only when needed on colorlcd (#7311) --- radio/src/gui/480x272/radio_hardware.cpp | 8 +++++++- radio/src/targets/horus/hal.h | 6 +++++- radio/src/telemetry/crossfire.h | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/radio/src/gui/480x272/radio_hardware.cpp b/radio/src/gui/480x272/radio_hardware.cpp index fbf4db3fd..bf6c333f6 100644 --- a/radio/src/gui/480x272/radio_hardware.cpp +++ b/radio/src/gui/480x272/radio_hardware.cpp @@ -113,6 +113,12 @@ void onHardwareAntennaSwitchConfirm(const char * result) #define EXTERNAL_ANTENNA_ROW #endif +#if defined(CROSSFIRE) && SPORT_MAX_BAUDRATE < 400000 + #define MAX_BAUDRATE_ROW 0 +#else + #define MAX_BAUDRATE_ROW HIDDEN_ROW +#endif + bool menuRadioHardware(event_t event) { MENU(STR_HARDWARE, RADIO_ICONS, menuTabGeneral, MENU_RADIO_HARDWARE, ITEM_RADIO_HARDWARE_MAX, { @@ -134,7 +140,7 @@ bool menuRadioHardware(event_t event) READONLY_ROW, /* RTC */ 0, /* RTC check */ - 0, /* max baudrate */ + MAX_BAUDRATE_ROW, /* max baudrate */ BLUETOOTH_ROWS diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 7b6934068..1e5eb137e 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -303,7 +303,11 @@ #define PWR_SWITCH_GPIO_PIN GPIO_Pin_0 // PJ.00 // S.Port update connector -#define SPORT_MAX_BAUDRATE 250000 // < 400000 +#if defined(RADIO_T16) + #define SPORT_MAX_BAUDRATE 400000 +#else + #define SPORT_MAX_BAUDRATE 250000 // < 400000 +#endif #if defined(PCBX10) && !defined(RADIO_T16) #define SPORT_UPDATE_RCC_AHB1Periph RCC_AHB1Periph_GPIOH #define SPORT_UPDATE_PWR_GPIO GPIOH diff --git a/radio/src/telemetry/crossfire.h b/radio/src/telemetry/crossfire.h index 5f40b6f93..3daed0d57 100644 --- a/radio/src/telemetry/crossfire.h +++ b/radio/src/telemetry/crossfire.h @@ -81,7 +81,6 @@ enum CrossfireSensorIndexes { void processCrossfireTelemetryData(uint8_t data); void crossfireSetDefault(int index, uint8_t id, uint8_t subId); -#if SPORT_MAX_BAUDRATE < 400000 const uint32_t CROSSFIRE_BAUDRATES[] = { 400000, 115200, @@ -90,6 +89,7 @@ const uint8_t CROSSFIRE_PERIODS[] = { 4, 16, }; +#if SPORT_MAX_BAUDRATE < 400000 #define CROSSFIRE_BAUDRATE CROSSFIRE_BAUDRATES[g_eeGeneral.telemetryBaudrate] #define CROSSFIRE_PERIOD CROSSFIRE_PERIODS[g_eeGeneral.telemetryBaudrate] #else From 36d098d22d5c019e2a9f3c11922f332e96284570 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 21 Jan 2020 11:13:58 +0100 Subject: [PATCH 093/560] Fix multi firmware not working first time if internal module is on (#7302) --- radio/src/io/multi_firmware_update.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/src/io/multi_firmware_update.cpp b/radio/src/io/multi_firmware_update.cpp index 6b9cc1651..f7d8d238e 100644 --- a/radio/src/io/multi_firmware_update.cpp +++ b/radio/src/io/multi_firmware_update.cpp @@ -520,7 +520,7 @@ bool multiFlashFirmware(uint8_t moduleIdx, const char * filename) pausePulses(); -#if defined(INTERNAL_MODULE_MULTI) +#if defined(HARDWARE_INTERNAL_MODULE) uint8_t intPwr = IS_INTERNAL_MODULE_ON(); INTERNAL_MODULE_OFF(); #endif @@ -534,7 +534,7 @@ bool multiFlashFirmware(uint8_t moduleIdx, const char * filename) /* wait 2s off */ watchdogSuspend(500 /*5s*/); - RTOS_WAIT_MS(2000); + RTOS_WAIT_MS(3000); const char * result = driver->flashFirmware(&file, getBasename(filename)); f_close(&file); @@ -563,7 +563,7 @@ bool multiFlashFirmware(uint8_t moduleIdx, const char * filename) // reset telemetry protocol telemetryInit(255); -#if defined(INTERNAL_MODULE_MULTI) +#if defined(HARDWARE_INTERNAL_MODULE) if (intPwr) { INTERNAL_MODULE_ON(); setupPulsesInternalModule(); From 8390cbc705ea6ab58d98a9312d78d0ea3a840022 Mon Sep 17 00:00:00 2001 From: Carsten W Date: Wed, 22 Jan 2020 11:59:24 +0100 Subject: [PATCH 094/560] Crossfire LUA add missing support for PREC3 values (#7322) --- .../horus/SCRIPTS/TOOLS/CROSSFIRE/device.lua | 24 ++++++++----------- .../SCRIPTS/TOOLS/CROSSFIRE/device.lua | 22 ++++++++--------- .../SCRIPTS/TOOLS/CROSSFIRE/device.lua | 22 ++++++++--------- 3 files changed, 30 insertions(+), 38 deletions(-) diff --git a/radio/sdcard/horus/SCRIPTS/TOOLS/CROSSFIRE/device.lua b/radio/sdcard/horus/SCRIPTS/TOOLS/CROSSFIRE/device.lua index 50a8c7dde..3f99b5dbb 100644 --- a/radio/sdcard/horus/SCRIPTS/TOOLS/CROSSFIRE/device.lua +++ b/radio/sdcard/horus/SCRIPTS/TOOLS/CROSSFIRE/device.lua @@ -72,7 +72,7 @@ local function incrField(step) end else local min, max = 0, 0 - if field.type <= 5 then + if ((field.type <= 5) or (field.type == 8)) then min = field.min max = field.max step = field.step * step @@ -239,25 +239,21 @@ local function fieldFloatLoad(field, data, offset) field.default = fieldGetValue(data, offset+12, 4) fieldUnsignedToSigned(field, 4) field.prec = data[offset+16] - if field.prec > 2 then - field.prec = 2 + if field.prec > 3 then + field.prec = 3 end field.step = fieldGetValue(data, offset+17, 4) field.unit, offset = fieldGetString(data, offset+21) end +local function formatFloat(num, decimals) + local mult = 10^(decimals or 0) + local val = num / mult + return string.format("%." .. decimals .. "f", val) +end + local function fieldFloatDisplay(field, y, attr) - local attrnum - if field.prec == 1 then - attrnum = LEFT + attr + PREC1 - elseif field.prec == 2 then - attrnum = LEFT + attr + PREC2 - else - attrnum = LEFT + attr - end - -- lcd.drawNumber(140, y, field.value, attrnum) -- NOTE: original code getLastPos not available in Horus - -- lcd.drawText(lcd.getLastPos(), y, field.unit, attr) -- NOTE: original code getLastPos not available in Horus - lcd.drawText(140, y, field.value .. field.unit, attr) -- NOTE: Concenated fields instead of get lastPos + lcd.drawText(140, y, formatFloat(field.value, field.prec) .. field.unit, attr) end local function fieldFloatSave(field) diff --git a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/CROSSFIRE/device.lua b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/CROSSFIRE/device.lua index 8ccdbf285..b6115d088 100644 --- a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/CROSSFIRE/device.lua +++ b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/CROSSFIRE/device.lua @@ -72,7 +72,7 @@ local function incrField(step) end else local min, max = 0, 0 - if field.type <= 5 then + if ((field.type <= 5) or (field.type == 8)) then min = field.min max = field.max step = field.step * step @@ -238,23 +238,21 @@ local function fieldFloatLoad(field, data, offset) field.default = fieldGetValue(data, offset+12, 4) fieldUnsignedToSigned(field, 4) field.prec = data[offset+16] - if field.prec > 2 then - field.prec = 2 + if field.prec > 3 then + field.prec = 3 end field.step = fieldGetValue(data, offset+17, 4) field.unit, offset = fieldGetString(data, offset+21) end +local function formatFloat(num, decimals) + local mult = 10^(decimals or 0) + local val = num / mult + return string.format("%." .. decimals .. "f", val) +end + local function fieldFloatDisplay(field, y, attr) - local attrnum - if field.prec == 1 then - attrnum = LEFT + attr + PREC1 - elseif field.prec == 2 then - attrnum = LEFT + attr + PREC2 - else - attrnum = LEFT + attr - end - lcd.drawNumber(89, y, field.value, attrnum) + lcd.drawText(89, y, formatFloat(field.value, field.prec), LEFT + attr) lcd.drawText(lcd.getLastPos(), y, field.unit, attr) end diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/CROSSFIRE/device.lua b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/CROSSFIRE/device.lua index 58416af36..833ec6d83 100644 --- a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/CROSSFIRE/device.lua +++ b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/CROSSFIRE/device.lua @@ -72,7 +72,7 @@ local function incrField(step) end else local min, max = 0, 0 - if field.type <= 5 then + if ((field.type <= 5) or (field.type == 8)) then min = field.min max = field.max step = field.step * step @@ -238,23 +238,21 @@ local function fieldFloatLoad(field, data, offset) field.default = fieldGetValue(data, offset+12, 4) fieldUnsignedToSigned(field, 4) field.prec = data[offset+16] - if field.prec > 2 then - field.prec = 2 + if field.prec > 3 then + field.prec = 3 end field.step = fieldGetValue(data, offset+17, 4) field.unit, offset = fieldGetString(data, offset+21) end +local function formatFloat(num, decimals) + local mult = 10^(decimals or 0) + local val = num / mult + return string.format("%." .. decimals .. "f", val) +end + local function fieldFloatDisplay(field, y, attr) - local attrnum - if field.prec == 1 then - attrnum = LEFT + attr + PREC1 - elseif field.prec == 2 then - attrnum = LEFT + attr + PREC2 - else - attrnum = LEFT + attr - end - lcd.drawNumber(140, y, field.value, attrnum) + lcd.drawText(140, y, formatFloat(field.value, field.prec), LEFT + attr) lcd.drawText(lcd.getLastPos(), y, field.unit, attr) end From 93e8d83a9f1719111c55626feae09009eef7c818 Mon Sep 17 00:00:00 2001 From: Carsten W Date: Sat, 25 Jan 2020 11:33:56 +0100 Subject: [PATCH 095/560] fix nonworking retun to deviceoverview on T16 (#7334) --- radio/sdcard/horus/SCRIPTS/TOOLS/CROSSFIRE/device.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/sdcard/horus/SCRIPTS/TOOLS/CROSSFIRE/device.lua b/radio/sdcard/horus/SCRIPTS/TOOLS/CROSSFIRE/device.lua index 3f99b5dbb..d592677db 100644 --- a/radio/sdcard/horus/SCRIPTS/TOOLS/CROSSFIRE/device.lua +++ b/radio/sdcard/horus/SCRIPTS/TOOLS/CROSSFIRE/device.lua @@ -419,7 +419,7 @@ end -- Main local function runDevicePage(event) - if event == EVT_EXIT_BREAK then -- exit script + if event == EVT_VIRTUAL_EXIT then -- exit script if edit == true then edit = false local field = getField(lineIndex) @@ -451,9 +451,9 @@ local function runDevicePage(event) end end elseif edit then - if event == EVT_VIRTUAL_INC then + if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then incrField(1) - elseif event == EVT_VIRTUAL_DEC then + elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then incrField(-1) end else From fa95bb7e247376e80c3b86c4cea156e18370087a Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 26 Jan 2020 10:26:18 +0100 Subject: [PATCH 096/560] Update CREDITS.txt --- CREDITS.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index 6f1feb477..a36b07e91 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1691,3 +1691,5 @@ Thomas Floyd Matthew LePard Peter Schneider Michel Garbarino +Achim Stolze +Fernando Rimoldi From 96a631284ce1abe954abbcc138f01e0470d7093f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 26 Jan 2020 16:53:13 +0100 Subject: [PATCH 097/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index a36b07e91..95b67bc67 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1693,3 +1693,4 @@ Peter Schneider Michel Garbarino Achim Stolze Fernando Rimoldi +Bernard Delpy From 080f650ff2facca8206417a34c23f50b5709f691 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 27 Jan 2020 07:07:35 +0100 Subject: [PATCH 098/560] Add missing file in DB theme --- radio/sdcard/horus/THEMES/Darkblue/shutdown.bmp | Bin 0 -> 48538 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 radio/sdcard/horus/THEMES/Darkblue/shutdown.bmp diff --git a/radio/sdcard/horus/THEMES/Darkblue/shutdown.bmp b/radio/sdcard/horus/THEMES/Darkblue/shutdown.bmp new file mode 100755 index 0000000000000000000000000000000000000000..be7034db74473f701eb7bc031046d0f21c905ae3 GIT binary patch literal 48538 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 Date: Mon, 27 Jan 2020 07:18:32 +0100 Subject: [PATCH 099/560] Add missing interval, fix #7336 --- radio/src/gui/480x272/view_statistics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/480x272/view_statistics.cpp b/radio/src/gui/480x272/view_statistics.cpp index 179bf546c..c13dff60e 100644 --- a/radio/src/gui/480x272/view_statistics.cpp +++ b/radio/src/gui/480x272/view_statistics.cpp @@ -127,7 +127,7 @@ bool menuStatsDebug(event_t event) lcdDrawText(MENU_STATS_COLUMN1, y+1, "[Duration]", HEADER_COLOR|SMLSIZE); lcdDrawNumber(lcdNextPos+5, y, 10*maxLuaDuration, LEFT, 0, NULL, "ms"); lcdDrawText(lcdNextPos+20, y+1, "[Interval]", HEADER_COLOR|SMLSIZE); - lcdDrawNumber(lcdNextPos+5, y, 10*maxLuaDuration, LEFT, 0, NULL, "ms"); + lcdDrawNumber(lcdNextPos+5, y, 10*maxLuaInterval, LEFT, 0, NULL, "ms"); y += FH; // lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP+line*FH, "Lua memory"); From 23f16d039ec4e2efcb532f83bf69a422d2d406e7 Mon Sep 17 00:00:00 2001 From: Carsten W Date: Mon, 27 Jan 2020 15:10:46 +0100 Subject: [PATCH 100/560] Lua virtual replace (#7337) --- .../sdcard/horus/SCRIPTS/TOOLS/FrSky SBEC.lua | 5 ---- .../horus/SCRIPTS/WIZARD/glider/wizard.lua | 16 ++++++------ .../horus/SCRIPTS/WIZARD/plane/wizard.lua | 16 ++++++------ .../horus/SxR Calibrate/SxR_Calibrate.lua | 22 ++++++++-------- .../taranis-x7/SCRIPTS/TOOLS/FrSky SBEC.lua | 5 ---- .../taranis-x7/SCRIPTS/WIZARD/delta.lua | 24 ++++++++--------- .../taranis-x7/SCRIPTS/WIZARD/multi.lua | 24 ++++++++--------- .../taranis-x7/SCRIPTS/WIZARD/plane.lua | 20 +++++++------- .../taranis-x7/SCRIPTS/WIZARD/wizard.lua | 8 +++--- radio/sdcard/taranis-x7/SCRIPTS/snake.lua | 2 +- .../SxR Calibrate/SxR_Calibrate.lua | 24 ++++++++--------- .../taranis-x9/SCRIPTS/TOOLS/FrSky SBEC.lua | 5 ---- .../taranis-x9/SCRIPTS/WIZARD/delta.lua | 20 +++++++------- .../taranis-x9/SCRIPTS/WIZARD/multi.lua | 24 ++++++++--------- .../taranis-x9/SCRIPTS/WIZARD/plane.lua | 20 +++++++------- .../taranis-x9/SCRIPTS/WIZARD/wizard.lua | 8 +++--- radio/sdcard/taranis-x9/SCRIPTS/snake.lua | 2 +- .../SxR Calibrate/SxR_Calibrate.lua | 26 +++++++++---------- 18 files changed, 128 insertions(+), 143 deletions(-) diff --git a/radio/sdcard/horus/SCRIPTS/TOOLS/FrSky SBEC.lua b/radio/sdcard/horus/SCRIPTS/TOOLS/FrSky SBEC.lua index 73d2b88e2..bbe819087 100644 --- a/radio/sdcard/horus/SCRIPTS/TOOLS/FrSky SBEC.lua +++ b/radio/sdcard/horus/SCRIPTS/TOOLS/FrSky SBEC.lua @@ -273,11 +273,6 @@ local function run(event) if event == nil then error("Cannot run as a model script!") return 2 - elseif event == EVT_PAGE_BREAK or event == EVT_PAGEDN_FIRST or event == EVT_SHIFT_BREAK then - --selectPage(1) - elseif event == EVT_PAGE_LONG or event == EVT_PAGEUP_FIRST or event == EVT_SHIFT_LONG then - --killEvents(event); - --selectPage(-1) end local result = pages[page](event) diff --git a/radio/sdcard/horus/SCRIPTS/WIZARD/glider/wizard.lua b/radio/sdcard/horus/SCRIPTS/WIZARD/glider/wizard.lua index 1985589bc..a07089513 100644 --- a/radio/sdcard/horus/SCRIPTS/WIZARD/glider/wizard.lua +++ b/radio/sdcard/horus/SCRIPTS/WIZARD/glider/wizard.lua @@ -91,9 +91,9 @@ end -- Main local function runFieldsPage(event) - if event == EVT_EXIT_BREAK then -- exit script + if event == EVT_VIRTUAL_EXIT then -- exit script return 2 - elseif event == EVT_ENTER_BREAK or event == EVT_ROT_BREAK then -- toggle editing/selecting current field + elseif event == EVT_VIRTUAL_ENTER then -- toggle editing/selecting current field if fields[current][5] ~= nil then edit = not edit if edit == false then @@ -101,15 +101,15 @@ local function runFieldsPage(event) end end elseif edit then - if event == EVT_PLUS_FIRST or event == EVT_ROT_RIGHT or event == EVT_PLUS_REPT then + if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then addField(1) - elseif event == EVT_MINUS_FIRST or event == EVT_ROT_LEFT or event == EVT_MINUS_REPT then + elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then addField(-1) end else - if event == EVT_MINUS_FIRST or event == EVT_ROT_RIGHT then + if event == EVT_VIRTUAL_NEXT then selectField(1) - elseif event == EVT_PLUS_FIRST or event == EVT_ROT_LEFT then + elseif event == EVT_VIRTUAL_PREV then selectField(-1) end end @@ -465,9 +465,9 @@ local function run(event) if event == nil then error("Cannot be run as a model script!") return 2 - elseif (event == EVT_PAGE_BREAK or event == EVT_PAGEDN_FIRST) and page < #pages-1 then + elseif event == EVT_VIRTUAL_NEXT_PAGE and page < #pages-1 then selectPage(1) - elseif (event == EVT_PAGE_LONG or event == EVT_PAGEUP_FIRST) and page > 1 then + elseif event == EVT_VIRTUAL_PREV_PAGE and page > 1 then killEvents(event); selectPage(-1) end diff --git a/radio/sdcard/horus/SCRIPTS/WIZARD/plane/wizard.lua b/radio/sdcard/horus/SCRIPTS/WIZARD/plane/wizard.lua index 37a78d4e3..3c44e5ad5 100755 --- a/radio/sdcard/horus/SCRIPTS/WIZARD/plane/wizard.lua +++ b/radio/sdcard/horus/SCRIPTS/WIZARD/plane/wizard.lua @@ -91,9 +91,9 @@ end -- Main local function runFieldsPage(event) - if event == EVT_EXIT_BREAK then -- exit script + if event == EVT_VIRTUAL_EXIT then -- exit script return 2 - elseif event == EVT_ENTER_BREAK or event == EVT_ROT_BREAK then -- toggle editing/selecting current field + elseif event == EVT_VIRTUAL_ENTER then -- toggle editing/selecting current field if fields[current][5] ~= nil then edit = not edit if edit == false then @@ -101,15 +101,15 @@ local function runFieldsPage(event) end end elseif edit then - if event == EVT_PLUS_FIRST or event == EVT_ROT_RIGHT or event == EVT_PLUS_REPT then + if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then addField(1) - elseif event == EVT_MINUS_FIRST or event == EVT_ROT_LEFT or event == EVT_MINUS_REPT then + elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then addField(-1) end else - if event == EVT_MINUS_FIRST or event == EVT_ROT_RIGHT then + if event == EVT_VIRTUAL_NEXT then selectField(1) - elseif event == EVT_PLUS_FIRST or event == EVT_ROT_LEFT then + elseif event == EVT_VIRTUAL_PREV then selectField(-1) end end @@ -465,9 +465,9 @@ local function run(event) if event == nil then error("Cannot be run as a model script!") return 2 - elseif (event == EVT_PAGE_BREAK or event == EVT_PAGEDN_FIRST) and page < #pages-1 then + elseif event == EVT_VIRTUAL_NEXT_PAGE and page < #pages-1 then selectPage(1) - elseif (event == EVT_PAGE_LONG or event == EVT_PAGEUP_FIRST) and page > 1 then + elseif event == EVT_VIRTUAL_PREV_PAGE and page > 1 then killEvents(event); selectPage(-1) end diff --git a/radio/sdcard/horus/SxR Calibrate/SxR_Calibrate.lua b/radio/sdcard/horus/SxR Calibrate/SxR_Calibrate.lua index 4568b50eb..fca13271f 100755 --- a/radio/sdcard/horus/SxR Calibrate/SxR_Calibrate.lua +++ b/radio/sdcard/horus/SxR Calibrate/SxR_Calibrate.lua @@ -237,9 +237,9 @@ end -- Main local function runFieldsPage(event) - if event == EVT_EXIT_BREAK then -- exit script + if event == EVT_VIRTUAL_EXIT then -- exit script return 2 - elseif event == EVT_ENTER_BREAK or event == EVT_ROT_BREAK then -- toggle editing/selecting current field + elseif event == EVT_VIRTUAL_ENTER then -- toggle editing/selecting current field if fields[current][4] ~= nil then edit = not edit if edit == false then @@ -247,15 +247,15 @@ local function runFieldsPage(event) end end elseif edit then - if event == EVT_PLUS_FIRST or event == EVT_ROT_RIGHT or event == EVT_PLUS_REPT then + if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then addField(1) - elseif event == EVT_MINUS_FIRST or event == EVT_ROT_LEFT or event == EVT_MINUS_REPT then + elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then addField(-1) end else - if event == EVT_MINUS_FIRST or event == EVT_ROT_RIGHT then + if event == EVT_VIRTUAL_NEXT then selectField(1) - elseif event == EVT_PLUS_FIRST or event == EVT_ROT_LEFT then + elseif event == EVT_VIRTUAL_PREV then selectField(-1) end end @@ -313,11 +313,11 @@ local function runCalibrationPage(event) lcd.drawBitmap(Bitmap.open("img/done.bmp"),200, 100) lcd.drawText(160, 220, "Press [RTN] when ready", attr) end - if calibrationStep > 6 and (event == EVT_ENTER_BREAK or event == EVT_EXIT_BREAK) then + if calibrationStep > 6 and (event == EVT_VIRTUAL_ENTER or event == EVT_VIRTUAL_EXIT) then return 2 - elseif event == EVT_ENTER_BREAK then + elseif event == EVT_VIRTUAL_ENTER then calibrationState = 1 - elseif event == EVT_EXIT_BREAK then + elseif event == EVT_VIRTUAL_EXIT then if calibrationStep > 0 then calibrationStep = 0 end @@ -341,9 +341,9 @@ local function run(event) if event == nil then error("Cannot be run as a model script!") return 2 - elseif event == EVT_PAGE_BREAK or event == EVT_PAGEDN_FIRST then + elseif event == EVT_VIRTUAL_NEXT_PAGE then selectPage(1) - elseif event == EVT_PAGE_LONG or event == EVT_PAGEUP_FIRST then + elseif event == EVT_VIRTUAL_PREV_PAGE then killEvents(event); selectPage(-1) end diff --git a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/FrSky SBEC.lua b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/FrSky SBEC.lua index 73d2b88e2..bbe819087 100644 --- a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/FrSky SBEC.lua +++ b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/FrSky SBEC.lua @@ -273,11 +273,6 @@ local function run(event) if event == nil then error("Cannot run as a model script!") return 2 - elseif event == EVT_PAGE_BREAK or event == EVT_PAGEDN_FIRST or event == EVT_SHIFT_BREAK then - --selectPage(1) - elseif event == EVT_PAGE_LONG or event == EVT_PAGEUP_FIRST or event == EVT_SHIFT_LONG then - --killEvents(event); - --selectPage(-1) end local result = pages[page](event) diff --git a/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/delta.lua b/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/delta.lua index b30185e2f..bcd9238f4 100755 --- a/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/delta.lua +++ b/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/delta.lua @@ -52,10 +52,10 @@ end local function fieldIncDec(event, value, max, force) if edit or force==true then - if event == EVT_ROT_LEFT or event == EVT_UP_BREAK then + if event == EVT_VIRTUAL_PREV or event == EVT_VIRTUAL_PREV_REPT then value = (value + max) dirty = true - elseif event == EVT_ROT_RIGHT or event == EVT_DOWN_BREAK then + elseif event == EVT_VIRTUAL_NEXT or event == EVT_VIRTUAL_NEXT_REPT then value = (value + max + 2) dirty = true end @@ -66,12 +66,12 @@ end local function valueIncDec(event, value, min, max) if edit then - if event == EVT_ROT_RIGHT or event == EVT_RIGHT_BREAK then + if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then if value < max then value = (value + 1) dirty = true end - elseif event == EVT_ROT_LEFT or event == EVT_LEFT_BREAK then + elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then if value > min then value = (value - 1) dirty = true @@ -82,22 +82,22 @@ local function valueIncDec(event, value, min, max) end local function navigate(event, fieldMax, prevPage, nextPage) - if event == EVT_ENTER_BREAK then + if event == EVT_VIRTUAL_ENTER then edit = not edit dirty = true elseif edit then - if event == EVT_EXIT_BREAK then + if event == EVT_VIRTUAL_EXIT then edit = false dirty = true elseif not dirty then dirty = blinkChanged() end else - if event == EVT_PAGE_BREAK or event==EVT_RIGHT_BREAK then + if event == EVT_VIRTUAL_NEXT then page = nextPage field = 0 dirty = true - elseif event == EVT_PAGE_LONG or event==EVT_LEFT_BREAK then + elseif event == EVT_VIRTUAL_PREV then page = prevPage field = 0 killEvents(event); @@ -120,7 +120,7 @@ local function getFieldFlags(position) end local function channelIncDec(event, value) - if not edit and event==EVT_MENU_BREAK then + if not edit and event==EVT_VIRTUAL_MENU then servoPage = value dirty = true else @@ -276,7 +276,7 @@ local function servoMenu(event) limits.revert = fieldIncDec(event, limits.revert, 1) end model.setOutput(servoPage, limits) - elseif event == EVT_EXIT_BREAK then + elseif event == EVT_VIRTUAL_EXIT then servoPage = nil dirty = true end @@ -348,9 +348,9 @@ local function confirmationMenu(event) navigate(event, fieldsMax, RUDDER_PAGE, page) - if event == EVT_EXIT_BREAK then + if event == EVT_VIRTUAL_EXIT then return 2 - elseif event == EVT_ENTER_LONG then + elseif event == EVT_VIRTUAL_ENTER_LONG then killEvents(event) applySettings() return 2 diff --git a/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/multi.lua b/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/multi.lua index ebc7c536f..f4677ed4e 100755 --- a/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/multi.lua +++ b/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/multi.lua @@ -58,10 +58,10 @@ end local function fieldIncDec(event, value, max, force) if edit or force==true then - if event == EVT_ROT_RIGHT then + if event == EVT_VIRTUAL_INC then value = (value + max) dirty = true - elseif event == EVT_ROT_LEFT then + elseif event == EVT_VIRTUAL_DEC then value = (value + max + 2) dirty = true end @@ -72,12 +72,12 @@ end local function valueIncDec(event, value, min, max) if edit then - if event == EVT_ROT_RIGHT or event == EVT_RIGHT_FIRST then + if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then if value < max then value = (value + 1) dirty = true end - elseif event == EVT_ROT_LEFT or event == EVT_LEFT_FIRST then + elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then if value > min then value = (value - 1) dirty = true @@ -88,11 +88,11 @@ local function valueIncDec(event, value, min, max) end local function navigate(event, fieldMax, prevPage, nextPage) - if event == EVT_ENTER_BREAK then + if event == EVT_VIRTUAL_ENTER then edit = not edit dirty = true elseif edit then - if event == EVT_EXIT_BREAK then + if event == EVT_VIRTUAL_EXIT then edit = false dirty = true elseif not dirty then @@ -126,7 +126,7 @@ local function getFieldFlags(position) end local function channelIncDec(event, value) - if not edit and event==EVT_MENU_BREAK then + if not edit and event==EVT_VIRTUAL_MENU then servoPage = value dirty = true else @@ -137,12 +137,12 @@ end local function switchValueIncDec(event, value, min, max) if edit then - if event == EVT_ROT_RIGHT or event == EVT_RIGHT_FIRST then + if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then if value < max then value = (value + 1) dirty = true end - elseif event == EVT_ROT_LEFT or event == EVT_LEFT_FIRST then + elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then if value > min then value = (value - 1) dirty = true @@ -153,7 +153,7 @@ local function switchValueIncDec(event, value, min, max) end local function switchIncDec(event, value) - if not edit and event==EVT_MENU_BREAK then + if not edit and event== EVT_VIRTUAL_MENU then servoPage = value dirty = true else @@ -399,9 +399,9 @@ local function confirmationMenu(event) navigate(event, fieldsMax, BEEPER_PAGE, page) - if event == EVT_EXIT_BREAK then + if event == EVT_VIRTUAL_EXIT then return 2 - elseif event == EVT_ENTER_LONG then + elseif event == EVT_VIRTUAL_ENTER_LONG then killEvents(event) applySettings() return 2 diff --git a/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/plane.lua b/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/plane.lua index 6558b8f12..26282cdf7 100755 --- a/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/plane.lua +++ b/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/plane.lua @@ -62,10 +62,10 @@ end local function fieldIncDec(event, value, max, force) if edit or force==true then - if event == EVT_ROT_LEFT or event == EVT_UP_BREAK then + if event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then value = (value + max) dirty = true - elseif event == EVT_ROT_RIGHT or event == EVT_DOWN_BREAK then + elseif event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then value = (value + max + 2) dirty = true end @@ -76,12 +76,12 @@ end local function valueIncDec(event, value, min, max) if edit then - if event == EVT_ROT_RIGHT or event == EVT_RIGHT_BREAK then + if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then if value < max then value = (value + 1) dirty = true end - elseif event == EVT_ROT_LEFT or event == EVT_LEFT_BREAK then + elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then if value > min then value = (value - 1) dirty = true @@ -92,11 +92,11 @@ local function valueIncDec(event, value, min, max) end local function navigate(event, fieldMax, prevPage, nextPage) - if event == EVT_ENTER_BREAK then + if event == EVT_VIRTUAL_ENTER then edit = not edit dirty = true elseif edit then - if event == EVT_EXIT_BREAK then + if event == EVT_VIRTUAL_EXIT then edit = false dirty = true elseif not dirty then @@ -130,7 +130,7 @@ local function getFieldFlags(position) end local function channelIncDec(event, value) - if not edit and event==EVT_MENU_BREAK then + if not edit and event==EVT_VIRTUAL_MENU then servoPage = value dirty = true else @@ -420,7 +420,7 @@ local function servoMenu(event) limits.revert = fieldIncDec(event, limits.revert, 1) end model.setOutput(servoPage, limits) - elseif event == EVT_EXIT_BREAK then + elseif event == EVT_VIRTUAL_EXIT then servoPage = nil dirty = true end @@ -544,9 +544,9 @@ local function confirmationMenu(event) navigate(event, fieldsMax, TAIL_PAGE, page) - if event == EVT_EXIT_BREAK then + if event == EVT_VIRTUAL_EXIT then return 2 - elseif event == EVT_ENTER_LONG then + elseif event == EVT_VIRTUAL_ENTER_LONG then killEvents(event) applySettings() return 2 diff --git a/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/wizard.lua b/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/wizard.lua index 2568f22b9..06f365c9c 100755 --- a/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/wizard.lua +++ b/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/wizard.lua @@ -23,9 +23,9 @@ local MODELTYPE_QUAD = 2 -- Common functions local function fieldIncDec(event, value, max) - if event == EVT_ROT_LEFT or event == EVT_UP_BREAK then + if event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then value = (value + max) - elseif event == EVT_ROT_RIGHT or event == EVT_DOWN_BREAK then + elseif event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then value = (value + max + 2) end value = (value % (max+1)) @@ -53,7 +53,7 @@ end local function modelTypeMenu(event) drawModelChoiceMenu() - if event == EVT_ENTER_BREAK then + if event == EVT_VIRTUAL_ENTER then if modelType == MODELTYPE_PLANE then return "plane.lua" elseif modelType == MODELTYPE_DELTA then @@ -73,7 +73,7 @@ local function run(event) error("Cannot be run as a model script!") end - if event == EVT_EXIT_BREAK then + if event == EVT_VIRTUAL_EXIT then return 2 end diff --git a/radio/sdcard/taranis-x7/SCRIPTS/snake.lua b/radio/sdcard/taranis-x7/SCRIPTS/snake.lua index 012a9f1e1..d3a1914bb 100644 --- a/radio/sdcard/taranis-x7/SCRIPTS/snake.lua +++ b/radio/sdcard/taranis-x7/SCRIPTS/snake.lua @@ -127,7 +127,7 @@ local function run(event) raise("Cannot be run as a model script!") end - if event == EVT_EXIT_BREAK then + if event == EVT_VIRTUAL_EXIT then return 2 end diff --git a/radio/sdcard/taranis-x7/SxR Calibrate/SxR_Calibrate.lua b/radio/sdcard/taranis-x7/SxR Calibrate/SxR_Calibrate.lua index 5b2e141a8..b9e406691 100644 --- a/radio/sdcard/taranis-x7/SxR Calibrate/SxR_Calibrate.lua +++ b/radio/sdcard/taranis-x7/SxR Calibrate/SxR_Calibrate.lua @@ -62,10 +62,10 @@ local function runWarningPage(event) lcd.drawText(0, 30, "power, and a level surface.", SMLSIZE) lcd.drawText(0, 40, "Press [Enter] when ready", SMLSIZE) lcd.drawText(0, 50, "Press [Exit] to cancel", SMLSIZE) - if event == EVT_ENTER_BREAK then + if event == EVT_VIRTUAL_ENTER then selectPage(1) return 0 - elseif event == EVT_EXIT_BREAK then + elseif event == EVT_VIRTUAL_EXIT then return 2 end return 0 @@ -186,9 +186,9 @@ end -- Main local function runFieldsPage(event) - if event == EVT_EXIT_BREAK then -- exit script + if event == EVT_VIRTUAL_EXIT then -- exit script return 2 - elseif event == EVT_ENTER_BREAK then -- toggle editing/selecting current field + elseif event == EVT_VIRTUAL_ENTER then -- toggle editing/selecting current field if fields[current][4] ~= nil then edit = not edit if edit == false then @@ -196,15 +196,15 @@ local function runFieldsPage(event) end end elseif edit then - if event == EVT_PLUS_FIRST or event == EVT_ROT_RIGHT or event == EVT_PLUS_REPT or event == EVT_DOWN_BREAK then + if event == EVT_VIRTUAL_NEXT or event == EVT_VIRTUAL_NEXT_REP then addField(1) - elseif event == EVT_MINUS_FIRST or event == EVT_ROT_LEFT or event == EVT_MINUS_REPT or event == EVT_UP_BREAK then + elseif event == EVT_VIRTUAL_PREV or event == EVT_VIRTUAL_PREV_REP then addField(-1) end else - if event == EVT_MINUS_FIRST or event == EVT_ROT_LEFT or event == EVT_UP_BREAK then + if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REP then selectField(1) - elseif event == EVT_PLUS_FIRST or event == EVT_ROT_RIGHT or event == EVT_DOWN_BREAK then + elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REP then selectField(-1) end end @@ -260,9 +260,9 @@ local function runCalibrationPage(event) -- lcd.drawText(10, 19, "Done",0) lcd.drawText(0, 56, "Press [Exit] when ready", attr) end - if calibrationStep > 6 and (event == EVT_ENTER_BREAK or event == EVT_EXIT_BREAK) then + if calibrationStep > 6 and (event == EVT_VIRTUAL_ENTER or event == EVT_VIRTUAL_EXIT) then return 2 - elseif event == EVT_ENTER_BREAK and positionConfirmed then + elseif event == EVT_VIRTUAL_ENTER and positionConfirmed then calibrationState = 1 positionConfirmed = 0 end @@ -284,9 +284,9 @@ local function run(event) if event == nil then error("Cannot be run as a model script!") return 2 - elseif event == EVT_PAGE_BREAK or event==EVT_RIGHT_BREAK then + elseif event == EVT_VIRTUAL_NEXT_PAGE then selectPage(1) - elseif event == EVT_PAGE_LONG or event==EVT_LEFT_BREAK then + elseif event == EVT_VIRTUAL_PREV_PAGE then killEvents(event); selectPage(-1) end diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/FrSky SBEC.lua b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/FrSky SBEC.lua index 73d2b88e2..bbe819087 100644 --- a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/FrSky SBEC.lua +++ b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/FrSky SBEC.lua @@ -273,11 +273,6 @@ local function run(event) if event == nil then error("Cannot run as a model script!") return 2 - elseif event == EVT_PAGE_BREAK or event == EVT_PAGEDN_FIRST or event == EVT_SHIFT_BREAK then - --selectPage(1) - elseif event == EVT_PAGE_LONG or event == EVT_PAGEUP_FIRST or event == EVT_SHIFT_LONG then - --killEvents(event); - --selectPage(-1) end local result = pages[page](event) diff --git a/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/delta.lua b/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/delta.lua index 06af19541..cf559c6b2 100644 --- a/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/delta.lua +++ b/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/delta.lua @@ -52,10 +52,10 @@ end local function fieldIncDec(event, value, max, force) if edit or force==true then - if event == EVT_PLUS_BREAK or event == EVT_ROT_LEFT then + if event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then value = (value + max) dirty = true - elseif event == EVT_MINUS_BREAK or event == EVT_ROT_RIGHT then + elseif event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then value = (value + max + 2) dirty = true end @@ -66,12 +66,12 @@ end local function valueIncDec(event, value, min, max) if edit then - if event == EVT_PLUS_FIRST or event == EVT_PLUS_REPT or event == EVT_ROT_RIGHT then + if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then if value < max then value = (value + 1) dirty = true end - elseif event == EVT_MINUS_FIRST or event == EVT_MINUS_REPT or event == EVT_ROT_LEFT then + elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then if value > min then value = (value - 1) dirty = true @@ -82,11 +82,11 @@ local function valueIncDec(event, value, min, max) end local function navigate(event, fieldMax, prevPage, nextPage) - if event == EVT_ENTER_BREAK then + if event == EVT_VIRTUAL_ENTER then edit = not edit dirty = true elseif edit then - if event == EVT_EXIT_BREAK then + if event == EVT_VIRTUAL_EXIT then edit = false dirty = true elseif not dirty then @@ -120,7 +120,7 @@ local function getFieldFlags(position) end local function channelIncDec(event, value) - if not edit and event==EVT_MENU_BREAK then + if not edit and event == EVT_VIRTUAL_MENU then servoPage = value dirty = true else @@ -284,7 +284,7 @@ local function servoMenu(event) limits.revert = fieldIncDec(event, limits.revert, 1) end model.setOutput(servoPage, limits) - elseif event == EVT_EXIT_BREAK then + elseif event == EVT_VIRTUAL_EXIT then servoPage = nil dirty = true end @@ -357,9 +357,9 @@ local function confirmationMenu(event) navigate(event, fieldsMax, RUDDER_PAGE, page) - if event == EVT_EXIT_BREAK then + if event == EVT_VIRTUAL_EXIT then return 2 - elseif event == EVT_ENTER_LONG then + elseif event == EVT_VIRTUAL_ENTER_LONG then killEvents(event) applySettings() return 2 diff --git a/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/multi.lua b/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/multi.lua index 773abafad..3296626ad 100644 --- a/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/multi.lua +++ b/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/multi.lua @@ -57,10 +57,10 @@ end local function fieldIncDec(event, value, max, force) if edit or force==true then - if event == EVT_PLUS_BREAK or event == EVT_ROT_LEFT then + if event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then value = (value + max) dirty = true - elseif event == EVT_MINUS_BREAK or event == EVT_ROT_RIGHT then + elseif event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then value = (value + max + 2) dirty = true end @@ -71,12 +71,12 @@ end local function valueIncDec(event, value, min, max) if edit then - if event == EVT_PLUS_FIRST or event == EVT_PLUS_REPT or event == EVT_ROT_RIGHT then + if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then if value < max then value = (value + 1) dirty = true end - elseif event == EVT_MINUS_FIRST or event == EVT_MINUS_REPT or event == EVT_ROT_LEFT then + elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then if value > min then value = (value - 1) dirty = true @@ -87,11 +87,11 @@ local function valueIncDec(event, value, min, max) end local function navigate(event, fieldMax, prevPage, nextPage) - if event == EVT_ENTER_BREAK then + if event == EVT_VIRTUAL_ENTER then edit = not edit dirty = true elseif edit then - if event == EVT_EXIT_BREAK then + if event == EVT_VIRTUAL_EXIT then edit = false dirty = true elseif not dirty then @@ -125,7 +125,7 @@ local function getFieldFlags(position) end local function channelIncDec(event, value) - if not edit and event==EVT_MENU_BREAK then + if not edit and event == EVT_VIRTUAL_MENU then servoPage = value dirty = true else @@ -136,12 +136,12 @@ end local function switchValueIncDec(event, value, min, max) if edit then - if event == EVT_PLUS_FIRST or event == EVT_PLUS_REPT or event == EVT_ROT_RIGHT then + if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then if value < max then value = (value + 1) dirty = true end - elseif event == EVT_MINUS_FIRST or event == EVT_MINUS_REPT or event == EVT_ROT_LEFT then + elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then if value > min then value = (value - 1) dirty = true @@ -152,7 +152,7 @@ local function switchValueIncDec(event, value, min, max) end local function switchIncDec(event, value) - if not edit and event==EVT_MENU_BREAK then + if not edit and event == EVT_VIRTUAL_MENU then servoPage = value dirty = true else @@ -415,9 +415,9 @@ local function confirmationMenu(event) navigate(event, fieldsMax, BEEPER_PAGE, page) - if event == EVT_EXIT_BREAK then + if event == EVT_VIRTUAL_EXIT then return 2 - elseif event == EVT_ENTER_LONG then + elseif event == EVT_VIRTUAL_ENTER_LONG then killEvents(event) applySettings() return 2 diff --git a/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/plane.lua b/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/plane.lua index 5a75fbcc1..7d20bd97e 100644 --- a/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/plane.lua +++ b/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/plane.lua @@ -62,10 +62,10 @@ end local function fieldIncDec(event, value, max, force) if edit or force==true then - if event == EVT_PLUS_BREAK or event == EVT_ROT_LEFT then + if event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then value = (value + max) dirty = true - elseif event == EVT_MINUS_BREAK or event == EVT_ROT_RIGHT then + elseif event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then value = (value + max + 2) dirty = true end @@ -76,12 +76,12 @@ end local function valueIncDec(event, value, min, max) if edit then - if event == EVT_PLUS_FIRST or event == EVT_PLUS_REPT or event == EVT_ROT_RIGHT then + if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then if value < max then value = (value + 1) dirty = true end - elseif event == EVT_MINUS_FIRST or event == EVT_MINUS_REPT or event == EVT_ROT_LEFT then + elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then if value > min then value = (value - 1) dirty = true @@ -92,11 +92,11 @@ local function valueIncDec(event, value, min, max) end local function navigate(event, fieldMax, prevPage, nextPage) - if event == EVT_ENTER_BREAK then + if event == EVT_VIRTUAL_ENTER then edit = not edit dirty = true elseif edit then - if event == EVT_EXIT_BREAK then + if event == EVT_VIRTUAL_EXIT then edit = false dirty = true elseif not dirty then @@ -130,7 +130,7 @@ local function getFieldFlags(position) end local function channelIncDec(event, value) - if not edit and event==EVT_MENU_BREAK then + if not edit and event == EVT_VIRTUAL_MENU then servoPage = value dirty = true else @@ -425,7 +425,7 @@ local function servoMenu(event) limits.revert = fieldIncDec(event, limits.revert, 1) end model.setOutput(servoPage, limits) - elseif event == EVT_EXIT_BREAK then + elseif event == EVT_VIRTUAL_EXIT then servoPage = nil dirty = true end @@ -550,9 +550,9 @@ local function confirmationMenu(event) navigate(event, fieldsMax, TAIL_PAGE, page) - if event == EVT_EXIT_BREAK then + if event == EVT_VIRTUAL_EXIT then return 2 - elseif event == EVT_ENTER_LONG then + elseif event == EVT_VIRTUAL_ENTER_LONG then killEvents(event) applySettings() return 2 diff --git a/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/wizard.lua b/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/wizard.lua index 463522765..7d330daae 100644 --- a/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/wizard.lua +++ b/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/wizard.lua @@ -25,10 +25,10 @@ local MODELTYPE_QUAD = 2 -- Common functions local function fieldIncDec(event, value, max) - if event == EVT_PLUS_BREAK or event == EVT_ROT_LEFT or event == EVT_PLUS_REPT then + if event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REPT then value = (value + max) dirty = true - elseif event == EVT_MINUS_BREAK or event == EVT_ROT_RIGHT or event == EVT_MINUS_REPT then + elseif event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REPT then value = (value + max + 2) dirty = true end @@ -56,7 +56,7 @@ local function modelTypeMenu(event) drawModelChoiceMenu() dirty = false end - if event == EVT_ENTER_BREAK then + if event == EVT_VIRTUAL_ENTER then if modelType == MODELTYPE_PLANE then return "plane.lua" elseif modelType == MODELTYPE_DELTA then @@ -77,7 +77,7 @@ local function run(event) error("Cannot be run as a model script!") end - if event == EVT_EXIT_BREAK then + if event == EVT_VIRTUAL_EXIT then return 2 end return modelTypeMenu(event) diff --git a/radio/sdcard/taranis-x9/SCRIPTS/snake.lua b/radio/sdcard/taranis-x9/SCRIPTS/snake.lua index 012a9f1e1..d3a1914bb 100644 --- a/radio/sdcard/taranis-x9/SCRIPTS/snake.lua +++ b/radio/sdcard/taranis-x9/SCRIPTS/snake.lua @@ -127,7 +127,7 @@ local function run(event) raise("Cannot be run as a model script!") end - if event == EVT_EXIT_BREAK then + if event == EVT_VIRTUAL_EXIT then return 2 end diff --git a/radio/sdcard/taranis-x9/SxR Calibrate/SxR_Calibrate.lua b/radio/sdcard/taranis-x9/SxR Calibrate/SxR_Calibrate.lua index 5a03b1db0..a9c636f30 100644 --- a/radio/sdcard/taranis-x9/SxR Calibrate/SxR_Calibrate.lua +++ b/radio/sdcard/taranis-x9/SxR Calibrate/SxR_Calibrate.lua @@ -60,10 +60,10 @@ local function runWarningPage(event) lcd.drawText(0, 30, "power supply and a flat level surface (desk,...)", SMLSIZE) lcd.drawText(0, 40, "Press [Enter] when ready", SMLSIZE) lcd.drawText(0, 50, "Press [Exit] when cancel", SMLSIZE) - if event == EVT_ENTER_BREAK then + if event == EVT_VIRTUAL_ENTER then selectPage(1) return 0 - elseif event == EVT_EXIT_BREAK then + elseif event == EVT_VIRTUAL_EXIT then return 2 end return 0 @@ -184,9 +184,9 @@ end -- Main local function runFieldsPage(event) - if event == EVT_EXIT_BREAK then -- exit script + if event == EVT_VIRTUAL_EXIT then -- exit script return 2 - elseif event == EVT_ENTER_BREAK then -- toggle editing/selecting current field + elseif event == EVT_VIRTUAL_ENTER then -- toggle editing/selecting current field if fields[current][4] ~= nil then edit = not edit if edit == false then @@ -194,15 +194,15 @@ local function runFieldsPage(event) end end elseif edit then - if event == EVT_PLUS_FIRST or event == EVT_ROT_RIGHT or event == EVT_PLUS_REPT then + if event == EVT_VIRTUAL_NEXT or event == EVT_VIRTUAL_NEXT_REP then addField(1) - elseif event == EVT_MINUS_FIRST or event == EVT_ROT_LEFT or event == EVT_MINUS_REPT then + elseif event == EVT_VIRTUAL_PREV or event == EVT_VIRTUAL_PREV_REP then addField(-1) end else - if event == EVT_MINUS_FIRST or event == EVT_ROT_LEFT then + if event == EVT_VIRTUAL_INC or event == EVT_VIRTUAL_INC_REP then selectField(1) - elseif event == EVT_PLUS_FIRST or event == EVT_ROT_RIGHT then + elseif event == EVT_VIRTUAL_DEC or event == EVT_VIRTUAL_DEC_REP then selectField(-1) end end @@ -235,11 +235,11 @@ local function runCalibrationPage(event) lcd.drawPixmap(10, 19, "bmp/done.bmp") lcd.drawText(0, 56, "Press [Exit] when ready", attr) end - if calibrationStep > 6 and (event == EVT_ENTER_BREAK or event == EVT_EXIT_BREAK) then + if calibrationStep > 6 and (event == EVT_VIRTUAL_ENTER or event == EVT_VIRTUAL_EXIT) then return 2 - elseif event == EVT_ENTER_BREAK then + elseif event == EVT_VIRTUAL_ENTER then calibrationState = 1 - elseif event == EVT_EXIT_BREAK then + elseif event == EVT_VIRTUAL_EXIT then if calibrationStep > 0 then calibrationStep = 0 end @@ -261,9 +261,9 @@ local function run(event) if event == nil then error("Cannot be run as a model script!") return 2 - elseif event == EVT_PAGE_BREAK then + elseif event == EVT_VIRTUAL_NEXT_PAGE then selectPage(1) - elseif event == EVT_PAGE_LONG then + elseif event == EVT_VIRTUAL_PREV_PAGE then killEvents(event); selectPage(-1) end From c817844a8668671525bae779d403bde8d54119e9 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 29 Jan 2020 22:17:36 +0100 Subject: [PATCH 101/560] Update CREDITS.txt --- CREDITS.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index 95b67bc67..f90be0081 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1694,3 +1694,5 @@ Michel Garbarino Achim Stolze Fernando Rimoldi Bernard Delpy +Daniel Dubovsky +Jonathan Starch From cde54f04f4f94a2ff0783440887fbb88ac02c6ae Mon Sep 17 00:00:00 2001 From: Offer Shmuely Date: Thu, 30 Jan 2020 12:34:08 +0200 Subject: [PATCH 102/560] shmuely/horus batt widget faster (#7338) BattCheck optimization --- radio/sdcard/horus/WIDGETS/BattCheck/main.lua | 69 ++++++++++--------- 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/radio/sdcard/horus/WIDGETS/BattCheck/main.lua b/radio/sdcard/horus/WIDGETS/BattCheck/main.lua index ddd83039d..abe3460d5 100755 --- a/radio/sdcard/horus/WIDGETS/BattCheck/main.lua +++ b/radio/sdcard/horus/WIDGETS/BattCheck/main.lua @@ -16,11 +16,16 @@ ---- # # ---- ######################################################################### +-- Horus Widget to display the levels of lipo battery with per cell indication +-- 3djc & Offer Shmuely +-- Date: 2020 +-- ver: 0.4 + local _options = { - { "Sensor", SOURCE, 0 }, + { "Sensor", SOURCE, 0 }, -- default to 'Cels' { "Color", COLOR, WHITE }, { "Shadow", BOOL, 0 }, - { "LowestCell", BOOL, 1 } + { "LowestCell", BOOL, 1 } -- 0=main voltage display shows all-cell-voltage, 1=main voltage display shows lowest-cell } -- This function is run once at the creation of the widget @@ -29,12 +34,12 @@ local function create(zone, options) zone = zone, options = options, counter = 0, - shadowed = 0, + no_telem_blink = 0, isDataAvailable = 0, cellDataLive = {0,0,0,0,0,0}, - cellDataHistoryLowest = {0,0,0,0,0,0}, + cellDataHistoryLowest = {5,5,5,5,5,5}, cellDataHistoryCellLowest = 5, cellMax = 0, cellMin = 0, @@ -112,51 +117,47 @@ local function calculateBatteryData(wgt) return end - -- this is necessary for simu where cell-count can change if #wgt.cellDataHistoryLowest ~= #newCellData then wgt.cellDataHistoryLowest = {} for k, v in pairs(newCellData) do - wgt.cellDataHistoryLowest[k] = v - end - end - -- stores the lowest cell values in historical table - for k, v in pairs(newCellData) do - if v < wgt.cellDataHistoryLowest[k] then - wgt.cellDataHistoryLowest[k] = v + wgt.cellDataHistoryLowest[k] = 5 -- invalid reading, set high value so the min() will update it soon end end - --- calc highest of all cels local cellMax = 0 + local cellMin = 5 + local cellSum = 0 for k, v in pairs(newCellData) do + -- stores the lowest cell values in historical table + if v > 1 and v < wgt.cellDataHistoryLowest[k] then -- min 1v to consider a valid reading + wgt.cellDataHistoryLowest[k] = v + + --- calc history lowest of all cells + if v < wgt.cellDataHistoryCellLowest then + wgt.cellDataHistoryCellLowest = v + end + + end + + -- calc highest of all cells if v > cellMax then cellMax = v end - end - wgt.cellMax = cellMax - --- calc lowest of all cels - local cellMin = 5 - for k, v in pairs(newCellData) do - if v < cellMin and v > 1 then -- >1 to ignore invalid values + --- calc lowest of all cells + if v < cellMin and v > 1 then -- min 1v to consider a valid reading cellMin = v end - end - wgt.cellMin = cellMin - - --- calc history lowest of all cells - if cellMin < wgt.cellDataHistoryCellLowest and cellMin > 1 then -- >1 to ignore invalid values - wgt.cellDataHistoryCellLowest = cellMin - end - - wgt.cellCount = #newCellData - - --- sum of all cells - local cellSum = 0 - for k, v in pairs(newCellData) do + --- sum of all cells cellSum = cellSum + v + + end + + wgt.cellMin = cellMin + wgt.cellMax = cellMax + wgt.cellCount = #newCellData wgt.cellSum = cellSum --- average of all cells @@ -328,7 +329,7 @@ local function refreshZoneLarge(wgt) lcd.drawText(wgt.zone.x + wgt.zone.w, wgt.zone.y, wgt.cellPercent .. "%", RIGHT + DBLSIZE + CUSTOM_COLOR + wgt.shadowed) lcd.drawText(wgt.zone.x + wgt.zone.w, wgt.zone.y + 30, string.format("%2.1fV", wgt.mainValue), RIGHT + DBLSIZE + CUSTOM_COLOR + wgt.shadowed) - lcd.drawText(wgt.zone.x + wgt.zone.w, wgt.zone.y + 70, string.format("%2.1fV %2.1fS", wgt.secondaryValue, wgt.cellCount), RIGHT + SMLSIZE + CUSTOM_COLOR + wgt.shadowed) + lcd.drawText(wgt.zone.x + wgt.zone.w, wgt.zone.y + 70, string.format("%2.1fV %dS", wgt.secondaryValue, wgt.cellCount), RIGHT + SMLSIZE + CUSTOM_COLOR + wgt.shadowed) -- fill batt lcd.setColor(CUSTOM_COLOR, getPercentColor(wgt.cellPercent)) lcd.drawFilledRectangle(wgt.zone.x + myBatt.x, wgt.zone.y + myBatt.y + myBatt.h + myBatt.cath_h - math.floor(wgt.cellPercent / 100 * myBatt.h), myBatt.w, math.floor(wgt.cellPercent / 100 * myBatt.h), CUSTOM_COLOR) @@ -372,7 +373,7 @@ local function refreshZoneXLarge(wgt) lcd.drawText(wgt.zone.x + wgt.zone.w, wgt.zone.y + myBatt.y, wgt.cellPercent .. "%", RIGHT + DBLSIZE + CUSTOM_COLOR + wgt.shadowed + wgt.no_telem_blink) lcd.drawText(wgt.zone.x + wgt.zone.w, wgt.zone.y + myBatt.y + 30, string.format("%2.1fV", wgt.mainValue), RIGHT + DBLSIZE + CUSTOM_COLOR + wgt.shadowed + wgt.no_telem_blink) - lcd.drawText(wgt.zone.x + wgt.zone.w, wgt.zone.y + myBatt.y + 105, string.format("%2.1fV %2.1fS", wgt.secondaryValue, wgt.cellCount), RIGHT + SMLSIZE + CUSTOM_COLOR + wgt.shadowed + wgt.no_telem_blink) + lcd.drawText(wgt.zone.x + wgt.zone.w, wgt.zone.y + myBatt.y + 105, string.format("%2.1fV %dS", wgt.secondaryValue, wgt.cellCount), RIGHT + SMLSIZE + CUSTOM_COLOR + wgt.shadowed + wgt.no_telem_blink) -- draw cells local pos = { { x = 111, y = 38 }, { x = 164, y = 38 }, { x = 217, y = 38 }, { x = 111, y = 57 }, { x = 164, y = 57 }, { x = 217, y = 57 } } From 6a52627f47c05b1d835122b2df9fc047154fcbb5 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 30 Jan 2020 11:37:26 +0100 Subject: [PATCH 103/560] Increase output buffer (#7323) --- radio/src/lua/api_general.cpp | 8 ++++++++ radio/src/telemetry/telemetry.h | 6 ++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 2a5db1422..0bdf7ba47 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -456,6 +456,10 @@ static int luaSportTelemetryPush(lua_State * L) lua_pushboolean(L, outputTelemetryBuffer.isAvailable()); return 1; } + else if (lua_gettop(L) > sizeof(SportTelemetryPacket) ) { + lua_pushboolean(L, false); + return 1; + } uint16_t dataId = luaL_checkunsigned(L, 3); @@ -653,6 +657,10 @@ static int luaCrossfireTelemetryPush(lua_State * L) if (lua_gettop(L) == 0) { lua_pushboolean(L, outputTelemetryBuffer.isAvailable()); } + else if (lua_gettop(L) > TELEMETRY_OUTPUT_BUFFER_SIZE ) { + lua_pushboolean(L, false); + return 1; + } else if (outputTelemetryBuffer.isAvailable()) { uint8_t command = luaL_checkunsigned(L, 1); luaL_checktype(L, 2, LUA_TTABLE); diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index 9a6872e5a..c4a5e325a 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -171,6 +171,7 @@ void logTelemetryWriteByte(uint8_t data); #define LOG_TELEMETRY_WRITE_START() #define LOG_TELEMETRY_WRITE_BYTE(data) #endif +#define TELEMETRY_OUTPUT_BUFFER_SIZE 64 class OutputTelemetryBuffer { public: @@ -212,7 +213,8 @@ class OutputTelemetryBuffer { void pushByte(uint8_t byte) { - data[size++] = byte; + if (size < TELEMETRY_OUTPUT_BUFFER_SIZE) + data[size++] = byte; } void pushByteWithBytestuffing(uint8_t byte) @@ -244,7 +246,7 @@ class OutputTelemetryBuffer { public: union { SportTelemetryPacket sport; - uint8_t data[16]; + uint8_t data[TELEMETRY_OUTPUT_BUFFER_SIZE]; }; uint8_t size; uint8_t timeout; From 8ef996f992b07c65e26de22bcef8bab0131d1b71 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 30 Jan 2020 11:40:01 +0100 Subject: [PATCH 104/560] Remove uneeded D8 option on some radio (#7295) Remove uneeded D8 option on some radios --- .../src/firmwares/opentx/opentxinterface.cpp | 32 ++++++++++++++++--- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 741db16b6..294c69a82 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -1170,14 +1170,22 @@ void addOpenTxCommonOptions(OpenTxFirmware * firmware) firmware->addOption("nooverridech", Firmware::tr("No OverrideCH functions available")); } -void addOpenTxRfOptions(OpenTxFirmware * firmware, bool flex = true) +enum RfOptions { + NONE = 0, + EU, + FLEX +}; + +void addOpenTxRfOptions(OpenTxFirmware * firmware, uint8_t options) { static const Firmware::Option opt_eu("eu", Firmware::tr("Removes D8 FrSky protocol support which is not legal for use in the EU on radios sold after Jan 1st, 2015")); static const Firmware::Option opt_fl("flexr9m", Firmware::tr("Enable non certified firmwares")); - if (flex) + if (options == EU + FLEX) firmware->addOptionsGroup({opt_eu, opt_fl}); - else + else if (options == EU) firmware->addOption(opt_eu); + else if (options == FLEX) + firmware->addOption(opt_fl); } void addOpenTxFontOptions(OpenTxFirmware * firmware) @@ -1191,7 +1199,6 @@ void addOpenTxFrskyOptions(OpenTxFirmware * 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")); - addOpenTxRfOptions(firmware); } void addOpenTxTaranisOptions(OpenTxFirmware * firmware) @@ -1220,7 +1227,7 @@ void addOpenTxArm9xOptions(OpenTxFirmware * firmware, bool dblkeys = true) if (dblkeys) firmware->addOption("dblkeys", Firmware::tr("Enable resetting values by pressing up and down at the same time")); addOpenTxFontOptions(firmware); - addOpenTxRfOptions(firmware, true); + addOpenTxRfOptions(firmware, FLEX); } void registerOpenTxFirmwares() @@ -1233,11 +1240,13 @@ void registerOpenTxFirmwares() addOpenTxTaranisOptions(firmware); addPPMInternalModuleHack(firmware); registerOpenTxFirmware(firmware); + addOpenTxRfOptions(firmware, EU + FLEX); /* FrSky Taranis X9D+ 2019 board */ firmware = new OpenTxFirmware("opentx-x9d+2019", Firmware::tr("FrSky Taranis X9D+ 2019"), BOARD_TARANIS_X9DP_2019); addOpenTxTaranisOptions(firmware); registerOpenTxFirmware(firmware); + addOpenTxRfOptions(firmware, FLEX); /* FrSky Taranis X9D board */ firmware = new OpenTxFirmware("opentx-x9d", Firmware::tr("FrSky Taranis X9D"), BOARD_TARANIS_X9D); @@ -1245,6 +1254,7 @@ void registerOpenTxFirmwares() addOpenTxTaranisOptions(firmware); addPPMInternalModuleHack(firmware); registerOpenTxFirmware(firmware); + addOpenTxRfOptions(firmware, EU + FLEX); /* FrSky Taranis X9E board */ firmware = new OpenTxFirmware("opentx-x9e", Firmware::tr("FrSky Taranis X9E"), BOARD_TARANIS_X9E); @@ -1253,48 +1263,57 @@ void registerOpenTxFirmwares() addOpenTxTaranisOptions(firmware); addPPMInternalModuleHack(firmware); registerOpenTxFirmware(firmware); + addOpenTxRfOptions(firmware, EU + FLEX); /* FrSky X9-Lite board */ firmware = new OpenTxFirmware("opentx-x9lite", Firmware::tr("FrSky Taranis X9-Lite"), BOARD_TARANIS_X9LITE); addOpenTxTaranisOptions(firmware); registerOpenTxFirmware(firmware); + addOpenTxRfOptions(firmware, FLEX); /* FrSky X9-LiteS board */ firmware = new OpenTxFirmware("opentx-x9lites", Firmware::tr("FrSky Taranis X9-Lite S"), BOARD_TARANIS_X9LITES); addOpenTxTaranisOptions(firmware); registerOpenTxFirmware(firmware); + addOpenTxRfOptions(firmware, FLEX); /* FrSky X7 board */ firmware = new OpenTxFirmware("opentx-x7", Firmware::tr("FrSky Taranis X7 / X7S"), BOARD_TARANIS_X7); addOpenTxTaranisOptions(firmware); registerOpenTxFirmware(firmware); + addOpenTxRfOptions(firmware, EU + FLEX); /* FrSky X7 Access board */ firmware = new OpenTxFirmware("opentx-x7access", Firmware::tr("FrSky Taranis X7 / X7S Access"), BOARD_TARANIS_X7_ACCESS); addOpenTxTaranisOptions(firmware); registerOpenTxFirmware(firmware); + addOpenTxRfOptions(firmware, FLEX); /* FrSky X-Lite S/PRO board */ firmware = new OpenTxFirmware("opentx-xlites", Firmware::tr("FrSky Taranis X-Lite S/PRO"), BOARD_TARANIS_XLITES); addOpenTxTaranisOptions(firmware); registerOpenTxFirmware(firmware); + addOpenTxRfOptions(firmware, FLEX); /* FrSky X-Lite board */ firmware = new OpenTxFirmware("opentx-xlite", Firmware::tr("FrSky Taranis X-Lite"), BOARD_TARANIS_XLITE); // firmware->addOption("stdr9m", Firmware::tr("Use JR-sized R9M module")); addOpenTxTaranisOptions(firmware); registerOpenTxFirmware(firmware); + addOpenTxRfOptions(firmware, EU + FLEX); /* FrSky X10 board */ firmware = new OpenTxFirmware("opentx-x10", Firmware::tr("FrSky Horus X10 / X10S"), BOARD_X10); addOpenTxFrskyOptions(firmware); firmware->addOption("internalaccess", Firmware::tr("Support for ACCESS internal module replacement")); registerOpenTxFirmware(firmware); + addOpenTxRfOptions(firmware, EU + FLEX); /* FrSky X10 Express board */ firmware = new OpenTxFirmware("opentx-x10express", Firmware::tr("FrSky Horus X10 Express / X10S Express"), BOARD_X10_EXPRESS); addOpenTxFrskyOptions(firmware); registerOpenTxFirmware(firmware); + addOpenTxRfOptions(firmware, FLEX); /* FrSky X12 (Horus) board */ firmware = new OpenTxFirmware("opentx-x12s", Firmware::tr("FrSky Horus X12S"), BOARD_HORUS_X12S); @@ -1302,6 +1321,7 @@ void registerOpenTxFirmwares() firmware->addOption("internalaccess", Firmware::tr("Support for ACCESS internal module replacement")); firmware->addOption("pcbdev", Firmware::tr("Use ONLY with first DEV pcb version")); registerOpenTxFirmware(firmware); + addOpenTxRfOptions(firmware, EU + FLEX); /* Jumper T12 board */ firmware = new OpenTxFirmware("opentx-t12", QCoreApplication::translate("Firmware", "Jumper T12 / T12 Pro"), BOARD_JUMPER_T12); @@ -1313,6 +1333,7 @@ void registerOpenTxFirmwares() firmware->addOption("internalmulti", Firmware::tr("Support for MULTI internal module")); addOpenTxFontOptions(firmware); registerOpenTxFirmware(firmware); + addOpenTxRfOptions(firmware, FLEX); /* Jumper T16 board */ firmware = new OpenTxFirmware("opentx-t16", Firmware::tr("Jumper T16 / T16+ / T16 Pro"), BOARD_JUMPER_T16); @@ -1320,6 +1341,7 @@ void registerOpenTxFirmwares() firmware->addOption("internalmulti", Firmware::tr("Support for MULTI internal module")); firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module")); registerOpenTxFirmware(firmware); + addOpenTxRfOptions(firmware, FLEX); /* 9XR-Pro */ firmware = new OpenTxFirmware("opentx-9xrpro", Firmware::tr("Turnigy 9XR-PRO"), BOARD_9XRPRO); From 13488b5c21479fed12a9e5bc490432043017aa9b Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 30 Jan 2020 11:44:33 +0100 Subject: [PATCH 105/560] Move TOOLS menu as first radio screen (#7312) Move TOOLS menu as first radio screen --- radio/src/gui/128x64/menus.h | 8 ++++---- radio/src/gui/128x64/view_main.cpp | 2 +- radio/src/gui/212x64/menu_radio.cpp | 4 ++-- radio/src/gui/212x64/menus.h | 4 ++-- radio/src/gui/212x64/view_main.cpp | 2 +- radio/src/gui/480x272/menu_radio.cpp | 4 ++-- radio/src/gui/480x272/menus.cpp | 2 +- radio/src/gui/480x272/menus.h | 8 ++++---- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/radio/src/gui/128x64/menus.h b/radio/src/gui/128x64/menus.h index ccde94cc9..d861a626f 100644 --- a/radio/src/gui/128x64/menus.h +++ b/radio/src/gui/128x64/menus.h @@ -50,11 +50,11 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF enum MenuRadioIndexes { - MENU_RADIO_SETUP, - CASE_SDCARD(MENU_RADIO_SD_MANAGER) #if defined(LUA) || defined(PXX2) || defined(MULTIMODULE) MENU_RADIO_TOOLS, #endif + CASE_SDCARD(MENU_RADIO_SD_MANAGER) + MENU_RADIO_SETUP, MENU_RADIO_SPECIAL_FUNCTIONS, MENU_RADIO_TRAINER, MENU_RADIO_HARDWARE, @@ -76,11 +76,11 @@ void menuRadioPowerMeter(event_t event); void menuRadioCalibration(event_t event); static const MenuHandlerFunc menuTabGeneral[MENU_RADIO_PAGES_COUNT] = { - menuRadioSetup, - CASE_SDCARD(menuRadioSdManager) #if defined(LUA) || defined(PXX2) || defined(MULTIMODULE) menuRadioTools, #endif + CASE_SDCARD(menuRadioSdManager) + menuRadioSetup, menuRadioSpecialFunctions, menuRadioTrainer, menuRadioHardware, diff --git a/radio/src/gui/128x64/view_main.cpp b/radio/src/gui/128x64/view_main.cpp index 308ba4290..737a4dc44 100644 --- a/radio/src/gui/128x64/view_main.cpp +++ b/radio/src/gui/128x64/view_main.cpp @@ -369,7 +369,7 @@ void menuMainView(event_t event) break; case EVT_KEY_GENERAL_MENU: - pushMenu(menuRadioSetup); + pushMenu(menuRadioTools); killEvents(event); break; #endif diff --git a/radio/src/gui/212x64/menu_radio.cpp b/radio/src/gui/212x64/menu_radio.cpp index 082424e07..6e7647a72 100644 --- a/radio/src/gui/212x64/menu_radio.cpp +++ b/radio/src/gui/212x64/menu_radio.cpp @@ -21,11 +21,11 @@ #include "opentx.h" const MenuHandlerFunc menuTabGeneral[MENU_RADIO_PAGES_COUNT] = { - menuRadioSetup, - menuRadioSdManager, #if defined(LUA) || defined(PXX2) menuRadioTools, #endif + menuRadioSdManager, + menuRadioSetup, menuRadioSpecialFunctions, menuRadioTrainer, menuRadioHardware, diff --git a/radio/src/gui/212x64/menus.h b/radio/src/gui/212x64/menus.h index 24da83e0f..c5025c728 100644 --- a/radio/src/gui/212x64/menus.h +++ b/radio/src/gui/212x64/menus.h @@ -52,11 +52,11 @@ void menuTraceBuffer(event_t event); #endif enum MenuRadioIndexes { - MENU_RADIO_SETUP, - MENU_RADIO_SD_MANAGER, #if defined(LUA) || defined(PXX2) || defined(MULTIMODULE) MENU_RADIO_TOOLS, #endif + MENU_RADIO_SD_MANAGER, + MENU_RADIO_SETUP, MENU_RADIO_SPECIAL_FUNCTIONS, MENU_RADIO_TRAINER, MENU_RADIO_HARDWARE, diff --git a/radio/src/gui/212x64/view_main.cpp b/radio/src/gui/212x64/view_main.cpp index 56e4c22ae..720e3ccbf 100644 --- a/radio/src/gui/212x64/view_main.cpp +++ b/radio/src/gui/212x64/view_main.cpp @@ -455,7 +455,7 @@ void menuMainView(event_t event) break; case EVT_KEY_LONG(KEY_MENU): - pushMenu(menuRadioSetup); + pushMenu(menuRadioTools); killEvents(event); break; #endif diff --git a/radio/src/gui/480x272/menu_radio.cpp b/radio/src/gui/480x272/menu_radio.cpp index 42327fc6f..dd5368bc2 100644 --- a/radio/src/gui/480x272/menu_radio.cpp +++ b/radio/src/gui/480x272/menu_radio.cpp @@ -21,11 +21,11 @@ #include "opentx.h" const MenuHandlerFunc menuTabGeneral[MENU_RADIO_PAGES_COUNT] = { - menuRadioSetup, - menuRadioSdManager, #if defined(LUA) || defined(PXX2) menuRadioTools, #endif + menuRadioSdManager, + menuRadioSetup, menuRadioSpecialFunctions, menuRadioTrainer, menuRadioHardware, diff --git a/radio/src/gui/480x272/menus.cpp b/radio/src/gui/480x272/menus.cpp index 44af61725..c166eb86b 100644 --- a/radio/src/gui/480x272/menus.cpp +++ b/radio/src/gui/480x272/menus.cpp @@ -55,7 +55,7 @@ void pushMenu(MenuHandlerFunc newMenu) killEvents(KEY_ENTER); if (menuLevel == 0) { - if (newMenu == menuRadioSetup) + if (newMenu == menuRadioTools) menuVerticalPositions[0] = 1; if (newMenu == menuModelSetup) menuVerticalPositions[0] = 0; diff --git a/radio/src/gui/480x272/menus.h b/radio/src/gui/480x272/menus.h index a3d9574ca..37e33a58f 100644 --- a/radio/src/gui/480x272/menus.h +++ b/radio/src/gui/480x272/menus.h @@ -190,11 +190,11 @@ bool menuRadioDiagAnalogs(event_t event); extern const MenuHandlerFunc menuTabModel[MENU_MODEL_PAGES_COUNT]; enum EnumTabRadio { - MENU_RADIO_SETUP, - MENU_RADIO_SD_MANAGER, #if defined(LUA) || defined(PXX2) || defined(MULTIMODULE) MENU_RADIO_TOOLS, #endif + MENU_RADIO_SD_MANAGER, + MENU_RADIO_SETUP, MENU_RADIO_SPECIAL_FUNCTIONS, MENU_RADIO_TRAINER, MENU_RADIO_HARDWARE, @@ -204,11 +204,11 @@ enum EnumTabRadio { const uint8_t RADIO_ICONS[MENU_RADIO_PAGES_COUNT + 1] = { ICON_RADIO, - ICON_RADIO_SETUP, - ICON_RADIO_SD_MANAGER, #if defined(LUA) || defined(PXX2) ICON_RADIO_TOOLS, #endif + ICON_RADIO_SD_MANAGER, + ICON_RADIO_SETUP, ICON_RADIO_GLOBAL_FUNCTIONS, ICON_RADIO_TRAINER, ICON_RADIO_HARDWARE, From 6fec6eef21338730128e35586050ba1409a193d4 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 30 Jan 2020 13:22:08 +0100 Subject: [PATCH 106/560] Cosmetics --- companion/src/firmwares/opentx/opentxinterface.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 294c69a82..09aded8e2 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -1172,8 +1172,8 @@ void addOpenTxCommonOptions(OpenTxFirmware * firmware) enum RfOptions { NONE = 0, - EU, - FLEX + EU = 1 << 0, + FLEX = 1 << 1 }; void addOpenTxRfOptions(OpenTxFirmware * firmware, uint8_t options) From 0f9114c52428d36c294aa94b3dd17588b02090b4 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 30 Jan 2020 14:25:09 +0100 Subject: [PATCH 107/560] Initial TX16S (#7344) * TX16S initial push - Radio booting, navigation keys ok * TX16S libsimu * Please Travis * Do not start radio on charger power * USB charger led handling * Revert "USB charger led handling" until we have proper details * Pseudo sport power pin * Please Travis * tx16s serial debug * Add tx16s calibration picture * Review anadir for tx16s, needs to be checked on more radios * Dump raw multi telem on AUX port * More work on TX16S * Fixes * Compilation fix * Compilation fix * Fix Aux Serial power * Various improvement * USB charger led handling * Cosmetics * Cosmetics * USB charger led handling * Add charge indicator on GUI --- companion/src/CMakeLists.txt | 2 + companion/src/apppreferencesdialog.cpp | 2 +- companion/src/companion.qrc | 11 + companion/src/firmwares/boards.cpp | 18 +- companion/src/firmwares/boards.h | 30 ++- companion/src/firmwares/generalsettings.cpp | 20 +- .../src/firmwares/opentx/opentxeeprom.cpp | 70 +++---- .../src/firmwares/opentx/opentxinterface.cpp | 34 +-- companion/src/firmwares/radiodata.cpp | 2 +- companion/src/firmwares/rawsource.cpp | 14 +- companion/src/firmwares/rawswitch.cpp | 8 +- companion/src/generaledit/generalsetup.cpp | 4 +- companion/src/generaledit/hardware.cpp | 4 +- .../src/images/simulator/TX16S/bottom.png | Bin 0 -> 250 bytes companion/src/images/simulator/TX16S/left.png | Bin 0 -> 48315 bytes .../src/images/simulator/TX16S/left_page.png | Bin 0 -> 48258 bytes .../src/images/simulator/TX16S/left_page2.png | Bin 0 -> 48292 bytes .../src/images/simulator/TX16S/left_rtn.png | Bin 0 -> 48242 bytes .../src/images/simulator/TX16S/left_sys.png | Bin 0 -> 48264 bytes .../src/images/simulator/TX16S/left_tele.png | Bin 0 -> 48266 bytes .../src/images/simulator/TX16S/right.png | Bin 0 -> 40325 bytes .../src/images/simulator/TX16S/right_ent.png | Bin 0 -> 40117 bytes .../src/images/simulator/TX16S/right_mdl.png | Bin 0 -> 40247 bytes companion/src/images/simulator/TX16S/top.png | Bin 0 -> 439 bytes companion/src/mainwindow.cpp | 10 +- companion/src/mdichild.cpp | 4 +- companion/src/modeledit/setup.cpp | 16 +- companion/src/modelslist.cpp | 4 +- companion/src/radiointerface.cpp | 2 +- companion/src/simulation/CMakeLists.txt | 2 + companion/src/simulation/simulateduiwidget.h | 13 ++ .../src/simulation/simulateduiwidgetTX16S.cpp | 72 +++++++ .../src/simulation/simulateduiwidgetTX16S.ui | 197 ++++++++++++++++++ .../src/simulation/simulatorstartupdialog.cpp | 2 +- companion/src/simulation/simulatorwidget.cpp | 5 +- companion/src/storage/categorized.cpp | 2 +- companion/src/storage/rlefile.cpp | 18 +- radio/sdcard/horus/THEMES/Darkblue/tx16s.bmp | Bin 0 -> 164938 bytes radio/sdcard/horus/THEMES/Default/tx16s.bmp | Bin 0 -> 124056 bytes .../bitmaps/480x272/mask_txbat_charging.png | Bin 0 -> 4967 bytes radio/src/dataconstants.h | 4 +- radio/src/gui/480x272/bitmaps.cpp | 4 + radio/src/gui/480x272/bitmaps.h | 1 + radio/src/gui/480x272/radio_hardware.cpp | 3 + radio/src/gui/480x272/themes/darkblue.cpp | 2 + radio/src/gui/480x272/themes/default.cpp | 2 + radio/src/gui/480x272/topbar.cpp | 7 +- radio/src/lua/api_general.cpp | 2 +- radio/src/opentx.h | 2 +- radio/src/sdcard.h | 2 + .../targets/common/arm/stm32/adc_driver.cpp | 2 + .../common/arm/stm32/aux_serial_driver.cpp | 9 + .../arm/stm32/bootloader/CMakeLists.txt | 9 + .../common/arm/stm32/bootloader/boot.cpp | 17 +- .../arm/stm32/rotary_encoder_driver.cpp | 2 +- radio/src/targets/horus/CMakeLists.txt | 23 ++ radio/src/targets/horus/board.cpp | 17 ++ radio/src/targets/horus/board.h | 32 ++- radio/src/targets/horus/hal.h | 75 ++++++- radio/src/targets/horus/keys_driver.cpp | 2 +- .../src/targets/horus/usb_charger_driver.cpp | 38 ++++ radio/src/targets/taranis/board.h | 2 + radio/src/targets/taranis/hal.h | 2 + radio/src/telemetry/multi.cpp | 7 + radio/src/translations/untranslated.h | 4 +- 65 files changed, 702 insertions(+), 134 deletions(-) create mode 100755 companion/src/images/simulator/TX16S/bottom.png create mode 100755 companion/src/images/simulator/TX16S/left.png create mode 100755 companion/src/images/simulator/TX16S/left_page.png create mode 100755 companion/src/images/simulator/TX16S/left_page2.png create mode 100755 companion/src/images/simulator/TX16S/left_rtn.png create mode 100755 companion/src/images/simulator/TX16S/left_sys.png create mode 100755 companion/src/images/simulator/TX16S/left_tele.png create mode 100755 companion/src/images/simulator/TX16S/right.png create mode 100755 companion/src/images/simulator/TX16S/right_ent.png create mode 100755 companion/src/images/simulator/TX16S/right_mdl.png create mode 100755 companion/src/images/simulator/TX16S/top.png create mode 100644 companion/src/simulation/simulateduiwidgetTX16S.cpp create mode 100644 companion/src/simulation/simulateduiwidgetTX16S.ui create mode 100755 radio/sdcard/horus/THEMES/Darkblue/tx16s.bmp create mode 100644 radio/sdcard/horus/THEMES/Default/tx16s.bmp create mode 100755 radio/src/bitmaps/480x272/mask_txbat_charging.png create mode 100644 radio/src/targets/horus/usb_charger_driver.cpp diff --git a/companion/src/CMakeLists.txt b/companion/src/CMakeLists.txt index 0603c40cf..14f24ccba 100644 --- a/companion/src/CMakeLists.txt +++ b/companion/src/CMakeLists.txt @@ -351,6 +351,8 @@ elseif(PCB STREQUAL X10 AND PCBREV STREQUAL EXPRESS) set(FLAVOUR x10express) elseif(PCB STREQUAL X10 AND PCBREV STREQUAL T16) set(FLAVOUR t16) +elseif(PCB STREQUAL X10 AND PCBREV STREQUAL TX16S) + set(FLAVOUR tx16s) else() string(TOLOWER ${PCB} FLAVOUR) endif() diff --git a/companion/src/apppreferencesdialog.cpp b/companion/src/apppreferencesdialog.cpp index c17d5c88d..63c260176 100644 --- a/companion/src/apppreferencesdialog.cpp +++ b/companion/src/apppreferencesdialog.cpp @@ -541,7 +541,7 @@ void AppPreferencesDialog::populateFirmwareOptions(const Firmware * firmware) // TODO: Remove once splash replacement supported on Horus // NOTE: 480x272 image causes issues on screens <800px high, needs a solution like scrolling once reinstated - if (IS_HORUS(baseFw->getBoard())) { + if (IS_FAMILY_HORUS_OR_T16(baseFw->getBoard())) { ui->widget_splashImage->hide(); ui->SplashFileName->setText(""); } diff --git a/companion/src/companion.qrc b/companion/src/companion.qrc index f91782c50..ce172fbb7 100644 --- a/companion/src/companion.qrc +++ b/companion/src/companion.qrc @@ -190,6 +190,17 @@ images/simulator/JumperT16/left_tele.png images/simulator/JumperT16/right_ent.png images/simulator/JumperT16/right_rtn.png + images/simulator/TX16S/left.png + images/simulator/TX16S/right.png + images/simulator/TX16S/top.png + images/simulator/TX16S/bottom.png + images/simulator/TX16S/left_page.png + images/simulator/TX16S/left_page2.png + images/simulator/TX16S/left_rtn.png + images/simulator/TX16S/left_sys.png + images/simulator/TX16S/left_tele.png + images/simulator/TX16S/right_ent.png + images/simulator/TX16S/right_mdl.png images/wizard/ailerons.png images/wizard/airbrakes.png images/wizard/elevons.png diff --git a/companion/src/firmwares/boards.cpp b/companion/src/firmwares/boards.cpp index acfc70004..cfadf5936 100644 --- a/companion/src/firmwares/boards.cpp +++ b/companion/src/firmwares/boards.cpp @@ -92,6 +92,8 @@ uint32_t Boards::getFourCC(Type board) return 0x3D78746F; case BOARD_JUMPER_T16: return 0x3F78746F; + case BOARD_RADIOMASTER_TX16S: + return 0x3878746F; case BOARD_UNKNOWN: break; } @@ -132,6 +134,7 @@ int Boards::getEEpromSize(Board::Type board) case BOARD_X10: case BOARD_X10_EXPRESS: case BOARD_JUMPER_T16: + case BOARD_RADIOMASTER_TX16S: return 0; } @@ -169,6 +172,7 @@ int Boards::getFlashSize(Type board) case BOARD_X10: case BOARD_X10_EXPRESS: case BOARD_JUMPER_T16: + case BOARD_RADIOMASTER_TX16S: return FSIZE_HORUS; case BOARD_UNKNOWN: return FSIZE_MAX; @@ -284,7 +288,7 @@ int Boards::getCapability(Board::Type board, Board::Capability capability) return 2; else if (IS_TARANIS_X9E(board)) return 4; - else if (IS_HORUS_X10(board) || IS_JUMPER_T16(board)) + else if (IS_HORUS_X10(board) || IS_FAMILY_T16(board)) return 5; else if (IS_HORUS_X12S(board)) return 3; @@ -300,13 +304,13 @@ int Boards::getCapability(Board::Type board, Board::Capability capability) case Sliders: if (IS_HORUS_X12S(board) || IS_TARANIS_X9E(board)) return 4; - else if (IS_TARANIS_X9D(board) || IS_HORUS_X10(board) || IS_JUMPER_T16(board)) + else if (IS_TARANIS_X9D(board) || IS_HORUS_X10(board) || IS_FAMILY_T16(board)) return 2; else return 0; case MouseAnalogs: - if (IS_HORUS(board)) + if (IS_FAMILY_HORUS_OR_T16(board)) return 2; else return 0; @@ -343,7 +347,7 @@ int Boards::getCapability(Board::Type board, Board::Capability capability) return 9; else if (IS_TARANIS(board)) return 8; - else if (IS_HORUS(board)) + else if (IS_FAMILY_HORUS_OR_T16(board)) return 10; else return 7; @@ -363,7 +367,7 @@ int Boards::getCapability(Board::Type board, Board::Capability capability) return 9; case NumTrims: - if (IS_HORUS(board)) + if (IS_FAMILY_HORUS_OR_T16(board)) return 6; else return 4; @@ -467,7 +471,7 @@ QString Boards::getAnalogInputName(Board::Type board, int index) if (index < DIM(pots)) return pots[index]; } - else if (IS_HORUS_X10(board) || IS_JUMPER_T16(board)) { + else if (IS_HORUS_X10(board) || IS_FAMILY_T16(board)) { const QString pots[] = { "S1", "6P", @@ -536,6 +540,8 @@ QString Boards::getBoardName(Board::Type board) return "Horus X10/X10S Express"; case BOARD_JUMPER_T16: return "Jumper T16"; + case BOARD_RADIOMASTER_TX16S: + return "Radiomaster TX16S"; default: return tr("Unknown"); } diff --git a/companion/src/firmwares/boards.h b/companion/src/firmwares/boards.h index 74e690ebf..e4149a298 100644 --- a/companion/src/firmwares/boards.h +++ b/companion/src/firmwares/boards.h @@ -54,9 +54,10 @@ namespace Board { BOARD_TARANIS_X9LITES, BOARD_JUMPER_T12, BOARD_JUMPER_T16, + BOARD_RADIOMASTER_TX16S, }; - constexpr int BOARD_TYPE_MAX = BOARD_JUMPER_T16 ; + constexpr int BOARD_TYPE_MAX = BOARD_RADIOMASTER_TX16S ; enum PotType { @@ -230,6 +231,16 @@ inline bool IS_JUMPER_T16(Board::Type board) return board == Board::BOARD_JUMPER_T16; } +inline bool IS_RADIOMASTER_TX16S(Board::Type board) +{ + return board == Board::BOARD_RADIOMASTER_TX16S; +} + +inline bool IS_FAMILY_T16(Board::Type board) +{ + return board == Board::BOARD_JUMPER_T16 || board == Board::BOARD_RADIOMASTER_TX16S; +} + inline bool IS_TARANIS_XLITE(Board::Type board) { return board == Board::BOARD_TARANIS_XLITE || board == Board::BOARD_TARANIS_XLITES; @@ -300,19 +311,24 @@ inline bool IS_HORUS_X12S(Board::Type board) return board == Board::BOARD_HORUS_X12S; } -inline bool IS_HORUS(Board::Type board) +inline bool IS_FAMILY_HORUS(Board::Type board) { - return IS_HORUS_X12S(board) || IS_HORUS_X10(board) || IS_JUMPER_T16(board); + return IS_HORUS_X12S(board) || IS_HORUS_X10(board); +} + +inline bool IS_FAMILY_HORUS_OR_T16(Board::Type board) +{ + return IS_FAMILY_HORUS(board) || IS_FAMILY_T16(board); } inline bool IS_HORUS_OR_TARANIS(Board::Type board) { - return IS_HORUS(board) || IS_TARANIS(board); + return IS_FAMILY_HORUS_OR_T16(board) || IS_TARANIS(board); } inline bool IS_STM32(Board::Type board) { - return IS_TARANIS(board) || IS_HORUS(board); + return IS_TARANIS(board) || IS_FAMILY_HORUS_OR_T16(board); } inline bool IS_ARM(Board::Type board) @@ -322,7 +338,7 @@ inline bool IS_ARM(Board::Type board) inline bool HAS_LARGE_LCD(Board::Type board) { - return IS_HORUS(board) || IS_TARANIS_X9(board); + return IS_FAMILY_HORUS_OR_T16(board) || IS_TARANIS_X9(board); } inline bool HAS_EXTERNAL_ANTENNA(Board::Type board) @@ -333,7 +349,7 @@ inline bool HAS_EXTERNAL_ANTENNA(Board::Type board) inline bool IS_ACCESS_RADIO(Board::Type board, QString &id) { return (IS_TARANIS_XLITES(board) || IS_TARANIS_X9LITE(board) || board == Board::BOARD_TARANIS_X9DP_2019 || board == Board::BOARD_X10_EXPRESS || IS_TARANIS_X7_ACCESS(board) || - (IS_HORUS(board) && id.contains("internalaccess"))); + (IS_FAMILY_HORUS_OR_T16(board) && id.contains("internalaccess"))); } #endif // _BOARDS_H_ diff --git a/companion/src/firmwares/generalsettings.cpp b/companion/src/firmwares/generalsettings.cpp index 6cb9fdb9f..1676e913c 100644 --- a/companion/src/firmwares/generalsettings.cpp +++ b/companion/src/firmwares/generalsettings.cpp @@ -88,7 +88,7 @@ GeneralSettings::GeneralSettings() vBatMin = -5; //8,5V vBatMax = -5; //11,5V } - else if (IS_TARANIS_XLITE(board) || IS_HORUS_X10(board) || IS_JUMPER_T16(board)) { + else if (IS_TARANIS_XLITE(board) || IS_HORUS_X10(board) || IS_FAMILY_T16(board)) { // Lipo 2S vBatWarn = 66; vBatMin = -23; // 6.7V @@ -106,7 +106,7 @@ GeneralSettings::GeneralSettings() backlightMode = 3; // keys and sticks // backlightBright = 0; // 0 = 100% - if (IS_HORUS(board)) { + if (IS_FAMILY_HORUS_OR_T16(board)) { backlightOffBright = 20; } @@ -116,7 +116,7 @@ GeneralSettings::GeneralSettings() if (IS_JUMPER_T16(board)) strcpy(bluetoothName, "t16"); - else if (IS_HORUS(board)) { + else if (IS_FAMILY_HORUS_OR_T16(board)) { strcpy(bluetoothName, "horus"); } else if (IS_TARANIS_X9E(board) || IS_TARANIS_SMALL(board)) { @@ -236,7 +236,7 @@ void GeneralSettings::setDefaultControlTypes(Board::Type board) } // TODO: move to Boards, like with switches - if (IS_HORUS(board)) { + if (IS_FAMILY_HORUS_OR_T16(board)) { potConfig[0] = Board::POT_WITH_DETENT; potConfig[1] = Board::POT_MULTIPOS_SWITCH; potConfig[2] = Board::POT_WITH_DETENT; @@ -269,7 +269,7 @@ void GeneralSettings::setDefaultControlTypes(Board::Type board) sliderConfig[2] = Board::SLIDER_WITH_DETENT; sliderConfig[3] = Board::SLIDER_WITH_DETENT; } - else if (IS_TARANIS_X9(board) || IS_HORUS_X10(board) || IS_JUMPER_T16(board)) { + else if (IS_TARANIS_X9(board) || IS_HORUS_X10(board) || IS_FAMILY_T16(board)) { sliderConfig[0] = Board::SLIDER_WITH_DETENT; sliderConfig[1] = Board::SLIDER_WITH_DETENT; } @@ -313,27 +313,27 @@ void GeneralSettings::convert(RadioDataConversionState & cstate) // SE and SG are skipped on X7 board if (IS_TARANIS_X7(cstate.toType)) { - if (IS_TARANIS_X9(cstate.fromType) || IS_HORUS(cstate.fromType)) { + if (IS_TARANIS_X9(cstate.fromType) || IS_FAMILY_HORUS_OR_T16(cstate.fromType)) { strncpy(switchName[4], switchName[5], sizeof(switchName[4])); strncpy(switchName[5], switchName[7], sizeof(switchName[5])); } } else if (IS_TARANIS_X7(cstate.fromType)) { - if (IS_TARANIS_X9(cstate.toType) || IS_HORUS(cstate.toType)) { + if (IS_TARANIS_X9(cstate.toType) || IS_FAMILY_HORUS_OR_T16(cstate.toType)) { strncpy(switchName[5], switchName[4], sizeof(switchName[5])); strncpy(switchName[7], switchName[5], sizeof(switchName[7])); } } if (IS_JUMPER_T12(cstate.toType)) { - if (IS_TARANIS_X9(cstate.fromType) || IS_HORUS(cstate.fromType)) { + 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)) { - if (IS_TARANIS_X9(cstate.toType) || IS_HORUS(cstate.toType)) { + 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])); } @@ -349,7 +349,7 @@ void GeneralSettings::convert(RadioDataConversionState & cstate) strncpy(sliderName[3], sliderName[1], sizeof(sliderName[3])); } - if (IS_HORUS(cstate.toType)) { + if (IS_FAMILY_HORUS_OR_T16(cstate.toType)) { // 6P switch is only on Horus (by default) if (cstate.fromBoard.getCapability(Board::FactoryInstalledPots) == 2) { strncpy(potName[2], potName[1], sizeof(potName[2])); diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index 18dfc7379..3609713a5 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -36,7 +36,7 @@ inline int MAX_SWITCHES(Board::Type board, int version) if (version <= 218) { if (IS_TARANIS_X7(board)) return 6; - if (IS_TARANIS_X9D(board) || IS_HORUS(board)) + if (IS_TARANIS_X9D(board) || IS_FAMILY_HORUS_OR_T16(board)) return 8; if (IS_TARANIS_XLITE(board)) return 4; @@ -63,7 +63,7 @@ inline int MAX_SWITCHES_POSITION(Board::Type board, int version) inline int POTS_CONFIG_SIZE(Board::Type board, int version) { - if (version >= 219 && IS_HORUS(board)) + if (version >= 219 && IS_FAMILY_HORUS_OR_T16(board)) return 16; return 8; @@ -71,44 +71,44 @@ inline int POTS_CONFIG_SIZE(Board::Type board, int version) inline int MAX_POTS(Board::Type board, int version) { - if (version <= 218 && IS_HORUS(board)) + if (version <= 218 && IS_FAMILY_HORUS_OR_T16(board)) return 3; return Boards::getCapability(board, Board::Pots); } inline int MAX_POTS_STORAGE(Board::Type board, int version) { - if (version <= 218 && IS_HORUS(board)) + if (version <= 218 && IS_FAMILY_HORUS_OR_T16(board)) return 3; - if (version >= 219 && IS_HORUS(board)) + if (version >= 219 && IS_FAMILY_HORUS_OR_T16(board)) return 5; return Boards::getCapability(board, Board::Pots); } inline int MAX_POTS_SOURCES(Board::Type board, int version) { - if (version <= 218 && IS_HORUS(board)) + if (version <= 218 && IS_FAMILY_HORUS_OR_T16(board)) return 5; return Boards::getCapability(board, Board::Pots); } inline int MAX_SLIDERS_STORAGE(Board::Type board, int version) { - if (version >= 219 && IS_HORUS(board)) + if (version >= 219 && IS_FAMILY_HORUS_OR_T16(board)) return 4; return Boards::getCapability(board, Board::Sliders); } inline int MAX_SLIDERS_SOURCES(Board::Type board, int version) { - if (version <= 218 && IS_HORUS(board)) + if (version <= 218 && IS_FAMILY_HORUS_OR_T16(board)) return 2; return Boards::getCapability(board, Board::Sliders); } inline int SLIDERS_CONFIG_SIZE(Board::Type board, int version) { - if (version >= 219 && IS_HORUS(board)) + if (version >= 219 && IS_FAMILY_HORUS_OR_T16(board)) return 8; return 4; @@ -119,7 +119,7 @@ inline int SWITCHES_CONFIG_SIZE(Board::Type board, int version) if (IS_TARANIS_X9E(board)) return 64; - if (IS_HORUS(board)) + if (IS_FAMILY_HORUS_OR_T16(board)) return 32; if (version >= 219 && IS_TARANIS_X9D(board)) @@ -139,11 +139,11 @@ inline int SWITCHES_CONFIG_SIZE(Board::Type board, int version) #define MAX_CUSTOM_FUNCTIONS(board, version) 64 #define MAX_CURVES(board, version) ((version >= 219 || HAS_LARGE_LCD(board)) ? 32 : 16) #define MAX_GVARS(board, version) 9 -#define MAX_SCRIPTS(board) (IS_HORUS(board) ? 9 : 7) -#define MAX_TELEMETRY_SENSORS(board, version) (version <= 218 ? 32 : ((IS_HORUS(board) || IS_TARANIS_X9(board)) ? 60 : 40)) +#define MAX_SCRIPTS(board) (IS_FAMILY_HORUS_OR_T16(board) ? 9 : 7) +#define MAX_TELEMETRY_SENSORS(board, version) (version <= 218 ? 32 : ((IS_FAMILY_HORUS_OR_T16(board) || IS_TARANIS_X9(board)) ? 60 : 40)) #define NUM_PPM_INPUTS(board, version) 16 #define ROTENC_COUNT(board, version) ((IS_STM32(board) && version >= 218) ? 0 : 1) -#define MAX_AUX_TRIMS(board) (IS_HORUS(board) ? 2 : 0) +#define MAX_AUX_TRIMS(board) (IS_FAMILY_HORUS_OR_T16(board) ? 2 : 0) inline int switchIndex(int i, Board::Type board, unsigned int version) { @@ -810,7 +810,7 @@ class MixField: public TransformedField { internalField.Append(new UnsignedField<8>(this, mix.delayDown)); internalField.Append(new UnsignedField<8>(this, mix.speedUp)); internalField.Append(new UnsignedField<8>(this, mix.speedDown)); - if (IS_HORUS(board)) + if (IS_FAMILY_HORUS_OR_T16(board)) internalField.Append(new ZCharField<6>(this, mix.name)); else if (HAS_LARGE_LCD(board) && version <= 218) internalField.Append(new ZCharField<8>(this, mix.name)); @@ -946,7 +946,7 @@ class InputField: public TransformedField { internalField.Append(new UnsignedField<9>(this, expo.flightModes)); internalField.Append(new SignedField<8>(this, _weight, "Weight")); internalField.Append(new SpareBitsField<1>(this)); - if (IS_HORUS(board)) + if (IS_FAMILY_HORUS_OR_T16(board)) internalField.Append(new ZCharField<6>(this, expo.name)); else if (HAS_LARGE_LCD(board) && version <= 218) internalField.Append(new ZCharField<8>(this, expo.name)); @@ -1809,7 +1809,7 @@ class Frsky218Field: public StructField { rssiConversionTable[0] = RSSIConversionTable(0); rssiConversionTable[1] = RSSIConversionTable(1); - if (!IS_HORUS(board)) { + if (!IS_FAMILY_HORUS_OR_T16(board)) { Append(new UnsignedField<8>(this, frsky.voltsSource, "Volts Source")); Append(new UnsignedField<8>(this, frsky.altitudeSource, "Altitude Source")); @@ -2251,7 +2251,7 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig qDebug() << QString("OpenTxModelData::OpenTxModelData(name: %1, board: %2, ver: %3, var: %4)").arg(name).arg(board).arg(version).arg(variant); - if (IS_HORUS(board)) + if (IS_FAMILY_HORUS_OR_T16(board)) internalField.Append(new ZCharField<15>(this, modelData.name, "Model name")); else if (HAS_LARGE_LCD(board)) internalField.Append(new ZCharField<12>(this, modelData.name, "Model name")); @@ -2262,7 +2262,7 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig internalField.Append(new UnsignedField<8>(this, modelData.moduleData[1].modelId)); if (HAS_LARGE_LCD(board)) { - if (version >= 219 && IS_HORUS(board)) + if (version >= 219 && IS_FAMILY_HORUS_OR_T16(board)) internalField.Append(new CharField<14>(this, modelData.bitmap, true, "Model bitmap")); else internalField.Append(new CharField<10>(this, modelData.bitmap, true, "Model bitmap")); @@ -2330,7 +2330,7 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig internalField.Append(new UnsignedField<8>(this, modelData.thrTraceSrc, "Throttle Source")); - if (IS_HORUS(board)) + if (IS_FAMILY_HORUS_OR_T16(board)) internalField.Append(new SwitchesWarningField<32>(this, modelData.switchWarningStates, board, version)); else if (IS_TARANIS_X9E(board)) internalField.Append(new SwitchesWarningField<64>(this, modelData.switchWarningStates, board, version)); @@ -2345,7 +2345,7 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig internalField.Append(new UnsignedField<32>(this, modelData.switchWarningEnable)); else if (version >= 219 && IS_TARANIS_X9D(board)) internalField.Append(new UnsignedField<16>(this, modelData.switchWarningEnable)); - else if (!IS_HORUS(board)) + else if (!IS_FAMILY_HORUS_OR_T16(board)) internalField.Append(new UnsignedField<8>(this, modelData.switchWarningEnable)); for (int i=0; i(this, modelData.toplcdTimer)); } - if (IS_HORUS(board)) { + if (IS_FAMILY_HORUS_OR_T16(board)) { for (int i = 0; i < 5; i++) { internalField.Append(new CharField<610>(this, modelData.customScreenData[i], false, "Custom screen blob")); } @@ -2508,7 +2508,7 @@ void OpenTxModelData::beforeExport() { // qDebug() << QString("before export model") << modelData.name; - if (IS_HORUS(board)) { + if (IS_FAMILY_HORUS_OR_T16(board)) { uint32_t newSwitchWarningStates = 0; for (int i = 0; i < MAX_SWITCHES(board, version); i++) { uint8_t value = (modelData.switchWarningStates >> (2*i)) & 0x03; @@ -2524,7 +2524,7 @@ void OpenTxModelData::afterImport() { qCDebug(eepromImport) << QString("OpenTxModelData::afterImport()") << modelData.name; - if (IS_HORUS(board)) { + if (IS_FAMILY_HORUS_OR_T16(board)) { uint32_t newSwitchWarningStates = 0; for (int i = 0; i < MAX_SWITCHES(board, version); i++) { uint8_t value = (modelData.switchWarningStates >> (3*i)) & 0x07; @@ -2572,7 +2572,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type internalField.Append(new UnsignedField<16>(this, chkSum)); - if (!IS_HORUS(board)) { + if (!IS_FAMILY_HORUS_OR_T16(board)) { internalField.Append(new UnsignedField<8>(this, generalData.currModelIndex)); internalField.Append(new UnsignedField<8>(this, generalData.contrast)); } @@ -2617,7 +2617,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type internalField.Append(new UnsignedField<8>(this, generalData.inactivityTimer)); internalField.Append(new UnsignedField<3>(this, generalData.telemetryBaudrate)); - if (IS_HORUS(board)) + if (IS_FAMILY_HORUS_OR_T16(board)) internalField.Append(new SpareBitsField<3>(this)); else if (IS_TARANIS(board)) internalField.Append(new SignedField<3>(this, generalData.splashDuration)); @@ -2632,11 +2632,11 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type internalField.Append(new SignedField<8>(this, generalData.PPM_Multiplier)); internalField.Append(new SignedField<8>(this, generalData.hapticLength)); - if (version < 218 || (!IS_TARANIS(board) && !IS_HORUS(board))) { + if (version < 218 || (!IS_TARANIS(board) && !IS_FAMILY_HORUS_OR_T16(board))) { internalField.Append(new UnsignedField<8>(this, generalData.reNavigation)); } - if (!IS_TARANIS(board) && !IS_HORUS(board)) { + if (!IS_TARANIS(board) && !IS_FAMILY_HORUS_OR_T16(board)) { internalField.Append(new UnsignedField<8>(this, generalData.stickReverse)); } @@ -2715,7 +2715,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type if (IS_STM32(board)) { if (version >= 218) { internalField.Append(new UnsignedField<4>(this, generalData.auxSerialMode)); - if (IS_HORUS(board) && version >= 219) { + if (IS_FAMILY_HORUS_OR_T16(board) && version >= 219) { internalField.Append(new SpareBitsField<4>(this)); } else { @@ -2735,7 +2735,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type } } - if (IS_HORUS(board)) { + if (IS_FAMILY_HORUS_OR_T16(board)) { for (int i=0; i(this, generalData.switchConfig[i])); @@ -2747,7 +2747,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type for (int i=0; i= 3)) + if (version <= 218 && IS_FAMILY_HORUS_OR_T16(board) && (i >= 3)) offset += 2; if (i < MAX_POTS_STORAGE(board, version)) @@ -2756,7 +2756,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type internalField.Append(new SpareBitsField<2>(this)); } - if (IS_HORUS(board) && version >= 219) { + if (IS_FAMILY_HORUS_OR_T16(board) && version >= 219) { for (int i=0; i(this, generalData.sliderConfig[i])); @@ -2765,7 +2765,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type } } - if (!IS_HORUS(board)) { + if (!IS_FAMILY_HORUS_OR_T16(board)) { internalField.Append(new UnsignedField<8>(this, generalData.backlightColor)); } } @@ -2793,7 +2793,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type } } - if (IS_HORUS(board)) { + if (IS_FAMILY_HORUS_OR_T16(board)) { for (int i=0; i(this, generalData.switchName[i], "Switch name")); } @@ -2832,7 +2832,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type } } - if (IS_HORUS(board)) { + if (IS_FAMILY_HORUS_OR_T16(board)) { internalField.Append(new SpareBitsField<1>(this)); internalField.Append(new UnsignedField<7>(this, generalData.backlightOffBright)); internalField.Append(new ZCharField<10>(this, generalData.bluetoothName, "Bluetooth name")); @@ -2842,7 +2842,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type internalField.Append(new ZCharField<10>(this, generalData.bluetoothName, "Bluetooth name")); } - if (IS_HORUS(board)) { + if (IS_FAMILY_HORUS_OR_T16(board)) { internalField.Append(new CharField<8>(this, generalData.themeName, true, "Theme name")); for (int i=0; i<5; i++) { internalField.Append(new CharField<8>(this, (char *)generalData.themeOptionValue[i], true, "Theme blob")); diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 09aded8e2..d22964cb0 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -70,6 +70,8 @@ const char * OpenTxEepromInterface::getName() return "OpenTX for Jumper T12"; case BOARD_JUMPER_T16: return "OpenTX for Jumper T16"; + case BOARD_RADIOMASTER_TX16S: + return "OpenTX for Radiomaster TX16S"; case BOARD_TARANIS_X9D: return "OpenTX for FrSky Taranis X9D"; case BOARD_TARANIS_X9DP: @@ -175,7 +177,7 @@ bool OpenTxEepromInterface::loadFromByteArray(T & dest, const QByteArray & data) { uint32_t fourcc = *((uint32_t*)&data.data()[0]); if (Boards::getFourCC(board) != fourcc) { - if (IS_HORUS(board) && fourcc == 0x3178396F) { + if (IS_FAMILY_HORUS_OR_T16(board) && fourcc == 0x3178396F) { qDebug() << QString().sprintf("%s: Deprecated fourcc used %x vs %x", getName(), fourcc, Boards::getFourCC(board)); } else { @@ -441,7 +443,7 @@ int OpenTxFirmware::getCapability(::Capability capability) { switch (capability) { case Models: - if (IS_HORUS(board)) + if (IS_FAMILY_HORUS_OR_T16(board)) return 0; else if (IS_ARM(board)) return 60; @@ -457,7 +459,7 @@ int OpenTxFirmware::getCapability(::Capability capability) else return id.contains("imperial") ? 1 : 0; case ModelImage: - return (board == BOARD_TARANIS_X9D || IS_TARANIS_PLUS(board) || board == BOARD_TARANIS_X9DP_2019 || IS_HORUS(board)); + return (board == BOARD_TARANIS_X9D || IS_TARANIS_PLUS(board) || board == BOARD_TARANIS_X9DP_2019 || IS_FAMILY_HORUS_OR_T16(board)); case HasBeeper: return (!IS_ARM(board)); case HasPxxCountry: @@ -495,7 +497,7 @@ int OpenTxFirmware::getCapability(::Capability capability) else return 0; case ModelName: - return (IS_HORUS(board) ? 15 : (HAS_LARGE_LCD(board) ? 12 : 10)); + return (IS_FAMILY_HORUS_OR_T16(board) ? 15 : (HAS_LARGE_LCD(board) ? 12 : 10)); case FlightModesName: return (IS_HORUS_OR_TARANIS(board) ? 10 : 6); case GvarsName: @@ -562,7 +564,7 @@ int OpenTxFirmware::getCapability(::Capability capability) case SoundPitch: return 1; case Haptic: - return (IS_2560(board) || IS_SKY9X(board) || IS_TARANIS_PLUS(board) || IS_TARANIS_SMALL(board) || IS_TARANIS_X9E(board) || IS_HORUS(board) || IS_JUMPER_T12(board) || id.contains("haptic")); + return (IS_2560(board) || IS_SKY9X(board) || IS_TARANIS_PLUS(board) || IS_TARANIS_SMALL(board) || IS_TARANIS_X9E(board) || IS_FAMILY_HORUS_OR_T16(board) || IS_JUMPER_T12(board) || id.contains("haptic")); case ModelTrainerEnable: if (IS_HORUS_OR_TARANIS(board) && board!=Board::BOARD_TARANIS_XLITE) return 1; @@ -610,7 +612,7 @@ int OpenTxFirmware::getCapability(::Capability capability) case TelemetryBars: return 1; case TelemetryCustomScreens: - if (IS_HORUS(board)) + if (IS_FAMILY_HORUS_OR_T16(board)) return 0; else return IS_ARM(board) ? 4 : 2; @@ -663,7 +665,7 @@ int OpenTxFirmware::getCapability(::Capability capability) case HasSDLogs: return ((IS_2560(board) || IS_ARM(board)) ? true : false); case LcdWidth: - if (IS_HORUS(board)) + if (IS_FAMILY_HORUS_OR_T16(board)) return 480; else if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board)) return 128; @@ -672,12 +674,12 @@ int OpenTxFirmware::getCapability(::Capability capability) else return 128; case LcdHeight: - if (IS_HORUS(board)) + if (IS_FAMILY_HORUS_OR_T16(board)) return 272; else return 64; case LcdDepth: - if (IS_HORUS(board)) + if (IS_FAMILY_HORUS_OR_T16(board)) return 16; else if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board)) return 1; @@ -747,7 +749,7 @@ int OpenTxFirmware::getCapability(::Capability capability) case DangerousFunctions: return id.contains("danger") ? 1 : 0; case HasModelCategories: - return IS_HORUS(board); + return IS_FAMILY_HORUS_OR_T16(board); case HasSwitchableJack: return IS_TARANIS_XLITES(board); case PwrButtonPress: @@ -782,9 +784,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) && board != BOARD_JUMPER_T16; + return !IS_ACCESS_RADIO(board, id) && !IS_FAMILY_T16(board); case PULSES_PXX_XJT_D8: - return !(IS_ACCESS_RADIO(board, id) || id.contains("eu")) && board != BOARD_JUMPER_T16; + return !(IS_ACCESS_RADIO(board, id) || id.contains("eu")) && !IS_FAMILY_T16(board); case PULSES_PPM: return id.contains("internalppm"); case PULSES_ACCESS_ISRM: @@ -814,7 +816,7 @@ bool OpenTxFirmware::isAvailable(PulsesProtocol proto, int port) case PULSES_CROSSFIRE: return true; case PULSES_ACCESS_R9M: - return IS_TARANIS_XLITE(board) || IS_TARANIS_X9LITE(board) || board == BOARD_TARANIS_X9DP_2019 || board == BOARD_X10_EXPRESS || (IS_HORUS(board) && id.contains("internalaccess")); + return IS_TARANIS_XLITE(board) || IS_TARANIS_X9LITE(board) || board == BOARD_TARANIS_X9DP_2019 || board == BOARD_X10_EXPRESS || (IS_FAMILY_HORUS_OR_T16(board) && id.contains("internalaccess")); case PULSES_PXX_R9M_LITE: case PULSES_ACCESS_R9M_LITE: case PULSES_ACCESS_R9M_LITE_PRO: @@ -1343,6 +1345,12 @@ void registerOpenTxFirmwares() registerOpenTxFirmware(firmware); addOpenTxRfOptions(firmware, FLEX); + /* Radiomaster TX16S board */ + firmware = new OpenTxFirmware("opentx-tx16s", Firmware::tr("Radiomaster TX16S"), BOARD_RADIOMASTER_TX16S); + addOpenTxFrskyOptions(firmware); + firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module")); + registerOpenTxFirmware(firmware); + /* 9XR-Pro */ firmware = new OpenTxFirmware("opentx-9xrpro", Firmware::tr("Turnigy 9XR-PRO"), BOARD_9XRPRO); addOpenTxArm9xOptions(firmware, false); diff --git a/companion/src/firmwares/radiodata.cpp b/companion/src/firmwares/radiodata.cpp index 0710910a0..8054e5b1a 100644 --- a/companion/src/firmwares/radiodata.cpp +++ b/companion/src/firmwares/radiodata.cpp @@ -116,7 +116,7 @@ void RadioData::convert(RadioDataConversionState & cstate) } } - if (IS_HORUS(cstate.toType)) { + if (IS_FAMILY_HORUS_OR_T16(cstate.toType)) { fixModelFilenames(); } diff --git a/companion/src/firmwares/rawsource.cpp b/companion/src/firmwares/rawsource.cpp index 47171c29f..401eb9781 100644 --- a/companion/src/firmwares/rawsource.cpp +++ b/companion/src/firmwares/rawsource.cpp @@ -580,13 +580,13 @@ RawSource RawSource::convert(RadioDataConversionState & cstate) } } - if (IS_TARANIS(cstate.toType) && IS_HORUS(cstate.fromType)) { + if (IS_TARANIS(cstate.toType) && IS_FAMILY_HORUS_OR_T16(cstate.fromType)) { if (index == 6) index = 5; // pot S2 to S2 else if (index == 5) index = -1; // 6P on Horus doesn't exist on Taranis } - else if (IS_HORUS(cstate.toType) && IS_TARANIS(cstate.fromType) && index == 5) + else if (IS_FAMILY_HORUS_OR_T16(cstate.toType) && IS_TARANIS(cstate.fromType) && index == 5) { index = 6; // pot S2 to S2 } @@ -602,7 +602,7 @@ RawSource RawSource::convert(RadioDataConversionState & cstate) } } - if (IS_TARANIS_X7(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_HORUS(cstate.fromType))) { + if (IS_TARANIS_X7(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_FAMILY_HORUS_OR_T16(cstate.fromType))) { // No SE and SG on X7 board if (index == 4 || index == 6) { index = 3; // SG and SE to SD @@ -615,7 +615,7 @@ RawSource RawSource::convert(RadioDataConversionState & cstate) index = 5; // SH to SH } } - else if (IS_JUMPER_T12(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_HORUS(cstate.fromType))) { + else if (IS_JUMPER_T12(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_FAMILY_HORUS_OR_T16(cstate.fromType))) { // No SE and SG on T12 board if (index == 4 || index == 6) { index = 3; // SG and SE to SD @@ -629,7 +629,7 @@ RawSource RawSource::convert(RadioDataConversionState & cstate) } } // Compensate for SE and SG on X9/Horus board if converting from X7 - else if ((IS_TARANIS_X9(cstate.toType) || IS_HORUS(cstate.toType)) && IS_TARANIS_X7(cstate.fromType)) { + else if ((IS_TARANIS_X9(cstate.toType) || IS_FAMILY_HORUS_OR_T16(cstate.toType)) && IS_TARANIS_X7(cstate.fromType)) { if (index == 4) { index = 5; // SF to SF } @@ -637,7 +637,7 @@ RawSource RawSource::convert(RadioDataConversionState & cstate) index = 7; // SH to SH } } - else if ((IS_TARANIS_X9(cstate.toType) || IS_HORUS(cstate.toType)) && IS_JUMPER_T12(cstate.fromType)) { + else if ((IS_TARANIS_X9(cstate.toType) || IS_FAMILY_HORUS_OR_T16(cstate.toType)) && IS_JUMPER_T12(cstate.fromType)) { if (index == 4) { index = 5; // SF to SF } @@ -645,7 +645,7 @@ RawSource RawSource::convert(RadioDataConversionState & cstate) index = 7; // SH to SH } } - else if ((IS_TARANIS_X9(cstate.toType) || IS_HORUS(cstate.toType)) && IS_JUMPER_T12(cstate.fromType)) { + else if ((IS_TARANIS_X9(cstate.toType) || IS_FAMILY_HORUS_OR_T16(cstate.toType)) && IS_JUMPER_T12(cstate.fromType)) { if (index == 4) { index = 5; // SF to SF } diff --git a/companion/src/firmwares/rawswitch.cpp b/companion/src/firmwares/rawswitch.cpp index 1d91f242a..a689ceea7 100644 --- a/companion/src/firmwares/rawswitch.cpp +++ b/companion/src/firmwares/rawswitch.cpp @@ -197,7 +197,7 @@ RawSwitch RawSwitch::convert(RadioDataConversionState & cstate) } // No SE and SG on X7 board - if (IS_TARANIS_X7(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_HORUS(cstate.fromType))) { + if (IS_TARANIS_X7(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_FAMILY_HORUS_OR_T16(cstate.fromType))) { if (srcIdx == 4 || srcIdx == 5) { delta = 3; // SE to SD & SF to SF if (srcIdx == 4) @@ -211,7 +211,7 @@ RawSwitch RawSwitch::convert(RadioDataConversionState & cstate) delta = 6; // SH to SH } } - else if (IS_JUMPER_T12(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_HORUS(cstate.fromType))) { + else if (IS_JUMPER_T12(cstate.toType) && (IS_TARANIS_X9(cstate.fromType) || IS_FAMILY_HORUS_OR_T16(cstate.fromType))) { if (srcIdx == 4 || srcIdx == 5) { delta = 3; // SE to SD & SF to SF if (srcIdx == 4) @@ -226,7 +226,7 @@ RawSwitch RawSwitch::convert(RadioDataConversionState & cstate) } } // Compensate for SE and SG on X9/Horus board if converting from X7 - else if ((IS_TARANIS_X9(cstate.toType) || IS_HORUS(cstate.toType)) && IS_TARANIS_X7(cstate.fromType)) { + else if ((IS_TARANIS_X9(cstate.toType) || IS_FAMILY_HORUS_OR_T16(cstate.toType)) && IS_TARANIS_X7(cstate.fromType)) { if (srcIdx == 4) { delta = -3; // SF to SF } @@ -234,7 +234,7 @@ RawSwitch RawSwitch::convert(RadioDataConversionState & cstate) delta = -6; // SH to SH } } - else if ((IS_TARANIS_X9(cstate.toType) || IS_HORUS(cstate.toType)) && IS_JUMPER_T12(cstate.fromType)) { + else if ((IS_TARANIS_X9(cstate.toType) || IS_FAMILY_HORUS_OR_T16(cstate.toType)) && IS_JUMPER_T12(cstate.fromType)) { if (srcIdx == 4) { delta = -3; // SF to SF } diff --git a/companion/src/generaledit/generalsetup.cpp b/companion/src/generaledit/generalsetup.cpp index 38db4d31a..1f74e2734 100644 --- a/companion/src/generaledit/generalsetup.cpp +++ b/companion/src/generaledit/generalsetup.cpp @@ -191,7 +191,7 @@ ui(new Ui::GeneralSetup) ui->label_BLBright->hide(); } - if (!IS_HORUS(firmware->getBoard())) { + if (!IS_FAMILY_HORUS_OR_T16(firmware->getBoard())) { ui->OFFBright_SB->hide(); ui->OFFBright_SB->setDisabled(true); ui->label_OFFBright->hide(); @@ -241,7 +241,7 @@ ui(new Ui::GeneralSetup) ui->rssiPowerOffWarnChkB->hide(); } - if (IS_HORUS(firmware->getBoard())) { + if (IS_FAMILY_HORUS_OR_T16(firmware->getBoard())) { ui->splashScreenChkB->hide(); ui->splashScreenDuration->hide(); ui->splashScreenLabel->hide(); diff --git a/companion/src/generaledit/hardware.cpp b/companion/src/generaledit/hardware.cpp index 737882d78..4f530aa78 100644 --- a/companion/src/generaledit/hardware.cpp +++ b/companion/src/generaledit/hardware.cpp @@ -172,7 +172,7 @@ HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings ui->txCurrentCalibrationLabel->hide(); } - if (IS_TARANIS_X7(board) || IS_TARANIS_XLITE(board)|| IS_TARANIS_X9E(board) || IS_HORUS(board)) { + if (IS_TARANIS_X7(board) || IS_TARANIS_XLITE(board)|| IS_TARANIS_X9E(board) || IS_FAMILY_HORUS_OR_T16(board)) { ui->bluetoothMode->addItem(tr("OFF"), 0); if (IS_TARANIS_X9E(board)) { ui->bluetoothMode->addItem(tr("Enabled"), 1); @@ -189,7 +189,7 @@ HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings ui->bluetoothWidget->hide(); } - if ((IS_HORUS(board) && board != Board::BOARD_X10_EXPRESS) || (IS_TARANIS_XLITE(board) && !IS_TARANIS_XLITES(board))) { + if ((IS_FAMILY_HORUS_OR_T16(board) && board != Board::BOARD_X10_EXPRESS) || (IS_TARANIS_XLITE(board) && !IS_TARANIS_XLITES(board))) { ui->antennaMode->addItem(tr("Internal"), -2); ui->antennaMode->addItem(tr("Ask"), -1); ui->antennaMode->addItem(tr("Per model"), 0); diff --git a/companion/src/images/simulator/TX16S/bottom.png b/companion/src/images/simulator/TX16S/bottom.png new file mode 100755 index 0000000000000000000000000000000000000000..8f0d29f7e4c93a2b813c766f31b5ce2b2cda5d22 GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0y~yV0-{%b8)Z%$()+rqdmmtT}V`<;yxP*J(3 zi(^Q|oVRy2@*Xzeadq@spuqfU&;LbjTuV=IIY#`*Yr1c{A@TLz`3wyIR)zC3G?)t| zFlZdIVLcB{>DqNWabOM8?tDnm{r-UW|2^CXQ literal 0 HcmV?d00001 diff --git a/companion/src/images/simulator/TX16S/left.png b/companion/src/images/simulator/TX16S/left.png new file mode 100755 index 0000000000000000000000000000000000000000..ded33bf620b35487e831e385d89cb629313a76a5 GIT binary patch literal 48315 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 literal 0 HcmV?d00001 diff --git a/companion/src/images/simulator/TX16S/left_page2.png b/companion/src/images/simulator/TX16S/left_page2.png new file mode 100755 index 0000000000000000000000000000000000000000..c104c148bd8b16d10ae4c01e7456aa213b765b33 GIT binary patch literal 48292 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 literal 0 HcmV?d00001 diff --git a/companion/src/images/simulator/TX16S/left_rtn.png b/companion/src/images/simulator/TX16S/left_rtn.png new file mode 100755 index 0000000000000000000000000000000000000000..0080f271a83f5fae7adf709b2721c7553d8c4547 GIT binary patch literal 48242 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 literal 0 HcmV?d00001 diff --git a/companion/src/images/simulator/TX16S/left_sys.png b/companion/src/images/simulator/TX16S/left_sys.png new file mode 100755 index 0000000000000000000000000000000000000000..31eeb409fd780032e2ec4765031d2d6315583945 GIT binary patch literal 48264 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 apS*tlHG+{ZEEO#Idm;-{f|f}b`2G*DSpew( literal 0 HcmV?d00001 diff --git a/companion/src/images/simulator/TX16S/right.png b/companion/src/images/simulator/TX16S/right.png new file mode 100755 index 0000000000000000000000000000000000000000..f07ca05bf283c6286030052feeeb4bd5be2dbce5 GIT binary patch literal 40325 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 Y=?msl3*Q<6rtu{$HGS20%2vVu2l;Yq8~^|S literal 0 HcmV?d00001 diff --git a/companion/src/images/simulator/TX16S/top.png b/companion/src/images/simulator/TX16S/top.png new file mode 100755 index 0000000000000000000000000000000000000000..3bc1784ee2860dd9ffa705850dad1f93983f6aa6 GIT binary patch literal 439 zcmV;o0Z9IdP)B#)F`Hw}IF6?V%{>&{k39kQfE~Hmm5|HPEyeXQZQJ&AA|-?e;5vE) zN_X@X^yUh9nx-H{Jps)H0C2?RN3{(nmGbbJ13-LD>;e#8Zhw0MfLyrT1Fn1*0{{TF hH~|9y5WxEO-yc}D#MSsetEnabled(activeChild); writeEepromAct->setEnabled(activeChild); readEepromAct->setEnabled(true); - if (IS_HORUS(getCurrentBoard())) { + if (IS_FAMILY_HORUS_OR_T16(getCurrentBoard())) { writeBUToRadioAct->setEnabled(false); readBUToFileAct->setEnabled(false); } @@ -1086,7 +1086,7 @@ void MainWindow::updateMenus() writeBUToRadioAct->setEnabled(true); readBUToFileAct->setEnabled(true); } - editSplashAct->setDisabled(IS_HORUS(getCurrentBoard())); + editSplashAct->setDisabled(IS_FAMILY_HORUS_OR_T16(getCurrentBoard())); foreach (QAction * act, fileWindowActions) { if (!act) diff --git a/companion/src/mdichild.cpp b/companion/src/mdichild.cpp index c31697a9f..3c8c7c214 100644 --- a/companion/src/mdichild.cpp +++ b/companion/src/mdichild.cpp @@ -534,7 +534,7 @@ void MdiChild::initModelsList() connect(modelsListModel, &QAbstractItemModel::dataChanged, this, &MdiChild::onDataChanged); ui->modelsList->setModel(modelsListModel); - if (IS_HORUS(board)) { + if (IS_FAMILY_HORUS_OR_T16(board)) { ui->modelsList->setIndentation(20); // ui->modelsList->resetIndentation(); // introduced in next Qt versions ... } @@ -1531,7 +1531,7 @@ int MdiChild::askQuestion(const QString & msg, QMessageBox::StandardButtons butt void MdiChild::writeEeprom() // write to Tx { Board::Type board = getCurrentBoard(); - if (IS_HORUS(board)) { + if (IS_FAMILY_HORUS_OR_T16(board)) { QString radioPath = findMassstoragePath("RADIO", true); qDebug() << "Searching for SD card, found" << radioPath; if (radioPath.isEmpty()) { diff --git a/companion/src/modeledit/setup.cpp b/companion/src/modeledit/setup.cpp index 77988a2e7..5e193faec 100644 --- a/companion/src/modeledit/setup.cpp +++ b/companion/src/modeledit/setup.cpp @@ -209,7 +209,7 @@ ModulePanel::ModulePanel(QWidget * parent, ModelData & model, ModuleData & modul ui->trainerMode->setItemData(TRAINER_MODE_SLAVE_BLUETOOTH, 0, Qt::UserRole - 1); } - if (!IS_JUMPER_T16(firmware->getBoard())) { + if (!IS_FAMILY_T16(firmware->getBoard())) { ui->trainerMode->setItemData(TRAINER_MODE_MULTI, 0, Qt::UserRole - 1); } @@ -1001,7 +1001,7 @@ SetupPanel::SetupPanel(QWidget * parent, ModelData & model, GeneralSettings & ge QDir qd(path); if (qd.exists()) { QStringList filters; - if(IS_HORUS(board)) { + if(IS_FAMILY_HORUS_OR_T16(board)) { filters << "*.bmp" << "*.jpg" << "*.png"; foreach ( QString file, qd.entryList(filters, QDir::Files) ) { QFileInfo fi(file); @@ -1032,17 +1032,17 @@ SetupPanel::SetupPanel(QWidget * parent, ModelData & model, GeneralSettings & ge ui->image->setCurrentIndex(ui->image->count()-1); QString fileName = path; fileName.append(model.bitmap); - if (!IS_HORUS(board)) + if (!IS_FAMILY_HORUS_OR_T16(board)) fileName.append(".bmp"); QImage image(fileName); - if (image.isNull() && !IS_HORUS(board)) { + if (image.isNull() && !IS_FAMILY_HORUS_OR_T16(board)) { fileName = path; fileName.append(model.bitmap); fileName.append(".BMP"); image.load(fileName); } if (!image.isNull()) { - if (IS_HORUS(board)) { + if (IS_FAMILY_HORUS_OR_T16(board)) { ui->imagePreview->setFixedSize(QSize(192, 114)); ui->imagePreview->setPixmap(QPixmap::fromImage(image.scaled(192, 114))); } @@ -1281,17 +1281,17 @@ void SetupPanel::on_image_currentIndexChanged(int index) if (qd.exists()) { QString fileName=path; fileName.append(model->bitmap); - if (!IS_HORUS(board)) + if (!IS_FAMILY_HORUS_OR_T16(board)) fileName.append(".bmp"); QImage image(fileName); - if (image.isNull() && !IS_HORUS(board)) { + if (image.isNull() && !IS_FAMILY_HORUS_OR_T16(board)) { fileName=path; fileName.append(model->bitmap); fileName.append(".BMP"); image.load(fileName); } if (!image.isNull()) { - if (IS_HORUS(board)) { + if (IS_FAMILY_HORUS_OR_T16(board)) { ui->imagePreview->setFixedSize(QSize(192, 114)); ui->imagePreview->setPixmap(QPixmap::fromImage(image.scaled(192, 114))); } diff --git a/companion/src/modelslist.cpp b/companion/src/modelslist.cpp index 2fb5cc329..864c10028 100644 --- a/companion/src/modelslist.cpp +++ b/companion/src/modelslist.cpp @@ -145,7 +145,7 @@ TreeModel::TreeModel(RadioData * radioData, QObject * parent): if (!hasCategories) labels << tr("Index"); labels << tr("Name"); - if (!(IS_HORUS(board) || IS_SKY9X(board))) { + if (!(IS_FAMILY_HORUS_OR_T16(board) || IS_SKY9X(board))) { labels << tr("Size"); } labels << tr("RX #"); @@ -651,7 +651,7 @@ void TreeModel::refresh() EEPROMInterface * eepromInterface = getCurrentEEpromInterface(); Board::Type board = eepromInterface->getBoard(); TreeItem * defaultCategoryItem = NULL; - bool hasEepromSizeData = (IS_HORUS(board) ? false : true); + bool hasEepromSizeData = (IS_FAMILY_HORUS_OR_T16(board) ? false : true); if (hasEepromSizeData) { availableEEpromSize = Boards::getEEpromSize(board) - 64; // let's consider fat diff --git a/companion/src/radiointerface.cpp b/companion/src/radiointerface.cpp index 6c2c50052..c3214958a 100644 --- a/companion/src/radiointerface.cpp +++ b/companion/src/radiointerface.cpp @@ -314,7 +314,7 @@ bool readEeprom(const QString & filename, ProgressWidget * progress) return false; } - if (IS_HORUS(board)) { + if (IS_FAMILY_HORUS_OR_T16(board)) { QString radioPath = findMassstoragePath("RADIO", true); qDebug() << "Searching for SD card, found" << radioPath; if (radioPath.isEmpty()) { diff --git a/companion/src/simulation/CMakeLists.txt b/companion/src/simulation/CMakeLists.txt index 7601f8f04..8acadd92a 100644 --- a/companion/src/simulation/CMakeLists.txt +++ b/companion/src/simulation/CMakeLists.txt @@ -14,6 +14,7 @@ set(simulation_SRCS simulateduiwidgetX12.cpp simulateduiwidgetJumperT12.cpp simulateduiwidgetJumperT16.cpp + simulateduiwidgetTX16S.cpp simulatorinterface.cpp simulatormainwindow.cpp simulatorstartupdialog.cpp @@ -38,6 +39,7 @@ set(simulation_UIS simulateduiwidgetX12.ui simulateduiwidgetJumperT12.ui simulateduiwidgetJumperT16.ui + simulateduiwidgetTX16S.ui simulatormainwindow.ui simulatorstartupdialog.ui simulatorwidget.ui diff --git a/companion/src/simulation/simulateduiwidget.h b/companion/src/simulation/simulateduiwidget.h index d688c641a..75dd3ebfd 100644 --- a/companion/src/simulation/simulateduiwidget.h +++ b/companion/src/simulation/simulateduiwidget.h @@ -113,6 +113,7 @@ namespace Ui { class SimulatedUIWidgetX12; class SimulatedUIWidgetJumperT12; class SimulatedUIWidgetJumperT16; + class SimulatedUIWidgetTX16S; } class SimulatedUIWidget9X: public SimulatedUIWidget @@ -251,5 +252,17 @@ class SimulatedUIWidgetJumperT16: public SimulatedUIWidget Ui::SimulatedUIWidgetJumperT16 * ui; }; +class SimulatedUIWidgetTX16S: public SimulatedUIWidget +{ + Q_OBJECT + + public: + explicit SimulatedUIWidgetTX16S(SimulatorInterface * simulator, QWidget * parent = nullptr); + virtual ~SimulatedUIWidgetTX16S(); + + private: + Ui::SimulatedUIWidgetTX16S * ui; +}; + #endif // SIMULATEDUIWIDGET_H diff --git a/companion/src/simulation/simulateduiwidgetTX16S.cpp b/companion/src/simulation/simulateduiwidgetTX16S.cpp new file mode 100644 index 000000000..db1d5fa8b --- /dev/null +++ b/companion/src/simulation/simulateduiwidgetTX16S.cpp @@ -0,0 +1,72 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +// NOTE: RadioUiAction(NUMBER,...): NUMBER relates to enum EnumKeys in the specific board.h + +#include "simulateduiwidget.h" +#include "ui_simulateduiwidgetTX16S.h" + +SimulatedUIWidgetTX16S::SimulatedUIWidgetTX16S(SimulatorInterface *simulator, QWidget * parent): + SimulatedUIWidget(simulator, parent), + ui(new Ui::SimulatedUIWidgetTX16S) +{ + RadioUiAction * act; + + ui->setupUi(this); + + // add actions in order of appearance on the help menu + + act = new RadioUiAction(3, QList() << Qt::Key_Up, SIMU_STR_HLP_KEY_UP, SIMU_STR_HLP_ACT_MDL); + addRadioWidget(ui->rightbuttons->addArea(QRect(10, 0, 80, 35), "TX16S/right_mdl.png", act)); + + m_mouseMidClickAction = new RadioUiAction(2, QList() << Qt::Key_Enter << Qt::Key_Return, SIMU_STR_HLP_KEYS_ACTIVATE, SIMU_STR_HLP_ACT_ROT_DN); + addRadioWidget(ui->rightbuttons->addArea(QRect(45, 70, 100, 160), "TX16S/right_ent.png", m_mouseMidClickAction)); + + act = new RadioUiAction(6, QList() << Qt::Key_Left, SIMU_STR_HLP_KEY_LFT, SIMU_STR_HLP_ACT_SYS); + addRadioWidget(ui->leftbuttons->addArea(QRect(32, 1, 80, 35), "TX16S/left_sys.png", act)); + + act = new RadioUiAction(5, QList() << Qt::Key_Right, SIMU_STR_HLP_KEY_RGT, SIMU_STR_HLP_ACT_TELE); + addRadioWidget(ui->leftbuttons->addArea(QRect(55, 220, 80, 35), "TX16S/left_tele.png", act)); + + act = new RadioUiAction(1, QList() << Qt::Key_PageDown, SIMU_STR_HLP_KEY_PGDN, SIMU_STR_HLP_ACT_PGDN); + addRadioWidget(ui->leftbuttons->addArea(QRect(55, 115, 80, 35), "TX16S/left_page.png", act)); + + act = new RadioUiAction(0, QList() << Qt::Key_PageUp, SIMU_STR_HLP_KEY_PGUP, SIMU_STR_HLP_ACT_PGUP); + addRadioWidget(ui->leftbuttons->addArea(QRect(55, 160, 80, 35), "TX16S/left_page2.png", act)); + + act = new RadioUiAction(4, QList() << Qt::Key_Down << Qt::Key_Delete << Qt::Key_Escape << Qt::Key_Backspace, + SIMU_STR_HLP_KEY_DN % "
" % SIMU_STR_HLP_KEYS_EXIT, SIMU_STR_HLP_ACT_RTN); + addRadioWidget(ui->leftbuttons->addArea(QRect(55, 55, 80, 35), "TX16S/left_rtn.png", act)); + + m_scrollUpAction = new RadioUiAction(-1, QList() << Qt::Key_Minus, SIMU_STR_HLP_KEY_MIN % "|" % SIMU_STR_HLP_MOUSE_UP, SIMU_STR_HLP_ACT_ROT_LFT); + m_scrollDnAction = new RadioUiAction(-1, QList() << Qt::Key_Plus << Qt::Key_Equal, SIMU_STR_HLP_KEY_PLS % "|" % SIMU_STR_HLP_MOUSE_DN, SIMU_STR_HLP_ACT_ROT_RGT); + connectScrollActions(); + + addRadioWidget(ui->leftbuttons->addArea(QRect(10, 252, 30, 30), "TX16S/left_scrnsht.png", m_screenshotAction)); + + m_backlightColors << QColor(47, 123, 227); + + setLcd(ui->lcd); +} + +SimulatedUIWidgetTX16S::~SimulatedUIWidgetTX16S() +{ + delete ui; +} diff --git a/companion/src/simulation/simulateduiwidgetTX16S.ui b/companion/src/simulation/simulateduiwidgetTX16S.ui new file mode 100644 index 000000000..e5137d992 --- /dev/null +++ b/companion/src/simulation/simulateduiwidgetTX16S.ui @@ -0,0 +1,197 @@ + + + SimulatedUIWidgetTX16S + + + + 0 + 0 + 825 + 292 + + + + + 0 + 0 + + + + + 825 + 292 + + + + + 825 + 292 + + + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 174 + 292 + + + + + 174 + 292 + + + + background:url(:/images/simulator/TX16S/right.png) + + + + + + + + 0 + 0 + + + + + 480 + 272 + + + + + 480 + 272 + + + + + 5 + + + + + + + + + 0 + 0 + + + + + 174 + 292 + + + + + 174 + 292 + + + + true + + + background:url(:/images/simulator/TX16S/left.png); + + + + + + + + 0 + 0 + + + + + 480 + 10 + + + + + 480 + 10 + + + + + 5 + + + + background:url(:/images/simulator/TX16S/top.png) + + + + + + + + 0 + 0 + + + + + 480 + 10 + + + + + 480 + 10 + + + + + 5 + false + + + + background:url(:/images/simulator/TX16S/bottom.png) + + + + + + + + LcdWidget + QWidget +

lcdwidget.h
+ 1 + + + ButtonsWidget + QWidget +
buttonswidget.h
+ 1 +
+ + + + diff --git a/companion/src/simulation/simulatorstartupdialog.cpp b/companion/src/simulation/simulatorstartupdialog.cpp index 57272bf99..32d343321 100644 --- a/companion/src/simulation/simulatorstartupdialog.cpp +++ b/companion/src/simulation/simulatorstartupdialog.cpp @@ -86,7 +86,7 @@ void SimulatorStartupDialog::changeEvent(QEvent *e) // FIXME : need a better way to check for this bool SimulatorStartupDialog::usesCategorizedStorage(const QString & name) { - return name.contains(QRegExp("(x12|x10|horus|t16)", Qt::CaseInsensitive)); + return name.contains(QRegExp("(x12|x10|horus|16)", Qt::CaseInsensitive)); } bool SimulatorStartupDialog::usesCategorizedStorage() diff --git a/companion/src/simulation/simulatorwidget.cpp b/companion/src/simulation/simulatorwidget.cpp index 2a472fc00..798c8664b 100644 --- a/companion/src/simulation/simulatorwidget.cpp +++ b/companion/src/simulation/simulatorwidget.cpp @@ -94,6 +94,9 @@ SimulatorWidget::SimulatorWidget(QWidget * parent, SimulatorInterface * simulato case Board::BOARD_JUMPER_T16: radioUiWidget = new SimulatedUIWidgetJumperT16(simulator, this); break; + case Board::BOARD_RADIOMASTER_TX16S: + radioUiWidget = new SimulatedUIWidgetTX16S(simulator, this); + break; default: radioUiWidget = new SimulatedUIWidget9X(simulator, this); break; @@ -270,7 +273,7 @@ bool SimulatorWidget::setRadioData(RadioData * radioData) saveTempRadioData = (flags & SIMULATOR_FLAGS_STANDALONE); - if (IS_HORUS(m_board)) + if (IS_FAMILY_HORUS_OR_T16(m_board)) ret = useTempDataPath(true); if (ret) { diff --git a/companion/src/storage/categorized.cpp b/companion/src/storage/categorized.cpp index 9ca248cc4..d659ae81f 100644 --- a/companion/src/storage/categorized.cpp +++ b/companion/src/storage/categorized.cpp @@ -93,7 +93,7 @@ bool CategorizedStorageFormat::load(RadioData & radioData) return false; } strncpy(radioData.models[modelIndex].filename, qPrintable(fileName), sizeof(radioData.models[modelIndex].filename)); - if (IS_HORUS(board) && !strcmp(radioData.generalSettings.currModelFilename, qPrintable(fileName))) { + if (IS_FAMILY_HORUS_OR_T16(board) && !strcmp(radioData.generalSettings.currModelFilename, qPrintable(fileName))) { radioData.generalSettings.currModelIndex = modelIndex; qDebug() << "currModelIndex =" << modelIndex; } diff --git a/companion/src/storage/rlefile.cpp b/companion/src/storage/rlefile.cpp index b4d9da611..fe297339f 100644 --- a/companion/src/storage/rlefile.cpp +++ b/companion/src/storage/rlefile.cpp @@ -239,7 +239,7 @@ void RleFile::EeFsSetDat(unsigned int blk, unsigned int ofs, const uint8_t *buf, unsigned int RleFile::EeFsGetFree() { - if (IS_HORUS(board)) + if (IS_FAMILY_HORUS_OR_T16(board)) return 0; unsigned int ret = 0; @@ -261,7 +261,7 @@ unsigned int RleFile::EeFsGetFree() */ void RleFile::EeFsFree(unsigned int blk) { - if (IS_HORUS(board)) + if (IS_FAMILY_HORUS_OR_T16(board)) return; unsigned int i = blk; @@ -281,7 +281,7 @@ void RleFile::EeFsFree(unsigned int blk) */ unsigned int RleFile::EeFsAlloc() { - if (IS_HORUS(board)) + if (IS_FAMILY_HORUS_OR_T16(board)) return 0; unsigned int ret = (IS_ARM(board) ? eeFsArm->freeList : eeFs->freeList); if (ret) { @@ -296,7 +296,7 @@ unsigned int RleFile::EeFsAlloc() unsigned int RleFile::size(unsigned int id) { - if (IS_HORUS(board)) + if (IS_FAMILY_HORUS_OR_T16(board)) return 0; else return IS_ARM(board) ? eeFsArm->files[id].size : eeFs->files[id].size; @@ -304,7 +304,7 @@ unsigned int RleFile::size(unsigned int id) unsigned int RleFile::openRd(unsigned int i_fileId) { - if (IS_HORUS(board)) { + if (IS_FAMILY_HORUS_OR_T16(board)) { return 1; } else if (IS_SKY9X(board)) { @@ -341,7 +341,7 @@ unsigned int RleFile::openRd(unsigned int i_fileId) unsigned int RleFile::read(uint8_t *buf, unsigned int i_len) { - if (IS_HORUS(board)) + if (IS_FAMILY_HORUS_OR_T16(board)) return 0; unsigned int len = IS_ARM(board) ? eeFsArm->files[m_fileId].size : eeFs->files[m_fileId].size; @@ -364,7 +364,7 @@ unsigned int RleFile::read(uint8_t *buf, unsigned int i_len) // G: Read runlength (RLE) compressed bytes into buf. unsigned int RleFile::readRlc12(uint8_t *buf, unsigned int i_len, bool rlc2) { - if (IS_HORUS(board)) + if (IS_FAMILY_HORUS_OR_T16(board)) return 0; memset(buf, 0, i_len); @@ -550,7 +550,7 @@ void RleFile::closeTrunc() unsigned int RleFile::writeRlc1(unsigned int i_fileId, unsigned int typ, const uint8_t *buf, unsigned int i_len) { - if (IS_HORUS(board)) + if (IS_FAMILY_HORUS_OR_T16(board)) return 0; create(i_fileId, typ); @@ -599,7 +599,7 @@ unsigned int RleFile::writeRlc1(unsigned int i_fileId, unsigned int typ, const u */ unsigned int RleFile::writeRlc2(unsigned int i_fileId, unsigned int typ, const uint8_t *buf, unsigned int i_len) { - if (IS_HORUS(board)) + if (IS_FAMILY_HORUS_OR_T16(board)) return 0; if (IS_SKY9X(board)) { diff --git a/radio/sdcard/horus/THEMES/Darkblue/tx16s.bmp b/radio/sdcard/horus/THEMES/Darkblue/tx16s.bmp new file mode 100755 index 0000000000000000000000000000000000000000..826fc35f000e449e374a24b2da04667d9f050c34 GIT binary patch literal 164938 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
t$PFt_L7PF{J~-m$q~Ys)?TjXt!XkKCXw{hobL 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 literal 0 HcmV?d00001 diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index c8e5b3ca0..836e60e88 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -191,6 +191,8 @@ enum TrainerMode { #if defined(PCBTARANIS) TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, +#endif +#if defined(PCBTARANIS) || defined(AUX_SERIAL) TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, #endif TRAINER_MODE_MASTER_BLUETOOTH, @@ -205,7 +207,7 @@ enum TrainerMode { }; #endif -#if defined(RADIO_T16) || defined(ALLOW_TRAINER_MULTI) +#if defined(RADIO_FAMILY_T16) || 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/480x272/bitmaps.cpp b/radio/src/gui/480x272/bitmaps.cpp index f7b87a4d3..08cc8f59a 100644 --- a/radio/src/gui/480x272/bitmaps.cpp +++ b/radio/src/gui/480x272/bitmaps.cpp @@ -64,6 +64,10 @@ const uint8_t LBM_TOPMENU_TXBATT[] = { #include "mask_txbat.lbm" }; +const uint8_t LBM_TOPMENU_TXBATT_CHARGING[] = { +#include "mask_txbat_charging.lbm" +}; + const uint8_t LBM_TOPMENU_ANTENNA[] = { #include "mask_antenna.lbm" }; diff --git a/radio/src/gui/480x272/bitmaps.h b/radio/src/gui/480x272/bitmaps.h index fcefcbd49..b51c04551 100644 --- a/radio/src/gui/480x272/bitmaps.h +++ b/radio/src/gui/480x272/bitmaps.h @@ -34,6 +34,7 @@ extern const uint8_t LBM_TOPMENU_VOLUME_3[]; extern const uint8_t LBM_TOPMENU_VOLUME_4[]; extern const uint8_t LBM_TOPMENU_VOLUME_SCALE[]; extern const uint8_t LBM_TOPMENU_TXBATT[]; +extern const uint8_t LBM_TOPMENU_TXBATT_CHARGING[]; extern const uint8_t LBM_HTRIM_FRAME[]; extern const uint8_t LBM_VTRIM_FRAME[]; extern const uint8_t LBM_TRIM_SHADOW[]; diff --git a/radio/src/gui/480x272/radio_hardware.cpp b/radio/src/gui/480x272/radio_hardware.cpp index bf6c333f6..96f29cfbb 100644 --- a/radio/src/gui/480x272/radio_hardware.cpp +++ b/radio/src/gui/480x272/radio_hardware.cpp @@ -347,6 +347,9 @@ bool menuRadioHardware(event_t event) #if defined(AUX_SERIAL) case ITEM_RADIO_HARDWARE_AUX_SERIAL_MODE: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_AUX_SERIAL_MODE); +#if defined(RADIO_TX16S) + lcdDrawText(lcdNextPos, y, " (TTL)"); +#endif g_eeGeneral.auxSerialMode = editChoice(HW_SETTINGS_COLUMN+50, y, STR_AUX_SERIAL_MODES, g_eeGeneral.auxSerialMode, 0, UART_MODE_MAX, attr, event); if (attr && checkIncDec_Ret) { auxSerialInit(g_eeGeneral.auxSerialMode, modelTelemetryProtocol()); diff --git a/radio/src/gui/480x272/themes/darkblue.cpp b/radio/src/gui/480x272/themes/darkblue.cpp index 3d5e056fb..0b8e21306 100644 --- a/radio/src/gui/480x272/themes/darkblue.cpp +++ b/radio/src/gui/480x272/themes/darkblue.cpp @@ -139,6 +139,8 @@ class DarkblueTheme: public Theme delete calibHorus; #if defined(RADIO_T16) calibHorus = BitmapBuffer::load(getThemePath("t16.bmp")); +#elif defined(RADIO_TX16S) + calibHorus = BitmapBuffer::load(getThemePath("tx16s.bmp")); #elif defined(PCBX10) if(STICKS_PWM_ENABLED()) { calibHorus = BitmapBuffer::load(getThemePath("X10S.bmp")); diff --git a/radio/src/gui/480x272/themes/default.cpp b/radio/src/gui/480x272/themes/default.cpp index 2ce0999af..5ecd5bfbd 100644 --- a/radio/src/gui/480x272/themes/default.cpp +++ b/radio/src/gui/480x272/themes/default.cpp @@ -176,6 +176,8 @@ class DefaultTheme: public Theme delete calibHorus; #if defined(RADIO_T16) calibHorus = BitmapBuffer::load(getThemePath("t16.bmp")); +#elif defined(RADIO_TX16S) + calibHorus = BitmapBuffer::load(getThemePath("tx16s.bmp")); #elif defined(PCBX10) if(STICKS_PWM_ENABLED()) { calibHorus = BitmapBuffer::load(getThemePath("X10S.bmp")); diff --git a/radio/src/gui/480x272/topbar.cpp b/radio/src/gui/480x272/topbar.cpp index 45707f542..487e70a9b 100644 --- a/radio/src/gui/480x272/topbar.cpp +++ b/radio/src/gui/480x272/topbar.cpp @@ -90,7 +90,12 @@ void drawTopBar() /* Tx battery */ uint8_t bars = GET_TXBATT_BARS(5); - lcdDrawBitmapPattern(LCD_W-130, 24, LBM_TOPMENU_TXBATT, MENU_TITLE_COLOR); +#if defined(USB_CHARGER) + if(usbChargerLed()) + lcdDrawBitmapPattern(LCD_W-130, 24, LBM_TOPMENU_TXBATT_CHARGING, MENU_TITLE_COLOR); + else +#endif + lcdDrawBitmapPattern(LCD_W-130, 24, LBM_TOPMENU_TXBATT, MENU_TITLE_COLOR); for (unsigned int i = 0; i < 5; i++) { lcdDrawSolidFilledRect(LCD_W-122+4*i, 30, 2, 8, i >= bars ? MENU_TITLE_DISABLE_COLOR : MENU_TITLE_COLOR); } diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 0bdf7ba47..28b072f95 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -28,7 +28,7 @@ #if defined(PCBX12S) #include "lua/lua_exports_x12s.inc" // this line must be after lua headers -#elif defined(RADIO_T16) +#elif defined(RADIO_FAMILY_T16) #include "lua/lua_exports_t16.inc" #elif defined(PCBX10) #include "lua/lua_exports_x10.inc" diff --git a/radio/src/opentx.h b/radio/src/opentx.h index d89609d1f..0ef8b04c9 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -546,7 +546,7 @@ bool setTrimValue(uint8_t phase, uint8_t idx, int trim); #if defined(PCBSKY9X) #define ROTARY_ENCODER_GRANULARITY (2 << g_eeGeneral.rotarySteps) -#elif defined(RADIO_T16) +#elif defined(RADIO_FAMILY_T16) #define ROTARY_ENCODER_GRANULARITY (1) #else #define ROTARY_ENCODER_GRANULARITY (2) diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h index 98dff0e03..645e527d3 100644 --- a/radio/src/sdcard.h +++ b/radio/src/sdcard.h @@ -128,6 +128,8 @@ const char * getBasename(const char * path); #define OTX_FOURCC 0x3478746F // otx for X12S #elif defined(RADIO_T16) #define OTX_FOURCC 0x3F78746F // otx for Jumper T16 +#elif defined(RADIO_TX16S) + #define OTX_FOURCC 0x3878746F // otx for Radiomaster TX16S #elif defined(PCBX10) #define OTX_FOURCC 0x3778746F // otx for X10 #elif defined(PCBX9E) diff --git a/radio/src/targets/common/arm/stm32/adc_driver.cpp b/radio/src/targets/common/arm/stm32/adc_driver.cpp index 2a690972b..b4c72e46c 100644 --- a/radio/src/targets/common/arm/stm32/adc_driver.cpp +++ b/radio/src/targets/common/arm/stm32/adc_driver.cpp @@ -24,6 +24,8 @@ // not needed #elif defined(RADIO_T16) const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1,1, -1,1, -1,1}; +#elif defined(RADIO_TX16S) + const int8_t adcDirection[NUM_ANALOGS] = {-1,1,-1,1, 1,1,1, -1,1, -1,1}; #elif defined(PCBX10) const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, -1,1,-1, 1,1, 1, -1}; #elif defined(PCBX9E) diff --git a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp index 9499e24f9..38d7006d7 100644 --- a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp @@ -19,6 +19,7 @@ */ #include "opentx.h" +#include "targets/horus/board.h" #if defined(AUX_SERIAL) uint8_t auxSerialMode = 0; @@ -40,6 +41,13 @@ void auxSerialSetup(unsigned int baudrate, bool dma) GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(AUX_SERIAL_GPIO, &GPIO_InitStructure); +#if defined(AUX_SERIAL_PWR_GPIO) + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_InitStructure.GPIO_Pin = AUX_SERIAL_PWR_GPIO_PIN; + GPIO_Init(AUX_SERIAL_PWR_GPIO, &GPIO_InitStructure); +#endif + USART_InitStructure.USART_BaudRate = baudrate; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; @@ -133,6 +141,7 @@ void auxSerialSbusInit() { auxSerialSetup(SBUS_BAUDRATE, true); AUX_SERIAL_USART->CR1 |= USART_CR1_M | USART_CR1_PCE ; + AUX_SERIAL_POWER_ON(); } void auxSerialStop() diff --git a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt index 86f4594f9..b94180761 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt +++ b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt @@ -116,11 +116,20 @@ if(PCB STREQUAL X10 OR PCB STREQUAL X12S) ../../../../../syscalls.c ) +if(USB_CHARGER) + set(BOOTLOADER_SRC + ${BOOTLOADER_SRC} + ../../../../../targets/${TARGET_DIR}/usb_charger_driver.cpp + ../../../../../targets/${TARGET_DIR}/led_driver.cpp + ) + endif() + if(DEBUG) set(BOOTLOADER_SRC ${BOOTLOADER_SRC} ../../../../../${STM32LIB_DIR}/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_usart.c ../../../../../serial.cpp + ../../../../../targets/common/arm/stm32/aux_serial_driver.cpp ) endif() else() diff --git a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp index 106734a2f..b0079b49e 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp +++ b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp @@ -205,11 +205,26 @@ int main() AUX_SERIAL_RCC_APB1Periph | SD_RCC_APB1Periph, ENABLE); - RCC_APB2PeriphClockCmd(LCD_RCC_APB2Periph | BACKLIGHT_RCC_APB2Periph | RCC_APB2Periph_SYSCFG, ENABLE); + RCC_APB2PeriphClockCmd(LCD_RCC_APB2Periph | BACKLIGHT_RCC_APB2Periph | RCC_APB2Periph_SYSCFG | AUX_SERIAL_RCC_APB2Periph, ENABLE); pwrInit(); keysInit(); + // USB charger handling +#if defined(USB_CHARGER) + if (!WAS_RESET_BY_WATCHDOG_OR_SOFTWARE() && !pwrPressed()) { + ledInit(); + usbChargerInit(); + ledOff(); + while (!pwrPressed()) { + if(usbChargerLed()) + GPIO_SetBits(LED_GPIO, LED_GREEN_GPIO_PIN); + else + ledOff(); + } + } +#endif + // wait a bit for the inputs to stabilize... if (!WAS_RESET_BY_WATCHDOG_OR_SOFTWARE()) { for (uint32_t i = 0; i < 150000; i++) { 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 f43090f04..436cb0bd7 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_T16) +#if defined(RADIO_FAMILY_T16) static uint8_t state = 0; uint8_t pins = ROTARY_ENCODER_POSITION(); diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index a1ac28f08..601d82dfb 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -51,8 +51,20 @@ if (PCB STREQUAL X10) set(FLAVOUR t16) set(LUA_EXPORT lua_export_t16) add_definitions(-DRADIO_T16) + add_definitions(-DRADIO_FAMILY_T16) option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" OFF) option(BLUETOOTH "Support for bluetooth module" OFF) + elseif (PCBREV STREQUAL TX16S) + set(FLAVOUR tx16s) + set(LUA_EXPORT lua_export_t16) + add_definitions(-DRADIO_TX16S) + add_definitions(-DRADIO_FAMILY_T16) + option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" ON) + option(BLUETOOTH "Support for bluetooth module" OFF) + if (NOT BLUETOOTH) + set(AUX_SERIAL ON) + endif() + set(USB_CHARGER YES) else() set(FLAVOUR x10) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON) @@ -195,15 +207,26 @@ set(TARGET_SRC ../common/arm/stm32/rotary_encoder_driver.cpp ) +if(USB_CHARGER) + set(TARGET_SRC ${TARGET_SRC} usb_charger_driver.cpp) + add_definitions(-DUSB_CHARGER) +endif() + if(BLUETOOTH) add_definitions(-DBLUETOOTH) set(TARGET_SRC ${TARGET_SRC} ../common/arm/stm32/bluetooth_driver.cpp) set(SRC ${SRC} bluetooth.cpp) endif() +if (AUX_SERIAL) + add_definitions(-DAUX_SERIAL) + set(AUX_SERIAL_DRIVER ../common/arm/stm32/aux_serial_driver.cpp) +endif() + set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} ${LCD_DRIVER} + ${AUX_SERIAL_DRIVER} board.cpp backlight_driver.cpp ../common/arm/stm32/pwr_driver.cpp diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp index ac6e4e1f8..7476db295 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -41,6 +41,18 @@ void watchdogInit(unsigned int duration) IWDG->KR = 0xCCCC; // start } +#if defined(AUX_SERIAL_PWR_GPIO) +void auxSerialPowerOn() +{ + GPIO_SetBits(AUX_SERIAL_PWR_GPIO, AUX_SERIAL_PWR_GPIO_PIN); +} + +void auxSerialPowerOff() +{ + GPIO_ResetBits(AUX_SERIAL_PWR_GPIO, AUX_SERIAL_PWR_GPIO_PIN); +} +#endif + #if defined(PCBX10) && !defined(RADIO_T16) void sportUpdateInit() { @@ -110,6 +122,7 @@ void boardInit() EXTMODULE_RCC_APB2Periph | TELEMETRY_RCC_APB2Periph | BT_RCC_APB2Periph | + AUX_SERIAL_RCC_APB2Periph | BACKLIGHT_RCC_APB2Periph, ENABLE); @@ -119,6 +132,10 @@ void boardInit() __enable_irq(); +#if defined(DEBUG) && defined(AUX_SERIAL) + auxSerialInit(UART_MODE_DEBUG, 0); // default serial mode (None if DEBUG not defined) +#endif + TRACE("\nHorus board started :)"); TRACE("RCC->CSR = %08x", RCC->CSR); diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index c0289331d..8d088c6d1 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -59,7 +59,7 @@ extern uint16_t sessionTimer; #define SLAVE_MODE() (g_model.trainerData.mode == TRAINER_MODE_SLAVE) -#if defined(PCBX10) && !defined(RADIO_T16) +#if defined(PCBX10) && !defined(RADIO_FAMILY_T16) #define TRAINER_CONNECTED() (GPIO_ReadInputDataBit(TRAINER_DETECT_GPIO, TRAINER_DETECT_GPIO_PIN) == Bit_SET) #else #define TRAINER_CONNECTED() (GPIO_ReadInputDataBit(TRAINER_DETECT_GPIO, TRAINER_DETECT_GPIO_PIN) == Bit_RESET) @@ -490,6 +490,10 @@ void pwrResetHandler(); bool pwrPressed(); uint32_t pwrPressedDuration(); +// USB Charger +void usbChargerInit(); +bool usbChargerLed(); + // Led driver void ledInit(); void ledOff(); @@ -527,7 +531,7 @@ void backlightEnable(uint8_t dutyCycle = 0); #define BACKLIGHT_LEVEL_MAX 100 #if defined(PCBX12S) #define BACKLIGHT_LEVEL_MIN 5 -#elif defined(RADIO_T16) +#elif defined(RADIO_FAMILY_T16) #define BACKLIGHT_LEVEL_MIN 1 #else #define BACKLIGHT_LEVEL_MIN 46 @@ -547,6 +551,10 @@ void usbJoystickUpdate(); #define USB_NAME "Jumper T16" #define USB_MANUFACTURER 'J', 'u', 'm', 'p', 'e', 'r', ' ', ' ' /* 8 bytes */ #define USB_PRODUCT 'T', '1', '6', ' ', ' ', ' ', ' ', ' ' /* 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 */ #elif defined(PCBX10) #define USB_NAME "FrSky X10" #define USB_MANUFACTURER 'F', 'r', 'S', 'k', 'y', ' ', ' ', ' ' /* 8 bytes */ @@ -598,6 +606,26 @@ void sportUpdatePowerOff(); #define SPORT_UPDATE_POWER_OFF() #endif +// Second serial port driver +#if defined(AUX_SERIAL_GPIO) +#define DEBUG_BAUDRATE 115200 +extern uint8_t auxSerialMode; +void auxSerialInit(unsigned int mode, unsigned int protocol); +void auxSerialPutc(char c); +#define auxSerialTelemetryInit(protocol) auxSerialInit(UART_MODE_TELEMETRY, protocol) +void auxSerialSbusInit(); +void auxSerialStop(); +void auxSerialPowerOn(); +void auxSerialPowerOff(); +#if defined(AUX_SERIAL_PWR_GPIO) +#define AUX_SERIAL_POWER_ON() auxSerialPowerOn() +#define AUX_SERIAL__POWER_OFF() auxSerialPowerOff() +#else +#define AUX_SERIAL_POWER_ON() +#define AUX_SERIAL__POWER_OFF() +#endif +#endif + // Haptic driver void hapticInit(); void hapticDone(); diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 1e5eb137e..7fea582c3 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -38,6 +38,21 @@ #define KEYS_GPIO_PIN_DOWN GPIO_Pin_6 // PI.06 #define KEYS_GPIO_REG_RIGHT GPIOC->IDR #define KEYS_GPIO_PIN_RIGHT GPIO_Pin_4 // PC.04 +#elif defined(RADIO_TX16S) + #define KEYS_GPIO_REG_ENTER GPIOI->IDR + #define KEYS_GPIO_PIN_ENTER GPIO_Pin_8 // PI.08 + #define KEYS_GPIO_REG_PGUP GPIOH->IDR + #define KEYS_GPIO_PIN_PGUP GPIO_Pin_2 // PH.02 + #define KEYS_GPIO_REG_PGDN GPIOI->IDR + #define KEYS_GPIO_PIN_PGDN GPIO_Pin_11 // PI.11 + #define KEYS_GPIO_REG_UP GPIOI->IDR + #define KEYS_GPIO_PIN_UP GPIO_Pin_6 // PI.06 + #define KEYS_GPIO_REG_DOWN GPIOI->IDR + #define KEYS_GPIO_PIN_DOWN GPIO_Pin_4 // PI.04 + #define KEYS_GPIO_REG_LEFT GPIOI->IDR + #define KEYS_GPIO_PIN_LEFT GPIO_Pin_7 // PI.07 + #define KEYS_GPIO_REG_RIGHT GPIOI->IDR + #define KEYS_GPIO_PIN_RIGHT GPIO_Pin_5 // PI.05 #elif defined(PCBX10) #define KEYS_GPIO_REG_ENTER GPIOI->IDR #define KEYS_GPIO_PIN_ENTER GPIO_Pin_8 // PI.08 @@ -183,7 +198,7 @@ #define TRIMS_GPIO_PIN_RVU GPIO_Pin_12 // PJ.12 #define TRIMS_GPIO_REG_RHR GPIOD->IDR #define TRIMS_GPIO_PIN_RHR GPIO_Pin_7 // PD.07 - #if defined(RADIO_T16) + #if defined(RADIO_FAMILY_T16) #define TRIMS_GPIO_REG_LSU GPIOD->IDR #define TRIMS_GPIO_PIN_LSU GPIO_Pin_13 // PD.13 #define TRIMS_GPIO_REG_LSD GPIOJ->IDR @@ -215,7 +230,11 @@ #define KEYS_GPIOD_PINS (GPIO_Pin_11 | GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_13) #define KEYS_GPIOE_PINS (GPIO_Pin_3) #define KEYS_GPIOG_PINS (SWITCHES_GPIO_PIN_D_L | SWITCHES_GPIO_PIN_G_H | SWITCHES_GPIO_PIN_G_L | SWITCHES_GPIO_PIN_H | TRIMS_GPIO_PIN_LVD) +#if defined(RADIO_TX16S) + #define KEYS_GPIOH_PINS (GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15) +#else #define KEYS_GPIOH_PINS (GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15) +#endif #define KEYS_GPIOI_PINS (GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_11 | GPIO_Pin_15) #define KEYS_GPIOJ_PINS (SWITCHES_GPIO_PIN_D_H | TRIMS_GPIO_PIN_LVU | TRIMS_GPIO_PIN_RVD | TRIMS_GPIO_PIN_RVU | GPIO_Pin_8) #endif @@ -288,7 +307,7 @@ #define ADC_DMA_Stream DMA2_Stream0 #define ADC_SET_DMA_FLAGS() ADC_DMA->LIFCR = (DMA_LIFCR_CTCIF0 | DMA_LIFCR_CHTIF0 | DMA_LIFCR_CTEIF0 | DMA_LIFCR_CDMEIF0 | DMA_LIFCR_CFEIF0) #define ADC_TRANSFER_COMPLETE() (ADC_DMA->LISR & DMA_LISR_TCIF0) - #if defined(RADIO_T16) + #if defined(RADIO_FAMILY_T16) #define ADC_VREF_PREC2 300 #else #define ADC_VREF_PREC2 250 @@ -302,13 +321,28 @@ #define PWR_SWITCH_GPIO GPIOJ #define PWR_SWITCH_GPIO_PIN GPIO_Pin_0 // PJ.00 +// USB Charger +#if defined(USB_CHARGER) +#define USB_CHARGER_RCC_AHB1Periph RCC_AHB1Periph_GPIOG +#define USB_CHARGER_GPIO GPIOG +#define USB_CHARGER_GPIO_PIN GPIO_Pin_11 // PG.11 +#else +#define USB_CHARGER_RCC_AHB1Periph 0 +#endif + // S.Port update connector -#if defined(RADIO_T16) +#if defined(RADIO_FAMILY_T16) #define SPORT_MAX_BAUDRATE 400000 #else #define SPORT_MAX_BAUDRATE 250000 // < 400000 #endif -#if defined(PCBX10) && !defined(RADIO_T16) + +#if defined(RADIO_TX16S) + #define SPORT_UPDATE_RCC_AHB1Periph RCC_AHB1Periph_GPIOA + #define SPORT_UPDATE_PWR_GPIO GPIOA + #define SPORT_UPDATE_PWR_GPIO_PIN GPIO_Pin_15 // PA.15 + #define HAS_SPORT_UPDATE_CONNECTOR() true +#elif defined(PCBX10) && !defined(RADIO_T16) #define SPORT_UPDATE_RCC_AHB1Periph RCC_AHB1Periph_GPIOH #define SPORT_UPDATE_PWR_GPIO GPIOH #define SPORT_UPDATE_PWR_GPIO_PIN GPIO_Pin_13 // PH.13 @@ -350,6 +384,7 @@ #if defined(PCBX12S) #define AUX_SERIAL_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1) #define AUX_SERIAL_RCC_APB1Periph RCC_APB1Periph_USART3 + #define AUX_SERIAL_RCC_APB2Periph 0 #define AUX_SERIAL_GPIO GPIOB #define AUX_SERIAL_GPIO_PIN_TX GPIO_Pin_10 // PB.10 #define AUX_SERIAL_GPIO_PIN_RX GPIO_Pin_11 // PB.11 @@ -361,9 +396,28 @@ #define AUX_SERIAL_USART_IRQn USART3_IRQn #define AUX_SERIAL_DMA_Stream_RX DMA1_Stream1 #define AUX_SERIAL_DMA_Channel_RX DMA_Channel_4 +#elif defined(RADIO_TX16S) && !defined(BLUETOOTH) + #define AUX_SERIAL_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_DMA2) + #define AUX_SERIAL_RCC_APB1Periph 0 + #define AUX_SERIAL_RCC_APB2Periph RCC_APB2Periph_USART6 + #define AUX_SERIAL_USART USART6 + #define AUX_SERIAL_GPIO_AF GPIO_AF_USART6 + #define AUX_SERIAL_USART_IRQn USART6_IRQn + #define AUX_SERIAL_GPIO GPIOG + #define AUX_SERIAL_GPIO_PIN_TX GPIO_Pin_14 // PG.14 + #define AUX_SERIAL_GPIO_PIN_RX GPIO_Pin_9 // PG.09 + #define AUX_SERIAL_GPIO_PinSource_TX GPIO_PinSource14 + #define AUX_SERIAL_GPIO_PinSource_RX GPIO_PinSource9 + #define AUX_SERIAL_USART_IRQHandler USART6_IRQHandler + #define AUX_SERIAL_DMA_Stream_RX DMA2_Stream6 + #define AUX_SERIAL_DMA_Channel_RX DMA_Channel_5 + #define AUX_SERIAL_PWR_GPIO GPIOB + #define AUX_SERIAL_PWR_GPIO_PIN GPIO_Pin_0 // PB.00 + #define TRAINER_BATTERY_COMPARTMENT #else #define AUX_SERIAL_RCC_AHB1Periph 0 #define AUX_SERIAL_RCC_APB1Periph 0 + #define AUX_SERIAL_RCC_APB2Periph 0 #endif // Telemetry @@ -550,12 +604,16 @@ #define AUDIO_DMA DMA1 #endif -#if defined(RADIO_T16) +#if defined(RADIO_FAMILY_T16) #define AUDIO_UNMUTE_DELAY 120 // ms #define AUDIO_MUTE_DELAY 500 // ms #endif // I2C Bus +#if defined(RADIO_TX16S) +#define I2C_RCC_AHB1Periph 0 +#define I2C_RCC_APB1Periph 0 +#else #define I2C_RCC_AHB1Periph RCC_AHB1Periph_GPIOB #define I2C_RCC_APB1Periph RCC_APB1Periph_I2C1 #define I2C I2C1 @@ -566,6 +624,7 @@ #define I2C_SCL_GPIO_PinSource GPIO_PinSource8 #define I2C_SDA_GPIO_PinSource GPIO_PinSource9 #define I2C_SPEED 400000 +#endif // Haptic #define HAPTIC_PWM @@ -593,7 +652,7 @@ #define HAPTIC_TIMER_COMPARE_VALUE HAPTIC_GPIO_TIMER->CCR2 #endif -#if !defined(RADIO_T16) +#if !defined(RADIO_FAMILY_T16) #define EXTERNAL_ANTENNA #endif #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2) @@ -760,6 +819,7 @@ // Bluetooth #define STORAGE_BLUETOOTH +#if defined(BLUETOOTH) #define BT_RCC_APB2Periph RCC_APB2Periph_USART6 #define BT_USART USART6 #define BT_GPIO_AF GPIO_AF_USART6 @@ -770,6 +830,9 @@ #define BT_TX_GPIO_PinSource GPIO_PinSource14 #define BT_RX_GPIO_PinSource GPIO_PinSource9 #define BT_USART_IRQHandler USART6_IRQHandler +#else +#define BT_RCC_APB2Periph 0 +#endif #if defined(PCBX12S) #if PCBREV >= 13 #define BT_RCC_AHB1Periph (RCC_AHB1Periph_GPIOI | RCC_AHB1Periph_GPIOG) diff --git a/radio/src/targets/horus/keys_driver.cpp b/radio/src/targets/horus/keys_driver.cpp index 9879135dd..888c4dabc 100644 --- a/radio/src/targets/horus/keys_driver.cpp +++ b/radio/src/targets/horus/keys_driver.cpp @@ -24,7 +24,7 @@ uint32_t readKeys() { uint32_t result = 0; -#if defined(PCBX12S) +#if defined(KEYS_GPIO_REG_PGUP) if (~KEYS_GPIO_REG_PGUP & KEYS_GPIO_PIN_PGUP) result |= 1 << KEY_PGUP; #endif diff --git a/radio/src/targets/horus/usb_charger_driver.cpp b/radio/src/targets/horus/usb_charger_driver.cpp new file mode 100644 index 000000000..3ba915318 --- /dev/null +++ b/radio/src/targets/horus/usb_charger_driver.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "opentx.h" + +void usbChargerInit() +{ + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitStructure.GPIO_Pin = USB_CHARGER_RCC_AHB1Periph; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(USB_CHARGER_GPIO, &GPIO_InitStructure); +} + +bool usbChargerLed() +{ + return GPIO_ReadInputDataBit(USB_CHARGER_GPIO, USB_CHARGER_GPIO_PIN) == Bit_RESET; +} + diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 4f7e2cd87..e978d8277 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -786,6 +786,8 @@ void auxSerialPutc(char c); #define auxSerialTelemetryInit(protocol) auxSerialInit(UART_MODE_TELEMETRY, protocol) void auxSerialSbusInit(); void auxSerialStop(); +#define AUX_SERIAL_POWER_ON() +#define AUX_SERIAL__POWER_OFF() #endif // BT driver diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 31cf6a4a9..5d2c67bf9 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -1309,10 +1309,12 @@ #if defined(PCBX7) || defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_X9DP2019) #define AUX_SERIAL_RCC_AHB1Periph 0 #define AUX_SERIAL_RCC_APB1Periph 0 + #define AUX_SERIAL_RCC_APB2Periph 0 #else #define TRAINER_BATTERY_COMPARTMENT #define AUX_SERIAL_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1) #define AUX_SERIAL_RCC_APB1Periph RCC_APB1Periph_USART3 + #define AUX_SERIAL_RCC_APB2Periph 0 #define AUX_SERIAL_GPIO GPIOB #define AUX_SERIAL_GPIO_PIN_TX GPIO_Pin_10 // PB.10 #define AUX_SERIAL_GPIO_PIN_RX GPIO_Pin_11 // PB.11 diff --git a/radio/src/telemetry/multi.cpp b/radio/src/telemetry/multi.cpp index e6b41faae..adc3120cd 100644 --- a/radio/src/telemetry/multi.cpp +++ b/radio/src/telemetry/multi.cpp @@ -316,6 +316,13 @@ static void processMultiTelemetryPaket(const uint8_t * packet, uint8_t module) uint8_t len = packet[1]; const uint8_t * data = packet + 2; +#if defined(AUX_SERIAL) + if (g_eeGeneral.auxSerialMode == UART_MODE_TELEMETRY_MIRROR) { + for (uint8_t c=0; c < len; c++) + auxSerialPutc(packet[c]); + } +#endif + // Switch type switch (type) { case MultiStatus: diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h index ed569729a..15361a065 100644 --- a/radio/src/translations/untranslated.h +++ b/radio/src/translations/untranslated.h @@ -68,7 +68,9 @@ #define TR_VSWITCHES "---" "ID0""ID1""ID2" "THR""RUD""ELE""AIL""GEA""TRN" TR_TRIMS_SWITCHES TR_ROTENC_SWITCHES TR_ON_ONE_SWITCHES #endif -#if defined(PCBHORUS) +#if defined(PCBHORUS) && defined(AUX_SERIAL) + #define TR_VTRAINERMODES TR_VTRAINER_MASTER_JACK TR_VTRAINER_SLAVE_JACK TR_VTRAINER_MASTER_BATTERY TR_VTRAINER_BLUETOOTH TR_VTRAINER_MULTI +#elif defined(PCBHORUS) #define TR_VTRAINERMODES TR_VTRAINER_MASTER_JACK TR_VTRAINER_SLAVE_JACK TR_VTRAINER_BLUETOOTH TR_VTRAINER_MULTI #elif defined(PCBTARANIS) #define TR_VTRAINERMODES TR_VTRAINER_MASTER_JACK TR_VTRAINER_SLAVE_JACK TR_VTRAINER_MASTER_SBUS_MODULE TR_VTRAINER_MASTER_CPPM_MODULE TR_VTRAINER_MASTER_BATTERY TR_VTRAINER_BLUETOOTH TR_VTRAINER_MULTI From 128265327e6e73c7ac5a64ee781ab656dde3372c Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 31 Jan 2020 09:21:34 +0100 Subject: [PATCH 108/560] Some TX16S related changes --- radio/util/build-firmware.py | 5 +++++ tools/build-companion-nightly.sh | 4 ++++ tools/build-companion-release.sh | 4 ++++ 3 files changed, 13 insertions(+) diff --git a/radio/util/build-firmware.py b/radio/util/build-firmware.py index 9658e605d..373e4a41d 100755 --- a/radio/util/build-firmware.py +++ b/radio/util/build-firmware.py @@ -149,6 +149,11 @@ def main(): cmake_options["PCBREV"] = "T16" firmware_options = options_jumper_t16 maxsize = 2 * 1024 * 1024 + elif board_name == "tx16s": + cmake_options["PCB"] = "X10" + cmake_options["PCBREV"] = "TX16S" + firmware_options = options_jumper_t16 + maxsize = 2 * 1024 * 1024 else: exit(INVALID_BOARD) diff --git a/tools/build-companion-nightly.sh b/tools/build-companion-nightly.sh index bd5eb97ad..683e0e4d6 100755 --- a/tools/build-companion-nightly.sh +++ b/tools/build-companion-nightly.sh @@ -98,6 +98,10 @@ cmake ${COMMON_OPTIONS} -DPCB=X10 -DPCBREV=T16 -DINTERNAL_MODULE_MULTI=YES ${SRC make -j${JOBS} libsimulator rm CMakeCache.txt +cmake ${COMMON_OPTIONS} -DPCB=X10 -DPCBREV=TX16S ${SRCDIR} +make -j${JOBS} libsimulator +rm CMakeCache.txt + cmake ${COMMON_OPTIONS} -DPCB=X10 -DPCBREV=EXPRESS ${SRCDIR} make -j${JOBS} libsimulator rm CMakeCache.txt diff --git a/tools/build-companion-release.sh b/tools/build-companion-release.sh index 0529e9154..34757a3e8 100755 --- a/tools/build-companion-release.sh +++ b/tools/build-companion-release.sh @@ -98,6 +98,10 @@ cmake ${COMMON_OPTIONS} -DPCB=X10 -DPCBREV=T16 -DINTERNAL_MODULE_MULTI=YES ${SRC make -j${JOBS} libsimulator rm CMakeCache.txt +cmake ${COMMON_OPTIONS} -DPCB=X10 -DPCBREV=TX16S ${SRCDIR} +make -j${JOBS} libsimulator +rm CMakeCache.txt + cmake ${COMMON_OPTIONS} -DPCB=X10 -DPCBREV=EXPRESS ${SRCDIR} make -j${JOBS} libsimulator rm CMakeCache.txt From ecb21a3df3b05d2ae7d1182910d16f9e1b596f25 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 31 Jan 2020 11:15:38 +0100 Subject: [PATCH 109/560] Trigger new Sd card version --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 820530334..7cccabf1f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ set(VERSION_REVISION "6") set(VERSION_SUFFIX $ENV{OPENTX_VERSION_SUFFIX}) set(VERSION_FAMILY ${VERSION_MAJOR}.${VERSION_MINOR}) set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}${VERSION_SUFFIX}) -set(SDCARD_REVISION "0025") +set(SDCARD_REVISION "0026") set(SDCARD_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}V${SDCARD_REVISION}) cmake_minimum_required(VERSION 2.8) From 72721bde001f222ca652a800d4302967845870b8 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 1 Feb 2020 15:01:20 +0100 Subject: [PATCH 110/560] Define AUX2 (4 pins) --- radio/src/targets/horus/hal.h | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 7fea582c3..76c459a5f 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -337,12 +337,7 @@ #define SPORT_MAX_BAUDRATE 250000 // < 400000 #endif -#if defined(RADIO_TX16S) - #define SPORT_UPDATE_RCC_AHB1Periph RCC_AHB1Periph_GPIOA - #define SPORT_UPDATE_PWR_GPIO GPIOA - #define SPORT_UPDATE_PWR_GPIO_PIN GPIO_Pin_15 // PA.15 - #define HAS_SPORT_UPDATE_CONNECTOR() true -#elif defined(PCBX10) && !defined(RADIO_T16) +#if defined(PCBX10) && !defined(RADIO_FAMILY_T16) #define SPORT_UPDATE_RCC_AHB1Periph RCC_AHB1Periph_GPIOH #define SPORT_UPDATE_PWR_GPIO GPIOH #define SPORT_UPDATE_PWR_GPIO_PIN GPIO_Pin_13 // PH.13 @@ -414,6 +409,23 @@ #define AUX_SERIAL_PWR_GPIO GPIOB #define AUX_SERIAL_PWR_GPIO_PIN GPIO_Pin_0 // PB.00 #define TRAINER_BATTERY_COMPARTMENT + + #define AUX2_SERIAL_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1) + #define AUX2_SERIAL_PWR_GPIO GPIOA + #define AUX2_SERIAL_PWR_GPIO_PIN GPIO_Pin_15 // PA.15 + #define AUX2_SERIAL_RCC_APB1Periph RCC_APB1Periph_USART3 + #define AUX2_SERIAL_RCC_APB2Periph 0 + #define AUX2_SERIAL_GPIO GPIOB + #define AUX2_SERIAL_GPIO_PIN_TX GPIO_Pin_10 // PB.10 + #define AUX2_SERIAL_GPIO_PIN_RX GPIO_Pin_11 // PB.11 + #define AUX2_SERIAL_GPIO_PinSource_TX GPIO_PinSource10 + #define AUX2_SERIAL_GPIO_PinSource_RX GPIO_PinSource11 + #define AUX2_SERIAL_GPIO_AF GPIO_AF_USART3 + #define AUX2_SERIAL_USART USART3 + #define AUX2_SERIAL_USART_IRQHandler USART3_IRQHandler + #define AUX2_SERIAL_USART_IRQn USART3_IRQn + #define AUX2_SERIAL_DMA_Stream_RX DMA1_Stream1 + #define AUX2_SERIAL_DMA_Channel_RX DMA_Channel_4 #else #define AUX_SERIAL_RCC_AHB1Periph 0 #define AUX_SERIAL_RCC_APB1Periph 0 From fa6cd0307536919d4112de536b90cce3f6516562 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 1 Feb 2020 15:59:45 +0100 Subject: [PATCH 111/560] Some portuguese TTS fixes --- radio/src/translations/tts_pt.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/radio/src/translations/tts_pt.cpp b/radio/src/translations/tts_pt.cpp index 34a3ff75b..a909227f5 100644 --- a/radio/src/translations/tts_pt.cpp +++ b/radio/src/translations/tts_pt.cpp @@ -96,7 +96,6 @@ I18N_PLAY_FUNCTION(pt, playNumber, getvalue_t number, uint8_t unit, uint8_t att) number = -number; } - int8_t mode = MODE(att); if (mode > 0) { if (mode == 2) { @@ -127,13 +126,20 @@ I18N_PLAY_FUNCTION(pt, playNumber, getvalue_t number, uint8_t unit, uint8_t att) if (number == 0) number = -1; } - if (number >= 100) { - PUSH_NUMBER_PROMPT(PT_PROMPT_CENTO + number/100); + + if (number > 100) { + PUSH_NUMBER_PROMPT(PT_PROMPT_CEM + number/100); number %= 100; if (number == 0) number = -1; } - PUSH_NUMBER_PROMPT(PT_PROMPT_ZERO+number); + + if (number == 100) { + PUSH_NUMBER_PROMPT(PT_PROMPT_CEM); + } + else { + PUSH_NUMBER_PROMPT(PT_PROMPT_ZERO + number); + } if (unit) { PT_PUSH_UNIT_PROMPT(unit); From bd75013b7b020291e5a599b415ee9e18fd42a92a Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 3 Feb 2020 07:06:09 +0100 Subject: [PATCH 112/560] Remove warning --- radio/src/targets/horus/board.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 8d088c6d1..d5b7bdac5 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -553,8 +553,8 @@ void usbJoystickUpdate(); #define USB_PRODUCT 'T', '1', '6', ' ', ' ', ' ', ' ', ' ' /* 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_MANUFACTURER 'R', 'a', 'd', 'i', 'o', 'M', 'a', 's' /* 8 bytes */ + #define USB_PRODUCT '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 */ From b7523d12f0383a004e54ac66eff188161fc023e2 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 3 Feb 2020 07:32:31 +0100 Subject: [PATCH 113/560] Fix TX16S compile, and add more radio to Travis --- radio/src/targets/horus/board.cpp | 4 ++-- radio/src/targets/horus/board.h | 2 +- tools/commit-tests.sh | 18 ++++++++++++++++++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp index 7476db295..abdde2106 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -53,7 +53,7 @@ void auxSerialPowerOff() } #endif -#if defined(PCBX10) && !defined(RADIO_T16) +#if HAS_SPORT_UPDATE_CONNECTOR() void sportUpdateInit() { GPIO_InitTypeDef GPIO_InitStructure; @@ -179,7 +179,7 @@ void boardInit() ledInit(); -#if defined(PCBX10) && !defined(RADIO_T16) +#if HAS_SPORT_UPDATE_CONNECTOR() sportUpdateInit(); #endif diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index d5b7bdac5..09554c063 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -596,7 +596,7 @@ extern uint32_t telemetryErrors; void telemetryPortInvertedInit(uint32_t baudrate); // Sport update driver -#if defined(PCBX10) && !defined(RADIO_T16) +#if HAS_SPORT_UPDATE_CONNECTOR() void sportUpdatePowerOn(); void sportUpdatePowerOff(); #define SPORT_UPDATE_POWER_ON() sportUpdatePowerOn() diff --git a/tools/commit-tests.sh b/tools/commit-tests.sh index 9e470343c..b3d193ed1 100755 --- a/tools/commit-tests.sh +++ b/tools/commit-tests.sh @@ -184,6 +184,24 @@ if [[ " X10 COLORLCD ALL " =~ \ ${FLAVOR}\ ]] ; then make -j"${CORES}" tests-radio fi +if [[ " T16 COLORLCD ALL " =~ \ ${FLAVOR}\ ]] ; then + # OpenTX on T16 boards + rm -rf ./* + cmake "${COMMON_OPTIONS}" -DPCB=X10 -PCBREV=T16 -DHELI=YES -DLUA=YES -DGVARS=YES "${SRCDIR}" + make -j"${CORES}" ${FIRMARE_TARGET} + make -j"${CORES}" libsimulator + make -j"${CORES}" tests-radio +fi + +if [[ " TX16S COLORLCD ALL " =~ \ ${FLAVOR}\ ]] ; then + # OpenTX on TX16S boards + rm -rf ./* + cmake "${COMMON_OPTIONS}" -DPCB=X10 -DPCB=TX16S -DHELI=YES -DLUA=YES -DGVARS=YES "${SRCDIR}" + make -j"${CORES}" ${FIRMARE_TARGET} + make -j"${CORES}" libsimulator + make -j"${CORES}" tests-radio +fi + if [[ " X12S COLORLCD ALL " =~ \ ${FLAVOR}\ ]] ; then # OpenTX on X12S rm -rf ./* From e96a76ff76d1d7d689024cc1b7ca99403097c8ba Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 3 Feb 2020 07:51:19 +0100 Subject: [PATCH 114/560] Fix Travis --- tools/commit-tests.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/commit-tests.sh b/tools/commit-tests.sh index b3d193ed1..a15b698e7 100755 --- a/tools/commit-tests.sh +++ b/tools/commit-tests.sh @@ -187,7 +187,7 @@ fi if [[ " T16 COLORLCD ALL " =~ \ ${FLAVOR}\ ]] ; then # OpenTX on T16 boards rm -rf ./* - cmake "${COMMON_OPTIONS}" -DPCB=X10 -PCBREV=T16 -DHELI=YES -DLUA=YES -DGVARS=YES "${SRCDIR}" + cmake "${COMMON_OPTIONS}" -DPCB=X10 -DPCBREV=T16 -DHELI=YES -DLUA=YES -DGVARS=YES "${SRCDIR}" make -j"${CORES}" ${FIRMARE_TARGET} make -j"${CORES}" libsimulator make -j"${CORES}" tests-radio @@ -196,7 +196,7 @@ fi if [[ " TX16S COLORLCD ALL " =~ \ ${FLAVOR}\ ]] ; then # OpenTX on TX16S boards rm -rf ./* - cmake "${COMMON_OPTIONS}" -DPCB=X10 -DPCB=TX16S -DHELI=YES -DLUA=YES -DGVARS=YES "${SRCDIR}" + cmake "${COMMON_OPTIONS}" -DPCB=X10 -DPCBREV=TX16S -DHELI=YES -DLUA=YES -DGVARS=YES "${SRCDIR}" make -j"${CORES}" ${FIRMARE_TARGET} make -j"${CORES}" libsimulator make -j"${CORES}" tests-radio From ab33670e1785580c2c1e5ef0d40345b704632445 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 3 Feb 2020 08:50:46 +0100 Subject: [PATCH 115/560] Remove a warning --- radio/src/lua/api_general.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 28b072f95..30a03355e 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -456,7 +456,7 @@ static int luaSportTelemetryPush(lua_State * L) lua_pushboolean(L, outputTelemetryBuffer.isAvailable()); return 1; } - else if (lua_gettop(L) > sizeof(SportTelemetryPacket) ) { + else if (lua_gettop(L) > int(sizeof(SportTelemetryPacket))) { lua_pushboolean(L, false); return 1; } From 54b58385279ca10273451daf8a093a8ad02b84ff Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 3 Feb 2020 09:12:31 +0100 Subject: [PATCH 116/560] No conversion test from x10 for T16 / TX16S --- radio/src/tests/conversions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/tests/conversions.cpp b/radio/src/tests/conversions.cpp index 897d5cb59..26cdc159e 100644 --- a/radio/src/tests/conversions.cpp +++ b/radio/src/tests/conversions.cpp @@ -222,7 +222,7 @@ TEST(Conversions, ConversionX7From22) } #endif -#if defined(PCBX10) +#if defined(PCBX10) && !defined(RADIO_FAMILY_T16) TEST(Conversions, ConversionX10From22) { simuFatfsSetPaths(TESTS_BUILD_PATH "/model_22_x10/", TESTS_BUILD_PATH "/model_22_x10/"); From c81ec60e8bb21a825b0a0a3dda5cecef1e2db3f1 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 5 Feb 2020 23:47:48 +0100 Subject: [PATCH 117/560] Update CREDITS.txt --- CREDITS.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index f90be0081..6dc75219b 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1696,3 +1696,5 @@ Fernando Rimoldi Bernard Delpy Daniel Dubovsky Jonathan Starch +Coolwind +Benoit Pichereau From 4c94dd3ba0a2e488c96494e5cbdb3b1076827a73 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 6 Feb 2020 08:15:10 +0100 Subject: [PATCH 118/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 6dc75219b..804ab0846 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1698,3 +1698,4 @@ Daniel Dubovsky Jonathan Starch Coolwind Benoit Pichereau +Darko Perković From 40d57a88537d06625c0887ebc455f9dd955972c5 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 6 Feb 2020 14:36:21 +0100 Subject: [PATCH 119/560] Add name handling to LUA timer functions (#7358) Add timer name to LUA timer functions --- radio/src/lua/api_model.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/radio/src/lua/api_model.cpp b/radio/src/lua/api_model.cpp index 990d477d4..3d9a4e48a 100644 --- a/radio/src/lua/api_model.cpp +++ b/radio/src/lua/api_model.cpp @@ -182,8 +182,9 @@ Get model timer parameters * `countdownBeep` (number) countdown beep (0­ = silent, 1 =­ beeps, 2­ = voice) * `minuteBeep` (boolean) minute beep * `persistent` (number) persistent timer + * `name` (string) timer name -@status current Introduced in 2.0.0 +@status current Introduced in 2.0.0, name added in 2.3.6 */ static int luaModelGetTimer(lua_State *L) { @@ -197,6 +198,7 @@ static int luaModelGetTimer(lua_State *L) lua_pushtableinteger(L, "countdownBeep", timer.countdownBeep); lua_pushtableboolean(L, "minuteBeep", timer.minuteBeep); lua_pushtableinteger(L, "persistent", timer.persistent); + lua_pushtablezstring(L, "name", timer.name); } else { lua_pushnil(L); @@ -216,7 +218,7 @@ Set model timer parameters @notice If a parameter is missing from the value, then that parameter remains unchanged. -@status current Introduced in 2.0.0 +@status current Introduced in 2.0.0, name added in 2.3.6 */ static int luaModelSetTimer(lua_State *L) { @@ -246,6 +248,10 @@ static int luaModelSetTimer(lua_State *L) else if (!strcmp(key, "persistent")) { timer.persistent = luaL_checkinteger(L, -1); } + if (!strcmp(key, "name")) { + const char * name = luaL_checkstring(L, -1); + str2zchar(timer.name, name, sizeof(timer.name)); + } } storageDirty(EE_MODEL); } From c7b7efbe168a53965f6070d67db2fa0126aafb87 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 6 Feb 2020 14:52:35 +0100 Subject: [PATCH 120/560] Complement #7346 (#7350) --- radio/src/targets/horus/telemetry_driver.cpp | 1 - radio/src/targets/taranis/board.cpp | 3 ++- radio/src/targets/taranis/hal.h | 1 + radio/src/targets/taranis/telemetry_driver.cpp | 1 - 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/src/targets/horus/telemetry_driver.cpp b/radio/src/targets/horus/telemetry_driver.cpp index ecd73b6ab..ffb1cbc2c 100644 --- a/radio/src/targets/horus/telemetry_driver.cpp +++ b/radio/src/targets/horus/telemetry_driver.cpp @@ -156,7 +156,6 @@ void telemetryPortInvertedInit(uint32_t baudrate) rxBitCount = 0; // configure bit sample timer - RCC->APB2ENR |= RCC_APB2ENR_TIM11EN; TELEMETRY_TIMER->PSC = (PERI2_FREQUENCY * TIMER_MULT_APB2) / 2000000 - 1; // 0.5uS TELEMETRY_TIMER->CCER = 0; TELEMETRY_TIMER->CCMR1 = 0; diff --git a/radio/src/targets/taranis/board.cpp b/radio/src/targets/taranis/board.cpp index 2dfa0a886..3cd6742f3 100644 --- a/radio/src/targets/taranis/board.cpp +++ b/radio/src/targets/taranis/board.cpp @@ -113,7 +113,8 @@ void boardInit() INTMODULE_RCC_APB2Periph | EXTMODULE_RCC_APB2Periph | TRAINER_MODULE_RCC_APB2Periph | - BT_RCC_APB2Periph, + BT_RCC_APB2Periph | + TELEMETRY_RCC_APB2Periph, ENABLE); #if defined(BLUETOOTH) && !defined(PCBX9E) diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 5d2c67bf9..645ebe327 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -1331,6 +1331,7 @@ // Telemetry #define TELEMETRY_RCC_AHB1Periph (RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA1) #define TELEMETRY_RCC_APB1Periph RCC_APB1Periph_USART2 +#define TELEMETRY_RCC_APB2Periph RCC_APB2Periph_TIM11 #define TELEMETRY_DIR_GPIO GPIOD #define TELEMETRY_DIR_GPIO_PIN GPIO_Pin_4 // PD.04 #if defined(PCBXLITE) || defined(PCBX9LITE) || defined(RADIO_X9DP2019) || defined(RADIO_X7ACCESS) diff --git a/radio/src/targets/taranis/telemetry_driver.cpp b/radio/src/targets/taranis/telemetry_driver.cpp index 3c9618f03..e5b0d8cfe 100644 --- a/radio/src/targets/taranis/telemetry_driver.cpp +++ b/radio/src/targets/taranis/telemetry_driver.cpp @@ -117,7 +117,6 @@ void telemetryPortInvertedInit(uint32_t baudrate) rxBitCount = 0; // configure bit sample timer - RCC->APB2ENR |= RCC_APB2ENR_TIM11EN; TELEMETRY_TIMER->PSC = (PERI2_FREQUENCY * TIMER_MULT_APB2) / 2000000 - 1; // 0.5uS TELEMETRY_TIMER->CCER = 0; TELEMETRY_TIMER->CCMR1 = 0; From 90fee60337e142dbd0ddc100e46bafeee376e8bf Mon Sep 17 00:00:00 2001 From: olliw42 <6089567+olliw42@users.noreply.github.com> Date: Thu, 6 Feb 2020 14:52:54 +0100 Subject: [PATCH 121/560] telemetry tim11 rcc (#7347) --- radio/src/targets/horus/hal.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 76c459a5f..f5692a8c7 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -435,7 +435,7 @@ // Telemetry #define TELEMETRY_RCC_AHB1Periph (RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA1) #define TELEMETRY_RCC_APB1Periph RCC_APB1Periph_USART2 -#define TELEMETRY_RCC_APB2Periph RCC_APB2Periph_TIM10 +#define TELEMETRY_RCC_APB2Periph RCC_APB2Periph_TIM11 #define TELEMETRY_DIR_GPIO GPIOD #define TELEMETRY_DIR_GPIO_PIN GPIO_Pin_4 // PD.04 #define TELEMETRY_GPIO GPIOD From 00cd0f918c3ddc7ef7f65c772d7f9b3fedd38d65 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 6 Feb 2020 15:33:32 +0100 Subject: [PATCH 122/560] Fix #7332 (#7355) --- companion/src/logsdialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/companion/src/logsdialog.cpp b/companion/src/logsdialog.cpp index e60318c69..b7fa54f16 100644 --- a/companion/src/logsdialog.cpp +++ b/companion/src/logsdialog.cpp @@ -761,7 +761,7 @@ void LogsDialog::setFlightSessions() int noSesions = sessions.size()-1; QString label = QString("%1 ").arg(noSesions); label += tr(noSesions > 1 ? "sessions" : "session"); - label += " <" + tr("total duration ") + generateDuration(getRecordTimeStamp(1), getRecordTimeStamp(n-1)) + ">"; + label += " <" + tr("time span") + generateDuration(getRecordTimeStamp(1), getRecordTimeStamp(n-1)) + ">"; ui->sessions_CB->addItem(label); // add individual sessions From 4658cd9ad844e878058ed11e65acb8be2bf6ef2d Mon Sep 17 00:00:00 2001 From: dukey32123 Date: Fri, 7 Feb 2020 00:06:57 +0100 Subject: [PATCH 123/560] Move Module Tools behind Radio Script Tools (#7360) Update Radio / Tools --- radio/src/gui/480x272/radio_tools.cpp | 34 +++++++++++---------- radio/src/gui/common/stdlcd/radio_tools.cpp | 34 +++++++++++---------- 2 files changed, 36 insertions(+), 32 deletions(-) diff --git a/radio/src/gui/480x272/radio_tools.cpp b/radio/src/gui/480x272/radio_tools.cpp index 407a5b2fe..21cabf522 100644 --- a/radio/src/gui/480x272/radio_tools.cpp +++ b/radio/src/gui/480x272/radio_tools.cpp @@ -91,23 +91,7 @@ bool menuRadioTools(event_t event) uint8_t index = 0; -#if defined(INTERNAL_MODULE_PXX2) - if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER)) - addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_INT, menuRadioSpectrumAnalyser, INTERNAL_MODULE); - if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER)) - addRadioModuleTool(index++, STR_POWER_METER_INT, menuRadioPowerMeter, INTERNAL_MODULE); -#elif defined(INTERNAL_MODULE_MULTI) - addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_INT, menuRadioSpectrumAnalyser, INTERNAL_MODULE); -#endif -#if defined(PXX2)|| defined(MULTIMODULE) - if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER) || isModuleMultimodule(EXTERNAL_MODULE)) - addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_EXT, menuRadioSpectrumAnalyser, EXTERNAL_MODULE); -#endif -#if defined(PXX2) - if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER)) - addRadioModuleTool(index++, STR_POWER_METER_EXT, menuRadioPowerMeter, EXTERNAL_MODULE); -#endif #if defined(LUA) FILINFO fno; @@ -130,6 +114,24 @@ bool menuRadioTools(event_t event) } #endif +#if defined(INTERNAL_MODULE_PXX2) + if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER)) + addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_INT, menuRadioSpectrumAnalyser, INTERNAL_MODULE); + + if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER)) + addRadioModuleTool(index++, STR_POWER_METER_INT, menuRadioPowerMeter, INTERNAL_MODULE); +#elif defined(INTERNAL_MODULE_MULTI) + addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_INT, menuRadioSpectrumAnalyser, INTERNAL_MODULE); +#endif +#if defined(PXX2)|| defined(MULTIMODULE) + if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER) || isModuleMultimodule(EXTERNAL_MODULE)) + addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_EXT, menuRadioSpectrumAnalyser, EXTERNAL_MODULE); +#endif +#if defined(PXX2) + if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER)) + addRadioModuleTool(index++, STR_POWER_METER_EXT, menuRadioPowerMeter, EXTERNAL_MODULE); +#endif + if (index == 0) { lcdDrawCenteredText(LCD_H/2, STR_NO_TOOLS); } diff --git a/radio/src/gui/common/stdlcd/radio_tools.cpp b/radio/src/gui/common/stdlcd/radio_tools.cpp index 478c052b3..d5bfd12d4 100644 --- a/radio/src/gui/common/stdlcd/radio_tools.cpp +++ b/radio/src/gui/common/stdlcd/radio_tools.cpp @@ -87,23 +87,7 @@ void menuRadioTools(event_t event) uint8_t index = 0; -#if defined(INTERNAL_MODULE_PXX2) - if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER)) - addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_INT, menuRadioSpectrumAnalyser, INTERNAL_MODULE); - if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER)) - addRadioModuleTool(index++, STR_POWER_METER_INT, menuRadioPowerMeter, INTERNAL_MODULE); -#elif defined(INTERNAL_MODULE_MULTI) - addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_INT, menuRadioSpectrumAnalyser, INTERNAL_MODULE); -#endif -#if defined(PXX2)|| defined(MULTIMODULE) - if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER) || isModuleMultimodule(EXTERNAL_MODULE)) - addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_EXT, menuRadioSpectrumAnalyser, EXTERNAL_MODULE); -#endif -#if defined(PXX2) - if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER)) - addRadioModuleTool(index++, STR_POWER_METER_EXT, menuRadioPowerMeter, EXTERNAL_MODULE); -#endif #if defined(LUA) FILINFO fno; @@ -127,6 +111,24 @@ void menuRadioTools(event_t event) } #endif +#if defined(INTERNAL_MODULE_PXX2) + if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER)) + addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_INT, menuRadioSpectrumAnalyser, INTERNAL_MODULE); + + if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER)) + addRadioModuleTool(index++, STR_POWER_METER_INT, menuRadioPowerMeter, INTERNAL_MODULE); +#elif defined(INTERNAL_MODULE_MULTI) + addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_INT, menuRadioSpectrumAnalyser, INTERNAL_MODULE); +#endif +#if defined(PXX2)|| defined(MULTIMODULE) + if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER) || isModuleMultimodule(EXTERNAL_MODULE)) + addRadioModuleTool(index++, STR_SPECTRUM_ANALYSER_EXT, menuRadioSpectrumAnalyser, EXTERNAL_MODULE); +#endif +#if defined(PXX2) + if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER)) + addRadioModuleTool(index++, STR_POWER_METER_EXT, menuRadioPowerMeter, EXTERNAL_MODULE); +#endif + if (index == 0) { lcdDrawCenteredText(LCD_H/2, STR_NO_TOOLS); } From 7f5276224e9bf3319ee475a87c09c2f224bbc2fd Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 7 Feb 2020 09:54:35 +0100 Subject: [PATCH 124/560] Fix LUA telemetry (+/-/exit handling) (#7356) Fix LUA telemetry (+/-/exit handling) --- radio/src/gui/128x64/gui.h | 2 +- radio/src/gui/128x64/menus.h | 2 +- radio/src/gui/128x64/view_main.cpp | 2 +- radio/src/gui/128x64/view_telemetry.cpp | 76 ------------- radio/src/gui/212x64/gui.h | 2 +- radio/src/gui/212x64/menus.h | 2 +- radio/src/gui/212x64/view_main.cpp | 2 +- radio/src/gui/212x64/view_telemetry.cpp | 62 ----------- radio/src/gui/common/stdlcd/CMakeLists.txt | 1 + .../src/gui/common/stdlcd/view_telemetry.cpp | 100 ++++++++++++++++++ radio/src/lua/interface.cpp | 2 +- 11 files changed, 108 insertions(+), 145 deletions(-) create mode 100644 radio/src/gui/common/stdlcd/view_telemetry.cpp diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h index 329a9c3a4..8ac31d239 100644 --- a/radio/src/gui/128x64/gui.h +++ b/radio/src/gui/128x64/gui.h @@ -302,7 +302,7 @@ void showAlertBox(const char * title, const char * text, const char * action , u #define LOAD_MODEL_BITMAP() #define IS_MAIN_VIEW_DISPLAYED() menuHandlers[0] == menuMainView -#define IS_TELEMETRY_VIEW_DISPLAYED() menuHandlers[0] == menuViewTelemetryFrsky +#define IS_TELEMETRY_VIEW_DISPLAYED() menuHandlers[0] == menuViewTelemetry #define IS_OTHER_VIEW_DISPLAYED() false void editCurveRef(coord_t x, coord_t y, CurveRef & curve, event_t event, LcdFlags flags); diff --git a/radio/src/gui/128x64/menus.h b/radio/src/gui/128x64/menus.h index d861a626f..daa3f1885 100644 --- a/radio/src/gui/128x64/menus.h +++ b/radio/src/gui/128x64/menus.h @@ -45,7 +45,7 @@ inline bool isModelMenuDisplayed() void onMainViewMenu(const char * result); void menuFirstCalib(event_t event); void menuMainView(event_t event); -void menuViewTelemetryFrsky(event_t event); +void menuViewTelemetry(event_t event); void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomFunctionsContext * functionsContext); enum MenuRadioIndexes diff --git a/radio/src/gui/128x64/view_main.cpp b/radio/src/gui/128x64/view_main.cpp index 737a4dc44..b1ab8cd79 100644 --- a/radio/src/gui/128x64/view_main.cpp +++ b/radio/src/gui/128x64/view_main.cpp @@ -397,7 +397,7 @@ void menuMainView(event_t event) #endif case EVT_KEY_TELEMETRY: - chainMenu(menuViewTelemetryFrsky); + chainMenu(menuViewTelemetry); killEvents(event); break; diff --git a/radio/src/gui/128x64/view_telemetry.cpp b/radio/src/gui/128x64/view_telemetry.cpp index f6d5d7301..86d369377 100644 --- a/radio/src/gui/128x64/view_telemetry.cpp +++ b/radio/src/gui/128x64/view_telemetry.cpp @@ -206,79 +206,3 @@ bool displayTelemetryScreen() return true; } - -enum NavigationDirection { - none, - up, - down -}; -#define decrTelemetryScreen() direction = up -#define incrTelemetryScreen() direction = down - -#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) - #define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_LONG(KEY_PAGE)) - #define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_BREAK(KEY_PAGE)) -#elif defined(NAVIGATION_9X) - #define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_LONG(KEY_UP)) - #define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_LONG(KEY_DOWN)) -#else - #define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_FIRST(KEY_UP)) - #define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_FIRST(KEY_DOWN)) -#endif - -void menuViewTelemetryFrsky(event_t event) -{ - enum NavigationDirection direction = none; - - if (event == EVT_KEY_FIRST(KEY_EXIT) && TELEMETRY_SCREEN_TYPE(s_frsky_view) != TELEMETRY_SCREEN_TYPE_SCRIPT) { - killEvents(event); - chainMenu(menuMainView); - } -#if defined(LUA) - else if (event == EVT_KEY_LONG(KEY_EXIT)) { - killEvents(event); - chainMenu(menuMainView); - } -#endif - else if (EVT_KEY_PREVIOUS_VIEW(event)) { - killEvents(event); - decrTelemetryScreen(); - } - else if (EVT_KEY_NEXT_VIEW(event)) { - killEvents(event); - incrTelemetryScreen(); - } - else if (event == EVT_KEY_LONG(KEY_ENTER)) { - killEvents(event); - POPUP_MENU_ADD_ITEM(STR_RESET_TELEMETRY); - POPUP_MENU_ADD_ITEM(STR_RESET_FLIGHT); - POPUP_MENU_START(onMainViewMenu); - } - - for (int i=0; i<=TELEMETRY_SCREEN_TYPE_MAX; i++) { - if (direction == up) { - if (s_frsky_view-- == 0) - s_frsky_view = TELEMETRY_VIEW_MAX; - } - else if (direction == down) { - if (s_frsky_view++ == TELEMETRY_VIEW_MAX) - s_frsky_view = 0; - } - else { - direction = down; - } - if (displayTelemetryScreen()) { - return; - } - } - - drawTelemetryTopBar(); - lcdDrawText(2*FW, 3*FH, "No Telemetry Screens"); - displayRssiLine(); -} - -#undef EVT_KEY_PREVIOUS_VIEW -#undef EVT_KEY_NEXT_VIEW diff --git a/radio/src/gui/212x64/gui.h b/radio/src/gui/212x64/gui.h index 3883a2e86..c430a0646 100644 --- a/radio/src/gui/212x64/gui.h +++ b/radio/src/gui/212x64/gui.h @@ -303,7 +303,7 @@ FlightModesType editFlightModes(coord_t x, coord_t y, event_t event, FlightModes #endif #define IS_MAIN_VIEW_DISPLAYED() menuHandlers[0] == menuMainView -#define IS_TELEMETRY_VIEW_DISPLAYED() menuHandlers[0] == menuViewTelemetryFrsky +#define IS_TELEMETRY_VIEW_DISPLAYED() menuHandlers[0] == menuViewTelemetry #define IS_OTHER_VIEW_DISPLAYED() (menuHandlers[0] == menuMainViewChannelsMonitor || menuHandlers[0] == menuChannelsView) #endif // _GUI_H_ diff --git a/radio/src/gui/212x64/menus.h b/radio/src/gui/212x64/menus.h index c5025c728..bdfb8f591 100644 --- a/radio/src/gui/212x64/menus.h +++ b/radio/src/gui/212x64/menus.h @@ -39,7 +39,7 @@ void menuFirstCalib(event_t event); void menuMainViewChannelsMonitor(event_t event); void menuChannelsView(event_t event); void menuMainView(event_t event); -void menuViewTelemetryFrsky(event_t event); +void menuViewTelemetry(event_t event); void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomFunctionsContext * functionsContext); void menuModelNotes(event_t event); void menuStatisticsView(event_t event); diff --git a/radio/src/gui/212x64/view_main.cpp b/radio/src/gui/212x64/view_main.cpp index 720e3ccbf..bdbcb10a6 100644 --- a/radio/src/gui/212x64/view_main.cpp +++ b/radio/src/gui/212x64/view_main.cpp @@ -470,7 +470,7 @@ void menuMainView(event_t event) break; case EVT_KEY_LONG(KEY_PAGE): - chainMenu(menuViewTelemetryFrsky); + chainMenu(menuViewTelemetry); killEvents(event); break; diff --git a/radio/src/gui/212x64/view_telemetry.cpp b/radio/src/gui/212x64/view_telemetry.cpp index 04dc411c5..fa8740667 100644 --- a/radio/src/gui/212x64/view_telemetry.cpp +++ b/radio/src/gui/212x64/view_telemetry.cpp @@ -200,65 +200,3 @@ bool displayTelemetryScreen() return true; } -enum NavigationDirection { - none, - up, - down -}; - -#define decrTelemetryScreen() direction = up -#define incrTelemetryScreen() direction = down - -void menuViewTelemetryFrsky(event_t event) -{ - enum NavigationDirection direction = none; - - switch (event) { - case EVT_KEY_FIRST(KEY_EXIT): - case EVT_KEY_LONG(KEY_EXIT): - killEvents(event); - chainMenu(menuMainView); - break; - - case EVT_KEY_LONG(KEY_PAGE): - killEvents(event); - // no break; - - case EVT_KEY_FIRST(KEY_UP): - decrTelemetryScreen(); - break; - - case EVT_KEY_BREAK(KEY_PAGE): - case EVT_KEY_FIRST(KEY_DOWN): - incrTelemetryScreen(); - break; - - case EVT_KEY_LONG(KEY_ENTER): - killEvents(event); - POPUP_MENU_ADD_ITEM(STR_RESET_TELEMETRY); - POPUP_MENU_ADD_ITEM(STR_RESET_FLIGHT); - POPUP_MENU_START(onMainViewMenu); - break; - } - - for (int i=0; i<=TELEMETRY_SCREEN_TYPE_MAX; i++) { - if (direction == up) { - if (s_frsky_view-- == 0) - s_frsky_view = TELEMETRY_VIEW_MAX; - } - else if (direction == down) { - if (s_frsky_view++ == TELEMETRY_VIEW_MAX) - s_frsky_view = 0; - } - else { - direction = down; - } - if (displayTelemetryScreen()) { - return; - } - } - - drawTelemetryTopBar(); - lcdDrawText(8*FW, 3*FH, "No Telemetry Screens"); - displayRssiLine(); -} diff --git a/radio/src/gui/common/stdlcd/CMakeLists.txt b/radio/src/gui/common/stdlcd/CMakeLists.txt index 0d3f726b3..f20235ced 100644 --- a/radio/src/gui/common/stdlcd/CMakeLists.txt +++ b/radio/src/gui/common/stdlcd/CMakeLists.txt @@ -15,6 +15,7 @@ set(GUI_SRC ../common/stdlcd/radio_hardware.cpp ../common/stdlcd/radio_version.cpp ../common/stdlcd/radio_trainer.cpp + ../common/stdlcd/view_telemetry.cpp model_curve_edit.cpp ) diff --git a/radio/src/gui/common/stdlcd/view_telemetry.cpp b/radio/src/gui/common/stdlcd/view_telemetry.cpp new file mode 100644 index 000000000..e2bf39503 --- /dev/null +++ b/radio/src/gui/common/stdlcd/view_telemetry.cpp @@ -0,0 +1,100 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "opentx.h" + +extern bool displayTelemetryScreen(); +extern void displayRssiLine(); + +enum NavigationDirection { + NAVIGATION_DIRECTION_NONE, + NAVIGATION_DIRECTION_UP, + NAVIGATION_DIRECTION_DOWN +}; +#define decrTelemetryScreen() direction = NAVIGATION_DIRECTION_UP +#define incrTelemetryScreen() direction = NAVIGATION_DIRECTION_DOWN + +#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) || 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)) +#elif defined(NAVIGATION_9X) + #define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_LONG(KEY_UP)) + #define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_LONG(KEY_DOWN)) +#else + #define EVT_KEY_PREVIOUS_VIEW(evt) (evt == EVT_KEY_FIRST(KEY_UP)) + #define EVT_KEY_NEXT_VIEW(evt) (evt == EVT_KEY_FIRST(KEY_DOWN)) +#endif + +void menuViewTelemetry(event_t event) +{ + enum NavigationDirection direction = NAVIGATION_DIRECTION_NONE; + + if (event == EVT_KEY_FIRST(KEY_EXIT) && TELEMETRY_SCREEN_TYPE(s_frsky_view) != TELEMETRY_SCREEN_TYPE_SCRIPT) { + killEvents(event); + chainMenu(menuMainView); + } +#if defined(LUA) + else if (event == EVT_KEY_LONG(KEY_EXIT)) { + killEvents(event); + chainMenu(menuMainView); + } +#endif + else if (EVT_KEY_PREVIOUS_VIEW(event)) { + killEvents(event); + decrTelemetryScreen(); + } + else if (EVT_KEY_NEXT_VIEW(event)) { + killEvents(event); + incrTelemetryScreen(); + } + else if (event == EVT_KEY_LONG(KEY_ENTER)) { + killEvents(event); + POPUP_MENU_ADD_ITEM(STR_RESET_TELEMETRY); + POPUP_MENU_ADD_ITEM(STR_RESET_FLIGHT); + POPUP_MENU_START(onMainViewMenu); + } + + for (int i=0; i<=TELEMETRY_SCREEN_TYPE_MAX; i++) { + if (direction == NAVIGATION_DIRECTION_UP) { + if (s_frsky_view-- == 0) + s_frsky_view = TELEMETRY_VIEW_MAX; + } + else if (direction == NAVIGATION_DIRECTION_DOWN) { + if (s_frsky_view++ == TELEMETRY_VIEW_MAX) + s_frsky_view = 0; + } + else { + direction = NAVIGATION_DIRECTION_DOWN; + } + if (displayTelemetryScreen()) { + return; + } + } + + drawTelemetryTopBar(); + lcdDrawText(LCD_W / 2, 3 * FH, "No Telemetry Screens", CENTERED); + displayRssiLine(); +} + +#undef EVT_KEY_PREVIOUS_VIEW +#undef EVT_KEY_NEXT_VIEW diff --git a/radio/src/lua/interface.cpp b/radio/src/lua/interface.cpp index 73b71da62..a0cef2c1d 100644 --- a/radio/src/lua/interface.cpp +++ b/radio/src/lua/interface.cpp @@ -952,7 +952,7 @@ bool luaDoOneRunPermanentScript(event_t evt, int i, uint32_t scriptType) TelemetryScriptData & script = g_model.screens[sid.reference-SCRIPT_TELEMETRY_FIRST].script; filename = script.file; #endif - if ((scriptType & RUN_TELEM_FG_SCRIPT) && (menuHandlers[0]==menuViewTelemetryFrsky && sid.reference==SCRIPT_TELEMETRY_FIRST+s_frsky_view)) { + if ((scriptType & RUN_TELEM_FG_SCRIPT) && (menuHandlers[0]==menuViewTelemetry && sid.reference==SCRIPT_TELEMETRY_FIRST+s_frsky_view)) { lua_rawgeti(lsScripts, LUA_REGISTRYINDEX, sid.run); lua_pushunsigned(lsScripts, evt); inputsCount = 1; From a2599da189620cc12333858a30f8b8ce0e8c0e8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Charpentier?= Date: Tue, 11 Feb 2020 14:43:13 +0100 Subject: [PATCH 125/560] Updated French translation (#7372) --- companion/src/translations/companion_fr.ts | 182 +++++++++++---------- 1 file changed, 94 insertions(+), 88 deletions(-) diff --git a/companion/src/translations/companion_fr.ts b/companion/src/translations/companion_fr.ts index b4ff19c18..98fb5663a 100644 --- a/companion/src/translations/companion_fr.ts +++ b/companion/src/translations/companion_fr.ts @@ -728,58 +728,58 @@ Manche Droit: Profondeur, Direction Boards - + Left Horizontal Gauche Horizontal - + Left Vertical Gauche Vertical - + Right Vertical Droit Vertical - + Right Horizontal Droit Horizontal - + Aux. 1 - + Aux. 2 - - + + Unknown Inconnu - + Rud Dir - + Ele Prf - + Thr Gaz - + Ail @@ -2862,272 +2862,278 @@ Blanc signifie "inclure tous".Les métacaractères ?, * et [...] sont Firmware - + Channel values displayed in us Positions de voies affichées en µs - + No OverrideCH functions available Désactive la fonction spéciale "Remplacer VOIExx" - + Possibility to enable FAI MODE (no telemetry) at field Possibilité d'activer le mode FAI (télémétrie désactivée) sur le terrain - + FAI MODE (no telemetry) always enabled Mode FAI (télémétrie toujours désactivée) - + Removes D8 FrSky protocol support which is not legal for use in the EU on radios sold after Jan 1st, 2015 Masque le protocole D8. Légalement obligatoire sur les radios Européennes importées après le 1er janvier 2015 - - + + Disable HELI menu and cyclic mix support Supprimer le menu HELICO et les mixages cycliques - - + + Disable Global variables Supprimer le support des variables globales - - + + Enable Lua custom scripts screen Activer l'écran des scripts Lua personnalisés - + Support for PPM internal module hack Support du remplacement du module interne par un module PPM - + Use alternative SQT5 font Utiliser la police alternative SQT5 - + Disable RAS (SWR) Désactiver le RAS (SWR). Utile uniquement pour les X9D+ avec un RAS/SWR non fonctionnel - + Pots use in menus navigation Support de la navigation dans les menus avec les POTS - + FrSky Taranis X9D+ - + FrSky Taranis X9D+ 2019 - + FrSky Taranis X9D - + Haptic module installed Module vibreur installé - + FrSky Taranis X9E - + Confirmation before radio shutdown Confirmation avant l'arrêt de la radio - + Horus gimbals installed (Hall sensors) Manches Horus à effet HALL installés - + FrSky Taranis X9-Lite - + FrSky Taranis X9-Lite S - + FrSky Taranis X7 / X7S - + FrSky Taranis X7 / X7S Access - + FrSky Taranis X-Lite S/PRO - + FrSky Taranis X-Lite - + FrSky Horus X10 / X10S - - + + Support for ACCESS internal module replacement Prise en charge du module de remplacement interne ACCESS - + FrSky Horus X10 Express / X10S Express - + FrSky Horus X12S - + Use ONLY with first DEV pcb version Exclusivement pour les Horus DEV - + Enable non certified R9M firmwares Activer les firmwares R9M non certifiés - - + + Support for MULTI internal module Prise en charge du module MULTI interne - + + Support for bluetooth module Prise en charge du module Bluetooth - + + Radiomaster TX16S + + + + Turnigy 9XR-PRO - + Enable HELI menu and cyclic mix support Activer le menu hélico et les mixages CCPM - + Global variables Variables globales - + Enable non certified firmwares Activer les firmwares non certifiés - + In model setup menus automatically set source by moving the control Sélectionner les sources des mixeurs en bougeant le contrôle désiré - + In model setup menus automatically set switch by moving the control Sélectionner les interrupteurs en bougeant le contrôle désiré - + No graphical check boxes and sliders Pas de cases à cocher et de curseurs graphiques - + Battery graph Graphique de la batterie - + Don't use bold font for highlighting active items Ne pas mettre les lignes actives en gras - + Turnigy 9XR with m128 chip Turnigy 9XR avec une puce m128 - + Turnigy 9XR - + 9X with stock board 9X avec carte mère d'origine - + Enable resetting values by pressing up and down at the same time Permet la remise à zéro des valeurs en pressant haut-bas en même temps, valeur min avec gauche/bas, valeur max avec haut/droite, inversion avec gauche/droite - + 9X with stock board and m128 chip Carte 9x avec un chip m128 - + 9X with AR9X board 9X avec carte AR9X - + Jumper T12 / T12 Pro - + Jumper T16 / T16+ / T16 Pro - + 9X with Sky9x board 9X avec carte Sky9x - + 9X with Gruvin9x board 9X avec carte Gruvin9x - + DIY MEGA2560 radio Radio DIY à base de MEGA2560 @@ -6035,8 +6041,8 @@ Les colonnes contenant l'altitude "GAlt" et la vitesse "GSpd - total duration - durée totale + time span + plage de temps @@ -9630,22 +9636,22 @@ Mixage actif par défaut si non-renseigné. OpenTxEepromInterface - + Unknown error Erreur inconnue - + ... plus %1 errors ... plus %1 erreurs - + Cannot write radio settings Impossible d'écrire les paramètres de la radio - + Cannot write model %1 Impossible d'écrire le modèle %1 @@ -11774,62 +11780,62 @@ La valeur par défaut est configurée dans le profil radio sélectionné.Simulateur Radio (%1) - + Could not determine startup data source. Impossible de déterminer les données source. - + Could not load data, possibly wrong format. Impossible de charger les données, mauvais format. - + Data Load Error Erreur de lecture des données - + Invalid startup data provided. Plese specify a proper file/path. Données de démarrage fournies non valides. Veuillez spécifier un fichier/chemin approprié. - + Simulator Startup Error Erreur de démarrage du simulateur - + Error saving data: could open file for writing: '%1' Erreur de sauvegarde des données: impossible d'écrire le fichier '%1' - + Error saving data: could not get data from simulator interface. Erreur de sauvegarde des données: impossible de récupérer les données depuis l'interface de simulation. - + An unexpected error occurred while attempting to save radio data to file '%1'. Une erreur inattendue s'est produite lors de l'enregistrement des données radio dans le fichier '%1'. - + Data Save Error Erreur de sauvegarde des données - + Cannot open joystick, joystick disabled Impossible d'accéder au Joystick, Joystick désactivé - + Radio firmware error: %1 Erreur firmware radio: %1 - + - Flight Mode %1 (#%2) - Phase de Vol %1 (#%2) From 0cbb8107af20b275d08308246cf7e00fc370f02d Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 12 Feb 2020 16:51:15 +0100 Subject: [PATCH 126/560] Add support for CRSF bat% (#7377) --- radio/src/telemetry/crossfire.cpp | 53 ++++++++++++++++--------------- radio/src/telemetry/crossfire.h | 1 + radio/src/translations/cz.h.txt | 1 + radio/src/translations/de.h.txt | 1 + radio/src/translations/en.h.txt | 1 + radio/src/translations/es.h.txt | 1 + radio/src/translations/fi.h.txt | 1 + radio/src/translations/fr.h.txt | 1 + radio/src/translations/it.h.txt | 1 + radio/src/translations/nl.h.txt | 1 + radio/src/translations/pl.h.txt | 1 + radio/src/translations/pt.h.txt | 1 + radio/src/translations/se.h.txt | 1 + 13 files changed, 40 insertions(+), 25 deletions(-) diff --git a/radio/src/telemetry/crossfire.cpp b/radio/src/telemetry/crossfire.cpp index b233583a4..724fbe1a0 100644 --- a/radio/src/telemetry/crossfire.cpp +++ b/radio/src/telemetry/crossfire.cpp @@ -21,31 +21,32 @@ #include "opentx.h" const CrossfireSensor crossfireSensors[] = { - {LINK_ID, 0, ZSTR_RX_RSSI1, UNIT_DB, 0}, - {LINK_ID, 1, ZSTR_RX_RSSI2, UNIT_DB, 0}, - {LINK_ID, 2, ZSTR_RX_QUALITY, UNIT_PERCENT, 0}, - {LINK_ID, 3, ZSTR_RX_SNR, UNIT_DB, 0}, - {LINK_ID, 4, ZSTR_ANTENNA, UNIT_RAW, 0}, - {LINK_ID, 5, ZSTR_RF_MODE, UNIT_RAW, 0}, - {LINK_ID, 6, ZSTR_TX_POWER, UNIT_MILLIWATTS, 0}, - {LINK_ID, 7, ZSTR_TX_RSSI, UNIT_DB, 0}, - {LINK_ID, 8, ZSTR_TX_QUALITY, UNIT_PERCENT, 0}, - {LINK_ID, 9, ZSTR_TX_SNR, UNIT_DB, 0}, - {BATTERY_ID, 0, ZSTR_BATT, UNIT_VOLTS, 1}, - {BATTERY_ID, 1, ZSTR_CURR, UNIT_AMPS, 1}, - {BATTERY_ID, 2, ZSTR_CAPACITY, UNIT_MAH, 0}, - {GPS_ID, 0, ZSTR_GPS, UNIT_GPS_LATITUDE, 0}, - {GPS_ID, 0, ZSTR_GPS, UNIT_GPS_LONGITUDE, 0}, - {GPS_ID, 2, ZSTR_GSPD, UNIT_KMH, 1}, - {GPS_ID, 3, ZSTR_HDG, UNIT_DEGREE, 3}, - {GPS_ID, 4, ZSTR_ALT, UNIT_METERS, 0}, - {GPS_ID, 5, ZSTR_SATELLITES, UNIT_RAW, 0}, - {ATTITUDE_ID, 0, ZSTR_PITCH, UNIT_RADIANS, 3}, - {ATTITUDE_ID, 1, ZSTR_ROLL, UNIT_RADIANS, 3}, - {ATTITUDE_ID, 2, ZSTR_YAW, UNIT_RADIANS, 3}, - {FLIGHT_MODE_ID, 0, ZSTR_FLIGHT_MODE, UNIT_TEXT, 0}, - {CF_VARIO_ID, 0, ZSTR_VSPD, UNIT_METERS_PER_SECOND, 2}, - {0, 0, "UNKNOWN", UNIT_RAW, 0}, + {LINK_ID, 0, ZSTR_RX_RSSI1, UNIT_DB, 0}, + {LINK_ID, 1, ZSTR_RX_RSSI2, UNIT_DB, 0}, + {LINK_ID, 2, ZSTR_RX_QUALITY, UNIT_PERCENT, 0}, + {LINK_ID, 3, ZSTR_RX_SNR, UNIT_DB, 0}, + {LINK_ID, 4, ZSTR_ANTENNA, UNIT_RAW, 0}, + {LINK_ID, 5, ZSTR_RF_MODE, UNIT_RAW, 0}, + {LINK_ID, 6, ZSTR_TX_POWER, UNIT_MILLIWATTS, 0}, + {LINK_ID, 7, ZSTR_TX_RSSI, UNIT_DB, 0}, + {LINK_ID, 8, ZSTR_TX_QUALITY, UNIT_PERCENT, 0}, + {LINK_ID, 9, ZSTR_TX_SNR, UNIT_DB, 0}, + {BATTERY_ID, 0, ZSTR_BATT, UNIT_VOLTS, 1}, + {BATTERY_ID, 1, ZSTR_CURR, UNIT_AMPS, 1}, + {BATTERY_ID, 2, ZSTR_CAPACITY, UNIT_MAH, 0}, + {BATTERY_ID, 3, ZSTR_BATT_PERCENT, UNIT_PERCENT, 0}, + {GPS_ID, 0, ZSTR_GPS, UNIT_GPS_LATITUDE, 0}, + {GPS_ID, 0, ZSTR_GPS, UNIT_GPS_LONGITUDE, 0}, + {GPS_ID, 2, ZSTR_GSPD, UNIT_KMH, 1}, + {GPS_ID, 3, ZSTR_HDG, UNIT_DEGREE, 3}, + {GPS_ID, 4, ZSTR_ALT, UNIT_METERS, 0}, + {GPS_ID, 5, ZSTR_SATELLITES, UNIT_RAW, 0}, + {ATTITUDE_ID, 0, ZSTR_PITCH, UNIT_RADIANS, 3}, + {ATTITUDE_ID, 1, ZSTR_ROLL, UNIT_RADIANS, 3}, + {ATTITUDE_ID, 2, ZSTR_YAW, UNIT_RADIANS, 3}, + {FLIGHT_MODE_ID, 0, ZSTR_FLIGHT_MODE, UNIT_TEXT, 0}, + {CF_VARIO_ID, 0, ZSTR_VSPD, UNIT_METERS_PER_SECOND, 2}, + {0, 0, "UNKNOWN", UNIT_RAW, 0}, }; const CrossfireSensor & getCrossfireSensor(uint8_t id, uint8_t subId) @@ -157,6 +158,8 @@ void processCrossfireTelemetryFrame() processCrossfireTelemetryValue(BATT_CURRENT_INDEX, value); if (getCrossfireTelemetryValue<3>(7, value)) processCrossfireTelemetryValue(BATT_CAPACITY_INDEX, value); + if (getCrossfireTelemetryValue<1>(10, value)) + processCrossfireTelemetryValue(BATT_REMAINING_INDEX, value); break; case ATTITUDE_ID: diff --git a/radio/src/telemetry/crossfire.h b/radio/src/telemetry/crossfire.h index 3daed0d57..79cc5f025 100644 --- a/radio/src/telemetry/crossfire.h +++ b/radio/src/telemetry/crossfire.h @@ -64,6 +64,7 @@ enum CrossfireSensorIndexes { BATT_VOLTAGE_INDEX, BATT_CURRENT_INDEX, BATT_CAPACITY_INDEX, + BATT_REMAINING_INDEX, GPS_LATITUDE_INDEX, GPS_LONGITUDE_INDEX, GPS_GROUND_SPEED_INDEX, diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index fe2f4a921..2244f2fe9 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -1199,6 +1199,7 @@ #define ZSTR_CURR "Curr" #define ZSTR_CAPACITY "Capa" #define ZSTR_VFAS "VFAS" +#define ZSTR_BATT_PERCENT "Bat%" #define ZSTR_ASPD "ASpd" #define ZSTR_GSPD "GSpd" #define ZSTR_HDG "Hdg" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 1cfef0aef..98fd1df8e 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -1205,6 +1205,7 @@ #define ZSTR_CURR "Curr" #define ZSTR_CAPACITY "Capa" #define ZSTR_VFAS "VFAS" +#define ZSTR_BATT_PERCENT "Bat%" #define ZSTR_ASPD "ASpd" #define ZSTR_GSPD "GSpd" #define ZSTR_HDG "Hdg" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 9ab4f8725..7620e6bf3 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -1203,6 +1203,7 @@ #define ZSTR_CURR "Curr" #define ZSTR_CAPACITY "Capa" #define ZSTR_VFAS "VFAS" +#define ZSTR_BATT_PERCENT "Bat%" #define ZSTR_ASPD "ASpd" #define ZSTR_GSPD "GSpd" #define ZSTR_HDG "Hdg" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 3d7a70d43..1b5b7c096 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -1224,6 +1224,7 @@ #define ZSTR_CURR "Curr" #define ZSTR_CAPACITY "Capa" #define ZSTR_VFAS "VFAS" +#define ZSTR_BATT_PERCENT "Bat%" #define ZSTR_ASPD "ASpd" #define ZSTR_GSPD "GSpd" #define ZSTR_HDG "Hdg" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 241e4fdcb..6bafcb221 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -1212,6 +1212,7 @@ #define ZSTR_CURR "Curr" #define ZSTR_CAPACITY "Capa" #define ZSTR_VFAS "VFAS" +#define ZSTR_BATT_PERCENT "Bat%" #define ZSTR_ASPD "ASpd" #define ZSTR_GSPD "GSpd" #define ZSTR_HDG "Hdg" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 88fa0689f..55548862c 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -1227,6 +1227,7 @@ #define ZSTR_CURR "Curr" #define ZSTR_CAPACITY "Capa" #define ZSTR_VFAS "VFAS" +#define ZSTR_BATT_PERCENT "Bat%" #define ZSTR_ASPD "ASpd" #define ZSTR_GSPD "GSpd" #define ZSTR_HDG "Hdg" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 0f5e5b047..b5feb04b8 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -1221,6 +1221,7 @@ #define ZSTR_CURR "Curr" #define ZSTR_CAPACITY "Capa" #define ZSTR_VFAS "VFAS" +#define ZSTR_BATT_PERCENT "Bat%" #define ZSTR_ASPD "ASpd" #define ZSTR_GSPD "GSpd" #define ZSTR_HDG "Hdg" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index e67be0298..d28dcbca8 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -1213,6 +1213,7 @@ #define ZSTR_CURR "Curr" #define ZSTR_CAPACITY "Capa" #define ZSTR_VFAS "VFAS" +#define ZSTR_BATT_PERCENT "Bat%" #define ZSTR_ASPD "ASpd" #define ZSTR_GSPD "GSpd" #define ZSTR_HDG "Hdg" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index a52b0da24..dc6a86aac 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -1220,6 +1220,7 @@ #define ZSTR_CURR "Curr" #define ZSTR_CAPACITY "Capa" #define ZSTR_VFAS "VFAS" +#define ZSTR_BATT_PERCENT "Bat%" #define ZSTR_ASPD "ASpd" #define ZSTR_GSPD "GSpd" #define ZSTR_HDG "Hdg" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 2d4d6fc71..7b77891c6 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -1209,6 +1209,7 @@ #define ZSTR_CURR "Curr" #define ZSTR_CAPACITY "Capa" #define ZSTR_VFAS "VFAS" +#define ZSTR_BATT_PERCENT "Bat%" #define ZSTR_ASPD "ASpd" #define ZSTR_GSPD "GSpd" #define ZSTR_HDG "Hdg" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 85b31e4d9..8639b0378 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -1220,6 +1220,7 @@ #define ZSTR_CURR "Curr" #define ZSTR_CAPACITY "Capa" #define ZSTR_VFAS "VFAS" +#define ZSTR_BATT_PERCENT "Bat%" #define ZSTR_ASPD "ASpd" #define ZSTR_GSPD "GSpd" #define ZSTR_HDG "Hdg" From f40264b6582d83ebe28129616fba2323f09ee0da Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 12 Feb 2020 16:53:21 +0100 Subject: [PATCH 127/560] Remove redundant code/feature (#7368) Remove redundant code/feature --- radio/src/gui/480x272/menus.h | 3 -- radio/src/gui/480x272/radio_diaganas.cpp | 14 ++++++-- radio/src/gui/480x272/view_statistics.cpp | 39 ----------------------- radio/src/opentx.h | 4 +-- 4 files changed, 13 insertions(+), 47 deletions(-) diff --git a/radio/src/gui/480x272/menus.h b/radio/src/gui/480x272/menus.h index 37e33a58f..cefa95378 100644 --- a/radio/src/gui/480x272/menus.h +++ b/radio/src/gui/480x272/menus.h @@ -151,7 +151,6 @@ const uint8_t STATS_ICONS[] = { ICON_STATS, ICON_STATS_THROTTLE_GRAPH, ICON_STATS_DEBUG, - ICON_STATS_ANALOGS, #if defined(DEBUG_TRACE_BUFFER) ICON_STATS_TIMERS #endif @@ -240,13 +239,11 @@ enum MenuRadioIndexes bool menuStatsGraph(event_t event); bool menuStatsDebug(event_t event); -bool menuStatsAnalogs(event_t event); bool menuStatsTraces(event_t event); static const MenuHandlerFunc menuTabStats[] = { menuStatsGraph, menuStatsDebug, - menuStatsAnalogs, #if defined(DEBUG_TRACE_BUFFER) menuStatsTraces, #endif diff --git a/radio/src/gui/480x272/radio_diaganas.cpp b/radio/src/gui/480x272/radio_diaganas.cpp index 37d16f2f7..2892457dc 100644 --- a/radio/src/gui/480x272/radio_diaganas.cpp +++ b/radio/src/gui/480x272/radio_diaganas.cpp @@ -29,7 +29,7 @@ bool menuRadioDiagAnalogs(event_t event) { SIMPLE_SUBMENU(STR_MENU_RADIO_ANALOGS, ICON_MODEL_SETUP, 0); - for (uint8_t i = 0; i < NUM_STICKS + NUM_POTS + NUM_SLIDERS; i++) { + for (uint8_t i = 0; i < NUM_ANALOGS; i++) { coord_t y = MENU_HEADER_HEIGHT + 1 + (i / 2) * FH; uint8_t x = i & 1 ? LCD_W / 2 + 10 : LEFT_NAME_COLUMN; lcdDrawNumber(x, y, i + 1, LEADING0 | LEFT, 2); @@ -40,7 +40,12 @@ bool menuRadioDiagAnalogs(event_t event) lcdDrawNumber(x + ANA_OFFSET + 30 - 1, y, avgJitter[i].get(), RIGHT); lcdDrawNumber(x + ANA_OFFSET + 70 - 1, y, (int16_t) calibratedAnalogs[CONVERT_MODE(i)] * 25 / 256, RIGHT); #else - lcdDrawNumber(x + ANA_OFFSET - 1, y, (int16_t) calibratedAnalogs[CONVERT_MODE(i)] * 25 / 256, RIGHT); + if (i < NUM_STICKS + NUM_POTS + NUM_SLIDERS) + lcdDrawNumber(x + ANA_OFFSET - 1, y, (int16_t) calibratedAnalogs[CONVERT_MODE(i)] * 25 / 256, RIGHT); +#if NUM_MOUSE_ANALOGS > 0 + else if (i >= MOUSE1) + lcdDrawNumber(x + ANA_OFFSET - 1, y, (int16_t) calibratedAnalogs[CALIBRATED_MOUSE1 + i - MOUSE1] * 25 / 256, RIGHT); +#endif #endif } @@ -51,5 +56,10 @@ bool menuRadioDiagAnalogs(event_t event) lcdDrawText(LCD_W / 2, RAS_TOP_POSITION, "XJTVER : "); lcdDrawNumber(lcdNextPos, RAS_TOP_POSITION, telemetryData.xjtVersion, 0); } + +#if (NUM_PWMSTICKS > 0) && !defined(SIMU) + lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 8 * FH, STICKS_PWM_ENABLED() ? "Sticks: PWM" : "Sticks: ANA"); +#endif + return true; } diff --git a/radio/src/gui/480x272/view_statistics.cpp b/radio/src/gui/480x272/view_statistics.cpp index c13dff60e..34eb9b0c2 100644 --- a/radio/src/gui/480x272/view_statistics.cpp +++ b/radio/src/gui/480x272/view_statistics.cpp @@ -188,45 +188,6 @@ bool menuStatsDebug(event_t event) return true; } -bool menuStatsAnalogs(event_t event) -{ - SIMPLE_MENU("Analogs", STATS_ICONS, menuTabStats, e_StatsAnalogs, 1); - - for (uint8_t i=0; i 0 - else if (i >= MOUSE1) - lcdDrawNumber(x+100, y, (int16_t)calibratedAnalogs[CALIBRATED_MOUSE1+i-MOUSE1]*25/256); -#endif -#endif - } - - // RAS - if ((isModuleXJT(INTERNAL_MODULE) && IS_INTERNAL_MODULE_ON()) || (isModulePXX1(EXTERNAL_MODULE) && !IS_INTERNAL_MODULE_ON())) { - lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP+7*FH, "RAS"); - lcdDrawNumber(MENUS_MARGIN_LEFT+100, MENU_CONTENT_TOP+7*FH, telemetryData.swrInternal.value()); - lcdDrawText(MENUS_MARGIN_LEFT + LCD_W/2, MENU_CONTENT_TOP+7*FH, "XJTVER"); - lcdDrawNumber(LCD_W/2 + MENUS_MARGIN_LEFT+100, MENU_CONTENT_TOP+7*FH, telemetryData.xjtVersion); - } - -#if (NUM_PWMSTICKS > 0) && !defined(SIMU) - lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP+8*FH, STICKS_PWM_ENABLED() ? "Sticks: PWM" : "Sticks: ANA"); -#endif - - return true; -} - - #if defined(DEBUG_TRACE_BUFFER) #define STATS_TRACES_INDEX_POS MENUS_MARGIN_LEFT #define STATS_TRACES_TIME_POS MENUS_MARGIN_LEFT + 4*10 diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 0ef8b04c9..cac27516d 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -1366,9 +1366,7 @@ extern uint16_t s_anaFilt[NUM_ANALOGS]; #if defined(JITTER_MEASURE) extern JitterMeter rawJitter[NUM_ANALOGS]; extern JitterMeter avgJitter[NUM_ANALOGS]; -#if defined(PCBHORUS) - #define JITTER_MEASURE_ACTIVE() (menuHandlers[menuLevel] == menuStatsAnalogs) -#elif defined(PCBTARANIS) +#if defined(PCBHORUS) || defined(PCBTARANIS) #define JITTER_MEASURE_ACTIVE() (menuHandlers[menuLevel] == menuRadioDiagAnalogs) #elif defined(CLI) #define JITTER_MEASURE_ACTIVE() (1) From e8ccd39113efa9d54358c17e2fb07e766adaaa71 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 15 Feb 2020 17:47:00 +0100 Subject: [PATCH 128/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 804ab0846..5dae08514 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1699,3 +1699,4 @@ Jonathan Starch Coolwind Benoit Pichereau Darko Perković +Burt Pickard-Richardson From c2e5e4f566254e10a2ced37275bcac07aeb14d87 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 17 Feb 2020 15:01:39 +0100 Subject: [PATCH 129/560] No "Execute" function if LUA not defined on Horus --- radio/src/gui/480x272/radio_sdmanager.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/radio/src/gui/480x272/radio_sdmanager.cpp b/radio/src/gui/480x272/radio_sdmanager.cpp index d4da41e3b..9a44203a5 100644 --- a/radio/src/gui/480x272/radio_sdmanager.cpp +++ b/radio/src/gui/480x272/radio_sdmanager.cpp @@ -337,9 +337,11 @@ bool menuRadioSdManager(event_t _event) } #endif +#if defined(LUA) if (isExtensionMatching(ext, SCRIPTS_EXT)) { POPUP_MENU_ADD_ITEM(STR_EXECUTE_FILE); } +#endif if (isExtensionMatching(ext, TEXT_EXT) || isExtensionMatching(ext, SCRIPTS_EXT)) { POPUP_MENU_ADD_ITEM(STR_VIEW_TEXT); From 18b5fbf33e6dfb3dce84ef8c1fb228eac5d20b23 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 18 Feb 2020 11:11:52 +0100 Subject: [PATCH 130/560] Add copy min/max to outputs (#7396) * Add copy min/max to outputs * Also copy ppm center --- radio/src/gui/128x64/model_outputs.cpp | 4 ++++ radio/src/gui/212x64/model_outputs.cpp | 4 ++++ radio/src/gui/480x272/model_outputs.cpp | 4 ++++ radio/src/opentx.cpp | 19 +++++++++++++++++++ radio/src/opentx.h | 1 + radio/src/translations.cpp | 1 + radio/src/translations.h | 1 + radio/src/translations/cz.h.txt | 1 + radio/src/translations/de.h.txt | 1 + radio/src/translations/en.h.txt | 1 + radio/src/translations/es.h.txt | 1 + radio/src/translations/fi.h.txt | 1 + radio/src/translations/fr.h.txt | 1 + radio/src/translations/it.h.txt | 1 + radio/src/translations/nl.h.txt | 1 + radio/src/translations/pl.h.txt | 1 + radio/src/translations/pt.h.txt | 1 + radio/src/translations/se.h.txt | 1 + 18 files changed, 45 insertions(+) diff --git a/radio/src/gui/128x64/model_outputs.cpp b/radio/src/gui/128x64/model_outputs.cpp index a069e2362..0fde67159 100644 --- a/radio/src/gui/128x64/model_outputs.cpp +++ b/radio/src/gui/128x64/model_outputs.cpp @@ -215,6 +215,9 @@ void onLimitsMenu(const char *result) else if (result == STR_EDIT) { pushMenu(menuModelLimitsOne); } + else if (result == STR_COPY_MIN_MAX_TO_OUTPUTS) { + copyMinMaxToOutputs(s_currIdx); + } } void menuModelLimits(event_t event) @@ -240,6 +243,7 @@ void menuModelLimits(event_t event) POPUP_MENU_ADD_ITEM(STR_RESET); POPUP_MENU_ADD_ITEM(STR_COPY_TRIMS_TO_OFS); POPUP_MENU_ADD_ITEM(STR_COPY_STICKS_TO_OFS); + POPUP_MENU_ADD_ITEM(STR_COPY_MIN_MAX_TO_OUTPUTS); POPUP_MENU_START(onLimitsMenu); } diff --git a/radio/src/gui/212x64/model_outputs.cpp b/radio/src/gui/212x64/model_outputs.cpp index f3f776285..c1cd1de04 100644 --- a/radio/src/gui/212x64/model_outputs.cpp +++ b/radio/src/gui/212x64/model_outputs.cpp @@ -86,6 +86,9 @@ void onLimitsMenu(const char *result) copyTrimsToOffset(ch); storageDirty(EE_MODEL); } + else if (result == STR_COPY_MIN_MAX_TO_OUTPUTS) { + copyMinMaxToOutputs(ch); + } } void menuModelLimits(event_t event) @@ -142,6 +145,7 @@ void menuModelLimits(event_t event) POPUP_MENU_ADD_ITEM(STR_RESET); POPUP_MENU_ADD_ITEM(STR_COPY_TRIMS_TO_OFS); POPUP_MENU_ADD_ITEM(STR_COPY_STICKS_TO_OFS); + POPUP_MENU_ADD_ITEM(STR_COPY_MIN_MAX_TO_OUTPUTS); POPUP_MENU_START(onLimitsMenu); } diff --git a/radio/src/gui/480x272/model_outputs.cpp b/radio/src/gui/480x272/model_outputs.cpp index af5128fd7..3dd2d8f21 100644 --- a/radio/src/gui/480x272/model_outputs.cpp +++ b/radio/src/gui/480x272/model_outputs.cpp @@ -80,6 +80,9 @@ void onLimitsMenu(const char *result) copyTrimsToOffset(ch); storageDirty(EE_MODEL); } + else if (result == STR_COPY_MIN_MAX_TO_OUTPUTS) { + copyMinMaxToOutputs(ch); + } } bool menuModelLimits(event_t event) @@ -133,6 +136,7 @@ bool menuModelLimits(event_t event) POPUP_MENU_ADD_ITEM(STR_RESET); POPUP_MENU_ADD_ITEM(STR_COPY_TRIMS_TO_OFS); POPUP_MENU_ADD_ITEM(STR_COPY_STICKS_TO_OFS); + POPUP_MENU_ADD_ITEM(STR_COPY_MIN_MAX_TO_OUTPUTS); POPUP_MENU_START(onLimitsMenu); } diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 1bf9e8342..258eb74f8 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1725,6 +1725,25 @@ void copyTrimsToOffset(uint8_t ch) storageDirty(EE_MODEL); } +void copyMinMaxToOutputs(uint8_t ch) +{ + LimitData *ld = limitAddress(ch); + int16_t min = ld->min; + int16_t max = ld->max; + int16_t center = ld->ppmCenter; + + pauseMixerCalculations(); + + for (uint8_t chan = 0; chan < MAX_OUTPUT_CHANNELS; chan++) { + ld = limitAddress(chan); + ld->min = min; + ld->max = max; + ld->ppmCenter = center; + } + + resumeMixerCalculations(); + storageDirty(EE_MODEL); +} #if defined(STARTUP_ANIMATION) diff --git a/radio/src/opentx.h b/radio/src/opentx.h index cac27516d..8a8ea96a9 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -867,6 +867,7 @@ void instantTrim(); void evalTrims(); void copyTrimsToOffset(uint8_t ch); void copySticksToOffset(uint8_t ch); +void copyMinMaxToOutputs(uint8_t ch); void moveTrimsToOffsets(); typedef uint16_t ACTIVE_PHASES_TYPE; diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 8e333fcc4..1dfb9a692 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -536,6 +536,7 @@ const char STR_PT[] = TR_PT; const char STR_PTS[] = TR_PTS; const char STR_SMOOTH[] = TR_SMOOTH; const char STR_COPY_STICKS_TO_OFS[] = TR_COPY_STICKS_TO_OFS; +const char STR_COPY_MIN_MAX_TO_OUTPUTS[] = TR_COPY_MIN_MAX_TO_OUTPUTS; const char STR_COPY_TRIMS_TO_OFS[] = TR_COPY_TRIMS_TO_OFS; const char STR_INCDEC[] = TR_INCDEC; const char STR_GLOBALVAR[] = TR_GLOBALVAR; diff --git a/radio/src/translations.h b/radio/src/translations.h index 239fd7c71..df0cfd67d 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -821,6 +821,7 @@ extern const char STR_PT[]; extern const char STR_PTS[]; extern const char STR_SMOOTH[]; extern const char STR_COPY_STICKS_TO_OFS[]; +extern const char STR_COPY_MIN_MAX_TO_OUTPUTS[]; extern const char STR_COPY_TRIMS_TO_OFS[]; extern const char STR_INCDEC[]; extern const char STR_GLOBALVAR[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 2244f2fe9..cdcf5ae13 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -962,6 +962,7 @@ #define TR_PTS " b." #define TR_SMOOTH "Hladká" #define TR_COPY_STICKS_TO_OFS TR("Páky do subtrimu", "Kopie pák do subtrimu") +#define TR_COPY_MIN_MAX_TO_OUTPUTS TR("Cpy min/max to all", "Copy min/max/center to all outputs") #define TR_COPY_TRIMS_TO_OFS TR("Trimy do subtrimu", "Kopíe trimů do subtrimu") #define TR_INCDEC "Zvěšit/Zmenšit" #define TR_GLOBALVAR "Glob. proměnná" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 98fd1df8e..effe773d7 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -968,6 +968,7 @@ #define TR_PTS "Pts" #define TR_SMOOTH "Runden" #define TR_COPY_STICKS_TO_OFS TR("Copy Stk ->Subtrim", "Kopie Stick to Servo-Mitte") +#define TR_COPY_MIN_MAX_TO_OUTPUTS TR("Cpy min/max to all", "Copy min/max/center to all outputs") #define TR_COPY_TRIMS_TO_OFS TR("Copy Trim->Subtrim", "Kopie Trimm to Servo-Mitte") // "Trim to Subtrim" #define TR_INCDEC "Inc/Decrement" #define TR_GLOBALVAR "Global Var" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 7620e6bf3..f37006215 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -967,6 +967,7 @@ #define TR_PTS "pts" #define TR_SMOOTH "Smooth" #define TR_COPY_STICKS_TO_OFS TR("Cpy stick->subtrim", "Copy sticks to subtrim") +#define TR_COPY_MIN_MAX_TO_OUTPUTS TR("Cpy min/max to all", "Copy min/max/center to all outputs") #define TR_COPY_TRIMS_TO_OFS TR("Cpy trim->subtrim", "Copy trims to subtrim") #define TR_INCDEC "Inc/Decrement" #define TR_GLOBALVAR "Global var" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 1b5b7c096..c1ae1f49c 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -987,6 +987,7 @@ #define TR_PTS "pts" #define TR_SMOOTH "Smooth" #define TR_COPY_STICKS_TO_OFS TR("Cpy stick->subtrim", "Copy Sticks To Offset") +#define TR_COPY_MIN_MAX_TO_OUTPUTS TR("Cpy min/max to all", "Copy min/max/center to all outputs") #define TR_COPY_TRIMS_TO_OFS TR("Cpy trim->subtrim", "Copy trims to subtrim") #define TR_INCDEC "Inc/Decrement" #define TR_GLOBALVAR "Global Var" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 6bafcb221..839269089 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -981,6 +981,7 @@ #define TR_PTS "pts" #define TR_SMOOTH "Smooth" #define TR_COPY_STICKS_TO_OFS TR("Cpy stick->subtrim", "Copy Sticks To Offset") +#define TR_COPY_MIN_MAX_TO_OUTPUTS TR("Cpy min/max to all", "Copy min/max/center to all outputs") #define TR_COPY_TRIMS_TO_OFS TR("Cpy trim->subtrim", "Copy trims to subtrim") #define TR_INCDEC "Inc/Decrement" #define TR_GLOBALVAR "Global Var" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 55548862c..2e6eb35df 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -983,6 +983,7 @@ #define TR_PTS "pts" #define TR_SMOOTH "Lissage" #define TR_COPY_STICKS_TO_OFS TR("Cpy stick->subtrim", "Manche vers subtrim") +#define TR_COPY_MIN_MAX_TO_OUTPUTS TR("Cpy min/max to all", "Copy min/max/center to all outputs") #define TR_COPY_TRIMS_TO_OFS TR("Cpy trim->subtrim", "Trim vers subtrim") #define TR_INCDEC "Inc/décrementer" #define TR_GLOBALVAR "Var. globale" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index b5feb04b8..2125f0189 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -983,6 +983,7 @@ #define TR_PTS "pti" #define TR_SMOOTH "Smussa" #define TR_COPY_STICKS_TO_OFS TR(INDENT "Cp. stick->subtrim", INDENT "Copia Sticks su Subtrim") +#define TR_COPY_MIN_MAX_TO_OUTPUTS TR("Cpy min/max to all", "Copy min/max/center to all outputs") #define TR_COPY_TRIMS_TO_OFS TR(INDENT "Cp. trim->subtrim", INDENT "Copia Trims su Subtrim") #define TR_INCDEC "Inc/Decrementa" #define TR_GLOBALVAR "Var Globale" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index d28dcbca8..6e3388f4c 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -969,6 +969,7 @@ #define TR_PTS "Ptn" #define TR_SMOOTH "Zacht" #define TR_COPY_STICKS_TO_OFS TR("Cpy stick->subtrim", "Kopieer Sticks naar Subtrim") +#define TR_COPY_MIN_MAX_TO_OUTPUTS TR("Cpy min/max to all", "Copy min/max/center to all outputs") #define TR_COPY_TRIMS_TO_OFS TR("Cpy trim->subtrim", "Kopieer Trim naar Subtrim") #define TR_INCDEC "Inc/Decrement" #define TR_GLOBALVAR "Globale Var" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index dc6a86aac..2fe3c84a3 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -982,6 +982,7 @@ #define TR_PTS "pkty" #define TR_SMOOTH "Gładka" #define TR_COPY_STICKS_TO_OFS TR("Cpy stick->subtrim", "Skopiuj Drążki Do Offsetu") +#define TR_COPY_MIN_MAX_TO_OUTPUTS TR("Cpy min/max to all", "Copy min/max/center to all outputs") #define TR_COPY_TRIMS_TO_OFS TR("Cpy trim->subtrim", "Skopiuj Trymery Do subtrymerów") #define TR_INCDEC "Zwiększ/Zmnie" #define TR_GLOBALVAR "Zm.Global." diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 7b77891c6..33b3568e2 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -972,6 +972,7 @@ #define TR_PTS "pts" #define TR_SMOOTH "Smooth" #define TR_COPY_STICKS_TO_OFS TR("Cpy stick->subtrim", "Copy Sticks To Offset") +#define TR_COPY_MIN_MAX_TO_OUTPUTS TR("Cpy min/max to all", "Copy min/max/center to all outputs") #define TR_COPY_TRIMS_TO_OFS TR("Cpy trim->subtrim", "Copy trims to subtrim") #define TR_INCDEC "Inc/Decrement" #define TR_GLOBALVAR "Global Var" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 8639b0378..8bbb15270 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -982,6 +982,7 @@ #define TR_PTS "pkt" #define TR_SMOOTH "Mjuk" #define TR_COPY_STICKS_TO_OFS TR("Cpy stick->subtrim", "Spara spakar som subtrim") +#define TR_COPY_MIN_MAX_TO_OUTPUTS TR("Cpy min/max to all", "Copy min/max/center to all outputs") #define TR_COPY_TRIMS_TO_OFS TR("Cpy trim->subtrim", "Spara trimmar som subtrim") #define TR_INCDEC "Inkr/Dekrement" #define TR_GLOBALVAR "Globala Var" From f6075b3c0bceb28471136bf9610252cf213102d2 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 18 Feb 2020 11:26:37 +0100 Subject: [PATCH 131/560] Fix X9E RTC batt voltage readout (#7382) --- radio/src/targets/common/arm/stm32/adc_driver.cpp | 4 ++-- radio/src/targets/taranis/hal.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/src/targets/common/arm/stm32/adc_driver.cpp b/radio/src/targets/common/arm/stm32/adc_driver.cpp index b4c72e46c..3972ab86c 100644 --- a/radio/src/targets/common/arm/stm32/adc_driver.cpp +++ b/radio/src/targets/common/arm/stm32/adc_driver.cpp @@ -30,9 +30,9 @@ const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, -1,1,-1, 1,1, 1, -1}; #elif defined(PCBX9E) #if defined(HORUS_STICKS) - const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, -1,-1,-1,1, -1,1,-1, -1,-1,-1}; + const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, -1,-1,-1,1, -1,1,1, -1,-1,-1}; #else - const int8_t adcDirection[NUM_ANALOGS] = {1,1,-1,-1, -1,-1,-1,1, -1,1,-1, -1,-1,-1}; + const int8_t adcDirection[NUM_ANALOGS] = {1,1,-1,-1, -1,-1,-1,1, -1,1,1, -1,-1,-1}; #endif const uint8_t adcMapping[NUM_ANALOGS] = { 0 /*STICK1*/, 1 /*STICK2*/, 2 /*STICK3*/, 3 /*STICK4*/, 11 /*POT1*/, 4 /*POT2*/, 5 /*POT3*/, 6 /*POT4*/, diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 645ebe327..b8d1c7177 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -754,7 +754,7 @@ #define ADC_EXT_SET_DMA_FLAGS() ADC_DMA->LIFCR = (DMA_LIFCR_CTCIF0 | DMA_LIFCR_CHTIF0 | DMA_LIFCR_CTEIF0 | DMA_LIFCR_CDMEIF0 | DMA_LIFCR_CFEIF0) #define ADC_EXT_TRANSFER_COMPLETE() (ADC_DMA->LISR & DMA_LISR_TCIF0) #define ADC_EXT_SAMPTIME 3 // sample time = 56 cycles - #define ADC_VREF_PREC2 200 + #define ADC_VREF_PREC2 300 #elif defined(PCBX9DP) #define HARDWARE_POT1 #define HARDWARE_POT2 From a4125582f137a57b5617f884e8ef1c7f4a640c3d Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 18 Feb 2020 12:42:24 +0100 Subject: [PATCH 132/560] Improve textView on colorlcd (#7395) --- radio/src/gui/480x272/bitmapbuffer.h | 18 ++++++++++++++++++ radio/src/gui/480x272/lcd.h | 7 ------- radio/src/gui/480x272/view_text.cpp | 2 +- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/radio/src/gui/480x272/bitmapbuffer.h b/radio/src/gui/480x272/bitmapbuffer.h index 760215198..b9cdc0381 100644 --- a/radio/src/gui/480x272/bitmapbuffer.h +++ b/radio/src/gui/480x272/bitmapbuffer.h @@ -41,6 +41,14 @@ typedef int coord_t; typedef uint32_t LcdFlags; typedef uint16_t display_t; +int getTextWidth(const char * s, int len=0, LcdFlags flags=0); + +#if LCD_W >= 480 +#define LCD_COLS 80 +#else +#define LCD_COLS 30 +#endif + enum BitmapFormats { BMP_RGB565, @@ -275,6 +283,16 @@ class BitmapBuffer: public BitmapBufferBase uint8_t drawCharWithCache(coord_t x, coord_t y, const BitmapBuffer * font, const uint16_t * spec, int index, LcdFlags flags); + void drawTextMaxWidth(coord_t x, coord_t y, const char * s, LcdFlags flags, coord_t maxWidth) + { + for (int col = LCD_COLS; col > 0; col--) { + if (getTextWidth(s, col, flags) <= maxWidth) { + drawSizedText(x, y, s, col, flags); + return; + } + } + } + void drawText(coord_t x, coord_t y, const char * s, LcdFlags flags) { drawSizedText(x, y, s, 255, flags); diff --git a/radio/src/gui/480x272/lcd.h b/radio/src/gui/480x272/lcd.h index c66865d85..dfb42e829 100644 --- a/radio/src/gui/480x272/lcd.h +++ b/radio/src/gui/480x272/lcd.h @@ -24,12 +24,6 @@ #include "bitmapbuffer.h" #include "opentx_types.h" -#if LCD_W >= 480 - #define LCD_COLS 40 -#else - #define LCD_COLS 30 -#endif - #define CENTER /* lcd common flags */ @@ -254,7 +248,6 @@ inline int getBitmapHeight(const uint8_t * bmp) uint8_t getMappedChar(uint8_t c); uint8_t getFontHeight(LcdFlags flags); -int getTextWidth(const char * s, int len=0, LcdFlags flags=0); inline void lcdDrawBitmapPattern(coord_t x, coord_t y, const uint8_t * img, LcdFlags flags=0, coord_t offset=0, coord_t width=0) { diff --git a/radio/src/gui/480x272/view_text.cpp b/radio/src/gui/480x272/view_text.cpp index 3038887bf..a7969d21f 100644 --- a/radio/src/gui/480x272/view_text.cpp +++ b/radio/src/gui/480x272/view_text.cpp @@ -56,7 +56,7 @@ bool menuTextView(event_t event) } for (int i=0; idrawTextMaxWidth(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + i * FH, reusableBuffer.viewText.lines[i], 0, LCD_W - 2 * MENUS_MARGIN_LEFT); } #if 0 From c8eab1a31abca61ea9ee276f482deb9d531d5138 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 19 Feb 2020 09:34:36 +0100 Subject: [PATCH 133/560] Improve spannish TTS. This fixes #7398 --- radio/util/tts_es.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/radio/util/tts_es.py b/radio/util/tts_es.py index 3b436ecd6..01d28d3dd 100755 --- a/radio/util/tts_es.py +++ b/radio/util/tts_es.py @@ -70,6 +70,7 @@ for s, f in [("me tienes abandonada", "inactiv"), ("A1 crítica", "a1_red"), ("Alarma A2", "a2_org"), ("A2 crítica", "a2_red"), + ("Bienvenido a open t equis", "hello"), ("recepcion de señal baja", "rssi_org"), ("recepción de señal crítica", "rssi_red"), ("Problemas con la antena del transmisor", "swr_red"), @@ -77,7 +78,7 @@ for s, f in [("me tienes abandonada", "inactiv"), ("Telemetría disponible", "telemok"), ("servo overload", "servoko"), ("power overload", "rxko"), - ("receiver still connected", "modelpwr"), + ("El receptor esta conectado", "modelpwr"), ]: systemSounds.append((s, filename(f))) for i, s in enumerate(["cronómetro", "cronómetro", "transmisión", "recepción", "A1", "A2", "altitud", "motor", From dea4800da33f8a0f13ad81d7d0dfd16145a3ff01 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 20 Feb 2020 09:04:50 +0100 Subject: [PATCH 134/560] Allow range check for LR12 with 212 GUI (#7394) --- radio/src/gui/212x64/model_setup.cpp | 2 +- radio/src/pulses/modules_helpers.h | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 2d90d70da..e73c2938e 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -353,7 +353,7 @@ void menuModelSetup(event_t event) LABEL(InternalModule), INTERNAL_MODULE_TYPE_ROWS, MODULE_CHANNELS_ROWS(INTERNAL_MODULE), - IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(isModuleFailsafeAvailable(INTERNAL_MODULE) ? (uint8_t)2 : (uint8_t)1)), + IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(isModuleRangeAvailable(INTERNAL_MODULE)? (uint8_t)2 : (uint8_t)1)), // RxNum, Range check and Register buttons IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), // RxNum for ACCESS IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Failsafe IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 1), // Range check and Register buttons diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h index 1f1f30fbe..4d358c36b 100644 --- a/radio/src/pulses/modules_helpers.h +++ b/radio/src/pulses/modules_helpers.h @@ -421,6 +421,11 @@ inline bool isModuleBindRangeAvailable(uint8_t moduleIdx) return isModulePXX2(moduleIdx) || isModulePXX1(moduleIdx) || isModuleDSM2(moduleIdx) || isModuleMultimodule(moduleIdx); } +inline bool isModuleRangeAvailable(uint8_t moduleIdx) +{ + return isModuleXJTD16(moduleIdx) || isModuleXJTLR12(moduleIdx); +} + constexpr uint8_t MAX_RXNUM = 63; inline uint8_t getMaxRxNum(uint8_t idx) From 88b756ac1d6b5d6b14da467fd921939f11bb53cb Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 20 Feb 2020 09:21:20 +0100 Subject: [PATCH 135/560] Bring back RAS to Horus (#7392) --- radio/src/telemetry/frsky.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index e99c0f237..458a4901f 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -282,16 +282,16 @@ inline bool isRasValueValid() { return true; } -#elif defined(PCBX10) -inline bool isRasValueValid() -{ - return false; -} #elif defined(PCBX9DP) || defined(PCBX9E) inline bool isRasValueValid() { return telemetryData.xjtVersion != 0x0000 && telemetryData.xjtVersion != 0x00FF; } +#elif defined(PCBHORUS) +inline bool isRasValueValid() +{ + return true; +} #else inline bool isRasValueValid() { From 61bde526cceb7a73d8c58f2db3b61633ff96efca Mon Sep 17 00:00:00 2001 From: olliw42 <6089567+olliw42@users.noreply.github.com> Date: Thu, 20 Feb 2020 09:25:09 +0100 Subject: [PATCH 136/560] Add color option to luaLcdDrawPoint() (#7386) Add color option to luaLcdDrawPoint() --- radio/src/lua/api_lcd.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/radio/src/lua/api_lcd.cpp b/radio/src/lua/api_lcd.cpp index 039aa5547..e42a5f1cc 100644 --- a/radio/src/lua/api_lcd.cpp +++ b/radio/src/lua/api_lcd.cpp @@ -71,6 +71,8 @@ Draw a single pixel at (x,y) position @param y (positive number) y position +@param flags (unsigned number) drawing flags + @notice Taranis has an LCD display width of 212 pixels and height of 64 pixels. Position (0,0) is at top left. Y axis is negative, top line is 0, bottom line is 63. Drawing on an existing black pixel produces white pixel (TODO check this!) @@ -82,7 +84,8 @@ static int luaLcdDrawPoint(lua_State *L) if (!luaLcdAllowed) return 0; int x = luaL_checkinteger(L, 1); int y = luaL_checkinteger(L, 2); - lcdDrawPoint(x, y); + LcdFlags att = luaL_optunsigned(L, 3, 0); + lcdDrawPoint(x, y, att); return 0; } From 262fc12d5e543ae2d2a611fc647602aa31797972 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 20 Feb 2020 09:34:17 +0100 Subject: [PATCH 137/560] Cosmetics --- radio/src/lua/api_lcd.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/src/lua/api_lcd.cpp b/radio/src/lua/api_lcd.cpp index e42a5f1cc..9acd475e0 100644 --- a/radio/src/lua/api_lcd.cpp +++ b/radio/src/lua/api_lcd.cpp @@ -98,14 +98,14 @@ Draw a straight line on LCD @param x2,y2 (positive numbers) end coordinate -@param pattern TODO +@param pattern SOLID or DOTTED -@param flags TODO +@param flags lcdflags @notice If the start or the end of the line is outside the LCD dimensions, then the whole line will not be drawn (starting from OpenTX 2.1.5) -@status current Introduced in 2.0.0 +@status current Introduced in 2.0.0, flags introduced in 2.3.6 */ static int luaLcdDrawLine(lua_State *L) { From c4a6f55600e77adc8d4581efbe896c1d3c169a48 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 20 Feb 2020 09:49:45 +0100 Subject: [PATCH 138/560] Cosmetics --- radio/src/lua/api_lcd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/lua/api_lcd.cpp b/radio/src/lua/api_lcd.cpp index 9acd475e0..3c2b32638 100644 --- a/radio/src/lua/api_lcd.cpp +++ b/radio/src/lua/api_lcd.cpp @@ -71,7 +71,7 @@ Draw a single pixel at (x,y) position @param y (positive number) y position -@param flags (unsigned number) drawing flags +@param flags (optional) lcdflags @notice Taranis has an LCD display width of 212 pixels and height of 64 pixels. Position (0,0) is at top left. Y axis is negative, top line is 0, From 33ff85dbd40e9cbf25925a0a746b5146a088326d Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 24 Feb 2020 09:20:32 +0100 Subject: [PATCH 139/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 5dae08514..66a04772f 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1700,3 +1700,4 @@ Coolwind Benoit Pichereau Darko Perković Burt Pickard-Richardson +Roland Nittby From 3f49af7e6debafd76b45b1ff088c7b4693b8ae82 Mon Sep 17 00:00:00 2001 From: jessyjames Date: Mon, 24 Feb 2020 10:54:17 +0100 Subject: [PATCH 140/560] Some translation (#7409) --- radio/src/translations/de.h.txt | 46 ++++++++++++++++----------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index effe773d7..24c37b13e 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -645,15 +645,15 @@ #define TR_MODULE_NO_TELEMETRY TR3( "No telmetry", "No MULTI_TELEMETRY", "No telemetry (enable MULTI_TELEMETRY)") #define TR_MODULE_WAITFORBIND "Bind to load protocol" #define TR_MODULE_BINDING "Binding" -#define TR_MODULE_UPGRADE_ALERT TR3("Upg. needed", "Module upgrade required", "Module\nUpgrade required") -#define TR_MODULE_UPGRADE TR("Upg. advised", "Module update recommended") +#define TR_MODULE_UPGRADE_ALERT TR3("Upg. needed", "Module upgrade required", "Modul\nUpdate nötig") +#define TR_MODULE_UPGRADE TR("Upg. advised", "Modulupdate empfohlen") #define TR_REBIND "Rebinding required" #define TR_REG_OK "Registration ok" #define TR_BIND_OK "Bind successful" -#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" -#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" -#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON" -#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF" +#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem AN" +#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem AUS" +#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem AN" +#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem AUS" #define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid") #define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status") #define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Proto Sync Status") @@ -677,18 +677,18 @@ #define TR_VOLTAGE TR(INDENT "Spg", INDENT "Spannungsquelle") //9XR-Pro #define TR_CURRENT TR(INDENT "Strom", INDENT "Stromquelle") #define TR_SELECT_MODEL "Modell auswählen" -#define TR_CREATE_CATEGORY "Modelltyp erzeugen" +#define TR_CREATE_CATEGORY "Modelltyp erstellen" #define TR_RENAME_CATEGORY "Modelltyp umbenennen" #define TR_DELETE_CATEGORY "Modelltyp löschen" -#define TR_CREATE_MODEL "Neues Modell" +#define TR_CREATE_MODEL TR("Neues Modell" , "Neues Modell erstellen") #define TR_DUPLICATE_MODEL "Kopiere Modell" #define TR_COPY_MODEL "Kopiere Modell" #define TR_MOVE_MODEL "Verschiebe Modell" #define TR_BACKUP_MODEL "Modell auf SD-Karte" //9XR-Pro -#define TR_DELETE_MODEL "Modell löschen" // TODO merged into DELETEMODEL? +#define TR_DELETE_MODEL "Lösche Modell" // TODO merged into DELETEMODEL? #define TR_RESTORE_MODEL TR("Modell wiederher.", "Modell wiederherstellen") -#define TR_DELETE_ERROR "Fehler beim Löschen" -#define TR_CAT_NOT_EMPTY "Kategorie nicht leer" +#define TR_DELETE_ERROR "Fehler beim\nLöschen" +#define TR_CAT_NOT_EMPTY "Modelltyp nicht leer" #define TR_SDCARD_ERROR "SD-Kartenfehler" #define TR_NO_SDCARD "Keine SD-Karte" #define TR_WAITING_FOR_RX "Waiting for RX..." @@ -820,19 +820,19 @@ #define TR_MIXERS_MONITOR "==>Mischer Monitor" #define TR_PATH_TOO_LONG "Pfad zu Lang" #define TR_VIEW_TEXT "View Text" -#define TR_FLASH_BOOTLOADER TR("Flash bootloader","Flash bootloader selbst") // +#define TR_FLASH_BOOTLOADER TR("Flash bootloader","Flash bootloader") // #define TR_FLASH_EXTERNAL_DEVICE TR("Flash ext. Gerät","Flash externes Gerät") #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" -#define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module") +#define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetoothmodul") #define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Flash pwr mngt unit", "Flash power management unit") #define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ") #define TR_FLASH_INTERNAL_MODULE TR("Flash int. XJT","Flash internes XJT-Modul") -#define TR_FLASH_INTERNAL_MULTI TR("Flash Int. Multi", "Flash Internal Multi") -#define TR_FLASH_EXTERNAL_MODULE TR("Flash ext. mod","Flash extern module") -#define TR_FLASH_EXTERNAL_MULTI TR("Flash Ext. Multi", "Flash External Multi") -#define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware update error") -#define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" -#define TR_WRITING "Writing..." +#define TR_FLASH_INTERNAL_MULTI TR("Flash Int. Multi", "Flash int. Multimodul") +#define TR_FLASH_EXTERNAL_MODULE TR("Flash ext. mod","Flash ext. Modul") +#define TR_FLASH_EXTERNAL_MULTI TR("Flash Ext. Multi", "Flash ext. Multimodul") +#define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware Updatefehler") +#define TR_FIRMWARE_UPDATE_SUCCESS TR3("Flash successful","Flash successful","Update erfolgreich") +#define TR_WRITING "Schreibe..." #define TR_CONFIRM_FORMAT "Formatieren bestätigen?" #define TR_INTERNALRF "Internes HF-Modul" #define TR_INTERNAL_MODULE TR("Int. module","Internal module") @@ -961,15 +961,15 @@ #define TR_PRESET "Preset" #define TR_MIRROR "Spiegeln" #define TR_CLEAR "Löschen" -#define TR_RESET TR("Servowert reset","Servowerte rücksetzen") +#define TR_RESET TR("Servowert reset","Servowerte zurücksetzen") #define TR_RESET_SUBMENU TR("Reset Werte ==>", "Reset=>Timer Flug Telem") #define TR_COUNT "Punkte" #define TR_PT "Pt" #define TR_PTS "Pts" #define TR_SMOOTH "Runden" -#define TR_COPY_STICKS_TO_OFS TR("Copy Stk ->Subtrim", "Kopie Stick to Servo-Mitte") -#define TR_COPY_MIN_MAX_TO_OUTPUTS TR("Cpy min/max to all", "Copy min/max/center to all outputs") -#define TR_COPY_TRIMS_TO_OFS TR("Copy Trim->Subtrim", "Kopie Trimm to Servo-Mitte") // "Trim to Subtrim" +#define TR_COPY_STICKS_TO_OFS TR3("Copy Stk ->Subtrim", "Kopiere Stick zu Subtrim", "Kopiere Knüppelposition auf Subtrim") +#define TR_COPY_MIN_MAX_TO_OUTPUTS TR3("Cpy min/max to all", "Kopiere min/max zu allen" , "Kopiere Limits & Mitte auf alle Kanäle") +#define TR_COPY_TRIMS_TO_OFS TR3("Copy Trim->Subtrim", "Kopiere Trimm zu Subtrim" , "Kopiere Trimmposition auf Subtrim") // "Trim to Subtrim" #define TR_INCDEC "Inc/Decrement" #define TR_GLOBALVAR "Global Var" #define TR_MIXSOURCE "Mixer Quelle" From 3919e1dec8d1a495d65d39d5820aecb007700826 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 25 Feb 2020 09:32:13 +0100 Subject: [PATCH 141/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 66a04772f..7c3c5f652 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1701,3 +1701,4 @@ Benoit Pichereau Darko Perković Burt Pickard-Richardson Roland Nittby +Frank Barbas From a83bd2742db7fd5f0d8621171e66fb9a3ae67964 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 25 Feb 2020 09:46:47 +0100 Subject: [PATCH 142/560] TX16S v2.2 prep --- radio/src/targets/horus/hal.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index f5692a8c7..350ca595e 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -118,8 +118,13 @@ #define SWITCHES_GPIO_PIN_E_L GPIO_Pin_3 // PE.03 #define STORAGE_SWITCH_F #define HARDWARE_SWITCH_F +#if defined(RADIO_TX16S) +#define SWITCHES_GPIO_REG_F GPIOC->IDR +#define SWITCHES_GPIO_PIN_F GPIO_Pin_13 // PC.13 +#else #define SWITCHES_GPIO_REG_F GPIOH->IDR #define SWITCHES_GPIO_PIN_F GPIO_Pin_3 // PH.03 +#endif #define STORAGE_SWITCH_G #define HARDWARE_SWITCH_G #define SWITCHES_GPIO_REG_G_H GPIOG->IDR @@ -231,7 +236,8 @@ #define KEYS_GPIOE_PINS (GPIO_Pin_3) #define KEYS_GPIOG_PINS (SWITCHES_GPIO_PIN_D_L | SWITCHES_GPIO_PIN_G_H | SWITCHES_GPIO_PIN_G_L | SWITCHES_GPIO_PIN_H | TRIMS_GPIO_PIN_LVD) #if defined(RADIO_TX16S) - #define KEYS_GPIOH_PINS (GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15) + #define KEYS_GPIOC_PINS (GPIO_Pin_13) + #define KEYS_GPIOH_PINS (GPIO_Pin_2 | GPIO_Pin_4 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15) #else #define KEYS_GPIOH_PINS (GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15) #endif From 562ee338b1e36697519b7410ad4d731dd21b64be Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 25 Feb 2020 10:34:18 +0100 Subject: [PATCH 143/560] Touch GPIO def --- radio/src/targets/horus/board.cpp | 2 ++ radio/src/targets/horus/hal.h | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp index abdde2106..3e8ad4752 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -95,6 +95,7 @@ void boardInit() HAPTIC_RCC_AHB1Periph | INTMODULE_RCC_AHB1Periph | EXTMODULE_RCC_AHB1Periph | + I2C_TOUCH_RCC_AHB1Periph | GPS_RCC_AHB1Periph | SPORT_UPDATE_RCC_AHB1Periph, ENABLE); @@ -110,6 +111,7 @@ void boardInit() AUDIO_RCC_APB1Periph | INTMODULE_RCC_APB1Periph | EXTMODULE_RCC_APB1Periph | + I2C_TOUCH_RCC_APB1Periph | GPS_RCC_APB1Periph | BACKLIGHT_RCC_APB1Periph, ENABLE); diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 350ca595e..293759f21 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -835,6 +835,24 @@ #define TIMER_2MHz_RCC_APB1Periph RCC_APB1Periph_TIM7 #define TIMER_2MHz_TIMER TIM7 +// Touch +#if defined(TOUCHPANEL) +#define I2C_TOUCH_RCC_AHB1Periph RCC_AHB1Periph_GPIOB +#define I2C_TOUCH_RCC_APB1Periph RCC_APB1Periph_I2C1 +#define I2C_TOUCH I2C1 +#define I2C_TOUCH_GPIO GPIOB +#define I2C_TOUCH_SCL_GPIO_PIN GPIO_Pin_8 // PB.08 +#define I2C_TOUCH_SDA_GPIO_PIN GPIO_Pin_7 // PB.07 + +#define I2C_TOUCH_RESET_GPIO GPIOF +#define I2C_TOUCH_RESET_GPIO_PIN GPIO_Pin_10 // PF.10 +#define I2C_TOUCH_INT_GPIO GPIOH +#define I2C_TOUCH_INT_GPIO_PIN GPIO_Pin_3 // PH.03 +#else +#define I2C_TOUCH_RCC_AHB1Periph 0 +#define I2C_TOUCH_RCC_APB1Periph 0 +#endif + // Bluetooth #define STORAGE_BLUETOOTH #if defined(BLUETOOTH) From d2b5591b698e8470751ba6d8d767aad85827ed1d Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 26 Feb 2020 09:46:10 +0100 Subject: [PATCH 144/560] TX16S pcbrev 2.3 --- radio/src/targets/horus/hal.h | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 293759f21..748d66d3c 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -41,8 +41,8 @@ #elif defined(RADIO_TX16S) #define KEYS_GPIO_REG_ENTER GPIOI->IDR #define KEYS_GPIO_PIN_ENTER GPIO_Pin_8 // PI.08 - #define KEYS_GPIO_REG_PGUP GPIOH->IDR - #define KEYS_GPIO_PIN_PGUP GPIO_Pin_2 // PH.02 + #define KEYS_GPIO_REG_PGUP GPIOC->IDR + #define KEYS_GPIO_PIN_PGUP GPIO_Pin_13 // PC.13 #define KEYS_GPIO_REG_PGDN GPIOI->IDR #define KEYS_GPIO_PIN_PGDN GPIO_Pin_11 // PI.11 #define KEYS_GPIO_REG_UP GPIOI->IDR @@ -118,13 +118,8 @@ #define SWITCHES_GPIO_PIN_E_L GPIO_Pin_3 // PE.03 #define STORAGE_SWITCH_F #define HARDWARE_SWITCH_F -#if defined(RADIO_TX16S) -#define SWITCHES_GPIO_REG_F GPIOC->IDR -#define SWITCHES_GPIO_PIN_F GPIO_Pin_13 // PC.13 -#else #define SWITCHES_GPIO_REG_F GPIOH->IDR #define SWITCHES_GPIO_PIN_F GPIO_Pin_3 // PH.03 -#endif #define STORAGE_SWITCH_G #define HARDWARE_SWITCH_G #define SWITCHES_GPIO_REG_G_H GPIOG->IDR @@ -237,7 +232,6 @@ #define KEYS_GPIOG_PINS (SWITCHES_GPIO_PIN_D_L | SWITCHES_GPIO_PIN_G_H | SWITCHES_GPIO_PIN_G_L | SWITCHES_GPIO_PIN_H | TRIMS_GPIO_PIN_LVD) #if defined(RADIO_TX16S) #define KEYS_GPIOC_PINS (GPIO_Pin_13) - #define KEYS_GPIOH_PINS (GPIO_Pin_2 | GPIO_Pin_4 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15) #else #define KEYS_GPIOH_PINS (GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15) #endif @@ -847,7 +841,7 @@ #define I2C_TOUCH_RESET_GPIO GPIOF #define I2C_TOUCH_RESET_GPIO_PIN GPIO_Pin_10 // PF.10 #define I2C_TOUCH_INT_GPIO GPIOH -#define I2C_TOUCH_INT_GPIO_PIN GPIO_Pin_3 // PH.03 +#define I2C_TOUCH_INT_GPIO_PIN GPIO_Pin_2 // PH.02 #else #define I2C_TOUCH_RCC_AHB1Periph 0 #define I2C_TOUCH_RCC_APB1Periph 0 From ec693f1b65ee243844a2629e55438f63063c6d00 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 26 Feb 2020 10:08:04 +0100 Subject: [PATCH 145/560] Compile fixes --- radio/src/targets/horus/hal.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 748d66d3c..f3a5e2fda 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -227,14 +227,13 @@ #define KEYS_GPIOJ_PINS (SWITCHES_GPIO_PIN_D_H | TRIMS_GPIO_PIN_RVU | TRIMS_GPIO_PIN_LVD | TRIMS_GPIO_PIN_LVU | TRIMS_GPIO_PIN_RSD) #elif defined(PCBX10) #define KEYS_GPIOB_PINS (GPIO_Pin_12 | GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_8 | GPIO_Pin_9) +#if defined(RADIO_TX16S) + #define KEYS_GPIOC_PINS (GPIO_Pin_13) +#endif #define KEYS_GPIOD_PINS (GPIO_Pin_11 | GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_13) #define KEYS_GPIOE_PINS (GPIO_Pin_3) #define KEYS_GPIOG_PINS (SWITCHES_GPIO_PIN_D_L | SWITCHES_GPIO_PIN_G_H | SWITCHES_GPIO_PIN_G_L | SWITCHES_GPIO_PIN_H | TRIMS_GPIO_PIN_LVD) -#if defined(RADIO_TX16S) - #define KEYS_GPIOC_PINS (GPIO_Pin_13) -#else #define KEYS_GPIOH_PINS (GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15) -#endif #define KEYS_GPIOI_PINS (GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_11 | GPIO_Pin_15) #define KEYS_GPIOJ_PINS (SWITCHES_GPIO_PIN_D_H | TRIMS_GPIO_PIN_LVU | TRIMS_GPIO_PIN_RVD | TRIMS_GPIO_PIN_RVU | GPIO_Pin_8) #endif From 177b379c28b07c6738850634e24da975c967aca4 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 26 Feb 2020 11:44:47 +0100 Subject: [PATCH 146/560] Cosmetics --- radio/src/targets/horus/hal.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index f3a5e2fda..ed5422834 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -829,7 +829,7 @@ #define TIMER_2MHz_TIMER TIM7 // Touch -#if defined(TOUCHPANEL) +#if defined(HARDWARE_TOUCH) #define I2C_TOUCH_RCC_AHB1Periph RCC_AHB1Periph_GPIOB #define I2C_TOUCH_RCC_APB1Periph RCC_APB1Periph_I2C1 #define I2C_TOUCH I2C1 From bb0412b11da22b528eccf60619b1a4abf0f1dfca Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 28 Feb 2020 09:31:24 +0100 Subject: [PATCH 147/560] Add T5/T6 to Companion for relevant radios (#7415) * Hopefully correct ui * Continued * Cosmetics * Prevent crashes * Fix T5/T6 not saving * Windows compilation fix * Add sliders for T5/T6 * Cosmetics Co-authored-by: Andre Bernet --- companion/src/modeledit/flightmode.ui | 356 ++++++++++++++++-------- companion/src/modeledit/flightmodes.cpp | 24 +- 2 files changed, 260 insertions(+), 120 deletions(-) diff --git a/companion/src/modeledit/flightmode.ui b/companion/src/modeledit/flightmode.ui index ab279a437..f3dff650e 100644 --- a/companion/src/modeledit/flightmode.ui +++ b/companion/src/modeledit/flightmode.ui @@ -58,7 +58,7 @@ - + Qt::Horizontal @@ -85,24 +85,18 @@ - - - - - 0 - 0 - - + + Qt::Horizontal - - QSlider::TicksBothSides + + + 40 + 20 + - - 25 - - + @@ -136,25 +130,6 @@ - - - - - 0 - 0 - - - - Qt::Horizontal - - - QSlider::TicksBothSides - - - 25 - - - @@ -166,16 +141,6 @@ - - - - trim1 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - @@ -284,11 +249,59 @@ + + + + trim1 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + Qt::Horizontal + + + QSlider::TicksBothSides + + + 25 + + + + + + + + 0 + 0 + + + + Qt::Horizontal + + + QSlider::TicksBothSides + + + 25 + + + @@ -299,7 +312,7 @@ - + @@ -310,65 +323,6 @@ - - - - trim3 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - Qt::AlignCenter - - - true - - - -896 - - - 896 - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - @@ -418,23 +372,201 @@ + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + Qt::AlignCenter + + + true + + + -896 + + + 896 + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + trim3 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + - - + + + + + + trim6 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + Qt::AlignCenter + + + true + + + -896 + + + 896 + + + + + + + + + Qt::Vertical + + + QSizePolicy::Minimum + + + + 20 + 40 + + + + + + + + Qt::Horizontal - - - 40 - 20 - + + QSlider::TicksBothSides - + + 25 + + + + + + + Qt::Horizontal + + + QSlider::TicksBothSides + + + 25 + + + + + + + + + trim5 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + Qt::AlignCenter + + + true + + + -896 + + + 896 + + + + + + + + + Qt::Vertical + + + QSizePolicy::Minimum + + + + 20 + 40 + + + + + diff --git a/companion/src/modeledit/flightmodes.cpp b/companion/src/modeledit/flightmodes.cpp index e1b01c1a9..53f5d7585 100644 --- a/companion/src/modeledit/flightmodes.cpp +++ b/companion/src/modeledit/flightmodes.cpp @@ -80,20 +80,28 @@ FlightModePanel::FlightModePanel(QWidget * parent, ModelData & model, int phaseI } // The trims - QString labels[CPN_MAX_STICKS]; + QString labels[CPN_MAX_TRIMS]; for(int i=0; i < CPN_MAX_STICKS; i++) { labels[i] = firmware->getAnalogInputName(i); } + labels[4] = "T5"; + labels[5] = "T6"; - - trimsLabel << ui->trim1Label << ui->trim2Label << ui->trim3Label << ui->trim4Label; - trimsUse << ui->trim1Use << ui->trim2Use << ui->trim3Use << ui->trim4Use; - trimsValue << ui->trim1Value << ui->trim2Value << ui->trim3Value << ui->trim4Value; - trimsSlider << ui->trim1Slider << ui->trim2Slider << ui->trim3Slider << ui->trim4Slider; + trimsLabel << ui->trim1Label << ui->trim2Label << ui->trim3Label << ui->trim4Label << ui->trim5Label << ui->trim6Label; + trimsUse << ui->trim1Use << ui->trim2Use << ui->trim3Use << ui->trim4Use << ui->trim5Use << ui->trim6Use; + trimsValue << ui->trim1Value << ui->trim2Value << ui->trim3Value << ui->trim4Value << ui->trim5Value << ui->trim6Value; + trimsSlider << ui->trim1Slider << ui->trim2Slider << ui->trim3Slider << ui->trim4Slider << ui->trim5Slider << ui->trim6Slider; Board::Type board = firmware->getBoard(); - for (int i=0; i<4; i++) { + for (int i = getBoardCapability(board,Board::NumTrims); i < CPN_MAX_TRIMS; i++) { + trimsLabel[i]->hide(); + trimsUse[i]->hide(); + trimsValue[i]->hide(); + trimsSlider[i]->hide(); + } + + for (int i = 0; i < getBoardCapability(board,Board::NumTrims); i++) { trimsLabel[i]->setText(labels[CONVERT_MODE(i+1)-1]); QComboBox * cb = trimsUse[i]; @@ -293,7 +301,7 @@ void FlightModePanel::update() ui->fadeIn->setValue(float(phase.fadeIn)/scale); ui->fadeOut->setValue(float(phase.fadeOut)/scale); - for (int i=0; i<4; i++) { + for (int i = 0; i < getBoardCapability(firmware->getBoard(), Board::NumTrims); i++) { int trimsMax = firmware->getCapability(ExtendedTrimsRange); if (trimsMax == 0 || !model->extendedTrims) { trimsMax = firmware->getCapability(TrimsRange); From ec56892de618a66e679e565cb68c9559c783f0d0 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 1 Mar 2020 09:48:13 +0100 Subject: [PATCH 148/560] Update CREDITS.txt --- CREDITS.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index 7c3c5f652..52e7ad5f4 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1702,3 +1702,5 @@ Darko Perković Burt Pickard-Richardson Roland Nittby Frank Barbas +Scott McCoy +Fabrice Debonnet From 6b5f6bc8170062982de57131140d3db440becb69 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 7 Mar 2020 10:47:10 +0100 Subject: [PATCH 149/560] Reset ISRM upgrade moduel counter reset when mode is changed (#7425) Reset authentication counter on ISRM mode change --- radio/src/gui/480x272/model_setup.cpp | 4 ++++ radio/src/gui/480x272/radio_power_meter.cpp | 4 ++++ radio/src/gui/480x272/radio_spectrum_analyser.cpp | 7 ++++++- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index 0b0554336..b8c01cbaa 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -1018,6 +1018,10 @@ bool menuModelSetup(event_t event) uint8_t moduleType = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].type, MODULE_TYPE_NONE, MODULE_TYPE_MAX, EE_MODEL, isInternalModuleAvailable); if (checkIncDec_Ret) { setModuleType(INTERNAL_MODULE, moduleType); +#if defined(ACCESS_LIB) + // the module will reset on mode switch, we need to reset the authentication counter + globalData.authenticationCount = 0; +#endif } } else if (isModuleXJT(INTERNAL_MODULE)) { diff --git a/radio/src/gui/480x272/radio_power_meter.cpp b/radio/src/gui/480x272/radio_power_meter.cpp index e20755ba9..f49eeb93c 100644 --- a/radio/src/gui/480x272/radio_power_meter.cpp +++ b/radio/src/gui/480x272/radio_power_meter.cpp @@ -50,6 +50,10 @@ bool menuRadioPowerMeter(event_t event) lcdDrawCenteredText(LCD_H/2, STR_STOPPING); lcdRefresh(); moduleState[g_moduleIdx].readModuleInformation(&reusableBuffer.moduleSetup.pxx2.moduleInformation, PXX2_HW_INFO_TX_ID, PXX2_HW_INFO_TX_ID); +#if defined(ACCESS_LIB) + // the module will reset on mode switch, we need to reset the authentication counter + globalData.authenticationCount = 0; +#endif /* wait 1s to resume normal operation before leaving */ watchdogSuspend(500 /*5s*/); RTOS_WAIT_MS(1000); diff --git a/radio/src/gui/480x272/radio_spectrum_analyser.cpp b/radio/src/gui/480x272/radio_spectrum_analyser.cpp index be26e58d3..39ff66e02 100644 --- a/radio/src/gui/480x272/radio_spectrum_analyser.cpp +++ b/radio/src/gui/480x272/radio_spectrum_analyser.cpp @@ -56,8 +56,13 @@ bool menuRadioSpectrumAnalyser(event_t event) if (menuEvent) { lcdDrawCenteredText(LCD_H / 2, STR_STOPPING); lcdRefresh(); - if (isModulePXX2(g_moduleIdx)) + if (isModulePXX2(g_moduleIdx)) { moduleState[g_moduleIdx].readModuleInformation(&reusableBuffer.moduleSetup.pxx2.moduleInformation, PXX2_HW_INFO_TX_ID, PXX2_HW_INFO_TX_ID); +#if defined(ACCESS_LIB) + // the module will reset on mode switch, we need to reset the authentication counter + globalData.authenticationCount = 0; +#endif + } else if (isModuleMultimodule(g_moduleIdx)) { if (reusableBuffer.spectrumAnalyser.moduleOFF) setModuleType(INTERNAL_MODULE, MODULE_TYPE_NONE); From e26abb5650ebf72fac672b04a2ea3d65a06fd0bb Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 8 Mar 2020 11:54:34 +0100 Subject: [PATCH 150/560] Fix #7428 --- radio/src/lua/api_model.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/lua/api_model.cpp b/radio/src/lua/api_model.cpp index 3d9a4e48a..b183043c7 100644 --- a/radio/src/lua/api_model.cpp +++ b/radio/src/lua/api_model.cpp @@ -1265,7 +1265,7 @@ static int luaModelSetOutput(lua_State *L) } /*luadoc -@function model.getGlobalVariable(index [, flight_mode]) +@function model.getGlobalVariable(index, flight_mode) Return current global variable value From 18e07258aadb0f6b9b3608d84d7082a2893b808c Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 8 Mar 2020 19:53:30 +0100 Subject: [PATCH 151/560] Add internalaccess firmware option to version screen --- radio/src/options.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/radio/src/options.h b/radio/src/options.h index e7ddb0caf..2afb1596b 100644 --- a/radio/src/options.h +++ b/radio/src/options.h @@ -59,6 +59,9 @@ static const char * options[] = { #if defined(INTERNAL_MODULE_MULTI) "internalmulti", #endif +#if defined(INTERNAL_MODULE_PXX2) + "internalaccess", +#endif #if defined(MULTIMODULE) "multimodule", #endif From ad188aa9160c89a4c046c58bc309d1dbcefa47d6 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 9 Mar 2020 18:45:21 +0100 Subject: [PATCH 152/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 52e7ad5f4..a710e2e02 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1704,3 +1704,4 @@ Roland Nittby Frank Barbas Scott McCoy Fabrice Debonnet +James Laver From cf5e2b3fd50b8a7276ef3fa46625203a6b3beee6 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 10 Mar 2020 17:17:59 +0100 Subject: [PATCH 153/560] 128 chan monitor (#7418) Introduce 128x64 channels monitor --- radio/src/dataconstants.h | 1 + radio/src/gui/128x64/gui.h | 6 +- radio/src/gui/128x64/lcd.h | 2 - radio/src/gui/128x64/model_curve_edit.cpp | 12 + radio/src/gui/128x64/model_failsafe.cpp | 2 +- radio/src/gui/128x64/model_input_edit.cpp | 11 + radio/src/gui/128x64/model_mix_edit.cpp | 11 + radio/src/gui/128x64/radio_calibration.cpp | 2 +- radio/src/gui/128x64/view_channels.cpp | 161 +++++---- radio/src/gui/128x64/view_main.cpp | 374 ++++++++++----------- radio/src/gui/128x64/widgets.cpp | 11 + radio/src/gui/212x64/lcd.h | 2 - radio/src/gui/212x64/model_failsafe.cpp | 2 +- radio/src/gui/212x64/radio_calibration.cpp | 2 +- radio/src/gui/212x64/view_channels.cpp | 6 +- radio/src/gui/480x272/view_text.cpp | 8 - radio/src/targets/sky9x/CMakeLists.txt | 1 + 17 files changed, 338 insertions(+), 276 deletions(-) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 836e60e88..65f12aa48 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -168,6 +168,7 @@ enum MainViews { VIEW_OUTPUTS_BARS, VIEW_INPUTS, VIEW_TIMER2, + VIEW_CHAN_MONITOR, VIEW_COUNT }; #endif diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h index 8ac31d239..d7e1538f5 100644 --- a/radio/src/gui/128x64/gui.h +++ b/radio/src/gui/128x64/gui.h @@ -235,6 +235,9 @@ void pushMenuTextView(const char *filename); void pushModelNotes(); void readModelNotes(); +void menuChannelsView(event_t event); +void menuChannelsViewCommon(event_t event); + #define CURSOR_MOVED_LEFT(event) (IS_ROTARY_LEFT(event) || EVT_KEY_MASK(event) == KEY_LEFT) #define CURSOR_MOVED_RIGHT(event) (IS_ROTARY_RIGHT(event) || EVT_KEY_MASK(event) == KEY_RIGHT) @@ -294,6 +297,7 @@ void drawProgressScreen(const char * title, const char * message, int num, int d void drawSleepBitmap(); void drawVerticalScrollbar(coord_t x, coord_t y, coord_t h, uint16_t offset, uint16_t count, uint8_t visible); +void drawGauge(coord_t x, coord_t y, coord_t w, coord_t h, int32_t val, int32_t max); void drawAlertBox(const char * title, const char * text, const char * action); void showAlertBox(const char * title, const char * text, const char * action , uint8_t sound); @@ -303,7 +307,7 @@ void showAlertBox(const char * title, const char * text, const char * action , u #define IS_MAIN_VIEW_DISPLAYED() menuHandlers[0] == menuMainView #define IS_TELEMETRY_VIEW_DISPLAYED() menuHandlers[0] == menuViewTelemetry -#define IS_OTHER_VIEW_DISPLAYED() false +#define IS_OTHER_VIEW_DISPLAYED() menuHandlers[0] == menuChannelsView void editCurveRef(coord_t x, coord_t y, CurveRef & curve, event_t event, LcdFlags flags); diff --git a/radio/src/gui/128x64/lcd.h b/radio/src/gui/128x64/lcd.h index 3e7e609ac..f1fc72810 100644 --- a/radio/src/gui/128x64/lcd.h +++ b/radio/src/gui/128x64/lcd.h @@ -114,8 +114,6 @@ void lcdDrawSizedText(coord_t x, coord_t y, const char * s, unsigned char len); void lcdDrawTextAlignedLeft(coord_t y, const char * s); void drawTimerWithMode(coord_t x, coord_t y, uint8_t index, LcdFlags att); -#define lcdDrawTextAlignedCenter(y, s) lcdDrawText((LCD_W-sizeof(s)*FW+FW+1)/2, y, s) - void lcdDrawHexNumber(coord_t x, coord_t y, uint32_t val, LcdFlags mode=0); void lcdDrawHexChar(coord_t x, coord_t y, uint8_t val, LcdFlags flags=0); diff --git a/radio/src/gui/128x64/model_curve_edit.cpp b/radio/src/gui/128x64/model_curve_edit.cpp index 188f4c868..51294e1b3 100644 --- a/radio/src/gui/128x64/model_curve_edit.cpp +++ b/radio/src/gui/128x64/model_curve_edit.cpp @@ -161,6 +161,18 @@ void menuModelCurveOne(event_t event) POPUP_MENU_START(onCurveOneMenu); } break; + +#if defined(NAVIGATION_X7) + case EVT_KEY_LONG(KEY_MENU): + pushMenu(menuChannelsView); + killEvents(event); + break; +#elif defined(NAVIGATION_XLITE) + case EVT_KEY_LONG(KEY_SHIFT): + pushMenu(menuChannelsView); + killEvents(event); + break; +#endif } drawCurve(0); diff --git a/radio/src/gui/128x64/model_failsafe.cpp b/radio/src/gui/128x64/model_failsafe.cpp index f0a926074..7648cd9f3 100644 --- a/radio/src/gui/128x64/model_failsafe.cpp +++ b/radio/src/gui/128x64/model_failsafe.cpp @@ -51,7 +51,7 @@ void menuModelFailsafe(event_t event) SIMPLE_SUBMENU_NOTITLE(sentModuleChannels(g_moduleIdx)); - lcdDrawTextAlignedCenter(0, TR_FAILSAFESET); + lcdDrawText(LCD_W / 2, 0, STR_FAILSAFESET, CENTERED); lcdInvertLine(0); for (uint8_t i=0; ichn, 0); diff --git a/radio/src/gui/128x64/model_mix_edit.cpp b/radio/src/gui/128x64/model_mix_edit.cpp index 785d8a989..681b425b4 100644 --- a/radio/src/gui/128x64/model_mix_edit.cpp +++ b/radio/src/gui/128x64/model_mix_edit.cpp @@ -85,6 +85,17 @@ 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)) { + pushMenu(menuChannelsView); + killEvents(event); + } +#elif defined(NAVIGATION_XLITE) + if (event == EVT_KEY_LONG(KEY_SHIFT)) { + pushMenu(menuChannelsView); + killEvents(event); + } +#endif MixData * md2 = mixAddress(s_currIdx) ; putsChn(PSIZE(TR_MIXES)*FW+FW, 0, md2->destCh+1,0); diff --git a/radio/src/gui/128x64/radio_calibration.cpp b/radio/src/gui/128x64/radio_calibration.cpp index a8004c7a2..3e1a30d20 100644 --- a/radio/src/gui/128x64/radio_calibration.cpp +++ b/radio/src/gui/128x64/radio_calibration.cpp @@ -179,7 +179,7 @@ void menuFirstCalib(event_t event) chainMenu(menuMainView); } else { - lcdDrawTextAlignedCenter(0*FH, TR_MENUCALIBRATION); + lcdDrawText(LCD_W / 2, 0, STR_MENUCALIBRATION, CENTERED); lcdInvertLine(0); menuCommonCalib(event); } diff --git a/radio/src/gui/128x64/view_channels.cpp b/radio/src/gui/128x64/view_channels.cpp index f13b871ce..2e3ed0a40 100644 --- a/radio/src/gui/128x64/view_channels.cpp +++ b/radio/src/gui/128x64/view_channels.cpp @@ -20,7 +20,30 @@ #include "opentx.h" -void menuChannelsView(event_t event) +constexpr coord_t CHANNEL_NAME_OFFSET = 1; +constexpr coord_t CHANNEL_VALUE_OFFSET = CHANNEL_NAME_OFFSET + 42; +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) +#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 +#define EVT_KEY_PREVIOUS_PAGE EVT_ROTARY_LEFT +#elif defined(NAVIGATION_XLITE) +#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_BREAK(KEY_UP) +#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_DOWN) +#define EVT_KEY_NEXT_PAGE EVT_KEY_BREAK(KEY_RIGHT) +#define EVT_KEY_PREVIOUS_PAGE EVT_KEY_BREAK(KEY_LEFT) +#else +#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_BREAK(KEY_UP) +#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_DOWN) +#define EVT_KEY_NEXT_PAGE EVT_KEY_BREAK(KEY_RIGHT) +#define EVT_KEY_PREVIOUS_PAGE EVT_KEY_BREAK(KEY_LEFT) +#endif + +void menuChannelsViewCommon(event_t event) { bool newLongNames = false; @@ -31,13 +54,79 @@ void menuChannelsView(event_t event) memclear(&reusableBuffer.viewChannels, sizeof(reusableBuffer.viewChannels)); break; + case EVT_KEY_FIRST(KEY_ENTER): + reusableBuffer.viewChannels.mixersView = !reusableBuffer.viewChannels.mixersView; + break; + } + + ch = 8 * (g_eeGeneral.view / ALTERNATE_VIEW); + + // Screen title + lcdDrawText(LCD_W / 2, 0, reusableBuffer.viewChannels.mixersView ? STR_MIXERS_MONITOR : STR_CHANNELS_MONITOR, CENTERED); + lcdInvertLine(0); + + int16_t limits = 512 * 2; + + // Channels + for (uint8_t line = 0; line < 8; line++) { + LimitData * ld = limitAddress(ch); + const uint8_t y = 9 + line * 7; + const int32_t val = reusableBuffer.viewChannels.mixersView ? ex_chans[ch] : channelOutputs[ch]; + const uint8_t lenLabel = ZLEN(g_model.limitData[ch].name); + + // Channel name if present, number if not + if (lenLabel > 0) { + if (lenLabel > 4) + reusableBuffer.viewChannels.longNames = true; + lcdDrawSizedText(CHANNEL_NAME_OFFSET, y, g_model.limitData[ch].name, sizeof(g_model.limitData[ch].name), ZCHAR | SMLSIZE); + } + else { + putsChn(CHANNEL_NAME_OFFSET, y, ch + 1, SMLSIZE); + } + + // Value +#if defined(PPM_UNIT_US) + lcdDrawNumber(CHANNEL_VALUE_OFFSET, y + 1, PPM_CH_CENTER(ch) + val / 2, TINSIZE | RIGHT); +#elif defined(PPM_UNIT_PERCENT_PREC1) + lcdDrawNumber(CHANNEL_VALUE_OFFSET, y + 1, calcRESXto1000(val), PREC1 | TINSIZE | RIGHT); +#else + lcdDrawNumber(CHANNEL_VALUE_OFFSET, y + 1, calcRESXto1000(val) / 10, TINSIZE | RIGHT); +#endif + + // Gauge + drawGauge(CHANNEL_GAUGE_OFFSET, y, CHANNEL_BAR_WIDTH, 6, val, limits); + + if (!reusableBuffer.viewChannels.mixersView) { + // Properties +#if defined(OVERRIDE_CHANNEL_FUNCTION) + if (safetyCh[ch] != OVERRIDE_CHANNEL_UNDEFINED) + lcdDrawText(CHANNEL_PROPERTIES_OFFSET, y, "OVR", TINSIZE); + else +#endif + if (ld && ld->revert) { + lcdDrawText(CHANNEL_PROPERTIES_OFFSET, y, "INV", TINSIZE); + } + } + + ++ch; + } + + reusableBuffer.viewChannels.longNames = newLongNames; +} + +void menuChannelsView(event_t event) +{ + switch (event) { case EVT_KEY_BREAK(KEY_EXIT): popMenu(); break; - case EVT_KEY_FIRST(KEY_RIGHT): - case EVT_KEY_FIRST(KEY_LEFT): - reusableBuffer.viewChannels.secondPage = !reusableBuffer.viewChannels.secondPage; + case EVT_KEY_NEXT_PAGE: + g_eeGeneral.view = (g_eeGeneral.view + (4 * ALTERNATE_VIEW) + ALTERNATE_VIEW) % (4 * ALTERNATE_VIEW); + break; + + case EVT_KEY_PREVIOUS_PAGE: + g_eeGeneral.view = (g_eeGeneral.view + (4 * ALTERNATE_VIEW) - ALTERNATE_VIEW) % (4 * ALTERNATE_VIEW); break; case EVT_KEY_FIRST(KEY_ENTER): @@ -45,67 +134,5 @@ void menuChannelsView(event_t event) break; } - if (reusableBuffer.viewChannels.secondPage) - ch = 16; - else - ch = 0; - - if (reusableBuffer.viewChannels.mixersView) { - lcdDrawTextAlignedCenter(0, TR_MIXERS_MONITOR); - } - else { - lcdDrawTextAlignedCenter(0, TR_CHANNELS_MONITOR); - } - - lcdInvertLine(0); - - // Column separator - lcdDrawSolidVerticalLine(LCD_W/2, FH, LCD_H-FH); - - for (uint8_t col=0; col<2; col++) { - - uint8_t x = col*LCD_W/2+1; - - // Channels - for (uint8_t line=0; line<8; line++) { - uint8_t y = 9+line*7; - int32_t val = (reusableBuffer.viewChannels.mixersView) ? ex_chans[ch] : channelOutputs[ch]; - uint8_t ofs = (col ? 0 : 1); - - // Channel name if present, number if not - uint8_t lenLabel = ZLEN(g_model.limitData[ch].name); - if (lenLabel > 4) { - newLongNames = reusableBuffer.viewChannels.longNames = true; - } - - if (lenLabel > 0) - lcdDrawSizedText(x+1-ofs, y, g_model.limitData[ch].name, sizeof(g_model.limitData[ch].name), ZCHAR | SMLSIZE); - else - putsChn(x+1-ofs, y, ch+1, SMLSIZE); - - // Value -#if defined(PPM_UNIT_US) - uint8_t wbar = (reusableBuffer.viewChannels.longNames ? 54 : 64); - lcdDrawNumber(x+LCD_W/2-3-wbar-ofs, y+1, PPM_CH_CENTER(ch)+val/2, TINSIZE|RIGHT); -#elif defined(PPM_UNIT_PERCENT_PREC1) - uint8_t wbar = (reusableBuffer.viewChannels.longNames ? 48 : 58); - lcdDrawNumber(x+LCD_W/2-3-wbar-ofs, y+1, calcRESXto1000(val), PREC1|TINSIZE|RIGHT); -#else - uint8_t wbar = (reusableBuffer.viewChannels.longNames ? 54 : 64); - lcdDrawNumber(x+LCD_W/2-3-wbar-ofs, y+1, calcRESXto1000(val)/10, TINSIZE|RIGHT); -#endif - - // Gauge -// uint16_t lim = (g_model.extendedLimits ? (512 * (long)LIMIT_EXT_PERCENT / 100) : 512) * 2; -//#ifdef MIXERS_MONITOR -// if (mixersView) -// lim = 512 * 2 * 2; -//#endif - // TODO ? drawGauge(x+LCD_W/2-3-wbar-ofs, y, wbar, 6, val, lim); - - ch++; - } - } - - reusableBuffer.viewChannels.longNames = newLongNames; + menuChannelsViewCommon(event); } diff --git a/radio/src/gui/128x64/view_main.cpp b/radio/src/gui/128x64/view_main.cpp index b1ab8cd79..b5f067162 100644 --- a/radio/src/gui/128x64/view_main.cpp +++ b/radio/src/gui/128x64/view_main.cpp @@ -56,7 +56,7 @@ void drawExternalAntennaAndRSSI() { #if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA) if (isModuleXJT(INTERNAL_MODULE) && isExternalAntennaEnabled()) { - lcdDrawText(VBATT_X-1, VBATT_Y+8, "E", TINSIZE); + lcdDrawText(VBATT_X - 1, VBATT_Y + 8, "E", TINSIZE); } #endif @@ -75,10 +75,10 @@ void drawExternalAntennaAndRSSI() void drawPotsBars() { // Optimization by Mike Blandford - for (uint8_t x=LCD_W/2 - (NUM_POTS+NUM_SLIDERS-1) * 5 / 2, i=NUM_STICKS; i TRIM_MAX) { exttrim = true; } - if (val < -(TRIM_LEN+1)*4) { - val = -(TRIM_LEN+1); + if (val < -(TRIM_LEN + 1) * 4) { + val = -(TRIM_LEN + 1); } - else if (val > (TRIM_LEN+1)*4) { - val = TRIM_LEN+1; + else if (val > (TRIM_LEN + 1) * 4) { + val = TRIM_LEN + 1; } else { val /= 4; @@ -129,65 +129,65 @@ void displayTrims(uint8_t phase) if (vert[i]) { ym = 31; - lcdDrawSolidVerticalLine(xm, ym-TRIM_LEN, TRIM_LEN*2); - if (i!=2 || !g_model.thrTrim) { - lcdDrawSolidVerticalLine(xm-1, ym-1, 3); - lcdDrawSolidVerticalLine(xm+1, ym-1, 3); + lcdDrawSolidVerticalLine(xm, ym - TRIM_LEN, TRIM_LEN * 2); + if (i != 2 || !g_model.thrTrim) { + lcdDrawSolidVerticalLine(xm - 1, ym - 1, 3); + lcdDrawSolidVerticalLine(xm + 1, ym - 1, 3); } ym -= val; - lcdDrawFilledRect(xm-3, ym-3, 7, 7, SOLID, att|ERASE); + lcdDrawFilledRect(xm - 3, ym - 3, 7, 7, SOLID, att | ERASE); if (dir >= 0) { - lcdDrawSolidHorizontalLine(xm-1, ym-1, 3); + lcdDrawSolidHorizontalLine(xm - 1, ym - 1, 3); } if (dir <= 0) { - lcdDrawSolidHorizontalLine(xm-1, ym+1, 3); + lcdDrawSolidHorizontalLine(xm - 1, ym + 1, 3); } if (exttrim) { - lcdDrawSolidHorizontalLine(xm-1, ym, 3); + lcdDrawSolidHorizontalLine(xm - 1, ym, 3); } if (g_model.displayTrims != DISPLAY_TRIMS_NEVER && dir != 0) { - if (g_model.displayTrims == DISPLAY_TRIMS_ALWAYS || (trimsDisplayTimer > 0 && (trimsDisplayMask & (1<0 ? 12 : 40, xm-2, -abs(dir), TINSIZE|VERTICAL); + if (g_model.displayTrims == DISPLAY_TRIMS_ALWAYS || (trimsDisplayTimer > 0 && (trimsDisplayMask & (1 << i)))) { + lcdDrawNumber(dir > 0 ? 12 : 40, xm - 2, -abs(dir), TINSIZE | VERTICAL); } } } else { ym = 60; - lcdDrawSolidHorizontalLine(xm-TRIM_LEN, ym, TRIM_LEN*2); - lcdDrawSolidHorizontalLine(xm-1, ym-1, 3); - lcdDrawSolidHorizontalLine(xm-1, ym+1, 3); + lcdDrawSolidHorizontalLine(xm - TRIM_LEN, ym, TRIM_LEN * 2); + lcdDrawSolidHorizontalLine(xm - 1, ym - 1, 3); + lcdDrawSolidHorizontalLine(xm - 1, ym + 1, 3); xm += val; - lcdDrawFilledRect(xm-3, ym-3, 7, 7, SOLID, att|ERASE); + lcdDrawFilledRect(xm - 3, ym - 3, 7, 7, SOLID, att | ERASE); if (dir >= 0) { - lcdDrawSolidVerticalLine(xm+1, ym-1, 3); + lcdDrawSolidVerticalLine(xm + 1, ym - 1, 3); } if (dir <= 0) { - lcdDrawSolidVerticalLine(xm-1, ym-1, 3); + lcdDrawSolidVerticalLine(xm - 1, ym - 1, 3); } if (exttrim) { - lcdDrawSolidVerticalLine(xm, ym-1, 3); + lcdDrawSolidVerticalLine(xm, ym - 1, 3); } if (g_model.displayTrims != DISPLAY_TRIMS_NEVER && dir != 0) { - if (g_model.displayTrims == DISPLAY_TRIMS_ALWAYS || (trimsDisplayTimer > 0 && (trimsDisplayMask & (1<0 ? TRIM_LH_POS : TRIM_LH_NEG) : (dir>0 ? TRIM_RH_POS : TRIM_RH_NEG)), ym-2, -abs(dir), TINSIZE); + if (g_model.displayTrims == DISPLAY_TRIMS_ALWAYS || (trimsDisplayTimer > 0 && (trimsDisplayMask & (1 << i)))) { + lcdDrawNumber((stickIndex == 0 ? (dir > 0 ? TRIM_LH_POS : TRIM_LH_NEG) : (dir > 0 ? TRIM_RH_POS : TRIM_RH_NEG)), ym - 2, -abs(dir), TINSIZE); } } } - lcdDrawSquare(xm-3, ym-3, 7, att); + lcdDrawSquare(xm - 3, ym - 3, 7, att); } } void displayBattVoltage() { #if defined(BATTGRAPH) - putsVBat(VBATT_X-8, VBATT_Y+1, RIGHT); - lcdDrawSolidFilledRect(VBATT_X-25, VBATT_Y+9, 21, 5); - lcdDrawSolidVerticalLine(VBATT_X-4, VBATT_Y+10, 3); + putsVBat(VBATT_X - 8, VBATT_Y + 1, RIGHT); + lcdDrawSolidFilledRect(VBATT_X - 25, VBATT_Y + 9, 21, 5); + lcdDrawSolidVerticalLine(VBATT_X - 4, VBATT_Y + 10, 3); uint8_t count = GET_TXBATT_BARS(20); - for (uint8_t i=0; i= 0) { lcdDrawSolidHorizontalLine(x, y, width); - lcdDrawSolidHorizontalLine(x, y+2, width); + lcdDrawSolidHorizontalLine(x, y + 2, width); y += 4; if (val > 0) { lcdDrawSolidHorizontalLine(x, y, width); - lcdDrawSolidHorizontalLine(x, y+2, width); + lcdDrawSolidHorizontalLine(x, y + 2, width); y += 4; } } - lcdDrawChar(width==5 ? x+1 : x, y, 'A'+index, SMLSIZE); + lcdDrawChar(width == 5 ? x + 1 : x, y, 'A' + index, SMLSIZE); y += 7; if (val <= 0) { lcdDrawSolidHorizontalLine(x, y, width); - lcdDrawSolidHorizontalLine(x, y+2, width); + lcdDrawSolidHorizontalLine(x, y + 2, width); if (val < 0) { - lcdDrawSolidHorizontalLine(x, y+4, width); - lcdDrawSolidHorizontalLine(x, y+6, width); + lcdDrawSolidHorizontalLine(x, y + 4, width); + lcdDrawSolidHorizontalLine(x, y + 6, width); } } } @@ -320,25 +320,20 @@ void menuMainView(event_t event) killEvents(KEY_DOWN); break; - /* TODO if timer2 is OFF, it's possible to use this timer2 as in er9x... - case EVT_KEY_BREAK(KEY_MENU): - if (view_base == VIEW_TIMER2) { - Timer2_running = !Timer2_running; - AUDIO_KEY_PRESS(); - } - break; - */ - + /* TODO if timer2 is OFF, it's possible to use this timer2 as in er9x... + case EVT_KEY_BREAK(KEY_MENU): + if (view_base == VIEW_TIMER2) { + Timer2_running = !Timer2_running; + AUDIO_KEY_PRESS(); + } + break; + */ case EVT_KEY_NEXT_PAGE: case EVT_KEY_PREVIOUS_PAGE: - if (view_base <= VIEW_INPUTS) { - if (view_base == VIEW_INPUTS) - g_eeGeneral.view ^= ALTERNATE_VIEW; - else - g_eeGeneral.view = (g_eeGeneral.view + (4*ALTERNATE_VIEW) + ((event==EVT_KEY_PREVIOUS_PAGE) ? -ALTERNATE_VIEW : ALTERNATE_VIEW)) % (4*ALTERNATE_VIEW); - storageDirty(EE_GENERAL); - AUDIO_KEY_PRESS(); - } + if (view_base == VIEW_INPUTS) + g_eeGeneral.view ^= ALTERNATE_VIEW; + else + g_eeGeneral.view = (g_eeGeneral.view + (4*ALTERNATE_VIEW) + ((event==EVT_KEY_PREVIOUS_PAGE) ? -ALTERNATE_VIEW : ALTERNATE_VIEW)) % (4*ALTERNATE_VIEW); break; case EVT_KEY_CONTEXT_MENU: @@ -379,12 +374,13 @@ void menuMainView(event_t event) case EVT_KEY_PREVIOUS_VIEW: case EVT_KEY_NEXT_VIEW: // TODO try to split those 2 cases on 9X - g_eeGeneral.view = (event == EVT_KEY_PREVIOUS_VIEW ? (view_base == VIEW_COUNT-1 ? 0 : view_base+1) : (view_base == 0 ? VIEW_COUNT-1 : view_base-1)); + g_eeGeneral.view = (event == EVT_KEY_PREVIOUS_VIEW ? (view_base == VIEW_COUNT - 1 ? 0 : view_base + 1) : (view_base == 0 ? VIEW_COUNT - 1 : view_base - + 1)); storageDirty(EE_GENERAL); break; #else case EVT_KEY_NEXT_VIEW: - g_eeGeneral.view = (view_base == 0 ? VIEW_COUNT-1 : view_base-1); + g_eeGeneral.view = (view_base == 0 ? VIEW_COUNT - 1 : view_base - 1); storageDirty(EE_GENERAL); break; #endif @@ -410,53 +406,34 @@ void menuMainView(event_t event) break; } - { - // Flight Mode Name - uint8_t mode = mixerCurrentFlightMode; - lcdDrawSizedText(PHASE_X, PHASE_Y, g_model.flightModeData[mode].name, sizeof(g_model.flightModeData[mode].name), ZCHAR|PHASE_FLAGS); + switch (view_base) { + case VIEW_CHAN_MONITOR: + menuChannelsViewCommon(event); + break; - // Model Name - putsModelName(MODELNAME_X, MODELNAME_Y, g_model.header.name, g_eeGeneral.currModel, BIGSIZE); + case VIEW_OUTPUTS_VALUES: + case VIEW_OUTPUTS_BARS: + // scroll bar + lcdDrawHorizontalLine(38, 34, 54, DOTTED); + lcdDrawSolidHorizontalLine(38 + (g_eeGeneral.view / ALTERNATE_VIEW) * 13, 34, 13, SOLID); + for (uint8_t i=0; i<8; i++) { + uint8_t x0, y0; + uint8_t chan = 8 * (g_eeGeneral.view / ALTERNATE_VIEW) + i; + int16_t val = channelOutputs[chan]; - // Main Voltage (or alarm if any) - displayVoltageOrAlarm(); - - // Timer 1 - drawTimerWithMode(125, 2*FH, 0, RIGHT | DBLSIZE); - - // Trims sliders - displayTrims(mode); - - // RSSI gauge / external antenna - drawExternalAntennaAndRSSI(); - } - - if (view_base < VIEW_INPUTS) { - // scroll bar - lcdDrawHorizontalLine(38, 34, 54, DOTTED); - lcdDrawSolidHorizontalLine(38 + (g_eeGeneral.view / ALTERNATE_VIEW) * 13, 34, 13, SOLID); - - for (uint8_t i=0; i<8; i++) { - uint8_t x0,y0; - uint8_t chan = 8*(g_eeGeneral.view / ALTERNATE_VIEW) + i; - - int16_t val = channelOutputs[chan]; - - switch (view_base) { - case VIEW_OUTPUTS_VALUES: - x0 = (i%4*9+3)*FW/2; - y0 = i/4*FH+40; + if (view_base == VIEW_OUTPUTS_VALUES) { + x0 = (i % 4 * 9 + 3) * FW / 2; + y0 = i / 4 * FH + 40; #if defined(PPM_UNIT_US) - lcdDrawNumber(x0+4*FW , y0, PPM_CH_CENTER(chan)+val/2, RIGHT); + lcdDrawNumber(x0 + 4 * FW, y0, PPM_CH_CENTER(chan) + val / 2, RIGHT); #elif defined(PPM_UNIT_PERCENT_PREC1) - lcdDrawNumber(x0+4*FW , y0, calcRESXto1000(val), RIGHT|PREC1); + lcdDrawNumber(x0 + 4 * FW, y0, calcRESXto1000(val), RIGHT | PREC1); #else lcdDrawNumber(x0+4*FW , y0, calcRESXto1000(val)/10, RIGHT); // G: Don't like the decimal part* #endif - break; - - case VIEW_OUTPUTS_BARS: -#define WBAR2 (50/2) + } + else { + constexpr coord_t WBAR2 = (50/2); x0 = i<4 ? LCD_W/4+2 : LCD_W*3/4-2; y0 = 38+(i%4)*5; @@ -473,99 +450,121 @@ void menuMainView(event_t event) x0 -= len; lcdDrawSolidHorizontalLine(x0, y0+1, len); lcdDrawSolidHorizontalLine(x0, y0-1, len); - break; + } } - } - } - else if (view_base == VIEW_INPUTS) { - if (view == VIEW_INPUTS) { - // Sticks + Pots - doMainScreenGraphics(); + break; - // Switches + case VIEW_TIMER2: + drawTimerWithMode(87, 5 * FH, 1, RIGHT | DBLSIZE); + break; + + case VIEW_INPUTS: + if (view == VIEW_INPUTS) { + // Sticks + Pots + doMainScreenGraphics(); + + // Switches #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; i= switches/2) { - x = 16*FW+1; - y -= (switches/2)*FH; + uint8_t switches = min(NUM_SWITCHES, 6); + for (int i = 0; i < switches; ++i) { + if (SWITCH_EXISTS(i)) { + uint8_t x = 2 * FW - 2, y = 4 * FH + i * FH + 1; + if (i >= switches / 2) { + x = 16 * FW + 1; + y -= (switches / 2) * FH; + } + getvalue_t val = getValue(MIXSRC_FIRST_SWITCH + i); + getvalue_t sw = ((val < 0) ? 3 * i + 1 : ((val == 0) ? 3 * i + 2 : 3 * i + 3)); + drawSwitch(x, y, sw, 0, false); } - getvalue_t val = getValue(MIXSRC_FIRST_SWITCH+i); - getvalue_t sw = ((val < 0) ? 3*i+1 : ((val == 0) ? 3*i+2 : 3*i+3)); - drawSwitch(x, y, sw, 0, false); } - } #else - // The ID0 3-POS switch is merged with the TRN switch - for (uint8_t i=SWSRC_THR; i<=SWSRC_TRN; i++) { - int8_t sw = (i == SWSRC_TRN ? (switchState(SW_ID0) ? SWSRC_ID0 : (switchState(SW_ID1) ? SWSRC_ID1 : SWSRC_ID2)) : i); - uint8_t x = 2*FW-2, y = i*FH+1; - if (i >= SWSRC_AIL) { - x = 17*FW-1; - y -= 3*FH; + // The ID0 3-POS switch is merged with the TRN switch + for (uint8_t i=SWSRC_THR; i<=SWSRC_TRN; i++) { + int8_t sw = (i == SWSRC_TRN ? (switchState(SW_ID0) ? SWSRC_ID0 : (switchState(SW_ID1) ? SWSRC_ID1 : SWSRC_ID2)) : i); + uint8_t x = 2*FW-2, y = i*FH+1; + if (i >= SWSRC_AIL) { + x = 17*FW-1; + y -= 3*FH; + } + drawSwitch(x, y, sw, getSwitch(i) ? INVERS : 0, false); } - drawSwitch(x, y, sw, getSwitch(i) ? INVERS : 0, false); - } #endif - } - else { - // Logical Switches - uint8_t index = 0; - uint8_t y = LCD_H-20; - for (uint8_t line=0; line<2; line++) { - for (uint8_t column=0; column0) ? x+w/2 : x+1+w/2-len; + for (coord_t i=h-2; i>0; i--) { + lcdDrawSolidHorizontalLine(x0, y+i, len); + } +} + void title(const char * s) { lcdDrawText(0, 0, s, INVERS); diff --git a/radio/src/gui/212x64/lcd.h b/radio/src/gui/212x64/lcd.h index c4e427771..8fdafdfd4 100644 --- a/radio/src/gui/212x64/lcd.h +++ b/radio/src/gui/212x64/lcd.h @@ -111,8 +111,6 @@ void lcdDrawText(coord_t x, coord_t y, const char * s); void lcdDrawSizedText(coord_t x, coord_t y, const char * s, unsigned char len); void lcdDrawTextAlignedLeft(coord_t y, const char * s); -#define lcdDrawTextAlignedCenter(y, s) lcdDrawText((LCD_W-sizeof(s)*FW+FW+1)/2, y, s) - void lcdDrawHexNumber(coord_t x, coord_t y, uint32_t val, LcdFlags mode=0); void lcdDrawNumber(coord_t x, coord_t y, int32_t val, LcdFlags mode, uint8_t len); void lcdDrawNumber(coord_t x, coord_t y, int32_t val, LcdFlags mode=0); diff --git a/radio/src/gui/212x64/model_failsafe.cpp b/radio/src/gui/212x64/model_failsafe.cpp index 939e7927a..85ab66805 100644 --- a/radio/src/gui/212x64/model_failsafe.cpp +++ b/radio/src/gui/212x64/model_failsafe.cpp @@ -80,7 +80,7 @@ void menuModelFailsafe(event_t event) } } - lcdDrawTextAlignedCenter(0, TR_FAILSAFESET); + lcdDrawText(LCD_W / 2, 0, STR_FAILSAFESET, CENTERED); lcdInvertLine(0); coord_t x = colW; diff --git a/radio/src/gui/212x64/radio_calibration.cpp b/radio/src/gui/212x64/radio_calibration.cpp index bf4c829c3..6ec060e6f 100644 --- a/radio/src/gui/212x64/radio_calibration.cpp +++ b/radio/src/gui/212x64/radio_calibration.cpp @@ -202,7 +202,7 @@ void menuFirstCalib(event_t event) chainMenu(menuMainView); } else { - lcdDrawTextAlignedCenter(0*FH, TR_MENUCALIBRATION); + lcdDrawText(LCD_W / 2, 0, STR_MENUCALIBRATION, CENTERED); lcdInvertLine(0); menuCommonCalib(event); } diff --git a/radio/src/gui/212x64/view_channels.cpp b/radio/src/gui/212x64/view_channels.cpp index 4b34f7f4f..e00b3e9d0 100644 --- a/radio/src/gui/212x64/view_channels.cpp +++ b/radio/src/gui/212x64/view_channels.cpp @@ -61,11 +61,7 @@ void menuChannelsView(event_t event) else if (g_model.extendedLimits) limits *= LIMIT_EXT_PERCENT / 100; - if (reusableBuffer.viewChannels.mixersView) - lcdDrawTextAlignedCenter(0, TR_MIXERS_MONITOR); - else - lcdDrawTextAlignedCenter(0, TR_CHANNELS_MONITOR); - + lcdDrawText(LCD_W / 2, 0, reusableBuffer.viewChannels.mixersView ? STR_MIXERS_MONITOR : STR_CHANNELS_MONITOR, CENTERED); lcdInvertLine(0); // Column separator diff --git a/radio/src/gui/480x272/view_text.cpp b/radio/src/gui/480x272/view_text.cpp index a7969d21f..24a1779db 100644 --- a/radio/src/gui/480x272/view_text.cpp +++ b/radio/src/gui/480x272/view_text.cpp @@ -59,14 +59,6 @@ bool menuTextView(event_t event) lcd->drawTextMaxWidth(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + i * FH, reusableBuffer.viewText.lines[i], 0, LCD_W - 2 * MENUS_MARGIN_LEFT); } -#if 0 - char * title = s_text_file; -#if defined(SIMU) - if (!strncmp(title, "./", 2)) title += 2; -#endif - lcdDrawTextAlignedCenter(MENU_FOOTER_TOP, title, HEADER_COLOR); -#endif - drawVerticalScrollbar(LCD_W-5, 50, 195, menuVerticalOffset, lines_count, NUM_BODY_LINES); return true; diff --git a/radio/src/targets/sky9x/CMakeLists.txt b/radio/src/targets/sky9x/CMakeLists.txt index cb207e10a..0036e3630 100644 --- a/radio/src/targets/sky9x/CMakeLists.txt +++ b/radio/src/targets/sky9x/CMakeLists.txt @@ -71,6 +71,7 @@ set(GUI_SRC radio_diaganas.cpp view_telemetry.cpp view_about.cpp + view_channels.cpp ) if(GVARS) From f100e4375a67ad487ca70438769b985ccd3bd7fd Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 10 Mar 2020 17:48:58 +0100 Subject: [PATCH 154/560] Bsongis/sport power line on off (#7435) SmartPort Power --- radio/src/datastructs.h | 4 ++-- radio/src/gui/480x272/radio_hardware.cpp | 20 +++++++++++++++++++ .../src/gui/common/stdlcd/radio_hardware.cpp | 19 +++++++++++++++++- radio/src/io/frsky_firmware_update.cpp | 10 ++++++++++ radio/src/io/multi_firmware_update.cpp | 5 +++++ radio/src/opentx.cpp | 4 ++++ radio/src/targets/horus/board.cpp | 8 ++++++++ radio/src/targets/horus/board.h | 5 +++++ radio/src/targets/simu/simpgmspace.cpp | 4 ++++ radio/src/targets/taranis/board.cpp | 8 ++++++++ radio/src/targets/taranis/board.h | 5 +++++ radio/src/translations.cpp | 2 ++ radio/src/translations.h | 2 ++ radio/src/translations/cz.h.txt | 3 +++ radio/src/translations/de.h.txt | 3 +++ radio/src/translations/en.h.txt | 3 +++ radio/src/translations/es.h.txt | 3 +++ radio/src/translations/fi.h.txt | 3 +++ radio/src/translations/fr.h.txt | 3 +++ radio/src/translations/it.h.txt | 3 +++ radio/src/translations/nl.h.txt | 3 +++ radio/src/translations/pl.h.txt | 3 +++ radio/src/translations/pt.h.txt | 3 +++ radio/src/translations/se.h.txt | 3 +++ 24 files changed, 126 insertions(+), 3 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 9c5e1b652..7a2454034 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -783,7 +783,7 @@ PACK(struct RadioData { NOBACKUP(uint8_t disableRssiPoweroffAlarm:1); NOBACKUP(uint8_t USBMode:2); NOBACKUP(uint8_t jackMode:2); - NOBACKUP(uint8_t spare3:1); + NOBACKUP(uint8_t sportUpdatePower:1); NOBACKUP(char ttsLanguage[2]); NOBACKUP(int8_t beepVolume:4); NOBACKUP(int8_t wavVolume:4); @@ -941,4 +941,4 @@ static inline void check_struct() #undef CHKSIZE } -#endif /* BACKUP */ +#endif /* BACKUP */ \ No newline at end of file diff --git a/radio/src/gui/480x272/radio_hardware.cpp b/radio/src/gui/480x272/radio_hardware.cpp index 96f29cfbb..41f93259b 100644 --- a/radio/src/gui/480x272/radio_hardware.cpp +++ b/radio/src/gui/480x272/radio_hardware.cpp @@ -72,6 +72,9 @@ enum MenuRadioHardwareItems { #endif ITEM_RADIO_HARDWARE_JITTER_FILTER, +#if defined(SPORT_UPDATE_PWR_GPIO) + ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER, +#endif ITEM_RADIO_HARDWARE_DEBUG, ITEM_RADIO_HARDWARE_MAX }; @@ -119,6 +122,12 @@ void onHardwareAntennaSwitchConfirm(const char * result) #define MAX_BAUDRATE_ROW HIDDEN_ROW #endif +#if defined(SPORT_UPDATE_PWR_GPIO) + #define SPORT_POWER_ROWS 0, +#else + #define SPORT_POWER_ROWS +#endif + bool menuRadioHardware(event_t event) { MENU(STR_HARDWARE, RADIO_ICONS, menuTabGeneral, MENU_RADIO_HARDWARE, ITEM_RADIO_HARDWARE_MAX, { @@ -148,6 +157,7 @@ bool menuRadioHardware(event_t event) AUX_SERIAL_ROW /* aux serial mode */ 0, /* ADC filter */ + SPORT_POWER_ROWS 1, /* Debug */ }); @@ -365,6 +375,16 @@ bool menuRadioHardware(event_t event) break; } +#if defined(SPORT_UPDATE_PWR_GPIO) + case ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER: + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_SPORT_UPDATE_POWER_MODE); + g_eeGeneral.sportUpdatePower = editChoice(HW_SETTINGS_COLUMN + 50, y, STR_SPORT_UPDATE_POWER_MODES, g_eeGeneral.sportUpdatePower, 0, 1, attr, event); + if (attr && checkIncDec_Ret) { + SPORT_UPDATE_POWER_INIT(); + } + break; +#endif + case ITEM_RADIO_HARDWARE_DEBUG: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_DEBUG); lcdDrawText(HW_SETTINGS_COLUMN + 50, y, STR_ANALOGS_BTN, menuHorizontalPosition == 0 ? attr : 0); diff --git a/radio/src/gui/common/stdlcd/radio_hardware.cpp b/radio/src/gui/common/stdlcd/radio_hardware.cpp index a64489528..e450e1624 100644 --- a/radio/src/gui/common/stdlcd/radio_hardware.cpp +++ b/radio/src/gui/common/stdlcd/radio_hardware.cpp @@ -184,6 +184,9 @@ enum { ITEM_RADIO_HARDWARE_JITTER_FILTER, ITEM_RADIO_HARDWARE_RAS, +#if defined(SPORT_UPDATE_PWR_GPIO) + ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER, +#endif ITEM_RADIO_HARDWARE_DEBUG, #if defined(EEPROM_RLC) ITEM_RADIO_BACKUP_EEPROM, @@ -295,6 +298,12 @@ void onHardwareAntennaSwitchConfirm(const char * result) #define HW_SETTINGS_COLUMN2 (HW_SETTINGS_COLUMN1 + 5*FW) #endif +#if defined(SPORT_UPDATE_PWR_GPIO) + #define SPORT_POWER_ROWS 0, +#else + #define SPORT_POWER_ROWS +#endif + #if defined(EEPROM_RLC) void onFactoryResetConfirm(const char * result) { @@ -334,7 +343,7 @@ void menuRadioHardware(event_t event) 0 /* ADC filter */, READONLY_ROW /* RAS */, - + SPORT_POWER_ROWS 1 /* debugs */, 0, @@ -631,6 +640,14 @@ void menuRadioHardware(event_t event) else lcdDrawText(lcdNextPos, y, "---"); break; +#if defined(SPORT_UPDATE_PWR_GPIO) + case ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER: + g_eeGeneral.sportUpdatePower = editChoice(HW_SETTINGS_COLUMN2, y, STR_SPORT_UPDATE_POWER_MODE, STR_SPORT_UPDATE_POWER_MODES, g_eeGeneral.sportUpdatePower, 0, 1, attr, event); + if (attr && checkIncDec_Ret) { + SPORT_UPDATE_POWER_INIT(); + } + break; +#endif case ITEM_RADIO_HARDWARE_DEBUG: lcdDrawTextAlignedLeft(y, STR_DEBUG); diff --git a/radio/src/io/frsky_firmware_update.cpp b/radio/src/io/frsky_firmware_update.cpp index 1dca3b5a2..7cc7135b4 100644 --- a/radio/src/io/frsky_firmware_update.cpp +++ b/radio/src/io/frsky_firmware_update.cpp @@ -487,6 +487,7 @@ const char * FrskyDeviceFirmwareUpdate::flashFirmware(const char * filename) uint8_t extPwr = IS_EXTERNAL_MODULE_ON(); EXTERNAL_MODULE_OFF(); + uint8_t spuPwr = IS_SPORT_UPDATE_POWER_ON(); SPORT_UPDATE_POWER_OFF(); drawProgressScreen(getBasename(filename), STR_DEVICE_RESET, 0, 0); @@ -531,6 +532,10 @@ const char * FrskyDeviceFirmwareUpdate::flashFirmware(const char * filename) setupPulsesExternalModule(); } + if (spuPwr) { + SPORT_UPDATE_POWER_ON(); + } + state = SPORT_IDLE; resumePulses(); @@ -752,6 +757,7 @@ const char * FrskyChipFirmwareUpdate::flashFirmware(const char * filename, bool uint8_t extPwr = IS_EXTERNAL_MODULE_ON(); EXTERNAL_MODULE_OFF(); + uint8_t spuPwr = IS_SPORT_UPDATE_POWER_ON(); SPORT_UPDATE_POWER_OFF(); if (wait) { @@ -791,6 +797,10 @@ const char * FrskyChipFirmwareUpdate::flashFirmware(const char * filename, bool setupPulsesExternalModule(); } + if (spuPwr) { + SPORT_UPDATE_POWER_ON(); + } + resumePulses(); return result; diff --git a/radio/src/io/multi_firmware_update.cpp b/radio/src/io/multi_firmware_update.cpp index f7d8d238e..82ad5d81c 100644 --- a/radio/src/io/multi_firmware_update.cpp +++ b/radio/src/io/multi_firmware_update.cpp @@ -528,6 +528,7 @@ bool multiFlashFirmware(uint8_t moduleIdx, const char * filename) uint8_t extPwr = IS_EXTERNAL_MODULE_ON(); EXTERNAL_MODULE_OFF(); + uint8_t spuPwr = IS_SPORT_UPDATE_POWER_ON(); SPORT_UPDATE_POWER_OFF(); drawProgressScreen(getBasename(filename), STR_DEVICE_RESET, 0, 0); @@ -575,6 +576,10 @@ bool multiFlashFirmware(uint8_t moduleIdx, const char * filename) setupPulsesExternalModule(); } + if (spuPwr) { + SPORT_UPDATE_POWER_ON(); + } + resumePulses(); return result == nullptr; diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 258eb74f8..e6a20db0b 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1966,6 +1966,10 @@ void opentxInit() btInit(); #endif +#if defined(SPORT_UPDATE_PWR_GPIO) + SPORT_UPDATE_POWER_INIT(); +#endif + #if defined(COLORLCD) loadTheme(); loadFontCache(); diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp index 3e8ad4752..61a429a70 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -74,6 +74,14 @@ void sportUpdatePowerOff() { GPIO_ResetBits(SPORT_UPDATE_PWR_GPIO, SPORT_UPDATE_PWR_GPIO_PIN); } + +void sportUpdatePowerInit() +{ + if (g_eeGeneral.sportUpdatePower == 1) + sportUpdatePowerOn(); + else + sportUpdatePowerOff(); +} #endif void boardInit() diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 09554c063..cdc8fb084 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -599,11 +599,16 @@ void telemetryPortInvertedInit(uint32_t baudrate); #if HAS_SPORT_UPDATE_CONNECTOR() void sportUpdatePowerOn(); void sportUpdatePowerOff(); +void sportUpdatePowerInit(); #define SPORT_UPDATE_POWER_ON() sportUpdatePowerOn() #define SPORT_UPDATE_POWER_OFF() sportUpdatePowerOff() +#define SPORT_UPDATE_POWER_INIT() sportUpdatePowerInit() +#define IS_SPORT_UPDATE_POWER_ON() (GPIO_ReadInputDataBit(SPORT_UPDATE_PWR_GPIO, SPORT_UPDATE_PWR_GPIO_PIN) == Bit_SET) #else #define SPORT_UPDATE_POWER_ON() #define SPORT_UPDATE_POWER_OFF() +#define SPORT_UPDATE_POWER_INIT() +#define IS_SPORT_UPDATE_POWER_ON() (false) #endif // Second serial port driver diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index 4e1cdf535..ee4bcdb23 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -437,6 +437,10 @@ void sportUpdatePowerOff() { } +void sportUpdatePowerInit() +{ +} + void boardInit() { } diff --git a/radio/src/targets/taranis/board.cpp b/radio/src/targets/taranis/board.cpp index 3cd6742f3..521ab1d9b 100644 --- a/radio/src/targets/taranis/board.cpp +++ b/radio/src/targets/taranis/board.cpp @@ -62,6 +62,14 @@ void sportUpdatePowerOff() { GPIO_SPORT_UPDATE_PWR_GPIO_OFF(SPORT_UPDATE_PWR_GPIO, SPORT_UPDATE_PWR_GPIO_PIN); } + +void sportUpdatePowerInit() +{ + if (g_eeGeneral.sportUpdatePower == 1) + sportUpdatePowerOn(); + else + sportUpdatePowerOff(); +} #endif void boardInit() diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index e978d8277..e735c8d33 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -720,12 +720,17 @@ void telemetryPortInvertedInit(uint32_t baudrate); void sportUpdateInit(); void sportUpdatePowerOn(); void sportUpdatePowerOff(); +void sportUpdatePowerInit(); #define SPORT_UPDATE_POWER_ON() sportUpdatePowerOn() #define SPORT_UPDATE_POWER_OFF() sportUpdatePowerOff() +#define SPORT_UPDATE_POWER_INIT() sportUpdatePowerInit() +#define IS_SPORT_UPDATE_POWER_ON() (GPIO_ReadInputDataBit(SPORT_UPDATE_PWR_GPIO, SPORT_UPDATE_PWR_GPIO_PIN) == Bit_SET) #else #define sportUpdateInit() #define SPORT_UPDATE_POWER_ON() #define SPORT_UPDATE_POWER_OFF() +#define SPORT_UPDATE_POWER_INIT() +#define IS_SPORT_UPDATE_POWER_ON() (false) #endif // Audio driver diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 1dfb9a692..1cd1c98a8 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -78,6 +78,7 @@ ISTR(SWTYPES); ISTR(POTTYPES); ISTR(SLIDERTYPES); ISTR(ANTENNA_MODES); +ISTR(SPORT_UPDATE_POWER_MODES); #if defined(PCBSKY9X) && defined(REVX) ISTR(VOUTPUT_TYPE); @@ -580,6 +581,7 @@ const char STR_RTC_CHECK[] = TR_RTC_CHECK; const char STR_EXIT[] = TR_EXIT; const char STR_MODULE_RANGE[] = TR_MODULE_RANGE; const char STR_RECEIVER_OPTIONS[] = TR_RECEIVER_OPTIONS; +const char STR_SPORT_UPDATE_POWER_MODE[] = TR_SPORT_UPDATE_POWER_MODE; #if defined(PCBHORUS) const char STR_ASSIGN_SPLASH[] = TR_ASSIGN_SPLASH; diff --git a/radio/src/translations.h b/radio/src/translations.h index df0cfd67d..e11ad3197 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -863,6 +863,8 @@ extern const char STR_MENU_OTHER[]; extern const char STR_MENU_INVERT[]; extern const char STR_JITTER_FILTER[]; extern const char STR_RTC_CHECK[]; +extern const char STR_SPORT_UPDATE_POWER_MODE[]; +extern const char STR_SPORT_UPDATE_POWER_MODES[]; #if MENUS_LOCK == 1 extern const char STR_UNLOCKED[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index cdcf5ae13..e0f453bb8 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -980,6 +980,9 @@ #define STR_FACTORYRESET "Tovární reset" #define TR_CONFIRMRESET TR("Smazat vše ?", "Smazat modely a nastavení?") #define TR_TOO_MANY_LUA_SCRIPTS "Příliš mnoho skriptů!" +#define TR_SPORT_UPDATE_POWER_MODE "SP Power" +#define LEN_SPORT_UPDATE_POWER_MODES "\004" +#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Název" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 24c37b13e..ae3f50756 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -986,6 +986,9 @@ #define STR_FACTORYRESET TR("Werksreset", "Auf Werkseinstellungen") #define TR_CONFIRMRESET TR("Alles löschen? ","ALLE Modelle+Einst. löschen?") #define TR_TOO_MANY_LUA_SCRIPTS "Zu viele Skripte!" +#define TR_SPORT_UPDATE_POWER_MODE "SP Power" +#define LEN_SPORT_UPDATE_POWER_MODES "\004" +#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " // Horus and Taranis specific column headers #define TR_PHASES_HEADERS_NAME "Name " diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index f37006215..d50b5a2cd 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -985,6 +985,9 @@ #define STR_FACTORYRESET "Factory reset" #define TR_CONFIRMRESET TR("Erase ALL", "Erase ALL models and settings?") #define TR_TOO_MANY_LUA_SCRIPTS "Too many Lua scripts!" +#define TR_SPORT_UPDATE_POWER_MODE "SP Power" +#define LEN_SPORT_UPDATE_POWER_MODES "\004" +#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Name" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index c1ae1f49c..ab7c4b98c 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -1005,6 +1005,9 @@ #define STR_FACTORYRESET "Factory reset" #define TR_CONFIRMRESET "Erase ALL models and settings?" #define TR_TOO_MANY_LUA_SCRIPTS "Too many Lua scripts!" +#define TR_SPORT_UPDATE_POWER_MODE "SP Power" +#define LEN_SPORT_UPDATE_POWER_MODES "\004" +#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " // Horus and Taranis column headers diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 839269089..19f24ff02 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -999,6 +999,9 @@ #define STR_FACTORYRESET "Factory reset" #define TR_CONFIRMRESET "Erase ALL models and settings?" #define TR_TOO_MANY_LUA_SCRIPTS "Too many Lua scripts!" +#define TR_SPORT_UPDATE_POWER_MODE "SP Power" +#define LEN_SPORT_UPDATE_POWER_MODES "\004" +#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " // Horus and Taranis column headers diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 2e6eb35df..3dcde7dcd 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -1009,6 +1009,9 @@ #endif #define TR_CONFIRMRESET TR("Effacer TOUT?","Effacer TOUS modèles/réglages?") #define TR_TOO_MANY_LUA_SCRIPTS "Trop de scripts lua!" +#define TR_SPORT_UPDATE_POWER_MODE "SP Power" +#define LEN_SPORT_UPDATE_POWER_MODES "\004" +#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Nom" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 2125f0189..4644bf056 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -1001,6 +1001,9 @@ #define STR_FACTORYRESET "Inizializza dati" #define TR_CONFIRMRESET "Resettare TUTTI i dati?" #define TR_TOO_MANY_LUA_SCRIPTS "Troppi Scripts Lua!" +#define TR_SPORT_UPDATE_POWER_MODE "SP Power" +#define LEN_SPORT_UPDATE_POWER_MODES "\004" +#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " // Horus and Taranis column headers diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 6e3388f4c..50d624d2c 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -993,6 +993,9 @@ #endif #define TR_CONFIRMRESET TR("Wis Alles?", "Wis ALLE modellen en instellingen?") #define TR_TOO_MANY_LUA_SCRIPTS "Te veel Lua scripts!" +#define TR_SPORT_UPDATE_POWER_MODE "SP Power" +#define LEN_SPORT_UPDATE_POWER_MODES "\004" +#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " // Horus and Taranis column headers diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 2fe3c84a3..1034c98d9 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -1000,6 +1000,9 @@ #define STR_FACTORYRESET "Ustaw.Fabrycz" #define TR_CONFIRMRESET "WYkasować wszytkie modele? " #define TR_TOO_MANY_LUA_SCRIPTS "Za dużo skryptów Lua!" +#define TR_SPORT_UPDATE_POWER_MODE "SP Power" +#define LEN_SPORT_UPDATE_POWER_MODES "\004" +#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " // Horus and Taranis column headers diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 33b3568e2..6b3aaaf0e 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -990,6 +990,9 @@ #define STR_FACTORYRESET "Factory reset" #define TR_CONFIRMRESET "Erase ALL models and settings?" #define TR_TOO_MANY_LUA_SCRIPTS "Too many Lua scripts!" +#define TR_SPORT_UPDATE_POWER_MODE "SP Power" +#define LEN_SPORT_UPDATE_POWER_MODES "\004" +#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " // Horus and Taranis column headers diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 8bbb15270..663d90be3 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -1000,6 +1000,9 @@ #define STR_FACTORYRESET "Factory reset" #define TR_CONFIRMRESET "Erase ALL models and settings?" #define TR_TOO_MANY_LUA_SCRIPTS "För många Lua-scripts!" +#define TR_SPORT_UPDATE_POWER_MODE "SP Power" +#define LEN_SPORT_UPDATE_POWER_MODES "\004" +#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " // Horus and Taranis column headers From e4f8735c7ab08c5c014ccbecd32d076cc7367c35 Mon Sep 17 00:00:00 2001 From: Offer Shmuely Date: Tue, 10 Mar 2020 19:02:11 +0200 Subject: [PATCH 155/560] Shmuely/horus batt widget reset telemetry (#7407) Batt widget reset telemetry --- radio/sdcard/horus/WIDGETS/BattCheck/main.lua | 53 ++++++++++++++++--- 1 file changed, 46 insertions(+), 7 deletions(-) diff --git a/radio/sdcard/horus/WIDGETS/BattCheck/main.lua b/radio/sdcard/horus/WIDGETS/BattCheck/main.lua index abe3460d5..215d589ac 100755 --- a/radio/sdcard/horus/WIDGETS/BattCheck/main.lua +++ b/radio/sdcard/horus/WIDGETS/BattCheck/main.lua @@ -36,6 +36,8 @@ local function create(zone, options) counter = 0, shadowed = 0, + telemResetCount = 0, + telemResetLowestMinRSSI = 101, no_telem_blink = 0, isDataAvailable = 0, cellDataLive = {0,0,0,0,0,0}, @@ -76,14 +78,47 @@ local function update(wgt, options) end --- A quick and dirty check for empty table -local function isEmpty(self) - for _, _ in pairs(self) do - return false - end - return true + +-- clear old telemetry data upon reset event +local function onTelemetryResetEvent(wgt) + wgt.telemResetCount = wgt.telemResetCount + 1 + + wgt.cellDataLive = {0,0,0,0,0,0} + wgt.cellDataHistoryLowest = {5,5,5,5,5,5} + wgt.cellDataHistoryCellLowest = 5 end + +-- workaround to detect telemetry-reset event, until a proper implementation on the lua interface will be created +-- this workaround assume that: +-- RSSI- is always going down +-- RSSI- is reset on the C++ side when a telemetry-reset is pressed by user +-- widget is calling this func on each refresh/background +-- on event detection, the function onTelemetryResetEvent() will be trigger +-- +local function detectResetEvent(wgt) + + local currMinRSSI = getValue('RSSI-') + if (currMinRSSI == nil) then return + end + if (currMinRSSI == wgt.telemResetLowestMinRSSI) then return end + + if (currMinRSSI < wgt.telemResetLowestMinRSSI) then + -- rssi just got lower, record it + wgt.telemResetLowestMinRSSI = currMinRSSI + return + end + + + -- reset telemetry detected + wgt.telemResetLowestMinRSSI = 101 + + -- notify event + onTelemetryResetEvent(wgt) + +end + + --- This function return the percentage remaining in a single Lipo cel local function getCellPercent(cellValue) if cellValue == nil then @@ -293,13 +328,14 @@ local function refreshZoneMedium(wgt) for i = 1, wgt.cellCount, 1 do local cellY = wgt.zone.y + (i-1)* (cellH -1) - -- fill current value + -- fill current cell lcd.setColor(CUSTOM_COLOR, getRangeColor(wgt.cellDataLive[i], wgt.cellMax, wgt.cellMax - 0.2)) --lcd.drawFilledRectangle(wgt.zone.x + cellX , cellY, 58, cellH, CUSTOM_COLOR) local percentCurrent = getCellPercent(wgt.cellDataLive[i]) local percentMin = getCellPercent(wgt.cellDataHistoryLowest[i]) lcd.drawFilledRectangle(wgt.zone.x + cellX , cellY, cellW * percentCurrent / 100, cellH, CUSTOM_COLOR) + -- fill min lcd.setColor(CUSTOM_COLOR, getRangeColor(wgt.cellDataHistoryLowest[i], wgt.cellMax, wgt.cellMax - 0.2)) lcd.drawFilledRectangle(wgt.zone.x + cellX + ((percentCurrent - percentMin) / 100) , cellY, cellW - (cellW * (percentCurrent - percentMin) / 100), cellH, CUSTOM_COLOR) @@ -413,6 +449,8 @@ end local function background(wgt) if (wgt == nil) then return end + detectResetEvent(wgt) + calculateBatteryData(wgt) end @@ -430,6 +468,7 @@ local function refresh(wgt) wgt.shadowed = 0 end + detectResetEvent(wgt) calculateBatteryData(wgt) From cc585950c33db0eb7f557111eb097a1f07b80ae6 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 10 Mar 2020 18:15:03 +0100 Subject: [PATCH 156/560] Review sensor physID handling (#7374) Review sensor physID handling --- radio/src/gui/128x64/model_telemetry_sensor.cpp | 2 +- radio/src/targets/simu/opentxsimulator.cpp | 2 +- radio/src/telemetry/frsky_sport.cpp | 6 ++++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/model_telemetry_sensor.cpp b/radio/src/gui/128x64/model_telemetry_sensor.cpp index d8a63079e..301b956c1 100644 --- a/radio/src/gui/128x64/model_telemetry_sensor.cpp +++ b/radio/src/gui/128x64/model_telemetry_sensor.cpp @@ -104,7 +104,7 @@ void menuModelSensor(event_t event) if (sensor->type == TELEM_TYPE_CUSTOM) { lcdDrawTextAlignedLeft(y, STR_ID); lcdDrawHexNumber(SENSOR_2ND_COLUMN, y, sensor->id, LEFT|(menuHorizontalPosition==0 ? attr : 0)); - lcdDrawHexChar(SENSOR_3RD_COLUMN, y, (sensor->instance & 0x1F) + 1, LEFT|(menuHorizontalPosition==1 ? attr : 0)); + lcdDrawNumber(SENSOR_3RD_COLUMN, y, (sensor->instance & 0x1F) + 1, LEFT|(menuHorizontalPosition==1 ? attr : 0)); if (attr && s_editMode > 0) { switch (menuHorizontalPosition) { case 0: diff --git a/radio/src/targets/simu/opentxsimulator.cpp b/radio/src/targets/simu/opentxsimulator.cpp index be01f250e..edc435c12 100644 --- a/radio/src/targets/simu/opentxsimulator.cpp +++ b/radio/src/targets/simu/opentxsimulator.cpp @@ -326,7 +326,7 @@ uint8_t OpenTxSimulator::getSensorInstance(uint16_t id, uint8_t defaultValue) if (isTelemetryFieldAvailable(i)) { TelemetrySensor * sensor = &g_model.telemetrySensors[i]; if (sensor->id == id) { - return sensor->instance; + return sensor->frskyInstance.physID + 1; } } } diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index d67da2559..299553050 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -168,7 +168,13 @@ void sportProcessTelemetryPacketWithoutCrc(uint8_t origin, const uint8_t * packe if (primId == DATA_FRAME) { uint8_t originMask; if (origin == TELEMETRY_ENDPOINT_SPORT) { +#if defined(SIMU) && defined(INTERNAL_MODULE_PXX2) + // When running simu on ACCESS radio, we set the origin as internal module + origin = 0; + originMask = 0x01; +#else originMask = 0x04; +#endif } else { uint8_t moduleIndex = (origin >> 2); From b37ca0d32aedab22fbde26d91bc5d0db2caea04f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 16 Mar 2020 10:36:13 +0100 Subject: [PATCH 157/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index a710e2e02..f4c1799f1 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1705,3 +1705,4 @@ Frank Barbas Scott McCoy Fabrice Debonnet James Laver +Kevin Bowens From 02787671f829b0b165707327d1cf5b1ee6ed9f83 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 16 Mar 2020 12:34:51 +0100 Subject: [PATCH 158/560] Fix crash in RADIO views if compiled without LUA --- radio/src/gui/480x272/menu_radio.cpp | 2 +- radio/src/gui/480x272/menus.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/480x272/menu_radio.cpp b/radio/src/gui/480x272/menu_radio.cpp index dd5368bc2..dcb7e9dea 100644 --- a/radio/src/gui/480x272/menu_radio.cpp +++ b/radio/src/gui/480x272/menu_radio.cpp @@ -21,7 +21,7 @@ #include "opentx.h" const MenuHandlerFunc menuTabGeneral[MENU_RADIO_PAGES_COUNT] = { -#if defined(LUA) || defined(PXX2) +#if defined(LUA) || defined(PXX2) || defined(MULTIMODULE) menuRadioTools, #endif menuRadioSdManager, diff --git a/radio/src/gui/480x272/menus.h b/radio/src/gui/480x272/menus.h index cefa95378..f0623e164 100644 --- a/radio/src/gui/480x272/menus.h +++ b/radio/src/gui/480x272/menus.h @@ -203,7 +203,7 @@ enum EnumTabRadio { const uint8_t RADIO_ICONS[MENU_RADIO_PAGES_COUNT + 1] = { ICON_RADIO, -#if defined(LUA) || defined(PXX2) +#if defined(LUA) || defined(PXX2) || defined(MULTIMODULE) ICON_RADIO_TOOLS, #endif ICON_RADIO_SD_MANAGER, From 9999187dbf792c697a65c8162806b84b322a43f4 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 16 Mar 2020 14:50:21 +0100 Subject: [PATCH 159/560] Radio tools related fixes (#7444) Radio tools related fixes --- radio/src/gui/128x64/menus.h | 4 ++-- radio/src/gui/128x64/view_main.cpp | 2 +- radio/src/gui/212x64/menu_radio.cpp | 2 +- radio/src/gui/212x64/view_main.cpp | 2 +- radio/src/gui/480x272/menu_radio.cpp | 2 +- radio/src/gui/480x272/menus.cpp | 2 ++ radio/src/gui/480x272/menus.h | 4 ++-- radio/src/opentx.h | 4 ++++ 8 files changed, 14 insertions(+), 8 deletions(-) diff --git a/radio/src/gui/128x64/menus.h b/radio/src/gui/128x64/menus.h index daa3f1885..a1e980874 100644 --- a/radio/src/gui/128x64/menus.h +++ b/radio/src/gui/128x64/menus.h @@ -50,7 +50,7 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF enum MenuRadioIndexes { -#if defined(LUA) || defined(PXX2) || defined(MULTIMODULE) +#if defined(RADIO_TOOLS) MENU_RADIO_TOOLS, #endif CASE_SDCARD(MENU_RADIO_SD_MANAGER) @@ -76,7 +76,7 @@ void menuRadioPowerMeter(event_t event); void menuRadioCalibration(event_t event); static const MenuHandlerFunc menuTabGeneral[MENU_RADIO_PAGES_COUNT] = { -#if defined(LUA) || defined(PXX2) || defined(MULTIMODULE) +#if defined(RADIO_TOOLS) menuRadioTools, #endif CASE_SDCARD(menuRadioSdManager) diff --git a/radio/src/gui/128x64/view_main.cpp b/radio/src/gui/128x64/view_main.cpp index b5f067162..a6f77528b 100644 --- a/radio/src/gui/128x64/view_main.cpp +++ b/radio/src/gui/128x64/view_main.cpp @@ -364,7 +364,7 @@ void menuMainView(event_t event) break; case EVT_KEY_GENERAL_MENU: - pushMenu(menuRadioTools); + pushMenu(menuTabGeneral[0]); killEvents(event); break; #endif diff --git a/radio/src/gui/212x64/menu_radio.cpp b/radio/src/gui/212x64/menu_radio.cpp index 6e7647a72..fe5765cb6 100644 --- a/radio/src/gui/212x64/menu_radio.cpp +++ b/radio/src/gui/212x64/menu_radio.cpp @@ -21,7 +21,7 @@ #include "opentx.h" const MenuHandlerFunc menuTabGeneral[MENU_RADIO_PAGES_COUNT] = { -#if defined(LUA) || defined(PXX2) +#if defined(RADIO_TOOLS) menuRadioTools, #endif menuRadioSdManager, diff --git a/radio/src/gui/212x64/view_main.cpp b/radio/src/gui/212x64/view_main.cpp index bdbcb10a6..659781ea6 100644 --- a/radio/src/gui/212x64/view_main.cpp +++ b/radio/src/gui/212x64/view_main.cpp @@ -455,7 +455,7 @@ void menuMainView(event_t event) break; case EVT_KEY_LONG(KEY_MENU): - pushMenu(menuRadioTools); + pushMenu(menuTabGeneral[0]); killEvents(event); break; #endif diff --git a/radio/src/gui/480x272/menu_radio.cpp b/radio/src/gui/480x272/menu_radio.cpp index dcb7e9dea..e50486b0d 100644 --- a/radio/src/gui/480x272/menu_radio.cpp +++ b/radio/src/gui/480x272/menu_radio.cpp @@ -21,7 +21,7 @@ #include "opentx.h" const MenuHandlerFunc menuTabGeneral[MENU_RADIO_PAGES_COUNT] = { -#if defined(LUA) || defined(PXX2) || defined(MULTIMODULE) +#if defined(RADIO_TOOLS) menuRadioTools, #endif menuRadioSdManager, diff --git a/radio/src/gui/480x272/menus.cpp b/radio/src/gui/480x272/menus.cpp index c166eb86b..e88c02a25 100644 --- a/radio/src/gui/480x272/menus.cpp +++ b/radio/src/gui/480x272/menus.cpp @@ -55,8 +55,10 @@ void pushMenu(MenuHandlerFunc newMenu) killEvents(KEY_ENTER); if (menuLevel == 0) { +#if defined(RADIO_TOOLS) if (newMenu == menuRadioTools) menuVerticalPositions[0] = 1; +#endif if (newMenu == menuModelSetup) menuVerticalPositions[0] = 0; } diff --git a/radio/src/gui/480x272/menus.h b/radio/src/gui/480x272/menus.h index f0623e164..83c667f19 100644 --- a/radio/src/gui/480x272/menus.h +++ b/radio/src/gui/480x272/menus.h @@ -189,7 +189,7 @@ bool menuRadioDiagAnalogs(event_t event); extern const MenuHandlerFunc menuTabModel[MENU_MODEL_PAGES_COUNT]; enum EnumTabRadio { -#if defined(LUA) || defined(PXX2) || defined(MULTIMODULE) +#if defined(RADIO_TOOLS) MENU_RADIO_TOOLS, #endif MENU_RADIO_SD_MANAGER, @@ -203,7 +203,7 @@ enum EnumTabRadio { const uint8_t RADIO_ICONS[MENU_RADIO_PAGES_COUNT + 1] = { ICON_RADIO, -#if defined(LUA) || defined(PXX2) || defined(MULTIMODULE) +#if defined(RADIO_TOOLS) ICON_RADIO_TOOLS, #endif ICON_RADIO_SD_MANAGER, diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 8a8ea96a9..c96d94e1e 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -219,6 +219,10 @@ #define IS_SLAVE_TRAINER() (g_model.trainerData.mode == TRAINER_MODE_SLAVE) #endif +#if defined(LUA) || defined(PXX2) || defined(MULTIMODULE) + #define RADIO_TOOLS +#endif + // RESX range is used for internal calculation; The menu says -100.0 to 100.0; internally it is -1024 to 1024 to allow some optimizations #define RESX_SHIFT 10 #define RESX 1024 From 5444cd1ab6b717ed3cc8bf1b07d33b6458d5a1aa Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 16 Mar 2020 14:51:16 +0100 Subject: [PATCH 160/560] Fix MULTI trainer with external R9M issue (#7443) --- radio/src/telemetry/telemetry.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index c4a5e325a..0d15c3c0c 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -151,7 +151,7 @@ inline uint8_t modelTelemetryProtocol() return PROTOCOL_TELEMETRY_MULTIMODULE; } #if defined(INTERNAL_MODULE_MULTI) - if (g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE) { + if (g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_NONE) { return PROTOCOL_TELEMETRY_MULTIMODULE; } #endif From 842a8c7d11c72065c8927d37cf94e511ba1aa4f7 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 18 Mar 2020 18:59:21 +0100 Subject: [PATCH 161/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index f4c1799f1..f8d4f14e6 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1706,3 +1706,4 @@ Scott McCoy Fabrice Debonnet James Laver Kevin Bowens +David Frech From eb58e58f234364676503df0a95ae16aa9d49200a Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 19 Mar 2020 09:58:08 +0100 Subject: [PATCH 162/560] Cosmetics --- companion/src/firmwares/opentx/opentxinterface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index d22964cb0..794ad63e2 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -1346,7 +1346,7 @@ void registerOpenTxFirmwares() addOpenTxRfOptions(firmware, FLEX); /* Radiomaster TX16S board */ - firmware = new OpenTxFirmware("opentx-tx16s", Firmware::tr("Radiomaster TX16S"), BOARD_RADIOMASTER_TX16S); + firmware = new OpenTxFirmware("opentx-tx16s", Firmware::tr("Radiomaster TX16s / TX16s Hall / TX16s Masterfire"), BOARD_RADIOMASTER_TX16S); addOpenTxFrskyOptions(firmware); firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module")); registerOpenTxFirmware(firmware); From ec1ebe4a0b0027fc7cf8bdb6bad8f173f37293b4 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 19 Mar 2020 10:45:03 +0100 Subject: [PATCH 163/560] Firmware compilation fixes --- radio/util/build-firmware.py | 33 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/radio/util/build-firmware.py b/radio/util/build-firmware.py index 373e4a41d..e54b5058e 100755 --- a/radio/util/build-firmware.py +++ b/radio/util/build-firmware.py @@ -5,7 +5,6 @@ import os import sys import subprocess import shutil -import filelock from fwoptions import * @@ -56,7 +55,7 @@ def build_target(target, path, cmake_options): def main(): if len(sys.argv) != 3: - exit(INVALID_FIRMWARE) + return INVALID_FIRMWARE target = sys.argv[1] directory, filename = os.path.split(sys.argv[2]) @@ -64,7 +63,7 @@ def main(): options = root.split("-") if len(options) < 2 or options[0] != "opentx": - exit(INVALID_FIRMWARE) + return INVALID_FIRMWARE optcount = 1 cmake_options = {} @@ -155,7 +154,7 @@ def main(): firmware_options = options_jumper_t16 maxsize = 2 * 1024 * 1024 else: - exit(INVALID_BOARD) + return INVALID_BOARD if target == "firmware": binary = "firmware.bin" @@ -166,7 +165,7 @@ def main(): ext = ".so" filename = "libopentx" else: - exit(INVALID_BOARD) + return INVALID_BOARD filename += "-" + board_name optcount += 1 @@ -198,7 +197,7 @@ def main(): if key == options[-1]: language = key if not language: - exit(INVALID_LANGUAGE) + return INVALID_LANGUAGE cmake_options["TRANSLATIONS"] = language.upper() filename += "-" + language + ext @@ -207,24 +206,16 @@ def main(): if os.path.isfile(errpath): print(filename) - exit(COMPILATION_ERROR) + return COMPILATION_ERROR if os.path.isfile(path): print(filename) - exit(0) + return 0 - lockpath = path + ".lock" - lock = filelock.FileLock(lockpath) - try: - with lock.acquire(timeout=60 * 60): - if not os.path.isfile(path): - result = build_target(target, path, cmake_options) - if result != 0: - print(filename) - return result - except filelock.Timeout: + result = build_target(target, path, cmake_options) + if result != 0: print(filename) - exit(COMPILATION_ERROR) + return result if target == "firmware": # Check binary size @@ -236,8 +227,8 @@ def main(): shutil.move(binary, path) print(filename) - exit(0) + return 0 if __name__ == "__main__": - main() + exit(main()) From 47e70e62771d161615951a6f0a540ad015bec8d7 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 19 Mar 2020 11:40:34 +0100 Subject: [PATCH 164/560] Radiomaster production firmware build tool --- radio/src/CMakeLists.txt | 4 ++ radio/src/stamp.cpp | 2 + tools/build-radiomaster.py | 77 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+) create mode 100755 tools/build-radiomaster.py diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 8124cf651..20852450c 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -340,6 +340,10 @@ if(JUMPER_RELEASE) add_definitions(-DJUMPER_RELEASE) endif() +if(RADIOMASTER_RELEASE) + add_definitions(-DRADIOMASTER_RELEASE) +endif() + if(TBS_RELEASE) add_definitions(-DTBS_RELEASE) endif() diff --git a/radio/src/stamp.cpp b/radio/src/stamp.cpp index 2369955b3..f4f8b836a 100644 --- a/radio/src/stamp.cpp +++ b/radio/src/stamp.cpp @@ -36,6 +36,8 @@ #define DISPLAY_VERSION "FrSky" #elif defined(JUMPER_RELEASE) #define DISPLAY_VERSION "JumperRC" +#elif defined(RADIOMASTER_RELEASE) +#define DISPLAY_VERSION "Radiomaster" #elif defined(TBS_RELEASE) #define DISPLAY_VERSION "TBS" #else diff --git a/tools/build-radiomaster.py b/tools/build-radiomaster.py new file mode 100755 index 000000000..83faa31bb --- /dev/null +++ b/tools/build-radiomaster.py @@ -0,0 +1,77 @@ +#!/usr/bin/python3 + +import argparse +import datetime +import os +from builtins import NotADirectoryError +import shutil +import tempfile + + +boards = { + "TX16S_1": { + "PCB": "X10", + "PCBREV": "TX16S", + "DEFAULT_MODE": "1", + }, + "TX16S_2": { + "PCB": "X10", + "PCBREV": "TX16S", + "DEFAULT_MODE": "2", + } +} + +translations = [ + "EN", +] + + +def timestamp(): + return datetime.datetime.now().strftime("%y%m%d") + + +def build(board, translation, srcdir): + cmake_options = " ".join(["-D%s=%s" % (key, value) for key, value in boards[board].items()]) + cwd = os.getcwd() + if not os.path.exists("output"): + os.mkdir("output") + path = tempfile.mkdtemp() + os.chdir(path) + command = "cmake %s -DTRANSLATIONS=%s -DRADIOMASTER_RELEASE=YES %s" % (cmake_options, translation, srcdir) + print(command) + os.system(command) + os.system("make firmware -j6") + os.chdir(cwd) + index = 0 + while 1: + suffix = "" if index == 0 else "_%d" % index + filename = "output/firmware_%s_%s_%s%s.bin" % (board.lower(), translation.lower(), timestamp(), suffix) + if not os.path.exists(filename): + shutil.copy("%s/firmware.bin" % path, filename) + break + index += 1 + shutil.rmtree(path) + + +def dir_path(string): + if os.path.isdir(string): + return string + else: + raise NotADirectoryError(string) + + +def main(): + parser = argparse.ArgumentParser(description="Build Radiomaster firmware") + parser.add_argument("-b", "--boards", action="append", help="Destination boards", required=True) + parser.add_argument("-t", "--translations", action="append", help="Translations", required=True) + parser.add_argument("srcdir", type=dir_path) + + args = parser.parse_args() + + for board in (boards.keys() if "ALL" in args.boards else args.boards): + for translation in (translations if "ALL" in args.translations else args.translations): + build(board, translation, args.srcdir) + + +if __name__ == "__main__": + main() From a4d9305d65e4e11194a924bcb7131b01d73e70c9 Mon Sep 17 00:00:00 2001 From: WismyYao Date: Thu, 19 Mar 2020 21:31:32 +0800 Subject: [PATCH 165/560] R9-STAB has OTA (#7448) --- radio/src/pulses/pxx2.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 6e3274278..c739b6e3d 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -185,7 +185,7 @@ static const char * const PXX2ReceiversNames[] = { "R9-SLIM+", "R9-MINI", "R9-MM", - "R9-STAB", + "R9-STAB", // R9-STAB has OTA "R9-MINI-OTA", // this one has OTA (different bootloader) "R9-MM-OTA", // this one has OTA (different bootloader) "R9-SLIM+-OTA", // this one has OTA (different bootloader) @@ -235,7 +235,7 @@ static const uint8_t PXX2ReceiverOptions[] = { 0b11111110, // R9-SLIM+ 0b11111110, // R9-MINI 0b11111110, // R9-MM - 0b11111110, // R9-STAB + 0b11111111, // R9-STAB+OTA 0b11111111, // R9-MINI+OTA 0b11111111, // R9-MM+OTA 0b11111111, // R9-SLIM+OTA From ae2f848fa37eb5e392b53be4acc9f44c7405af19 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 19 Mar 2020 22:16:18 +0100 Subject: [PATCH 166/560] Compilation will be a little bit quicker --- radio/util/build-firmware.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/util/build-firmware.py b/radio/util/build-firmware.py index e54b5058e..8d85d542c 100755 --- a/radio/util/build-firmware.py +++ b/radio/util/build-firmware.py @@ -41,7 +41,7 @@ def build_target(target, path, cmake_options): return COMPILATION_ERROR # Launch make - cmd = ["make", "-j2", target] + cmd = ["make", "-j3", target] proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) output, error = proc.communicate() if proc.returncode == 0: From c78bd08be3af64f3ef1ff31b19a589822c8bee1a Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 20 Mar 2020 08:47:22 +0100 Subject: [PATCH 167/560] Adjust CPU usage on nightly server --- tools/build-companion-nightly.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/build-companion-nightly.sh b/tools/build-companion-nightly.sh index 683e0e4d6..06f605c0d 100755 --- a/tools/build-companion-nightly.sh +++ b/tools/build-companion-nightly.sh @@ -4,7 +4,7 @@ set -e set -x -JOBS=2 +JOBS=3 while [ $# -gt 0 ] do From 556b030e09d7b660f4aeb1b20ba3cb26b5c026ca Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 21 Mar 2020 11:43:31 +0100 Subject: [PATCH 168/560] Fix TX16s page navigation --- radio/src/gui/navigation/navigation_horus.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/radio/src/gui/navigation/navigation_horus.cpp b/radio/src/gui/navigation/navigation_horus.cpp index b8729c8a3..d62d07810 100644 --- a/radio/src/gui/navigation/navigation_horus.cpp +++ b/radio/src/gui/navigation/navigation_horus.cpp @@ -316,9 +316,9 @@ bool check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t if (menuTab && !menuCalibrationState) { int cc = curr; switch (event) { -#if defined(PCBX12S) +#if defined(KEYS_GPIO_REG_PGUP) case EVT_KEY_FIRST(KEY_PGDN): -#elif defined(PCBX10) +#else case EVT_KEY_BREAK(KEY_PGDN): #endif if (s_editMode>0) @@ -328,8 +328,9 @@ bool check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t cc = 0; break; +#if defined(KEYS_GPIO_REG_PGUP) case EVT_KEY_FIRST(KEY_PGUP): -#if defined(PCBX10) +#else case EVT_KEY_LONG(KEY_PGDN): #endif if (s_editMode>0) From 6af59c76c7a3bd7c139e4190d6407f6c0256369d Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 31 Jan 2020 15:29:30 +0100 Subject: [PATCH 169/560] PCB2.3 pin changes --- radio/src/targets/horus/hal.h | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index ed5422834..c4040dd3b 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -182,10 +182,17 @@ #define TRIMS_GPIO_REG_LSU GPIOB->IDR #define TRIMS_GPIO_PIN_LSU GPIO_Pin_13 // PB.13 #elif defined(PCBX10) - #define TRIMS_GPIO_REG_LHL GPIOB->IDR - #define TRIMS_GPIO_PIN_LHL GPIO_Pin_8 // PB.08 - #define TRIMS_GPIO_REG_LHR GPIOB->IDR - #define TRIMS_GPIO_PIN_LHR GPIO_Pin_9 // PB.09 + #if defined(RADIO_TX16S) + #define TRIMS_GPIO_REG_LHL GPIOA->IDR + #define TRIMS_GPIO_PIN_LHL GPIO_Pin_8 // PA.06 + #define TRIMS_GPIO_REG_LHR GPIOC->IDR + #define TRIMS_GPIO_PIN_LHR GPIO_Pin_9 // PC.04 + #else + #define TRIMS_GPIO_REG_LHL GPIOB->IDR + #define TRIMS_GPIO_PIN_LHL GPIO_Pin_8 // PB.08 + #define TRIMS_GPIO_REG_LHR GPIOB->IDR + #define TRIMS_GPIO_PIN_LHR GPIO_Pin_9 // PB.09 + #endif #define TRIMS_GPIO_REG_LVD GPIOG->IDR #define TRIMS_GPIO_PIN_LVD GPIO_Pin_12 // PG.12 #define TRIMS_GPIO_REG_LVU GPIOJ->IDR @@ -226,14 +233,21 @@ #define KEYS_GPIOI_PINS (KEYS_GPIO_PIN_PGDN | KEYS_GPIO_PIN_LEFT | KEYS_GPIO_PIN_DOWN | SWITCHES_GPIO_PIN_A_L | GPIO_Pin_4) #define KEYS_GPIOJ_PINS (SWITCHES_GPIO_PIN_D_H | TRIMS_GPIO_PIN_RVU | TRIMS_GPIO_PIN_LVD | TRIMS_GPIO_PIN_LVU | TRIMS_GPIO_PIN_RSD) #elif defined(PCBX10) - #define KEYS_GPIOB_PINS (GPIO_Pin_12 | GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_8 | GPIO_Pin_9) -#if defined(RADIO_TX16S) - #define KEYS_GPIOC_PINS (GPIO_Pin_13) -#endif + #if defined(RADIO_TX16S) + #define KEYS_GPIOB_PINS (GPIO_Pin_12 | GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13) + #else + #define KEYS_GPIOB_PINS (GPIO_Pin_12 | GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_8 | GPIO_Pin_9) + #endif #define KEYS_GPIOD_PINS (GPIO_Pin_11 | GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_13) #define KEYS_GPIOE_PINS (GPIO_Pin_3) #define KEYS_GPIOG_PINS (SWITCHES_GPIO_PIN_D_L | SWITCHES_GPIO_PIN_G_H | SWITCHES_GPIO_PIN_G_L | SWITCHES_GPIO_PIN_H | TRIMS_GPIO_PIN_LVD) +#if defined(RADIO_TX16S) + #define KEYS_GPIOA_PINS (GPIO_Pin_6) + #define KEYS_GPIOC_PINS (GPIO_Pin_4) + #define KEYS_GPIOH_PINS (GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15) +#else #define KEYS_GPIOH_PINS (GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15) +#endif #define KEYS_GPIOI_PINS (GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_11 | GPIO_Pin_15) #define KEYS_GPIOJ_PINS (SWITCHES_GPIO_PIN_D_H | TRIMS_GPIO_PIN_LVU | TRIMS_GPIO_PIN_RVD | TRIMS_GPIO_PIN_RVU | GPIO_Pin_8) #endif @@ -434,7 +448,7 @@ // Telemetry #define TELEMETRY_RCC_AHB1Periph (RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA1) #define TELEMETRY_RCC_APB1Periph RCC_APB1Periph_USART2 -#define TELEMETRY_RCC_APB2Periph RCC_APB2Periph_TIM11 +#define TELEMETRY_RCC_APB2Periph RCC_APB2Periph_TIM10 #define TELEMETRY_DIR_GPIO GPIOD #define TELEMETRY_DIR_GPIO_PIN GPIO_Pin_4 // PD.04 #define TELEMETRY_GPIO GPIOD From 57247a74eee15d2281bd1d8241b4657f56a32619 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 21 Mar 2020 12:01:52 +0100 Subject: [PATCH 170/560] Merge fix --- radio/src/targets/horus/hal.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index c4040dd3b..5e3ac2d1d 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -448,7 +448,7 @@ // Telemetry #define TELEMETRY_RCC_AHB1Periph (RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA1) #define TELEMETRY_RCC_APB1Periph RCC_APB1Periph_USART2 -#define TELEMETRY_RCC_APB2Periph RCC_APB2Periph_TIM10 +#define TELEMETRY_RCC_APB2Periph RCC_APB2Periph_TIM11 #define TELEMETRY_DIR_GPIO GPIOD #define TELEMETRY_DIR_GPIO_PIN GPIO_Pin_4 // PD.04 #define TELEMETRY_GPIO GPIOD From 069a6d3d91cc839a3aa27066755f651871804f6d Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 22 Mar 2020 16:08:38 +0100 Subject: [PATCH 171/560] Placeholder for touch hardware --- radio/src/gui/480x272/topbar.cpp | 14 ++++++++------ radio/src/targets/horus/CMakeLists.txt | 8 +++++++- radio/src/targets/horus/ft5x06.cpp | 21 +++++++++++++++++++++ radio/src/targets/horus/ft5x06.h | 24 ++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 7 deletions(-) create mode 100644 radio/src/targets/horus/ft5x06.cpp create mode 100644 radio/src/targets/horus/ft5x06.h diff --git a/radio/src/gui/480x272/topbar.cpp b/radio/src/gui/480x272/topbar.cpp index 487e70a9b..f631f7984 100644 --- a/radio/src/gui/480x272/topbar.cpp +++ b/radio/src/gui/480x272/topbar.cpp @@ -91,15 +91,17 @@ void drawTopBar() /* Tx battery */ uint8_t bars = GET_TXBATT_BARS(5); #if defined(USB_CHARGER) - if(usbChargerLed()) + if(usbChargerLed() && BLINK_ON_PHASE) lcdDrawBitmapPattern(LCD_W-130, 24, LBM_TOPMENU_TXBATT_CHARGING, MENU_TITLE_COLOR); - else + else { #endif - lcdDrawBitmapPattern(LCD_W-130, 24, LBM_TOPMENU_TXBATT, MENU_TITLE_COLOR); - for (unsigned int i = 0; i < 5; i++) { - lcdDrawSolidFilledRect(LCD_W-122+4*i, 30, 2, 8, i >= bars ? MENU_TITLE_DISABLE_COLOR : MENU_TITLE_COLOR); + lcdDrawBitmapPattern(LCD_W - 130, 24, LBM_TOPMENU_TXBATT, MENU_TITLE_COLOR); + for (unsigned int i = 0; i < 5; i++) { + lcdDrawSolidFilledRect(LCD_W - 122 + 4 * i, 30, 2, 8, i >= bars ? MENU_TITLE_DISABLE_COLOR : MENU_TITLE_COLOR); + } +#if defined(USB_CHARGER) } - +#endif topbar->refresh(); #if 0 diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index 601d82dfb..95f6e8c61 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -61,10 +61,11 @@ if (PCB STREQUAL X10) add_definitions(-DRADIO_FAMILY_T16) option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" ON) option(BLUETOOTH "Support for bluetooth module" OFF) + set(HARDWARE_TOUCH YES) + set(USB_CHARGER YES) if (NOT BLUETOOTH) set(AUX_SERIAL ON) endif() - set(USB_CHARGER YES) else() set(FLAVOUR x10) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON) @@ -207,6 +208,11 @@ set(TARGET_SRC ../common/arm/stm32/rotary_encoder_driver.cpp ) +if(HARDWARE_TOUCH) + set(TARGET_SRC ${TARGET_SRC} ft5x06.cpp) + add_definitions(-DHARDWARE_TOUCH) +endif() + if(USB_CHARGER) set(TARGET_SRC ${TARGET_SRC} usb_charger_driver.cpp) add_definitions(-DUSB_CHARGER) diff --git a/radio/src/targets/horus/ft5x06.cpp b/radio/src/targets/horus/ft5x06.cpp new file mode 100644 index 000000000..47765bbc7 --- /dev/null +++ b/radio/src/targets/horus/ft5x06.cpp @@ -0,0 +1,21 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "ft5x06.h" \ No newline at end of file diff --git a/radio/src/targets/horus/ft5x06.h b/radio/src/targets/horus/ft5x06.h new file mode 100644 index 000000000..a4d6b1f54 --- /dev/null +++ b/radio/src/targets/horus/ft5x06.h @@ -0,0 +1,24 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef _FT5X06_H_ +#define _FT5X06_H_ + +#endif // _FT5X06_H_ From b8572b546c04ca45cc1f8e7917046e14ccb76280 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 23 Mar 2020 11:13:41 +0100 Subject: [PATCH 172/560] Disable TX16s for now --- companion/src/firmwares/opentx/opentxinterface.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 794ad63e2..7f71b5ebd 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -1345,11 +1345,12 @@ void registerOpenTxFirmwares() registerOpenTxFirmware(firmware); addOpenTxRfOptions(firmware, FLEX); - /* Radiomaster TX16S board */ + // TX16S is unavailable until finalized + /* Radiomaster TX16S board firmware = new OpenTxFirmware("opentx-tx16s", Firmware::tr("Radiomaster TX16s / TX16s Hall / TX16s Masterfire"), BOARD_RADIOMASTER_TX16S); addOpenTxFrskyOptions(firmware); firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module")); - registerOpenTxFirmware(firmware); + registerOpenTxFirmware(firmware);*/ /* 9XR-Pro */ firmware = new OpenTxFirmware("opentx-9xrpro", Firmware::tr("Turnigy 9XR-PRO"), BOARD_9XRPRO); From 1f4ae1ddb995c5f081614697316fed85b5ca44a2 Mon Sep 17 00:00:00 2001 From: DanielGeA <33811722+dgatf@users.noreply.github.com> Date: Mon, 23 Mar 2020 17:16:59 +0000 Subject: [PATCH 173/560] Spanish translation (#7453) Update es translation --- radio/src/translations/es.h.txt | 837 ++++++++++++++++---------------- 1 file changed, 417 insertions(+), 420 deletions(-) diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index ab7c4b98c..c4446e52b 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -52,8 +52,8 @@ #define LEN_VBEEPMODE "\005" #define TR_VBEEPMODE "Mudo ""Alarm""NoKey""Todo " -#define LEN_VBLMODE "\004" -#define TR_VBLMODE "OFF ""Keys""Stks""Both""ON\0" +#define LEN_VBLMODE "\005" +#define TR_VBLMODE "OFF\0 ""Keys\0""Stks\0""Ambos""ON\0" #define LEN_TRNMODE "\003" #define TR_TRNMODE "OFF""+=\0"":=" @@ -63,37 +63,37 @@ #define LEN_AUX_SERIAL_MODES "\015" #if defined(CLI) || defined(DEBUG) -#define TR_AUX_SERIAL_MODES "Debug\0 ""Telem Mirror\0""Telemetry In\0""SBUS Trainer\0""LUA\0 " +#define TR_AUX_SERIAL_MODES "Debug\0 ""Telem Mirror\0""Telemetria\0 ""Entrenador SBUS""LUA\0 " #else -#define TR_AUX_SERIAL_MODES "OFF\0 ""Telem Mirror\0""Telemetry In\0""SBUS Trainer\0""LUA\0 " +#define TR_AUX_SERIAL_MODES "OFF\0 ""Telem Mirror\0""Telemetria\0 ""Entrenador SBUS""LUA\0 " #endif #define LEN_SWTYPES "\006" -#define TR_SWTYPES "None\0 ""Toggle""2POS\0 ""3POS\0" +#define TR_SWTYPES "Nada\0 ""Palanc""2POS\0 ""3POS\0" #define LEN_POTTYPES TR("\013", "\017") -#define TR_POTTYPES TR("None ""Pot w det ""Multipos ""Pot ", "None ""Pot with detent""Multipos Switch""Pot\0") +#define TR_POTTYPES TR("Nada\0 ""Pot con fij""Multipos\0 ""Pot\0 ", "Nada\0 ""Pot con fijador""Switch multipos""Pot\0 ") #define LEN_SLIDERTYPES "\006" -#define TR_SLIDERTYPES "Rien\0 ""Slider" +#define TR_SLIDERTYPES "Nada\0 ""Slider" #define LEN_VLCD "\006" #define TR_VLCD "NormalOptrex" #define LEN_VPERSISTENT "\014" -#define TR_VPERSISTENT "OFF\0 ""Flight\0 ""Manual Reset" +#define TR_VPERSISTENT "OFF\0 ""Vuelo\0 ""Reset manual" #define LEN_COUNTRYCODES TR("\002", "\007") #define TR_COUNTRYCODES TR("US""JP""EU", "America""Japon\0 ""Europa\0") -#define LEN_USBMODES TR("\006", "\010") -#define TR_USBMODES TR("Ask\0 ""Joyst\0""SDCard""Serial", "Ask\0 ""Joystick""Storage\0""Serial\0 ") +#define LEN_USBMODES TR("\006", "\008") +#define TR_USBMODES TR("Pregun""Joyst\0""SDCard""Serie\0", "Pregunta""Joystick""SDCard\0 ""Serie\0 ") #define LEN_JACKMODES "\007" -#define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" +#define TR_JACKMODES "Pregunt""Audio\0 ""Entrena" #define LEN_TELEMETRY_PROTOCOLS "\017" -#define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" +#define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetr." #define TR_MULTI_CUSTOM "Custom" @@ -101,16 +101,16 @@ #define TR_VTRIMINC TR("Expo ""ExFino""Fino ""Medio ""Grueso", "Exponencial""Extra Fino ""Fino ""Medio ""Grueso ") #define LEN_VDISPLAYTRIMS "\006" -#define TR_VDISPLAYTRIMS "No\0 ""Change""Yes\0" +#define TR_VDISPLAYTRIMS "No\0 ""Cambiar""Si\0 " #define LEN_VBEEPCOUNTDOWN "\006" -#define TR_VBEEPCOUNTDOWN "SilentBeeps\0Voz\0 Haptic" +#define TR_VBEEPCOUNTDOWN "SilencBeeps\0Voz\0 Haptic" -#define LEN_VVARIOCENTER "\006" -#define TR_VVARIOCENTER "Tone\0 ""Silent" +#define LEN_VVARIOCENTER "\008" +#define TR_VVARIOCENTER "Tono\0 ""Silencio" -#define LEN_CURVE_TYPES "\010" -#define TR_CURVE_TYPES "Standard""Custom\0" +#define LEN_CURVE_TYPES "\006" +#define TR_CURVE_TYPES "Normal""Custom" #define LEN_RETA123 "\001" @@ -180,9 +180,9 @@ #endif #if defined(HAPTIC) - #define TR_HAPTIC "Tactil\0 " + #define TR_HAPTIC "Haptic\0 " #else - #define TR_HAPTIC "[Tactil]\0 " + #define TR_HAPTIC "[Haptic]\0 " #endif #if defined(VOICE) @@ -210,7 +210,7 @@ #if defined(GVARS) #define TR_ADJUST_GVAR "Ajuste\0 " #else - #define TR_ADJUST_GVAR "[AdjustGV]" + #define TR_ADJUST_GVAR "[AjusteGV]" #endif #if defined(LUA) @@ -231,14 +231,14 @@ #define TR_SF_SAFETY "---\0 " #endif -#define TR_SF_SCREENSHOT "Screenshot" -#define TR_SF_RESERVE "[reserve]\0" +#define TR_SF_SCREENSHOT "Captura" +#define TR_SF_RESERVE "[reserv.]\0" -#define TR_VFSWFUNC TR_SF_SAFETY "Aprendiz\0 ""Inst. Trim""Reset\0 ""Set \0 " TR_ADJUST_GVAR "Volumen\0 " "SetFailsfe" "RangeCheck" "ModuleBind" TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_SF_RESERVE TR_SF_PLAY_SCRIPT TR_SF_RESERVE TR_SF_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Luz fondo\0" TR_SF_SCREENSHOT TR_SF_TEST +#define TR_VFSWFUNC TR_SF_SAFETY "Entrena.\0 ""Inst. Trim""Reset\0 ""Set \0 " TR_ADJUST_GVAR "Volumen\0 " "SetFailsfe" "RangeCheck" "ModuleBind" TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_SF_RESERVE TR_SF_PLAY_SCRIPT TR_SF_RESERVE TR_SF_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Luz fondo\0" TR_SF_SCREENSHOT TR_SF_TEST #define LEN_VFSWRESET TR("\004", "\011") -#define TR_FSW_RESET_TELEM TR("Telm", "Telemetry") +#define TR_FSW_RESET_TELEM TR("Telm", "Telemetria") #if defined(PCBTARANIS) #define TR_FSW_RESET_TIMERS "Timer 1\0 ""Timer 2\0 ""Timer 3\0 " @@ -275,8 +275,8 @@ #define LENGTH_UNIT_METR "m\0 " #define SPEED_UNIT_METR "kmh" - #define LEN_VUNITSSYSTEM TR("\006", "\010") - #define TR_VUNITSSYSTEM TR("Metric""Imper.", "Metric\0 ""Imperial") + #define LEN_VUNITSSYSTEM "\007" + #define TR_VUNITSSYSTEM "Metrico""Imperial" #define LEN_VTELEMUNIT "\003" #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""rad""ml\0""fOz" @@ -360,7 +360,7 @@ #endif #define TR_RESERVE_VSRCRAW "[--]" -#define TR_EXTRA_VSRCRAW "Batt""Time""GPS\0" TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW "Tmr1""Tmr2""Tmr3" +#define TR_EXTRA_VSRCRAW "Bat\0""Time""GPS\0" TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW TR_RESERVE_VSRCRAW "Tmr1""Tmr2""Tmr3" #define LEN_VTMRMODES "\003" #define TR_VTMRMODES "OFF""ABS""THs""TH%""THt" @@ -368,27 +368,27 @@ #define LEN_VTRAINERMODES "\022" #define TR_VTRAINER_MASTER_JACK "Master/Jack\0 " #define TR_VTRAINER_SLAVE_JACK "Esclav/Jack\0 " -#define TR_VTRAINER_MASTER_SBUS_MODULE "Master/SBUS Module" -#define TR_VTRAINER_MASTER_CPPM_MODULE "Master/CPPM Module" -#define TR_VTRAINER_MASTER_BATTERY "Master/Serial\0 " -#define TR_VTRAINER_BLUETOOTH TR("Master/BT\0 ""Slave/BT\0 ", "Master/Bluetooth\0 ""Slave/Bluetooth\0 ") +#define TR_VTRAINER_MASTER_SBUS_MODULE "Master/Modulo SBUS" +#define TR_VTRAINER_MASTER_CPPM_MODULE "Master/Modulo CPPM" +#define TR_VTRAINER_MASTER_BATTERY "Master/Serie\0 " +#define TR_VTRAINER_BLUETOOTH TR("Master/BT\0 ""Esclavo/BT\0 ", "Master/Bluetooth\0 ""Esclavo/Bluetooth\0") #define TR_VTRAINER_MULTI "Master/Multi" #define LEN_VFAILSAFE "\011" -#define TR_VFAILSAFE "Not set\0 ""Guardar\0 ""Adaptar\0 ""Sin pulso""Receiver\0" +#define TR_VFAILSAFE "No\0 ""Guardar\0 ""Adaptar\0 ""Sin pulso""Receptor\0" #define LEN_VSENSORTYPES "\012" -#define TR_VSENSORTYPES "Custom\0 ""Calculated" +#define TR_VSENSORTYPES "Custom\0 ""Calculado" #define LEN_VFORMULAS "\010" -#define TR_VFORMULAS "Add\0 ""Average\0""Min\0 ""Max\0 ""Multiply""Totalize""Cell\0 ""Consumpt""Distance" +#define TR_VFORMULAS "Suma\0 ""Media\0 ""Min\0 ""Max\0 ""Multipl.""Total\0 ""Cell\0 ""Consumo\0""Distanc." #define LEN_VPREC "\004" #define TR_VPREC "0.--""0.0 ""0.00" #define LEN_VCELLINDEX "\007" -#define TR_VCELLINDEX "Lowest\0""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Highest""Delta\0" +#define TR_VCELLINDEX "Menor\0 ""1\0 ""2\0 ""3\0 ""4\0 ""5\0 ""6\0 ""Mayor\0 ""Delta\0" #define LEN_GYROS "\004" #define TR_GYROS "GyrX""GyrY" @@ -433,35 +433,31 @@ #define TR_COPYINGMODEL "Copiando modelo.." #define TR_MOVINGMODEL "Mover modelo..." #define TR_LOADINGMODEL "Cargar modelo..." -#define TR_NAME "Nom." +#define TR_NAME "Nombre" #define TR_MODELNAME "Nom.Modelo" #define TR_PHASENAME "Nom.Fase " #define TR_MIXNAME "Nom.Mezcla" -#define TR_INPUTNAME "Input Name" -#if defined(PCBTARANIS) - #define TR_EXPONAME "Line Name" -#else - #define TR_EXPONAME "Nom. Expo" -#endif +#define TR_INPUTNAME TR("N.entr","Nombre entrada") +#define TR_EXPONAME TR("N.expo","Nombre expo") #define TR_BITMAP "Imagen Modelo" #define TR_TIMER TR("Reloj","Reloj ") #define TR_ELIMITS TR("E.Limite","Ampliar Limites") #define TR_ETRIMS TR("E.Trims","Ampliar Trims") #define TR_TRIMINC "Paso Trim" -#define TR_DISPLAY_TRIMS "Display Trims" +#define TR_DISPLAY_TRIMS "Ver Trims" #define TR_TTRACE TR("Fuente-A", INDENT "Fuente Acelerad") #define TR_TTRIM TR("Trim-A", INDENT "Trim Acelerad") -#define TR_BEEPCTR TR("Ctr Beep","Center Beep") -#define TR_USE_GLOBAL_FUNCS "Use Global Funcs" +#define TR_BEEPCTR TR("Beep ctr","Beep centro") +#define TR_USE_GLOBAL_FUNCS "Funcs glob." #if defined(PCBSKY9X) && defined(REVX) #define TR_OUTPUT_TYPE INDENT "Output" #endif -#define TR_PROTO TR(INDENT"Proto",INDENT"Protocol") +#define TR_PROTO TR(INDENT"Proto",INDENT"Protocolo") #define TR_PPMFRAME "Trama PPM" -#define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") -#define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") +#define TR_REFRESHRATE TR(INDENT "Refresco", INDENT "Velocidad refresco") +#define STR_WARN_BATTVOLTAGE TR(INDENT "Salida es VBAT: ", INDENT "Aviso: señal salida es VBAT: ") #define TR_MS "ms" -#define TR_FREQUENCY INDENT "Frequency" +#define TR_FREQUENCY INDENT "Frequencia" #define TR_SWITCH "Interr" #define TR_TRIMS "Trims" #define TR_FADEIN "Inicio" @@ -471,14 +467,14 @@ #define OFS_CHECKTRIMS CENTER_OFS+(9*FW) #define TR_SWASHTYPE "Tipo ciclico" #define TR_COLLECTIVE TR("Colectivo", "Fuente Colectivo") -#define TR_AILERON TR("Lateral cyc.", "Lateral cyc. source") -#define TR_ELEVATOR TR("Long. cyc.", "Long. cyc. source") +#define TR_AILERON TR("Col. lateral", "Fuente col. lateral") +#define TR_ELEVATOR TR("Col. long. ", "Fuente col. longitudinal") #define TR_SWASHRING "Ciclico" #define TR_ELEDIRECTION TR("ELE Direccion","Largo cyc. direccion") #define TR_AILDIRECTION TR("AIL Direccion","Lateral cyc. direccion") #define TR_COLDIRECTION TR("PIT Direccion","Coll. pitch direccion") #define TR_MODE "Modo" -#define TR_SUBTYPE INDENT "Subtype" +#define TR_SUBTYPE INDENT "Subtipo" #define TR_NOFREEEXPO "No expo libre!" #define TR_NOFREEMIXER "No mezcla lib!" #define TR_SOURCE "Fuente" @@ -494,27 +490,27 @@ #define TR_FLMODE TR("Modo","Modos") #define TR_MIXWARNING "Aviso" #define TR_OFF "OFF" -#define TR_ANTENNA "Antenna" -#define TR_NO_INFORMATION TR("No info", "No information") -#define TR_MULTPX "Multpx" -#define TR_DELAYDOWN "Delay Dn" -#define TR_DELAYUP "Delay Up" -#define TR_SLOWDOWN "Slow Dn" -#define TR_SLOWUP "Slow Up" -#define TR_MIXES "Mezclas" +#define TR_ANTENNA "Antena" +#define TR_NO_INFORMATION TR("Sin info", "Sin informacion") +#define TR_MULTPX "Multipx" +#define TR_DELAYDOWN "Atraso bajar" +#define TR_DELAYUP "Atraso subir" +#define TR_SLOWDOWN "Bajar lento " +#define TR_SLOWUP "Subir lento" +#define TR_MIXES "MEZCLAS" #define TR_CV "CV" #define TR_GV TR("G", "GV") #define TR_ACHANNEL "A\004canal" #define TR_RANGE INDENT"Alcance" -#define TR_CENTER INDENT "Center" +#define TR_CENTER INDENT "Centro" #define TR_BAR "Bar" #define TR_ALARM INDENT"Alarma" #define TR_USRDATA "UsrData" #define TR_BLADES INDENT"Palas" -#define TR_SCREEN "Pantalla" +#define TR_SCREEN "Pant. " #define TR_SOUND_LABEL "Sonido" #define TR_LENGTH INDENT"Longitud" -#define TR_BEEP_LENGTH INDENT "Beep Length" +#define TR_BEEP_LENGTH INDENT "Duracion Beep" #define TR_SPKRPITCH INDENT"Tono" #define TR_HAPTIC_LABEL "Tactil" #define TR_HAPTICSTRENGTH INDENT"Intensidad" @@ -528,36 +524,36 @@ #define TR_INACTIVITYALARM INDENT"Inactividad" #define TR_MEMORYWARNING INDENT"Memoria Baja" #define TR_ALARMWARNING INDENT"Sin Sonido" -#define TR_RSSISHUTDOWNALARM TR(INDENT "Rssi Shutdown", INDENT "Check Rssi on Shutdown") -#define TR_MODEL_STILL_POWERED "Model still powered" -#define TR_MODEL_SHUTDOWN "Shutdown ?" -#define TR_PRESS_ENTER_TO_CONFIRM "Press enter to confirm" -#define TR_THROTTLE_LABEL "Throttle" +#define TR_RSSISHUTDOWNALARM TR(INDENT "Apagado Rssi", INDENT "Check Rssi al apagar") +#define TR_MODEL_STILL_POWERED "Modelo aun encendido" +#define TR_MODEL_SHUTDOWN "Apagar ?" +#define TR_PRESS_ENTER_TO_CONFIRM "Enter para confirmar" +#define TR_THROTTLE_LABEL "Potencia" #define TR_THROTTLEREVERSE TR("Invert_Acel", INDENT "Invertir Acel.") #define TR_MINUTEBEEP TR("Minuto", "Cada Minuto") -#define TR_BEEPCOUNTDOWN INDENT"Cuentaatras" +#define TR_BEEPCOUNTDOWN INDENT"Cta. atras" #define TR_PERSISTENT TR(INDENT"Persist.", INDENT"Persistente") #define TR_BACKLIGHT_LABEL "Luz Fondo" #define TR_BLDELAY INDENT"Duracion" #define TR_BLONBRIGHTNESS INDENT"MAS Brillo" #define TR_BLOFFBRIGHTNESS INDENT"MENOS Brillo" #define TR_BLCOLOR INDENT "Color" -#define TR_SPLASHSCREEN "Ptalla.inicio" -#define TR_PWR_ON_DELAY "Pwr On delay" -#define TR_PWR_OFF_DELAY "Pwr Off delay" +#define TR_SPLASHSCREEN "Pant. inicio" +#define TR_PWR_ON_DELAY "Atraso On" +#define TR_PWR_OFF_DELAY "Atraso Off" #define TR_THROTTLEWARNING TR("Aviso-A", INDENT "Aviso Acelerador") #define TR_SWITCHWARNING TR("Aviso-I", INDENT "Aviso Intrptor") #define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") -#define TR_SLIDERWARNING TR(INDENT "Slid. pos.", INDENT "Slider positions") -#define TR_POTWARNING TR("Pot Warn.", INDENT "Pot Warning") +#define TR_SLIDERWARNING TR(INDENT "Pos. slid.", INDENT "Posiciones slider") +#define TR_POTWARNING TR("Aviso pot", INDENT "Aviso pot") #define TR_TIMEZONE TR("Zona Hora", "GPS Zona Hora") -#define TR_ADJUST_RTC TR("Adjust RTC", INDENT "Adjust RTC") +#define TR_ADJUST_RTC TR("Ajustar RTC", INDENT "Ajustar RTC") #define TR_GPS "GPS" #define TR_RXCHANNELORD TR("Rx Orden canal", "Orden habitual canales") #define TR_STICKS "Sticks" #define TR_POTS "Pots" #define TR_SWITCHES "Switches" -#define TR_SWITCHES_DELAY "Switches Delay" +#define TR_SWITCHES_DELAY "Atraso switch." #define TR_SLAVE "Esclavo" #define TR_MODESRC "Modo\006% Fuente" #define TR_MULTIPLIER "Multiplicar" @@ -565,22 +561,22 @@ #define TR_VTRIM "Trim- +" #define TR_BG "BG:" #if defined(PCBHORUS) - #define TR_MENUTOSTART "Press [Enter] to start" - #define TR_SETMIDPOINT "Center sticks/pots/sliders and press [Enter]" - #define TR_MOVESTICKSPOTS "Move sticks, pots and sliders and press [Enter]" + #define TR_MENUTOSTART "Presiona [Enter] para empezar" + #define TR_SETMIDPOINT "Centra sticks/pots/sliders y presiona [Enter]" + #define TR_MOVESTICKSPOTS "Mueve sticks, pots and sliders y presiona [Enter]" #else #define TR_MENUTOSTART CENTER "\010" TR_ENTER " EMPEZAR" #define TR_SETMIDPOINT TR(CENTER "\007STICKS AL CENTRO",CENTER "\010STICKS AL CENTRO") #define TR_MOVESTICKSPOTS CENTER "\006MOVER STICKS/POTS" #endif -#define TR_RXBATT "Rx Batt:" +#define TR_RXBATT "Rx Bat.:" #define TR_TXnRX "Tx:\0Rx:" #define OFS_RX 4 #define TR_ACCEL "Acc:" #define TR_NODATA CENTER "SIN DATOS" #define TR_US "us" -#define TR_TMIXMAXMS "Tmix max" -#define TR_FREE_STACK "Free stack" +#define TR_TMIXMAXMS "Tmix max" +#define TR_FREE_STACK "Stack libre" #define TR_MENUTORESET TR_ENTER "Resetear" #define TR_PPM_TRAINER "TR" #define TR_CH "CH" @@ -589,19 +585,19 @@ #define TR_MIX "MIX" #define TR_EEPROMLOWMEM "EEPROM mem.baja" #define TR_ALERT "\016ALERTA" -#define TR_PRESSANYKEYTOSKIP "Pulsar tecla omitir" +#define TR_PRESSANYKEYTOSKIP "Pulsar tecla para omitir" #define TR_THROTTLENOTIDLE "Aceler. Activado" #define TR_ALARMSDISABLED "Alarmas Desact." #define TR_PRESSANYKEY TR("\010Pulsa una Tecla", "Pulsa una Tecla") -#define TR_BADEEPROMDATA "Datos EEprom mal" -#define TR_BAD_RADIO_DATA "Bad Radio Data" +#define TR_BADEEPROMDATA "Error datos EEprom" +#define TR_BAD_RADIO_DATA "Error datos radio" #define TR_EEPROMFORMATTING "Formateo EEPROM" -#define TR_STORAGE_FORMAT "Storage Preparation" +#define TR_STORAGE_FORMAT "Preparacion alamacenamiento" #define TR_EEPROMOVERFLOW "Desborde EEPROM" #define TR_MENURADIOSETUP "CONFIGURACION" #define TR_MENUDATEANDTIME "FECHA Y HORA" -#define TR_MENUTRAINER "APRENDIZ" -#define TR_MENUSPECIALFUNCS "GLOBAL FUNCTIONS" +#define TR_MENUTRAINER "ENTRENADOR" +#define TR_MENUSPECIALFUNCS "FUNCIONES GLOBALES" #define TR_MENUVERSION "VERSION" #define TR_MENU_RADIO_SWITCHES TR("INTERUPTS", "TEST INTERUP.") #define TR_MENU_RADIO_ANALOGS TR("ANAS", "ENTRADAS ANALOG") @@ -611,13 +607,13 @@ #else #define TR_TRIMS2OFFSETS "\006Trims => Offsets" #endif -#define TR_CHANNELS2FAILSAFE "Channels=>Failsafe" -#define TR_CHANNEL2FAILSAFE "Channel=>Failsafe" -#define TR_MENUMODELSEL TR("MODELSEL", "SELECCION MODELO") -#define TR_MENUSETUP TR("CONF.", "CONF.MODELO") -#define TR_MENUFLIGHTMODE "MODO VUELO" -#define TR_MENUFLIGHTMODES "MODOS VUELO" -#define TR_MENUHELISETUP "CONF. HELI" +#define TR_CHANNELS2FAILSAFE "Canales=>Failsafe" +#define TR_CHANNEL2FAILSAFE "Canal=>Failsafe" +#define TR_MENUMODELSEL TR("MODELOS", "SELECCION MODELO") +#define TR_MENUSETUP "CONFIG. MODELO" +#define TR_MENUFLIGHTMODE "MODO DE VUELO" +#define TR_MENUFLIGHTMODES "MODOS DE VUELO" +#define TR_MENUHELISETUP "CONFIGURACION HELI" // Alignment @@ -632,143 +628,143 @@ #define TR_MENUCURVES "CURVAS" #define TR_MENUCURVE "CURVA" -#define TR_MENULOGICALSWITCH "AJTE.INTERUP." -#define TR_MENULOGICALSWITCHES "AJTE.INTERUPTS." -#define TR_MENUCUSTOMFUNC "AJTE. FUNCIONES" +#define TR_MENULOGICALSWITCH "INTERRUP. LOGICO" +#define TR_MENULOGICALSWITCHES "INTERRUP. LOGICOS" +#define TR_MENUCUSTOMFUNC "FUNCIONES" #define TR_MENUCUSTOMSCRIPTS "CUSTOM SCRIPTS" #define TR_MENUTELEMETRY "TELEMETRIA" #define TR_MENUTEMPLATES "PLANTILLAS" -#define TR_MENUSTAT "STATS" +#define TR_MENUSTAT "ESTADISTICAS" #define TR_MENUDEBUG "DEBUG" -#define TR_MONITOR_CHANNELS1 "CHANNELS MONITOR 1/8" -#define TR_MONITOR_CHANNELS2 "CHANNELS MONITOR 9/16" -#define TR_MONITOR_SWITCHES "LOGICAL SWITCHES MONITOR" -#define TR_MONITOR_CHANNELS3 "CHANNELS MONITOR 17/24" -#define TR_MONITOR_CHANNELS4 "CHANNELS MONITOR 25/32" -#define TR_MONITOR_OUTPUT_DESC "Outputs" -#define TR_MONITOR_MIXER_DESC "Mixers" -#define TR_RECEIVER_NUM TR("RxNum", "Receptor No.") -#define TR_RECEIVER "Receiver" -#define TR_MULTI_RFTUNE TR("Freq tune", "RF Freq. fine tune") -#define TR_MULTI_TELEMETRY "Telemetry" -#define TR_MULTI_VIDFREQ TR("Vid. freq.", "Video frequency") -#define TR_RFPOWER "RF Power" -#define TR_MULTI_FIXEDID TR("FixedID", "Fixed ID") -#define TR_MULTI_OPTION TR("Option", "Option value") -#define TR_MULTI_AUTOBIND TR(INDENT "Bind Ch.",INDENT "Bind on channel") -#define TR_DISABLE_CH_MAP TR("No Ch. map", "Disable Ch. map") -#define TR_DISABLE_TELEM TR("No Telem", "Disable Telemetry") -#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") -#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") +#define TR_MONITOR_CHANNELS1 "MONITOR CANALES 1/8" +#define TR_MONITOR_CHANNELS2 "MONITOR CANALES 9/16" +#define TR_MONITOR_SWITCHES "MONITOR INTERRP LOGICOS" +#define TR_MONITOR_CHANNELS3 "MONITOR CANALES 17/24" +#define TR_MONITOR_CHANNELS4 "MONITOR CANALES 25/32" +#define TR_MONITOR_OUTPUT_DESC "SALIDAS" +#define TR_MONITOR_MIXER_DESC "MEZCLAS" +#define TR_RECEIVER_NUM TR("RxNum", "Receptor No.") +#define TR_RECEIVER "Receptor" +#define TR_MULTI_RFTUNE TR("Sint.freq.", "RF Freq. sint.fina") +#define TR_MULTI_TELEMETRY "Telemetria" +#define TR_MULTI_VIDFREQ TR("Freq. Vid.", "Frecuancia Video") +#define TR_RFPOWER "RF Power" +#define TR_MULTI_FIXEDID TR("ID Fijo", "ID Fijo") +#define TR_MULTI_OPTION TR("Opcion", "Valor opcion") +#define TR_MULTI_AUTOBIND TR(INDENT "Emp Cnl",INDENT "Emparejar en canal") +#define TR_DISABLE_CH_MAP TR("No ch map", "Desactivar mapa cnl") +#define TR_DISABLE_TELEM TR("No Telem", "Desactivar Telemetria") +#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetectar formato") +#define TR_MULTI_LOWPOWER TR(INDENT "Baja potencia", INDENT "Modo de baja potencia") #define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link") -#define TR_MODULE_TELEM_ON TR("ON", "Enabled") -#define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF") -#define TR_MODULE_NO_SERIAL_MODE TR("!serial mode", "Not in serial mode") -#define TR_MODULE_NO_INPUT TR("No input", "No serial input") -#define TR_MODULE_NO_TELEMETRY TR3( "No telmetry", "No MULTI_TELEMETRY", "No telemetry (enable MULTI_TELEMETRY)") -#define TR_MODULE_WAITFORBIND "Bind to load protocol" -#define TR_MODULE_BINDING "Binding" -#define TR_MODULE_UPGRADE_ALERT TR3("Upg. needed", "Module upgrade required", "Module\nUpgrade required") -#define TR_MODULE_UPGRADE TR("Upg. advised", "Module update recommended") -#define TR_REBIND "Rebinding required" -#define TR_REG_OK "Registration ok" -#define TR_BIND_OK "Bind successful" -#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" -#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" -#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON" -#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF" -#define TR_PROTOCOL_INVALID TR("Prot. invalid", "Protocol invalid") -#define TR_MODULE_STATUS TR(INDENT "Status", INDENT "Module Status") -#define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Proto Sync Status") -#define TR_MULTI_SERVOFREQ TR("Servo rate", "Servo update rate") -#define TR_MULTI_MAX_THROW TR("Max. Throw", "Enable max. throw") -#define TR_MULTI_RFCHAN TR("RF Channel", "Select RF channel") -#define TR_SYNCMENU "Sync " TR_ENTER -#define TR_LIMIT INDENT"Limite" -#define TR_MINRSSI "Min Rssi" -#define TR_LATITUDE "Latitud" -#define TR_LONGITUDE "Longitud" -#define TR_GPSCOORD TR("GPS Coords", "GPS formato coordenadas") -#define TR_VARIO TR("Vario", "Variometro") -#define TR_PITCH_AT_ZERO INDENT "Pitch at Zero" -#define TR_PITCH_AT_MAX INDENT "Pitch at Max" -#define TR_REPEAT_AT_ZERO INDENT "Repeat at Zero" -#define TR_SHUTDOWN "APAGANDO" -#define TR_SAVEMODEL "Saving model settings" -#define TR_BATT_CALIB "Calib.bateria" -#define TR_CURRENT_CALIB "Calib. actual" -#define TR_VOLTAGE INDENT"Voltaje" -#define TR_CURRENT INDENT"Actual" -#define TR_SELECT_MODEL "Selec Modelo" -#define TR_CREATE_CATEGORY "Create Category" -#define TR_RENAME_CATEGORY "Rename Category" -#define TR_DELETE_CATEGORY "Delete Category" -#define TR_CREATE_MODEL "Crear Modelo" -#define TR_DUPLICATE_MODEL "Duplicate Model" -#define TR_COPY_MODEL "Copiar Modelo" -#define TR_MOVE_MODEL "Mover Modelo" -#define TR_BACKUP_MODEL "Copia Sgdad Mod." -#define TR_DELETE_MODEL "Borrar Modelo" -#define TR_RESTORE_MODEL "Restaurar Modelo" -#define TR_DELETE_ERROR "Delete error" -#define TR_CAT_NOT_EMPTY "Category is not empty" -#define TR_SDCARD_ERROR "SDCARD Error" -#define TR_NO_SDCARD "No SDCARD" -#define TR_WAITING_FOR_RX "Waiting for RX..." -#define TR_WAITING_FOR_TX "Waiting for TX..." -#define TR_NO_TOOLS "No tools available" +#define TR_MODULE_TELEM_ON TR("ON", "Activado") +#define TR_DISABLE_INTERNAL TR("Desac.RF int", "Desactivar modulo interno RF") +#define TR_MODULE_NO_SERIAL_MODE TR("No modo serie", "No en modo serie") +#define TR_MODULE_NO_INPUT TR("Sin señal", "Sin señal") +#define TR_MODULE_NO_TELEMETRY TR3( "No telemetria", "No MULTI_TELEMETRY", "No telemetria (activa MULTI_TELEMETRY)") +#define TR_MODULE_WAITFORBIND "Emparejar con protocolo" +#define TR_MODULE_BINDING "Emparejando" +#define TR_MODULE_UPGRADE_ALERT TR3("Actualizar", "Actualizar modulo", "Actualizar\nmodulo") +#define TR_MODULE_UPGRADE TR("Act recom", "Actualizar modulo recomendado") +#define TR_REBIND "Reemparejar " +#define TR_REG_OK "Registro ok" +#define TR_BIND_OK "Emparejado ok" +#define TR_BINDING_CH1_8_TELEM_ON "Ch1-8 Telem ON" +#define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" +#define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON" +#define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF" +#define TR_PROTOCOL_INVALID TR("Prot. invalido", "Protocolo invalido") +#define TR_MODULE_STATUS TR(INDENT "EStado", INDENT "Estado modulo") +#define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Estado proto sync") +#define TR_MULTI_SERVOFREQ TR("V ref serv", "Vel. refr. servo") +#define TR_MULTI_MAX_THROW TR("Max. Throw", "Activar max. throw") +#define TR_MULTI_RFCHAN TR("Canal RF", "Selecciona canal RF") +#define TR_SYNCMENU "Sync " TR_ENTER +#define TR_LIMIT INDENT"Limite" +#define TR_MINRSSI "Min Rssi" +#define TR_LATITUDE "Latitud" +#define TR_LONGITUDE "Longitud" +#define TR_GPSCOORD TR("Coords GPS", "GPS formato coordenadas") +#define TR_VARIO TR("Vario", "Variometro") +#define TR_PITCH_AT_ZERO INDENT "Pitch en cero" +#define TR_PITCH_AT_MAX INDENT "Pitch en max" +#define TR_REPEAT_AT_ZERO INDENT "Repet. en cero" +#define TR_SHUTDOWN "APAGANDO" +#define TR_SAVEMODEL "Grabando modelo" +#define TR_BATT_CALIB "Calib.bat." +#define TR_CURRENT_CALIB "Calib. actual" +#define TR_VOLTAGE INDENT"Voltaje" +#define TR_CURRENT INDENT"Actual" +#define TR_SELECT_MODEL "Selec Modelo" +#define TR_CREATE_CATEGORY "Crear categoria" +#define TR_RENAME_CATEGORY "Renombrar categoria" +#define TR_DELETE_CATEGORY "Borrar categoria" +#define TR_CREATE_MODEL "Crear modelo" +#define TR_DUPLICATE_MODEL "Duplicar modelo" +#define TR_COPY_MODEL "Copiar modelo" +#define TR_MOVE_MODEL "Mover modelo" +#define TR_BACKUP_MODEL "Copia sgdad mod." +#define TR_DELETE_MODEL "Borrar modelo" +#define TR_RESTORE_MODEL "Restaurar modelo" +#define TR_DELETE_ERROR "Error de borrado" +#define TR_CAT_NOT_EMPTY "Categoria no esta vacia" +#define TR_SDCARD_ERROR "Error SDCARD" +#define TR_NO_SDCARD "No SDCARD" +#define TR_WAITING_FOR_RX "Esperando a RX..." +#define TR_WAITING_FOR_TX "Esperando a TX..." +#define TR_NO_TOOLS "No hay utils" #define TR_NORMAL "Normal" -#define TR_NOT_INVERTED "Not inv" -#define TR_NOT_CONNECTED "!Connected" -#define TR_CONNECTED "Connected" +#define TR_NOT_INVERTED "No inv" +#define TR_NOT_CONNECTED "!Conectado" +#define TR_CONNECTED "Conectado" #define TR_FLEX_915 "Flex 915MHz" #define TR_FLEX_868 "Flex 868MHz" -#define TR_16CH_WITHOUT_TELEMETRY TR("16CH without telem.", "16CH without telemetry") -#define TR_16CH_WITH_TELEMETRY TR("16CH with telem.", "16CH with telemetry") -#define TR_8CH_WITH_TELEMETRY TR("8CH with telem.", "8CH with telemetry") -#define TR_EXT_ANTENNA "Ext. antenna" +#define TR_16CH_WITHOUT_TELEMETRY TR("16CH sin telem.", "16CH sin telemetria") +#define TR_16CH_WITH_TELEMETRY TR("16CH con telem.", "16CH con telemetria") +#define TR_8CH_WITH_TELEMETRY TR("8CH con telem.", "8CH con telemetria") +#define TR_EXT_ANTENNA "Antena ext." #define TR_PIN "Pin" -#define TR_UPDATE_RX_OPTIONS "Update RX options?" -#define TR_UPDATE_TX_OPTIONS "Update TX options?" -#define TR_MODULES_RX_VERSION "Modules / RX version" -#define TR_MENU_MODULES_RX_VERSION "MODULES / RX VERSION" -#define TR_MENU_FIRM_OPTIONS "FIRMWARE OPTIONS" +#define TR_UPDATE_RX_OPTIONS "Actualizar opciones RX?" +#define TR_UPDATE_TX_OPTIONS "Actualizar opciones TX?" +#define TR_MODULES_RX_VERSION "Modulos / version RX" +#define TR_MENU_MODULES_RX_VERSION "MODULOS / VERSION RX" +#define TR_MENU_FIRM_OPTIONS "OPCIONES FIRMWARE" #define TR_GYRO "Gyro" #define TR_STICKS_POTS_SLIDERS "Sticks/Pots/Sliders" #define TR_PWM_STICKS_POTS_SLIDERS "PWM Sticks/Pots/Sliders" -#define TR_RF_PROTOCOL "RF Protocol" -#define TR_MODULE_OPTIONS "Module options" -#define TR_POWER "Power" -#define TR_NO_TX_OPTIONS "No TX options" -#define TR_RTC_BATT "RTC Batt" -#define TR_POWER_METER_EXT "Power Meter (EXT)" -#define TR_POWER_METER_INT "Power Meter (INT)" -#define TR_SPECTRUM_ANALYSER_EXT "Spectrum (EXT)" -#define TR_SPECTRUM_ANALYSER_INT "Spectrum (INT)" -#define TR_SDCARD_FULL "SD Card Full" -#define TR_NEEDS_FILE "NEEDS FILE" +#define TR_RF_PROTOCOL "Protocolo RF" +#define TR_MODULE_OPTIONS "Opciones modulo" +#define TR_POWER "Potencia" +#define TR_NO_TX_OPTIONS "Sin pciones TX" +#define TR_RTC_BATT "Bat. RTC" +#define TR_POWER_METER_EXT "Medidor potencia(EXT)" +#define TR_POWER_METER_INT "Medidor potencia(INT)" +#define TR_SPECTRUM_ANALYSER_EXT "Spectro (EXT)" +#define TR_SPECTRUM_ANALYSER_INT "Spectro (INT)" +#define TR_SDCARD_FULL "SD Card llena" +#define TR_NEEDS_FILE "NECESITA ARCHIVO" #define TR_EXT_MULTI_SPEC "opentx-inv" #define TR_INT_MULTI_SPEC "stm-opentx-noinv" #define TR_INCOMPATIBLE "Incompatible" #define TR_WARNING "AVISO" #define TR_EEPROMWARN "EEPROM" -#define TR_STORAGE_WARNING "STORAGE" -#define TR_EEPROM_CONVERTING "EEPROM Converting" +#define TR_STORAGE_WARNING "ALMAC." +#define TR_EEPROM_CONVERTING "Convirtiendo EEPROM" #define TR_THROTTLEWARN "ACELERADOR" #define TR_ALARMSWARN "ALARMAS" #define TR_SWITCHWARN "INTERPTOR" #define TR_FAILSAFEWARN "FAILSAFE" #define TR_TEST_WARNING TR("TESTING", "TEST BUILD") -#define TR_TEST_NOTSAFE "Use for tests only" -#define TR_WRONG_SDCARDVERSION TR("Expected ver: ","Expected version: ") -#define TR_WARN_RTC_BATTERY_LOW "RTC Battery low" -#define TR_WARN_MULTI_LOWPOWER "Low power mode" -#define TR_BATTERY "BATTERY" -#define TR_WRONG_PCBREV "Wrong PCB detected" -#define TR_EMERGENCY_MODE "EMERGENCY MODE" -#define TR_PCBREV_ERROR "PCB error" -#define TR_NO_FAILSAFE "Failsafe not set" -#define TR_KEYSTUCK "Key stuck" +#define TR_TEST_NOTSAFE "Usar solo para test" +#define TR_WRONG_SDCARDVERSION TR("Ver esperada: ","Version esperada: ") +#define TR_WARN_RTC_BATTERY_LOW "Bateria RTC baja" +#define TR_WARN_MULTI_LOWPOWER "Modo baja potencia" +#define TR_BATTERY "BATERiA" +#define TR_WRONG_PCBREV "Placa PCB erronea" +#define TR_EMERGENCY_MODE "MODO EMERGENCIA" +#define TR_PCBREV_ERROR "Error PCB" +#define TR_NO_FAILSAFE "Failsafe no fijado" +#define TR_KEYSTUCK "Tecla atascada" #define TR_INVERT_THR TR("Invertir Acel?", "Invertir Acel.?") #define TR_SPEAKER_VOLUME INDENT "Volumen" #define TR_LCD "LCD" @@ -788,20 +784,20 @@ #define TR_SD_CARD "SD CARD" #define TR_SDHC_CARD "SD-HC CARD" #define TR_NO_SOUNDS_ON_SD "Sin sonidos en SD" -#define TR_NO_MODELS_ON_SD "Sin Modelos en SD" +#define TR_NO_MODELS_ON_SD "Sin modelos en SD" #define TR_NO_BITMAPS_ON_SD "Sin imagenes en SD" -#define TR_NO_SCRIPTS_ON_SD "No Scripts on SD" +#define TR_NO_SCRIPTS_ON_SD "No scripts en SD" #define TR_SCRIPT_SYNTAX_ERROR "Script syntax error" #define TR_SCRIPT_PANIC "Script panic" #define TR_SCRIPT_KILLED "Script killed" -#define TR_SCRIPT_ERROR "Unknown error" +#define TR_SCRIPT_ERROR "Error desconocido" #define TR_PLAY_FILE "Play" #define TR_DELETE_FILE "Borrar" #define TR_COPY_FILE "Copiar" #define TR_RENAME_FILE "Renombrar" -#define TR_ASSIGN_BITMAP "Asignar Imagen" -#define TR_ASSIGN_SPLASH "Splash screen" -#define TR_EXECUTE_FILE "Execute" +#define TR_ASSIGN_BITMAP "Asignar imagen" +#define TR_ASSIGN_SPLASH "Pant. bienvenida" +#define TR_EXECUTE_FILE "Ejecutar" #define TR_REMOVED "Borrado" #define TR_SD_INFO "Informacion" #define TR_SD_FORMAT "Formatear" @@ -813,17 +809,17 @@ #define TR_MAXBAUDRATE "Max bauds" #define TR_BLUETOOTH "Bluetooth" -#define TR_BLUETOOTH_DISC "Discover" +#define TR_BLUETOOTH_DISC "Buscar" #define TR_BLUETOOTH_INIT "Init" -#define TR_BLUETOOTH_DIST_ADDR "Dist addr" -#define TR_BLUETOOTH_LOCAL_ADDR "Local addr" -#define TR_BLUETOOTH_PIN_CODE "PIN code" -#define TR_BAUDRATE "BT Baudrate" +#define TR_BLUETOOTH_DIST_ADDR "Dir. remota" +#define TR_BLUETOOTH_LOCAL_ADDR "Dir. local" +#define TR_BLUETOOTH_PIN_CODE "Codigo PIN" +#define TR_BAUDRATE "Velocidad BT" #define LEN_BLUETOOTH_MODES "\011" #if defined(PCBX9E) -#define TR_BLUETOOTH_MODES "---\0 ""Enabled\0 " +#define TR_BLUETOOTH_MODES "---\0 ""Activo\0 " #else -#define TR_BLUETOOTH_MODES "---\0 ""Telemetry""Trainer\0" +#define TR_BLUETOOTH_MODES "---\0 ""Telemetria""Entrenador" #endif #define TR_SD_INFO_TITLE "SD INFO" #define TR_SD_TYPE "Tipo:" @@ -831,180 +827,181 @@ #define TR_SD_SECTORS "Sectores:" #define TR_SD_SIZE "Tamaño:" #define TR_TYPE INDENT "Tipo" -#define TR_GLOBAL_VARS "Global Variables" -#define TR_GVARS "GLOBAL V." -#define TR_GLOBAL_VAR "Global Variable" -#define TR_MENUGLOBALVARS "GLOBAL VARIABLES" -#define TR_OWN "Propio" -#define TR_DATE "Fecha" -#define TR_MONTHS { "Jan", "Fev", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" } -#define TR_ROTARY_ENCODER "R.E." -#define TR_CHANNELS_MONITOR "MONITOR CANALES" -#define TR_MIXERS_MONITOR "MIXERS MONITOR" -#define TR_PATH_TOO_LONG "Path too long" -#define TR_VIEW_TEXT "View text" -#define TR_FLASH_BOOTLOADER "Flash bootloader" -#define TR_FLASH_EXTERNAL_DEVICE "Flash External Device" -#define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" -#define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module") -#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit" -#define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ") -#define TR_FLASH_INTERNAL_MODULE "Flash Internal Module" -#define TR_FLASH_INTERNAL_MULTI TR("Flash Int. Multi", "Flash Internal Multi") -#define TR_FLASH_EXTERNAL_MODULE "Flash external module" -#define TR_FLASH_EXTERNAL_MULTI TR("Flash Ext. Multi", "Flash External Multi") -#define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware update error") -#define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" -#define TR_WRITING "Writing..." -#define TR_CONFIRM_FORMAT "Confirm Format?" -#define TR_INTERNALRF "Interna RF" -#define TR_INTERNAL_MODULE TR("Int. module","Internal module") -#define TR_EXTERNAL_MODULE TR("Ext. module","External module") -#define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required" -#define TR_TELEMETRY_DISABLED "Telem. disabled" -#define TR_MORE_OPTIONS_AVAILABLE "More options available" -#define TR_NO_MODULE_INFORMATION "No module information" -#define TR_EXTERNALRF "Externa RF" -#define TR_FAILSAFE INDENT"Modo sgdad." -#define TR_FAILSAFESET "AJUSTES SGDAD." +#define TR_GLOBAL_VARS "Variables globales" +#define TR_GVARS "V. GLOBAL" +#define TR_GLOBAL_VAR "Variable global" +#define TR_MENUGLOBALVARS "VARIABLES GLOBALES" +#define TR_OWN "Propio" +#define TR_DATE "Fecha" +#define TR_MONTHS { "Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic" } +#define TR_ROTARY_ENCODER "R.E." +#define TR_CHANNELS_MONITOR "MONITOR CANALES" +#define TR_MIXERS_MONITOR "MONITOR MEZCLAS" +#define TR_PATH_TOO_LONG "Path muy largo" +#define TR_VIEW_TEXT "Ver texto" +#define TR_FLASH_BOOTLOADER "Flash bootloader" +#define TR_FLASH_EXTERNAL_DEVICE "Flash disp. externo" +#define TR_FLASH_RECEIVER_OTA "Flash RX OTA" +#define TR_FLASH_BLUETOOTH_MODULE TR("Flash modulo BT", "Flash modulo bluetooth") +#define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash unid. pwr mngt" +#define TR_CURRENT_VERSION TR("Vers. actual", "Version actual: ") +#define TR_FLASH_INTERNAL_MODULE TR("Flash modulo int", "Flash modulo interno") +#define TR_FLASH_INTERNAL_MULTI TR("Flash Multi int", "Flash Multi interno") +#define TR_FLASH_EXTERNAL_MODULE TR("Flash modulo ext", "Flash modulo externo") +#define TR_FLASH_EXTERNAL_MULTI TR("Flash Multi ext", "Flash Multi externo") +#define TR_FIRMWARE_UPDATE_ERROR TR("Error act FW","Error actualiz. firmware") +#define TR_FIRMWARE_UPDATE_SUCCESS "Flash ok" +#define TR_WRITING "Escribiendo..." +#define TR_CONFIRM_FORMAT "Confirmar formato?" +#define TR_INTERNALRF "RF interna" +#define TR_INTERNAL_MODULE TR("Modulo int","Modulo interno") +#define TR_EXTERNAL_MODULE TR("Modulo ext","Modulo externo") +#define TR_OPENTX_UPGRADE_REQUIRED "Actualiz. OpenTX requerida" +#define TR_TELEMETRY_DISABLED "Telem. inactiva" +#define TR_MORE_OPTIONS_AVAILABLE "Mas opciones disp." +#define TR_NO_MODULE_INFORMATION "Sin informacion modulo" +#define TR_EXTERNALRF "RF externa" +#define TR_FAILSAFE INDENT"Modo sgdad." +#define TR_FAILSAFESET "AJUSTES SGDAD." #define TR_REG_ID "Reg. ID" -#define TR_OWNER_ID "Owner ID" +#define TR_OWNER_ID "Pers. ID" #define TR_PINMAPSET "PINMAP" -#define TR_HOLD "Hold" +#define TR_HOLD "Hold" #define TR_HOLD_UPPERCASE "HOLD" -#define TR_NONE "None" -#define TR_NONE_UPPERCASE "NONE" -#define TR_MENUSENSOR "SENSOR" -#define TR_POWERMETER_PEAK "Peak" -#define TR_POWERMETER_POWER "Power" +#define TR_NONE "Nada" +#define TR_NONE_UPPERCASE "NADA" +#define TR_MENUSENSOR "SENSOR" +#define TR_POWERMETER_PEAK "Pico" +#define TR_POWERMETER_POWER "Potencia" #define TR_POWERMETER_ATTN "Attn" -#define TR_POWERMETER_FREQ "Freq." -#define TR_MENUTOOLS "TOOLS" -#define TR_TURN_OFF_RECEIVER "Turn off receiver" -#define TR_STOPPING "Stopping..." -#define TR_MENU_SPECTRUM_ANALYSER "SPECTRUM ANALYSER" -#define TR_MENU_POWER_METER "POWER METER" -#define TR_SENSOR "SENSOR" -#define TR_COUNTRYCODE "Codigo Pais" -#define TR_USBMODE "USB Mode" -#define TR_JACKMODE "Jack Mode" -#define TR_VOICELANG "Idioma voces" -#define TR_UNITSSYSTEM "Unidades" -#define TR_EDIT "Editar" -#define TR_INSERT_BEFORE "Insertar antes" -#define TR_INSERT_AFTER "Insertar despues" -#define TR_COPY "Copiar" +#define TR_POWERMETER_FREQ "Frec." +#define TR_MENUTOOLS "UTILS" +#define TR_TURN_OFF_RECEIVER "Apaga el receptor" +#define TR_STOPPING "Parando..." +#define TR_MENU_SPECTRUM_ANALYSER "ANALIZADOR DE ESPECTRO" +#define TR_MENU_POWER_METER "MEDIDOR POTENCIA" +#define TR_SENSOR "SENSOR" +#define TR_COUNTRYCODE "Codigo Pais" +#define TR_USBMODE "Modo USB" +#define TR_JACKMODE "Modo Jack" +#define TR_VOICELANG "Idioma voces" +#define TR_UNITSSYSTEM "Unidades" +#define TR_EDIT "Editar" +#define TR_INSERT_BEFORE "Insertar antes" +#define TR_INSERT_AFTER "Insertar despues" +#define TR_COPY "Copiar" #define TR_MOVE "Mover" #define TR_PASTE "Pegar" #define TR_DELETE "Borrar" #define TR_INSERT "Insertar" #define TR_RESET_FLIGHT "Reset Vuelo" -#define TR_RESET_TIMER1 "Reset Reloj1" -#define TR_RESET_TIMER2 "Reset Reloj2" -#define TR_RESET_TIMER3 "Reset Reloj3" +#define TR_RESET_TIMER1 "Reset Reloj 1" +#define TR_RESET_TIMER2 "Reset Reloj 2" +#define TR_RESET_TIMER3 "Reset Reloj 3" #define TR_RESET_TELEMETRY "Reset Telemetria" #define TR_STATISTICS "Estadisticas" #define TR_ABOUT_US "Nosotros" -#define TR_USB_JOYSTICK "USB Joystick (HID)" -#define TR_USB_MASS_STORAGE "USB Storage (SD)" -#define TR_USB_SERIAL "USB Serial (Debug)" -#define TR_SETUP_SCREENS "Setup screens" -#define TR_MONITOR_SCREENS "Monitors" +#define TR_USB_JOYSTICK "Joystick USB (HID)" +#define TR_USB_MASS_STORAGE "Almaz. USB (SD)" +#define TR_USB_SERIAL "Serie USB (Debug)" +#define TR_SETUP_SCREENS "Pantallas config" +#define TR_MONITOR_SCREENS "Monitores" #define TR_AND_SWITCH "AND Inter." #define TR_SF "CF" #define TR_GF "GF" #define TR_SPEAKER INDENT"Altavoz" #define TR_BUZZER INDENT"Zumbador" #define TR_BYTES "bytes" -#define TR_MODULE_BIND "[Enlace]" -#define TR_POWERMETER_ATTN_NEEDED "Attenuator needed" -#define TR_PXX2_SELECT_RX "Select RX..." -#define TR_PXX2_DEFAULT "" -#define TR_BT_SELECT_DEVICE "Select device..." -#define TR_DISCOVER "Discover" +#define TR_MODULE_BIND "[Enl.]" +#define TR_POWERMETER_ATTN_NEEDED "Necesita atenuador" +#define TR_PXX2_SELECT_RX "Selecciona RX..." +#define TR_PXX2_DEFAULT "" +#define TR_BT_SELECT_DEVICE "Selecciona dispositivo..." +#define TR_DISCOVER "Buscar" #define TR_BUTTON_INIT BUTTON("Init") -#define TR_WAITING "Waiting..." -#define TR_RECEIVER_DELETE "Delete receiver?" -#define TR_RECEIVER_RESET "Reset receiver?" -#define TR_SHARE "Share" -#define TR_BIND "Bind" -#define TR_REGISTER TR("Reg", "Register") -#define TR_MODULE_RANGE "[Limites]" -#define TR_RECEIVER_OPTIONS TR("REC. OPTIONS", "RECEIVER OPTIONS") -#define TR_DEL_BUTTON BUTTON(TR("Del", "Delete")) +#define TR_WAITING "Espera..." +#define TR_RECEIVER_DELETE "Borrar receptor?" +#define TR_RECEIVER_RESET "Reset receptor?" +#define TR_SHARE "Compartido" +#define TR_BIND "Emparejar" +#define TR_REGISTER TR("Reg", "Registrar") +#define TR_MODULE_RANGE "[Lim.]" +#define TR_RECEIVER_OPTIONS TR("REC. OPTIONS", "OPCIONES RECEPTOR") +#define TR_DEL_BUTTON BUTTON(TR("Del", "Borrar")) #define TR_RESET_BTN "[Reset]" #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) -#define TR_CALIBRATION "Calibration" +#define TR_CALIBRATION "Calibracion" #define TR_SET "[Ajuste]" -#define TR_TRAINER "Aprendiz" +#define TR_TRAINER "Entrena." #define TR_CHANS "Chans" #define TR_ANTENNAPROBLEM CENTER "¡Problema antena TX!" #define TR_MODELIDUSED TR("ID en uso", "ID modelo en uso") #define TR_MODULE "Modulo" -#define TR_RX_NAME "Rx Name" -#define TR_TELEMETRY_TYPE TR("Type", "Telemetry Type") -#define TR_TELEMETRY_SENSORS "Sensors" -#define TR_VALUE "Value" -#define TR_TOPLCDTIMER "Top LCD Timer" -#define TR_UNIT "Unit" -#define TR_TELEMETRY_NEWSENSOR INDENT "Add a new sensor..." -#define TR_CHANNELRANGE INDENT "Gama de canales" -#define TR_ANTENNACONFIRM1 "EXT. ANTENNA" +#define TR_RX_NAME "Nombre Rx" +#define TR_TELEMETRY_TYPE TR("Tipo", "Tipo telemetria") +#define TR_TELEMETRY_SENSORS "Sensores" +#define TR_VALUE "Valor" +#define TR_TOPLCDTIMER "Timer LCD superior" +#define TR_UNIT "Unidad" +#define TR_TELEMETRY_NEWSENSOR INDENT "Añadir nuevo sensor..." +#define TR_CHANNELRANGE INDENT "Canales" +#define TR_ANTENNACONFIRM1 "ANTENA EXT." #if defined(PCBX12S) #define LEN_ANTENNA_MODES "\023" -#define TR_ANTENNA_MODES "Internal\0 ""Ask\0 ""Per model\0 ""Internal + External" +#define TR_ANTENNA_MODES "Interna\0 ""Preguntar\0 ""Por modelo\0 ""Interno + Externo\0 " #else #define LEN_ANTENNA_MODES "\011" -#define TR_ANTENNA_MODES "Internal\0""Ask\0 ""Per model""External" +#define TR_ANTENNA_MODES "Interna\0 ""Preguntar\0""Por model""Externa\0 " #endif -#define TR_USE_INTERNAL_ANTENNA TR("Use int. antenna", "Use internal antenna") -#define TR_USE_EXTERNAL_ANTENNA TR("Use ext. antenna", "Use external antenna") -#define TR_ANTENNACONFIRM2 TR("Check antenna", "Make sure antenna is installed!") -#define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "Requires non" -#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC" -#define TR_MODULE_PROTOCOL_EU_WARN_LINE1 "Requires EU" -#define TR_MODULE_PROTOCOL_WARN_LINE2 "certified firmware" +#define TR_USE_INTERNAL_ANTENNA TR("Usa antena int.", "Usa antena interna") +#define TR_USE_EXTERNAL_ANTENNA TR("Use antena ext.", "Usa antena externa") +#define TR_ANTENNACONFIRM2 TR("Revisa antena", "Revisa que la antena este instalada!") + +#define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "No requerido" +#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requiere FCC" +#define TR_MODULE_PROTOCOL_EU_WARN_LINE1 "Requiere EU" +#define TR_MODULE_PROTOCOL_WARN_LINE2 "firmware certificado" #define TR_LOWALARM INDENT "Alarma baja" -#define TR_CRITICALALARM INDENT "Alarma Critica" -#define TR_RSSIALARM_WARN TR("RSSI","TELEMETRY RSSI") -#define TR_NO_RSSIALARM TR(INDENT "Alarms disabled", INDENT "Telemetry alarms disabled") -#define TR_DISABLE_ALARM TR(INDENT "Disable alarms", INDENT "Disable telemetry alarms") -#define TR_ENABLE_POPUP "Enable Popup" -#define TR_DISABLE_POPUP "Disable Popup" +#define TR_CRITICALALARM INDENT "Alarma critica" +#define TR_RSSIALARM_WARN TR("RSSI","TELEMETRY RSSI") +#define TR_NO_RSSIALARM TR(INDENT "Alarmas desact.", INDENT "Alarmas telemetria desact.") +#define TR_DISABLE_ALARM TR(INDENT "Desact. alarmas", INDENT "Desact. alarmas telem.") +#define TR_ENABLE_POPUP "Activa Popup" +#define TR_DISABLE_POPUP "Desactiva Popup" #define TR_POPUP "Popup" #define TR_MIN "Min" #define TR_MAX "Max" #define TR_CURVE_PRESET "Preset..." #define TR_PRESET "Preset" #define TR_MIRROR "Mirror" -#define TR_CLEAR "Clear" +#define TR_CLEAR "Borrar" #define TR_RESET "Reset" #define TR_RESET_SUBMENU "Reset..." -#define TR_COUNT "Count" +#define TR_COUNT "Puntos" #define TR_PT "pt" #define TR_PTS "pts" -#define TR_SMOOTH "Smooth" -#define TR_COPY_STICKS_TO_OFS TR("Cpy stick->subtrim", "Copy Sticks To Offset") -#define TR_COPY_MIN_MAX_TO_OUTPUTS TR("Cpy min/max to all", "Copy min/max/center to all outputs") -#define TR_COPY_TRIMS_TO_OFS TR("Cpy trim->subtrim", "Copy trims to subtrim") +#define TR_SMOOTH "Suaviz" +#define TR_COPY_STICKS_TO_OFS TR("Copia stick->subtr", "Copia Sticks a Offset") +#define TR_COPY_MIN_MAX_TO_OUTPUTS TR("Copia min/max a sal", "Copia min/max/ctr a salidas") +#define TR_COPY_TRIMS_TO_OFS TR("Copia trim->subtr", "Copia trims a subtrim") #define TR_INCDEC "Inc/Decrement" -#define TR_GLOBALVAR "Global Var" -#define TR_MIXSOURCE "Mixer Source" -#define TR_CONSTANT "Constant" +#define TR_GLOBALVAR "Var global" +#define TR_MIXSOURCE "Entrada mixer" +#define TR_CONSTANT "Constante" #define TR_PERSISTENT_MAH INDENT "Valor mAh" -#define TR_PREFLIGHT "Preflight Checks" -#define TR_CHECKLIST INDENT "Display Checklist" +#define TR_PREFLIGHT "Chequeos Prevuelo" +#define TR_CHECKLIST INDENT "Lista verif" #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") -#define TR_AUX_SERIAL_MODE "Serial port" +#define TR_AUX_SERIAL_MODE "Puerto serie" #define TR_SCRIPT "Script" -#define TR_INPUTS "Inputs" -#define TR_OUTPUTS "Outputs" -#define STR_EEBACKUP "Backup the EEPROM" -#define STR_FACTORYRESET "Factory reset" -#define TR_CONFIRMRESET "Erase ALL models and settings?" -#define TR_TOO_MANY_LUA_SCRIPTS "Too many Lua scripts!" +#define TR_INPUTS "Entradas" +#define TR_OUTPUTS "Salidas" +#define STR_EEBACKUP "Copia seg. EEPROM" +#define STR_FACTORYRESET "Rest. fabrica" +#define TR_CONFIRMRESET "Borrar TODOS los modelos y configuracion?" +#define TR_TOO_MANY_LUA_SCRIPTS "Demasiados Lua scripts!" #define TR_SPORT_UPDATE_POWER_MODE "SP Power" #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " @@ -1013,10 +1010,10 @@ // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Nombre" #define TR_PHASES_HEADERS_SW "Interrup" -#define TR_PHASES_HEADERS_RUD_TRIM "Rudder Trim" -#define TR_PHASES_HEADERS_ELE_TRIM "Elevator Trim" -#define TR_PHASES_HEADERS_THT_TRIM "Throttle Trim" -#define TR_PHASES_HEADERS_AIL_TRIM "Aileron Trim" +#define TR_PHASES_HEADERS_RUD_TRIM "Trim timon" +#define TR_PHASES_HEADERS_ELE_TRIM "Trim elevador" +#define TR_PHASES_HEADERS_THT_TRIM "Trim potencia" +#define TR_PHASES_HEADERS_AIL_TRIM "Trim aleron" #define TR_PHASES_HEADERS_CH5_TRIM "Trim 5" #define TR_PHASES_HEADERS_CH6_TRIM "Trim 6" #define TR_PHASES_HEADERS_FAD_IN "Aparecer" @@ -1027,7 +1024,7 @@ #define TR_LIMITS_HEADERS_MIN "Min" #define TR_LIMITS_HEADERS_MAX "Max" #define TR_LIMITS_HEADERS_DIRECTION "Direccion" -#define TR_LIMITS_HEADERS_CURVE "Curve" +#define TR_LIMITS_HEADERS_CURVE "Curva" #define TR_LIMITS_HEADERS_PPMCENTER "Centrado PPM" #define TR_LIMITS_HEADERS_SUBTRIMMODE "Simetrica" @@ -1038,19 +1035,19 @@ #define TR_LSW_HEADERS_DURATION "Duracion" #define TR_LSW_HEADERS_DELAY "Retardo" -#define TR_GVAR_HEADERS_NAME "Name" -#define TR_GVAR_HEADERS_FM0 "Value on FM0" -#define TR_GVAR_HEADERS_FM1 "Value on FM1" -#define TR_GVAR_HEADERS_FM2 "Value on FM2" -#define TR_GVAR_HEADERS_FM3 "Value on FM3" -#define TR_GVAR_HEADERS_FM4 "Value on FM4" -#define TR_GVAR_HEADERS_FM5 "Value on FM5" -#define TR_GVAR_HEADERS_FM6 "Value on FM6" -#define TR_GVAR_HEADERS_FM7 "Value on FM7" -#define TR_GVAR_HEADERS_FM8 "Value on FM8" +#define TR_GVAR_HEADERS_NAME "Nombre" +#define TR_GVAR_HEADERS_FM0 "Valor en FM0" +#define TR_GVAR_HEADERS_FM1 "Valor en FM1" +#define TR_GVAR_HEADERS_FM2 "Valor en FM2" +#define TR_GVAR_HEADERS_FM3 "Valor en FM3" +#define TR_GVAR_HEADERS_FM4 "Valor en FM4" +#define TR_GVAR_HEADERS_FM5 "Valor en FM5" +#define TR_GVAR_HEADERS_FM6 "Valor en FM6" +#define TR_GVAR_HEADERS_FM7 "Valor en FM7" +#define TR_GVAR_HEADERS_FM8 "Valor en FM8" // Horus footer descriptions -#define TR_LSW_DESCRIPTIONS { "Comparison type or function", "First variable", "Second variable or constant", "Second variable or constant", "Additional condition for line to be enabled", "Minimum ON duration of the logical switch", "Minimum TRUE duration for the switch to become ON" } +#define TR_LSW_DESCRIPTIONS { "Tipo de comparacion o funcion", "Primera variable", "Segunda variable o constante", "Segunda variable o constante", "Condicion adicional para activar linea", "Duracion minima de switch logico", "Duracion minima TRUE para activar switch logico" } // Taranis About screen #define TR_ABOUTUS "Nosotros" @@ -1083,8 +1080,8 @@ #define TR_ABOUT_KJELL_1 "Kjell Kernen" #define TR_ABOUT_KJELL_2 "www.open-tx.org main author" -#define TR_ABOUT_KJELL_3 "OpenTX Recorder author" -#define TR_ABOUT_KJELL_4 "Companion contributor" +#define TR_ABOUT_KJELL_3 "Autor OpenTX Recorder" +#define TR_ABOUT_KJELL_4 "Colaborador Companion" #define TR_ABOUT_MARTIN_1 "Martin Hotar" #define TR_ABOUT_MARTIN_2 "Dise\201o grafico" @@ -1092,7 +1089,7 @@ #if defined(PCBTARANIS) #define TR_ABOUT_HARDWARE_1 "FrSky" #define TR_ABOUT_HARDWARE_2 "Productor dise\201o de hardware" - #define TR_ABOUT_HARDWARE_3 "Firmware contributor" + #define TR_ABOUT_HARDWARE_3 "Colaborador firmware" #else #define TR_ABOUT_HARDWARE_1 "Brent Nelson" #define TR_ABOUT_HARDWARE_2 "Sky9x dise\201ador/productor" @@ -1114,81 +1111,81 @@ #define TR_WAV_VOLUME "Volumen Wav" #define TR_BG_VOLUME "Volumen Bg" -#define TR_TOP_BAR "Top Bar" -#define TR_FLASH_ERASE "Flash erase..." -#define TR_FLASH_WRITE "Flash write..." -#define TR_OTA_UPDATE "OTA update..." -#define TR_MODULE_RESET "Module reset..." -#define TR_UNKNOWN_RX "Unknown RX" -#define TR_UNSUPPORTED_RX "Unsupported RX" -#define TR_OTA_UPDATE_ERROR "OTA update error" -#define TR_DEVICE_RESET "Device reset..." -#define TR_ALTITUDE INDENT "Altitude" -#define TR_SCALE "Scale" -#define TR_VIEW_CHANNELS "View Channels" -#define TR_VIEW_NOTES "View Notes" -#define TR_MODEL_SELECT "Model Select" -#define TR_MODS_FORBIDDEN "Modifications forbidden!" -#define TR_UNLOCKED "Unlocked" +#define TR_TOP_BAR "Panel superior" +#define TR_FLASH_ERASE "Borrar flash..." +#define TR_FLASH_WRITE "Escrivir flash..." +#define TR_OTA_UPDATE "Actualizacion OTA..." +#define TR_MODULE_RESET "Reset modulo..." +#define TR_UNKNOWN_RX "RX deconocido" +#define TR_UNSUPPORTED_RX "RX no soportado" +#define TR_OTA_UPDATE_ERROR "Error actualizacion OTA" +#define TR_DEVICE_RESET "Reset dispositivo..." +#define TR_ALTITUDE INDENT "Altitud" +#define TR_SCALE "Escala" +#define TR_VIEW_CHANNELS "Ver Canales" +#define TR_VIEW_NOTES "Ver Notas" +#define TR_MODEL_SELECT "Seleccionar modelo" +#define TR_MODS_FORBIDDEN "Modificacions prohibidas!" +#define TR_UNLOCKED "Desbloqueado" #define TR_ID "ID" #define TR_PRECISION "Precision" #define TR_RATIO "Ratio" #define TR_FORMULA "Formula" #define TR_CELLINDEX "Cell index" #define TR_LOGS "Logs" -#define TR_OPTIONS "Options" -#define TR_FIRMWARE_OPTIONS "Firmware options" +#define TR_OPTIONS "Opciones" +#define TR_FIRMWARE_OPTIONS "Opciones firmware" #define TR_ALTSENSOR "Alt sensor" #define TR_CELLSENSOR "Cell sensor" #define TR_GPSSENSOR "GPS sensor" #define TR_CURRENTSENSOR "Sensor" #define TR_AUTOOFFSET "Auto Offset" -#define TR_ONLYPOSITIVE "Positive" -#define TR_FILTER "Filter" -#define TR_TELEMETRYFULL TR("All slots full!", "All telemetry slots full!") +#define TR_ONLYPOSITIVE "Positivo" +#define TR_FILTER "Filtro" +#define TR_TELEMETRYFULL TR("Telem. llena!", "Todas las entradas de telemetria llenas!") #define TR_SERVOS_OK "Servos OK" #define TR_SERVOS_KO "Servos KO" -#define TR_INVERTED_SERIAL INDENT "Invert" -#define TR_IGNORE_INSTANCE INDENT "Ignore instance" -#define TR_DISCOVER_SENSORS "Discover new sensors" -#define TR_STOP_DISCOVER_SENSORS "Stop discovery" -#define TR_DELETE_ALL_SENSORS "Delete all sensors" -#define TR_CONFIRMDELETE "Really " LCDW_128_480_LINEBREAK "delete all ?" -#define TR_SELECT_WIDGET "Select widget" -#define TR_REMOVE_WIDGET "Remove widget" -#define TR_WIDGET_SETTINGS "Widget settings" -#define TR_REMOVE_SCREEN "Remove screen" -#define TR_SETUP_WIDGETS "Setup widgets" -#define TR_USER_INTERFACE "User interface" -#define TR_THEME "Theme" -#define TR_SETUP "Setup" -#define TR_MAINVIEWX "Main view X" -#define TR_LAYOUT "Layout" -#define TR_ADDMAINVIEW "Add main view" -#define TR_BACKGROUND_COLOR "Background color" -#define TR_MAIN_COLOR "Main color" -#define TR_TEXT_VIEWER "Text Viewer" +#define TR_INVERTED_SERIAL INDENT "Invertir" +#define TR_IGNORE_INSTANCE INDENT "Ignorar instancia" +#define TR_DISCOVER_SENSORS "Buscar nuevos sensores" +#define TR_STOP_DISCOVER_SENSORS "Parar busqueda" +#define TR_DELETE_ALL_SENSORS "Borrar sensores" +#define TR_CONFIRMDELETE "Seguro " LCDW_128_480_LINEBREAK "borrar todo ?" +#define TR_SELECT_WIDGET "Seleccionar widget" +#define TR_REMOVE_WIDGET "Borrar widget" +#define TR_WIDGET_SETTINGS "Config. widget" +#define TR_REMOVE_SCREEN "Borar pantalla" +#define TR_SETUP_WIDGETS "Config. widgets" +#define TR_USER_INTERFACE "Interfaz" +#define TR_THEME "Tema" +#define TR_SETUP "Configiracion" +#define TR_MAINVIEWX "Vista pral. X" +#define TR_LAYOUT "Diseño" +#define TR_ADDMAINVIEW "Añadir vista pral." +#define TR_BACKGROUND_COLOR "Color de fondo" +#define TR_MAIN_COLOR "Color principal" +#define TR_TEXT_VIEWER "Visor de texto" #define TR_MENU_INPUTS "\314Inputs" #define TR_MENU_LUA "\322Lua scripts" #define TR_MENU_STICKS "\307Sticks" #define TR_MENU_POTS "\310Pots" #define TR_MENU_MAX "\315MAX" -#define TR_MENU_HELI "\316Cyclic" +#define TR_MENU_HELI "\316Ciclico" #define TR_MENU_TRIMS "\313Trims" #define TR_MENU_SWITCHES "\312Switches" #define TR_MENU_LOGICAL_SWITCHES "\312Logical Switches" -#define TR_MENU_TRAINER "\317Trainer" -#define TR_MENU_CHANNELS "\320Channels" +#define TR_MENU_TRAINER "\317Entrenador" +#define TR_MENU_CHANNELS "\320Canales" #define TR_MENU_GVARS "\311GVars" -#define TR_MENU_TELEMETRY "\321Telemetry" -#define TR_MENU_DISPLAY "DISPLAY" -#define TR_MENU_OTHER "Other" -#define TR_MENU_INVERT "Invert" -#define TR_JITTER_FILTER "ADC Filter" -#define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") -#define TR_AUTH_FAILURE "Auth-failure" +#define TR_MENU_TELEMETRY "\321Telemetria" +#define TR_MENU_DISPLAY "Monitor" +#define TR_MENU_OTHER "Otros" +#define TR_MENU_INVERT "Invertir" +#define TR_JITTER_FILTER "Filtro ADC" +#define TR_RTC_CHECK TR("Check RTC", "Check RTC voltaje") +#define TR_AUTH_FAILURE "Fallo auth." #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" From 5be7fa3339d9f0105ef8411a835d9fef1aff3d6b Mon Sep 17 00:00:00 2001 From: Nicholas-Luoyi <58321103+Nicholas-Luoyi@users.noreply.github.com> Date: Tue, 24 Mar 2020 14:50:09 +0800 Subject: [PATCH 174/560] Nicholas/telemetry for rb30 40 (#7454) Added telemetry for RB3040 --- .../src/gui/common/stdlcd/draw_functions.cpp | 44 ++++++++++++++----- radio/src/telemetry/frsky.h | 10 +++++ radio/src/telemetry/frsky_sport.cpp | 13 ++++++ radio/src/translations/cz.h.txt | 9 ++++ radio/src/translations/de.h.txt | 9 ++++ radio/src/translations/en.h.txt | 9 ++++ radio/src/translations/es.h.txt | 9 ++++ radio/src/translations/fi.h.txt | 9 ++++ radio/src/translations/fr.h.txt | 9 ++++ radio/src/translations/it.h.txt | 9 ++++ radio/src/translations/nl.h.txt | 9 ++++ radio/src/translations/pl.h.txt | 9 ++++ radio/src/translations/pt.h.txt | 9 ++++ radio/src/translations/se.h.txt | 9 ++++ 14 files changed, 156 insertions(+), 10 deletions(-) diff --git a/radio/src/gui/common/stdlcd/draw_functions.cpp b/radio/src/gui/common/stdlcd/draw_functions.cpp index fe8ac60dc..665a76633 100644 --- a/radio/src/gui/common/stdlcd/draw_functions.cpp +++ b/radio/src/gui/common/stdlcd/draw_functions.cpp @@ -370,11 +370,11 @@ void drawSensorCustomValue(coord_t x, coord_t y, uint8_t sensor, int32_t value, lcdDrawText(x, y, "OK", flags); } else { - for (uint8_t i=0; i<16; i++) { - if (value & (1 << i)) { + for (uint8_t i = 0; i < 16; i++) { + if (value & (1u << i)) { char s[] = "CH__ KO"; - strAppendUnsigned(&s[2], i+1, 2); - lcdDrawText(x, flags & DBLSIZE ? y+1 : y, s, flags & ~DBLSIZE); + strAppendUnsigned(&s[2], i + 1, 2); + lcdDrawText(x, flags & DBLSIZE ? y + 1 : y, s, flags & ~DBLSIZE); break; } } @@ -382,7 +382,7 @@ void drawSensorCustomValue(coord_t x, coord_t y, uint8_t sensor, int32_t value, } else { if (value == 0) { - lcdDrawText(x, flags & DBLSIZE ? y+1 : y, "Rx OK", flags & ~DBLSIZE); + lcdDrawText(x, flags & DBLSIZE ? y + 1 : y, "Rx OK", flags & ~DBLSIZE); } else { static const char * const RXS_STATUS[] = { @@ -398,23 +398,47 @@ void drawSensorCustomValue(coord_t x, coord_t y, uint8_t sensor, int32_t value, "Rx1 NS", "Rx2 NS", }; - for (uint8_t i=0; i= RB3040_OUTPUT_FIRST_ID && telemetrySensor.id <= RB3040_OUTPUT_LAST_ID) { + if (telemetrySensor.subId == 0) { + if (value == 0) { + lcdDrawText(x, y, "OK", flags); + } + else { + for (uint8_t i = 0; i < 9; i++) { + if (value & (1u << i)) { + if (i < 8) { + char s[] = "CH__ KO"; + strAppendUnsigned(&s[2], i + 17, 2); + lcdDrawText(x, flags & DBLSIZE ? y + 1 : y, s, flags & ~DBLSIZE); + break; + } + else { + char s[] = "S.P Ovl"; + lcdDrawText(x, flags & DBLSIZE ? y + 1 : y, s, flags & ~DBLSIZE); + break; + } + } + } + } + } + } } } else if (telemetrySensor.unit == UNIT_TEXT) { - lcdDrawSizedText(x, flags & DBLSIZE ? y+1 : y, telemetryItem.text, sizeof(telemetryItem.text), flags & ~DBLSIZE); + lcdDrawSizedText(x, flags & DBLSIZE ? y + 1 : y, telemetryItem.text, sizeof(telemetryItem.text), flags & ~DBLSIZE); } else { if (telemetrySensor.prec > 0) { - flags |= (telemetrySensor.prec==1 ? PREC1 : PREC2); + flags |= (telemetrySensor.prec == 1 ? PREC1 : PREC2); } drawValueWithUnit(x, y, value, telemetrySensor.unit == UNIT_CELLS ? UNIT_VOLTS : telemetrySensor.unit, flags); } diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index 458a4901f..93ad67d18 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -150,6 +150,16 @@ enum FrSkyDataState { #define ESC_RPM_CONS_LAST_ID 0x0B6f #define ESC_TEMPERATURE_FIRST_ID 0x0B70 #define ESC_TEMPERATURE_LAST_ID 0x0B7f +#define RB3040_OUTPUT_FIRST_ID 0x0B80 +#define RB3040_OUTPUT_LAST_ID 0x0B8F +#define RB3040_CH1_2_FIRST_ID 0x0B90 +#define RB3040_CH1_2_LAST_ID 0x0B9F +#define RB3040_CH3_4_FIRST_ID 0x0BA0 +#define RB3040_CH3_4_LAST_ID 0x0BAF +#define RB3040_CH5_6_FIRST_ID 0x0BB0 +#define RB3040_CH5_6_LAST_ID 0x0BBF +#define RB3040_CH7_8_FIRST_ID 0x0BC0 +#define RB3040_CH7_8_LAST_ID 0x0BCF #define X8R_FIRST_ID 0x0c20 #define X8R_LAST_ID 0x0c2F #define S6R_FIRST_ID 0x0c30 diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index 299553050..bc32da123 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -84,6 +84,15 @@ const FrSkySportSensor sportSensors[] = { { GASSUIT_AVG_FLOW_FIRST_ID, GASSUIT_AVG_FLOW_LAST_ID, 0, ZSTR_GASSUIT_AVG_FLOW, UNIT_MILLILITERS_PER_MINUTE, 0 }, { SBEC_POWER_FIRST_ID, SBEC_POWER_LAST_ID, 0, ZSTR_SBEC_VOLTAGE, UNIT_VOLTS, 2 }, { SBEC_POWER_FIRST_ID, SBEC_POWER_LAST_ID, 1, ZSTR_SBEC_CURRENT, UNIT_AMPS, 2 }, + { RB3040_OUTPUT_FIRST_ID, RB3040_OUTPUT_LAST_ID, 0, ZSTR_RB3040_EXTRA_STATE, UNIT_BITFIELD, 0 }, + { RB3040_CH1_2_FIRST_ID, RB3040_CH1_2_LAST_ID, 0, ZSTR_RB3040_CHANNEL1, UNIT_AMPS, 2 }, + { RB3040_CH1_2_FIRST_ID, RB3040_CH1_2_LAST_ID, 1, ZSTR_RB3040_CHANNEL2, UNIT_AMPS, 2 }, + { RB3040_CH3_4_FIRST_ID, RB3040_CH3_4_LAST_ID, 0, ZSTR_RB3040_CHANNEL3, UNIT_AMPS, 2 }, + { RB3040_CH3_4_FIRST_ID, RB3040_CH3_4_LAST_ID, 1, ZSTR_RB3040_CHANNEL4, UNIT_AMPS, 2 }, + { RB3040_CH5_6_FIRST_ID, RB3040_CH5_6_LAST_ID, 0, ZSTR_RB3040_CHANNEL5, UNIT_AMPS, 2 }, + { RB3040_CH5_6_FIRST_ID, RB3040_CH5_6_LAST_ID, 1, ZSTR_RB3040_CHANNEL6, UNIT_AMPS, 2 }, + { RB3040_CH7_8_FIRST_ID, RB3040_CH7_8_LAST_ID, 0, ZSTR_RB3040_CHANNEL7, UNIT_AMPS, 2 }, + { RB3040_CH7_8_FIRST_ID, RB3040_CH7_8_LAST_ID, 1, ZSTR_RB3040_CHANNEL8, UNIT_AMPS, 2 }, { 0, 0, 0, NULL, UNIT_RAW, 0 } // sentinel }; @@ -308,6 +317,10 @@ void sportProcessTelemetryPacketWithoutCrc(uint8_t origin, const uint8_t * packe } #endif } + else if (dataId >= RB3040_CH1_2_FIRST_ID && dataId <= RB3040_CH7_8_LAST_ID) { + sportProcessTelemetryPacket(dataId, 0, instance, data & 0xffff); + sportProcessTelemetryPacket(dataId, 1, instance, (data >> 16u) & 0xffff); + } else { sportProcessTelemetryPacket(dataId, 0, instance, data); } diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index e0f453bb8..dbcab44a5 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -1267,3 +1267,12 @@ #define ZSTR_GASSUIT_AVG_FLOW "GAFl" #define ZSTR_SBEC_VOLTAGE "BecV" #define ZSTR_SBEC_CURRENT "BecA" +#define ZSTR_RB3040_EXTRA_STATE "RBES" +#define ZSTR_RB3040_CHANNEL1 "CH1A" +#define ZSTR_RB3040_CHANNEL2 "CH2A" +#define ZSTR_RB3040_CHANNEL3 "CH3A" +#define ZSTR_RB3040_CHANNEL4 "CH4A" +#define ZSTR_RB3040_CHANNEL5 "CH5A" +#define ZSTR_RB3040_CHANNEL6 "CH6A" +#define ZSTR_RB3040_CHANNEL7 "CH7A" +#define ZSTR_RB3040_CHANNEL8 "CH8A" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index ae3f50756..431ad44b8 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -1273,3 +1273,12 @@ #define ZSTR_GASSUIT_AVG_FLOW "GAFl" #define ZSTR_SBEC_VOLTAGE "BecV" #define ZSTR_SBEC_CURRENT "BecA" +#define ZSTR_RB3040_EXTRA_STATE "RBES" +#define ZSTR_RB3040_CHANNEL1 "CH1A" +#define ZSTR_RB3040_CHANNEL2 "CH2A" +#define ZSTR_RB3040_CHANNEL3 "CH3A" +#define ZSTR_RB3040_CHANNEL4 "CH4A" +#define ZSTR_RB3040_CHANNEL5 "CH5A" +#define ZSTR_RB3040_CHANNEL6 "CH6A" +#define ZSTR_RB3040_CHANNEL7 "CH7A" +#define ZSTR_RB3040_CHANNEL8 "CH8A" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index d50b5a2cd..91715127d 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -1271,3 +1271,12 @@ #define ZSTR_GASSUIT_AVG_FLOW "GAFl" #define ZSTR_SBEC_VOLTAGE "BecV" #define ZSTR_SBEC_CURRENT "BecA" +#define ZSTR_RB3040_EXTRA_STATE "RBES" +#define ZSTR_RB3040_CHANNEL1 "CH1A" +#define ZSTR_RB3040_CHANNEL2 "CH2A" +#define ZSTR_RB3040_CHANNEL3 "CH3A" +#define ZSTR_RB3040_CHANNEL4 "CH4A" +#define ZSTR_RB3040_CHANNEL5 "CH5A" +#define ZSTR_RB3040_CHANNEL6 "CH6A" +#define ZSTR_RB3040_CHANNEL7 "CH7A" +#define ZSTR_RB3040_CHANNEL8 "CH8A" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index c4446e52b..c6943a0f1 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -1289,3 +1289,12 @@ #define ZSTR_GASSUIT_AVG_FLOW "GAFl" #define ZSTR_SBEC_VOLTAGE "BecV" #define ZSTR_SBEC_CURRENT "BecA" +#define ZSTR_RB3040_EXTRA_STATE "RBES" +#define ZSTR_RB3040_CHANNEL1 "CH1A" +#define ZSTR_RB3040_CHANNEL2 "CH2A" +#define ZSTR_RB3040_CHANNEL3 "CH3A" +#define ZSTR_RB3040_CHANNEL4 "CH4A" +#define ZSTR_RB3040_CHANNEL5 "CH5A" +#define ZSTR_RB3040_CHANNEL6 "CH6A" +#define ZSTR_RB3040_CHANNEL7 "CH7A" +#define ZSTR_RB3040_CHANNEL8 "CH8A" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 19f24ff02..f8740cdef 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -1279,3 +1279,12 @@ #define ZSTR_GASSUIT_MAX_FLOW "GMFl" #define ZSTR_SBEC_VOLTAGE "BecV" #define ZSTR_SBEC_CURRENT "BecA" +#define ZSTR_RB3040_EXTRA_STATE "RBES" +#define ZSTR_RB3040_CHANNEL1 "CH1A" +#define ZSTR_RB3040_CHANNEL2 "CH2A" +#define ZSTR_RB3040_CHANNEL3 "CH3A" +#define ZSTR_RB3040_CHANNEL4 "CH4A" +#define ZSTR_RB3040_CHANNEL5 "CH5A" +#define ZSTR_RB3040_CHANNEL6 "CH6A" +#define ZSTR_RB3040_CHANNEL7 "CH7A" +#define ZSTR_RB3040_CHANNEL8 "CH8A" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 3dcde7dcd..115dab994 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -1295,3 +1295,12 @@ #define ZSTR_GASSUIT_AVG_FLOW "GAFl" #define ZSTR_SBEC_VOLTAGE "BecV" #define ZSTR_SBEC_CURRENT "BecA" +#define ZSTR_RB3040_EXTRA_STATE "RBES" +#define ZSTR_RB3040_CHANNEL1 "CH1A" +#define ZSTR_RB3040_CHANNEL2 "CH2A" +#define ZSTR_RB3040_CHANNEL3 "CH3A" +#define ZSTR_RB3040_CHANNEL4 "CH4A" +#define ZSTR_RB3040_CHANNEL5 "CH5A" +#define ZSTR_RB3040_CHANNEL6 "CH6A" +#define ZSTR_RB3040_CHANNEL7 "CH7A" +#define ZSTR_RB3040_CHANNEL8 "CH8A" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 4644bf056..486e7fbf0 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -1289,3 +1289,12 @@ #define ZSTR_GASSUIT_AVG_FLOW "GAFl" #define ZSTR_SBEC_VOLTAGE "BecV" #define ZSTR_SBEC_CURRENT "BecA" +#define ZSTR_RB3040_EXTRA_STATE "RBES" +#define ZSTR_RB3040_CHANNEL1 "CH1A" +#define ZSTR_RB3040_CHANNEL2 "CH2A" +#define ZSTR_RB3040_CHANNEL3 "CH3A" +#define ZSTR_RB3040_CHANNEL4 "CH4A" +#define ZSTR_RB3040_CHANNEL5 "CH5A" +#define ZSTR_RB3040_CHANNEL6 "CH6A" +#define ZSTR_RB3040_CHANNEL7 "CH7A" +#define ZSTR_RB3040_CHANNEL8 "CH8A" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 50d624d2c..9f3173d6c 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -1281,3 +1281,12 @@ #define ZSTR_GASSUIT_AVG_FLOW "GAFl" #define ZSTR_SBEC_VOLTAGE "BecV" #define ZSTR_SBEC_CURRENT "BecA" +#define ZSTR_RB3040_EXTRA_STATE "RBES" +#define ZSTR_RB3040_CHANNEL1 "CH1A" +#define ZSTR_RB3040_CHANNEL2 "CH2A" +#define ZSTR_RB3040_CHANNEL3 "CH3A" +#define ZSTR_RB3040_CHANNEL4 "CH4A" +#define ZSTR_RB3040_CHANNEL5 "CH5A" +#define ZSTR_RB3040_CHANNEL6 "CH6A" +#define ZSTR_RB3040_CHANNEL7 "CH7A" +#define ZSTR_RB3040_CHANNEL8 "CH8A" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 1034c98d9..4e8915ce2 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -1288,3 +1288,12 @@ #define ZSTR_GASSUIT_AVG_FLOW "GAFl" #define ZSTR_SBEC_VOLTAGE "BecV" #define ZSTR_SBEC_CURRENT "BecA" +#define ZSTR_RB3040_EXTRA_STATE "RBES" +#define ZSTR_RB3040_CHANNEL1 "CH1A" +#define ZSTR_RB3040_CHANNEL2 "CH2A" +#define ZSTR_RB3040_CHANNEL3 "CH3A" +#define ZSTR_RB3040_CHANNEL4 "CH4A" +#define ZSTR_RB3040_CHANNEL5 "CH5A" +#define ZSTR_RB3040_CHANNEL6 "CH6A" +#define ZSTR_RB3040_CHANNEL7 "CH7A" +#define ZSTR_RB3040_CHANNEL8 "CH8A" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 6b3aaaf0e..90d3dcb9d 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -1277,3 +1277,12 @@ #define ZSTR_GASSUIT_AVG_FLOW "GAFl" #define ZSTR_SBEC_VOLTAGE "BecV" #define ZSTR_SBEC_CURRENT "BecA" +#define ZSTR_RB3040_EXTRA_STATE "RBES" +#define ZSTR_RB3040_CHANNEL1 "CH1A" +#define ZSTR_RB3040_CHANNEL2 "CH2A" +#define ZSTR_RB3040_CHANNEL3 "CH3A" +#define ZSTR_RB3040_CHANNEL4 "CH4A" +#define ZSTR_RB3040_CHANNEL5 "CH5A" +#define ZSTR_RB3040_CHANNEL6 "CH6A" +#define ZSTR_RB3040_CHANNEL7 "CH7A" +#define ZSTR_RB3040_CHANNEL8 "CH8A" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 663d90be3..8b47e3fda 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -1288,3 +1288,12 @@ #define ZSTR_GASSUIT_AVG_FLOW "GAFl" #define ZSTR_SBEC_VOLTAGE "BecV" #define ZSTR_SBEC_CURRENT "BecA" +#define ZSTR_RB3040_EXTRA_STATE "RBES" +#define ZSTR_RB3040_CHANNEL1 "CH1A" +#define ZSTR_RB3040_CHANNEL2 "CH2A" +#define ZSTR_RB3040_CHANNEL3 "CH3A" +#define ZSTR_RB3040_CHANNEL4 "CH4A" +#define ZSTR_RB3040_CHANNEL5 "CH5A" +#define ZSTR_RB3040_CHANNEL6 "CH6A" +#define ZSTR_RB3040_CHANNEL7 "CH7A" +#define ZSTR_RB3040_CHANNEL8 "CH8A" From 9e22b1c6c4799b8ada272c205cc3e1fb20a938d3 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 24 Mar 2020 10:32:52 +0100 Subject: [PATCH 175/560] Allow display of persistent timer with '!' trigger on model select (#7457) --- radio/src/storage/modelslist.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/storage/modelslist.cpp b/radio/src/storage/modelslist.cpp index 5e57bf280..b706b9891 100644 --- a/radio/src/storage/modelslist.cpp +++ b/radio/src/storage/modelslist.cpp @@ -110,7 +110,7 @@ void ModelCell::loadBitmap() buffer->drawSizedText(5, 2, modelName, LEN_MODEL_NAME, SMLSIZE|TEXT_COLOR); getTimerString(timer, 0); for (uint8_t i = 0; i < MAX_TIMERS; i++) { - if (partialmodel.timers[i].mode > 0 && partialmodel.timers[i].persistent) { + if (partialmodel.timers[i].mode != 0 && partialmodel.timers[i].persistent) { getTimerString(timer, partialmodel.timers[i].value); break; } From 629f98a930e9076be323cf5b8d866cd06fb8f27f Mon Sep 17 00:00:00 2001 From: WismyYao Date: Tue, 24 Mar 2020 22:15:10 +0800 Subject: [PATCH 176/560] Wismy/frsky new receivers (#7449) Add internal module OTA Change virtual keys for X-Lite(S) Lua scripts --- .../gui/480x272/model_receiver_options.cpp | 49 ++++++-- radio/src/gui/480x272/radio_sdmanager.cpp | 106 +++++++++++++++++- .../common/stdlcd/model_receiver_options.cpp | 58 ++++++++-- .../src/gui/common/stdlcd/radio_sdmanager.cpp | 33 +++--- radio/src/io/frsky_firmware_update.cpp | 4 +- radio/src/io/frsky_firmware_update.h | 42 ++++++- radio/src/lua/api_general.cpp | 10 +- radio/src/opentx.h | 11 -- radio/src/opentx_helpers.h | 13 +++ radio/src/pulses/modules_helpers.h | 2 + radio/src/pulses/pulses.h | 3 + radio/src/pulses/pxx2.cpp | 13 ++- radio/src/pulses/pxx2.h | 16 ++- radio/src/telemetry/frsky.h | 1 + radio/src/telemetry/frsky_pxx2.cpp | 6 + radio/src/telemetry/frsky_sport.cpp | 1 + radio/src/telemetry/telemetry.h | 3 + radio/src/telemetry/telemetry_holders.h | 1 + radio/src/translations.cpp | 2 + radio/src/translations.h | 2 + radio/src/translations/cz.h.txt | 3 + radio/src/translations/de.h.txt | 3 + radio/src/translations/en.h.txt | 3 + radio/src/translations/es.h.txt | 3 + radio/src/translations/fi.h.txt | 3 + radio/src/translations/fr.h.txt | 3 + radio/src/translations/it.h.txt | 3 + radio/src/translations/nl.h.txt | 3 + radio/src/translations/pl.h.txt | 3 + radio/src/translations/pt.h.txt | 3 + radio/src/translations/se.h.txt | 3 + 31 files changed, 350 insertions(+), 59 deletions(-) diff --git a/radio/src/gui/480x272/model_receiver_options.cpp b/radio/src/gui/480x272/model_receiver_options.cpp index b1ab35036..90db6f7e3 100644 --- a/radio/src/gui/480x272/model_receiver_options.cpp +++ b/radio/src/gui/480x272/model_receiver_options.cpp @@ -46,14 +46,18 @@ void onRxOptionsUpdateConfirm(const char * result) enum { ITEM_RECEIVER_SETTINGS_PWM_RATE, ITEM_RECEIVER_SETTINGS_TELEMETRY, + ITEM_RECEIVER_SETTINGS_TELEMETRY_25MW, ITEM_RECEIVER_SETTINGS_SPORT_FPORT, ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED1, ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED2, ITEM_RECEIVER_SETTINGS_PINMAP_FIRST }; +#define IS_RECEIVER_CAPABILITY_ENABLED(capability) (reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilities & (1 << capability)) +#define IF_RECEIVER_CAPABILITY(capability, count) uint8_t(IS_RECEIVER_CAPABILITY_ENABLED(capability) ? count : HIDDEN_ROW) -#define IF_RECEIVER_CAPABILITY(capability, count) uint8_t((reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilities & (1 << capability)) ? count : HIDDEN_ROW) +#define CH_ENABLE_SPORT 4 +#define CH_ENABLE_SBUS 5 bool menuModelReceiverOptions(event_t event) { @@ -76,6 +80,7 @@ bool menuModelReceiverOptions(event_t event) SUBMENU(STR_RECEIVER_OPTIONS, ICON_MODEL_SETUP, ITEM_RECEIVER_SETTINGS_PINMAP_FIRST + outputsCount, { 0, // PWM rate isModuleR9MAccess(g_moduleIdx) && receiverVariant == PXX2_VARIANT_EU && reusableBuffer.hardwareAndSettings.moduleSettings.txPower > 14 /*25mW*/ ? READONLY_ROW : (uint8_t)0, // Telemetry + IF_RECEIVER_CAPABILITY(RECEIVER_CAPABILITY_TELEMETRY_25MW, 0), IF_RECEIVER_CAPABILITY(RECEIVER_CAPABILITY_FPORT, 0), uint8_t(reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilityNotSupported ? READONLY_ROW : HIDDEN_ROW), uint8_t(reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilityNotSupported ? READONLY_ROW : HIDDEN_ROW), @@ -156,6 +161,14 @@ bool menuModelReceiverOptions(event_t event) } break; + case ITEM_RECEIVER_SETTINGS_TELEMETRY_25MW: + lcdDrawText(MENUS_MARGIN_LEFT, y, "25mw Tele"); + reusableBuffer.hardwareAndSettings.receiverSettings.telemetry25mw = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.telemetry25mw, RECEIVER_OPTIONS_2ND_COLUMN, y, attr, event); + if (attr && checkIncDec_Ret) { + reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_DIRTY; + } + break; + case ITEM_RECEIVER_SETTINGS_SPORT_FPORT: lcdDrawText(MENUS_MARGIN_LEFT, y, "F.Port"); reusableBuffer.hardwareAndSettings.receiverSettings.fport = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.fport, RECEIVER_OPTIONS_2ND_COLUMN, y, attr, event); @@ -182,21 +195,43 @@ bool menuModelReceiverOptions(event_t event) int32_t channelValue = channelOutputs[channel]; lcdDrawText(MENUS_MARGIN_LEFT, y, STR_PIN); lcdDrawNumber(lcdNextPos + 1, y, pin + 1); - putsChn(100, y, channel + 1, attr); + + uint8_t channelMax = sentModuleChannels(g_moduleIdx) - 1; + uint8_t selectionMax = channelMax; + + if (IS_RECEIVER_CAPABILITY_ENABLED(RECEIVER_CAPABILITY_ENABLE_PWM_CH5_CH6)) { + if (CH_ENABLE_SPORT == pin || CH_ENABLE_SBUS == pin) { + selectionMax += 1; + } + if (CH_ENABLE_SPORT == pin && selectionMax == channel) { + lcdDrawText(100, y, "S.PORT", attr); + } + else if (CH_ENABLE_SBUS == pin && selectionMax == channel) { + lcdDrawText(100, y, "SBUS", attr); + } + else { + putsChn(100, y, channel + 1, attr); + } + } + else { + putsChn(100, y, channel + 1, attr); + } // Channel if (attr) { - mapping = checkIncDec(event, mapping, 0, sentModuleChannels(g_moduleIdx) - 1); + mapping = checkIncDec(event, mapping, 0, selectionMax); if (checkIncDec_Ret) { reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_DIRTY; } } // Bargraph - lcdDrawRect(RECEIVER_OPTIONS_2ND_COLUMN, y + 4, wbar + 1, 10); - const uint8_t lenChannel = limit(1, (abs(channelValue) * wbar / 2 + lim / 2) / lim, wbar / 2); - const coord_t xChannel = (channelValue > 0) ? RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 : RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 + 1 - lenChannel; - lcdDrawSolidFilledRect(xChannel, y + 5, lenChannel, 8, TEXT_INVERTED_BGCOLOR); + if (channel <= channelMax) { + lcdDrawRect(RECEIVER_OPTIONS_2ND_COLUMN, y + 4, wbar + 1, 10); + auto lenChannel = limit(1, (abs(channelValue) * wbar / 2 + lim / 2) / lim, wbar / 2); + auto xChannel = (channelValue > 0) ? RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 : RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 + 1 - lenChannel; + lcdDrawSolidFilledRect(xChannel, y + 5, lenChannel, 8, TEXT_INVERTED_BGCOLOR); + } } break; } diff --git a/radio/src/gui/480x272/radio_sdmanager.cpp b/radio/src/gui/480x272/radio_sdmanager.cpp index 9a44203a5..b744eac17 100644 --- a/radio/src/gui/480x272/radio_sdmanager.cpp +++ b/radio/src/gui/480x272/radio_sdmanager.cpp @@ -18,7 +18,6 @@ * GNU General Public License for more details. */ -#include #include "io/frsky_firmware_update.h" #include "io/multi_firmware_update.h" #include "opentx.h" @@ -91,6 +90,49 @@ void onSdFormatConfirm(const char * result) } } +#if defined(PXX2) +void onUpdateConfirmation(const char * result) +{ + if (result == STR_OK) { + OtaUpdateInformation * destination = moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].otaUpdateInformation; + Pxx2OtaUpdate otaUpdate(reusableBuffer.sdManager.otaUpdateInformation.module, destination->candidateReceiversNames[destination->selectedReceiverIndex]); + otaUpdate.flashFirmware(destination->filename); + } + else { + moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL; + } +} + +void onUpdateStateChanged() +{ + if (reusableBuffer.sdManager.otaUpdateInformation.step == BIND_INFO_REQUEST) { + uint8_t modelId = reusableBuffer.sdManager.otaUpdateInformation.receiverInformation.modelID; + if (modelId > 0 && modelId < DIM(PXX2ReceiversNames)) { + if (isPXX2ReceiverOptionAvailable(modelId, RECEIVER_OPTION_OTA)) { + POPUP_CONFIRMATION(getPXX2ReceiverName(modelId), onUpdateConfirmation); + char *tmp = strAppend(reusableBuffer.sdManager.otaReceiverVersion, TR_CURRENT_VERSION); + tmp = strAppendUnsigned(tmp, 1 + reusableBuffer.sdManager.otaUpdateInformation.receiverInformation.swVersion.major); + *tmp++ = '.'; + tmp = strAppendUnsigned(tmp, reusableBuffer.sdManager.otaUpdateInformation.receiverInformation.swVersion.minor); + *tmp++ = '.'; + tmp = strAppendUnsigned(tmp, reusableBuffer.sdManager.otaUpdateInformation.receiverInformation.swVersion.revision); + SET_WARNING_INFO(reusableBuffer.sdManager.otaReceiverVersion, tmp - reusableBuffer.sdManager.otaReceiverVersion, 0); + } + else { + POPUP_WARNING(STR_OTA_UPDATE_ERROR); + SET_WARNING_INFO(STR_UNSUPPORTED_RX, sizeof(TR_UNSUPPORTED_RX) - 1, 0); + moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL; + } + } + else { + POPUP_WARNING(STR_OTA_UPDATE_ERROR); + SET_WARNING_INFO(STR_UNKNOWN_RX, sizeof(TR_UNKNOWN_RX) - 1, 0); + moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL; + } + } +} +#endif + void onSdManagerMenu(const char * result) { TCHAR lfn[_MAX_LFN+1]; @@ -203,6 +245,14 @@ void onSdManagerMenu(const char * result) multiFlashFirmware(EXTERNAL_MODULE, lfn); } #endif +#if defined(PXX2) + else if (result == STR_FLASH_RECEIVER_OTA_BY_INTERNAL || result == STR_FLASH_RECEIVER_OTA_BY_EXTERNAL) { + memclear(&reusableBuffer.sdManager.otaUpdateInformation, sizeof(OtaUpdateInformation)); + getSelectionFullPath(reusableBuffer.sdManager.otaUpdateInformation.filename); + reusableBuffer.sdManager.otaUpdateInformation.module = result == STR_FLASH_RECEIVER_OTA_BY_INTERNAL ? INTERNAL_MODULE : EXTERNAL_MODULE; + moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].startBind(&reusableBuffer.sdManager.otaUpdateInformation, onUpdateStateChanged); + } +#endif #if defined(LUA) else if (result == STR_EXECUTE_FILE) { getSelectionFullPath(lfn); @@ -211,8 +261,33 @@ void onSdManagerMenu(const char * result) #endif } +#if defined(PXX2) +void onUpdateReceiverSelection(const char * result) +{ + if (result != STR_EXIT) { + reusableBuffer.sdManager.otaUpdateInformation.selectedReceiverIndex = (result - reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversNames[0]) / sizeof(reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversNames[0]); + reusableBuffer.sdManager.otaUpdateInformation.step = BIND_INFO_REQUEST; +#if defined(SIMU) + reusableBuffer.sdManager.otaUpdateInformation.receiverInformation.modelID = 0x01; + onUpdateStateChanged(); +#endif + } + else { + // the user pressed [Exit] + moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL; + } +} +#endif + bool menuRadioSdManager(event_t _event) { + if (moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode == MODULE_MODE_BIND && EVT_KEY_MASK(_event) == KEY_EXIT) { + moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL; + CLEAR_POPUP(); + killEvents(KEY_EXIT); + _event = 0; + } + event_t event = (EVT_KEY_MASK(_event) == KEY_ENTER ? 0 : _event); SIMPLE_MENU(SD_IS_HC() ? STR_SDHC_CARD : STR_SD_CARD, RADIO_ICONS, menuTabGeneral, MENU_RADIO_SD_MANAGER, reusableBuffer.sdManager.count); @@ -300,8 +375,12 @@ bool menuRadioSdManager(event_t _event) if (HAS_SPORT_UPDATE_CONNECTOR() && (information.productFamily == FIRMWARE_FAMILY_RECEIVER || information.productFamily == FIRMWARE_FAMILY_SENSOR)) POPUP_MENU_ADD_ITEM(STR_FLASH_EXTERNAL_DEVICE); #if defined(PXX2) - if (information.productFamily == FIRMWARE_FAMILY_RECEIVER) - POPUP_MENU_ADD_ITEM(STR_FLASH_RECEIVER_OTA); + if (information.productFamily == FIRMWARE_FAMILY_RECEIVER) { + if (isReceiverOTAEnabledFromModule(INTERNAL_MODULE, information.productId)) + POPUP_MENU_ADD_ITEM(STR_FLASH_RECEIVER_OTA_BY_INTERNAL); + if (isReceiverOTAEnabledFromModule(EXTERNAL_MODULE, information.productId)) + POPUP_MENU_ADD_ITEM(STR_FLASH_RECEIVER_OTA_BY_EXTERNAL); + } #endif #if defined(BLUETOOTH) if (information.productFamily == FIRMWARE_FAMILY_BLUETOOTH_CHIP) @@ -476,6 +555,27 @@ bool menuRadioSdManager(event_t _event) } } +#if defined(PXX2) + if (moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode == MODULE_MODE_BIND) { + if (reusableBuffer.sdManager.otaUpdateInformation.step == BIND_INIT) { + if (reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount > 0) { + if (reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount != popupMenuItemsCount) { + CLEAR_POPUP(); + popupMenuItemsCount = min(reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount,PXX2_MAX_RECEIVERS_PER_MODULE); + for (auto rx = 0; rx < popupMenuItemsCount; rx++) { + popupMenuItems[rx] = reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversNames[rx]; + } + //popupMenuTitle = STR_PXX2_SELECT_RX; + POPUP_MENU_START(onUpdateReceiverSelection); + } + } + else { + POPUP_WAIT(STR_WAITING_FOR_RX); + } + } + } +#endif + const char * ext = getFileExtension(reusableBuffer.sdManager.lines[index]); if (ext && isExtensionMatching(ext, BITMAPS_EXT)) { if (currentBitmapIndex != menuVerticalPosition) { diff --git a/radio/src/gui/common/stdlcd/model_receiver_options.cpp b/radio/src/gui/common/stdlcd/model_receiver_options.cpp index ed4dbcd48..6ce66ee29 100644 --- a/radio/src/gui/common/stdlcd/model_receiver_options.cpp +++ b/radio/src/gui/common/stdlcd/model_receiver_options.cpp @@ -46,14 +46,18 @@ void onRxOptionsUpdateConfirm(const char * result) enum { ITEM_RECEIVER_SETTINGS_PWM_RATE, ITEM_RECEIVER_SETTINGS_TELEMETRY, + ITEM_RECEIVER_SETTINGS_TELEMETRY_25MW, ITEM_RECEIVER_SETTINGS_SPORT_FPORT, ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED1, ITEM_RECEIVER_SETTINGS_CAPABILITY_NOT_SUPPORTED2, ITEM_RECEIVER_SETTINGS_PINMAP_FIRST }; +#define IS_RECEIVER_CAPABILITY_ENABLED(capability) (reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilities & (1 << capability)) +#define IF_RECEIVER_CAPABILITY(capability, count) uint8_t(IS_RECEIVER_CAPABILITY_ENABLED(capability) ? count : HIDDEN_ROW) -#define IF_RECEIVER_CAPABILITY(capability, count) uint8_t((reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilities & (1 << capability)) ? count : HIDDEN_ROW) +#define CH_ENABLE_SPORT 4 +#define CH_ENABLE_SBUS 5 void menuModelReceiverOptions(event_t event) { @@ -76,6 +80,7 @@ void menuModelReceiverOptions(event_t event) SUBMENU_NOTITLE(ITEM_RECEIVER_SETTINGS_PINMAP_FIRST + outputsCount, { 0, // PWM rate isModuleR9MAccess(g_moduleIdx) && receiverVariant == PXX2_VARIANT_EU && reusableBuffer.hardwareAndSettings.moduleSettings.txPower > 14 /*25mW*/ ? READONLY_ROW : (uint8_t)0, // Telemetry + IF_RECEIVER_CAPABILITY(RECEIVER_CAPABILITY_TELEMETRY_25MW, 0), IF_RECEIVER_CAPABILITY(RECEIVER_CAPABILITY_FPORT, 0), uint8_t(reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilityNotSupported ? READONLY_ROW : HIDDEN_ROW), uint8_t(reusableBuffer.hardwareAndSettings.modules[g_moduleIdx].receivers[receiverId].information.capabilityNotSupported ? READONLY_ROW : HIDDEN_ROW), @@ -139,7 +144,7 @@ void menuModelReceiverOptions(event_t event) switch (i) { case ITEM_RECEIVER_SETTINGS_PWM_RATE: - reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate, RECEIVER_OPTIONS_2ND_COLUMN, y, isModuleR9MAccess(g_moduleIdx) ? "6.67ms PWM": "9ms PWM", attr, event); + reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.pwmRate, RECEIVER_OPTIONS_2ND_COLUMN, y, isModuleR9MAccess(g_moduleIdx) ? "6.67ms PWM": "7ms PWM", attr, event); if (attr && checkIncDec_Ret) { reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_DIRTY; } @@ -152,6 +157,13 @@ void menuModelReceiverOptions(event_t event) } break; + case ITEM_RECEIVER_SETTINGS_TELEMETRY_25MW: + reusableBuffer.hardwareAndSettings.receiverSettings.telemetry25mw = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.telemetry25mw, RECEIVER_OPTIONS_2ND_COLUMN, y, "25mw Tele", attr, event); + if (attr && checkIncDec_Ret) { + reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_DIRTY; + } + break; + case ITEM_RECEIVER_SETTINGS_SPORT_FPORT: reusableBuffer.hardwareAndSettings.receiverSettings.fport = editCheckBox(reusableBuffer.hardwareAndSettings.receiverSettings.fport, RECEIVER_OPTIONS_2ND_COLUMN, y, "F.Port", attr, event); if (attr && checkIncDec_Ret) { @@ -174,27 +186,49 @@ void menuModelReceiverOptions(event_t event) if (pin < reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount) { uint8_t & mapping = reusableBuffer.hardwareAndSettings.receiverSettings.outputsMapping[pin]; uint8_t channel = g_model.moduleData[g_moduleIdx].channelsStart + mapping; - int32_t channelValue = channelOutputs[channel]; lcdDrawText(0, y, STR_PIN); lcdDrawNumber(lcdLastRightPos + 1, y, pin + 1); - putsChn(7 * FW, y, channel + 1, attr); + + uint8_t channelMax = sentModuleChannels(g_moduleIdx) - 1; + uint8_t selectionMax = channelMax; + + if (IS_RECEIVER_CAPABILITY_ENABLED(RECEIVER_CAPABILITY_ENABLE_PWM_CH5_CH6)) { + if (CH_ENABLE_SPORT == pin || CH_ENABLE_SBUS == pin) + selectionMax += 1; + + if (CH_ENABLE_SPORT == pin && selectionMax == channel) { + lcdDrawText(7 * FW, y, "S.PORT", attr); + } + else if (CH_ENABLE_SBUS == pin && selectionMax == channel) { + lcdDrawText(7 * FW, y, "SBUS", attr); + } + else { + putsChn(7 * FW, y, channel + 1, attr); + } + } + else { + putsChn(7 * FW, y, channel + 1, attr); + } // Channel if (attr) { - mapping = checkIncDec(event, mapping, 0, sentModuleChannels(g_moduleIdx) - 1); + mapping = checkIncDec(event, mapping, 0, selectionMax); if (checkIncDec_Ret) { reusableBuffer.hardwareAndSettings.receiverSettings.dirty = RECEIVER_SETTINGS_DIRTY; } } // Bargraph -#if !defined(PCBX7) // X7 LCD doesn't like too many horizontal lines - lcdDrawRect(RECEIVER_OPTIONS_2ND_COLUMN, y + 2, wbar + 1, 4); -#endif - const uint8_t lenChannel = limit(1, (abs(channelValue) * wbar / 2 + lim / 2) / lim, wbar / 2); - const coord_t xChannel = (channelValue > 0) ? RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 : RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 + 1 - lenChannel; - lcdDrawHorizontalLine(xChannel, y + 3, lenChannel, SOLID, 0); - lcdDrawHorizontalLine(xChannel, y + 4, lenChannel, SOLID, 0); + if (channel <= channelMax) { + int32_t channelValue = channelOutputs[channel]; + #if !defined(PCBX7) // X7 LCD doesn't like too many horizontal lines + lcdDrawRect(RECEIVER_OPTIONS_2ND_COLUMN, y + 2, wbar + 1, 4); + #endif + auto lenChannel = limit(1, (abs(channelValue) * wbar / 2 + lim / 2) / lim, wbar / 2); + auto xChannel = (channelValue > 0) ? RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 : RECEIVER_OPTIONS_2ND_COLUMN + wbar / 2 + 1 - lenChannel; + lcdDrawHorizontalLine(xChannel, y + 3, lenChannel, SOLID, 0); + lcdDrawHorizontalLine(xChannel, y + 4, lenChannel, SOLID, 0); + } } break; } diff --git a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp index fe387f307..7b6f9ac86 100644 --- a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp +++ b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp @@ -94,12 +94,12 @@ void onSdFormatConfirm(const char * result) void onUpdateConfirmation(const char * result) { if (result == STR_OK) { - OtaUpdateInformation * destination = moduleState[EXTERNAL_MODULE].otaUpdateInformation; - Pxx2OtaUpdate otaUpdate(EXTERNAL_MODULE, destination->candidateReceiversNames[destination->selectedReceiverIndex]); + OtaUpdateInformation * destination = moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].otaUpdateInformation; + Pxx2OtaUpdate otaUpdate(reusableBuffer.sdManager.otaUpdateInformation.module, destination->candidateReceiversNames[destination->selectedReceiverIndex]); otaUpdate.flashFirmware(destination->filename); } else { - moduleState[EXTERNAL_MODULE].mode = MODULE_MODE_NORMAL; + moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL; } } @@ -121,13 +121,13 @@ void onUpdateStateChanged() else { POPUP_WARNING(STR_OTA_UPDATE_ERROR); SET_WARNING_INFO(STR_UNSUPPORTED_RX, sizeof(TR_UNSUPPORTED_RX) - 1, 0); - moduleState[EXTERNAL_MODULE].mode = MODULE_MODE_NORMAL; + moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL; } } else { POPUP_WARNING(STR_OTA_UPDATE_ERROR); SET_WARNING_INFO(STR_UNKNOWN_RX, sizeof(TR_UNKNOWN_RX) - 1, 0); - moduleState[EXTERNAL_MODULE].mode = MODULE_MODE_NORMAL; + moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL; } } } @@ -246,10 +246,11 @@ void onSdManagerMenu(const char * result) } #endif #if defined(PXX2) - else if (result == STR_FLASH_RECEIVER_OTA) { + else if (result == STR_FLASH_RECEIVER_OTA_BY_INTERNAL || result == STR_FLASH_RECEIVER_OTA_BY_EXTERNAL) { memclear(&reusableBuffer.sdManager.otaUpdateInformation, sizeof(OtaUpdateInformation)); getSelectionFullPath(reusableBuffer.sdManager.otaUpdateInformation.filename); - moduleState[EXTERNAL_MODULE].startBind(&reusableBuffer.sdManager.otaUpdateInformation, onUpdateStateChanged); + reusableBuffer.sdManager.otaUpdateInformation.module = result == STR_FLASH_RECEIVER_OTA_BY_INTERNAL ? INTERNAL_MODULE : EXTERNAL_MODULE; + moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].startBind(&reusableBuffer.sdManager.otaUpdateInformation, onUpdateStateChanged); } #endif #endif @@ -274,7 +275,7 @@ void onUpdateReceiverSelection(const char * result) } else { // the user pressed [Exit] - moduleState[EXTERNAL_MODULE].mode = MODULE_MODE_NORMAL; + moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL; } } #endif @@ -285,8 +286,8 @@ void menuRadioSdManager(event_t _event) int lastPos = menuVerticalPosition; #endif - if (moduleState[EXTERNAL_MODULE].mode == MODULE_MODE_BIND && EVT_KEY_MASK(_event) == KEY_EXIT) { - moduleState[EXTERNAL_MODULE].mode = MODULE_MODE_NORMAL; + if (moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode == MODULE_MODE_BIND && EVT_KEY_MASK(_event) == KEY_EXIT) { + moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL; CLEAR_POPUP(); killEvents(KEY_EXIT); _event = 0; @@ -417,8 +418,12 @@ void menuRadioSdManager(event_t _event) POPUP_MENU_ADD_ITEM(STR_FLASH_EXTERNAL_MODULE); } #if defined(PXX2) - if (information.productFamily == FIRMWARE_FAMILY_RECEIVER) - POPUP_MENU_ADD_ITEM(STR_FLASH_RECEIVER_OTA); + if (information.productFamily == FIRMWARE_FAMILY_RECEIVER) { + if (isReceiverOTAEnabledFromModule(INTERNAL_MODULE, information.productId)) + POPUP_MENU_ADD_ITEM(STR_FLASH_RECEIVER_OTA_BY_INTERNAL); + if (isReceiverOTAEnabledFromModule(EXTERNAL_MODULE, information.productId)) + POPUP_MENU_ADD_ITEM(STR_FLASH_RECEIVER_OTA_BY_EXTERNAL); + } #endif #if defined(BLUETOOTH) if (information.productFamily == FIRMWARE_FAMILY_BLUETOOTH_CHIP) @@ -564,10 +569,10 @@ void menuRadioSdManager(event_t _event) } #if defined(PXX2) - if (moduleState[EXTERNAL_MODULE].mode == MODULE_MODE_BIND) { + if (moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode == MODULE_MODE_BIND) { if (reusableBuffer.sdManager.otaUpdateInformation.step == BIND_INIT) { if (reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount > 0) { - if(reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount != popupMenuItemsCount) { + if (reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount != popupMenuItemsCount) { CLEAR_POPUP(); popupMenuItemsCount = min(reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount,PXX2_MAX_RECEIVERS_PER_MODULE); for (auto rx = 0; rx < popupMenuItemsCount; rx++) { diff --git a/radio/src/io/frsky_firmware_update.cpp b/radio/src/io/frsky_firmware_update.cpp index 7cc7135b4..2d9a62d5e 100644 --- a/radio/src/io/frsky_firmware_update.cpp +++ b/radio/src/io/frsky_firmware_update.cpp @@ -313,12 +313,12 @@ const char * FrskyDeviceFirmwareUpdate::doFlashFirmware(const char * filename) } else { #if defined(PCBHORUS) - information.productId = FIRMWARE_ID_XJT; + information.productId = FIRMWARE_ID_MODULE_XJT; #endif } #if defined(PCBHORUS) - if (module == INTERNAL_MODULE && information.productId == FIRMWARE_ID_XJT) { + if (module == INTERNAL_MODULE && information.productId == FIRMWARE_ID_MODULE_XJT) { INTERNAL_MODULE_ON(); RTOS_WAIT_MS(1); intmoduleSerialStart(38400, true, USART_Parity_No, USART_StopBits_1, USART_WordLength_8b); diff --git a/radio/src/io/frsky_firmware_update.h b/radio/src/io/frsky_firmware_update.h index a229edb27..fc296daf8 100644 --- a/radio/src/io/frsky_firmware_update.h +++ b/radio/src/io/frsky_firmware_update.h @@ -24,6 +24,7 @@ #include "dataconstants.h" #include "definitions.h" #include "frsky_pxx2.h" +#include "pulses/modules_helpers.h" #include "ff.h" enum FrskyFirmwareProductFamily { @@ -35,12 +36,43 @@ enum FrskyFirmwareProductFamily { FIRMWARE_FAMILY_POWER_MANAGEMENT_UNIT, }; -enum FrskyFirmwareProductId { - FIRMWARE_ID_NONE, - FIRMWARE_ID_XJT = 0x01, - FIRMWARE_ID_ISRM = 0x02, +enum FrskyFirmwareModuleProductId { + FIRMWARE_ID_MODULE_NONE, + FIRMWARE_ID_MODULE_XJT = 0x01, + FIRMWARE_ID_MODULE_ISRM = 0x02, }; +enum FrskyFirmwareReceiverProductId { + FIRMWARE_ID_RECEIVER_NONE, + FIRMWARE_ID_RECEIVER_ARCHER = 0xC0, // TODO use the right constant + FIRMWARE_ID_RECEIVER_R9MX = 0xF0, // TODO use the right constant + // TODO fill the table + +}; + +inline bool isReceiverOTAEnabledFromModule(uint8_t moduleIdx, uint8_t productId) +{ + switch (productId) { + case FIRMWARE_ID_RECEIVER_ARCHER: + return isModuleISRM(moduleIdx); + + case FIRMWARE_ID_RECEIVER_R9MX: + return isModuleR9M(moduleIdx); + + // TODO add all those OTA receivers here + +/* + "R9-MINI-OTA", // this one has OTA (different bootloader) + "R9-MM-OTA", // this one has OTA (different bootloader) + "R9-SLIM+-OTA", // this one has OTA (different bootloader) + "R9SX", // this one has OTA + */ + + default: + return false; + } +} + PACK(struct FrSkyFirmwareInformation { uint32_t fourcc; uint8_t headerVersion; @@ -69,7 +101,7 @@ class FrskyDeviceFirmwareUpdate { }; public: - FrskyDeviceFirmwareUpdate(ModuleIndex module): + explicit FrskyDeviceFirmwareUpdate(ModuleIndex module): module(module) { } diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 30a03355e..214e2f4e1 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -1751,7 +1751,7 @@ const luaR_value_entry opentxConstants[] = { { "EVT_VIRTUAL_INC_REPT", EVT_KEY_REPT(KEY_UP) }, #endif -#if defined(NAVIGATION_9X) || defined(NAVIGATION_XLITE) +#if defined(NAVIGATION_9X) { "EVT_VIRTUAL_PREV_PAGE", EVT_KEY_LONG(KEY_LEFT) }, { "EVT_VIRTUAL_NEXT_PAGE", EVT_KEY_BREAK(KEY_LEFT) }, { "EVT_VIRTUAL_MENU", EVT_KEY_BREAK(KEY_RIGHT) }, @@ -1759,6 +1759,14 @@ const luaR_value_entry opentxConstants[] = { { "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) }, +#elif defined(NAVIGATION_XLITE) + { "EVT_VIRTUAL_PREV_PAGE", EVT_KEY_LONG(KEY_LEFT) }, + { "EVT_VIRTUAL_NEXT_PAGE", EVT_KEY_LONG(KEY_RIGHT) }, + { "EVT_VIRTUAL_MENU", EVT_KEY_BREAK(KEY_SHIFT) }, + { "EVT_VIRTUAL_MENU_LONG", EVT_KEY_LONG(KEY_SHIFT) }, + { "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) }, #elif defined(NAVIGATION_X7) || defined(NAVIGATION_X9D) { "EVT_VIRTUAL_PREV_PAGE", EVT_KEY_LONG(KEY_PAGE) }, { "EVT_VIRTUAL_NEXT_PAGE", EVT_KEY_BREAK(KEY_PAGE) }, diff --git a/radio/src/opentx.h b/radio/src/opentx.h index c96d94e1e..47ea4cdcd 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -255,17 +255,6 @@ #include "myeeprom.h" -inline void memclear(void * p, size_t size) -{ - memset(p, 0, size); -} - -inline bool is_memclear(void * p, size_t size) -{ - uint8_t * buf = (uint8_t *)p; - return buf[0] == 0 && memcmp(buf, buf + 1, size - 1) == 0; -} - void memswap(void * a, void * b, uint8_t size); #if defined(PCBX9D) || defined(PCBX9DP) || defined(PCBX9E) || defined(PCBHORUS) diff --git a/radio/src/opentx_helpers.h b/radio/src/opentx_helpers.h index 8ddeba85e..866fdfb98 100644 --- a/radio/src/opentx_helpers.h +++ b/radio/src/opentx_helpers.h @@ -21,10 +21,23 @@ #ifndef _OPENTX_HELPERS_H_ #define _OPENTX_HELPERS_H_ +#include + template inline t min(t a, t b) { return a inline t max(t a, t b) { return a>b?a:b; } template inline t sgn(t a) { return a>0 ? 1 : (a < 0 ? -1 : 0); } template inline t limit(t mi, t x, t ma) { return min(max(mi,x),ma); } template inline void SWAP(t & a, t & b) { t tmp = b; b = a; a = tmp; } +inline void memclear(void * p, size_t size) +{ + memset(p, 0, size); +} + +inline bool is_memclear(void * p, size_t size) +{ + uint8_t * buf = (uint8_t *)p; + return buf[0] == 0 && memcmp(buf, buf + 1, size - 1) == 0; +} + #endif // _OPENTX_HELPERS_H_ diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h index 4d358c36b..634035627 100644 --- a/radio/src/pulses/modules_helpers.h +++ b/radio/src/pulses/modules_helpers.h @@ -25,6 +25,8 @@ #include "definitions.h" #include "opentx_helpers.h" #include "telemetry/telemetry.h" +#include "storage/storage.h" + #if defined(MULTIMODULE) #include "telemetry/multi.h" #endif diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 7d859c075..e8c3ce8af 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -121,8 +121,10 @@ class ReceiverSettings { uint8_t receiverId; uint8_t dirty; uint8_t telemetryDisabled; + uint8_t telemetry25mw; uint8_t pwmRate; uint8_t fport; + uint8_t enablePwmCh5Ch6; uint8_t outputsCount; uint8_t outputsMapping[24]; }; @@ -144,6 +146,7 @@ class OtaUpdateInformation: public BindInformation { public: char filename[_MAX_LFN + 1]; uint32_t address; + uint32_t module; }; typedef void (* ModuleCallback)(); diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index 323dc3c16..944be8a3a 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -223,6 +223,10 @@ void Pxx2Pulses::setupReceiverSettingsFrame(uint8_t module) flag1 |= PXX2_RX_SETTINGS_FLAG1_FASTPWM; if (reusableBuffer.hardwareAndSettings.receiverSettings.fport) flag1 |= PXX2_RX_SETTINGS_FLAG1_FPORT; + if (reusableBuffer.hardwareAndSettings.receiverSettings.telemetry25mw) + flag1 |= PXX2_RX_SETTINGS_FLAG1_TELEMETRY_25MW; + if (reusableBuffer.hardwareAndSettings.receiverSettings.enablePwmCh5Ch6) + flag1 |= PXX2_RX_SETTINGS_FLAG1_ENABLE_PWM_CH5_CH6; Pxx2Transport::addByte(flag1); uint8_t outputsCount = min(24, reusableBuffer.hardwareAndSettings.receiverSettings.outputsCount); for (int i = 0; i < outputsCount; i++) { @@ -355,6 +359,8 @@ void Pxx2Pulses::sendOtaUpdate(uint8_t module, const char * rxName, uint32_t add if (module == EXTERNAL_MODULE) extmoduleSendNextFrame(); + else if (module == INTERNAL_MODULE) + intmoduleSendNextFrame(); } void Pxx2Pulses::setupAuthenticationFrame(uint8_t module, uint8_t mode, const uint8_t * outputMessage) @@ -464,7 +470,12 @@ const char * Pxx2OtaUpdate::nextStep(uint8_t step, const char * rxName, uint32_t destination->address = address; for (uint8_t retry = 0;; retry++) { - extmodulePulsesData.pxx2.sendOtaUpdate(module, rxName, address, (const char *) buffer); + if (module == EXTERNAL_MODULE) { + extmodulePulsesData.pxx2.sendOtaUpdate(module, rxName, address, (const char *) buffer); + } + else if (module == INTERNAL_MODULE) { + intmodulePulsesData.pxx2.sendOtaUpdate(module, rxName, address, (const char *) buffer); + } if (waitStep(step + 1, 20)) { return nullptr; } diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index c739b6e3d..2fa64dcad 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -53,6 +53,8 @@ #define PXX2_RX_SETTINGS_FLAG1_READONLY (1 << 6) #define PXX2_RX_SETTINGS_FLAG1_FASTPWM (1 << 4) #define PXX2_RX_SETTINGS_FLAG1_FPORT (1 << 3) +#define PXX2_RX_SETTINGS_FLAG1_TELEMETRY_25MW (1 << 2) +#define PXX2_RX_SETTINGS_FLAG1_ENABLE_PWM_CH5_CH6 (1 << 1) #define PXX2_TX_SETTINGS_FLAG0_WRITE (1 << 6) #define PXX2_TX_SETTINGS_FLAG1_EXTERNAL_ANTENNA (1 << 3) @@ -81,7 +83,7 @@ enum PXX2ModuleModelID { PXX2_MODULE_ISRM_S_X10E, PXX2_MODULE_XJT_LITE, PXX2_MODULE_ISRM_S_X10S, - PXX2_MODULE_ISRM_S_X9LITE, + PXX2_MODULE_ISRM_X9LITES, }; static const char * const PXX2ModulesNames[] = { @@ -98,7 +100,7 @@ static const char * const PXX2ModulesNames[] = { "ISRM-S-X10E", "XJT Lite", "ISRM-S-X10S", - "ISRM-S-X9Lite" + "ISRM-X9LiteS" }; inline const char * getPXX2ModuleName(uint8_t modelId) @@ -140,7 +142,7 @@ static const uint8_t PXX2ModuleOptions[] = { 0b00000101, // ISRM-S-X10E 0b00000001, // XJT_LITE 0b00000101, // ISRM-S-X10S - 0b00000101, // ISRM-S-X9LITE + 0b00000100, // ISRM-X9LITES }; inline uint8_t getPXX2ModuleOptions(uint8_t modelId) @@ -189,6 +191,9 @@ static const char * const PXX2ReceiversNames[] = { "R9-MINI-OTA", // this one has OTA (different bootloader) "R9-MM-OTA", // this one has OTA (different bootloader) "R9-SLIM+-OTA", // this one has OTA (different bootloader) + "Archer-X", // this one has OTA (internal module) + "R9MX", // this one has OTA + "R9SX", // this one has OTA }; inline const char * getPXX2ReceiverName(uint8_t modelId) @@ -239,6 +244,9 @@ static const uint8_t PXX2ReceiverOptions[] = { 0b11111111, // R9-MINI+OTA 0b11111111, // R9-MM+OTA 0b11111111, // R9-SLIM+OTA + 0b11111111, // ARCHER-X + 0b11111111, // R9MX + 0b11111111, // R9SX }; inline uint8_t getPXX2ReceiverOptions(uint8_t modelId) @@ -256,6 +264,8 @@ inline bool isPXX2ReceiverOptionAvailable(uint8_t modelId, uint8_t option) enum ReceiverCapabilities { RECEIVER_CAPABILITY_FPORT, + RECEIVER_CAPABILITY_TELEMETRY_25MW, + RECEIVER_CAPABILITY_ENABLE_PWM_CH5_CH6, RECEIVER_CAPABILITY_COUNT }; diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index 93ad67d18..8218447e4 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -187,6 +187,7 @@ enum FrSkyDataState { #define DIY_STREAM_FIRST_ID 0x5000 #define DIY_STREAM_LAST_ID 0x50FF #define FACT_TEST_ID 0xF000 +#define FRAME_LOSS_RATE_ID 0xF010 #define RSSI_ID 0xF101 #define ADC1_ID 0xF102 #define ADC2_ID 0xF103 diff --git a/radio/src/telemetry/frsky_pxx2.cpp b/radio/src/telemetry/frsky_pxx2.cpp index 7d596ecc4..8ed11be1c 100644 --- a/radio/src/telemetry/frsky_pxx2.cpp +++ b/radio/src/telemetry/frsky_pxx2.cpp @@ -86,6 +86,12 @@ void processReceiverSettingsFrame(uint8_t module, const uint8_t * frame) if (frame[4] & PXX2_RX_SETTINGS_FLAG1_TELEMETRY_DISABLED) destination->telemetryDisabled = 1; + if (frame[4] & PXX2_RX_SETTINGS_FLAG1_TELEMETRY_25MW) + destination->telemetry25mw = 1; + + if (frame[4] & PXX2_RX_SETTINGS_FLAG1_ENABLE_PWM_CH5_CH6) + destination->enablePwmCh5Ch6 = 1; + uint8_t outputsCount = min(16, frame[0] - 4); destination->outputsCount = outputsCount; for (uint8_t pin = 0; pin < outputsCount; pin++) { diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index bc32da123..78438caaf 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -30,6 +30,7 @@ struct FrSkySportSensor { }; const FrSkySportSensor sportSensors[] = { + { FRAME_LOSS_RATE_ID, FRAME_LOSS_RATE_ID, 0, ZSTR_FLR, UNIT_PERCENT, 0 }, { RSSI_ID, RSSI_ID, 0, ZSTR_RSSI, UNIT_DB, 0 }, #if defined(MULTIMODULE) { TX_RSSI_ID, TX_RSSI_ID, 0, ZSTR_TX_RSSI , UNIT_DB , 0 }, diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index 0d15c3c0c..d2768ae87 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -23,6 +23,9 @@ #include "frsky.h" #include "crossfire.h" +#include "myeeprom.h" +#include "io/frsky_sport.h" + #if defined(MULTIMODULE) #include "spektrum.h" #include "flysky_ibus.h" diff --git a/radio/src/telemetry/telemetry_holders.h b/radio/src/telemetry/telemetry_holders.h index 70b2b6a9c..9db8d629f 100644 --- a/radio/src/telemetry/telemetry_holders.h +++ b/radio/src/telemetry/telemetry_holders.h @@ -22,6 +22,7 @@ #define _TELEMETRY_HOLDERS_H_ #include +#include #include "../timers.h" #define TELEMETRY_AVERAGE_COUNT 3 // we actually average one more reading! diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 1cd1c98a8..293e5abf8 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -428,6 +428,8 @@ const char STR_FIRMWARE_UPDATE_SUCCESS[] = TR_FIRMWARE_UPDATE_SUCCESS; const char STR_WRITING[] = TR_WRITING; const char STR_FLASH_EXTERNAL_DEVICE[] = TR_FLASH_EXTERNAL_DEVICE; const char STR_FLASH_RECEIVER_OTA[] = TR_FLASH_RECEIVER_OTA; +const char STR_FLASH_RECEIVER_OTA_BY_EXTERNAL[] = TR_FLASH_RECEIVER_OTA_BY_EXTERNAL; +const char STR_FLASH_RECEIVER_OTA_BY_INTERNAL[] = TR_FLASH_RECEIVER_OTA_BY_INTERNAL; const char STR_FLASH_BLUETOOTH_MODULE[] = TR_FLASH_BLUETOOTH_MODULE; const char STR_FLASH_POWER_MANAGEMENT_UNIT[] = TR_FLASH_POWER_MANAGEMENT_UNIT; const char STR_CONFIRM_FORMAT[] = TR_CONFIRM_FORMAT; diff --git a/radio/src/translations.h b/radio/src/translations.h index e11ad3197..7a28a4299 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -626,6 +626,8 @@ extern const char STR_VIEW_TEXT[]; extern const char STR_FLASH_BOOTLOADER[]; extern const char STR_FLASH_EXTERNAL_DEVICE[]; extern const char STR_FLASH_RECEIVER_OTA[]; +extern const char STR_FLASH_RECEIVER_OTA_BY_EXTERNAL[]; +extern const char STR_FLASH_RECEIVER_OTA_BY_INTERNAL[]; extern const char STR_FLASH_BLUETOOTH_MODULE[]; extern const char STR_FLASH_POWER_MANAGEMENT_UNIT[]; extern const char STR_CURRENT_VERSION[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index dbcab44a5..0033d2c49 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -821,6 +821,8 @@ #define TR_FLASH_BOOTLOADER "Flash bootloaderu" #define TR_FLASH_EXTERNAL_DEVICE TR("Flash S.Portem", "Flash S.Portem") #define TR_FLASH_RECEIVER_OTA "Flash příjímače OTA" +#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA" +#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash modulu BT", "Flash modulu Bluetooth") #define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Flash řízení spotř.", "Flash jednotky řízení spotřeby") #define TR_CURRENT_VERSION TR("Současná ver. ", "Současná verze: ") @@ -1165,6 +1167,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" +#define ZSTR_FLR "FLR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 431ad44b8..1e9d99231 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -823,6 +823,8 @@ #define TR_FLASH_BOOTLOADER TR("Flash bootloader","Flash bootloader") // #define TR_FLASH_EXTERNAL_DEVICE TR("Flash ext. Gerät","Flash externes Gerät") #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" +#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA" +#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetoothmodul") #define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Flash pwr mngt unit", "Flash power management unit") #define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ") @@ -1171,6 +1173,7 @@ #define TR_AUTH_FAILURE "Auth-failure" // ---------------------------------------------------------------- +#define ZSTR_FLR "FLR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 91715127d..230b69b9b 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -822,6 +822,8 @@ #define TR_FLASH_BOOTLOADER "Flash bootloader" #define TR_FLASH_EXTERNAL_DEVICE TR("Flash S.Port", "Flash S.Port device") #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" +#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA" +#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module") #define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit" #define TR_CURRENT_VERSION TR("Curr Vers: ", "Current version: ") @@ -1169,6 +1171,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" +#define ZSTR_FLR "FLR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index c6943a0f1..fba624466 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -842,6 +842,8 @@ #define TR_FLASH_BOOTLOADER "Flash bootloader" #define TR_FLASH_EXTERNAL_DEVICE "Flash disp. externo" #define TR_FLASH_RECEIVER_OTA "Flash RX OTA" +#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA" +#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash modulo BT", "Flash modulo bluetooth") #define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash unid. pwr mngt" #define TR_CURRENT_VERSION TR("Vers. actual", "Version actual: ") @@ -1187,6 +1189,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltaje") #define TR_AUTH_FAILURE "Fallo auth." +#define ZSTR_FLR "FLR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index f8740cdef..d917e82f5 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -840,6 +840,8 @@ #define TR_FLASH_BOOTLOADER "Flash bootloader" #define TR_FLASH_EXTERNAL_DEVICE "Flash External Device" #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" +#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA" +#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module") #define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit" #define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ") @@ -1178,6 +1180,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" +#define ZSTR_FLR "FLR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 115dab994..fad12d2b9 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -842,6 +842,8 @@ #define TR_FLASH_BOOTLOADER "Flasher BootLoader" #define TR_FLASH_EXTERNAL_DEVICE TR("Flasher S.Port", "Flasher S.Port externe") #define TR_FLASH_RECEIVER_OTA "Flasher RX OTA" +#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA" +#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash module BT", "Flash module Bluetooth") #define TR_FLASH_POWER_MANAGEMENT_UNIT "Flasher pwr mngt unit" #define TR_CURRENT_VERSION "Version courante :" @@ -1193,6 +1195,7 @@ #define TR_RTC_CHECK TR("Vérif. RTC", "Vérif. pile RTC") #define TR_AUTH_FAILURE "Auth-failure" +#define ZSTR_FLR "FLR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 486e7fbf0..cb2b3c736 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -842,6 +842,8 @@ #define TR_FLASH_BOOTLOADER "Prog. bootloader" #define TR_FLASH_EXTERNAL_DEVICE "Progr. dispositivo Esterno" #define TR_FLASH_RECEIVER_OTA TR("Prog. RX OTA", INDENT "Prog. ricevente OTA") +#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA" +#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Prog. mod. BT", INDENT "Prog. modulo Bluetooth") #define TR_FLASH_POWER_MANAGEMENT_UNIT TR("Prog. PMU", "Program. PMU") #define TR_CURRENT_VERSION TR("Vers. currente ", "Versione corrente: ") @@ -1187,6 +1189,7 @@ #define TR_RTC_CHECK TR("Controllo RTC", "Controllo voltaggio RTC") #define TR_AUTH_FAILURE "Auth-failure" +#define ZSTR_FLR "FLR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 9f3173d6c..abda9557a 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -828,6 +828,8 @@ #define TR_FLASH_BOOTLOADER "Flash bootloader" #define TR_FLASH_EXTERNAL_DEVICE "Flash extern Apparaat" #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" +#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA" +#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module") #define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit" #define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ") @@ -1179,6 +1181,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" +#define ZSTR_FLR "FLR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 4e8915ce2..606a45895 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -841,6 +841,8 @@ #define TR_FLASH_BOOTLOADER "Flash bootloader" #define TR_FLASH_EXTERNAL_DEVICE "Sflashuj Moduł Zewnętrzny" #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" +#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA" +#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module") #define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit" #define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ") @@ -1186,6 +1188,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" +#define ZSTR_FLR "FLR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 90d3dcb9d..29533d2c5 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -831,6 +831,8 @@ #define TR_FLASH_BOOTLOADER "Flash bootloader" #define TR_FLASH_EXTERNAL_DEVICE "Flash External Device" #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" +#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA" +#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module") #define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit" #define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ") @@ -1175,6 +1177,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" +#define ZSTR_FLR "FLR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 8b47e3fda..eaacd2905 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -841,6 +841,8 @@ #define TR_FLASH_BOOTLOADER "Skriv BootLoader" #define TR_FLASH_EXTERNAL_DEVICE "Flash External Device" #define TR_FLASH_RECEIVER_OTA "Flash receiver OTA" +#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA" +#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash BT module", "Flash Bluetooth module") #define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash pwr mngt unit" #define TR_CURRENT_VERSION TR("Current vers. ", "Current version: ") @@ -1186,6 +1188,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" +#define ZSTR_FLR "FLR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" From c8043bbd6ac35273b912c7f31651dae429f8c177 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 24 Mar 2020 15:35:03 +0100 Subject: [PATCH 177/560] Range check button was impossible to reach on X9D+ 2019 (internal ACCST D16) --- radio/src/gui/212x64/model_setup.cpp | 15 ++++++--------- radio/src/pulses/modules_helpers.h | 5 ----- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index e73c2938e..9b7cb8b4b 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -130,8 +130,6 @@ enum MenuModelSetupItems { #define MODEL_SETUP_2ND_COLUMN (LCD_W-17*FW-MENUS_SCROLLBAR_WIDTH-1) #define MODEL_SETUP_3RD_COLUMN (MODEL_SETUP_2ND_COLUMN+6*FW) -#define MODEL_SETUP_BIND_OFS 3*FW-2 -#define MODEL_SETUP_RANGE_OFS 7*FW #define MODEL_SETUP_SET_FAILSAFE_OFS 10*FW-2 void copySelection(char * dst, const char * src, uint8_t size) @@ -353,7 +351,7 @@ void menuModelSetup(event_t event) LABEL(InternalModule), INTERNAL_MODULE_TYPE_ROWS, MODULE_CHANNELS_ROWS(INTERNAL_MODULE), - IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(isModuleRangeAvailable(INTERNAL_MODULE)? (uint8_t)2 : (uint8_t)1)), // RxNum, Range check and Register buttons + IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(isModuleBindRangeAvailable(INTERNAL_MODULE)? (uint8_t)2 : (uint8_t)1)), // RxNum, Range check and Register buttons IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), // RxNum for ACCESS IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Failsafe IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 1), // Range check and Register buttons @@ -1093,9 +1091,8 @@ void menuModelSetup(event_t event) } else { horzpos_t l_posHorz = menuHorizontalPosition; - coord_t xOffsetBind = MODEL_SETUP_BIND_OFS; + coord_t bindButtonPos = MODEL_SETUP_2ND_COLUMN; if (!isModuleRxNumAvailable(moduleIdx)) { - xOffsetBind = 0; lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER); if (attr) l_posHorz += 1; } @@ -1103,8 +1100,8 @@ void menuModelSetup(event_t event) lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER_NUM); } if (isModuleBindRangeAvailable(moduleIdx)) { - if (xOffsetBind) - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2); + bindButtonPos = lcdNextPos + FW; if (attr && l_posHorz==0) { if (s_editMode>0) { CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], getMaxRxNum(moduleIdx)); @@ -1121,8 +1118,8 @@ void menuModelSetup(event_t event) } } } - lcdDrawText(MODEL_SETUP_2ND_COLUMN+xOffsetBind, y, STR_MODULE_BIND, l_posHorz==1 ? attr : 0); - lcdDrawText(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0); + lcdDrawText(bindButtonPos, y, STR_MODULE_BIND, l_posHorz==1 ? attr : 0); + lcdDrawText(lcdNextPos + FW, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0); uint8_t newFlag = 0; #if defined(MULTIMODULE) if (getMultiBindStatus(moduleIdx) == MULTI_BIND_FINISHED) { diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h index 634035627..a1e3cee65 100644 --- a/radio/src/pulses/modules_helpers.h +++ b/radio/src/pulses/modules_helpers.h @@ -423,11 +423,6 @@ inline bool isModuleBindRangeAvailable(uint8_t moduleIdx) return isModulePXX2(moduleIdx) || isModulePXX1(moduleIdx) || isModuleDSM2(moduleIdx) || isModuleMultimodule(moduleIdx); } -inline bool isModuleRangeAvailable(uint8_t moduleIdx) -{ - return isModuleXJTD16(moduleIdx) || isModuleXJTLR12(moduleIdx); -} - constexpr uint8_t MAX_RXNUM = 63; inline uint8_t getMaxRxNum(uint8_t idx) From add57ab4f9931981cbfbd601cfaa06fd06ebff11 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 25 Mar 2020 14:04:41 +0100 Subject: [PATCH 178/560] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c966e7ed4..64e672a51 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ## OpenTX 2.3 Branch [![Travis build Status](https://travis-ci.org/opentx/opentx.svg?branch=2.3)](https://travis-ci.org/opentx/opentx) -[![Join the Discord chat](https://img.shields.io/badge/discord-join_chat-yellow.svg)](https://discord.gg/pAmmCp2) +[![Join the Discord chat](https://img.shields.io/badge/discord-join_chat-yellow.svg)](https://discord.gg/CZCwVx2) [![Donate using Paypal](https://img.shields.io/badge/paypal-donate-yellow.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=DJ9MASSKVW8WN) The ongoing development on 2.3.x is done in this branch. From 4e5cd96af5533a39f80421cbc393083a12f4065c Mon Sep 17 00:00:00 2001 From: Kilrah Date: Wed, 25 Mar 2020 16:41:20 +0100 Subject: [PATCH 179/560] T12 had duplicate flexr9m options --- companion/src/firmwares/opentx/opentxinterface.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 7f71b5ebd..85d235679 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -1331,7 +1331,6 @@ void registerOpenTxFirmwares() firmware->addOption("noheli", Firmware::tr("Disable HELI menu and cyclic mix support")); firmware->addOption("nogvars", Firmware::tr("Disable Global variables")); firmware->addOption("lua", Firmware::tr("Enable Lua custom scripts screen")); - firmware->addOption("flexr9m", Firmware::tr("Enable non certified R9M firmwares")); firmware->addOption("internalmulti", Firmware::tr("Support for MULTI internal module")); addOpenTxFontOptions(firmware); registerOpenTxFirmware(firmware); From 555438b7a70fe38152c0a2f8435280eb1ba3e8c0 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 26 Mar 2020 16:16:56 +0100 Subject: [PATCH 180/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index f8d4f14e6..772bd36b9 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1707,3 +1707,4 @@ Fabrice Debonnet James Laver Kevin Bowens David Frech +Udo Kastenholz From 6232cebe002bf5c289352a9da4d96ab574d15955 Mon Sep 17 00:00:00 2001 From: Kilrah Date: Thu, 26 Mar 2020 17:45:19 +0100 Subject: [PATCH 181/560] Fix "Remember simulator switch values" --- companion/src/simulation/simulatorwidget.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/companion/src/simulation/simulatorwidget.cpp b/companion/src/simulation/simulatorwidget.cpp index 798c8664b..7a457c228 100644 --- a/companion/src/simulation/simulatorwidget.cpp +++ b/companion/src/simulation/simulatorwidget.cpp @@ -680,12 +680,14 @@ void SimulatorWidget::setupJoysticks() void SimulatorWidget::restoreRadioWidgetsState() { // All RadioWidgets - RadioWidget::RadioWidgetState state; - QList states = g.profile[radioProfileId].simulatorOptions().controlsState; - foreach (QByteArray ba, states) { - QDataStream stream(ba); - stream >> state; - emit widgetStateChange(state); + if (g.simuSW()) { + RadioWidget::RadioWidgetState state; + QList states = g.profile[radioProfileId].simulatorOptions().controlsState; + foreach (QByteArray ba, states) { + QDataStream stream(ba); + stream >> state; + emit widgetStateChange(state); + } } // Set throttle stick down and locked, side depends on mode @@ -700,8 +702,10 @@ void SimulatorWidget::saveRadioWidgetsState(QList & state) { if (m_radioWidgets.size()) { state.clear(); - foreach (RadioWidget * rw, m_radioWidgets) - state.append(rw->getStateData()); + if (g.simuSW()) { + foreach (RadioWidget * rw, m_radioWidgets) + state.append(rw->getStateData()); + } } } From f9ae9adc9ba048bfe3fdf6032a8d3b421fb14aa1 Mon Sep 17 00:00:00 2001 From: WismyYao Date: Fri, 27 Mar 2020 15:52:56 +0800 Subject: [PATCH 182/560] Wismy/frsky receivers table (#7462) Full the table about receivers --- radio/src/io/frsky_firmware_update.h | 50 ++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/radio/src/io/frsky_firmware_update.h b/radio/src/io/frsky_firmware_update.h index fc296daf8..4690e0215 100644 --- a/radio/src/io/frsky_firmware_update.h +++ b/radio/src/io/frsky_firmware_update.h @@ -44,30 +44,52 @@ enum FrskyFirmwareModuleProductId { enum FrskyFirmwareReceiverProductId { FIRMWARE_ID_RECEIVER_NONE, - FIRMWARE_ID_RECEIVER_ARCHER = 0xC0, // TODO use the right constant - FIRMWARE_ID_RECEIVER_R9MX = 0xF0, // TODO use the right constant - // TODO fill the table - + FIRMWARE_ID_RECEIVER_X8R = 0x01, + FIRMWARE_ID_RECEIVER_RX8R = 0x02, + FIRMWARE_ID_RECEIVER_RX8R_PRO = 0x03, + FIRMWARE_ID_RECEIVER_RX6R = 0x04, + FIRMWARE_ID_RECEIVER_RX4R = 0x05, + FIRMWARE_ID_RECEIVER_G_RX8 = 0x06, + FIRMWARE_ID_RECEIVER_G_RX6 = 0x07, + FIRMWARE_ID_RECEIVER_X6R = 0x08, + FIRMWARE_ID_RECEIVER_X4R = 0x09, + FIRMWARE_ID_RECEIVER_X4R_SB = 0x0A, + FIRMWARE_ID_RECEIVER_XSR = 0x0B, + FIRMWARE_ID_RECEIVER_XSR_M = 0x0C, + FIRMWARE_ID_RECEIVER_RXSR = 0x0D, + FIRMWARE_ID_RECEIVER_S6R = 0x0E, + FIRMWARE_ID_RECEIVER_S8R = 0x0F, + FIRMWARE_ID_RECEIVER_XM = 0x10, + FIRMWARE_ID_RECEIVER_XMP = 0x11, + FIRMWARE_ID_RECEIVER_XMR = 0x12, + FIRMWARE_ID_RECEIVER_R9 = 0x13, + FIRMWARE_ID_RECEIVER_R9_SLIM = 0x14, + FIRMWARE_ID_RECEIVER_R9_SLIMP = 0x15, + FIRMWARE_ID_RECEIVER_R9_MINI = 0x16, + FIRMWARE_ID_RECEIVER_R9_MM = 0x17, + FIRMWARE_ID_RECEIVER_R9_STAB = 0x18, // R9_STAB has OTA + FIRMWARE_ID_RECEIVER_R9_MINI_OTA = 0x19, // this one has OTA (different bootloader) + FIRMWARE_ID_RECEIVER_R9_MM_OTA = 0x1A, // this one has OTA (different bootloader) + FIRMWARE_ID_RECEIVER_R9_SLIMP_OTA = 0x1B, // this one has OTA (different bootloader) + FIRMWARE_ID_RECEIVER_ARCHER_X = 0x1C, // this one has OTA (internal module) + FIRMWARE_ID_RECEIVER_R9MX = 0x1D, // this one has OTA + FIRMWARE_ID_RECEIVER_R9SX = 0x1E, // this one has OTA }; inline bool isReceiverOTAEnabledFromModule(uint8_t moduleIdx, uint8_t productId) { switch (productId) { - case FIRMWARE_ID_RECEIVER_ARCHER: + case FIRMWARE_ID_RECEIVER_ARCHER_X: return isModuleISRM(moduleIdx); + case FIRMWARE_ID_RECEIVER_R9_STAB: + case FIRMWARE_ID_RECEIVER_R9_MINI_OTA: + case FIRMWARE_ID_RECEIVER_R9_MM_OTA: + case FIRMWARE_ID_RECEIVER_R9_SLIMP_OTA: case FIRMWARE_ID_RECEIVER_R9MX: + case FIRMWARE_ID_RECEIVER_R9SX: return isModuleR9M(moduleIdx); - // TODO add all those OTA receivers here - -/* - "R9-MINI-OTA", // this one has OTA (different bootloader) - "R9-MM-OTA", // this one has OTA (different bootloader) - "R9-SLIM+-OTA", // this one has OTA (different bootloader) - "R9SX", // this one has OTA - */ - default: return false; } From 04f2ec91b4c572116efd67bce6397509e94bb068 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 27 Mar 2020 09:40:57 +0100 Subject: [PATCH 183/560] Add Spektrum smart ESC and smart battery telemetry (#7460) Add Spektrum ESC telemetry --- radio/src/telemetry/spektrum.cpp | 117 ++++++++++++++++++++++++++++++- radio/src/translations/cz.h.txt | 35 ++++++++- radio/src/translations/de.h.txt | 53 +++++++++++++- radio/src/translations/en.h.txt | 35 ++++++++- radio/src/translations/es.h.txt | 35 ++++++++- radio/src/translations/fi.h.txt | 35 ++++++++- radio/src/translations/fr.h.txt | 35 ++++++++- radio/src/translations/it.h.txt | 35 ++++++++- radio/src/translations/nl.h.txt | 35 ++++++++- radio/src/translations/pl.h.txt | 35 ++++++++- radio/src/translations/pt.h.txt | 35 ++++++++- radio/src/translations/se.h.txt | 35 ++++++++- 12 files changed, 508 insertions(+), 12 deletions(-) diff --git a/radio/src/telemetry/spektrum.cpp b/radio/src/telemetry/spektrum.cpp index a71d5118b..60c9f2329 100644 --- a/radio/src/telemetry/spektrum.cpp +++ b/radio/src/telemetry/spektrum.cpp @@ -24,6 +24,7 @@ /* * Documentation of the Spektrum protocol is available under * https://www.spektrumrc.com/ProdInfo/Files/SPM_Telemetry_Developers_Specs.pdf + * https://github.com/SpektrumRC/SpektrumDocumentation/blob/master/Telemetry/spektrumTelemetrySensors.h * * Multi module adds two byte header of 0xAA [RSSI of telemetry packet] [16 byte message] */ @@ -49,7 +50,18 @@ #define I2C_TEXTGEN 0x0c #define I2C_GPS 0x17 #define I2C_GPS2 0x17 +#define I2C_ESC 0x20 #define I2C_CELLS 0x3a + +// SMART_BAT is using fake I2C adresses compared to official Spektrum address because of subtype used only for this I2C address +#define I2C_SMART_BAT_BASE_ADDRESS 0x42 +#define I2C_SMART_BAT_REALTIME 0x42 +#define I2C_SMART_BAT_CELLS_1_6 0x43 +#define I2C_SMART_BAT_CELLS_7_12 0x44 +#define I2C_SMART_BAT_CELLS_13_18 0x45 +#define I2C_SMART_BAT_ID 0x4A +#define I2C_SMART_BAT_LIMITS 0x4B + #define I2C_QOS 0x7f enum SpektrumDataType : uint8_t { @@ -62,6 +74,8 @@ enum SpektrumDataType : uint8_t { uint8bcd, uint16bcd, uint32bcd, + uint16le, + uint32le, custom }; @@ -151,7 +165,16 @@ const SpektrumSensor spektrumSensors[] = { {0x1b, 2, int16, ZSTR_PITCH, UNIT_DEGREE, 1}, {0x1b, 4, int16, ZSTR_YAW, UNIT_DEGREE, 1}, - // {0x20, esc}, does not exist in the wild? + // {0x20, esc}, Smart ESC telemetry + {I2C_ESC, 0, uint16, ZSTR_ESC_RPM, UNIT_RPMS, 0}, + {I2C_ESC, 2, uint16, ZSTR_ESC_VIN, UNIT_VOLTS, 2}, + {I2C_ESC, 4, uint16, ZSTR_ESC_TFET, UNIT_CELSIUS, 1}, + {I2C_ESC, 6, uint16, ZSTR_ESC_CUR, UNIT_MAH, 1}, + {I2C_ESC, 8, uint16, ZSTR_ESC_TBEC, UNIT_CELSIUS, 1}, + {I2C_ESC, 10, uint8, ZSTR_ESC_BCUR, UNIT_AMPS, 1}, + {I2C_ESC, 11, uint8, ZSTR_ESC_VBEC, UNIT_VOLTS, 2}, + {I2C_ESC, 12, uint8, ZSTR_ESC_THR, UNIT_PERCENT, 1}, + {I2C_ESC, 13, uint8, ZSTR_ESC_POUT, UNIT_PERCENT, 1}, // Dual Cell monitor (0x34) {0x34, 0, int16, ZSTR_BATT1_CURRENT, UNIT_AMPS, 1}, @@ -178,6 +201,53 @@ const SpektrumSensor spektrumSensors[] = { {0x40, 0, int16, ZSTR_ALT, UNIT_METERS, 1}, {0x40, 2, int16, ZSTR_VSPD, UNIT_METERS_PER_SECOND, 1}, + // Smartbat + //{I2C_SMART_BAT_REALTIME, 1, int8, ZSTR_SMART_BAT_BTMP, UNIT_CELSIUS, 0}, // disabled because sensor is a duplicate of cells sensors ones + {I2C_SMART_BAT_REALTIME, 2, uint32le, ZSTR_SMART_BAT_BCUR, UNIT_MAH, 0}, + {I2C_SMART_BAT_REALTIME, 6, uint16le, ZSTR_SMART_BAT_BCAP, UNIT_MAH, 0}, + {I2C_SMART_BAT_REALTIME, 8, uint16le, ZSTR_SMART_BAT_MIN_CEL, UNIT_VOLTS, 2}, + {I2C_SMART_BAT_REALTIME, 10, uint16le, ZSTR_SMART_BAT_MAX_CEL, UNIT_VOLTS, 2}, + //{I2C_SMART_BAT_REALTIME, 12, uint16le, "RFU[2]", UNIT_RAW, 0}, // disabled to save sensors slots + + {I2C_SMART_BAT_CELLS_1_6, 1, int8, ZSTR_SMART_BAT_BTMP, UNIT_CELSIUS, 0}, + {I2C_SMART_BAT_CELLS_1_6, 2, uint16le, ZSTR_CL01, UNIT_VOLTS, 2}, + {I2C_SMART_BAT_CELLS_1_6, 4, uint16le, ZSTR_CL02, UNIT_VOLTS, 2}, + {I2C_SMART_BAT_CELLS_1_6, 6, uint16le, ZSTR_CL03, UNIT_VOLTS, 2}, + {I2C_SMART_BAT_CELLS_1_6, 8, uint16le, ZSTR_CL04, UNIT_VOLTS, 2}, + {I2C_SMART_BAT_CELLS_1_6, 10, uint16le, ZSTR_CL05, UNIT_VOLTS, 2}, + {I2C_SMART_BAT_CELLS_1_6, 12, uint16le, ZSTR_CL06, UNIT_VOLTS, 2}, + + {I2C_SMART_BAT_CELLS_7_12, 1, int8, ZSTR_SMART_BAT_BTMP, UNIT_CELSIUS, 0}, + {I2C_SMART_BAT_CELLS_7_12, 2, uint16le, ZSTR_CL07, UNIT_VOLTS, 2}, + {I2C_SMART_BAT_CELLS_7_12, 4, uint16le, ZSTR_CL08, UNIT_VOLTS, 2}, + {I2C_SMART_BAT_CELLS_7_12, 6, uint16le, ZSTR_CL09, UNIT_VOLTS, 2}, + {I2C_SMART_BAT_CELLS_7_12, 8, uint16le, ZSTR_CL10, UNIT_VOLTS, 2}, + {I2C_SMART_BAT_CELLS_7_12, 10, uint16le, ZSTR_CL11, UNIT_VOLTS, 2}, + {I2C_SMART_BAT_CELLS_7_12, 12, uint16le, ZSTR_CL12, UNIT_VOLTS, 2}, + + {I2C_SMART_BAT_CELLS_13_18, 1, int8, ZSTR_SMART_BAT_BTMP, UNIT_CELSIUS, 0}, + {I2C_SMART_BAT_CELLS_13_18, 2, uint16le, ZSTR_CL13, UNIT_VOLTS, 2}, + {I2C_SMART_BAT_CELLS_13_18, 4, uint16le, ZSTR_CL14, UNIT_VOLTS, 2}, + {I2C_SMART_BAT_CELLS_13_18, 6, uint16le, ZSTR_CL15, UNIT_VOLTS, 2}, + {I2C_SMART_BAT_CELLS_13_18, 8, uint16le, ZSTR_CL16, UNIT_VOLTS, 2}, + {I2C_SMART_BAT_CELLS_13_18, 10, uint16le, ZSTR_CL17, UNIT_VOLTS, 2}, + {I2C_SMART_BAT_CELLS_13_18, 12, uint16le, ZSTR_CL18, UNIT_VOLTS, 2}, + + //{I2C_SMART_BAT_ID, 1, uint8, "chemistery", UNIT_RAW, 0}, // disabled to save sensors slots + //{I2C_SMART_BAT_ID, 2, uint8, "number of cells", UNIT_RAW, 0}, // disabled to save sensors slots + //{I2C_SMART_BAT_ID, 3, uint8, "manufacturer code", UNIT_RAW, 0}, // disabled to save sensors slots + {I2C_SMART_BAT_ID, 4, uint16le, ZSTR_SMART_BAT_CYCLES, UNIT_RAW, 0}, + //{I2C_SMART_BAT_ID, 6, uint8, "uniqueID[8]", UNIT_RAW, 0}, // disabled to save sensors slots + + //{I2C_SMART_BAT_LIMITS, 1, uint8, "rfu", UNIT_RAW, 0}, // disabled to save sensors slots + {I2C_SMART_BAT_LIMITS, 2, uint16le, ZSTR_SMART_BAT_CAPACITY,UNIT_MAH, 0}, + //{I2C_SMART_BAT_LIMITS, 4, uint16le, "dischargeCurrentRating", UNIT_RAW, 0}, // disabled to save sensors slots + //{I2C_SMART_BAT_LIMITS, 6, uint16le, "overDischarge_mV", UNIT_RAW, 0}, // disabled to save sensors slots + //{I2C_SMART_BAT_LIMITS, 8, uint16le, "zeroCapacity_mV", UNIT_RAW, 0}, // disabled to save sensors slots + //{I2C_SMART_BAT_LIMITS, 10, uint16le, "fullyCharged_mV", UNIT_RAW, 0}, // disabled to save sensors slots + //{I2C_SMART_BAT_LIMITS, 12, uint8, "minWorkingTemp", UNIT_RAW, 0}, // disabled to save sensors slots + //{I2C_SMART_BAT_LIMITS, 13, uint8, "maxWorkingTemp", UNIT_RAW, 0}, // disabled to save sensors slots + // 0x50-0x56 custom 3rd party sensors //{0x50, 0, int16, ZSTR_} @@ -248,6 +318,10 @@ static int32_t spektrumGetValue(const uint8_t *packet, int startByte, SpektrumDa return bcdToInt8(*(uint8_t *)data); case uint32bcd: return bcdToInt32(*(uint32_t *)data); + case uint16le: + return (int16_t) ((uint16_t) (data[0] + (data[1] << 8))); + case uint32le: + return ((uint32_t) (data[0] + (data[1] << 8) + (data[2] << 16) + (data[3] << 24))); default: return -1; } @@ -274,6 +348,12 @@ void processSpektrumPacket(const uint8_t *packet) setTelemetryValue(PROTOCOL_TELEMETRY_SPEKTRUM, (I2C_PSEUDO_TX << 8) + 0, 0, 0, packet[1], UNIT_RAW, 0); // highest bit indicates that TM1100 is in use, ignore it uint8_t i2cAddress = (packet[2] & 0x7f); + + //SmartBat Hack + if (i2cAddress == I2C_SMART_BAT_BASE_ADDRESS) { + i2cAddress = i2cAddress + (packet[4] >> 4); // use type to create virtual I2CAddresses + } + uint8_t instance = packet[3]; if (i2cAddress == I2C_TEXTGEN) { @@ -303,6 +383,41 @@ void processSpektrumPacket(const uint8_t *packet) if (!isSpektrumValidValue(value, sensor->dataType)) continue; + // mV to VOLT PREC2 for Smart Batteries + if ((i2cAddress >= I2C_SMART_BAT_REALTIME && i2cAddress <= I2C_SMART_BAT_LIMITS) && sensor->unit == UNIT_VOLTS) { + if (value == -1) { + continue; // discard unavailable sensors + } + else { + value = value / 10; + } + } + + // RPM, 10RPM (0-655340 RPM) + if (i2cAddress == I2C_ESC && sensor->unit == UNIT_RPMS) { + value = value / 10; + } + + // Current, 10mA (0-655.34A) + if (i2cAddress == I2C_ESC && sensor->startByte == 6) { + value = value / 10; + } + + // BEC Current, 100mA (0-25.4A) + if (i2cAddress == I2C_ESC && sensor->startByte == 10) { + value = value / 10; + } + + // Throttle 0.5% (0-127%) + if (i2cAddress == I2C_ESC && sensor->startByte == 12) { + value = value / 2; + } + + // Power 0.5% (0-127%) + if (i2cAddress == I2C_ESC && sensor->startByte == 13) { + value = value / 2; + } + if (i2cAddress == I2C_CELLS && sensor->unit == UNIT_VOLTS) { // Map to FrSky style cell values int cellIndex = (sensor->startByte / 2) << 16; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 0033d2c49..e46a70230 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -1255,7 +1255,7 @@ #define ZSTR_GATE_TIME "GteT" #define ZSTR_ESC_VOLTAGE "EscV" #define ZSTR_ESC_CURRENT "EscA" -#define ZSTR_ESC_RPM "EscR" +#define ZSTR_ESC_RPM "Erpm" #define ZSTR_ESC_CONSUMPTION "EscC" #define ZSTR_ESC_TEMP "EscT" #define ZSTR_SD1_CHANNEL "Chan" @@ -1279,3 +1279,36 @@ #define ZSTR_RB3040_CHANNEL6 "CH6A" #define ZSTR_RB3040_CHANNEL7 "CH7A" #define ZSTR_RB3040_CHANNEL8 "CH8A" +#define ZSTR_ESC_VIN "EVIN" +#define ZSTR_ESC_TFET "TFET" +#define ZSTR_ESC_CUR "ECUR" +#define ZSTR_ESC_TBEC "TBEC" +#define ZSTR_ESC_BCUR "CBEC" +#define ZSTR_ESC_VBEC "VBEC" +#define ZSTR_ESC_THR "ETHR" +#define ZSTR_ESC_POUT "EOUT" +#define ZSTR_SMART_BAT_BTMP "BTmp" +#define ZSTR_SMART_BAT_BCUR "BCur" +#define ZSTR_SMART_BAT_BCAP "BUse" +#define ZSTR_SMART_BAT_MIN_CEL "CLMi" +#define ZSTR_SMART_BAT_MAX_CEL "CLMa" +#define ZSTR_SMART_BAT_CYCLES "Cycl" +#define ZSTR_SMART_BAT_CAPACITY "BCpT" +#define ZSTR_CL01 "Cel1" +#define ZSTR_CL02 "Cel2" +#define ZSTR_CL03 "Cel3" +#define ZSTR_CL04 "Cel4" +#define ZSTR_CL05 "Cel5" +#define ZSTR_CL06 "Cel6" +#define ZSTR_CL07 "Cel7" +#define ZSTR_CL08 "Cel8" +#define ZSTR_CL09 "Cel9" +#define ZSTR_CL10 "Cl10" +#define ZSTR_CL11 "Cl11" +#define ZSTR_CL12 "Cl12" +#define ZSTR_CL13 "Cl13" +#define ZSTR_CL14 "Cl14" +#define ZSTR_CL15 "Cl15" +#define ZSTR_CL16 "Cl16" +#define ZSTR_CL17 "Cl17" +#define ZSTR_CL18 "Cl18" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 1e9d99231..7998f947d 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -1261,7 +1261,7 @@ #define ZSTR_GATE_TIME "GteT" #define ZSTR_ESC_VOLTAGE "EscV" #define ZSTR_ESC_CURRENT "EscA" -#define ZSTR_ESC_RPM "EscR" +#define ZSTR_ESC_RPM "Erpm" #define ZSTR_ESC_CONSUMPTION "EscC" #define ZSTR_ESC_TEMP "EscT" #define ZSTR_SD1_CHANNEL "Chan" @@ -1285,3 +1285,54 @@ #define ZSTR_RB3040_CHANNEL6 "CH6A" #define ZSTR_RB3040_CHANNEL7 "CH7A" #define ZSTR_RB3040_CHANNEL8 "CH8A" +#define ZSTR_ESC_VIN "EVIN" +#define ZSTR_ESC_TFET "TFET" +#define ZSTR_ESC_CUR "ECUR" +#define ZSTR_ESC_TBEC "TBEC" +#define ZSTR_ESC_BCUR "CBEC" +#define ZSTR_ESC_VBEC "VBEC" +#define ZSTR_ESC_THR "ETHR" +#define ZSTR_ESC_POUT "EOUT" +#define ZSTR_SMART_BAT_BTMP "BTmp" +#define ZSTR_SMART_BAT_BCUR "BCur" +#define ZSTR_SMART_BAT_BCAP "BUse" +#define ZSTR_SMART_BAT_MIN_CEL "CLMi" +#define ZSTR_SMART_BAT_MAX_CEL "CLMa" +#define ZSTR_SMART_BAT_CYCLES "Cycl" +#define ZSTR_SMART_BAT_CAPACITY "BCpT" +#define ZSTR_CL01 "Cel1" +#define ZSTR_CL02 "Cel2" +#define ZSTR_CL03 "Cel3" +#define ZSTR_CL04 "Cel4" +#define ZSTR_CL05 "Cel5" +#define ZSTR_CL06 "Cel6" +#define ZSTR_CL07 "Cel7" +#define ZSTR_CL08 "Cel8" +#define ZSTR_CL09 "Cel9" +#define ZSTR_CL10 "Cl10" +#define ZSTR_CL11 "Cl11" +#define ZSTR_CL12 "Cl12" +#define ZSTR_CL13 "Cl13" +#define ZSTR_CL14 "Cl14" +#define ZSTR_CL15 "Cl15" +#define ZSTR_CL16 "Cl16" +#define ZSTR_CL17 "Cl17" +#define ZSTR_CL18 "Cl18" +#define ZSTR_CL01 "Cel1" +#define ZSTR_CL02 "Cel2" +#define ZSTR_CL03 "Cel3" +#define ZSTR_CL04 "Cel4" +#define ZSTR_CL05 "Cel5" +#define ZSTR_CL06 "Cel6" +#define ZSTR_CL07 "Cel7" +#define ZSTR_CL08 "Cel8" +#define ZSTR_CL09 "Cel9" +#define ZSTR_CL10 "Cl10" +#define ZSTR_CL11 "Cl11" +#define ZSTR_CL12 "Cl12" +#define ZSTR_CL13 "Cl13" +#define ZSTR_CL14 "Cl14" +#define ZSTR_CL15 "Cl15" +#define ZSTR_CL16 "Cl16" +#define ZSTR_CL17 "Cl17" +#define ZSTR_CL18 "Cl18"" \ No newline at end of file diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 230b69b9b..c5211468e 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -1259,7 +1259,7 @@ #define ZSTR_GATE_TIME "GteT" #define ZSTR_ESC_VOLTAGE "EscV" #define ZSTR_ESC_CURRENT "EscA" -#define ZSTR_ESC_RPM "EscR" +#define ZSTR_ESC_RPM "Erpm" #define ZSTR_ESC_CONSUMPTION "EscC" #define ZSTR_ESC_TEMP "EscT" #define ZSTR_SD1_CHANNEL "Chan" @@ -1283,3 +1283,36 @@ #define ZSTR_RB3040_CHANNEL6 "CH6A" #define ZSTR_RB3040_CHANNEL7 "CH7A" #define ZSTR_RB3040_CHANNEL8 "CH8A" +#define ZSTR_ESC_VIN "EVIN" +#define ZSTR_ESC_TFET "TFET" +#define ZSTR_ESC_CUR "ECUR" +#define ZSTR_ESC_TBEC "TBEC" +#define ZSTR_ESC_BCUR "CBEC" +#define ZSTR_ESC_VBEC "VBEC" +#define ZSTR_ESC_THR "ETHR" +#define ZSTR_ESC_POUT "EOUT" +#define ZSTR_SMART_BAT_BTMP "BTmp" +#define ZSTR_SMART_BAT_BCUR "BCur" +#define ZSTR_SMART_BAT_BCAP "BUse" +#define ZSTR_SMART_BAT_MIN_CEL "CLMi" +#define ZSTR_SMART_BAT_MAX_CEL "CLMa" +#define ZSTR_SMART_BAT_CYCLES "Cycl" +#define ZSTR_SMART_BAT_CAPACITY "BCpT" +#define ZSTR_CL01 "Cel1" +#define ZSTR_CL02 "Cel2" +#define ZSTR_CL03 "Cel3" +#define ZSTR_CL04 "Cel4" +#define ZSTR_CL05 "Cel5" +#define ZSTR_CL06 "Cel6" +#define ZSTR_CL07 "Cel7" +#define ZSTR_CL08 "Cel8" +#define ZSTR_CL09 "Cel9" +#define ZSTR_CL10 "Cl10" +#define ZSTR_CL11 "Cl11" +#define ZSTR_CL12 "Cl12" +#define ZSTR_CL13 "Cl13" +#define ZSTR_CL14 "Cl14" +#define ZSTR_CL15 "Cl15" +#define ZSTR_CL16 "Cl16" +#define ZSTR_CL17 "Cl17" +#define ZSTR_CL18 "Cl18" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index fba624466..9a293f9fa 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -1277,7 +1277,7 @@ #define ZSTR_GATE_TIME "GteT" #define ZSTR_ESC_VOLTAGE "EscV" #define ZSTR_ESC_CURRENT "EscA" -#define ZSTR_ESC_RPM "EscR" +#define ZSTR_ESC_RPM "Erpm" #define ZSTR_ESC_CONSUMPTION "EscC" #define ZSTR_ESC_TEMP "EscT" #define ZSTR_SD1_CHANNEL "Chan" @@ -1301,3 +1301,36 @@ #define ZSTR_RB3040_CHANNEL6 "CH6A" #define ZSTR_RB3040_CHANNEL7 "CH7A" #define ZSTR_RB3040_CHANNEL8 "CH8A" +#define ZSTR_ESC_VIN "EVIN" +#define ZSTR_ESC_TFET "TFET" +#define ZSTR_ESC_CUR "ECUR" +#define ZSTR_ESC_TBEC "TBEC" +#define ZSTR_ESC_BCUR "CBEC" +#define ZSTR_ESC_VBEC "VBEC" +#define ZSTR_ESC_THR "ETHR" +#define ZSTR_ESC_POUT "EOUT" +#define ZSTR_SMART_BAT_BTMP "BTmp" +#define ZSTR_SMART_BAT_BCUR "BCur" +#define ZSTR_SMART_BAT_BCAP "BUse" +#define ZSTR_SMART_BAT_MIN_CEL "CLMi" +#define ZSTR_SMART_BAT_MAX_CEL "CLMa" +#define ZSTR_SMART_BAT_CYCLES "Cycl" +#define ZSTR_SMART_BAT_CAPACITY "BCpT" +#define ZSTR_CL01 "Cel1" +#define ZSTR_CL02 "Cel2" +#define ZSTR_CL03 "Cel3" +#define ZSTR_CL04 "Cel4" +#define ZSTR_CL05 "Cel5" +#define ZSTR_CL06 "Cel6" +#define ZSTR_CL07 "Cel7" +#define ZSTR_CL08 "Cel8" +#define ZSTR_CL09 "Cel9" +#define ZSTR_CL10 "Cl10" +#define ZSTR_CL11 "Cl11" +#define ZSTR_CL12 "Cl12" +#define ZSTR_CL13 "Cl13" +#define ZSTR_CL14 "Cl14" +#define ZSTR_CL15 "Cl15" +#define ZSTR_CL16 "Cl16" +#define ZSTR_CL17 "Cl17" +#define ZSTR_CL18 "Cl18" \ No newline at end of file diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index d917e82f5..b3665f787 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -1268,7 +1268,7 @@ #define ZSTR_GATE_TIME "GteT" #define ZSTR_ESC_VOLTAGE "EscV" #define ZSTR_ESC_CURRENT "EscA" -#define ZSTR_ESC_RPM "EscR" +#define ZSTR_ESC_RPM "Erpm" #define ZSTR_ESC_CONSUMPTION "EscC" #define ZSTR_ESC_TEMP "EscT" #define ZSTR_SD1_CHANNEL "Chan" @@ -1291,3 +1291,36 @@ #define ZSTR_RB3040_CHANNEL6 "CH6A" #define ZSTR_RB3040_CHANNEL7 "CH7A" #define ZSTR_RB3040_CHANNEL8 "CH8A" +#define ZSTR_ESC_VIN "EVIN" +#define ZSTR_ESC_TFET "TFET" +#define ZSTR_ESC_CUR "ECUR" +#define ZSTR_ESC_TBEC "TBEC" +#define ZSTR_ESC_BCUR "CBEC" +#define ZSTR_ESC_VBEC "VBEC" +#define ZSTR_ESC_THR "ETHR" +#define ZSTR_ESC_POUT "EOUT" +#define ZSTR_SMART_BAT_BTMP "BTmp" +#define ZSTR_SMART_BAT_BCUR "BCur" +#define ZSTR_SMART_BAT_BCAP "BUse" +#define ZSTR_SMART_BAT_MIN_CEL "CLMi" +#define ZSTR_SMART_BAT_MAX_CEL "CLMa" +#define ZSTR_SMART_BAT_CYCLES "Cycl" +#define ZSTR_SMART_BAT_CAPACITY "BCpT" +#define ZSTR_CL01 "Cel1" +#define ZSTR_CL02 "Cel2" +#define ZSTR_CL03 "Cel3" +#define ZSTR_CL04 "Cel4" +#define ZSTR_CL05 "Cel5" +#define ZSTR_CL06 "Cel6" +#define ZSTR_CL07 "Cel7" +#define ZSTR_CL08 "Cel8" +#define ZSTR_CL09 "Cel9" +#define ZSTR_CL10 "Cl10" +#define ZSTR_CL11 "Cl11" +#define ZSTR_CL12 "Cl12" +#define ZSTR_CL13 "Cl13" +#define ZSTR_CL14 "Cl14" +#define ZSTR_CL15 "Cl15" +#define ZSTR_CL16 "Cl16" +#define ZSTR_CL17 "Cl17" +#define ZSTR_CL18 "Cl18" \ No newline at end of file diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index fad12d2b9..c9bb7a649 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -1283,7 +1283,7 @@ #define ZSTR_GATE_TIME "GteT" #define ZSTR_ESC_VOLTAGE "EscV" #define ZSTR_ESC_CURRENT "EscA" -#define ZSTR_ESC_RPM "EscR" +#define ZSTR_ESC_RPM "Erpm" #define ZSTR_ESC_CONSUMPTION "EscC" #define ZSTR_ESC_TEMP "EscT" #define ZSTR_SD1_CHANNEL "Chan" @@ -1307,3 +1307,36 @@ #define ZSTR_RB3040_CHANNEL6 "CH6A" #define ZSTR_RB3040_CHANNEL7 "CH7A" #define ZSTR_RB3040_CHANNEL8 "CH8A" +#define ZSTR_ESC_VIN "EVIN" +#define ZSTR_ESC_TFET "TFET" +#define ZSTR_ESC_CUR "ECUR" +#define ZSTR_ESC_TBEC "TBEC" +#define ZSTR_ESC_BCUR "CBEC" +#define ZSTR_ESC_VBEC "VBEC" +#define ZSTR_ESC_THR "ETHR" +#define ZSTR_ESC_POUT "EOUT" +#define ZSTR_SMART_BAT_BTMP "BTmp" +#define ZSTR_SMART_BAT_BCUR "BCur" +#define ZSTR_SMART_BAT_BCAP "BUse" +#define ZSTR_SMART_BAT_MIN_CEL "CLMi" +#define ZSTR_SMART_BAT_MAX_CEL "CLMa" +#define ZSTR_SMART_BAT_CYCLES "Cycl" +#define ZSTR_SMART_BAT_CAPACITY "BCpT" +#define ZSTR_CL01 "Cel1" +#define ZSTR_CL02 "Cel2" +#define ZSTR_CL03 "Cel3" +#define ZSTR_CL04 "Cel4" +#define ZSTR_CL05 "Cel5" +#define ZSTR_CL06 "Cel6" +#define ZSTR_CL07 "Cel7" +#define ZSTR_CL08 "Cel8" +#define ZSTR_CL09 "Cel9" +#define ZSTR_CL10 "Cl10" +#define ZSTR_CL11 "Cl11" +#define ZSTR_CL12 "Cl12" +#define ZSTR_CL13 "Cl13" +#define ZSTR_CL14 "Cl14" +#define ZSTR_CL15 "Cl15" +#define ZSTR_CL16 "Cl16" +#define ZSTR_CL17 "Cl17" +#define ZSTR_CL18 "Cl18" \ No newline at end of file diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index cb2b3c736..11f4c411c 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -1277,7 +1277,7 @@ #define ZSTR_GATE_TIME "GteT" #define ZSTR_ESC_VOLTAGE "EscV" #define ZSTR_ESC_CURRENT "EscA" -#define ZSTR_ESC_RPM "EscR" +#define ZSTR_ESC_RPM "Erpm" #define ZSTR_ESC_CONSUMPTION "EscC" #define ZSTR_ESC_TEMP "EscT" #define ZSTR_SD1_CHANNEL "Chan" @@ -1301,3 +1301,36 @@ #define ZSTR_RB3040_CHANNEL6 "CH6A" #define ZSTR_RB3040_CHANNEL7 "CH7A" #define ZSTR_RB3040_CHANNEL8 "CH8A" +#define ZSTR_ESC_VIN "EVIN" +#define ZSTR_ESC_TFET "TFET" +#define ZSTR_ESC_CUR "ECUR" +#define ZSTR_ESC_TBEC "TBEC" +#define ZSTR_ESC_BCUR "CBEC" +#define ZSTR_ESC_VBEC "VBEC" +#define ZSTR_ESC_THR "ETHR" +#define ZSTR_ESC_POUT "EOUT" +#define ZSTR_SMART_BAT_BTMP "BTmp" +#define ZSTR_SMART_BAT_BCUR "BCur" +#define ZSTR_SMART_BAT_BCAP "BUse" +#define ZSTR_SMART_BAT_MIN_CEL "CLMi" +#define ZSTR_SMART_BAT_MAX_CEL "CLMa" +#define ZSTR_SMART_BAT_CYCLES "Cycl" +#define ZSTR_SMART_BAT_CAPACITY "BCpT" +#define ZSTR_CL01 "Cel1" +#define ZSTR_CL02 "Cel2" +#define ZSTR_CL03 "Cel3" +#define ZSTR_CL04 "Cel4" +#define ZSTR_CL05 "Cel5" +#define ZSTR_CL06 "Cel6" +#define ZSTR_CL07 "Cel7" +#define ZSTR_CL08 "Cel8" +#define ZSTR_CL09 "Cel9" +#define ZSTR_CL10 "Cl10" +#define ZSTR_CL11 "Cl11" +#define ZSTR_CL12 "Cl12" +#define ZSTR_CL13 "Cl13" +#define ZSTR_CL14 "Cl14" +#define ZSTR_CL15 "Cl15" +#define ZSTR_CL16 "Cl16" +#define ZSTR_CL17 "Cl17" +#define ZSTR_CL18 "Cl18" \ No newline at end of file diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index abda9557a..9ff3650ce 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -1269,7 +1269,7 @@ #define ZSTR_GATE_TIME "GteT" #define ZSTR_ESC_VOLTAGE "EscV" #define ZSTR_ESC_CURRENT "EscA" -#define ZSTR_ESC_RPM "EscR" +#define ZSTR_ESC_RPM "Erpm" #define ZSTR_ESC_CONSUMPTION "EscC" #define ZSTR_ESC_TEMP "EscT" #define ZSTR_SD1_CHANNEL "Chan" @@ -1293,3 +1293,36 @@ #define ZSTR_RB3040_CHANNEL6 "CH6A" #define ZSTR_RB3040_CHANNEL7 "CH7A" #define ZSTR_RB3040_CHANNEL8 "CH8A" +#define ZSTR_ESC_VIN "EVIN" +#define ZSTR_ESC_TFET "TFET" +#define ZSTR_ESC_CUR "ECUR" +#define ZSTR_ESC_TBEC "TBEC" +#define ZSTR_ESC_BCUR "CBEC" +#define ZSTR_ESC_VBEC "VBEC" +#define ZSTR_ESC_THR "ETHR" +#define ZSTR_ESC_POUT "EOUT" +#define ZSTR_SMART_BAT_BTMP "BTmp" +#define ZSTR_SMART_BAT_BCUR "BCur" +#define ZSTR_SMART_BAT_BCAP "BUse" +#define ZSTR_SMART_BAT_MIN_CEL "CLMi" +#define ZSTR_SMART_BAT_MAX_CEL "CLMa" +#define ZSTR_SMART_BAT_CYCLES "Cycl" +#define ZSTR_SMART_BAT_CAPACITY "BCpT" +#define ZSTR_CL01 "Cel1" +#define ZSTR_CL02 "Cel2" +#define ZSTR_CL03 "Cel3" +#define ZSTR_CL04 "Cel4" +#define ZSTR_CL05 "Cel5" +#define ZSTR_CL06 "Cel6" +#define ZSTR_CL07 "Cel7" +#define ZSTR_CL08 "Cel8" +#define ZSTR_CL09 "Cel9" +#define ZSTR_CL10 "Cl10" +#define ZSTR_CL11 "Cl11" +#define ZSTR_CL12 "Cl12" +#define ZSTR_CL13 "Cl13" +#define ZSTR_CL14 "Cl14" +#define ZSTR_CL15 "Cl15" +#define ZSTR_CL16 "Cl16" +#define ZSTR_CL17 "Cl17" +#define ZSTR_CL18 "Cl18" \ No newline at end of file diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 606a45895..e721da2ed 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -1276,7 +1276,7 @@ #define ZSTR_GATE_TIME "GteT" #define ZSTR_ESC_VOLTAGE "EscV" #define ZSTR_ESC_CURRENT "EscA" -#define ZSTR_ESC_RPM "EscR" +#define ZSTR_ESC_RPM "Erpm" #define ZSTR_ESC_CONSUMPTION "EscC" #define ZSTR_ESC_TEMP "EscT" #define ZSTR_SD1_CHANNEL "Chan" @@ -1300,3 +1300,36 @@ #define ZSTR_RB3040_CHANNEL6 "CH6A" #define ZSTR_RB3040_CHANNEL7 "CH7A" #define ZSTR_RB3040_CHANNEL8 "CH8A" +#define ZSTR_ESC_VIN "EVIN" +#define ZSTR_ESC_TFET "TFET" +#define ZSTR_ESC_CUR "ECUR" +#define ZSTR_ESC_TBEC "TBEC" +#define ZSTR_ESC_BCUR "CBEC" +#define ZSTR_ESC_VBEC "VBEC" +#define ZSTR_ESC_THR "ETHR" +#define ZSTR_ESC_POUT "EOUT" +#define ZSTR_SMART_BAT_BTMP "BTmp" +#define ZSTR_SMART_BAT_BCUR "BCur" +#define ZSTR_SMART_BAT_BCAP "BUse" +#define ZSTR_SMART_BAT_MIN_CEL "CLMi" +#define ZSTR_SMART_BAT_MAX_CEL "CLMa" +#define ZSTR_SMART_BAT_CYCLES "Cycl" +#define ZSTR_SMART_BAT_CAPACITY "BCpT" +#define ZSTR_CL01 "Cel1" +#define ZSTR_CL02 "Cel2" +#define ZSTR_CL03 "Cel3" +#define ZSTR_CL04 "Cel4" +#define ZSTR_CL05 "Cel5" +#define ZSTR_CL06 "Cel6" +#define ZSTR_CL07 "Cel7" +#define ZSTR_CL08 "Cel8" +#define ZSTR_CL09 "Cel9" +#define ZSTR_CL10 "Cl10" +#define ZSTR_CL11 "Cl11" +#define ZSTR_CL12 "Cl12" +#define ZSTR_CL13 "Cl13" +#define ZSTR_CL14 "Cl14" +#define ZSTR_CL15 "Cl15" +#define ZSTR_CL16 "Cl16" +#define ZSTR_CL17 "Cl17" +#define ZSTR_CL18 "Cl18" \ No newline at end of file diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 29533d2c5..87650f390 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -1265,7 +1265,7 @@ #define ZSTR_GATE_TIME "GteT" #define ZSTR_ESC_VOLTAGE "EscV" #define ZSTR_ESC_CURRENT "EscA" -#define ZSTR_ESC_RPM "EscR" +#define ZSTR_ESC_RPM "Erpm" #define ZSTR_ESC_CONSUMPTION "EscC" #define ZSTR_ESC_TEMP "EscT" #define ZSTR_SD1_CHANNEL "Chan" @@ -1289,3 +1289,36 @@ #define ZSTR_RB3040_CHANNEL6 "CH6A" #define ZSTR_RB3040_CHANNEL7 "CH7A" #define ZSTR_RB3040_CHANNEL8 "CH8A" +#define ZSTR_ESC_VIN "EVIN" +#define ZSTR_ESC_TFET "TFET" +#define ZSTR_ESC_CUR "ECUR" +#define ZSTR_ESC_TBEC "TBEC" +#define ZSTR_ESC_BCUR "CBEC" +#define ZSTR_ESC_VBEC "VBEC" +#define ZSTR_ESC_THR "ETHR" +#define ZSTR_ESC_POUT "EOUT" +#define ZSTR_SMART_BAT_BTMP "BTmp" +#define ZSTR_SMART_BAT_BCUR "BCur" +#define ZSTR_SMART_BAT_BCAP "BUse" +#define ZSTR_SMART_BAT_MIN_CEL "CLMi" +#define ZSTR_SMART_BAT_MAX_CEL "CLMa" +#define ZSTR_SMART_BAT_CYCLES "Cycl" +#define ZSTR_SMART_BAT_CAPACITY "BCpT" +#define ZSTR_CL01 "Cel1" +#define ZSTR_CL02 "Cel2" +#define ZSTR_CL03 "Cel3" +#define ZSTR_CL04 "Cel4" +#define ZSTR_CL05 "Cel5" +#define ZSTR_CL06 "Cel6" +#define ZSTR_CL07 "Cel7" +#define ZSTR_CL08 "Cel8" +#define ZSTR_CL09 "Cel9" +#define ZSTR_CL10 "Cl10" +#define ZSTR_CL11 "Cl11" +#define ZSTR_CL12 "Cl12" +#define ZSTR_CL13 "Cl13" +#define ZSTR_CL14 "Cl14" +#define ZSTR_CL15 "Cl15" +#define ZSTR_CL16 "Cl16" +#define ZSTR_CL17 "Cl17" +#define ZSTR_CL18 "Cl18" \ No newline at end of file diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index eaacd2905..6fba79f01 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -1276,7 +1276,7 @@ #define ZSTR_GATE_TIME "GteT" #define ZSTR_ESC_VOLTAGE "EscV" #define ZSTR_ESC_CURRENT "EscA" -#define ZSTR_ESC_RPM "EscR" +#define ZSTR_ESC_RPM "Erpm" #define ZSTR_ESC_CONSUMPTION "EscC" #define ZSTR_ESC_TEMP "EscT" #define ZSTR_SD1_CHANNEL "Chan" @@ -1300,3 +1300,36 @@ #define ZSTR_RB3040_CHANNEL6 "CH6A" #define ZSTR_RB3040_CHANNEL7 "CH7A" #define ZSTR_RB3040_CHANNEL8 "CH8A" +#define ZSTR_ESC_VIN "EVIN" +#define ZSTR_ESC_TFET "TFET" +#define ZSTR_ESC_CUR "ECUR" +#define ZSTR_ESC_TBEC "TBEC" +#define ZSTR_ESC_BCUR "CBEC" +#define ZSTR_ESC_VBEC "VBEC" +#define ZSTR_ESC_THR "ETHR" +#define ZSTR_ESC_POUT "EOUT" +#define ZSTR_SMART_BAT_BTMP "BTmp" +#define ZSTR_SMART_BAT_BCUR "BCur" +#define ZSTR_SMART_BAT_BCAP "BUse" +#define ZSTR_SMART_BAT_MIN_CEL "CLMi" +#define ZSTR_SMART_BAT_MAX_CEL "CLMa" +#define ZSTR_SMART_BAT_CYCLES "Cycl" +#define ZSTR_SMART_BAT_CAPACITY "BCpT" +#define ZSTR_CL01 "Cel1" +#define ZSTR_CL02 "Cel2" +#define ZSTR_CL03 "Cel3" +#define ZSTR_CL04 "Cel4" +#define ZSTR_CL05 "Cel5" +#define ZSTR_CL06 "Cel6" +#define ZSTR_CL07 "Cel7" +#define ZSTR_CL08 "Cel8" +#define ZSTR_CL09 "Cel9" +#define ZSTR_CL10 "Cl10" +#define ZSTR_CL11 "Cl11" +#define ZSTR_CL12 "Cl12" +#define ZSTR_CL13 "Cl13" +#define ZSTR_CL14 "Cl14" +#define ZSTR_CL15 "Cl15" +#define ZSTR_CL16 "Cl16" +#define ZSTR_CL17 "Cl17" +#define ZSTR_CL18 "Cl18" \ No newline at end of file From a5f760e8237fa9f96165d4d941a069f96ecd6cff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niccol=C3=B2=20Maggioni?= Date: Fri, 27 Mar 2020 10:29:20 +0100 Subject: [PATCH 184/560] Prevent center beep at boot (#7432) --- radio/src/mixer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/mixer.cpp b/radio/src/mixer.cpp index e4b701c9c..a8100da22 100644 --- a/radio/src/mixer.cpp +++ b/radio/src/mixer.cpp @@ -460,7 +460,7 @@ void evalInputs(uint8_t mode) if (mode == e_perout_mode_normal) { if (tmp==0 || (tmp==1 && (bpanaCenter & mask))) { anaCenter |= mask; - if ((g_model.beepANACenter & mask) && !(bpanaCenter & mask) && !menuCalibrationState) { + if ((g_model.beepANACenter & mask) && !(bpanaCenter & mask) && s_mixer_first_run_done && !menuCalibrationState) { if (!IS_POT(i) || IS_POT_SLIDER_AVAILABLE(i)) { AUDIO_POT_MIDDLE(i); } From f59e939463d9bf4b567980581e24ff583406e68d Mon Sep 17 00:00:00 2001 From: olliw42 <6089567+olliw42@users.noreply.github.com> Date: Fri, 27 Mar 2020 10:37:54 +0100 Subject: [PATCH 185/560] add lcd.backlightOn() (#7426) add lcd.backlightOn() --- radio/src/lua/api_lcd.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/radio/src/lua/api_lcd.cpp b/radio/src/lua/api_lcd.cpp index 3c2b32638..e413e72a0 100644 --- a/radio/src/lua/api_lcd.cpp +++ b/radio/src/lua/api_lcd.cpp @@ -62,6 +62,20 @@ static int luaLcdClear(lua_State *L) return 0; } +/*luadoc +@function lcd.backlightOn() + +Switches backlight on + +@status current Introduced in 2.3.6 +*/ +static int luaLcdBacklightOn(lua_State *L) +{ + if (!luaLcdAllowed) return 0; + backlightOn(); + return 0; +} + /*luadoc @function lcd.drawPoint(x, y) @@ -861,6 +875,7 @@ static int luaRGB(lua_State *L) const luaL_Reg lcdLib[] = { { "refresh", luaLcdRefresh }, { "clear", luaLcdClear }, + { "backlightOn", luaLcdBacklightOn }, { "drawPoint", luaLcdDrawPoint }, { "drawLine", luaLcdDrawLine }, { "drawRectangle", luaLcdDrawRectangle }, From 2873f7fd4d12b892245c292ba375f01cdc9e3e3a Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 27 Mar 2020 10:41:29 +0100 Subject: [PATCH 186/560] lcd.backlightOn renamed to lcd.resetBacklightTimeout --- radio/src/lua/api_lcd.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/radio/src/lua/api_lcd.cpp b/radio/src/lua/api_lcd.cpp index e413e72a0..d166d14a5 100644 --- a/radio/src/lua/api_lcd.cpp +++ b/radio/src/lua/api_lcd.cpp @@ -63,13 +63,13 @@ static int luaLcdClear(lua_State *L) } /*luadoc -@function lcd.backlightOn() +@function lcd.resetBacklightTimeout() -Switches backlight on +Reset the backlight timeout @status current Introduced in 2.3.6 */ -static int luaLcdBacklightOn(lua_State *L) +static int luaLcdResetBacklightTimeout(lua_State * L) { if (!luaLcdAllowed) return 0; backlightOn(); @@ -875,7 +875,7 @@ static int luaRGB(lua_State *L) const luaL_Reg lcdLib[] = { { "refresh", luaLcdRefresh }, { "clear", luaLcdClear }, - { "backlightOn", luaLcdBacklightOn }, + { "resetBacklightTimeout", luaLcdResetBacklightTimeout }, { "drawPoint", luaLcdDrawPoint }, { "drawLine", luaLcdDrawLine }, { "drawRectangle", luaLcdDrawRectangle }, From fdf77fb476f8ac41eebdb052c38877afbcf71f90 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 27 Mar 2020 10:43:06 +0100 Subject: [PATCH 187/560] C function backlightOn() renamed to resetBacklightTimeout() --- radio/src/gui/480x272/popups.cpp | 2 +- radio/src/gui/common/stdlcd/popups.cpp | 2 +- radio/src/lua/api_lcd.cpp | 2 +- radio/src/opentx.cpp | 10 +++++----- radio/src/opentx.h | 2 +- radio/src/switches.cpp | 2 +- .../targets/common/arm/stm32/rotary_encoder_driver.cpp | 2 +- radio/src/targets/horus/keys_driver.cpp | 2 +- radio/src/targets/simu/simpgmspace.cpp | 2 +- radio/src/targets/sky9x/keys_driver.cpp | 2 +- radio/src/targets/taranis/keys_driver.cpp | 2 +- 11 files changed, 15 insertions(+), 15 deletions(-) diff --git a/radio/src/gui/480x272/popups.cpp b/radio/src/gui/480x272/popups.cpp index 25a28779e..2d8caeca3 100644 --- a/radio/src/gui/480x272/popups.cpp +++ b/radio/src/gui/480x272/popups.cpp @@ -46,7 +46,7 @@ void showAlertBox(const char * title, const char * text, const char * action, ui lcdRefresh(); lcdSetContrast(); waitKeysReleased(); - backlightOn(); + resetBacklightTimeout(); checkBacklight(); } diff --git a/radio/src/gui/common/stdlcd/popups.cpp b/radio/src/gui/common/stdlcd/popups.cpp index 6c86dff68..5725d0ad0 100644 --- a/radio/src/gui/common/stdlcd/popups.cpp +++ b/radio/src/gui/common/stdlcd/popups.cpp @@ -227,7 +227,7 @@ void showAlertBox(const char * title, const char * text, const char * action , u lcdRefresh(); lcdSetContrast(); waitKeysReleased(); - backlightOn(); + resetBacklightTimeout(); checkBacklight(); } diff --git a/radio/src/lua/api_lcd.cpp b/radio/src/lua/api_lcd.cpp index d166d14a5..bb9172e32 100644 --- a/radio/src/lua/api_lcd.cpp +++ b/radio/src/lua/api_lcd.cpp @@ -72,7 +72,7 @@ Reset the backlight timeout static int luaLcdResetBacklightTimeout(lua_State * L) { if (!luaLcdAllowed) return 0; - backlightOn(); + resetBacklightTimeout(); return 0; } diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index e6a20db0b..ea70e0b7b 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -687,7 +687,7 @@ void checkBacklight() if (inputsMoved()) { inactivity.counter = 0; if (g_eeGeneral.backlightMode & e_backlight_mode_sticks) { - backlightOn(); + resetBacklightTimeout(); } } @@ -700,7 +700,7 @@ void checkBacklight() } } -void backlightOn() +void resetBacklightTimeout() { lightOffCounter = ((uint16_t)g_eeGeneral.lightAutoOff*250) << 1; } @@ -727,7 +727,7 @@ void doSplash() #endif if (SPLASH_NEEDED()) { - backlightOn(); + resetBacklightTimeout(); drawSplash(); #if defined(PCBSKY9X) @@ -1977,7 +1977,7 @@ void opentxInit() if (g_eeGeneral.backlightMode != e_backlight_mode_off) { // on Tx start turn the light on - backlightOn(); + resetBacklightTimeout(); } if (!globalData.unexpectedShutdown) { @@ -1995,7 +1995,7 @@ void opentxInit() lcdSetContrast(); #endif - backlightOn(); + resetBacklightTimeout(); startPulses(); diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 47ea4cdcd..cd9ac3a58 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -635,7 +635,7 @@ static inline void GET_ADC_IF_MIXER_NOT_RUNNING() #include "sbus.h" -void backlightOn(); +void resetBacklightTimeout(); void checkBacklight(); #define BITMASK(bit) (1<<(bit)) diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index c226e8f7b..d3497dda7 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -642,7 +642,7 @@ void checkSwitches() } LED_ERROR_BEGIN(); - backlightOn(); + resetBacklightTimeout(); // first - display warning #if defined(PCBTARANIS) || defined(PCBHORUS) 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 436cb0bd7..debe8793d 100644 --- a/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp +++ b/radio/src/targets/common/arm/stm32/rotary_encoder_driver.cpp @@ -104,7 +104,7 @@ void rotaryEncoderCheck() #endif #if !defined(BOOT) if (g_eeGeneral.backlightMode & e_backlight_mode_keys) { - backlightOn(); + resetBacklightTimeout(); } inactivity.counter = 0; #endif diff --git a/radio/src/targets/horus/keys_driver.cpp b/radio/src/targets/horus/keys_driver.cpp index 888c4dabc..0b02a6a03 100644 --- a/radio/src/targets/horus/keys_driver.cpp +++ b/radio/src/targets/horus/keys_driver.cpp @@ -107,7 +107,7 @@ void readKeysAndTrims() if ((keys_input || trims_input) && (g_eeGeneral.backlightMode & e_backlight_mode_keys)) { // on keypress turn the light on - backlightOn(); + resetBacklightTimeout(); } } diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index ee4bcdb23..1aadf6e30 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -501,7 +501,7 @@ void readKeysAndTrims() } if (keysInput || trimsInput) { - backlightOn(); + resetBacklightTimeout(); } } diff --git a/radio/src/targets/sky9x/keys_driver.cpp b/radio/src/targets/sky9x/keys_driver.cpp index 9f7dac244..f37cb52b5 100644 --- a/radio/src/targets/sky9x/keys_driver.cpp +++ b/radio/src/targets/sky9x/keys_driver.cpp @@ -109,7 +109,7 @@ void readKeysAndTrims() if ((keys_input || trims_input) && (g_eeGeneral.backlightMode & e_backlight_mode_keys)) { // on keypress turn the light on - backlightOn(); + resetBacklightTimeout(); } } diff --git a/radio/src/targets/taranis/keys_driver.cpp b/radio/src/targets/taranis/keys_driver.cpp index ab0a6202d..0699a1c50 100644 --- a/radio/src/targets/taranis/keys_driver.cpp +++ b/radio/src/targets/taranis/keys_driver.cpp @@ -130,7 +130,7 @@ void readKeysAndTrims() if ((keys_input || trims_input) && (g_eeGeneral.backlightMode & e_backlight_mode_keys)) { #endif // on keypress turn the light on - backlightOn(); + resetBacklightTimeout(); } } From 7caa79facd2447858f0e5d1ffb3070cf07934d23 Mon Sep 17 00:00:00 2001 From: Kilrah Date: Fri, 27 Mar 2020 11:26:19 +0100 Subject: [PATCH 188/560] Removed unused file --- companion/src/imgpreferences.ui | 500 -------------------------------- 1 file changed, 500 deletions(-) delete mode 100644 companion/src/imgpreferences.ui diff --git a/companion/src/imgpreferences.ui b/companion/src/imgpreferences.ui deleted file mode 100644 index 1ba680d4d..000000000 --- a/companion/src/imgpreferences.ui +++ /dev/null @@ -1,500 +0,0 @@ - - - preferencesDialog - - - - 0 - 0 - 685 - 432 - - - - - 0 - 0 - - - - - 685 - 0 - - - - Preferences - - - - QLayout::SetMinimumSize - - - 2 - - - 4 - - - - - 8 - - - - - - - true - - - true - - - - - - - - 0 - 0 - - - - Simu BackLight - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - Simulator capture folder - - - - - - - - 0 - 0 - - - - Joystick - - - - - - - Remember simulator switches - - - - - - - - - - - - - - - - - 0 - 0 - - - - - - - - Enable - - - - - - - - - Use clipboard only - - - - - - - Calibrate - - - - - - - - - - Blue - - - - - Green - - - - - Red - - - - - Orange - - - - - Yellow - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Open Folder - - - false - - - - - - - - - Qt::Horizontal - - - - - - - - - - 0 - 0 - - - - Personal splash library - - - - - - - - - true - - - true - - - - - - - Open Folder - - - - - - - - - - - - 0 - 0 - - - - - Include companion splashes - - - - - Only user defined splashes - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - 0 - 0 - - - - Splash library behaviour - - - - - - - - - Qt::Horizontal - - - - - - - - - - 0 - 0 - - - - Custom TX splash screen - - - - - - - - - true - - - true - - - - - - - - 0 - 0 - - - - Open Image - - - - - - - - - - - - - ... - - - - - - - ... - - - - - - - false - - - Invert Pixels - - - - - - - - - - 0 - 0 - - - - - 128 - 64 - - - - - 128 - 64 - - - - QFrame::Panel - - - QFrame::Raised - - - - - - true - - - - - - - - - - - Qt::Horizontal - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - backLightColor - joystickCB - joystickChkB - joystickcalButton - simuSW - snapshotPath - snapshotPathButton - snapshotClipboardCKB - libraryPath - libraryPathButton - splashincludeCB - SplashFileName - SplashSelect - SplashLibraryDialogButton - clearImageButton - InvertPixels - buttonBox - - - - - - - buttonBox - accepted() - preferencesDialog - accept() - - - 370 - 49 - - - 157 - 274 - - - - - buttonBox - rejected() - preferencesDialog - reject() - - - 390 - 55 - - - 286 - 274 - - - - - From 7f6d3f9e01d0040c7c1ba5613f7e0ba9d934ebf0 Mon Sep 17 00:00:00 2001 From: Kilrah Date: Fri, 27 Mar 2020 11:27:36 +0100 Subject: [PATCH 189/560] Simulator positions are always reloaded, setting controls whether they are saved or not --- companion/src/apppreferencesdialog.ui | 303 ++++++++++--------- companion/src/simulation/simulatorwidget.cpp | 16 +- 2 files changed, 169 insertions(+), 150 deletions(-) diff --git a/companion/src/apppreferencesdialog.ui b/companion/src/apppreferencesdialog.ui index ca015d2dc..c96774dca 100644 --- a/companion/src/apppreferencesdialog.ui +++ b/companion/src/apppreferencesdialog.ui @@ -45,7 +45,7 @@ - 1 + 2 @@ -61,22 +61,40 @@ + + 0 + + + 0 + + + 0 + + + 0 + 5 4 - - 0 - - + + 0 + + + 0 + + + 0 + + 0 @@ -728,6 +746,19 @@ Mode 4: + + + + + 0 + 0 + + + + Startup Settings + + + @@ -764,8 +795,8 @@ Mode 4: - - + + 0 @@ -773,7 +804,7 @@ Mode 4: - Startup Settings + Automatic Backup Folder @@ -797,29 +828,6 @@ Mode 4: - - - - Show splash screen when Companion starts - - - true - - - - - - - - 0 - 0 - - - - Automatic Backup Folder - - - @@ -833,6 +841,43 @@ Mode 4: + + + + Show splash screen when Companion starts + + + true + + + + + + + + + true + + + false + + + + + + + + 0 + 0 + + + + Select Folder + + + + + @@ -864,32 +909,18 @@ Mode 4: - - - - - - true - - - false - - - - - - - - 0 - 0 - - - - Select Folder - - - - + + + + + 0 + 0 + + + + Debug Output Logging + + @@ -901,7 +932,7 @@ Mode 4: - + @@ -914,16 +945,23 @@ Mode 4: - - + + + + Qt::Horizontal + + + + + - + 0 0 - Debug Output Logging + Enable automatic backup before writing firmware @@ -961,26 +999,6 @@ Mode 4: - - - - - 0 - 0 - - - - Enable automatic backup before writing firmware - - - - - - - Qt::Horizontal - - - @@ -1008,6 +1026,27 @@ Mode 4: + + + + + + true + + + false + + + + + + + Select Folder + + + + + @@ -1032,47 +1071,13 @@ Mode 4: - - - - - - true - - - false - - - - - - - Select Folder - - - - - - + Qt::Horizontal - - - - - 0 - 0 - - - - User Splash Screens - - - @@ -1099,29 +1104,18 @@ Mode 4: - - - - - - <html><head/><body><p>Keep a log of all debugging messages generated by the desktop Companion/Simulator applications. An OpenTX developer may request this to help diagnose an issue.</p></body></html> - - - Application (Companion/Simulator) - - - - - - - <html><head/><body><p>Keep a log of all messages generated by the radio firmware when running in Simulator. This is the same information one would also see in the Simulator <span style=" font-style:italic;">Debug Output</span> window.</p></body></html> - - - Radio Firmware (in Simulator) - - - - + + + + + 0 + 0 + + + + User Splash Screens + + @@ -1155,6 +1149,33 @@ Mode 4: + + + + + + <html><head/><body><p>Keep a log of all debugging messages generated by the desktop Companion/Simulator applications. An OpenTX developer may request this to help diagnose an issue.</p></body></html> + + + Application (Companion/Simulator) + + + + + + + <html><head/><body><p>Keep a log of all messages generated by the radio firmware when running in Simulator. This is the same information one would also see in the Simulator <span style=" font-style:italic;">Debug Output</span> window.</p></body></html> + + + Radio Firmware (in Simulator) + + + + + + + + @@ -1357,7 +1378,7 @@ Mode 4: - Remember simulator switch values + Save switch/pot positions on simulator exit diff --git a/companion/src/simulation/simulatorwidget.cpp b/companion/src/simulation/simulatorwidget.cpp index 7a457c228..d20e34cc7 100644 --- a/companion/src/simulation/simulatorwidget.cpp +++ b/companion/src/simulation/simulatorwidget.cpp @@ -680,14 +680,12 @@ void SimulatorWidget::setupJoysticks() void SimulatorWidget::restoreRadioWidgetsState() { // All RadioWidgets - if (g.simuSW()) { - RadioWidget::RadioWidgetState state; - QList states = g.profile[radioProfileId].simulatorOptions().controlsState; - foreach (QByteArray ba, states) { - QDataStream stream(ba); - stream >> state; - emit widgetStateChange(state); - } + RadioWidget::RadioWidgetState state; + QList states = g.profile[radioProfileId].simulatorOptions().controlsState; + foreach (QByteArray ba, states) { + QDataStream stream(ba); + stream >> state; + emit widgetStateChange(state); } // Set throttle stick down and locked, side depends on mode @@ -701,8 +699,8 @@ void SimulatorWidget::restoreRadioWidgetsState() void SimulatorWidget::saveRadioWidgetsState(QList & state) { if (m_radioWidgets.size()) { - state.clear(); if (g.simuSW()) { + state.clear(); foreach (RadioWidget * rw, m_radioWidgets) state.append(rw->getStateData()); } From 1d3f04482f15cb40092106b59d45b5e77ce5b41d Mon Sep 17 00:00:00 2001 From: Kilrah Date: Fri, 27 Mar 2020 11:59:08 +0100 Subject: [PATCH 190/560] Allow clearing saved simulator control positions --- companion/src/apppreferencesdialog.cpp | 7 ++ companion/src/apppreferencesdialog.h | 1 + companion/src/apppreferencesdialog.ui | 166 ++++++++++++++----------- 3 files changed, 98 insertions(+), 76 deletions(-) diff --git a/companion/src/apppreferencesdialog.cpp b/companion/src/apppreferencesdialog.cpp index 63c260176..e3817a9ba 100644 --- a/companion/src/apppreferencesdialog.cpp +++ b/companion/src/apppreferencesdialog.cpp @@ -352,6 +352,13 @@ void AppPreferencesDialog::on_ge_pathButton_clicked() } } +void AppPreferencesDialog::on_btnClearPos_clicked() +{ + SimulatorOptions opts = g.profile[g.sessionId()].simulatorOptions(); + opts.controlsState.clear(); + g.profile[g.sessionId()].simulatorOptions(opts); +} + #if defined(JOYSTICKS) void AppPreferencesDialog::on_joystickChkB_clicked() { if (ui->joystickChkB->isChecked()) { diff --git a/companion/src/apppreferencesdialog.h b/companion/src/apppreferencesdialog.h index 8c796cf7f..7e3f6f234 100644 --- a/companion/src/apppreferencesdialog.h +++ b/companion/src/apppreferencesdialog.h @@ -66,6 +66,7 @@ class AppPreferencesDialog : public QDialog void on_SplashSelect_clicked(); void on_clearImageButton_clicked(); void on_btn_appLogsDir_clicked(); + void on_btnClearPos_clicked(); #if defined(JOYSTICKS) void on_joystickChkB_clicked(); diff --git a/companion/src/apppreferencesdialog.ui b/companion/src/apppreferencesdialog.ui index c96774dca..dff6bbc00 100644 --- a/companion/src/apppreferencesdialog.ui +++ b/companion/src/apppreferencesdialog.ui @@ -1201,7 +1201,38 @@ Mode 4: 6 - + + + + + 0 + 0 + + + + + 50 + 16777215 + + + + 1 + + + 0.500000000000000 + + + 3.000000000000000 + + + 0.100000000000000 + + + 1.000000000000000 + + + + @@ -1214,14 +1245,20 @@ Mode 4: - - + + + + + 0 + 0 + + - Calibrate + Screenshot capture folder - + @@ -1256,31 +1293,22 @@ Mode 4: - - - - - 0 - 0 - - + + - Screenshot capture folder + Calibrate - - - - Qt::Vertical + + + + Select Folder - - - 20 - 5 - + + false - + @@ -1295,7 +1323,7 @@ Mode 4: - + @@ -1308,17 +1336,20 @@ Mode 4: - - - - Select Folder + + + + Qt::Vertical - - false + + + 20 + 5 + - + - + @@ -1331,7 +1362,20 @@ Mode 4: - + + + + + 0 + 0 + + + + Simulator Volume Gain + + + + @@ -1369,10 +1413,17 @@ Mode 4: - + + + + Simulator controls + + + + - + 0 0 @@ -1382,47 +1433,10 @@ Mode 4: - - - - - 0 - 0 - - + + - Simulator Volume Gain - - - - - - - - 0 - 0 - - - - - 50 - 16777215 - - - - 1 - - - 0.500000000000000 - - - 3.000000000000000 - - - 0.100000000000000 - - - 1.000000000000000 + Clear saved positions From cb31b10b36085b8053b05cad37b20588f6176adb Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 27 Mar 2020 12:32:35 +0100 Subject: [PATCH 191/560] Fixes #7370 --- .../src/firmwares/opentx/opentxeeprom.cpp | 8 ++++--- companion/src/simulation/joystick.cpp | 23 ++++++++++++------- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index 3609713a5..cfeb5278a 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -693,11 +693,13 @@ class FlightModeField: public TransformedField { internalField.Append(new UnsignedField<8>(this, phase.fadeIn)); internalField.Append(new UnsignedField<8>(this, phase.fadeOut)); - for (int i=0; i(this, phase.rotaryEncoders[i])); + if (version < 219) { + for (int i = 0; i < rotencCount; i++) { + internalField.Append(new SignedField<16>(this, phase.rotaryEncoders[i])); + } } - for (int i=0; i(this, phase.gvars[i])); } } diff --git a/companion/src/simulation/joystick.cpp b/companion/src/simulation/joystick.cpp index 87f7476f0..070825a21 100644 --- a/companion/src/simulation/joystick.cpp +++ b/companion/src/simulation/joystick.cpp @@ -99,8 +99,9 @@ void Joystick::processEvents() axes[i] = moved; } } - else + else { axisRepeatTimers[i].restart(); + } } else { emit axisValueChanged(i, 0); @@ -108,17 +109,20 @@ void Joystick::processEvents() } for (i = 0; i < numButtons; i++) { Uint8 changed = SDL_JoystickGetButton(joystick, i); - if ( (changed != buttons[i]) ) { + if ((changed != buttons[i])) { emit buttonValueChanged(i, (bool) changed); buttons[i] = changed; buttonRepeatTimers[i].restart(); - } else if (autoRepeat && changed != 0) { + } + else if (autoRepeat && changed != 0) { if ( buttonRepeatTimers[i].elapsed() >= autoRepeatDelay ) { emit buttonValueChanged(i, (bool) changed); buttons[i] = changed; } - } else + } + else { buttonRepeatTimers[i].restart(); + } } for (i = 0; i < numHats; i++) { Uint8 changed = SDL_JoystickGetHat(joystick, i); @@ -126,19 +130,22 @@ void Joystick::processEvents() emit hatValueChanged(i, changed); hats[i] = changed; hatRepeatTimers[i].restart(); - } else if (autoRepeat && changed != 0) { - if ( hatRepeatTimers[i].elapsed() >= autoRepeatDelay ) { + } + else if (autoRepeat && changed != 0) { + if (hatRepeatTimers[i].elapsed() >= autoRepeatDelay) { emit hatValueChanged(i, changed); hats[i] = changed; } - } else + } + else { hatRepeatTimers[i].restart(); + } } for (i = 0; i < numTrackballs; i++) { int dx, dy; SDL_JoystickGetBall(joystick, i, &dx, &dy); - if ( dx != 0 || dy != 0 ) + if (dx != 0 || dy != 0) emit trackballValueChanged(i, dx, dy); } } From 8ce51e42397add4725b1b29f02c0f4930aa78fc4 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 27 Mar 2020 12:38:10 +0100 Subject: [PATCH 192/560] RAS fix (#7463) --- companion/src/firmwares/opentx/opentxinterface.cpp | 1 + radio/src/telemetry/frsky.h | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 85d235679..eb3750447 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -1252,6 +1252,7 @@ void registerOpenTxFirmwares() /* FrSky Taranis X9D board */ firmware = new OpenTxFirmware("opentx-x9d", Firmware::tr("FrSky Taranis X9D"), BOARD_TARANIS_X9D); + firmware->addOption("noras", Firmware::tr("Disable RAS (SWR)")); firmware->addOption("haptic", Firmware::tr("Haptic module installed")); addOpenTxTaranisOptions(firmware); addPPMInternalModuleHack(firmware); diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index 8218447e4..763da1b32 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -293,10 +293,10 @@ inline bool isRasValueValid() { return true; } -#elif defined(PCBX9DP) || defined(PCBX9E) +#elif defined(PCBTARANIS) inline bool isRasValueValid() { - return telemetryData.xjtVersion != 0x0000 && telemetryData.xjtVersion != 0x00FF; + return telemetryData.xjtVersion != 0x00FF; } #elif defined(PCBHORUS) inline bool isRasValueValid() From d367469f34e23028971669db06031310659bea1d Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 27 Mar 2020 21:46:23 +0100 Subject: [PATCH 193/560] Fix copy/paste issue --- radio/src/translations/de.h.txt | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 7998f947d..9da0cadc6 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -1318,21 +1318,3 @@ #define ZSTR_CL16 "Cl16" #define ZSTR_CL17 "Cl17" #define ZSTR_CL18 "Cl18" -#define ZSTR_CL01 "Cel1" -#define ZSTR_CL02 "Cel2" -#define ZSTR_CL03 "Cel3" -#define ZSTR_CL04 "Cel4" -#define ZSTR_CL05 "Cel5" -#define ZSTR_CL06 "Cel6" -#define ZSTR_CL07 "Cel7" -#define ZSTR_CL08 "Cel8" -#define ZSTR_CL09 "Cel9" -#define ZSTR_CL10 "Cl10" -#define ZSTR_CL11 "Cl11" -#define ZSTR_CL12 "Cl12" -#define ZSTR_CL13 "Cl13" -#define ZSTR_CL14 "Cl14" -#define ZSTR_CL15 "Cl15" -#define ZSTR_CL16 "Cl16" -#define ZSTR_CL17 "Cl17" -#define ZSTR_CL18 "Cl18"" \ No newline at end of file From 771c6ea3bdd197d4943f6470cb9d57af30ba995b Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 28 Mar 2020 09:34:42 +0100 Subject: [PATCH 194/560] Rollback OTA on Horus as it freezes the radio when entering the SD Manager --- radio/src/gui/480x272/radio_sdmanager.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/radio/src/gui/480x272/radio_sdmanager.cpp b/radio/src/gui/480x272/radio_sdmanager.cpp index b744eac17..2796325ac 100644 --- a/radio/src/gui/480x272/radio_sdmanager.cpp +++ b/radio/src/gui/480x272/radio_sdmanager.cpp @@ -281,19 +281,20 @@ void onUpdateReceiverSelection(const char * result) bool menuRadioSdManager(event_t _event) { - if (moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode == MODULE_MODE_BIND && EVT_KEY_MASK(_event) == KEY_EXIT) { - moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL; - CLEAR_POPUP(); - killEvents(KEY_EXIT); - _event = 0; - } +// TODO FREEZE SD MANAGER +// if (moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode == MODULE_MODE_BIND && EVT_KEY_MASK(_event) == KEY_EXIT) { +// moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL; +// CLEAR_POPUP(); +// killEvents(KEY_EXIT); +// _event = 0; +// } event_t event = (EVT_KEY_MASK(_event) == KEY_ENTER ? 0 : _event); SIMPLE_MENU(SD_IS_HC() ? STR_SDHC_CARD : STR_SD_CARD, RADIO_ICONS, menuTabGeneral, MENU_RADIO_SD_MANAGER, reusableBuffer.sdManager.count); int index = menuVerticalPosition - menuVerticalOffset; - switch(_event) { + switch (_event) { case EVT_ENTRY: f_chdir(ROOT_PATH); // no break; @@ -374,7 +375,7 @@ bool menuRadioSdManager(event_t _event) POPUP_MENU_ADD_ITEM(STR_FLASH_EXTERNAL_MODULE); if (HAS_SPORT_UPDATE_CONNECTOR() && (information.productFamily == FIRMWARE_FAMILY_RECEIVER || information.productFamily == FIRMWARE_FAMILY_SENSOR)) POPUP_MENU_ADD_ITEM(STR_FLASH_EXTERNAL_DEVICE); -#if defined(PXX2) +#if 0 // TODO FREEZE SD MANAGER defined(PXX2) if (information.productFamily == FIRMWARE_FAMILY_RECEIVER) { if (isReceiverOTAEnabledFromModule(INTERNAL_MODULE, information.productId)) POPUP_MENU_ADD_ITEM(STR_FLASH_RECEIVER_OTA_BY_INTERNAL); @@ -555,7 +556,7 @@ bool menuRadioSdManager(event_t _event) } } -#if defined(PXX2) +#if 0 // FREEZE SD MANAGER defined(PXX2) if (moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode == MODULE_MODE_BIND) { if (reusableBuffer.sdManager.otaUpdateInformation.step == BIND_INIT) { if (reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount > 0) { From 8b080683eba8a0ecb14ac760b2d255fde6432bf0 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 28 Mar 2020 09:36:29 +0100 Subject: [PATCH 195/560] 2.3.7 preparation --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7cccabf1f..2c9bb4321 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ project(OpenTX) set(VERSION_MAJOR "2") set(VERSION_MINOR "3") -set(VERSION_REVISION "6") +set(VERSION_REVISION "7") set(VERSION_SUFFIX $ENV{OPENTX_VERSION_SUFFIX}) set(VERSION_FAMILY ${VERSION_MAJOR}.${VERSION_MINOR}) set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}${VERSION_SUFFIX}) From bb3dd95acc644ff4aa044ff9ad94d4ac52d9e9ba Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 28 Mar 2020 11:01:33 +0100 Subject: [PATCH 196/560] Bump to 2.3.8 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2c9bb4321..b2762bf4b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ project(OpenTX) set(VERSION_MAJOR "2") set(VERSION_MINOR "3") -set(VERSION_REVISION "7") +set(VERSION_REVISION "8") set(VERSION_SUFFIX $ENV{OPENTX_VERSION_SUFFIX}) set(VERSION_FAMILY ${VERSION_MAJOR}.${VERSION_MINOR}) set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}${VERSION_SUFFIX}) From c11b565f0324b18bf3081ffdbf9feab50fdafb44 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 29 Mar 2020 21:02:29 +0200 Subject: [PATCH 197/560] Support for Multi FrSky 2.1.x (#7472) * FRSKY X2.1 support * String fixes * Cosmetics * Improve 128 multi GUI * Improve 128 internal multi GUI * Improve 1212 multi GUI * Fix * Adjust multi upgrade version warning * Cosmetics * Cosmetics * Cosmetics Co-authored-by: Kilrah --- companion/src/firmwares/moduledata.h | 9 +++- companion/src/firmwares/multiprotocols.cpp | 5 +- radio/src/gui/128x64/model_setup.cpp | 56 ++++++++++++---------- radio/src/gui/212x64/model_setup.cpp | 50 +++++++++++++------ radio/src/gui/gui_common.cpp | 2 + radio/src/gui/gui_common.h | 2 + radio/src/pulses/modules_constants.h | 9 +++- radio/src/telemetry/multi.cpp | 2 +- radio/src/telemetry/telemetry.h | 3 +- radio/src/translations/untranslated.h | 2 +- 10 files changed, 95 insertions(+), 45 deletions(-) diff --git a/companion/src/firmwares/moduledata.h b/companion/src/firmwares/moduledata.h index caeaad833..83744908a 100644 --- a/companion/src/firmwares/moduledata.h +++ b/companion/src/firmwares/moduledata.h @@ -119,7 +119,14 @@ enum MultiModuleRFProtocols { MODULE_SUBTYPE_MULTI_AFHDS2A_RX, MODULE_SUBTYPE_MULTI_HOTT, MODULE_SUBTYPE_MULTI_FX816, - MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_FX816 + MODULE_SUBTYPE_MULTI_BAYANG_RX, + MODULE_SUBTYPE_MULTI_PELIKAN, + MODULE_SUBTYPE_MULTI_TIGER, + MODULE_SUBTYPE_MULTI_XK, + MODULE_SUBTYPE_MULTI_XN297DUMP, + MODULE_SUBTYPE_MULTI_FRSKYX2, + MODULE_SUBTYPE_MULTI_FRSKY_R9, + MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_FRSKY_R9 }; enum TrainerProtocol { diff --git a/companion/src/firmwares/multiprotocols.cpp b/companion/src/firmwares/multiprotocols.cpp index 18b7035a9..0dcc299e9 100644 --- a/companion/src/firmwares/multiprotocols.cpp +++ b/companion/src/firmwares/multiprotocols.cpp @@ -40,6 +40,7 @@ static const QStringList STR_SUBTYPE_CUSTOM ({ static const QStringList STR_SUBTYPE_FLYSKY {"Standard", "V9x9", "V6x6", "V912", "CX20"}; static const QStringList STR_SUBTYPE_HUBSAN {"H107", "H301", "H501"}; static const QStringList STR_SUBTYPE_FRSKY {"D16", "D8", "D16 8ch", "V8", "D16 EU-LBT", "D16 EU-LBT 8ch"}; +static const QStringList STR_SUBTYPE_FRSKYX2 {"D16", "D16 8ch", "D16 EU-LBT", "D16 EU-LBT 8ch"}; static const QStringList STR_SUBTYPE_HISKY {"Standard", "HK310"}; static const QStringList STR_SUBTYPE_V2X2 {"Standard", "JXD506"}; static const QStringList STR_SUBTYPE_DSM {"DSM2 22ms", "DSM2 11ms", "DSMX 22ms", "DSMX 11ms"}; @@ -125,6 +126,7 @@ const Multiprotocols multiProtocols { {MODULE_SUBTYPE_MULTI_ESKY150, 1, false, STR_SUBTYPE_ESKY150, nullptr}, {MODULE_SUBTYPE_MULTI_FX816, 0, false, STR_SUBTYPE_FX816, nullptr}, {MODULE_SUBTYPE_MULTI_HOTT, 0, true, NO_SUBTYPE, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_FRSKYX2, 3, true, STR_SUBTYPE_FRSKYX2, STR_MULTI_RFTUNE}, {MM_RF_CUSTOM_SELECTED, 7, true, STR_SUBTYPE_CUSTOM, STR_MULTI_OPTION}, // Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff) @@ -167,7 +169,8 @@ QString Multiprotocols::protocolToString(int protocol, bool custom) "Bayang", "ESky", "MT99XX", "MJXQ", "Shenqi", "FY326", "SFHSS", "J6 PRO","FQ777","Assan","Hontai","Open LRS", "FlySky AFHDS2A", "Q2x2", "Walkera", "Q303", "GW008", "DM002", "Cabell", "ESky 150", "H8 3D", "Corona", "CFlie", "Hitec", "Wfly", "Bugs", "Bugs Mini", "Traxxas", "NCC-1701-A", "E01X", "WL Heli V911S", "GD00X", "Volantex V761", - "KFPlan KF606", "Redpine", "Potensic", "ZXS", "FlyZone", "Scanner", "FrSky RX", "FlySky AFHDS2A RX", "HoTT", "Fx816" + "KFPlan KF606", "Redpine", "Potensic", "ZXS", "FlyZone", "Scanner", "FrSky RX", "FlySky AFHDS2A RX", "HoTT", "Fx816", + "Bayang RX", "Pelikan", "Tiger", "WK", "XN297 Dump", "FrSky X 2.1", "FrSky R9" }); if (protocol == MM_RF_CUSTOM_SELECTED || custom) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 3a67ba80e..2f40a0d0e 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -85,6 +85,7 @@ enum MenuModelSetupItems { ITEM_MODEL_SETUP_INTERNAL_MODULE_LABEL, ITEM_MODEL_SETUP_INTERNAL_MODULE_TYPE, #if defined(MULTIMODULE) + ITEM_MODEL_SETUP_INTERNAL_MODULE_PROTOCOL, ITEM_MODEL_SETUP_INTERNAL_MODULE_SUBTYPE, ITEM_MODEL_SETUP_INTERNAL_MODULE_STATUS, ITEM_MODEL_SETUP_INTERNAL_MODULE_SYNCSTATUS, @@ -113,6 +114,7 @@ enum MenuModelSetupItems { ITEM_MODEL_SETUP_EXTERNAL_MODULE_LABEL, ITEM_MODEL_SETUP_EXTERNAL_MODULE_TYPE, #if defined(MULTIMODULE) + ITEM_MODEL_SETUP_EXTERNAL_MODULE_PROTOCOL, ITEM_MODEL_SETUP_EXTERNAL_MODULE_SUBTYPE, #endif #if defined(MULTIMODULE) @@ -208,7 +210,7 @@ inline uint8_t MODULE_TYPE_ROWS(int moduleIdx) return 1; #if defined(MULTIMODULE) else if (isModuleMultimodule(moduleIdx)) { - return 1; + return 0; } #endif else @@ -306,19 +308,20 @@ void onBluetoothConnectMenu(const char * result) #if defined(HARDWARE_INTERNAL_MODULE) #define INTERNAL_MODULE_ROWS \ LABEL(InternalModule), \ - MODULE_TYPE_ROWS(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_TYPE*/ \ - MULTIMODULE_SUBTYPE_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_SUBTYPE*/ \ + MODULE_TYPE_ROWS(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_TYPE */ \ + MULTIMODULE_TYPE_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PROTOCOL */ \ + MULTIMODULE_SUBTYPE_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_SUBTYPE */ \ MULTIMODULE_STATUS_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_STATUS, ITEM_MODEL_SETUP_INTERNAL_MODULE_SYNCSTATUS */ \ - MODULE_CHANNELS_ROWS(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS*/ \ + MODULE_CHANNELS_ROWS(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS */ \ IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(IF_INTERNAL_MODULE_ON(isModuleRxNumAvailable(INTERNAL_MODULE) ? (uint8_t)2 : (uint8_t)1))), /* *ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE */\ - IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_MODEL_NUM*/ \ + IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_MODEL_NUM */ \ MODULE_OPTION_ROW(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_OPTIONS */ \ MULTIMODULE_MODULE_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_AUTOBIND */ \ EXTERNAL_ANTENNA_ROW /* ITEM_MODEL_SETUP_INTERNAL_MODULE_ANTENNA */ \ MODULE_POWER_ROW(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_POWER */ \ IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_FAILSAFE */ \ IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 1), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_REGISTER_RANGE */ \ - IF_PXX2_MODULE(INTERNAL_MODULE, 0), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_OPTIONS*/ \ + IF_PXX2_MODULE(INTERNAL_MODULE, 0), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_OPTIONS */ \ IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_1 */ \ IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_2 */ \ IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_3 */ @@ -362,7 +365,8 @@ void menuModelSetup(event_t event) LABEL(ExternalModule), MODULE_TYPE_ROWS(EXTERNAL_MODULE), - MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) + MULTIMODULE_TYPE_ROWS(EXTERNAL_MODULE) // PROTOCOL + MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) // SUBTYPE MULTIMODULE_STATUS_ROWS(EXTERNAL_MODULE) MODULE_CHANNELS_ROWS(EXTERNAL_MODULE), IF_NOT_ACCESS_MODULE_RF(EXTERNAL_MODULE, MODULE_BIND_ROWS(EXTERNAL_MODULE)), // line reused for PPM: PPM settings @@ -904,12 +908,6 @@ void menuModelSetup(event_t event) lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_DSM_PROTOCOLS, g_model.moduleData[moduleIdx].rfProtocol, menuHorizontalPosition==1 ? attr : 0); else if (isModuleR9MNonAccess(moduleIdx)) lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_R9M_REGION, g_model.moduleData[moduleIdx].subType, (menuHorizontalPosition==1 ? attr : 0)); -#if defined(MULTIMODULE) - else if (isModuleMultimodule(moduleIdx)) { - int multi_rfProto = g_model.moduleData[moduleIdx].getMultiProtocol(); - lcdDrawMultiProtocolString(lcdNextPos + 3, y, moduleIdx, multi_rfProto, menuHorizontalPosition == 1 ? attr : 0); - } -#endif if (attr && menuHorizontalPosition == 0 && moduleIdx == EXTERNAL_MODULE) { if (s_editMode > 0) { g_model.moduleData[moduleIdx].type = MODULE_TYPE_NONE; @@ -958,18 +956,6 @@ void menuModelSetup(event_t event) g_model.moduleData[moduleIdx].channelsCount = defaultModuleChannels_M8(moduleIdx); } } - -#if defined(MULTIMODULE) - else if (isModuleMultimodule(moduleIdx)) { - int multiRfProto = g_model.moduleData[moduleIdx].getMultiProtocol(); - CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable); - if (checkIncDec_Ret) { - g_model.moduleData[moduleIdx].setMultiProtocol(multiRfProto); - g_model.moduleData[moduleIdx].subType = 0; - resetMultiProtocolsOptions(moduleIdx); - } - } -#endif else { CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].subType, 0, MODULE_SUBTYPE_PXX1_LAST); } @@ -1004,6 +990,26 @@ void menuModelSetup(event_t event) break; #if defined(MULTIMODULE) +#if defined(HARDWARE_INTERNAL_MODULE) + case ITEM_MODEL_SETUP_INTERNAL_MODULE_PROTOCOL: +#endif + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_PROTOCOL: + { + lcdDrawTextAlignedLeft(y, TR_TYPE); + int multi_rfProto = g_model.moduleData[moduleIdx].getMultiProtocol(); + lcdDrawMultiProtocolString(MODEL_SETUP_2ND_COLUMN, y, moduleIdx, multi_rfProto, attr); + if (attr) { + int multiRfProto = g_model.moduleData[moduleIdx].getMultiProtocol(); + CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable); + if (checkIncDec_Ret) { + g_model.moduleData[moduleIdx].setMultiProtocol(multiRfProto); + g_model.moduleData[moduleIdx].subType = 0; + resetMultiProtocolsOptions(moduleIdx); + } + } + } + break; + #if defined(HARDWARE_INTERNAL_MODULE) case ITEM_MODEL_SETUP_INTERNAL_MODULE_SUBTYPE: #endif diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 9b7cb8b4b..b03b13d17 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -98,6 +98,7 @@ enum MenuModelSetupItems { ITEM_MODEL_SETUP_EXTERNAL_MODULE_LABEL, ITEM_MODEL_SETUP_EXTERNAL_MODULE_TYPE, #if defined (MULTIMODULE) + ITEM_MODEL_SETUP_EXTERNAL_MODULE_PROTOCOL, ITEM_MODEL_SETUP_EXTERNAL_MODULE_STATUS, ITEM_MODEL_SETUP_EXTERNAL_MODULE_SYNCSTATUS, #endif @@ -248,11 +249,6 @@ inline uint8_t EXTERNAL_MODULE_TYPE_ROW() { if (isModuleXJT(EXTERNAL_MODULE) || isModuleR9MNonAccess(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE)) return 1; -#if defined(MULTIMODULE) - else if (isModuleMultimodule(EXTERNAL_MODULE)) { - return 1 + MULTIMODULE_RFPROTO_COLUMNS(EXTERNAL_MODULE); - } -#endif else return 0; } @@ -362,6 +358,7 @@ void menuModelSetup(event_t event) LABEL(ExternalModule), EXTERNAL_MODULE_TYPE_ROW(), + MULTIMODULE_TYPE_ROW(EXTERNAL_MODULE) MULTIMODULE_STATUS_ROWS(EXTERNAL_MODULE) MODULE_CHANNELS_ROWS(EXTERNAL_MODULE), IF_NOT_ACCESS_MODULE_RF(EXTERNAL_MODULE, MODULE_BIND_ROWS(EXTERNAL_MODULE)), @@ -813,15 +810,6 @@ void menuModelSetup(event_t event) lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); else if (isModuleR9MNonAccess(EXTERNAL_MODULE)) lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0)); -#if defined(MULTIMODULE) - else if (isModuleMultimodule(EXTERNAL_MODULE)) { - uint8_t multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(); - // Do not use MODEL_SETUP_3RD_COLUMN here since some the protocol string are so long that we cannot afford the 2 spaces (+6) here - lcdDrawMultiProtocolString(lcdNextPos + 3, y, EXTERNAL_MODULE, multi_rfProto, menuHorizontalPosition == 1 ? attr : 0); - if (MULTIMODULE_HAS_SUBTYPE(EXTERNAL_MODULE)) - lcdDrawMultiSubProtocolString(lcdNextPos + 3, y, EXTERNAL_MODULE, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0); - } -#endif if (attr && menuHorizontalPosition == 0) { if (s_editMode > 0) { g_model.moduleData[EXTERNAL_MODULE].type = MODULE_TYPE_NONE; @@ -906,6 +894,40 @@ void menuModelSetup(event_t event) } break; +#if defined(MULTIMODULE) + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_PROTOCOL: + { + lcdDrawTextAlignedLeft(y, TR_TYPE); + uint8_t multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(); + lcdDrawMultiProtocolString(MODEL_SETUP_2ND_COLUMN, y, EXTERNAL_MODULE, multi_rfProto, menuHorizontalPosition == 0 ? attr : 0); + if (MULTIMODULE_HAS_SUBTYPE(EXTERNAL_MODULE)) + lcdDrawMultiSubProtocolString(MODEL_SETUP_3RD_COLUMN + 15, y, EXTERNAL_MODULE, g_model.moduleData[EXTERNAL_MODULE].subType, + menuHorizontalPosition == 1 ? attr : 0); + if (attr) { + switch (menuHorizontalPosition) { + case 0: { + int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(); + CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable); + if (checkIncDec_Ret) { + g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(multiRfProto); + g_model.moduleData[EXTERNAL_MODULE].subType = 0; + resetMultiProtocolsOptions(EXTERNAL_MODULE); + } + } + break; + + case 1: + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, getMaxMultiSubtype(EXTERNAL_MODULE)); + if (checkIncDec_Ret) { + resetMultiProtocolsOptions(EXTERNAL_MODULE); + } + break; + } + } + } + break; +#endif + case ITEM_MODEL_SETUP_TRAINER_LABEL: lcdDrawTextAlignedLeft(y, STR_TRAINER); break; diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index a849dfd7a..045357b64 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -832,6 +832,7 @@ uint8_t convertMultiProtocol(uint8_t moduleIdx, uint8_t type) const char STR_SUBTYPE_FLYSKY[] = "\004""Std\0""V9x9""V6x6""V912""CX20"; const char STR_SUBTYPE_HUBSAN[] = "\004""H107""H301""H501"; const char STR_SUBTYPE_FRSKY[] = "\007""D16\0 ""D8\0 ""D16 8ch""V8\0 ""LBT(EU)""LBT 8ch"; +const char STR_SUBTYPE_FRSKYX2[] = "\007""D16\0 ""D16 8ch""LBT(EU)""LBT 8ch"; const char STR_SUBTYPE_HISKY[] = "\005""Std\0 ""HK310"; const char STR_SUBTYPE_V2X2[] = "\006""Std\0 ""JXD506"; const char STR_SUBTYPE_DSM[] = "\006""2 22ms""2 11ms""X 22ms""X 11ms"; @@ -923,6 +924,7 @@ const mm_protocol_definition multi_protocols[] = { {MODULE_SUBTYPE_MULTI_ESKY150, 1, false, false, STR_SUBTYPE_ESKY150, nullptr}, {MODULE_SUBTYPE_MULTI_FX816, 0, false, false, STR_SUBTYPE_FX816, nullptr}, {MODULE_SUBTYPE_MULTI_HOTT, 0, true, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_FRSKYX2, 3, true, false, STR_SUBTYPE_FRSKYX2, STR_MULTI_RFTUNE}, {MM_RF_CUSTOM_SELECTED, 7, true, true, NO_SUBTYPE, STR_MULTI_OPTION}, // Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff) diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index ccbf535eb..55233ea17 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -251,8 +251,10 @@ inline uint8_t MULTIMODULE_HASOPTIONS(uint8_t moduleIdx) } #define MULTIMODULE_MODULE_ROWS(moduleIdx) MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW, MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW, MULTI_DISABLE_CHAN_MAP_ROW(moduleIdx), // AUTOBIND, DISABLE TELEM, DISABLE CN.MAP +#define MULTIMODULE_TYPE_ROW(moduleIdx) isModuleMultimodule(moduleIdx) ? MULTIMODULE_RFPROTO_COLUMNS(moduleIdx) : HIDDEN_ROW, #define MULTIMODULE_STATUS_ROWS(moduleIdx) isModuleMultimodule(moduleIdx) ? TITLE_ROW : HIDDEN_ROW, (isModuleMultimodule(moduleIdx) && getMultiSyncStatus(moduleIdx).isValid()) ? TITLE_ROW : HIDDEN_ROW, #define MULTIMODULE_MODE_ROWS(moduleIdx) (g_model.moduleData[moduleIdx].multi.customProto) ? (uint8_t) 3 : MULTIMODULE_HAS_SUBTYPE(moduleIdx) ? (uint8_t)2 : (uint8_t)1 +#define MULTIMODULE_TYPE_ROWS(moduleIdx) isModuleMultimodule(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW, #define MULTIMODULE_SUBTYPE_ROWS(moduleIdx) isModuleMultimodule(moduleIdx) ? MULTIMODULE_RFPROTO_COLUMNS(moduleIdx) : HIDDEN_ROW, #define MULTIMODULE_OPTIONS_ROW(moduleIdx) (isModuleMultimodule(moduleIdx) && MULTIMODULE_HASOPTIONS(moduleIdx)) ? (uint8_t) 0: HIDDEN_ROW #define MODULE_POWER_ROW(moduleIdx) (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) || isModuleR9MNonAccess(moduleIdx)) ? (isModuleR9MLiteNonPro(moduleIdx) ? (isModuleR9M_FCC_VARIANT(moduleIdx) ? READONLY_ROW : (uint8_t)0) : (uint8_t)0) : HIDDEN_ROW diff --git a/radio/src/pulses/modules_constants.h b/radio/src/pulses/modules_constants.h index ec0f8f819..efbcd1b3d 100644 --- a/radio/src/pulses/modules_constants.h +++ b/radio/src/pulses/modules_constants.h @@ -157,7 +157,14 @@ enum ModuleSubtypeMulti { MODULE_SUBTYPE_MULTI_AFHDS2A_RX, MODULE_SUBTYPE_MULTI_HOTT, MODULE_SUBTYPE_MULTI_FX816, - MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_FX816 + MODULE_SUBTYPE_MULTI_BAYANG_RX, + MODULE_SUBTYPE_MULTI_PELIKAN, + MODULE_SUBTYPE_MULTI_TIGER, + MODULE_SUBTYPE_MULTI_XK, + MODULE_SUBTYPE_MULTI_XN297DUMP, + MODULE_SUBTYPE_MULTI_FRSKYX2, + MODULE_SUBTYPE_MULTI_FRSKY_R9, + MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_FRSKY_R9 }; #define MODULE_SUBTYPE_MULTI_XN297DP 63-3 diff --git a/radio/src/telemetry/multi.cpp b/radio/src/telemetry/multi.cpp index adc3120cd..738237bfc 100644 --- a/radio/src/telemetry/multi.cpp +++ b/radio/src/telemetry/multi.cpp @@ -555,7 +555,7 @@ void MultiModuleStatus::getStatusString(char * statusText) const return; } - if (major <= 1 && minor <= 3 && revision <= 0 && patch <= 47 && SLOW_BLINK_ON_PHASE) { + if (major <= 1 && minor <= 3 && revision <= 0 && patch <= 78 && SLOW_BLINK_ON_PHASE) { strcpy(statusText, STR_MODULE_UPGRADE); } else { diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index d2768ae87..4252eb9a8 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -108,7 +108,8 @@ void frskyDSetDefault(int index, uint16_t id); extern uint8_t telemetryProtocol; #if defined (MULTIMODULE) - #define IS_D16_MULTI(module) ((g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKY) && (g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16 || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_8CH || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH)) + #define IS_D16_MULTI(module) (((g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKY) && (g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16 || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_8CH || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH)) \ + || (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKYX2)) #define IS_HOTT_MULTI(module) (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_HOTT) #if defined(HARDWARE_INTERNAL_MODULE) #define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT || (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE && (IS_D16_MULTI(INTERNAL_MODULE)||IS_D16_MULTI(EXTERNAL_MODULE)))) diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h index 15361a065..cbef5238b 100644 --- a/radio/src/translations/untranslated.h +++ b/radio/src/translations/untranslated.h @@ -125,4 +125,4 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\007" -#define TR_MULTI_PROTOCOLS "FlySky\0""Hubsan\0""FrSky\0 ""Hisky\0 ""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0 ""KN\0 ""SymaX\0 ""SLT\0 ""CX10\0 ""CG023\0 ""Bayang\0""ESky\0 ""MT99XX\0""MJXq\0 ""Shenqi\0""FY326\0 ""SFHSS\0 ""J6 Pro\0""FQ777\0 ""Assan\0 ""Hontai\0""OpenLrs""FSky 2A""Q2x2\0 ""Walkera""Q303\0 ""GW008\0 ""DM002\0 ""Cabell\0""Esky150""H8 3D\0 ""Corona\0""CFlie\0 ""Hitec\0 ""WFly\0 ""Bugs\0 ""BugMini""Traxxas""NCC1701""E01X\0 ""V911S\0 ""GD00X\0 ""V761\0 ""KF606\0 ""Redpine""Potensi""ZSX\0 ""FlyZone""Scanner""FrSkyRX""FS2A_RX""HoTT\0 ""FX816\0 " +#define TR_MULTI_PROTOCOLS "FlySky\0""Hubsan\0""FrSky\0 ""Hisky\0 ""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0 ""KN\0 ""SymaX\0 ""SLT\0 ""CX10\0 ""CG023\0 ""Bayang\0""ESky\0 ""MT99XX\0""MJXq\0 ""Shenqi\0""FY326\0 ""SFHSS\0 ""J6 Pro\0""FQ777\0 ""Assan\0 ""Hontai\0""OpenLrs""FSky 2A""Q2x2\0 ""Walkera""Q303\0 ""GW008\0 ""DM002\0 ""Cabell\0""Esky150""H8 3D\0 ""Corona\0""CFlie\0 ""Hitec\0 ""WFly\0 ""Bugs\0 ""BugMini""Traxxas""NCC1701""E01X\0 ""V911S\0 ""GD00X\0 ""V761\0 ""KF606\0 ""Redpine""Potensi""ZSX\0 ""FlyZone""Scanner""FrSkyRX""FS2A_RX""HoTT\0 ""FX816\0 ""BayangR""Pelikan""Tiger\0 ""WK\0 ""XN297DU""FrSkyX2""FrSkyR9" From dd8d9f7d1a2fcf9f77d878375f55c76a4560a857 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 30 Mar 2020 09:08:42 +0200 Subject: [PATCH 198/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 772bd36b9..31cfd4122 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1708,3 +1708,4 @@ James Laver Kevin Bowens David Frech Udo Kastenholz +Julio Margarido From d9d5ee9b806e58a3a95da6b2e37b4ad45a5d953e Mon Sep 17 00:00:00 2001 From: Kilrah Date: Mon, 30 Mar 2020 21:45:41 +0200 Subject: [PATCH 199/560] Remove stray item --- companion/src/apppreferencesdialog.ui | 235 +++++++++++++------------- 1 file changed, 116 insertions(+), 119 deletions(-) diff --git a/companion/src/apppreferencesdialog.ui b/companion/src/apppreferencesdialog.ui index dff6bbc00..9ed6d0e4c 100644 --- a/companion/src/apppreferencesdialog.ui +++ b/companion/src/apppreferencesdialog.ui @@ -45,7 +45,7 @@ - 2 + 0 @@ -821,6 +821,16 @@ Mode 4: + + + + Show splash screen when Companion starts + + + true + + + @@ -841,16 +851,6 @@ Mode 4: - - - - Show splash screen when Companion starts - - - true - - - @@ -902,14 +902,14 @@ Mode 4: - - + + Qt::Horizontal - + @@ -922,36 +922,6 @@ Mode 4: - - - - <html><head/><body><p>This option maintains the behaviour from older OpenTx versions where empty model slots are preserved when a model is deleted or moved. </p><p>When this option is de-selected, the other models may be re-arranged to fill the gap left by the removed model.</p></body></html> - - - Remove empty model slots when deleting models (only applies for radios w/out categories) - - - - - - - - 0 - 0 - - - - Output Logs Folder - - - - - - - Qt::Horizontal - - - @@ -965,6 +935,63 @@ Mode 4: + + + + <html><head/><body><p>This option maintains the behaviour from older OpenTx versions where empty model slots are preserved when a model is deleted or moved. </p><p>When this option is de-selected, the other models may be re-arranged to fill the gap left by the removed model.</p></body></html> + + + Remove empty model slots when deleting models (only applies for radios w/out categories) + + + + + + + + 0 + 0 + + + + Output Logs Folder + + + + + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + Only show user splash images + + + + + Show user and companion splash images + + + + + + + + Qt::Horizontal + + + @@ -999,34 +1026,7 @@ Mode 4: - - - - - 0 - 0 - - - - - Only show user splash images - - - - - Show user and companion splash images - - - - - - - - Qt::Horizontal - - - - + @@ -1071,10 +1071,23 @@ Mode 4: - - - - Qt::Horizontal + + + + + 0 + 0 + + + + User Splash Screens + + + + + + + Release channel @@ -1104,25 +1117,36 @@ Mode 4: - - - - - 0 - 0 - - - - User Splash Screens + + + + Qt::Horizontal - - - - Release channel - - + + + + + + <html><head/><body><p>Keep a log of all debugging messages generated by the desktop Companion/Simulator applications. An OpenTX developer may request this to help diagnose an issue.</p></body></html> + + + Application (Companion/Simulator) + + + + + + + <html><head/><body><p>Keep a log of all messages generated by the radio firmware when running in Simulator. This is the same information one would also see in the Simulator <span style=" font-style:italic;">Debug Output</span> window.</p></body></html> + + + Radio Firmware (in Simulator) + + + + @@ -1149,33 +1173,6 @@ Mode 4: - - - - - - <html><head/><body><p>Keep a log of all debugging messages generated by the desktop Companion/Simulator applications. An OpenTX developer may request this to help diagnose an issue.</p></body></html> - - - Application (Companion/Simulator) - - - - - - - <html><head/><body><p>Keep a log of all messages generated by the radio firmware when running in Simulator. This is the same information one would also see in the Simulator <span style=" font-style:italic;">Debug Output</span> window.</p></body></html> - - - Radio Firmware (in Simulator) - - - - - - - - From c3137b94686921bbf4bc800d12a1d9f9753dcc69 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 31 Mar 2020 08:30:51 +0200 Subject: [PATCH 200/560] Fix spanish translations This fixes #7474 --- radio/src/translations/es.h.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 9a293f9fa..2440ce73c 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -86,7 +86,7 @@ #define LEN_COUNTRYCODES TR("\002", "\007") #define TR_COUNTRYCODES TR("US""JP""EU", "America""Japon\0 ""Europa\0") -#define LEN_USBMODES TR("\006", "\008") +#define LEN_USBMODES TR("\006", "\010") #define TR_USBMODES TR("Pregun""Joyst\0""SDCard""Serie\0", "Pregunta""Joystick""SDCard\0 ""Serie\0 ") #define LEN_JACKMODES "\007" @@ -106,7 +106,7 @@ #define LEN_VBEEPCOUNTDOWN "\006" #define TR_VBEEPCOUNTDOWN "SilencBeeps\0Voz\0 Haptic" -#define LEN_VVARIOCENTER "\008" +#define LEN_VVARIOCENTER "\010" #define TR_VVARIOCENTER "Tono\0 ""Silencio" #define LEN_CURVE_TYPES "\006" From a3261289819ce017a9733816dbef14231be8f1e5 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 31 Mar 2020 16:10:12 +0200 Subject: [PATCH 201/560] Cosmetics --- radio/src/gui/common/stdlcd/radio_hardware.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/gui/common/stdlcd/radio_hardware.cpp b/radio/src/gui/common/stdlcd/radio_hardware.cpp index e450e1624..881e418b5 100644 --- a/radio/src/gui/common/stdlcd/radio_hardware.cpp +++ b/radio/src/gui/common/stdlcd/radio_hardware.cpp @@ -640,6 +640,7 @@ void menuRadioHardware(event_t event) else lcdDrawText(lcdNextPos, y, "---"); break; + #if defined(SPORT_UPDATE_PWR_GPIO) case ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER: g_eeGeneral.sportUpdatePower = editChoice(HW_SETTINGS_COLUMN2, y, STR_SPORT_UPDATE_POWER_MODE, STR_SPORT_UPDATE_POWER_MODES, g_eeGeneral.sportUpdatePower, 0, 1, attr, event); From a65cd6dbda898a870f70f4d7ce1d20459f35bfe7 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 1 Apr 2020 08:14:01 +0200 Subject: [PATCH 202/560] Bsongis/ras fix (#7478) RAS assigned to the right module --- radio/src/gui/212x64/radio_diaganas.cpp | 8 --- radio/src/gui/480x272/radio_diaganas.cpp | 9 --- radio/src/gui/480x272/radio_hardware.cpp | 72 ++++++++++++------- .../src/gui/common/stdlcd/radio_hardware.cpp | 8 +-- radio/src/targets/horus/board.h | 4 ++ radio/src/targets/taranis/board.h | 8 ++- radio/src/telemetry/frsky_sport.cpp | 9 ++- 7 files changed, 67 insertions(+), 51 deletions(-) diff --git a/radio/src/gui/212x64/radio_diaganas.cpp b/radio/src/gui/212x64/radio_diaganas.cpp index bea4089a4..6e1f21ced 100644 --- a/radio/src/gui/212x64/radio_diaganas.cpp +++ b/radio/src/gui/212x64/radio_diaganas.cpp @@ -38,12 +38,4 @@ void menuRadioDiagAnalogs(event_t event) lcdDrawNumber(x+10*FW-1, y, (int16_t)calibratedAnalogs[CONVERT_MODE(i)]*25/256, RIGHT); #endif } - - // RAS - if ((isModuleXJT(INTERNAL_MODULE) && IS_INTERNAL_MODULE_ON()) || (isModulePXX1(EXTERNAL_MODULE) && !IS_INTERNAL_MODULE_ON())) { - lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+6*FH, "RAS"); - lcdDrawNumber(10*FW-1, MENU_HEADER_HEIGHT+6*FH, telemetryData.swrInternal.value(), RIGHT); - lcdDrawText(LCD_W/2, MENU_HEADER_HEIGHT+6*FH, "XJTVER"); - lcdDrawNumber(LCD_W/2 + 10*FW-1, MENU_HEADER_HEIGHT+6*FH, telemetryData.xjtVersion, RIGHT); - } } diff --git a/radio/src/gui/480x272/radio_diaganas.cpp b/radio/src/gui/480x272/radio_diaganas.cpp index 2892457dc..88f82d748 100644 --- a/radio/src/gui/480x272/radio_diaganas.cpp +++ b/radio/src/gui/480x272/radio_diaganas.cpp @@ -23,7 +23,6 @@ constexpr coord_t LEFT_NAME_COLUMN = MENUS_MARGIN_LEFT; constexpr coord_t RIGHT_NAME_COLUMN = LCD_W / 2; constexpr coord_t ANA_OFFSET = 150; -constexpr coord_t RAS_TOP_POSITION = LCD_H - 45; bool menuRadioDiagAnalogs(event_t event) { @@ -49,14 +48,6 @@ bool menuRadioDiagAnalogs(event_t event) #endif } - // RAS - if ((isModuleXJT(INTERNAL_MODULE) && IS_INTERNAL_MODULE_ON()) || (isModulePXX1(EXTERNAL_MODULE) && !IS_INTERNAL_MODULE_ON())) { - lcdDrawText(MENUS_MARGIN_LEFT, RAS_TOP_POSITION, "RAS : "); - lcdDrawNumber(lcdNextPos, RAS_TOP_POSITION, telemetryData.swrInternal.value(), 0); - lcdDrawText(LCD_W / 2, RAS_TOP_POSITION, "XJTVER : "); - lcdDrawNumber(lcdNextPos, RAS_TOP_POSITION, telemetryData.xjtVersion, 0); - } - #if (NUM_PWMSTICKS > 0) && !defined(SIMU) lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 8 * FH, STICKS_PWM_ENABLED() ? "Sticks: PWM" : "Sticks: ANA"); #endif diff --git a/radio/src/gui/480x272/radio_hardware.cpp b/radio/src/gui/480x272/radio_hardware.cpp index 41f93259b..23d6e85de 100644 --- a/radio/src/gui/480x272/radio_hardware.cpp +++ b/radio/src/gui/480x272/radio_hardware.cpp @@ -72,6 +72,8 @@ enum MenuRadioHardwareItems { #endif ITEM_RADIO_HARDWARE_JITTER_FILTER, + ITEM_RADIO_HARDWARE_RAS, + #if defined(SPORT_UPDATE_PWR_GPIO) ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER, #endif @@ -79,7 +81,8 @@ enum MenuRadioHardwareItems { ITEM_RADIO_HARDWARE_MAX }; -#define HW_SETTINGS_COLUMN 150 +#define HW_SETTINGS_COLUMN1 150 +#define HW_SETTINGS_COLUMN2 200 #if defined(AUX_SERIAL) #define AUX_SERIAL_ROW 0, @@ -157,6 +160,7 @@ bool menuRadioHardware(event_t event) AUX_SERIAL_ROW /* aux serial mode */ 0, /* ADC filter */ + READONLY_ROW /* RAS */, SPORT_POWER_ROWS 1, /* Debug */ }); @@ -197,7 +201,7 @@ bool menuRadioHardware(event_t event) case ITEM_RADIO_HARDWARE_STICK2: case ITEM_RADIO_HARDWARE_STICK3: case ITEM_RADIO_HARDWARE_STICK4: - editStickHardwareSettings(HW_SETTINGS_COLUMN, y, k - ITEM_RADIO_HARDWARE_STICK1, event, attr); + editStickHardwareSettings(HW_SETTINGS_COLUMN1, y, k - ITEM_RADIO_HARDWARE_STICK1, event, attr); break; case ITEM_RADIO_HARDWARE_LS: @@ -211,11 +215,11 @@ bool menuRadioHardware(event_t event) uint8_t mask = (0x01 << idx); lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, NUM_STICKS+NUM_POTS+idx+1, menuHorizontalPosition < 0 ? attr : 0); if (ZEXIST(g_eeGeneral.anaNames[NUM_STICKS+NUM_POTS+idx]) || (attr && menuHorizontalPosition == 0)) - editName(HW_SETTINGS_COLUMN, y, g_eeGeneral.anaNames[NUM_STICKS+NUM_POTS+idx], LEN_ANA_NAME, event, attr && menuHorizontalPosition == 0); + editName(HW_SETTINGS_COLUMN1, y, g_eeGeneral.anaNames[NUM_STICKS+NUM_POTS+idx], LEN_ANA_NAME, event, attr && menuHorizontalPosition == 0); else - lcdDrawMMM(HW_SETTINGS_COLUMN, y, 0); + lcdDrawMMM(HW_SETTINGS_COLUMN1, y, 0); uint8_t potType = (g_eeGeneral.slidersConfig & mask) >> idx; - potType = editChoice(HW_SETTINGS_COLUMN+50, y, STR_SLIDERTYPES, potType, SLIDER_NONE, SLIDER_WITH_DETENT, menuHorizontalPosition == 1 ? attr : 0, event); + potType = editChoice(HW_SETTINGS_COLUMN2, y, STR_SLIDERTYPES, potType, SLIDER_NONE, SLIDER_WITH_DETENT, menuHorizontalPosition == 1 ? attr : 0, event); g_eeGeneral.slidersConfig &= ~mask; g_eeGeneral.slidersConfig |= (potType << idx); break; @@ -236,11 +240,11 @@ bool menuRadioHardware(event_t event) int index = k - ITEM_RADIO_HARDWARE_POT1; lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, NUM_STICKS+index+1, menuHorizontalPosition < 0 ? attr : 0); if (ZEXIST(g_eeGeneral.anaNames[NUM_STICKS+index]) || (attr && menuHorizontalPosition == 0)) - editName(HW_SETTINGS_COLUMN, y, g_eeGeneral.anaNames[NUM_STICKS+index], LEN_ANA_NAME, event, attr && menuHorizontalPosition == 0); + editName(HW_SETTINGS_COLUMN1, y, g_eeGeneral.anaNames[NUM_STICKS+index], LEN_ANA_NAME, event, attr && menuHorizontalPosition == 0); else - lcdDrawMMM(HW_SETTINGS_COLUMN, y, 0); + lcdDrawMMM(HW_SETTINGS_COLUMN1, y, 0); uint32_t potType = bfGet(g_eeGeneral.potsConfig, 2*(index), 2); - potType = editChoice(HW_SETTINGS_COLUMN+50, y, STR_POTTYPES, potType, POT_NONE, POT_WITHOUT_DETENT, menuHorizontalPosition == 1 ? attr : 0, event); + potType = editChoice(HW_SETTINGS_COLUMN2, y, STR_POTTYPES, potType, POT_NONE, POT_WITHOUT_DETENT, menuHorizontalPosition == 1 ? attr : 0, event); g_eeGeneral.potsConfig = bfSet(g_eeGeneral.potsConfig, potType, 2*index, 2); break; } @@ -264,10 +268,10 @@ bool menuRadioHardware(event_t event) int config = SWITCH_CONFIG(index); lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, MIXSRC_FIRST_SWITCH-MIXSRC_Rud+index+1, menuHorizontalPosition < 0 ? attr : 0); if (ZEXIST(g_eeGeneral.switchNames[index]) || (attr && menuHorizontalPosition == 0)) - editName(HW_SETTINGS_COLUMN, y, g_eeGeneral.switchNames[index], LEN_SWITCH_NAME, event, menuHorizontalPosition == 0 ? attr : 0); + editName(HW_SETTINGS_COLUMN1, y, g_eeGeneral.switchNames[index], LEN_SWITCH_NAME, event, menuHorizontalPosition == 0 ? attr : 0); else - lcdDrawMMM(HW_SETTINGS_COLUMN, y, 0); - config = editChoice(HW_SETTINGS_COLUMN+50, y, STR_SWTYPES, config, SWITCH_NONE, SWITCH_TYPE_MAX(index), menuHorizontalPosition == 1 ? attr : 0, event); + lcdDrawMMM(HW_SETTINGS_COLUMN1, y, 0); + config = editChoice(HW_SETTINGS_COLUMN2, y, STR_SWTYPES, config, SWITCH_NONE, SWITCH_TYPE_MAX(index), menuHorizontalPosition == 1 ? attr : 0, event); if (attr && checkIncDec_Ret) { g_eeGeneral.switchConfig = bfSet(g_eeGeneral.switchConfig, config, 2*index, 2); } @@ -276,18 +280,18 @@ bool menuRadioHardware(event_t event) case ITEM_RADIO_HARDWARE_BATTERY_CALIB: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_BATT_CALIB); - lcdDrawNumber(HW_SETTINGS_COLUMN+50, y, getBatteryVoltage(), attr|PREC2, 0, NULL, "V"); + lcdDrawNumber(HW_SETTINGS_COLUMN2, y, getBatteryVoltage(), attr|PREC2, 0, NULL, "V"); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.txVoltageCalibration, -127, 127); break; case ITEM_RADIO_HARDWARE_RTC_BATTERY: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_RTC_BATT); - lcdDrawNumber(HW_SETTINGS_COLUMN+50, y, getRTCBatteryVoltage(), attr|PREC2, 0, NULL, "V"); + lcdDrawNumber(HW_SETTINGS_COLUMN2, y, getRTCBatteryVoltage(), attr|PREC2, 0, NULL, "V"); break; case ITEM_RADIO_HARDWARE_SERIAL_BAUDRATE: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MAXBAUDRATE); - lcdDrawNumber(HW_SETTINGS_COLUMN+50, y, CROSSFIRE_BAUDRATES[g_eeGeneral.telemetryBaudrate], attr|LEFT); + lcdDrawNumber(HW_SETTINGS_COLUMN2, y, CROSSFIRE_BAUDRATES[g_eeGeneral.telemetryBaudrate], attr|LEFT); if (attr) { g_eeGeneral.telemetryBaudrate = DIM(CROSSFIRE_BAUDRATES) - 1 - checkIncDecModel(event, DIM(CROSSFIRE_BAUDRATES) - 1 - g_eeGeneral.telemetryBaudrate, 0, DIM(CROSSFIRE_BAUDRATES) - 1); if (checkIncDec_Ret && IS_EXTERNAL_MODULE_ON()) { @@ -307,40 +311,40 @@ bool menuRadioHardware(event_t event) { lcdDrawText(MENUS_MARGIN_LEFT, y, STR_RTC_CHECK); uint8_t b = 1 - g_eeGeneral.disableRtcWarning; - g_eeGeneral.disableRtcWarning = 1 - editCheckBox(b, HW_SETTINGS_COLUMN + 50, y, attr, event); + g_eeGeneral.disableRtcWarning = 1 - editCheckBox(b, HW_SETTINGS_COLUMN2, y, attr, event); break; } #if defined(BLUETOOTH) case ITEM_RADIO_HARDWARE_BLUETOOTH_MODE: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_BLUETOOTH); - g_eeGeneral.bluetoothMode = editChoice(HW_SETTINGS_COLUMN+50, y, STR_BLUETOOTH_MODES, g_eeGeneral.bluetoothMode, BLUETOOTH_OFF, BLUETOOTH_TRAINER, attr, event); + g_eeGeneral.bluetoothMode = editChoice(HW_SETTINGS_COLUMN2, y, STR_BLUETOOTH_MODES, g_eeGeneral.bluetoothMode, BLUETOOTH_OFF, BLUETOOTH_TRAINER, attr, event); break; case ITEM_RADIO_HARDWARE_BLUETOOTH_PAIRING_CODE: lcdDrawText(INDENT_WIDTH, y, STR_BLUETOOTH_PIN_CODE); - lcdDrawText(HW_SETTINGS_COLUMN+50, y, "000000", 0); + lcdDrawText(HW_SETTINGS_COLUMN2, y, "000000", 0); break; case ITEM_RADIO_HARDWARE_BLUETOOTH_LOCAL_ADDR: lcdDrawText(INDENT_WIDTH, y, STR_BLUETOOTH_LOCAL_ADDR); - lcdDrawText(HW_SETTINGS_COLUMN+50, y, bluetooth.localAddr[0] == '\0' ? "---" : bluetooth.localAddr); + lcdDrawText(HW_SETTINGS_COLUMN2, y, bluetooth.localAddr[0] == '\0' ? "---" : bluetooth.localAddr); break; case ITEM_RADIO_HARDWARE_BLUETOOTH_DISTANT_ADDR: lcdDrawText(INDENT_WIDTH, y, STR_BLUETOOTH_DIST_ADDR); - lcdDrawText(HW_SETTINGS_COLUMN+50, y, bluetooth.distantAddr[0] == '\0' ? "---" : bluetooth.distantAddr); + lcdDrawText(HW_SETTINGS_COLUMN2, y, bluetooth.distantAddr[0] == '\0' ? "---" : bluetooth.distantAddr); break; case ITEM_RADIO_HARDWARE_BLUETOOTH_NAME: lcdDrawText(INDENT_WIDTH, y, STR_NAME); - editName(HW_SETTINGS_COLUMN+50, y, g_eeGeneral.bluetoothName, LEN_BLUETOOTH_NAME, event, attr); + editName(HW_SETTINGS_COLUMN2, y, g_eeGeneral.bluetoothName, LEN_BLUETOOTH_NAME, event, attr); break; #endif #if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA) case ITEM_RADIO_HARDWARE_EXTERNAL_ANTENNA: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_ANTENNA); - reusableBuffer.radioHardware.antennaMode = editChoice(HW_SETTINGS_COLUMN+50, y, STR_ANTENNA_MODES, reusableBuffer.radioHardware.antennaMode, ANTENNA_MODE_INTERNAL, ANTENNA_MODE_EXTERNAL, attr, event); + reusableBuffer.radioHardware.antennaMode = editChoice(HW_SETTINGS_COLUMN2, y, STR_ANTENNA_MODES, reusableBuffer.radioHardware.antennaMode, ANTENNA_MODE_INTERNAL, ANTENNA_MODE_EXTERNAL, attr, event); if (!s_editMode && reusableBuffer.radioHardware.antennaMode != g_eeGeneral.antennaMode) { if (!isExternalAntennaEnabled() && (reusableBuffer.radioHardware.antennaMode == ANTENNA_MODE_EXTERNAL || (reusableBuffer.radioHardware.antennaMode == ANTENNA_MODE_PER_MODEL && g_model.moduleData[INTERNAL_MODULE].pxx.antennaMode == ANTENNA_MODE_EXTERNAL))) { POPUP_CONFIRMATION(STR_ANTENNACONFIRM1, onHardwareAntennaSwitchConfirm); @@ -360,7 +364,7 @@ bool menuRadioHardware(event_t event) #if defined(RADIO_TX16S) lcdDrawText(lcdNextPos, y, " (TTL)"); #endif - g_eeGeneral.auxSerialMode = editChoice(HW_SETTINGS_COLUMN+50, y, STR_AUX_SERIAL_MODES, g_eeGeneral.auxSerialMode, 0, UART_MODE_MAX, attr, event); + g_eeGeneral.auxSerialMode = editChoice(HW_SETTINGS_COLUMN2, y, STR_AUX_SERIAL_MODES, g_eeGeneral.auxSerialMode, 0, UART_MODE_MAX, attr, event); if (attr && checkIncDec_Ret) { auxSerialInit(g_eeGeneral.auxSerialMode, modelTelemetryProtocol()); } @@ -371,14 +375,32 @@ bool menuRadioHardware(event_t event) { lcdDrawText(MENUS_MARGIN_LEFT, y, STR_JITTER_FILTER); uint8_t b = 1 - g_eeGeneral.jitterFilter; - g_eeGeneral.jitterFilter = 1 - editCheckBox(b, HW_SETTINGS_COLUMN+50, y, attr, event); + g_eeGeneral.jitterFilter = 1 - editCheckBox(b, HW_SETTINGS_COLUMN2, y, attr, event); break; } + case ITEM_RADIO_HARDWARE_RAS: +#if defined(HARDWARE_INTERNAL_RAS) + lcdDrawText(MENUS_MARGIN_LEFT, y, "RAS"); + if (telemetryData.swrInternal.isFresh()) + lcdDrawNumber(HW_SETTINGS_COLUMN2, y, telemetryData.swrInternal.value()); + else + lcdDrawText(HW_SETTINGS_COLUMN2, y, "---"); + lcdDrawText(lcdNextPos, y, "/"); +#else + lcdDrawText(MENUS_MARGIN_LEFT, y, "Ext. RAS"); + lcdNextPos = HW_SETTINGS_COLUMN2; +#endif + if (telemetryData.swrExternal.isFresh()) + lcdDrawNumber(lcdNextPos, y, telemetryData.swrExternal.value()); + else + lcdDrawText(lcdNextPos, y, "---"); + break; + #if defined(SPORT_UPDATE_PWR_GPIO) case ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_SPORT_UPDATE_POWER_MODE); - g_eeGeneral.sportUpdatePower = editChoice(HW_SETTINGS_COLUMN + 50, y, STR_SPORT_UPDATE_POWER_MODES, g_eeGeneral.sportUpdatePower, 0, 1, attr, event); + g_eeGeneral.sportUpdatePower = editChoice(HW_SETTINGS_COLUMN2, y, STR_SPORT_UPDATE_POWER_MODES, g_eeGeneral.sportUpdatePower, 0, 1, attr, event); if (attr && checkIncDec_Ret) { SPORT_UPDATE_POWER_INIT(); } @@ -387,7 +409,7 @@ bool menuRadioHardware(event_t event) case ITEM_RADIO_HARDWARE_DEBUG: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_DEBUG); - lcdDrawText(HW_SETTINGS_COLUMN + 50, y, STR_ANALOGS_BTN, menuHorizontalPosition == 0 ? attr : 0); + lcdDrawText(HW_SETTINGS_COLUMN2, y, STR_ANALOGS_BTN, menuHorizontalPosition == 0 ? attr : 0); lcdDrawText(lcdNextPos + 10, y, STR_KEYS_BTN, menuHorizontalPosition == 1 ? attr : 0); if (attr && event == EVT_KEY_BREAK(KEY_ENTER)) { if (menuHorizontalPosition == 0) diff --git a/radio/src/gui/common/stdlcd/radio_hardware.cpp b/radio/src/gui/common/stdlcd/radio_hardware.cpp index 881e418b5..dde563d6a 100644 --- a/radio/src/gui/common/stdlcd/radio_hardware.cpp +++ b/radio/src/gui/common/stdlcd/radio_hardware.cpp @@ -624,16 +624,16 @@ void menuRadioHardware(event_t event) break; case ITEM_RADIO_HARDWARE_RAS: -#if defined(PCBX9LITE) && !defined(PCBX9LITES) - lcdDrawTextAlignedLeft(y, "Ext. RAS"); - lcdNextPos = HW_SETTINGS_COLUMN2; -#else +#if defined(HARDWARE_INTERNAL_RAS) lcdDrawTextAlignedLeft(y, "RAS"); if (telemetryData.swrInternal.isFresh()) lcdDrawNumber(HW_SETTINGS_COLUMN2, y, telemetryData.swrInternal.value()); else lcdDrawText(HW_SETTINGS_COLUMN2, y, "---"); lcdDrawText(lcdNextPos, y, "/"); +#else + lcdDrawTextAlignedLeft(y, "Ext. RAS"); + lcdNextPos = HW_SETTINGS_COLUMN2; #endif if (telemetryData.swrExternal.isFresh()) lcdDrawNumber(lcdNextPos, y, telemetryData.swrExternal.value()); diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index cdc8fb084..437346078 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -146,6 +146,10 @@ void SDRAM_Init(); // Pulses driver #define INTERNAL_MODULE_ON() GPIO_SetBits(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN) +#if defined(INTERNAL_MODULE_PXX1) || defined(INTERNAL_MODULE_PXX2) + #define HARDWARE_INTERNAL_RAS +#endif + #if defined(INTMODULE_USART) #define INTERNAL_MODULE_OFF() intmoduleStop() #else diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index e735c8d33..acba12d76 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -114,12 +114,16 @@ 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) + #define HARDWARE_INTERNAL_RAS +#endif + #define EXTERNAL_MODULE_ON() EXTERNAL_MODULE_PWR_ON() #if defined(EXTMODULE_USART) -#define EXTERNAL_MODULE_OFF() extmoduleStop() + #define EXTERNAL_MODULE_OFF() extmoduleStop() #else -#define EXTERNAL_MODULE_OFF() EXTERNAL_MODULE_PWR_OFF() + #define EXTERNAL_MODULE_OFF() EXTERNAL_MODULE_PWR_OFF() #endif #if defined(RADIO_T12) diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index 78438caaf..ebb90586a 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -177,17 +177,20 @@ void sportProcessTelemetryPacketWithoutCrc(uint8_t origin, const uint8_t * packe if (primId == DATA_FRAME) { uint8_t originMask; + uint8_t moduleIndex; if (origin == TELEMETRY_ENDPOINT_SPORT) { #if defined(SIMU) && defined(INTERNAL_MODULE_PXX2) // When running simu on ACCESS radio, we set the origin as internal module + moduleIndex = 0; origin = 0; originMask = 0x01; #else + moduleIndex = isSportLineUsedByInternalModule() ? 0 : 1; originMask = 0x04; #endif } else { - uint8_t moduleIndex = (origin >> 2); + moduleIndex = (origin >> 2); originMask = 0x01 << moduleIndex; } uint8_t instance = physicalId + (origin << 5); @@ -226,12 +229,12 @@ void sportProcessTelemetryPacketWithoutCrc(uint8_t origin, const uint8_t * packe else if (dataId == XJT_VERSION_ID) { telemetryData.xjtVersion = HUB_DATA_U16(packet); if (!isRasValueValid()) { - telemetryData.setSwr(origin >> 2, 0); + telemetryData.setSwr(moduleIndex, 0); } } else if (dataId == RAS_ID) { if (isRasValueValid()) { - telemetryData.setSwr(origin >> 2, SPORT_DATA_U8(packet)); + telemetryData.setSwr(moduleIndex, SPORT_DATA_U8(packet)); } } From 3bff803238ad4178efb3a5b48d3a4c0a7095eba7 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 1 Apr 2020 08:14:32 +0200 Subject: [PATCH 203/560] OTA Update back on Horus (#7477) --- radio/src/gui/480x272/radio_sdmanager.cpp | 21 ++++++++++--------- .../src/gui/common/stdlcd/radio_sdmanager.cpp | 8 ++++--- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/radio/src/gui/480x272/radio_sdmanager.cpp b/radio/src/gui/480x272/radio_sdmanager.cpp index 2796325ac..90b5e5f57 100644 --- a/radio/src/gui/480x272/radio_sdmanager.cpp +++ b/radio/src/gui/480x272/radio_sdmanager.cpp @@ -281,13 +281,14 @@ void onUpdateReceiverSelection(const char * result) bool menuRadioSdManager(event_t _event) { -// TODO FREEZE SD MANAGER -// if (moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode == MODULE_MODE_BIND && EVT_KEY_MASK(_event) == KEY_EXIT) { -// moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL; -// CLEAR_POPUP(); -// killEvents(KEY_EXIT); -// _event = 0; -// } +#if defined(PXX2) + if (EVT_KEY_MASK(_event) == KEY_EXIT && moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode == MODULE_MODE_BIND) { + moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL; + CLEAR_POPUP(); + killEvents(KEY_EXIT); + _event = 0; + } +#endif event_t event = (EVT_KEY_MASK(_event) == KEY_ENTER ? 0 : _event); SIMPLE_MENU(SD_IS_HC() ? STR_SDHC_CARD : STR_SD_CARD, RADIO_ICONS, menuTabGeneral, MENU_RADIO_SD_MANAGER, reusableBuffer.sdManager.count); @@ -300,7 +301,7 @@ bool menuRadioSdManager(event_t _event) // no break; case EVT_ENTRY_UP: - memset(&reusableBuffer.sdManager, 0, sizeof(reusableBuffer.sdManager)); + memclear(&reusableBuffer.sdManager, sizeof(reusableBuffer.sdManager)); menuVerticalPosition = 0; REFRESH_FILES(); break; @@ -375,7 +376,7 @@ bool menuRadioSdManager(event_t _event) POPUP_MENU_ADD_ITEM(STR_FLASH_EXTERNAL_MODULE); if (HAS_SPORT_UPDATE_CONNECTOR() && (information.productFamily == FIRMWARE_FAMILY_RECEIVER || information.productFamily == FIRMWARE_FAMILY_SENSOR)) POPUP_MENU_ADD_ITEM(STR_FLASH_EXTERNAL_DEVICE); -#if 0 // TODO FREEZE SD MANAGER defined(PXX2) +#if defined(PXX2) if (information.productFamily == FIRMWARE_FAMILY_RECEIVER) { if (isReceiverOTAEnabledFromModule(INTERNAL_MODULE, information.productId)) POPUP_MENU_ADD_ITEM(STR_FLASH_RECEIVER_OTA_BY_INTERNAL); @@ -556,7 +557,7 @@ bool menuRadioSdManager(event_t _event) } } -#if 0 // FREEZE SD MANAGER defined(PXX2) +#if defined(PXX2) if (moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode == MODULE_MODE_BIND) { if (reusableBuffer.sdManager.otaUpdateInformation.step == BIND_INIT) { if (reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount > 0) { diff --git a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp index 7b6f9ac86..d6def8115 100644 --- a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp +++ b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp @@ -286,12 +286,14 @@ void menuRadioSdManager(event_t _event) int lastPos = menuVerticalPosition; #endif - if (moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode == MODULE_MODE_BIND && EVT_KEY_MASK(_event) == KEY_EXIT) { +#if defined(PXX2) + if (EVT_KEY_MASK(_event) == KEY_EXIT && moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode == MODULE_MODE_BIND) { moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL; CLEAR_POPUP(); killEvents(KEY_EXIT); _event = 0; } +#endif event_t event = (EVT_KEY_MASK(_event) == KEY_ENTER ? 0 : _event); SIMPLE_MENU(SD_IS_HC() ? STR_SDHC_CARD : STR_SD_CARD, menuTabGeneral, MENU_RADIO_SD_MANAGER, HEADER_LINE + reusableBuffer.sdManager.count); @@ -299,13 +301,13 @@ void menuRadioSdManager(event_t _event) switch (_event) { case EVT_ENTRY: f_chdir(ROOT_PATH); - REFRESH_FILES(); #if LCD_DEPTH > 1 lastPos = -1; #endif - break; + // no break case EVT_ENTRY_UP: + memclear(&reusableBuffer.sdManager, sizeof(reusableBuffer.sdManager)); REFRESH_FILES(); break; From 6be62ea1c01641e67132e3ddc6a91136c328b3f2 Mon Sep 17 00:00:00 2001 From: Kilrah Date: Wed, 1 Apr 2020 14:39:51 +0200 Subject: [PATCH 204/560] Cosmetics --- radio/src/gui/128x64/lcd.cpp | 4 ++-- radio/src/gui/128x64/lcd.h | 4 ++-- radio/src/gui/common/colorlcd/draw_functions.cpp | 2 +- radio/src/gui/common/stdlcd/draw_functions.cpp | 2 +- radio/src/gui/common/stdlcd/draw_functions.h | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/radio/src/gui/128x64/lcd.cpp b/radio/src/gui/128x64/lcd.cpp index 91baa3d19..c2c12fead 100644 --- a/radio/src/gui/128x64/lcd.cpp +++ b/radio/src/gui/128x64/lcd.cpp @@ -452,12 +452,12 @@ void lcdDraw8bitsNumber(coord_t x, coord_t y, int8_t val) lcdDrawNumber(x, y, val); } -void lcdDrawNumber(coord_t x, coord_t y, int val, LcdFlags flags) +void lcdDrawNumber(coord_t x, coord_t y, int32_t val, LcdFlags flags) { lcdDrawNumber(x, y, val, flags, 0); } -void lcdDrawNumber(coord_t x, coord_t y, int val, LcdFlags flags, uint8_t len) +void lcdDrawNumber(coord_t x, coord_t y, int32_t val, LcdFlags flags, uint8_t len) { char str[16+1]; char *s = str+16; diff --git a/radio/src/gui/128x64/lcd.h b/radio/src/gui/128x64/lcd.h index f1fc72810..d066dc26d 100644 --- a/radio/src/gui/128x64/lcd.h +++ b/radio/src/gui/128x64/lcd.h @@ -117,8 +117,8 @@ void drawTimerWithMode(coord_t x, coord_t y, uint8_t index, LcdFlags att); void lcdDrawHexNumber(coord_t x, coord_t y, uint32_t val, LcdFlags mode=0); void lcdDrawHexChar(coord_t x, coord_t y, uint8_t val, LcdFlags flags=0); -void lcdDrawNumber(coord_t x, coord_t y, int val, LcdFlags mode, uint8_t len); -void lcdDrawNumber(coord_t x, coord_t y, int val, LcdFlags mode=0); +void lcdDrawNumber(coord_t x, coord_t y, int32_t val, LcdFlags mode, uint8_t len); +void lcdDrawNumber(coord_t x, coord_t y, int32_t val, LcdFlags mode=0); void lcdDraw8bitsNumber(coord_t x, coord_t y, int8_t val); void putsModelName(coord_t x, coord_t y, char * name, uint8_t id, LcdFlags att); diff --git a/radio/src/gui/common/colorlcd/draw_functions.cpp b/radio/src/gui/common/colorlcd/draw_functions.cpp index d78424855..1854c0057 100644 --- a/radio/src/gui/common/colorlcd/draw_functions.cpp +++ b/radio/src/gui/common/colorlcd/draw_functions.cpp @@ -31,7 +31,7 @@ void drawStringWithIndex(coord_t x, coord_t y, const char * str, int idx, LcdFla lcdDrawText(x, y, s, flags); } -void drawValueWithUnit(coord_t x, coord_t y, int val, uint8_t unit, LcdFlags att) +void drawValueWithUnit(coord_t x, coord_t y, int32_t val, uint8_t unit, LcdFlags att) { // convertUnit(val, unit); if (!(att & NO_UNIT) && unit != UNIT_RAW) { diff --git a/radio/src/gui/common/stdlcd/draw_functions.cpp b/radio/src/gui/common/stdlcd/draw_functions.cpp index 665a76633..1bcf7286c 100644 --- a/radio/src/gui/common/stdlcd/draw_functions.cpp +++ b/radio/src/gui/common/stdlcd/draw_functions.cpp @@ -84,7 +84,7 @@ void drawTrimMode(coord_t x, coord_t y, uint8_t flightMode, uint8_t idx, LcdFlag } } -void drawValueWithUnit(coord_t x, coord_t y, int val, uint8_t unit, LcdFlags att) +void drawValueWithUnit(coord_t x, coord_t y, int32_t val, uint8_t unit, LcdFlags att) { // convertUnit(val, unit); lcdDrawNumber(x, y, val, att & (~NO_UNIT)); diff --git a/radio/src/gui/common/stdlcd/draw_functions.h b/radio/src/gui/common/stdlcd/draw_functions.h index acf4a949f..7755206e3 100644 --- a/radio/src/gui/common/stdlcd/draw_functions.h +++ b/radio/src/gui/common/stdlcd/draw_functions.h @@ -25,7 +25,7 @@ void lcdDrawMultiProtocolString(coord_t x, coord_t y, uint8_t moduleIdx, uint8_t protocol, LcdFlags flags = 0); void lcdDrawMultiSubProtocolString(coord_t x, coord_t y, uint8_t moduleIdx, uint8_t subType, LcdFlags flags = 0); void drawStringWithIndex(coord_t x, coord_t y, const char * str, uint8_t idx, LcdFlags att=0); -void drawValueWithUnit(coord_t x, coord_t y, int val, uint8_t unit, LcdFlags att=0); +void drawValueWithUnit(coord_t x, coord_t y, int32_t val, uint8_t unit, LcdFlags att=0); void drawPower(coord_t x, coord_t y, int8_t dBm, LcdFlags att = 0); void drawGVarName(coord_t x, coord_t y, int8_t index, LcdFlags flags=0); From 38831f5e135fffdc42462a2b71a7c920d6ddc40f Mon Sep 17 00:00:00 2001 From: Kilrah Date: Wed, 1 Apr 2020 16:27:43 +0200 Subject: [PATCH 205/560] Missing file --- radio/src/gui/common/colorlcd/draw_functions.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/common/colorlcd/draw_functions.h b/radio/src/gui/common/colorlcd/draw_functions.h index 8f8ab6b3b..3d925b2af 100644 --- a/radio/src/gui/common/colorlcd/draw_functions.h +++ b/radio/src/gui/common/colorlcd/draw_functions.h @@ -24,7 +24,7 @@ #include "lcd.h" void drawStringWithIndex(coord_t x, coord_t y, const char * str, int idx, LcdFlags flags, const char * prefix, const char * suffix); -void drawValueWithUnit(coord_t x, coord_t y, int val, uint8_t unit, LcdFlags att); +void drawValueWithUnit(coord_t x, coord_t y, int32_t val, uint8_t unit, LcdFlags att); int editChoice(coord_t x, coord_t y, const char * values, int value, int min, int max, LcdFlags attr, event_t event, IsValueAvailable isValueAvailable=nullptr); uint8_t editCheckBox(uint8_t value, coord_t x, coord_t y, LcdFlags attr, event_t event); swsrc_t editSwitch(coord_t x, coord_t y, swsrc_t value, LcdFlags attr, event_t event); From fe5206715908295be514945a2e44b3f937f3fe85 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 2 Apr 2020 17:44:09 +0200 Subject: [PATCH 206/560] Fix some spanish translations. This fixes #7487 --- radio/src/translations/es.h.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 2440ce73c..045855d01 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -815,11 +815,11 @@ #define TR_BLUETOOTH_LOCAL_ADDR "Dir. local" #define TR_BLUETOOTH_PIN_CODE "Codigo PIN" #define TR_BAUDRATE "Velocidad BT" -#define LEN_BLUETOOTH_MODES "\011" +#define LEN_BLUETOOTH_MODES "\012" #if defined(PCBX9E) -#define TR_BLUETOOTH_MODES "---\0 ""Activo\0 " +#define TR_BLUETOOTH_MODES "---\0 ""Activo\0 " #else -#define TR_BLUETOOTH_MODES "---\0 ""Telemetria""Entrenador" +#define TR_BLUETOOTH_MODES "---\0 ""Telemetria""Entrenador" #endif #define TR_SD_INFO_TITLE "SD INFO" #define TR_SD_TYPE "Tipo:" From 8266098574b3df5e5a19dbe7887781b2ff5c81f9 Mon Sep 17 00:00:00 2001 From: Martin <5703553+pre-martin@users.noreply.github.com> Date: Thu, 2 Apr 2020 20:25:07 +0200 Subject: [PATCH 207/560] Adds the version into the Windows registry (and "Add/Remove programs") (#7491) --- companion/targets/windows/companion.nsi.in | 1 + 1 file changed, 1 insertion(+) diff --git a/companion/targets/windows/companion.nsi.in b/companion/targets/windows/companion.nsi.in index 7ea693a1a..1a54e4b4d 100644 --- a/companion/targets/windows/companion.nsi.in +++ b/companion/targets/windows/companion.nsi.in @@ -117,6 +117,7 @@ Section "OpenTX Companion @VERSION_FAMILY@" SecDummy ;Registry information for add/remove programs WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenTX Companion @VERSION_FAMILY@" "DisplayName" "OpenTX Companion @VERSION_FAMILY@" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenTX Companion @VERSION_FAMILY@" "DisplayVersion" "@VERSION@" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenTX Companion @VERSION_FAMILY@" "UninstallString" "$\"$INSTDIR\Uninstall.exe$\"" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenTX Companion @VERSION_FAMILY@" "DisplayIcon" "$\"$INSTDIR\companion.exe$\"" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\OpenTX Companion @VERSION_FAMILY@" "Publisher" "OpenTX" From ac229acdffdfdfd13ee7091eb83d5aab475f3097 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 3 Apr 2020 10:13:27 +0200 Subject: [PATCH 208/560] Start touch test screen --- radio/src/gui/480x272/radio_hardware.cpp | 11 ++++++++++- radio/src/translations.cpp | 1 + radio/src/translations.h | 1 + radio/src/translations/cz.h.txt | 1 + radio/src/translations/de.h.txt | 1 + radio/src/translations/en.h.txt | 1 + radio/src/translations/es.h.txt | 1 + radio/src/translations/fi.h.txt | 1 + radio/src/translations/fr.h.txt | 1 + radio/src/translations/it.h.txt | 1 + radio/src/translations/nl.h.txt | 1 + radio/src/translations/pl.h.txt | 1 + radio/src/translations/pt.h.txt | 1 + radio/src/translations/se.h.txt | 1 + 14 files changed, 23 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/480x272/radio_hardware.cpp b/radio/src/gui/480x272/radio_hardware.cpp index 23d6e85de..896b5e9fb 100644 --- a/radio/src/gui/480x272/radio_hardware.cpp +++ b/radio/src/gui/480x272/radio_hardware.cpp @@ -131,6 +131,12 @@ void onHardwareAntennaSwitchConfirm(const char * result) #define SPORT_POWER_ROWS #endif +#if defined(HARDWARE_TOUCH) + #define DEBUG_ROW 2 +#else + #define DEBUG_ROW 1 +#endif + bool menuRadioHardware(event_t event) { MENU(STR_HARDWARE, RADIO_ICONS, menuTabGeneral, MENU_RADIO_HARDWARE, ITEM_RADIO_HARDWARE_MAX, { @@ -162,7 +168,7 @@ bool menuRadioHardware(event_t event) 0, /* ADC filter */ READONLY_ROW /* RAS */, SPORT_POWER_ROWS - 1, /* Debug */ + DEBUG_ROW, /* Debug */ }); if (menuEvent) { @@ -411,6 +417,9 @@ bool menuRadioHardware(event_t event) lcdDrawText(MENUS_MARGIN_LEFT, y, STR_DEBUG); lcdDrawText(HW_SETTINGS_COLUMN2, y, STR_ANALOGS_BTN, menuHorizontalPosition == 0 ? attr : 0); lcdDrawText(lcdNextPos + 10, y, STR_KEYS_BTN, menuHorizontalPosition == 1 ? attr : 0); +#if defined(HARDWARE_TOUCH) + lcdDrawText(lcdNextPos + 10, y, STR_KEYS_BTN, menuHorizontalPosition == 2 ? attr : 0); +#endif if (attr && event == EVT_KEY_BREAK(KEY_ENTER)) { if (menuHorizontalPosition == 0) pushMenu(menuRadioDiagAnalogs); diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 293e5abf8..2c0a44632 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -315,6 +315,7 @@ const char STR_MONITOR_SCREENS[] = TR_MONITOR_SCREENS; const char STR_RESET_BTN[] = TR_RESET_BTN; const char STR_DEBUG[] = TR_DEBUG; const char STR_KEYS_BTN[] = TR_KEYS_BTN; +const char STR_TOUCH_BTN[] = TR_TOUCH_BTN; const char STR_ANALOGS_BTN[] = TR_ANALOGS_BTN; const char STR_CALIBRATION[] = TR_CALIBRATION; const char STR_NO_TOOLS[] = TR_NO_TOOLS; diff --git a/radio/src/translations.h b/radio/src/translations.h index 7a28a4299..9af85a277 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -493,6 +493,7 @@ extern const char STR_MONITOR_SCREENS[]; extern const char STR_RESET_BTN[]; extern const char STR_DEBUG[]; extern const char STR_KEYS_BTN[]; +extern const char STR_TOUCH_BTN[]; extern const char STR_ANALOGS_BTN[]; extern const char STR_CALIBRATION[]; extern const char STR_NO_TOOLS[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index e46a70230..cfe72860d 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -912,6 +912,7 @@ #define TR_RESET_BTN BUTTON("Reset") #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Přepínače")) +#define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogy")) #define TR_CALIBRATION "Kalibrace" #define TR_SET BUTTON("Nast") diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 9da0cadc6..1153b404e 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -914,6 +914,7 @@ #define TR_RESET_BTN BUTTON("Reset") #define TR_DEBUG "Testen" #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) +#define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) #define TR_CALIBRATION "Kalibrieren" #define TR_SET BUTTON("Set") diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index c5211468e..297df750e 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -913,6 +913,7 @@ #define TR_RESET_BTN BUTTON("Reset") #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("Keys", "Switches")) +#define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Anas", "Analogs")) #define TR_CALIBRATION "Calibration" #define TR_SET BUTTON("Set") diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 045855d01..9a101d5ba 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -933,6 +933,7 @@ #define TR_RESET_BTN "[Reset]" #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) +#define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) #define TR_CALIBRATION "Calibracion" #define TR_SET "[Ajuste]" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index b3665f787..c171fa406 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -931,6 +931,7 @@ #define TR_RESET_BTN "[Reset]" #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) +#define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) #define TR_CALIBRATION "Calibration" #define TR_SET "[Set]" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index c9bb7a649..64e949b2b 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -933,6 +933,7 @@ #define TR_RESET_BTN BUTTON("RAZ") #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("Btns","Inters")) +#define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Anas", "Analogs")) #define TR_CALIBRATION "Calibration" #define TR_SET BUTTON("Déf") diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 11f4c411c..eaecfd349 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -933,6 +933,7 @@ #define TR_RESET_BTN "[Reset]" #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Interruttori")) +#define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Analogico","Analogici")) #define TR_CALIBRATION TR("Calibraz.", "Calibrazione") #define TR_SET "[Set]" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 9ff3650ce..913bdf60d 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -919,6 +919,7 @@ #define TR_RESET_BTN "[Reset]" #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) +#define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) #define TR_CALIBRATION "Calibration" #define TR_SET "[Set]" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index e721da2ed..6cd0d603f 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -932,6 +932,7 @@ #define TR_RESET_BTN "[Reset]" #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) +#define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) #define TR_CALIBRATION "Calibration" #define TR_SET "[Set]" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 87650f390..cf32b3158 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -922,6 +922,7 @@ #define TR_RESET_BTN "[Reset]" #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) +#define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) #define TR_CALIBRATION "Calibration" #define TR_SET "[Set]" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 6fba79f01..504546777 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -932,6 +932,7 @@ #define TR_RESET_BTN "[Nollställ]" #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) +#define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) #define TR_CALIBRATION "Calibration" #define TR_SET "[Spara]" From ca00b500766b7cb2551042502613b3fcb8efa1a9 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 3 Apr 2020 10:24:18 +0200 Subject: [PATCH 209/560] Enables TX16s --- companion/src/firmwares/opentx/opentxinterface.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index eb3750447..a8c38ff42 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -1345,12 +1345,11 @@ void registerOpenTxFirmwares() registerOpenTxFirmware(firmware); addOpenTxRfOptions(firmware, FLEX); - // TX16S is unavailable until finalized - /* Radiomaster TX16S board + /* Radiomaster TX16S board */ firmware = new OpenTxFirmware("opentx-tx16s", Firmware::tr("Radiomaster TX16s / TX16s Hall / TX16s Masterfire"), BOARD_RADIOMASTER_TX16S); addOpenTxFrskyOptions(firmware); firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module")); - registerOpenTxFirmware(firmware);*/ + registerOpenTxFirmware(firmware); /* 9XR-Pro */ firmware = new OpenTxFirmware("opentx-9xrpro", Firmware::tr("Turnigy 9XR-PRO"), BOARD_9XRPRO); From 3ee435dc3c021899caa9375de30698468c99bbf2 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 3 Apr 2020 16:06:17 +0200 Subject: [PATCH 210/560] Basic touch test screen holders --- radio/src/gui/480x272/menus.h | 1 + radio/src/gui/480x272/radio_diagtouch.cpp | 36 +++++++++++++++++++++++ radio/src/gui/480x272/radio_hardware.cpp | 17 +++++++---- radio/src/targets/horus/CMakeLists.txt | 1 + radio/src/targets/horus/ft5x06.cpp | 7 ++++- radio/src/targets/horus/ft5x06.h | 2 ++ radio/src/translations.cpp | 3 ++ radio/src/translations.h | 3 ++ radio/src/translations/cz.h.txt | 3 ++ radio/src/translations/de.h.txt | 3 ++ radio/src/translations/en.h.txt | 3 ++ radio/src/translations/es.h.txt | 3 ++ radio/src/translations/fi.h.txt | 3 ++ radio/src/translations/fr.h.txt | 3 ++ radio/src/translations/it.h.txt | 3 ++ radio/src/translations/nl.h.txt | 3 ++ radio/src/translations/pl.h.txt | 3 ++ radio/src/translations/pt.h.txt | 3 ++ radio/src/translations/se.h.txt | 3 ++ 19 files changed, 97 insertions(+), 6 deletions(-) create mode 100644 radio/src/gui/480x272/radio_diagtouch.cpp diff --git a/radio/src/gui/480x272/menus.h b/radio/src/gui/480x272/menus.h index 83c667f19..e74d2fa9c 100644 --- a/radio/src/gui/480x272/menus.h +++ b/radio/src/gui/480x272/menus.h @@ -185,6 +185,7 @@ bool menuModelModuleOptions(event_t event); bool menuModelReceiverOptions(event_t event); bool menuRadioDiagKeys(event_t event); bool menuRadioDiagAnalogs(event_t event); +bool menuRadioDiagTouch(event_t event); extern const MenuHandlerFunc menuTabModel[MENU_MODEL_PAGES_COUNT]; diff --git a/radio/src/gui/480x272/radio_diagtouch.cpp b/radio/src/gui/480x272/radio_diagtouch.cpp new file mode 100644 index 000000000..4db15b4a9 --- /dev/null +++ b/radio/src/gui/480x272/radio_diagtouch.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "opentx.h" +#include "ft5x06.h" + +bool menuRadioDiagTouch(event_t event) +{ + SIMPLE_SUBMENU(STR_MENU_RADIO_TOUCH, ICON_MODEL_SETUP, 1); + + if (touchInit()) { + lcdDrawText(LCD_W / 2, LCD_H / 2, STR_TOUCH_EXIT, CENTERED); + } + else { + lcdDrawText(LCD_W / 2, LCD_H / 2, STR_TOUCH_NOTFOUND, CENTERED); + } + + return true; +} diff --git a/radio/src/gui/480x272/radio_hardware.cpp b/radio/src/gui/480x272/radio_hardware.cpp index 896b5e9fb..109a65459 100644 --- a/radio/src/gui/480x272/radio_hardware.cpp +++ b/radio/src/gui/480x272/radio_hardware.cpp @@ -418,13 +418,20 @@ bool menuRadioHardware(event_t event) lcdDrawText(HW_SETTINGS_COLUMN2, y, STR_ANALOGS_BTN, menuHorizontalPosition == 0 ? attr : 0); lcdDrawText(lcdNextPos + 10, y, STR_KEYS_BTN, menuHorizontalPosition == 1 ? attr : 0); #if defined(HARDWARE_TOUCH) - lcdDrawText(lcdNextPos + 10, y, STR_KEYS_BTN, menuHorizontalPosition == 2 ? attr : 0); + lcdDrawText(lcdNextPos + 10, y, STR_TOUCH_BTN, menuHorizontalPosition == 2 ? attr : 0); #endif if (attr && event == EVT_KEY_BREAK(KEY_ENTER)) { - if (menuHorizontalPosition == 0) - pushMenu(menuRadioDiagAnalogs); - else - pushMenu(menuRadioDiagKeys); + switch (menuHorizontalPosition) { + case 0: + pushMenu(menuRadioDiagAnalogs); + break; + case 1: + pushMenu(menuRadioDiagKeys); + break; + case 2: + pushMenu(menuRadioDiagTouch); + break; + } } break; } diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index 95f6e8c61..92dded852 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -210,6 +210,7 @@ set(TARGET_SRC if(HARDWARE_TOUCH) set(TARGET_SRC ${TARGET_SRC} ft5x06.cpp) + set(GUI_SRC ${GUI_SRC} radio_diagtouch.cpp) add_definitions(-DHARDWARE_TOUCH) endif() diff --git a/radio/src/targets/horus/ft5x06.cpp b/radio/src/targets/horus/ft5x06.cpp index 47765bbc7..29e752908 100644 --- a/radio/src/targets/horus/ft5x06.cpp +++ b/radio/src/targets/horus/ft5x06.cpp @@ -18,4 +18,9 @@ * GNU General Public License for more details. */ -#include "ft5x06.h" \ No newline at end of file +#include "ft5x06.h" + +bool touchInit(void) +{ + return true; +} \ No newline at end of file diff --git a/radio/src/targets/horus/ft5x06.h b/radio/src/targets/horus/ft5x06.h index a4d6b1f54..aeb63174f 100644 --- a/radio/src/targets/horus/ft5x06.h +++ b/radio/src/targets/horus/ft5x06.h @@ -21,4 +21,6 @@ #ifndef _FT5X06_H_ #define _FT5X06_H_ +bool touchInit(void); + #endif // _FT5X06_H_ diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 2c0a44632..61fcf7063 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -211,6 +211,7 @@ const char STR_MENUSPECIALFUNCS[] = TR_MENUSPECIALFUNCS; const char STR_MENUVERSION[] = TR_MENUVERSION; const char STR_MENU_RADIO_SWITCHES[] = TR_MENU_RADIO_SWITCHES; const char STR_MENU_RADIO_ANALOGS[] = TR_MENU_RADIO_ANALOGS; +const char STR_MENU_RADIO_TOUCH[] = TR_MENU_RADIO_TOUCH; const char STR_MENUCALIBRATION[] = TR_MENUCALIBRATION; const char STR_MENUMODELSEL[] = TR_MENUMODELSEL; const char STR_MENUSETUP[] = TR_MENUSETUP; @@ -317,6 +318,8 @@ const char STR_DEBUG[] = TR_DEBUG; const char STR_KEYS_BTN[] = TR_KEYS_BTN; const char STR_TOUCH_BTN[] = TR_TOUCH_BTN; const char STR_ANALOGS_BTN[] = TR_ANALOGS_BTN; +const char STR_TOUCH_NOTFOUND[] = TR_TOUCH_NOTFOUND; +const char STR_TOUCH_EXIT[] = TR_TOUCH_EXIT; const char STR_CALIBRATION[] = TR_CALIBRATION; const char STR_NO_TOOLS[] = TR_NO_TOOLS; const char STR_NORMAL[] = TR_NORMAL; diff --git a/radio/src/translations.h b/radio/src/translations.h index 9af85a277..56f7b21ff 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -355,6 +355,7 @@ extern const char STR_MENUSPECIALFUNCS[]; extern const char STR_MENUVERSION[]; extern const char STR_MENU_RADIO_SWITCHES[]; extern const char STR_MENU_RADIO_ANALOGS[]; +extern const char STR_MENU_RADIO_TOUCH[]; extern const char STR_MENUCALIBRATION[]; extern const char STR_MENUMODELSEL[]; extern const char STR_MENUSETUP[]; @@ -495,6 +496,8 @@ extern const char STR_DEBUG[]; extern const char STR_KEYS_BTN[]; extern const char STR_TOUCH_BTN[]; extern const char STR_ANALOGS_BTN[]; +extern const char STR_TOUCH_NOTFOUND[]; +extern const char STR_TOUCH_EXIT[]; extern const char STR_CALIBRATION[]; extern const char STR_NO_TOOLS[]; extern const char STR_NORMAL[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index cfe72860d..d26ee6345 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -587,6 +587,7 @@ #define TR_MENUVERSION "VERZE" #define TR_MENU_RADIO_SWITCHES "DIAG" #define TR_MENU_RADIO_ANALOGS "ANALOGY" +#define TR_MENU_RADIO_TOUCH "TOUCHSCREEN TEST" #define TR_MENUCALIBRATION "KALIBRACE" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trimy => Subtrimy" @@ -914,6 +915,8 @@ #define TR_KEYS_BTN BUTTON(TR("SW","Přepínače")) #define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogy")) +#define TR_TOUCH_NOTFOUND "Touch hardware not found" +#define TR_TOUCH_EXIT "Touch screen to exit" #define TR_CALIBRATION "Kalibrace" #define TR_SET BUTTON("Nast") #define TR_TRAINER "Trenér" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 1153b404e..883188a28 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -591,6 +591,7 @@ #define TR_MENUVERSION "VERSION" #define TR_MENU_RADIO_SWITCHES TR("Schalter-Test", "Schalter-Test") #define TR_MENU_RADIO_ANALOGS "Geber-Test" +#define TR_MENU_RADIO_TOUCH "TOUCHSCREEN TEST" #define TR_MENUCALIBRATION TR("KALIB. ANALOG", "KALIBRIERUNG-Analog") #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Subtrims" @@ -916,6 +917,8 @@ #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) #define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) +#define TR_TOUCH_NOTFOUND "Touch hardware not found" +#define TR_TOUCH_EXIT "Touch screen to exit" #define TR_CALIBRATION "Kalibrieren" #define TR_SET BUTTON("Set") #define TR_TRAINER "DSC Buchse PPM In/Out" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 297df750e..ab9b0d1dc 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -590,6 +590,7 @@ #define TR_MENUVERSION "VERSION" #define TR_MENU_RADIO_SWITCHES TR("SWITCHES", "SWITCHES TEST") #define TR_MENU_RADIO_ANALOGS TR("ANALOGS", "ANALOGS TEST") +#define TR_MENU_RADIO_TOUCH "TOUCHSCREEN TEST" #define TR_MENUCALIBRATION "CALIBRATION" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Subtrims" @@ -915,6 +916,8 @@ #define TR_KEYS_BTN BUTTON(TR("Keys", "Switches")) #define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Anas", "Analogs")) +#define TR_TOUCH_NOTFOUND "Touch hardware not found" +#define TR_TOUCH_EXIT "Touch screen to exit" #define TR_CALIBRATION "Calibration" #define TR_SET BUTTON("Set") #define TR_TRAINER "Trainer" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 9a101d5ba..bd9a48697 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -601,6 +601,7 @@ #define TR_MENUVERSION "VERSION" #define TR_MENU_RADIO_SWITCHES TR("INTERUPTS", "TEST INTERUP.") #define TR_MENU_RADIO_ANALOGS TR("ANAS", "ENTRADAS ANALOG") +#define TR_MENU_RADIO_TOUCH "TOUCHSCREEN TEST" #define TR_MENUCALIBRATION "CALIBRACION" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Offsets" @@ -935,6 +936,8 @@ #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) #define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) +#define TR_TOUCH_NOTFOUND "Touch hardware not found" +#define TR_TOUCH_EXIT "Touch screen to exit" #define TR_CALIBRATION "Calibracion" #define TR_SET "[Ajuste]" #define TR_TRAINER "Entrena." diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index c171fa406..257124ef3 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -599,6 +599,7 @@ #define TR_MENUVERSION "VERSION" #define TR_MENU_RADIO_SWITCHES TR("SWITCHES","SWITCH TEST") #define TR_MENU_RADIO_ANALOGS TR("ANAS","ANALOG INPUTS") +#define TR_MENU_RADIO_TOUCH "TOUCHSCREEN TEST" #define TR_MENUCALIBRATION "CALIBRATION" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Subtrims" @@ -933,6 +934,8 @@ #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) #define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) +#define TR_TOUCH_NOTFOUND "Touch hardware not found" +#define TR_TOUCH_EXIT "Touch screen to exit" #define TR_CALIBRATION "Calibration" #define TR_SET "[Set]" #define TR_TRAINER "Trainer" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 64e949b2b..0c94196b6 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -610,6 +610,7 @@ #define TR_MENUVERSION "VERSION" #define TR_MENU_RADIO_SWITCHES TR("INTERS", "TEST INTERRUPTEURS") #define TR_MENU_RADIO_ANALOGS TR("ANAS", "ENTREES ANALOGIQUES") +#define TR_MENU_RADIO_TOUCH "TOUCHSCREEN TEST" #define TR_MENUCALIBRATION "CALIBRATION" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Subtrims" @@ -935,6 +936,8 @@ #define TR_KEYS_BTN BUTTON(TR("Btns","Inters")) #define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Anas", "Analogs")) +#define TR_TOUCH_NOTFOUND "Touch hardware not found" +#define TR_TOUCH_EXIT "Touch screen to exit" #define TR_CALIBRATION "Calibration" #define TR_SET BUTTON("Déf") #define TR_TRAINER "Ecolage" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index eaecfd349..c176e5f7e 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -609,6 +609,7 @@ #define TR_MENUVERSION "VERSIONE" #define TR_MENU_RADIO_SWITCHES "DIAG" #define TR_MENU_RADIO_ANALOGS "ANAS" +#define TR_MENU_RADIO_TOUCH "TOUCHSCREEN TEST" #define TR_MENUCALIBRATION "CALIBRAZIONE" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Subtrims" @@ -935,6 +936,8 @@ #define TR_KEYS_BTN BUTTON(TR("SW","Interruttori")) #define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Analogico","Analogici")) +#define TR_TOUCH_NOTFOUND "Touch hardware not found" +#define TR_TOUCH_EXIT "Touch screen to exit" #define TR_CALIBRATION TR("Calibraz.", "Calibrazione") #define TR_SET "[Set]" #define TR_TRAINER TR("Trainer", "Maestro/Allievo") diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 913bdf60d..33ac4e07e 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -594,6 +594,7 @@ #define TR_MENUVERSION "VERSIE" #define TR_MENU_RADIO_SWITCHES TR("Schak.", "Schakelaar-Test") #define TR_MENU_RADIO_ANALOGS "Analoog-Test" +#define TR_MENU_RADIO_TOUCH "TOUCHSCREEN TEST" #define TR_MENUCALIBRATION TR("CALIB. ANALOOG", "CALIBRERING Sticks+Pots") #if defined(COLORLCD) @@ -921,6 +922,8 @@ #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) #define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) +#define TR_TOUCH_NOTFOUND "Touch hardware not found" +#define TR_TOUCH_EXIT "Touch screen to exit" #define TR_CALIBRATION "Calibration" #define TR_SET "[Set]" #define TR_TRAINER "Trainer Poort" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 6cd0d603f..1b55ccef2 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -608,6 +608,7 @@ #define TR_MENUVERSION "WERSJA" #define TR_MENU_RADIO_SWITCHES TR("PRZEŁ","TEST PRZEŁ") #define TR_MENU_RADIO_ANALOGS TR("WE-ANA","WEJŚCIA ANALOG.") +#define TR_MENU_RADIO_TOUCH "TOUCHSCREEN TEST" #define TR_MENUCALIBRATION "KALIBRACJA" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trymery => Subtrimy" @@ -934,6 +935,8 @@ #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) #define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) +#define TR_TOUCH_NOTFOUND "Touch hardware not found" +#define TR_TOUCH_EXIT "Touch screen to exit" #define TR_CALIBRATION "Calibration" #define TR_SET "[Set]" #define TR_TRAINER "Port Trenera" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index cf32b3158..74d70ef2d 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -590,6 +590,7 @@ #define TR_MENUVERSION "VERSAO" #define TR_MENU_RADIO_SWITCHES "DIAGNOST" #define TR_MENU_RADIO_ANALOGS "ANALOGICOS" +#define TR_MENU_RADIO_TOUCH "TOUCHSCREEN TEST" #define TR_MENUCALIBRATION "CALIBRAGEM" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Subtrims" @@ -924,6 +925,8 @@ #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) #define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) +#define TR_TOUCH_NOTFOUND "Touch hardware not found" +#define TR_TOUCH_EXIT "Touch screen to exit" #define TR_CALIBRATION "Calibration" #define TR_SET "[Set]" #define TR_TRAINER "Trainer" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 504546777..0854167d2 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -607,6 +607,7 @@ #define TR_MENUVERSION "VERSION" #define TR_MENU_RADIO_SWITCHES TR("BRYTARE","TEST AV BRYTARE") #define TR_MENU_RADIO_ANALOGS "ANALOGA VÄRDEN" +#define TR_MENU_RADIO_TOUCH "TOUCHSCREEN TEST" #define TR_MENUCALIBRATION "KALIBRERING" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "[Spara Trimvärden]" @@ -934,6 +935,8 @@ #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) #define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) +#define TR_TOUCH_NOTFOUND "Touch hardware not found" +#define TR_TOUCH_EXIT "Touch screen to exit" #define TR_CALIBRATION "Calibration" #define TR_SET "[Spara]" #define TR_TRAINER "Trainer" From 69b8c4b711ae0974b47c2177a02a6fe4d750cfa6 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 3 Apr 2020 16:13:03 +0200 Subject: [PATCH 211/560] don't spam init() --- radio/src/gui/480x272/radio_diagtouch.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/480x272/radio_diagtouch.cpp b/radio/src/gui/480x272/radio_diagtouch.cpp index 4db15b4a9..756eb29a4 100644 --- a/radio/src/gui/480x272/radio_diagtouch.cpp +++ b/radio/src/gui/480x272/radio_diagtouch.cpp @@ -23,9 +23,15 @@ bool menuRadioDiagTouch(event_t event) { + static bool touchAvailable = false; + SIMPLE_SUBMENU(STR_MENU_RADIO_TOUCH, ICON_MODEL_SETUP, 1); - if (touchInit()) { + if (event == EVT_ENTRY || event == EVT_ENTRY_UP) { + touchAvailable = touchInit(); + } + + if (touchAvailable) { lcdDrawText(LCD_W / 2, LCD_H / 2, STR_TOUCH_EXIT, CENTERED); } else { From 6c4918876e20931f1d3bf0f1ef47d37822d46d1d Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 4 Apr 2020 11:28:10 +0200 Subject: [PATCH 212/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 31cfd4122..217bf93b4 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1709,3 +1709,4 @@ Kevin Bowens David Frech Udo Kastenholz Julio Margarido +Uwe Muendelein From 86e3b26e3b8f8babad4e6364d2ab4a83437546e2 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 5 Apr 2020 10:51:46 +0200 Subject: [PATCH 213/560] continued --- radio/src/gui/480x272/radio_diagtouch.cpp | 4 ++++ radio/src/targets/horus/ft5x06.cpp | 7 ++++++- radio/src/targets/horus/ft5x06.h | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/480x272/radio_diagtouch.cpp b/radio/src/gui/480x272/radio_diagtouch.cpp index 756eb29a4..7e1d41bba 100644 --- a/radio/src/gui/480x272/radio_diagtouch.cpp +++ b/radio/src/gui/480x272/radio_diagtouch.cpp @@ -30,6 +30,10 @@ bool menuRadioDiagTouch(event_t event) if (event == EVT_ENTRY || event == EVT_ENTRY_UP) { touchAvailable = touchInit(); } + else if (menuEvent) { + touchDeInit(); + return false; + } if (touchAvailable) { lcdDrawText(LCD_W / 2, LCD_H / 2, STR_TOUCH_EXIT, CENTERED); diff --git a/radio/src/targets/horus/ft5x06.cpp b/radio/src/targets/horus/ft5x06.cpp index 29e752908..9c0f6332a 100644 --- a/radio/src/targets/horus/ft5x06.cpp +++ b/radio/src/targets/horus/ft5x06.cpp @@ -20,7 +20,12 @@ #include "ft5x06.h" +void toucDehInit(void) +{ + +} + bool touchInit(void) { - return true; + return false; } \ No newline at end of file diff --git a/radio/src/targets/horus/ft5x06.h b/radio/src/targets/horus/ft5x06.h index aeb63174f..01485d7da 100644 --- a/radio/src/targets/horus/ft5x06.h +++ b/radio/src/targets/horus/ft5x06.h @@ -22,5 +22,6 @@ #define _FT5X06_H_ bool touchInit(void); +void touchDeInit(void); #endif // _FT5X06_H_ From 6eef77a6b31edd2f0b0d31518469139c0ea13fe0 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 5 Apr 2020 22:19:53 +0200 Subject: [PATCH 214/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 217bf93b4..40825416c 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1710,3 +1710,4 @@ David Frech Udo Kastenholz Julio Margarido Uwe Muendelein +James Jewitt From ccbbd413de9a6ced301f93d59e9e7053947ad327 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 7 Apr 2020 09:53:47 +0200 Subject: [PATCH 215/560] TP test started (untested) --- radio/src/gui/480x272/radio_diagtouch.cpp | 11 +- radio/src/targets/horus/CMakeLists.txt | 2 +- radio/src/targets/horus/ft5x06.cpp | 31 ---- radio/src/targets/horus/ft5x06.h | 27 --- radio/src/targets/horus/hal.h | 42 ++--- radio/src/targets/horus/tp_gt911.cpp | 201 ++++++++++++++++++++++ radio/src/targets/horus/tp_gt911.h | 126 ++++++++++++++ 7 files changed, 355 insertions(+), 85 deletions(-) delete mode 100644 radio/src/targets/horus/ft5x06.cpp delete mode 100644 radio/src/targets/horus/ft5x06.h create mode 100644 radio/src/targets/horus/tp_gt911.cpp create mode 100644 radio/src/targets/horus/tp_gt911.h diff --git a/radio/src/gui/480x272/radio_diagtouch.cpp b/radio/src/gui/480x272/radio_diagtouch.cpp index 7e1d41bba..15535d289 100644 --- a/radio/src/gui/480x272/radio_diagtouch.cpp +++ b/radio/src/gui/480x272/radio_diagtouch.cpp @@ -19,7 +19,7 @@ */ #include "opentx.h" -#include "ft5x06.h" +#include "tp_gt911.h" bool menuRadioDiagTouch(event_t event) { @@ -28,10 +28,11 @@ bool menuRadioDiagTouch(event_t event) SIMPLE_SUBMENU(STR_MENU_RADIO_TOUCH, ICON_MODEL_SETUP, 1); if (event == EVT_ENTRY || event == EVT_ENTRY_UP) { - touchAvailable = touchInit(); + touchAvailable = touchPanelInit(); + touchEventFlag = 0; } else if (menuEvent) { - touchDeInit(); + //touchDeInit(); return false; } @@ -42,5 +43,9 @@ bool menuRadioDiagTouch(event_t event) lcdDrawText(LCD_W / 2, LCD_H / 2, STR_TOUCH_NOTFOUND, CENTERED); } + if (touchEventFlag) { + touchPanelDeInit(); + popMenu(); + } return true; } diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index 92dded852..a0cf09cd2 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -209,7 +209,7 @@ set(TARGET_SRC ) if(HARDWARE_TOUCH) - set(TARGET_SRC ${TARGET_SRC} ft5x06.cpp) + set(TARGET_SRC ${TARGET_SRC} tp_gt911.cpp) set(GUI_SRC ${GUI_SRC} radio_diagtouch.cpp) add_definitions(-DHARDWARE_TOUCH) endif() diff --git a/radio/src/targets/horus/ft5x06.cpp b/radio/src/targets/horus/ft5x06.cpp deleted file mode 100644 index 9c0f6332a..000000000 --- a/radio/src/targets/horus/ft5x06.cpp +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "ft5x06.h" - -void toucDehInit(void) -{ - -} - -bool touchInit(void) -{ - return false; -} \ No newline at end of file diff --git a/radio/src/targets/horus/ft5x06.h b/radio/src/targets/horus/ft5x06.h deleted file mode 100644 index 01485d7da..000000000 --- a/radio/src/targets/horus/ft5x06.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#ifndef _FT5X06_H_ -#define _FT5X06_H_ - -bool touchInit(void); -void touchDeInit(void); - -#endif // _FT5X06_H_ diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 5e3ac2d1d..f24b3dda1 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -634,11 +634,26 @@ #define AUDIO_MUTE_DELAY 500 // ms #endif +// Touch +#if defined(HARDWARE_TOUCH) +#define TOUCH_INT_RCC_AHB1Periph RCC_AHB1Periph_GPIOH +#define TOUCH_INT_GPIO GPIOH +#define TOUCH_INT_GPIO_PIN GPIO_Pin_2 + +#define TOUCH_RST_RCC_AHB1Periph RCC_AHB1Periph_GPIOF +#define TOUCH_RST_GPIO GPIOF +#define TOUCH_RST_GPIO_PIN GPIO_Pin_10 + +#define TOUCH_INT_EXTI_LINE1 EXTI_Line2 +#define TOUCH_INT_EXTI_IRQn1 EXTI2_IRQn +#define TOUCH_INT_EXTI_IRQHandler1 EXTI2_IRQHandler +#define TOUCH_INT_EXTI_PortSource EXTI_PortSourceGPIOH +#define TOUCH_INT_EXTI_PinSource1 EXTI_PinSource2 + +#define TOUCH_INT_STAUS() (GPIO_ReadInputDataBit(TOUCH_INT_GPIO, TOUCH_INT_GPIO_PIN)) +#endif + // I2C Bus -#if defined(RADIO_TX16S) -#define I2C_RCC_AHB1Periph 0 -#define I2C_RCC_APB1Periph 0 -#else #define I2C_RCC_AHB1Periph RCC_AHB1Periph_GPIOB #define I2C_RCC_APB1Periph RCC_APB1Periph_I2C1 #define I2C I2C1 @@ -649,7 +664,6 @@ #define I2C_SCL_GPIO_PinSource GPIO_PinSource8 #define I2C_SDA_GPIO_PinSource GPIO_PinSource9 #define I2C_SPEED 400000 -#endif // Haptic #define HAPTIC_PWM @@ -842,24 +856,6 @@ #define TIMER_2MHz_RCC_APB1Periph RCC_APB1Periph_TIM7 #define TIMER_2MHz_TIMER TIM7 -// Touch -#if defined(HARDWARE_TOUCH) -#define I2C_TOUCH_RCC_AHB1Periph RCC_AHB1Periph_GPIOB -#define I2C_TOUCH_RCC_APB1Periph RCC_APB1Periph_I2C1 -#define I2C_TOUCH I2C1 -#define I2C_TOUCH_GPIO GPIOB -#define I2C_TOUCH_SCL_GPIO_PIN GPIO_Pin_8 // PB.08 -#define I2C_TOUCH_SDA_GPIO_PIN GPIO_Pin_7 // PB.07 - -#define I2C_TOUCH_RESET_GPIO GPIOF -#define I2C_TOUCH_RESET_GPIO_PIN GPIO_Pin_10 // PF.10 -#define I2C_TOUCH_INT_GPIO GPIOH -#define I2C_TOUCH_INT_GPIO_PIN GPIO_Pin_2 // PH.02 -#else -#define I2C_TOUCH_RCC_AHB1Periph 0 -#define I2C_TOUCH_RCC_APB1Periph 0 -#endif - // Bluetooth #define STORAGE_BLUETOOTH #if defined(BLUETOOTH) diff --git a/radio/src/targets/horus/tp_gt911.cpp b/radio/src/targets/horus/tp_gt911.cpp new file mode 100644 index 000000000..114329996 --- /dev/null +++ b/radio/src/targets/horus/tp_gt911.cpp @@ -0,0 +1,201 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "tp_gt911.h" + +uint8_t touchGT911Flag = 0; +uint8_t TOUCH_SCAN_MODE = 0; +uint8_t touchEventFlag = 0; + +void GT911_INT_Change(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + GPIO_InitStructure.GPIO_Pin = TOUCH_INT_GPIO_PIN; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_Init(TOUCH_INT_GPIO, &GPIO_InitStructure); +} + +uint8_t GT911_Send_Cfg(uint8_t mode) +{ + u8 buf[2]; + u8 i = 0; + buf[0] = 0; + buf[1] = mode; // + for (i = 0; i < sizeof(GT911_Cfg); i++) + buf[0] += GT911_Cfg[i];//check sum + + buf[0] = (~buf[0]) + 1; + GT911_WR_Reg(GT_CFGS_REG, (u8 *) GT911_Cfg, sizeof(GT911_Cfg));// + GT911_WR_Reg(GT_CHECK_REG, buf, 2);//write checksum + return 0; +} + +static void IIC_Config(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + //I2C_InitTypeDef I2C_InitStructure; + + /* GPIO Peripheral clock enable */ + RCC_AHB1PeriphClockCmd(I2C_RCC_AHB1Periph, ENABLE); + //RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); + + //PB6: I2C1_SCL PB7: I2C1_SDA + GPIO_InitStructure.GPIO_Pin = I2C_SCL_GPIO_PIN | I2C_SDA_GPIO_PIN; + //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(I2C_GPIO, &GPIO_InitStructure); + + GPIO_SetBits(I2C_GPIO, I2C_SCL_GPIO_PIN | I2C_SDA_GPIO_PIN); +} + +static void TOUCH_AF_ExtiStop(void) +{ + SYSCFG_EXTILineConfig(TOUCH_INT_EXTI_PortSource, TOUCH_INT_EXTI_PinSource1); + + EXTI_InitTypeDef EXTI_InitStructure; + EXTI_StructInit(&EXTI_InitStructure); + EXTI_InitStructure.EXTI_Line = TOUCH_INT_EXTI_LINE1; + EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; + EXTI_InitStructure.EXTI_LineCmd = DISABLE; + EXTI_Init(&EXTI_InitStructure); + + + NVIC_InitTypeDef NVIC_InitStructure; + NVIC_InitStructure.NVIC_IRQChannel = TOUCH_INT_EXTI_IRQn1; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 9; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /* Not used as 4 bits are used for the pre-emption priority. */; + NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; + NVIC_Init(&NVIC_InitStructure); +} + +static void TOUCH_AF_ExtiConfig(void) +{ + SYSCFG_EXTILineConfig(TOUCH_INT_EXTI_PortSource, TOUCH_INT_EXTI_PinSource1); + + EXTI_InitTypeDef EXTI_InitStructure; + EXTI_StructInit(&EXTI_InitStructure); + EXTI_InitStructure.EXTI_Line = TOUCH_INT_EXTI_LINE1; + EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; + EXTI_InitStructure.EXTI_LineCmd = ENABLE; + EXTI_Init(&EXTI_InitStructure); + + + NVIC_InitTypeDef NVIC_InitStructure; + NVIC_InitStructure.NVIC_IRQChannel = TOUCH_INT_EXTI_IRQn1; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 9; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /* Not used as 4 bits are used for the pre-emption priority. */; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); +} + +static void TOUCH_AF_GPIOConfig(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitStructure.GPIO_Pin = TOUCH_RST_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(TOUCH_RST_GPIO, &GPIO_InitStructure); + + GPIO_ResetBits(TOUCH_RST_GPIO, TOUCH_RST_GPIO_PIN); + + GPIO_InitStructure.GPIO_Pin = TOUCH_INT_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(TOUCH_INT_GPIO, &GPIO_InitStructure); + + GPIO_ResetBits(TOUCH_INT_GPIO, TOUCH_INT_GPIO_PIN); +} + +void touchPanelDeInit(void) +{ + TOUCH_AF_ExtiStop(); +} + +bool touchPanelInit(void) +{ + uint8_t tmp[4] = {0}; + + TRACE("Touchpanel init start ..."); + + TOUCH_AF_GPIOConfig(); //SET RST=OUT INT=OUT INT=LOW + IIC_Config(); + + TPRST_LOW(); + TPINT_HIGH(); + delay_us(200); //DELAY 200US + + TPRST_HIGH(); + delay_ms(6); //DELAY 6MS + + TPINT_LOW(); + delay_ms(55); //DELAY 55MS + + GT911_INT_Change(); //Set INT INPUT INT=LOW + + delay_ms(50); //DELAY 55MS + + GT911_RD_Reg(GT_PID_REG, tmp, 4); + + if (strcmp((char *) tmp, "911") == 0)//ID==9147 + { + tmp[0] = 0X02; + GT911_WR_Reg(GT_CTRL_REG, tmp, 1);// + GT911_RD_Reg(GT_CFGS_REG, tmp, 1);// + + if (tmp[0] < 0X69)//ver + { + //printf("Default Ver:%x\r\n",temp[0]); + GT911_Send_Cfg(1); // + } + + delay_ms(10); + tmp[0] = 0X00; + GT911_WR_Reg(GT_CTRL_REG, tmp, 1);//end reset + touchGT911Flag = true; + + TOUCH_AF_ExtiConfig(); + + return true; + } + + return false; +} + +extern "C" void TOUCH_INT_EXTI_IRQHandler1(void) +{ + if (EXTI_GetITStatus(TOUCH_INT_EXTI_LINE1) != RESET) { + TRACE("TOUCH INTERUPT"); + touchEventFlag = 1; + EXTI_ClearITPendingBit(TOUCH_INT_EXTI_LINE1); + } +} diff --git a/radio/src/targets/horus/tp_gt911.h b/radio/src/targets/horus/tp_gt911.h new file mode 100644 index 000000000..b8d22709a --- /dev/null +++ b/radio/src/targets/horus/tp_gt911.h @@ -0,0 +1,126 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef _FT5X06_H_ +#define _FT5X06_H_ + +#include "opentx.h" + +#define HAS_TOUCH_PANEL() touchGT911Flag == true +#define TOUCH_INT_STATUS() (GPIO_ReadInputDataBit(TOUCH_INT_GPIO, TOUCH_INT_GPIO_PIN)) + +bool touchPanelInit(); +void touchPanelDeInit(); + +extern uint8_t touchGT911Flag; +extern uint8_t TOUCH_SCAN_MODE; +extern uint8_t touchEventFlag; + +uint8_t GT911_WR_Reg(uint16_t reg, uint8_t * buf, uint8_t len); +void GT911_RD_Reg(uint16_t reg, uint8_t * buf, uint8_t len); + + +//GT911 param table +const uint8_t GT911_Cfg[]= // + { + 0x69, //ver 0x68 + 0xE0,0x01, //x 480 480X272 + 0x10,0x01, //y 272 + 0x05, //pass max count + 0x38, //bit4= xy change Int mode + 0x00, + 0x02, //press ct + 0x48, + 0x28,0x0D,0x50,0x32,0x03,0x05,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x18,0x1A,0x1E,0x14,0x8A,0x2A,0x0C, + 0x30,0x38,0x31,0x0D,0x00,0x00,0x02,0xB9,0x03,0x2D, + 0x00,0x00,0x00,0x00,0x00,0x03,0x64,0x32,0x00,0x00, + 0x00,0x1D,0x41,0x94,0xC5,0x02,0x07,0x00,0x00,0x04, + 0xA5,0x1F,0x00,0x94,0x25,0x00,0x88,0x2B,0x00,0x7D, + 0x33,0x00,0x74,0x3C,0x00,0x74,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x18,0x16,0x14,0x12,0x10,0x0E,0x0C,0x0A, + 0x08,0x06,0x04,0x02,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x24,0x22,0x21,0x20,0x1F,0x1E,0x1D,0x1C, + 0x18,0x16,0x13,0x12,0x10,0x0F,0x0A,0x08,0x06,0x04, + 0x02,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + }; + +//I2C +#define GT_CMD_WR 0X28 //write +#define GT_CMD_RD 0X29 //read + +#define SLAVE_Write_Address 0X28 + +//GT9147 +#define GT_CTRL_REG 0X8040 +#define GT_CFGS_REG 0X8047 +#define GT_CHECK_REG 0X80FF +#define GT_PID_REG 0X8140 //ID + +#define GT_GSTID_REG 0X814E // +#define GT_TP1_REG 0X8150 // +#define GT_TP2_REG 0X8158 // +#define GT_TP3_REG 0X8160 // +#define GT_TP4_REG 0X8168 // +#define GT_TP5_REG 0X8170 // + +#define GT911_READ_XY_REG 0x814E +#define GT911_CLEARBUF_REG 0x814E +#define GT911_CONFIG_REG 0x8047 +#define GT911_COMMAND_REG 0x8040 +#define GT911_PRODUCT_ID_REG 0x8140 +#define GT911_VENDOR_ID_REG 0x814A +#define GT911_CONFIG_VERSION_REG 0x8047 +#define GT911_CONFIG_CHECKSUM_REG 0x80FF +#define GT911_FIRMWARE_VERSION_REG 0x8144 + + +typedef struct{ + uint16_t x; + uint16_t y; +}POINT; + +typedef struct{ + uint16_t cnt; + POINT points[5]; +}GT911_POINT_DATA; + +#define TPRST_LOW() do { TOUCH_RST_GPIO->BSRRH = TOUCH_RST_GPIO_PIN; } while(0) +#define TPRST_HIGH() do { TOUCH_RST_GPIO->BSRRL = TOUCH_RST_GPIO_PIN; } while(0) + +#define TPINT_LOW() do { TOUCH_INT_GPIO->BSRRH = TOUCH_INT_GPIO_PIN; } while(0) +#define TPINT_HIGH() do { TOUCH_INT_GPIO->BSRRL = TOUCH_INT_GPIO_PIN; } while(0) + + +#define IIC_SCL_L() do { I2C_GPIO->BSRRH = I2C_SCL_GPIO_PIN; } while(0) +#define IIC_SCL_H() do { I2C_GPIO->BSRRL = I2C_SCL_GPIO_PIN; } while(0) + +#define IIC_SDA_L() do { I2C_GPIO->BSRRH = I2C_SDA_GPIO_PIN; } while(0) +#define IIC_SDA_H() do { I2C_GPIO->BSRRL = I2C_SDA_GPIO_PIN; } while(0) + +#define READ_SDA GPIO_ReadInputDataBit(I2C_GPIO, I2C_SDA_GPIO_PIN) + +#endif // _FT5X06_H_ From dd4f9de2e9c048ad4bc3ae4c52e08f5b094441ff Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 7 Apr 2020 12:48:09 +0200 Subject: [PATCH 216/560] Please local travis (and more) --- radio/src/gui/480x272/radio_hardware.cpp | 2 + radio/src/targets/horus/CMakeLists.txt | 4 +- radio/src/targets/horus/board.cpp | 8 +- radio/src/targets/horus/hal.h | 27 ++-- radio/src/targets/horus/tp_gt911.cpp | 194 +++++++++++++++++++++-- radio/src/targets/horus/tp_gt911.h | 8 +- radio/src/targets/simu/simpgmspace.cpp | 1 + 7 files changed, 215 insertions(+), 29 deletions(-) diff --git a/radio/src/gui/480x272/radio_hardware.cpp b/radio/src/gui/480x272/radio_hardware.cpp index 109a65459..edae5d7f5 100644 --- a/radio/src/gui/480x272/radio_hardware.cpp +++ b/radio/src/gui/480x272/radio_hardware.cpp @@ -428,9 +428,11 @@ bool menuRadioHardware(event_t event) case 1: pushMenu(menuRadioDiagKeys); break; +#if defined(HARDWARE_TOUCH) case 2: pushMenu(menuRadioDiagTouch); break; +#endif } } break; diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index a0cf09cd2..910b43f5f 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -209,7 +209,9 @@ set(TARGET_SRC ) if(HARDWARE_TOUCH) - set(TARGET_SRC ${TARGET_SRC} tp_gt911.cpp) + set(TARGET_SRC ${TARGET_SRC} + tp_gt911.cpp + ) set(GUI_SRC ${GUI_SRC} radio_diagtouch.cpp) add_definitions(-DHARDWARE_TOUCH) endif() diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp index 61a429a70..d88350ba5 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -103,9 +103,11 @@ void boardInit() HAPTIC_RCC_AHB1Periph | INTMODULE_RCC_AHB1Periph | EXTMODULE_RCC_AHB1Periph | - I2C_TOUCH_RCC_AHB1Periph | + I2C_RCC_AHB1Periph | GPS_RCC_AHB1Periph | - SPORT_UPDATE_RCC_AHB1Periph, + SPORT_UPDATE_RCC_AHB1Periph | + TOUCH_INT_RCC_AHB1Periph | + TOUCH_RST_RCC_AHB1Periph, ENABLE); RCC_APB1PeriphClockCmd(ROTARY_ENCODER_RCC_APB1Periph | @@ -119,7 +121,7 @@ void boardInit() AUDIO_RCC_APB1Periph | INTMODULE_RCC_APB1Periph | EXTMODULE_RCC_APB1Periph | - I2C_TOUCH_RCC_APB1Periph | + I2C_RCC_APB1Periph | GPS_RCC_APB1Periph | BACKLIGHT_RCC_APB1Periph, ENABLE); diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index f24b3dda1..bbe1235b0 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -636,21 +636,24 @@ // Touch #if defined(HARDWARE_TOUCH) -#define TOUCH_INT_RCC_AHB1Periph RCC_AHB1Periph_GPIOH -#define TOUCH_INT_GPIO GPIOH -#define TOUCH_INT_GPIO_PIN GPIO_Pin_2 + #define TOUCH_INT_RCC_AHB1Periph RCC_AHB1Periph_GPIOH + #define TOUCH_INT_GPIO GPIOH + #define TOUCH_INT_GPIO_PIN GPIO_Pin_2 // PH.02 -#define TOUCH_RST_RCC_AHB1Periph RCC_AHB1Periph_GPIOF -#define TOUCH_RST_GPIO GPIOF -#define TOUCH_RST_GPIO_PIN GPIO_Pin_10 + #define TOUCH_RST_RCC_AHB1Periph RCC_AHB1Periph_GPIOF + #define TOUCH_RST_GPIO GPIOF + #define TOUCH_RST_GPIO_PIN GPIO_Pin_10 // PF.10 -#define TOUCH_INT_EXTI_LINE1 EXTI_Line2 -#define TOUCH_INT_EXTI_IRQn1 EXTI2_IRQn -#define TOUCH_INT_EXTI_IRQHandler1 EXTI2_IRQHandler -#define TOUCH_INT_EXTI_PortSource EXTI_PortSourceGPIOH -#define TOUCH_INT_EXTI_PinSource1 EXTI_PinSource2 + #define TOUCH_INT_EXTI_LINE1 EXTI_Line2 + #define TOUCH_INT_EXTI_IRQn1 EXTI2_IRQn + #define TOUCH_INT_EXTI_IRQHandler1 EXTI2_IRQHandler + #define TOUCH_INT_EXTI_PortSource EXTI_PortSourceGPIOH + #define TOUCH_INT_EXTI_PinSource1 EXTI_PinSource2 -#define TOUCH_INT_STAUS() (GPIO_ReadInputDataBit(TOUCH_INT_GPIO, TOUCH_INT_GPIO_PIN)) + #define TOUCH_INT_STATUS() (GPIO_ReadInputDataBit(TOUCH_INT_GPIO, TOUCH_INT_GPIO_PIN)) +#else + #define TOUCH_INT_RCC_AHB1Periph 0 + #define TOUCH_RST_RCC_AHB1Periph 0 #endif // I2C Bus diff --git a/radio/src/targets/horus/tp_gt911.cpp b/radio/src/targets/horus/tp_gt911.cpp index 114329996..68b4630dc 100644 --- a/radio/src/targets/horus/tp_gt911.cpp +++ b/radio/src/targets/horus/tp_gt911.cpp @@ -38,20 +38,20 @@ void GT911_INT_Change(void) uint8_t GT911_Send_Cfg(uint8_t mode) { - u8 buf[2]; - u8 i = 0; + uint8_t buf[2]; + uint8_t i = 0; buf[0] = 0; buf[1] = mode; // for (i = 0; i < sizeof(GT911_Cfg); i++) buf[0] += GT911_Cfg[i];//check sum buf[0] = (~buf[0]) + 1; - GT911_WR_Reg(GT_CFGS_REG, (u8 *) GT911_Cfg, sizeof(GT911_Cfg));// + GT911_WR_Reg(GT_CFGS_REG, (uint8_t *) GT911_Cfg, sizeof(GT911_Cfg));// GT911_WR_Reg(GT_CHECK_REG, buf, 2);//write checksum return 0; } -static void IIC_Config(void) +static void I2C_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; //I2C_InitTypeDef I2C_InitStructure; @@ -136,6 +136,182 @@ static void TOUCH_AF_GPIOConfig(void) GPIO_ResetBits(TOUCH_INT_GPIO, TOUCH_INT_GPIO_PIN); } +void SDA_IN(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + //RCC_APB1PeriphClockCmd(RCC_APB1Periph_GPIOB, ENABLE); + //RCC_AHB1PeriphClockCmd(I2C_RCC_AHB1Periph, ENABLE); + + GPIO_InitStructure.GPIO_Pin = I2C_SDA_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(I2C_GPIO, &GPIO_InitStructure); +} + +void SDA_OUT(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + //RCC_APB1PeriphClockCmd(RCC_APB1Periph_GPIOB, ENABLE); + //RCC_AHB1PeriphClockCmd(I2C_RCC_AHB1Periph, ENABLE); + + GPIO_InitStructure.GPIO_Pin = I2C_SDA_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(I2C_GPIO, &GPIO_InitStructure); +} + +void I2C_Start(void) +{ + SDA_OUT(); + I2C_SDA_H(); + I2C_SCL_H(); + delay_us(2); + I2C_SDA_L();//START:when CLK is high,DATA change form high to low + delay_us(2); + I2C_SCL_L();// + delay_us(2); +} + +void I2C_Stop(void) +{ + SDA_OUT(); + I2C_SCL_L(); + I2C_SDA_L();//STOP:when CLK is high DATA change form low to high + delay_us(2); + I2C_SCL_H(); + I2C_SDA_H();// + delay_us(2); +} + +uint8_t I2C_Wait_Ack(void) +{ + uint8_t ucErrTime = 0; + SDA_IN(); // + I2C_SDA_H(); + delay_us(2); + //I2C_SCL_L();delay_us(6); + I2C_SCL_H();//delay_us(6); + while (READ_SDA) { + ucErrTime++; + if (ucErrTime > 166) { + I2C_Stop(); + return 1; + } + delay_us(1); + } + I2C_SDA_L(); + I2C_SCL_L();// + return 0; +} + +void I2C_Ack(void) +{ + I2C_SCL_L(); + SDA_OUT(); + I2C_SDA_L(); + delay_us(2); + I2C_SCL_H(); + delay_us(2); + I2C_SCL_L(); +} + +void I2C_NAck(void) +{ + I2C_SCL_L(); + SDA_OUT(); + I2C_SDA_H(); + delay_us(2); + I2C_SCL_H(); + delay_us(2); + I2C_SCL_L(); +} + +void I2C_Send_Byte(uint8_t txd) +{ + uint8_t t; + + SDA_OUT(); + I2C_SCL_L();// + for (t = 0; t < 8; t++) { + if ((txd & 0x80) >> 7) + I2C_SDA_H(); + else + I2C_SDA_L(); + txd <<= 1; + delay_us(1); + I2C_SCL_H(); + delay_us(2); + I2C_SCL_L(); + delay_us(1); + } +} + +uint8_t I2C_Read_Byte(unsigned char ack) +{ + unsigned char i, receive = 0; + + SDA_IN(); + for (i = 0; i < 8; i++) { + I2C_SCL_L(); + delay_us(2); + I2C_SCL_H(); + receive <<= 1; + if (READ_SDA)receive++; + delay_us(1); + } + if (!ack) + I2C_NAck(); + else + I2C_Ack(); + return receive; +} + +uint8_t GT911_WR_Reg(uint16_t reg, uint8_t * buf, uint8_t len) +{ + { + uint8_t i; + uint8_t ret = 0; + + I2C_Start(); + I2C_Send_Byte(GT_CMD_WR); //send cmd + I2C_Wait_Ack(); + I2C_Send_Byte(reg >> 8); //send hi + I2C_Wait_Ack(); + I2C_Send_Byte(reg & 0XFF); //send low + I2C_Wait_Ack(); + for (i = 0; i < len; i++) { + I2C_Send_Byte(buf[i]); + ret = I2C_Wait_Ack(); + if (ret)break; + } + I2C_Stop(); + + return ret; + } +} + +void GT911_RD_Reg(u16 reg, uint8_t * buf, uint8_t len) +{ + uint8_t i; + + //I2C_GenerateSTART(I2C1, ENABLE); + I2C_Start(); + I2C_Send_Byte(GT_CMD_WR); //send addr + I2C_Wait_Ack(); + I2C_Send_Byte(reg >> 8); //send hi + I2C_Wait_Ack(); + I2C_Send_Byte(reg & 0XFF); //send low + I2C_Wait_Ack(); + I2C_Start(); + I2C_Send_Byte(GT_CMD_RD); //send rd + I2C_Wait_Ack(); + + for (i = 0; i < len; i++) { + buf[i] = I2C_Read_Byte(i == (len - 1) ? 0 : 1); //send data + } + I2C_Stop(); +} + void touchPanelDeInit(void) { TOUCH_AF_ExtiStop(); @@ -148,21 +324,21 @@ bool touchPanelInit(void) TRACE("Touchpanel init start ..."); TOUCH_AF_GPIOConfig(); //SET RST=OUT INT=OUT INT=LOW - IIC_Config(); + I2C_Config(); TPRST_LOW(); TPINT_HIGH(); - delay_us(200); //DELAY 200US + delay_us(200); TPRST_HIGH(); - delay_ms(6); //DELAY 6MS + delay_ms(6); TPINT_LOW(); - delay_ms(55); //DELAY 55MS + delay_ms(55); GT911_INT_Change(); //Set INT INPUT INT=LOW - delay_ms(50); //DELAY 55MS + delay_ms(50); GT911_RD_Reg(GT_PID_REG, tmp, 4); diff --git a/radio/src/targets/horus/tp_gt911.h b/radio/src/targets/horus/tp_gt911.h index b8d22709a..64dfac5d6 100644 --- a/radio/src/targets/horus/tp_gt911.h +++ b/radio/src/targets/horus/tp_gt911.h @@ -115,11 +115,11 @@ typedef struct{ #define TPINT_HIGH() do { TOUCH_INT_GPIO->BSRRL = TOUCH_INT_GPIO_PIN; } while(0) -#define IIC_SCL_L() do { I2C_GPIO->BSRRH = I2C_SCL_GPIO_PIN; } while(0) -#define IIC_SCL_H() do { I2C_GPIO->BSRRL = I2C_SCL_GPIO_PIN; } while(0) +#define I2C_SCL_L() do { I2C_GPIO->BSRRH = I2C_SCL_GPIO_PIN; } while(0) +#define I2C_SCL_H() do { I2C_GPIO->BSRRL = I2C_SCL_GPIO_PIN; } while(0) -#define IIC_SDA_L() do { I2C_GPIO->BSRRH = I2C_SDA_GPIO_PIN; } while(0) -#define IIC_SDA_H() do { I2C_GPIO->BSRRL = I2C_SDA_GPIO_PIN; } while(0) +#define I2C_SDA_L() do { I2C_GPIO->BSRRH = I2C_SDA_GPIO_PIN; } while(0) +#define I2C_SDA_H() do { I2C_GPIO->BSRRL = I2C_SDA_GPIO_PIN; } while(0) #define READ_SDA GPIO_ReadInputDataBit(I2C_GPIO, I2C_SDA_GPIO_PIN) diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index 1aadf6e30..73a4948ca 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -580,6 +580,7 @@ int usbPlugged() { return false; } int getSelectedUsbMode() { return USB_JOYSTICK_MODE; } void setSelectedUsbMode(int mode) {} void delay_ms(uint32_t ms) { } +void delay_us(uint16_t us) { } // GPIO fake functions void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF) { } From 91ea30451e2bbe49d774a5ab608164451f239157 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 7 Apr 2020 15:10:25 +0200 Subject: [PATCH 217/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 40825416c..128250e63 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1711,3 +1711,4 @@ Udo Kastenholz Julio Margarido Uwe Muendelein James Jewitt +Daniel Ferreira From 4ffb1a34dc424f6c6bea5cd948b7769ec96b1391 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 9 Apr 2020 10:19:49 +0200 Subject: [PATCH 218/560] Fix T12 DMA conflict (#7505) --- .../arm/stm32/intmodule_serial_driver.cpp | 32 ++++++++++++++++++- radio/src/targets/taranis/hal.h | 5 --- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp index e2f01f586..56b71d97c 100755 --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -21,12 +21,18 @@ #include "opentx.h" ModuleFifo intmoduleFifo; +#if !defined(INTMODULE_DMA_STREAM) +uint8_t * intmoduleTxBufferData; +uint8_t intmoduleTxBufferRemaining; +#endif void intmoduleStop() { GPIO_ResetBits(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN); +#if defined(INTMODULE_DMA_STREAM) INTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA +#endif GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = INTMODULE_TX_GPIO_PIN | INTMODULE_RX_GPIO_PIN; @@ -57,7 +63,11 @@ void intmoduleSerialStart(uint32_t baudrate, uint8_t rxEnable, uint16_t parity, INTERNAL_MODULE_ON(); NVIC_InitTypeDef NVIC_InitStructure; +#if defined(INTMODULE_DMA_STREAM) NVIC_InitStructure.NVIC_IRQChannel = INTMODULE_DMA_STREAM_IRQ; +#else + NVIC_InitStructure.NVIC_IRQChannel = INTMODULE_USART_IRQn; +#endif NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /* Not used as 4 bits are used for the pre-emption priority. */; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; @@ -118,8 +128,22 @@ void intmoduleTimerStart(uint32_t periodMs) #define USART_FLAG_ERRORS (USART_FLAG_ORE | USART_FLAG_NE | USART_FLAG_FE | USART_FLAG_PE) extern "C" void INTMODULE_USART_IRQHandler(void) { - uint32_t status = INTMODULE_USART->SR; +#if !defined(INTMODULE_DMA_STREAM) + // Send + if (USART_GetITStatus(INTMODULE_USART, USART_IT_TXE) != RESET) { + if (intmoduleTxBufferRemaining) { + USART_SendData(INTMODULE_USART, intmoduleTxBufferData[0]); + intmoduleTxBufferData++; + intmoduleTxBufferRemaining--; + } + else { + USART_ITConfig(INTMODULE_USART, USART_IT_TXE, DISABLE); + } + } +#endif + // Receive + uint32_t status = INTMODULE_USART->SR; while (status & (USART_FLAG_RXNE | USART_FLAG_ERRORS)) { uint8_t data = INTMODULE_USART->DR; if (status & USART_FLAG_ERRORS) { @@ -143,6 +167,7 @@ void intmoduleSendBuffer(const uint8_t * data, uint8_t size) if (size == 0) return; +#if defined(INTMODULE_DMA_STREAM) DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(INTMODULE_DMA_STREAM); DMA_InitStructure.DMA_Channel = INTMODULE_DMA_CHANNEL; @@ -163,6 +188,11 @@ void intmoduleSendBuffer(const uint8_t * data, uint8_t size) DMA_Init(INTMODULE_DMA_STREAM, &DMA_InitStructure); DMA_Cmd(INTMODULE_DMA_STREAM, ENABLE); USART_DMACmd(INTMODULE_USART, USART_DMAReq_Tx, ENABLE); +#else + intmoduleTxBufferData = (uint8_t *)data; + intmoduleTxBufferRemaining = size; + USART_ITConfig(INTMODULE_USART, USART_IT_TXE, ENABLE); +#endif } void intmoduleSendNextFrame() diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index b8d1c7177..b55226edf 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -1078,11 +1078,6 @@ #define INTMODULE_GPIO_AF GPIO_AF_USART3 #define INTMODULE_USART_IRQn USART3_IRQn #define INTMODULE_USART_IRQHandler USART3_IRQHandler - #define INTMODULE_DMA_STREAM DMA1_Stream3 - #define INTMODULE_DMA_STREAM_IRQ DMA1_Stream3_IRQn - #define INTMODULE_DMA_STREAM_IRQHandler DMA1_Stream3_IRQHandler - #define INTMODULE_DMA_FLAG_TC DMA_IT_TCIF3 - #define INTMODULE_DMA_CHANNEL DMA_Channel_4 #define INTMODULE_RCC_APB1Periph RCC_APB1Periph_TIM2 #define INTMODULE_RCC_APB2Periph RCC_APB1Periph_USART3 #define INTMODULE_TIMER TIM2 From 352b33e12d806766575c6a730bcbb8b35d3c0dc9 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 9 Apr 2020 10:21:35 +0200 Subject: [PATCH 219/560] Add LUA units to Taranis too (#7489) --- radio/src/lua/api_general.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 214e2f4e1..ff7b96da4 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -1875,8 +1875,6 @@ const luaR_value_entry opentxConstants[] = { { "PLAY_BACKGROUND", PLAY_BACKGROUND }, { "TIMEHOUR", TIMEHOUR }, -#if defined(PCBHORUS) - // Adding the unit consts for the set Telemetry function adds about 1k of flash usage {"UNIT_RAW", UNIT_RAW }, {"UNIT_VOLTS", UNIT_VOLTS }, {"UNIT_AMPS", UNIT_AMPS }, @@ -1910,6 +1908,6 @@ const luaR_value_entry opentxConstants[] = { {"UNIT_GPS", UNIT_GPS}, {"UNIT_BITFIELD", UNIT_BITFIELD}, {"UNIT_TEXT", UNIT_TEXT}, -#endif + { nullptr, 0 } /* sentinel */ }; From 63c5e7fa3da61ce2043a5a2f9cec7a60d877a223 Mon Sep 17 00:00:00 2001 From: RealTadango Date: Thu, 9 Apr 2020 10:22:29 +0200 Subject: [PATCH 220/560] Missing leading 0 for date format (#7485) --- radio/src/gui/480x272/lcd.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/radio/src/gui/480x272/lcd.cpp b/radio/src/gui/480x272/lcd.cpp index f139eaa5c..6659e386b 100644 --- a/radio/src/gui/480x272/lcd.cpp +++ b/radio/src/gui/480x272/lcd.cpp @@ -339,9 +339,9 @@ void drawDate(coord_t x, coord_t y, TelemetryItem & telemetryItem, LcdFlags att) att &= ~FONTSIZE_MASK; lcdDrawNumber(x, y, telemetryItem.datetime.day, att|LEADING0|LEFT, 2); lcdDrawChar(lcdNextPos-1, y, '-', att); - lcdDrawNumber(lcdNextPos-1, y, telemetryItem.datetime.month, att|LEFT, 2); + lcdDrawNumber(lcdNextPos-1, y, telemetryItem.datetime.month, att|LEADING0|LEFT, 2); lcdDrawChar(lcdNextPos-1, y, '-', att); - lcdDrawNumber(lcdNextPos-1, y, telemetryItem.datetime.year-2000, att|LEFT); + lcdDrawNumber(lcdNextPos-1, y, telemetryItem.datetime.year-2000, att|LEADING0|LEFT); y += FH; lcdDrawNumber(x, y, telemetryItem.datetime.hour, att|LEADING0|LEFT, 2); lcdDrawChar(lcdNextPos, y, ':', att); @@ -352,9 +352,9 @@ void drawDate(coord_t x, coord_t y, TelemetryItem & telemetryItem, LcdFlags att) else { lcdDrawNumber(x, y, telemetryItem.datetime.day, att|LEADING0|LEFT, 2); lcdDrawChar(lcdNextPos-1, y, '-', att); - lcdDrawNumber(lcdNextPos, y, telemetryItem.datetime.month, att|LEFT, 2); + lcdDrawNumber(lcdNextPos, y, telemetryItem.datetime.month, att|LEADING0|LEFT, 2); lcdDrawChar(lcdNextPos-1, y, '-', att); - lcdDrawNumber(lcdNextPos, y, telemetryItem.datetime.year-2000, att|LEFT); + lcdDrawNumber(lcdNextPos, y, telemetryItem.datetime.year-2000, att|LEADING0|LEFT); lcdDrawNumber(lcdNextPos+11, y, telemetryItem.datetime.hour, att|LEADING0|LEFT, 2); lcdDrawChar(lcdNextPos, y, ':', att); lcdDrawNumber(lcdNextPos, y, telemetryItem.datetime.min, att|LEADING0|LEFT, 2); From 2e1237cc0e7bf487364d6dc1bf738ec95f4e1060 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 9 Apr 2020 10:27:50 +0200 Subject: [PATCH 221/560] Improve popupConfirmation (#7481) --- .../horus/SCRIPTS/TOOLS/CROSSFIRE/device.lua | 2 +- radio/src/lua/api_general.cpp | 24 +++++++++++++++---- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/radio/sdcard/horus/SCRIPTS/TOOLS/CROSSFIRE/device.lua b/radio/sdcard/horus/SCRIPTS/TOOLS/CROSSFIRE/device.lua index d592677db..3e4c2e4eb 100644 --- a/radio/sdcard/horus/SCRIPTS/TOOLS/CROSSFIRE/device.lua +++ b/radio/sdcard/horus/SCRIPTS/TOOLS/CROSSFIRE/device.lua @@ -489,7 +489,7 @@ end local function runPopupPage(event) local result if fieldPopup.status == 3 then - result = popupConfirmation(fieldPopup.info, event) + result = popupConfirmation("Confirmation", fieldPopup.info, event) else result = popupWarning(fieldPopup.info, event) end diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index ff7b96da4..b750c7f16 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -1206,11 +1206,14 @@ static int luaPopupWarning(lua_State * L) } /*luadoc -@function popupConfirmation(title, event) +@function popupConfirmation(title, event) deprecated, please replace by +@function popupConfirmation(title, message, event) Raises a pop-up on screen that asks for confirmation -@param title (string) text to display +@param title (string) title to display + +@param message (string) text to display @param event (number) the event variable that is passed in from the Run function (key pressed) @@ -1219,13 +1222,24 @@ Run function (key pressed) @notice Use only from stand-alone and telemetry scripts. -@status current Introduced in 2.2.0 +@status current Introduced in 2.2.0, changed to (title, message, event) in 2.3.8 */ static int luaPopupConfirmation(lua_State * L) { - event_t event = luaL_checkinteger(L, 2); - warningText = luaL_checkstring(L, 1); warningType = WARNING_TYPE_CONFIRM; + event_t event; + + if (lua_isnone(L, 3)) { + // only two args: deprecated mode + warningText = luaL_checkstring(L, 1); + event = luaL_checkinteger(L, 2); + } + else { + warningText = luaL_checkstring(L, 1); + warningInfoText = luaL_checkstring(L, 2); + event = luaL_optinteger(L, 3, 0); + } + runPopupWarning(event); if (!warningText) { lua_pushstring(L, warningResult ? "OK" : "CANCEL"); From 41f64a9a2e1411ec9f675c79929bdc63f23d2fa5 Mon Sep 17 00:00:00 2001 From: Martin <5703553+pre-martin@users.noreply.github.com> Date: Thu, 9 Apr 2020 10:29:00 +0200 Subject: [PATCH 222/560] Adds a page to the windows installer to select the location of the start menu entries. (#7484) --- companion/targets/windows/companion.nsi.in | 83 +++++++++++++++++++++- 1 file changed, 82 insertions(+), 1 deletion(-) diff --git a/companion/targets/windows/companion.nsi.in b/companion/targets/windows/companion.nsi.in index 1a54e4b4d..173edec97 100644 --- a/companion/targets/windows/companion.nsi.in +++ b/companion/targets/windows/companion.nsi.in @@ -6,6 +6,7 @@ ;Include Modern UI !include "MUI2.nsh" + !include "nsDialogs.nsh" !include "@CMAKE_CURRENT_SOURCE_DIR@\..\targets\windows\FileAssociation.nsh" ;-------------------------------- @@ -32,6 +33,10 @@ ;Variables Var StartMenuFolder + Var StartMenuLocationDialog + Var StartMenuLocationRadioCurrent + Var StartMenuLocationRadioAll + Var StartMenuLocationValue ; "current_user" or "all_users" ;-------------------------------- ;Interface Settings @@ -68,9 +73,11 @@ !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU" !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\OpenTX\Companion @VERSION_FAMILY@" !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" - !insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder + ;Start Menu Folder for current user or all users? + Page custom StartMenuLocationCreator StartMenuLocationLeave + !insertmacro MUI_PAGE_INSTFILES # These indented statements modify settings for MUI_PAGE_FINISH @@ -127,10 +134,14 @@ Section "OpenTX Companion @VERSION_FAMILY@" SecDummy !insertmacro MUI_STARTMENU_WRITE_BEGIN Application ;Create shortcuts + ${If} $StartMenuLocationValue == "all_users" + SetShellVarContext all + ${Endif} CreateDirectory "$SMPROGRAMS\$StartMenuFolder" CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Companion @VERSION_FAMILY@.lnk" "$INSTDIR\companion.exe" CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Firmware Simulator @VERSION_FAMILY@.lnk" "$INSTDIR\simulator.exe" CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Uninstall Companion @VERSION_FAMILY@.lnk" "$INSTDIR\Uninstall.exe" + SetShellVarContext current !insertmacro MUI_STARTMENU_WRITE_END @@ -142,6 +153,14 @@ SectionEnd ;Language strings LangString DESC_SecDummy ${LANG_ENGLISH} "Models and settings editor for OpenTX" LangString DESC_SecDummy ${LANG_FRENCH} "Editeur de r�glages et mod�les pour OpenTX" + LangString SML_SubTitle ${LANG_ENGLISH} "Choose a location for the Start Menu shortcuts" + LangString SML_SubTitle ${LANG_FRENCH} "Choisissez un emplacement pour les raccourcis de l'application" + LangString SML_MainLabel ${LANG_ENGLISH} "Create start menu shortcuts for:" + LangString SML_MainLabel ${LANG_FRENCH} "Emplacement pour les raccourcis de l'application:" + LangString SML_RadioCurrent ${LANG_ENGLISH} "Current user only" + LangString SML_RadioCurrent ${LANG_FRENCH} "Utilisateur actuel" + LangString SML_RadioAll ${LANG_ENGLISH} "All users" + LangString SML_RadioAll ${LANG_FRENCH} "Tous les utilisateurs" ;Assign language strings to sections !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN @@ -204,6 +223,13 @@ Section "un.OpenTX Companion @VERSION_FAMILY@" !insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuFolder + ; Always remove start menu folder for both locations: current user and all users + SetShellVarContext all + Delete "$SMPROGRAMS\$StartMenuFolder\Companion @VERSION_FAMILY@.lnk" + Delete "$SMPROGRAMS\$StartMenuFolder\Firmware Simulator @VERSION_FAMILY@.lnk" + Delete "$SMPROGRAMS\$StartMenuFolder\Uninstall Companion @VERSION_FAMILY@.lnk" + RMDir "$SMPROGRAMS\$StartMenuFolder" + SetShellVarContext current Delete "$SMPROGRAMS\$StartMenuFolder\Companion @VERSION_FAMILY@.lnk" Delete "$SMPROGRAMS\$StartMenuFolder\Firmware Simulator @VERSION_FAMILY@.lnk" Delete "$SMPROGRAMS\$StartMenuFolder\Uninstall Companion @VERSION_FAMILY@.lnk" @@ -219,3 +245,58 @@ SectionEnd Function LaunchLink ExecShell "" "$INSTDIR\companion.exe" FunctionEnd + + +; Custom page with radio buttons, if the start menu entries shall be created +; for the current user or for all users. +Function StartMenuLocationCreator + ; Set default value if not already set. Do this before we might "abort" this page. + ${If} $StartMenuLocationValue == "" + StrCpy $StartMenuLocationValue "current_user" + ${EndIf} + + ; If the folder starts with >, the user has chosen not to create a shortcut (see NSIS/StartMenu.nsh) + StrCpy $R0 $StartMenuFolder 1 + ${If} $R0 == ">" + Abort + ${EndIf} + + !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_TEXT_STARTMENU_TITLE) $(SML_SubTitle) + + nsDialogs::Create 1018 + Pop $StartMenuLocationDialog + + ${If} $StartMenuLocationDialog == error + Abort + ${EndIf} + + ${NSD_CreateLabel} 0u 0u 100% 12u $(SML_MainLabel) + Pop $R0 + + ${NSD_CreateRadioButton} 8u 20u 100% 12u $(SML_RadioCurrent) + Pop $StartMenuLocationRadioCurrent + ${NSD_AddStyle} $StartMenuLocationRadioCurrent ${WS_GROUP} + + ${NSD_CreateRadioButton} 8u 40u 100% 12u $(SML_RadioAll) + Pop $StartMenuLocationRadioAll + + ${If} $StartMenuLocationValue == "all_users" + ${NSD_SetState} $StartMenuLocationRadioAll ${BST_CHECKED} + ${Else} + ${NSD_SetState} $StartMenuLocationRadioCurrent ${BST_CHECKED} + ${EndIf} + + ${NSD_OnBack} StartMenuLocationLeave + + nsDialogs::Show +FunctionEnd + +; Converts the radio button state back into a value for "StartMenuLocationValue" +Function StartMenuLocationLeave + ${NSD_GetState} $StartMenuLocationRadioAll $R0 + ${If} $R0 == ${BST_CHECKED} + StrCpy $StartMenuLocationValue "all_users" + ${Else} + StrCpy $StartMenuLocationValue "current_user" + ${Endif} +FunctionEnd From 5cf4e9be4e68d62dbde8887331252903d9265d3e Mon Sep 17 00:00:00 2001 From: Neil Horne Date: Thu, 9 Apr 2020 18:32:57 +1000 Subject: [PATCH 223/560] Add basic context menu to telemetry sensors in companion model edit (#7500) --- companion/src/modeledit/telemetry.cpp | 133 +++++++++- companion/src/modeledit/telemetry.h | 19 +- companion/src/modeledit/telemetry_sensor.ui | 44 ++-- companion/src/shared/CMakeLists.txt | 1 + companion/src/shared/autoprecisioncombobox.h | 257 +++++++++++++++++++ companion/src/shared/genericpanel.h | 1 + 6 files changed, 423 insertions(+), 32 deletions(-) create mode 100644 companion/src/shared/autoprecisioncombobox.h diff --git a/companion/src/modeledit/telemetry.cpp b/companion/src/modeledit/telemetry.cpp index 68be10638..83565c03e 100644 --- a/companion/src/modeledit/telemetry.cpp +++ b/companion/src/modeledit/telemetry.cpp @@ -592,13 +592,28 @@ void TelemetryCustomScreen::barTimeChanged() } } -TelemetrySensorPanel::TelemetrySensorPanel(QWidget *parent, SensorData & sensor, ModelData & model, GeneralSettings & generalSettings, Firmware * firmware): +/******************************************************/ + +TelemetrySensorPanel::TelemetrySensorPanel(QWidget *parent, SensorData & sensor, int sensorIndex, ModelData & model, GeneralSettings & generalSettings, Firmware * firmware): ModelPanel(parent, model, generalSettings, firmware), ui(new Ui::TelemetrySensor), sensor(sensor), - lock(false) + lock(false), + sensorIndex(sensorIndex), + selectedIndex(0) { ui->setupUi(this); + ui->numLabel->setText(tr("TELE%1").arg(sensorIndex + 1)); + ui->numLabel->setProperty("index", sensorIndex); + ui->numLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + QFontMetrics *f = new QFontMetrics(QFont()); + QSize sz; + sz = f->size(Qt::TextSingleLine, "TELE00"); + ui->numLabel->setMinimumWidth(sz.width()); + ui->numLabel->setContextMenuPolicy(Qt::CustomContextMenu); + ui->numLabel->setToolTip(tr("Popup menu available")); + ui->numLabel->setMouseTracking(true); + connect(ui->numLabel, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(on_customContextMenuRequested(QPoint))); ui->id->setField(sensor.id, this); ui->instance->setField(sensor.instance, this); ui->ratio->setField(sensor.ratio, this); @@ -613,7 +628,7 @@ TelemetrySensorPanel::TelemetrySensorPanel(QWidget *parent, SensorData & sensor, ui->ampsSensor->setField(sensor.amps, this); ui->cellsSensor->setField(sensor.source, this); ui->cellsIndex->addItem(tr("Lowest"), SensorData::TELEM_CELL_INDEX_LOWEST); - for (int i=1; i<=6; i++) + for (int i = 1; i <= 6; i++) ui->cellsIndex->addItem(tr("Cell %1").arg(i), i); ui->cellsIndex->addItem(tr("Highest"), SensorData::TELEM_CELL_INDEX_HIGHEST); ui->cellsIndex->addItem(tr("Delta"), SensorData::TELEM_CELL_INDEX_DELTA); @@ -622,6 +637,7 @@ TelemetrySensorPanel::TelemetrySensorPanel(QWidget *parent, SensorData & sensor, ui->source2->setField(sensor.sources[1], this); ui->source3->setField(sensor.sources[2], this); ui->source4->setField(sensor.sources[3], this); + ui->prec->setField(sensor.prec, 0, 2, false, "", this); update(); } @@ -645,7 +661,21 @@ void TelemetrySensorPanel::update() ui->name->setText(sensor.label); ui->type->setCurrentIndex(sensor.type); ui->unit->setCurrentIndex(sensor.unit); - ui->prec->setValue(sensor.prec); + ui->id->updateValue(); + ui->instance->updateValue(); + ui->ratio->updateValue(); + ui->offset->updateValue(); + ui->autoOffset->updateValue(); + ui->filter->updateValue(); + ui->logs->updateValue(); + ui->persistent->updateValue(); + ui->onlyPositive->updateValue(); + ui->gpsSensor->updateValue(); + ui->altSensor->updateValue(); + ui->ampsSensor->updateValue(); + ui->cellsSensor->updateValue(); + ui->cellsIndex->updateValue(); + ui->prec->updateValue(); if (sensor.type == SensorData::TELEM_TYPE_CALCULATED) { sensor.updateUnit(); @@ -825,15 +855,85 @@ void TelemetrySensorPanel::on_unit_currentIndexChanged(int index) } } -void TelemetrySensorPanel::on_prec_valueChanged(double value) +void TelemetrySensorPanel::on_prec_valueChanged() { if (!lock) { - sensor.prec = value; + update(); + } +} + +void TelemetrySensorPanel::on_customContextMenuRequested(QPoint pos) +{ + QLabel *label = (QLabel *)sender(); + selectedIndex = label->property("index").toInt(); + QPoint globalPos = label->mapToGlobal(pos); + + QMenu contextMenu; + contextMenu.addAction(CompanionIcon("copy.png"), tr("Copy"),this,SLOT(cmCopy())); + contextMenu.addAction(CompanionIcon("cut.png"), tr("Cut"),this,SLOT(cmCut())); + contextMenu.addAction(CompanionIcon("paste.png"), tr("Paste"),this,SLOT(cmPaste()))->setEnabled(hasClipboardData()); + contextMenu.addAction(CompanionIcon("clear.png"), tr("Clear"),this,SLOT(cmClear())); + contextMenu.addSeparator(); + contextMenu.addAction(CompanionIcon("clear.png"), tr("Clear All"),this,SLOT(cmClearAll())); + + contextMenu.exec(globalPos); +} + +bool TelemetrySensorPanel::hasClipboardData(QByteArray * data) const +{ + const QClipboard * clipboard = QApplication::clipboard(); + const QMimeData * mimeData = clipboard->mimeData(); + if (mimeData->hasFormat(MIMETYPE_TELE_SENSOR)) { + if (data) + data->append(mimeData->data(MIMETYPE_TELE_SENSOR)); + return true; + } + return false; +} + +void TelemetrySensorPanel::cmCopy() +{ + QByteArray data; + data.append((char*)&sensor, sizeof(SensorData)); + QMimeData *mimeData = new QMimeData; + mimeData->setData(MIMETYPE_TELE_SENSOR, data); + QApplication::clipboard()->setMimeData(mimeData, QClipboard::Clipboard); +} + +void TelemetrySensorPanel::cmCut() +{ + cmCopy(); + cmClear(); +} + +void TelemetrySensorPanel::cmPaste() +{ + QByteArray data; + if (hasClipboardData(&data)) { + memcpy(&sensor, data.constData(), sizeof(SensorData)); emit dataModified(); emit modified(); } } +void TelemetrySensorPanel::cmClear() +{ + if (QMessageBox::question(this, CPN_STR_APP_NAME, tr("Clear Telemetry Sensor. Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) + return; + + sensor.clear(); + emit dataModified(); + emit modified(); +} + +void TelemetrySensorPanel::cmClearAll() +{ + if (QMessageBox::question(this, CPN_STR_APP_NAME, tr("Clear all Telemetry Sensors. Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) + return; + + emit clearAllSensors(); +} + /******************************************************/ TelemetryPanel::TelemetryPanel(QWidget *parent, ModelData & model, GeneralSettings & generalSettings, Firmware * firmware): @@ -851,12 +951,13 @@ TelemetryPanel::TelemetryPanel(QWidget *parent, ModelData & model, GeneralSettin ui->varioCenterSilent->setField(model.frsky.varioCenterSilent, this); ui->A1GB->hide(); ui->A2GB->hide(); - for (unsigned i=0; isensorsLayout->addWidget(panel); sensorPanels[i] = panel; connect(panel, SIGNAL(dataModified()), this, SLOT(update())); connect(panel, SIGNAL(modified()), this, SLOT(onModified())); + connect(panel, SIGNAL(clearAllSensors()), this, SLOT(on_clearAllSensors())); } } else { @@ -869,7 +970,7 @@ TelemetryPanel::TelemetryPanel(QWidget *parent, ModelData & model, GeneralSettin ui->A2Layout->addWidget(analogs[1]); connect(analogs[1], SIGNAL(modified()), this, SLOT(onModified())); } - + if (IS_TARANIS_X9(firmware->getBoard())) { ui->voltsSource->setField(model.frsky.voltsSource, this); ui->altitudeSource->setField(model.frsky.altitudeSource, this); @@ -881,7 +982,7 @@ TelemetryPanel::TelemetryPanel(QWidget *parent, ModelData & model, GeneralSettin RawSourceFilterItemModel * srcModel = (new RawSourceFilterItemModel(&generalSettings, &model, this)); connect(this, &TelemetryPanel::updated, srcModel, &RawSourceFilterItemModel::update); - for (int i=0; igetCapability(TelemetryCustomScreens); i++) { + for (int i = 0; i < firmware->getCapability(TelemetryCustomScreens); i++) { TelemetryCustomScreen * tab = new TelemetryCustomScreen(this, model, model.frsky.screens[i], generalSettings, firmware, srcModel); ui->customScreens->addTab(tab, tr("Telemetry screen %1").arg(i+1)); telemetryCustomScreens[i] = tab; @@ -963,7 +1064,7 @@ void TelemetryPanel::setup() ui->rssiSourceCB->setField(model->rssiSource, this); ui->rssiSourceCB->show(); populateTelemetrySourcesComboBox(ui->rssiSourceCB, model, false); - + ui->rssiAlarmWarningCB->hide(); ui->rssiAlarmCriticalCB->hide(); ui->rssiAlarmWarningLabel->setText(tr("Low Alarm")); @@ -1198,3 +1299,13 @@ void TelemetryPanel::on_mahCount_ChkB_toggled(bool checked) ui->mahCount_SB->setDisabled(!checked); emit modified(); } + +void TelemetryPanel::on_clearAllSensors() +{ + for (int i = 0; i < CPN_MAX_SENSORS; i++) { + model->sensorData[i].clear(); + } + + update(); + emit modified(); +} diff --git a/companion/src/modeledit/telemetry.h b/companion/src/modeledit/telemetry.h index b23214927..39f3a42ad 100644 --- a/companion/src/modeledit/telemetry.h +++ b/companion/src/modeledit/telemetry.h @@ -24,6 +24,8 @@ #include "modeledit.h" #include "eeprominterface.h" +constexpr char MIMETYPE_TELE_SENSOR[] = "application/x-companion-tele-sensor"; + class AutoComboBox; class RawSourceFilterItemModel; class TimerEdit; @@ -103,19 +105,27 @@ class TelemetrySensorPanel: public ModelPanel Q_OBJECT public: - TelemetrySensorPanel(QWidget *parent, SensorData & sensor, ModelData & model, GeneralSettings & generalSettings, Firmware * firmware); + TelemetrySensorPanel(QWidget *parent, SensorData & sensor, int sensorIndex, ModelData & model, GeneralSettings & generalSettings, Firmware * firmware); ~TelemetrySensorPanel(); void update(); signals: void dataModified(); + void clearAllSensors(); protected slots: void on_name_editingFinished(); void on_type_currentIndexChanged(int index); void on_formula_currentIndexChanged(int index); void on_unit_currentIndexChanged(int index); - void on_prec_valueChanged(double value); + void on_prec_valueChanged(); + void on_customContextMenuRequested(QPoint pos); + bool hasClipboardData(QByteArray * data = nullptr) const; + void cmCopy(); + void cmCut(); + void cmPaste(); + void cmClear(); + void cmClearAll(); protected: void updateSourcesComboBox(AutoComboBox * cb, bool negative); @@ -123,7 +133,9 @@ class TelemetrySensorPanel: public ModelPanel private: Ui::TelemetrySensor * ui; SensorData & sensor; - bool lock; + bool lock = false; + int sensorIndex = 0; + int selectedIndex = 0; }; class TelemetryPanel : public ModelPanel @@ -154,6 +166,7 @@ class TelemetryPanel : public ModelPanel void on_fasOffset_DSB_editingFinished(); void on_mahCount_SB_editingFinished(); void on_mahCount_ChkB_toggled(bool checked); + void on_clearAllSensors(); private: Ui::Telemetry *ui; diff --git a/companion/src/modeledit/telemetry_sensor.ui b/companion/src/modeledit/telemetry_sensor.ui index 7d08243e0..52660b4f0 100644 --- a/companion/src/modeledit/telemetry_sensor.ui +++ b/companion/src/modeledit/telemetry_sensor.ui @@ -13,13 +13,32 @@ Form - + 0 0 + + + + + 0 + 0 + + + + + 0 + 0 + + + + TELE## + + + @@ -536,23 +555,7 @@ - - - true - - - - 0 - 0 - - - - 0 - - - 2.000000000000000 - - + @@ -711,6 +714,11 @@ QSpinBox
autohexspinbox.h
+ + AutoPrecisionComboBox + QComboBox +
autoprecisioncombobox.h
+
diff --git a/companion/src/shared/CMakeLists.txt b/companion/src/shared/CMakeLists.txt index 81df9dd67..2fbbafbf9 100644 --- a/companion/src/shared/CMakeLists.txt +++ b/companion/src/shared/CMakeLists.txt @@ -15,6 +15,7 @@ set(shared_HDRS autolineedit.h genericpanel.h hexspinbox.h + autoprecisioncombobox.h ) qt5_wrap_cpp(shared_SRCS ${shared_HDRS}) diff --git a/companion/src/shared/autoprecisioncombobox.h b/companion/src/shared/autoprecisioncombobox.h new file mode 100644 index 000000000..4e143f286 --- /dev/null +++ b/companion/src/shared/autoprecisioncombobox.h @@ -0,0 +1,257 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef _AUTOPRECISIONCOMBOBOX_H_ +#define _AUTOPRECISIONCOMBOBOX_H_ + +#include "genericpanel.h" + +#include +#include + +class AutoPrecisionComboBox: public QComboBox +{ + Q_OBJECT + //! \property minDecimals Determines the first list item + Q_PROPERTY(unsigned int minDecimals READ minDecimals WRITE setMinDecimals) + //! \property maxDecimals Determines the last list item + Q_PROPERTY(unsigned int maxDecimals READ maxDecimals WRITE setMaxDecimals) + //! \property padding If true, add trailing underscore placeholders to each list item + Q_PROPERTY(bool padding READ padding WRITE setPadding) + //! \property suffix Optional text suffix to each list value + Q_PROPERTY(QString suffix READ suffix WRITE setSuffix) + + public: + explicit AutoPrecisionComboBox(QWidget * parent = nullptr): + QComboBox(parent) + { + init(); + } + + explicit AutoPrecisionComboBox(unsigned int & field, unsigned int minDecimals = 0, unsigned int maxDecimals = 1, bool padding = false, QString suffix = "", QWidget * parent = nullptr, GenericPanel * panel = nullptr): + QComboBox(parent) + { + setField(field, minDecimals, maxDecimals, padding, suffix, panel); + init(); + } + + explicit AutoPrecisionComboBox(int & field, unsigned int minDecimals = 0, unsigned int maxDecimals = 1, bool padding = false, QString suffix = "", QWidget * parent = nullptr, GenericPanel * panel = nullptr): + QComboBox(parent) + { + setField(field, minDecimals, maxDecimals, padding, suffix, panel); + init(); + } + + inline int minDecimals() const { return m_minDecimals; } + inline int maxDecimals() const { return m_maxDecimals; } + inline bool padding() const { return m_padding; } + inline QString suffix() const { return m_suffix; } + + public slots: + void setField(int & field, unsigned int minDecimals = 0, unsigned int maxDecimals = 1, bool padding = false, QString suffix = "", GenericPanel * panel = nullptr) + { + m_field = reinterpret_cast(&field); + initField(minDecimals, maxDecimals, padding, suffix); + setPanel(panel); + } + + void setField(unsigned int & field, unsigned int minDecimals = 0, unsigned int maxDecimals = 1, bool padding = false, QString suffix = "", GenericPanel * panel = nullptr) + { + m_field = &field; + initField(minDecimals, maxDecimals, padding, suffix); + setPanel(panel); + } + + void setMinDecimals(unsigned int minDecimals) + { + m_minDecimals = rangecheckDecimals(minDecimals); + if (m_minDecimals > m_maxDecimals) + m_minDecimals = m_maxDecimals; + if (!m_lock) + updateList(); + } + + void setMaxDecimals(unsigned int maxDecimals) + { + m_maxDecimals = rangecheckDecimals(maxDecimals); + if (m_maxDecimals < m_minDecimals) + m_maxDecimals = m_minDecimals; + if (!m_lock) + updateList(); + } + + void setPadding(bool padding) + { + m_padding = padding; + if (!m_lock) + updateList(); + } + + void setSuffix(QString suffix) + { + m_suffix = suffix.trimmed(); + if (!m_lock) + updateList(); + } + + void setPanel(GenericPanel * panel) + { + m_panel = panel; + } + + void setValue(int value) + { + if (!m_field) + return; + const unsigned int val = (unsigned int)value; + if (*m_field != val) { + *m_field = rangecheckDecimals(val); + updateValue(); + emit valueChanged(); + } + } + + void setValue(unsigned int value) + { + if (!m_field) + return; + if (*m_field != value) { + *m_field = rangecheckDecimals(value); + updateValue(); + emit valueChanged(); + } + } + + void updateValue() + { + if (!m_field) + return; + if (!isValidDecimals(*m_field)) + return; + if (*m_field > m_maxDecimals) { + setMaxDecimals(*m_field); + } + const bool savedlock = setLocked(true); + setCurrentIndex(findData(*m_field)); + setLocked(savedlock); + } + + void setAutoIndexes() + { + for (int i = 0; i < count(); ++i) + setItemData(i, i); + updateValue(); + } + + signals: + void valueChanged(); + + protected slots: + void init() + { + connect(this, QOverload::of(&AutoPrecisionComboBox::currentIndexChanged), this, &AutoPrecisionComboBox::onCurrentIndexChanged); + } + + void initField(unsigned int minDecimals, unsigned int maxDecimals, bool padding, QString suffix) + { + const bool savedlock = setLocked(true); + setMinDecimals(minDecimals); + setMaxDecimals(maxDecimals); + setPadding(padding); + setSuffix(suffix); + setLocked(savedlock); + updateList(); + } + + void updateList() + { + const bool savedlock = setLocked(true); + unsigned int i; + int j; + clear(); + + for (i = APCB_DECIMALS_MIN, j = (int)m_maxDecimals; j >= 0; i++, j--) { + if (i >= m_minDecimals) { + QString str = QString("0.%1").arg(QString(i, '0')); + if (m_padding) + str.append(QString(j, '_')); + if (m_suffix != "") + str.append(QString(" %1").arg(m_suffix)); + addItem(str, i); + } + } + + setSizeAdjustPolicy(QComboBox::AdjustToContents); + setLocked(savedlock); + } + + void onCurrentIndexChanged(int index) + { + if (index < 0) + return; + if (m_field && !m_lock) { + *m_field = itemData(index).toUInt(); + if (m_panel) + emit m_panel->modified(); + emit valueChanged(); + } + } + + unsigned int rangecheckDecimals(unsigned int decimals) + { + unsigned int ret; + if (decimals < APCB_DECIMALS_MIN) + ret = APCB_DECIMALS_MIN; + else if (decimals > APCB_DECIMALS_MAX) + ret = APCB_DECIMALS_MAX; + else + ret = decimals; + return ret; + } + + bool isValidDecimals(unsigned int value) + { + if (value >= APCB_DECIMALS_MIN && value <= APCB_DECIMALS_MAX) + return true; + else + return false; + } + + bool setLocked(bool lock) + { + const bool ret = m_lock; + m_lock = lock; + return ret; + } + + protected: + constexpr static unsigned int APCB_DECIMALS_MIN = {0}; + constexpr static unsigned int APCB_DECIMALS_MAX = {6}; + + unsigned int * m_field = nullptr; + GenericPanel * m_panel = nullptr; + unsigned int m_minDecimals = 0; + unsigned int m_maxDecimals = 0; + bool m_padding = false; + QString m_suffix = ""; + bool m_lock = false; +}; + +#endif // _AUTOPRECISIONCOMBOBOX_H_ diff --git a/companion/src/shared/genericpanel.h b/companion/src/shared/genericpanel.h index 1ce8e906e..5351355b6 100644 --- a/companion/src/shared/genericpanel.h +++ b/companion/src/shared/genericpanel.h @@ -39,6 +39,7 @@ class GenericPanel : public QWidget friend class AutoHexSpinBox; friend class AutoLineEdit; friend class GVarGroup; + friend class AutoPrecisionComboBox; public: GenericPanel(QWidget *parent, ModelData * model, GeneralSettings & generalSettings, Firmware * firmware); From f40327a1ff5463fca63e83715bddac55abcb0687 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 10 Apr 2020 19:46:08 +0200 Subject: [PATCH 224/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 128250e63..b84116363 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1712,3 +1712,4 @@ Julio Margarido Uwe Muendelein James Jewitt Daniel Ferreira +Michael Charlston From 57198209aa0d7335098e77157ee2c99fc50bd24e Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 10 Apr 2020 20:54:21 +0200 Subject: [PATCH 225/560] Fixes for OTA on Horus --- radio/src/gui/480x272/menus.h | 2 ++ radio/src/gui/480x272/radio_sdmanager.cpp | 3 ++- radio/src/gui/common/stdlcd/radio_sdmanager.cpp | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/480x272/menus.h b/radio/src/gui/480x272/menus.h index 83c667f19..a63e64c8d 100644 --- a/radio/src/gui/480x272/menus.h +++ b/radio/src/gui/480x272/menus.h @@ -559,6 +559,8 @@ inline void CLEAR_POPUP() warningInfoText = nullptr; popupMenuHandler = nullptr; popupMenuItemsCount = 0; + // TODO ? popupFunc = nullptr; + pushEvent(EVT_REFRESH); } inline void POPUP_WAIT(const char * s) diff --git a/radio/src/gui/480x272/radio_sdmanager.cpp b/radio/src/gui/480x272/radio_sdmanager.cpp index 90b5e5f57..96fb7c18d 100644 --- a/radio/src/gui/480x272/radio_sdmanager.cpp +++ b/radio/src/gui/480x272/radio_sdmanager.cpp @@ -97,6 +97,7 @@ void onUpdateConfirmation(const char * result) OtaUpdateInformation * destination = moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].otaUpdateInformation; Pxx2OtaUpdate otaUpdate(reusableBuffer.sdManager.otaUpdateInformation.module, destination->candidateReceiversNames[destination->selectedReceiverIndex]); otaUpdate.flashFirmware(destination->filename); + putEvent(EVT_REFRESH); } else { moduleState[reusableBuffer.sdManager.otaUpdateInformation.module].mode = MODULE_MODE_NORMAL; @@ -563,7 +564,7 @@ bool menuRadioSdManager(event_t _event) if (reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount > 0) { if (reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount != popupMenuItemsCount) { CLEAR_POPUP(); - popupMenuItemsCount = min(reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount,PXX2_MAX_RECEIVERS_PER_MODULE); + popupMenuItemsCount = min(reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE); for (auto rx = 0; rx < popupMenuItemsCount; rx++) { popupMenuItems[rx] = reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversNames[rx]; } diff --git a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp index d6def8115..e719951b3 100644 --- a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp +++ b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp @@ -576,7 +576,7 @@ void menuRadioSdManager(event_t _event) if (reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount > 0) { if (reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount != popupMenuItemsCount) { CLEAR_POPUP(); - popupMenuItemsCount = min(reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount,PXX2_MAX_RECEIVERS_PER_MODULE); + popupMenuItemsCount = min(reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE); for (auto rx = 0; rx < popupMenuItemsCount; rx++) { popupMenuItems[rx] = reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversNames[rx]; } From ebe33693b415bf47bb25ee9f42d708f578faa1d0 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 11 Apr 2020 07:44:48 +0200 Subject: [PATCH 226/560] Compilation fix --- radio/src/gui/480x272/menus.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/480x272/menus.h b/radio/src/gui/480x272/menus.h index a63e64c8d..f82baeb14 100644 --- a/radio/src/gui/480x272/menus.h +++ b/radio/src/gui/480x272/menus.h @@ -560,7 +560,7 @@ inline void CLEAR_POPUP() popupMenuHandler = nullptr; popupMenuItemsCount = 0; // TODO ? popupFunc = nullptr; - pushEvent(EVT_REFRESH); + putEvent(EVT_REFRESH); } inline void POPUP_WAIT(const char * s) From d90ac28cc19e859924dd934652a486b3adaeb0c6 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 11 Apr 2020 13:18:57 +0200 Subject: [PATCH 227/560] Refactoring to have globals splitted from opentx.h for easier includes (#7511) --- radio/src/buzzer.h | 2 - radio/src/datastructs.h | 3 +- radio/src/globals.h | 97 +++++++++++++++++++ radio/src/gui/480x272/model_setup.cpp | 5 +- radio/src/gui/480x272/radio_power_meter.cpp | 5 +- .../gui/480x272/radio_spectrum_analyser.cpp | 5 +- radio/src/mixer.cpp | 12 +-- radio/src/opentx.h | 79 +-------------- radio/src/pulses/modules_helpers.h | 11 +++ radio/src/pulses/pulses.cpp | 4 +- 10 files changed, 119 insertions(+), 104 deletions(-) create mode 100644 radio/src/globals.h diff --git a/radio/src/buzzer.h b/radio/src/buzzer.h index aa13746f8..f0c545d5e 100644 --- a/radio/src/buzzer.h +++ b/radio/src/buzzer.h @@ -22,8 +22,6 @@ #define _BUZZER_H_ #if defined(BUZZER) -extern uint8_t g_beepCnt; -extern uint8_t beepAgain; extern uint8_t beepAgainOrig; extern uint8_t beepOn; extern bool warble; diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 7a2454034..413c5efcd 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -26,6 +26,7 @@ #include "dataconstants.h" #include "definitions.h" #include "bitfield.h" +#include "globals.h" #if defined(PCBTARANIS) #define N_TARANIS_FIELD(x) @@ -483,8 +484,6 @@ PACK(struct ModuleData { * Model structure */ -typedef uint16_t BeepANACenter; - #if LEN_BITMAP_NAME > 0 #define MODEL_HEADER_BITMAP_FIELD NOBACKUP(char bitmap[LEN_BITMAP_NAME]); #else diff --git a/radio/src/globals.h b/radio/src/globals.h new file mode 100644 index 000000000..cf67dbc4a --- /dev/null +++ b/radio/src/globals.h @@ -0,0 +1,97 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef _GLOBALS_H_ +#define _GLOBALS_H_ + +#include "definitions.h" +#include "dataconstants.h" + +PACK(struct GlobalData { + uint8_t unexpectedShutdown:1; + uint8_t externalAntennaEnabled:1; + uint8_t authenticationCount:2; + uint8_t upgradeModulePopup:1; + uint8_t internalModuleVersionChecked:1; + uint8_t spare:2; +}); + +extern GlobalData globalData; + +extern uint16_t sessionTimer; +extern uint16_t s_timeCumThr; +extern uint16_t s_timeCum16ThrP; + +#if defined(OVERRIDE_CHANNEL_FUNCTION) +#define OVERRIDE_CHANNEL_UNDEFINED -4096 +extern safetych_t safetyCh[MAX_OUTPUT_CHANNELS]; +#endif + +extern uint8_t trimsCheckTimer; +extern uint8_t trimsDisplayTimer; +extern uint8_t trimsDisplayMask; +extern uint16_t maxMixerDuration; + +extern uint8_t requiredSpeakerVolume; + +enum MainRequest { + REQUEST_SCREENSHOT, + REQUEST_FLIGHT_RESET, +}; + +extern uint8_t mainRequestFlags; + +#define DELAY_POS_MARGIN 3 +typedef int16_t delayval_t; +PACK(struct SwOn { + uint16_t delay:14; // max = 2550 + uint8_t activeMix:1; + uint8_t activeExpo:1; + int16_t now; // timer trigger source -> off, abs, stk, stk%, sw/!sw, !m_sw/!m_sw + int16_t prev; +}); + +extern SwOn swOn[MAX_MIXERS]; +extern int32_t act[MAX_MIXERS]; + +// static variables used in evalFlightModeMixes - moved here so they don't interfere with the stack +// It's also easier to initialize them here. +extern int8_t virtualInputsTrims[MAX_INPUTS]; + +extern int16_t anas [MAX_INPUTS]; +extern int16_t trims[NUM_TRIMS]; +extern int32_t chans[MAX_OUTPUT_CHANNELS]; +extern int16_t ex_chans[MAX_OUTPUT_CHANNELS]; // Outputs (before LIMITS) of the last perMain +extern int16_t channelOutputs[MAX_OUTPUT_CHANNELS]; + +typedef uint16_t BeepANACenter; +extern BeepANACenter bpanaCenter; + +extern uint8_t s_mixer_first_run_done; + +extern int16_t calibratedAnalogs[NUM_CALIBRATED_ANALOGS]; + +extern uint8_t g_beepCnt; +extern uint8_t beepAgain; +extern uint16_t lightOffCounter; +extern uint8_t flashCounter; +extern uint8_t mixWarning; + +#endif diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index b8c01cbaa..3cd369ddb 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -1018,10 +1018,6 @@ bool menuModelSetup(event_t event) uint8_t moduleType = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].type, MODULE_TYPE_NONE, MODULE_TYPE_MAX, EE_MODEL, isInternalModuleAvailable); if (checkIncDec_Ret) { setModuleType(INTERNAL_MODULE, moduleType); -#if defined(ACCESS_LIB) - // the module will reset on mode switch, we need to reset the authentication counter - globalData.authenticationCount = 0; -#endif } } else if (isModuleXJT(INTERNAL_MODULE)) { @@ -1034,6 +1030,7 @@ bool menuModelSetup(event_t event) } else if (isModulePXX2(INTERNAL_MODULE)) { g_model.moduleData[INTERNAL_MODULE].subType = checkIncDec(event, g_model.moduleData[INTERNAL_MODULE].subType, 0, MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16, EE_MODEL); + resetAccessAuthenticationCount(); } } break; diff --git a/radio/src/gui/480x272/radio_power_meter.cpp b/radio/src/gui/480x272/radio_power_meter.cpp index f49eeb93c..c1f6ac316 100644 --- a/radio/src/gui/480x272/radio_power_meter.cpp +++ b/radio/src/gui/480x272/radio_power_meter.cpp @@ -50,10 +50,7 @@ bool menuRadioPowerMeter(event_t event) lcdDrawCenteredText(LCD_H/2, STR_STOPPING); lcdRefresh(); moduleState[g_moduleIdx].readModuleInformation(&reusableBuffer.moduleSetup.pxx2.moduleInformation, PXX2_HW_INFO_TX_ID, PXX2_HW_INFO_TX_ID); -#if defined(ACCESS_LIB) - // the module will reset on mode switch, we need to reset the authentication counter - globalData.authenticationCount = 0; -#endif + resetAccessAuthenticationCount(); /* wait 1s to resume normal operation before leaving */ watchdogSuspend(500 /*5s*/); RTOS_WAIT_MS(1000); diff --git a/radio/src/gui/480x272/radio_spectrum_analyser.cpp b/radio/src/gui/480x272/radio_spectrum_analyser.cpp index 39ff66e02..95e40e9db 100644 --- a/radio/src/gui/480x272/radio_spectrum_analyser.cpp +++ b/radio/src/gui/480x272/radio_spectrum_analyser.cpp @@ -58,10 +58,7 @@ bool menuRadioSpectrumAnalyser(event_t event) lcdRefresh(); if (isModulePXX2(g_moduleIdx)) { moduleState[g_moduleIdx].readModuleInformation(&reusableBuffer.moduleSetup.pxx2.moduleInformation, PXX2_HW_INFO_TX_ID, PXX2_HW_INFO_TX_ID); -#if defined(ACCESS_LIB) - // the module will reset on mode switch, we need to reset the authentication counter - globalData.authenticationCount = 0; -#endif + resetAccessAuthenticationCount(); } else if (isModuleMultimodule(g_moduleIdx)) { if (reusableBuffer.spectrumAnalyser.moduleOFF) diff --git a/radio/src/mixer.cpp b/radio/src/mixer.cpp index a8100da22..d361ac479 100644 --- a/radio/src/mixer.cpp +++ b/radio/src/mixer.cpp @@ -901,9 +901,7 @@ void evalMixes(uint8_t tick10ms) static uint16_t fp_act[MAX_FLIGHT_MODES] = {0}; static uint16_t delta = 0; - static ACTIVE_PHASES_TYPE flightModesFade = 0; - - LS_RECURSIVE_EVALUATION_RESET(); + static uint16_t flightModesFade = 0; uint8_t fm = getFlightMode(); @@ -915,7 +913,7 @@ void evalMixes(uint8_t tick10ms) } else { uint8_t fadeTime = max(g_model.flightModeData[lastFlightMode].fadeOut, g_model.flightModeData[fm].fadeIn); - ACTIVE_PHASES_TYPE transitionMask = ((ACTIVE_PHASES_TYPE)1 << lastFlightMode) + ((ACTIVE_PHASES_TYPE)1 << fm); + uint16_t transitionMask = (0x01u << lastFlightMode) + (0x01u << fm); if (fadeTime) { flightModesFade |= transitionMask; delta = (MAX_ACT / 10) / fadeTime; @@ -945,15 +943,13 @@ void evalMixes(uint8_t tick10ms) if (flightModesFade) { memclear(sum_chans512, sizeof(sum_chans512)); for (uint8_t p=0; p> 4) * fp_act[p]; weight += fp_act[p]; } - LS_RECURSIVE_EVALUATION_RESET(); } assert(weight); mixerCurrentFlightMode = fm; @@ -994,7 +990,7 @@ void evalMixes(uint8_t tick10ms) if (tick10ms && flightModesFade) { uint16_t tick_delta = delta * tick10ms; for (uint8_t p=0; p tick_delta) diff --git a/radio/src/opentx.h b/radio/src/opentx.h index cd9ac3a58..7ca6a1db6 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -21,14 +21,12 @@ #ifndef _OPENTX_H_ #define _OPENTX_H_ -#include -#include -#include #include -#include #include "definitions.h" #include "opentx_types.h" #include "debounce.h" +#include "globals.h" +#include "opentx_helpers.h" #if defined(SIMU) #include "targets/simu/simpgmspace.h" @@ -502,7 +500,6 @@ void logicalSwitchesReset(); void evalLogicalSwitches(bool isCurrentFlightmode=true); void logicalSwitchesCopyState(uint8_t src, uint8_t dst); -#define LS_RECURSIVE_EVALUATION_RESET() #if defined(PCBTARANIS) || defined(PCBHORUS) void getSwitchesPosition(bool startup); @@ -547,34 +544,8 @@ bool setTrimValue(uint8_t phase, uint8_t idx, int trim); #include "gvars.h" -extern uint16_t sessionTimer; -extern uint16_t s_timeCumThr; -extern uint16_t s_timeCum16ThrP; - -#if defined(OVERRIDE_CHANNEL_FUNCTION) -#define OVERRIDE_CHANNEL_UNDEFINED -4096 -extern safetych_t safetyCh[MAX_OUTPUT_CHANNELS]; -#endif - -extern uint8_t trimsCheckTimer; -extern uint8_t trimsDisplayTimer; -extern uint8_t trimsDisplayMask; - void flightReset(uint8_t check=true); -PACK(struct GlobalData { - uint8_t unexpectedShutdown:1; - uint8_t externalAntennaEnabled:1; - uint8_t authenticationCount:2; - uint8_t upgradeModulePopup:1; - uint8_t internalModuleVersionChecked:1; - uint8_t spare:2; -}); - -extern GlobalData globalData; - -extern uint16_t maxMixerDuration; - #define DURATION_MS_PREC2(x) ((x)/20) #if defined(THRTRACE) @@ -723,14 +694,9 @@ extern const char vers_stamp[]; const char * getOtherVersion(char * buffer); #define g_blinkTmr10ms (*(uint8_t*)&g_tmr10ms) -extern uint8_t g_beepCnt; #include "trainer.h" -extern int32_t chans[MAX_OUTPUT_CHANNELS]; -extern int16_t ex_chans[MAX_OUTPUT_CHANNELS]; // Outputs (before LIMITS) of the last perMain -extern int16_t channelOutputs[MAX_OUTPUT_CHANNELS]; - int expo(int x, int k); inline void getMixSrcRange(const int source, int16_t & valMin, int16_t & valMax, LcdFlags * flags = 0) @@ -829,33 +795,15 @@ int16_t applyLimits(uint8_t channel, int32_t value); void evalInputs(uint8_t mode); uint16_t anaIn(uint8_t chan); -extern int16_t calibratedAnalogs[NUM_CALIBRATED_ANALOGS]; - #define FLASH_DURATION 20 /*200ms*/ -extern uint8_t beepAgain; -extern uint16_t lightOffCounter; -extern uint8_t flashCounter; -extern uint8_t mixWarning; - FlightModeData * flightModeAddress(uint8_t idx); ExpoData * expoAddress(uint8_t idx); MixData * mixAddress(uint8_t idx); LimitData * limitAddress(uint8_t idx); LogicalSwitchData * lswAddress(uint8_t idx); -// static variables used in evalFlightModeMixes - moved here so they don't interfere with the stack -// It's also easier to initialize them here. -extern int8_t virtualInputsTrims[MAX_INPUTS]; - -extern int16_t anas [MAX_INPUTS]; -extern int16_t trims[NUM_TRIMS]; -extern BeepANACenter bpanaCenter; - -extern uint8_t s_mixer_first_run_done; - void applyDefaultTemplate(); - void instantTrim(); void evalTrims(); void copyTrimsToOffset(uint8_t ch); @@ -863,20 +811,6 @@ void copySticksToOffset(uint8_t ch); void copyMinMaxToOutputs(uint8_t ch); void moveTrimsToOffsets(); -typedef uint16_t ACTIVE_PHASES_TYPE; -#define DELAY_POS_MARGIN 3 -typedef int16_t delayval_t; -PACK(struct SwOn { - uint16_t delay:14; // max = 2550 - uint8_t activeMix:1; - uint8_t activeExpo:1; - int16_t now; // timer trigger source -> off, abs, stk, stk%, sw/!sw, !m_sw/!m_sw - int16_t prev; -}); - -extern SwOn swOn[MAX_MIXERS]; -extern int32_t act[MAX_MIXERS]; - #if defined(BOLD_FONT) inline bool isExpoActive(uint8_t expo) { @@ -1050,15 +984,6 @@ void setMFP(); void clearMFP(); #endif -extern uint8_t requiredSpeakerVolume; - -enum MainRequest { - REQUEST_SCREENSHOT, - REQUEST_FLIGHT_RESET, -}; - -extern uint8_t mainRequestFlags; - void checkBattery(); void opentxClose(uint8_t shutdown=true); void opentxInit(); diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h index a1e3cee65..5327938d2 100644 --- a/radio/src/pulses/modules_helpers.h +++ b/radio/src/pulses/modules_helpers.h @@ -26,6 +26,7 @@ #include "opentx_helpers.h" #include "telemetry/telemetry.h" #include "storage/storage.h" +#include "globals.h" #if defined(MULTIMODULE) #include "telemetry/multi.h" @@ -534,6 +535,14 @@ inline void setDefaultPpmFrameLength(uint8_t moduleIdx) g_model.moduleData[moduleIdx].ppm.frameLength = 4 * max(0, g_model.moduleData[moduleIdx].channelsCount); } +inline void resetAccessAuthenticationCount() +{ +#if defined(ACCESS_LIB) + // the module will reset on mode switch, we need to reset the authentication counter + globalData.authenticationCount = 0; +#endif +} + inline void setModuleType(uint8_t moduleIdx, uint8_t moduleType) { ModuleData & moduleData = g_model.moduleData[moduleIdx]; @@ -544,6 +553,8 @@ inline void setModuleType(uint8_t moduleIdx, uint8_t moduleType) moduleData.sbus.refreshRate = -31; else if (moduleData.type == MODULE_TYPE_PPM) setDefaultPpmFrameLength(moduleIdx); + else + resetAccessAuthenticationCount(); } extern bool isExternalAntennaEnabled(); diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index 42f04fb26..afcbaa061 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -308,9 +308,7 @@ static void enablePulsesInternalModule(uint8_t protocol) #if defined(PXX2) case PROTOCOL_CHANNELS_PXX2_HIGHSPEED: intmoduleSerialStart(PXX2_HIGHSPEED_BAUDRATE, true, USART_Parity_No, USART_StopBits_1, USART_WordLength_8b); -#if defined(HARDWARE_INTERNAL_MODULE) && defined(INTERNAL_MODULE_PXX2) && defined(ACCESS_LIB) - globalData.authenticationCount = 0; -#endif + resetAccessAuthenticationCount(); break; #endif From 673fcb9287bd5beededb4a0b7d01178b568c16be Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 11 Apr 2020 17:25:46 +0200 Subject: [PATCH 228/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index b84116363..2f1fbc891 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1713,3 +1713,4 @@ Uwe Muendelein James Jewitt Daniel Ferreira Michael Charlston +Leopoldo Cicero From 5e2fc7f1aed9169031fb05b4594db6792c7c91fe Mon Sep 17 00:00:00 2001 From: pascallanger Date: Mon, 13 Apr 2020 11:39:59 +0200 Subject: [PATCH 229/560] Multi: Enable D8, D16v1 and D16v2.1 TX clone mode (#7516) * Clone mode * Switch table from octal to hex * Revert change to octal as requested by 3djc * Changing to Cloned to please 3djc ;-) * Minimum Multi version: 1.3.0.87 * Cosmetics * Cosmetics * Add cloned to X2 Co-authored-by: Pascal Langer Co-authored-by: 3djc --- jumpertx-t16-2.3.8.bin | Bin 0 -> 1051568 bytes radio/src/gui/gui_common.cpp | 10 +++++----- radio/src/pulses/modules_constants.h | 4 +++- radio/src/pulses/modules_helpers.h | 2 +- radio/src/pulses/multi.cpp | 16 ++++++++++++---- radio/src/telemetry/multi.cpp | 2 +- radio/src/telemetry/telemetry.h | 2 +- 7 files changed, 23 insertions(+), 13 deletions(-) create mode 100644 jumpertx-t16-2.3.8.bin diff --git a/jumpertx-t16-2.3.8.bin b/jumpertx-t16-2.3.8.bin new file mode 100644 index 0000000000000000000000000000000000000000..25865937a4c010c9c4550dfd68130acc7c799dba GIT binary patch literal 1051568 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 RLhnLpm8m0HSY;=0 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�e|l~U$(5jW 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%0AozS;!BQ#O2Z4q`_+?IB> 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
I71p(h}H9j%_pxtH{H79sv6 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�=woc)c{ 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Ξ+A69`379P5X(NS#dnChExRAt+jvsdl>OS(!5 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�>Cm-v6KK?&%RW;d}Rf?|tukucb5HU0q#u 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 M#F@ufK>x7+34D(%c>n+a literal 0 HcmV?d00001 diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index 045357b64..5efab1510 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -803,7 +803,7 @@ uint8_t convertMultiProtocol(uint8_t moduleIdx, uint8_t type) if (type == MODULE_SUBTYPE_MULTI_FRSKY) { int subtype = g_model.moduleData[moduleIdx].subType; - if (subtype == MM_RF_FRSKY_SUBTYPE_D8) { + if (subtype == MM_RF_FRSKY_SUBTYPE_D8 || subtype == MM_RF_FRSKY_SUBTYPE_D8_CLONED) { //D8 type = 3; } @@ -831,8 +831,8 @@ uint8_t convertMultiProtocol(uint8_t moduleIdx, uint8_t type) const char STR_SUBTYPE_FLYSKY[] = "\004""Std\0""V9x9""V6x6""V912""CX20"; const char STR_SUBTYPE_HUBSAN[] = "\004""H107""H301""H501"; -const char STR_SUBTYPE_FRSKY[] = "\007""D16\0 ""D8\0 ""D16 8ch""V8\0 ""LBT(EU)""LBT 8ch"; -const char STR_SUBTYPE_FRSKYX2[] = "\007""D16\0 ""D16 8ch""LBT(EU)""LBT 8ch"; +const char STR_SUBTYPE_FRSKY[] = "\011""D16\0 ""D8\0 ""D16 8ch\0 ""V8\0 ""LBT(EU)\0 ""LBT 8ch\0 ""D8Cloned\0""D16Cloned"; +const char STR_SUBTYPE_FRSKYX2[] = "\011""D16\0 ""D16 8ch\0 ""LBT(EU)\0 ""LBT 8ch\0 ""D16Cloned"; const char STR_SUBTYPE_HISKY[] = "\005""Std\0 ""HK310"; const char STR_SUBTYPE_V2X2[] = "\006""Std\0 ""JXD506"; const char STR_SUBTYPE_DSM[] = "\006""2 22ms""2 11ms""X 22ms""X 11ms"; @@ -883,7 +883,7 @@ const mm_protocol_definition multi_protocols[] = { // Protocol as defined in pulses\modules_constants.h, number of sub_protocols - 1, Failsafe supported, Disable channel mapping supported, Subtype string, Option type {MODULE_SUBTYPE_MULTI_FLYSKY, 4, false, true, STR_SUBTYPE_FLYSKY, nullptr}, {MODULE_SUBTYPE_MULTI_HUBSAN, 2, false, false, STR_SUBTYPE_HUBSAN, STR_MULTI_VIDFREQ}, - {MODULE_SUBTYPE_MULTI_FRSKY, 5, false, false, STR_SUBTYPE_FRSKY, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_FRSKY, 7, false, false, STR_SUBTYPE_FRSKY, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_HISKY, 1, false, true, STR_SUBTYPE_HISKY, nullptr}, {MODULE_SUBTYPE_MULTI_V2X2, 1, false, false, STR_SUBTYPE_V2X2, nullptr}, {MODULE_SUBTYPE_MULTI_DSM2, 3, false, true, STR_SUBTYPE_DSM, STR_MULTI_MAX_THROW}, @@ -924,7 +924,7 @@ const mm_protocol_definition multi_protocols[] = { {MODULE_SUBTYPE_MULTI_ESKY150, 1, false, false, STR_SUBTYPE_ESKY150, nullptr}, {MODULE_SUBTYPE_MULTI_FX816, 0, false, false, STR_SUBTYPE_FX816, nullptr}, {MODULE_SUBTYPE_MULTI_HOTT, 0, true, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_FRSKYX2, 3, true, false, STR_SUBTYPE_FRSKYX2, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_FRSKYX2, 4, true, false, STR_SUBTYPE_FRSKYX2, STR_MULTI_RFTUNE}, {MM_RF_CUSTOM_SELECTED, 7, true, true, NO_SUBTYPE, STR_MULTI_OPTION}, // Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff) diff --git a/radio/src/pulses/modules_constants.h b/radio/src/pulses/modules_constants.h index efbcd1b3d..d890e38ab 100644 --- a/radio/src/pulses/modules_constants.h +++ b/radio/src/pulses/modules_constants.h @@ -182,7 +182,9 @@ enum MMRFrskySubtypes { MM_RF_FRSKY_SUBTYPE_D16_8CH, MM_RF_FRSKY_SUBTYPE_V8, MM_RF_FRSKY_SUBTYPE_D16_LBT, - MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH + MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH, + MM_RF_FRSKY_SUBTYPE_D8_CLONED, + MM_RF_FRSKY_SUBTYPE_D16_CLONED }; enum ModuleSubtypeDSM2 { diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h index 5327938d2..244e58a79 100644 --- a/radio/src/pulses/modules_helpers.h +++ b/radio/src/pulses/modules_helpers.h @@ -58,7 +58,7 @@ inline uint8_t getMaxMultiSubtype(uint8_t moduleIdx) const mm_protocol_definition *pdef = getMultiProtocolDefinition(g_model.moduleData[moduleIdx].getMultiProtocol()); if (g_model.moduleData[moduleIdx].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKY) { - return 5; + return 7; } if (g_model.moduleData[moduleIdx].getMultiProtocol() > MODULE_SUBTYPE_MULTI_LAST) { diff --git a/radio/src/pulses/multi.cpp b/radio/src/pulses/multi.cpp index 936da0948..3d0402da4 100644 --- a/radio/src/pulses/multi.cpp +++ b/radio/src/pulses/multi.cpp @@ -295,11 +295,18 @@ void sendFrameProtocolHeader(uint8_t moduleIdx, bool failsafe) //D8 type = 3; subtype = 0; - } else if (subtype == MM_RF_FRSKY_SUBTYPE_V8) { + } + else if (subtype == MM_RF_FRSKY_SUBTYPE_D8_CLONED) { + //D8 + type = 3; + subtype = 1; + } + else if (subtype == MM_RF_FRSKY_SUBTYPE_V8) { //V8 type = 25; subtype = 0; - } else { + } + else { type = 15; if (subtype == MM_RF_FRSKY_SUBTYPE_D16_8CH) // D16 8ch subtype = 1; @@ -307,8 +314,9 @@ void sendFrameProtocolHeader(uint8_t moduleIdx, bool failsafe) subtype = 0; // D16 else if (subtype == MM_RF_FRSKY_SUBTYPE_D16_LBT) subtype = 2; - else - subtype = 3; // MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH + else if (subtype == MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH) + subtype = 3; + else subtype = 4; } } diff --git a/radio/src/telemetry/multi.cpp b/radio/src/telemetry/multi.cpp index 738237bfc..b86347547 100644 --- a/radio/src/telemetry/multi.cpp +++ b/radio/src/telemetry/multi.cpp @@ -555,7 +555,7 @@ void MultiModuleStatus::getStatusString(char * statusText) const return; } - if (major <= 1 && minor <= 3 && revision <= 0 && patch <= 78 && SLOW_BLINK_ON_PHASE) { + if (major <= 1 && minor <= 3 && revision <= 0 && patch < 87 && SLOW_BLINK_ON_PHASE) { strcpy(statusText, STR_MODULE_UPGRADE); } else { diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index 4252eb9a8..c74057c78 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -108,7 +108,7 @@ void frskyDSetDefault(int index, uint16_t id); extern uint8_t telemetryProtocol; #if defined (MULTIMODULE) - #define IS_D16_MULTI(module) (((g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKY) && (g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16 || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_8CH || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH)) \ + #define IS_D16_MULTI(module) (((g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKY) && (g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16 || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_8CH || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_CLONED)) \ || (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKYX2)) #define IS_HOTT_MULTI(module) (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_HOTT) #if defined(HARDWARE_INTERNAL_MODULE) From ccb159ddc9c65879987c30915746fdca4097f860 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 13 Apr 2020 20:55:54 +0200 Subject: [PATCH 230/560] Avoid duplicate enter handling (#7518) --- radio/src/gui/128x64/view_channels.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/radio/src/gui/128x64/view_channels.cpp b/radio/src/gui/128x64/view_channels.cpp index 2e3ed0a40..ccd8fc9b3 100644 --- a/radio/src/gui/128x64/view_channels.cpp +++ b/radio/src/gui/128x64/view_channels.cpp @@ -128,10 +128,6 @@ void menuChannelsView(event_t event) case EVT_KEY_PREVIOUS_PAGE: g_eeGeneral.view = (g_eeGeneral.view + (4 * ALTERNATE_VIEW) - ALTERNATE_VIEW) % (4 * ALTERNATE_VIEW); break; - - case EVT_KEY_FIRST(KEY_ENTER): - reusableBuffer.viewChannels.mixersView = !reusableBuffer.viewChannels.mixersView; - break; } menuChannelsViewCommon(event); From 2c342d84132b9e79e14f35bb47ec9275ee53ef7e Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 13 Apr 2020 22:26:32 +0200 Subject: [PATCH 231/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 2f1fbc891..61fde21ee 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1714,3 +1714,4 @@ James Jewitt Daniel Ferreira Michael Charlston Leopoldo Cicero +Tom Van Driel From dbee58bb054d35f256d7b6c26c7a6760ceb302f0 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 14 Apr 2020 08:34:19 +0200 Subject: [PATCH 232/560] Cosmetics --- radio/src/pulses/multi.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/radio/src/pulses/multi.cpp b/radio/src/pulses/multi.cpp index 3d0402da4..ca7a77480 100644 --- a/radio/src/pulses/multi.cpp +++ b/radio/src/pulses/multi.cpp @@ -316,7 +316,8 @@ void sendFrameProtocolHeader(uint8_t moduleIdx, bool failsafe) subtype = 2; else if (subtype == MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH) subtype = 3; - else subtype = 4; + else + subtype = 4; } } From e5d31e9df3533d38faba2ff664a74a531b1e155a Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 15 Apr 2020 09:57:00 +0200 Subject: [PATCH 233/560] Update CREDITS.txt --- CREDITS.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index 61fde21ee..128dde40f 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1715,3 +1715,5 @@ Daniel Ferreira Michael Charlston Leopoldo Cicero Tom Van Driel +Karl Vetter +Johannes Janssen From 70ad47574054595f75f60ec1c1b1be66385fd565 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 17 Apr 2020 17:46:41 +0200 Subject: [PATCH 234/560] Fix #7512 --- radio/src/translations/es.h.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 045855d01..a62532e1a 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -1161,7 +1161,7 @@ #define TR_SETUP_WIDGETS "Config. widgets" #define TR_USER_INTERFACE "Interfaz" #define TR_THEME "Tema" -#define TR_SETUP "Configiracion" +#define TR_SETUP "Configuracion" #define TR_MAINVIEWX "Vista pral. X" #define TR_LAYOUT "Diseño" #define TR_ADDMAINVIEW "Añadir vista pral." From 8da4cb2506dea6302dfe89d7deb6cc861dc893d1 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 18 Apr 2020 08:46:34 +0200 Subject: [PATCH 235/560] Fix #7490 --- radio/src/translations/it.h.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 11f4c411c..522b22477 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -859,7 +859,7 @@ #define TR_INTERNAL_MODULE TR("Modulo int.", "Modulo interno") #define TR_EXTERNAL_MODULE TR("Modulo est.", "Modulo esterno") #define TR_OPENTX_UPGRADE_REQUIRED "OpenTX richiede aggiornamento" -#define TR_TELEMETRY_DISABLED "Telem. disabilitata" +#define TR_TELEMETRY_DISABLED TR("Telem. off", ""Telem. disabilitata") #define TR_MORE_OPTIONS_AVAILABLE "Altre opzioni assenti" #define TR_NO_MODULE_INFORMATION "Nessuna info del modulo" #define TR_EXTERNALRF "Modulo esterno" From f80ffce6b1ba0ed258d212d1b94d6b5777a60315 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 19 Apr 2020 13:09:44 +0200 Subject: [PATCH 236/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 128dde40f..7886cfb81 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1717,3 +1717,4 @@ Leopoldo Cicero Tom Van Driel Karl Vetter Johannes Janssen +François Blondé From e1a0641c2a077e43bc79f421f4b44695adc9ba10 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 20 Apr 2020 12:48:29 +0200 Subject: [PATCH 237/560] Fix typo --- radio/src/translations/it.h.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 522b22477..ac873883b 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -859,7 +859,7 @@ #define TR_INTERNAL_MODULE TR("Modulo int.", "Modulo interno") #define TR_EXTERNAL_MODULE TR("Modulo est.", "Modulo esterno") #define TR_OPENTX_UPGRADE_REQUIRED "OpenTX richiede aggiornamento" -#define TR_TELEMETRY_DISABLED TR("Telem. off", ""Telem. disabilitata") +#define TR_TELEMETRY_DISABLED TR("Telem. off", "Telem. disabilitata") #define TR_MORE_OPTIONS_AVAILABLE "Altre opzioni assenti" #define TR_NO_MODULE_INFORMATION "Nessuna info del modulo" #define TR_EXTERNALRF "Modulo esterno" From 9a20a8780bc0896b7389498a889363ddffcdff90 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 20 Apr 2020 13:01:11 +0200 Subject: [PATCH 238/560] Init usb charger detect --- radio/src/gui/480x272/topbar.cpp | 2 +- radio/src/targets/horus/board.cpp | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/480x272/topbar.cpp b/radio/src/gui/480x272/topbar.cpp index f631f7984..f14d9a237 100644 --- a/radio/src/gui/480x272/topbar.cpp +++ b/radio/src/gui/480x272/topbar.cpp @@ -91,7 +91,7 @@ void drawTopBar() /* Tx battery */ uint8_t bars = GET_TXBATT_BARS(5); #if defined(USB_CHARGER) - if(usbChargerLed() && BLINK_ON_PHASE) + if (usbChargerLed() && BLINK_ON_PHASE) lcdDrawBitmapPattern(LCD_W-130, 24, LBM_TOPMENU_TXBATT_CHARGING, MENU_TITLE_COLOR); else { #endif diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp index d88350ba5..2310c296b 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -191,6 +191,10 @@ void boardInit() ledInit(); +#if defined(USB_CHARGER) + usbChargerInit(); +#endif + #if HAS_SPORT_UPDATE_CONNECTOR() sportUpdateInit(); #endif From 368adfb422be6a4e804e91092bd31d98cabfde70 Mon Sep 17 00:00:00 2001 From: Kilrah Date: Mon, 20 Apr 2020 13:04:01 +0200 Subject: [PATCH 239/560] Fix left horizontal trim --- radio/src/targets/horus/hal.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index bbe1235b0..9e4da20b8 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -184,9 +184,9 @@ #elif defined(PCBX10) #if defined(RADIO_TX16S) #define TRIMS_GPIO_REG_LHL GPIOA->IDR - #define TRIMS_GPIO_PIN_LHL GPIO_Pin_8 // PA.06 + #define TRIMS_GPIO_PIN_LHL GPIO_Pin_6 // PA.06 #define TRIMS_GPIO_REG_LHR GPIOC->IDR - #define TRIMS_GPIO_PIN_LHR GPIO_Pin_9 // PC.04 + #define TRIMS_GPIO_PIN_LHR GPIO_Pin_4 // PC.04 #else #define TRIMS_GPIO_REG_LHL GPIOB->IDR #define TRIMS_GPIO_PIN_LHL GPIO_Pin_8 // PB.08 @@ -234,9 +234,9 @@ #define KEYS_GPIOJ_PINS (SWITCHES_GPIO_PIN_D_H | TRIMS_GPIO_PIN_RVU | TRIMS_GPIO_PIN_LVD | TRIMS_GPIO_PIN_LVU | TRIMS_GPIO_PIN_RSD) #elif defined(PCBX10) #if defined(RADIO_TX16S) - #define KEYS_GPIOB_PINS (GPIO_Pin_12 | GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13) + #define KEYS_GPIOB_PINS (GPIO_Pin_12 | GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13) #else - #define KEYS_GPIOB_PINS (GPIO_Pin_12 | GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_8 | GPIO_Pin_9) + #define KEYS_GPIOB_PINS (GPIO_Pin_12 | GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_8 | GPIO_Pin_9) #endif #define KEYS_GPIOD_PINS (GPIO_Pin_11 | GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_13) #define KEYS_GPIOE_PINS (GPIO_Pin_3) From 7b81f6f9717ab8457528afbdc3b2515ee1c47ff7 Mon Sep 17 00:00:00 2001 From: Kilrah Date: Mon, 20 Apr 2020 13:29:30 +0200 Subject: [PATCH 240/560] More init fixes --- radio/src/targets/horus/hal.h | 4 ++-- radio/src/targets/horus/keys_driver.cpp | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) mode change 100644 => 100755 radio/src/targets/horus/keys_driver.cpp diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 9e4da20b8..b87f401fd 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -243,8 +243,8 @@ #define KEYS_GPIOG_PINS (SWITCHES_GPIO_PIN_D_L | SWITCHES_GPIO_PIN_G_H | SWITCHES_GPIO_PIN_G_L | SWITCHES_GPIO_PIN_H | TRIMS_GPIO_PIN_LVD) #if defined(RADIO_TX16S) #define KEYS_GPIOA_PINS (GPIO_Pin_6) - #define KEYS_GPIOC_PINS (GPIO_Pin_4) - #define KEYS_GPIOH_PINS (GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15) + #define KEYS_GPIOC_PINS (GPIO_Pin_4 | GPIO_Pin_13) + #define KEYS_GPIOH_PINS (GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15) #else #define KEYS_GPIOH_PINS (GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15) #endif diff --git a/radio/src/targets/horus/keys_driver.cpp b/radio/src/targets/horus/keys_driver.cpp old mode 100644 new mode 100755 index 0b02a6a03..7433ee58f --- a/radio/src/targets/horus/keys_driver.cpp +++ b/radio/src/targets/horus/keys_driver.cpp @@ -204,16 +204,39 @@ void keysInit() GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; +#if defined(KEYS_GPIOA_PINS) + INIT_KEYS_PINS(GPIOA); +#endif + +#if defined(KEYS_GPIOB_PINS) INIT_KEYS_PINS(GPIOB); +#endif #if defined(KEYS_GPIOC_PINS) INIT_KEYS_PINS(GPIOC); #endif +#if defined(KEYS_GPIOD_PINS) INIT_KEYS_PINS(GPIOD); +#endif + +#if defined(KEYS_GPIOE_PINS) INIT_KEYS_PINS(GPIOE); +#endif + +#if defined(KEYS_GPIOG_PINS) INIT_KEYS_PINS(GPIOG); +#endif + +#if defined(KEYS_GPIOH_PINS) INIT_KEYS_PINS(GPIOH); +#endif + +#if defined(KEYS_GPIOI_PINS) INIT_KEYS_PINS(GPIOI); +#endif + +#if defined(KEYS_GPIOJ_PINS) INIT_KEYS_PINS(GPIOJ); +#endif } From 9dbb5226c0746ba5d744b196f3e000dbb21d28b7 Mon Sep 17 00:00:00 2001 From: Kilrah Date: Mon, 20 Apr 2020 13:42:38 +0200 Subject: [PATCH 241/560] Fix stick directions --- radio/src/targets/common/arm/stm32/adc_driver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/targets/common/arm/stm32/adc_driver.cpp b/radio/src/targets/common/arm/stm32/adc_driver.cpp index 3972ab86c..6360b9676 100644 --- a/radio/src/targets/common/arm/stm32/adc_driver.cpp +++ b/radio/src/targets/common/arm/stm32/adc_driver.cpp @@ -25,7 +25,7 @@ #elif defined(RADIO_T16) const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1,1, -1,1, -1,1}; #elif defined(RADIO_TX16S) - const int8_t adcDirection[NUM_ANALOGS] = {-1,1,-1,1, 1,1,1, -1,1, -1,1}; + const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1,1, -1,1, -1,1}; #elif defined(PCBX10) const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, -1,1,-1, 1,1, 1, -1}; #elif defined(PCBX9E) From 97a2da52641c435f216e6973885e6c5ad4988d15 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 20 Apr 2020 13:48:25 +0200 Subject: [PATCH 242/560] Improve charger detection --- radio/src/targets/horus/hal.h | 1 + radio/src/targets/horus/usb_charger_driver.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index b87f401fd..636e6c9e3 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -339,6 +339,7 @@ #define USB_CHARGER_RCC_AHB1Periph RCC_AHB1Periph_GPIOG #define USB_CHARGER_GPIO GPIOG #define USB_CHARGER_GPIO_PIN GPIO_Pin_11 // PG.11 +#define USB_USBDet_GPIO_PIN GPIO_Pin_13 // PG.13 #else #define USB_CHARGER_RCC_AHB1Periph 0 #endif diff --git a/radio/src/targets/horus/usb_charger_driver.cpp b/radio/src/targets/horus/usb_charger_driver.cpp index 3ba915318..400db6467 100644 --- a/radio/src/targets/horus/usb_charger_driver.cpp +++ b/radio/src/targets/horus/usb_charger_driver.cpp @@ -33,6 +33,6 @@ void usbChargerInit() bool usbChargerLed() { - return GPIO_ReadInputDataBit(USB_CHARGER_GPIO, USB_CHARGER_GPIO_PIN) == Bit_RESET; + return GPIO_ReadInputDataBit(USB_CHARGER_GPIO, USB_USBDet_GPIO_PIN) == 0 ? 0 : GPIO_ReadInputDataBit(USB_CHARGER_GPIO, USB_CHARGER_GPIO_PIN) == Bit_RESET; } From c8f1ff74c1099d918872cfd771559eb83571d76a Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 20 Apr 2020 13:50:22 +0200 Subject: [PATCH 243/560] Improve charger detection --- radio/src/targets/horus/usb_charger_driver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/targets/horus/usb_charger_driver.cpp b/radio/src/targets/horus/usb_charger_driver.cpp index 400db6467..be27276f0 100644 --- a/radio/src/targets/horus/usb_charger_driver.cpp +++ b/radio/src/targets/horus/usb_charger_driver.cpp @@ -23,7 +23,7 @@ void usbChargerInit() { GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Pin = USB_CHARGER_RCC_AHB1Periph; + GPIO_InitStructure.GPIO_Pin = USB_CHARGER_GPIO_PIN | USB_USBDet_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; From 68584a7262e2a941f6eb04184fb786d21da1da60 Mon Sep 17 00:00:00 2001 From: Kilrah Date: Mon, 20 Apr 2020 14:26:57 +0200 Subject: [PATCH 244/560] No extra switches on TX16S --- radio/src/targets/horus/hal.h | 7 +++++-- radio/src/targets/horus/keys_driver.cpp | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 636e6c9e3..14d2d27ed 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -131,7 +131,10 @@ #define SWITCHES_GPIO_REG_H GPIOG->IDR #define SWITCHES_GPIO_PIN_H GPIO_Pin_7 // PG.07 -#if defined(PCBX10) +#if defined(RADIO_TX16S) + #define STORAGE_SWITCH_I + #define STORAGE_SWITCH_J +#elif defined(PCBX10) // Gimbal switch left #define STORAGE_SWITCH_I #define HARDWARE_SWITCH_I @@ -244,7 +247,7 @@ #if defined(RADIO_TX16S) #define KEYS_GPIOA_PINS (GPIO_Pin_6) #define KEYS_GPIOC_PINS (GPIO_Pin_4 | GPIO_Pin_13) - #define KEYS_GPIOH_PINS (GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15) + #define KEYS_GPIOH_PINS (GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12) #else #define KEYS_GPIOH_PINS (GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15) #endif diff --git a/radio/src/targets/horus/keys_driver.cpp b/radio/src/targets/horus/keys_driver.cpp index 7433ee58f..b19b406ae 100755 --- a/radio/src/targets/horus/keys_driver.cpp +++ b/radio/src/targets/horus/keys_driver.cpp @@ -184,8 +184,10 @@ uint32_t switchState(uint8_t index) ADD_2POS_CASE(F); ADD_3POS_CASE(G, 6); ADD_2POS_CASE(H); +#if !defined(RADIO_TX16S) ADD_2POS_CASE(I); ADD_2POS_CASE(J); +#endif #endif default: break; From c2ab1d96f3844650594ee056dcc5e8fe9c20065a Mon Sep 17 00:00:00 2001 From: Kilrah Date: Mon, 20 Apr 2020 14:35:13 +0200 Subject: [PATCH 245/560] Revert "No extra switches on TX16S" This reverts commit 68584a7262e2a941f6eb04184fb786d21da1da60. --- radio/src/targets/horus/hal.h | 7 ++----- radio/src/targets/horus/keys_driver.cpp | 2 -- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 14d2d27ed..636e6c9e3 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -131,10 +131,7 @@ #define SWITCHES_GPIO_REG_H GPIOG->IDR #define SWITCHES_GPIO_PIN_H GPIO_Pin_7 // PG.07 -#if defined(RADIO_TX16S) - #define STORAGE_SWITCH_I - #define STORAGE_SWITCH_J -#elif defined(PCBX10) +#if defined(PCBX10) // Gimbal switch left #define STORAGE_SWITCH_I #define HARDWARE_SWITCH_I @@ -247,7 +244,7 @@ #if defined(RADIO_TX16S) #define KEYS_GPIOA_PINS (GPIO_Pin_6) #define KEYS_GPIOC_PINS (GPIO_Pin_4 | GPIO_Pin_13) - #define KEYS_GPIOH_PINS (GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12) + #define KEYS_GPIOH_PINS (GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15) #else #define KEYS_GPIOH_PINS (GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15) #endif diff --git a/radio/src/targets/horus/keys_driver.cpp b/radio/src/targets/horus/keys_driver.cpp index b19b406ae..7433ee58f 100755 --- a/radio/src/targets/horus/keys_driver.cpp +++ b/radio/src/targets/horus/keys_driver.cpp @@ -184,10 +184,8 @@ uint32_t switchState(uint8_t index) ADD_2POS_CASE(F); ADD_3POS_CASE(G, 6); ADD_2POS_CASE(H); -#if !defined(RADIO_TX16S) ADD_2POS_CASE(I); ADD_2POS_CASE(J); -#endif #endif default: break; From bfec17e806742af4a9ac2bb58714e93a3931d31d Mon Sep 17 00:00:00 2001 From: DanielGeA <33811722+dgatf@users.noreply.github.com> Date: Tue, 21 Apr 2020 11:11:56 +0100 Subject: [PATCH 246/560] Spanish translation (#7530) --- radio/src/translations/es.h.txt | 320 +++++++++++++++----------------- 1 file changed, 151 insertions(+), 169 deletions(-) diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index a62532e1a..73bbf0b16 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -19,7 +19,7 @@ * */ -// ES translations author: Jose Moreno +// ES translations authors: Jose Moreno , Daniel GeA /* * !!!!! DO NOT EDIT es.h - EDIT es.h.txt INSTEAD !!!!!!! @@ -49,11 +49,11 @@ #define LEN_MMMINV "\003" #define TR_MMMINV "---""INV" -#define LEN_VBEEPMODE "\005" -#define TR_VBEEPMODE "Mudo ""Alarm""NoKey""Todo " +#define LEN_VBEEPMODE "\010" +#define TR_VBEEPMODE "Silencio""Alarma\0 ""No tecla""Todo\0 " -#define LEN_VBLMODE "\005" -#define TR_VBLMODE "OFF\0 ""Keys\0""Stks\0""Ambos""ON\0" +#define LEN_VBLMODE "\006" +#define TR_VBLMODE "OFF\0 ""Teclas""Sticks""Ambos\0""ON\0 " #define LEN_TRNMODE "\003" #define TR_TRNMODE "OFF""+=\0"":=" @@ -68,8 +68,8 @@ #define TR_AUX_SERIAL_MODES "OFF\0 ""Telem Mirror\0""Telemetria\0 ""Entrenador SBUS""LUA\0 " #endif -#define LEN_SWTYPES "\006" -#define TR_SWTYPES "Nada\0 ""Palanc""2POS\0 ""3POS\0" +#define LEN_SWTYPES "\007" +#define TR_SWTYPES "Nada\0 ""Palanca""2POS\0 ""3POS\0 " #define LEN_POTTYPES TR("\013", "\017") #define TR_POTTYPES TR("Nada\0 ""Pot con fij""Multipos\0 ""Pot\0 ", "Nada\0 ""Pot con fijador""Switch multipos""Pot\0 ") @@ -86,11 +86,11 @@ #define LEN_COUNTRYCODES TR("\002", "\007") #define TR_COUNTRYCODES TR("US""JP""EU", "America""Japon\0 ""Europa\0") -#define LEN_USBMODES TR("\006", "\010") -#define TR_USBMODES TR("Pregun""Joyst\0""SDCard""Serie\0", "Pregunta""Joystick""SDCard\0 ""Serie\0 ") +#define LEN_USBMODES "\010" +#define TR_USBMODES "Pregunta""Joystick""SDCard\0 ""Serie\0 " -#define LEN_JACKMODES "\007" -#define TR_JACKMODES "Pregunt""Audio\0 ""Entrena" +#define LEN_JACKMODES "\010" +#define TR_JACKMODES "Pregunta""Audio\0 ""Entrena." #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (cable)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetr." @@ -98,13 +98,13 @@ #define TR_MULTI_CUSTOM "Custom" #define LEN_VTRIMINC TR("\006", "\013") -#define TR_VTRIMINC TR("Expo ""ExFino""Fino ""Medio ""Grueso", "Exponencial""Extra Fino ""Fino ""Medio ""Grueso ") +#define TR_VTRIMINC TR("Expo\0 ""ExFino""Fino\0 ""Medio\0""Grueso", "Exponencial""Extra fino\0""Fino\0 ""Medio\0 ""Grueso\0 ") -#define LEN_VDISPLAYTRIMS "\006" -#define TR_VDISPLAYTRIMS "No\0 ""Cambiar""Si\0 " +#define LEN_VDISPLAYTRIMS "\007" +#define TR_VDISPLAYTRIMS "No\0 ""Cambiar""Si\0 " -#define LEN_VBEEPCOUNTDOWN "\006" -#define TR_VBEEPCOUNTDOWN "SilencBeeps\0Voz\0 Haptic" +#define LEN_VBEEPCOUNTDOWN "\010" +#define TR_VBEEPCOUNTDOWN "Silencio""Beeps\0 ""Voz\0 ""Haptic\0 " #define LEN_VVARIOCENTER "\010" #define TR_VVARIOCENTER "Tono\0 ""Silencio" @@ -143,21 +143,21 @@ #define LEN_VMIXTRIMS "\003" #if defined(PCBHORUS) - #define TR_VMIXTRIMS "OFF""ON\0""Dir""Ele""Ace""Ale""T5\0""T6\0" + #define TR_VMIXTRIMS "OFF""ON\0""Rud""Ele""Thr""Ail""T5\0""T6\0" #else - #define TR_VMIXTRIMS "OFF""ON\0""Dir""Ele""Ace""Ale" + #define TR_VMIXTRIMS "OFF""ON\0""Rud""Ele""Thr""Ail" #endif -#if defined(PCBTARANIS) +#if LCD_W >= 212 #define TR_CSWTIMER "Timer" - #define TR_CSWSTICKY "Stcky" - #define TR_CSWRANGE "Range" - #define TR_CSWSTAY "Edge\0" + #define TR_CSWSTICKY "Pega\0" + #define TR_CSWRANGE "Rango" + #define TR_CSWSTAY "Borde" #else #define TR_CSWTIMER "Tim\0 " - #define TR_CSWSTICKY "Glue\0" - #define TR_CSWRANGE "Rnge\0" - #define TR_CSWSTAY "Edge\0" + #define TR_CSWSTICKY "Pega\0" + #define TR_CSWRANGE "Rngo\0" + #define TR_CSWSTAY "Bord\0" #endif #define TR_CSWEQUAL "a=x\0 " @@ -174,7 +174,7 @@ #endif #if defined(AUDIO) - #define TR_SOUND "Oir Sonido" + #define TR_SOUND "Oir sonido" #else #define TR_SOUND "Beep\0 " #endif @@ -234,57 +234,39 @@ #define TR_SF_SCREENSHOT "Captura" #define TR_SF_RESERVE "[reserv.]\0" -#define TR_VFSWFUNC TR_SF_SAFETY "Entrena.\0 ""Inst. Trim""Reset\0 ""Set \0 " TR_ADJUST_GVAR "Volumen\0 " "SetFailsfe" "RangeCheck" "ModuleBind" TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_SF_RESERVE TR_SF_PLAY_SCRIPT TR_SF_RESERVE TR_SF_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Luz fondo\0" TR_SF_SCREENSHOT TR_SF_TEST - -#define LEN_VFSWRESET TR("\004", "\011") +#define TR_VFSWFUNC TR_SF_SAFETY "Entrenador""Inst. Trim""Reset\0 ""Ajuste \0 " TR_ADJUST_GVAR "Volumen\0 " "Failsafe\0 " "CheckRango" "Enl.Modulo" TR_SOUND TR_PLAY_TRACK TR_PLAY_VALUE TR_SF_RESERVE TR_SF_PLAY_SCRIPT TR_SF_RESERVE TR_SF_BG_MUSIC TR_VVARIO TR_HAPTIC TR_SDCLOGS "Luz Fondo\0" TR_SF_SCREENSHOT TR_SF_TEST +#define LEN_VFSWRESET TR("\004", "\012") #define TR_FSW_RESET_TELEM TR("Telm", "Telemetria") -#if defined(PCBTARANIS) +#if LCD_W >= 212 #define TR_FSW_RESET_TIMERS "Timer 1\0 ""Timer 2\0 ""Timer 3\0 " #else #define TR_FSW_RESET_TIMERS "Tmr1""Tmr2""Tmr3" #endif -#define TR_VFSWRESET TR(TR_FSW_RESET_TIMERS "All\0" TR_FSW_RESET_TELEM, TR_FSW_RESET_TIMERS "All\0 " TR_FSW_RESET_TELEM) +#define TR_VFSWRESET TR(TR_FSW_RESET_TIMERS "Todo" TR_FSW_RESET_TELEM, TR_FSW_RESET_TIMERS "Todo\0 " TR_FSW_RESET_TELEM) #define LEN_FUNCSOUNDS TR("\004", "\006") #define TR_FUNCSOUNDS TR("Bp1\0""Bp2\0""Bp3\0""Avs1""Avs2""Chee""Rata""Tick""Sirn""Ring""SciF""Robt""Chrp""Tada""Crck""Alrm", "Beep1 ""Beep2 ""Beep3 ""Aviso1""Aviso2""Cheep ""Ratata""Tick ""Sirena""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""AlmClk") #define LEN_VTELEMCHNS "\004" - #define TR_TELEM_RESERVE TR("[--]", "[---]") - #define TR_TELEM_TIME TR("Time", "Time\0") - #define TR_RAS TR("SWR\0", "SWR\0 ") - #define TR_RX_BATT TR("[NA]", "[NA]\0") - #define TR_A3_A4 TR("A3\0 ""A4\0 ", "A3\0 ""A4\0 ") - #define TR_A3_A4_MIN TR("A3-\0""A4-\0", "A3-\0 ""A4-\0 ") - -#define TR_ASPD_MAX TR("ASp+", "ASpd+") - -#if defined(PCBTARANIS) - #define TR_TELEM_RSSI_RX "RSSI\0" -#else - #define TR_TELEM_RSSI_RX TR("Rx\0 ", "Rx\0 ") -#endif - - #define TR_TELEM_TIMERS TR("Tmr1""Tmr2""Tmr3", "Tmr1\0""Tmr2\0""Tmr3\0") - #define LENGTH_UNIT_IMP "ft\0" #define SPEED_UNIT_IMP "mph" #define LENGTH_UNIT_METR "m\0 " #define SPEED_UNIT_METR "kmh" - #define LEN_VUNITSSYSTEM "\007" - #define TR_VUNITSSYSTEM "Metrico""Imperial" - #define LEN_VTELEMUNIT "\003" - #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""rad""ml\0""fOz" +#define LEN_VUNITSSYSTEM "\010" +#define TR_VUNITSSYSTEM "Metrico\0""Imperial" +#define LEN_VTELEMUNIT "\003" +#define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""rad""ml\0""fOz" #define STR_V (STR_VTELEMUNIT+1) #define STR_A (STR_VTELEMUNIT+4) -#define LEN_VTELEMSCREENTYPE "\004" -#define TR_VTELEMSCREENTYPE "Nums""Bars" +#define LEN_VTELEMSCREENTYPE "\007" +#define TR_VTELEMSCREENTYPE "Nada\0 ""Numeros""Barras\0""Script\0" #define LEN_GPSFORMAT "\004" #define TR_GPSFORMAT "HMS NMEA" @@ -323,12 +305,12 @@ #define LEN_VSWITCHES "\003" #define LEN_VSRCRAW "\004" -#define TR_STICKS_VSRCRAW "\307Dir""\307Ele""\307Thr""\307Ale" +#define TR_STICKS_VSRCRAW "\307Rud""\307Ele""\307Thr""\307Ail" #if defined(PCBHORUS) - #define TR_TRIMS_VSRCRAW "\313Dir""\313Ele""\313Thr""\313Ale""\313T5\0""\313T6\0" + #define TR_TRIMS_VSRCRAW "\313Rud""\313Ele""\313Thr""\313Ail""\313T5\0""\313T6\0" #else - #define TR_TRIMS_VSRCRAW TR("TrmD" "TrmE" "TrmT" "TrmA", "\313Dir""\313Ele""\313Thr""\313Ale") + #define TR_TRIMS_VSRCRAW TR("TrmR" "TrmE" "TrmT" "TrmA", "\313Rud""\313Ele""\313Thr""\313Ail") #endif #if defined(PCBHORUS) @@ -375,14 +357,14 @@ #define TR_VTRAINER_MULTI "Master/Multi" #define LEN_VFAILSAFE "\011" -#define TR_VFAILSAFE "No\0 ""Guardar\0 ""Adaptar\0 ""Sin pulso""Receptor\0" +#define TR_VFAILSAFE "No\0 ""Hold\0 ""Custom\0 ""No pulsos""Receptor\0" #define LEN_VSENSORTYPES "\012" #define TR_VSENSORTYPES "Custom\0 ""Calculado" -#define LEN_VFORMULAS "\010" -#define TR_VFORMULAS "Suma\0 ""Media\0 ""Min\0 ""Max\0 ""Multipl.""Total\0 ""Cell\0 ""Consumo\0""Distanc." +#define LEN_VFORMULAS "\011" +#define TR_VFORMULAS "Suma\0 ""Media\0 ""Min\0 ""Max\0 ""Multipl. ""Total\0 ""Cell\0 ""Consumo\0 ""Distancia" #define LEN_VPREC "\004" #define TR_VPREC "0.--""0.0 ""0.00" @@ -431,24 +413,24 @@ #define TR_FREE "libre" #define TR_DELETEMODEL "BORRAR MODELO" #define TR_COPYINGMODEL "Copiando modelo.." -#define TR_MOVINGMODEL "Mover modelo..." -#define TR_LOADINGMODEL "Cargar modelo..." +#define TR_MOVINGMODEL "Moviendo modelo..." +#define TR_LOADINGMODEL "Cargando modelo..." #define TR_NAME "Nombre" -#define TR_MODELNAME "Nom.Modelo" -#define TR_PHASENAME "Nom.Fase " -#define TR_MIXNAME "Nom.Mezcla" -#define TR_INPUTNAME TR("N.entr","Nombre entrada") -#define TR_EXPONAME TR("N.expo","Nombre expo") -#define TR_BITMAP "Imagen Modelo" -#define TR_TIMER TR("Reloj","Reloj ") -#define TR_ELIMITS TR("E.Limite","Ampliar Limites") -#define TR_ETRIMS TR("E.Trims","Ampliar Trims") -#define TR_TRIMINC "Paso Trim" -#define TR_DISPLAY_TRIMS "Ver Trims" -#define TR_TTRACE TR("Fuente-A", INDENT "Fuente Acelerad") -#define TR_TTRIM TR("Trim-A", INDENT "Trim Acelerad") -#define TR_BEEPCTR TR("Beep ctr","Beep centro") -#define TR_USE_GLOBAL_FUNCS "Funcs glob." +#define TR_MODELNAME TR("Nom. modelo", "Nombre modelo") +#define TR_PHASENAME "Nombre fase " +#define TR_MIXNAME TR("Nom. mezcla", "Nombre mezcla") +#define TR_INPUTNAME TR("Entrada", "Nom. entrada") +#define TR_EXPONAME TR("Nom.", "Nombre expo") +#define TR_BITMAP "Imagen modelo" +#define TR_TIMER TR("Timer", "Timer ") +#define TR_ELIMITS TR("E.Limite", "Ampliar limites") +#define TR_ETRIMS TR("E.Trims", "Ampliar trims") +#define TR_TRIMINC "Paso trim" +#define TR_DISPLAY_TRIMS "Ver trims" +#define TR_TTRACE TR("Fuente-A", INDENT "Fuente acelerador") +#define TR_TTRIM TR("Trim-A", INDENT "Trim acelerador") +#define TR_BEEPCTR TR("Beep ctr", "Beep centro") +#define TR_USE_GLOBAL_FUNCS TR("Funcs. glob.", "Usar func. globales") #if defined(PCBSKY9X) && defined(REVX) #define TR_OUTPUT_TYPE INDENT "Output" #endif @@ -458,7 +440,7 @@ #define STR_WARN_BATTVOLTAGE TR(INDENT "Salida es VBAT: ", INDENT "Aviso: señal salida es VBAT: ") #define TR_MS "ms" #define TR_FREQUENCY INDENT "Frequencia" -#define TR_SWITCH "Interr" +#define TR_SWITCH TR("Interr.", "Interruptor") #define TR_TRIMS "Trims" #define TR_FADEIN "Inicio" #define TR_FADEOUT "Final" @@ -466,28 +448,28 @@ #define TR_CHECKTRIMS CENTER "\006Check\012Trims" #define OFS_CHECKTRIMS CENTER_OFS+(9*FW) #define TR_SWASHTYPE "Tipo ciclico" -#define TR_COLLECTIVE TR("Colectivo", "Fuente Colectivo") +#define TR_COLLECTIVE TR("Colectivo", "Fuente colectivo") #define TR_AILERON TR("Col. lateral", "Fuente col. lateral") #define TR_ELEVATOR TR("Col. long. ", "Fuente col. longitudinal") #define TR_SWASHRING "Ciclico" -#define TR_ELEDIRECTION TR("ELE Direccion","Largo cyc. direccion") -#define TR_AILDIRECTION TR("AIL Direccion","Lateral cyc. direccion") -#define TR_COLDIRECTION TR("PIT Direccion","Coll. pitch direccion") +#define TR_ELEDIRECTION TR("ELE Direccion", "Largo cyc. direccion") +#define TR_AILDIRECTION TR("AIL Direccion", "Lateral cyc. direccion") +#define TR_COLDIRECTION TR("PIT Direccion", "Coll. pitch direccion") #define TR_MODE "Modo" #define TR_SUBTYPE INDENT "Subtipo" #define TR_NOFREEEXPO "No expo libre!" #define TR_NOFREEMIXER "No mezcla lib!" #define TR_SOURCE "Fuente" #define TR_WEIGHT "Cantidad" -#define TR_EXPO TR("Expo","Exponencial") -#define TR_SIDE "Lado" +#define TR_EXPO TR("Expo", "Exponencial") +#define TR_SIDE "Zona" #define TR_DIFFERENTIAL "Diferenc" #define TR_OFFSET "Offset" #define TR_TRIM "Trim" #define TR_DREX "DRex" #define DREX_CHBOX_OFFSET 30 #define TR_CURVE "Curva" -#define TR_FLMODE TR("Modo","Modos") +#define TR_FLMODE TR("Modo", "Modos") #define TR_MIXWARNING "Aviso" #define TR_OFF "OFF" #define TR_ANTENNA "Antena" @@ -497,7 +479,7 @@ #define TR_DELAYUP "Atraso subir" #define TR_SLOWDOWN "Bajar lento " #define TR_SLOWUP "Subir lento" -#define TR_MIXES "MEZCLAS" +#define TR_MIXES "MIXES" #define TR_CV "CV" #define TR_GV TR("G", "GV") #define TR_ACHANNEL "A\004canal" @@ -512,48 +494,48 @@ #define TR_LENGTH INDENT"Longitud" #define TR_BEEP_LENGTH INDENT "Duracion Beep" #define TR_SPKRPITCH INDENT"Tono" -#define TR_HAPTIC_LABEL "Tactil" +#define TR_HAPTIC_LABEL "Haptic" #define TR_HAPTICSTRENGTH INDENT"Intensidad" #define TR_GYRO_LABEL "Gyro" #define TR_GYRO_OFFSET "Offset" #define TR_GYRO_MAX "Max" #define TR_CONTRAST "Contraste" #define TR_ALARMS_LABEL "Alarmas" -#define TR_BATTERY_RANGE TR("Rango bateria","Rango medidor Bater") -#define TR_BATTERYWARNING INDENT"Bateria Baja" +#define TR_BATTERY_RANGE TR("Rango bateria", "Rango medidor bateria") +#define TR_BATTERYWARNING INDENT"Bateria baja" #define TR_INACTIVITYALARM INDENT"Inactividad" -#define TR_MEMORYWARNING INDENT"Memoria Baja" -#define TR_ALARMWARNING INDENT"Sin Sonido" +#define TR_MEMORYWARNING INDENT"Memoria baja" +#define TR_ALARMWARNING INDENT"Sin sonido" #define TR_RSSISHUTDOWNALARM TR(INDENT "Apagado Rssi", INDENT "Check Rssi al apagar") #define TR_MODEL_STILL_POWERED "Modelo aun encendido" #define TR_MODEL_SHUTDOWN "Apagar ?" #define TR_PRESS_ENTER_TO_CONFIRM "Enter para confirmar" #define TR_THROTTLE_LABEL "Potencia" -#define TR_THROTTLEREVERSE TR("Invert_Acel", INDENT "Invertir Acel.") -#define TR_MINUTEBEEP TR("Minuto", "Cada Minuto") -#define TR_BEEPCOUNTDOWN INDENT"Cta. atras" -#define TR_PERSISTENT TR(INDENT"Persist.", INDENT"Persistente") -#define TR_BACKLIGHT_LABEL "Luz Fondo" +#define TR_THROTTLEREVERSE TR("Invert acel", INDENT "Invertir acel.") +#define TR_MINUTEBEEP TR("Minuto", "Cada minuto") +#define TR_BEEPCOUNTDOWN TR(INDENT"Cta. atras", INDENT"Cuenta atras") +#define TR_PERSISTENT TR(INDENT"Persisten.", INDENT"Persistente") +#define TR_BACKLIGHT_LABEL "Luz fondo" #define TR_BLDELAY INDENT"Duracion" -#define TR_BLONBRIGHTNESS INDENT"MAS Brillo" -#define TR_BLOFFBRIGHTNESS INDENT"MENOS Brillo" +#define TR_BLONBRIGHTNESS INDENT"MAS brillo" +#define TR_BLOFFBRIGHTNESS INDENT"MENOS brillo" #define TR_BLCOLOR INDENT "Color" -#define TR_SPLASHSCREEN "Pant. inicio" -#define TR_PWR_ON_DELAY "Atraso On" -#define TR_PWR_OFF_DELAY "Atraso Off" -#define TR_THROTTLEWARNING TR("Aviso-A", INDENT "Aviso Acelerador") -#define TR_SWITCHWARNING TR("Aviso-I", INDENT "Aviso Intrptor") +#define TR_SPLASHSCREEN "Pantalla inicio" +#define TR_PWR_ON_DELAY TR("Atraso On", "Atraso encendido") +#define TR_PWR_OFF_DELAY TR("Atraso Off", "Atraso apagado") +#define TR_THROTTLEWARNING TR("Aviso-A", INDENT "Aviso acelerador") +#define TR_SWITCHWARNING TR("Aviso-I", INDENT "Aviso interruptor") #define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") #define TR_SLIDERWARNING TR(INDENT "Pos. slid.", INDENT "Posiciones slider") #define TR_POTWARNING TR("Aviso pot", INDENT "Aviso pot") -#define TR_TIMEZONE TR("Zona Hora", "GPS Zona Hora") +#define TR_TIMEZONE TR("Zona horaria", INDENT "Zona horaria") #define TR_ADJUST_RTC TR("Ajustar RTC", INDENT "Ajustar RTC") #define TR_GPS "GPS" #define TR_RXCHANNELORD TR("Rx Orden canal", "Orden habitual canales") #define TR_STICKS "Sticks" #define TR_POTS "Pots" #define TR_SWITCHES "Switches" -#define TR_SWITCHES_DELAY "Atraso switch." +#define TR_SWITCHES_DELAY TR("Atraso switch.", "Atraso switches") #define TR_SLAVE "Esclavo" #define TR_MODESRC "Modo\006% Fuente" #define TR_MULTIPLIER "Multiplicar" @@ -588,7 +570,7 @@ #define TR_PRESSANYKEYTOSKIP "Pulsar tecla para omitir" #define TR_THROTTLENOTIDLE "Aceler. Activado" #define TR_ALARMSDISABLED "Alarmas Desact." -#define TR_PRESSANYKEY TR("\010Pulsa una Tecla", "Pulsa una Tecla") +#define TR_PRESSANYKEY TR("\010Pulsa una tecla", "Pulsa una tecla") #define TR_BADEEPROMDATA "Error datos EEprom" #define TR_BAD_RADIO_DATA "Error datos radio" #define TR_EEPROMFORMATTING "Formateo EEPROM" @@ -599,8 +581,8 @@ #define TR_MENUTRAINER "ENTRENADOR" #define TR_MENUSPECIALFUNCS "FUNCIONES GLOBALES" #define TR_MENUVERSION "VERSION" -#define TR_MENU_RADIO_SWITCHES TR("INTERUPTS", "TEST INTERUP.") -#define TR_MENU_RADIO_ANALOGS TR("ANAS", "ENTRADAS ANALOG") +#define TR_MENU_RADIO_SWITCHES TR("INTERUPTS", "TEST INTERRUPTORES") +#define TR_MENU_RADIO_ANALOGS TR("ANALOGICOS", "TEST ANALOGICOS") #define TR_MENUCALIBRATION "CALIBRACION" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Offsets" @@ -610,7 +592,7 @@ #define TR_CHANNELS2FAILSAFE "Canales=>Failsafe" #define TR_CHANNEL2FAILSAFE "Canal=>Failsafe" #define TR_MENUMODELSEL TR("MODELOS", "SELECCION MODELO") -#define TR_MENUSETUP "CONFIG. MODELO" +#define TR_MENUSETUP TR("CONFIG. MODELO", "CONFIGURACION MODELO") #define TR_MENUFLIGHTMODE "MODO DE VUELO" #define TR_MENUFLIGHTMODES "MODOS DE VUELO" #define TR_MENUHELISETUP "CONFIGURACION HELI" @@ -628,13 +610,13 @@ #define TR_MENUCURVES "CURVAS" #define TR_MENUCURVE "CURVA" -#define TR_MENULOGICALSWITCH "INTERRUP. LOGICO" -#define TR_MENULOGICALSWITCHES "INTERRUP. LOGICOS" -#define TR_MENUCUSTOMFUNC "FUNCIONES" +#define TR_MENULOGICALSWITCH "INTERRUP.LOGICO" +#define TR_MENULOGICALSWITCHES TR3("INTERRUP. LOGICOS", "INTERRUP. LOGICOS", "INTERRUPTORES LOGICOS") +#define TR_MENUCUSTOMFUNC TR("FUNCIONES", "FUNCIONES ESPECIALES") #define TR_MENUCUSTOMSCRIPTS "CUSTOM SCRIPTS" #define TR_MENUTELEMETRY "TELEMETRIA" #define TR_MENUTEMPLATES "PLANTILLAS" -#define TR_MENUSTAT "ESTADISTICAS" +#define TR_MENUSTAT TR("ESTAD.", "ESTADISTICAS") #define TR_MENUDEBUG "DEBUG" #define TR_MONITOR_CHANNELS1 "MONITOR CANALES 1/8" #define TR_MONITOR_CHANNELS2 "MONITOR CANALES 9/16" @@ -642,23 +624,23 @@ #define TR_MONITOR_CHANNELS3 "MONITOR CANALES 17/24" #define TR_MONITOR_CHANNELS4 "MONITOR CANALES 25/32" #define TR_MONITOR_OUTPUT_DESC "SALIDAS" -#define TR_MONITOR_MIXER_DESC "MEZCLAS" -#define TR_RECEIVER_NUM TR("RxNum", "Receptor No.") +#define TR_MONITOR_MIXER_DESC "Mixers" +#define TR_RECEIVER_NUM TR("Num Rx", "Receptor No.") #define TR_RECEIVER "Receptor" #define TR_MULTI_RFTUNE TR("Sint.freq.", "RF Freq. sint.fina") #define TR_MULTI_TELEMETRY "Telemetria" -#define TR_MULTI_VIDFREQ TR("Freq. Vid.", "Frecuancia Video") +#define TR_MULTI_VIDFREQ TR("Freq. Vid.", "Frecuencia Video") #define TR_RFPOWER "RF Power" #define TR_MULTI_FIXEDID TR("ID Fijo", "ID Fijo") #define TR_MULTI_OPTION TR("Opcion", "Valor opcion") #define TR_MULTI_AUTOBIND TR(INDENT "Emp Cnl",INDENT "Emparejar en canal") #define TR_DISABLE_CH_MAP TR("No ch map", "Desactivar mapa cnl") -#define TR_DISABLE_TELEM TR("No Telem", "Desactivar Telemetria") +#define TR_DISABLE_TELEM TR("No telem", "Desactivar telem.") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetectar formato") -#define TR_MULTI_LOWPOWER TR(INDENT "Baja potencia", INDENT "Modo de baja potencia") +#define TR_MULTI_LOWPOWER TR(INDENT "Baja poten.", INDENT "Modo de baja poten.") #define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link") #define TR_MODULE_TELEM_ON TR("ON", "Activado") -#define TR_DISABLE_INTERNAL TR("Desac.RF int", "Desactivar modulo interno RF") +#define TR_DISABLE_INTERNAL TR("Desac.RF int", "Desact. mod. int. RF") #define TR_MODULE_NO_SERIAL_MODE TR("No modo serie", "No en modo serie") #define TR_MODULE_NO_INPUT TR("Sin señal", "Sin señal") #define TR_MODULE_NO_TELEMETRY TR3( "No telemetria", "No MULTI_TELEMETRY", "No telemetria (activa MULTI_TELEMETRY)") @@ -674,7 +656,7 @@ #define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON" #define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF" #define TR_PROTOCOL_INVALID TR("Prot. invalido", "Protocolo invalido") -#define TR_MODULE_STATUS TR(INDENT "EStado", INDENT "Estado modulo") +#define TR_MODULE_STATUS TR(INDENT "Estado", INDENT "Estado modulo") #define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Estado proto sync") #define TR_MULTI_SERVOFREQ TR("V ref serv", "Vel. refr. servo") #define TR_MULTI_MAX_THROW TR("Max. Throw", "Activar max. throw") @@ -684,18 +666,18 @@ #define TR_MINRSSI "Min Rssi" #define TR_LATITUDE "Latitud" #define TR_LONGITUDE "Longitud" -#define TR_GPSCOORD TR("Coords GPS", "GPS formato coordenadas") +#define TR_GPSCOORD TR("Coords GPS", INDENT "Formato coordenadas") #define TR_VARIO TR("Vario", "Variometro") #define TR_PITCH_AT_ZERO INDENT "Pitch en cero" #define TR_PITCH_AT_MAX INDENT "Pitch en max" -#define TR_REPEAT_AT_ZERO INDENT "Repet. en cero" +#define TR_REPEAT_AT_ZERO TR(INDENT "Repet. en cero", INDENT "Repetir en cero") #define TR_SHUTDOWN "APAGANDO" #define TR_SAVEMODEL "Grabando modelo" -#define TR_BATT_CALIB "Calib.bat." +#define TR_BATT_CALIB TR("Calib.bat.", "Calibracion bateria") #define TR_CURRENT_CALIB "Calib. actual" #define TR_VOLTAGE INDENT"Voltaje" #define TR_CURRENT INDENT"Actual" -#define TR_SELECT_MODEL "Selec Modelo" +#define TR_SELECT_MODEL TR("Selec. modelo", "Seleccionar modelo") #define TR_CREATE_CATEGORY "Crear categoria" #define TR_RENAME_CATEGORY "Renombrar categoria" #define TR_DELETE_CATEGORY "Borrar categoria" @@ -703,7 +685,7 @@ #define TR_DUPLICATE_MODEL "Duplicar modelo" #define TR_COPY_MODEL "Copiar modelo" #define TR_MOVE_MODEL "Mover modelo" -#define TR_BACKUP_MODEL "Copia sgdad mod." +#define TR_BACKUP_MODEL TR("Copia sgdad. mod.", "Copia seguridad modelo") #define TR_DELETE_MODEL "Borrar modelo" #define TR_RESTORE_MODEL "Restaurar modelo" #define TR_DELETE_ERROR "Error de borrado" @@ -735,8 +717,8 @@ #define TR_RF_PROTOCOL "Protocolo RF" #define TR_MODULE_OPTIONS "Opciones modulo" #define TR_POWER "Potencia" -#define TR_NO_TX_OPTIONS "Sin pciones TX" -#define TR_RTC_BATT "Bat. RTC" +#define TR_NO_TX_OPTIONS "Sin opciones TX" +#define TR_RTC_BATT TR("Bat. RTC", "Bateria RTC") #define TR_POWER_METER_EXT "Medidor potencia(EXT)" #define TR_POWER_METER_INT "Medidor potencia(INT)" #define TR_SPECTRUM_ANALYSER_EXT "Spectro (EXT)" @@ -750,22 +732,22 @@ #define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "ALMAC." #define TR_EEPROM_CONVERTING "Convirtiendo EEPROM" -#define TR_THROTTLEWARN "ACELERADOR" +#define TR_THROTTLEWARN TR("ACELERAD.", "ACELERADOR") #define TR_ALARMSWARN "ALARMAS" -#define TR_SWITCHWARN "INTERPTOR" +#define TR_SWITCHWARN TR("INTERRUP.", "INTERRUPTOR") #define TR_FAILSAFEWARN "FAILSAFE" #define TR_TEST_WARNING TR("TESTING", "TEST BUILD") #define TR_TEST_NOTSAFE "Usar solo para test" -#define TR_WRONG_SDCARDVERSION TR("Ver esperada: ","Version esperada: ") +#define TR_WRONG_SDCARDVERSION TR("Ver esperada: ", "Version esperada: ") #define TR_WARN_RTC_BATTERY_LOW "Bateria RTC baja" #define TR_WARN_MULTI_LOWPOWER "Modo baja potencia" -#define TR_BATTERY "BATERiA" +#define TR_BATTERY "BATERIA" #define TR_WRONG_PCBREV "Placa PCB erronea" #define TR_EMERGENCY_MODE "MODO EMERGENCIA" #define TR_PCBREV_ERROR "Error PCB" #define TR_NO_FAILSAFE "Failsafe no fijado" #define TR_KEYSTUCK "Tecla atascada" -#define TR_INVERT_THR TR("Invertir Acel?", "Invertir Acel.?") +#define TR_INVERT_THR TR("Invertir acel?", "Invertir acel.?") #define TR_SPEAKER_VOLUME INDENT "Volumen" #define TR_LCD "LCD" #define TR_BRIGHTNESS INDENT "Brillo" @@ -774,9 +756,9 @@ #define TR_CPU_MAH "Consumo" #define TR_COPROC "CoProc." #define TR_COPROC_TEMP "MB Temp. \016>" -#define TR_CAPAWARNING INDENT "Capacidad Baja" +#define TR_CAPAWARNING INDENT "Capacidad baja" #define TR_TEMPWARNING INDENT "Sobrecalent" -#define TR_FUNC "Func" +#define TR_FUNC "Funcion" #define TR_V1 "V1" #define TR_V2 "V2" #define TR_DURATION "Duracion" @@ -842,8 +824,8 @@ #define TR_FLASH_BOOTLOADER "Flash bootloader" #define TR_FLASH_EXTERNAL_DEVICE "Flash disp. externo" #define TR_FLASH_RECEIVER_OTA "Flash RX OTA" -#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX by ext. OTA" -#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX by int. OTA" +#define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX por ext. OTA" +#define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX por int. OTA" #define TR_FLASH_BLUETOOTH_MODULE TR("Flash modulo BT", "Flash modulo bluetooth") #define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash unid. pwr mngt" #define TR_CURRENT_VERSION TR("Vers. actual", "Version actual: ") @@ -851,20 +833,20 @@ #define TR_FLASH_INTERNAL_MULTI TR("Flash Multi int", "Flash Multi interno") #define TR_FLASH_EXTERNAL_MODULE TR("Flash modulo ext", "Flash modulo externo") #define TR_FLASH_EXTERNAL_MULTI TR("Flash Multi ext", "Flash Multi externo") -#define TR_FIRMWARE_UPDATE_ERROR TR("Error act FW","Error actualiz. firmware") +#define TR_FIRMWARE_UPDATE_ERROR TR("Error act FW", "Error actualiz. firmware") #define TR_FIRMWARE_UPDATE_SUCCESS "Flash ok" #define TR_WRITING "Escribiendo..." #define TR_CONFIRM_FORMAT "Confirmar formato?" #define TR_INTERNALRF "RF interna" -#define TR_INTERNAL_MODULE TR("Modulo int","Modulo interno") -#define TR_EXTERNAL_MODULE TR("Modulo ext","Modulo externo") +#define TR_INTERNAL_MODULE TR("Modulo int", "Modulo interno") +#define TR_EXTERNAL_MODULE TR("Modulo ext", "Modulo externo") #define TR_OPENTX_UPGRADE_REQUIRED "Actualiz. OpenTX requerida" #define TR_TELEMETRY_DISABLED "Telem. inactiva" #define TR_MORE_OPTIONS_AVAILABLE "Mas opciones disp." #define TR_NO_MODULE_INFORMATION "Sin informacion modulo" #define TR_EXTERNALRF "RF externa" -#define TR_FAILSAFE INDENT"Modo sgdad." -#define TR_FAILSAFESET "AJUSTES SGDAD." +#define TR_FAILSAFE INDENT"Failsafe" +#define TR_FAILSAFESET "AJUSTES FAILSAFE" #define TR_REG_ID "Reg. ID" #define TR_OWNER_ID "Pers. ID" #define TR_PINMAPSET "PINMAP" @@ -908,7 +890,7 @@ #define TR_USB_SERIAL "Serie USB (Debug)" #define TR_SETUP_SCREENS "Pantallas config" #define TR_MONITOR_SCREENS "Monitores" -#define TR_AND_SWITCH "AND Inter." +#define TR_AND_SWITCH TR("Inter. AND", "Interruptor AND") #define TR_SF "CF" #define TR_GF "GF" #define TR_SPEAKER INDENT"Altavoz" @@ -932,13 +914,13 @@ #define TR_DEL_BUTTON BUTTON(TR("Del", "Borrar")) #define TR_RESET_BTN "[Reset]" #define TR_DEBUG "Debug" -#define TR_KEYS_BTN BUTTON(TR("SW","Switches")) -#define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) +#define TR_KEYS_BTN BUTTON(TR("SW", "Switches")) +#define TR_ANALOGS_BTN BUTTON(TR("Analog", "Analogs")) #define TR_CALIBRATION "Calibracion" #define TR_SET "[Ajuste]" -#define TR_TRAINER "Entrena." +#define TR_TRAINER "Entrenador" #define TR_CHANS "Chans" -#define TR_ANTENNAPROBLEM CENTER "¡Problema antena TX!" +#define TR_ANTENNAPROBLEM CENTER "Problema antena TX!" #define TR_MODELIDUSED TR("ID en uso", "ID modelo en uso") #define TR_MODULE "Modulo" #define TR_RX_NAME "Nombre Rx" @@ -947,15 +929,15 @@ #define TR_VALUE "Valor" #define TR_TOPLCDTIMER "Timer LCD superior" #define TR_UNIT "Unidad" -#define TR_TELEMETRY_NEWSENSOR INDENT "Añadir nuevo sensor..." +#define TR_TELEMETRY_NEWSENSOR INDENT "Añadir sensor..." #define TR_CHANNELRANGE INDENT "Canales" #define TR_ANTENNACONFIRM1 "ANTENA EXT." #if defined(PCBX12S) -#define LEN_ANTENNA_MODES "\023" -#define TR_ANTENNA_MODES "Interna\0 ""Preguntar\0 ""Por modelo\0 ""Interno + Externo\0 " +#define LEN_ANTENNA_MODES "\020" +#define TR_ANTENNA_MODES "Interna\0 ""Preguntar\0 ""Por modelo\0 ""Interno + Externo\0" #else -#define LEN_ANTENNA_MODES "\011" -#define TR_ANTENNA_MODES "Interna\0 ""Preguntar\0""Por model""Externa\0 " +#define LEN_ANTENNA_MODES "\012" +#define TR_ANTENNA_MODES "Interna\0 ""Preguntar\0""Por modelo""Externa\0 " #endif #define TR_USE_INTERNAL_ANTENNA TR("Usa antena int.", "Usa antena interna") #define TR_USE_EXTERNAL_ANTENNA TR("Use antena ext.", "Usa antena externa") @@ -967,7 +949,7 @@ #define TR_MODULE_PROTOCOL_WARN_LINE2 "firmware certificado" #define TR_LOWALARM INDENT "Alarma baja" #define TR_CRITICALALARM INDENT "Alarma critica" -#define TR_RSSIALARM_WARN TR("RSSI","TELEMETRY RSSI") +#define TR_RSSIALARM_WARN TR("RSSI", "TELEMETRY RSSI") #define TR_NO_RSSIALARM TR(INDENT "Alarmas desact.", INDENT "Alarmas telemetria desact.") #define TR_DISABLE_ALARM TR(INDENT "Desact. alarmas", INDENT "Desact. alarmas telem.") #define TR_ENABLE_POPUP "Activa Popup" @@ -984,7 +966,7 @@ #define TR_COUNT "Puntos" #define TR_PT "pt" #define TR_PTS "pts" -#define TR_SMOOTH "Suaviz" +#define TR_SMOOTH TR3("Suaviz.", "Suaviz.", "Suavizado") #define TR_COPY_STICKS_TO_OFS TR("Copia stick->subtr", "Copia Sticks a Offset") #define TR_COPY_MIN_MAX_TO_OUTPUTS TR("Copia min/max a sal", "Copia min/max/ctr a salidas") #define TR_COPY_TRIMS_TO_OFS TR("Copia trim->subtr", "Copia trims a subtrim") @@ -993,8 +975,8 @@ #define TR_MIXSOURCE "Entrada mixer" #define TR_CONSTANT "Constante" #define TR_PERSISTENT_MAH INDENT "Valor mAh" -#define TR_PREFLIGHT "Chequeos Prevuelo" -#define TR_CHECKLIST INDENT "Lista verif" +#define TR_PREFLIGHT "Chequeos prevuelo" +#define TR_CHECKLIST TR(INDENT "Lista verif", INDENT "Lista verificacion") #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") #define TR_AUX_SERIAL_MODE "Puerto serie" #define TR_SCRIPT "Script" @@ -1002,7 +984,7 @@ #define TR_OUTPUTS "Salidas" #define STR_EEBACKUP "Copia seg. EEPROM" #define STR_FACTORYRESET "Rest. fabrica" -#define TR_CONFIRMRESET "Borrar TODOS los modelos y configuracion?" +#define TR_CONFIRMRESET "Borrar TODOS los " LCDW_128_480_LINEBREAK "modelos y conf?" #define TR_TOO_MANY_LUA_SCRIPTS "Demasiados Lua scripts!" #define TR_SPORT_UPDATE_POWER_MODE "SP Power" #define LEN_SPORT_UPDATE_POWER_MODES "\004" @@ -1033,7 +1015,7 @@ #define TR_LSW_HEADERS_FUNCTION "Funcion" #define TR_LSW_HEADERS_V1 "V1" #define TR_LSW_HEADERS_V2 "V2" -#define TR_LSW_HEADERS_ANDSW "AND Interrup." +#define TR_LSW_HEADERS_ANDSW "Interrup. AND" #define TR_LSW_HEADERS_DURATION "Duracion" #define TR_LSW_HEADERS_DELAY "Retardo" @@ -1115,10 +1097,10 @@ #define TR_TOP_BAR "Panel superior" #define TR_FLASH_ERASE "Borrar flash..." -#define TR_FLASH_WRITE "Escrivir flash..." +#define TR_FLASH_WRITE "Escribir flash..." #define TR_OTA_UPDATE "Actualizacion OTA..." #define TR_MODULE_RESET "Reset modulo..." -#define TR_UNKNOWN_RX "RX deconocido" +#define TR_UNKNOWN_RX "RX desconocido" #define TR_UNSUPPORTED_RX "RX no soportado" #define TR_OTA_UPDATE_ERROR "Error actualizacion OTA" #define TR_DEVICE_RESET "Reset dispositivo..." @@ -1127,7 +1109,7 @@ #define TR_VIEW_CHANNELS "Ver Canales" #define TR_VIEW_NOTES "Ver Notas" #define TR_MODEL_SELECT "Seleccionar modelo" -#define TR_MODS_FORBIDDEN "Modificacions prohibidas!" +#define TR_MODS_FORBIDDEN "Modificaciones prohibidas" #define TR_UNLOCKED "Desbloqueado" #define TR_ID "ID" #define TR_PRECISION "Precision" @@ -1142,22 +1124,22 @@ #define TR_CELLSENSOR "Cell sensor" #define TR_GPSSENSOR "GPS sensor" #define TR_CURRENTSENSOR "Sensor" -#define TR_AUTOOFFSET "Auto Offset" +#define TR_AUTOOFFSET "Auto offset" #define TR_ONLYPOSITIVE "Positivo" #define TR_FILTER "Filtro" #define TR_TELEMETRYFULL TR("Telem. llena!", "Todas las entradas de telemetria llenas!") #define TR_SERVOS_OK "Servos OK" #define TR_SERVOS_KO "Servos KO" #define TR_INVERTED_SERIAL INDENT "Invertir" -#define TR_IGNORE_INSTANCE INDENT "Ignorar instancia" -#define TR_DISCOVER_SENSORS "Buscar nuevos sensores" +#define TR_IGNORE_INSTANCE TR(INDENT "No inst.", INDENT "Ignora instancias") +#define TR_DISCOVER_SENSORS "Buscar sensores" #define TR_STOP_DISCOVER_SENSORS "Parar busqueda" #define TR_DELETE_ALL_SENSORS "Borrar sensores" #define TR_CONFIRMDELETE "Seguro " LCDW_128_480_LINEBREAK "borrar todo ?" #define TR_SELECT_WIDGET "Seleccionar widget" #define TR_REMOVE_WIDGET "Borrar widget" #define TR_WIDGET_SETTINGS "Config. widget" -#define TR_REMOVE_SCREEN "Borar pantalla" +#define TR_REMOVE_SCREEN "Borrar pantalla" #define TR_SETUP_WIDGETS "Config. widgets" #define TR_USER_INTERFACE "Interfaz" #define TR_THEME "Tema" @@ -1169,25 +1151,25 @@ #define TR_MAIN_COLOR "Color principal" #define TR_TEXT_VIEWER "Visor de texto" -#define TR_MENU_INPUTS "\314Inputs" +#define TR_MENU_INPUTS "\314Entradas" #define TR_MENU_LUA "\322Lua scripts" #define TR_MENU_STICKS "\307Sticks" #define TR_MENU_POTS "\310Pots" #define TR_MENU_MAX "\315MAX" #define TR_MENU_HELI "\316Ciclico" #define TR_MENU_TRIMS "\313Trims" -#define TR_MENU_SWITCHES "\312Switches" -#define TR_MENU_LOGICAL_SWITCHES "\312Logical Switches" +#define TR_MENU_SWITCHES "\312Interruptores" +#define TR_MENU_LOGICAL_SWITCHES TR("\312Interr. logicos", "\312Interruptores logicos") #define TR_MENU_TRAINER "\317Entrenador" #define TR_MENU_CHANNELS "\320Canales" #define TR_MENU_GVARS "\311GVars" #define TR_MENU_TELEMETRY "\321Telemetria" -#define TR_MENU_DISPLAY "Monitor" +#define TR_MENU_DISPLAY "MONITOR" #define TR_MENU_OTHER "Otros" #define TR_MENU_INVERT "Invertir" #define TR_JITTER_FILTER "Filtro ADC" #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltaje") -#define TR_AUTH_FAILURE "Fallo auth." +#define TR_AUTH_FAILURE "Fallo " LCDW_128_480_LINEBREAK "autentificacion" #define ZSTR_FLR "FLR" #define ZSTR_RSSI "RSSI" From ef8640a7733899d5d6519bd11f4417949c803782 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 21 Apr 2020 12:14:24 +0200 Subject: [PATCH 247/560] Allow alphanumerical in ownerID (#7523) --- companion/src/generaledit/generalsetup.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/companion/src/generaledit/generalsetup.ui b/companion/src/generaledit/generalsetup.ui index d4e9bff01..98f9e76dd 100644 --- a/companion/src/generaledit/generalsetup.ui +++ b/companion/src/generaledit/generalsetup.ui @@ -1124,7 +1124,7 @@ p, li { white-space: pre-wrap; } - aaaaaaAA + nnnnnnNN 8 From e7f599237e19f2c6162b853a5d567c33218a0fb4 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 21 Apr 2020 12:22:29 +0200 Subject: [PATCH 248/560] Add mililiter per minute unit to Companion (#7529) --- companion/src/firmwares/sensordata.cpp | 2 ++ companion/src/firmwares/sensordata.h | 1 + companion/src/modeledit/telemetry_sensor.ui | 5 +++++ 3 files changed, 8 insertions(+) diff --git a/companion/src/firmwares/sensordata.cpp b/companion/src/firmwares/sensordata.cpp index 8d677ed50..0a7e7eada 100644 --- a/companion/src/firmwares/sensordata.cpp +++ b/companion/src/firmwares/sensordata.cpp @@ -82,6 +82,8 @@ QString SensorData::unitString() const return tr("seconds"); case UNIT_CELLS: return tr("V"); + case UNIT_MILLILITERS_PER_MINUTE: + return tr("ml/minute"); default: return ""; } diff --git a/companion/src/firmwares/sensordata.h b/companion/src/firmwares/sensordata.h index a5cdb4957..65a8a4957 100644 --- a/companion/src/firmwares/sensordata.h +++ b/companion/src/firmwares/sensordata.h @@ -90,6 +90,7 @@ class SensorData { UNIT_RADIANS, UNIT_MILLILITERS, UNIT_FLOZ, + UNIT_MILLILITERS_PER_MINUTE, UNIT_HOURS, UNIT_MINUTES, UNIT_SECONDS, diff --git a/companion/src/modeledit/telemetry_sensor.ui b/companion/src/modeledit/telemetry_sensor.ui index 52660b4f0..12af2cf06 100644 --- a/companion/src/modeledit/telemetry_sensor.ui +++ b/companion/src/modeledit/telemetry_sensor.ui @@ -539,6 +539,11 @@ US fl.Oz. + + + ml/min + + From a1cd83598f5bef9ceb1b47479f3bad983cd41209 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 21 Apr 2020 14:44:21 +0200 Subject: [PATCH 249/560] Add output name on bottom status bar even when no mix line is active (#7537) --- radio/src/gui/480x272/model_mixes.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/radio/src/gui/480x272/model_mixes.cpp b/radio/src/gui/480x272/model_mixes.cpp index 0f98dc9d9..da1b74f78 100644 --- a/radio/src/gui/480x272/model_mixes.cpp +++ b/radio/src/gui/480x272/model_mixes.cpp @@ -607,6 +607,8 @@ bool menuModelMixAll(event_t event) if (!s_copyMode) { attr = INVERS; } + if (g_model.limitData[ch-1].name[0] != '\0') + lcdDrawSizedText(MENUS_MARGIN_LEFT, MENU_FOOTER_TOP, g_model.limitData[ch-1].name, sizeof(g_model.limitData[ch-1].name), MENU_TITLE_COLOR | LEFT | ZCHAR); } if (cur-menuVerticalOffset >= 0 && cur-menuVerticalOffset < NUM_BODY_LINES) { putsChn(MENUS_MARGIN_LEFT, y, ch, attr); // show CHx From 07b096ff4417e794ad0f7029451158e71408372b Mon Sep 17 00:00:00 2001 From: DanielGeA <33811722+dgatf@users.noreply.github.com> Date: Tue, 21 Apr 2020 13:49:18 +0100 Subject: [PATCH 250/560] Add missing translatables (#7532) Add missing translatables --- radio/src/gui/480x272/layouts/layout1x1.cpp | 4 ++-- radio/src/gui/480x272/layouts/layout2+1.cpp | 8 +++---- radio/src/gui/480x272/layouts/layout2x1.cpp | 2 +- radio/src/gui/480x272/layouts/layout2x2.cpp | 2 +- radio/src/gui/480x272/layouts/layout2x4.cpp | 16 +++++++------- radio/src/gui/480x272/model_curves.cpp | 2 +- radio/src/gui/480x272/model_failsafe.cpp | 2 +- radio/src/gui/480x272/model_select.cpp | 2 +- radio/src/gui/480x272/model_setup.cpp | 2 +- radio/src/gui/480x272/radio_hardware.cpp | 2 +- radio/src/gui/480x272/screens_setup.cpp | 4 ++-- radio/src/gui/480x272/widgets/gauge.cpp | 8 +++---- radio/src/gui/480x272/widgets/outputs.cpp | 6 ++--- radio/src/gui/480x272/widgets/text.cpp | 8 +++---- radio/src/gui/480x272/widgets/timer.cpp | 2 +- radio/src/gui/480x272/widgets/value.cpp | 6 ++--- .../src/gui/common/stdlcd/view_telemetry.cpp | 2 +- radio/src/translations.cpp | 20 +++++++++++++++++ radio/src/translations.h | 17 ++++++++++++++ radio/src/translations/cz.h.txt | 21 ++++++++++++++++++ radio/src/translations/de.h.txt | 22 +++++++++++++++++++ radio/src/translations/en.h.txt | 21 ++++++++++++++++++ radio/src/translations/es.h.txt | 22 ++++++++++++++++++- radio/src/translations/fi.h.txt | 22 ++++++++++++++++++- radio/src/translations/fr.h.txt | 21 ++++++++++++++++++ radio/src/translations/it.h.txt | 22 ++++++++++++++++++- radio/src/translations/nl.h.txt | 22 ++++++++++++++++++- radio/src/translations/pl.h.txt | 22 ++++++++++++++++++- radio/src/translations/pt.h.txt | 22 ++++++++++++++++++- radio/src/translations/se.h.txt | 22 ++++++++++++++++++- 30 files changed, 308 insertions(+), 46 deletions(-) diff --git a/radio/src/gui/480x272/layouts/layout1x1.cpp b/radio/src/gui/480x272/layouts/layout1x1.cpp index 0feeb1436..79bc53739 100644 --- a/radio/src/gui/480x272/layouts/layout1x1.cpp +++ b/radio/src/gui/480x272/layouts/layout1x1.cpp @@ -25,8 +25,8 @@ const uint8_t LBM_LAYOUT_1x1[] = { }; const ZoneOption OPTIONS_LAYOUT_1x1[] = { - { "Top bar", ZoneOption::Bool }, - { "Sliders+Trims", ZoneOption::Bool }, + { STR_TOP_BAR, ZoneOption::Bool }, + { STR_SLIDERS_TRIMS, ZoneOption::Bool }, { NULL, ZoneOption::Bool } }; diff --git a/radio/src/gui/480x272/layouts/layout2+1.cpp b/radio/src/gui/480x272/layouts/layout2+1.cpp index 39abb1a9e..860cc94f9 100644 --- a/radio/src/gui/480x272/layouts/layout2+1.cpp +++ b/radio/src/gui/480x272/layouts/layout2+1.cpp @@ -25,10 +25,10 @@ const uint8_t LBM_LAYOUT_2P1[] = { }; const ZoneOption OPTIONS_LAYOUT_2P1[] = { - { "Top bar", ZoneOption::Bool }, - { "Flight mode", ZoneOption::Bool }, - { "Sliders", ZoneOption::Bool }, - { "Trims", ZoneOption::Bool }, + { STR_TOP_BAR, ZoneOption::Bool }, + { STR_FLIGHT_MODE, ZoneOption::Bool }, + { STR_SLIDERS, ZoneOption::Bool }, + { STR_TRIMS, ZoneOption::Bool }, { NULL, ZoneOption::Bool } }; diff --git a/radio/src/gui/480x272/layouts/layout2x1.cpp b/radio/src/gui/480x272/layouts/layout2x1.cpp index a96fc7006..3c06d7079 100644 --- a/radio/src/gui/480x272/layouts/layout2x1.cpp +++ b/radio/src/gui/480x272/layouts/layout2x1.cpp @@ -25,7 +25,7 @@ const uint8_t LBM_LAYOUT_2x1[] = { }; const ZoneOption OPTIONS_LAYOUT_2x1[] = { - { "Top bar", ZoneOption::Bool }, + { STR_TOP_BAR, ZoneOption::Bool }, { NULL, ZoneOption::Bool } }; diff --git a/radio/src/gui/480x272/layouts/layout2x2.cpp b/radio/src/gui/480x272/layouts/layout2x2.cpp index 0efa2df62..7d2f16f09 100644 --- a/radio/src/gui/480x272/layouts/layout2x2.cpp +++ b/radio/src/gui/480x272/layouts/layout2x2.cpp @@ -25,7 +25,7 @@ const uint8_t LBM_LAYOUT_2x2[] = { }; const ZoneOption OPTIONS_LAYOUT_2x2[] = { - { "Top bar", ZoneOption::Bool }, + { STR_TOP_BAR, ZoneOption::Bool }, { NULL, ZoneOption::Bool } }; diff --git a/radio/src/gui/480x272/layouts/layout2x4.cpp b/radio/src/gui/480x272/layouts/layout2x4.cpp index b6e009acc..0850c7e67 100644 --- a/radio/src/gui/480x272/layouts/layout2x4.cpp +++ b/radio/src/gui/480x272/layouts/layout2x4.cpp @@ -25,14 +25,14 @@ const uint8_t LBM_LAYOUT_2x4[] = { }; const ZoneOption OPTIONS_LAYOUT_2x4[] = { - { "Top bar", ZoneOption::Bool }, - { "Flight mode", ZoneOption::Bool }, - { "Sliders", ZoneOption::Bool }, - { "Trims", ZoneOption::Bool }, - { "Panel1 background", ZoneOption::Bool }, - { " Color", ZoneOption::Color }, - { "Panel2 background", ZoneOption::Bool }, - { " Color", ZoneOption::Color }, + { STR_TOP_BAR, ZoneOption::Bool }, + { STR_FLIGHT_MODE, ZoneOption::Bool }, + { STR_SLIDERS, ZoneOption::Bool }, + { STR_TRIMS, ZoneOption::Bool }, + { STR_PANEL1_BACKGROUND, ZoneOption::Bool }, + { INDENT TR_COLOR, ZoneOption::Color }, + { STR_PANEL2_BACKGROUND, ZoneOption::Bool }, + { INDENT TR_COLOR, ZoneOption::Color }, { NULL, ZoneOption::Bool } }; diff --git a/radio/src/gui/480x272/model_curves.cpp b/radio/src/gui/480x272/model_curves.cpp index 7d15edcaf..3abf03ddb 100644 --- a/radio/src/gui/480x272/model_curves.cpp +++ b/radio/src/gui/480x272/model_curves.cpp @@ -133,7 +133,7 @@ bool menuModelCurveOne(event_t event) // Curve type LcdFlags attr = (menuVerticalPosition==ITEM_CURVE_TYPE ? (s_editMode>0 ? INVERS|BLINK : INVERS) : 0); - lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP, "Type"); + lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP, STR_TYPE); lcdDrawTextAtIndex(MODEL_CURVE_ONE_2ND_COLUMN, MENU_CONTENT_TOP, STR_CURVE_TYPES, crv.type, attr); if (attr) { uint8_t newType = checkIncDecModelZero(event, crv.type, CURVE_TYPE_LAST); diff --git a/radio/src/gui/480x272/model_failsafe.cpp b/radio/src/gui/480x272/model_failsafe.cpp index 269cfad75..706c36f4b 100644 --- a/radio/src/gui/480x272/model_failsafe.cpp +++ b/radio/src/gui/480x272/model_failsafe.cpp @@ -60,7 +60,7 @@ bool menuModelFailsafe(event_t event) } SIMPLE_SUBMENU_WITH_OPTIONS("FAILSAFE", ICON_STATS_ANALOGS, sentModuleChannels(g_moduleIdx)+1, OPTION_MENU_NO_SCROLLBAR); - drawStringWithIndex(50, 3+FH, "Module", g_moduleIdx+1, MENU_TITLE_COLOR); + drawStringWithIndex(50, 3+FH, STR_MODULE, g_moduleIdx+1, MENU_TITLE_COLOR); for (uint8_t col=0; col < cols; col++) { for (uint8_t line=0; line < 8; line++) { diff --git a/radio/src/gui/480x272/model_select.cpp b/radio/src/gui/480x272/model_select.cpp index 5f6615041..9cb0f3979 100644 --- a/radio/src/gui/480x272/model_select.cpp +++ b/radio/src/gui/480x272/model_select.cpp @@ -279,7 +279,7 @@ void onModelSelectMenu(const char * result) setCurrentModel(currentCategory->size() - 1); } else { - POPUP_WARNING("Invalid File"); + POPUP_WARNING(STR_INVALID_FILE); } } else if (result == STR_MOVE_MODEL) { diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index 3cd369ddb..b165d201f 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -788,7 +788,7 @@ bool menuModelSetup(event_t event) case ITEM_MODEL_SETUP_DISPLAY_TRIMS: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_DISPLAY_TRIMS); - g_model.displayTrims = editChoice(MODEL_SETUP_2ND_COLUMN, y, "\006No\0 ChangeYes", g_model.displayTrims, 0, 2, attr, event); + g_model.displayTrims = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_VDISPLAYTRIMS, g_model.displayTrims, 0, 2, attr, event); break; case ITEM_MODEL_SETUP_TRIM_INC: diff --git a/radio/src/gui/480x272/radio_hardware.cpp b/radio/src/gui/480x272/radio_hardware.cpp index 23d6e85de..37f81bed3 100644 --- a/radio/src/gui/480x272/radio_hardware.cpp +++ b/radio/src/gui/480x272/radio_hardware.cpp @@ -187,7 +187,7 @@ bool menuRadioHardware(event_t event) LcdFlags attr = (sub == k ? ((s_editMode>0) ? BLINK|INVERS : INVERS) : 0); switch (k) { case ITEM_RADIO_HARDWARE_CALIBRATION: - lcdDrawText(MENUS_MARGIN_LEFT, y, "Calibration", attr); + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_CALIBRATION, attr); if (attr && s_editMode>0) { pushMenu(menuRadioCalibration); } diff --git a/radio/src/gui/480x272/screens_setup.cpp b/radio/src/gui/480x272/screens_setup.cpp index 749bd50c2..c1f251460 100644 --- a/radio/src/gui/480x272/screens_setup.cpp +++ b/radio/src/gui/480x272/screens_setup.cpp @@ -121,7 +121,7 @@ bool editZoneOption(coord_t y, const ZoneOption * option, ZoneOptionValue * valu } } else if (option->type == ZoneOption::TextSize) { - lcdDrawTextAtIndex(SCREENS_SETUP_2ND_COLUMN, y, "\010StandardTiny\0 Small\0 Mid\0 Double", value->unsignedValue, attr); + lcdDrawTextAtIndex(SCREENS_SETUP_2ND_COLUMN, y, STR_TEXT_SIZE, value->unsignedValue, attr); if (attr) { value->unsignedValue = checkIncDec(event, value->unsignedValue, 0, 4, i_flags); } @@ -558,7 +558,7 @@ bool menuScreenSetup(int index, event_t event) currentContainer = currentScreen; bool needsOffsetCheck = (menuVerticalPosition != 0 || menuHorizontalPosition < 0); - char title[] = "Main view X"; + char title[] = TR_MAIN_VIEW_X; title[sizeof(title)-2] = '1' + index; menuPageCount = updateMainviewsMenu(); diff --git a/radio/src/gui/480x272/widgets/gauge.cpp b/radio/src/gui/480x272/widgets/gauge.cpp index 5e8772540..099920abc 100644 --- a/radio/src/gui/480x272/widgets/gauge.cpp +++ b/radio/src/gui/480x272/widgets/gauge.cpp @@ -34,10 +34,10 @@ class GaugeWidget: public Widget }; const ZoneOption GaugeWidget::options[] = { - { "Source", ZoneOption::Source, OPTION_VALUE_UNSIGNED(1) }, - { "Min", ZoneOption::Integer, OPTION_VALUE_SIGNED(-RESX), OPTION_VALUE_SIGNED(-RESX), OPTION_VALUE_SIGNED(RESX) }, - { "Max", ZoneOption::Integer, OPTION_VALUE_SIGNED(RESX), OPTION_VALUE_SIGNED(-RESX), OPTION_VALUE_SIGNED(RESX) }, - { "Color", ZoneOption::Color, OPTION_VALUE_UNSIGNED(RED) }, + { STR_SOURCE, ZoneOption::Source, OPTION_VALUE_UNSIGNED(1) }, + { STR_MIN, ZoneOption::Integer, OPTION_VALUE_SIGNED(-RESX), OPTION_VALUE_SIGNED(-RESX), OPTION_VALUE_SIGNED(RESX) }, + { STR_MAX, ZoneOption::Integer, OPTION_VALUE_SIGNED(RESX), OPTION_VALUE_SIGNED(-RESX), OPTION_VALUE_SIGNED(RESX) }, + { STR_COLOR, ZoneOption::Color, OPTION_VALUE_UNSIGNED(RED) }, { NULL, ZoneOption::Bool } }; diff --git a/radio/src/gui/480x272/widgets/outputs.cpp b/radio/src/gui/480x272/widgets/outputs.cpp index 1365e4f72..0628b5faa 100644 --- a/radio/src/gui/480x272/widgets/outputs.cpp +++ b/radio/src/gui/480x272/widgets/outputs.cpp @@ -86,9 +86,9 @@ class OutputsWidget: public Widget }; const ZoneOption OutputsWidget::options[] = { - { "First channel", ZoneOption::Integer, OPTION_VALUE_UNSIGNED(1), OPTION_VALUE_UNSIGNED(1), OPTION_VALUE_UNSIGNED(32) }, - { "Fill Background?", ZoneOption::Bool, OPTION_VALUE_BOOL(false) }, - { "BG Color", ZoneOption::Color, OPTION_VALUE_UNSIGNED(LIGHTGREY) }, + { STR_FIRST_CHANNEL, ZoneOption::Integer, OPTION_VALUE_UNSIGNED(1), OPTION_VALUE_UNSIGNED(1), OPTION_VALUE_UNSIGNED(32) }, + { STR_FILL_BACKGROUND, ZoneOption::Bool, OPTION_VALUE_BOOL(false) }, + { STR_BG_COLOR, ZoneOption::Color, OPTION_VALUE_UNSIGNED(LIGHTGREY) }, { NULL, ZoneOption::Bool } }; diff --git a/radio/src/gui/480x272/widgets/text.cpp b/radio/src/gui/480x272/widgets/text.cpp index 30d593be6..ce18b7b26 100644 --- a/radio/src/gui/480x272/widgets/text.cpp +++ b/radio/src/gui/480x272/widgets/text.cpp @@ -36,10 +36,10 @@ class TextWidget: public Widget }; const ZoneOption TextWidget::options[] = { - { "Text", ZoneOption::String, OPTION_VALUE_STRING(TEXT_WIDGET_DEFAULT_LABEL) }, - { "Color", ZoneOption::Color, OPTION_VALUE_UNSIGNED(RED) }, - { "Size", ZoneOption::TextSize, OPTION_VALUE_UNSIGNED(0) }, - { "Shadow", ZoneOption::Bool, OPTION_VALUE_BOOL(false) }, + { STR_TEXT, ZoneOption::String, OPTION_VALUE_STRING(TEXT_WIDGET_DEFAULT_LABEL) }, + { STR_COLOR, ZoneOption::Color, OPTION_VALUE_UNSIGNED(RED) }, + { STR_SIZE, ZoneOption::TextSize, OPTION_VALUE_UNSIGNED(0) }, + { STR_SHADOW, ZoneOption::Bool, OPTION_VALUE_BOOL(false) }, { NULL, ZoneOption::Bool } }; diff --git a/radio/src/gui/480x272/widgets/timer.cpp b/radio/src/gui/480x272/widgets/timer.cpp index 1293a8701..424db91e7 100644 --- a/radio/src/gui/480x272/widgets/timer.cpp +++ b/radio/src/gui/480x272/widgets/timer.cpp @@ -34,7 +34,7 @@ class TimerWidget: public Widget }; const ZoneOption TimerWidget::options[] = { - { "Timer source", ZoneOption::Timer, OPTION_VALUE_UNSIGNED(0) }, + { STR_TIMER_SOURCE, ZoneOption::Timer, OPTION_VALUE_UNSIGNED(0) }, { NULL, ZoneOption::Bool } }; diff --git a/radio/src/gui/480x272/widgets/value.cpp b/radio/src/gui/480x272/widgets/value.cpp index 2a36ba7f3..96fc885db 100644 --- a/radio/src/gui/480x272/widgets/value.cpp +++ b/radio/src/gui/480x272/widgets/value.cpp @@ -34,9 +34,9 @@ class ValueWidget: public Widget }; const ZoneOption ValueWidget::options[] = { - { "Source", ZoneOption::Source, OPTION_VALUE_UNSIGNED(MIXSRC_Rud) }, - { "Color", ZoneOption::Color, OPTION_VALUE_UNSIGNED(WHITE) }, - { "Shadow", ZoneOption::Bool, OPTION_VALUE_BOOL(false) }, + { STR_SOURCE, ZoneOption::Source, OPTION_VALUE_UNSIGNED(MIXSRC_Rud) }, + { STR_COLOR, ZoneOption::Color, OPTION_VALUE_UNSIGNED(WHITE) }, + { STR_SHADOW, ZoneOption::Bool, OPTION_VALUE_BOOL(false) }, { NULL, ZoneOption::Bool } }; diff --git a/radio/src/gui/common/stdlcd/view_telemetry.cpp b/radio/src/gui/common/stdlcd/view_telemetry.cpp index e2bf39503..61b506269 100644 --- a/radio/src/gui/common/stdlcd/view_telemetry.cpp +++ b/radio/src/gui/common/stdlcd/view_telemetry.cpp @@ -92,7 +92,7 @@ void menuViewTelemetry(event_t event) } drawTelemetryTopBar(); - lcdDrawText(LCD_W / 2, 3 * FH, "No Telemetry Screens", CENTERED); + lcdDrawText(LCD_W / 2, 3 * FH, STR_NO_TELEMETRY_SCREENS, CENTERED); displayRssiLine(); } diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 293e5abf8..ad6ab9675 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -100,6 +100,10 @@ ISTR(MULTI_PROTOCOLS); ISTR(BLUETOOTH_MODES); #endif +#if defined(PCBHORUS) +ISTR(TEXT_SIZE); +#endif + const char STR_POPUPS_ENTER_EXIT[] = TR_POPUPS_ENTER_EXIT; const char STR_OK[] = TR_OK; const char STR_FREE[] = TR_FREE; @@ -587,10 +591,26 @@ const char STR_SPORT_UPDATE_POWER_MODE[] = TR_SPORT_UPDATE_POWER_MODE; #if defined(PCBHORUS) const char STR_ASSIGN_SPLASH[] = TR_ASSIGN_SPLASH; +const char STR_FIRST_CHANNEL[] = TR_FIRST_CHANNEL; +const char STR_FILL_BACKGROUND[] = TR_FILL_BACKGROUND; +const char STR_BG_COLOR[] = TR_BG_COLOR; +const char STR_SLIDERS_TRIMS[] = TR_SLIDERS_TRIMS; +const char STR_SLIDERS[] = TR_SLIDERS; +const char STR_FLIGHT_MODE[] = TR_FLIGHT_MODE; +const char STR_INVALID_FILE[] = TR_INVALID_FILE; +const char STR_TIMER_SOURCE[] = TR_TIMER_SOURCE; +const char STR_SIZE[] = TR_SIZE; +const char STR_SHADOW[] = TR_SHADOW; +const char STR_TEXT[] = TR_TEXT; +const char STR_COLOR[] = TR_COLOR; +const char STR_MAIN_VIEW_X[] = TR_MAIN_VIEW_X; +const char STR_PANEL1_BACKGROUND[] = TR_PANEL1_BACKGROUND; +const char STR_PANEL2_BACKGROUND[] = TR_PANEL2_BACKGROUND; #endif #if !defined(COLORLCD) const char STR_MENUWHENDONE[] = TR_MENUWHENDONE; +const char STR_NO_TELEMETRY_SCREENS[] = TR_NO_TELEMETRY_SCREENS; #endif #if defined(PCBSKY9X) && defined(REVX) diff --git a/radio/src/translations.h b/radio/src/translations.h index 7a28a4299..78c2d123f 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -188,6 +188,7 @@ extern const char STR_EXIT[]; #if !defined(PCBHORUS) extern const char STR_MENUWHENDONE[]; +extern const char STR_NO_TELEMETRY_SCREENS[]; #endif extern const char STR_FREE[]; @@ -592,6 +593,22 @@ extern const char STR_PLAY_FILE[]; extern const char STR_ASSIGN_BITMAP[]; #if defined(PCBHORUS) extern const char STR_ASSIGN_SPLASH[]; +extern const char STR_FIRST_CHANNEL[]; +extern const char STR_FILL_BACKGROUND[]; +extern const char STR_BG_COLOR[]; +extern const char STR_SLIDERS_TRIMS[]; +extern const char STR_SLIDERS[]; +extern const char STR_FLIGHT_MODE[]; +extern const char STR_INVALID_FILE[]; +extern const char STR_TIMER_SOURCE[]; +extern const char STR_TEXT_SIZE[]; +extern const char STR_SIZE[]; +extern const char STR_SHADOW[]; +extern const char STR_TEXT[]; +extern const char STR_COLOR[]; +extern const char STR_MAIN_VIEW_X[]; +extern const char STR_PANEL1_BACKGROUND[]; +extern const char STR_PANEL2_BACKGROUND[]; #endif extern const char STR_EXECUTE_FILE[]; extern const char STR_DELETE_FILE[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index e46a70230..ddf79cef8 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -375,6 +375,9 @@ #define LEN_GYROS "\004" #define TR_GYROS "GyrX""GyrY" +#define LEN_TEXT_SIZE "\010" +#define TR_TEXT_SIZE "Standard""Tiny\0 ""Small\0 ""Mid\0 ""Double\0 " + // ZERO TERMINATED STRINGS #if defined(COLORLCD) #define INDENT "\007" @@ -985,6 +988,7 @@ #define TR_SPORT_UPDATE_POWER_MODE "SP Power" #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " +#define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens" // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Název" @@ -1028,6 +1032,23 @@ // Horus footer descriptions #define TR_LSW_DESCRIPTIONS { "Typ porovnávací funkce", "První proměnná", "Druhá proměnná nebo konstanta", "Druhá proměnná nebo konstanta", "Další stav povolující tenko spínač", "Minimální doba trvání sepnutého stavu", "Minimální doba platné podmínky pro aktivaci" } +// Horus layouts and widgets +#define TR_FIRST_CHANNEL "First channel" +#define TR_FILL_BACKGROUND "Fill background?" +#define TR_BG_COLOR "BG Color" +#define TR_SLIDERS_TRIMS "Sliders+Trims" +#define TR_SLIDERS "Sliders" +#define TR_FLIGHT_MODE "Flight mode" +#define TR_INVALID_FILE "Invalid File" +#define TR_TIMER_SOURCE "Timer source" +#define TR_SIZE "Size" +#define TR_SHADOW "Shadow" +#define TR_TEXT "Text" +#define TR_COLOR "Color" +#define TR_MAIN_VIEW_X "Main view X" +#define TR_PANEL1_BACKGROUND "Panel1 background" +#define TR_PANEL2_BACKGROUND "Panel2 background" + // Taranis About screen #define TR_ABOUTUS TR(" O nás ", "O nás") diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 9da0cadc6..e8be3ab1c 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -378,6 +378,9 @@ #define LEN_GYROS "\004" #define TR_GYROS "GyrX""GyrY" +#define LEN_TEXT_SIZE "\010" +#define TR_TEXT_SIZE "Standard""Tiny\0 ""Small\0 ""Mid\0 ""Double\0 " + // ZERO TERMINATED STRINGS #if defined(COLORLCD) #define INDENT " " @@ -991,6 +994,7 @@ #define TR_SPORT_UPDATE_POWER_MODE "SP Power" #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " +#define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens" // Horus and Taranis specific column headers #define TR_PHASES_HEADERS_NAME "Name " @@ -1003,6 +1007,24 @@ #define TR_PHASES_HEADERS_CH6_TRIM "Trim 6" #define TR_PHASES_HEADERS_FAD_IN "Langs Ein" #define TR_PHASES_HEADERS_FAD_OUT "Langs Aus" + +// Horus layouts and widgets +#define TR_FIRST_CHANNEL "First channel" +#define TR_FILL_BACKGROUND "Fill background?" +#define TR_BG_COLOR "BG Color" +#define TR_SLIDERS_TRIMS "Sliders+Trims" +#define TR_SLIDERS "Sliders" +#define TR_FLIGHT_MODE "Flight mode" +#define TR_INVALID_FILE "Invalid File" +#define TR_TIMER_SOURCE "Timer source" +#define TR_SIZE "Size" +#define TR_SHADOW "Shadow" +#define TR_TEXT "Text" +#define TR_COLOR "Color" +#define TR_MAIN_VIEW_X "Main view X" +#define TR_PANEL1_BACKGROUND "Panel1 background" +#define TR_PANEL2_BACKGROUND "Panel2 background" + // Taranis Info Zeile Anzeigen #define TR_LIMITS_HEADERS_NAME "Name" #define TR_LIMITS_HEADERS_SUBTRIM "Subtrim" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index c5211468e..b0982cb19 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -378,6 +378,9 @@ #define LEN_GYROS "\004" #define TR_GYROS "GyrX""GyrY" +#define LEN_TEXT_SIZE "\010" +#define TR_TEXT_SIZE "Standard""Tiny\0 ""Small\0 ""Mid\0 ""Double\0 " + // ZERO TERMINATED STRINGS #if defined(COLORLCD) #define INDENT " " @@ -990,6 +993,7 @@ #define TR_SPORT_UPDATE_POWER_MODE "SP Power" #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " +#define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens" // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Name" @@ -1033,6 +1037,23 @@ // Horus footer descriptions #define TR_LSW_DESCRIPTIONS { "Comparison type or function", "First variable", "Second variable or constant", "Second variable or constant", "Additional condition for line to be enabled", "Minimum ON duration of the logical switch", "Minimum TRUE duration for the switch to become ON" } +// Horus layouts and widgets +#define TR_FIRST_CHANNEL "First channel" +#define TR_FILL_BACKGROUND "Fill background?" +#define TR_BG_COLOR "BG Color" +#define TR_SLIDERS_TRIMS "Sliders+Trims" +#define TR_SLIDERS "Sliders" +#define TR_FLIGHT_MODE "Flight mode" +#define TR_INVALID_FILE "Invalid File" +#define TR_TIMER_SOURCE "Timer source" +#define TR_SIZE "Size" +#define TR_SHADOW "Shadow" +#define TR_TEXT "Text" +#define TR_COLOR "Color" +#define TR_MAIN_VIEW_X "Main view X" +#define TR_PANEL1_BACKGROUND "Panel1 background" +#define TR_PANEL2_BACKGROUND "Panel2 background" + // About screen #define TR_ABOUTUS TR(" ABOUT ", "ABOUT") diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 73bbf0b16..6a823ddcb 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -375,6 +375,9 @@ #define LEN_GYROS "\004" #define TR_GYROS "GyrX""GyrY" +#define LEN_TEXT_SIZE "\013" +#define TR_TEXT_SIZE "Normal\0 ""Muy pequeño""Pequeño\0 ""Medio\0 ""Doble\0 " + // ZERO TERMINATED STRINGS #if defined(COLORLCD) #define INDENT " " @@ -989,7 +992,7 @@ #define TR_SPORT_UPDATE_POWER_MODE "SP Power" #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " - +#define TR_NO_TELEMETRY_SCREENS TR("No hay pant. telemetria", "No hay pantallas de telemetria") // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Nombre" @@ -1033,6 +1036,23 @@ // Horus footer descriptions #define TR_LSW_DESCRIPTIONS { "Tipo de comparacion o funcion", "Primera variable", "Segunda variable o constante", "Segunda variable o constante", "Condicion adicional para activar linea", "Duracion minima de switch logico", "Duracion minima TRUE para activar switch logico" } +// Horus layouts and widgets +#define TR_FIRST_CHANNEL "Primer canal" +#define TR_FILL_BACKGROUND "Rellenar fondo" +#define TR_BG_COLOR "Color BG" +#define TR_SLIDERS_TRIMS "Sliders+Trims" +#define TR_SLIDERS "Sliders" +#define TR_FLIGHT_MODE "Modo de vuelo" +#define TR_INVALID_FILE "Fichero no valido" +#define TR_TIMER_SOURCE "Entrada timer" +#define TR_SIZE "Tamaño" +#define TR_SHADOW "Sombra" +#define TR_TEXT "Texto" +#define TR_COLOR "Color" +#define TR_MAIN_VIEW_X "Vista principal X" +#define TR_PANEL1_BACKGROUND "Fondo panel1" +#define TR_PANEL2_BACKGROUND "Fondo panel2" + // Taranis About screen #define TR_ABOUTUS "Nosotros" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index b3665f787..2c8041379 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -165,6 +165,9 @@ #define LEN_VCSWFUNC "\005" #define TR_VCSWFUNC "---\0 " TR_CSWEQUAL "a~x\0 ""a>x\0 ""ax""|a|b\0 ""ax\0 ""ax""|a|b\0 ""ax\0 ""ax""|a|b\0 ""a Date: Tue, 21 Apr 2020 14:53:33 +0200 Subject: [PATCH 251/560] Streamline multi interface (#7524) --- radio/src/gui/128x64/model_setup.cpp | 27 +++++++++++++++++---- radio/src/gui/212x64/model_setup.cpp | 34 +++++++++++++++++++++++---- radio/src/gui/480x272/model_setup.cpp | 30 +++++++++++++++++++---- radio/src/gui/gui_common.cpp | 26 +++++++++++++++++++- radio/src/gui/gui_common.h | 11 ++++++--- radio/src/io/multi_firmware_update.h | 2 +- radio/src/pulses/modules_constants.h | 34 ++++++++++++++------------- radio/src/pulses/modules_helpers.h | 3 +++ radio/src/telemetry/multi.cpp | 2 +- radio/src/telemetry/telemetry.h | 1 + radio/src/translations.cpp | 1 + radio/src/translations.h | 1 + radio/src/translations/cz.h.txt | 1 + radio/src/translations/de.h.txt | 1 + radio/src/translations/en.h.txt | 1 + radio/src/translations/es.h.txt | 1 + radio/src/translations/fi.h.txt | 1 + radio/src/translations/fr.h.txt | 1 + radio/src/translations/it.h.txt | 1 + radio/src/translations/nl.h.txt | 1 + radio/src/translations/pl.h.txt | 1 + radio/src/translations/pt.h.txt | 1 + radio/src/translations/se.h.txt | 1 + 23 files changed, 147 insertions(+), 36 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 2f40a0d0e..eb7fea4ab 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -313,7 +313,7 @@ void onBluetoothConnectMenu(const char * result) MULTIMODULE_SUBTYPE_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_SUBTYPE */ \ MULTIMODULE_STATUS_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_STATUS, ITEM_MODEL_SETUP_INTERNAL_MODULE_SYNCSTATUS */ \ MODULE_CHANNELS_ROWS(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS */ \ - IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(IF_INTERNAL_MODULE_ON(isModuleRxNumAvailable(INTERNAL_MODULE) ? (uint8_t)2 : (uint8_t)1))), /* *ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE */\ + IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(IF_INTERNAL_MODULE_ON(MODULE_BIND_ROWS(INTERNAL_MODULE)))), /* *ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE */\ IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_MODEL_NUM */ \ MODULE_OPTION_ROW(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_OPTIONS */ \ MULTIMODULE_MODULE_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_AUTOBIND */ \ @@ -1000,7 +1000,25 @@ void menuModelSetup(event_t event) lcdDrawMultiProtocolString(MODEL_SETUP_2ND_COLUMN, y, moduleIdx, multi_rfProto, attr); if (attr) { int multiRfProto = g_model.moduleData[moduleIdx].getMultiProtocol(); - CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable); + MultiModuleStatus &status = getMultiModuleStatus(moduleIdx); + if (status.isValid()) { + int8_t direction = checkIncDec(event, 0, -1, 1); + if (direction == -1) { + if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY) + multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX_RX; + else + multiRfProto = convertMultiToOtx(status.protocolPrev); + } + if (direction == 1) { + if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY) + multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX2; + else + multiRfProto = convertMultiToOtx(status.protocolNext); + } + } + else { + CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable); + } if (checkIncDec_Ret) { g_model.moduleData[moduleIdx].setMultiProtocol(multiRfProto); g_model.moduleData[moduleIdx].subType = 0; @@ -1326,7 +1344,8 @@ void menuModelSetup(event_t event) } } lcdDrawText(MODEL_SETUP_2ND_COLUMN+xOffsetBind, y, STR_MODULE_BIND, l_posHorz==1 ? attr : 0); - lcdDrawText(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0); + if (!IS_RX_MULTI(moduleIdx)) + lcdDrawText(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0); uint8_t newFlag = 0; #if defined(MULTIMODULE) if (getMultiBindStatus(moduleIdx) == MULTI_BIND_FINISHED) { @@ -1586,7 +1605,7 @@ void menuModelSetup(event_t event) } #if defined(MULTIMODULE) else if (isModuleMultimodule(moduleIdx)) { - module.multi.lowPowerMode = editCheckBox(module.multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_LOWPOWER, attr, event); + module.multi.lowPowerMode = editCheckBox(module.multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, IS_RX_MULTI(moduleIdx) ? STR_MULTI_LNA_DISABLE : STR_MULTI_LOWPOWER, attr, event); } #endif diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index b03b13d17..0de6b7294 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -907,7 +907,25 @@ void menuModelSetup(event_t event) switch (menuHorizontalPosition) { case 0: { int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(); - CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable); + MultiModuleStatus &status = getMultiModuleStatus(EXTERNAL_MODULE); + if (status.isValid()) { + int8_t direction = checkIncDec(event, 0, -1, 1); + if (direction == -1) { + if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY) + multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX_RX; + else + multiRfProto = convertMultiToOtx(status.protocolPrev); + } + if (direction == 1) { + if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY) + multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX2; + else + multiRfProto = convertMultiToOtx(status.protocolNext); + } + } + else { + CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable); + } if (checkIncDec_Ret) { g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(multiRfProto); g_model.moduleData[EXTERNAL_MODULE].subType = 0; @@ -1122,8 +1140,13 @@ void menuModelSetup(event_t event) lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER_NUM); } if (isModuleBindRangeAvailable(moduleIdx)) { - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2); - bindButtonPos = lcdNextPos + FW; + if (!IS_RX_MULTI(moduleIdx)) { + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz == 0 ? attr : 0) | LEADING0 | LEFT, 2); + bindButtonPos = lcdNextPos + FW; + } + else { + bindButtonPos = MODEL_SETUP_2ND_COLUMN; + } if (attr && l_posHorz==0) { if (s_editMode>0) { CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], getMaxRxNum(moduleIdx)); @@ -1141,7 +1164,8 @@ void menuModelSetup(event_t event) } } lcdDrawText(bindButtonPos, y, STR_MODULE_BIND, l_posHorz==1 ? attr : 0); - lcdDrawText(lcdNextPos + FW, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0); + if (!IS_RX_MULTI(moduleIdx)) + lcdDrawText(lcdNextPos + FW, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0); uint8_t newFlag = 0; #if defined(MULTIMODULE) if (getMultiBindStatus(moduleIdx) == MULTI_BIND_FINISHED) { @@ -1306,7 +1330,7 @@ void menuModelSetup(event_t event) } #if defined (MULTIMODULE) else if (isModuleMultimodule(moduleIdx)) { - g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_LOWPOWER, attr, event); + g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, IS_RX_MULTI(moduleIdx) ? STR_MULTI_LNA_DISABLE : STR_MULTI_LOWPOWER, attr, event); } #endif break; diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index b165d201f..83c23161b 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -1112,9 +1112,27 @@ bool menuModelSetup(event_t event) if (isModuleDSM2(moduleIdx)) CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX); #if defined(MULTIMODULE) - else if (isModuleMultimodule(moduleIdx)) { + else if (isModuleMultimodule(moduleIdx)) { int multiRfProto = g_model.moduleData[moduleIdx].getMultiProtocol(); - CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable); + MultiModuleStatus &status = getMultiModuleStatus(moduleIdx); + if (status.isValid()) { + int8_t direction = checkIncDec(event, 0, -1, 1); + if (direction == -1) { + if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY) + multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX_RX; + else + multiRfProto = convertMultiToOtx(status.protocolPrev); + } + if (direction == 1) { + if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY) + multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX2; + else + multiRfProto = convertMultiToOtx(status.protocolNext); + } + } + else { + CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable); + } if (checkIncDec_Ret) { g_model.moduleData[moduleIdx].setMultiProtocol(multiRfProto); g_model.moduleData[moduleIdx].subType = 0; @@ -1336,7 +1354,8 @@ bool menuModelSetup(event_t event) { lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_MODULE); drawButton(MODEL_SETUP_2ND_COLUMN, y, STR_REGISTER, (menuHorizontalPosition == 0 ? attr : 0)); - drawButton(MODEL_SETUP_2ND_COLUMN + MODEL_SETUP_SET_FAILSAFE_OFS, y, STR_MODULE_RANGE, (menuHorizontalPosition == 1 ? attr : 0)); + if (!IS_RX_MULTI(moduleIdx)) + drawButton(MODEL_SETUP_2ND_COLUMN + MODEL_SETUP_SET_FAILSAFE_OFS, y, STR_MODULE_RANGE, (menuHorizontalPosition == 1 ? attr : 0)); if (attr) { if (moduleState[moduleIdx].mode == MODULE_MODE_NORMAL && s_editMode > 0) { if (menuHorizontalPosition == 0 && event == EVT_KEY_BREAK(KEY_ENTER)) { @@ -1520,7 +1539,8 @@ bool menuModelSetup(event_t event) } } drawButton(MODEL_SETUP_2ND_COLUMN+xOffsetBind, y, STR_MODULE_BIND, (moduleState[moduleIdx].mode == MODULE_MODE_BIND ? BUTTON_ON : BUTTON_OFF) | (l_posHorz==1 ? attr : 0)); - drawButton(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, (moduleState[moduleIdx].mode == MODULE_MODE_RANGECHECK ? BUTTON_ON : BUTTON_OFF) | (l_posHorz==2 ? attr : 0)); + if (!IS_RX_MULTI(moduleIdx)) + drawButton(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, (moduleState[moduleIdx].mode == MODULE_MODE_RANGECHECK ? BUTTON_ON : BUTTON_OFF) | (l_posHorz==2 ? attr : 0)); uint8_t newFlag = 0; #if defined(MULTIMODULE) if (getMultiBindStatus(moduleIdx) == MULTI_BIND_FINISHED) { @@ -1683,7 +1703,7 @@ bool menuModelSetup(event_t event) } #if defined(MULTIMODULE) else if (isModuleMultimodule(moduleIdx)) { - lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_LOWPOWER); + lcdDrawText(MENUS_MARGIN_LEFT, y, IS_RX_MULTI(moduleIdx) ? STR_MULTI_LNA_DISABLE : STR_MULTI_LOWPOWER); g_model.moduleData[moduleIdx].multi.lowPowerMode = editCheckBox(g_model.moduleData[moduleIdx].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, attr, event); } #endif diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index 5efab1510..07a093fdf 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -789,7 +789,7 @@ int getFirstAvailable(int min, int max, IsValueAvailable isValueAvailable) #if defined(MULTIMODULE) // This maps OpenTX multi type with Pascal's Multi type -uint8_t convertMultiProtocol(uint8_t moduleIdx, uint8_t type) +uint8_t multiConvertOtxToMulti(uint8_t moduleIdx, uint8_t type) { // 15 for Multimodule is FrskyX or D16 which we map as a subprotocol of 3 (FrSky) @@ -818,6 +818,27 @@ uint8_t convertMultiProtocol(uint8_t moduleIdx, uint8_t type) return type; } +// This maps multi type to OpenTX number, type ONLY (no subtype) +int convertMultiToOtx(int type) +{ + if (type == 3) //FrSkyD + return MODULE_SUBTYPE_MULTI_FRSKY; + + if (type == 15) //FrSkyX + return MODULE_SUBTYPE_MULTI_FRSKY; + + if (type == 25) //FrSkyV + return MODULE_SUBTYPE_MULTI_FRSKY; + + if (type > 25) + type = type - 1; + + if (type > 15) + type = type - 1; + + return type - 1; //Multi list starts at 1 +} + // Third row is number of subtypes -1 (max valid subtype) #define NO_SUBTYPE nullptr @@ -866,6 +887,7 @@ const char STR_SUBTYPE_ZSX[] = "\007""280JJRC"; const char STR_SUBTYPE_FLYZONE[] = "\005""FZ410"; const char STR_SUBTYPE_FX816[] = "\003""P38"; const char STR_SUBTYPE_ESKY150[] = "\003""4CH""7CH"; +const char STR_SUBTYPE_FRSKYL[] = "\010""LR12\0 ""LR12 6ch"; const char* mm_options_strings::options[] = { nullptr, @@ -925,6 +947,8 @@ const mm_protocol_definition multi_protocols[] = { {MODULE_SUBTYPE_MULTI_FX816, 0, false, false, STR_SUBTYPE_FX816, nullptr}, {MODULE_SUBTYPE_MULTI_HOTT, 0, true, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_FRSKYX2, 4, true, false, STR_SUBTYPE_FRSKYX2, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_PROPEL, 0, false, false, NO_SUBTYPE, nullptr}, + {MODULE_SUBTYPE_MULTI_FRSKYL, 1, false, false, STR_SUBTYPE_FRSKYL, STR_MULTI_RFTUNE}, {MM_RF_CUSTOM_SELECTED, 7, true, true, NO_SUBTYPE, STR_MULTI_OPTION}, // Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff) diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 55233ea17..5b8c61a97 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -122,6 +122,8 @@ void drawSensorCustomValue(coord_t x, coord_t y, uint8_t sensor, int32_t value, void drawSourceCustomValue(coord_t x, coord_t y, source_t channel, int32_t val, LcdFlags flags=0); void drawSourceValue(coord_t x, coord_t y, source_t channel, LcdFlags flags=0); +int convertMultiToOtx(int type); + void drawCurve(coord_t offset=0); #if defined(COLORLCD) @@ -139,6 +141,9 @@ void runFatalErrorScreen(const char * message); inline uint8_t MODULE_BIND_ROWS(int moduleIdx) { + if (IS_RX_MULTI(moduleIdx)) + return 0; + if (isModuleXJTD8(moduleIdx) || isModuleSBUS(moduleIdx)) return 1; @@ -150,7 +155,7 @@ inline uint8_t MODULE_BIND_ROWS(int moduleIdx) inline uint8_t MODULE_CHANNELS_ROWS(int moduleIdx) { - if (!IS_MODULE_ENABLED(moduleIdx)) + if (!IS_MODULE_ENABLED(moduleIdx) || IS_RX_MULTI(moduleIdx)) return HIDDEN_ROW; if (isModuleDSM2(moduleIdx) || isModuleCrossfire(moduleIdx) || isModuleSBUS(moduleIdx) || (isModuleMultimodule(moduleIdx) && g_model.moduleData[moduleIdx].getMultiProtocol() != MODULE_SUBTYPE_MULTI_DSM2)) @@ -250,14 +255,14 @@ inline uint8_t MULTIMODULE_HASOPTIONS(uint8_t moduleIdx) return false; } -#define MULTIMODULE_MODULE_ROWS(moduleIdx) MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW, MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW, MULTI_DISABLE_CHAN_MAP_ROW(moduleIdx), // AUTOBIND, DISABLE TELEM, DISABLE CN.MAP +#define MULTIMODULE_MODULE_ROWS(moduleIdx) (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) && !IS_RX_MULTI(moduleIdx)) ? (uint8_t) 0 : HIDDEN_ROW, (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) && !IS_RX_MULTI(moduleIdx)) ? (uint8_t) 0 : HIDDEN_ROW, MULTI_DISABLE_CHAN_MAP_ROW(moduleIdx), // AUTOBIND, DISABLE TELEM, DISABLE CN.MAP #define MULTIMODULE_TYPE_ROW(moduleIdx) isModuleMultimodule(moduleIdx) ? MULTIMODULE_RFPROTO_COLUMNS(moduleIdx) : HIDDEN_ROW, #define MULTIMODULE_STATUS_ROWS(moduleIdx) isModuleMultimodule(moduleIdx) ? TITLE_ROW : HIDDEN_ROW, (isModuleMultimodule(moduleIdx) && getMultiSyncStatus(moduleIdx).isValid()) ? TITLE_ROW : HIDDEN_ROW, #define MULTIMODULE_MODE_ROWS(moduleIdx) (g_model.moduleData[moduleIdx].multi.customProto) ? (uint8_t) 3 : MULTIMODULE_HAS_SUBTYPE(moduleIdx) ? (uint8_t)2 : (uint8_t)1 #define MULTIMODULE_TYPE_ROWS(moduleIdx) isModuleMultimodule(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW, #define MULTIMODULE_SUBTYPE_ROWS(moduleIdx) isModuleMultimodule(moduleIdx) ? MULTIMODULE_RFPROTO_COLUMNS(moduleIdx) : HIDDEN_ROW, #define MULTIMODULE_OPTIONS_ROW(moduleIdx) (isModuleMultimodule(moduleIdx) && MULTIMODULE_HASOPTIONS(moduleIdx)) ? (uint8_t) 0: HIDDEN_ROW -#define MODULE_POWER_ROW(moduleIdx) (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) || isModuleR9MNonAccess(moduleIdx)) ? (isModuleR9MLiteNonPro(moduleIdx) ? (isModuleR9M_FCC_VARIANT(moduleIdx) ? READONLY_ROW : (uint8_t)0) : (uint8_t)0) : HIDDEN_ROW +#define MODULE_POWER_ROW(moduleIdx) (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) || isModuleR9MNonAccess(moduleIdx)) ? (isModuleR9MLiteNonPro(moduleIdx) ? (isModuleR9M_FCC_VARIANT(moduleIdx) ? READONLY_ROW : (uint8_t)0) : (uint8_t)0) : HIDDEN_ROW #else #define MULTIMODULE_STATUS_ROWS(moduleIdx) diff --git a/radio/src/io/multi_firmware_update.h b/radio/src/io/multi_firmware_update.h index a4ad7156f..a4cb255fb 100644 --- a/radio/src/io/multi_firmware_update.h +++ b/radio/src/io/multi_firmware_update.h @@ -71,7 +71,7 @@ class MultiFirmwareInformation { bool isMultiInternalFirmware() const { - return (boardType == FIRMWARE_MULTI_STM && telemetryInversion == false && optibootSupport == true && bootloaderCheck == true && telemetryType == FIRMWARE_MULTI_TELEM_MULTI_TELEMETRY); + return (boardType == FIRMWARE_MULTI_STM && optibootSupport == true && bootloaderCheck == true && telemetryType == FIRMWARE_MULTI_TELEM_MULTI_TELEMETRY); } bool isMultiExternalFirmware() const diff --git a/radio/src/pulses/modules_constants.h b/radio/src/pulses/modules_constants.h index d890e38ab..a519d0269 100644 --- a/radio/src/pulses/modules_constants.h +++ b/radio/src/pulses/modules_constants.h @@ -102,68 +102,70 @@ enum ModuleSubtypeR9M { enum ModuleSubtypeMulti { MODULE_SUBTYPE_MULTI_FIRST = 0, MODULE_SUBTYPE_MULTI_FLYSKY = MODULE_SUBTYPE_MULTI_FIRST, - MODULE_SUBTYPE_MULTI_HUBSAN, - MODULE_SUBTYPE_MULTI_FRSKY, - MODULE_SUBTYPE_MULTI_HISKY, - MODULE_SUBTYPE_MULTI_V2X2, - MODULE_SUBTYPE_MULTI_DSM2, + MODULE_SUBTYPE_MULTI_HUBSAN, //1 + MODULE_SUBTYPE_MULTI_FRSKY, //2 + MODULE_SUBTYPE_MULTI_HISKY, //3 + MODULE_SUBTYPE_MULTI_V2X2, //4 + MODULE_SUBTYPE_MULTI_DSM2, //5 MODULE_SUBTYPE_MULTI_DEVO, MODULE_SUBTYPE_MULTI_YD717, MODULE_SUBTYPE_MULTI_KN, MODULE_SUBTYPE_MULTI_SYMAX, - MODULE_SUBTYPE_MULTI_SLT, + MODULE_SUBTYPE_MULTI_SLT, //10 MODULE_SUBTYPE_MULTI_CX10, MODULE_SUBTYPE_MULTI_CG023, MODULE_SUBTYPE_MULTI_BAYANG, MODULE_SUBTYPE_MULTI_ESky, - MODULE_SUBTYPE_MULTI_MT99XX, + MODULE_SUBTYPE_MULTI_MT99XX, //15 MODULE_SUBTYPE_MULTI_MJXQ, MODULE_SUBTYPE_MULTI_SHENQI, MODULE_SUBTYPE_MULTI_FY326, MODULE_SUBTYPE_MULTI_SFHSS, - MODULE_SUBTYPE_MULTI_J6PRO, + MODULE_SUBTYPE_MULTI_J6PRO, //20 MODULE_SUBTYPE_MULTI_FQ777, MODULE_SUBTYPE_MULTI_ASSAN, MODULE_SUBTYPE_MULTI_HONTAI, MODULE_SUBTYPE_MULTI_OLRS, - MODULE_SUBTYPE_MULTI_FS_AFHDS2A, + MODULE_SUBTYPE_MULTI_FS_AFHDS2A, //25 MODULE_SUBTYPE_MULTI_Q2X2, MODULE_SUBTYPE_MULTI_WK_2X01, MODULE_SUBTYPE_MULTI_Q303, MODULE_SUBTYPE_MULTI_GW008, - MODULE_SUBTYPE_MULTI_DM002, + MODULE_SUBTYPE_MULTI_DM002, //30 MODULE_SUBTYPE_MULTI_CABELL, MODULE_SUBTYPE_MULTI_ESKY150, MODULE_SUBTYPE_MULTI_H83D, MODULE_SUBTYPE_MULTI_CORONA, - MODULE_SUBTYPE_MULTI_CFLIE, + MODULE_SUBTYPE_MULTI_CFLIE, //35 MODULE_SUBTYPE_MULTI_HITEC, MODULE_SUBTYPE_MULTI_WFLY, MODULE_SUBTYPE_MULTI_BUGS, MODULE_SUBTYPE_MULTI_BUGS_MINI, - MODULE_SUBTYPE_MULTI_TRAXXAS, + MODULE_SUBTYPE_MULTI_TRAXXAS, //40 MODULE_SUBTYPE_MULTI_NCC1701, MODULE_SUBTYPE_MULTI_E01X, MODULE_SUBTYPE_MULTI_V911S, MODULE_SUBTYPE_MULTI_GD00X, - MODULE_SUBTYPE_MULTI_V761, + MODULE_SUBTYPE_MULTI_V761, //45 MODULE_SUBTYPE_MULTI_KF606, MODULE_SUBTYPE_MULTI_REDPINE, MODULE_SUBTYPE_MULTI_POTENSIC, MODULE_SUBTYPE_MULTI_ZSX, - MODULE_SUBTYPE_MULTI_FLYZONE, + MODULE_SUBTYPE_MULTI_FLYZONE, //50 MODULE_SUBTYPE_MULTI_SCANNER, MODULE_SUBTYPE_MULTI_FRSKYX_RX, MODULE_SUBTYPE_MULTI_AFHDS2A_RX, MODULE_SUBTYPE_MULTI_HOTT, - MODULE_SUBTYPE_MULTI_FX816, + MODULE_SUBTYPE_MULTI_FX816, //55 MODULE_SUBTYPE_MULTI_BAYANG_RX, MODULE_SUBTYPE_MULTI_PELIKAN, MODULE_SUBTYPE_MULTI_TIGER, MODULE_SUBTYPE_MULTI_XK, - MODULE_SUBTYPE_MULTI_XN297DUMP, + MODULE_SUBTYPE_MULTI_XN297DUMP, //60 MODULE_SUBTYPE_MULTI_FRSKYX2, MODULE_SUBTYPE_MULTI_FRSKY_R9, + MODULE_SUBTYPE_MULTI_PROPEL, + MODULE_SUBTYPE_MULTI_FRSKYL, MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_FRSKY_R9 }; #define MODULE_SUBTYPE_MULTI_XN297DP 63-3 diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h index 244e58a79..c8e8411c4 100644 --- a/radio/src/pulses/modules_helpers.h +++ b/radio/src/pulses/modules_helpers.h @@ -384,6 +384,9 @@ inline bool isModuleRxNumAvailable(uint8_t moduleIdx) if (isModuleISRM(moduleIdx)) return true; + if (IS_RX_MULTI(moduleIdx)) + return false; + if (isModuleMultimodule(moduleIdx)) return true; diff --git a/radio/src/telemetry/multi.cpp b/radio/src/telemetry/multi.cpp index b86347547..3719d660b 100644 --- a/radio/src/telemetry/multi.cpp +++ b/radio/src/telemetry/multi.cpp @@ -555,7 +555,7 @@ void MultiModuleStatus::getStatusString(char * statusText) const return; } - if (major <= 1 && minor <= 3 && revision <= 0 && patch < 87 && SLOW_BLINK_ON_PHASE) { + if (major <= 1 && minor <= 3 && revision <= 0 && patch < 91 && SLOW_BLINK_ON_PHASE) { strcpy(statusText, STR_MODULE_UPGRADE); } else { diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index c74057c78..c7228a0ff 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -111,6 +111,7 @@ extern uint8_t telemetryProtocol; #define IS_D16_MULTI(module) (((g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKY) && (g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16 || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_8CH || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_CLONED)) \ || (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKYX2)) #define IS_HOTT_MULTI(module) (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_HOTT) + #define IS_RX_MULTI(module) ((g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_AFHDS2A_RX) || (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKYX_RX) || (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_BAYANG_RX)) #if defined(HARDWARE_INTERNAL_MODULE) #define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT || (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE && (IS_D16_MULTI(INTERNAL_MODULE)||IS_D16_MULTI(EXTERNAL_MODULE)))) #else diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index ad6ab9675..24f18e058 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -695,6 +695,7 @@ const char STR_DISABLE_CH_MAP[] = TR_DISABLE_CH_MAP; const char STR_DISABLE_TELEM[] = TR_DISABLE_TELEM; const char STR_MULTI_DSM_AUTODTECT[] = TR_MULTI_DSM_AUTODTECT; const char STR_MULTI_LOWPOWER[] = TR_MULTI_LOWPOWER; +const char STR_MULTI_LNA_DISABLE[] = TR_MULTI_LNA_DISABLE; const char STR_MODULE_NO_SERIAL_MODE[] = TR_MODULE_NO_SERIAL_MODE; const char STR_MODULE_NO_INPUT[] = TR_MODULE_NO_INPUT; const char STR_MODULE_WAITFORBIND[] = TR_MODULE_WAITFORBIND; diff --git a/radio/src/translations.h b/radio/src/translations.h index 78c2d123f..179972304 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -394,6 +394,7 @@ extern const char STR_DISABLE_CH_MAP[]; extern const char STR_DISABLE_TELEM[]; extern const char STR_MULTI_DSM_AUTODTECT[]; extern const char STR_MULTI_LOWPOWER[]; +extern const char STR_MULTI_LNA_DISABLE[]; extern const char STR_MODULE_NO_SERIAL_MODE[]; extern const char STR_MODULE_NO_INPUT[]; extern const char STR_MODULE_WAITFORBIND[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index ddf79cef8..3b4beb3dd 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -638,6 +638,7 @@ #define TR_DISABLE_TELEM TR("No Telem", "Disable Telemetry") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetekce", INDENT "Formát autodetekce") #define TR_MULTI_LOWPOWER TR(INDENT "Nízký výkon", INDENT "Režim nízkého výkonu") +#define TR_MULTI_LNA_DISABLE INDENT "LNA disable" #define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link") #define TR_MODULE_TELEM_ON TR("Zap", "Zapnuto") #define TR_DISABLE_INTERNAL TR("Vypnout int.", "Vypnout interní RF") diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index e8be3ab1c..79974e4a1 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -640,6 +640,7 @@ #define TR_DISABLE_TELEM TR("No Telem", "Disable Telemetry") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") +#define TR_MULTI_LNA_DISABLE INDENT "LNA disable" #define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link") #define TR_MODULE_TELEM_ON TR("ON", "Enabled") #define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF") diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index b0982cb19..55efa2cf3 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -639,6 +639,7 @@ #define TR_DISABLE_TELEM TR("No Telem", "Disable Telemetry") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") +#define TR_MULTI_LNA_DISABLE INDENT "LNA disable" #define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link") #define TR_MODULE_TELEM_ON TR("ON", "Enabled") #define TR_DISABLE_INTERNAL TR("Disable int.", "Disable internal RF") diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 6a823ddcb..7b10a3f93 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -641,6 +641,7 @@ #define TR_DISABLE_TELEM TR("No telem", "Desactivar telem.") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetectar formato") #define TR_MULTI_LOWPOWER TR(INDENT "Baja poten.", INDENT "Modo de baja poten.") +#define TR_MULTI_LNA_DISABLE INDENT "LNA disable" #define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link") #define TR_MODULE_TELEM_ON TR("ON", "Activado") #define TR_DISABLE_INTERNAL TR("Desac.RF int", "Desact. mod. int. RF") diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 2c8041379..933ad7103 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -657,6 +657,7 @@ #define TR_DISABLE_TELEM TR("No Telem", "Disable Telemetry") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") +#define TR_MULTI_LNA_DISABLE INDENT "LNA disable" #define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link") #define TR_MODULE_TELEM_ON TR("ON", "Enabled") #define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF") diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index bad7562ec..4a8e95e9d 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -660,6 +660,7 @@ #define TR_DISABLE_TELEM TR("No Telem", "Désact Télémétrie") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodét.", INDENT "Autodétection") #define TR_MULTI_LOWPOWER TR(INDENT "Basse puis.", INDENT "Mode basse puiss.") +#define TR_MULTI_LNA_DISABLE INDENT "LNA disable" #define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "Lien S.Port") #define TR_MODULE_TELEM_ON TR("ON", "Actif") #define TR_DISABLE_INTERNAL TR("Désact intRF", "Désact. RF interne") diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 2035c5c80..e118fcd21 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -659,6 +659,7 @@ #define TR_DISABLE_TELEM TR("No Telem", "Telem. disabil.") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Trova autom.", INDENT "Autoril. il formato") #define TR_MULTI_LOWPOWER TR(INDENT "Bassa pot.", INDENT "Modo bassa potenza") +#define TR_MULTI_LNA_DISABLE INDENT "LNA disable" #define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "Link S.Port") #define TR_MODULE_TELEM_ON TR("ON", "Abilitato") #define TR_DISABLE_INTERNAL TR("Disatt. RF int.", "Disattiva RF interna") diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 256bf0513..5425c6033 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -645,6 +645,7 @@ #define TR_DISABLE_TELEM TR("No Telem", "Disable Telemetry") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") +#define TR_MULTI_LNA_DISABLE INDENT "LNA disable" #define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link") #define TR_MODULE_TELEM_ON TR("ON", "Enabled") #define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF") diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index f4c388f21..d82ffc70c 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -658,6 +658,7 @@ #define TR_DISABLE_TELEM TR("No Telem", "Disable Telemetry") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") +#define TR_MULTI_LNA_DISABLE INDENT "LNA disable" #define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link") #define TR_MODULE_TELEM_ON TR("ON", "Enabled") #define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF") diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index a43757e1c..671370d01 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -649,6 +649,7 @@ #define TR_DISABLE_TELEM TR("No Telem", "Disable Telemetry") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") +#define TR_MULTI_LNA_DISABLE INDENT "LNA disable" #define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link") #define TR_MODULE_TELEM_ON TR("ON", "Enabled") #define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF") diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 2c4e585b5..b2fbe7ec4 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -658,6 +658,7 @@ #define TR_DISABLE_TELEM TR("No Telem", "Disable Telemetry") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format") #define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") +#define TR_MULTI_LNA_DISABLE INDENT "LNA disable" #define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link") #define TR_MODULE_TELEM_ON TR("ON", "Enabled") #define TR_DISABLE_INTERNAL TR("Disable int. RF", "Disable internal RF") From ce3f8374a1e316f159e9d9cc59b24583d5bf28b6 Mon Sep 17 00:00:00 2001 From: RealTadango Date: Tue, 21 Apr 2020 15:04:17 +0200 Subject: [PATCH 252/560] Using the right precision for unknown (custom) sensors (#7508) Co-authored-by: Herman Kruisman --- radio/src/telemetry/frsky_sport.cpp | 2 +- radio/src/telemetry/telemetry_sensors.cpp | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index ebb90586a..0e4f3920c 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -130,7 +130,7 @@ uint16_t rboxState; void sportProcessTelemetryPacket(uint16_t id, uint8_t subId, uint8_t instance, uint32_t data, TelemetryUnit unit=UNIT_RAW) { const FrSkySportSensor * sensor = getFrSkySportSensor(id, subId); - uint8_t precision = 0; + uint8_t precision = 255; if (sensor) { if (unit == UNIT_RAW) unit = sensor->unit; diff --git a/radio/src/telemetry/telemetry_sensors.cpp b/radio/src/telemetry/telemetry_sensors.cpp index dc9742b55..66b0e2255 100644 --- a/radio/src/telemetry/telemetry_sensors.cpp +++ b/radio/src/telemetry/telemetry_sensors.cpp @@ -82,6 +82,10 @@ void TelemetryItem::setValue(const TelemetrySensor & sensor, int32_t val, uint32 { int32_t newVal = val; + if(prec == 255) { + prec = sensor.prec; + } + if (unit == UNIT_CELLS) { uint32_t data = uint32_t(newVal); uint8_t cellsCount = (data >> 24); From 4ac35a2e23a06f841290b441ecbd3bb0c6cad95b Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 21 Apr 2020 15:14:20 +0200 Subject: [PATCH 253/560] Add one more line to text viewer (#7528) --- radio/src/gui/128x64/gui.h | 1 + radio/src/gui/212x64/gui.h | 1 + radio/src/gui/480x272/gui.h | 1 + radio/src/gui/480x272/view_text.cpp | 8 ++++---- radio/src/sdcard.cpp | 8 ++++---- 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h index d7e1538f5..b5ba20b5d 100644 --- a/radio/src/gui/128x64/gui.h +++ b/radio/src/gui/128x64/gui.h @@ -40,6 +40,7 @@ #define drawFieldLabel(x, y, str) lcdDrawTextAlignedLeft(y, str) #define NUM_BODY_LINES (LCD_LINES-1) +#define TEXT_VIEWER_LINES NUM_BODY_LINES #define MENU_HEADER_HEIGHT FH #define CURVE_SIDE_WIDTH (LCD_H/2) diff --git a/radio/src/gui/212x64/gui.h b/radio/src/gui/212x64/gui.h index c430a0646..20dc6b09b 100644 --- a/radio/src/gui/212x64/gui.h +++ b/radio/src/gui/212x64/gui.h @@ -32,6 +32,7 @@ #define DEFAULT_SCROLLBAR_X (LCD_W-1) #define NUM_BODY_LINES (LCD_LINES-1) +#define TEXT_VIEWER_LINES NUM_BODY_LINES #define MENU_HEADER_HEIGHT FH #define MODEL_BITMAP_WIDTH 64 diff --git a/radio/src/gui/480x272/gui.h b/radio/src/gui/480x272/gui.h index e17858f22..17618563e 100644 --- a/radio/src/gui/480x272/gui.h +++ b/radio/src/gui/480x272/gui.h @@ -47,6 +47,7 @@ #define FH 20 #define NUM_BODY_LINES (MENU_BODY_HEIGHT / FH) +#define TEXT_VIEWER_LINES ((MENU_FOOTER_TOP-MENU_HEADER_HEIGHT) / FH) #define INVERT_HORZ_MARGIN 2 #define INVERT_VERT_MARGIN 1 diff --git a/radio/src/gui/480x272/view_text.cpp b/radio/src/gui/480x272/view_text.cpp index 24a1779db..e09f62699 100644 --- a/radio/src/gui/480x272/view_text.cpp +++ b/radio/src/gui/480x272/view_text.cpp @@ -42,7 +42,7 @@ bool menuTextView(event_t event) break; case EVT_ROTARY_RIGHT: - if (menuVerticalOffset + NUM_BODY_LINES >= lines_count) + if (menuVerticalOffset + TEXT_VIEWER_LINES >= lines_count) break; else ++menuVerticalOffset; @@ -55,11 +55,11 @@ bool menuTextView(event_t event) break; } - for (int i=0; idrawTextMaxWidth(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + i * FH, reusableBuffer.viewText.lines[i], 0, LCD_W - 2 * MENUS_MARGIN_LEFT); + for (int i = 0; i < TEXT_VIEWER_LINES; i++) { + lcd->drawTextMaxWidth(MENUS_MARGIN_LEFT, MENU_HEADER_HEIGHT + i * FH, reusableBuffer.viewText.lines[i], 0, LCD_W - 2 * MENUS_MARGIN_LEFT); } - drawVerticalScrollbar(LCD_W-5, 50, 195, menuVerticalOffset, lines_count, NUM_BODY_LINES); + drawVerticalScrollbar(LCD_W-5, 50, 195, menuVerticalOffset, lines_count, TEXT_VIEWER_LINES); return true; } diff --git a/radio/src/sdcard.cpp b/radio/src/sdcard.cpp index be89633f3..42bf5491e 100644 --- a/radio/src/sdcard.cpp +++ b/radio/src/sdcard.cpp @@ -412,7 +412,7 @@ bool sdListFiles(const char * path, const char * extension, const uint8_t maxlen constexpr uint32_t TEXT_FILE_MAXSIZE = 2048; -void sdReadTextFile(const char * filename, char lines[NUM_BODY_LINES][LCD_COLS + 1], int & lines_count) +void sdReadTextFile(const char * filename, char lines[TEXT_VIEWER_LINES][LCD_COLS + 1], int & lines_count) { FIL file; int result; @@ -423,17 +423,17 @@ void sdReadTextFile(const char * filename, char lines[NUM_BODY_LINES][LCD_COLS + char escape_chars[4] = {0}; int current_line = 0; - memclear(lines, NUM_BODY_LINES * (LCD_COLS + 1)); + memclear(lines, TEXT_VIEWER_LINES * (LCD_COLS + 1)); result = f_open(&file, filename, FA_OPEN_EXISTING | FA_READ); if (result == FR_OK) { - for (unsigned i = 0; i < TEXT_FILE_MAXSIZE && f_read(&file, &c, 1, &sz) == FR_OK && sz == 1 && (lines_count == 0 || current_line - menuVerticalOffset < NUM_BODY_LINES); i++) { + for (unsigned i = 0; i < TEXT_FILE_MAXSIZE && f_read(&file, &c, 1, &sz) == FR_OK && sz == 1 && (lines_count == 0 || current_line - menuVerticalOffset < TEXT_VIEWER_LINES); i++) { if (c == '\n') { ++current_line; line_length = 0; escape = 0; } - else if (c!='\r' && current_line>=menuVerticalOffset && current_line-menuVerticalOffset=menuVerticalOffset && current_line-menuVerticalOffset Date: Wed, 22 Apr 2020 16:01:15 +0200 Subject: [PATCH 254/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 7886cfb81..a016b2c53 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1718,3 +1718,4 @@ Tom Van Driel Karl Vetter Johannes Janssen François Blondé +Precision Aero From 8ae2f4f782c2f404fc078aaa0000e5b134f20950 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 22 Apr 2020 19:23:32 +0200 Subject: [PATCH 255/560] Multi channels naming tool (#7538) Mostly-authored-by: Pascal Langer --- .../SCRIPTS/TOOLS/MultiChannelsUpdater.lua | 377 ++++++++++++++++++ .../SCRIPTS/TOOLS/MultiChannelsUpdater.lua | 377 ++++++++++++++++++ .../SCRIPTS/TOOLS/MultiChannelsUpdater.lua | 377 ++++++++++++++++++ radio/src/lua/api_model.cpp | 43 +- radio/src/pulses/multi.cpp | 90 +++-- radio/src/pulses/multi.h | 1 + 6 files changed, 1222 insertions(+), 43 deletions(-) create mode 100644 radio/sdcard/horus/SCRIPTS/TOOLS/MultiChannelsUpdater.lua create mode 100644 radio/sdcard/taranis-x7/SCRIPTS/TOOLS/MultiChannelsUpdater.lua create mode 100644 radio/sdcard/taranis-x9/SCRIPTS/TOOLS/MultiChannelsUpdater.lua diff --git a/radio/sdcard/horus/SCRIPTS/TOOLS/MultiChannelsUpdater.lua b/radio/sdcard/horus/SCRIPTS/TOOLS/MultiChannelsUpdater.lua new file mode 100644 index 000000000..73b667b81 --- /dev/null +++ b/radio/sdcard/horus/SCRIPTS/TOOLS/MultiChannelsUpdater.lua @@ -0,0 +1,377 @@ +local toolName = "TNS|Multi chan namer|TNE" + +---- ######################################################################### +---- # # +---- # Copyright (C) OpenTX # +-----# # +---- # License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html # +---- # # +---- # This program is free software; you can redistribute it and/or modify # +---- # it under the terms of the GNU General Public License version 2 as # +---- # published by the Free Software Foundation. # +---- # # +---- # This program is distributed in the hope that it will be useful # +---- # but WITHOUT ANY WARRANTY; without even the implied warranty of # +---- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +---- # GNU General Public License for more details. # +---- # # +---- ######################################################################### + +local done = 0 +local Protocols = { + {1, 0, "Flysky", "Flysky", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {1, 1, "Flysky", "V9x9", { "Flip", "Light", "Pict", "Video" }, 1 }, + {1, 2, "Flysky", "V6x6", { "Flip", "Light", "Pict", "Video", "HLess", "RTH", "XCAL", "YCAL" }, 1 }, + {1, 3, "Flysky", "V912", { "BtmBtn", "TopBtn" }, 1 }, + {1, 4, "Flysky", "CX20", { "CH5", "CH6", "CH7" }, 0 }, + {28, 0, "Flysky AFHDS2A", "PWM_IBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, + {28, 1, "Flysky AFHDS2A", "PPM_IBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, + {28, 2, "Flysky AFHDS2A", "PWM_SBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, + {28, 3, "Flysky AFHDS2A", "PPM_SBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, + {53, 0, "Flyzone", "FZ-410", { }, 0 }, + {2, 0, "Hubsan", "H107", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, + {2, 1, "Hubsan", "H301", { "RTH", "Light", "Stab", "Video" }, 0 }, + {2, 2, "Hubsan", "H501", { "RTH", "Light", "Pict", "Video", "HLess", "GPS_H", "ALT_H", "Flip", "FModes" }, 0 }, + {41, 0, "Bugs", "3-6-8", { "Arm", "Angle", "Flip", "Pict", "Video", "LED" }, 0 }, + {60, 0, "Pelikan", "PRO_V4", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {37, 0, "Corona", "COR_V1", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {37, 1, "Corona", "COR_V2", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {37, 2, "Corona", "FD_V3", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {25, 0, "FrSkyV", "V8", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {3, 0, "FrSkyD", "D8", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {3, 0, "FrSkyD", "D8Cloned", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {67, 0, "FrSkyL", "LR12", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 }, + {67, 1, "FrSkyL", "LR12_6CH", { "CH5", "CH6" }, 0 }, + {15, 0, "FrSkyX", "D16 FCC", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {15, 1, "FrSkyX", "D16_8CH FCC", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {15, 2, "FrSkyX", "D16 LBT", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {15, 3, "FrSkyX", "D16_8CH LBT", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {15, 4, "FrSkyX", "D16Cloned", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {64, 0, "FrSkyX2", "D16 FCC", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {64, 1, "FrSkyX2", "D16_8CH FCC", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {64, 2, "FrSkyX2", "D16 LBT", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {64, 3, "FrSkyX2", "D16_8CH LBT", { "CH5", "CH6", "CH7", "CH8" }, 1 }, + {64, 4, "FrSkyX2", "D16Cloned", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {55, 0, "FrSkyRX", "RX", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {55, 1, "FrSkyRX", "CloneTX", { }, 0 }, + {39, 0, "Hitec", "Opt_Fw", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 }, + {39, 1, "Hitec", "Opt_Hub", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 }, + {39, 2, "Hitec", "Minima", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 }, + {57, 0, "HoTT", "Std", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 }, + {21, 0, "SFHSS", "Std", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {68, 0, "Skyartec", "Std", { "CH5", "CH6", "CH7" }, 0 }, + {7 , 0, "Devo", "8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {7 , 1, "Devo", "10CH", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10" }, 0 }, + {7 , 2, "Devo", "12CH", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 }, + {7 , 3, "Devo", "6CH", { "CH5", "CH6" }, 0 }, + {7 , 4, "Devo", "7CH", { "CH5", "CH6", "CH7" }, 0 }, + {30, 0, "WK2x01", "WK2801", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {30, 1, "WK2x01", "WK2401", { }, 0 }, + {30, 2, "WK2x01", "W6_5_1", { "Gear", "Dis", "Gyro" }, 0 }, + {30, 3, "WK2x01", "W6_6_1", { "Gear", "Col", "Gyro" }, 0 }, + {30, 4, "WK2x01", "W6HEL", { "Gear", "Col", "Gyro" }, 0 }, + {30, 5, "WK2x01", "W6HEL_I", { "Gear", "Col", "Gyro" }, 0 }, + {6 , 0, "DSM", "2_22", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 }, + {6 , 1, "DSM", "2_11", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 }, + {6 , 2, "DSM", "X_22", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 }, + {6 , 3, "DSM", "X_11", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 }, + {22, 0, "J6Pro", "Std", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 }, + {22, 0, "WFLY", "WFR0xS", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 }, + {24, 0, "Assan", "Std", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {14, 0, "Bayang", "Std", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "n-a", "n-a", "AnAux1", "AnAux2" }, 1 }, + {14, 1, "Bayang", "H8S3D", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates" }, 1 }, + {14, 2, "Bayang", "X16_AH", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "TakeOf" }, 1 }, + {14, 3, "Bayang", "IRDRONE", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "TakeOf", "EmStop" }, 1 }, + {14, 4, "Bayang", "DHD_D4", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "TakeOf", "EmStop" }, 1 }, + {59, 0, "BayangRX", "RX", { "AnAux1", "AnAux2", "Flip", "RTH", "Pict", "Video" }, 1 }, + {42, 0, "BugsMini", "Mini", { "Arm", "Angle", "Flip", "Pict", "Video", "LED" }, 0 }, + {42, 1, "BugsMini", "3H", { "Arm", "Angle", "Flip", "Pict", "Video", "LED", "AltHol" }, 0 }, + {34, 0, "Cabell", "V3", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {34, 1, "Cabell", "V3Telem", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {13, 0, "CG023", "Std", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, + {13, 1, "CG023", "YD829", { "Flip", "n-a", "Pict", "Video", "HLess" }, 1 }, + {12, 0, "CX10", "Green", { "Flip", "Rate" }, 1 }, + {12, 1, "CX10", "Blue", { "Flip", "Rate", "Pict", "Video" }, 1 }, + {12, 2, "CX10", "DM007", { "Flip", "Mode", "Pict", "Video", "HLess" }, 1 }, + {12, 4, "CX10", "JC3015_1", { "Flip", "Mode", "Pict", "Video" }, 1 }, + {12, 5, "CX10", "JC3015_2", { "Flip", "Mode", "LED", "DFlip" }, 1 }, + {12, 6, "CX10", "MK33041", { "Flip", "Mode", "Pict", "Video", "HLess", "RTH" }, 1 }, + {33, 0, "DM022", "Std", { "Flip", "LED", "Cam1", "Cam2", "HLess", "RTH", "RLow" }, 1 }, + {45, 0, "E01X", "E012", { "n-a", "Flip", "n-a", "HLess", "RTH" }, 1 }, + {45, 1, "E01X", "E015", { "Arm", "Flip", "LED", "HLess", "RTH" }, 1 }, + {45, 2, "E01X", "E016H", { "Stop", "Flip", "n-a", "HLess", "RTH" }, 1 }, + {16, 0, "ESKY", "Std", { "Gyro", "Pitch" }, 0 }, + {16, 1, "ESKY", "ET4", { "Gyro", "Pitch" }, 0 }, + {35, 0, "ESKY150", "4CH", { }, 0 }, + {35, 1, "ESKY150", "7CH", { "FMode", "Aux6", "Aux7" }, 0 }, + {20, 0, "FY326", "FY326", { "Flip", "RTH", "HLess", "Expert", "Calib" }, 1 }, + {20, 1, "FY326", "FY319", { "Flip", "RTH", "HLess", "Expert", "Calib" }, 1 }, + {23, 0, "FY326", "FY326", { "Flip", "RTH", "HLess", "Expert" }, 1 }, + {32, 0, "GW008", "FY326", { "Flip" }, 1 }, + {36, 0, "H8_3D", "Std", { "Flip", "Light", "Pict", "Video", "RTH", "FlMode", "Cal1" }, 1 }, + {36, 1, "H8_3D", "H20H", { "Flip", "Light", "Pict", "Video", "Opt1", "Opt2", "Cal1", "Cal2", "Gimbal" }, 1 }, + {36, 2, "H8_3D", "H20", { "Flip", "Light", "Pict", "Video", "Opt1", "Opt2", "Cal1", "Cal2", "Gimbal" }, 1 }, + {36, 3, "H8_3D", "H30", { "Flip", "Light", "Pict", "Video", "Opt1", "Opt2", "Cal1", "Cal2", "Gimbal" }, 1 }, + {4 , 0, "Hisky", "Std", { "Gear", "Pitch", "Gyro", "CH8" }, 0 }, + {9 , 0, "KN", "WLToys", { "DRate", "THold", "IdleUp", "Gyro", "Ttrim", "Atrim", "Etrim" }, 0 }, + {9 , 1, "KN", "Feilun", { "DRate", "THold", "IdleUp", "Gyro", "Ttrim", "Atrim", "Etrim" }, 0 }, + {26, 0, "Hontai", "Std", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 }, + {26, 1, "Hontai", "JJRCX1", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 }, + {26, 2, "Hontai", "X5C1", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 }, + {26, 3, "Hontai", "FQ777_951", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 }, + {18, 0, "MJXQ", "WHL08", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, + {18, 1, "MJXQ", "X600", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, + {18, 2, "MJXQ", "X800", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, + {18, 3, "MJXQ", "H26D", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, + {18, 4, "MJXQ", "E010", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, + {18, 5, "MJXQ", "H26WH", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, + {18, 6, "MJXQ", "Phoenix", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, + {17, 0, "MT99XX", "Std", { "Flip", "LED", "Pict", "Video", "HLess" }, 1 }, + {17, 1, "MT99XX", "H7", { "Flip", "LED", "Pict", "Video", "HLess" }, 1 }, + {17, 2, "MT99XX", "YZ", { "Flip", "LED", "Pict", "Video", "HLess" }, 1 }, + {17, 3, "MT99XX", "LS", { "Flip", "Invert", "Pict", "Video", "HLess" }, 1 }, + {17, 4, "MT99XX", "FY805", { "Flip", "n-a", "n-a", "n-a", "HLess" }, 1 }, + {44, 0, "NCC1701", "Std", { "Warp" }, 1 }, + {51, 0, "Potensic", "A20", { "TakLan", "Emerg", "Mode", "HLess" }, 1 }, + {56, 0, "Propel", "74-Z", { "LEDs", "RollCW", "RolCCW", "Fire", "Weapon", "Calib", "AltHol", "TakeOf", "Land", "Train" }, 1 }, + {29, 0, "Q2x2", "Q222", { "Flip", "LED", "Mod2", "Mod1", "HLess", "RTH", "XCal", "YCal" }, 1 }, + {29, 1, "Q2x2", "Q242", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "XCal", "YCal" }, 1 }, + {29, 2, "Q2x2", "Q282", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "XCal", "YCal" }, 1 }, + {31, 0, "Q303", "Q303", { "AltHol", "Flip", "Pict", "Video", "HLess", "RTH", "Gimbal" }, 1 }, + {31, 1, "Q303", "C35", { "Arm", "VTX", "Pict", "Video", "n-a", "RTH", "Gimbal" }, 1 }, + {31, 2, "Q303", "CX10D", { "Arm", "Flip" }, 1 }, + {31, 3, "Q303", "CX10WD", { "Arm", "Flip" }, 1 }, + {50, 0, "Redpine", "Fast", { "sCH5", "sCH6", "sCH7", "sCH8", "sCH9", "sCH10", "sCH11", "sCH12", "sCH13", "sCH14", "sCH15", "sCH16" }, 0 }, + {50, 1, "Redpine", "Slow", { "sCH5", "sCH6", "sCH7", "sCH8", "sCH9", "sCH10", "sCH11", "sCH12", "sCH13", "sCH14", "sCH15", "sCH16" }, 0 }, + {11, 0, "SLT", "V1", { "Gear", "Pitch" }, 0 }, + {11, 1, "SLT", "V2", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {11, 2, "SLT", "Q100", { "Rates", "n-a", "CH7", "CH8", "Mode", "Flip", "n-a", "n-a", "Calib" }, 0 }, + {11, 3, "SLT", "Q200", { "Rates", "n-a", "CH7", "CH8", "Mode", "VidOn", "VidOff", "Calib" }, 0 }, + {11, 4, "SLT", "MR100", { "Rates", "n-a", "CH7", "CH8", "Mode", "Flip", "Video", "Pict" }, 0 }, + {10, 0, "Symax", "Std", { "Flip", "Rates", "Pict", "Video", "HLess" }, 1 }, + {10, 1, "Symax", "X5C", { "Flip", "Rates", "Pict", "Video", "HLess" }, 1 }, + {5 , 0, "V2x2", "Std", { "Flip", "Light", "Pict", "Video", "HLess", "CalX", "CalY" }, 1 }, + {5 , 1, "V2x2", "JXD506", { "Flip", "Light", "Pict", "Video", "HLess", "StaSto", "Emerg", "Cam_UD" }, 1 }, + {61, 0, "Tiger", "Std", { "Flip", "Light" }, 1 }, + {46, 0, "V911s", "Std", { "Calib" }, 1 }, + {46, 1, "E119", "Std", { "Calib" }, 1 }, + {62, 0, "XK", "X450", { "FMode", "TakeOf", "Emerg", "3D_6G", "Pict", "Video" }, 1 }, + {62, 1, "XK", "X420", { "FMode", "TakeOf", "Emerg", "3D_6G", "Pict", "Video" }, 1 }, + {8 , 0, "YD717", "Std", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, + {8 , 1, "YD717", "SkyWlkr", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, + {8 , 2, "YD717", "Simax4", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, + {8 , 3, "YD717", "XinXun", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, + {8 , 4, "YD717", "NiHui", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, + {65,0, "FrSkyR9", "R9_915", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {65,1, "FrSkyR9", "R9_868", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {65,2, "FrSkyR9", "R9_915_8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {65,3, "FrSkyR9", "R9_968_8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + +-- Need first 4 channels changed... + {19, 0, "Shenqi", "Cycle", { }, 1 }, + {4 , 1, "Hisky", "HK310", { "Aux" }, 0 }, + {43, 0, "Traxxas", "6519", { }, 0 }, + {52, 0, "ZSX", "280", { "Light" }, 1 }, + {48, 0, "V761", "Std", { "Gyro" }, 1 }, + {49, 0, "KF606", "Std", { "Trim" }, 1 }, + {47, 0, "GD00x", "V1", { "Trim", "LED", "Rate" }, 1 }, + {47, 1, "GD00x", "V2", { "Trim", "LED", "Rate" }, 1 }, + {58, 0, "FX816", "P38", { },1 } +} + +local function drawScreenTitle(title) + if LCD_W == 480 then + lcd.drawFilledRectangle(0, 0, LCD_W, 30, TITLE_BGCOLOR) + lcd.drawText(1, 5, title, MENU_TITLE_COLOR) + else + lcd.drawScreenTitle(title, 0, 0) + end +end + +function bitand(a, b) + local result = 0 + local bitval = 1 + while a > 0 and b > 0 do + if a % 2 == 1 and b % 2 == 1 then -- test the rightmost bits + result = result + bitval -- set the current bit + end + bitval = bitval * 2 -- shift left + a = math.floor(a/2) -- shift right + b = math.floor(b/2) + end + return result +end + +local function Multi_Draw_LCD() + local line = 0 + local module_conf = {} + local module_pos = "Internal" + + lcd.clear() + drawScreenTitle("Multi channels namer") + module_conf = model.getModule(0) + if module_conf["Type"] ~= 6 then + module_pos = "External" + module_conf = model.getModule(1) + if module_conf["Type"] ~= 6 then + if LCD_W == 480 then + lcd.drawText(10,50,"No Multi module configured...", BLINK) + else + --Draw on LCD_W=128 + lcd.drawText(2,17,"No Multi module configured...",SMLSIZE) + end + return + end + end + + local protocol = module_conf["protocol"] + local sub_protocol = module_conf["subProtocol"] + + --Display settings + local lcd_opt + if LCD_W == 480 then + x_pos = 10 + y_pos = 32 + y_inc = 20 + else + x_pos = 0 + y_pos = 9 + y_inc = 8 + lcd_opt = SMLSIZE + end + + --Exceptions on first 4 channels... + local stick_names = { "Rud", "Ele", "Thr", "Ail" } + if ( protocol == 4 and sub_protocol ==1 ) or protocol == 19 or protocol == 52 then -- Hisky/HK310, Shenqi, ZSX + stick_names[2] = "n-a" + stick_names[4] = "n-a" + elseif protocol == 43 then -- Traxxas + stick_names[2] = "Aux4" + stick_names[4] = "Aux3" + elseif protocol == 48 then -- V761 + stick_names[4] = "n-a" + elseif protocol == 47 or protocol == 49 or protocol == 58 then -- GD00x, KF606, FX816 + stick_names[1] = "n-a" + stick_names[2] = "n-a" + end + + --Determine fist 4 channels order + local channel_names={} + local ch_order=module_conf["channelsOrder"] + if (ch_order == -1) then + channel_names[1] = stick_names[defaultChannel(0)+1] + channel_names[2] = stick_names[defaultChannel(1)+1] + channel_names[3] = stick_names[defaultChannel(2)+1] + channel_names[4] = stick_names[defaultChannel(3)+1] + else + channel_names[bitand(ch_order,3)+1] = stick_names[4] + ch_order = math.floor(ch_order/4) + channel_names[bitand(ch_order,3)+1] = stick_names[2] + ch_order = math.floor(ch_order/4) + channel_names[bitand(ch_order,3)+1] = stick_names[3] + ch_order = math.floor(ch_order/4) + channel_names[bitand(ch_order,3)+1] = stick_names[1] + end + + --Specific channels for protocol + local protocol_name, sub_protocol_name, bind_ch + for i,v in ipairs(Protocols) do + if v[1] == protocol and v[2] == sub_protocol then + protocol_name = v[3] + sub_protocol_name = v[4] + for j,w in ipairs(v[5]) do + channel_names[4+j]=w; + end + bind_ch = v[6] + end + end + + lcd.drawText(x_pos, y_pos+y_inc*line,module_pos .. " Multi detected.", lcd_opt) + line = line + 1 + if (ch_order == -1) then + lcd.drawText(x_pos, y_pos+y_inc*line,"Channels order can't be read from Multi...", lcd_opt) + line = line + 1 + end + if protocol_name == nil or sub_protocol_name == nil then + lcd.drawText(x_pos, y_pos+y_inc*line,"Unknown protocol/sub_protocol...", lcd_opt) + else if LCD_W > 128 then + lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name .. " / SubProtocol: " .. sub_protocol_name, lcd_opt) + line = line + 1 + else + lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name, lcd_opt) + line = line + 1 + lcd.drawText(x_pos, y_pos+y_inc*line,"SubProtocol: " .. sub_protocol_name, lcd_opt) + line = line + 1 + end + text1="" + text2="" + for i,v in ipairs(channel_names) do + if i<=8 then + if i==1 then + text1 = v + else + text1=text1 .. "," .. v + end + else + if i==9 then + text2 = v + else + text2=text2 .. "," .. v + end + end + end + if LCD_W > 128 then + lcd.drawText(x_pos, y_pos+y_inc*line,"Channels: " .. text1, lcd_opt) + line = line + 1 + if text2 ~= "" then + lcd.drawText(x_pos*9, y_pos+y_inc*line,text2, lcd_opt) + line = line + 1 + end + end + lcd.drawText(x_pos, y_pos+y_inc*line,"Setting channel names.", lcd_opt) + line = line + 1 + local output, nbr + for i,v in ipairs(channel_names) do + output = model.getOutput(i-1) + output["name"] = v + model.setOutput(i-1,output) + nbr = i + end + for i = nbr, 15 do + output = model.getOutput(i) + output["name"] = "n-a" + model.setOutput(i,output) + end + if bind_ch == 1 then + output = model.getOutput(15) + output["name"] = "BindCH" + model.setOutput(15,output) + end + lcd.drawText(x_pos, y_pos+y_inc*line,"Done!", lcd_opt) + line = line + 1 + done = 1 + end +end + +-- Init +local function Multi_Init() +end + +-- Main +local function Multi_Run(event) + if event == nil then + error("Cannot be run as a model script!") + return 2 + else + if done == 0 then + Multi_Draw_LCD() + else + if event == EVT_VIRTUAL_ENTER or event == EVT_VIRTUAL_EXIT then + return 2 + end + end + return 0 + end +end + +return { init=Multi_Init, run=Multi_Run } diff --git a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/MultiChannelsUpdater.lua b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/MultiChannelsUpdater.lua new file mode 100644 index 000000000..675b25e15 --- /dev/null +++ b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/MultiChannelsUpdater.lua @@ -0,0 +1,377 @@ +local toolName = "TNS|Multi chan namer|TNE" + +---- ######################################################################### +---- # # +---- # Copyright (C) OpenTX # +-----# # +---- # License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html # +---- # # +---- # This program is free software; you can redistribute it and/or modify # +---- # it under the terms of the GNU General Public License version 2 as # +---- # published by the Free Software Foundation. # +---- # # +---- # This program is distributed in the hope that it will be useful # +---- # but WITHOUT ANY WARRANTY; without even the implied warranty of # +---- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +---- # GNU General Public License for more details. # +---- # # +---- ######################################################################### + +local done = 0 +local Protocols = { + {1, 0, "Flysky", "Flysky", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {1, 1, "Flysky", "V9x9", { "Flip", "Light", "Pict", "Video" }, 1 }, + {1, 2, "Flysky", "V6x6", { "Flip", "Light", "Pict", "Video", "HLess", "RTH", "XCAL", "YCAL" }, 1 }, + {1, 3, "Flysky", "V912", { "BtmBtn", "TopBtn" }, 1 }, + {1, 4, "Flysky", "CX20", { "CH5", "CH6", "CH7" }, 0 }, + {28, 0, "Flysky AFHDS2A", "PWM_IBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, + {28, 1, "Flysky AFHDS2A", "PPM_IBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, + {28, 2, "Flysky AFHDS2A", "PWM_SBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, + {28, 3, "Flysky AFHDS2A", "PPM_SBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, + {53, 0, "Flyzone", "FZ-410", { }, 0 }, + {2, 0, "Hubsan", "H107", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, + {2, 1, "Hubsan", "H301", { "RTH", "Light", "Stab", "Video" }, 0 }, + {2, 2, "Hubsan", "H501", { "RTH", "Light", "Pict", "Video", "HLess", "GPS_H", "ALT_H", "Flip", "FModes" }, 0 }, + {41, 0, "Bugs", "3-6-8", { "Arm", "Angle", "Flip", "Pict", "Video", "LED" }, 0 }, + {60, 0, "Pelikan", "PRO_V4", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {37, 0, "Corona", "COR_V1", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {37, 1, "Corona", "COR_V2", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {37, 2, "Corona", "FD_V3", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {25, 0, "FrSkyV", "V8", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {3, 0, "FrSkyD", "D8", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {3, 0, "FrSkyD", "D8Cloned", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {67, 0, "FrSkyL", "LR12", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 }, + {67, 1, "FrSkyL", "LR12_6CH", { "CH5", "CH6" }, 0 }, + {15, 0, "FrSkyX", "D16 FCC", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {15, 1, "FrSkyX", "D16_8CH FCC", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {15, 2, "FrSkyX", "D16 LBT", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {15, 3, "FrSkyX", "D16_8CH LBT", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {15, 4, "FrSkyX", "D16Cloned", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {64, 0, "FrSkyX2", "D16 FCC", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {64, 1, "FrSkyX2", "D16_8CH FCC", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {64, 2, "FrSkyX2", "D16 LBT", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {64, 3, "FrSkyX2", "D16_8CH LBT", { "CH5", "CH6", "CH7", "CH8" }, 1 }, + {64, 4, "FrSkyX2", "D16Cloned", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {55, 0, "FrSkyRX", "RX", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {55, 1, "FrSkyRX", "CloneTX", { }, 0 }, + {39, 0, "Hitec", "Opt_Fw", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 }, + {39, 1, "Hitec", "Opt_Hub", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 }, + {39, 2, "Hitec", "Minima", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 }, + {57, 0, "HoTT", "Std", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 }, + {21, 0, "SFHSS", "Std", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {68, 0, "Skyartec", "Std", { "CH5", "CH6", "CH7" }, 0 }, + {7 , 0, "Devo", "8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {7 , 1, "Devo", "10CH", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10" }, 0 }, + {7 , 2, "Devo", "12CH", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 }, + {7 , 3, "Devo", "6CH", { "CH5", "CH6" }, 0 }, + {7 , 4, "Devo", "7CH", { "CH5", "CH6", "CH7" }, 0 }, + {30, 0, "WK2x01", "WK2801", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {30, 1, "WK2x01", "WK2401", { }, 0 }, + {30, 2, "WK2x01", "W6_5_1", { "Gear", "Dis", "Gyro" }, 0 }, + {30, 3, "WK2x01", "W6_6_1", { "Gear", "Col", "Gyro" }, 0 }, + {30, 4, "WK2x01", "W6HEL", { "Gear", "Col", "Gyro" }, 0 }, + {30, 5, "WK2x01", "W6HEL_I", { "Gear", "Col", "Gyro" }, 0 }, + {6 , 0, "DSM", "2_22", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 }, + {6 , 1, "DSM", "2_11", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 }, + {6 , 2, "DSM", "X_22", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 }, + {6 , 3, "DSM", "X_11", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 }, + {22, 0, "J6Pro", "Std", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 }, + {22, 0, "WFLY", "WFR0xS", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 }, + {24, 0, "Assan", "Std", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {14, 0, "Bayang", "Std", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "n-a", "n-a", "AnAux1", "AnAux2" }, 1 }, + {14, 1, "Bayang", "H8S3D", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates" }, 1 }, + {14, 2, "Bayang", "X16_AH", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "TakeOf" }, 1 }, + {14, 3, "Bayang", "IRDRONE", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "TakeOf", "EmStop" }, 1 }, + {14, 4, "Bayang", "DHD_D4", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "TakeOf", "EmStop" }, 1 }, + {59, 0, "BayangRX", "RX", { "AnAux1", "AnAux2", "Flip", "RTH", "Pict", "Video" }, 1 }, + {42, 0, "BugsMini", "Mini", { "Arm", "Angle", "Flip", "Pict", "Video", "LED" }, 0 }, + {42, 1, "BugsMini", "3H", { "Arm", "Angle", "Flip", "Pict", "Video", "LED", "AltHol" }, 0 }, + {34, 0, "Cabell", "V3", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {34, 1, "Cabell", "V3Telem", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {13, 0, "CG023", "Std", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, + {13, 1, "CG023", "YD829", { "Flip", "n-a", "Pict", "Video", "HLess" }, 1 }, + {12, 0, "CX10", "Green", { "Flip", "Rate" }, 1 }, + {12, 1, "CX10", "Blue", { "Flip", "Rate", "Pict", "Video" }, 1 }, + {12, 2, "CX10", "DM007", { "Flip", "Mode", "Pict", "Video", "HLess" }, 1 }, + {12, 4, "CX10", "JC3015_1", { "Flip", "Mode", "Pict", "Video" }, 1 }, + {12, 5, "CX10", "JC3015_2", { "Flip", "Mode", "LED", "DFlip" }, 1 }, + {12, 6, "CX10", "MK33041", { "Flip", "Mode", "Pict", "Video", "HLess", "RTH" }, 1 }, + {33, 0, "DM022", "Std", { "Flip", "LED", "Cam1", "Cam2", "HLess", "RTH", "RLow" }, 1 }, + {45, 0, "E01X", "E012", { "n-a", "Flip", "n-a", "HLess", "RTH" }, 1 }, + {45, 1, "E01X", "E015", { "Arm", "Flip", "LED", "HLess", "RTH" }, 1 }, + {45, 2, "E01X", "E016H", { "Stop", "Flip", "n-a", "HLess", "RTH" }, 1 }, + {16, 0, "ESKY", "Std", { "Gyro", "Pitch" }, 0 }, + {16, 1, "ESKY", "ET4", { "Gyro", "Pitch" }, 0 }, + {35, 0, "ESKY150", "4CH", { }, 0 }, + {35, 1, "ESKY150", "7CH", { "FMode", "Aux6", "Aux7" }, 0 }, + {20, 0, "FY326", "FY326", { "Flip", "RTH", "HLess", "Expert", "Calib" }, 1 }, + {20, 1, "FY326", "FY319", { "Flip", "RTH", "HLess", "Expert", "Calib" }, 1 }, + {23, 0, "FY326", "FY326", { "Flip", "RTH", "HLess", "Expert" }, 1 }, + {32, 0, "GW008", "FY326", { "Flip" }, 1 }, + {36, 0, "H8_3D", "Std", { "Flip", "Light", "Pict", "Video", "RTH", "FlMode", "Cal1" }, 1 }, + {36, 1, "H8_3D", "H20H", { "Flip", "Light", "Pict", "Video", "Opt1", "Opt2", "Cal1", "Cal2", "Gimbal" }, 1 }, + {36, 2, "H8_3D", "H20", { "Flip", "Light", "Pict", "Video", "Opt1", "Opt2", "Cal1", "Cal2", "Gimbal" }, 1 }, + {36, 3, "H8_3D", "H30", { "Flip", "Light", "Pict", "Video", "Opt1", "Opt2", "Cal1", "Cal2", "Gimbal" }, 1 }, + {4 , 0, "Hisky", "Std", { "Gear", "Pitch", "Gyro", "CH8" }, 0 }, + {9 , 0, "KN", "WLToys", { "DRate", "THold", "IdleUp", "Gyro", "Ttrim", "Atrim", "Etrim" }, 0 }, + {9 , 1, "KN", "Feilun", { "DRate", "THold", "IdleUp", "Gyro", "Ttrim", "Atrim", "Etrim" }, 0 }, + {26, 0, "Hontai", "Std", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 }, + {26, 1, "Hontai", "JJRCX1", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 }, + {26, 2, "Hontai", "X5C1", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 }, + {26, 3, "Hontai", "FQ777_951", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 }, + {18, 0, "MJXQ", "WHL08", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, + {18, 1, "MJXQ", "X600", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, + {18, 2, "MJXQ", "X800", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, + {18, 3, "MJXQ", "H26D", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, + {18, 4, "MJXQ", "E010", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, + {18, 5, "MJXQ", "H26WH", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, + {18, 6, "MJXQ", "Phoenix", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, + {17, 0, "MT99XX", "Std", { "Flip", "LED", "Pict", "Video", "HLess" }, 1 }, + {17, 1, "MT99XX", "H7", { "Flip", "LED", "Pict", "Video", "HLess" }, 1 }, + {17, 2, "MT99XX", "YZ", { "Flip", "LED", "Pict", "Video", "HLess" }, 1 }, + {17, 3, "MT99XX", "LS", { "Flip", "Invert", "Pict", "Video", "HLess" }, 1 }, + {17, 4, "MT99XX", "FY805", { "Flip", "n-a", "n-a", "n-a", "HLess" }, 1 }, + {44, 0, "NCC1701", "Std", { "Warp" }, 1 }, + {51, 0, "Potensic", "A20", { "TakLan", "Emerg", "Mode", "HLess" }, 1 }, + {56, 0, "Propel", "74-Z", { "LEDs", "RollCW", "RolCCW", "Fire", "Weapon", "Calib", "AltHol", "TakeOf", "Land", "Train" }, 1 }, + {29, 0, "Q2x2", "Q222", { "Flip", "LED", "Mod2", "Mod1", "HLess", "RTH", "XCal", "YCal" }, 1 }, + {29, 1, "Q2x2", "Q242", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "XCal", "YCal" }, 1 }, + {29, 2, "Q2x2", "Q282", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "XCal", "YCal" }, 1 }, + {31, 0, "Q303", "Q303", { "AltHol", "Flip", "Pict", "Video", "HLess", "RTH", "Gimbal" }, 1 }, + {31, 1, "Q303", "C35", { "Arm", "VTX", "Pict", "Video", "n-a", "RTH", "Gimbal" }, 1 }, + {31, 2, "Q303", "CX10D", { "Arm", "Flip" }, 1 }, + {31, 3, "Q303", "CX10WD", { "Arm", "Flip" }, 1 }, + {50, 0, "Redpine", "Fast", { "sCH5", "sCH6", "sCH7", "sCH8", "sCH9", "sCH10", "sCH11", "sCH12", "sCH13", "sCH14", "sCH15", "sCH16" }, 0 }, + {50, 1, "Redpine", "Slow", { "sCH5", "sCH6", "sCH7", "sCH8", "sCH9", "sCH10", "sCH11", "sCH12", "sCH13", "sCH14", "sCH15", "sCH16" }, 0 }, + {11, 0, "SLT", "V1", { "Gear", "Pitch" }, 0 }, + {11, 1, "SLT", "V2", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {11, 2, "SLT", "Q100", { "Rates", "n-a", "CH7", "CH8", "Mode", "Flip", "n-a", "n-a", "Calib" }, 0 }, + {11, 3, "SLT", "Q200", { "Rates", "n-a", "CH7", "CH8", "Mode", "VidOn", "VidOff", "Calib" }, 0 }, + {11, 4, "SLT", "MR100", { "Rates", "n-a", "CH7", "CH8", "Mode", "Flip", "Video", "Pict" }, 0 }, + {10, 0, "Symax", "Std", { "Flip", "Rates", "Pict", "Video", "HLess" }, 1 }, + {10, 1, "Symax", "X5C", { "Flip", "Rates", "Pict", "Video", "HLess" }, 1 }, + {5 , 0, "V2x2", "Std", { "Flip", "Light", "Pict", "Video", "HLess", "CalX", "CalY" }, 1 }, + {5 , 1, "V2x2", "JXD506", { "Flip", "Light", "Pict", "Video", "HLess", "StaSto", "Emerg", "Cam_UD" }, 1 }, + {61, 0, "Tiger", "Std", { "Flip", "Light" }, 1 }, + {46, 0, "V911s", "Std", { "Calib" }, 1 }, + {46, 1, "E119", "Std", { "Calib" }, 1 }, + {62, 0, "XK", "X450", { "FMode", "TakeOf", "Emerg", "3D_6G", "Pict", "Video" }, 1 }, + {62, 1, "XK", "X420", { "FMode", "TakeOf", "Emerg", "3D_6G", "Pict", "Video" }, 1 }, + {8 , 0, "YD717", "Std", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, + {8 , 1, "YD717", "SkyWlkr", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, + {8 , 2, "YD717", "Simax4", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, + {8 , 3, "YD717", "XinXun", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, + {8 , 4, "YD717", "NiHui", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, + {65,0, "FrSkyR9", "R9_915", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {65,1, "FrSkyR9", "R9_868", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {65,2, "FrSkyR9", "R9_915_8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {65,3, "FrSkyR9", "R9_968_8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + +-- Need first 4 channels changed... + {19, 0, "Shenqi", "Cycle", { }, 1 }, + {4 , 1, "Hisky", "HK310", { "Aux" }, 0 }, + {43, 0, "Traxxas", "6519", { }, 0 }, + {52, 0, "ZSX", "280", { "Light" }, 1 }, + {48, 0, "V761", "Std", { "Gyro" }, 1 }, + {49, 0, "KF606", "Std", { "Trim" }, 1 }, + {47, 0, "GD00x", "V1", { "Trim", "LED", "Rate" }, 1 }, + {47, 1, "GD00x", "V2", { "Trim", "LED", "Rate" }, 1 }, + {58, 0, "FX816", "P38", { },1 } +} + +local function drawScreenTitle(title) + if LCD_W == 480 then + lcd.drawFilledRectangle(0, 0, LCD_W, 30, TITLE_BGCOLOR) + lcd.drawText(1, 5, title, MENU_TITLE_COLOR) + else + lcd.drawScreenTitle(title, 0, 0) + end +end + +function bitand(a, b) + local result = 0 + local bitval = 1 + while a > 0 and b > 0 do + if a % 2 == 1 and b % 2 == 1 then -- test the rightmost bits + result = result + bitval -- set the current bit + end + bitval = bitval * 2 -- shift left + a = math.floor(a/2) -- shift right + b = math.floor(b/2) + end + return result +end + +local function Multi_Draw_LCD() + local line = 0 + local module_conf = {} + local module_pos = "Internal" + + lcd.clear() + drawScreenTitle("Multi channels namer") + module_conf = model.getModule(0) + if module_conf["Type"] ~= 6 then + module_pos = "External" + module_conf = model.getModule(1) + if module_conf["Type"] ~= 6 then + if LCD_W == 480 then + lcd.drawText(10,50,"No Multi module configured...", BLINK) + else + --Draw on LCD_W=128 + lcd.drawText(2,17,"No Multi module configured...",SMLSIZE) + end + return + end + end + + local protocol = module_conf["protocol"] + local sub_protocol = module_conf["subProtocol"] + + --Display settings + local lcd_opt + if LCD_W == 480 then + x_pos = 10 + y_pos = 32 + y_inc = 20 + else + x_pos = 0 + y_pos = 9 + y_inc = 8 + lcd_opt = SMLSIZE + end + + --Exceptions on first 4 channels... + local stick_names = { "Rud", "Ele", "Thr", "Ail" } + if ( protocol == 4 and sub_protocol ==1 ) or protocol == 19 or protocol == 52 then -- Hisky/HK310, Shenqi, ZSX + stick_names[2] = "n-a" + stick_names[4] = "n-a" + elseif protocol == 43 then -- Traxxas + stick_names[2] = "Aux4" + stick_names[4] = "Aux3" + elseif protocol == 48 then -- V761 + stick_names[4] = "n-a" + elseif protocol == 47 or protocol == 49 or protocol == 58 then -- GD00x, KF606, FX816 + stick_names[1] = "n-a" + stick_names[2] = "n-a" + end + + --Determine fist 4 channels order + local channel_names={} + local ch_order=module_conf["channelsOrder"] + if (ch_order == -1) then + channel_names[1] = stick_names[defaultChannel(0)+1] + channel_names[2] = stick_names[defaultChannel(1)+1] + channel_names[3] = stick_names[defaultChannel(2)+1] + channel_names[4] = stick_names[defaultChannel(3)+1] + else + channel_names[bitand(ch_order,3)+1] = stick_names[4] + ch_order = math.floor(ch_order/4) + channel_names[bitand(ch_order,3)+1] = stick_names[2] + ch_order = math.floor(ch_order/4) + channel_names[bitand(ch_order,3)+1] = stick_names[3] + ch_order = math.floor(ch_order/4) + channel_names[bitand(ch_order,3)+1] = stick_names[1] + end + + --Specific channels for protocol + local protocol_name, sub_protocol_name, bind_ch + for i,v in ipairs(Protocols) do + if v[1] == protocol and v[2] == sub_protocol then + protocol_name = v[3] + sub_protocol_name = v[4] + for j,w in ipairs(v[5]) do + channel_names[4+j]=w; + end + bind_ch = v[6] + end + end + + lcd.drawText(x_pos, y_pos+y_inc*line,module_pos .. " Multi detected.",lcd_opt) + line = line + 1 + if (ch_order == -1) then + lcd.drawText(x_pos, y_pos+y_inc*line,"Channels order can't be read from Multi...",lcd_opt) + line = line + 1 + end + if protocol_name == nil or sub_protocol_name == nil then + lcd.drawText(x_pos, y_pos+y_inc*line,"Unknown protocol/sub_protocol...",lcd_opt) + else if LCD_W > 128 then + lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name .. " / SubProtocol: " .. sub_protocol_name,lcd_opt) + line = line + 1 + else + lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name, lcd_opt) + line = line + 1 + lcd.drawText(x_pos, y_pos+y_inc*line,"SubProtocol: " .. sub_protocol_name, lcd_opt) + line = line + 1 + end + text1="" + text2="" + for i,v in ipairs(channel_names) do + if i<=8 then + if i==1 then + text1 = v + else + text1=text1 .. "," .. v + end + else + if i==9 then + text2 = v + else + text2=text2 .. "," .. v + end + end + end + if LCD_W > 128 then + lcd.drawText(x_pos, y_pos+y_inc*line,"Channels: " .. text1,lcd_opt) + line = line + 1 + if text2 ~= "" then + lcd.drawText(x_pos*9, y_pos+y_inc*line,text2,lcd_opt) + line = line + 1 + end + end + lcd.drawText(x_pos, y_pos+y_inc*line,"Setting channel names.",lcd_opt) + line = line + 1 + local output, nbr + for i,v in ipairs(channel_names) do + output = model.getOutput(i-1) + output["name"] = v + model.setOutput(i-1,output) + nbr = i + end + for i = nbr, 15 do + output = model.getOutput(i) + output["name"] = "n-a" + model.setOutput(i,output) + end + if bind_ch == 1 then + output = model.getOutput(15) + output["name"] = "BindCH" + model.setOutput(15,output) + end + lcd.drawText(x_pos, y_pos+y_inc*line,"Done!",lcd_opt) + line = line + 1 + done = 1 + end +end + +-- Init +local function Multi_Init() +end + +-- Main +local function Multi_Run(event) + if event == nil then + error("Cannot be run as a model script!") + return 2 + else + if done == 0 then + Multi_Draw_LCD() + else + if event == EVT_VIRTUAL_ENTER or event == EVT_VIRTUAL_EXIT then + return 2 + end + end + return 0 + end +end + +return { init=Multi_Init, run=Multi_Run } diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/MultiChannelsUpdater.lua b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/MultiChannelsUpdater.lua new file mode 100644 index 000000000..73b667b81 --- /dev/null +++ b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/MultiChannelsUpdater.lua @@ -0,0 +1,377 @@ +local toolName = "TNS|Multi chan namer|TNE" + +---- ######################################################################### +---- # # +---- # Copyright (C) OpenTX # +-----# # +---- # License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html # +---- # # +---- # This program is free software; you can redistribute it and/or modify # +---- # it under the terms of the GNU General Public License version 2 as # +---- # published by the Free Software Foundation. # +---- # # +---- # This program is distributed in the hope that it will be useful # +---- # but WITHOUT ANY WARRANTY; without even the implied warranty of # +---- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +---- # GNU General Public License for more details. # +---- # # +---- ######################################################################### + +local done = 0 +local Protocols = { + {1, 0, "Flysky", "Flysky", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {1, 1, "Flysky", "V9x9", { "Flip", "Light", "Pict", "Video" }, 1 }, + {1, 2, "Flysky", "V6x6", { "Flip", "Light", "Pict", "Video", "HLess", "RTH", "XCAL", "YCAL" }, 1 }, + {1, 3, "Flysky", "V912", { "BtmBtn", "TopBtn" }, 1 }, + {1, 4, "Flysky", "CX20", { "CH5", "CH6", "CH7" }, 0 }, + {28, 0, "Flysky AFHDS2A", "PWM_IBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, + {28, 1, "Flysky AFHDS2A", "PPM_IBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, + {28, 2, "Flysky AFHDS2A", "PWM_SBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, + {28, 3, "Flysky AFHDS2A", "PPM_SBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, + {53, 0, "Flyzone", "FZ-410", { }, 0 }, + {2, 0, "Hubsan", "H107", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, + {2, 1, "Hubsan", "H301", { "RTH", "Light", "Stab", "Video" }, 0 }, + {2, 2, "Hubsan", "H501", { "RTH", "Light", "Pict", "Video", "HLess", "GPS_H", "ALT_H", "Flip", "FModes" }, 0 }, + {41, 0, "Bugs", "3-6-8", { "Arm", "Angle", "Flip", "Pict", "Video", "LED" }, 0 }, + {60, 0, "Pelikan", "PRO_V4", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {37, 0, "Corona", "COR_V1", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {37, 1, "Corona", "COR_V2", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {37, 2, "Corona", "FD_V3", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {25, 0, "FrSkyV", "V8", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {3, 0, "FrSkyD", "D8", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {3, 0, "FrSkyD", "D8Cloned", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {67, 0, "FrSkyL", "LR12", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 }, + {67, 1, "FrSkyL", "LR12_6CH", { "CH5", "CH6" }, 0 }, + {15, 0, "FrSkyX", "D16 FCC", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {15, 1, "FrSkyX", "D16_8CH FCC", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {15, 2, "FrSkyX", "D16 LBT", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {15, 3, "FrSkyX", "D16_8CH LBT", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {15, 4, "FrSkyX", "D16Cloned", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {64, 0, "FrSkyX2", "D16 FCC", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {64, 1, "FrSkyX2", "D16_8CH FCC", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {64, 2, "FrSkyX2", "D16 LBT", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {64, 3, "FrSkyX2", "D16_8CH LBT", { "CH5", "CH6", "CH7", "CH8" }, 1 }, + {64, 4, "FrSkyX2", "D16Cloned", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {55, 0, "FrSkyRX", "RX", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {55, 1, "FrSkyRX", "CloneTX", { }, 0 }, + {39, 0, "Hitec", "Opt_Fw", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 }, + {39, 1, "Hitec", "Opt_Hub", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 }, + {39, 2, "Hitec", "Minima", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 }, + {57, 0, "HoTT", "Std", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 }, + {21, 0, "SFHSS", "Std", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {68, 0, "Skyartec", "Std", { "CH5", "CH6", "CH7" }, 0 }, + {7 , 0, "Devo", "8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {7 , 1, "Devo", "10CH", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10" }, 0 }, + {7 , 2, "Devo", "12CH", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 }, + {7 , 3, "Devo", "6CH", { "CH5", "CH6" }, 0 }, + {7 , 4, "Devo", "7CH", { "CH5", "CH6", "CH7" }, 0 }, + {30, 0, "WK2x01", "WK2801", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {30, 1, "WK2x01", "WK2401", { }, 0 }, + {30, 2, "WK2x01", "W6_5_1", { "Gear", "Dis", "Gyro" }, 0 }, + {30, 3, "WK2x01", "W6_6_1", { "Gear", "Col", "Gyro" }, 0 }, + {30, 4, "WK2x01", "W6HEL", { "Gear", "Col", "Gyro" }, 0 }, + {30, 5, "WK2x01", "W6HEL_I", { "Gear", "Col", "Gyro" }, 0 }, + {6 , 0, "DSM", "2_22", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 }, + {6 , 1, "DSM", "2_11", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 }, + {6 , 2, "DSM", "X_22", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 }, + {6 , 3, "DSM", "X_11", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 }, + {22, 0, "J6Pro", "Std", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 }, + {22, 0, "WFLY", "WFR0xS", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 }, + {24, 0, "Assan", "Std", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {14, 0, "Bayang", "Std", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "n-a", "n-a", "AnAux1", "AnAux2" }, 1 }, + {14, 1, "Bayang", "H8S3D", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates" }, 1 }, + {14, 2, "Bayang", "X16_AH", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "TakeOf" }, 1 }, + {14, 3, "Bayang", "IRDRONE", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "TakeOf", "EmStop" }, 1 }, + {14, 4, "Bayang", "DHD_D4", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "TakeOf", "EmStop" }, 1 }, + {59, 0, "BayangRX", "RX", { "AnAux1", "AnAux2", "Flip", "RTH", "Pict", "Video" }, 1 }, + {42, 0, "BugsMini", "Mini", { "Arm", "Angle", "Flip", "Pict", "Video", "LED" }, 0 }, + {42, 1, "BugsMini", "3H", { "Arm", "Angle", "Flip", "Pict", "Video", "LED", "AltHol" }, 0 }, + {34, 0, "Cabell", "V3", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {34, 1, "Cabell", "V3Telem", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {13, 0, "CG023", "Std", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, + {13, 1, "CG023", "YD829", { "Flip", "n-a", "Pict", "Video", "HLess" }, 1 }, + {12, 0, "CX10", "Green", { "Flip", "Rate" }, 1 }, + {12, 1, "CX10", "Blue", { "Flip", "Rate", "Pict", "Video" }, 1 }, + {12, 2, "CX10", "DM007", { "Flip", "Mode", "Pict", "Video", "HLess" }, 1 }, + {12, 4, "CX10", "JC3015_1", { "Flip", "Mode", "Pict", "Video" }, 1 }, + {12, 5, "CX10", "JC3015_2", { "Flip", "Mode", "LED", "DFlip" }, 1 }, + {12, 6, "CX10", "MK33041", { "Flip", "Mode", "Pict", "Video", "HLess", "RTH" }, 1 }, + {33, 0, "DM022", "Std", { "Flip", "LED", "Cam1", "Cam2", "HLess", "RTH", "RLow" }, 1 }, + {45, 0, "E01X", "E012", { "n-a", "Flip", "n-a", "HLess", "RTH" }, 1 }, + {45, 1, "E01X", "E015", { "Arm", "Flip", "LED", "HLess", "RTH" }, 1 }, + {45, 2, "E01X", "E016H", { "Stop", "Flip", "n-a", "HLess", "RTH" }, 1 }, + {16, 0, "ESKY", "Std", { "Gyro", "Pitch" }, 0 }, + {16, 1, "ESKY", "ET4", { "Gyro", "Pitch" }, 0 }, + {35, 0, "ESKY150", "4CH", { }, 0 }, + {35, 1, "ESKY150", "7CH", { "FMode", "Aux6", "Aux7" }, 0 }, + {20, 0, "FY326", "FY326", { "Flip", "RTH", "HLess", "Expert", "Calib" }, 1 }, + {20, 1, "FY326", "FY319", { "Flip", "RTH", "HLess", "Expert", "Calib" }, 1 }, + {23, 0, "FY326", "FY326", { "Flip", "RTH", "HLess", "Expert" }, 1 }, + {32, 0, "GW008", "FY326", { "Flip" }, 1 }, + {36, 0, "H8_3D", "Std", { "Flip", "Light", "Pict", "Video", "RTH", "FlMode", "Cal1" }, 1 }, + {36, 1, "H8_3D", "H20H", { "Flip", "Light", "Pict", "Video", "Opt1", "Opt2", "Cal1", "Cal2", "Gimbal" }, 1 }, + {36, 2, "H8_3D", "H20", { "Flip", "Light", "Pict", "Video", "Opt1", "Opt2", "Cal1", "Cal2", "Gimbal" }, 1 }, + {36, 3, "H8_3D", "H30", { "Flip", "Light", "Pict", "Video", "Opt1", "Opt2", "Cal1", "Cal2", "Gimbal" }, 1 }, + {4 , 0, "Hisky", "Std", { "Gear", "Pitch", "Gyro", "CH8" }, 0 }, + {9 , 0, "KN", "WLToys", { "DRate", "THold", "IdleUp", "Gyro", "Ttrim", "Atrim", "Etrim" }, 0 }, + {9 , 1, "KN", "Feilun", { "DRate", "THold", "IdleUp", "Gyro", "Ttrim", "Atrim", "Etrim" }, 0 }, + {26, 0, "Hontai", "Std", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 }, + {26, 1, "Hontai", "JJRCX1", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 }, + {26, 2, "Hontai", "X5C1", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 }, + {26, 3, "Hontai", "FQ777_951", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 }, + {18, 0, "MJXQ", "WHL08", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, + {18, 1, "MJXQ", "X600", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, + {18, 2, "MJXQ", "X800", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, + {18, 3, "MJXQ", "H26D", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, + {18, 4, "MJXQ", "E010", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, + {18, 5, "MJXQ", "H26WH", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, + {18, 6, "MJXQ", "Phoenix", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, + {17, 0, "MT99XX", "Std", { "Flip", "LED", "Pict", "Video", "HLess" }, 1 }, + {17, 1, "MT99XX", "H7", { "Flip", "LED", "Pict", "Video", "HLess" }, 1 }, + {17, 2, "MT99XX", "YZ", { "Flip", "LED", "Pict", "Video", "HLess" }, 1 }, + {17, 3, "MT99XX", "LS", { "Flip", "Invert", "Pict", "Video", "HLess" }, 1 }, + {17, 4, "MT99XX", "FY805", { "Flip", "n-a", "n-a", "n-a", "HLess" }, 1 }, + {44, 0, "NCC1701", "Std", { "Warp" }, 1 }, + {51, 0, "Potensic", "A20", { "TakLan", "Emerg", "Mode", "HLess" }, 1 }, + {56, 0, "Propel", "74-Z", { "LEDs", "RollCW", "RolCCW", "Fire", "Weapon", "Calib", "AltHol", "TakeOf", "Land", "Train" }, 1 }, + {29, 0, "Q2x2", "Q222", { "Flip", "LED", "Mod2", "Mod1", "HLess", "RTH", "XCal", "YCal" }, 1 }, + {29, 1, "Q2x2", "Q242", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "XCal", "YCal" }, 1 }, + {29, 2, "Q2x2", "Q282", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "XCal", "YCal" }, 1 }, + {31, 0, "Q303", "Q303", { "AltHol", "Flip", "Pict", "Video", "HLess", "RTH", "Gimbal" }, 1 }, + {31, 1, "Q303", "C35", { "Arm", "VTX", "Pict", "Video", "n-a", "RTH", "Gimbal" }, 1 }, + {31, 2, "Q303", "CX10D", { "Arm", "Flip" }, 1 }, + {31, 3, "Q303", "CX10WD", { "Arm", "Flip" }, 1 }, + {50, 0, "Redpine", "Fast", { "sCH5", "sCH6", "sCH7", "sCH8", "sCH9", "sCH10", "sCH11", "sCH12", "sCH13", "sCH14", "sCH15", "sCH16" }, 0 }, + {50, 1, "Redpine", "Slow", { "sCH5", "sCH6", "sCH7", "sCH8", "sCH9", "sCH10", "sCH11", "sCH12", "sCH13", "sCH14", "sCH15", "sCH16" }, 0 }, + {11, 0, "SLT", "V1", { "Gear", "Pitch" }, 0 }, + {11, 1, "SLT", "V2", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {11, 2, "SLT", "Q100", { "Rates", "n-a", "CH7", "CH8", "Mode", "Flip", "n-a", "n-a", "Calib" }, 0 }, + {11, 3, "SLT", "Q200", { "Rates", "n-a", "CH7", "CH8", "Mode", "VidOn", "VidOff", "Calib" }, 0 }, + {11, 4, "SLT", "MR100", { "Rates", "n-a", "CH7", "CH8", "Mode", "Flip", "Video", "Pict" }, 0 }, + {10, 0, "Symax", "Std", { "Flip", "Rates", "Pict", "Video", "HLess" }, 1 }, + {10, 1, "Symax", "X5C", { "Flip", "Rates", "Pict", "Video", "HLess" }, 1 }, + {5 , 0, "V2x2", "Std", { "Flip", "Light", "Pict", "Video", "HLess", "CalX", "CalY" }, 1 }, + {5 , 1, "V2x2", "JXD506", { "Flip", "Light", "Pict", "Video", "HLess", "StaSto", "Emerg", "Cam_UD" }, 1 }, + {61, 0, "Tiger", "Std", { "Flip", "Light" }, 1 }, + {46, 0, "V911s", "Std", { "Calib" }, 1 }, + {46, 1, "E119", "Std", { "Calib" }, 1 }, + {62, 0, "XK", "X450", { "FMode", "TakeOf", "Emerg", "3D_6G", "Pict", "Video" }, 1 }, + {62, 1, "XK", "X420", { "FMode", "TakeOf", "Emerg", "3D_6G", "Pict", "Video" }, 1 }, + {8 , 0, "YD717", "Std", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, + {8 , 1, "YD717", "SkyWlkr", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, + {8 , 2, "YD717", "Simax4", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, + {8 , 3, "YD717", "XinXun", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, + {8 , 4, "YD717", "NiHui", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, + {65,0, "FrSkyR9", "R9_915", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {65,1, "FrSkyR9", "R9_868", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, + {65,2, "FrSkyR9", "R9_915_8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {65,3, "FrSkyR9", "R9_968_8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + +-- Need first 4 channels changed... + {19, 0, "Shenqi", "Cycle", { }, 1 }, + {4 , 1, "Hisky", "HK310", { "Aux" }, 0 }, + {43, 0, "Traxxas", "6519", { }, 0 }, + {52, 0, "ZSX", "280", { "Light" }, 1 }, + {48, 0, "V761", "Std", { "Gyro" }, 1 }, + {49, 0, "KF606", "Std", { "Trim" }, 1 }, + {47, 0, "GD00x", "V1", { "Trim", "LED", "Rate" }, 1 }, + {47, 1, "GD00x", "V2", { "Trim", "LED", "Rate" }, 1 }, + {58, 0, "FX816", "P38", { },1 } +} + +local function drawScreenTitle(title) + if LCD_W == 480 then + lcd.drawFilledRectangle(0, 0, LCD_W, 30, TITLE_BGCOLOR) + lcd.drawText(1, 5, title, MENU_TITLE_COLOR) + else + lcd.drawScreenTitle(title, 0, 0) + end +end + +function bitand(a, b) + local result = 0 + local bitval = 1 + while a > 0 and b > 0 do + if a % 2 == 1 and b % 2 == 1 then -- test the rightmost bits + result = result + bitval -- set the current bit + end + bitval = bitval * 2 -- shift left + a = math.floor(a/2) -- shift right + b = math.floor(b/2) + end + return result +end + +local function Multi_Draw_LCD() + local line = 0 + local module_conf = {} + local module_pos = "Internal" + + lcd.clear() + drawScreenTitle("Multi channels namer") + module_conf = model.getModule(0) + if module_conf["Type"] ~= 6 then + module_pos = "External" + module_conf = model.getModule(1) + if module_conf["Type"] ~= 6 then + if LCD_W == 480 then + lcd.drawText(10,50,"No Multi module configured...", BLINK) + else + --Draw on LCD_W=128 + lcd.drawText(2,17,"No Multi module configured...",SMLSIZE) + end + return + end + end + + local protocol = module_conf["protocol"] + local sub_protocol = module_conf["subProtocol"] + + --Display settings + local lcd_opt + if LCD_W == 480 then + x_pos = 10 + y_pos = 32 + y_inc = 20 + else + x_pos = 0 + y_pos = 9 + y_inc = 8 + lcd_opt = SMLSIZE + end + + --Exceptions on first 4 channels... + local stick_names = { "Rud", "Ele", "Thr", "Ail" } + if ( protocol == 4 and sub_protocol ==1 ) or protocol == 19 or protocol == 52 then -- Hisky/HK310, Shenqi, ZSX + stick_names[2] = "n-a" + stick_names[4] = "n-a" + elseif protocol == 43 then -- Traxxas + stick_names[2] = "Aux4" + stick_names[4] = "Aux3" + elseif protocol == 48 then -- V761 + stick_names[4] = "n-a" + elseif protocol == 47 or protocol == 49 or protocol == 58 then -- GD00x, KF606, FX816 + stick_names[1] = "n-a" + stick_names[2] = "n-a" + end + + --Determine fist 4 channels order + local channel_names={} + local ch_order=module_conf["channelsOrder"] + if (ch_order == -1) then + channel_names[1] = stick_names[defaultChannel(0)+1] + channel_names[2] = stick_names[defaultChannel(1)+1] + channel_names[3] = stick_names[defaultChannel(2)+1] + channel_names[4] = stick_names[defaultChannel(3)+1] + else + channel_names[bitand(ch_order,3)+1] = stick_names[4] + ch_order = math.floor(ch_order/4) + channel_names[bitand(ch_order,3)+1] = stick_names[2] + ch_order = math.floor(ch_order/4) + channel_names[bitand(ch_order,3)+1] = stick_names[3] + ch_order = math.floor(ch_order/4) + channel_names[bitand(ch_order,3)+1] = stick_names[1] + end + + --Specific channels for protocol + local protocol_name, sub_protocol_name, bind_ch + for i,v in ipairs(Protocols) do + if v[1] == protocol and v[2] == sub_protocol then + protocol_name = v[3] + sub_protocol_name = v[4] + for j,w in ipairs(v[5]) do + channel_names[4+j]=w; + end + bind_ch = v[6] + end + end + + lcd.drawText(x_pos, y_pos+y_inc*line,module_pos .. " Multi detected.", lcd_opt) + line = line + 1 + if (ch_order == -1) then + lcd.drawText(x_pos, y_pos+y_inc*line,"Channels order can't be read from Multi...", lcd_opt) + line = line + 1 + end + if protocol_name == nil or sub_protocol_name == nil then + lcd.drawText(x_pos, y_pos+y_inc*line,"Unknown protocol/sub_protocol...", lcd_opt) + else if LCD_W > 128 then + lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name .. " / SubProtocol: " .. sub_protocol_name, lcd_opt) + line = line + 1 + else + lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name, lcd_opt) + line = line + 1 + lcd.drawText(x_pos, y_pos+y_inc*line,"SubProtocol: " .. sub_protocol_name, lcd_opt) + line = line + 1 + end + text1="" + text2="" + for i,v in ipairs(channel_names) do + if i<=8 then + if i==1 then + text1 = v + else + text1=text1 .. "," .. v + end + else + if i==9 then + text2 = v + else + text2=text2 .. "," .. v + end + end + end + if LCD_W > 128 then + lcd.drawText(x_pos, y_pos+y_inc*line,"Channels: " .. text1, lcd_opt) + line = line + 1 + if text2 ~= "" then + lcd.drawText(x_pos*9, y_pos+y_inc*line,text2, lcd_opt) + line = line + 1 + end + end + lcd.drawText(x_pos, y_pos+y_inc*line,"Setting channel names.", lcd_opt) + line = line + 1 + local output, nbr + for i,v in ipairs(channel_names) do + output = model.getOutput(i-1) + output["name"] = v + model.setOutput(i-1,output) + nbr = i + end + for i = nbr, 15 do + output = model.getOutput(i) + output["name"] = "n-a" + model.setOutput(i,output) + end + if bind_ch == 1 then + output = model.getOutput(15) + output["name"] = "BindCH" + model.setOutput(15,output) + end + lcd.drawText(x_pos, y_pos+y_inc*line,"Done!", lcd_opt) + line = line + 1 + done = 1 + end +end + +-- Init +local function Multi_Init() +end + +-- Main +local function Multi_Run(event) + if event == nil then + error("Cannot be run as a model script!") + return 2 + else + if done == 0 then + Multi_Draw_LCD() + else + if event == EVT_VIRTUAL_ENTER or event == EVT_VIRTUAL_EXIT then + return 2 + end + end + return 0 + end +end + +return { init=Multi_Init, run=Multi_Run } diff --git a/radio/src/lua/api_model.cpp b/radio/src/lua/api_model.cpp index b183043c7..8eea9d5ec 100644 --- a/radio/src/lua/api_model.cpp +++ b/radio/src/lua/api_model.cpp @@ -86,7 +86,24 @@ static int luaModelSetInfo(lua_State *L) Get RF module parameters -`subType` values: +`Type` values: + * 0 NONE + * 1 PPM + * 2 XJT_PXX1 + * 3 ISRM_PXX2 + * 4 DSM2 + * 5 CROSSFIRE + * 6 MULTIMODULE + * 7 R9M_PXX1 + * 8 R9M_PXX2 + * 9 R9M_LITE_PXX1 + * 10 R9M_LITE_PXX2 + * 11 R9M_LITE_PRO_PXX1 + * 12 R9M_LITE_PRO_PXX2 + * 13 SBUS + * 14 XJT_LITE_PXX2 + +`subType` values for XJT_PXX1: * -1 OFF * 0 D16 * 1 D8 @@ -101,6 +118,11 @@ Get RF module parameters * `modelId` (number) receiver number * `firstChannel` (number) start channel (0 is CH1) * `channelsCount` (number) number of channels sent to module + * `Type` (number) module type + * if the module type is Multi additional information are available + * `protocol` (number) protocol number + * `subProtocol` (number) sub-protocol number + * `channelsOrder` (number) first 4 channels expected order @status current Introduced in TODO */ @@ -114,6 +136,25 @@ static int luaModelGetModule(lua_State *L) lua_pushtableinteger(L, "modelId", g_model.header.modelId[idx]); lua_pushtableinteger(L, "firstChannel", module.channelsStart); lua_pushtableinteger(L, "channelsCount", module.channelsCount + 8); + lua_pushtableinteger(L, "Type", module.type); +#if defined(MULTIMODULE) + if (module.type == MODULE_TYPE_MULTIMODULE) { + int protocol = g_model.moduleData[idx].getMultiProtocol() + 1; + int subprotocol = g_model.moduleData[idx].subType; + convertOtxProtocolToMulti(&protocol, &subprotocol); // Special treatment for the FrSky entry... + lua_pushtableinteger(L, "protocol", protocol); + lua_pushtableinteger(L, "subProtocol", subprotocol); + if (getMultiModuleStatus(idx).isValid()) { + if (getMultiModuleStatus(idx).ch_order == 0xFF) + lua_pushtableinteger(L, "channelsOrder", -1); + else + lua_pushtableinteger(L, "channelsOrder", getMultiModuleStatus(idx).ch_order); + } + else { + lua_pushtableinteger(L, "channelsOrder", -1); + } + } +#endif } else { lua_pushnil(L); diff --git a/radio/src/pulses/multi.cpp b/radio/src/pulses/multi.cpp index ca7a77480..9fe10113c 100644 --- a/radio/src/pulses/multi.cpp +++ b/radio/src/pulses/multi.cpp @@ -244,6 +244,50 @@ void sendChannels(uint8_t moduleIdx) } } +void convertOtxProtocolToMulti(int *protocol, int *subprotocol) +{ + // Special treatment for the FrSky entry... + if (*protocol == MODULE_SUBTYPE_MULTI_FRSKY +1) { + if (*subprotocol == MM_RF_FRSKY_SUBTYPE_D8) { + //D8 + *protocol = 3; + *subprotocol = 0; + } + else if (*subprotocol == MM_RF_FRSKY_SUBTYPE_D8_CLONED) { + //D8 + *protocol = 3; + *subprotocol = 1; + } + else if (*subprotocol == MM_RF_FRSKY_SUBTYPE_V8) { + //V8 + *protocol = 25; + *subprotocol = 0; + } + else { + *protocol = 15; + if (*subprotocol == MM_RF_FRSKY_SUBTYPE_D16_8CH) + *subprotocol = 1; + else if (*subprotocol == MM_RF_FRSKY_SUBTYPE_D16) + *subprotocol = 0; // D16 + else if (*subprotocol == MM_RF_FRSKY_SUBTYPE_D16_LBT) + *subprotocol = 2; + else if (*subprotocol == MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH) + *subprotocol = 3; + else + *subprotocol = 4; // D16_CLONED + } + } + else { + // 15 for Multimodule is FrskyX or D16 which we map as a protocol of 3 (FrSky) + // all protos > frskyx are therefore also off by one + if (*protocol >= 15) + *protocol = *protocol + 1; + // 25 is again a FrSky *protocol (FrskyV) so shift again + if (*protocol >= 25) + *protocol = *protocol + 1; + } +} + void sendFrameProtocolHeader(uint8_t moduleIdx, bool failsafe) {// byte 1+2, protocol information @@ -268,8 +312,7 @@ void sendFrameProtocolHeader(uint8_t moduleIdx, bool failsafe) protoByte |= MULTI_SEND_RANGECHECK; // rfProtocol - if (g_model.moduleData[moduleIdx].getMultiProtocol() == MODULE_SUBTYPE_MULTI_DSM2) { - + if (type == MODULE_SUBTYPE_MULTI_DSM2 +1 ) { // Autobinding should always be done in DSMX 11ms if (g_model.moduleData[moduleIdx].multi.autoBindMode && moduleState[moduleIdx].mode == MODULE_MODE_BIND) subtype = MM_RF_DSM2_SUBTYPE_AUTO; @@ -279,48 +322,11 @@ void sendFrameProtocolHeader(uint8_t moduleIdx, bool failsafe) optionValue = 0x80 | sentModuleChannels(moduleIdx); // Max throw else optionValue = sentModuleChannels(moduleIdx); -} - - // 15 for Multimodule is FrskyX or D16 which we map as a subprotocol of 3 (FrSky) - // all protos > frskyx are therefore also off by one - if (type >= 15) - type = type + 1; - - // 25 is again a FrSky protocol (FrskyV) so shift again - if (type >= 25) - type = type + 1; - - if (g_model.moduleData[moduleIdx].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKY) { - if (subtype == MM_RF_FRSKY_SUBTYPE_D8) { - //D8 - type = 3; - subtype = 0; - } - else if (subtype == MM_RF_FRSKY_SUBTYPE_D8_CLONED) { - //D8 - type = 3; - subtype = 1; - } - else if (subtype == MM_RF_FRSKY_SUBTYPE_V8) { - //V8 - type = 25; - subtype = 0; - } - else { - type = 15; - if (subtype == MM_RF_FRSKY_SUBTYPE_D16_8CH) // D16 8ch - subtype = 1; - else if (subtype == MM_RF_FRSKY_SUBTYPE_D16) - subtype = 0; // D16 - else if (subtype == MM_RF_FRSKY_SUBTYPE_D16_LBT) - subtype = 2; - else if (subtype == MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH) - subtype = 3; - else - subtype = 4; - } } + // Special treatment for the FrSky entry... + convertOtxProtocolToMulti(&type, &subtype); + // Set the highest bit of option byte in AFHDS2A protocol to instruct MULTI to passthrough telemetry bytes instead // of sending Frsky D telemetry if (g_model.moduleData[moduleIdx].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FS_AFHDS2A) diff --git a/radio/src/pulses/multi.h b/radio/src/pulses/multi.h index a19e526eb..29e335d3a 100644 --- a/radio/src/pulses/multi.h +++ b/radio/src/pulses/multi.h @@ -24,6 +24,7 @@ #include "pulses_common.h" void multiPatchCustom(uint8_t moduleIdx); +void convertOtxProtocolToMulti(int *protocol, int *subprotocol); class UartMultiPulses: public DataBuffer { From 9bf6b1d0a2ccf312cc78229f92f9665016eff9b9 Mon Sep 17 00:00:00 2001 From: Kilrah Date: Fri, 24 Apr 2020 12:01:02 +0200 Subject: [PATCH 256/560] No audio mute for TX16S --- radio/src/targets/horus/hal.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 636e6c9e3..f22509c89 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -635,6 +635,11 @@ #define AUDIO_MUTE_DELAY 500 // ms #endif +#if defined(RADIO_TX16S) +// Only slight noise with 868MHz > 1W, if complaints later remove and set AUDIO_UNMUTE_DELAY to 150 + #undef AUDIO_MUTE_GPIO_PIN +#endif + // Touch #if defined(HARDWARE_TOUCH) #define TOUCH_INT_RCC_AHB1Periph RCC_AHB1Periph_GPIOH From 262386d21c43d5a5afa41cc24855ceef263eba12 Mon Sep 17 00:00:00 2001 From: Kilrah Date: Fri, 24 Apr 2020 14:37:06 +0200 Subject: [PATCH 257/560] Remove stray file --- jumpertx-t16-2.3.8.bin | Bin 1051568 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 jumpertx-t16-2.3.8.bin diff --git a/jumpertx-t16-2.3.8.bin b/jumpertx-t16-2.3.8.bin deleted file mode 100644 index 25865937a4c010c9c4550dfd68130acc7c799dba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1051568 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 RLhnLpm8m0HSY;=0 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�e|l~U$(5jW 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%0AozS;!BQ#O2Z4q`_+?IB> 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
I71p(h}H9j%_pxtH{H79sv6 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�=woc)c{ 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Ξ+A69`379P5X(NS#dnChExRAt+jvsdl>OS(!5 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�>Cm-v6KK?&%RW;d}Rf?|tukucb5HU0q#u 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 M#F@ufK>x7+34D(%c>n+a From ec545ce06e1a55833325ac469b97b66e9ad66271 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 24 Apr 2020 17:31:38 +0200 Subject: [PATCH 258/560] Some Multi renamer fixes --- .../SCRIPTS/TOOLS/MultiChannelsUpdater.lua | 45 +++++++------- .../SCRIPTS/TOOLS/MultiChannelsUpdater.lua | 61 +++++++++---------- .../SCRIPTS/TOOLS/MultiChannelsUpdater.lua | 45 +++++++------- 3 files changed, 74 insertions(+), 77 deletions(-) diff --git a/radio/sdcard/horus/SCRIPTS/TOOLS/MultiChannelsUpdater.lua b/radio/sdcard/horus/SCRIPTS/TOOLS/MultiChannelsUpdater.lua index 73b667b81..e089cf72e 100644 --- a/radio/sdcard/horus/SCRIPTS/TOOLS/MultiChannelsUpdater.lua +++ b/radio/sdcard/horus/SCRIPTS/TOOLS/MultiChannelsUpdater.lua @@ -331,25 +331,27 @@ local function Multi_Draw_LCD() lcd.drawText(x_pos, y_pos+y_inc*line,"Setting channel names.", lcd_opt) line = line + 1 local output, nbr - for i,v in ipairs(channel_names) do - output = model.getOutput(i-1) - output["name"] = v - model.setOutput(i-1,output) - nbr = i - end - for i = nbr, 15 do - output = model.getOutput(i) - output["name"] = "n-a" - model.setOutput(i,output) - end - if bind_ch == 1 then - output = model.getOutput(15) - output["name"] = "BindCH" - model.setOutput(15,output) + if done == 0 then + for i,v in ipairs(channel_names) do + output = model.getOutput(i-1) + output["name"] = v + model.setOutput(i-1,output) + nbr = i + end + for i = nbr, 15 do + output = model.getOutput(i) + output["name"] = "n-a" + model.setOutput(i,output) + end + if bind_ch == 1 then + output = model.getOutput(15) + output["name"] = "BindCH" + model.setOutput(15,output) + end + done = 1 end lcd.drawText(x_pos, y_pos+y_inc*line,"Done!", lcd_opt) line = line + 1 - done = 1 end end @@ -363,15 +365,12 @@ local function Multi_Run(event) error("Cannot be run as a model script!") return 2 else - if done == 0 then - Multi_Draw_LCD() - else - if event == EVT_VIRTUAL_ENTER or event == EVT_VIRTUAL_EXIT then - return 2 - end + Multi_Draw_LCD() + if event == EVT_VIRTUAL_ENTER or event == EVT_VIRTUAL_EXIT then + return 2 end - return 0 end + return 0 end return { init=Multi_Init, run=Multi_Run } diff --git a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/MultiChannelsUpdater.lua b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/MultiChannelsUpdater.lua index 675b25e15..e089cf72e 100644 --- a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/MultiChannelsUpdater.lua +++ b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/MultiChannelsUpdater.lua @@ -286,16 +286,16 @@ local function Multi_Draw_LCD() end end - lcd.drawText(x_pos, y_pos+y_inc*line,module_pos .. " Multi detected.",lcd_opt) + lcd.drawText(x_pos, y_pos+y_inc*line,module_pos .. " Multi detected.", lcd_opt) line = line + 1 if (ch_order == -1) then - lcd.drawText(x_pos, y_pos+y_inc*line,"Channels order can't be read from Multi...",lcd_opt) + lcd.drawText(x_pos, y_pos+y_inc*line,"Channels order can't be read from Multi...", lcd_opt) line = line + 1 end if protocol_name == nil or sub_protocol_name == nil then - lcd.drawText(x_pos, y_pos+y_inc*line,"Unknown protocol/sub_protocol...",lcd_opt) + lcd.drawText(x_pos, y_pos+y_inc*line,"Unknown protocol/sub_protocol...", lcd_opt) else if LCD_W > 128 then - lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name .. " / SubProtocol: " .. sub_protocol_name,lcd_opt) + lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name .. " / SubProtocol: " .. sub_protocol_name, lcd_opt) line = line + 1 else lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name, lcd_opt) @@ -321,35 +321,37 @@ local function Multi_Draw_LCD() end end if LCD_W > 128 then - lcd.drawText(x_pos, y_pos+y_inc*line,"Channels: " .. text1,lcd_opt) + lcd.drawText(x_pos, y_pos+y_inc*line,"Channels: " .. text1, lcd_opt) line = line + 1 if text2 ~= "" then - lcd.drawText(x_pos*9, y_pos+y_inc*line,text2,lcd_opt) + lcd.drawText(x_pos*9, y_pos+y_inc*line,text2, lcd_opt) line = line + 1 end end - lcd.drawText(x_pos, y_pos+y_inc*line,"Setting channel names.",lcd_opt) + lcd.drawText(x_pos, y_pos+y_inc*line,"Setting channel names.", lcd_opt) line = line + 1 local output, nbr - for i,v in ipairs(channel_names) do - output = model.getOutput(i-1) - output["name"] = v - model.setOutput(i-1,output) - nbr = i + if done == 0 then + for i,v in ipairs(channel_names) do + output = model.getOutput(i-1) + output["name"] = v + model.setOutput(i-1,output) + nbr = i + end + for i = nbr, 15 do + output = model.getOutput(i) + output["name"] = "n-a" + model.setOutput(i,output) + end + if bind_ch == 1 then + output = model.getOutput(15) + output["name"] = "BindCH" + model.setOutput(15,output) + end + done = 1 end - for i = nbr, 15 do - output = model.getOutput(i) - output["name"] = "n-a" - model.setOutput(i,output) - end - if bind_ch == 1 then - output = model.getOutput(15) - output["name"] = "BindCH" - model.setOutput(15,output) - end - lcd.drawText(x_pos, y_pos+y_inc*line,"Done!",lcd_opt) + lcd.drawText(x_pos, y_pos+y_inc*line,"Done!", lcd_opt) line = line + 1 - done = 1 end end @@ -363,15 +365,12 @@ local function Multi_Run(event) error("Cannot be run as a model script!") return 2 else - if done == 0 then - Multi_Draw_LCD() - else - if event == EVT_VIRTUAL_ENTER or event == EVT_VIRTUAL_EXIT then - return 2 - end + Multi_Draw_LCD() + if event == EVT_VIRTUAL_ENTER or event == EVT_VIRTUAL_EXIT then + return 2 end - return 0 end + return 0 end return { init=Multi_Init, run=Multi_Run } diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/MultiChannelsUpdater.lua b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/MultiChannelsUpdater.lua index 73b667b81..e089cf72e 100644 --- a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/MultiChannelsUpdater.lua +++ b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/MultiChannelsUpdater.lua @@ -331,25 +331,27 @@ local function Multi_Draw_LCD() lcd.drawText(x_pos, y_pos+y_inc*line,"Setting channel names.", lcd_opt) line = line + 1 local output, nbr - for i,v in ipairs(channel_names) do - output = model.getOutput(i-1) - output["name"] = v - model.setOutput(i-1,output) - nbr = i - end - for i = nbr, 15 do - output = model.getOutput(i) - output["name"] = "n-a" - model.setOutput(i,output) - end - if bind_ch == 1 then - output = model.getOutput(15) - output["name"] = "BindCH" - model.setOutput(15,output) + if done == 0 then + for i,v in ipairs(channel_names) do + output = model.getOutput(i-1) + output["name"] = v + model.setOutput(i-1,output) + nbr = i + end + for i = nbr, 15 do + output = model.getOutput(i) + output["name"] = "n-a" + model.setOutput(i,output) + end + if bind_ch == 1 then + output = model.getOutput(15) + output["name"] = "BindCH" + model.setOutput(15,output) + end + done = 1 end lcd.drawText(x_pos, y_pos+y_inc*line,"Done!", lcd_opt) line = line + 1 - done = 1 end end @@ -363,15 +365,12 @@ local function Multi_Run(event) error("Cannot be run as a model script!") return 2 else - if done == 0 then - Multi_Draw_LCD() - else - if event == EVT_VIRTUAL_ENTER or event == EVT_VIRTUAL_EXIT then - return 2 - end + Multi_Draw_LCD() + if event == EVT_VIRTUAL_ENTER or event == EVT_VIRTUAL_EXIT then + return 2 end - return 0 end + return 0 end return { init=Multi_Init, run=Multi_Run } From 463607e838b021bb870912fb2e7d48cc0a3b78bf Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 24 Apr 2020 17:32:46 +0200 Subject: [PATCH 259/560] Increment SD version --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b2762bf4b..f0011a7aa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ set(VERSION_REVISION "8") set(VERSION_SUFFIX $ENV{OPENTX_VERSION_SUFFIX}) set(VERSION_FAMILY ${VERSION_MAJOR}.${VERSION_MINOR}) set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}${VERSION_SUFFIX}) -set(SDCARD_REVISION "0026") +set(SDCARD_REVISION "0027") set(SDCARD_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}V${SDCARD_REVISION}) cmake_minimum_required(VERSION 2.8) From e6b33264128feed52c63cea2a964a8b06220864c Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 25 Apr 2020 08:37:50 +0200 Subject: [PATCH 260/560] Add touch temporary debug --- radio/src/targets/horus/tp_gt911.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/radio/src/targets/horus/tp_gt911.cpp b/radio/src/targets/horus/tp_gt911.cpp index 68b4630dc..d3bc68524 100644 --- a/radio/src/targets/horus/tp_gt911.cpp +++ b/radio/src/targets/horus/tp_gt911.cpp @@ -340,18 +340,20 @@ bool touchPanelInit(void) delay_ms(50); + TRACE("Reading Touch registry"); GT911_RD_Reg(GT_PID_REG, tmp, 4); - if (strcmp((char *) tmp, "911") == 0)//ID==9147 + if (strcmp((char *) tmp, "911") == 0) //ID==9147 { + TRACE("GT911 chip detected"); tmp[0] = 0X02; - GT911_WR_Reg(GT_CTRL_REG, tmp, 1);// - GT911_RD_Reg(GT_CFGS_REG, tmp, 1);// + GT911_WR_Reg(GT_CTRL_REG, tmp, 1); + GT911_RD_Reg(GT_CFGS_REG, tmp, 1); if (tmp[0] < 0X69)//ver { - //printf("Default Ver:%x\r\n",temp[0]); - GT911_Send_Cfg(1); // + TRACE("Default Ver:%x\r\n",temp[0]); + GT911_Send_Cfg(1); } delay_ms(10); @@ -363,7 +365,7 @@ bool touchPanelInit(void) return true; } - + TRACE("GT911 chip NOT FOUND"); return false; } From ad74aa71eb196f2c2f0d8b7db8a0505402666157 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 25 Apr 2020 10:06:17 +0200 Subject: [PATCH 261/560] Create FUNDING.yml --- .github/FUNDING.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..fdb7dc9f4 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: ['PayPal.Me/opentx'] From fd8fbc4f31df91dd2cb367a9b2aecb2c44b952ca Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 25 Apr 2020 10:36:09 +0200 Subject: [PATCH 262/560] test --- radio/src/gui/480x272/radio_diagtouch.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/480x272/radio_diagtouch.cpp b/radio/src/gui/480x272/radio_diagtouch.cpp index 15535d289..6e5d19778 100644 --- a/radio/src/gui/480x272/radio_diagtouch.cpp +++ b/radio/src/gui/480x272/radio_diagtouch.cpp @@ -44,8 +44,13 @@ bool menuRadioDiagTouch(event_t event) } if (touchEventFlag) { - touchPanelDeInit(); - popMenu(); + uint8_t tmp,mode = 0; + GT911_RD_Reg(GT911_READ_XY_REG,&mode,1); //read status + tmp=mode&0x0f; + if((mode&0x80) && (tmp>0)) { + touchPanelDeInit(); + popMenu(); + } } return true; } From c9c0b109292ddfad84a63bcef7a3e254e5a09562 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 25 Apr 2020 10:37:29 +0200 Subject: [PATCH 263/560] test --- radio/src/gui/480x272/radio_diagtouch.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/gui/480x272/radio_diagtouch.cpp b/radio/src/gui/480x272/radio_diagtouch.cpp index 6e5d19778..3c9834265 100644 --- a/radio/src/gui/480x272/radio_diagtouch.cpp +++ b/radio/src/gui/480x272/radio_diagtouch.cpp @@ -51,6 +51,7 @@ bool menuRadioDiagTouch(event_t event) touchPanelDeInit(); popMenu(); } + GT911_WR_Reg(GT911_CLEARBUF_REG, &tmp, 1); } return true; } From 716650f2cdd67e1d012f3197d823b809179e878c Mon Sep 17 00:00:00 2001 From: Kilrah Date: Sat, 25 Apr 2020 10:52:05 +0200 Subject: [PATCH 264/560] fix typo --- radio/src/targets/horus/tp_gt911.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/targets/horus/tp_gt911.cpp b/radio/src/targets/horus/tp_gt911.cpp index d3bc68524..87e6e0ce2 100644 --- a/radio/src/targets/horus/tp_gt911.cpp +++ b/radio/src/targets/horus/tp_gt911.cpp @@ -352,7 +352,7 @@ bool touchPanelInit(void) if (tmp[0] < 0X69)//ver { - TRACE("Default Ver:%x\r\n",temp[0]); + TRACE("Default Ver:%x\r\n",tmp[0]); GT911_Send_Cfg(1); } @@ -372,7 +372,7 @@ bool touchPanelInit(void) extern "C" void TOUCH_INT_EXTI_IRQHandler1(void) { if (EXTI_GetITStatus(TOUCH_INT_EXTI_LINE1) != RESET) { - TRACE("TOUCH INTERUPT"); + TRACE("TI"); touchEventFlag = 1; EXTI_ClearITPendingBit(TOUCH_INT_EXTI_LINE1); } From b61691df1d28436f0de5310babe640173f43d82c Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 25 Apr 2020 13:39:28 +0200 Subject: [PATCH 265/560] Attempt rework touch control --- radio/src/gui/480x272/menus.h | 1 - radio/src/gui/480x272/radio_diaganas.cpp | 26 ++++++++- radio/src/gui/480x272/radio_diagtouch.cpp | 57 ------------------- radio/src/gui/480x272/radio_hardware.cpp | 16 +----- radio/src/targets/horus/CMakeLists.txt | 1 - radio/src/targets/horus/tp_gt911.cpp | 69 +++++++++++++++++++---- radio/src/targets/horus/tp_gt911.h | 31 +++++++--- radio/src/touch.h | 50 ++++++++++++++++ 8 files changed, 156 insertions(+), 95 deletions(-) delete mode 100644 radio/src/gui/480x272/radio_diagtouch.cpp create mode 100644 radio/src/touch.h diff --git a/radio/src/gui/480x272/menus.h b/radio/src/gui/480x272/menus.h index edae43fec..f82baeb14 100644 --- a/radio/src/gui/480x272/menus.h +++ b/radio/src/gui/480x272/menus.h @@ -185,7 +185,6 @@ bool menuModelModuleOptions(event_t event); bool menuModelReceiverOptions(event_t event); bool menuRadioDiagKeys(event_t event); bool menuRadioDiagAnalogs(event_t event); -bool menuRadioDiagTouch(event_t event); extern const MenuHandlerFunc menuTabModel[MENU_MODEL_PAGES_COUNT]; diff --git a/radio/src/gui/480x272/radio_diaganas.cpp b/radio/src/gui/480x272/radio_diaganas.cpp index 88f82d748..905987fef 100644 --- a/radio/src/gui/480x272/radio_diaganas.cpp +++ b/radio/src/gui/480x272/radio_diaganas.cpp @@ -19,6 +19,9 @@ */ #include "opentx.h" +#if defined(RADIO_TX16S) +#include "tp_gt911.h" +#endif constexpr coord_t LEFT_NAME_COLUMN = MENUS_MARGIN_LEFT; constexpr coord_t RIGHT_NAME_COLUMN = LCD_W / 2; @@ -28,6 +31,12 @@ bool menuRadioDiagAnalogs(event_t event) { SIMPLE_SUBMENU(STR_MENU_RADIO_ANALOGS, ICON_MODEL_SETUP, 0); +#if defined(HARDWARE_TOUCH) + if (event == EVT_ENTRY || event == EVT_ENTRY_UP) { + touchPanelInit(); + } +#endif + for (uint8_t i = 0; i < NUM_ANALOGS; i++) { coord_t y = MENU_HEADER_HEIGHT + 1 + (i / 2) * FH; uint8_t x = i & 1 ? LCD_W / 2 + 10 : LEFT_NAME_COLUMN; @@ -48,9 +57,24 @@ bool menuRadioDiagAnalogs(event_t event) #endif } -#if (NUM_PWMSTICKS > 0) && !defined(SIMU) +#if (NUM_PWMSTICKS > 0) || defined(SIMU) lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 8 * FH, STICKS_PWM_ENABLED() ? "Sticks: PWM" : "Sticks: ANA"); #endif +#if defined(HARDWARE_TOUCH) + if (touchGT911Flag) { + lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 7 * FH, "Touch panel:"); + } + + if (touchPanelEvent) { + uint8_t tmp,mode = 0; + gt911ReadRegister(GT911_READ_XY_REG,&mode,1); //read status + lcdDrawNumber(lcdNextPos + 1, MENU_CONTENT_TOP + 7 * FH, touchState.x); + lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 7 * FH, ", "); + lcdDrawNumber(lcdNextPos + 1, MENU_CONTENT_TOP + 7 * FH, touchState.y); + gt911WriteRegister(GT911_CLEARBUF_REG, &tmp, 1); + } +#endif + return true; } diff --git a/radio/src/gui/480x272/radio_diagtouch.cpp b/radio/src/gui/480x272/radio_diagtouch.cpp deleted file mode 100644 index 3c9834265..000000000 --- a/radio/src/gui/480x272/radio_diagtouch.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "opentx.h" -#include "tp_gt911.h" - -bool menuRadioDiagTouch(event_t event) -{ - static bool touchAvailable = false; - - SIMPLE_SUBMENU(STR_MENU_RADIO_TOUCH, ICON_MODEL_SETUP, 1); - - if (event == EVT_ENTRY || event == EVT_ENTRY_UP) { - touchAvailable = touchPanelInit(); - touchEventFlag = 0; - } - else if (menuEvent) { - //touchDeInit(); - return false; - } - - if (touchAvailable) { - lcdDrawText(LCD_W / 2, LCD_H / 2, STR_TOUCH_EXIT, CENTERED); - } - else { - lcdDrawText(LCD_W / 2, LCD_H / 2, STR_TOUCH_NOTFOUND, CENTERED); - } - - if (touchEventFlag) { - uint8_t tmp,mode = 0; - GT911_RD_Reg(GT911_READ_XY_REG,&mode,1); //read status - tmp=mode&0x0f; - if((mode&0x80) && (tmp>0)) { - touchPanelDeInit(); - popMenu(); - } - GT911_WR_Reg(GT911_CLEARBUF_REG, &tmp, 1); - } - return true; -} diff --git a/radio/src/gui/480x272/radio_hardware.cpp b/radio/src/gui/480x272/radio_hardware.cpp index f9cefdc9a..e50dcae33 100644 --- a/radio/src/gui/480x272/radio_hardware.cpp +++ b/radio/src/gui/480x272/radio_hardware.cpp @@ -131,12 +131,6 @@ void onHardwareAntennaSwitchConfirm(const char * result) #define SPORT_POWER_ROWS #endif -#if defined(HARDWARE_TOUCH) - #define DEBUG_ROW 2 -#else - #define DEBUG_ROW 1 -#endif - bool menuRadioHardware(event_t event) { MENU(STR_HARDWARE, RADIO_ICONS, menuTabGeneral, MENU_RADIO_HARDWARE, ITEM_RADIO_HARDWARE_MAX, { @@ -168,7 +162,7 @@ bool menuRadioHardware(event_t event) 0, /* ADC filter */ READONLY_ROW /* RAS */, SPORT_POWER_ROWS - DEBUG_ROW, /* Debug */ + 1, /* Debug */ }); if (menuEvent) { @@ -417,9 +411,6 @@ bool menuRadioHardware(event_t event) lcdDrawText(MENUS_MARGIN_LEFT, y, STR_DEBUG); lcdDrawText(HW_SETTINGS_COLUMN2, y, STR_ANALOGS_BTN, menuHorizontalPosition == 0 ? attr : 0); lcdDrawText(lcdNextPos + 10, y, STR_KEYS_BTN, menuHorizontalPosition == 1 ? attr : 0); -#if defined(HARDWARE_TOUCH) - lcdDrawText(lcdNextPos + 10, y, STR_TOUCH_BTN, menuHorizontalPosition == 2 ? attr : 0); -#endif if (attr && event == EVT_KEY_BREAK(KEY_ENTER)) { switch (menuHorizontalPosition) { case 0: @@ -428,11 +419,6 @@ bool menuRadioHardware(event_t event) case 1: pushMenu(menuRadioDiagKeys); break; -#if defined(HARDWARE_TOUCH) - case 2: - pushMenu(menuRadioDiagTouch); - break; -#endif } } break; diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index 910b43f5f..ba4052d48 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -212,7 +212,6 @@ if(HARDWARE_TOUCH) set(TARGET_SRC ${TARGET_SRC} tp_gt911.cpp ) - set(GUI_SRC ${GUI_SRC} radio_diagtouch.cpp) add_definitions(-DHARDWARE_TOUCH) endif() diff --git a/radio/src/targets/horus/tp_gt911.cpp b/radio/src/targets/horus/tp_gt911.cpp index 87e6e0ce2..d0982788a 100644 --- a/radio/src/targets/horus/tp_gt911.cpp +++ b/radio/src/targets/horus/tp_gt911.cpp @@ -21,8 +21,9 @@ #include "tp_gt911.h" uint8_t touchGT911Flag = 0; -uint8_t TOUCH_SCAN_MODE = 0; -uint8_t touchEventFlag = 0; +uint8_t touchPanelEvent = 0; +struct TouchData touchData; +struct TouchState touchState; void GT911_INT_Change(void) { @@ -46,8 +47,8 @@ uint8_t GT911_Send_Cfg(uint8_t mode) buf[0] += GT911_Cfg[i];//check sum buf[0] = (~buf[0]) + 1; - GT911_WR_Reg(GT_CFGS_REG, (uint8_t *) GT911_Cfg, sizeof(GT911_Cfg));// - GT911_WR_Reg(GT_CHECK_REG, buf, 2);//write checksum + gt911WriteRegister(GT_CFGS_REG, (uint8_t *) GT911_Cfg, sizeof(GT911_Cfg));// + gt911WriteRegister(GT_CHECK_REG, buf, 2);//write checksum return 0; } @@ -266,7 +267,7 @@ uint8_t I2C_Read_Byte(unsigned char ack) return receive; } -uint8_t GT911_WR_Reg(uint16_t reg, uint8_t * buf, uint8_t len) +uint8_t gt911WriteRegister(uint16_t reg, uint8_t * buf, uint8_t len) { { uint8_t i; @@ -290,7 +291,7 @@ uint8_t GT911_WR_Reg(uint16_t reg, uint8_t * buf, uint8_t len) } } -void GT911_RD_Reg(u16 reg, uint8_t * buf, uint8_t len) +void gt911ReadRegister(u16 reg, uint8_t * buf, uint8_t len) { uint8_t i; @@ -341,14 +342,14 @@ bool touchPanelInit(void) delay_ms(50); TRACE("Reading Touch registry"); - GT911_RD_Reg(GT_PID_REG, tmp, 4); + gt911ReadRegister(GT_PID_REG, tmp, 4); if (strcmp((char *) tmp, "911") == 0) //ID==9147 { TRACE("GT911 chip detected"); tmp[0] = 0X02; - GT911_WR_Reg(GT_CTRL_REG, tmp, 1); - GT911_RD_Reg(GT_CFGS_REG, tmp, 1); + gt911WriteRegister(GT_CTRL_REG, tmp, 1); + gt911ReadRegister(GT_CFGS_REG, tmp, 1); if (tmp[0] < 0X69)//ver { @@ -358,7 +359,7 @@ bool touchPanelInit(void) delay_ms(10); tmp[0] = 0X00; - GT911_WR_Reg(GT_CTRL_REG, tmp, 1);//end reset + gt911WriteRegister(GT_CTRL_REG, tmp, 1);//end reset touchGT911Flag = true; TOUCH_AF_ExtiConfig(); @@ -369,11 +370,57 @@ bool touchPanelInit(void) return false; } +void touchPanelRead() +{ + uint8_t state = 0; + gt911ReadRegister(GT911_READ_XY_REG, &state, 1); + + touchPanelEvent = false; + + if ((state & 0x80u) == 0x00) { + // not ready + return; + } + + uint8_t pointsCount = (state & 0x0Fu); + + if (pointsCount > 0 && pointsCount < GT911_MAX_TOUCH_POINTS) { + gt911ReadRegister(GT911_READ_XY_REG + 1, touchData.data, pointsCount * sizeof(TouchPoint)); + if (touchData.pointsCount == 0) { + touchState.event = TE_DOWN; + touchState.startX = touchState.x = touchData.points[0].x; + touchState.startY = touchState.y = touchData.points[0].y; + } + else { + touchState.deltaX = touchData.points[0].x - touchState.x; + touchState.deltaY = touchData.points[0].y - touchState.y; + if (touchState.event == TE_SLIDE || abs(touchState.deltaX) >= SLIDE_RANGE || abs(touchState.deltaY) >= SLIDE_RANGE) { + touchState.event = TE_SLIDE; + touchState.x = touchData.points[0].x; + touchState.y = touchData.points[0].y; + } + } + touchData.pointsCount = pointsCount; + } + else { + if (touchData.pointsCount > 0) { + touchData.pointsCount = 0; + if (touchState.event == TE_SLIDE) + touchState.event = TE_SLIDE_END; + else + touchState.event = TE_UP; + } + } + + uint8_t zero = 0; + gt911WriteRegister(GT911_READ_XY_REG, &zero, 1); +} + extern "C" void TOUCH_INT_EXTI_IRQHandler1(void) { if (EXTI_GetITStatus(TOUCH_INT_EXTI_LINE1) != RESET) { TRACE("TI"); - touchEventFlag = 1; + touchPanelEvent = 1; EXTI_ClearITPendingBit(TOUCH_INT_EXTI_LINE1); } } diff --git a/radio/src/targets/horus/tp_gt911.h b/radio/src/targets/horus/tp_gt911.h index 64dfac5d6..294de897e 100644 --- a/radio/src/targets/horus/tp_gt911.h +++ b/radio/src/targets/horus/tp_gt911.h @@ -22,6 +22,7 @@ #define _FT5X06_H_ #include "opentx.h" +#include "touch.h" #define HAS_TOUCH_PANEL() touchGT911Flag == true #define TOUCH_INT_STATUS() (GPIO_ReadInputDataBit(TOUCH_INT_GPIO, TOUCH_INT_GPIO_PIN)) @@ -31,10 +32,10 @@ void touchPanelDeInit(); extern uint8_t touchGT911Flag; extern uint8_t TOUCH_SCAN_MODE; -extern uint8_t touchEventFlag; +extern uint8_t touchPanelEvent; -uint8_t GT911_WR_Reg(uint16_t reg, uint8_t * buf, uint8_t len); -void GT911_RD_Reg(uint16_t reg, uint8_t * buf, uint8_t len); +uint8_t gt911WriteRegister(uint16_t reg, uint8_t * buf, uint8_t len); +void gt911ReadRegister(uint16_t reg, uint8_t * buf, uint8_t len); //GT911 param table @@ -97,16 +98,28 @@ const uint8_t GT911_Cfg[]= // #define GT911_CONFIG_CHECKSUM_REG 0x80FF #define GT911_FIRMWARE_VERSION_REG 0x8144 +#define GT911_MAX_TOUCH_POINTS 5 -typedef struct{ +PACK(typedef struct +{ + uint8_t track; uint16_t x; uint16_t y; -}POINT; + uint16_t size; + uint8_t reserved; +}) TouchPoint; -typedef struct{ - uint16_t cnt; - POINT points[5]; -}GT911_POINT_DATA; +PACK(struct TouchData +{ + uint8_t pointsCount; + union + { + TouchPoint points[GT911_MAX_TOUCH_POINTS]; + uint8_t data[GT911_MAX_TOUCH_POINTS * sizeof(TouchPoint)]; + }; +}); + +extern struct TouchData touchData; #define TPRST_LOW() do { TOUCH_RST_GPIO->BSRRH = TOUCH_RST_GPIO_PIN; } while(0) #define TPRST_HIGH() do { TOUCH_RST_GPIO->BSRRL = TOUCH_RST_GPIO_PIN; } while(0) diff --git a/radio/src/touch.h b/radio/src/touch.h new file mode 100644 index 000000000..fbb70e3fe --- /dev/null +++ b/radio/src/touch.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef _TOUCH_H_ +#define _TOUCH_H_ + +enum TouchEvent +{ + TE_NONE, + TE_DOWN, + TE_UP, + TE_SLIDE, + TE_SLIDE_END +}; + +struct TouchState +{ + unsigned char event; + short x; + short y; + short startX; + short startY; + short deltaX; + short deltaY; + short lastDeltaX; + short lastDeltaY; +}; + +constexpr uint8_t SLIDE_RANGE = 6; + +extern TouchState touchState; + +#endif // _TOUCH_H_ \ No newline at end of file From 541b5e8f3ccc8fe50ef35503da7f434430879564 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 25 Apr 2020 13:43:51 +0200 Subject: [PATCH 266/560] Fixes --- radio/src/gui/480x272/radio_diaganas.cpp | 6 ++---- radio/src/targets/horus/tp_gt911.h | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/radio/src/gui/480x272/radio_diaganas.cpp b/radio/src/gui/480x272/radio_diaganas.cpp index 905987fef..a5bd127b6 100644 --- a/radio/src/gui/480x272/radio_diaganas.cpp +++ b/radio/src/gui/480x272/radio_diaganas.cpp @@ -62,17 +62,15 @@ bool menuRadioDiagAnalogs(event_t event) #endif #if defined(HARDWARE_TOUCH) - if (touchGT911Flag) { + if (!touchGT911Flag) { lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 7 * FH, "Touch panel:"); } if (touchPanelEvent) { - uint8_t tmp,mode = 0; - gt911ReadRegister(GT911_READ_XY_REG,&mode,1); //read status + touchPanelRead(); lcdDrawNumber(lcdNextPos + 1, MENU_CONTENT_TOP + 7 * FH, touchState.x); lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 7 * FH, ", "); lcdDrawNumber(lcdNextPos + 1, MENU_CONTENT_TOP + 7 * FH, touchState.y); - gt911WriteRegister(GT911_CLEARBUF_REG, &tmp, 1); } #endif diff --git a/radio/src/targets/horus/tp_gt911.h b/radio/src/targets/horus/tp_gt911.h index 294de897e..fbccc4f24 100644 --- a/radio/src/targets/horus/tp_gt911.h +++ b/radio/src/targets/horus/tp_gt911.h @@ -36,7 +36,7 @@ extern uint8_t touchPanelEvent; uint8_t gt911WriteRegister(uint16_t reg, uint8_t * buf, uint8_t len); void gt911ReadRegister(uint16_t reg, uint8_t * buf, uint8_t len); - +void touchPanelRead(); //GT911 param table const uint8_t GT911_Cfg[]= // From 8ff59c092835ed1c3849f4bec381e9f53cc3ebaf Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 25 Apr 2020 13:45:58 +0200 Subject: [PATCH 267/560] Fixes --- radio/src/gui/480x272/radio_diaganas.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/480x272/radio_diaganas.cpp b/radio/src/gui/480x272/radio_diaganas.cpp index a5bd127b6..7cf566cdc 100644 --- a/radio/src/gui/480x272/radio_diaganas.cpp +++ b/radio/src/gui/480x272/radio_diaganas.cpp @@ -62,7 +62,7 @@ bool menuRadioDiagAnalogs(event_t event) #endif #if defined(HARDWARE_TOUCH) - if (!touchGT911Flag) { + if (touchGT911Flag) { lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 7 * FH, "Touch panel:"); } From 327f53efa41ca6b266babda41c2a56dceac2d7b7 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 25 Apr 2020 13:46:47 +0200 Subject: [PATCH 268/560] Fixes --- radio/src/gui/480x272/radio_diaganas.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/480x272/radio_diaganas.cpp b/radio/src/gui/480x272/radio_diaganas.cpp index 7cf566cdc..c92cd3ebb 100644 --- a/radio/src/gui/480x272/radio_diaganas.cpp +++ b/radio/src/gui/480x272/radio_diaganas.cpp @@ -69,7 +69,7 @@ bool menuRadioDiagAnalogs(event_t event) if (touchPanelEvent) { touchPanelRead(); lcdDrawNumber(lcdNextPos + 1, MENU_CONTENT_TOP + 7 * FH, touchState.x); - lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 7 * FH, ", "); + lcdDrawText(lcdNextPos, MENU_CONTENT_TOP + 7 * FH, ", "); lcdDrawNumber(lcdNextPos + 1, MENU_CONTENT_TOP + 7 * FH, touchState.y); } #endif From 09bf8ecfa91e8521e4baef8fb9e0618a3bcdedc2 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 25 Apr 2020 13:59:49 +0200 Subject: [PATCH 269/560] Stop panel on exit --- radio/src/gui/480x272/radio_diaganas.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/480x272/radio_diaganas.cpp b/radio/src/gui/480x272/radio_diaganas.cpp index c92cd3ebb..b632bf00c 100644 --- a/radio/src/gui/480x272/radio_diaganas.cpp +++ b/radio/src/gui/480x272/radio_diaganas.cpp @@ -35,6 +35,10 @@ bool menuRadioDiagAnalogs(event_t event) if (event == EVT_ENTRY || event == EVT_ENTRY_UP) { touchPanelInit(); } + else if (menuEvent) { + touchPanelDeInit(); + return false; + } #endif for (uint8_t i = 0; i < NUM_ANALOGS; i++) { @@ -62,7 +66,7 @@ bool menuRadioDiagAnalogs(event_t event) #endif #if defined(HARDWARE_TOUCH) - if (touchGT911Flag) { + if (HAS_TOUCH_PANEL()) { lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 7 * FH, "Touch panel:"); } From 30021d6dc88f9ff93e59960124d20eb478107e65 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 25 Apr 2020 14:34:13 +0200 Subject: [PATCH 270/560] default TX16S to Darkblue --- radio/src/opentx.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index ea70e0b7b..fd9c8eaef 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -322,7 +322,11 @@ void generalDefault() #endif #if defined(COLORLCD) +#if defined(RADIO_TX16S) + strcpy(g_eeGeneral.themeName, "Darkblue"); +#else strcpy(g_eeGeneral.themeName, theme->getName()); +#endif theme->init(); #endif From 0bf771d4bc56b5243bc2cde930d4dea652e975fc Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 25 Apr 2020 14:59:51 +0200 Subject: [PATCH 271/560] Some init doc --- radio/src/targets/horus/tp_gt911.h | 42 ++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/radio/src/targets/horus/tp_gt911.h b/radio/src/targets/horus/tp_gt911.h index fbccc4f24..ac57b6c0d 100644 --- a/radio/src/targets/horus/tp_gt911.h +++ b/radio/src/targets/horus/tp_gt911.h @@ -41,17 +41,37 @@ void touchPanelRead(); //GT911 param table const uint8_t GT911_Cfg[]= // { - 0x69, //ver 0x68 - 0xE0,0x01, //x 480 480X272 - 0x10,0x01, //y 272 - 0x05, //pass max count - 0x38, //bit4= xy change Int mode - 0x00, - 0x02, //press ct - 0x48, - 0x28,0x0D,0x50,0x32,0x03,0x05,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x18,0x1A,0x1E,0x14,0x8A,0x2A,0x0C, - 0x30,0x38,0x31,0x0D,0x00,0x00,0x02,0xB9,0x03,0x2D, + 0x69, // ver 0x68 + 0xE0,0x01, // 0x8049 X output map : x 480 + 0x10,0x01, // 0x8040 Y ouptut max : y 272 + 0x05, // 0x804C Touch number : GT911_MAX_TOUCH_POINTS + 0x38, // 0x804D Module switch 1 : bit4= xy change Int mode + 0x00, // 0x804E Module switch 2 + 0x02, // 0x804F Shake_Count + 0x48, // 0x8050 Filter + 0x28, // 0x8051 Larger touch + 0x0D, // 0x8052 Noise reduction + 0x50, // 0x8053 Screen touch level + 0x32, // 0x8054 Screen touch leave + 0x03, // 0x8055 Low power control + 0x05, // 0x8056 Refresh rate + 0x00, // 0x8057 X threshold + 0x00, // 0x8058 Y threshold + 0x00, // 0x8059 Reserved + 0x00, // 0x805A Reserved + 0x00, // 0x805B Space (top, bottom) + 0x00, // 0x805B Space (left, right) + 0x00, // 0x805D Mini filter + 0x18, // 0x805E Strech R0 + 0x1A, // 0x805F Strech R1 + 0x1E, // 0x8060 Strech R2 + 0x14, // 0x8061 Strech RM + 0x8A, // 0x8062 Drv groupA num + 0x2A, // 0x8063 Drv groupB num + 0x0C, // 0x8064 Sensor num + 0x30, // 0x8065 FreqA factor + 0x38, // 0x8065 FreqB factor + 0x31,0x0D,0x00,0x00,0x02,0xB9,0x03,0x2D, 0x00,0x00,0x00,0x00,0x00,0x03,0x64,0x32,0x00,0x00, 0x00,0x1D,0x41,0x94,0xC5,0x02,0x07,0x00,0x00,0x04, 0xA5,0x1F,0x00,0x94,0x25,0x00,0x88,0x2B,0x00,0x7D, From 9f6f683d44f5bced894fb110636635203cc6759f Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 25 Apr 2020 15:25:41 +0200 Subject: [PATCH 272/560] Some init doc --- radio/src/targets/horus/tp_gt911.h | 33 ++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/radio/src/targets/horus/tp_gt911.h b/radio/src/targets/horus/tp_gt911.h index ac57b6c0d..4ea113514 100644 --- a/radio/src/targets/horus/tp_gt911.h +++ b/radio/src/targets/horus/tp_gt911.h @@ -43,7 +43,7 @@ const uint8_t GT911_Cfg[]= // { 0x69, // ver 0x68 0xE0,0x01, // 0x8049 X output map : x 480 - 0x10,0x01, // 0x8040 Y ouptut max : y 272 + 0x10,0x01, // 0x804A Y ouptut max : y 272 0x05, // 0x804C Touch number : GT911_MAX_TOUCH_POINTS 0x38, // 0x804D Module switch 1 : bit4= xy change Int mode 0x00, // 0x804E Module switch 2 @@ -60,7 +60,7 @@ const uint8_t GT911_Cfg[]= // 0x00, // 0x8059 Reserved 0x00, // 0x805A Reserved 0x00, // 0x805B Space (top, bottom) - 0x00, // 0x805B Space (left, right) + 0x00, // 0x805C Space (left, right) 0x00, // 0x805D Mini filter 0x18, // 0x805E Strech R0 0x1A, // 0x805F Strech R1 @@ -70,10 +70,31 @@ const uint8_t GT911_Cfg[]= // 0x2A, // 0x8063 Drv groupB num 0x0C, // 0x8064 Sensor num 0x30, // 0x8065 FreqA factor - 0x38, // 0x8065 FreqB factor - 0x31,0x0D,0x00,0x00,0x02,0xB9,0x03,0x2D, - 0x00,0x00,0x00,0x00,0x00,0x03,0x64,0x32,0x00,0x00, - 0x00,0x1D,0x41,0x94,0xC5,0x02,0x07,0x00,0x00,0x04, + 0x38, // 0x8066 FreqB factor + 0x31,0x0D, // 0x8067 Panel bit freq + 0x00,0x00, // 0x8069 Reserved + 0x02, // 0x806B Panel tx gain + 0xB9, // 0x806C Panel rx gain + 0x03, // 0x806D Panel dump shift + 0x2D, // 0x806E Drv frame control + 0x00, // 0x806F Charging level up + 0x00, // 0x8070 Module switch 3 + 0x00, // 0x8071 Gesture distance + 0x00, // 0x8072 Gesture long press time + 0x00, // 0x8073 X/Y slope adjust + 0x03, // 0x8074 Gesture control + 0x64, // 0x8075 Gesture switch 1 + 0x32, // 0x8076 Gesture switch 2 + 0x00, // 0x8077 Gesture refresh rate + 0x00, // 0x8078 Gesture touch level + 0x00, // 0x8079 New green wake up level + 0x1D, // 0x807A Freq hopping start + 0x41, // 0x807B Freq hopping end + 0x94, // 0x807C Noise detect time + 0xC5, // 0x807D Hopping flag + 0x02, // 0x807E Hopping flag + 0x07, // 0x807F Noise threshold + 0x00,0x00,0x04, 0xA5,0x1F,0x00,0x94,0x25,0x00,0x88,0x2B,0x00,0x7D, 0x33,0x00,0x74,0x3C,0x00,0x74,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, From 650acb6c8b603f01f47ddf51517525a9ef0753ee Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 25 Apr 2020 15:48:26 +0200 Subject: [PATCH 273/560] Fix --- radio/src/gui/gui_common.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index 07a093fdf..6a349aa6d 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -747,6 +747,11 @@ bool isTrainerModeAvailable(int mode) return false; #endif +#if !defined(BLUETOOTH) + if (mode == TRAINER_MODE_MASTER_BLUETOOTH || mode == TRAINER_MODE_SLAVE_BLUETOOTH) + return false; +#endif + #if defined(PCBXLITE) && !defined(PCBXLITES) if (mode == TRAINER_MODE_MASTER_TRAINER_JACK || mode == TRAINER_MODE_SLAVE) return false; From a1a266093d0b29b7cbf100c1ee416f42d8e93639 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 25 Apr 2020 15:52:30 +0200 Subject: [PATCH 274/560] improve fix --- radio/src/gui/gui_common.cpp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index 6a349aa6d..498c63a89 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -739,19 +739,14 @@ bool isTrainerModeAvailable(int mode) return g_eeGeneral.auxSerialMode == UART_MODE_SBUS_TRAINER; #endif -#if defined(PCBX9E) +#if !defined(BLUETOOTH) || defined(PCBX9E) if (mode == TRAINER_MODE_MASTER_BLUETOOTH || mode == TRAINER_MODE_SLAVE_BLUETOOTH) return false; -#elif defined(BLUETOOTH) +#else if (g_eeGeneral.bluetoothMode != BLUETOOTH_TRAINER && (mode == TRAINER_MODE_MASTER_BLUETOOTH || mode == TRAINER_MODE_SLAVE_BLUETOOTH)) return false; #endif -#if !defined(BLUETOOTH) - if (mode == TRAINER_MODE_MASTER_BLUETOOTH || mode == TRAINER_MODE_SLAVE_BLUETOOTH) - return false; -#endif - #if defined(PCBXLITE) && !defined(PCBXLITES) if (mode == TRAINER_MODE_MASTER_TRAINER_JACK || mode == TRAINER_MODE_SLAVE) return false; From 85f90af0bd4f9e389ae61c1d60e3c5155a71cd98 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 25 Apr 2020 20:45:11 +0200 Subject: [PATCH 275/560] Some fixes to multi naming script --- radio/sdcard/horus/SCRIPTS/TOOLS/MultiChannelsUpdater.lua | 5 +++-- .../sdcard/taranis-x7/SCRIPTS/TOOLS/MultiChannelsUpdater.lua | 5 +++-- .../sdcard/taranis-x9/SCRIPTS/TOOLS/MultiChannelsUpdater.lua | 5 +++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/radio/sdcard/horus/SCRIPTS/TOOLS/MultiChannelsUpdater.lua b/radio/sdcard/horus/SCRIPTS/TOOLS/MultiChannelsUpdater.lua index e089cf72e..2bd2e1a73 100644 --- a/radio/sdcard/horus/SCRIPTS/TOOLS/MultiChannelsUpdater.lua +++ b/radio/sdcard/horus/SCRIPTS/TOOLS/MultiChannelsUpdater.lua @@ -133,7 +133,7 @@ local Protocols = { {17, 4, "MT99XX", "FY805", { "Flip", "n-a", "n-a", "n-a", "HLess" }, 1 }, {44, 0, "NCC1701", "Std", { "Warp" }, 1 }, {51, 0, "Potensic", "A20", { "TakLan", "Emerg", "Mode", "HLess" }, 1 }, - {56, 0, "Propel", "74-Z", { "LEDs", "RollCW", "RolCCW", "Fire", "Weapon", "Calib", "AltHol", "TakeOf", "Land", "Train" }, 1 }, + {66, 0, "Propel", "74-Z", { "LEDs", "RollCW", "RolCCW", "Fire", "Weapon", "Calib", "AltHol", "TakeOf", "Land", "Train" }, 1 }, {29, 0, "Q2x2", "Q222", { "Flip", "LED", "Mod2", "Mod1", "HLess", "RTH", "XCal", "YCal" }, 1 }, {29, 1, "Q2x2", "Q242", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "XCal", "YCal" }, 1 }, {29, 2, "Q2x2", "Q282", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "XCal", "YCal" }, 1 }, @@ -166,6 +166,7 @@ local Protocols = { {65,1, "FrSkyR9", "R9_868", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, {65,2, "FrSkyR9", "R9_915_8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 }, {65,3, "FrSkyR9", "R9_968_8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {56, 0, "Flysky2A RX", "RX", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, -- Need first 4 channels changed... {19, 0, "Shenqi", "Cycle", { }, 1 }, @@ -293,7 +294,7 @@ local function Multi_Draw_LCD() line = line + 1 end if protocol_name == nil or sub_protocol_name == nil then - lcd.drawText(x_pos, y_pos+y_inc*line,"Unknown protocol/sub_protocol...", lcd_opt) + lcd.drawText(x_pos, y_pos+y_inc*line,"Unknown protocol "..tostring(protocol).."/"..tostring(sub_protocol).." ...", lcd_opt) else if LCD_W > 128 then lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name .. " / SubProtocol: " .. sub_protocol_name, lcd_opt) line = line + 1 diff --git a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/MultiChannelsUpdater.lua b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/MultiChannelsUpdater.lua index e089cf72e..2bd2e1a73 100644 --- a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/MultiChannelsUpdater.lua +++ b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/MultiChannelsUpdater.lua @@ -133,7 +133,7 @@ local Protocols = { {17, 4, "MT99XX", "FY805", { "Flip", "n-a", "n-a", "n-a", "HLess" }, 1 }, {44, 0, "NCC1701", "Std", { "Warp" }, 1 }, {51, 0, "Potensic", "A20", { "TakLan", "Emerg", "Mode", "HLess" }, 1 }, - {56, 0, "Propel", "74-Z", { "LEDs", "RollCW", "RolCCW", "Fire", "Weapon", "Calib", "AltHol", "TakeOf", "Land", "Train" }, 1 }, + {66, 0, "Propel", "74-Z", { "LEDs", "RollCW", "RolCCW", "Fire", "Weapon", "Calib", "AltHol", "TakeOf", "Land", "Train" }, 1 }, {29, 0, "Q2x2", "Q222", { "Flip", "LED", "Mod2", "Mod1", "HLess", "RTH", "XCal", "YCal" }, 1 }, {29, 1, "Q2x2", "Q242", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "XCal", "YCal" }, 1 }, {29, 2, "Q2x2", "Q282", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "XCal", "YCal" }, 1 }, @@ -166,6 +166,7 @@ local Protocols = { {65,1, "FrSkyR9", "R9_868", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, {65,2, "FrSkyR9", "R9_915_8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 }, {65,3, "FrSkyR9", "R9_968_8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {56, 0, "Flysky2A RX", "RX", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, -- Need first 4 channels changed... {19, 0, "Shenqi", "Cycle", { }, 1 }, @@ -293,7 +294,7 @@ local function Multi_Draw_LCD() line = line + 1 end if protocol_name == nil or sub_protocol_name == nil then - lcd.drawText(x_pos, y_pos+y_inc*line,"Unknown protocol/sub_protocol...", lcd_opt) + lcd.drawText(x_pos, y_pos+y_inc*line,"Unknown protocol "..tostring(protocol).."/"..tostring(sub_protocol).." ...", lcd_opt) else if LCD_W > 128 then lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name .. " / SubProtocol: " .. sub_protocol_name, lcd_opt) line = line + 1 diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/MultiChannelsUpdater.lua b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/MultiChannelsUpdater.lua index e089cf72e..2bd2e1a73 100644 --- a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/MultiChannelsUpdater.lua +++ b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/MultiChannelsUpdater.lua @@ -133,7 +133,7 @@ local Protocols = { {17, 4, "MT99XX", "FY805", { "Flip", "n-a", "n-a", "n-a", "HLess" }, 1 }, {44, 0, "NCC1701", "Std", { "Warp" }, 1 }, {51, 0, "Potensic", "A20", { "TakLan", "Emerg", "Mode", "HLess" }, 1 }, - {56, 0, "Propel", "74-Z", { "LEDs", "RollCW", "RolCCW", "Fire", "Weapon", "Calib", "AltHol", "TakeOf", "Land", "Train" }, 1 }, + {66, 0, "Propel", "74-Z", { "LEDs", "RollCW", "RolCCW", "Fire", "Weapon", "Calib", "AltHol", "TakeOf", "Land", "Train" }, 1 }, {29, 0, "Q2x2", "Q222", { "Flip", "LED", "Mod2", "Mod1", "HLess", "RTH", "XCal", "YCal" }, 1 }, {29, 1, "Q2x2", "Q242", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "XCal", "YCal" }, 1 }, {29, 2, "Q2x2", "Q282", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "XCal", "YCal" }, 1 }, @@ -166,6 +166,7 @@ local Protocols = { {65,1, "FrSkyR9", "R9_868", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, {65,2, "FrSkyR9", "R9_915_8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 }, {65,3, "FrSkyR9", "R9_968_8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 }, + {56, 0, "Flysky2A RX", "RX", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, -- Need first 4 channels changed... {19, 0, "Shenqi", "Cycle", { }, 1 }, @@ -293,7 +294,7 @@ local function Multi_Draw_LCD() line = line + 1 end if protocol_name == nil or sub_protocol_name == nil then - lcd.drawText(x_pos, y_pos+y_inc*line,"Unknown protocol/sub_protocol...", lcd_opt) + lcd.drawText(x_pos, y_pos+y_inc*line,"Unknown protocol "..tostring(protocol).."/"..tostring(sub_protocol).." ...", lcd_opt) else if LCD_W > 128 then lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name .. " / SubProtocol: " .. sub_protocol_name, lcd_opt) line = line + 1 From e68bd31f4e3602305100735b3b61a8f42469a8d1 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 26 Apr 2020 09:02:05 +0200 Subject: [PATCH 276/560] Continued --- radio/src/targets/horus/tp_gt911.cpp | 5 ++-- radio/src/targets/horus/tp_gt911.h | 34 ++++++++++++++++++++-------- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/radio/src/targets/horus/tp_gt911.cpp b/radio/src/targets/horus/tp_gt911.cpp index d0982788a..39fe352f5 100644 --- a/radio/src/targets/horus/tp_gt911.cpp +++ b/radio/src/targets/horus/tp_gt911.cpp @@ -351,9 +351,10 @@ bool touchPanelInit(void) gt911WriteRegister(GT_CTRL_REG, tmp, 1); gt911ReadRegister(GT_CFGS_REG, tmp, 1); + TRACE("Chip config Ver:%x\r\n",tmp[0]); if (tmp[0] < 0X69)//ver { - TRACE("Default Ver:%x\r\n",tmp[0]); + TRACE("Sending new config %d", GT911_CFG_NUMER); GT911_Send_Cfg(1); } @@ -384,7 +385,7 @@ void touchPanelRead() uint8_t pointsCount = (state & 0x0Fu); - if (pointsCount > 0 && pointsCount < GT911_MAX_TOUCH_POINTS) { + if (pointsCount > 0 && pointsCount < GT911_MAX_TP) { gt911ReadRegister(GT911_READ_XY_REG + 1, touchData.data, pointsCount * sizeof(TouchPoint)); if (touchData.pointsCount == 0) { touchState.event = TE_DOWN; diff --git a/radio/src/targets/horus/tp_gt911.h b/radio/src/targets/horus/tp_gt911.h index 4ea113514..721db6a24 100644 --- a/radio/src/targets/horus/tp_gt911.h +++ b/radio/src/targets/horus/tp_gt911.h @@ -38,13 +38,16 @@ uint8_t gt911WriteRegister(uint16_t reg, uint8_t * buf, uint8_t len); void gt911ReadRegister(uint16_t reg, uint8_t * buf, uint8_t len); void touchPanelRead(); +#define GT911_MAX_TP 5 +#define GT911_CFG_NUMER 0x69 + //GT911 param table const uint8_t GT911_Cfg[]= // { - 0x69, // ver 0x68 - 0xE0,0x01, // 0x8049 X output map : x 480 + GT911_CFG_NUMER, // 0x8047 Config version + 0xE0,0x01, // 0x8048 X output map : x 480 0x10,0x01, // 0x804A Y ouptut max : y 272 - 0x05, // 0x804C Touch number : GT911_MAX_TOUCH_POINTS + GT911_MAX_TP, // 0x804C Touch number : GT911_MAX_TP 0x38, // 0x804D Module switch 1 : bit4= xy change Int mode 0x00, // 0x804E Module switch 2 0x02, // 0x804F Shake_Count @@ -94,9 +97,22 @@ const uint8_t GT911_Cfg[]= // 0xC5, // 0x807D Hopping flag 0x02, // 0x807E Hopping flag 0x07, // 0x807F Noise threshold - 0x00,0x00,0x04, - 0xA5,0x1F,0x00,0x94,0x25,0x00,0x88,0x2B,0x00,0x7D, - 0x33,0x00,0x74,0x3C,0x00,0x74,0x00,0x00,0x00,0x00, + 0x00, // 0x8080 Nois min threshold old + 0x00, // 0x8081 Reserved + 0x04, // 0x8082 Hopping sensor group + 0xA5, // 0x8083 Hopping Seg1 normalize + 0x1F, // 0x8084 Hopping Seg1 factor + 0x00, // 0x8085 Main clock adjust + 0x94, // 0x8086 Hopping Seg2 normalize + 0x25, // 0x8087 Hopping Seg2 factor + 0x00, // 0x8088 Reserved + 0x88, // 0x8089 Hopping Seg3 normalize + 0x2B, // 0x808A Hopping Seg3 factor + 0x00, // 0x808B Reserved + 0x7D, // 0x808C Hopping Seg4 normalize + 0x33, // 0x808D Hopping Seg4 factor + 0x00, // 0x808E Reserved + 0x74,0x3C,0x00,0x74,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, @@ -139,8 +155,6 @@ const uint8_t GT911_Cfg[]= // #define GT911_CONFIG_CHECKSUM_REG 0x80FF #define GT911_FIRMWARE_VERSION_REG 0x8144 -#define GT911_MAX_TOUCH_POINTS 5 - PACK(typedef struct { uint8_t track; @@ -155,8 +169,8 @@ PACK(struct TouchData uint8_t pointsCount; union { - TouchPoint points[GT911_MAX_TOUCH_POINTS]; - uint8_t data[GT911_MAX_TOUCH_POINTS * sizeof(TouchPoint)]; + TouchPoint points[GT911_MAX_TP]; + uint8_t data[GT911_MAX_TP * sizeof(TouchPoint)]; }; }); From d0854f3489e67ca429e2ac2dbf127d470d129097 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 26 Apr 2020 10:50:06 +0200 Subject: [PATCH 277/560] Continued --- radio/src/targets/horus/tp_gt911.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/targets/horus/tp_gt911.cpp b/radio/src/targets/horus/tp_gt911.cpp index 39fe352f5..1235aebcd 100644 --- a/radio/src/targets/horus/tp_gt911.cpp +++ b/radio/src/targets/horus/tp_gt911.cpp @@ -352,7 +352,7 @@ bool touchPanelInit(void) gt911ReadRegister(GT_CFGS_REG, tmp, 1); TRACE("Chip config Ver:%x\r\n",tmp[0]); - if (tmp[0] < 0X69)//ver + if (tmp[0] < GT911_CFG_NUMER) //Config ver { TRACE("Sending new config %d", GT911_CFG_NUMER); GT911_Send_Cfg(1); From 13723ad9d786347a85c3cdbe9280b2079b0485c7 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 26 Apr 2020 11:11:43 +0200 Subject: [PATCH 278/560] Fix wobble ... --- radio/src/targets/horus/bootloader/boot_menu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/targets/horus/bootloader/boot_menu.cpp b/radio/src/targets/horus/bootloader/boot_menu.cpp index 9e6ceaf47..d64f2c7f8 100644 --- a/radio/src/targets/horus/bootloader/boot_menu.cpp +++ b/radio/src/targets/horus/bootloader/boot_menu.cpp @@ -64,7 +64,7 @@ static void bootloaderDrawFooter() void bootloaderDrawScreen(BootloaderState st, int opt, const char* str) { // clear screen - lcdDrawSolidFilledRect(0, 0, LCD_W-1, LCD_H-1, TEXT_BGCOLOR); + lcdDrawSolidFilledRect(0, 0, LCD_W, LCD_H, TEXT_BGCOLOR); if (st == ST_START) { From 2695b8b785db359b9a2f3e8345628fc3593ba15e Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 26 Apr 2020 16:29:35 +0200 Subject: [PATCH 279/560] Default to AETR --- radio/src/opentx.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index fd9c8eaef..5f89d258b 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -295,6 +295,8 @@ void generalDefault() #if defined(FRSKY_RELEASE) g_eeGeneral.templateSetup = 17; /* TAER */ +#elif defined(RADIO_TX16S) //TODO : is RADIO_FAMILLY_T16 better ? + g_eeGeneral.templateSetup = 21; /* AETR to match bundled multi */ #endif g_eeGeneral.backlightMode = e_backlight_mode_all; From 6c09828912a8b510823512893da1207519c8ff64 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 26 Apr 2020 17:26:41 +0200 Subject: [PATCH 280/560] Finish touch config table --- radio/src/targets/horus/tp_gt911.h | 126 ++++++++++++++++++++++++++--- 1 file changed, 113 insertions(+), 13 deletions(-) diff --git a/radio/src/targets/horus/tp_gt911.h b/radio/src/targets/horus/tp_gt911.h index 721db6a24..32fdd8388 100644 --- a/radio/src/targets/horus/tp_gt911.h +++ b/radio/src/targets/horus/tp_gt911.h @@ -42,7 +42,7 @@ void touchPanelRead(); #define GT911_CFG_NUMER 0x69 //GT911 param table -const uint8_t GT911_Cfg[]= // +const uint8_t GT911_Cfg[]= { GT911_CFG_NUMER, // 0x8047 Config version 0xE0,0x01, // 0x8048 X output map : x 480 @@ -112,18 +112,118 @@ const uint8_t GT911_Cfg[]= // 0x7D, // 0x808C Hopping Seg4 normalize 0x33, // 0x808D Hopping Seg4 factor 0x00, // 0x808E Reserved - 0x74,0x3C,0x00,0x74,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x18,0x16,0x14,0x12,0x10,0x0E,0x0C,0x0A, - 0x08,0x06,0x04,0x02,0xFF,0xFF,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x24,0x22,0x21,0x20,0x1F,0x1E,0x1D,0x1C, - 0x18,0x16,0x13,0x12,0x10,0x0F,0x0A,0x08,0x06,0x04, - 0x02,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00, + 0x74, // 0x808F Hopping Seg5 normalize + 0x3C, // 0x8090 Hopping Seg5 factor + 0x00, // 0x8091 Reserved + 0x74, // 0x8092 Hopping Seg6 normalize + 0x00, // 0x8093 Key1 + 0x00, // 0x8094 Key2 + 0x00, // 0x8095 Key3 + 0x00, // 0x8096 Key4 + 0x00, // 0x8097 Key area + 0x00, // 0x8098 Key touch level + 0x00, // 0x8099 Key leave level + 0x00, // 0x809A Key sens + 0x00, // 0x809B Key sens + 0x00, // 0x809C Key restrain + 0x00, // 0x809D Key restrain time + 0x00, // 0x809E Large gesture touch + 0x00, // 0x809F Reserved + 0x00, // 0x80A0 Reserved + 0x00, // 0x80A1 Hotknot noise map + 0x00, // 0x80A2 Link threshold + 0x00, // 0x80A3 Pxy threshold + 0x00, // 0x80A4 GHot dump shift + 0x00, // 0x80A5 GHot rx gain + 0x00, // 0x80A6 Freg gain + 0x00, // 0x80A7 Freg gain 1 + 0x00, // 0x80A8 Freg gain 2 + 0x00, // 0x80A9 Freg gain 3 + 0x00, // 0x80AA Reserved + 0x00, // 0x80AB Reserved + 0x00, // 0x80AC Reserved + 0x00, // 0x80AD Reserved + 0x00, // 0x80AE Reserved + 0x00, // 0x80AF Reserved + 0x00, // 0x80B0 Reserved + 0x00, // 0x80B1 Reserved + 0x00, // 0x80B2 Reserved + 0x00, // 0x80B3 Combine dis + 0x00, // 0x80B4 Split set + 0x00, // 0x80B5 Reserved + 0x00, // 0x80B6 Reserved + 0x18, // 0x80B7 Sensor CH0 + 0x16, // 0x80B8 Sensor CH1 + 0x14, // 0x80B9 Sensor CH2 + 0x12, // 0x80BA Sensor CH3 + 0x10, // 0x80BB Sensor CH4 + 0x0E, // 0x80BC Sensor CH5 + 0x0C, // 0x80BD Sensor CH6 + 0x0A, // 0x80BE Sensor CH7 + 0x08, // 0x80BF Sensor CH8 + 0x06, // 0x80C0 Sensor CH9 + 0x04, // 0x80C1 Sensor CH10 + 0x02, // 0x80C2 Sensor CH11 + 0xFF, // 0x80C3 Sensor CH12 + 0xFF, // 0x80C4 Sensor CH13 + 0x00, // 0x80C5 Reserved + 0x00, // 0x80C6 Reserved + 0x00, // 0x80C7 Reserved + 0x00, // 0x80C8 Reserved + 0x00, // 0x80C9 Reserved + 0x00, // 0x80CA Reserved + 0x00, // 0x80CB Reserved + 0x00, // 0x80CC Reserved + 0x00, // 0x80CD Reserved + 0x00, // 0x80CE Reserved + 0x00, // 0x80CF Reserved + 0x00, // 0x80D0 Reserved + 0x00, // 0x80D1 Reserved + 0x00, // 0x80D2 Reserved + 0x00, // 0x80D3 Reserved + 0x00, // 0x80D4 Reserved + 0x24, // 0x80D5 Driver CH0 + 0x22, // 0x80D6 Driver CH1 + 0x21, // 0x80D7 Driver CH2 + 0x20, // 0x80D8 Driver CH3 + 0x1F, // 0x80D9 Driver CH4 + 0x1E, // 0x80DA Driver CH5 + 0x1D, // 0x80DB Driver CH6 + 0x1C, // 0x80DC Driver CH7 + 0x18, // 0x80DD Driver CH8 + 0x16, // 0x80DE Driver CH9 + 0x13, // 0x80DF Driver CH10 + 0x12, // 0x80E0 Driver CH11 + 0x10, // 0x80E1 Driver CH12 + 0x0F, // 0x80E2 Driver CH13 + 0x0A, // 0x80E3 Driver CH14 + 0x08, // 0x80E4 Driver CH15 + 0x06, // 0x80E5 Driver CH16 + 0x04, // 0x80E6 Driver CH17 + 0x02, // 0x80E7 Driver CH18 + 0x00, // 0x80E8 Driver CH19 + 0xFF, // 0x80E9 Driver CH20 + 0xFF, // 0x80EA Driver CH21 + 0xFF, // 0x80EB Driver CH22 + 0xFF, // 0x80EC Driver CH23 + 0xFF, // 0x80ED Driver CH24 + 0xFF, // 0x80EE Driver CH25 + 0x00, // 0x80EF Reserved + 0x00, // 0x80F0 Reserved + 0x00, // 0x80F1 Reserved + 0x00, // 0x80F2 Reserved + 0x00, // 0x80F3 Reserved + 0x00, // 0x80F4 Reserved + 0x00, // 0x80F5 Reserved + 0x00, // 0x80F6 Reserved + 0x00, // 0x80F7 Reserved + 0x00, // 0x80F8 Reserved + 0x00, // 0x80F9 Reserved + 0x00, // 0x80FA Reserved + 0x00, // 0x80FB Reserved + 0x00, // 0x80FC Reserved + 0x00, // 0x80FD Reserved + 0x00, // 0x80FE Reserved }; //I2C From 2abafbede64c78a2a986b2e8e378db123b8b496c Mon Sep 17 00:00:00 2001 From: Kilrah Date: Sun, 26 Apr 2020 18:06:54 +0200 Subject: [PATCH 281/560] Fix battery voltage --- radio/src/targets/horus/board.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp index 2310c296b..15b14ac2f 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -241,8 +241,14 @@ void boardOff() pwrOff(); } +#if defined (RADIO_TX16S) + #define BATTERY_DIVIDER 1495 +#else + #define BATTERY_DIVIDER 1629 +#endif + uint16_t getBatteryVoltage() { int32_t instant_vbat = anaIn(TX_VOLTAGE); // using filtered ADC value on purpose - return (uint16_t)((instant_vbat * (1000 + g_eeGeneral.txVoltageCalibration)) / 1629); + return (uint16_t)((instant_vbat * (1000 + g_eeGeneral.txVoltageCalibration)) / BATTERY_DIVIDER); } From 8f8ef313bbe5eec82b973e9de4da30abb020d576 Mon Sep 17 00:00:00 2001 From: Kilrah Date: Sun, 26 Apr 2020 18:23:48 +0200 Subject: [PATCH 282/560] VRef is 3.3V --- radio/src/targets/horus/hal.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index f22509c89..063daae68 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -320,7 +320,9 @@ #define ADC_DMA_Stream DMA2_Stream0 #define ADC_SET_DMA_FLAGS() ADC_DMA->LIFCR = (DMA_LIFCR_CTCIF0 | DMA_LIFCR_CHTIF0 | DMA_LIFCR_CTEIF0 | DMA_LIFCR_CDMEIF0 | DMA_LIFCR_CFEIF0) #define ADC_TRANSFER_COMPLETE() (ADC_DMA->LISR & DMA_LISR_TCIF0) - #if defined(RADIO_FAMILY_T16) + #if defined(RADIO_TX16S) + #define ADC_VREF_PREC2 330 + #elif defined(RADIO_T16) #define ADC_VREF_PREC2 300 #else #define ADC_VREF_PREC2 250 From 71e13064daaf8cf067b753e91b098e873738aaa6 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 26 Apr 2020 19:18:35 +0200 Subject: [PATCH 283/560] fix inconsistent Darkblue theme color --- radio/src/gui/480x272/themes/darkblue.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/480x272/themes/darkblue.cpp b/radio/src/gui/480x272/themes/darkblue.cpp index 0b8e21306..bf244169e 100644 --- a/radio/src/gui/480x272/themes/darkblue.cpp +++ b/radio/src/gui/480x272/themes/darkblue.cpp @@ -51,7 +51,7 @@ class DarkblueTheme: public Theme lcdColorTable[TRIM_BGCOLOR_INDEX] = RGB(32, 34, 42); lcdColorTable[TRIM_SHADOW_COLOR_INDEX] = RGB(100, 100, 100); lcdColorTable[MAINVIEW_PANES_COLOR_INDEX] = GREY; - lcdColorTable[MAINVIEW_GRAPHICS_COLOR_INDEX] = WHITE; + lcdColorTable[MAINVIEW_GRAPHICS_COLOR_INDEX] = BLUE; lcdColorTable[HEADER_BGCOLOR_INDEX] = BLACK; lcdColorTable[HEADER_ICON_BGCOLOR_INDEX] = BLACK; lcdColorTable[HEADER_CURRENT_BGCOLOR_INDEX] = RGB(10, 78, 121); From 251fc3b114e3206263e6df6d0409b7f30f3285d3 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 27 Apr 2020 07:56:39 +0200 Subject: [PATCH 284/560] Cleanup --- radio/src/targets/horus/tp_gt911.cpp | 14 -------------- radio/src/targets/horus/tp_gt911.h | 2 -- 2 files changed, 16 deletions(-) diff --git a/radio/src/targets/horus/tp_gt911.cpp b/radio/src/targets/horus/tp_gt911.cpp index 1235aebcd..ffad5cc48 100644 --- a/radio/src/targets/horus/tp_gt911.cpp +++ b/radio/src/targets/horus/tp_gt911.cpp @@ -55,15 +55,8 @@ uint8_t GT911_Send_Cfg(uint8_t mode) static void I2C_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; - //I2C_InitTypeDef I2C_InitStructure; - - /* GPIO Peripheral clock enable */ RCC_AHB1PeriphClockCmd(I2C_RCC_AHB1Periph, ENABLE); - //RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); - - //PB6: I2C1_SCL PB7: I2C1_SDA GPIO_InitStructure.GPIO_Pin = I2C_SCL_GPIO_PIN | I2C_SDA_GPIO_PIN; - //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; @@ -140,9 +133,6 @@ static void TOUCH_AF_GPIOConfig(void) void SDA_IN(void) { GPIO_InitTypeDef GPIO_InitStructure; - //RCC_APB1PeriphClockCmd(RCC_APB1Periph_GPIOB, ENABLE); - //RCC_AHB1PeriphClockCmd(I2C_RCC_AHB1Periph, ENABLE); - GPIO_InitStructure.GPIO_Pin = I2C_SDA_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; @@ -152,9 +142,6 @@ void SDA_IN(void) void SDA_OUT(void) { GPIO_InitTypeDef GPIO_InitStructure; - //RCC_APB1PeriphClockCmd(RCC_APB1Periph_GPIOB, ENABLE); - //RCC_AHB1PeriphClockCmd(I2C_RCC_AHB1Periph, ENABLE); - GPIO_InitStructure.GPIO_Pin = I2C_SDA_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; @@ -295,7 +282,6 @@ void gt911ReadRegister(u16 reg, uint8_t * buf, uint8_t len) { uint8_t i; - //I2C_GenerateSTART(I2C1, ENABLE); I2C_Start(); I2C_Send_Byte(GT_CMD_WR); //send addr I2C_Wait_Ack(); diff --git a/radio/src/targets/horus/tp_gt911.h b/radio/src/targets/horus/tp_gt911.h index 32fdd8388..aa35d468f 100644 --- a/radio/src/targets/horus/tp_gt911.h +++ b/radio/src/targets/horus/tp_gt911.h @@ -25,13 +25,11 @@ #include "touch.h" #define HAS_TOUCH_PANEL() touchGT911Flag == true -#define TOUCH_INT_STATUS() (GPIO_ReadInputDataBit(TOUCH_INT_GPIO, TOUCH_INT_GPIO_PIN)) bool touchPanelInit(); void touchPanelDeInit(); extern uint8_t touchGT911Flag; -extern uint8_t TOUCH_SCAN_MODE; extern uint8_t touchPanelEvent; uint8_t gt911WriteRegister(uint16_t reg, uint8_t * buf, uint8_t len); From 6948c2f420f78edf1dc9c87d07233ea0954d30d3 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 27 Apr 2020 10:42:21 +0200 Subject: [PATCH 285/560] Issue with layout 2x1 --- radio/src/gui/480x272/layouts/layout2x1.cpp | 2 +- radio/src/gui/480x272/screens_setup.cpp | 2 +- radio/src/gui/common/colorlcd/draw_functions.cpp | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/480x272/layouts/layout2x1.cpp b/radio/src/gui/480x272/layouts/layout2x1.cpp index 3c06d7079..81e196d63 100644 --- a/radio/src/gui/480x272/layouts/layout2x1.cpp +++ b/radio/src/gui/480x272/layouts/layout2x1.cpp @@ -45,7 +45,7 @@ class Layout2x1: public Layout virtual unsigned int getZonesCount() const { - return 4; + return 2; } virtual Zone getZone(unsigned int index) const diff --git a/radio/src/gui/480x272/screens_setup.cpp b/radio/src/gui/480x272/screens_setup.cpp index c1f251460..e73afed68 100644 --- a/radio/src/gui/480x272/screens_setup.cpp +++ b/radio/src/gui/480x272/screens_setup.cpp @@ -346,7 +346,7 @@ bool menuWidgetsSetup(event_t event) currentScreen->refresh(); - for (int i=currentContainer->getZonesCount()-1; i>=0; i--) { + for (int i = currentContainer->getZonesCount() - 1; i >= 0; i--) { Zone zone = currentContainer->getZone(i); LcdFlags color; int padding, thickness; diff --git a/radio/src/gui/common/colorlcd/draw_functions.cpp b/radio/src/gui/common/colorlcd/draw_functions.cpp index 1854c0057..c75ae824e 100644 --- a/radio/src/gui/common/colorlcd/draw_functions.cpp +++ b/radio/src/gui/common/colorlcd/draw_functions.cpp @@ -18,6 +18,7 @@ * GNU General Public License for more details. */ +#include #include "opentx.h" void drawStringWithIndex(coord_t x, coord_t y, const char * str, int idx, LcdFlags flags, const char * prefix, const char * suffix) From a6d98b81fc7cd61ce2e9cca208edef1dde424ff1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Charpentier?= Date: Mon, 27 Apr 2020 10:44:53 +0200 Subject: [PATCH 286/560] Updated Fr Translation (#7556) Updated French Translations --- companion/src/translations/companion_fr.ts | 748 ++++++++++----------- 1 file changed, 351 insertions(+), 397 deletions(-) diff --git a/companion/src/translations/companion_fr.ts b/companion/src/translations/companion_fr.ts index 98fb5663a..c88f190f0 100644 --- a/companion/src/translations/companion_fr.ts +++ b/companion/src/translations/companion_fr.ts @@ -103,32 +103,32 @@ Profil de radio - + Default Channel Order Ordre des voies par défaut - + Build Options Options de compilation - + Menu Language Langue des menus - + Default Stick Mode Mode par défaut - + Select Image Sélectionner une image - + Mode selection: Mode 1: @@ -169,452 +169,462 @@ Manche Droit: Profondeur, Direction - + Mode 1 (RUD ELE THR AIL) Mode 1 (DIR PROF GAZ AIL) - + Mode 2 (RUD THR ELE AIL) Mode 2 (DIR GAZ PROF AIL) - + Mode 3 (AIL ELE THR RUD) Mode 3 (AIL PROF GAZ DIR) - + Mode 4 (AIL THR ELE RUD) Mode 4 (AIL GAZ PROF DIR) - + Splash Screen Ecran d'accueil - - + + The profile specific folder, if set, will override general Backup folder Dossier de sauvegarde spécifique au profil courant, si défini remplace le paramètre de l'application - + Backup folder Dossier de sauvegarde - + If set it will override the application general setting Si défini, remplace le paramètre de l'application pour ce profil - + if set, will override general backup enable Si défini, remplace le paramètre de l'application pour ce profil - + <html><head/><body><p>Channel order</p><p><br/></p><p>Defines the order of the default mixes created on a new model.</p></body></html> <html><head/><body><p>Ordre des voies</p><p><br/></p><p>Détermine l'ordre des mixages par défaut sur un nouveau modèle.</p></body></html> - + R E T A D P G A - + R E A T D P A G - + R T E A D G P A - + R T A E D G A P - + R A E T D A P G - + R A T E D A G P - + E R T A P D G A - + E R A T P D A G - + E T R A P G D A - + E T A R P G A D - + E A R T P A D G - + E A T R P A G D - + T R E A G D P A - + T R A E G D A P - + T E R A G P D A - + T E A R G P A D - + T A R E G A D P - + T A E R G A P D - + A R E T A D P G - + A R T E A D G P - + A E R T A P D G - + A E T R A P G D - + A T R E A G D P - + A T E R A G P D - - - - - - + + + + + + Select Folder Sélectionner dossier - + Select Executable Sélectionner exécutable - + Release channel Canal de version - + Releases (stable) Officiel (stable) - + Release candidates (testing) Candidate (test) - + Nightly builds (unstable) Nighlty (instable) - + Simulator Volume Gain Gain de volume du simulateur - + + Simulator controls + Commandes du simulateur + + + + Save switch/pot positions on simulator exit + Enregistrer les positions des inters/pots à la sortie du simulateur + + + + Clear saved positions + Effacer les positions enregistrées + + + Profile Name Nom du profil - + Clear Image Effacer l'image - + Append version number to FW file name Ajouter le numéro de version au nom du fichier téléchargé - + Offer to write FW to Tx after download Proposer de transférer le firmware à la radio après téléchargement - + Radio Type Type de radio - + Other Settings Autres paramètres - + General Settings Paramètres généraux - + SD Structure path Chemin de la structure de la carte SD - + Application Settings Paramètres de l'application - + Show splash screen when Companion starts Afficher l'écran d'accueil au lancement de Companion - + Automatic check for Companion updates Vérifier la présence de mises à jour de Companion automatiquement - - + + Enable automatic backup before writing firmware Sauvegarder les paramètres et modèles automatiquement lors des transferts - + Automatic check for OpenTX firmware updates Vérifier la présence de mises à jour de firmware automatiquement - + Splash Screen Library Bibliothèque d'écrans d'accueil - + Google Earth Executable Exécutable Google Earth - + Only show user splash images Ne montrer que les images de l'utilisateur - + Show user and companion splash images Montrer les images de Companion et de l'utilisateur - + User Splash Screens Ecrans d'accueil personnalisés - + Automatic Backup Folder Dossier de sauvegardes automatiques - + Simulator Settings Paramètres du simulateur - + Simulator BackLight Rétroéclairage du simulateur - + Enable Actif - + Action on New Model Action par défaut "Ajout Modèle" - + Use model wizard Assistant - + Open model editor Éditer modèle - + Just create the model Créer modèle - + <html><head/><body><p>This option maintains the behaviour from older OpenTx versions where empty model slots are preserved when a model is deleted or moved. </p><p>When this option is de-selected, the other models may be re-arranged to fill the gap left by the removed model.</p></body></html> <html><head/><body><p><b><u>/!\</u> Uniquement pour les radios sans catégories <u>/!\</u></b></p><p>Cette option maintient le comportement des anciennes versions d’OpenTx où les emplacements des modèles vides sont conservés lorsqu'un modèle est supprimé ou déplacé.</p><p>Lorsque cette option est désélectionnée, les autres modèles peuvent être réarrangés pour combler l'écart laissé par le modèle supprimé.</p></body></html> - + most recently used files fichiers récemment utilisés - + Startup Settings Paramètres de démarrage - + Remember Mémoriser - + Output Logs Folder Dossier des logs sauvegardés - + Remove empty model slots when deleting models (only applies for radios w/out categories) Supprimer les emplacements vides lors de la suppression de modèles - + Debug Output Logging Log les messages de debug - + <html><head/><body><p>Keep a log of all debugging messages generated by the desktop Companion/Simulator applications. An OpenTX developer may request this to help diagnose an issue.</p></body></html> <html><head/><body><p>Garder un log de tous les messages de débogage générés par les applications Companion/Simulateur. Un développeur OpenTX peut demander ce log afin d'aider à diagnostiquer un problème.</p></body></html> - + Application (Companion/Simulator) Application (Companion/Simulateur) - + <html><head/><body><p>Keep a log of all messages generated by the radio firmware when running in Simulator. This is the same information one would also see in the Simulator <span style=" font-style:italic;">Debug Output</span> window.</p></body></html> <html><head/><body><p>Conserver un log de tous les messages générés par le firmware radio lors de l'exécution du Simulateur. C'est la même information visible depuis le Simulateur dans la <span style=" font-style:italic;">Fenêtre de débogage</span>.</p></body></html> - + Radio Firmware (in Simulator) Firmware radio (Simulateur) - + Blue Bleu - + Green Vert - + Red Rouge - + Orange Orange - + Yellow Jaune - + Screenshot capture folder Dossier des captures d'écran - + Joystick - + Calibrate Calibrer - + Only capture to clipboard Capturer dans le presse-papiers uniquement - - - Remember simulator switch values - Mémoriser les positions des inters du simulateur - My Radio @@ -637,7 +647,7 @@ Manche Droit: Profondeur, Direction - + No joysticks found Aucun Joystick trouvé @@ -678,17 +688,17 @@ Manche Droit: Profondeur, Direction Sélectionner l'emplacement de l'exécutable Google Earth - + Select the folder replicating your SD structure Sélectionner un dossier contenant une copie des dossiers de la carte SD - + Open Image to load Ouvrir l'image à charger - + Images (%1) Images (%1) @@ -2109,23 +2119,23 @@ Si vous avez un fichier de sauvegarde des paramètres, vous pouvez l'import La source %1 n'est pas supportée sur cette plateforme ! - + OpenTX only accepts %1 points in all curves OpenTX n'accepte que %1 points au maximum entre toutes les courbes - + OpenTx only accepts %1 points in all curves OpenTX n'accepte que %1 points au maximum entre toutes les courbes - - + + OpenTX on this board doesn't accept this function OpenTX ne supporte pas cette fonction sur cette carte - + OpenTX doesn't accept this radio protocol OpenTX ne supporte pas ce protocole radio @@ -2888,19 +2898,19 @@ Blanc signifie "inclure tous".Les métacaractères ?, * et [...] sont - + Disable HELI menu and cyclic mix support Supprimer le menu HELICO et les mixages cycliques - + Disable Global variables Supprimer le support des variables globales - + Enable Lua custom scripts screen Activer l'écran des scripts Lua personnalisés @@ -2916,6 +2926,7 @@ Blanc signifie "inclure tous".Les métacaractères ?, * et [...] sont + Disable RAS (SWR) Désactiver le RAS (SWR). Utile uniquement pour les X9D+ avec un RAS/SWR non fonctionnel @@ -2940,86 +2951,81 @@ Blanc signifie "inclure tous".Les métacaractères ?, * et [...] sont - + Haptic module installed Module vibreur installé - + FrSky Taranis X9E - + Confirmation before radio shutdown Confirmation avant l'arrêt de la radio - + Horus gimbals installed (Hall sensors) Manches Horus à effet HALL installés - + FrSky Taranis X9-Lite - + FrSky Taranis X9-Lite S - + FrSky Taranis X7 / X7S - + FrSky Taranis X7 / X7S Access - + FrSky Taranis X-Lite S/PRO - + FrSky Taranis X-Lite - + FrSky Horus X10 / X10S - - + + Support for ACCESS internal module replacement Prise en charge du module de remplacement interne ACCESS - + FrSky Horus X10 Express / X10S Express - + FrSky Horus X12S - + Use ONLY with first DEV pcb version Exclusivement pour les Horus DEV - - - Enable non certified R9M firmwares - Activer les firmwares R9M non certifiés - @@ -3028,17 +3034,11 @@ Blanc signifie "inclure tous".Les métacaractères ?, * et [...] sont - Support for bluetooth module Prise en charge du module Bluetooth - - Radiomaster TX16S - - - - + Turnigy 9XR-PRO @@ -3083,17 +3083,17 @@ Blanc signifie "inclure tous".Les métacaractères ?, * et [...] sont Ne pas mettre les lignes actives en gras - + Turnigy 9XR with m128 chip Turnigy 9XR avec une puce m128 - + Turnigy 9XR - + 9X with stock board 9X avec carte mère d'origine @@ -3103,17 +3103,17 @@ Blanc signifie "inclure tous".Les métacaractères ?, * et [...] sont Permet la remise à zéro des valeurs en pressant haut-bas en même temps, valeur min avec gauche/bas, valeur max avec haut/droite, inversion avec gauche/droite - + 9X with stock board and m128 chip Carte 9x avec un chip m128 - + 9X with AR9X board 9X avec carte AR9X - + Jumper T12 / T12 Pro @@ -3123,17 +3123,17 @@ Blanc signifie "inclure tous".Les métacaractères ?, * et [...] sont - + 9X with Sky9x board 9X avec carte Sky9x - + 9X with Gruvin9x board 9X avec carte Gruvin9x - + DIY MEGA2560 radio Radio DIY à base de MEGA2560 @@ -3608,6 +3608,16 @@ Vous utilisez actuellement: Switch Interrupteur + + + trim6 + + + + + trim5 + + FlightModeData @@ -3620,52 +3630,52 @@ Vous utilisez actuellement: FlightModePanel - + Rotary Encoder %1 Sélecteur Rotatif %1 - + Name Nom - + Value source Source valeur - + Value Valeur - + Unit - + Prec - + Min Min - + Max Max - + GVAR%1 VG%1 - + Popup enabled Indication activée @@ -3675,49 +3685,49 @@ Vous utilisez actuellement: Menu contextuel disponible - + Trim disabled Trim désactivé - + Own Trim Valeur indépendante - + Use Trim from Flight mode %1 Utiliser le trim de la phase de vol %1 - + Use Trim from Flight mode %1 + Own Trim as an offset Utiliser le trim de la phase de vol %1 + une valeur indépendante additionnée - + 0._ - + 0.0 - - + + &Clear &Effacer - - + + Clear Effacer - + Clear all current Flight Mode properties? Effacer tout les modes de vols ? @@ -3725,17 +3735,17 @@ Vous utilisez actuellement: FlightModesPanel - + Flight Mode %1 Phase de vol %1 - + (%1) - + (default) (par défaut) @@ -4408,11 +4418,6 @@ Mode 4: Owner Registration ID Enregistrement ID du propriétaire - - - aaaaaaAA - - R E T A @@ -4730,6 +4735,11 @@ Plage de valeurs: 5v...10v Si différent de 0, émission d'un bip sonore régulier si aucune action n'a été effectuée sur l'émetteur depuis le temps spécifié (en minutes). Réinitialisation en agissant sur n'importe lequel des manches / touches de navigation. + + + nnnnnnNN + + min @@ -8170,7 +8180,7 @@ Mixage actif par défaut si non-renseigné. Extended Limits - Débattements étendus + Limites étendues @@ -8977,12 +8987,12 @@ Mixage actif par défaut si non-renseigné. ModuleData - + Positive - + Negative Négative @@ -9605,7 +9615,7 @@ Mixage actif par défaut si non-renseigné. DÉFAUT - + Custom - proto %1) Personnaliser - proto %1) @@ -10859,7 +10869,12 @@ E secondes - + + ml/minute + + + + TELE @@ -11009,7 +11024,7 @@ E Extended Limits - Débattements étendus + Limites étendues @@ -11830,12 +11845,12 @@ La valeur par défaut est configurée dans le profil radio sélectionné.Impossible d'accéder au Joystick, Joystick désactivé - + Radio firmware error: %1 Erreur firmware radio: %1 - + - Flight Mode %1 (#%2) - Phase de Vol %1 (#%2) @@ -12538,104 +12553,104 @@ Trop d'erreurs, abandon. TelemetryPanel - + FrSky S.PORT - + FrSky D - + FrSky D (cable) FrSky D (câble) - + Telemetry screen %1 Ecran de télémesure %1 - + Source - + Low Alarm Alarme basse - + Critical Alarm Alarme critique - + Winged Shadow How High - + Winged Shadow How High (not supported) Winged Shadow How High (non supporté) - + Alti Alt - + Alti+ Alt+ - + VSpeed Vitesse verticale - - - + + + A1 - - - + + + A2 - - + + A3 - - + + A4 - - + + FAS - + Cells Velm - + --- @@ -12648,274 +12663,284 @@ Trop d'erreurs, abandon. Formulaire - + + TELE## + + + + Custom Prédéfini - + Calculated Calculé - + Id - + Instance - + Rx - + Add Addition - + Average Moyenne - + Min - + Max - + Multiply Multiplication - + Totalize Totalisation - + Cell Element LiPo - + Consumption Consommation - + Dist Distance - + Cells Sensor : Capteur d'éléments: - - - - - - - - + + + + + + + + --- - + GPS Sensor : Capteur GPS: - + Alt. Sensor : Capteur d'altitude: - + Sensor : Capteur: - + V - + A - + mA - + kt - + m/s - + ft/s - + km/h - + mph - + m - + ft - + °C - + °F - + % - + mAh - + W - + mW - + dBm - + g - + ° - + Rad - + mL - + US fl.Oz. - + Raw (-) Chiffres bruts (-) - + RPM Tours/minute - + + ml/min + + + + Precision Précision - + Ratio - + Blades Pales - + Offset Décalage - + Multiplier Multiplicateur - + Auto Offset Offset auto - + Filter Filtre - + Persistent Persistant - + Positive - + Logs @@ -12923,25 +12948,70 @@ Trop d'erreurs, abandon. TelemetrySensorPanel - + + TELE%1 + + + + + Popup menu available + Menu contextuel disponible + + + Lowest Min - + Cell %1 Elém. %1 - + Highest Max - + Delta + + + Copy + Copier + + + + Cut + Couper + + + + Paste + Coller + + + + Clear + Effacer + + + + Clear All + Effacer Tout + + + + Clear Telemetry Sensor. Are you sure? + Effacer le capteur de télémétrie. Êtes-vous sûr? + + + + Clear all Telemetry Sensors. Are you sure? + Effacez tous les capteurs de télémétrie. Êtes-vous sûr? + TelemetrySimulator @@ -14303,120 +14373,4 @@ Cliquer sur Annuler pour interrompre la calibration sans sauvegarder.Calibration incomplète, sauvegarder tout de même ? - - preferencesDialog - - - - ... - - - - - Enable - Actif - - - - Remember simulator switches - Mémoriser les positions des inters du simulateur - - - - Calibrate - Calibrer - - - - - Open Folder - Ouvrir le dossier - - - - Custom TX splash screen - Personnaliser l'écran d'accueil - - - - Simulator capture folder - Dossier des captures d'écran - - - - Use clipboard only - Utiliser le presse-papiers - - - - Simu BackLight - Rétroéclairage simu - - - - Blue - Blu - Bleu - - - - Green - Vert - - - - Red - Rouge - - - - Orange - - - - - Yellow - Jaune - - - - Personal splash library - Librairie d'écran d'accueil personnalisé - - - - Splash library behaviour - Utilisation de la librairie d'écran d'accueil - - - - Include companion splashes - Inclure les écrans d'accueil de Companion - - - - Only user defined splashes - Seulement les écrans d'accueil personnalisé - - - - Joystick - - - - - Open Image - Charger une image - - - - Invert Pixels - Inverser les couleurs - - - - Preferences - Préférences - - From 726f310a314ba043429462ef09e5d109c5732929 Mon Sep 17 00:00:00 2001 From: DanielGeA <33811722+dgatf@users.noreply.github.com> Date: Mon, 27 Apr 2020 09:50:15 +0100 Subject: [PATCH 287/560] Add es and pt special characters (#7542) Add special es characters --- radio/src/fonts/480x272/font_dblsize.png | Bin 32208 -> 36974 bytes radio/src/fonts/480x272/font_dblsize.specs | 2 +- radio/src/fonts/480x272/font_midsize.png | Bin 23808 -> 26364 bytes radio/src/fonts/480x272/font_midsize.specs | 2 +- radio/src/fonts/480x272/font_smlsize.png | Bin 11361 -> 12765 bytes radio/src/fonts/480x272/font_smlsize.specs | 2 +- radio/src/fonts/480x272/font_stdsize.png | Bin 22093 -> 22533 bytes radio/src/fonts/480x272/font_stdsize.specs | 2 +- radio/src/fonts/480x272/font_stdsizebold.png | Bin 19886 -> 21736 bytes .../src/fonts/480x272/font_stdsizebold.specs | 2 +- radio/src/fonts/480x272/font_tinsize.png | Bin 8100 -> 8922 bytes radio/src/fonts/480x272/font_tinsize.specs | 2 +- radio/src/fonts/480x272/font_xxlsize.png | Bin 72981 -> 82621 bytes radio/src/fonts/480x272/font_xxlsize.specs | 2 +- radio/src/fonts/sqt5/font_es_04x06.png | Bin 155 -> 143 bytes radio/src/fonts/sqt5/font_es_05x07.png | Bin 155 -> 150 bytes radio/src/fonts/sqt5/font_es_08x10.png | Bin 161 -> 190 bytes radio/src/fonts/sqt5/font_es_10x14.png | Bin 174 -> 250 bytes radio/src/fonts/std/font_es_04x06.png | Bin 298 -> 199 bytes radio/src/fonts/std/font_es_05x07.png | Bin 301 -> 199 bytes radio/src/fonts/std/font_es_08x10.png | Bin 309 -> 311 bytes radio/src/fonts/std/font_es_10x14.png | Bin 331 -> 355 bytes radio/src/gui/480x272/lcd.cpp | 10 +- radio/src/tests/fonts_480x272.png | Bin 9677 -> 9643 bytes radio/src/tests/primitives_480x272.png | Bin 5804 -> 5713 bytes radio/src/tests/transparency_480x272.png | Bin 5754 -> 5773 bytes radio/src/translations/es.h.txt | 248 +++++++++--------- radio/util/font2png.py | 4 +- radio/util/translate.py | 12 +- 29 files changed, 149 insertions(+), 139 deletions(-) diff --git a/radio/src/fonts/480x272/font_dblsize.png b/radio/src/fonts/480x272/font_dblsize.png index 174c70f9b99710dbb795f45c084a3761fc705fdb..65f5a60fefc516349873fb46a1292e1dec345d76 100644 GIT binary patch literal 36974 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 literal 32208 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 TPAERrhQ)HnF4OB&58D3#W%5;{ literal 23808 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 diff --git a/radio/src/fonts/480x272/font_smlsize.specs b/radio/src/fonts/480x272/font_smlsize.specs index 8802a9945..55bac8f44 100644 --- a/radio/src/fonts/480x272/font_smlsize.specs +++ b/radio/src/fonts/480x272/font_smlsize.specs @@ -1 +1 @@ -0,4,8,13,22,30,41,51,54,60,66,73,81,85,90,94,100,108,116,124,132,141,149,157,165,173,181,185,189,197,205,213,220,226,236,245,254,264,272,280,290,300,305,313,323,331,343,353,363,372,382,391,400,409,418,427,440,449,458,467,472,479,483,489,496,501,509,517,525,533,541,547,555,563,567,571,579,583,595,603,611,619,627,633,641,646,654,661,672,680,687,695,705,709,717,717,717,717,717,717,717,717,717,717,717,717,717,717,717,717,717,717,717,717,717,717,725,733,741,746,754,764,772,782,790,799,807,816,824,832,840,846,854,861,869,874,882,890,898,906,914,924,931,939,948,957,966,975,984,994,999,1007,1017,1027,1036,1045,1055,1064,1074,1082,1090,1098,1106,1116,1126,1136,1144,1152,1160,1168,1176,1181,1189,1197,1205,1213,1221,1231,1240,1248,1256,1266,1276,1285,1294,1303,1311,1319,1327,1337,1347,1357 \ No newline at end of file +0,4,8,13,22,30,41,51,54,60,66,73,81,85,90,94,100,108,116,124,132,141,149,157,165,173,181,185,189,197,205,213,220,226,236,245,254,264,272,280,290,300,305,313,323,331,343,353,363,372,382,391,400,409,418,428,441,450,459,468,473,480,484,490,497,502,510,518,526,534,542,548,556,564,568,573,581,585,597,605,613,621,629,635,643,648,656,664,675,683,690,698,708,712,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,728,736,744,750,758,768,776,786,794,803,811,820,828,836,844,850,858,865,873,878,886,894,902,910,918,928,934,942,951,960,969,978,987,997,1002,1010,1020,1030,1039,1048,1058,1067,1077,1085,1095,1103,1111,1119,1124,1129,1139,1147,1156,1164,1172,1180,1188,1198,1208,1218,1226,1234,1242,1250,1258,1263,1271,1279,1287,1295,1303,1313,1322,1330,1338,1348,1358,1367,1376,1385,1395,1403,1413,1421,1431,1439,1449,1457,1466,1474,1482,1490,1498,1506,1511,1516,1526,1534,1544,1552,1562,1570,1579,1587 \ No newline at end of file diff --git a/radio/src/fonts/480x272/font_stdsize.png b/radio/src/fonts/480x272/font_stdsize.png index e173a61af7fa6d9e6fcfcc374a92129a3fe4aaf6..afd1e98b5230abd370ac2c4a23eb003abe54624c 100644 GIT binary patch literal 22533 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 K-z&=^e)tD~WSThu literal 22093 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 S=w6}+r>$DCR(>f^dFa2ltE2+} diff --git a/radio/src/fonts/480x272/font_stdsize.specs b/radio/src/fonts/480x272/font_stdsize.specs index 4b75e6d0d..3534008a7 100644 --- a/radio/src/fonts/480x272/font_stdsize.specs +++ b/radio/src/fonts/480x272/font_stdsize.specs @@ -1 +1 @@ -0,4,9,15,26,36,49,60,64,71,78,86,96,100,106,111,119,129,139,149,159,169,179,189,199,209,219,224,228,237,247,256,265,272,284,295,306,318,328,338,350,362,367,377,389,399,414,426,438,449,461,472,483,494,505,516,531,542,553,564,570,578,583,591,600,606,616,626,635,645,654,661,671,681,686,691,701,706,721,731,741,751,761,767,776,782,792,801,814,823,832,841,853,858,867,880,893,906,919,932,945,958,971,984,999,1014,1029,1044,1059,1074,1089,1104,1119,1134,1149,1164,1173,1182,1192,1198,1207,1219,1229,1241,1251,1262,1272,1283,1292,1301,1310,1317,1326,1335,1345,1351,1360,1370,1380,1390,1400,1412,1419,1429,1440,1451,1462,1473,1484,1496,1502,1512,1524,1536,1547,1558,1570,1581,1593,1603,1613,1623,1633,1645,1657,1669,1679,1689,1699,1708,1717,1723,1733,1743,1752,1761,1770,1782,1793,1803,1813,1825,1837,1848,1859,1870,1880,1890,1900,1912,1924,1936 \ No newline at end of file +0,4,9,15,26,36,49,60,64,71,78,86,96,100,106,111,119,129,139,149,159,169,179,189,199,209,219,224,228,237,247,256,265,272,284,295,306,318,328,338,350,362,367,377,389,399,414,426,438,449,461,472,483,494,505,516,531,542,553,564,570,578,583,591,600,606,616,626,635,645,654,661,671,681,686,692,702,707,722,732,742,752,762,769,778,784,794,803,816,825,834,843,855,860,869,882,895,908,921,934,947,960,973,986,1001,1016,1031,1046,1061,1076,1091,1106,1121,1136,1151,1166,1175,1184,1194,1201,1210,1222,1232,1244,1254,1265,1275,1286,1295,1304,1313,1320,1329,1338,1348,1354,1363,1373,1383,1393,1403,1415,1422,1432,1443,1454,1465,1476,1487,1499,1505,1515,1527,1539,1550,1561,1573,1584,1596,1606,1618,1628,1638,1647,1653,1659,1671,1681,1692,1702,1712,1722,1732,1744,1756,1768,1778,1788,1798,1807,1816,1822,1832,1842,1851,1860,1869,1881,1892,1902,1912,1924,1936,1947,1958,1969,1981,1991,2003,2013,2025,2035,2047,2057,2068,2077,2087,2096,2106,2115,2121,2127,2139,2149,2161,2171,2183,2193,2204,2214 \ No newline at end of file diff --git a/radio/src/fonts/480x272/font_stdsizebold.png b/radio/src/fonts/480x272/font_stdsizebold.png index 5dfd2a49b46cf8cf1a69f4843086039225f83407..6af34b96a9145abe64c4f8a6a8bdf97137a7a086 100644 GIT binary patch literal 21736 zcmZsDcRbbc8?Tvz;@C5Luk4U{vUkXc%AVQE$aaJf64@hrWrtL@Y_hV-UL_F;iTj-2 z@80{m_jRv7q;d*+rAW&D-L*E8~Ftm8R*?^(xD z#mgO0OVCq2Ht8m3c=d`BACH%~_28eU{6`i?CcwV7Sg>(hHh-e zVcEo87H-GF{eQkK6)g9}(s+7$s;H=ZdHYaHTl-91uYX`b=FyI6rljkG2M;9OzgFt= zWJtQ6Cgs?*f4m9*_NCC>du_pYTOa+HsxTqO3)lO?hI_7-^ztP)b?orako?1&@{GQ_ z3oX7s@0I9gBT>ZE0$bxnu_Yy&C2lXUZ^wO1V7~v>r_8WKmpsOHw$6@>jI7al>Xasj z|BNQbDir$?t>ypv7AU*6wr26xXFFN;^z7uIzrTNTB)ipPxpRH+W%a%H0sl^aXI^*z z@c7TO+s|A0#QpY`?gyW&FS?e&gX}2~rD#e796H+AtmcNC`@<_@OWOMTv(14zP0Zn$ zI!A`g!*6dNe($#4U+Rb$92`u?AIXvXzO;m-qf5`q+F4${1#j{2(8udKKYzuo0@aa` z5pKPl2cKVOr=(0Jv8$yiT;u0w5O++BiRpiGh2g`+`Qs#YafcDccpV)L4No5*aY@Oq z4Nl2#e7C16UMjLUetqX}WyN}6?BwL+S`DTOlE)O9 zRNt$lS!VD5_3IaxPR8N4slmm?kd2}An@=vcJo=IG=K8BpHs_qN6N#3*5M|e~le=4E zCsXoNLKe*|)UlW=d9*W2bM0Q>w+-4oR-S9ue$F*kz$>08*12`-R?6o#`(gTg{jG1` z0)Bp#bG7p!Npu*^xm{tb!$S!Vk@)z!px|&%Pf@_{Z+t15^X#why?3^;VNX(j^kc55 zHZwlJfgDSyrGLA8>x=Z^y61Y)`iLv3spQIppHspM+Dy|9KdWb0am2 zzJ0FFEh;Liu6F&5yJRfB@Fff>|GQV!!9bIel(e3LyX+gm&uW#JA;rnB*Q72OpCrptAiH?f; zvkbpFR@N65t_`H{o0*v%syW!(r>3OrJ8^WxGh9EW85tffqA9)i{w*QFn>TMl{{1#7 zy7OD3#%_>WOKWgA^SVtOw{DiBgM%-Wzvh(3N;jd4%lF*iQ$m|}fhS&2tP1DH1qKq@ z>7qT;(?=^kv9zntuHFa;2(Wi>Fe$%;d#+{L`l!lOAXT&IhVSm$*Dq}$ZQ5L7qM~uDMs@iBckUl}=!=oQ} zpxv;uvmYEBG^Uun4`_t$aJ;|TNac65W7hTL%1so?ek7~x2Yyvml?oeKTu^+T)~}7> z%;Mr=C{t}sO)n1*$AxB*q7F)Z7Pq`S;Jy`35HndiuFm zU-!m4!-DM}$F|%xFOLyG1y-8XZ+yNVQf0(f@$T2lYxh-ERj12uf1j;)m>bxmW1-;E z_VD!7(9|6F`vXvkmgT&63{nmzI@gmSODGmSEz56&IK3xeLr%E}6_@rl{g`^SIyZg-7j->?%k zQ&sKFlJ*u56oeL4ZcxTIfB8&_dU@4L3kr37LnM&H*4DPcdFmUyKHAk3ev^?jk=4b( zxBu;}7dT$t-u)yoa*vP3hzHlbcuua(7hGUL{iY4Ryzc&0)_Y^9#N`?M<91bl|CT#d z@^E|A)%&2;3ioPgXgvHrZAbO^^lnab#?Wn5jjcMxyjde zZyaAVx_pKf&}j4VS(SMc8(PwBp&2R({uJ}m<3GFn#+9Z}W-%1pdBU-2{`)H`2OGm? z466bH0_{`2K0bJ-14BdFJd|~F9;>}q5NpKeg8PZ@8PS`Qgxx1q*rB(=D*<*!+`O6^vG?Zc(_m_8G2n8l{~66 zE$r2+S1@4O&QAwBI+hPi`WUXeiHnKN*I429N{NVk8W{NYZK@)re0iqUW@BTc-eI(t z_8N5Fg@v=R{F`u-JJE#H)YLGOx@gtZ)ZkKPqhDb&GiVlxN=iy{a1=t5OIdg0|4oV3 z&y^37H~4ocaNF;AZ#h-aTvJn1xHp#Ony!Y%$)w<^K~i@1mj?$&_;W#Ycn(FC(8_54*H>sK=DUKM%K>! zgfZ3Py?J_ktj<9WT>%;_6(wb2YfDQDH0s(x1IXOA(s&PxZ3_Y}qE#4nzW@uTv z7mz-COG<7Y^IcJ-=?dB!8rz?%@58O7B*JfzavJA|5A*Eq;^E`V5O;ds)YPQRc8iA+ zE}uh{OQmV;E9gSxG2Jj1p`8a7p5F3=`2fSx^v<2R*;%N`T{v1p=3l>lee~!NGml>rJ8&_Gx#Jszs$=uxBtZQecrXFsM2yF1U0=v$id^97W%wh666M_qmI@Q^aL=h?Goash{aXU8H<=P(yb)cI1JD-QaTxl>b95&4&{&?gdd|7oFLgo8IR^gZPK zgqw_}Vh;*`I4E-UV?uK5$;k=yuDxHso~v_AmEUH#@kn5B(VA$YudnaRm!P3E5r2RG zAyN1i6B7e}AE8N3L1BiUmXem9j*o|@ohzT+Nai*F#ubLpo0=M7F|i8srro(lm;Ne} zt1^y^zKHzgt|*(h`|ktrLqzGqp@>BvtC*V7qM{qATVOgJvkKh({bQbnmGbJJtL^QI=rMS=A_P#GqUo3aC7Wl+`ir6*SGr>sepwV27Z0p^a0)jVu16zwX)Qf1oNr&5pJ_`u%HN zYwNY`i%<8H@iIfmGQVG0ieQopXm~LD%dn|4^g<2#A%H9R`nk|zL_>44e*%GMrDKnbItJPGjkmvH|Y*dB@vZBjx);`h-JT*L1$fEy$V zDl3O(XVWVR*x1+*`|fUTUq1x>g{u45)1#uM_UGFazr6g1kc;#E{e761wDN&|iywl% zeEE`Jlbd@VehllAe)#Q0W1|ELj@oMgBQSLS?SEu$efV9{vK`CP4be1NXE$g+oFT#> z>@qE2E!EcpSnK1*kAF{3nWQ}O0L4N}dg$W=_ro5JdQebMwM7d`vyg)g@HjsmJvOJE8ds4yyT_5JAvg$(08EG!JrTzfb&FT~5Hr>6&wEA47B zx1NlYR1Fa>U|0Iv2=v~Mm6es$f_Km&_ul!{!rQN%476a0 z+wX`VsH&_CK0k4Y+fPt92cX}@_5&s`BO~JjH#d?>)(UJGkIyxWfV701?MKDO>lhhP zB6CBbkuuQH#lvlcYPZaYjg4KV)_C{EVU(%Nh@OJN(9|?q#1{NWG)^CwY%WA?G5{1K+Q>XVKNsf3Qt7@wiRId* z=@8O2_wi+KLaA%kH>2lx3;TTsu}CLJh7=g}>}t=9%8ZPSjRm^YOny<~j|9FRsm`m9 z)8)M-z|t$l&0PZA0l^wyombObv#lNAVAA+4n962))#4Meea8O8o#~Egmdyf zRs!FcF9j}-y}f;93THdaQ$SQm)Pf^v_VdkZ$(Al&ohvA@l8F2X(21#W^IbTwuGS)6QJ2%IMwp7Lr zF*Gn>OVKn_@`m?(`1^McEu6>LMxGY;MR~{MmoI6u9vZg=2Q_2b20ME}T3Q+vzcI`M z!#9$NzQ#P1sC<16@>)q2#rd?PgvFpgSIbTDal3nai6T1(UtUY*CuNq$i|0+z1fXPi z=gz>pzx!CP~&N)mba%?J+6>)>w8DtovE{njfo*V z6BZUuw7@X#3kB?i^Yxea^AzFe=MUezcdzDN|6va6a-$-PJ`d%dszucKqOztY(YxZR zD#1$4*5+oUaXX9-Ad-)dc0?p4?VY;T)@+f_jQApX*(mZp1BAGG^=kedv_4GXzM(yU z%WJZ7hK7d62~kmM_V!#AmlzlrnqA!8N8{A(J?#gn6B zHLADQ*?3N5m{xNfi7dZeL7lD&5bY8kUJV~10%7^h*Pau8ug@hbn`O#dC&QK8ugEEC z$H2@?%A6$L{`D) z2uOu{;ca@KaVv%bhiflL)>BQzVYO)mSklXcb0^6|i!X(!_&Xd1S>G*STqnoJGqbZ! zhb?BuMhoN`&wef~jRAGZUf*6Y0KLG&qb50-VrQ90K;SY00j)9Y3&Tvipj90Iw3KPa zX4_M}5yAEK^@o^QS85Hnm-mF{1EoioBLa@4wY4=4E-nm$+{{cUFe{il^$vQ?f0sIN zq0m-LhB727{0}xj1A@V`l$@E7LBc4tw>?pkxE3ZW#Kvabm&gi`Rz_xSaq$AE&(P>- zl&ud;0GP@^a29$QVYFx@b5+Jdk^A`gaJULfNEE#z>BTS@AVGT}_wO&ln1iqCyRFkb zJ@^=eFf6X8jda@vd;_2sHz+4PosOCLT9P{ST1yHlUIo8BODRPrn}r4^!===vX%Ilx zy`)V~>gq(jy}dV@Klp4v*XLPy`;dQK(3IT6+dKBzGcM(DNpZ(97I?{rTc2R$!(&-A zxn;-3YQgl3`5xKep+&n2Sm}n8l*e^P&>%=Qk{3P#66>3onCS1$|PcqMndk4Or_VGcoxL?4`q4Ehq0rFOpV(If- zO+VR@j7feF4_1y}eUb1S&yg`9<&H*S+yIPr0O6BW<}d#W`EcspTEYwbfb;&c9j$Sw5F=9jbo<4=U+2UI=3mSi9R;o)V}T=}b7e^gM6$^kVbE%)_a!_n89C zGlJs~R|_Ofx_fzf86XPnYG^2ys02Rnb|Tiv>iY_Dp3csEfm&mo4kKAg2&I)+dI@Kr zZnb_Brm6h=D@N%6?bLF@B;mbZ7*bE{c-X57vAc#5WL{kB-*V4^B zYuz?nO?a6#NK}mvio^hSV-+|Zf;C^??_fhGPDJ`VwvqS2_IOb#j7a;BuVY~B z9D@-#vgp=uGm0Q0fm5DH9ZNVp(TM@L5~ z!vhA9p~98z?d{K>KL;r^Mme0ep(s9n_>Jp4D7ZGZw%r5YWk8Q$Go@A5u0fEC-hcn_ zJGDg^eh?5zc*?kanEqC>&uB%$&2QehLoa*)9M<+eE;EVh{1@Oa5v;Ny=dzQe=#D(4 z2p$O|!6pzOvE(lHmb=c(bpwezBQ4`#vi|t-WBIMB8!rb3o;dGkGCFB5j_4KW@qE{= zMfEG(r34W>iXTp9B>xy4FoKaRX~TQ>f;Wcf97h4Mi5tH%uCOW)r~6`OXIDchM0%n0^D04H z#ad_GCqr!k3!Ze^; zkDyX0SD%vkhsQyCWz9uS6UD4(xYK@a(FNXGXPFL5spkYOoS=)*$0W zFGs=6g5pF(q5u(gc6P!vnVp}%cK0o1S`7R=RcS_Xxm2_0X+nZSj&8mY9|e#?6sozR z{pyWJXk~HjIA(>Mmiq$>3t8)H^?PS0-sD6-zkh!Wa||x=$?0iEdU_-ptxq0F;ie%# z9ou6a=NS<2R+){Jg3pvIv=eT|pTk2A3Tf&lvS$9PC+#Duc4u7A-hQPe@2e2uK($i%Qv6Y`BOfC_rE6?d`SI;_W?#+0N1c zZLpJSCZIm#BKX%M@Pho#&!n{!tm8ud{$D4nMcb3-u0+0jEo zLx|jASMtC=Gc%@fFfv4Z7@o)Cnyk%;T))oEkZzVzI^}#!wUyiCzKH4qluD%{# z;$mA!i17#Zpk~fEPvG`s?4@VmJyhO@SGARus7^rc%YueuE8M#|nyZGOV_*=w?%2f# znrnPmeFLDIjr-xZu93%pga@c03Q3N@8yZT+gWmS=+oTer(eYEb#hMpDDK`)y}FS-_VydAtGFGeTe%D4PpSCN&d%Vb!r(_F z#fZ2~mXcYAKF}B(9sM~`k^pz3pkNi6x|On`3HQP{bg{s|z@cG~Al-F`IA1ba&$3fD zO%`dRv?etv#HG@RS#hSH=O%8VVDD0V^#@0eyD?(?6f-q9sO8ALE)G}vaY5*gn~2K zd|-IE%D8H7XSQB~>r0gvR&Aj^Pu^y1&q~nWBPaf$Tysrb-Fs$XzrTML^KIZs(L8VA zX|a4{61NZV(nK`RwUtc?kR70%*SFq)R_@~H$TQ&%-NPFcGEdL_G!YvpOwcENc4kDH zslamq4JwkD26fWVAP#O6sAC;p;2nb8%R~8e0h)YP7R-ARdU3?YrgLKe=-~qQO6&$x z7y6z+0V&eE+7oAIWu>`cRQ|0C_qKm;P8G0QCqVpReL0vf3>e;~$Uqw8IIz9ozd04W zL^R>up#2XwgJ!{@PAot}xjSA&JkjP1<_h$~^aXgKwc1=DVuNyxZ+*N*Ym=gB=k9*d zMXC@gfvsLN4rK(V1_n*Pt*DEO3wR5_jUrLYySuyV>-b{DfVVW6T0p6W3i=5)qI2UZ z27KOaJpwBr9Ur;*j)x0g{o(NSMd514dNP@x266PS)ze4f=?l}uhPp(GWnYwtsfrMQ zboI8km$vIQOBzmlFC`Q^b-iv@~tJGVZE1P)90Rz?_bJGW(av?=iV$y zDEuUZ%VS8GeSSnR^vP66j)Gp!d}#Fgv~=;|a%v)zSV2O!pp{PjT`Xodjd_OcovuJ- z9cE)06EWU^o2zPT&n8BdHOAK!+q9e*6gN%A%$}6I;Q29Wh~vYrv3*IvO@p~7wvmDT zsof`OmprX=+(|Ct|2=am?>;=>%`1^VA)Rb5QP95>`+p6ci4-zdvgl zM8Mji6SHSQ7wcrcahl*l{lG~t)8`TA!oJ@Y{2mx+ON&1^Caes3sC>)yz>l;FkB^1` zxN(qU&jYGfTl@n;$Bpiokq+7r7{7@8`yu~QELwv9$qc<$VN2?LQFePo&~>3XY3ii? zzA_?d)(iL=87grnldw2=G8%9U8yc(-{?n(&({S@DNk2iGr=1d}vhvch>;e=7sfI!W zaNxxW?LohYyd~~DSqk;2$?+WSalG0u7&a)4jj$mQ*}`S3uoxIJ!B53?3v+R_wN+ku zYbi;B$K4Bx#oXLnM&*+iFJ4Smn2ds~>pz!jPzH3BVy#x?LN;29A^HUPwAqKimN$(| z>YM93J42W62=MSM?b@+;>mr80?6yu>-Z+H@%Wd}4Dvar$_p?Idiot<_zHk~7F`N`F zl-02|6KJUmB{ zFbk1$<=l?ZEDFaLt-Hd=Na^6P34OtkJYuU~a5(!04Xdq-3o$(*Wh*pIZ)wsxN1?lK zjfxE5(6m_G1C@k=A{lJoz9Kqu^3Fie2;Q>RY$%j-~sm=u8omcpJz zFx@GL?c@rwt&ZN%S}KG}Ty1Uf{FPT%R^sB~ z!U=9HUeJ4QvbB@3tLB9i-{QQHlh(;yeR)#`t9^(t5;eou^FsJUu+kcW7sNJaV46oS zl9G}Ve0PHPgM9@Yu@{5u2v%n1+~#H}+G~frJbr%i^73P}Tj`13Smcji|Qm!iZ0}3?tjqzI^eb{X-&Luq(*C)F%DR$&C0 zVFiV@8}GGi34P$H=&C(q%*T6)l_rEu0fJ274L{mdPOVhvy)aC0+{J-B-M@d|b$|V= zrKr1G+1%WG<(iU_+)@;Ca7|-lByw*6A`E0elhep$Ufws>H@!$ta1 zYZKKwR^&WYF5>(3MM?@p7~cEsTZ0$s)p7Y)YV+Y@Z9b~*R{iHYPEB5&X; z(6*t}V@{ss=jSh_fKLx!C~FxAE?9NqN!*=m3{HI5$=5;DD*ta4DKSmD2o{dV00qI~zg70Wyda`H6t zJoOZ7d7f7jjxoZw!zLsyqJk_29&g(e{9a4lk|&?Geu;fphWBOhJXD(ga}oF0)+~=P6keF$Drnjh7Li!O!(>^6&9> zsc9ZQ`o@l}-T2(FSUcYb7w}`zgaKMZM3r*zmG`vb%d;p!R}t*HwE+DgAh43NXn0#o zMwZ50_%`Sv|KHYrdsHxNznHsLI`~WqwFQnFU13SRrWUv3~Je6e4-&c6Xsku3@Q%IKDI;+AsDlgvRuB{A@Gz%W}<%!5f2 zc3;=J3S@}lI9l_PbgXYl%En11Pl)=l@1XYvM@F6~76F^1q^3Rx^e++6xmNMz}jyZioCoZ(oFma^KJmOzZi!US;IH+Tz^=6iaEgHDT6`fhEB4%WShD9Wq=*InVgs9PE63&oCes zb8vPR*jy?yQkj>B^{NKKGTTvrcp@I!q7z}#g7hOE%p%uP1c>@(E#wWX<2nQ_@v*QU zUI)ieeUOfZhQMhH*?v}$_g7b*1UTLQt`}k=R!zW zqlXrt)ZnvywO@ow<~QBOHNy%SB2~;ycUZQq`a8!Uo8YM;YKlfOHu-Ii zTs@}XQPmd(W4Sl(MM+|qHzb#aZfO`Tf^hGF|FT%0r|**UUOdDMHRn$DmT!8{FPSz1 z^%rTC@g!*{x|yn*ua8K5q0rO-;=KOcTBzLasD_nP0kK!^^XvGJk{O#(#d>?`ELV~g zSwcBKLrkw-D~u59x(N%iyyLm??xdI2)Y+9yR#kz1ywh>-|MT@!ZGO+jD^?qJ%l8A<#4`q~p%E(6{N ziVTq0{%+gjKd(XA&n>*SRE6yhn_5K%8_wI1%2@OA2fzSShlCA^y1u5y4@v@p zAHZ5~1fBW})b}PZ|J>XpSbhW52|jW>%-i_*yET?!2??YxegEw5vx=nxI{8b6P}N*qzYriaEu5p8iI#5=L3XOoYDqFUg|w9 zj9%+7MXUjxB7@;H5nM^#;*yg2nVIgM9wlP1lnB2ZL!m%c2G~6$gq~F00wlxE_hP9e zH`t)e2nZJlgzyDvLy&HEfNG8ADuh6d!VmYGJ(hv3L+J+WEn)Ku@4_PiM_~dN8zO*i ziyz)YBw<$o%jAjqt9iuf-M6>8?rae}mBt;rYIAz?M9Rj;TfcGP`JJju@xxh7<3*Yx z%#@#;8kDs?sHE;5gtUJwY6JXzhuJM=mz`|Pdqt!pi|y0D9|I$w#NQrbx#kEembh1X z*J&)LHoSkFG88Az*VLWy1INcp>&5j~f2`zRO-onuh<@H4J+K%)V|>AJm*lYZ@Xh`S zQQ*K{68Zb=Q}xhS-ykHh{ROL;^V+p*Qb+fgd$e)~v3Lw|U7NNrhNuKdG9c;De-9y! zrmelUJ5XNEc{L|i&}XWu9+Rq6(8q{CzP!IbmEK27o-;a^2Dp`h5ffcob&nn6izlfY z-MK@gmg7ZCNl6L0B0>^NN}@>Zqj1GCBN&0sH{1i^ByyMsK((Z3u7f-ZX#(t>7+r8)Yc^x{pp#XWY3Pm(_eWCaY!8<9jmXp`kV^}{{GTCH%f06 zJb5G6Hr55jWZAX`)rT?SA3SI$gj^c%ag1a-$0X~A<+3gu!=}u0`5oX9)CaQTWW^!_ zZ1b+TM*`Qb5&WXV=^@zcnHUMK&F#(57EYxq<6N1Cv0b_;aFWYH_VxTXy)>I&ddk1ji{ zq{1onfrRFNr1T($OLLI;fM*NvhgVIXc?GW7r9=%#DTMRWw{W6@J^10pR-U0i`OFk^ zASo2Ri9uhxWJ&=buh>MNKqz|-E^OZI%6LAc`mO4Fa?u8N-um#KIrKm0tP#WaqvW!z z0DE|NSZCFLqXx(T#%X&GnXwM0DezdR28xr+JE>NmWo|r6p{O3f{uB?bFkGR9fGkXn zDJbYpm-oZ0p}eVtfX(|Mrg95sjI1pgR5hm1|GNm z4zwgNO@Y|qgt5rWGf63I_~;fHKz%ATLQJ93$2{?>Cp6o{M^xmywZgW2NOWRB0lRnW zEVK*=p@0Z8*W^z6u(+rQ{LZAfWdXMsOK6LUtYNc%n$Dqi@IvtS)2CWEN;2Nv zWP8i;d_98LRCsD8b%9l+c`wDuLF)o^3$W;*><2U<4{F|CKM2!RX5aLvL>y>ZTffrh z$&z%XPxf%0saZ}JbHE6QCMG7+){MlUDkVfmr@@_sL=CiEa2o(aKrRQuF#|HXb8Pe--o0~DVEtrqpM__>R2n!=+ ztsvL{W?USd*pp*fOqNni9|6}p@lGm9oz^zEALYhXcPuTJKpKmE`toyl>gHV!rhuzeHJB>8!Z_p={y>58F_rSUAxXcgpY{I zZvK9OLB~(aOMD{$9JW86g53Gh^j3l2wl`g<>L9A6$ne+MRB^ABC}>JEvo}X$N-mz0 zY}C%YGJH5eyj87tjw`XXL+bO=fI0qD#c_2s|B{?wIMNeqdA`P|y9ZL6p!Wf{G2%;s zReFc+ z2#(hrJ@V>R;ND(3sdnE{C$gRnfCI9lJ-)KpvhvJ*KznZOY53)I3xT_D4^{Bh zMdjpJDTzR9WkDi#7u!gcE~lsf3k59*i2`JSWzYf#6*|Y#PiqPP7yZrPt?qd`U3_A2@hLhzbyn2Lg1zY zB@T~>fZn>Yx|&|%Z`e*x^1>XV6^MNB24IS419P68C2PbA#oq^=EZPwxb^GK1mJhEd z#z(-Y!MmIbS+sxv8G%PN!mzqC9g=1WfgET%FpA;A-y}@4!9kTlZJcckGsv(1?f}69 z^6{%XI|Ae})It`~$WE#qVwyxBelanM+m}70HV9bPmX?HpB5b{dC;yLf5}(pO3XKZf zWqh14WwtQxaPqt}Kys1e6bN;?*P?|5g@t&mK0oFpKo2_Lt~_ebb#BbKM@!^Ugm=Ns zO<9NKO#REa!`%!wkvQ5KyZP-~Sdy3>8F7Qg2|geMM;Ij^&|X|$$4ONOcZSfL^_YT* zC^n+)-;p^)^f9C+JpBCZKyPn(Nx;Q`T;?*W6y)FTM_5bK5CvqlkA1-*1)U7p1u*c^ zG8QB#G3nU!j10Ju3VeLu0CqD-K9KTULBILw1rj7QgX5DEaL*y2_;CVCb2O*MqnZr5 z@)HUd%XjZUas-t@Ow3S#`p?#(lWYC*P=EXY7G$@n0|TdJylz*X*WgiZx>3LG!U>VSQy|5=#?kq;3( zahGXr4)QPW{OiHs13442&vGEs0Sf_@#q{xKKK!@wV@^tZc9U3?-cOFDdtXHT^6cH( z2yG+orhteYF@AUaVE+N{hkXKV$@Dxu(xhN9cKNO!5mAM`vqH>{kJ(-IxJeRnzQrmQ3@Nnd zevbaHQr=QwXtH-gBr~{|^*JOIf9>EI$j59}fS3l!77y7`*!W;6-T}BV6ae%FLx?b& z9qD45z3~iyZhSpFwx+8XhA!*n$eP`|xBKmzjBQ^cs9^)PbrLSqLz&k}S@9Uw%#h%p z*EZMGBt9lKL*8`6P}rqH|7)$Kz(6J#L!zU8w?Q;mB|EP1llhI0AXG4|TonvLFwCE`~t4 z1KbU#QUr38vtipCM+bW;o*o`EK&Q2}<1B=j!Rfc6fCw-iV>>a7FP#kW{x4tNLr%#2 z%>xk$iK`01vO7qEcIpSlpQkR>;lU~6Ln0tTOVpV!5O0O?8Dqp*qF7PU-N|g|jgf2@ zNDZT!-=hBN*XNK+wE@Seg9yU9=hwI3@gVhMbO;5pdc zO1?nDmo;E#z*O<4H4_5+f?ETDt$68vix>V%GAwfTdBuVA34r72)2E?BBt%5N{`_fb zXpjXNI5_x&HWz3d?2&*vK(s`n1n)G^$_0p{9Kpq2xXByM#c{#vck;{5+L{do+lFCi z$1P=B+d>Gt@}(fF5B5EPs9^L7h=f427>qwH@KxT+`e`XTwJWj@PJns<>THy4v*njY zGMlkh@M}N(<>t{QL{Kk8CqzM;0q_7Jxu0F8%L6!phW5TVO))C9NJWjkQpHZdo+$y= zn0?a^f&MTl0k%F>eg#GU+O!sBZk7GvrKB6-ZKV2AY!j%_(8#addxuq=wfz+A|Kv;H zcSfbxQs3bxkAa26fYU>#Fhxa@1)Q~wjZUrvNb-sNb+xiuhP-(u?2BY)zjvPElVbA( z#}L$r%3+aEz}28Q4rfVYmN2q!_{sxBgPBcmnHIpoP$MoQxd$m4#aj6RD4Oef`eV&< zMs2>n$w{A2uT-?%iQ3uFK$3xTXbg#My3xfX`*0i(j*hl=bT0)_ zBm~5l{^6{7wdnJ3wEhOv1S$5*W`+omAvLwM+b1bhe{DSs=>DxN&$Z;4rfL{&mVFB!oz`%C^4fOSqlQ&t&WAd)RMuXO0 zZiwqF#Z;&~_@OoEz_y8BLcNZo)A^>SAl4K-?(y4)F5n`;TIKrYCM-XG=GdyQ%L4`H z%K*IuR!5)3ac)1gEr)eJSSp7MLSNLz31t4co_mYC3dybfm^BDoB~5!^OwBBd$;uy(YNm~O zzp2=d_d)6XR*8~djg1*q`j2&5F_F7DvHUP~nVmD>#_uF7m8qK*4G$xJwq4|KIIrSn zcNPxW@%(obC|EjukJ#^c8arwotBVn9&i|)avu71dHm+9?EI)VbU8;0HHdGq31_#Kw zG13VaR0jZ_dBzn*2E5-3pF&DvOB}!tL$4I%V^FXZPSaUJ*e*K*$lFN!WF3T2X6OlJk+3_i*rp( zq*9RDT>fwu1iW;b3R!L@Wml65<16QQKc5y7v-7tlYVQD8WASzr?B}|?T^O1`N zX3)TFv{Rp8uDz2GwScK5xW}h>HVd%D*)63{uWn{9uUMymxW{OOtQY~6qFsfChUWQe zq)p)Nf^@S`a{mj>b#P#o^}uK;KEPG$f$bqvZP-rdKj%iww#%f^+g$$J2C*75IzmXg z14g)+^%S5bEP4e0o-zR$i_K{P=di- zQfTcE_WUPC?t{2Nqd^&36vRn5mrar-x6FUZ#IyA8FIl3BwWz76B;aEPNGswq8LI)k zR!&G5@!eKeM;P|qj3QZQa{Jf~ElgWxdHLymqXVnF(^>VO-YAacH4lH0Iei(Lr| z<7*$%V3#dx%?CDHNl6nRH~f6H7#I$m$-y&LwD~RP;J-&zuHvNB;}MJ?rx3NK zL*FhSumxiQh?ecff;|q2)=dOVwOts1imNd_E3aO$&5(CgQ8;B(ie&0|t$cFDgKk-B zb$3(HbC{0#qv__&hccj=hx#`w%1B7|#}EXm78!J$F`g>iEvLl9S5&p|0EuJIiC;j< zWhZ>vP%LZT!Q}+!yim zHLuSV=>!%=htaz6r$zsfc7g0b7ZrJlzjD2U|O(x1KKZO~Va2re13-aaQ51ShJ zczfG0A$)**f#9%o3xe)$E-slbUf^l)g{JWG@r9>R0nh`Rz0L-F>!)QN>7lH{*@GA- zh4m0{v-9JtLXcqxSl-asSad;6&YXn1uq2KzrJRi~_3#oaCZTn+OC(63=8(Pj7)H#K z?ohyyLo9{BzO3SiiHKNkmx4wR6-D5KUwnTM@6Wp;_?r$2(C?LYpe{N2?_)MZWnoIw zjsL+&zeuO%PW{?C6WpbnENF|ncb9|GxfztOpYJ8kFbr)agPg!c10g%S`Lz~O8P64E zz}}&E3fLi44bd`qqZ4oJvA?gvW`Rrvjt(5d^a^ecukcD{5mJ7(R&@x_s0RPqnH8(k zxRPpwM0vGjF>0$g*MLOX3jb$l{o$^^I{cxJ;M;#fpkA2^LKaWsNiRg+r*HYCtfT^p z#vzlnuBD}{Rp)?sJY~gjp)Qi^J1_lWEDy8&6|^4ymC|I4yTl^OjVq|2kQ*KTAPYXa zLdIJ{le_7~%a>};iJof$W=m7csON*&jdVk5nz)qiWmY%~8l5IBgCQ?YrobGt6o^%3 zt6R;3>$Tvf;5sMX4AJI-q=9THPd3UlnTLE9>C)a@7Oc;%y^}%@C3`0n>t+*OfuQiS zUiPnStLNIvmikmd5(AE z_Mo6#&?%&AI&!XAi^?-$!p-82$nQm%g=8vuk!tMM65LAVdgf`msZb3kyxn%?a@E1n#|)x_g(JM0=kWm~Q9(IL& z2bi|N8Gk}I$9yaeqzo`2(1m7CXqF(wV&5Ymf&k|cM0ei&MTX=7F@ULy$(g|5!F<@n zyMRu?m>z48G2#W)F1v9-h)7DR85jj-x&*P`xbYZPVxhDH%`E+y%}F9BV& zm(#5>PM{U(giqlBb8?}#)QC^LUKYX!ar>dzxVEBnX_M|BPA;)_UrmU<-h_TQix~Ki zP02NG+A6)eO8Y$!BcEH72rJM;zpf>0G6G+|#e#&j22_ade-JQnlW&O8WoRli40D+{ zV?Ofa{aKU{Kh5g_Zf64CnB&XZ*SyblLozoRbuzW8C+a!JHW&`F9vC!p=1g>v=Fsia zxdjevW&NnbD@rzB`9Sub)FkHg)nL}^ij!*lV6Xo(WWq=(Q&d==%`AYeoqb3q(>*vy z{FbMl!RV>^E8=A9xc}hZf;EjZq9oaiBEk4Bykdy>+7Gn?UvfA%4(U-b`R_s}MhsEC z5_pPhSF=@ctBun2OnNdeL1j$%uG3U`N=nLYFE7zQ)L5x#p?mKT4o)5gGN52P45eXT zhEEPq0ntt($A>^&PY$r=vgHhP0hk-yq5XE})iEx|Bqeqe)Z04dlM)dh=m}mH4}?NYN@uN0j=YVRnrJ^8U12KxyP?H4NxxPtsDdt%T>vTuz7fS zv44w$?AzR_Ey_h60}0y?Ael~+YlAEY4+dIvQc@BspB6CWgbkNOv@#pu4Y+J|y7SX% z*r{8@**@w@N*(aY81M-%KuIC(($(1sO!DInE;DAy5H`BL7V9t&5D>t}Yk=4!rWdt3 zU1m_mGVu&zfMzTc$M-6`{`DCvrEA+eIhh$4g!_AFrPUrJNsj@yyAByEkZ@v@SC*Ie zVXL}sb4-&Vj)Bw`|sbsn0d4ad_>gl zWEtjD0pRm&AfevAZ$01u@l<$|kzdwt~cS+WiK%$1XD=8rn4@T3_5C;x?!y^RP zAD>tN0+UT3yf!Fw(1QAG>!9R{G3FxZN!fr=c_`O-p@d-9Y!6ZQFW!vXKgd{Lw3il@ z6fK4umZq(FNz&P<`rcK68-B~$AFtY6*6;&yLyOgs(QF|U*QJ69;g=1s~nHUUtMWG{GPPN+c zT150%Ta`|dYSLo_)d=LcwY7L@4#(=NL?8}y3{2V2Q9MBYpzF5o z-rWk|9uh~)$MJ%KB`}$*6ch-hElM4Jf3u)#B$cZVys7Moye_WTz_PJI{aAH~+g5o^#piBi8z)^F5!S9P_GKD%1>kS5h3 zDAdU$W7havEl!#-)tBE=QUuS(eV9Zfc^1zO8<$Y$SwQ@l3R>#w?To+%lNKjg@6ZYL z&MQ8#QKz|dx;kYa?e1H~P@ffz7u+`}$EeCL;7b$hVlVvHde6@)-(!khD$*PXEab^C zQw3Hl-wu*I9MTJPeTU-G(ukOt`;WYd_@b>O;{~&_?TBkJ3 z-hZ=!0b&3MwCF_+nJE`iSyQv>96aaV8#k!UQ+jW18H|>|Zu5w?5a+RJq|p79$Gq(u zoc&ikl2H}}RU%@ro*W1LlR?{MmYz<%7`}n8`RrhXlrJBpSSMNt&Ae-xx&uFS;s-YS z3RHCvrCxJ3!p%H#?V>mb)2Y@dv>fB!e(Zl02C{Zl%J;_-5I~gY!$7lB?UV`%wM?f~ z@vvBsl62fjLqlT*Qo`J zxEZTL6SBWK%o!LnRvb#*mObG*qXb7EN}69$@j)v6O&|bTX%oi;!rMFqLj4vY+Ue8O{N5%C?d zmGgdNI4AjA1r$k$(4|khlI=I05!6tapHFC&;n0+YVCsSc1Fy4&1I~>vRvBRZibUbK za_CPFWBhh#=0i4pdvR2zz^oud>=vUIH%^CaSG*CnZRU;;yF8AI4jK8#x2KAWo0#pH z(6|2@DOP9%H~9)uF*E?h^)C8^+5y86Y5OAHsK3CS*fkBil|ZMiq6mXD&W05P9Vo16J3 z2WCDDVU%tlc^rr?lFjT}>6uufAj$|&`|z+0Xa?W8C`ZJF0jaTzlL#?3i%Uy)y1IN- z+Atb8%yA}Q=e4pT=d96ouVRClM3riEi;`a2t+h zNXA4i4?opHJ7ih#Er_u%L!jVrK%VOA>8VB{MM5|Oc@#X#)abQ#JBWBbuuW*Jj!X^S z^U?weIY#s)f|PZLW1?QRl-Tj07)5N=B!rIO44#?|=rZnotyO+@xXu^yH?(C?E(*Oe zfEDx8tDXCl5fGpX(KsiePF}XttDLGwCeMS&@E%!@a6m~vPh`5;)Xl2Qz-^%(ip(>a z0|Nu_-JvT)CkGt?EKYqDD!cfAcc6}fviwqfD%DX6Q-&aQ=@FpX(a|(iN_nd(s$M8l zK`4yUtQ1IsU1IREc4+U)0F;0JFV;^J-$IhN1gp-h!Bzu$Wts>j8vPotkBeMt@Av=UZR@ozzgv^Yd z+vodyf4@JT#~&w^bG+ZL*ZsQh>%Ok*e#hwQsF9N}ksuHV@*CqXBajSy3 zx`&!Jt*dL+CRnIzl9^=RV%R}n_ZAKTKF%e%_liU5N7|b+&sr`lWj7z6EU0Y`3_X)u z8OXdhl*8GI|3b4p9s3z@!E=SoT3e%jH|(emivvg1hC z;NY*xYFk-ZS@`=IgGd?v*>gJhq!vE-5*B`2TYK__c45)>6P4#4-MtVTLI$h4n=qt#r23y;m;-6z(nd`gXN#!bq}adC4KPX9>B zDqr%`+h@i4#K16R>oIX@_AJ@K=FG?5-UhD~4HJ{E&*UEPo6v;TU6k>#`geBvbF5t2 z^=oZ1r`qP+d&>#>(^IS35S)MP$jp~)bzA&8Jt-;FH*eld)7aaXswvZ7vYjvZM0Fx2 z=D)kP^dT|$i{byhMFy+3e;4}u`y(kXI$2vUtgNj3`t>X$E_J4@87?}g1XE$ z`=#<|Gr_&)DTl*NGcz)_1RSNLX3n|=Y6ES(VHA9m`P+NZ|)`aVZHD{*mT`{kDJgUt2xI0{qn zCth39KbMu0%YN4W?b|mj5i@i4?Uy=tN(_P}VC9STO8*}GP88G8(yD#?)}p~si{mwv8mEAy|5(1fWxhP_qkTsg1)}KrmHH3tUc~i-6W+MNlnD1 z0XJ^k_&wW#hllrQckPy$nORKM+Td+7GZ$;?YNxTXt}YdKclVn&KPjFaUNa0l3#u|j zkkS|shVDC}?Mi~bbd+CZ)YQ~GJv|+B+WR^2TEIL$5u2!>c2#)v*XCxc|K5+pza$hS zq@+<~j9&X2#&O%Fw_m~%o9OHBJ}~&7C=N+{ys_cpW%TaBZ;Si(X&MBw_dY#8t^cw) z7fwnqY}WiR`NVH~@%rDJ5c2c4^J{DM3x-)_Jo2nNBi(14+Zo)a8>(*=sOGrbd@g_E zNMK}i^r)yM@c8~{Nl~uy}kSKY2fkx>H5pury`a?i(SOM1J+{C6@zErx|$|9CNwr4eXDmD>)GGm zS1SIv;#F-lP}&J^ZSQ^dM;?vNzmduVk)l_spRfDy;lr-3t_v3~c)Y1Jsne)5;KVL_ z9YNUS`R%>P%Tp@Si)WG5D;P%hS-!SVAR>y=d3Hq`A_O+$q(==&s|SZtT|)x`=E<{X zGno?iu+599>{3!=Lqo3~{GMf4f^fK$)(^LIx}+hR*QBebM@>aFTxH!k+w#cyu2>lX zQ#>IWUor}Z&_h>Ow+ikI!jr}}V0Ud8ZhWLP_!DZ30Nv5g{&{!t^!UJ^GLgJQ@@&`} zTaLUMaEQ8~!M?|pCRZhhfB`|bfH+GnvV#(Q-LjeTX-hS=kWs{SWZ{CPs+55Zq6N&!o zEXAb#@L_|I;MMyZ3_XWy!v!|gGV<~{mR>h*5MvyMUtEu?Hxv<l43Q^{{PoDl$XaeH znIs`4>wtQEVj{0%FyzQDrMG8hW{UJmpFJ~IQR#vmJz9a|ktvVPS<1f_HGkvT72ma2 zt5&Cf_qL9jf`a~h*M@t+>b}%@)|-(0&!W;Y@b9kU-=poN4>!EqX;4f^w0{pI6EfBj zTX8u#IUb&#!NI{VU%t%D1pfF^+Su60CB@AhF`AtlxIfkG_eX{l@eVbVq|2Wc6cqIF zsnF7eH^KkTl9Eu69x}BI-Upqod`zdgFjn_qI8? zxgx23D9ln%e1YW^r!RciBrTqgpFVwHpkx%sM_-_$BP`9#%-o{0v7Tso^gw(Aas#py zOFP)xtIKzR>zap$D5iIAF1PtrVIh770Ymxr_I6Y2 Vw8BCYSnIz#bbub+N{mX&1 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 diff --git a/radio/src/fonts/480x272/font_stdsizebold.specs b/radio/src/fonts/480x272/font_stdsizebold.specs index ac4ebc21b..d7c4b278a 100644 --- a/radio/src/fonts/480x272/font_stdsizebold.specs +++ b/radio/src/fonts/480x272/font_stdsizebold.specs @@ -1 +1 @@ -0,4,9,15,26,36,49,61,65,72,79,88,98,103,110,116,123,133,143,153,163,173,183,193,203,213,223,229,234,243,253,262,271,278,290,301,312,323,333,343,355,367,373,383,395,405,420,432,444,455,467,478,489,500,512,524,539,550,561,572,578,587,592,600,609,615,625,635,644,654,664,671,681,691,696,701,711,716,731,741,751,761,771,778,787,793,803,812,825,835,844,853,864,869,878,891,904,917,930,943,956,969,982,995,1010,1025,1040,1055,1070,1085,1100,1115,1130,1145,1160,1175,1185,1195,1205,1211,1220,1232,1242,1254,1264,1276,1286,1297,1307,1316,1325,1332,1341,1350,1360,1366,1376,1386,1396,1406,1416,1428,1436,1446,1457,1468,1479,1490,1501,1513,1519,1529,1541,1553,1565,1577,1588,1599,1611,1621,1631,1641,1651,1663,1675,1687,1697,1707,1717,1726,1736,1742,1752,1762,1771,1780,1789,1801,1812,1822,1832,1844,1856,1867,1878,1889,1899,1909,1919,1931,1943,1955 \ No newline at end of file +0,4,9,15,26,36,49,61,65,72,79,88,98,103,110,116,124,134,144,154,164,174,184,194,204,214,224,230,235,244,254,263,272,279,291,302,313,324,334,344,356,368,374,384,396,406,421,433,445,456,468,479,490,501,513,525,540,551,562,573,579,588,593,601,610,616,626,636,645,655,665,672,682,692,697,703,713,718,733,743,753,763,773,780,789,796,806,815,828,838,848,857,868,873,882,895,908,921,934,947,960,973,986,999,1014,1029,1044,1059,1074,1089,1104,1119,1134,1149,1164,1179,1189,1199,1209,1217,1226,1238,1248,1260,1270,1282,1292,1303,1313,1322,1331,1339,1348,1358,1368,1375,1385,1395,1405,1415,1425,1437,1445,1455,1466,1477,1488,1499,1510,1522,1529,1539,1551,1563,1575,1587,1598,1609,1621,1631,1643,1653,1663,1673,1680,1687,1699,1709,1721,1731,1741,1751,1761,1773,1785,1797,1807,1817,1827,1836,1846,1852,1862,1872,1881,1890,1899,1911,1922,1932,1942,1954,1966,1977,1988,1999,2011,2021,2033,2043,2055,2065,2077,2087,2098,2107,2117,2127,2137,2147,2154,2161,2173,2183,2195,2205,2217,2227,2239,2249 \ No newline at end of file diff --git a/radio/src/fonts/480x272/font_tinsize.png b/radio/src/fonts/480x272/font_tinsize.png index 66a09bd5448800f77d19782546f4ba802438fad0..8f2456ce2a5638c5318963201925d6c30163ceb1 100644 GIT binary patch literal 8922 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 literal 8100 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 E3*vLeXaE2J literal 72981 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 z%0D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 delta 143 zcmeBYoXx1%8Q|y6%O%Cdz`(%k>ERLtq(N+UMrI(%o#dx5QBgFNG0EHAg`tC0)&nTW zS>O>_43rZFVMc~ob0k3OOFVsD+3)g*iYci$M@~8i6q5FIaSY+Oo*Z%NK*7pJ$32aT i3mX+@GPdk9XJD{)VqL>2KKBVw8H1;*pUXO@geCxzP|eXFB9{BWj3~blWy?xux>nGZY6rY@<70y0~cPfrk$zWCw?j+ pA>oB*Qo@h_|Nq}F{{O$8fx#j}Rq2Gqe|Dhp44$rjF6*2UngAGKHyZ!| delta 143 zcmbQnIGa(iGr-TCmrII^fq{Y7)59eQNQ2lMjLbmtm&u>66BR{M8I!!-T^Kr8Wj%m` zoCO|{#S9GG!XV7ZFl&wkP>{XE)7O>#E{C*;sL10O_R~NiX-^l&5RU7~JFXqraILZN lKZA24vvVP{$X|N~hPdAx(OarLHvyF~c)I$ztaD0e0sy%FBzph= diff --git a/radio/src/fonts/sqt5/font_es_08x10.png b/radio/src/fonts/sqt5/font_es_08x10.png index 6f520ee2ab108951a97a58530bf1f74c8113e309..c2c9b946504c4cbcf5955310244e8caefd232523 100644 GIT binary patch delta 179 zcmZ3;xQ|h>Gr-TCmrII^fq{Y7)59eQNGAX>4>T%Mp6HBnKtzSz^nF@)oK=_y05 z76Xx%hmHr0T_uXy&({z;^cvWv$e?)SQxW!lSs&ye38Hz{Ra{!XE7d#}uy z_H?pWTi$cw{!Fc(JuggCTz&{>N>m>@#2b@&VB%G&=NVEbZvAbX_E#?XE%ybnYYZz^ fbyTch^odnO)FnYQ#jgbD3{D15S3j3^P6>4AfkIXriKMHe-^vy9+}HtE>l5 zkh8!evY3H^TNs2H8D`Cq01C2~c>21s-{p`NF*cEYvqT*zr0D757{YNq+2Ygu#7BZ{ s|Ai%I{5Os;GQJUEbmPW?1^@puUTfysw7bZ3HBd2wr>mdKI;Vst0C?>v$p8QV diff --git a/radio/src/fonts/sqt5/font_es_10x14.png b/radio/src/fonts/sqt5/font_es_10x14.png index d66da44606b51bef5b2384ce86eda359b21c5623..bfaa3b87e887d5227bf8243d91ac42a2a612f54e 100644 GIT binary patch delta 239 zcmVqEu}NnkS&v{U6@+*cuV5nC%XMg+PRD6BmpN zOTMcj#>OfB{MQW55h*fMAB-UqgrgQxYZ?corZ6E)uZd8qSuHQBi9!XE6IWtZSEqPW z6%vff4k0X=L0A<6NWC091$zF_Ma$P1%-Pe{D p<=O3@(aP8HqTdDRow_owegNekb3)>%QNsWL002ovPDHLkV1i#WVRQfh delta 162 zcmeyxxQl5 zkh8!evY3H^TNs2H8D`Cq01C2~c>21s-{p`N716WpY~=?E>3O<1hHzX@wg~^LbFe4+IBs&|M^}Ks_@DxvDf00uV$8VTsQWMP4)BqU*7U}mzGxO z?~mtitf*!wsAyRqAfFa9-QwC^zRwc%XDt}*!$U=9t?YdUbQy!EtDnm{r-UW|rCUx} literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^AT~QAkYJF!{_q@-Vo7)Ob!1@J*w6hZkrl{SNcITw zWnidMV_;}#VPN|>Eal|aXmTW)B%Aj2PWJ* zu;9pn2PY0pICJ2`UPcDJ43;_U<@NzUg{md45hW>!C8<`)MX5lF!N|bST-U%z*U%)y wz`)Ab)XLac+rZGuz`$X$`4bckx%nxXX_dG&7@q5o0BT_HboFyt=akR{0O$2hy8r+H diff --git a/radio/src/fonts/std/font_es_05x07.png b/radio/src/fonts/std/font_es_05x07.png index 50a64fe6c8aa968a013190168b98f0ab1f520d76..066e7cab5a156fe215592ff0ef28a1e771510872 100644 GIT binary patch literal 199 zcmV;&0671NP)eN*}x7GRX zFwd=`&|S>ou4lVBQhB{cd)^dSpY=XKETNxRw)vwls;2-&<2h28yH?h7WgQ5Sx#^nm~X002ovPDHLkV1lP` BRNw#r literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^AT|dhkYISx7%UB>SkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+uenM@oty!5+IMW zz$3Dlfq`2Xgc%uT&5-~KvX^-Jy0SlH;$u)&tQ1y!4HQ!Fba4#fxSqV@+JOz%8W;Xy zXr9RIoWSf{#Oz$ieE2^zLqaD?)FK#IZ0z|dURz)087 yB*ehL%GlJ(*jU@Z(8|ETVY2xX6b-rgDVb@NxHTA_>yH3xVDNPHb6Mw<&;$SnPfMTx diff --git a/radio/src/fonts/std/font_es_08x10.png b/radio/src/fonts/std/font_es_08x10.png index d88578f1fca34d8903c4e3e227e571ad82211dba..78a166085610b2ddc62f7074d8b96ae059d06a5e 100644 GIT binary patch literal 311 zcmV-70m%M|P)Yrt0002~Nkl=NcJi+5PiSDk>j|e~r1PzPB973`%o5{W}J~m3ylhdAJL(i}Psf zbrLGv&TCXOUrY1QMM6A>=S#SyK=IWZPyb3h!}|xVe&F8k{{xO|d@5W2bIt$&002ov JPDHLkV1gz4jynJV literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~e2qYMs=P>91DVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&U|7|wYy{+S z7I;J!Gca%qgD@k*tT_@uLG}_)Usv{rOneN=ij~5OuYp1uo-U3d9M_Y7{O^D0!G739 zl}+KWTd$*AN8|A($D>UL4>TQQ>iPGdnc-RpS3c{cHBLZ1swJ)wB`Jv|saDBFsX&Us z$iUEC*T6{E&?Lmbz{=Rv%Gg-jz|hLTz+tla6BG@(`6-!cmAEw+p6ibQYGCkm^>bP0 Hl+XkKlWtFG diff --git a/radio/src/fonts/std/font_es_10x14.png b/radio/src/fonts/std/font_es_10x14.png index 72383b448f4a165856f039a806d1729bdea9caac..05411cc13b7e90cdc2ba04471b63a21c00d57ea5 100644 GIT binary patch literal 355 zcmV-p0i6DcP)B(g=)VbY!gao>&;qO!D!2UcVa6 zRJK=omduu7vs97e^g-cdRZR?IrX{&tw9l8+h|9=&Cvbj8PO53f&|n{jz87k!^4#vk1r1Q#>UzPhE@g!4wKEF eplHa=PsvQH#I3>bTz>>m1B0ilpUXO@geCw({aGmh diff --git a/radio/src/gui/480x272/lcd.cpp b/radio/src/gui/480x272/lcd.cpp index 6659e386b..bad85fbc5 100644 --- a/radio/src/gui/480x272/lcd.cpp +++ b/radio/src/gui/480x272/lcd.cpp @@ -49,24 +49,24 @@ uint8_t getMappedChar(uint8_t c) result = 127 + c - 0x80; } #elif defined(TRANSLATIONS_ES) - else if (c >= 0x80 && c <= 0x81) { + else if (c >= 0x80 && c <= 0x80+12) { result = 157 + c - 0x80; } #elif defined(TRANSLATIONS_FI) || defined(TRANSLATIONS_SE) else if (c >= 0x80 && c <= 0x85) { - result = 159 + c - 0x80; + result = 169 + c - 0x80; } #elif defined(TRANSLATIONS_IT) else if (c >= 0x80 && c <= 0x81) { - result = 165 + c - 0x80; + result = 175 + c - 0x80; } #elif defined(TRANSLATIONS_PL) else if (c >= 0x80 && c <= 0x80+17) { - result = 167 + c - 0x80; + result = 177 + c - 0x80; } #elif defined(TRANSLATIONS_PT) else if (c >= 0x80 && c <= 0x80+21) { - result = 185 + c - 0x80; + result = 195 + c - 0x80; } #endif else if (c < 0xC0) diff --git a/radio/src/tests/fonts_480x272.png b/radio/src/tests/fonts_480x272.png index da2ac09d348e29885ecbe5cf34770c360c8115f6..3ba0dcbafa29a191f465726378c24a143053921f 100644 GIT binary patch literal 9643 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

N1iX3eKWbaSUoY# z`4lEl*vHqiki-3rT#}j;7w$$U8Fz1y#nH>?5IZ20Qe7mV$Y5MEF&6 z--DE~r@78}tcT0`d%JFZC3t<4{Wi;ew|!Jq`z(Z(ewMcU)JV&Fhn3yLg=!TthDu7& zOR@gtx)@>o<7^>o%yIrL#noox$K4Iw*ayjwFRepj zI$6lQ50;#TrkGHWicVsQ4}7&+9ki7Ua&{at(ed0A7(8h1DsjcfB5_$=dg8&x16w$P z7u<0TBYI2>I&H1keH8L$E-y*&NpF;HhQ#+FDrnVh;2Yuaj5}(@FnTYHeo5u?m5I(m zN-@s2yl-)T14&Xd!-O)wM%=+Q+uOYMMh+lY;|duV|3I z>+BlUOitST*}N}0*_7UJbu`@|3Ye|>WWzKQde+|f2J}DS-4g@b3$Qz_dtds5x2?`K zQ;9bL+gSL%g(A1&`r;_N-Il|dPFr!O?hBZYsxmF3H$|LXH4y~elv1zp{sca(+u^wq zSVW|tpqrGK!7YCZSoj$o2mAH*)2NnakNrJiuqDuK?*mub5@m;}qQuHUa2p}y&y^IE zI825_M$*w1iF+A0#wLeeD}_byXt>M4vZ#L36~>XM#%3Su0R}Y zKbr3n<@a8)Sa8w$+LcKUkeJRAcd@6UE0mKP9xinSP#oS3HalDOD|@kU9SBOyL*8Z< zvic-Oui2$g|L{c`D41Y%74}pELkpq!3c^x-r8nifl};(F zq!qo&jlH2KKjhCt`Zc@s6BY$Na$)~}dHnQ0Ka~3a{px;5oM;Z&O@PS{e9sBc*3gGy I)a+jT7Y*Kgs{jB1 literal 9677 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 literal 5804 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 diff --git a/radio/src/tests/transparency_480x272.png b/radio/src/tests/transparency_480x272.png index b8fec6660175215aa18f93dc4dd7f09d8030adc4..2b0588eb91099c84eb5331edfa06082056dd42b4 100644 GIT binary patch literal 5773 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 KsPyu^sJ{WTviZOO literal 5754 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 212 #define TR_FSW_RESET_TIMERS "Timer 1\0 ""Timer 2\0 ""Timer 3\0 " @@ -258,7 +258,7 @@ #define SPEED_UNIT_METR "kmh" #define LEN_VUNITSSYSTEM "\010" -#define TR_VUNITSSYSTEM "Metrico\0""Imperial" +#define TR_VUNITSSYSTEM "Métrico\0""Imperial" #define LEN_VTELEMUNIT "\003" #define TR_VTELEMUNIT "-\0 ""V\0 ""A\0 ""mA\0""kts""m/s""f/s""kmh""mph""m\0 ""ft\0""@C\0""@F\0""%\0 ""mAh""W\0 ""mW\0""dB\0""rpm""g\0 ""@\0 ""rad""ml\0""fOz" @@ -266,7 +266,7 @@ #define STR_A (STR_VTELEMUNIT+4) #define LEN_VTELEMSCREENTYPE "\007" -#define TR_VTELEMSCREENTYPE "Nada\0 ""Numeros""Barras\0""Script\0" +#define TR_VTELEMSCREENTYPE "Nada\0 ""Números""Barras\0""Script\0" #define LEN_GPSFORMAT "\004" #define TR_GPSFORMAT "HMS NMEA" @@ -350,8 +350,8 @@ #define LEN_VTRAINERMODES "\022" #define TR_VTRAINER_MASTER_JACK "Master/Jack\0 " #define TR_VTRAINER_SLAVE_JACK "Esclav/Jack\0 " -#define TR_VTRAINER_MASTER_SBUS_MODULE "Master/Modulo SBUS" -#define TR_VTRAINER_MASTER_CPPM_MODULE "Master/Modulo CPPM" +#define TR_VTRAINER_MASTER_SBUS_MODULE "Master/Módulo SBUS" +#define TR_VTRAINER_MASTER_CPPM_MODULE "Master/Módulo CPPM" #define TR_VTRAINER_MASTER_BATTERY "Master/Serie\0 " #define TR_VTRAINER_BLUETOOTH TR("Master/BT\0 ""Esclavo/BT\0 ", "Master/Bluetooth\0 ""Esclavo/Bluetooth\0") #define TR_VTRAINER_MULTI "Master/Multi" @@ -364,7 +364,7 @@ #define TR_VSENSORTYPES "Custom\0 ""Calculado" #define LEN_VFORMULAS "\011" -#define TR_VFORMULAS "Suma\0 ""Media\0 ""Min\0 ""Max\0 ""Multipl. ""Total\0 ""Cell\0 ""Consumo\0 ""Distancia" +#define TR_VFORMULAS "Suma\0 ""Media\0 ""Min\0 ""Máx\0 ""Multipl. ""Total\0 ""Cell\0 ""Consumo\0 ""Distancia" #define LEN_VPREC "\004" #define TR_VPREC "0.--""0.0 ""0.00" @@ -426,7 +426,7 @@ #define TR_EXPONAME TR("Nom.", "Nombre expo") #define TR_BITMAP "Imagen modelo" #define TR_TIMER TR("Timer", "Timer ") -#define TR_ELIMITS TR("E.Limite", "Ampliar limites") +#define TR_ELIMITS TR("E.Límite", "Ampliar límites") #define TR_ETRIMS TR("E.Trims", "Ampliar trims") #define TR_TRIMINC "Paso trim" #define TR_DISPLAY_TRIMS "Ver trims" @@ -450,14 +450,14 @@ #define TR_DEFAULT "(defecto)" #define TR_CHECKTRIMS CENTER "\006Check\012Trims" #define OFS_CHECKTRIMS CENTER_OFS+(9*FW) -#define TR_SWASHTYPE "Tipo ciclico" +#define TR_SWASHTYPE "Tipo cíclico" #define TR_COLLECTIVE TR("Colectivo", "Fuente colectivo") #define TR_AILERON TR("Col. lateral", "Fuente col. lateral") #define TR_ELEVATOR TR("Col. long. ", "Fuente col. longitudinal") #define TR_SWASHRING "Ciclico" -#define TR_ELEDIRECTION TR("ELE Direccion", "Largo cyc. direccion") -#define TR_AILDIRECTION TR("AIL Direccion", "Lateral cyc. direccion") -#define TR_COLDIRECTION TR("PIT Direccion", "Coll. pitch direccion") +#define TR_ELEDIRECTION TR("ELE Dirección", "Largo cyc. dirección") +#define TR_AILDIRECTION TR("AIL Dirección", "Lateral cyc. dirección") +#define TR_COLDIRECTION TR("PIT Dirección", "Coll. pitch dirección") #define TR_MODE "Modo" #define TR_SUBTYPE INDENT "Subtipo" #define TR_NOFREEEXPO "No expo libre!" @@ -476,7 +476,7 @@ #define TR_MIXWARNING "Aviso" #define TR_OFF "OFF" #define TR_ANTENNA "Antena" -#define TR_NO_INFORMATION TR("Sin info", "Sin informacion") +#define TR_NO_INFORMATION TR("Sin info", "Sin información") #define TR_MULTPX "Multipx" #define TR_DELAYDOWN "Atraso bajar" #define TR_DELAYUP "Atraso subir" @@ -495,17 +495,17 @@ #define TR_SCREEN "Pant. " #define TR_SOUND_LABEL "Sonido" #define TR_LENGTH INDENT"Longitud" -#define TR_BEEP_LENGTH INDENT "Duracion Beep" +#define TR_BEEP_LENGTH INDENT "Duración Beep" #define TR_SPKRPITCH INDENT"Tono" #define TR_HAPTIC_LABEL "Haptic" #define TR_HAPTICSTRENGTH INDENT"Intensidad" #define TR_GYRO_LABEL "Gyro" #define TR_GYRO_OFFSET "Offset" -#define TR_GYRO_MAX "Max" +#define TR_GYRO_MAX "Máx" #define TR_CONTRAST "Contraste" #define TR_ALARMS_LABEL "Alarmas" -#define TR_BATTERY_RANGE TR("Rango bateria", "Rango medidor bateria") -#define TR_BATTERYWARNING INDENT"Bateria baja" +#define TR_BATTERY_RANGE TR("Rango batería", "Rango medidor batería") +#define TR_BATTERYWARNING INDENT"Batería baja" #define TR_INACTIVITYALARM INDENT"Inactividad" #define TR_MEMORYWARNING INDENT"Memoria baja" #define TR_ALARMWARNING INDENT"Sin sonido" @@ -516,10 +516,10 @@ #define TR_THROTTLE_LABEL "Potencia" #define TR_THROTTLEREVERSE TR("Invert acel", INDENT "Invertir acel.") #define TR_MINUTEBEEP TR("Minuto", "Cada minuto") -#define TR_BEEPCOUNTDOWN TR(INDENT"Cta. atras", INDENT"Cuenta atras") +#define TR_BEEPCOUNTDOWN TR(INDENT"Cta. atrás", INDENT"Cuenta atrás") #define TR_PERSISTENT TR(INDENT"Persisten.", INDENT"Persistente") #define TR_BACKLIGHT_LABEL "Luz fondo" -#define TR_BLDELAY INDENT"Duracion" +#define TR_BLDELAY INDENT"Duración" #define TR_BLONBRIGHTNESS INDENT"MAS brillo" #define TR_BLOFFBRIGHTNESS INDENT"MENOS brillo" #define TR_BLCOLOR INDENT "Color" @@ -560,7 +560,7 @@ #define TR_ACCEL "Acc:" #define TR_NODATA CENTER "SIN DATOS" #define TR_US "us" -#define TR_TMIXMAXMS "Tmix max" +#define TR_TMIXMAXMS "Tmix máx" #define TR_FREE_STACK "Stack libre" #define TR_MENUTORESET TR_ENTER "Resetear" #define TR_PPM_TRAINER "TR" @@ -574,19 +574,19 @@ #define TR_THROTTLENOTIDLE "Aceler. Activado" #define TR_ALARMSDISABLED "Alarmas Desact." #define TR_PRESSANYKEY TR("\010Pulsa una tecla", "Pulsa una tecla") -#define TR_BADEEPROMDATA "Error datos EEprom" +#define TR_BADEEPROMDATA "Error datos EEPROM" #define TR_BAD_RADIO_DATA "Error datos radio" #define TR_EEPROMFORMATTING "Formateo EEPROM" -#define TR_STORAGE_FORMAT "Preparacion alamacenamiento" +#define TR_STORAGE_FORMAT "Preparación alamacenamiento" #define TR_EEPROMOVERFLOW "Desborde EEPROM" -#define TR_MENURADIOSETUP "CONFIGURACION" +#define TR_MENURADIOSETUP "CONFIGURACIÓN" #define TR_MENUDATEANDTIME "FECHA Y HORA" #define TR_MENUTRAINER "ENTRENADOR" #define TR_MENUSPECIALFUNCS "FUNCIONES GLOBALES" -#define TR_MENUVERSION "VERSION" +#define TR_MENUVERSION "VERSIÓN" #define TR_MENU_RADIO_SWITCHES TR("INTERUPTS", "TEST INTERRUPTORES") -#define TR_MENU_RADIO_ANALOGS TR("ANALOGICOS", "TEST ANALOGICOS") -#define TR_MENUCALIBRATION "CALIBRACION" +#define TR_MENU_RADIO_ANALOGS TR("ANALÓGICOS", "TEST ANALÓGICOS") +#define TR_MENUCALIBRATION "CALIBRACIÓN" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Offsets" #else @@ -594,11 +594,11 @@ #endif #define TR_CHANNELS2FAILSAFE "Canales=>Failsafe" #define TR_CHANNEL2FAILSAFE "Canal=>Failsafe" -#define TR_MENUMODELSEL TR("MODELOS", "SELECCION MODELO") -#define TR_MENUSETUP TR("CONFIG. MODELO", "CONFIGURACION MODELO") +#define TR_MENUMODELSEL TR("MODELOS", "SELECCIÓN MODELO") +#define TR_MENUSETUP TR("CONFIG. MODELO", "CONFIGURACIÓN MODELO") #define TR_MENUFLIGHTMODE "MODO DE VUELO" #define TR_MENUFLIGHTMODES "MODOS DE VUELO" -#define TR_MENUHELISETUP "CONFIGURACION HELI" +#define TR_MENUHELISETUP "CONFIGURACIÓN HELI" // Alignment @@ -608,22 +608,22 @@ #define TR_MENULIMITS "SERVOS" #else #define TR_MENUINPUTS "DR/EXPO" - #define TR_MENULIMITS "LIMITES" + #define TR_MENULIMITS "LÍMITES" #endif #define TR_MENUCURVES "CURVAS" #define TR_MENUCURVE "CURVA" -#define TR_MENULOGICALSWITCH "INTERRUP.LOGICO" -#define TR_MENULOGICALSWITCHES TR3("INTERRUP. LOGICOS", "INTERRUP. LOGICOS", "INTERRUPTORES LOGICOS") +#define TR_MENULOGICALSWITCH "INTERRUP.LÓGICO" +#define TR_MENULOGICALSWITCHES TR3("INTERRUP. LÓGICOS", "INTERRUP. LÓGICOS", "INTERRUPTORES LÓGICOS") #define TR_MENUCUSTOMFUNC TR("FUNCIONES", "FUNCIONES ESPECIALES") #define TR_MENUCUSTOMSCRIPTS "CUSTOM SCRIPTS" -#define TR_MENUTELEMETRY "TELEMETRIA" +#define TR_MENUTELEMETRY "TELEMETRÍA" #define TR_MENUTEMPLATES "PLANTILLAS" -#define TR_MENUSTAT TR("ESTAD.", "ESTADISTICAS") +#define TR_MENUSTAT TR("ESTAD.", "ESTADÍSTICAS") #define TR_MENUDEBUG "DEBUG" #define TR_MONITOR_CHANNELS1 "MONITOR CANALES 1/8" #define TR_MONITOR_CHANNELS2 "MONITOR CANALES 9/16" -#define TR_MONITOR_SWITCHES "MONITOR INTERRP LOGICOS" +#define TR_MONITOR_SWITCHES "MONITOR INTERRP LÓGICOS" #define TR_MONITOR_CHANNELS3 "MONITOR CANALES 17/24" #define TR_MONITOR_CHANNELS4 "MONITOR CANALES 25/32" #define TR_MONITOR_OUTPUT_DESC "SALIDAS" @@ -631,27 +631,27 @@ #define TR_RECEIVER_NUM TR("Num Rx", "Receptor No.") #define TR_RECEIVER "Receptor" #define TR_MULTI_RFTUNE TR("Sint.freq.", "RF Freq. sint.fina") -#define TR_MULTI_TELEMETRY "Telemetria" -#define TR_MULTI_VIDFREQ TR("Freq. Vid.", "Frecuencia Video") +#define TR_MULTI_TELEMETRY "Telemetría" +#define TR_MULTI_VIDFREQ TR("Freq.vídeo", "Frecuencia vídeo") #define TR_RFPOWER "RF Power" #define TR_MULTI_FIXEDID TR("ID Fijo", "ID Fijo") -#define TR_MULTI_OPTION TR("Opcion", "Valor opcion") +#define TR_MULTI_OPTION TR("Opción", "Valor opción") #define TR_MULTI_AUTOBIND TR(INDENT "Emp Cnl",INDENT "Emparejar en canal") #define TR_DISABLE_CH_MAP TR("No ch map", "Desactivar mapa cnl") #define TR_DISABLE_TELEM TR("No telem", "Desactivar telem.") #define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetectar formato") #define TR_MULTI_LOWPOWER TR(INDENT "Baja poten.", INDENT "Modo de baja poten.") -#define TR_MULTI_LNA_DISABLE INDENT "LNA disable" +#define TR_MULTI_LNA_DISABLE INDENT "LNA desact." #define TR_MODULE_TELEMETRY TR(INDENT "S.Port", INDENT "S.Port link") #define TR_MODULE_TELEM_ON TR("ON", "Activado") -#define TR_DISABLE_INTERNAL TR("Desac.RF int", "Desact. mod. int. RF") +#define TR_DISABLE_INTERNAL TR("Desac.RF int", "Desact. mód. int. RF") #define TR_MODULE_NO_SERIAL_MODE TR("No modo serie", "No en modo serie") -#define TR_MODULE_NO_INPUT TR("Sin señal", "Sin señal") -#define TR_MODULE_NO_TELEMETRY TR3( "No telemetria", "No MULTI_TELEMETRY", "No telemetria (activa MULTI_TELEMETRY)") +#define TR_MODULE_NO_INPUT "Sin señal" +#define TR_MODULE_NO_TELEMETRY TR3( "No telemetría", "No MULTI_TELEMETRY", "No telemetría (activa MULTI_TELEMETRY)") #define TR_MODULE_WAITFORBIND "Emparejar con protocolo" #define TR_MODULE_BINDING "Emparejando" -#define TR_MODULE_UPGRADE_ALERT TR3("Actualizar", "Actualizar modulo", "Actualizar\nmodulo") -#define TR_MODULE_UPGRADE TR("Act recom", "Actualizar modulo recomendado") +#define TR_MODULE_UPGRADE_ALERT TR3("Actualizar", "Actualizar módulo", "Actualizar\nmódulo") +#define TR_MODULE_UPGRADE TR("Act recom", "Actualizar módulo recomendado") #define TR_REBIND "Reemparejar " #define TR_REG_OK "Registro ok" #define TR_BIND_OK "Emparejado ok" @@ -659,32 +659,32 @@ #define TR_BINDING_CH1_8_TELEM_OFF "Ch1-8 Telem OFF" #define TR_BINDING_CH9_16_TELEM_ON "Ch9-16 Telem ON" #define TR_BINDING_CH9_16_TELEM_OFF "Ch9-16 Telem OFF" -#define TR_PROTOCOL_INVALID TR("Prot. invalido", "Protocolo invalido") -#define TR_MODULE_STATUS TR(INDENT "Estado", INDENT "Estado modulo") +#define TR_PROTOCOL_INVALID TR("Prot. inválido", "Protocolo inválido") +#define TR_MODULE_STATUS TR(INDENT "Estado", INDENT "Estado módulo") #define TR_MODULE_SYNC TR(INDENT "Sync", INDENT "Estado proto sync") #define TR_MULTI_SERVOFREQ TR("V ref serv", "Vel. refr. servo") -#define TR_MULTI_MAX_THROW TR("Max. Throw", "Activar max. throw") +#define TR_MULTI_MAX_THROW TR("Máx. Throw", "Activar máx. throw") #define TR_MULTI_RFCHAN TR("Canal RF", "Selecciona canal RF") #define TR_SYNCMENU "Sync " TR_ENTER -#define TR_LIMIT INDENT"Limite" +#define TR_LIMIT INDENT"Límite" #define TR_MINRSSI "Min Rssi" #define TR_LATITUDE "Latitud" #define TR_LONGITUDE "Longitud" #define TR_GPSCOORD TR("Coords GPS", INDENT "Formato coordenadas") -#define TR_VARIO TR("Vario", "Variometro") +#define TR_VARIO TR("Vario", "Variómetro") #define TR_PITCH_AT_ZERO INDENT "Pitch en cero" -#define TR_PITCH_AT_MAX INDENT "Pitch en max" +#define TR_PITCH_AT_MAX INDENT "Pitch en máx" #define TR_REPEAT_AT_ZERO TR(INDENT "Repet. en cero", INDENT "Repetir en cero") #define TR_SHUTDOWN "APAGANDO" #define TR_SAVEMODEL "Grabando modelo" -#define TR_BATT_CALIB TR("Calib.bat.", "Calibracion bateria") +#define TR_BATT_CALIB TR("Calib.bat.", "Calibración batería") #define TR_CURRENT_CALIB "Calib. actual" #define TR_VOLTAGE INDENT"Voltaje" #define TR_CURRENT INDENT"Actual" #define TR_SELECT_MODEL TR("Selec. modelo", "Seleccionar modelo") -#define TR_CREATE_CATEGORY "Crear categoria" -#define TR_RENAME_CATEGORY "Renombrar categoria" -#define TR_DELETE_CATEGORY "Borrar categoria" +#define TR_CREATE_CATEGORY "Crear categoría" +#define TR_RENAME_CATEGORY "Renombrar categoría" +#define TR_DELETE_CATEGORY "Borrar categoría" #define TR_CREATE_MODEL "Crear modelo" #define TR_DUPLICATE_MODEL "Duplicar modelo" #define TR_COPY_MODEL "Copiar modelo" @@ -693,7 +693,7 @@ #define TR_DELETE_MODEL "Borrar modelo" #define TR_RESTORE_MODEL "Restaurar modelo" #define TR_DELETE_ERROR "Error de borrado" -#define TR_CAT_NOT_EMPTY "Categoria no esta vacia" +#define TR_CAT_NOT_EMPTY "Categoría no esta vacía" #define TR_SDCARD_ERROR "Error SDCARD" #define TR_NO_SDCARD "No SDCARD" #define TR_WAITING_FOR_RX "Esperando a RX..." @@ -705,28 +705,28 @@ #define TR_CONNECTED "Conectado" #define TR_FLEX_915 "Flex 915MHz" #define TR_FLEX_868 "Flex 868MHz" -#define TR_16CH_WITHOUT_TELEMETRY TR("16CH sin telem.", "16CH sin telemetria") -#define TR_16CH_WITH_TELEMETRY TR("16CH con telem.", "16CH con telemetria") -#define TR_8CH_WITH_TELEMETRY TR("8CH con telem.", "8CH con telemetria") +#define TR_16CH_WITHOUT_TELEMETRY TR("16CH sin telem.", "16CH sin telemetría") +#define TR_16CH_WITH_TELEMETRY TR("16CH con telem.", "16CH con telemetría") +#define TR_8CH_WITH_TELEMETRY TR("8CH con telem.", "8CH con telemetría") #define TR_EXT_ANTENNA "Antena ext." #define TR_PIN "Pin" #define TR_UPDATE_RX_OPTIONS "Actualizar opciones RX?" #define TR_UPDATE_TX_OPTIONS "Actualizar opciones TX?" -#define TR_MODULES_RX_VERSION "Modulos / version RX" -#define TR_MENU_MODULES_RX_VERSION "MODULOS / VERSION RX" +#define TR_MODULES_RX_VERSION "Módulos / versión RX" +#define TR_MENU_MODULES_RX_VERSION "MÓDULOS / VERSIÓN RX" #define TR_MENU_FIRM_OPTIONS "OPCIONES FIRMWARE" #define TR_GYRO "Gyro" #define TR_STICKS_POTS_SLIDERS "Sticks/Pots/Sliders" #define TR_PWM_STICKS_POTS_SLIDERS "PWM Sticks/Pots/Sliders" #define TR_RF_PROTOCOL "Protocolo RF" -#define TR_MODULE_OPTIONS "Opciones modulo" +#define TR_MODULE_OPTIONS "Opciones módulo" #define TR_POWER "Potencia" #define TR_NO_TX_OPTIONS "Sin opciones TX" -#define TR_RTC_BATT TR("Bat. RTC", "Bateria RTC") +#define TR_RTC_BATT TR("Bat. RTC", "Batería RTC") #define TR_POWER_METER_EXT "Medidor potencia(EXT)" #define TR_POWER_METER_INT "Medidor potencia(INT)" -#define TR_SPECTRUM_ANALYSER_EXT "Spectro (EXT)" -#define TR_SPECTRUM_ANALYSER_INT "Spectro (INT)" +#define TR_SPECTRUM_ANALYSER_EXT "Espectro (EXT)" +#define TR_SPECTRUM_ANALYSER_INT "Espectro (INT)" #define TR_SDCARD_FULL "SD Card llena" #define TR_NEEDS_FILE "NECESITA ARCHIVO" #define TR_EXT_MULTI_SPEC "opentx-inv" @@ -742,11 +742,11 @@ #define TR_FAILSAFEWARN "FAILSAFE" #define TR_TEST_WARNING TR("TESTING", "TEST BUILD") #define TR_TEST_NOTSAFE "Usar solo para test" -#define TR_WRONG_SDCARDVERSION TR("Ver esperada: ", "Version esperada: ") -#define TR_WARN_RTC_BATTERY_LOW "Bateria RTC baja" +#define TR_WRONG_SDCARDVERSION TR("Ver esperada: ", "Versión esperada: ") +#define TR_WARN_RTC_BATTERY_LOW "Batería RTC baja" #define TR_WARN_MULTI_LOWPOWER "Modo baja potencia" -#define TR_BATTERY "BATERIA" -#define TR_WRONG_PCBREV "Placa PCB erronea" +#define TR_BATTERY "BATERÍA" +#define TR_WRONG_PCBREV "Placa PCB errónea" #define TR_EMERGENCY_MODE "MODO EMERGENCIA" #define TR_PCBREV_ERROR "Error PCB" #define TR_NO_FAILSAFE "Failsafe no fijado" @@ -762,16 +762,16 @@ #define TR_COPROC_TEMP "MB Temp. \016>" #define TR_CAPAWARNING INDENT "Capacidad baja" #define TR_TEMPWARNING INDENT "Sobrecalent" -#define TR_FUNC "Funcion" +#define TR_FUNC "Función" #define TR_V1 "V1" #define TR_V2 "V2" -#define TR_DURATION "Duracion" +#define TR_DURATION "Duración" #define TR_DELAY "Atraso" #define TR_SD_CARD "SD CARD" #define TR_SDHC_CARD "SD-HC CARD" #define TR_NO_SOUNDS_ON_SD "Sin sonidos en SD" #define TR_NO_MODELS_ON_SD "Sin modelos en SD" -#define TR_NO_BITMAPS_ON_SD "Sin imagenes en SD" +#define TR_NO_BITMAPS_ON_SD "Sin imágenes en SD" #define TR_NO_SCRIPTS_ON_SD "No scripts en SD" #define TR_SCRIPT_SYNTAX_ERROR "Script syntax error" #define TR_SCRIPT_PANIC "Script panic" @@ -785,27 +785,27 @@ #define TR_ASSIGN_SPLASH "Pant. bienvenida" #define TR_EXECUTE_FILE "Ejecutar" #define TR_REMOVED "Borrado" -#define TR_SD_INFO "Informacion" +#define TR_SD_INFO "Información" #define TR_SD_FORMAT "Formatear" #define TR_NA "N/A" #define TR_HARDWARE "COMPONENTES" #define TR_FORMATTING "Formateando.." #define TR_TEMP_CALIB "Temp. Calib" #define TR_TIME "Hora" -#define TR_MAXBAUDRATE "Max bauds" +#define TR_MAXBAUDRATE "Máx bauds" #define TR_BLUETOOTH "Bluetooth" #define TR_BLUETOOTH_DISC "Buscar" #define TR_BLUETOOTH_INIT "Init" #define TR_BLUETOOTH_DIST_ADDR "Dir. remota" #define TR_BLUETOOTH_LOCAL_ADDR "Dir. local" -#define TR_BLUETOOTH_PIN_CODE "Codigo PIN" +#define TR_BLUETOOTH_PIN_CODE "Código PIN" #define TR_BAUDRATE "Velocidad BT" #define LEN_BLUETOOTH_MODES "\012" #if defined(PCBX9E) #define TR_BLUETOOTH_MODES "---\0 ""Activo\0 " #else -#define TR_BLUETOOTH_MODES "---\0 ""Telemetria""Entrenador" +#define TR_BLUETOOTH_MODES "---\0 ""Telemetría""Entrenador" #endif #define TR_SD_INFO_TITLE "SD INFO" #define TR_SD_TYPE "Tipo:" @@ -830,24 +830,24 @@ #define TR_FLASH_RECEIVER_OTA "Flash RX OTA" #define TR_FLASH_RECEIVER_OTA_BY_EXTERNAL "Flash RX por ext. OTA" #define TR_FLASH_RECEIVER_OTA_BY_INTERNAL "Flash RX por int. OTA" -#define TR_FLASH_BLUETOOTH_MODULE TR("Flash modulo BT", "Flash modulo bluetooth") +#define TR_FLASH_BLUETOOTH_MODULE TR("Flash módulo BT", "Flash módulo bluetooth") #define TR_FLASH_POWER_MANAGEMENT_UNIT "Flash unid. pwr mngt" -#define TR_CURRENT_VERSION TR("Vers. actual", "Version actual: ") -#define TR_FLASH_INTERNAL_MODULE TR("Flash modulo int", "Flash modulo interno") +#define TR_CURRENT_VERSION TR("Vers. actual", "Versión actual: ") +#define TR_FLASH_INTERNAL_MODULE TR("Flash módulo int", "Flash módulo interno") #define TR_FLASH_INTERNAL_MULTI TR("Flash Multi int", "Flash Multi interno") -#define TR_FLASH_EXTERNAL_MODULE TR("Flash modulo ext", "Flash modulo externo") +#define TR_FLASH_EXTERNAL_MODULE TR("Flash módulo ext", "Flash módulo externo") #define TR_FLASH_EXTERNAL_MULTI TR("Flash Multi ext", "Flash Multi externo") #define TR_FIRMWARE_UPDATE_ERROR TR("Error act FW", "Error actualiz. firmware") #define TR_FIRMWARE_UPDATE_SUCCESS "Flash ok" #define TR_WRITING "Escribiendo..." #define TR_CONFIRM_FORMAT "Confirmar formato?" #define TR_INTERNALRF "RF interna" -#define TR_INTERNAL_MODULE TR("Modulo int", "Modulo interno") -#define TR_EXTERNAL_MODULE TR("Modulo ext", "Modulo externo") +#define TR_INTERNAL_MODULE TR("Módulo int", "Módulo interno") +#define TR_EXTERNAL_MODULE TR("Módulo ext", "Módulo externo") #define TR_OPENTX_UPGRADE_REQUIRED "Actualiz. OpenTX requerida" #define TR_TELEMETRY_DISABLED "Telem. inactiva" -#define TR_MORE_OPTIONS_AVAILABLE "Mas opciones disp." -#define TR_NO_MODULE_INFORMATION "Sin informacion modulo" +#define TR_MORE_OPTIONS_AVAILABLE "Más opciones disp." +#define TR_NO_MODULE_INFORMATION "Sin información módulo" #define TR_EXTERNALRF "RF externa" #define TR_FAILSAFE INDENT"Failsafe" #define TR_FAILSAFESET "AJUSTES FAILSAFE" @@ -869,14 +869,14 @@ #define TR_MENU_SPECTRUM_ANALYSER "ANALIZADOR DE ESPECTRO" #define TR_MENU_POWER_METER "MEDIDOR POTENCIA" #define TR_SENSOR "SENSOR" -#define TR_COUNTRYCODE "Codigo Pais" +#define TR_COUNTRYCODE "Código país" #define TR_USBMODE "Modo USB" #define TR_JACKMODE "Modo Jack" #define TR_VOICELANG "Idioma voces" #define TR_UNITSSYSTEM "Unidades" #define TR_EDIT "Editar" #define TR_INSERT_BEFORE "Insertar antes" -#define TR_INSERT_AFTER "Insertar despues" +#define TR_INSERT_AFTER "Insertar después" #define TR_COPY "Copiar" #define TR_MOVE "Mover" #define TR_PASTE "Pegar" @@ -886,8 +886,8 @@ #define TR_RESET_TIMER1 "Reset Reloj 1" #define TR_RESET_TIMER2 "Reset Reloj 2" #define TR_RESET_TIMER3 "Reset Reloj 3" -#define TR_RESET_TELEMETRY "Reset Telemetria" -#define TR_STATISTICS "Estadisticas" +#define TR_RESET_TELEMETRY "Reset Telemetría" +#define TR_STATISTICS "Estadísticas" #define TR_ABOUT_US "Nosotros" #define TR_USB_JOYSTICK "Joystick USB (HID)" #define TR_USB_MASS_STORAGE "Almaz. USB (SD)" @@ -920,15 +920,15 @@ #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW", "Switches")) #define TR_ANALOGS_BTN BUTTON(TR("Analog", "Analogs")) -#define TR_CALIBRATION "Calibracion" +#define TR_CALIBRATION "Calibración" #define TR_SET "[Ajuste]" #define TR_TRAINER "Entrenador" #define TR_CHANS "Chans" #define TR_ANTENNAPROBLEM CENTER "Problema antena TX!" #define TR_MODELIDUSED TR("ID en uso", "ID modelo en uso") -#define TR_MODULE "Modulo" +#define TR_MODULE "Módulo" #define TR_RX_NAME "Nombre Rx" -#define TR_TELEMETRY_TYPE TR("Tipo", "Tipo telemetria") +#define TR_TELEMETRY_TYPE TR("Tipo", "Tipo telemetría") #define TR_TELEMETRY_SENSORS "Sensores" #define TR_VALUE "Valor" #define TR_TOPLCDTIMER "Timer LCD superior" @@ -945,22 +945,22 @@ #endif #define TR_USE_INTERNAL_ANTENNA TR("Usa antena int.", "Usa antena interna") #define TR_USE_EXTERNAL_ANTENNA TR("Use antena ext.", "Usa antena externa") -#define TR_ANTENNACONFIRM2 TR("Revisa antena", "Revisa que la antena este instalada!") +#define TR_ANTENNACONFIRM2 TR("Revisa antena", "Revisa que la antena esté instalada!") #define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "No requerido" #define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requiere FCC" #define TR_MODULE_PROTOCOL_EU_WARN_LINE1 "Requiere EU" #define TR_MODULE_PROTOCOL_WARN_LINE2 "firmware certificado" #define TR_LOWALARM INDENT "Alarma baja" -#define TR_CRITICALALARM INDENT "Alarma critica" +#define TR_CRITICALALARM INDENT "Alarma crítica" #define TR_RSSIALARM_WARN TR("RSSI", "TELEMETRY RSSI") -#define TR_NO_RSSIALARM TR(INDENT "Alarmas desact.", INDENT "Alarmas telemetria desact.") +#define TR_NO_RSSIALARM TR(INDENT "Alarmas desact.", INDENT "Alarmas telemetría desact.") #define TR_DISABLE_ALARM TR(INDENT "Desact. alarmas", INDENT "Desact. alarmas telem.") #define TR_ENABLE_POPUP "Activa Popup" #define TR_DISABLE_POPUP "Desactiva Popup" #define TR_POPUP "Popup" #define TR_MIN "Min" -#define TR_MAX "Max" +#define TR_MAX "Máx" #define TR_CURVE_PRESET "Preset..." #define TR_PRESET "Preset" #define TR_MIRROR "Mirror" @@ -972,7 +972,7 @@ #define TR_PTS "pts" #define TR_SMOOTH TR3("Suaviz.", "Suaviz.", "Suavizado") #define TR_COPY_STICKS_TO_OFS TR("Copia stick->subtr", "Copia Sticks a Offset") -#define TR_COPY_MIN_MAX_TO_OUTPUTS TR("Copia min/max a sal", "Copia min/max/ctr a salidas") +#define TR_COPY_MIN_MAX_TO_OUTPUTS TR("Copia min/máx a sal", "Copia min/máx/ctr a salidas") #define TR_COPY_TRIMS_TO_OFS TR("Copia trim->subtr", "Copia trims a subtrim") #define TR_INCDEC "Inc/Decrement" #define TR_GLOBALVAR "Var global" @@ -980,7 +980,7 @@ #define TR_CONSTANT "Constante" #define TR_PERSISTENT_MAH INDENT "Valor mAh" #define TR_PREFLIGHT "Chequeos prevuelo" -#define TR_CHECKLIST TR(INDENT "Lista verif", INDENT "Lista verificacion") +#define TR_CHECKLIST TR(INDENT "Lista verif", INDENT "Lista verificación") #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") #define TR_AUX_SERIAL_MODE "Puerto serie" #define TR_SCRIPT "Script" @@ -993,7 +993,7 @@ #define TR_SPORT_UPDATE_POWER_MODE "SP Power" #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " -#define TR_NO_TELEMETRY_SCREENS TR("No hay pant. telemetria", "No hay pantallas de telemetria") +#define TR_NO_TELEMETRY_SCREENS TR("No hay pant. telemetría", "No hay pantallas de telemetría") // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Nombre" @@ -1001,26 +1001,26 @@ #define TR_PHASES_HEADERS_RUD_TRIM "Trim timon" #define TR_PHASES_HEADERS_ELE_TRIM "Trim elevador" #define TR_PHASES_HEADERS_THT_TRIM "Trim potencia" -#define TR_PHASES_HEADERS_AIL_TRIM "Trim aleron" +#define TR_PHASES_HEADERS_AIL_TRIM "Trim alerón" #define TR_PHASES_HEADERS_CH5_TRIM "Trim 5" #define TR_PHASES_HEADERS_CH6_TRIM "Trim 6" #define TR_PHASES_HEADERS_FAD_IN "Aparecer" #define TR_PHASES_HEADERS_FAD_OUT "Desparecer" #define TR_LIMITS_HEADERS_NAME "Nombre" -#define TR_LIMITS_HEADERS_SUBTRIM "Compensacion" +#define TR_LIMITS_HEADERS_SUBTRIM "Compensación" #define TR_LIMITS_HEADERS_MIN "Min" -#define TR_LIMITS_HEADERS_MAX "Max" -#define TR_LIMITS_HEADERS_DIRECTION "Direccion" +#define TR_LIMITS_HEADERS_MAX "Máx" +#define TR_LIMITS_HEADERS_DIRECTION "Dirección" #define TR_LIMITS_HEADERS_CURVE "Curva" #define TR_LIMITS_HEADERS_PPMCENTER "Centrado PPM" -#define TR_LIMITS_HEADERS_SUBTRIMMODE "Simetrica" +#define TR_LIMITS_HEADERS_SUBTRIMMODE "Simétrica" -#define TR_LSW_HEADERS_FUNCTION "Funcion" +#define TR_LSW_HEADERS_FUNCTION "Función" #define TR_LSW_HEADERS_V1 "V1" #define TR_LSW_HEADERS_V2 "V2" #define TR_LSW_HEADERS_ANDSW "Interrup. AND" -#define TR_LSW_HEADERS_DURATION "Duracion" +#define TR_LSW_HEADERS_DURATION "Duración" #define TR_LSW_HEADERS_DELAY "Retardo" #define TR_GVAR_HEADERS_NAME "Nombre" @@ -1035,7 +1035,7 @@ #define TR_GVAR_HEADERS_FM8 "Valor en FM8" // Horus footer descriptions -#define TR_LSW_DESCRIPTIONS { "Tipo de comparacion o funcion", "Primera variable", "Segunda variable o constante", "Segunda variable o constante", "Condicion adicional para activar linea", "Duracion minima de switch logico", "Duracion minima TRUE para activar switch logico" } +#define TR_LSW_DESCRIPTIONS { "Tipo de comparación o función", "Primera variable", "Segunda variable o constante", "Segunda variable o constante", "Condición adicional para activar línea", "Duración mínima de switch lógico", "Duración mínima TRUE para activar switch lógico" } // Horus layouts and widgets #define TR_FIRST_CHANNEL "Primer canal" @@ -1060,7 +1060,7 @@ #define TR_ABOUT_OPENTX_1 "OpenTX es open source, no-" #define TR_ABOUT_OPENTX_2 "comercial y viene sin " #define TR_ABOUT_OPENTX_3 "garantias. Fue desarrollado" -#define TR_ABOUT_OPENTX_4 "libremente. Ayudas a traves" +#define TR_ABOUT_OPENTX_4 "libremente. Ayudas a través" #define TR_ABOUT_OPENTX_5 "de donaciones son bienvenidas!" #define TR_ABOUT_BERTRAND_1 "Bertrand Songis" @@ -1068,7 +1068,7 @@ #define TR_ABOUT_BERTRAND_3 "Companion codesarrollador" #define TR_ABOUT_MIKE_1 "Mike Blandford" -#define TR_ABOUT_MIKE_2 "Guru de codigo y drivers" +#define TR_ABOUT_MIKE_2 "Gurú de codigo y drivers" #define TR_ABOUT_MIKE_3 "Seguramente uno de los" #define TR_ABOUT_MIKE_4 "mejores inspiradores" @@ -1078,7 +1078,7 @@ #define TR_ABOUT_ANDRE_1 "Andre Bernet" #define TR_ABOUT_ANDRE_2 "Funcionalidad, usabilidad," -#define TR_ABOUT_ANDRE_3 "depurado, documentacion" +#define TR_ABOUT_ANDRE_3 "depurado, documentación" #define TR_ABOUT_ROB_1 "Rob Thomson" #define TR_ABOUT_ROB_2 "openrcforums webmaster" @@ -1089,7 +1089,7 @@ #define TR_ABOUT_KJELL_4 "Colaborador Companion" #define TR_ABOUT_MARTIN_1 "Martin Hotar" -#define TR_ABOUT_MARTIN_2 "Dise\201o grafico" +#define TR_ABOUT_MARTIN_2 "Dise\201o gráfico" #if defined(PCBTARANIS) #define TR_ABOUT_HARDWARE_1 "FrSky" @@ -1119,11 +1119,11 @@ #define TR_TOP_BAR "Panel superior" #define TR_FLASH_ERASE "Borrar flash..." #define TR_FLASH_WRITE "Escribir flash..." -#define TR_OTA_UPDATE "Actualizacion OTA..." -#define TR_MODULE_RESET "Reset modulo..." +#define TR_OTA_UPDATE "Actualización OTA..." +#define TR_MODULE_RESET "Reset módulo..." #define TR_UNKNOWN_RX "RX desconocido" #define TR_UNSUPPORTED_RX "RX no soportado" -#define TR_OTA_UPDATE_ERROR "Error actualizacion OTA" +#define TR_OTA_UPDATE_ERROR "Error actualización OTA" #define TR_DEVICE_RESET "Reset dispositivo..." #define TR_ALTITUDE INDENT "Altitud" #define TR_SCALE "Escala" @@ -1133,9 +1133,9 @@ #define TR_MODS_FORBIDDEN "Modificaciones prohibidas" #define TR_UNLOCKED "Desbloqueado" #define TR_ID "ID" -#define TR_PRECISION "Precision" +#define TR_PRECISION "Precisión" #define TR_RATIO "Ratio" -#define TR_FORMULA "Formula" +#define TR_FORMULA "Fórmula" #define TR_CELLINDEX "Cell index" #define TR_LOGS "Logs" #define TR_OPTIONS "Opciones" @@ -1148,7 +1148,7 @@ #define TR_AUTOOFFSET "Auto offset" #define TR_ONLYPOSITIVE "Positivo" #define TR_FILTER "Filtro" -#define TR_TELEMETRYFULL TR("Telem. llena!", "Todas las entradas de telemetria llenas!") +#define TR_TELEMETRYFULL TR("Telem. llena!", "Todas las entradas de telemetría llenas!") #define TR_SERVOS_OK "Servos OK" #define TR_SERVOS_KO "Servos KO" #define TR_INVERTED_SERIAL INDENT "Invertir" @@ -1164,7 +1164,7 @@ #define TR_SETUP_WIDGETS "Config. widgets" #define TR_USER_INTERFACE "Interfaz" #define TR_THEME "Tema" -#define TR_SETUP "Configuracion" +#define TR_SETUP "Configuración" #define TR_MAINVIEWX "Vista pral. X" #define TR_LAYOUT "Diseño" #define TR_ADDMAINVIEW "Añadir vista pral." @@ -1177,20 +1177,20 @@ #define TR_MENU_STICKS "\307Sticks" #define TR_MENU_POTS "\310Pots" #define TR_MENU_MAX "\315MAX" -#define TR_MENU_HELI "\316Ciclico" +#define TR_MENU_HELI "\316Cíclico" #define TR_MENU_TRIMS "\313Trims" #define TR_MENU_SWITCHES "\312Interruptores" -#define TR_MENU_LOGICAL_SWITCHES TR("\312Interr. logicos", "\312Interruptores logicos") +#define TR_MENU_LOGICAL_SWITCHES TR("\312Interr. lógicos", "\312Interruptores lógicos") #define TR_MENU_TRAINER "\317Entrenador" #define TR_MENU_CHANNELS "\320Canales" #define TR_MENU_GVARS "\311GVars" -#define TR_MENU_TELEMETRY "\321Telemetria" +#define TR_MENU_TELEMETRY "\321Telemetría" #define TR_MENU_DISPLAY "MONITOR" #define TR_MENU_OTHER "Otros" #define TR_MENU_INVERT "Invertir" #define TR_JITTER_FILTER "Filtro ADC" #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltaje") -#define TR_AUTH_FAILURE "Fallo " LCDW_128_480_LINEBREAK "autentificacion" +#define TR_AUTH_FAILURE "Fallo " LCDW_128_480_LINEBREAK "autentificación" #define ZSTR_FLR "FLR" #define ZSTR_RSSI "RSSI" diff --git a/radio/util/font2png.py b/radio/util/font2png.py index e734cc0a6..169b6b63f 100755 --- a/radio/util/font2png.py +++ b/radio/util/font2png.py @@ -10,7 +10,7 @@ chars_en = u""" !"#$%&'()*+,-./0123456789:;<=>?°ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ chars_fr = u"""éèàîç""" chars_de = u"""ÄäÖöÜüß""" chars_cz = u"""ěščřžýáíéňóůúďťĚŠČŘŽÝÁÍÉŇÓÚŮĎŤ""" -chars_es = u"""Ññ""" +chars_es = u"""ÑñÁáÉéÍíÓóÚú""" chars_fi = u"""åäöÅÄÖ""" chars_it = u"""àù""" chars_pl = u"""ąćęłńóśżźĄĆĘŁŃÓŚŻŹ""" @@ -19,7 +19,7 @@ chars_pt = u"""ÁáÂâÃãÀàÇçÉéÊêÍíÓóÔôÕõÚú""" COUNT_EXTRA_CHARS = 21 chars_extra = u"".join([chr(1+i) for i in range(COUNT_EXTRA_CHARS)]) -chars = chars_en + chars_extra + chars_fr + chars_de + chars_cz + chars_es + chars_fi + chars_it + chars_pl +chars = chars_en + chars_extra + chars_fr + chars_de + chars_cz + chars_es + chars_fi + chars_it + chars_pl + chars_pt def createFontBitmap(filename, fontname, fontsize, fontoffset, foreground, background, coordsfile=True): diff --git a/radio/util/translate.py b/radio/util/translate.py index 53e113ca7..58525c969 100755 --- a/radio/util/translate.py +++ b/radio/util/translate.py @@ -70,7 +70,17 @@ translations = {'cz_reduced': [('\\200', u'á'), ('\\206', u'ß')], 'es': [('\\200', u'Ñ'), - ('\\201', u'ñ')], + ('\\201', u'ñ'), + ('\\202', u'Á'), + ('\\203', u'á'), + ('\\204', u'É'), + ('\\205', u'é'), + ('\\206', u'Í'), + ('\\207', u'í'), + ('\\210', u'Ó'), + ('\\211', u'ó'), + ('\\212', u'Ú'), + ('\\213', u'ú')], 'fi': [('\\200', u'å'), ('\\201', u'ä'), From 587c2dc446e20f0ed3546b1acb169d8a59d22294 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 27 Apr 2020 12:16:43 +0200 Subject: [PATCH 288/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index a016b2c53..9f1724afe 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1719,3 +1719,4 @@ Karl Vetter Johannes Janssen François Blondé Precision Aero +Thomas Håkansson From c6ba94ef0632f781e5c399f353f85743f9f31689 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 27 Apr 2020 18:45:53 +0200 Subject: [PATCH 289/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 9f1724afe..e9d8c12cc 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1720,3 +1720,4 @@ Johannes Janssen François Blondé Precision Aero Thomas Håkansson +Gordon Evans From 38fea6b0a681cdb40a21c4720bcc0ae2a3ef3123 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 27 Apr 2020 23:15:49 +0200 Subject: [PATCH 290/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index e9d8c12cc..a26afc3f6 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1721,3 +1721,4 @@ François Blondé Precision Aero Thomas Håkansson Gordon Evans +Benny Simonsen From 50508ba35de8aac96062f5146115f944a1f40d28 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 28 Apr 2020 08:28:50 +0200 Subject: [PATCH 291/560] Fix touch panel on TX16S --- radio/src/targets/horus/tp_gt911.h | 372 +++++++++++++++-------------- 1 file changed, 188 insertions(+), 184 deletions(-) diff --git a/radio/src/targets/horus/tp_gt911.h b/radio/src/targets/horus/tp_gt911.h index aa35d468f..c09f62dae 100644 --- a/radio/src/targets/horus/tp_gt911.h +++ b/radio/src/targets/horus/tp_gt911.h @@ -37,192 +37,196 @@ void gt911ReadRegister(uint16_t reg, uint8_t * buf, uint8_t len); void touchPanelRead(); #define GT911_MAX_TP 5 -#define GT911_CFG_NUMER 0x69 +#define GT911_CFG_NUMER 0x6A //GT911 param table -const uint8_t GT911_Cfg[]= - { - GT911_CFG_NUMER, // 0x8047 Config version - 0xE0,0x01, // 0x8048 X output map : x 480 - 0x10,0x01, // 0x804A Y ouptut max : y 272 - GT911_MAX_TP, // 0x804C Touch number : GT911_MAX_TP - 0x38, // 0x804D Module switch 1 : bit4= xy change Int mode - 0x00, // 0x804E Module switch 2 - 0x02, // 0x804F Shake_Count - 0x48, // 0x8050 Filter - 0x28, // 0x8051 Larger touch - 0x0D, // 0x8052 Noise reduction - 0x50, // 0x8053 Screen touch level - 0x32, // 0x8054 Screen touch leave - 0x03, // 0x8055 Low power control - 0x05, // 0x8056 Refresh rate - 0x00, // 0x8057 X threshold - 0x00, // 0x8058 Y threshold - 0x00, // 0x8059 Reserved - 0x00, // 0x805A Reserved - 0x00, // 0x805B Space (top, bottom) - 0x00, // 0x805C Space (left, right) - 0x00, // 0x805D Mini filter - 0x18, // 0x805E Strech R0 - 0x1A, // 0x805F Strech R1 - 0x1E, // 0x8060 Strech R2 - 0x14, // 0x8061 Strech RM - 0x8A, // 0x8062 Drv groupA num - 0x2A, // 0x8063 Drv groupB num - 0x0C, // 0x8064 Sensor num - 0x30, // 0x8065 FreqA factor - 0x38, // 0x8066 FreqB factor - 0x31,0x0D, // 0x8067 Panel bit freq - 0x00,0x00, // 0x8069 Reserved - 0x02, // 0x806B Panel tx gain - 0xB9, // 0x806C Panel rx gain - 0x03, // 0x806D Panel dump shift - 0x2D, // 0x806E Drv frame control - 0x00, // 0x806F Charging level up - 0x00, // 0x8070 Module switch 3 - 0x00, // 0x8071 Gesture distance - 0x00, // 0x8072 Gesture long press time - 0x00, // 0x8073 X/Y slope adjust - 0x03, // 0x8074 Gesture control - 0x64, // 0x8075 Gesture switch 1 - 0x32, // 0x8076 Gesture switch 2 - 0x00, // 0x8077 Gesture refresh rate - 0x00, // 0x8078 Gesture touch level - 0x00, // 0x8079 New green wake up level - 0x1D, // 0x807A Freq hopping start - 0x41, // 0x807B Freq hopping end - 0x94, // 0x807C Noise detect time - 0xC5, // 0x807D Hopping flag - 0x02, // 0x807E Hopping flag - 0x07, // 0x807F Noise threshold - 0x00, // 0x8080 Nois min threshold old - 0x00, // 0x8081 Reserved - 0x04, // 0x8082 Hopping sensor group - 0xA5, // 0x8083 Hopping Seg1 normalize - 0x1F, // 0x8084 Hopping Seg1 factor - 0x00, // 0x8085 Main clock adjust - 0x94, // 0x8086 Hopping Seg2 normalize - 0x25, // 0x8087 Hopping Seg2 factor - 0x00, // 0x8088 Reserved - 0x88, // 0x8089 Hopping Seg3 normalize - 0x2B, // 0x808A Hopping Seg3 factor - 0x00, // 0x808B Reserved - 0x7D, // 0x808C Hopping Seg4 normalize - 0x33, // 0x808D Hopping Seg4 factor - 0x00, // 0x808E Reserved - 0x74, // 0x808F Hopping Seg5 normalize - 0x3C, // 0x8090 Hopping Seg5 factor - 0x00, // 0x8091 Reserved - 0x74, // 0x8092 Hopping Seg6 normalize - 0x00, // 0x8093 Key1 - 0x00, // 0x8094 Key2 - 0x00, // 0x8095 Key3 - 0x00, // 0x8096 Key4 - 0x00, // 0x8097 Key area - 0x00, // 0x8098 Key touch level - 0x00, // 0x8099 Key leave level - 0x00, // 0x809A Key sens - 0x00, // 0x809B Key sens - 0x00, // 0x809C Key restrain - 0x00, // 0x809D Key restrain time - 0x00, // 0x809E Large gesture touch - 0x00, // 0x809F Reserved - 0x00, // 0x80A0 Reserved - 0x00, // 0x80A1 Hotknot noise map - 0x00, // 0x80A2 Link threshold - 0x00, // 0x80A3 Pxy threshold - 0x00, // 0x80A4 GHot dump shift - 0x00, // 0x80A5 GHot rx gain - 0x00, // 0x80A6 Freg gain - 0x00, // 0x80A7 Freg gain 1 - 0x00, // 0x80A8 Freg gain 2 - 0x00, // 0x80A9 Freg gain 3 - 0x00, // 0x80AA Reserved - 0x00, // 0x80AB Reserved - 0x00, // 0x80AC Reserved - 0x00, // 0x80AD Reserved - 0x00, // 0x80AE Reserved - 0x00, // 0x80AF Reserved - 0x00, // 0x80B0 Reserved - 0x00, // 0x80B1 Reserved - 0x00, // 0x80B2 Reserved - 0x00, // 0x80B3 Combine dis - 0x00, // 0x80B4 Split set - 0x00, // 0x80B5 Reserved - 0x00, // 0x80B6 Reserved - 0x18, // 0x80B7 Sensor CH0 - 0x16, // 0x80B8 Sensor CH1 - 0x14, // 0x80B9 Sensor CH2 - 0x12, // 0x80BA Sensor CH3 - 0x10, // 0x80BB Sensor CH4 - 0x0E, // 0x80BC Sensor CH5 - 0x0C, // 0x80BD Sensor CH6 - 0x0A, // 0x80BE Sensor CH7 - 0x08, // 0x80BF Sensor CH8 - 0x06, // 0x80C0 Sensor CH9 - 0x04, // 0x80C1 Sensor CH10 - 0x02, // 0x80C2 Sensor CH11 - 0xFF, // 0x80C3 Sensor CH12 - 0xFF, // 0x80C4 Sensor CH13 - 0x00, // 0x80C5 Reserved - 0x00, // 0x80C6 Reserved - 0x00, // 0x80C7 Reserved - 0x00, // 0x80C8 Reserved - 0x00, // 0x80C9 Reserved - 0x00, // 0x80CA Reserved - 0x00, // 0x80CB Reserved - 0x00, // 0x80CC Reserved - 0x00, // 0x80CD Reserved - 0x00, // 0x80CE Reserved - 0x00, // 0x80CF Reserved - 0x00, // 0x80D0 Reserved - 0x00, // 0x80D1 Reserved - 0x00, // 0x80D2 Reserved - 0x00, // 0x80D3 Reserved - 0x00, // 0x80D4 Reserved - 0x24, // 0x80D5 Driver CH0 - 0x22, // 0x80D6 Driver CH1 - 0x21, // 0x80D7 Driver CH2 - 0x20, // 0x80D8 Driver CH3 - 0x1F, // 0x80D9 Driver CH4 - 0x1E, // 0x80DA Driver CH5 - 0x1D, // 0x80DB Driver CH6 - 0x1C, // 0x80DC Driver CH7 - 0x18, // 0x80DD Driver CH8 - 0x16, // 0x80DE Driver CH9 - 0x13, // 0x80DF Driver CH10 - 0x12, // 0x80E0 Driver CH11 - 0x10, // 0x80E1 Driver CH12 - 0x0F, // 0x80E2 Driver CH13 - 0x0A, // 0x80E3 Driver CH14 - 0x08, // 0x80E4 Driver CH15 - 0x06, // 0x80E5 Driver CH16 - 0x04, // 0x80E6 Driver CH17 - 0x02, // 0x80E7 Driver CH18 - 0x00, // 0x80E8 Driver CH19 - 0xFF, // 0x80E9 Driver CH20 - 0xFF, // 0x80EA Driver CH21 - 0xFF, // 0x80EB Driver CH22 - 0xFF, // 0x80EC Driver CH23 - 0xFF, // 0x80ED Driver CH24 - 0xFF, // 0x80EE Driver CH25 - 0x00, // 0x80EF Reserved - 0x00, // 0x80F0 Reserved - 0x00, // 0x80F1 Reserved - 0x00, // 0x80F2 Reserved - 0x00, // 0x80F3 Reserved - 0x00, // 0x80F4 Reserved - 0x00, // 0x80F5 Reserved - 0x00, // 0x80F6 Reserved - 0x00, // 0x80F7 Reserved - 0x00, // 0x80F8 Reserved - 0x00, // 0x80F9 Reserved - 0x00, // 0x80FA Reserved - 0x00, // 0x80FB Reserved - 0x00, // 0x80FC Reserved - 0x00, // 0x80FD Reserved - 0x00, // 0x80FE Reserved - }; +const uint8_t GT911_Cfg[] = +{ + GT911_CFG_NUMER, // 0x8047 Config version + 0xE0, // 0x8048 X output map : x 480 + 0x01, + 0x10, // 0x804A Y ouptut max : y 272 + 0x01, + GT911_MAX_TP, // 0x804C Touch number + 0x3C, // 0x804D Module switch 1 : bit4= xy change Int mode + 0x20, // 0x804E Module switch 2 + 0x22, // 0x804F Shake_Count + 0x0A, // 0x8050 Filter + 0x28, // 0x8051 Larger touch + 0x0F, // 0x8052 Noise reduction + 0x5A, // 0x8053 Screen touch level + 0x3C, // 0x8054 Screen touch leave + 0x03, // 0x8055 Low power control + 0x05, // 0x8056 Refresh rate + 0x00, // 0x8057 X threshold + 0x00, // 0x8058 Y threshold + 0x00, // 0x8059 Reserved + 0x00, // 0x805A Reserved + 0x11, // 0x805B Space (top, bottom) + 0x11, // 0x805C Space (left, right) + 0x08, // 0x805D Mini filter + 0x18, // 0x805E Strech R0 + 0x1A, // 0x805F Strech R1 + 0x1E, // 0x8060 Strech R2 + 0x14, // 0x8061 Strech RM + 0x87, // 0x8062 Drv groupA num + 0x29, // 0x8063 Drv groupB num + 0x0A, // 0x8064 Sensor num + 0xCF, // 0x8065 FreqA factor + 0xD1, // 0x8066 FreqB factor + 0xB2, // 0x8067 Panel bit freq + 0x04, + 0x00, // 0x8069 Reserved + 0x00, + 0x00, // 0x806B Panel tx gain + 0xD8, // 0x806C Panel rx gain + 0x02, // 0x806D Panel dump shift + 0x1D, // 0x806E Drv frame control + 0x00, // 0x806F Charging level up + 0x01, // 0x8070 Module switch 3 + 0x00, // 0x8071 Gesture distance + 0x00, // 0x8072 Gesture long press time + 0x00, // 0x8073 X/Y slope adjust + 0x00, // 0x8074 Gesture control + 0x00, // 0x8075 Gesture switch 1 + 0x00, // 0x8076 Gesture switch 2 + 0x00, // 0x8077 Gesture refresh rate + 0x00, // 0x8078 Gesture touch level + 0x00, // 0x8079 New green wake up level + 0xB4, // 0x807A Freq hopping start + 0xEF, // 0x807B Freq hopping end + 0x94, // 0x807C Noise detect time + 0xD5, // 0x807D Hopping flag + 0x02, // 0x807E Hopping flag + 0x07, // 0x807F Noise threshold + 0x00, // 0x8080 Nois min threshold old + 0x00, // 0x8081 Reserved + 0x04, // 0x8082 Hopping sensor group + 0x6E, // 0x8083 Hopping Seg1 normalize + 0xB9, // 0x8084 Hopping Seg1 factor + 0x00, // 0x8085 Main clock adjust + 0x6A, // 0x8086 Hopping Seg2 normalize + 0xC4, // 0x8087 Hopping Seg2 factor + 0x00, // 0x8088 Reserved + 0x66, // 0x8089 Hopping Seg3 normalize + 0xCF, // 0x808A Hopping Seg3 factor + 0x00, // 0x808B Reserved + 0x62, // 0x808C Hopping Seg4 normalize + 0xDB, // 0x808D Hopping Seg4 factor + 0x00, // 0x808E Reserved + 0x5E, // 0x808F Hopping Seg5 normalize + 0xE8, // 0x8090 Hopping Seg5 factor + 0x00, // 0x8091 Reserved + 0x5E, // 0x8092 Hopping Seg6 normalize + 0x00, // 0x8093 Key1 + 0x00, // 0x8094 Key2 + 0x00, // 0x8095 Key3 + 0x00, // 0x8096 Key4 + 0x00, // 0x8097 Key area + 0x00, // 0x8098 Key touch level + 0x00, // 0x8099 Key leave level + 0x00, // 0x809A Key sens + 0x00, // 0x809B Key sens + 0x00, // 0x809C Key restrain + 0x00, // 0x809D Key restrain time + 0x00, // 0x809E Large gesture touch + 0x00, // 0x809F Reserved + 0x00, // 0x80A0 Reserved + 0x00, // 0x80A1 Hotknot noise map + 0x00, // 0x80A2 Link threshold + 0x00, // 0x80A3 Pxy threshold + 0x00, // 0x80A4 GHot dump shift + 0x00, // 0x80A5 GHot rx gain + 0x00, // 0x80A6 Freg gain + 0x00, // 0x80A7 Freg gain 1 + 0x00, // 0x80A8 Freg gain 2 + 0x00, // 0x80A9 Freg gain 3 + 0x00, // 0x80AA Reserved + 0x00, // 0x80AB Reserved + 0x00, // 0x80AC Reserved + 0x00, // 0x80AD Reserved + 0x00, // 0x80AE Reserved + 0x00, // 0x80AF Reserved + 0x00, // 0x80B0 Reserved + 0x00, // 0x80B1 Reserved + 0x00, // 0x80B2 Reserved + 0x00, // 0x80B3 Combine dis + 0x00, // 0x80B4 Split set + 0x00, // 0x80B5 Reserved + 0x00, // 0x80B6 Reserved + 0x14, // 0x80B7 Sensor CH0 + 0x12, // 0x80B8 Sensor CH1 + 0x10, // 0x80B9 Sensor CH2 + 0x0E, // 0x80BA Sensor CH3 + 0x0C, // 0x80BB Sensor CH4 + 0x0A, // 0x80BC Sensor CH5 + 0x08, // 0x80BD Sensor CH6 + 0x06, // 0x80BE Sensor CH7 + 0x04, // 0x80BF Sensor CH8 + 0x02, // 0x80C0 Sensor CH9 + 0xFF, // 0x80C1 Sensor CH10 + 0xFF, // 0x80C2 Sensor CH11 + 0xFF, // 0x80C3 Sensor CH12 + 0xFF, // 0x80C4 Sensor CH13 + 0x00, // 0x80C5 Reserved + 0x00, // 0x80C6 Reserved + 0x00, // 0x80C7 Reserved + 0x00, // 0x80C8 Reserved + 0x00, // 0x80C9 Reserved + 0x00, // 0x80CA Reserved + 0x00, // 0x80CB Reserved + 0x00, // 0x80CC Reserved + 0x00, // 0x80CD Reserved + 0x00, // 0x80CE Reserved + 0x00, // 0x80CF Reserved + 0x00, // 0x80D0 Reserved + 0x00, // 0x80D1 Reserved + 0x00, // 0x80D2 Reserved + 0x00, // 0x80D3 Reserved + 0x00, // 0x80D4 Reserved + 0x28, // 0x80D5 Driver CH0 + 0x26, // 0x80D6 Driver CH1 + 0x24, // 0x80D7 Driver CH2 + 0x22, // 0x80D8 Driver CH3 + 0x21, // 0x80D9 Driver CH4 + 0x20, // 0x80DA Driver CH5 + 0x1F, // 0x80DB Driver CH6 + 0x1E, // 0x80DC Driver CH7 + 0x1D, // 0x80DD Driver CH8 + 0x0C, // 0x80DE Driver CH9 + 0x0A, // 0x80DF Driver CH10 + 0x08, // 0x80E0 Driver CH11 + 0x06, // 0x80E1 Driver CH12 + 0x04, // 0x80E2 Driver CH13 + 0x02, // 0x80E3 Driver CH14 + 0x00, // 0x80E4 Driver CH15 + 0xFF, // 0x80E5 Driver CH16 + 0xFF, // 0x80E6 Driver CH17 + 0xFF, // 0x80E7 Driver CH18 + 0xFF, // 0x80E8 Driver CH19 + 0xFF, // 0x80E9 Driver CH20 + 0xFF, // 0x80EA Driver CH21 + 0xFF, // 0x80EB Driver CH22 + 0xFF, // 0x80EC Driver CH23 + 0xFF, // 0x80ED Driver CH24 + 0xFF, // 0x80EE Driver CH25 + 0x00, // 0x80EF Reserved + 0x00, // 0x80F0 Reserved + 0x00, // 0x80F1 Reserved + 0x00, // 0x80F2 Reserved + 0x00, // 0x80F3 Reserved + 0x00, // 0x80F4 Reserved + 0x00, // 0x80F5 Reserved + 0x00, // 0x80F6 Reserved + 0x00, // 0x80F7 Reserved + 0x00, // 0x80F8 Reserved + 0x00, // 0x80F9 Reserved + 0x00, // 0x80FA Reserved + 0x00, // 0x80FB Reserved + 0x00, // 0x80FC Reserved + 0x00, // 0x80FD Reserved + 0x00 // 0x80FE Reserved +}; //I2C #define GT_CMD_WR 0X28 //write From 6cf3fb51468d9522f4f784381427795acc1f8c79 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 28 Apr 2020 10:02:19 +0200 Subject: [PATCH 292/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index a26afc3f6..c3188bb7c 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1722,3 +1722,4 @@ Precision Aero Thomas Håkansson Gordon Evans Benny Simonsen +George Kennedy From 8b15a28a06636cef09ddd6e8051de26c07db507b Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 28 Apr 2020 10:32:55 +0200 Subject: [PATCH 293/560] Cosmetics --- radio/src/gui/480x272/radio_diaganas.cpp | 5 +++++ radio/src/targets/horus/tp_gt911.h | 18 +++++++++--------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/radio/src/gui/480x272/radio_diaganas.cpp b/radio/src/gui/480x272/radio_diaganas.cpp index b632bf00c..0df7ca1bf 100644 --- a/radio/src/gui/480x272/radio_diaganas.cpp +++ b/radio/src/gui/480x272/radio_diaganas.cpp @@ -21,6 +21,7 @@ #include "opentx.h" #if defined(RADIO_TX16S) #include "tp_gt911.h" +#include #endif constexpr coord_t LEFT_NAME_COLUMN = MENUS_MARGIN_LEFT; @@ -75,6 +76,10 @@ bool menuRadioDiagAnalogs(event_t event) lcdDrawNumber(lcdNextPos + 1, MENU_CONTENT_TOP + 7 * FH, touchState.x); lcdDrawText(lcdNextPos, MENU_CONTENT_TOP + 7 * FH, ", "); lcdDrawNumber(lcdNextPos + 1, MENU_CONTENT_TOP + 7 * FH, touchState.y); + coord_t x = limit(10, (coord_t)touchState.x, 469); // TODO remove, prevent an emergency crash when drawing on y 280 line + coord_t y = limit(7, (coord_t)touchState.y, 264); // TODO remove, prevent an emergency crash when drawing on y 280 line + lcdDrawLine(x - 10, y - 7, x + 10, y + 7, SOLID); + lcdDrawLine(x - 10, y + 7, x + 10, y - 7, SOLID); } #endif diff --git a/radio/src/targets/horus/tp_gt911.h b/radio/src/targets/horus/tp_gt911.h index c09f62dae..d1d250790 100644 --- a/radio/src/targets/horus/tp_gt911.h +++ b/radio/src/targets/horus/tp_gt911.h @@ -229,8 +229,8 @@ const uint8_t GT911_Cfg[] = }; //I2C -#define GT_CMD_WR 0X28 //write -#define GT_CMD_RD 0X29 //read +#define GT_CMD_WR 0X28 +#define GT_CMD_RD 0X29 #define SLAVE_Write_Address 0X28 @@ -238,14 +238,14 @@ const uint8_t GT911_Cfg[] = #define GT_CTRL_REG 0X8040 #define GT_CFGS_REG 0X8047 #define GT_CHECK_REG 0X80FF -#define GT_PID_REG 0X8140 //ID +#define GT_PID_REG 0X8140 -#define GT_GSTID_REG 0X814E // -#define GT_TP1_REG 0X8150 // -#define GT_TP2_REG 0X8158 // -#define GT_TP3_REG 0X8160 // -#define GT_TP4_REG 0X8168 // -#define GT_TP5_REG 0X8170 // +#define GT_GSTID_REG 0X814E +#define GT_TP1_REG 0X8150 +#define GT_TP2_REG 0X8158 +#define GT_TP3_REG 0X8160 +#define GT_TP4_REG 0X8168 +#define GT_TP5_REG 0X8170 #define GT911_READ_XY_REG 0x814E #define GT911_CLEARBUF_REG 0x814E From a53745d8fd9361b04ab144db14330a2598a03ce9 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 28 Apr 2020 11:05:43 +0200 Subject: [PATCH 294/560] Fix x10 video buffer protection --- radio/src/gui/480x272/lcd.cpp | 4 ++++ radio/src/gui/480x272/radio_diaganas.cpp | 6 ++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/radio/src/gui/480x272/lcd.cpp b/radio/src/gui/480x272/lcd.cpp index 6659e386b..9c6f48cdf 100644 --- a/radio/src/gui/480x272/lcd.cpp +++ b/radio/src/gui/480x272/lcd.cpp @@ -422,7 +422,11 @@ void lcdDrawPoint(coord_t x, coord_t y, LcdFlags att) { display_t * p = PIXEL_PTR(x, y); display_t color = lcdColorTable[COLOR_IDX(att)]; +#if defined(PCBX10) + if (p >= displayBuf) { // x10 screen is reversed, so overflow are happening the other way around +#else if (p < DISPLAY_END) { +#endif *p = color; } } diff --git a/radio/src/gui/480x272/radio_diaganas.cpp b/radio/src/gui/480x272/radio_diaganas.cpp index 0df7ca1bf..b269f8fc0 100644 --- a/radio/src/gui/480x272/radio_diaganas.cpp +++ b/radio/src/gui/480x272/radio_diaganas.cpp @@ -76,10 +76,8 @@ bool menuRadioDiagAnalogs(event_t event) lcdDrawNumber(lcdNextPos + 1, MENU_CONTENT_TOP + 7 * FH, touchState.x); lcdDrawText(lcdNextPos, MENU_CONTENT_TOP + 7 * FH, ", "); lcdDrawNumber(lcdNextPos + 1, MENU_CONTENT_TOP + 7 * FH, touchState.y); - coord_t x = limit(10, (coord_t)touchState.x, 469); // TODO remove, prevent an emergency crash when drawing on y 280 line - coord_t y = limit(7, (coord_t)touchState.y, 264); // TODO remove, prevent an emergency crash when drawing on y 280 line - lcdDrawLine(x - 10, y - 7, x + 10, y + 7, SOLID); - lcdDrawLine(x - 10, y + 7, x + 10, y - 7, SOLID); + lcdDrawLine(touchState.x - 10, touchState.y - 7, touchState.x + 10, touchState.y + 7, SOLID); + lcdDrawLine(touchState.x - 10, touchState.y + 7, touchState.x + 10, touchState.y - 7, SOLID); } #endif From 94b3811bbbf274b758df5d5250b5826dce96b486 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 28 Apr 2020 11:50:30 +0200 Subject: [PATCH 295/560] y is not x ! --- radio/src/gui/480x272/lcd.cpp | 2 +- radio/src/gui/480x272/radio_diaganas.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/src/gui/480x272/lcd.cpp b/radio/src/gui/480x272/lcd.cpp index 9c6f48cdf..e77fb66c5 100644 --- a/radio/src/gui/480x272/lcd.cpp +++ b/radio/src/gui/480x272/lcd.cpp @@ -423,7 +423,7 @@ void lcdDrawPoint(coord_t x, coord_t y, LcdFlags att) display_t * p = PIXEL_PTR(x, y); display_t color = lcdColorTable[COLOR_IDX(att)]; #if defined(PCBX10) - if (p >= displayBuf) { // x10 screen is reversed, so overflow are happening the other way around + if (p >= displayBuf && x < LCD_W) { // x10 screen is reversed, so overflow are happening the other way around #else if (p < DISPLAY_END) { #endif diff --git a/radio/src/gui/480x272/radio_diaganas.cpp b/radio/src/gui/480x272/radio_diaganas.cpp index b269f8fc0..70d769d18 100644 --- a/radio/src/gui/480x272/radio_diaganas.cpp +++ b/radio/src/gui/480x272/radio_diaganas.cpp @@ -76,8 +76,8 @@ bool menuRadioDiagAnalogs(event_t event) lcdDrawNumber(lcdNextPos + 1, MENU_CONTENT_TOP + 7 * FH, touchState.x); lcdDrawText(lcdNextPos, MENU_CONTENT_TOP + 7 * FH, ", "); lcdDrawNumber(lcdNextPos + 1, MENU_CONTENT_TOP + 7 * FH, touchState.y); - lcdDrawLine(touchState.x - 10, touchState.y - 7, touchState.x + 10, touchState.y + 7, SOLID); - lcdDrawLine(touchState.x - 10, touchState.y + 7, touchState.x + 10, touchState.y - 7, SOLID); + lcdDrawLine(touchState.x - 10, touchState.y - 8, touchState.x + 10, touchState.y + 8, SOLID); + lcdDrawLine(touchState.x - 10, touchState.y + 8, touchState.x + 10, touchState.y - 8, SOLID); } #endif From 7ee5b1d0249ccd19d37032fcbac3fb8ac2710017 Mon Sep 17 00:00:00 2001 From: Kilrah Date: Tue, 28 Apr 2020 11:59:18 +0200 Subject: [PATCH 296/560] Set SD card version to 26 becasue of already produced cards --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f0011a7aa..b2762bf4b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ set(VERSION_REVISION "8") set(VERSION_SUFFIX $ENV{OPENTX_VERSION_SUFFIX}) set(VERSION_FAMILY ${VERSION_MAJOR}.${VERSION_MINOR}) set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}${VERSION_SUFFIX}) -set(SDCARD_REVISION "0027") +set(SDCARD_REVISION "0026") set(SDCARD_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}V${SDCARD_REVISION}) cmake_minimum_required(VERSION 2.8) From be2c10c6cc0be86c4b5148890c241a528ad4b489 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 28 Apr 2020 13:54:09 +0200 Subject: [PATCH 297/560] Cosmetics --- CMakeLists.txt | 2 +- radio/src/dataconstants.h | 5 ++++- radio/src/gui/480x272/radio_diaganas.cpp | 2 +- radio/src/gui/480x272/radio_hardware.cpp | 12 ++++-------- radio/src/targets/horus/tp_gt911.cpp | 13 ++++++------- radio/src/targets/horus/tp_gt911.h | 16 ++++++++-------- radio/src/translations.cpp | 3 +-- radio/src/translations.h | 3 +-- radio/src/translations/cz.h.txt | 3 +-- radio/src/translations/de.h.txt | 3 +-- radio/src/translations/en.h.txt | 3 +-- radio/src/translations/es.h.txt | 3 +-- radio/src/translations/fi.h.txt | 3 +-- radio/src/translations/fr.h.txt | 3 +-- radio/src/translations/it.h.txt | 3 +-- radio/src/translations/nl.h.txt | 3 +-- radio/src/translations/pl.h.txt | 3 +-- radio/src/translations/pt.h.txt | 3 +-- radio/src/translations/se.h.txt | 3 +-- 19 files changed, 37 insertions(+), 52 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b2762bf4b..f0011a7aa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ set(VERSION_REVISION "8") set(VERSION_SUFFIX $ENV{OPENTX_VERSION_SUFFIX}) set(VERSION_FAMILY ${VERSION_MAJOR}.${VERSION_MINOR}) set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}${VERSION_SUFFIX}) -set(SDCARD_REVISION "0026") +set(SDCARD_REVISION "0027") set(SDCARD_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}V${SDCARD_REVISION}) cmake_minimum_required(VERSION 2.8) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 65f12aa48..ceda80447 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -204,7 +204,10 @@ enum TrainerMode { enum ModuleIndex { EXTERNAL_MODULE, EXTRA_MODULE, - SPORT_MODULE + SPORT_MODULE, + TRAINER_MODE_MASTER_BLUETOOTH, + TRAINER_MODE_SLAVE_BLUETOOTH, + TRAINER_MODE_MULTI }; #endif diff --git a/radio/src/gui/480x272/radio_diaganas.cpp b/radio/src/gui/480x272/radio_diaganas.cpp index 70d769d18..e82b96a1c 100644 --- a/radio/src/gui/480x272/radio_diaganas.cpp +++ b/radio/src/gui/480x272/radio_diaganas.cpp @@ -68,7 +68,7 @@ bool menuRadioDiagAnalogs(event_t event) #if defined(HARDWARE_TOUCH) if (HAS_TOUCH_PANEL()) { - lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 7 * FH, "Touch panel:"); + lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 7 * FH, STR_TOUCH_PANEL); } if (touchPanelEvent) { diff --git a/radio/src/gui/480x272/radio_hardware.cpp b/radio/src/gui/480x272/radio_hardware.cpp index e50dcae33..291fcb7d7 100644 --- a/radio/src/gui/480x272/radio_hardware.cpp +++ b/radio/src/gui/480x272/radio_hardware.cpp @@ -412,14 +412,10 @@ bool menuRadioHardware(event_t event) lcdDrawText(HW_SETTINGS_COLUMN2, y, STR_ANALOGS_BTN, menuHorizontalPosition == 0 ? attr : 0); lcdDrawText(lcdNextPos + 10, y, STR_KEYS_BTN, menuHorizontalPosition == 1 ? attr : 0); if (attr && event == EVT_KEY_BREAK(KEY_ENTER)) { - switch (menuHorizontalPosition) { - case 0: - pushMenu(menuRadioDiagAnalogs); - break; - case 1: - pushMenu(menuRadioDiagKeys); - break; - } + if (menuHorizontalPosition == 0) + pushMenu(menuRadioDiagAnalogs); + else + pushMenu(menuRadioDiagKeys);break; } break; } diff --git a/radio/src/targets/horus/tp_gt911.cpp b/radio/src/targets/horus/tp_gt911.cpp index ffad5cc48..5c4929e95 100644 --- a/radio/src/targets/horus/tp_gt911.cpp +++ b/radio/src/targets/horus/tp_gt911.cpp @@ -42,7 +42,7 @@ uint8_t GT911_Send_Cfg(uint8_t mode) uint8_t buf[2]; uint8_t i = 0; buf[0] = 0; - buf[1] = mode; // + buf[1] = mode; for (i = 0; i < sizeof(GT911_Cfg); i++) buf[0] += GT911_Cfg[i];//check sum @@ -174,11 +174,10 @@ void I2C_Stop(void) uint8_t I2C_Wait_Ack(void) { uint8_t ucErrTime = 0; - SDA_IN(); // + SDA_IN(); I2C_SDA_H(); delay_us(2); - //I2C_SCL_L();delay_us(6); - I2C_SCL_H();//delay_us(6); + I2C_SCL_H(); while (READ_SDA) { ucErrTime++; if (ucErrTime > 166) { @@ -188,7 +187,7 @@ uint8_t I2C_Wait_Ack(void) delay_us(1); } I2C_SDA_L(); - I2C_SCL_L();// + I2C_SCL_L(); return 0; } @@ -219,7 +218,7 @@ void I2C_Send_Byte(uint8_t txd) uint8_t t; SDA_OUT(); - I2C_SCL_L();// + I2C_SCL_L(); for (t = 0; t < 8; t++) { if ((txd & 0x80) >> 7) I2C_SDA_H(); @@ -346,7 +345,7 @@ bool touchPanelInit(void) delay_ms(10); tmp[0] = 0X00; - gt911WriteRegister(GT_CTRL_REG, tmp, 1);//end reset + gt911WriteRegister(GT_CTRL_REG, tmp, 1); //end reset touchGT911Flag = true; TOUCH_AF_ExtiConfig(); diff --git a/radio/src/targets/horus/tp_gt911.h b/radio/src/targets/horus/tp_gt911.h index d1d250790..2b5f7d32c 100644 --- a/radio/src/targets/horus/tp_gt911.h +++ b/radio/src/targets/horus/tp_gt911.h @@ -248,14 +248,14 @@ const uint8_t GT911_Cfg[] = #define GT_TP5_REG 0X8170 #define GT911_READ_XY_REG 0x814E -#define GT911_CLEARBUF_REG 0x814E -#define GT911_CONFIG_REG 0x8047 -#define GT911_COMMAND_REG 0x8040 -#define GT911_PRODUCT_ID_REG 0x8140 -#define GT911_VENDOR_ID_REG 0x814A -#define GT911_CONFIG_VERSION_REG 0x8047 -#define GT911_CONFIG_CHECKSUM_REG 0x80FF -#define GT911_FIRMWARE_VERSION_REG 0x8144 +#define GT911_CLEARBUF_REG 0x814E +#define GT911_CONFIG_REG 0x8047 +#define GT911_COMMAND_REG 0x8040 +#define GT911_PRODUCT_ID_REG 0x8140 +#define GT911_VENDOR_ID_REG 0x814A +#define GT911_CONFIG_VERSION_REG 0x8047 +#define GT911_CONFIG_CHECKSUM_REG 0x80FF +#define GT911_FIRMWARE_VERSION_REG 0x8144 PACK(typedef struct { diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 0c0494055..4f43e33d1 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -215,7 +215,6 @@ const char STR_MENUSPECIALFUNCS[] = TR_MENUSPECIALFUNCS; const char STR_MENUVERSION[] = TR_MENUVERSION; const char STR_MENU_RADIO_SWITCHES[] = TR_MENU_RADIO_SWITCHES; const char STR_MENU_RADIO_ANALOGS[] = TR_MENU_RADIO_ANALOGS; -const char STR_MENU_RADIO_TOUCH[] = TR_MENU_RADIO_TOUCH; const char STR_MENUCALIBRATION[] = TR_MENUCALIBRATION; const char STR_MENUMODELSEL[] = TR_MENUMODELSEL; const char STR_MENUSETUP[] = TR_MENUSETUP; @@ -320,7 +319,6 @@ const char STR_MONITOR_SCREENS[] = TR_MONITOR_SCREENS; const char STR_RESET_BTN[] = TR_RESET_BTN; const char STR_DEBUG[] = TR_DEBUG; const char STR_KEYS_BTN[] = TR_KEYS_BTN; -const char STR_TOUCH_BTN[] = TR_TOUCH_BTN; const char STR_ANALOGS_BTN[] = TR_ANALOGS_BTN; const char STR_TOUCH_NOTFOUND[] = TR_TOUCH_NOTFOUND; const char STR_TOUCH_EXIT[] = TR_TOUCH_EXIT; @@ -592,6 +590,7 @@ const char STR_EXIT[] = TR_EXIT; const char STR_MODULE_RANGE[] = TR_MODULE_RANGE; const char STR_RECEIVER_OPTIONS[] = TR_RECEIVER_OPTIONS; const char STR_SPORT_UPDATE_POWER_MODE[] = TR_SPORT_UPDATE_POWER_MODE; +const char STR_TOUCH_PANEL[] = TR_TOUCH_PANEL; #if defined(PCBHORUS) const char STR_ASSIGN_SPLASH[] = TR_ASSIGN_SPLASH; diff --git a/radio/src/translations.h b/radio/src/translations.h index 3dfdac8af..6b0038118 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -169,6 +169,7 @@ extern const char STR_VSENSORTYPES[]; extern const char STR_VFORMULAS[]; extern const char STR_VPREC[]; extern const char STR_VCELLINDEX[]; +extern const char STR_TOUCH_PANEL[]; #if defined(BLUETOOTH) extern const char STR_BLUETOOTH[]; @@ -356,7 +357,6 @@ extern const char STR_MENUSPECIALFUNCS[]; extern const char STR_MENUVERSION[]; extern const char STR_MENU_RADIO_SWITCHES[]; extern const char STR_MENU_RADIO_ANALOGS[]; -extern const char STR_MENU_RADIO_TOUCH[]; extern const char STR_MENUCALIBRATION[]; extern const char STR_MENUMODELSEL[]; extern const char STR_MENUSETUP[]; @@ -496,7 +496,6 @@ extern const char STR_MONITOR_SCREENS[]; extern const char STR_RESET_BTN[]; extern const char STR_DEBUG[]; extern const char STR_KEYS_BTN[]; -extern const char STR_TOUCH_BTN[]; extern const char STR_ANALOGS_BTN[]; extern const char STR_TOUCH_NOTFOUND[]; extern const char STR_TOUCH_EXIT[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 40261da38..08ae06de2 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -590,7 +590,6 @@ #define TR_MENUVERSION "VERZE" #define TR_MENU_RADIO_SWITCHES "DIAG" #define TR_MENU_RADIO_ANALOGS "ANALOGY" -#define TR_MENU_RADIO_TOUCH "TOUCHSCREEN TEST" #define TR_MENUCALIBRATION "KALIBRACE" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trimy => Subtrimy" @@ -917,7 +916,6 @@ #define TR_RESET_BTN BUTTON("Reset") #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Přepínače")) -#define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogy")) #define TR_TOUCH_NOTFOUND "Touch hardware not found" #define TR_TOUCH_EXIT "Touch screen to exit" @@ -994,6 +992,7 @@ #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " #define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens" +#define TR_TOUCH_PANEL "Touch panel:" // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Název" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index c946b8fb6..62478e7ed 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -594,7 +594,6 @@ #define TR_MENUVERSION "VERSION" #define TR_MENU_RADIO_SWITCHES TR("Schalter-Test", "Schalter-Test") #define TR_MENU_RADIO_ANALOGS "Geber-Test" -#define TR_MENU_RADIO_TOUCH "TOUCHSCREEN TEST" #define TR_MENUCALIBRATION TR("KALIB. ANALOG", "KALIBRIERUNG-Analog") #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Subtrims" @@ -919,7 +918,6 @@ #define TR_RESET_BTN BUTTON("Reset") #define TR_DEBUG "Testen" #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) -#define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) #define TR_TOUCH_NOTFOUND "Touch hardware not found" #define TR_TOUCH_EXIT "Touch screen to exit" @@ -1000,6 +998,7 @@ #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " #define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens" +#define TR_TOUCH_PANEL "Touch panel:" // Horus and Taranis specific column headers #define TR_PHASES_HEADERS_NAME "Name " diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 359598005..72363c477 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -593,7 +593,6 @@ #define TR_MENUVERSION "VERSION" #define TR_MENU_RADIO_SWITCHES TR("SWITCHES", "SWITCHES TEST") #define TR_MENU_RADIO_ANALOGS TR("ANALOGS", "ANALOGS TEST") -#define TR_MENU_RADIO_TOUCH "TOUCHSCREEN TEST" #define TR_MENUCALIBRATION "CALIBRATION" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Subtrims" @@ -918,7 +917,6 @@ #define TR_RESET_BTN BUTTON("Reset") #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("Keys", "Switches")) -#define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Anas", "Analogs")) #define TR_TOUCH_NOTFOUND "Touch hardware not found" #define TR_TOUCH_EXIT "Touch screen to exit" @@ -999,6 +997,7 @@ #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " #define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens" +#define TR_TOUCH_PANEL "Touch panel:" // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Name" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 3fbe10531..b022314fa 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -587,7 +587,6 @@ #define TR_MENU_RADIO_SWITCHES TR("INTERUPTS", "TEST INTERRUPTORES") #define TR_MENU_RADIO_ANALOGS TR("ANALÓGICOS", "TEST ANALÓGICOS") #define TR_MENUCALIBRATION "CALIBRACIÓN" -#define TR_MENU_RADIO_TOUCH "TOUCHSCREEN TEST" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Offsets" #else @@ -920,7 +919,6 @@ #define TR_RESET_BTN "[Reset]" #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) -#define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) #define TR_TOUCH_NOTFOUND "Touch hardware not found" #define TR_TOUCH_EXIT "Touch screen to exit" @@ -998,6 +996,7 @@ #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " #define TR_NO_TELEMETRY_SCREENS TR("No hay pant. telemetría", "No hay pantallas de telemetría") +#define TR_TOUCH_PANEL "Touch panel:" // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Nombre" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 9ef39befe..afaef5c33 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -602,7 +602,6 @@ #define TR_MENUVERSION "VERSION" #define TR_MENU_RADIO_SWITCHES TR("SWITCHES","SWITCH TEST") #define TR_MENU_RADIO_ANALOGS TR("ANAS","ANALOG INPUTS") -#define TR_MENU_RADIO_TOUCH "TOUCHSCREEN TEST" #define TR_MENUCALIBRATION "CALIBRATION" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Subtrims" @@ -936,7 +935,6 @@ #define TR_RESET_BTN "[Reset]" #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) -#define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) #define TR_TOUCH_NOTFOUND "Touch hardware not found" #define TR_TOUCH_EXIT "Touch screen to exit" @@ -1013,6 +1011,7 @@ #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " #define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens" +#define TR_TOUCH_PANEL "Touch panel:" // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Name" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 49876e791..422205dd5 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -613,7 +613,6 @@ #define TR_MENUVERSION "VERSION" #define TR_MENU_RADIO_SWITCHES TR("INTERS", "TEST INTERRUPTEURS") #define TR_MENU_RADIO_ANALOGS TR("ANAS", "ENTREES ANALOGIQUES") -#define TR_MENU_RADIO_TOUCH "TOUCHSCREEN TEST" #define TR_MENUCALIBRATION "CALIBRATION" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Subtrims" @@ -938,7 +937,6 @@ #define TR_RESET_BTN BUTTON("RAZ") #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("Btns","Inters")) -#define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Anas", "Analogs")) #define TR_TOUCH_NOTFOUND "Touch hardware not found" #define TR_TOUCH_EXIT "Touch screen to exit" @@ -1023,6 +1021,7 @@ #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " #define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens" +#define TR_TOUCH_PANEL "Touch panel:" // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Nom" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 9151ec531..750f77a7c 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -612,7 +612,6 @@ #define TR_MENUVERSION "VERSIONE" #define TR_MENU_RADIO_SWITCHES "DIAG" #define TR_MENU_RADIO_ANALOGS "ANAS" -#define TR_MENU_RADIO_TOUCH "TOUCHSCREEN TEST" #define TR_MENUCALIBRATION "CALIBRAZIONE" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Subtrims" @@ -938,7 +937,6 @@ #define TR_RESET_BTN "[Reset]" #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Interruttori")) -#define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Analogico","Analogici")) #define TR_TOUCH_NOTFOUND "Touch hardware not found" #define TR_TOUCH_EXIT "Touch screen to exit" @@ -1015,6 +1013,7 @@ #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " #define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens" +#define TR_TOUCH_PANEL "Touch panel:" // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Nome" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 9acf7e8a8..f36f75cf1 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -597,7 +597,6 @@ #define TR_MENUVERSION "VERSIE" #define TR_MENU_RADIO_SWITCHES TR("Schak.", "Schakelaar-Test") #define TR_MENU_RADIO_ANALOGS "Analoog-Test" -#define TR_MENU_RADIO_TOUCH "TOUCHSCREEN TEST" #define TR_MENUCALIBRATION TR("CALIB. ANALOOG", "CALIBRERING Sticks+Pots") #if defined(COLORLCD) @@ -924,7 +923,6 @@ #define TR_RESET_BTN "[Reset]" #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) -#define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) #define TR_TOUCH_NOTFOUND "Touch hardware not found" #define TR_TOUCH_EXIT "Touch screen to exit" @@ -1007,6 +1005,7 @@ #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " #define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens" +#define TR_TOUCH_PANEL "Touch panel:" // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Name" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 9904709c2..5fd59c2ec 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -611,7 +611,6 @@ #define TR_MENUVERSION "WERSJA" #define TR_MENU_RADIO_SWITCHES TR("PRZEŁ","TEST PRZEŁ") #define TR_MENU_RADIO_ANALOGS TR("WE-ANA","WEJŚCIA ANALOG.") -#define TR_MENU_RADIO_TOUCH "TOUCHSCREEN TEST" #define TR_MENUCALIBRATION "KALIBRACJA" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trymery => Subtrimy" @@ -937,7 +936,6 @@ #define TR_RESET_BTN "[Reset]" #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) -#define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) #define TR_TOUCH_NOTFOUND "Touch hardware not found" #define TR_TOUCH_EXIT "Touch screen to exit" @@ -1014,6 +1012,7 @@ #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " #define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens" +#define TR_TOUCH_PANEL "Touch panel:" // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Nazwa" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 62caa704c..857bc3c35 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -593,7 +593,6 @@ #define TR_MENUVERSION "VERSAO" #define TR_MENU_RADIO_SWITCHES "DIAGNOST" #define TR_MENU_RADIO_ANALOGS "ANALOGICOS" -#define TR_MENU_RADIO_TOUCH "TOUCHSCREEN TEST" #define TR_MENUCALIBRATION "CALIBRAGEM" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Subtrims" @@ -927,7 +926,6 @@ #define TR_RESET_BTN "[Reset]" #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) -#define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) #define TR_TOUCH_NOTFOUND "Touch hardware not found" #define TR_TOUCH_EXIT "Touch screen to exit" @@ -1004,6 +1002,7 @@ #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " #define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens" +#define TR_TOUCH_PANEL "Touch panel:" // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Name" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index cfc7ded9b..feff5f1d2 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -610,7 +610,6 @@ #define TR_MENUVERSION "VERSION" #define TR_MENU_RADIO_SWITCHES TR("BRYTARE","TEST AV BRYTARE") #define TR_MENU_RADIO_ANALOGS "ANALOGA VÄRDEN" -#define TR_MENU_RADIO_TOUCH "TOUCHSCREEN TEST" #define TR_MENUCALIBRATION "KALIBRERING" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "[Spara Trimvärden]" @@ -937,7 +936,6 @@ #define TR_RESET_BTN "[Nollställ]" #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) -#define TR_TOUCH_BTN BUTTON("Touch") #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) #define TR_TOUCH_NOTFOUND "Touch hardware not found" #define TR_TOUCH_EXIT "Touch screen to exit" @@ -1014,6 +1012,7 @@ #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " #define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens" +#define TR_TOUCH_PANEL "Touch panel:" // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Namn" From 512db24f3377d9dad3f61564890f3549e6b166a8 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 28 Apr 2020 13:59:39 +0200 Subject: [PATCH 298/560] Some tts fixes (#7547) --- radio/util/tts_en.py | 4 +++- radio/util/tts_fr.py | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/radio/util/tts_en.py b/radio/util/tts_en.py index e53cfd348..dff2e29dd 100755 --- a/radio/util/tts_en.py +++ b/radio/util/tts_en.py @@ -72,7 +72,9 @@ for s, f in [("trim center", "midtrim"), ("receiver still connected", "modelpwr"), ]: systemSounds.append((s, filename(f))) -for i, (s, f) in enumerate([("gear!, up!", "gearup"), +for i, (s, f) in enumerate([("armed", "armed"), + ("disarmed", "disarm"), + ("gear!, up!", "gearup"), ("gear!, down!", "geardn"), ("flaps!, up!", "flapup"), ("flaps!, down!", "flapdn"), diff --git a/radio/util/tts_fr.py b/radio/util/tts_fr.py index 736fef4c1..9dc046fa5 100755 --- a/radio/util/tts_fr.py +++ b/radio/util/tts_fr.py @@ -71,9 +71,11 @@ for s, f in [("Trim centré", "midtrim"), ("Récepteur encore sous tension", "modelpwr"), ]: systemSounds.append((s, filename(f))) -for i, (s, f) in enumerate([("altitude", "altitude"), +for i, (s, f) in enumerate([("armé", "armed"), + ("désarmé", "disarm"), + ("altitude", "alt"), ("température moteur", "moteur"), - ("température contrôleur", "cntrleur"), + ("température contrôleur", "tctrl"), ("train rentré", "gearup"), ("train sorti", "geardn"), ("volets rentrés", "flapup"), From 114fd2c4f3834b5fd58746d509b283e3c723fb39 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 28 Apr 2020 16:13:17 +0200 Subject: [PATCH 299/560] Better sky9x fix --- radio/src/dataconstants.h | 5 +---- radio/src/gui/gui_common.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index ceda80447..65f12aa48 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -204,10 +204,7 @@ enum TrainerMode { enum ModuleIndex { EXTERNAL_MODULE, EXTRA_MODULE, - SPORT_MODULE, - TRAINER_MODE_MASTER_BLUETOOTH, - TRAINER_MODE_SLAVE_BLUETOOTH, - TRAINER_MODE_MULTI + SPORT_MODULE }; #endif diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index 498c63a89..1ae1a45cc 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -739,12 +739,12 @@ bool isTrainerModeAvailable(int mode) return g_eeGeneral.auxSerialMode == UART_MODE_SBUS_TRAINER; #endif -#if !defined(BLUETOOTH) || defined(PCBX9E) - if (mode == TRAINER_MODE_MASTER_BLUETOOTH || mode == TRAINER_MODE_SLAVE_BLUETOOTH) - return false; -#else +#if defined(BLUETOOTH) && !defined(PCBX9E) if (g_eeGeneral.bluetoothMode != BLUETOOTH_TRAINER && (mode == TRAINER_MODE_MASTER_BLUETOOTH || mode == TRAINER_MODE_SLAVE_BLUETOOTH)) return false; +#elif !defined(PCBSKY9X) + if (mode == TRAINER_MODE_MASTER_BLUETOOTH || mode == TRAINER_MODE_SLAVE_BLUETOOTH) + return false; #endif #if defined(PCBXLITE) && !defined(PCBXLITES) From 3d9256e5558e2b434a43b8c8065bc79b928e2d1f Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 28 Apr 2020 16:50:24 +0200 Subject: [PATCH 300/560] Default AETR for Jumper radio too --- radio/src/opentx.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 5f89d258b..bcb696da8 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -295,7 +295,7 @@ void generalDefault() #if defined(FRSKY_RELEASE) g_eeGeneral.templateSetup = 17; /* TAER */ -#elif defined(RADIO_TX16S) //TODO : is RADIO_FAMILLY_T16 better ? +#elif defined(RADIO_FAMILY_T16) g_eeGeneral.templateSetup = 21; /* AETR to match bundled multi */ #endif From 92f9e79258113ec95065900986f7ed4452c81333 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 29 Apr 2020 10:02:54 +0200 Subject: [PATCH 301/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index c3188bb7c..2b5ef703f 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1723,3 +1723,4 @@ Thomas Håkansson Gordon Evans Benny Simonsen George Kennedy +Stefano Boggia From 5d0805c66556f8fe54c82381da20e35ea2a926b4 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 29 Apr 2020 12:05:25 +0200 Subject: [PATCH 302/560] Some improvements --- radio/src/gui/480x272/radio_diaganas.cpp | 2 +- radio/src/gui/480x272/radio_hardware.cpp | 2 +- radio/src/gui/480x272/topbar.cpp | 3 ++- radio/src/opentx.cpp | 10 +--------- radio/src/targets/horus/CMakeLists.txt | 7 +++++++ 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/radio/src/gui/480x272/radio_diaganas.cpp b/radio/src/gui/480x272/radio_diaganas.cpp index e82b96a1c..ae452f7ae 100644 --- a/radio/src/gui/480x272/radio_diaganas.cpp +++ b/radio/src/gui/480x272/radio_diaganas.cpp @@ -62,7 +62,7 @@ bool menuRadioDiagAnalogs(event_t event) #endif } -#if (NUM_PWMSTICKS > 0) || defined(SIMU) +#if defined(SIMU) || NUM_PWMSTICKS > 0 lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 8 * FH, STICKS_PWM_ENABLED() ? "Sticks: PWM" : "Sticks: ANA"); #endif diff --git a/radio/src/gui/480x272/radio_hardware.cpp b/radio/src/gui/480x272/radio_hardware.cpp index 291fcb7d7..37f81bed3 100644 --- a/radio/src/gui/480x272/radio_hardware.cpp +++ b/radio/src/gui/480x272/radio_hardware.cpp @@ -415,7 +415,7 @@ bool menuRadioHardware(event_t event) if (menuHorizontalPosition == 0) pushMenu(menuRadioDiagAnalogs); else - pushMenu(menuRadioDiagKeys);break; + pushMenu(menuRadioDiagKeys); } break; } diff --git a/radio/src/gui/480x272/topbar.cpp b/radio/src/gui/480x272/topbar.cpp index f14d9a237..81b1f643a 100644 --- a/radio/src/gui/480x272/topbar.cpp +++ b/radio/src/gui/480x272/topbar.cpp @@ -91,8 +91,9 @@ void drawTopBar() /* Tx battery */ uint8_t bars = GET_TXBATT_BARS(5); #if defined(USB_CHARGER) - if (usbChargerLed() && BLINK_ON_PHASE) + if (usbChargerLed() && BLINK_ON_PHASE) { lcdDrawBitmapPattern(LCD_W-130, 24, LBM_TOPMENU_TXBATT_CHARGING, MENU_TITLE_COLOR); + } else { #endif lcdDrawBitmapPattern(LCD_W - 130, 24, LBM_TOPMENU_TXBATT, MENU_TITLE_COLOR); diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index bcb696da8..eeb2d2ef2 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -293,11 +293,7 @@ void generalDefault() g_eeGeneral.stickMode = DEFAULT_MODE - 1; #endif -#if defined(FRSKY_RELEASE) - g_eeGeneral.templateSetup = 17; /* TAER */ -#elif defined(RADIO_FAMILY_T16) - g_eeGeneral.templateSetup = 21; /* AETR to match bundled multi */ -#endif + g_eeGeneral.templateSetup = DEFAULT_TEMPLATE_SETUP; g_eeGeneral.backlightMode = e_backlight_mode_all; g_eeGeneral.lightAutoOff = 2; @@ -324,11 +320,7 @@ void generalDefault() #endif #if defined(COLORLCD) -#if defined(RADIO_TX16S) - strcpy(g_eeGeneral.themeName, "Darkblue"); -#else strcpy(g_eeGeneral.themeName, theme->getName()); -#endif theme->init(); #endif diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index ba4052d48..b07230e4a 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -17,6 +17,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(DEFAULT_TEMPLATE_SETUP "0" CACHE STRING "Default channel order") # for size report script set(CPU_TYPE_FULL STM32F429xI) @@ -50,6 +51,7 @@ if (PCB STREQUAL X10) elseif (PCBREV STREQUAL T16) set(FLAVOUR t16) set(LUA_EXPORT lua_export_t16) + set(DEFAULT_TEMPLATE_SETUP 21) add_definitions(-DRADIO_T16) add_definitions(-DRADIO_FAMILY_T16) option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" OFF) @@ -57,6 +59,7 @@ if (PCB STREQUAL X10) elseif (PCBREV STREQUAL TX16S) set(FLAVOUR tx16s) set(LUA_EXPORT lua_export_t16) + set(DEFAULT_TEMPLATE_SETUP 21) add_definitions(-DRADIO_TX16S) add_definitions(-DRADIO_FAMILY_T16) option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" ON) @@ -139,6 +142,10 @@ if(INTERNAL_MODULE_MULTI) add_definitions(-DINTERNAL_MODULE_MULTI) endif() +if(NOT DEFAULT_TEMPLATE_SETUP STREQUAL "") + add_definitions(-DDEFAULT_TEMPLATE_SETUP=${DEFAULT_TEMPLATE_SETUP}) +endif() + include_directories(${RADIO_SRC_DIRECTORY}/fonts/480x272 gui/${GUI_DIR} gui/${GUI_DIR}/layouts) file(GLOB THEMES_SRC RELATIVE ${RADIO_SRC_DIRECTORY}/gui/480x272 ${RADIO_SRC_DIRECTORY}/gui/480x272/themes/*.cpp) From fe003a74d567b98c657518f2d4e3704df2c9885a Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 29 Apr 2020 15:48:36 +0200 Subject: [PATCH 303/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 2b5ef703f..743ed2b0b 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1724,3 +1724,4 @@ Gordon Evans Benny Simonsen George Kennedy Stefano Boggia +Maksym Arshynkin From 1eaf909bd4ab12c58a1f195d757c779a63eb51e1 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 29 Apr 2020 17:56:24 +0200 Subject: [PATCH 304/560] Some improvements --- radio/src/CMakeLists.txt | 7 +++++++ radio/src/targets/horus/CMakeLists.txt | 7 ------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 20852450c..96c9c622e 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -418,6 +418,13 @@ endif() set(SRC ${SRC} ${FIRMWARE_SRC}) +if(INTERNAL_MODULE_MULTI) + set(DEFAULT_TEMPLATE_SETUP 21 CACHE STRING "") +else() + set(DEFAULT_TEMPLATE_SETUP 0 CACHE STRING "") +endif() +message(STATUS "ICI ${INTERNAL_MODULE_MULTI} ${DEFAULT_TEMPLATE_SETUP}") +add_definitions(-DDEFAULT_TEMPLATE_SETUP=${DEFAULT_TEMPLATE_SETUP}) ##### firmware target ##### diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index b07230e4a..ba4052d48 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -17,7 +17,6 @@ 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(DEFAULT_TEMPLATE_SETUP "0" CACHE STRING "Default channel order") # for size report script set(CPU_TYPE_FULL STM32F429xI) @@ -51,7 +50,6 @@ if (PCB STREQUAL X10) elseif (PCBREV STREQUAL T16) set(FLAVOUR t16) set(LUA_EXPORT lua_export_t16) - set(DEFAULT_TEMPLATE_SETUP 21) add_definitions(-DRADIO_T16) add_definitions(-DRADIO_FAMILY_T16) option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" OFF) @@ -59,7 +57,6 @@ if (PCB STREQUAL X10) elseif (PCBREV STREQUAL TX16S) set(FLAVOUR tx16s) set(LUA_EXPORT lua_export_t16) - set(DEFAULT_TEMPLATE_SETUP 21) add_definitions(-DRADIO_TX16S) add_definitions(-DRADIO_FAMILY_T16) option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" ON) @@ -142,10 +139,6 @@ if(INTERNAL_MODULE_MULTI) add_definitions(-DINTERNAL_MODULE_MULTI) endif() -if(NOT DEFAULT_TEMPLATE_SETUP STREQUAL "") - add_definitions(-DDEFAULT_TEMPLATE_SETUP=${DEFAULT_TEMPLATE_SETUP}) -endif() - include_directories(${RADIO_SRC_DIRECTORY}/fonts/480x272 gui/${GUI_DIR} gui/${GUI_DIR}/layouts) file(GLOB THEMES_SRC RELATIVE ${RADIO_SRC_DIRECTORY}/gui/480x272 ${RADIO_SRC_DIRECTORY}/gui/480x272/themes/*.cpp) From b641906dd4d553ea1c96472ea23865d36756144a Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 29 Apr 2020 17:58:13 +0200 Subject: [PATCH 305/560] remove debug message --- radio/src/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 96c9c622e..7310b878a 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -423,7 +423,6 @@ if(INTERNAL_MODULE_MULTI) else() set(DEFAULT_TEMPLATE_SETUP 0 CACHE STRING "") endif() -message(STATUS "ICI ${INTERNAL_MODULE_MULTI} ${DEFAULT_TEMPLATE_SETUP}") add_definitions(-DDEFAULT_TEMPLATE_SETUP=${DEFAULT_TEMPLATE_SETUP}) ##### firmware target ##### From e3eb0d291f2c2354775b8be690c59a47c1aa5280 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 29 Apr 2020 18:08:38 +0200 Subject: [PATCH 306/560] Fix simu compilation --- radio/src/CMakeLists.txt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 7310b878a..989457f92 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -359,6 +359,13 @@ endif() add_definitions(-DPOPUP_LEVEL=${POPUP_LEVEL}) +if(INTERNAL_MODULE_MULTI) + set(DEFAULT_TEMPLATE_SETUP 21 CACHE STRING "") +else() + set(DEFAULT_TEMPLATE_SETUP 0 CACHE STRING "") +endif() +add_definitions(-DDEFAULT_TEMPLATE_SETUP=${DEFAULT_TEMPLATE_SETUP}) + set(SRC ${SRC} opentx.cpp @@ -418,13 +425,6 @@ endif() set(SRC ${SRC} ${FIRMWARE_SRC}) -if(INTERNAL_MODULE_MULTI) - set(DEFAULT_TEMPLATE_SETUP 21 CACHE STRING "") -else() - set(DEFAULT_TEMPLATE_SETUP 0 CACHE STRING "") -endif() -add_definitions(-DDEFAULT_TEMPLATE_SETUP=${DEFAULT_TEMPLATE_SETUP}) - ##### firmware target ##### option(FIRMWARE_TARGET "Configure Firmware target (can be turned of for compiling Companion only)" ON) From 6f35853fda4e4644f23b6649e95a2c506bf46cf6 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 29 Apr 2020 19:01:57 +0200 Subject: [PATCH 307/560] Change default theme for TX16s --- radio/src/gui/480x272/themes/darkblue.cpp | 5 ++++- radio/src/gui/480x272/themes/default.cpp | 4 +++- radio/src/targets/horus/CMakeLists.txt | 7 +++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/480x272/themes/darkblue.cpp b/radio/src/gui/480x272/themes/darkblue.cpp index bf244169e..05a8b2e1f 100644 --- a/radio/src/gui/480x272/themes/darkblue.cpp +++ b/radio/src/gui/480x272/themes/darkblue.cpp @@ -266,4 +266,7 @@ class DarkblueTheme: public Theme BitmapBuffer * DarkblueTheme::menuIconNormal[MENUS_ICONS_COUNT] = { NULL }; BitmapBuffer * DarkblueTheme::menuIconSelected[MENUS_ICONS_COUNT] = { NULL }; -const DarkblueTheme darkblueTheme; +DarkblueTheme darkblueTheme; +#if defined(DEFAULT_THEME_DARKBLUE) + Theme * theme = &darkblueTheme; +#endif \ No newline at end of file diff --git a/radio/src/gui/480x272/themes/default.cpp b/radio/src/gui/480x272/themes/default.cpp index 5ecd5bfbd..b90ccd1a2 100644 --- a/radio/src/gui/480x272/themes/default.cpp +++ b/radio/src/gui/480x272/themes/default.cpp @@ -353,4 +353,6 @@ BitmapBuffer * DefaultTheme::menuIconSelected[MENUS_ICONS_COUNT] = { NULL }; BitmapBuffer * DefaultTheme::currentMenuBackground = NULL; DefaultTheme defaultTheme; -Theme * theme = &defaultTheme; +#if defined(DEFAULT_THEME_DEFAULT) + Theme * theme = &defaultTheme; +#endif diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index ba4052d48..f45d79b3c 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -63,6 +63,7 @@ if (PCB STREQUAL X10) option(BLUETOOTH "Support for bluetooth module" OFF) set(HARDWARE_TOUCH YES) set(USB_CHARGER YES) + set(DEFAULT_THEME_DARKBLUE ON) if (NOT BLUETOOTH) set(AUX_SERIAL ON) endif() @@ -115,6 +116,12 @@ add_definitions(-DEEPROM_VARIANT=0 -DAUDIO -DVOICE -DRTCLOCK) add_definitions(-DGPS_USART_BAUDRATE=${INTERNAL_GPS_BAUDRATE}) add_definitions(-DPWR_BUTTON_${PWR_BUTTON}) +if(DEFAULT_THEME_DARKBLUE) + add_definitions(-DDEFAULT_THEME_DARKBLUE) +else() + add_definitions(-DDEFAULT_THEME_DEFAULT) +endif() + if(NOT UNEXPECTED_SHUTDOWN) add_definitions(-DNO_UNEXPECTED_SHUTDOWN) endif() From 5c25703142291a8340abf8d835abd62a8ea224a3 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 29 Apr 2020 20:05:29 +0200 Subject: [PATCH 308/560] Further improvements --- radio/src/targets/horus/CMakeLists.txt | 6 +++--- tools/build-frsky.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index f45d79b3c..a02abfa12 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -63,7 +63,7 @@ if (PCB STREQUAL X10) option(BLUETOOTH "Support for bluetooth module" OFF) set(HARDWARE_TOUCH YES) set(USB_CHARGER YES) - set(DEFAULT_THEME_DARKBLUE ON) + set(DEFAULT_THEME "DARKBLUE") if (NOT BLUETOOTH) set(AUX_SERIAL ON) endif() @@ -116,8 +116,8 @@ add_definitions(-DEEPROM_VARIANT=0 -DAUDIO -DVOICE -DRTCLOCK) add_definitions(-DGPS_USART_BAUDRATE=${INTERNAL_GPS_BAUDRATE}) add_definitions(-DPWR_BUTTON_${PWR_BUTTON}) -if(DEFAULT_THEME_DARKBLUE) - add_definitions(-DDEFAULT_THEME_DARKBLUE) +if(DEFAULT_THEME) + add_definitions(-DDEFAULT_THEME_${DEFAULT_THEME}) else() add_definitions(-DDEFAULT_THEME_DEFAULT) endif() diff --git a/tools/build-frsky.py b/tools/build-frsky.py index 3db1e97fb..e4478a2a8 100755 --- a/tools/build-frsky.py +++ b/tools/build-frsky.py @@ -134,7 +134,7 @@ def build(board, translation, srcdir): os.mkdir("output") path = tempfile.mkdtemp() os.chdir(path) - command = "cmake %s -DTRANSLATIONS=%s -DFRSKY_RELEASE=YES %s" % (cmake_options, translation, srcdir) + command = "cmake %s -DTRANSLATIONS=%s -DFRSKY_RELEASE=YES -DDEFAULT_TEMPLATE_SETUP=17 %s" % (cmake_options, translation, srcdir) print(command) os.system(command) os.system("make firmware -j6") From 0050820fda6212065a7a27a4dca47864441812d0 Mon Sep 17 00:00:00 2001 From: Kilrah Date: Wed, 29 Apr 2020 23:11:35 +0200 Subject: [PATCH 309/560] Missing flexr9m for TX16S --- companion/src/firmwares/opentx/opentxinterface.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index a8c38ff42..5c584eceb 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -1342,13 +1342,14 @@ void registerOpenTxFirmwares() addOpenTxFrskyOptions(firmware); firmware->addOption("internalmulti", Firmware::tr("Support for MULTI internal module")); firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module")); - registerOpenTxFirmware(firmware); addOpenTxRfOptions(firmware, FLEX); + registerOpenTxFirmware(firmware); /* Radiomaster TX16S board */ firmware = new OpenTxFirmware("opentx-tx16s", Firmware::tr("Radiomaster TX16s / TX16s Hall / TX16s Masterfire"), BOARD_RADIOMASTER_TX16S); addOpenTxFrskyOptions(firmware); firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module")); + addOpenTxRfOptions(firmware, FLEX); registerOpenTxFirmware(firmware); /* 9XR-Pro */ From 9a31901b7f461c9eb9cb7e58845800f6123a6833 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 30 Apr 2020 11:08:21 +0200 Subject: [PATCH 310/560] Fine tune TX16s MDL simu button --- companion/src/simulation/simulateduiwidgetTX16S.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/companion/src/simulation/simulateduiwidgetTX16S.cpp b/companion/src/simulation/simulateduiwidgetTX16S.cpp index db1d5fa8b..38cdde149 100644 --- a/companion/src/simulation/simulateduiwidgetTX16S.cpp +++ b/companion/src/simulation/simulateduiwidgetTX16S.cpp @@ -34,7 +34,7 @@ SimulatedUIWidgetTX16S::SimulatedUIWidgetTX16S(SimulatorInterface *simulator, QW // add actions in order of appearance on the help menu act = new RadioUiAction(3, QList() << Qt::Key_Up, SIMU_STR_HLP_KEY_UP, SIMU_STR_HLP_ACT_MDL); - addRadioWidget(ui->rightbuttons->addArea(QRect(10, 0, 80, 35), "TX16S/right_mdl.png", act)); + addRadioWidget(ui->rightbuttons->addArea(QRect(40, 0, 110, 35), "TX16S/right_mdl.png", act)); m_mouseMidClickAction = new RadioUiAction(2, QList() << Qt::Key_Enter << Qt::Key_Return, SIMU_STR_HLP_KEYS_ACTIVATE, SIMU_STR_HLP_ACT_ROT_DN); addRadioWidget(ui->rightbuttons->addArea(QRect(45, 70, 100, 160), "TX16S/right_ent.png", m_mouseMidClickAction)); From fa6dfb97c3ead05060e1b7f03a07c6c018ab7a4c Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 1 May 2020 11:36:04 +0200 Subject: [PATCH 311/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 743ed2b0b..fb4920d0d 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1725,3 +1725,4 @@ Benny Simonsen George Kennedy Stefano Boggia Maksym Arshynkin +Tomas Sodergren From 6af47e5488a66162f8ebb9585670d6f1fb13c047 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 1 May 2020 16:02:54 +0200 Subject: [PATCH 312/560] Fix doc links --- radio/src/lua/api_general.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index b750c7f16..06b11449c 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -694,7 +694,8 @@ The list of valid sources is available: |----------------|-------| | 2.0 | [all](http://downloads-20.open-tx.org/firmware/lua_fields.txt) | | 2.1 | [X9D and X9D+](http://downloads-21.open-tx.org/firmware/lua_fields_taranis.txt), [X9E](http://downloads-21.open-tx.org/firmware/lua_fields_taranis_x9e.txt) | -| 2.2 | [X9D and X9D+](http://downloads.open-tx.org/2.2/firmware/lua_fields_x9d.txt), [X9E](http://downloads.open-tx.org/2.2/firmware/lua_fields_x9e.txt), [Horus](http://downloads.open-tx.org/2.2/firmware/lua_fields_x12s.txt) | +| 2.2 | [X9D and X9D+](http://downloads.open-tx.org/2.2/release/firmware/lua_fields_x9d.txt), [X9E](http://downloads.open-tx.org/2.2/release/firmware/lua_fields_x9e.txt), [Horus](http://downloads.open-tx.org/2.2/release/firmware/lua_fields_x12s.txt) | +| 2.3 | [X9D and X9D+](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x9d.txt), [X9E](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x9e.txt), [X7](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x7.txt), [Horus](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x12s.txt) | @param name (string) name of the field @@ -741,8 +742,8 @@ The list of fixed sources: |----------------|-------| | 2.0 | [all](http://downloads-20.open-tx.org/firmware/lua_fields.txt) | | 2.1 | [X9D and X9D+](http://downloads-21.open-tx.org/firmware/lua_fields_taranis.txt), [X9E](http://downloads-21.open-tx.org/firmware/lua_fields_taranis_x9e.txt) | -| 2.2 | [X9D and X9D+](http://downloads.open-tx.org/2.2/firmware/lua_fields_x9d.txt), [X9E](http://downloads.open-tx.org/2.2/firmware/lua_fields_x9e.txt), [Horus](http://downloads.open-tx.org/2.2/firmware/lua_fields_x12s.txt) | - +| 2.2 | [X9D and X9D+](http://downloads.open-tx.org/2.2/release/firmware/lua_fields_x9d.txt), [X9E](http://downloads.open-tx.org/2.2/release/firmware/lua_fields_x9e.txt), [Horus](http://downloads.open-tx.org/2.2/release/firmware/lua_fields_x12s.txt) | +| 2.3 | [X9D and X9D+](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x9d.txt), [X9E](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x9e.txt), [X7](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x7.txt), [Horus](http://downloads.open-tx.org/2.3/release/firmware/lua_fields_x12s.txt) | In OpenTX 2.1.x the telemetry sources no longer have a predefined name. To get a telemetry value simply use it's sensor name. For example: From d8ffd1eada71718cbeebdcc76e5a61a90da2625e Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 2 May 2020 20:03:17 +0200 Subject: [PATCH 313/560] Fix companion handling of unknow protocols (#7567) * Tentative fix * cosmetics --- companion/src/firmwares/multiprotocols.cpp | 5 +---- companion/src/firmwares/opentx/opentxeeprom.cpp | 4 ---- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/companion/src/firmwares/multiprotocols.cpp b/companion/src/firmwares/multiprotocols.cpp index 0dcc299e9..7b13a2b19 100644 --- a/companion/src/firmwares/multiprotocols.cpp +++ b/companion/src/firmwares/multiprotocols.cpp @@ -173,10 +173,7 @@ QString Multiprotocols::protocolToString(int protocol, bool custom) "Bayang RX", "Pelikan", "Tiger", "WK", "XN297 Dump", "FrSky X 2.1", "FrSky R9" }); - if (protocol == MM_RF_CUSTOM_SELECTED || custom) - return tr("Custom - proto %1)").arg(protocol); - else - return strings.value(protocol, CPN_STR_UNKNOWN_ITEM); + return strings.value(protocol, CPN_STR_UNKNOWN_ITEM); } // static diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index cfeb5278a..7053118d5 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -2056,8 +2056,6 @@ class ModuleUnionField: public UnionField { void beforeExport() override { - if (module.multi.rfProtocol > MODULE_SUBTYPE_MULTI_LAST) - module.multi.rfProtocol += 3; rfProtExtra = (module.multi.rfProtocol & 0x70) >> 4; module.multi.rfProtocol &= 0x0f; } @@ -2065,8 +2063,6 @@ class ModuleUnionField: public UnionField { void afterImport() override { module.multi.rfProtocol = (rfProtExtra << 4) + (module.rfProtocol & 0xf); - if (module.multi.rfProtocol > MODULE_SUBTYPE_MULTI_LAST) - module.multi.rfProtocol -= 3; } private: From 8211b9d08d5eb96c628b890b8be1496cf4b71673 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 3 May 2020 10:22:14 +0200 Subject: [PATCH 314/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index fb4920d0d..8095dcd57 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1726,3 +1726,4 @@ George Kennedy Stefano Boggia Maksym Arshynkin Tomas Sodergren +Jörg Lemnitz From 7608e199a0eeecee51ff6388172fa5022d65deb5 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 3 May 2020 16:28:27 +0200 Subject: [PATCH 315/560] TX16S does have an internal multi --- companion/src/firmwares/opentx/opentxinterface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 5c584eceb..13d75e2c0 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -793,7 +793,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"); + return id.contains("internalmulti") || IS_RADIOMASTER_TX16S(board); default: return false; } From ad104e6ff8d14be2e8bb8ac9597ff3627a53d560 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 3 May 2020 19:52:19 +0200 Subject: [PATCH 316/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 8095dcd57..ffa540fbc 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1727,3 +1727,4 @@ Stefano Boggia Maksym Arshynkin Tomas Sodergren Jörg Lemnitz +TMac FPV From 3d28467c40e67c077035e732ce788de939b27815 Mon Sep 17 00:00:00 2001 From: pascallanger Date: Sun, 3 May 2020 23:52:16 +0200 Subject: [PATCH 317/560] Update Multi Channels Namer LUA script (#7577) Solve issue: https://github.com/opentx/opentx/issues/7569 Co-authored-by: Pascal Langer --- .../sdcard/horus/SCRIPTS/TOOLS/MultiChan.txt | 157 ++++++ .../SCRIPTS/TOOLS/MultiChannelsUpdater.lua | 465 ++++++++---------- .../taranis-x7/SCRIPTS/TOOLS/MultiChan.txt | 157 ++++++ .../SCRIPTS/TOOLS/MultiChannelsUpdater.lua | 465 ++++++++---------- .../taranis-x9/SCRIPTS/TOOLS/MultiChan.txt | 157 ++++++ .../SCRIPTS/TOOLS/MultiChannelsUpdater.lua | 465 ++++++++---------- 6 files changed, 1056 insertions(+), 810 deletions(-) create mode 100644 radio/sdcard/horus/SCRIPTS/TOOLS/MultiChan.txt create mode 100644 radio/sdcard/taranis-x7/SCRIPTS/TOOLS/MultiChan.txt create mode 100644 radio/sdcard/taranis-x9/SCRIPTS/TOOLS/MultiChan.txt diff --git a/radio/sdcard/horus/SCRIPTS/TOOLS/MultiChan.txt b/radio/sdcard/horus/SCRIPTS/TOOLS/MultiChan.txt new file mode 100644 index 000000000..bf61d8ca6 --- /dev/null +++ b/radio/sdcard/horus/SCRIPTS/TOOLS/MultiChan.txt @@ -0,0 +1,157 @@ +1,0,Flysky,Flysky,0,CH5,CH6,CH7,CH8 +1,1,Flysky,V9x9,1,Flip,Light,Pict,Video +1,2,Flysky,V6x6,1,Flip,Light,Pict,Video,HLess,RTH,XCAL,YCAL +1,3,Flysky,V912,1,BtmBtn,TopBtn +1,4,Flysky,CX20,0,CH5,CH6,CH7 +28,0,Flysky_AFHDS2A,PWM_IBUS,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 +28,1,Flysky_AFHDS2A,PPM_IBUS,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 +28,2,Flysky_AFHDS2A,PWM_SBUS,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 +28,3,Flysky_AFHDS2A,PPM_SBUS,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 +53,0,Flyzone,FZ-410,0 +2,0,Hubsan,H107,1,Flip,Light,Pict,Video,HLess +2,1,Hubsan,H301,0,RTH,Light,Stab,Video +2,2,Hubsan,H501,0,RTH,Light,Pict,Video,HLess,GPS_H,ALT_H,Flip,FModes +41,0,Bugs,3-6-8,0,Arm,Angle,Flip,Pict,Video,LED +60,0,Pelikan,PRO_V4,0,CH5,CH6,CH7,CH8 +37,0,Corona,COR_V1,0,CH5,CH6,CH7,CH8 +37,1,Corona,COR_V2,0,CH5,CH6,CH7,CH8 +37,2,Corona,FD_V3,0,CH5,CH6,CH7,CH8 +25,0,FrSkyV,V8,0,CH5,CH6,CH7,CH8 +3,0,FrSkyD,D8,0,CH5,CH6,CH7,CH8 +3,0,FrSkyD,D8Cloned,0,CH5,CH6,CH7,CH8 +67,0,FrSkyL,LR12,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12 +67,1,FrSkyL,LR12_6CH,0,CH5,CH6 +15,0,FrSkyX,D16_FCC,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +15,1,FrSkyX,D16_8CH_FCC,0,CH5,CH6,CH7,CH8 +15,2,FrSkyX,D16_LBT,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +15,3,FrSkyX,D16_8CH_LBT,0,CH5,CH6,CH7,CH8 +15,4,FrSkyX,D16Cloned,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +64,0,FrSkyX2,D16_FCC,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +64,1,FrSkyX2,D16_8CH_FCC,0,CH5,CH6,CH7,CH8 +64,2,FrSkyX2,D16_LBT,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +64,3,FrSkyX2,D16_8CH_LBT,1,CH5,CH6,CH7,CH8 +64,4,FrSkyX2,D16Cloned,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +55,0,FrSkyRX,RX,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +55,1,FrSkyRX,CloneTX,0 +39,0,Hitec,Opt_Fw,0,CH5,CH6,CH7,CH8,CH9 +39,1,Hitec,Opt_Hub,0,CH5,CH6,CH7,CH8,CH9 +39,2,Hitec,Minima,0,CH5,CH6,CH7,CH8,CH9 +57,0,HoTT,Std,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12 +21,0,SFHSS,Std,0,CH5,CH6,CH7,CH8 +68,0,Skyartec,Std,0,CH5,CH6,CH7 +7,0,Devo,8CH,0,CH5,CH6,CH7,CH8 +7,1,Devo,10CH,0,CH5,CH6,CH7,CH8,CH9,CH10 +7,2,Devo,12CH,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12 +7,3,Devo,6CH,0,CH5,CH6 +7,4,Devo,7CH,0,CH5,CH6,CH7 +30,0,WK2x01,WK2801,0,CH5,CH6,CH7,CH8 +30,1,WK2x01,WK2401,0 +30,2,WK2x01,W6_5_1,0,Gear,Dis,Gyro +30,3,WK2x01,W6_6_1,0,Gear,Col,Gyro +30,4,WK2x01,W6HEL,0,Gear,Col,Gyro +30,5,WK2x01,W6HEL_I,0,Gear,Col,Gyro +6,0,DSM,2_22,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,n-a,ThKill +6,1,DSM,2_11,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,n-a,ThKill +6,2,DSM,X_22,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,n-a,ThKill +6,3,DSM,X_11,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,n-a,ThKill +22,0,J6Pro,Std,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12 +22,0,WFLY,WFR0xS,0,CH5,CH6,CH7,CH8,CH9 +24,0,Assan,Std,0,CH5,CH6,CH7,CH8 +14,0,Bayang,Std,1,Flip,RTH,Pict,Video,HLess,Invert,Rates,n-a,n-a,AnAux1,AnAux2 +14,1,Bayang,H8S3D,1,Flip,RTH,Pict,Video,HLess,Invert,Rates +14,2,Bayang,X16_AH,1,Flip,RTH,Pict,Video,HLess,Invert,Rates,TakeOf +14,3,Bayang,IRDRONE,1,Flip,RTH,Pict,Video,HLess,Invert,Rates,TakeOf,EmStop +14,4,Bayang,DHD_D4,1,Flip,RTH,Pict,Video,HLess,Invert,Rates,TakeOf,EmStop +59,0,BayangRX,RX,1,AnAux1,AnAux2,Flip,RTH,Pict,Video +42,0,BugsMini,Mini,0,Arm,Angle,Flip,Pict,Video,LED +42,1,BugsMini,3H,0,Arm,Angle,Flip,Pict,Video,LED,AltHol +34,0,Cabell,V3,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +34,1,Cabell,V3Telem,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +13,0,CG023,Std,1,Flip,Light,Pict,Video,HLess +13,1,CG023,YD829,1,Flip,n-a,Pict,Video,HLess +12,0,CX10,Green,1,Flip,Rate +12,1,CX10,Blue,1,Flip,Rate,Pict,Video +12,2,CX10,DM007,1,Flip,Mode,Pict,Video,HLess +12,4,CX10,JC3015_1,1,Flip,Mode,Pict,Video +12,5,CX10,JC3015_2,1,Flip,Mode,LED,DFlip +12,6,CX10,MK33041,1,Flip,Mode,Pict,Video,HLess,RTH +33,0,DM022,Std,1,Flip,LED,Cam1,Cam2,HLess,RTH,RLow +45,0,E01X,E012,1,n-a,Flip,n-a,HLess,RTH +45,1,E01X,E015,1,Arm,Flip,LED,HLess,RTH +45,2,E01X,E016H,1,Stop,Flip,n-a,HLess,RTH +16,0,ESKY,Std,0,Gyro,Pitch +16,1,ESKY,ET4,0,Gyro,Pitch +35,0,ESKY150,4CH,0 +35,1,ESKY150,7CH,0,FMode,Aux6,Aux7 +20,0,FY326,FY326,1,Flip,RTH,HLess,Expert,Calib +20,1,FY326,FY319,1,Flip,RTH,HLess,Expert,Calib +23,0,FY326,FY326,1,Flip,RTH,HLess,Expert +32,0,GW008,FY326,1,Flip +36,0,H8_3D,Std,1,Flip,Light,Pict,Video,RTH,FlMode,Cal1 +36,1,H8_3D,H20H,1,Flip,Light,Pict,Video,Opt1,Opt2,Cal1,Cal2,Gimbal +36,2,H8_3D,H20,1,Flip,Light,Pict,Video,Opt1,Opt2,Cal1,Cal2,Gimbal +36,3,H8_3D,H30,1,Flip,Light,Pict,Video,Opt1,Opt2,Cal1,Cal2,Gimbal +4,0,Hisky,Std,0,Gear,Pitch,Gyro,CH8 +9,0,KN,WLToys,0,DRate,THold,IdleUp,Gyro,Ttrim,Atrim,Etrim +9,1,KN,Feilun,0,DRate,THold,IdleUp,Gyro,Ttrim,Atrim,Etrim +26,0,Hontai,Std,1,Flip,LED,Pict,Video,HLess,RTH,Calib +26,1,Hontai,JJRCX1,1,Flip,Arm,Pict,Video,HLess,RTH,Calib +26,2,Hontai,X5C1,1,Flip,Arm,Pict,Video,HLess,RTH,Calib +26,3,Hontai,FQ777_951,1,Flip,Arm,Pict,Video,HLess,RTH,Calib +18,0,MJXQ,WHL08,1,Flip,LED,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate +18,1,MJXQ,X600,1,Flip,LED,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate +18,2,MJXQ,X800,1,Flip,LED,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate +18,3,MJXQ,H26D,1,Flip,LED,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate +18,4,MJXQ,E010,1,Flip,LED,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate +18,5,MJXQ,H26WH,1,Flip,Arm,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate +18,6,MJXQ,Phoenix,1,Flip,Arm,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate +17,0,MT99XX,Std,1,Flip,LED,Pict,Video,HLess +17,1,MT99XX,H7,1,Flip,LED,Pict,Video,HLess +17,2,MT99XX,YZ,1,Flip,LED,Pict,Video,HLess +17,3,MT99XX,LS,1,Flip,Invert,Pict,Video,HLess +17,4,MT99XX,FY805,1,Flip,n-a,n-a,n-a,HLess +44,0,NCC1701,Std,1,Warp +51,0,Potensic,A20,1,TakLan,Emerg,Mode,HLess +66,0,Propel,74-Z,1,LEDs,RollCW,RolCCW,Fire,Weapon,Calib,AltHol,TakeOf,Land,Train +29,0,Q2x2,Q222,1,Flip,LED,Mod2,Mod1,HLess,RTH,XCal,YCal +29,1,Q2x2,Q242,1,Flip,LED,Pict,Video,HLess,RTH,XCal,YCal +29,2,Q2x2,Q282,1,Flip,LED,Pict,Video,HLess,RTH,XCal,YCal +31,0,Q303,Q303,1,AltHol,Flip,Pict,Video,HLess,RTH,Gimbal +31,1,Q303,C35,1,Arm,VTX,Pict,Video,n-a,RTH,Gimbal +31,2,Q303,CX10D,1,Arm,Flip +31,3,Q303,CX10WD,1,Arm,Flip +50,0,Redpine,Fast,0,sCH5,sCH6,sCH7,sCH8,sCH9,sCH10,sCH11,sCH12,sCH13,sCH14,sCH15,sCH16 +50,1,Redpine,Slow,0,sCH5,sCH6,sCH7,sCH8,sCH9,sCH10,sCH11,sCH12,sCH13,sCH14,sCH15,sCH16 +11,0,SLT,V1,0,Gear,Pitch +11,1,SLT,V2,0,CH5,CH6,CH7,CH8 +11,2,SLT,Q100,0,Rates,n-a,CH7,CH8,Mode,Flip,n-a,n-a,Calib +11,3,SLT,Q200,0,Rates,n-a,CH7,CH8,Mode,VidOn,VidOff,Calib +11,4,SLT,MR100,0,Rates,n-a,CH7,CH8,Mode,Flip,Video,Pict +10,0,Symax,Std,1,Flip,Rates,Pict,Video,HLess +10,1,Symax,X5C,1,Flip,Rates,Pict,Video,HLess +5,0,V2x2,Std,1,Flip,Light,Pict,Video,HLess,CalX,CalY +5,1,V2x2,JXD506,1,Flip,Light,Pict,Video,HLess,StaSto,Emerg,Cam_UD +61,0,Tiger,Std,1,Flip,Light +46,0,V911s,Std,1,Calib +46,1,E119,Std,1,Calib +62,0,XK,X450,1,FMode,TakeOf,Emerg,3D_6G,Pict,Video +62,1,XK,X420,1,FMode,TakeOf,Emerg,3D_6G,Pict,Video +8,0,YD717,Std,1,Flip,Light,Pict,Video,HLess +8,1,YD717,SkyWlkr,1,Flip,Light,Pict,Video,HLess +8,2,YD717,Simax4,1,Flip,Light,Pict,Video,HLess +8,3,YD717,XinXun,1,Flip,Light,Pict,Video,HLess +8,4,YD717,NiHui,1,Flip,Light,Pict,Video,HLess +65,0,FrSkyR9,R9_915,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +65,1,FrSkyR9,R9_868,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +65,2,FrSkyR9,R9_915_8CH,0,CH5,CH6,CH7,CH8 +65,3,FrSkyR9,R9_968_8CH,0,CH5,CH6,CH7,CH8 +56,0,Flysky2A_RX,RX,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 +19,0,Shenqi,Cycle,1 +4,1,Hisky,HK310,0,Aux +43,0,Traxxas,6519,0 +52,0,ZSX,280,1,Light +48,0,V761,Std,1,Gyro +49,0,KF606,Std,1,Trim +47,0,GD00x,V1,1,Trim,LED,Rate +47,1,GD00x,V2,1,Trim,LED,Rate +58,0,FX816,P38,1 diff --git a/radio/sdcard/horus/SCRIPTS/TOOLS/MultiChannelsUpdater.lua b/radio/sdcard/horus/SCRIPTS/TOOLS/MultiChannelsUpdater.lua index 2bd2e1a73..42de75e4f 100644 --- a/radio/sdcard/horus/SCRIPTS/TOOLS/MultiChannelsUpdater.lua +++ b/radio/sdcard/horus/SCRIPTS/TOOLS/MultiChannelsUpdater.lua @@ -1,3 +1,4 @@ + local toolName = "TNS|Multi chan namer|TNE" ---- ######################################################################### @@ -17,168 +18,18 @@ local toolName = "TNS|Multi chan namer|TNE" ---- # # ---- ######################################################################### +local protocol_name = "" +local sub_protocol_name = "" +local bind_ch = 0 +local module_conf = {} +local module_pos = "Internal" +local file_ok = 0 local done = 0 -local Protocols = { - {1, 0, "Flysky", "Flysky", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {1, 1, "Flysky", "V9x9", { "Flip", "Light", "Pict", "Video" }, 1 }, - {1, 2, "Flysky", "V6x6", { "Flip", "Light", "Pict", "Video", "HLess", "RTH", "XCAL", "YCAL" }, 1 }, - {1, 3, "Flysky", "V912", { "BtmBtn", "TopBtn" }, 1 }, - {1, 4, "Flysky", "CX20", { "CH5", "CH6", "CH7" }, 0 }, - {28, 0, "Flysky AFHDS2A", "PWM_IBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, - {28, 1, "Flysky AFHDS2A", "PPM_IBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, - {28, 2, "Flysky AFHDS2A", "PWM_SBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, - {28, 3, "Flysky AFHDS2A", "PPM_SBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, - {53, 0, "Flyzone", "FZ-410", { }, 0 }, - {2, 0, "Hubsan", "H107", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, - {2, 1, "Hubsan", "H301", { "RTH", "Light", "Stab", "Video" }, 0 }, - {2, 2, "Hubsan", "H501", { "RTH", "Light", "Pict", "Video", "HLess", "GPS_H", "ALT_H", "Flip", "FModes" }, 0 }, - {41, 0, "Bugs", "3-6-8", { "Arm", "Angle", "Flip", "Pict", "Video", "LED" }, 0 }, - {60, 0, "Pelikan", "PRO_V4", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {37, 0, "Corona", "COR_V1", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {37, 1, "Corona", "COR_V2", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {37, 2, "Corona", "FD_V3", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {25, 0, "FrSkyV", "V8", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {3, 0, "FrSkyD", "D8", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {3, 0, "FrSkyD", "D8Cloned", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {67, 0, "FrSkyL", "LR12", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 }, - {67, 1, "FrSkyL", "LR12_6CH", { "CH5", "CH6" }, 0 }, - {15, 0, "FrSkyX", "D16 FCC", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {15, 1, "FrSkyX", "D16_8CH FCC", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {15, 2, "FrSkyX", "D16 LBT", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {15, 3, "FrSkyX", "D16_8CH LBT", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {15, 4, "FrSkyX", "D16Cloned", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {64, 0, "FrSkyX2", "D16 FCC", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {64, 1, "FrSkyX2", "D16_8CH FCC", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {64, 2, "FrSkyX2", "D16 LBT", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {64, 3, "FrSkyX2", "D16_8CH LBT", { "CH5", "CH6", "CH7", "CH8" }, 1 }, - {64, 4, "FrSkyX2", "D16Cloned", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {55, 0, "FrSkyRX", "RX", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {55, 1, "FrSkyRX", "CloneTX", { }, 0 }, - {39, 0, "Hitec", "Opt_Fw", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 }, - {39, 1, "Hitec", "Opt_Hub", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 }, - {39, 2, "Hitec", "Minima", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 }, - {57, 0, "HoTT", "Std", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 }, - {21, 0, "SFHSS", "Std", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {68, 0, "Skyartec", "Std", { "CH5", "CH6", "CH7" }, 0 }, - {7 , 0, "Devo", "8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {7 , 1, "Devo", "10CH", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10" }, 0 }, - {7 , 2, "Devo", "12CH", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 }, - {7 , 3, "Devo", "6CH", { "CH5", "CH6" }, 0 }, - {7 , 4, "Devo", "7CH", { "CH5", "CH6", "CH7" }, 0 }, - {30, 0, "WK2x01", "WK2801", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {30, 1, "WK2x01", "WK2401", { }, 0 }, - {30, 2, "WK2x01", "W6_5_1", { "Gear", "Dis", "Gyro" }, 0 }, - {30, 3, "WK2x01", "W6_6_1", { "Gear", "Col", "Gyro" }, 0 }, - {30, 4, "WK2x01", "W6HEL", { "Gear", "Col", "Gyro" }, 0 }, - {30, 5, "WK2x01", "W6HEL_I", { "Gear", "Col", "Gyro" }, 0 }, - {6 , 0, "DSM", "2_22", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 }, - {6 , 1, "DSM", "2_11", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 }, - {6 , 2, "DSM", "X_22", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 }, - {6 , 3, "DSM", "X_11", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 }, - {22, 0, "J6Pro", "Std", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 }, - {22, 0, "WFLY", "WFR0xS", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 }, - {24, 0, "Assan", "Std", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {14, 0, "Bayang", "Std", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "n-a", "n-a", "AnAux1", "AnAux2" }, 1 }, - {14, 1, "Bayang", "H8S3D", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates" }, 1 }, - {14, 2, "Bayang", "X16_AH", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "TakeOf" }, 1 }, - {14, 3, "Bayang", "IRDRONE", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "TakeOf", "EmStop" }, 1 }, - {14, 4, "Bayang", "DHD_D4", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "TakeOf", "EmStop" }, 1 }, - {59, 0, "BayangRX", "RX", { "AnAux1", "AnAux2", "Flip", "RTH", "Pict", "Video" }, 1 }, - {42, 0, "BugsMini", "Mini", { "Arm", "Angle", "Flip", "Pict", "Video", "LED" }, 0 }, - {42, 1, "BugsMini", "3H", { "Arm", "Angle", "Flip", "Pict", "Video", "LED", "AltHol" }, 0 }, - {34, 0, "Cabell", "V3", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {34, 1, "Cabell", "V3Telem", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {13, 0, "CG023", "Std", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, - {13, 1, "CG023", "YD829", { "Flip", "n-a", "Pict", "Video", "HLess" }, 1 }, - {12, 0, "CX10", "Green", { "Flip", "Rate" }, 1 }, - {12, 1, "CX10", "Blue", { "Flip", "Rate", "Pict", "Video" }, 1 }, - {12, 2, "CX10", "DM007", { "Flip", "Mode", "Pict", "Video", "HLess" }, 1 }, - {12, 4, "CX10", "JC3015_1", { "Flip", "Mode", "Pict", "Video" }, 1 }, - {12, 5, "CX10", "JC3015_2", { "Flip", "Mode", "LED", "DFlip" }, 1 }, - {12, 6, "CX10", "MK33041", { "Flip", "Mode", "Pict", "Video", "HLess", "RTH" }, 1 }, - {33, 0, "DM022", "Std", { "Flip", "LED", "Cam1", "Cam2", "HLess", "RTH", "RLow" }, 1 }, - {45, 0, "E01X", "E012", { "n-a", "Flip", "n-a", "HLess", "RTH" }, 1 }, - {45, 1, "E01X", "E015", { "Arm", "Flip", "LED", "HLess", "RTH" }, 1 }, - {45, 2, "E01X", "E016H", { "Stop", "Flip", "n-a", "HLess", "RTH" }, 1 }, - {16, 0, "ESKY", "Std", { "Gyro", "Pitch" }, 0 }, - {16, 1, "ESKY", "ET4", { "Gyro", "Pitch" }, 0 }, - {35, 0, "ESKY150", "4CH", { }, 0 }, - {35, 1, "ESKY150", "7CH", { "FMode", "Aux6", "Aux7" }, 0 }, - {20, 0, "FY326", "FY326", { "Flip", "RTH", "HLess", "Expert", "Calib" }, 1 }, - {20, 1, "FY326", "FY319", { "Flip", "RTH", "HLess", "Expert", "Calib" }, 1 }, - {23, 0, "FY326", "FY326", { "Flip", "RTH", "HLess", "Expert" }, 1 }, - {32, 0, "GW008", "FY326", { "Flip" }, 1 }, - {36, 0, "H8_3D", "Std", { "Flip", "Light", "Pict", "Video", "RTH", "FlMode", "Cal1" }, 1 }, - {36, 1, "H8_3D", "H20H", { "Flip", "Light", "Pict", "Video", "Opt1", "Opt2", "Cal1", "Cal2", "Gimbal" }, 1 }, - {36, 2, "H8_3D", "H20", { "Flip", "Light", "Pict", "Video", "Opt1", "Opt2", "Cal1", "Cal2", "Gimbal" }, 1 }, - {36, 3, "H8_3D", "H30", { "Flip", "Light", "Pict", "Video", "Opt1", "Opt2", "Cal1", "Cal2", "Gimbal" }, 1 }, - {4 , 0, "Hisky", "Std", { "Gear", "Pitch", "Gyro", "CH8" }, 0 }, - {9 , 0, "KN", "WLToys", { "DRate", "THold", "IdleUp", "Gyro", "Ttrim", "Atrim", "Etrim" }, 0 }, - {9 , 1, "KN", "Feilun", { "DRate", "THold", "IdleUp", "Gyro", "Ttrim", "Atrim", "Etrim" }, 0 }, - {26, 0, "Hontai", "Std", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 }, - {26, 1, "Hontai", "JJRCX1", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 }, - {26, 2, "Hontai", "X5C1", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 }, - {26, 3, "Hontai", "FQ777_951", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 }, - {18, 0, "MJXQ", "WHL08", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, - {18, 1, "MJXQ", "X600", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, - {18, 2, "MJXQ", "X800", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, - {18, 3, "MJXQ", "H26D", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, - {18, 4, "MJXQ", "E010", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, - {18, 5, "MJXQ", "H26WH", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, - {18, 6, "MJXQ", "Phoenix", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, - {17, 0, "MT99XX", "Std", { "Flip", "LED", "Pict", "Video", "HLess" }, 1 }, - {17, 1, "MT99XX", "H7", { "Flip", "LED", "Pict", "Video", "HLess" }, 1 }, - {17, 2, "MT99XX", "YZ", { "Flip", "LED", "Pict", "Video", "HLess" }, 1 }, - {17, 3, "MT99XX", "LS", { "Flip", "Invert", "Pict", "Video", "HLess" }, 1 }, - {17, 4, "MT99XX", "FY805", { "Flip", "n-a", "n-a", "n-a", "HLess" }, 1 }, - {44, 0, "NCC1701", "Std", { "Warp" }, 1 }, - {51, 0, "Potensic", "A20", { "TakLan", "Emerg", "Mode", "HLess" }, 1 }, - {66, 0, "Propel", "74-Z", { "LEDs", "RollCW", "RolCCW", "Fire", "Weapon", "Calib", "AltHol", "TakeOf", "Land", "Train" }, 1 }, - {29, 0, "Q2x2", "Q222", { "Flip", "LED", "Mod2", "Mod1", "HLess", "RTH", "XCal", "YCal" }, 1 }, - {29, 1, "Q2x2", "Q242", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "XCal", "YCal" }, 1 }, - {29, 2, "Q2x2", "Q282", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "XCal", "YCal" }, 1 }, - {31, 0, "Q303", "Q303", { "AltHol", "Flip", "Pict", "Video", "HLess", "RTH", "Gimbal" }, 1 }, - {31, 1, "Q303", "C35", { "Arm", "VTX", "Pict", "Video", "n-a", "RTH", "Gimbal" }, 1 }, - {31, 2, "Q303", "CX10D", { "Arm", "Flip" }, 1 }, - {31, 3, "Q303", "CX10WD", { "Arm", "Flip" }, 1 }, - {50, 0, "Redpine", "Fast", { "sCH5", "sCH6", "sCH7", "sCH8", "sCH9", "sCH10", "sCH11", "sCH12", "sCH13", "sCH14", "sCH15", "sCH16" }, 0 }, - {50, 1, "Redpine", "Slow", { "sCH5", "sCH6", "sCH7", "sCH8", "sCH9", "sCH10", "sCH11", "sCH12", "sCH13", "sCH14", "sCH15", "sCH16" }, 0 }, - {11, 0, "SLT", "V1", { "Gear", "Pitch" }, 0 }, - {11, 1, "SLT", "V2", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {11, 2, "SLT", "Q100", { "Rates", "n-a", "CH7", "CH8", "Mode", "Flip", "n-a", "n-a", "Calib" }, 0 }, - {11, 3, "SLT", "Q200", { "Rates", "n-a", "CH7", "CH8", "Mode", "VidOn", "VidOff", "Calib" }, 0 }, - {11, 4, "SLT", "MR100", { "Rates", "n-a", "CH7", "CH8", "Mode", "Flip", "Video", "Pict" }, 0 }, - {10, 0, "Symax", "Std", { "Flip", "Rates", "Pict", "Video", "HLess" }, 1 }, - {10, 1, "Symax", "X5C", { "Flip", "Rates", "Pict", "Video", "HLess" }, 1 }, - {5 , 0, "V2x2", "Std", { "Flip", "Light", "Pict", "Video", "HLess", "CalX", "CalY" }, 1 }, - {5 , 1, "V2x2", "JXD506", { "Flip", "Light", "Pict", "Video", "HLess", "StaSto", "Emerg", "Cam_UD" }, 1 }, - {61, 0, "Tiger", "Std", { "Flip", "Light" }, 1 }, - {46, 0, "V911s", "Std", { "Calib" }, 1 }, - {46, 1, "E119", "Std", { "Calib" }, 1 }, - {62, 0, "XK", "X450", { "FMode", "TakeOf", "Emerg", "3D_6G", "Pict", "Video" }, 1 }, - {62, 1, "XK", "X420", { "FMode", "TakeOf", "Emerg", "3D_6G", "Pict", "Video" }, 1 }, - {8 , 0, "YD717", "Std", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, - {8 , 1, "YD717", "SkyWlkr", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, - {8 , 2, "YD717", "Simax4", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, - {8 , 3, "YD717", "XinXun", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, - {8 , 4, "YD717", "NiHui", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, - {65,0, "FrSkyR9", "R9_915", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {65,1, "FrSkyR9", "R9_868", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {65,2, "FrSkyR9", "R9_915_8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {65,3, "FrSkyR9", "R9_968_8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {56, 0, "Flysky2A RX", "RX", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, - --- Need first 4 channels changed... - {19, 0, "Shenqi", "Cycle", { }, 1 }, - {4 , 1, "Hisky", "HK310", { "Aux" }, 0 }, - {43, 0, "Traxxas", "6519", { }, 0 }, - {52, 0, "ZSX", "280", { "Light" }, 1 }, - {48, 0, "V761", "Std", { "Gyro" }, 1 }, - {49, 0, "KF606", "Std", { "Trim" }, 1 }, - {47, 0, "GD00x", "V1", { "Trim", "LED", "Rate" }, 1 }, - {47, 1, "GD00x", "V2", { "Trim", "LED", "Rate" }, 1 }, - {58, 0, "FX816", "P38", { },1 } -} +local protocol = 0 +local sub_protocol = 0 +local f_seek = 0 +local channel_names={} +local num_search = "Searching" local function drawScreenTitle(title) if LCD_W == 480 then @@ -203,33 +54,14 @@ function bitand(a, b) return result end -local function Multi_Draw_LCD() +local function Multi_Draw_LCD(event) local line = 0 - local module_conf = {} - local module_pos = "Internal" lcd.clear() drawScreenTitle("Multi channels namer") - module_conf = model.getModule(0) - if module_conf["Type"] ~= 6 then - module_pos = "External" - module_conf = model.getModule(1) - if module_conf["Type"] ~= 6 then - if LCD_W == 480 then - lcd.drawText(10,50,"No Multi module configured...", BLINK) - else - --Draw on LCD_W=128 - lcd.drawText(2,17,"No Multi module configured...",SMLSIZE) - end - return - end - end - - local protocol = module_conf["protocol"] - local sub_protocol = module_conf["subProtocol"] --Display settings - local lcd_opt + local lcd_opt = 0 if LCD_W == 480 then x_pos = 10 y_pos = 32 @@ -241,6 +73,180 @@ local function Multi_Draw_LCD() lcd_opt = SMLSIZE end + --Multi Module detection + if module_conf["Type"] ~= 6 then + if LCD_W == 480 then + lcd.drawText(10,50,"No Multi module configured...", BLINK) + else + --Draw on LCD_W=128 + lcd.drawText(2,17,"No Multi module configured...",SMLSIZE) + end + return + else + lcd.drawText(x_pos, y_pos+y_inc*line,module_pos .. " Multi detected.", lcd_opt) + line = line + 1 + end + + --Channel order + if (ch_order == -1) then + lcd.drawText(x_pos, y_pos+y_inc*line,"Channels order can't be read from Multi...", lcd_opt) + line = line + 1 + end + + --Can't open file MultiChan.txt + if file_ok == 0 then + lcd.drawText(x_pos, y_pos+y_inc*line,"Can't read MultiChan.txt file...", lcd_opt) + return + end + + if ( protocol_name == "" or sub_protocol_name == "" ) and f_seek ~=-1 then + local f = io.open("/SCRIPTS/TOOLS/MultiChan.txt", "r") + if f == nil then return end + lcd.drawText(x_pos, y_pos+y_inc*line,num_search, lcd_opt) + num_search = num_search .. "." + if #num_search > 15 then + num_search = string.sub(num_search,1,9) + end + local proto = 0 + local sub_proto = 0 + local proto_name = "" + local sub_proto_name = "" + local channels = "" + local nbr_try = 0 + local nbr_car = 0 + repeat + io.seek(f, f_seek) + local data = io.read(f, 100) -- read 100 characters + if #data ==0 then + f_seek = -1 -- end of file + break + end + proto, sub_proto, proto_name, sub_proto_name, bind_ch, channels = string.match(data,'(%d+),(%d),([%w-_ ]+),([%w-_ ]+),(%d)(.+)') + if proto ~= nil and sub_proto ~= nil and protocol_name ~= nil and sub_protocol_name ~= nil and bind_ch ~= nil then + if tonumber(proto) == protocol and tonumber(sub_proto) == sub_protocol then + protocol_name = proto_name + sub_protocol_name = sub_proto_name + bind_ch = tonumber(bind_ch) + if channels ~= nil then + --extract channel names + nbr_car = string.find(channels, "\r") + if nbr_car == nil then nbr_car = string.find(channels, "\n") end + if nbr_car ~= nil then + channels = string.sub(channels,1,nbr_car-1) + end + local i = 5 + for k in string.gmatch(channels, ",([%w-_ ]+)") do + channel_names[i] = k + i = i + 1 + end + end + f_seek = -1 -- protocol found + break + end + end + if f_seek ~= -1 then + nbr_car = string.find(data, "\n") + if nbr_car == nil then nbr_car = string.find(data, "\r") end + if nbr_car == nil then + f_seek = -1 -- end of file + break + end + f_seek = f_seek + nbr_car -- seek to next line + nbr_try = nbr_try + 1 + end + until nbr_try > 20 or f_seek == -1 + io.close(f) + end + + if f_seek ~= -1 then + return -- continue searching... + end + + --Protocol & Sub_protocol + if protocol_name == "" or sub_protocol_name == "" then + lcd.drawText(x_pos, y_pos+y_inc*line,"Unknown protocol "..tostring(protocol).."/"..tostring(sub_protocol).." ...", lcd_opt) + return + elseif LCD_W > 128 then + lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name .. " / SubProtocol: " .. sub_protocol_name, lcd_opt) + line = line + 1 + else + lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name, lcd_opt) + line = line + 1 + lcd.drawText(x_pos, y_pos+y_inc*line,"SubProtocol: " .. sub_protocol_name, lcd_opt) + line = line + 1 + end + + text1="" + text2="" + for i,v in ipairs(channel_names) do + if i<=8 then + if i==1 then + text1 = v + else + text1=text1 .. "," .. v + end + else + if i==9 then + text2 = v + else + text2=text2 .. "," .. v + end + end + end + if LCD_W > 128 then + lcd.drawText(x_pos, y_pos+y_inc*line,"Channels: " .. text1, lcd_opt) + line = line + 1 + if text2 ~= "" then + lcd.drawText(x_pos*9, y_pos+y_inc*line,text2, lcd_opt) + line = line + 1 + end + end + + if event ~= EVT_VIRTUAL_ENTER and done == 0 then + lcd.drawText(x_pos, y_pos+y_inc*line," Save", lcd_opt + INVERS + BLINK) + return + end + + lcd.drawText(x_pos, y_pos+y_inc*line,"Setting channel names.", lcd_opt) + line = line + 1 + local output, nbr + if done == 0 then + for i,v in ipairs(channel_names) do + output = model.getOutput(i-1) + output["name"] = v + model.setOutput(i-1,output) + nbr = i + end + for i = nbr, 15 do + output = model.getOutput(i) + output["name"] = "n-a" + model.setOutput(i,output) + end + if bind_ch == 1 then + output = model.getOutput(15) + output["name"] = "BindCH" + model.setOutput(15,output) + end + done = 1 + end + lcd.drawText(x_pos, y_pos+y_inc*line,"Done!", lcd_opt) + line = line + 1 +end + +-- Init +local function Multi_Init() + module_conf = model.getModule(0) + if module_conf["Type"] ~= 6 then + module_pos = "External" + module_conf = model.getModule(1) + if module_conf["Type"] ~= 6 then + return + end + end + + protocol = module_conf["protocol"] + sub_protocol = module_conf["subProtocol"] + --Exceptions on first 4 channels... local stick_names = { "Rud", "Ele", "Thr", "Ail" } if ( protocol == 4 and sub_protocol ==1 ) or protocol == 19 or protocol == 52 then -- Hisky/HK310, Shenqi, ZSX @@ -257,7 +263,6 @@ local function Multi_Draw_LCD() end --Determine fist 4 channels order - local channel_names={} local ch_order=module_conf["channelsOrder"] if (ch_order == -1) then channel_names[1] = stick_names[defaultChannel(0)+1] @@ -273,91 +278,11 @@ local function Multi_Draw_LCD() ch_order = math.floor(ch_order/4) channel_names[bitand(ch_order,3)+1] = stick_names[1] end - - --Specific channels for protocol - local protocol_name, sub_protocol_name, bind_ch - for i,v in ipairs(Protocols) do - if v[1] == protocol and v[2] == sub_protocol then - protocol_name = v[3] - sub_protocol_name = v[4] - for j,w in ipairs(v[5]) do - channel_names[4+j]=w; - end - bind_ch = v[6] - end - end - - lcd.drawText(x_pos, y_pos+y_inc*line,module_pos .. " Multi detected.", lcd_opt) - line = line + 1 - if (ch_order == -1) then - lcd.drawText(x_pos, y_pos+y_inc*line,"Channels order can't be read from Multi...", lcd_opt) - line = line + 1 - end - if protocol_name == nil or sub_protocol_name == nil then - lcd.drawText(x_pos, y_pos+y_inc*line,"Unknown protocol "..tostring(protocol).."/"..tostring(sub_protocol).." ...", lcd_opt) - else if LCD_W > 128 then - lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name .. " / SubProtocol: " .. sub_protocol_name, lcd_opt) - line = line + 1 - else - lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name, lcd_opt) - line = line + 1 - lcd.drawText(x_pos, y_pos+y_inc*line,"SubProtocol: " .. sub_protocol_name, lcd_opt) - line = line + 1 - end - text1="" - text2="" - for i,v in ipairs(channel_names) do - if i<=8 then - if i==1 then - text1 = v - else - text1=text1 .. "," .. v - end - else - if i==9 then - text2 = v - else - text2=text2 .. "," .. v - end - end - end - if LCD_W > 128 then - lcd.drawText(x_pos, y_pos+y_inc*line,"Channels: " .. text1, lcd_opt) - line = line + 1 - if text2 ~= "" then - lcd.drawText(x_pos*9, y_pos+y_inc*line,text2, lcd_opt) - line = line + 1 - end - end - lcd.drawText(x_pos, y_pos+y_inc*line,"Setting channel names.", lcd_opt) - line = line + 1 - local output, nbr - if done == 0 then - for i,v in ipairs(channel_names) do - output = model.getOutput(i-1) - output["name"] = v - model.setOutput(i-1,output) - nbr = i - end - for i = nbr, 15 do - output = model.getOutput(i) - output["name"] = "n-a" - model.setOutput(i,output) - end - if bind_ch == 1 then - output = model.getOutput(15) - output["name"] = "BindCH" - model.setOutput(15,output) - end - done = 1 - end - lcd.drawText(x_pos, y_pos+y_inc*line,"Done!", lcd_opt) - line = line + 1 - end -end - --- Init -local function Multi_Init() + --Check MultiChan.txt + local f = io.open("/SCRIPTS/TOOLS/MultiChan.txt", "r") + if f == nil then return end + file_ok = 1 + io.close(f) end -- Main @@ -366,8 +291,8 @@ local function Multi_Run(event) error("Cannot be run as a model script!") return 2 else - Multi_Draw_LCD() - if event == EVT_VIRTUAL_ENTER or event == EVT_VIRTUAL_EXIT then + Multi_Draw_LCD(event) + if event == EVT_VIRTUAL_EXIT then return 2 end end diff --git a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/MultiChan.txt b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/MultiChan.txt new file mode 100644 index 000000000..bf61d8ca6 --- /dev/null +++ b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/MultiChan.txt @@ -0,0 +1,157 @@ +1,0,Flysky,Flysky,0,CH5,CH6,CH7,CH8 +1,1,Flysky,V9x9,1,Flip,Light,Pict,Video +1,2,Flysky,V6x6,1,Flip,Light,Pict,Video,HLess,RTH,XCAL,YCAL +1,3,Flysky,V912,1,BtmBtn,TopBtn +1,4,Flysky,CX20,0,CH5,CH6,CH7 +28,0,Flysky_AFHDS2A,PWM_IBUS,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 +28,1,Flysky_AFHDS2A,PPM_IBUS,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 +28,2,Flysky_AFHDS2A,PWM_SBUS,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 +28,3,Flysky_AFHDS2A,PPM_SBUS,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 +53,0,Flyzone,FZ-410,0 +2,0,Hubsan,H107,1,Flip,Light,Pict,Video,HLess +2,1,Hubsan,H301,0,RTH,Light,Stab,Video +2,2,Hubsan,H501,0,RTH,Light,Pict,Video,HLess,GPS_H,ALT_H,Flip,FModes +41,0,Bugs,3-6-8,0,Arm,Angle,Flip,Pict,Video,LED +60,0,Pelikan,PRO_V4,0,CH5,CH6,CH7,CH8 +37,0,Corona,COR_V1,0,CH5,CH6,CH7,CH8 +37,1,Corona,COR_V2,0,CH5,CH6,CH7,CH8 +37,2,Corona,FD_V3,0,CH5,CH6,CH7,CH8 +25,0,FrSkyV,V8,0,CH5,CH6,CH7,CH8 +3,0,FrSkyD,D8,0,CH5,CH6,CH7,CH8 +3,0,FrSkyD,D8Cloned,0,CH5,CH6,CH7,CH8 +67,0,FrSkyL,LR12,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12 +67,1,FrSkyL,LR12_6CH,0,CH5,CH6 +15,0,FrSkyX,D16_FCC,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +15,1,FrSkyX,D16_8CH_FCC,0,CH5,CH6,CH7,CH8 +15,2,FrSkyX,D16_LBT,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +15,3,FrSkyX,D16_8CH_LBT,0,CH5,CH6,CH7,CH8 +15,4,FrSkyX,D16Cloned,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +64,0,FrSkyX2,D16_FCC,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +64,1,FrSkyX2,D16_8CH_FCC,0,CH5,CH6,CH7,CH8 +64,2,FrSkyX2,D16_LBT,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +64,3,FrSkyX2,D16_8CH_LBT,1,CH5,CH6,CH7,CH8 +64,4,FrSkyX2,D16Cloned,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +55,0,FrSkyRX,RX,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +55,1,FrSkyRX,CloneTX,0 +39,0,Hitec,Opt_Fw,0,CH5,CH6,CH7,CH8,CH9 +39,1,Hitec,Opt_Hub,0,CH5,CH6,CH7,CH8,CH9 +39,2,Hitec,Minima,0,CH5,CH6,CH7,CH8,CH9 +57,0,HoTT,Std,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12 +21,0,SFHSS,Std,0,CH5,CH6,CH7,CH8 +68,0,Skyartec,Std,0,CH5,CH6,CH7 +7,0,Devo,8CH,0,CH5,CH6,CH7,CH8 +7,1,Devo,10CH,0,CH5,CH6,CH7,CH8,CH9,CH10 +7,2,Devo,12CH,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12 +7,3,Devo,6CH,0,CH5,CH6 +7,4,Devo,7CH,0,CH5,CH6,CH7 +30,0,WK2x01,WK2801,0,CH5,CH6,CH7,CH8 +30,1,WK2x01,WK2401,0 +30,2,WK2x01,W6_5_1,0,Gear,Dis,Gyro +30,3,WK2x01,W6_6_1,0,Gear,Col,Gyro +30,4,WK2x01,W6HEL,0,Gear,Col,Gyro +30,5,WK2x01,W6HEL_I,0,Gear,Col,Gyro +6,0,DSM,2_22,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,n-a,ThKill +6,1,DSM,2_11,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,n-a,ThKill +6,2,DSM,X_22,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,n-a,ThKill +6,3,DSM,X_11,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,n-a,ThKill +22,0,J6Pro,Std,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12 +22,0,WFLY,WFR0xS,0,CH5,CH6,CH7,CH8,CH9 +24,0,Assan,Std,0,CH5,CH6,CH7,CH8 +14,0,Bayang,Std,1,Flip,RTH,Pict,Video,HLess,Invert,Rates,n-a,n-a,AnAux1,AnAux2 +14,1,Bayang,H8S3D,1,Flip,RTH,Pict,Video,HLess,Invert,Rates +14,2,Bayang,X16_AH,1,Flip,RTH,Pict,Video,HLess,Invert,Rates,TakeOf +14,3,Bayang,IRDRONE,1,Flip,RTH,Pict,Video,HLess,Invert,Rates,TakeOf,EmStop +14,4,Bayang,DHD_D4,1,Flip,RTH,Pict,Video,HLess,Invert,Rates,TakeOf,EmStop +59,0,BayangRX,RX,1,AnAux1,AnAux2,Flip,RTH,Pict,Video +42,0,BugsMini,Mini,0,Arm,Angle,Flip,Pict,Video,LED +42,1,BugsMini,3H,0,Arm,Angle,Flip,Pict,Video,LED,AltHol +34,0,Cabell,V3,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +34,1,Cabell,V3Telem,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +13,0,CG023,Std,1,Flip,Light,Pict,Video,HLess +13,1,CG023,YD829,1,Flip,n-a,Pict,Video,HLess +12,0,CX10,Green,1,Flip,Rate +12,1,CX10,Blue,1,Flip,Rate,Pict,Video +12,2,CX10,DM007,1,Flip,Mode,Pict,Video,HLess +12,4,CX10,JC3015_1,1,Flip,Mode,Pict,Video +12,5,CX10,JC3015_2,1,Flip,Mode,LED,DFlip +12,6,CX10,MK33041,1,Flip,Mode,Pict,Video,HLess,RTH +33,0,DM022,Std,1,Flip,LED,Cam1,Cam2,HLess,RTH,RLow +45,0,E01X,E012,1,n-a,Flip,n-a,HLess,RTH +45,1,E01X,E015,1,Arm,Flip,LED,HLess,RTH +45,2,E01X,E016H,1,Stop,Flip,n-a,HLess,RTH +16,0,ESKY,Std,0,Gyro,Pitch +16,1,ESKY,ET4,0,Gyro,Pitch +35,0,ESKY150,4CH,0 +35,1,ESKY150,7CH,0,FMode,Aux6,Aux7 +20,0,FY326,FY326,1,Flip,RTH,HLess,Expert,Calib +20,1,FY326,FY319,1,Flip,RTH,HLess,Expert,Calib +23,0,FY326,FY326,1,Flip,RTH,HLess,Expert +32,0,GW008,FY326,1,Flip +36,0,H8_3D,Std,1,Flip,Light,Pict,Video,RTH,FlMode,Cal1 +36,1,H8_3D,H20H,1,Flip,Light,Pict,Video,Opt1,Opt2,Cal1,Cal2,Gimbal +36,2,H8_3D,H20,1,Flip,Light,Pict,Video,Opt1,Opt2,Cal1,Cal2,Gimbal +36,3,H8_3D,H30,1,Flip,Light,Pict,Video,Opt1,Opt2,Cal1,Cal2,Gimbal +4,0,Hisky,Std,0,Gear,Pitch,Gyro,CH8 +9,0,KN,WLToys,0,DRate,THold,IdleUp,Gyro,Ttrim,Atrim,Etrim +9,1,KN,Feilun,0,DRate,THold,IdleUp,Gyro,Ttrim,Atrim,Etrim +26,0,Hontai,Std,1,Flip,LED,Pict,Video,HLess,RTH,Calib +26,1,Hontai,JJRCX1,1,Flip,Arm,Pict,Video,HLess,RTH,Calib +26,2,Hontai,X5C1,1,Flip,Arm,Pict,Video,HLess,RTH,Calib +26,3,Hontai,FQ777_951,1,Flip,Arm,Pict,Video,HLess,RTH,Calib +18,0,MJXQ,WHL08,1,Flip,LED,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate +18,1,MJXQ,X600,1,Flip,LED,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate +18,2,MJXQ,X800,1,Flip,LED,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate +18,3,MJXQ,H26D,1,Flip,LED,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate +18,4,MJXQ,E010,1,Flip,LED,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate +18,5,MJXQ,H26WH,1,Flip,Arm,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate +18,6,MJXQ,Phoenix,1,Flip,Arm,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate +17,0,MT99XX,Std,1,Flip,LED,Pict,Video,HLess +17,1,MT99XX,H7,1,Flip,LED,Pict,Video,HLess +17,2,MT99XX,YZ,1,Flip,LED,Pict,Video,HLess +17,3,MT99XX,LS,1,Flip,Invert,Pict,Video,HLess +17,4,MT99XX,FY805,1,Flip,n-a,n-a,n-a,HLess +44,0,NCC1701,Std,1,Warp +51,0,Potensic,A20,1,TakLan,Emerg,Mode,HLess +66,0,Propel,74-Z,1,LEDs,RollCW,RolCCW,Fire,Weapon,Calib,AltHol,TakeOf,Land,Train +29,0,Q2x2,Q222,1,Flip,LED,Mod2,Mod1,HLess,RTH,XCal,YCal +29,1,Q2x2,Q242,1,Flip,LED,Pict,Video,HLess,RTH,XCal,YCal +29,2,Q2x2,Q282,1,Flip,LED,Pict,Video,HLess,RTH,XCal,YCal +31,0,Q303,Q303,1,AltHol,Flip,Pict,Video,HLess,RTH,Gimbal +31,1,Q303,C35,1,Arm,VTX,Pict,Video,n-a,RTH,Gimbal +31,2,Q303,CX10D,1,Arm,Flip +31,3,Q303,CX10WD,1,Arm,Flip +50,0,Redpine,Fast,0,sCH5,sCH6,sCH7,sCH8,sCH9,sCH10,sCH11,sCH12,sCH13,sCH14,sCH15,sCH16 +50,1,Redpine,Slow,0,sCH5,sCH6,sCH7,sCH8,sCH9,sCH10,sCH11,sCH12,sCH13,sCH14,sCH15,sCH16 +11,0,SLT,V1,0,Gear,Pitch +11,1,SLT,V2,0,CH5,CH6,CH7,CH8 +11,2,SLT,Q100,0,Rates,n-a,CH7,CH8,Mode,Flip,n-a,n-a,Calib +11,3,SLT,Q200,0,Rates,n-a,CH7,CH8,Mode,VidOn,VidOff,Calib +11,4,SLT,MR100,0,Rates,n-a,CH7,CH8,Mode,Flip,Video,Pict +10,0,Symax,Std,1,Flip,Rates,Pict,Video,HLess +10,1,Symax,X5C,1,Flip,Rates,Pict,Video,HLess +5,0,V2x2,Std,1,Flip,Light,Pict,Video,HLess,CalX,CalY +5,1,V2x2,JXD506,1,Flip,Light,Pict,Video,HLess,StaSto,Emerg,Cam_UD +61,0,Tiger,Std,1,Flip,Light +46,0,V911s,Std,1,Calib +46,1,E119,Std,1,Calib +62,0,XK,X450,1,FMode,TakeOf,Emerg,3D_6G,Pict,Video +62,1,XK,X420,1,FMode,TakeOf,Emerg,3D_6G,Pict,Video +8,0,YD717,Std,1,Flip,Light,Pict,Video,HLess +8,1,YD717,SkyWlkr,1,Flip,Light,Pict,Video,HLess +8,2,YD717,Simax4,1,Flip,Light,Pict,Video,HLess +8,3,YD717,XinXun,1,Flip,Light,Pict,Video,HLess +8,4,YD717,NiHui,1,Flip,Light,Pict,Video,HLess +65,0,FrSkyR9,R9_915,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +65,1,FrSkyR9,R9_868,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +65,2,FrSkyR9,R9_915_8CH,0,CH5,CH6,CH7,CH8 +65,3,FrSkyR9,R9_968_8CH,0,CH5,CH6,CH7,CH8 +56,0,Flysky2A_RX,RX,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 +19,0,Shenqi,Cycle,1 +4,1,Hisky,HK310,0,Aux +43,0,Traxxas,6519,0 +52,0,ZSX,280,1,Light +48,0,V761,Std,1,Gyro +49,0,KF606,Std,1,Trim +47,0,GD00x,V1,1,Trim,LED,Rate +47,1,GD00x,V2,1,Trim,LED,Rate +58,0,FX816,P38,1 diff --git a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/MultiChannelsUpdater.lua b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/MultiChannelsUpdater.lua index 2bd2e1a73..42de75e4f 100644 --- a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/MultiChannelsUpdater.lua +++ b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/MultiChannelsUpdater.lua @@ -1,3 +1,4 @@ + local toolName = "TNS|Multi chan namer|TNE" ---- ######################################################################### @@ -17,168 +18,18 @@ local toolName = "TNS|Multi chan namer|TNE" ---- # # ---- ######################################################################### +local protocol_name = "" +local sub_protocol_name = "" +local bind_ch = 0 +local module_conf = {} +local module_pos = "Internal" +local file_ok = 0 local done = 0 -local Protocols = { - {1, 0, "Flysky", "Flysky", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {1, 1, "Flysky", "V9x9", { "Flip", "Light", "Pict", "Video" }, 1 }, - {1, 2, "Flysky", "V6x6", { "Flip", "Light", "Pict", "Video", "HLess", "RTH", "XCAL", "YCAL" }, 1 }, - {1, 3, "Flysky", "V912", { "BtmBtn", "TopBtn" }, 1 }, - {1, 4, "Flysky", "CX20", { "CH5", "CH6", "CH7" }, 0 }, - {28, 0, "Flysky AFHDS2A", "PWM_IBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, - {28, 1, "Flysky AFHDS2A", "PPM_IBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, - {28, 2, "Flysky AFHDS2A", "PWM_SBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, - {28, 3, "Flysky AFHDS2A", "PPM_SBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, - {53, 0, "Flyzone", "FZ-410", { }, 0 }, - {2, 0, "Hubsan", "H107", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, - {2, 1, "Hubsan", "H301", { "RTH", "Light", "Stab", "Video" }, 0 }, - {2, 2, "Hubsan", "H501", { "RTH", "Light", "Pict", "Video", "HLess", "GPS_H", "ALT_H", "Flip", "FModes" }, 0 }, - {41, 0, "Bugs", "3-6-8", { "Arm", "Angle", "Flip", "Pict", "Video", "LED" }, 0 }, - {60, 0, "Pelikan", "PRO_V4", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {37, 0, "Corona", "COR_V1", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {37, 1, "Corona", "COR_V2", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {37, 2, "Corona", "FD_V3", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {25, 0, "FrSkyV", "V8", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {3, 0, "FrSkyD", "D8", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {3, 0, "FrSkyD", "D8Cloned", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {67, 0, "FrSkyL", "LR12", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 }, - {67, 1, "FrSkyL", "LR12_6CH", { "CH5", "CH6" }, 0 }, - {15, 0, "FrSkyX", "D16 FCC", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {15, 1, "FrSkyX", "D16_8CH FCC", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {15, 2, "FrSkyX", "D16 LBT", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {15, 3, "FrSkyX", "D16_8CH LBT", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {15, 4, "FrSkyX", "D16Cloned", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {64, 0, "FrSkyX2", "D16 FCC", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {64, 1, "FrSkyX2", "D16_8CH FCC", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {64, 2, "FrSkyX2", "D16 LBT", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {64, 3, "FrSkyX2", "D16_8CH LBT", { "CH5", "CH6", "CH7", "CH8" }, 1 }, - {64, 4, "FrSkyX2", "D16Cloned", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {55, 0, "FrSkyRX", "RX", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {55, 1, "FrSkyRX", "CloneTX", { }, 0 }, - {39, 0, "Hitec", "Opt_Fw", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 }, - {39, 1, "Hitec", "Opt_Hub", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 }, - {39, 2, "Hitec", "Minima", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 }, - {57, 0, "HoTT", "Std", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 }, - {21, 0, "SFHSS", "Std", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {68, 0, "Skyartec", "Std", { "CH5", "CH6", "CH7" }, 0 }, - {7 , 0, "Devo", "8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {7 , 1, "Devo", "10CH", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10" }, 0 }, - {7 , 2, "Devo", "12CH", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 }, - {7 , 3, "Devo", "6CH", { "CH5", "CH6" }, 0 }, - {7 , 4, "Devo", "7CH", { "CH5", "CH6", "CH7" }, 0 }, - {30, 0, "WK2x01", "WK2801", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {30, 1, "WK2x01", "WK2401", { }, 0 }, - {30, 2, "WK2x01", "W6_5_1", { "Gear", "Dis", "Gyro" }, 0 }, - {30, 3, "WK2x01", "W6_6_1", { "Gear", "Col", "Gyro" }, 0 }, - {30, 4, "WK2x01", "W6HEL", { "Gear", "Col", "Gyro" }, 0 }, - {30, 5, "WK2x01", "W6HEL_I", { "Gear", "Col", "Gyro" }, 0 }, - {6 , 0, "DSM", "2_22", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 }, - {6 , 1, "DSM", "2_11", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 }, - {6 , 2, "DSM", "X_22", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 }, - {6 , 3, "DSM", "X_11", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 }, - {22, 0, "J6Pro", "Std", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 }, - {22, 0, "WFLY", "WFR0xS", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 }, - {24, 0, "Assan", "Std", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {14, 0, "Bayang", "Std", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "n-a", "n-a", "AnAux1", "AnAux2" }, 1 }, - {14, 1, "Bayang", "H8S3D", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates" }, 1 }, - {14, 2, "Bayang", "X16_AH", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "TakeOf" }, 1 }, - {14, 3, "Bayang", "IRDRONE", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "TakeOf", "EmStop" }, 1 }, - {14, 4, "Bayang", "DHD_D4", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "TakeOf", "EmStop" }, 1 }, - {59, 0, "BayangRX", "RX", { "AnAux1", "AnAux2", "Flip", "RTH", "Pict", "Video" }, 1 }, - {42, 0, "BugsMini", "Mini", { "Arm", "Angle", "Flip", "Pict", "Video", "LED" }, 0 }, - {42, 1, "BugsMini", "3H", { "Arm", "Angle", "Flip", "Pict", "Video", "LED", "AltHol" }, 0 }, - {34, 0, "Cabell", "V3", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {34, 1, "Cabell", "V3Telem", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {13, 0, "CG023", "Std", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, - {13, 1, "CG023", "YD829", { "Flip", "n-a", "Pict", "Video", "HLess" }, 1 }, - {12, 0, "CX10", "Green", { "Flip", "Rate" }, 1 }, - {12, 1, "CX10", "Blue", { "Flip", "Rate", "Pict", "Video" }, 1 }, - {12, 2, "CX10", "DM007", { "Flip", "Mode", "Pict", "Video", "HLess" }, 1 }, - {12, 4, "CX10", "JC3015_1", { "Flip", "Mode", "Pict", "Video" }, 1 }, - {12, 5, "CX10", "JC3015_2", { "Flip", "Mode", "LED", "DFlip" }, 1 }, - {12, 6, "CX10", "MK33041", { "Flip", "Mode", "Pict", "Video", "HLess", "RTH" }, 1 }, - {33, 0, "DM022", "Std", { "Flip", "LED", "Cam1", "Cam2", "HLess", "RTH", "RLow" }, 1 }, - {45, 0, "E01X", "E012", { "n-a", "Flip", "n-a", "HLess", "RTH" }, 1 }, - {45, 1, "E01X", "E015", { "Arm", "Flip", "LED", "HLess", "RTH" }, 1 }, - {45, 2, "E01X", "E016H", { "Stop", "Flip", "n-a", "HLess", "RTH" }, 1 }, - {16, 0, "ESKY", "Std", { "Gyro", "Pitch" }, 0 }, - {16, 1, "ESKY", "ET4", { "Gyro", "Pitch" }, 0 }, - {35, 0, "ESKY150", "4CH", { }, 0 }, - {35, 1, "ESKY150", "7CH", { "FMode", "Aux6", "Aux7" }, 0 }, - {20, 0, "FY326", "FY326", { "Flip", "RTH", "HLess", "Expert", "Calib" }, 1 }, - {20, 1, "FY326", "FY319", { "Flip", "RTH", "HLess", "Expert", "Calib" }, 1 }, - {23, 0, "FY326", "FY326", { "Flip", "RTH", "HLess", "Expert" }, 1 }, - {32, 0, "GW008", "FY326", { "Flip" }, 1 }, - {36, 0, "H8_3D", "Std", { "Flip", "Light", "Pict", "Video", "RTH", "FlMode", "Cal1" }, 1 }, - {36, 1, "H8_3D", "H20H", { "Flip", "Light", "Pict", "Video", "Opt1", "Opt2", "Cal1", "Cal2", "Gimbal" }, 1 }, - {36, 2, "H8_3D", "H20", { "Flip", "Light", "Pict", "Video", "Opt1", "Opt2", "Cal1", "Cal2", "Gimbal" }, 1 }, - {36, 3, "H8_3D", "H30", { "Flip", "Light", "Pict", "Video", "Opt1", "Opt2", "Cal1", "Cal2", "Gimbal" }, 1 }, - {4 , 0, "Hisky", "Std", { "Gear", "Pitch", "Gyro", "CH8" }, 0 }, - {9 , 0, "KN", "WLToys", { "DRate", "THold", "IdleUp", "Gyro", "Ttrim", "Atrim", "Etrim" }, 0 }, - {9 , 1, "KN", "Feilun", { "DRate", "THold", "IdleUp", "Gyro", "Ttrim", "Atrim", "Etrim" }, 0 }, - {26, 0, "Hontai", "Std", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 }, - {26, 1, "Hontai", "JJRCX1", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 }, - {26, 2, "Hontai", "X5C1", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 }, - {26, 3, "Hontai", "FQ777_951", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 }, - {18, 0, "MJXQ", "WHL08", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, - {18, 1, "MJXQ", "X600", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, - {18, 2, "MJXQ", "X800", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, - {18, 3, "MJXQ", "H26D", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, - {18, 4, "MJXQ", "E010", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, - {18, 5, "MJXQ", "H26WH", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, - {18, 6, "MJXQ", "Phoenix", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, - {17, 0, "MT99XX", "Std", { "Flip", "LED", "Pict", "Video", "HLess" }, 1 }, - {17, 1, "MT99XX", "H7", { "Flip", "LED", "Pict", "Video", "HLess" }, 1 }, - {17, 2, "MT99XX", "YZ", { "Flip", "LED", "Pict", "Video", "HLess" }, 1 }, - {17, 3, "MT99XX", "LS", { "Flip", "Invert", "Pict", "Video", "HLess" }, 1 }, - {17, 4, "MT99XX", "FY805", { "Flip", "n-a", "n-a", "n-a", "HLess" }, 1 }, - {44, 0, "NCC1701", "Std", { "Warp" }, 1 }, - {51, 0, "Potensic", "A20", { "TakLan", "Emerg", "Mode", "HLess" }, 1 }, - {66, 0, "Propel", "74-Z", { "LEDs", "RollCW", "RolCCW", "Fire", "Weapon", "Calib", "AltHol", "TakeOf", "Land", "Train" }, 1 }, - {29, 0, "Q2x2", "Q222", { "Flip", "LED", "Mod2", "Mod1", "HLess", "RTH", "XCal", "YCal" }, 1 }, - {29, 1, "Q2x2", "Q242", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "XCal", "YCal" }, 1 }, - {29, 2, "Q2x2", "Q282", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "XCal", "YCal" }, 1 }, - {31, 0, "Q303", "Q303", { "AltHol", "Flip", "Pict", "Video", "HLess", "RTH", "Gimbal" }, 1 }, - {31, 1, "Q303", "C35", { "Arm", "VTX", "Pict", "Video", "n-a", "RTH", "Gimbal" }, 1 }, - {31, 2, "Q303", "CX10D", { "Arm", "Flip" }, 1 }, - {31, 3, "Q303", "CX10WD", { "Arm", "Flip" }, 1 }, - {50, 0, "Redpine", "Fast", { "sCH5", "sCH6", "sCH7", "sCH8", "sCH9", "sCH10", "sCH11", "sCH12", "sCH13", "sCH14", "sCH15", "sCH16" }, 0 }, - {50, 1, "Redpine", "Slow", { "sCH5", "sCH6", "sCH7", "sCH8", "sCH9", "sCH10", "sCH11", "sCH12", "sCH13", "sCH14", "sCH15", "sCH16" }, 0 }, - {11, 0, "SLT", "V1", { "Gear", "Pitch" }, 0 }, - {11, 1, "SLT", "V2", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {11, 2, "SLT", "Q100", { "Rates", "n-a", "CH7", "CH8", "Mode", "Flip", "n-a", "n-a", "Calib" }, 0 }, - {11, 3, "SLT", "Q200", { "Rates", "n-a", "CH7", "CH8", "Mode", "VidOn", "VidOff", "Calib" }, 0 }, - {11, 4, "SLT", "MR100", { "Rates", "n-a", "CH7", "CH8", "Mode", "Flip", "Video", "Pict" }, 0 }, - {10, 0, "Symax", "Std", { "Flip", "Rates", "Pict", "Video", "HLess" }, 1 }, - {10, 1, "Symax", "X5C", { "Flip", "Rates", "Pict", "Video", "HLess" }, 1 }, - {5 , 0, "V2x2", "Std", { "Flip", "Light", "Pict", "Video", "HLess", "CalX", "CalY" }, 1 }, - {5 , 1, "V2x2", "JXD506", { "Flip", "Light", "Pict", "Video", "HLess", "StaSto", "Emerg", "Cam_UD" }, 1 }, - {61, 0, "Tiger", "Std", { "Flip", "Light" }, 1 }, - {46, 0, "V911s", "Std", { "Calib" }, 1 }, - {46, 1, "E119", "Std", { "Calib" }, 1 }, - {62, 0, "XK", "X450", { "FMode", "TakeOf", "Emerg", "3D_6G", "Pict", "Video" }, 1 }, - {62, 1, "XK", "X420", { "FMode", "TakeOf", "Emerg", "3D_6G", "Pict", "Video" }, 1 }, - {8 , 0, "YD717", "Std", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, - {8 , 1, "YD717", "SkyWlkr", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, - {8 , 2, "YD717", "Simax4", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, - {8 , 3, "YD717", "XinXun", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, - {8 , 4, "YD717", "NiHui", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, - {65,0, "FrSkyR9", "R9_915", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {65,1, "FrSkyR9", "R9_868", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {65,2, "FrSkyR9", "R9_915_8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {65,3, "FrSkyR9", "R9_968_8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {56, 0, "Flysky2A RX", "RX", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, - --- Need first 4 channels changed... - {19, 0, "Shenqi", "Cycle", { }, 1 }, - {4 , 1, "Hisky", "HK310", { "Aux" }, 0 }, - {43, 0, "Traxxas", "6519", { }, 0 }, - {52, 0, "ZSX", "280", { "Light" }, 1 }, - {48, 0, "V761", "Std", { "Gyro" }, 1 }, - {49, 0, "KF606", "Std", { "Trim" }, 1 }, - {47, 0, "GD00x", "V1", { "Trim", "LED", "Rate" }, 1 }, - {47, 1, "GD00x", "V2", { "Trim", "LED", "Rate" }, 1 }, - {58, 0, "FX816", "P38", { },1 } -} +local protocol = 0 +local sub_protocol = 0 +local f_seek = 0 +local channel_names={} +local num_search = "Searching" local function drawScreenTitle(title) if LCD_W == 480 then @@ -203,33 +54,14 @@ function bitand(a, b) return result end -local function Multi_Draw_LCD() +local function Multi_Draw_LCD(event) local line = 0 - local module_conf = {} - local module_pos = "Internal" lcd.clear() drawScreenTitle("Multi channels namer") - module_conf = model.getModule(0) - if module_conf["Type"] ~= 6 then - module_pos = "External" - module_conf = model.getModule(1) - if module_conf["Type"] ~= 6 then - if LCD_W == 480 then - lcd.drawText(10,50,"No Multi module configured...", BLINK) - else - --Draw on LCD_W=128 - lcd.drawText(2,17,"No Multi module configured...",SMLSIZE) - end - return - end - end - - local protocol = module_conf["protocol"] - local sub_protocol = module_conf["subProtocol"] --Display settings - local lcd_opt + local lcd_opt = 0 if LCD_W == 480 then x_pos = 10 y_pos = 32 @@ -241,6 +73,180 @@ local function Multi_Draw_LCD() lcd_opt = SMLSIZE end + --Multi Module detection + if module_conf["Type"] ~= 6 then + if LCD_W == 480 then + lcd.drawText(10,50,"No Multi module configured...", BLINK) + else + --Draw on LCD_W=128 + lcd.drawText(2,17,"No Multi module configured...",SMLSIZE) + end + return + else + lcd.drawText(x_pos, y_pos+y_inc*line,module_pos .. " Multi detected.", lcd_opt) + line = line + 1 + end + + --Channel order + if (ch_order == -1) then + lcd.drawText(x_pos, y_pos+y_inc*line,"Channels order can't be read from Multi...", lcd_opt) + line = line + 1 + end + + --Can't open file MultiChan.txt + if file_ok == 0 then + lcd.drawText(x_pos, y_pos+y_inc*line,"Can't read MultiChan.txt file...", lcd_opt) + return + end + + if ( protocol_name == "" or sub_protocol_name == "" ) and f_seek ~=-1 then + local f = io.open("/SCRIPTS/TOOLS/MultiChan.txt", "r") + if f == nil then return end + lcd.drawText(x_pos, y_pos+y_inc*line,num_search, lcd_opt) + num_search = num_search .. "." + if #num_search > 15 then + num_search = string.sub(num_search,1,9) + end + local proto = 0 + local sub_proto = 0 + local proto_name = "" + local sub_proto_name = "" + local channels = "" + local nbr_try = 0 + local nbr_car = 0 + repeat + io.seek(f, f_seek) + local data = io.read(f, 100) -- read 100 characters + if #data ==0 then + f_seek = -1 -- end of file + break + end + proto, sub_proto, proto_name, sub_proto_name, bind_ch, channels = string.match(data,'(%d+),(%d),([%w-_ ]+),([%w-_ ]+),(%d)(.+)') + if proto ~= nil and sub_proto ~= nil and protocol_name ~= nil and sub_protocol_name ~= nil and bind_ch ~= nil then + if tonumber(proto) == protocol and tonumber(sub_proto) == sub_protocol then + protocol_name = proto_name + sub_protocol_name = sub_proto_name + bind_ch = tonumber(bind_ch) + if channels ~= nil then + --extract channel names + nbr_car = string.find(channels, "\r") + if nbr_car == nil then nbr_car = string.find(channels, "\n") end + if nbr_car ~= nil then + channels = string.sub(channels,1,nbr_car-1) + end + local i = 5 + for k in string.gmatch(channels, ",([%w-_ ]+)") do + channel_names[i] = k + i = i + 1 + end + end + f_seek = -1 -- protocol found + break + end + end + if f_seek ~= -1 then + nbr_car = string.find(data, "\n") + if nbr_car == nil then nbr_car = string.find(data, "\r") end + if nbr_car == nil then + f_seek = -1 -- end of file + break + end + f_seek = f_seek + nbr_car -- seek to next line + nbr_try = nbr_try + 1 + end + until nbr_try > 20 or f_seek == -1 + io.close(f) + end + + if f_seek ~= -1 then + return -- continue searching... + end + + --Protocol & Sub_protocol + if protocol_name == "" or sub_protocol_name == "" then + lcd.drawText(x_pos, y_pos+y_inc*line,"Unknown protocol "..tostring(protocol).."/"..tostring(sub_protocol).." ...", lcd_opt) + return + elseif LCD_W > 128 then + lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name .. " / SubProtocol: " .. sub_protocol_name, lcd_opt) + line = line + 1 + else + lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name, lcd_opt) + line = line + 1 + lcd.drawText(x_pos, y_pos+y_inc*line,"SubProtocol: " .. sub_protocol_name, lcd_opt) + line = line + 1 + end + + text1="" + text2="" + for i,v in ipairs(channel_names) do + if i<=8 then + if i==1 then + text1 = v + else + text1=text1 .. "," .. v + end + else + if i==9 then + text2 = v + else + text2=text2 .. "," .. v + end + end + end + if LCD_W > 128 then + lcd.drawText(x_pos, y_pos+y_inc*line,"Channels: " .. text1, lcd_opt) + line = line + 1 + if text2 ~= "" then + lcd.drawText(x_pos*9, y_pos+y_inc*line,text2, lcd_opt) + line = line + 1 + end + end + + if event ~= EVT_VIRTUAL_ENTER and done == 0 then + lcd.drawText(x_pos, y_pos+y_inc*line," Save", lcd_opt + INVERS + BLINK) + return + end + + lcd.drawText(x_pos, y_pos+y_inc*line,"Setting channel names.", lcd_opt) + line = line + 1 + local output, nbr + if done == 0 then + for i,v in ipairs(channel_names) do + output = model.getOutput(i-1) + output["name"] = v + model.setOutput(i-1,output) + nbr = i + end + for i = nbr, 15 do + output = model.getOutput(i) + output["name"] = "n-a" + model.setOutput(i,output) + end + if bind_ch == 1 then + output = model.getOutput(15) + output["name"] = "BindCH" + model.setOutput(15,output) + end + done = 1 + end + lcd.drawText(x_pos, y_pos+y_inc*line,"Done!", lcd_opt) + line = line + 1 +end + +-- Init +local function Multi_Init() + module_conf = model.getModule(0) + if module_conf["Type"] ~= 6 then + module_pos = "External" + module_conf = model.getModule(1) + if module_conf["Type"] ~= 6 then + return + end + end + + protocol = module_conf["protocol"] + sub_protocol = module_conf["subProtocol"] + --Exceptions on first 4 channels... local stick_names = { "Rud", "Ele", "Thr", "Ail" } if ( protocol == 4 and sub_protocol ==1 ) or protocol == 19 or protocol == 52 then -- Hisky/HK310, Shenqi, ZSX @@ -257,7 +263,6 @@ local function Multi_Draw_LCD() end --Determine fist 4 channels order - local channel_names={} local ch_order=module_conf["channelsOrder"] if (ch_order == -1) then channel_names[1] = stick_names[defaultChannel(0)+1] @@ -273,91 +278,11 @@ local function Multi_Draw_LCD() ch_order = math.floor(ch_order/4) channel_names[bitand(ch_order,3)+1] = stick_names[1] end - - --Specific channels for protocol - local protocol_name, sub_protocol_name, bind_ch - for i,v in ipairs(Protocols) do - if v[1] == protocol and v[2] == sub_protocol then - protocol_name = v[3] - sub_protocol_name = v[4] - for j,w in ipairs(v[5]) do - channel_names[4+j]=w; - end - bind_ch = v[6] - end - end - - lcd.drawText(x_pos, y_pos+y_inc*line,module_pos .. " Multi detected.", lcd_opt) - line = line + 1 - if (ch_order == -1) then - lcd.drawText(x_pos, y_pos+y_inc*line,"Channels order can't be read from Multi...", lcd_opt) - line = line + 1 - end - if protocol_name == nil or sub_protocol_name == nil then - lcd.drawText(x_pos, y_pos+y_inc*line,"Unknown protocol "..tostring(protocol).."/"..tostring(sub_protocol).." ...", lcd_opt) - else if LCD_W > 128 then - lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name .. " / SubProtocol: " .. sub_protocol_name, lcd_opt) - line = line + 1 - else - lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name, lcd_opt) - line = line + 1 - lcd.drawText(x_pos, y_pos+y_inc*line,"SubProtocol: " .. sub_protocol_name, lcd_opt) - line = line + 1 - end - text1="" - text2="" - for i,v in ipairs(channel_names) do - if i<=8 then - if i==1 then - text1 = v - else - text1=text1 .. "," .. v - end - else - if i==9 then - text2 = v - else - text2=text2 .. "," .. v - end - end - end - if LCD_W > 128 then - lcd.drawText(x_pos, y_pos+y_inc*line,"Channels: " .. text1, lcd_opt) - line = line + 1 - if text2 ~= "" then - lcd.drawText(x_pos*9, y_pos+y_inc*line,text2, lcd_opt) - line = line + 1 - end - end - lcd.drawText(x_pos, y_pos+y_inc*line,"Setting channel names.", lcd_opt) - line = line + 1 - local output, nbr - if done == 0 then - for i,v in ipairs(channel_names) do - output = model.getOutput(i-1) - output["name"] = v - model.setOutput(i-1,output) - nbr = i - end - for i = nbr, 15 do - output = model.getOutput(i) - output["name"] = "n-a" - model.setOutput(i,output) - end - if bind_ch == 1 then - output = model.getOutput(15) - output["name"] = "BindCH" - model.setOutput(15,output) - end - done = 1 - end - lcd.drawText(x_pos, y_pos+y_inc*line,"Done!", lcd_opt) - line = line + 1 - end -end - --- Init -local function Multi_Init() + --Check MultiChan.txt + local f = io.open("/SCRIPTS/TOOLS/MultiChan.txt", "r") + if f == nil then return end + file_ok = 1 + io.close(f) end -- Main @@ -366,8 +291,8 @@ local function Multi_Run(event) error("Cannot be run as a model script!") return 2 else - Multi_Draw_LCD() - if event == EVT_VIRTUAL_ENTER or event == EVT_VIRTUAL_EXIT then + Multi_Draw_LCD(event) + if event == EVT_VIRTUAL_EXIT then return 2 end end diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/MultiChan.txt b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/MultiChan.txt new file mode 100644 index 000000000..bf61d8ca6 --- /dev/null +++ b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/MultiChan.txt @@ -0,0 +1,157 @@ +1,0,Flysky,Flysky,0,CH5,CH6,CH7,CH8 +1,1,Flysky,V9x9,1,Flip,Light,Pict,Video +1,2,Flysky,V6x6,1,Flip,Light,Pict,Video,HLess,RTH,XCAL,YCAL +1,3,Flysky,V912,1,BtmBtn,TopBtn +1,4,Flysky,CX20,0,CH5,CH6,CH7 +28,0,Flysky_AFHDS2A,PWM_IBUS,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 +28,1,Flysky_AFHDS2A,PPM_IBUS,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 +28,2,Flysky_AFHDS2A,PWM_SBUS,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 +28,3,Flysky_AFHDS2A,PPM_SBUS,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 +53,0,Flyzone,FZ-410,0 +2,0,Hubsan,H107,1,Flip,Light,Pict,Video,HLess +2,1,Hubsan,H301,0,RTH,Light,Stab,Video +2,2,Hubsan,H501,0,RTH,Light,Pict,Video,HLess,GPS_H,ALT_H,Flip,FModes +41,0,Bugs,3-6-8,0,Arm,Angle,Flip,Pict,Video,LED +60,0,Pelikan,PRO_V4,0,CH5,CH6,CH7,CH8 +37,0,Corona,COR_V1,0,CH5,CH6,CH7,CH8 +37,1,Corona,COR_V2,0,CH5,CH6,CH7,CH8 +37,2,Corona,FD_V3,0,CH5,CH6,CH7,CH8 +25,0,FrSkyV,V8,0,CH5,CH6,CH7,CH8 +3,0,FrSkyD,D8,0,CH5,CH6,CH7,CH8 +3,0,FrSkyD,D8Cloned,0,CH5,CH6,CH7,CH8 +67,0,FrSkyL,LR12,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12 +67,1,FrSkyL,LR12_6CH,0,CH5,CH6 +15,0,FrSkyX,D16_FCC,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +15,1,FrSkyX,D16_8CH_FCC,0,CH5,CH6,CH7,CH8 +15,2,FrSkyX,D16_LBT,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +15,3,FrSkyX,D16_8CH_LBT,0,CH5,CH6,CH7,CH8 +15,4,FrSkyX,D16Cloned,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +64,0,FrSkyX2,D16_FCC,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +64,1,FrSkyX2,D16_8CH_FCC,0,CH5,CH6,CH7,CH8 +64,2,FrSkyX2,D16_LBT,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +64,3,FrSkyX2,D16_8CH_LBT,1,CH5,CH6,CH7,CH8 +64,4,FrSkyX2,D16Cloned,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +55,0,FrSkyRX,RX,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +55,1,FrSkyRX,CloneTX,0 +39,0,Hitec,Opt_Fw,0,CH5,CH6,CH7,CH8,CH9 +39,1,Hitec,Opt_Hub,0,CH5,CH6,CH7,CH8,CH9 +39,2,Hitec,Minima,0,CH5,CH6,CH7,CH8,CH9 +57,0,HoTT,Std,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12 +21,0,SFHSS,Std,0,CH5,CH6,CH7,CH8 +68,0,Skyartec,Std,0,CH5,CH6,CH7 +7,0,Devo,8CH,0,CH5,CH6,CH7,CH8 +7,1,Devo,10CH,0,CH5,CH6,CH7,CH8,CH9,CH10 +7,2,Devo,12CH,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12 +7,3,Devo,6CH,0,CH5,CH6 +7,4,Devo,7CH,0,CH5,CH6,CH7 +30,0,WK2x01,WK2801,0,CH5,CH6,CH7,CH8 +30,1,WK2x01,WK2401,0 +30,2,WK2x01,W6_5_1,0,Gear,Dis,Gyro +30,3,WK2x01,W6_6_1,0,Gear,Col,Gyro +30,4,WK2x01,W6HEL,0,Gear,Col,Gyro +30,5,WK2x01,W6HEL_I,0,Gear,Col,Gyro +6,0,DSM,2_22,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,n-a,ThKill +6,1,DSM,2_11,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,n-a,ThKill +6,2,DSM,X_22,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,n-a,ThKill +6,3,DSM,X_11,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,n-a,ThKill +22,0,J6Pro,Std,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12 +22,0,WFLY,WFR0xS,0,CH5,CH6,CH7,CH8,CH9 +24,0,Assan,Std,0,CH5,CH6,CH7,CH8 +14,0,Bayang,Std,1,Flip,RTH,Pict,Video,HLess,Invert,Rates,n-a,n-a,AnAux1,AnAux2 +14,1,Bayang,H8S3D,1,Flip,RTH,Pict,Video,HLess,Invert,Rates +14,2,Bayang,X16_AH,1,Flip,RTH,Pict,Video,HLess,Invert,Rates,TakeOf +14,3,Bayang,IRDRONE,1,Flip,RTH,Pict,Video,HLess,Invert,Rates,TakeOf,EmStop +14,4,Bayang,DHD_D4,1,Flip,RTH,Pict,Video,HLess,Invert,Rates,TakeOf,EmStop +59,0,BayangRX,RX,1,AnAux1,AnAux2,Flip,RTH,Pict,Video +42,0,BugsMini,Mini,0,Arm,Angle,Flip,Pict,Video,LED +42,1,BugsMini,3H,0,Arm,Angle,Flip,Pict,Video,LED,AltHol +34,0,Cabell,V3,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +34,1,Cabell,V3Telem,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +13,0,CG023,Std,1,Flip,Light,Pict,Video,HLess +13,1,CG023,YD829,1,Flip,n-a,Pict,Video,HLess +12,0,CX10,Green,1,Flip,Rate +12,1,CX10,Blue,1,Flip,Rate,Pict,Video +12,2,CX10,DM007,1,Flip,Mode,Pict,Video,HLess +12,4,CX10,JC3015_1,1,Flip,Mode,Pict,Video +12,5,CX10,JC3015_2,1,Flip,Mode,LED,DFlip +12,6,CX10,MK33041,1,Flip,Mode,Pict,Video,HLess,RTH +33,0,DM022,Std,1,Flip,LED,Cam1,Cam2,HLess,RTH,RLow +45,0,E01X,E012,1,n-a,Flip,n-a,HLess,RTH +45,1,E01X,E015,1,Arm,Flip,LED,HLess,RTH +45,2,E01X,E016H,1,Stop,Flip,n-a,HLess,RTH +16,0,ESKY,Std,0,Gyro,Pitch +16,1,ESKY,ET4,0,Gyro,Pitch +35,0,ESKY150,4CH,0 +35,1,ESKY150,7CH,0,FMode,Aux6,Aux7 +20,0,FY326,FY326,1,Flip,RTH,HLess,Expert,Calib +20,1,FY326,FY319,1,Flip,RTH,HLess,Expert,Calib +23,0,FY326,FY326,1,Flip,RTH,HLess,Expert +32,0,GW008,FY326,1,Flip +36,0,H8_3D,Std,1,Flip,Light,Pict,Video,RTH,FlMode,Cal1 +36,1,H8_3D,H20H,1,Flip,Light,Pict,Video,Opt1,Opt2,Cal1,Cal2,Gimbal +36,2,H8_3D,H20,1,Flip,Light,Pict,Video,Opt1,Opt2,Cal1,Cal2,Gimbal +36,3,H8_3D,H30,1,Flip,Light,Pict,Video,Opt1,Opt2,Cal1,Cal2,Gimbal +4,0,Hisky,Std,0,Gear,Pitch,Gyro,CH8 +9,0,KN,WLToys,0,DRate,THold,IdleUp,Gyro,Ttrim,Atrim,Etrim +9,1,KN,Feilun,0,DRate,THold,IdleUp,Gyro,Ttrim,Atrim,Etrim +26,0,Hontai,Std,1,Flip,LED,Pict,Video,HLess,RTH,Calib +26,1,Hontai,JJRCX1,1,Flip,Arm,Pict,Video,HLess,RTH,Calib +26,2,Hontai,X5C1,1,Flip,Arm,Pict,Video,HLess,RTH,Calib +26,3,Hontai,FQ777_951,1,Flip,Arm,Pict,Video,HLess,RTH,Calib +18,0,MJXQ,WHL08,1,Flip,LED,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate +18,1,MJXQ,X600,1,Flip,LED,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate +18,2,MJXQ,X800,1,Flip,LED,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate +18,3,MJXQ,H26D,1,Flip,LED,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate +18,4,MJXQ,E010,1,Flip,LED,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate +18,5,MJXQ,H26WH,1,Flip,Arm,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate +18,6,MJXQ,Phoenix,1,Flip,Arm,Pict,Video,HLess,RTH,AuFlip,Pan,Tilt,Rate +17,0,MT99XX,Std,1,Flip,LED,Pict,Video,HLess +17,1,MT99XX,H7,1,Flip,LED,Pict,Video,HLess +17,2,MT99XX,YZ,1,Flip,LED,Pict,Video,HLess +17,3,MT99XX,LS,1,Flip,Invert,Pict,Video,HLess +17,4,MT99XX,FY805,1,Flip,n-a,n-a,n-a,HLess +44,0,NCC1701,Std,1,Warp +51,0,Potensic,A20,1,TakLan,Emerg,Mode,HLess +66,0,Propel,74-Z,1,LEDs,RollCW,RolCCW,Fire,Weapon,Calib,AltHol,TakeOf,Land,Train +29,0,Q2x2,Q222,1,Flip,LED,Mod2,Mod1,HLess,RTH,XCal,YCal +29,1,Q2x2,Q242,1,Flip,LED,Pict,Video,HLess,RTH,XCal,YCal +29,2,Q2x2,Q282,1,Flip,LED,Pict,Video,HLess,RTH,XCal,YCal +31,0,Q303,Q303,1,AltHol,Flip,Pict,Video,HLess,RTH,Gimbal +31,1,Q303,C35,1,Arm,VTX,Pict,Video,n-a,RTH,Gimbal +31,2,Q303,CX10D,1,Arm,Flip +31,3,Q303,CX10WD,1,Arm,Flip +50,0,Redpine,Fast,0,sCH5,sCH6,sCH7,sCH8,sCH9,sCH10,sCH11,sCH12,sCH13,sCH14,sCH15,sCH16 +50,1,Redpine,Slow,0,sCH5,sCH6,sCH7,sCH8,sCH9,sCH10,sCH11,sCH12,sCH13,sCH14,sCH15,sCH16 +11,0,SLT,V1,0,Gear,Pitch +11,1,SLT,V2,0,CH5,CH6,CH7,CH8 +11,2,SLT,Q100,0,Rates,n-a,CH7,CH8,Mode,Flip,n-a,n-a,Calib +11,3,SLT,Q200,0,Rates,n-a,CH7,CH8,Mode,VidOn,VidOff,Calib +11,4,SLT,MR100,0,Rates,n-a,CH7,CH8,Mode,Flip,Video,Pict +10,0,Symax,Std,1,Flip,Rates,Pict,Video,HLess +10,1,Symax,X5C,1,Flip,Rates,Pict,Video,HLess +5,0,V2x2,Std,1,Flip,Light,Pict,Video,HLess,CalX,CalY +5,1,V2x2,JXD506,1,Flip,Light,Pict,Video,HLess,StaSto,Emerg,Cam_UD +61,0,Tiger,Std,1,Flip,Light +46,0,V911s,Std,1,Calib +46,1,E119,Std,1,Calib +62,0,XK,X450,1,FMode,TakeOf,Emerg,3D_6G,Pict,Video +62,1,XK,X420,1,FMode,TakeOf,Emerg,3D_6G,Pict,Video +8,0,YD717,Std,1,Flip,Light,Pict,Video,HLess +8,1,YD717,SkyWlkr,1,Flip,Light,Pict,Video,HLess +8,2,YD717,Simax4,1,Flip,Light,Pict,Video,HLess +8,3,YD717,XinXun,1,Flip,Light,Pict,Video,HLess +8,4,YD717,NiHui,1,Flip,Light,Pict,Video,HLess +65,0,FrSkyR9,R9_915,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +65,1,FrSkyR9,R9_868,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14,CH15,CH16 +65,2,FrSkyR9,R9_915_8CH,0,CH5,CH6,CH7,CH8 +65,3,FrSkyR9,R9_968_8CH,0,CH5,CH6,CH7,CH8 +56,0,Flysky2A_RX,RX,0,CH5,CH6,CH7,CH8,CH9,CH10,CH11,CH12,CH13,CH14 +19,0,Shenqi,Cycle,1 +4,1,Hisky,HK310,0,Aux +43,0,Traxxas,6519,0 +52,0,ZSX,280,1,Light +48,0,V761,Std,1,Gyro +49,0,KF606,Std,1,Trim +47,0,GD00x,V1,1,Trim,LED,Rate +47,1,GD00x,V2,1,Trim,LED,Rate +58,0,FX816,P38,1 diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/MultiChannelsUpdater.lua b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/MultiChannelsUpdater.lua index 2bd2e1a73..42de75e4f 100644 --- a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/MultiChannelsUpdater.lua +++ b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/MultiChannelsUpdater.lua @@ -1,3 +1,4 @@ + local toolName = "TNS|Multi chan namer|TNE" ---- ######################################################################### @@ -17,168 +18,18 @@ local toolName = "TNS|Multi chan namer|TNE" ---- # # ---- ######################################################################### +local protocol_name = "" +local sub_protocol_name = "" +local bind_ch = 0 +local module_conf = {} +local module_pos = "Internal" +local file_ok = 0 local done = 0 -local Protocols = { - {1, 0, "Flysky", "Flysky", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {1, 1, "Flysky", "V9x9", { "Flip", "Light", "Pict", "Video" }, 1 }, - {1, 2, "Flysky", "V6x6", { "Flip", "Light", "Pict", "Video", "HLess", "RTH", "XCAL", "YCAL" }, 1 }, - {1, 3, "Flysky", "V912", { "BtmBtn", "TopBtn" }, 1 }, - {1, 4, "Flysky", "CX20", { "CH5", "CH6", "CH7" }, 0 }, - {28, 0, "Flysky AFHDS2A", "PWM_IBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, - {28, 1, "Flysky AFHDS2A", "PPM_IBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, - {28, 2, "Flysky AFHDS2A", "PWM_SBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, - {28, 3, "Flysky AFHDS2A", "PPM_SBUS", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, - {53, 0, "Flyzone", "FZ-410", { }, 0 }, - {2, 0, "Hubsan", "H107", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, - {2, 1, "Hubsan", "H301", { "RTH", "Light", "Stab", "Video" }, 0 }, - {2, 2, "Hubsan", "H501", { "RTH", "Light", "Pict", "Video", "HLess", "GPS_H", "ALT_H", "Flip", "FModes" }, 0 }, - {41, 0, "Bugs", "3-6-8", { "Arm", "Angle", "Flip", "Pict", "Video", "LED" }, 0 }, - {60, 0, "Pelikan", "PRO_V4", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {37, 0, "Corona", "COR_V1", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {37, 1, "Corona", "COR_V2", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {37, 2, "Corona", "FD_V3", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {25, 0, "FrSkyV", "V8", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {3, 0, "FrSkyD", "D8", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {3, 0, "FrSkyD", "D8Cloned", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {67, 0, "FrSkyL", "LR12", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 }, - {67, 1, "FrSkyL", "LR12_6CH", { "CH5", "CH6" }, 0 }, - {15, 0, "FrSkyX", "D16 FCC", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {15, 1, "FrSkyX", "D16_8CH FCC", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {15, 2, "FrSkyX", "D16 LBT", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {15, 3, "FrSkyX", "D16_8CH LBT", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {15, 4, "FrSkyX", "D16Cloned", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {64, 0, "FrSkyX2", "D16 FCC", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {64, 1, "FrSkyX2", "D16_8CH FCC", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {64, 2, "FrSkyX2", "D16 LBT", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {64, 3, "FrSkyX2", "D16_8CH LBT", { "CH5", "CH6", "CH7", "CH8" }, 1 }, - {64, 4, "FrSkyX2", "D16Cloned", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {55, 0, "FrSkyRX", "RX", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {55, 1, "FrSkyRX", "CloneTX", { }, 0 }, - {39, 0, "Hitec", "Opt_Fw", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 }, - {39, 1, "Hitec", "Opt_Hub", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 }, - {39, 2, "Hitec", "Minima", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 }, - {57, 0, "HoTT", "Std", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 }, - {21, 0, "SFHSS", "Std", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {68, 0, "Skyartec", "Std", { "CH5", "CH6", "CH7" }, 0 }, - {7 , 0, "Devo", "8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {7 , 1, "Devo", "10CH", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10" }, 0 }, - {7 , 2, "Devo", "12CH", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 }, - {7 , 3, "Devo", "6CH", { "CH5", "CH6" }, 0 }, - {7 , 4, "Devo", "7CH", { "CH5", "CH6", "CH7" }, 0 }, - {30, 0, "WK2x01", "WK2801", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {30, 1, "WK2x01", "WK2401", { }, 0 }, - {30, 2, "WK2x01", "W6_5_1", { "Gear", "Dis", "Gyro" }, 0 }, - {30, 3, "WK2x01", "W6_6_1", { "Gear", "Col", "Gyro" }, 0 }, - {30, 4, "WK2x01", "W6HEL", { "Gear", "Col", "Gyro" }, 0 }, - {30, 5, "WK2x01", "W6HEL_I", { "Gear", "Col", "Gyro" }, 0 }, - {6 , 0, "DSM", "2_22", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 }, - {6 , 1, "DSM", "2_11", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 }, - {6 , 2, "DSM", "X_22", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 }, - {6 , 3, "DSM", "X_11", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "n-a", "ThKill" }, 0 }, - {22, 0, "J6Pro", "Std", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12" }, 0 }, - {22, 0, "WFLY", "WFR0xS", { "CH5", "CH6", "CH7", "CH8", "CH9" }, 0 }, - {24, 0, "Assan", "Std", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {14, 0, "Bayang", "Std", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "n-a", "n-a", "AnAux1", "AnAux2" }, 1 }, - {14, 1, "Bayang", "H8S3D", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates" }, 1 }, - {14, 2, "Bayang", "X16_AH", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "TakeOf" }, 1 }, - {14, 3, "Bayang", "IRDRONE", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "TakeOf", "EmStop" }, 1 }, - {14, 4, "Bayang", "DHD_D4", { "Flip", "RTH", "Pict", "Video", "HLess", "Invert", "Rates", "TakeOf", "EmStop" }, 1 }, - {59, 0, "BayangRX", "RX", { "AnAux1", "AnAux2", "Flip", "RTH", "Pict", "Video" }, 1 }, - {42, 0, "BugsMini", "Mini", { "Arm", "Angle", "Flip", "Pict", "Video", "LED" }, 0 }, - {42, 1, "BugsMini", "3H", { "Arm", "Angle", "Flip", "Pict", "Video", "LED", "AltHol" }, 0 }, - {34, 0, "Cabell", "V3", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {34, 1, "Cabell", "V3Telem", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {13, 0, "CG023", "Std", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, - {13, 1, "CG023", "YD829", { "Flip", "n-a", "Pict", "Video", "HLess" }, 1 }, - {12, 0, "CX10", "Green", { "Flip", "Rate" }, 1 }, - {12, 1, "CX10", "Blue", { "Flip", "Rate", "Pict", "Video" }, 1 }, - {12, 2, "CX10", "DM007", { "Flip", "Mode", "Pict", "Video", "HLess" }, 1 }, - {12, 4, "CX10", "JC3015_1", { "Flip", "Mode", "Pict", "Video" }, 1 }, - {12, 5, "CX10", "JC3015_2", { "Flip", "Mode", "LED", "DFlip" }, 1 }, - {12, 6, "CX10", "MK33041", { "Flip", "Mode", "Pict", "Video", "HLess", "RTH" }, 1 }, - {33, 0, "DM022", "Std", { "Flip", "LED", "Cam1", "Cam2", "HLess", "RTH", "RLow" }, 1 }, - {45, 0, "E01X", "E012", { "n-a", "Flip", "n-a", "HLess", "RTH" }, 1 }, - {45, 1, "E01X", "E015", { "Arm", "Flip", "LED", "HLess", "RTH" }, 1 }, - {45, 2, "E01X", "E016H", { "Stop", "Flip", "n-a", "HLess", "RTH" }, 1 }, - {16, 0, "ESKY", "Std", { "Gyro", "Pitch" }, 0 }, - {16, 1, "ESKY", "ET4", { "Gyro", "Pitch" }, 0 }, - {35, 0, "ESKY150", "4CH", { }, 0 }, - {35, 1, "ESKY150", "7CH", { "FMode", "Aux6", "Aux7" }, 0 }, - {20, 0, "FY326", "FY326", { "Flip", "RTH", "HLess", "Expert", "Calib" }, 1 }, - {20, 1, "FY326", "FY319", { "Flip", "RTH", "HLess", "Expert", "Calib" }, 1 }, - {23, 0, "FY326", "FY326", { "Flip", "RTH", "HLess", "Expert" }, 1 }, - {32, 0, "GW008", "FY326", { "Flip" }, 1 }, - {36, 0, "H8_3D", "Std", { "Flip", "Light", "Pict", "Video", "RTH", "FlMode", "Cal1" }, 1 }, - {36, 1, "H8_3D", "H20H", { "Flip", "Light", "Pict", "Video", "Opt1", "Opt2", "Cal1", "Cal2", "Gimbal" }, 1 }, - {36, 2, "H8_3D", "H20", { "Flip", "Light", "Pict", "Video", "Opt1", "Opt2", "Cal1", "Cal2", "Gimbal" }, 1 }, - {36, 3, "H8_3D", "H30", { "Flip", "Light", "Pict", "Video", "Opt1", "Opt2", "Cal1", "Cal2", "Gimbal" }, 1 }, - {4 , 0, "Hisky", "Std", { "Gear", "Pitch", "Gyro", "CH8" }, 0 }, - {9 , 0, "KN", "WLToys", { "DRate", "THold", "IdleUp", "Gyro", "Ttrim", "Atrim", "Etrim" }, 0 }, - {9 , 1, "KN", "Feilun", { "DRate", "THold", "IdleUp", "Gyro", "Ttrim", "Atrim", "Etrim" }, 0 }, - {26, 0, "Hontai", "Std", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 }, - {26, 1, "Hontai", "JJRCX1", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 }, - {26, 2, "Hontai", "X5C1", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 }, - {26, 3, "Hontai", "FQ777_951", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "Calib" }, 1 }, - {18, 0, "MJXQ", "WHL08", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, - {18, 1, "MJXQ", "X600", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, - {18, 2, "MJXQ", "X800", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, - {18, 3, "MJXQ", "H26D", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, - {18, 4, "MJXQ", "E010", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, - {18, 5, "MJXQ", "H26WH", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, - {18, 6, "MJXQ", "Phoenix", { "Flip", "Arm", "Pict", "Video", "HLess", "RTH", "AuFlip", "Pan", "Tilt", "Rate" }, 1 }, - {17, 0, "MT99XX", "Std", { "Flip", "LED", "Pict", "Video", "HLess" }, 1 }, - {17, 1, "MT99XX", "H7", { "Flip", "LED", "Pict", "Video", "HLess" }, 1 }, - {17, 2, "MT99XX", "YZ", { "Flip", "LED", "Pict", "Video", "HLess" }, 1 }, - {17, 3, "MT99XX", "LS", { "Flip", "Invert", "Pict", "Video", "HLess" }, 1 }, - {17, 4, "MT99XX", "FY805", { "Flip", "n-a", "n-a", "n-a", "HLess" }, 1 }, - {44, 0, "NCC1701", "Std", { "Warp" }, 1 }, - {51, 0, "Potensic", "A20", { "TakLan", "Emerg", "Mode", "HLess" }, 1 }, - {66, 0, "Propel", "74-Z", { "LEDs", "RollCW", "RolCCW", "Fire", "Weapon", "Calib", "AltHol", "TakeOf", "Land", "Train" }, 1 }, - {29, 0, "Q2x2", "Q222", { "Flip", "LED", "Mod2", "Mod1", "HLess", "RTH", "XCal", "YCal" }, 1 }, - {29, 1, "Q2x2", "Q242", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "XCal", "YCal" }, 1 }, - {29, 2, "Q2x2", "Q282", { "Flip", "LED", "Pict", "Video", "HLess", "RTH", "XCal", "YCal" }, 1 }, - {31, 0, "Q303", "Q303", { "AltHol", "Flip", "Pict", "Video", "HLess", "RTH", "Gimbal" }, 1 }, - {31, 1, "Q303", "C35", { "Arm", "VTX", "Pict", "Video", "n-a", "RTH", "Gimbal" }, 1 }, - {31, 2, "Q303", "CX10D", { "Arm", "Flip" }, 1 }, - {31, 3, "Q303", "CX10WD", { "Arm", "Flip" }, 1 }, - {50, 0, "Redpine", "Fast", { "sCH5", "sCH6", "sCH7", "sCH8", "sCH9", "sCH10", "sCH11", "sCH12", "sCH13", "sCH14", "sCH15", "sCH16" }, 0 }, - {50, 1, "Redpine", "Slow", { "sCH5", "sCH6", "sCH7", "sCH8", "sCH9", "sCH10", "sCH11", "sCH12", "sCH13", "sCH14", "sCH15", "sCH16" }, 0 }, - {11, 0, "SLT", "V1", { "Gear", "Pitch" }, 0 }, - {11, 1, "SLT", "V2", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {11, 2, "SLT", "Q100", { "Rates", "n-a", "CH7", "CH8", "Mode", "Flip", "n-a", "n-a", "Calib" }, 0 }, - {11, 3, "SLT", "Q200", { "Rates", "n-a", "CH7", "CH8", "Mode", "VidOn", "VidOff", "Calib" }, 0 }, - {11, 4, "SLT", "MR100", { "Rates", "n-a", "CH7", "CH8", "Mode", "Flip", "Video", "Pict" }, 0 }, - {10, 0, "Symax", "Std", { "Flip", "Rates", "Pict", "Video", "HLess" }, 1 }, - {10, 1, "Symax", "X5C", { "Flip", "Rates", "Pict", "Video", "HLess" }, 1 }, - {5 , 0, "V2x2", "Std", { "Flip", "Light", "Pict", "Video", "HLess", "CalX", "CalY" }, 1 }, - {5 , 1, "V2x2", "JXD506", { "Flip", "Light", "Pict", "Video", "HLess", "StaSto", "Emerg", "Cam_UD" }, 1 }, - {61, 0, "Tiger", "Std", { "Flip", "Light" }, 1 }, - {46, 0, "V911s", "Std", { "Calib" }, 1 }, - {46, 1, "E119", "Std", { "Calib" }, 1 }, - {62, 0, "XK", "X450", { "FMode", "TakeOf", "Emerg", "3D_6G", "Pict", "Video" }, 1 }, - {62, 1, "XK", "X420", { "FMode", "TakeOf", "Emerg", "3D_6G", "Pict", "Video" }, 1 }, - {8 , 0, "YD717", "Std", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, - {8 , 1, "YD717", "SkyWlkr", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, - {8 , 2, "YD717", "Simax4", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, - {8 , 3, "YD717", "XinXun", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, - {8 , 4, "YD717", "NiHui", { "Flip", "Light", "Pict", "Video", "HLess" }, 1 }, - {65,0, "FrSkyR9", "R9_915", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {65,1, "FrSkyR9", "R9_868", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14", "CH15", "CH16" }, 0 }, - {65,2, "FrSkyR9", "R9_915_8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {65,3, "FrSkyR9", "R9_968_8CH", { "CH5", "CH6", "CH7", "CH8" }, 0 }, - {56, 0, "Flysky2A RX", "RX", { "CH5", "CH6", "CH7", "CH8", "CH9", "CH10", "CH11", "CH12", "CH13", "CH14" }, 0 }, - --- Need first 4 channels changed... - {19, 0, "Shenqi", "Cycle", { }, 1 }, - {4 , 1, "Hisky", "HK310", { "Aux" }, 0 }, - {43, 0, "Traxxas", "6519", { }, 0 }, - {52, 0, "ZSX", "280", { "Light" }, 1 }, - {48, 0, "V761", "Std", { "Gyro" }, 1 }, - {49, 0, "KF606", "Std", { "Trim" }, 1 }, - {47, 0, "GD00x", "V1", { "Trim", "LED", "Rate" }, 1 }, - {47, 1, "GD00x", "V2", { "Trim", "LED", "Rate" }, 1 }, - {58, 0, "FX816", "P38", { },1 } -} +local protocol = 0 +local sub_protocol = 0 +local f_seek = 0 +local channel_names={} +local num_search = "Searching" local function drawScreenTitle(title) if LCD_W == 480 then @@ -203,33 +54,14 @@ function bitand(a, b) return result end -local function Multi_Draw_LCD() +local function Multi_Draw_LCD(event) local line = 0 - local module_conf = {} - local module_pos = "Internal" lcd.clear() drawScreenTitle("Multi channels namer") - module_conf = model.getModule(0) - if module_conf["Type"] ~= 6 then - module_pos = "External" - module_conf = model.getModule(1) - if module_conf["Type"] ~= 6 then - if LCD_W == 480 then - lcd.drawText(10,50,"No Multi module configured...", BLINK) - else - --Draw on LCD_W=128 - lcd.drawText(2,17,"No Multi module configured...",SMLSIZE) - end - return - end - end - - local protocol = module_conf["protocol"] - local sub_protocol = module_conf["subProtocol"] --Display settings - local lcd_opt + local lcd_opt = 0 if LCD_W == 480 then x_pos = 10 y_pos = 32 @@ -241,6 +73,180 @@ local function Multi_Draw_LCD() lcd_opt = SMLSIZE end + --Multi Module detection + if module_conf["Type"] ~= 6 then + if LCD_W == 480 then + lcd.drawText(10,50,"No Multi module configured...", BLINK) + else + --Draw on LCD_W=128 + lcd.drawText(2,17,"No Multi module configured...",SMLSIZE) + end + return + else + lcd.drawText(x_pos, y_pos+y_inc*line,module_pos .. " Multi detected.", lcd_opt) + line = line + 1 + end + + --Channel order + if (ch_order == -1) then + lcd.drawText(x_pos, y_pos+y_inc*line,"Channels order can't be read from Multi...", lcd_opt) + line = line + 1 + end + + --Can't open file MultiChan.txt + if file_ok == 0 then + lcd.drawText(x_pos, y_pos+y_inc*line,"Can't read MultiChan.txt file...", lcd_opt) + return + end + + if ( protocol_name == "" or sub_protocol_name == "" ) and f_seek ~=-1 then + local f = io.open("/SCRIPTS/TOOLS/MultiChan.txt", "r") + if f == nil then return end + lcd.drawText(x_pos, y_pos+y_inc*line,num_search, lcd_opt) + num_search = num_search .. "." + if #num_search > 15 then + num_search = string.sub(num_search,1,9) + end + local proto = 0 + local sub_proto = 0 + local proto_name = "" + local sub_proto_name = "" + local channels = "" + local nbr_try = 0 + local nbr_car = 0 + repeat + io.seek(f, f_seek) + local data = io.read(f, 100) -- read 100 characters + if #data ==0 then + f_seek = -1 -- end of file + break + end + proto, sub_proto, proto_name, sub_proto_name, bind_ch, channels = string.match(data,'(%d+),(%d),([%w-_ ]+),([%w-_ ]+),(%d)(.+)') + if proto ~= nil and sub_proto ~= nil and protocol_name ~= nil and sub_protocol_name ~= nil and bind_ch ~= nil then + if tonumber(proto) == protocol and tonumber(sub_proto) == sub_protocol then + protocol_name = proto_name + sub_protocol_name = sub_proto_name + bind_ch = tonumber(bind_ch) + if channels ~= nil then + --extract channel names + nbr_car = string.find(channels, "\r") + if nbr_car == nil then nbr_car = string.find(channels, "\n") end + if nbr_car ~= nil then + channels = string.sub(channels,1,nbr_car-1) + end + local i = 5 + for k in string.gmatch(channels, ",([%w-_ ]+)") do + channel_names[i] = k + i = i + 1 + end + end + f_seek = -1 -- protocol found + break + end + end + if f_seek ~= -1 then + nbr_car = string.find(data, "\n") + if nbr_car == nil then nbr_car = string.find(data, "\r") end + if nbr_car == nil then + f_seek = -1 -- end of file + break + end + f_seek = f_seek + nbr_car -- seek to next line + nbr_try = nbr_try + 1 + end + until nbr_try > 20 or f_seek == -1 + io.close(f) + end + + if f_seek ~= -1 then + return -- continue searching... + end + + --Protocol & Sub_protocol + if protocol_name == "" or sub_protocol_name == "" then + lcd.drawText(x_pos, y_pos+y_inc*line,"Unknown protocol "..tostring(protocol).."/"..tostring(sub_protocol).." ...", lcd_opt) + return + elseif LCD_W > 128 then + lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name .. " / SubProtocol: " .. sub_protocol_name, lcd_opt) + line = line + 1 + else + lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name, lcd_opt) + line = line + 1 + lcd.drawText(x_pos, y_pos+y_inc*line,"SubProtocol: " .. sub_protocol_name, lcd_opt) + line = line + 1 + end + + text1="" + text2="" + for i,v in ipairs(channel_names) do + if i<=8 then + if i==1 then + text1 = v + else + text1=text1 .. "," .. v + end + else + if i==9 then + text2 = v + else + text2=text2 .. "," .. v + end + end + end + if LCD_W > 128 then + lcd.drawText(x_pos, y_pos+y_inc*line,"Channels: " .. text1, lcd_opt) + line = line + 1 + if text2 ~= "" then + lcd.drawText(x_pos*9, y_pos+y_inc*line,text2, lcd_opt) + line = line + 1 + end + end + + if event ~= EVT_VIRTUAL_ENTER and done == 0 then + lcd.drawText(x_pos, y_pos+y_inc*line," Save", lcd_opt + INVERS + BLINK) + return + end + + lcd.drawText(x_pos, y_pos+y_inc*line,"Setting channel names.", lcd_opt) + line = line + 1 + local output, nbr + if done == 0 then + for i,v in ipairs(channel_names) do + output = model.getOutput(i-1) + output["name"] = v + model.setOutput(i-1,output) + nbr = i + end + for i = nbr, 15 do + output = model.getOutput(i) + output["name"] = "n-a" + model.setOutput(i,output) + end + if bind_ch == 1 then + output = model.getOutput(15) + output["name"] = "BindCH" + model.setOutput(15,output) + end + done = 1 + end + lcd.drawText(x_pos, y_pos+y_inc*line,"Done!", lcd_opt) + line = line + 1 +end + +-- Init +local function Multi_Init() + module_conf = model.getModule(0) + if module_conf["Type"] ~= 6 then + module_pos = "External" + module_conf = model.getModule(1) + if module_conf["Type"] ~= 6 then + return + end + end + + protocol = module_conf["protocol"] + sub_protocol = module_conf["subProtocol"] + --Exceptions on first 4 channels... local stick_names = { "Rud", "Ele", "Thr", "Ail" } if ( protocol == 4 and sub_protocol ==1 ) or protocol == 19 or protocol == 52 then -- Hisky/HK310, Shenqi, ZSX @@ -257,7 +263,6 @@ local function Multi_Draw_LCD() end --Determine fist 4 channels order - local channel_names={} local ch_order=module_conf["channelsOrder"] if (ch_order == -1) then channel_names[1] = stick_names[defaultChannel(0)+1] @@ -273,91 +278,11 @@ local function Multi_Draw_LCD() ch_order = math.floor(ch_order/4) channel_names[bitand(ch_order,3)+1] = stick_names[1] end - - --Specific channels for protocol - local protocol_name, sub_protocol_name, bind_ch - for i,v in ipairs(Protocols) do - if v[1] == protocol and v[2] == sub_protocol then - protocol_name = v[3] - sub_protocol_name = v[4] - for j,w in ipairs(v[5]) do - channel_names[4+j]=w; - end - bind_ch = v[6] - end - end - - lcd.drawText(x_pos, y_pos+y_inc*line,module_pos .. " Multi detected.", lcd_opt) - line = line + 1 - if (ch_order == -1) then - lcd.drawText(x_pos, y_pos+y_inc*line,"Channels order can't be read from Multi...", lcd_opt) - line = line + 1 - end - if protocol_name == nil or sub_protocol_name == nil then - lcd.drawText(x_pos, y_pos+y_inc*line,"Unknown protocol "..tostring(protocol).."/"..tostring(sub_protocol).." ...", lcd_opt) - else if LCD_W > 128 then - lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name .. " / SubProtocol: " .. sub_protocol_name, lcd_opt) - line = line + 1 - else - lcd.drawText(x_pos, y_pos+y_inc*line,"Protocol: " .. protocol_name, lcd_opt) - line = line + 1 - lcd.drawText(x_pos, y_pos+y_inc*line,"SubProtocol: " .. sub_protocol_name, lcd_opt) - line = line + 1 - end - text1="" - text2="" - for i,v in ipairs(channel_names) do - if i<=8 then - if i==1 then - text1 = v - else - text1=text1 .. "," .. v - end - else - if i==9 then - text2 = v - else - text2=text2 .. "," .. v - end - end - end - if LCD_W > 128 then - lcd.drawText(x_pos, y_pos+y_inc*line,"Channels: " .. text1, lcd_opt) - line = line + 1 - if text2 ~= "" then - lcd.drawText(x_pos*9, y_pos+y_inc*line,text2, lcd_opt) - line = line + 1 - end - end - lcd.drawText(x_pos, y_pos+y_inc*line,"Setting channel names.", lcd_opt) - line = line + 1 - local output, nbr - if done == 0 then - for i,v in ipairs(channel_names) do - output = model.getOutput(i-1) - output["name"] = v - model.setOutput(i-1,output) - nbr = i - end - for i = nbr, 15 do - output = model.getOutput(i) - output["name"] = "n-a" - model.setOutput(i,output) - end - if bind_ch == 1 then - output = model.getOutput(15) - output["name"] = "BindCH" - model.setOutput(15,output) - end - done = 1 - end - lcd.drawText(x_pos, y_pos+y_inc*line,"Done!", lcd_opt) - line = line + 1 - end -end - --- Init -local function Multi_Init() + --Check MultiChan.txt + local f = io.open("/SCRIPTS/TOOLS/MultiChan.txt", "r") + if f == nil then return end + file_ok = 1 + io.close(f) end -- Main @@ -366,8 +291,8 @@ local function Multi_Run(event) error("Cannot be run as a model script!") return 2 else - Multi_Draw_LCD() - if event == EVT_VIRTUAL_ENTER or event == EVT_VIRTUAL_EXIT then + Multi_Draw_LCD(event) + if event == EVT_VIRTUAL_EXIT then return 2 end end From 88070d1d3e4788af11865670abe94ec71d489f3e Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 4 May 2020 10:07:20 +0200 Subject: [PATCH 318/560] Cosmetics --- companion/src/mainwindow.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/companion/src/mainwindow.cpp b/companion/src/mainwindow.cpp index 35e15968b..06760fb41 100644 --- a/companion/src/mainwindow.cpp +++ b/companion/src/mainwindow.cpp @@ -916,14 +916,15 @@ void MainWindow::changelog() void MainWindow::customizeSplash() { - CustomizeSplashDialog * dialog = new CustomizeSplashDialog(this); + auto * dialog = new CustomizeSplashDialog(this); dialog->exec(); dialog->deleteLater(); } void MainWindow::writeEeprom() { - if (activeMdiChild()) activeMdiChild()->writeEeprom(); + if (activeMdiChild()) + activeMdiChild()->writeEeprom(); } void MainWindow::readEeprom() From 51633eac22bfa2356257869052478c7b3b00898c Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 4 May 2020 10:24:36 +0200 Subject: [PATCH 319/560] Cosmetics --- companion/src/mdichild.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/companion/src/mdichild.cpp b/companion/src/mdichild.cpp index 3c8c7c214..1a85aafb7 100644 --- a/companion/src/mdichild.cpp +++ b/companion/src/mdichild.cpp @@ -1490,18 +1490,18 @@ bool MdiChild::convertStorage(Board::Type from, Board::Type to, bool newFile) isUntitled = true; if (cstate.hasLogEntries(RadioDataConversionState::EVT_INF)) { - QDialog * msgBox = new QDialog(Q_NULLPTR, Qt::Dialog | Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint); + auto * msgBox = new QDialog(Q_NULLPTR, Qt::Dialog | Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint); - ExportableTableView * tv = new ExportableTableView(msgBox); + auto * tv = new ExportableTableView(msgBox); tv->setSortingEnabled(true); tv->verticalHeader()->hide(); tv->setModel(cstate.getLogModel(RadioDataConversionState::EVT_INF, tv)); tv->resizeColumnsToContents(); tv->resizeRowsToContents(); - QDialogButtonBox * btnBox = new QDialogButtonBox(QDialogButtonBox::Ok, this); + auto * btnBox = new QDialogButtonBox(QDialogButtonBox::Ok, this); - QVBoxLayout * lo = new QVBoxLayout(msgBox); + auto * lo = new QVBoxLayout(msgBox); lo->addWidget(new QLabel(tr("The conversion generated some important messages, please review them below."))); lo->addWidget(tv); lo->addWidget(btnBox); From fd45916489ab0f3be2158e11fbf3f19883fcbf28 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 4 May 2020 10:25:09 +0200 Subject: [PATCH 320/560] Cosmetics --- companion/src/firmwares/opentx/opentxeeprom.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index 7053118d5..7940a8547 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -1916,7 +1916,7 @@ class SensorField: public TransformedField { internalField.Append(new UnsignedField<32>(this, _param, "param")); } - virtual void beforeExport() + void beforeExport() override { if (sensor.type == SensorData::TELEM_TYPE_CUSTOM) { _id = sensor.id; @@ -2039,7 +2039,7 @@ class ModuleUnionField: public UnionField { module(module), rfProtExtra(0) { - ModuleData::Multi& multi = module.multi; + ModuleData::Multi & multi = module.multi; internalField.Append(new UnsignedField<3>(this, rfProtExtra)); internalField.Append(new BoolField<1>(this, multi.disableTelemetry)); internalField.Append(new BoolField<1>(this, multi.disableMapping)); @@ -2067,7 +2067,7 @@ class ModuleUnionField: public UnionField { private: StructField internalField; - ModuleData& module; + ModuleData & module; unsigned int rfProtExtra; }; @@ -2131,7 +2131,8 @@ class ModuleUnionField: public UnionField { memset(receiverName, 0, sizeof(receiverName)); } - bool select(const unsigned int& attr) const override { + bool select(const unsigned int& attr) const override + { return attr >= PULSES_ACCESS_ISRM && attr <= PULSES_ACCESS_R9M_LITE_PRO; } @@ -2139,7 +2140,6 @@ class ModuleUnionField: public UnionField { { for (int i=0; i Date: Mon, 4 May 2020 10:27:00 +0200 Subject: [PATCH 321/560] Module EEPROM save fails --- companion/src/firmwares/opentx/opentxeeprom.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index 7940a8547..f2275fe61 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -2057,7 +2057,6 @@ class ModuleUnionField: public UnionField { void beforeExport() override { rfProtExtra = (module.multi.rfProtocol & 0x70) >> 4; - module.multi.rfProtocol &= 0x0f; } void afterImport() override From 6fbfe02cd9ad104f50b20ce67f6420a128e217da Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 4 May 2020 11:31:34 +0200 Subject: [PATCH 322/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index ffa540fbc..90b3a280b 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1728,3 +1728,4 @@ Maksym Arshynkin Tomas Sodergren Jörg Lemnitz TMac FPV +Josef Schaeffler From d44facd3162a9581cbb273fb542a345689d80eaa Mon Sep 17 00:00:00 2001 From: DanielGeA <33811722+dgatf@users.noreply.github.com> Date: Mon, 4 May 2020 13:20:35 +0100 Subject: [PATCH 323/560] Update es translation of Companion (#7578) Update es translation --- CREDITS.txt | 1 + companion/src/translations/companion_es.ts | 9168 ++++++++++++-------- 2 files changed, 5610 insertions(+), 3559 deletions(-) diff --git a/CREDITS.txt b/CREDITS.txt index 90b3a280b..69e242fac 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -11,6 +11,7 @@ Arne Schwabe (schwabe) [Translators] [fr] Sebastien Charpentier (LapinFou) +[es] Daniel Gorbea (dgatf) [Other contributors] Rob Thomson diff --git a/companion/src/translations/companion_es.ts b/companion/src/translations/companion_es.ts index 7e1cf51d6..bdd44458d 100644 --- a/companion/src/translations/companion_es.ts +++ b/companion/src/translations/companion_es.ts @@ -11,22 +11,22 @@ Yes, controlled by a single channel - Si, controlado por un único canal + Sí, controlado por un único canal Yes, controlled by two channels - Si, controlado por dos canales + Sí, controlado por dos canales <br>First Aileron Channel: - <br>Canal Primer Alerón: + <br>Canal primer alerón: Second Aileron Channel: - Canal Segundo Alerón: + Canal segundo alerón: @@ -39,22 +39,22 @@ Yes, controlled by a single channel - Si, controlado por un único canal + Sí, controlado por un único canal Yes, controlled by two channels - Si, controlado por dos canales + Sí, controlado por dos canales <br>First Airbrake Channel: - <br>Primer Canal Aerofreno: + <br>Primer canal aerofreno: Second Airbrake Channel: - Segundo Canal Aerofreno: + Segundo canal aerofreno: @@ -63,22 +63,23 @@ Application Settings have been saved to %1 - + Los ajustes de la aplicación han sido grabados a +.%1 Could not save Application Settings to file "%1" - + No se han podido grabar los ajustes de la aplicación en el archivo "%1" because the file could not be saved (check access permissions). - + porque el archivo no se ha podido grabar (revisa los permisos). for unknown reasons. - + por causas desconocidas. @@ -86,48 +87,64 @@ Show this message again at next startup? - + ¿Mostrar este mensaje de nuevo en el siguiente inicio? AppPreferencesDialog + + Edit Settings - Editar Ajustes + Editar ajustes + + Radio Profile - Perfil de Radio + Perfil de radio - + + + Default Channel Order - Orden Prederterminado Canales + Orden prederterminado canales - + + + Build Options - Opciones Firmware + Opciones del firmware - + + + Menu Language - Lenguaje Menú + Lenguaje de los menús - + + + Default Stick Mode - Modo Prederterminado Sticks + Modo prederterminado sticks - + + + Select Image - Seleccionar Imagen + Seleccionar imagen - + + + Mode selection: Mode 1: @@ -147,508 +164,712 @@ Mode 4: Right stick: Elevator, Rudder - Selección de Modo: + Selección de modo: Modo 1: - Stick Izquierdo: Elevador, Timón - Stick Derecho: Acelerador, Alerón + Stick izquierdo: Elevador, Timón + Stick derecho: Acelerador, Alerón Modo 2: - Stick Izquierdo: Acelerador, Timón - Stick Derecho: Elevador, Alerón + Stick izquierdo: Acelerador, Timón + Stick derecho: Elevador, Alerón Modo 3: - Stick Izquierdo: Elevador, Alerón - Stick Derecho: Acelerador, Timón + Stick izquierdo: Elevador, Alerón + Stick derecho: Acelerador, Timón Modo 4: - Stick Izquierdo: Acelerador, Alerón - Stick Derecho: Elevador, Timón + Stick izquierdo: Acelerador, Alerón + Stick derecho: Elevador, Timón - + + + Mode 1 (RUD ELE THR AIL) Modo 1 (RUD ELE THR AIL) - + + + Mode 2 (RUD THR ELE AIL) - Modo 2 (RUD THR ELE AIL) + Modo 2 (RUD THR ELE AIL) - + + + Mode 3 (AIL ELE THR RUD) Modo 3 (AIL ELE THR RUD) - + + + Mode 4 (AIL THR ELE RUD) Modo 4 (AIL THR ELE RUD) - + + + Splash Screen - Pantalla de Inicio + Pantalla de inicio - - + + + + + + The profile specific folder, if set, will override general Backup folder - + La carpeta específica del perfil, si está fijada, anulará la carpeta de copia de seguridad general - + + + Backup folder - + Carpeta de copia de seguridad - + + + If set it will override the application general setting - + Si está fijado anulará los ajustes generales de la aplicación> - + + + if set, will override general backup enable - + si está fijado anulará la copia de seguridad general> - + + + <html><head/><body><p>Channel order</p><p><br/></p><p>Defines the order of the default mixes created on a new model.</p></body></html> <html><head/><body><p>Orden de los canales</p><p><br/></p><p>Define el orden por defecto de las mezclas en un nuevo modelo</p></body></html> - + + + R E T A - R E T A + - + + + R E A T - R E A T + - + + + R T E A - R T E A + - + + + R T A E - R T A E + - + + + R A E T - R A E T + - + + + R A T E - R A T E + - + + + E R T A - E R T A + - + + + E R A T - E R A T + - + + + E T R A - E T R A + - + + + E T A R - E T A R + - + + + E A R T - E A R T + - + + + E A T R - E A T R + - + + + T R E A - T R E A + - + + + T R A E - T R A E + - + + + T E R A - T E R A + - + + + T E A R - T E A R + - + + + T A R E - T A R E + - + + + T A E R - T A E R + - + + + A R E T - A R E T + - + + + A R T E - A R T E + - + + + A E R T - A E R T + - + + + A E T R - A E T R + - + + + A T R E - A T R E + - + + + A T E R - A T E R + - - - - - - + + + + + + + + + + + + + + + + + + Select Folder - + Selecciona carpeta - + + + Select Executable - + Selecciona ejecutable - + + + Release channel - + Canal de distribución - + + + Releases (stable) - + Releases (estable) - + + + Release candidates (testing) - + Release candidates (testing) - + + + Nightly builds (unstable) - + Nightly builds (inestable) - + + + Simulator Volume Gain - + Ganancia de volumen del simulador - + + + + Simulator controls + Controles de simulador + + + + + + Save switch/pot positions on simulator exit + Guardar las posiciones de interruptores/pots al salir del simulador + + + + + + Clear saved positions + Limpiar las posiciones guardadas + + + + + Profile Name - Nombre de Perfil + Nombre de perfil - + + + Clear Image - Limpiar Imagen + Limpiar imagen - + + + Append version number to FW file name - Agregar el número de version al nombre de archivo de Firmware + Agregar el número de versión al nombre de archivo de firmware - + + + Offer to write FW to Tx after download Ofrecer grabar el firmware al Tx después de la descarga - + + + Radio Type - Tipo de Radio + Tipo de radio - + + + Other Settings - Otros Ajustes + Otros ajustes - + + + General Settings - Ajustes Generales + Ajustes generales - + + + SD Structure path Estructura de archivos SD - + + + Application Settings - Ajustes Aplicación + Ajustes de la aplicación - + + + Show splash screen when Companion starts - Mostrar pantalla de inicion cuando Companion comience + Mostrar pantalla de inicio cuando Companion comience - + + + Automatic check for Companion updates Comprobar automáticamente actualizaciones de Companion - - + + + + + + Enable automatic backup before writing firmware Activar copia de seguridad automática antes de escribir el firmware - + + + Automatic check for OpenTX firmware updates - Comprobar auromaticamente actualizaciones del firmware OpenTX + Comprobar automáticamente actualizaciones del firmware OpenTX - + + + Splash Screen Library - Libreria de pantallas de inicio + Librería de pantallas de inicio - + + + Google Earth Executable Ejecutable Google Earth - + + + Only show user splash images - Mostrar solo pantallas de inicio del usuario + Mostrar sólo pantallas de inicio de usuario - + + + Show user and companion splash images - Mostrar pantallas de inicio del usuario y companion + Mostrar pantallas de inicio de usuario y companion - + + + User Splash Screens - Pantallas de Inicio del Usuario + Pantallas de inicio de usuario - + + + Automatic Backup Folder - Carpeta copia de seguridad Automática + Carpeta copia de seguridad automática - + + + Simulator Settings - Ajustes Simulador + Ajustes del simulador - + + + Simulator BackLight Luz de fondo del simulador - + + + Enable Activado - + + + most recently used files - + ficheros usados recientemente - + + + Startup Settings - + Ajustes de inicio - + + + Remember - + Recordar - + + + Output Logs Folder - + Carpeta de reportes - + + + <html><head/><body><p>This option maintains the behaviour from older OpenTx versions where empty model slots are preserved when a model is deleted or moved. </p><p>When this option is de-selected, the other models may be re-arranged to fill the gap left by the removed model.</p></body></html> - + <html><head/><body><p>Esta opción mantiene el comportamiento de las versiones anteriores de OpenTx donde se conservan los slots de modelos vacíos cuando se elimina o mueve un modelo. </p><p>Cuando esta opción no está seleccionada, los otros modelos pueden reordenarse para llenar el hueco dejado por el modelo borrado.</p></body></html> - + + + Remove empty model slots when deleting models (only applies for radios w/out categories) - + Eliminar los slots vacíos cuando se borran modelos (sólo aplica a radios sin categorías) - + + + Use model wizard - + Usar el asistente de modelos - + + + Open model editor - + Abrir el editor de modelos - + + + Just create the model - + Sólo crear el modelo - + + + Debug Output Logging - + Reporte de depuración - + + + <html><head/><body><p>Keep a log of all debugging messages generated by the desktop Companion/Simulator applications. An OpenTX developer may request this to help diagnose an issue.</p></body></html> - + <html><head/><body><p>Mantiene un reporte para todos los mensajes de depuración generados por las aplicaciones Companion/Simulador. Un desarrollador de OpenTX los puede requerir para ayudar a diagnosticar el problema.</p></body></html> - + + + Application (Companion/Simulator) - + Aplicación (Companion/simulador) - + + + <html><head/><body><p>Keep a log of all messages generated by the radio firmware when running in Simulator. This is the same information one would also see in the Simulator <span style=" font-style:italic;">Debug Output</span> window.</p></body></html> - + <html><head/><body><p>Mantiene un log para todos los mensajes generados por el firmware de la radio mientras se ejecuta en el simulador. Esta es la misma información que se vería en el simulador <span style=" font-style:italic;">Salida de depuración</span> ventana.</p></body></html> - + + + Radio Firmware (in Simulator) - + Radio firmware (en simulador) - + + + Action on New Model - + Accioń en nuevo modelo - + + + Blue Azul - + + + Green Verde - + + + Red Rojo - + + + Orange Naranja - + + + Yellow Amarillo - + + + Screenshot capture folder - + Carpeta de capturas de pantalla - + + + Joystick Joystick - + + + Calibrate Calibrar - + + + Only capture to clipboard - Solo capturar a portapapeles - - - - Remember simulator switch values - Recordar los valores de los switch en el simulador + Sólo capturar al portapapeles My Radio - Mi Radio + Mi radio <p><b>You cannot switch Radio Type or change Build Options while there are unsaved file changes. What do you wish to do?</b></p> <ul><li><i>Save All</i> - Save any open file(s) before saving Settings.<li><li><i>Reset</i> - Revert to the previous Radio Type and Build Options before saving Settings.</li><li><i>Cancel</i> - Return to the Settings editor dialog.</li></ul> - + <p><b>No puedes cambiar el tipo de radio o las opciones del firmware mientras hay cambios sin guardar ¿Qué quieres hacer?</b></p> <ul><li><i>Guardar todo</i> - Guardar los archivos abiertos andtes de guardar los ajustes.<li><li><i>Resetear</i> - Volver al tipo de radio y opciones de firmware anteriores antes de salvar los los ajustes.</li><li><i>Cancelar</i> - Volver a la ventana de edición de ajustes.</li></ul> Select your snapshot folder - Selecciona tu carpeta de capturas + Selecciona la carpeta de capturas Note: Nightly builds are not available in this version, Release/RC update channel will be used. - + Nota: No hay nightly builds para esta versión, se usará el canal Release/RC. - + No joysticks found - No se han encopntrado joysticks + No se han encontrado joysticks EMPTY: No radio settings stored in profile - VACIO: No se han guardado ajustes en el perfil de tu radio + VACÍO: No se han guardado ajustes en el perfil de tu radio AVAILABLE: Radio settings of unknown age - DISPONIBLE:Ajustes de radio de tiempo desconocido + DISPONIBLE:Ajustes de radio de antigüedad desconocida @@ -658,7 +879,7 @@ Modo 4: Select your library folder - Selecciona tu carpeta de una carpeta + Selecciona tu carpeta de librerías @@ -669,7 +890,7 @@ Modo 4: Select a folder for application logs - + Selecciona una carpeta para los reportes de la aplicación @@ -677,19 +898,19 @@ Modo 4: Selecciona el ejecutable de Google Earth - + Select the folder replicating your SD structure - Selecciona la carpeta que replica la structura de tu tarjeta SD + Selecciona la carpeta que replica la estructura de tu tarjeta SD - + Open Image to load - Abrir imagen para cargar + Abre imagen para cargar - + Images (%1) - Imagenes (%1) + Imágenes (%1) @@ -697,89 +918,90 @@ Modo 4: Error reading %1: %2 - + Error leyendo %1: %2 Cannot save EEPROM - + No se puede guardar la EEPROM Cannot open file %1: %2. - + No se puede abrir el archivo %1: +%2. Error writing file %1: %2. - Error escribiendo el archivo %1: + Error escribiendo el archivo %1: %2. Invalid binary EEPROM file %1 - + Archivo binario de la EEPROM no válido %1 Boards - + Left Horizontal - Izquierda Hrizontal + Izquierda horizontal - + Left Vertical - Izquierda Vertical + Izquierda vertical - + Right Vertical - Derecha Vertical - - - - Right Horizontal - Derecha Horizontal - - - - Aux. 1 - - - - - Aux. 2 - - - - - - Unknown - Desconocido + Derecha vertical - Rud - Rud + Right Horizontal + Derecha horizontal - Ele - Ele + Aux. 1 + - Thr - Thr + Aux. 2 + - + + + Unknown + Desconocido + + + + Rud + + + + + Ele + + + + + Thr + + + + Ail - Ail + @@ -787,17 +1009,17 @@ Modo 4: Negative span - Amplitud negativa + Amp. negativa Mid value - Valor medio + Valor medio Positive span - Amplitud positiva + Amp. positiva @@ -805,153 +1027,192 @@ Modo 4: Can't extract RADIO/radio.bin - + No se puede extraer RADIO/radio.bin Can't extract RADIO/models.txt - + No se puede extraer RADIO/models.txt Can't extract %1 - + No se puede extraer %1 Error loading models - + Error cargando modelos Channels - + Name Nombre - + Min - Min + Mín - + Max - Max + Máx - + Subtrim - Subtrim + - + Direction Dirección - + Curve Curva - + PPM Center Centro PPM - + Linear Subtrim Subtrim lineal - + CH%1 - + - + Popup menu available - + Menú emergente disponible - + --- - --- + - + INV - INV + - - &Copy - &Copiar + + Copy + Copiar - - &Cut - C&ortar + + Cut + Cortar - - &Paste - &Pegar + + Paste + Pegar - - &Delete - &Borrar + + Clear + Limpiar + + + + Insert + Insertar + + + + Delete + Borrar + + + + Move Up + Mover arriba + + + + Move Down + Mover abajo + + + + Clear All + Limpiar todo ChecklistDialog + + Edit Checklist - + Editar lista de verificación + + Line nn, Col nn - + Línea nn, Col nn + + &Import... - + &Importar... + + &Cancel - + &Cancelar + + &OK - + + + Please note, the maximum width displayable is radio model limited. Also, renaming the model will break the link to this checklist file. - + Ten en cuenta que el máximo ancho del display está limitado por el modelo de la radio. También renombrar el modelo rompe el link a este archivo de verificación. + + File: unknown - + Archivo: desconocido Open Checklist - + Abrir lista de verificación Checklist Files (*.txt) - + Ficheros de verificación (*.txt) @@ -960,43 +1221,47 @@ Modo 4: Model Checklist - + Lista de verificación del modelo Cannot open file for writing %1: %2. - + No se puede abrir el archivo para escritura %1: +%2. Cannot write to file %1: %2. - + No se puede escribir en el archivo %1: +%2. Cannot write file %1: %2. - No se puede escribir el archivo %1: + No se puede escribir el archivo %1: %2. Cannot open file %1: %2. - + No se puede abrir el archivo %1: +%2. Cannot read file %1: %2. - + No se puede leer el archivo %1: +%2. Line %1, Col %2 - + Línea %1, Col %2 @@ -1004,118 +1269,119 @@ Modo 4: OpenTX Companion - + Information - Información + Información Warning - Aviso + Aviso Error - Error + Error Application Settings - Ajustes Aplicación + Ajustes aplicación files - + archivos Radio and Models settings - + Ajustes de radio y modelos - + Select or create a file for exported Settings: - + Selecciona o crea un archivo para exportar los ajustes: - + Press the 'Retry' button to choose another file. - + Presiona el botón de 'Reintentar' para elegir otro archivo. - + Simulator for this firmware is not yet available - El simulador para este firmware ya no está disponible + El simulador para este firmware aún no está disponible - + Uknown error during Simulator startup. - + Error durante el arranque del simulador. - + Simulator Error - + Error del simulador - + Data Load Error - + Error de carga de datos - + Error occurred while starting simulator. - + Ha ocurrido un error al arrancar el simulador. <p><b>Welcome to OpenTX %1.</b></p><p>As the first step, please configure the initial Radio Profile by selecting your Radio Type, Menu Language, and Build Options.</p><p>You may also want to take this time to review the other available options in the displayed Settings dialog.</p><p>After saving your settings, we recommend you download the latest firmware for your radio by using the <i>File -&gt; Download</i> menu option.</p><p>Please visit <a href='http://www.open-tx.org'>open-tx.org</a> for latest news, updates and documentation. Thank you for choosing OpenTX!</p>- The OpenTX Team. - + <p><b>Bienvenido a OpenTX %1.</b></p><p>Como primer paso, por favor configura el perfil de radio inicial seleccionando el tipo de radio, el lenguaje y las opciones de firmware.</p><p>También puedes tomarte un tiempo para revisar las otras opciones disponibles en el cuadro de diálogo Ajustes que se muestra.</p><p>Después de guardar la configuración, te recomendamos que descargues el firmware más reciente para tu radio utilizando la opción de menú <i>Archivo -&gt; Descargar</i>.</p><p>Por favor visita <a href='http://www.open-tx.org'>open-tx.org</a> para últims noticies y documentación. Gracias pr elegir OpenTX!</p>- El equipo de OpenTX. <p><b>Thank you for upgrading to OpenTX %1.</b></p><p>This is a major upgrade that adds and modifies a lot of things, so please make sure that you read release notes carefully to learn about the changes, and thoroughly check each of your models for proper function.</p><p>Please visit <a href='http://www.open-tx.org'>open-tx.org</a> for release notes and other documentation.</p>- The OpenTX Team. - + <p><b>Gracias por actualizar a OpenTX %1.</b></p><p>Esta es una actualización mayor que añade y modifica muchas cosas, por favor asegúrate que lees cuidadosamente las notas de la version para entender los cambios y verificar que cada uno de tus modelos funciona correctamente.</p><p>Por favor visita <a href='http://www.open-tx.org'>open-tx.org</a> para las notas de la versión y otra documentación.</p>- El equipo de OpenTX. <p>The radio type in the selected profile does not exist. Using the default type instead.</p> <p><b>Please update your profile settings!</b></p> - + <p>El tipo de radio en el perfil seleccionado no existe. Usando en su lugar el tipo predeterminado.</p> <p><b>¡Por favor, actualiza los ajustes del perfil!</b></p> The saved settings could not be imported, please try again or continue with current settings. - + Los ajustes guardados no pudieron ser importafos, por favor inténtalo de nuevo con los ajustes actuales. Import from File - + Importar desde archivo Import from v%1 - + Importar desde v%1 Do not import - + No importar We have found possible Companion settings backup file(s). Do you want to import settings from a file? - + Se ha encontrado archivo(s) de ajustes de Companion +¿Quieres importar los ajustes desde un archivo? Import settings from a file, or start with current values. - + Importar ajustes desde un archivo, o empezar con los valores actuales. @@ -1123,105 +1389,120 @@ Do you want to import settings from a file? Do you want to import them? If you have a settings backup file, you may import that instead. - + Se han encontrado ajutes de la versión de Companion: %1. +¿Quieres importarlos? + +Si tienes un archivo de backup, puedes importar en su lugar. Select %1: - + Selecciona %1: Save application settings to file... - + Guardar ajustes aplicación a archivo... Load application settings from file or previous version... - + Cargar ajustes de aplicación desde archivo o versión previa... Reset ALL application settings to default and remove radio profiles... - + Resetea TODOS los ajustes de la aplicación y eliminar los perfiles de radio... Exit before settings initialization and application startup. - + Salir antes de inicializar ajustes y arrancar aplicación. Print version number and exit. - + Muestra número de de versión y sale. Print this help text. - + Muestra este texto de ayuda. Reset ALL application settings to default values and remove radio profiles, are you sure? - + Resetea TODOS los ajustes a valores predeterminados y elimina los perfiles de radio, ¿estás seguro? Would you like to perform a backup first? - + ¿Quieres hacer una copia primero? Application settings were reset and saved. - + Los ajustes de la aplicación fueron reseteados y guadados. settings - + ajustes CompareDialog + + Compare Models - + Comparar modelos + + To compare models, drag and drop them anywhere in this window. - + Para comparar modelos, arrastra y suéltalos en esta ventana. + + Close Cerrar + + Style - + Estilo + + Print Imprimir + + Print to file Imprimir a archivo Unnamed Model %1 - + Modelo sin nombre %1 Click to remove this model. - + Presiona para eleminar este modelo. @@ -1231,7 +1512,7 @@ If you have a settings backup file, you may import that instead. Select PDF output file - Seleccionar archivo de salida PDF + Seleccionar archivo de salida PDF @@ -1239,7 +1520,7 @@ If you have a settings backup file, you may import that instead. OK, I understand. - OK, Entiendo. + OK, entiendo. @@ -1247,17 +1528,17 @@ If you have a settings backup file, you may import that instead. Write error - Error escritura + Error de escritura Cannot write %1 (reason: %2) - + No se puede escribir %1 (razón: %2) Cannot open %1 (reason: %2) - + No se puede abrir %1 (razón: %2) @@ -1265,55 +1546,55 @@ If you have a settings backup file, you may import that instead. OpenTX Contributors - + Colaboradores de OpenTX Honors go to Rafal Tomczak (RadioClone), Thomas Husterer (th9x) and Erez Raviv (er9x and eePe) - Los honores van a Rafal Tomczak (RadioClone), Thomas Husterer (th9x) y Erez Raviv (er9x y eePe) + Los honores son para Rafal Tomczak (RadioClone), Thomas Husterer (th9x) y Erez Raviv (er9x y eePe) OpenTX Blacklist - + Main developers - + Desarrolladores principales Translators - + Traductores Companies and projects who have donated to OpenTX - + Compañías y proyectos que han donado a OpenTX People who have donated to OpenTX - + Gente que ha donado a OpenTX Other contributors - + Otros colaboradores monthly - + mensualmente CurveData - + CV - + @@ -1321,17 +1602,17 @@ If you have a settings backup file, you may import that instead. Diff - Diff + Expo - Expo + Func - Func + @@ -1344,109 +1625,145 @@ If you have a settings backup file, you may import that instead. Diff(%1) - + Expo(%1) - + Function(%1) - Función(%1) + Función(%1) Curve(%1) - Curva(%1) + Curva(%1) Curves + + Fixed X - X Fija + X fija + + Custom X - X A medida + X personalizada + + Lines - Lineas + Líneas + + Smooth Suave + + + + Curve type - Tipo de Curva + Tipo de curva + + Curve Creator - Creador de curva + Propiedades de la curva + + Y at X=0 - Y a X=0 + Y en X=0 + + Point size - + Tamaño punto + + Y at X=100 - Y a X=100 + Y en X=100 + + Both Ambos + + x>0 - x>0 + + + x<0 - x<0 + + + Apply Aplicar + + Side - Cara + Lado + + Y at X=-100 - Y a X=-100 + Y en X=-100 + + Coefficient Coeficiente + + Curve name Nombre de la curva @@ -1458,7 +1775,7 @@ If you have a settings backup file, you may import that instead. Popup menu available - + Menú desplegable disponible @@ -1473,47 +1790,47 @@ If you have a settings backup file, you may import that instead. Single Expo - Expo Unico + Expo único Symmetrical f(x)=-f(-x) - Simetricas f(x)=-f(-x) + Simétricas f(x)=-f(-x) Symmetrical f(x)=f(-x) - Simetricas f(x)=f(-x) + Simétricas f(x)=f(-x) Copy - + Copiar Paste - + Pegar Clear - + Limpiar Clear all curves - + Limpiar todas las curvas Are you sure you want to reset curve %1? - + ¿Seguro que quieres resetear todas la curva %1? Are you sure you want to reset all curves? - + ¿Seguro que quiere resetear todas las curvas? @@ -1523,7 +1840,7 @@ If you have a settings backup file, you may import that instead. Not enough free points in EEPROM to store the curve. - No hay suficientes puntos en el EEPROM para guardar la curva. + No hay suficientes puntos libres en la EEPROM para guardar la curva. @@ -1531,234 +1848,239 @@ If you have a settings backup file, you may import that instead. GF - + SF - SF + Override %1 - Invalidar %1 + Invalidar %1 Trainer - Trainer + Entrenador Trainer RUD - Entrenador RUD + Entrenador RUD Trainer ELE - Entrenador ELE + Entrenador ELE Trainer THR - Entrenador THR + Entrenador THR Trainer AIL - Entrenador AIL + Entrenador AIL - Instant Trim - Trim Instantáneo + Trainer Channels + Canales entrenador - Play Sound - Reproducir Sonido + Instant Trim + Trim instantáneo - Haptic - Reproducir Haptic + Play Sound + Reproducir sonido - Reset - Resetear + Haptic + Reproducir haptic - Set Timer %1 - Ajustar temporizador %1 + Reset + Resetear - Vario - + Set Timer %1 + Ajustar temporizador %1 - Play Track - Reproducir Pista + Vario + Variómetro - Play Both - Reproducir Ambos + Play Track + Reproducir pista - Play Value - Reproducir Valor + Play Both + Reproducir ambos - Play Script - + Play Value + Reproducir valor - SD Logs - + Play Script + Reproducir script - Volume - Volumen + SD Logs + Reportes SD - Backlight - Luz de Fondo + Volume + Volumen - Screenshot - + Backlight + Luz de fondo - Background Music - Música de Fondo + Screenshot + Captura - Background Music Pause - Pausar Música de Fondo + Background Music + Música de fondo - Adjust %1 - + Background Music Pause + Pausar música de fondo - SetFailsafe Int. Module - + Adjust %1 + Ajustar %1 - SetFailsafe Ext. Module - + SetFailsafe Int. Module + Fijar failsafe módulo interno - RangeCheck Int. Module - + SetFailsafe Ext. Module + Fijar failsafe módulo externo - RangeCheck Ext. Module - + RangeCheck Int. Module + RangeCheck módulo interno - Bind Int. Module - + RangeCheck Ext. Module + RangeCheck módulo externo + Bind Int. Module + Bind módulo interno + + + Bind Ext. Module - + Bind módulo externo - + Timer1 - Temporizador1 - - - - Timer2 - Temporizador 2 + Temporizador 1 - Timer3 - Temporizador 3 + Timer2 + Temporizador 2 + Timer3 + Temporizador 3 + + + Flight - + Vuelo - + Telemetry - Telemetría + Telemetría - + Rotary Encoder - Codificador Rotativo + Codificador rotativo - + REa - + - + REb - + - + s - + - - - + + + <font color=red><b>Inconsistent parameter</b></font> - <font color=red><b>Parámetro Inconsistente</b></font> + <font color=red><b>Parámetro Inconsistente</b></font> - + Value - Valor + Valor - + played once, not during startup - + reproducido una vez, no durante el inicio - + repeat(%1s) - + repetir(%1s) - + DISABLED - + DESABILITADO - + CFN - + @@ -1766,7 +2088,7 @@ If you have a settings backup file, you may import that instead. Switch - Cambiar + Interruptor @@ -1786,150 +2108,210 @@ If you have a settings backup file, you may import that instead. Popup menu available - + Menú deplegable disponible SF%1 - SF%1 + GF%1 - + ON - ON + Error occurred while trying to play sound, possibly the file is already opened. (Err: %1 [%2]) - + Ha ocurrido un error al reproducir el sonido, posiblemente el archivo ya está abierto. (Err: %1 [%2]) Unable to find or open sound file: %1 - + No se puede encontrar o abrir el archivo de sonido: +%1 - - Value - Valor - - - - Source - - - - - GVAR - GVAR - - - - Increment - Incremento - - - - &Delete - &Borrar + + Copy + Copiar - &Copy - &Copiar + Cut + Cortar - &Cut - C&ortar + Paste + Pegar - &Paste - &Pegar + Clear + Limpiar + + + + Insert + Insertar + + + + Delete + Borrar + + + + Move Up + Mover arriba + + + + Move Down + Mover abajo + + + + Clear All + Limpiar todo + + + + Value + Valor + + + + Source + Fuente + + + + GVAR + + + + + Increment + Incremento CustomizeSplashDialog + + Transmitter Splash Screen Editor - Editor de la pantalla de inicio del transmisor + Editor de la pantalla de inicio de la radio + + + + Invert Invertir + + + + Load FW Cargar FW + + + + Load Pict - Cargar Imag + Cargar imag + + + + Load Profile - Cargar Perfil + Cargar perfil + + + + Save Guardar + + + + Open Splash Library - Abrir libreria de pantallas de inicio + Abrir librería de pantallas de inicio + + + + + + + + ... FW: %1 - + Pict: %1 - + Profile image - Nombre de Perfil + Nombre de imagen Open Firmware File - Abrir archivo de Firmware + Abrir archivo de firmware Can not load embedded image from firmware file %1. - No se pueden cargar la imagen incrustada el archivo de firmware %1. + No se puede cargar la imagen incrustada en el archivo de firmware %1. @@ -1939,7 +2321,7 @@ If you have a settings backup file, you may import that instead. Images (%1) - Imagenes (%1) + Imágenes (%1) @@ -1959,7 +2341,7 @@ If you have a settings backup file, you may import that instead. File Saved - Archivo Guardado + Archivo guardado @@ -1979,7 +2361,7 @@ If you have a settings backup file, you may import that instead. File Save Error - Error Guardado de Archivo + Error en el guardado del archivo @@ -1992,22 +2374,22 @@ If you have a settings backup file, you may import that instead. 90 - 90 + 120 - 120 + 120x - 120x + 140 - 140 + @@ -2015,169 +2397,186 @@ If you have a settings backup file, you may import that instead. Conversion error on field %1 - + Error de conversión en el campo %1 - + Switch - + Interruptor - + Switch - + Interruptor - + cannot be exported on this board! - + no puede ser exportada en esta placa! - + Source - + Fuente - + Source %1 cannot be exported on this board! - + ¡La fuente %1 no puede ser exportada a esta placa! - + OpenTX only accepts %1 points in all curves - OpenTx solo aceta %1 puntos en todas las curvas + OpenTX sólo acepta %1 puntos en todas las curvas - + OpenTx only accepts %1 points in all curves - OpenTx solo aceta %1 puntos en todas las curvas + OpenTX sólo acepta %1 puntos en todas las curvas - - + + OpenTX on this board doesn't accept this function - OpenTX en esta placa no acepta esa función + OpenTX en esta placa no acepta esa función - + OpenTX doesn't accept this radio protocol - OpenTX en esta placa no acepta este protocolo de radio + OpenTX no acepta este protocolo de radio DebugOutput - + + Debug Output - + Salida de depuración - + + <html><head/><body><p>Enable or disable the filter. If the button won't stay enabled, it is likely there is a syntax error in the Regular Expression entered.</p></body></html> - + <html><head/><body><p>Activa/desactiva el filtro. Si el botón no permanece activo, probablemente hay un error de sintaxis en la expresión introducida.</p></body></html> - + + Filter: - + Filtro: - + + <html><head/><body><p>Enter filter text here. Click the help/info button for details about using the filter. </p><p> To <b>remove a remembered entry</b> from the filter list, first choose it, and then press <code>Shift-Delete</code> (or <code>Shift-Backspace</code>) key combination.</p></body></html> - + <html><head/><body><p>Introduce fitro de texto aquí. Presiona el botón de ayuda/info para detalles acerca del uso del filtro. </p><p> +Para <b>eliminar una entrada recordada</b> desde la lista de filtros, primero elígelo, y entonces presiona la combinación de teclas <code>Shift-Delete</code> (o <code>Shift-Backspace</code>) .</p></body></html> - + + Buffer: - + Buffer: - + + Number of lines to keep in display. - + Número de líneas a mantener en display. - + + Filter &Help - + &Ayuda filtros - + + Show information about using the filter. - + Muestra información acerca del uso de filtros. - + + Word &Wrap - + Ajuste de &línea - + + Toggle word wrapping on/off. - + Habilita/desabilita ajuste de línea. - + + &Clear - + &Limpiar - + + Clear the output window of all text. - + Limpia de texto la ventana de salida. - + + Enable &Filter - + Habilitar &filtro - + + Turn the filter on/off. - + Apaga/enciende el filtro. - + <html><head><style>kbd {background-color: palette(alternate-base); font-size: large; white-space: nowrap;}</style></head><body><p>The filter supports two syntax types: basic matching with common wildcards as well as full Perl-style (<code>pcre</code>) Regular Expressions.</p><p>By default a filter will only show lines which match (<b>inclusive</b>). To make an <b>exclusive</b> filter which removes matching lines, prefix the filter expression with a <kbd>!</kbd> (exclamation mark).</p><p>To use <b>Regular Expressions</b> (RegEx), prefix the filter text with a <kbd>/</kbd> (slash) or <kbd>^</kbd> (up caret). <ul><li>Put the <kbd>/</kbd> or <kbd>^</kbd> after the exclusive <kbd>!</kbd> indicator if you're using one.</li><li>By default the match is case-sensitive. To make it insensitive, add the typical <kbd>/i</kbd> (slash i) operator at the end of your RegEx.</li><li>If you use a caret (^) to denote a RegEx, it will become part of the Reg. Ex. (that is, matches from start of line).</li><li>If the RegEx is invalid, the filter edit field should show a red border and you will not be able to enable the filter.</li><li>A useful resource for testing REs (with a full reference) can be found at <a href="http://www.regexr.com/">http://www.regexr.com/</a></li></ul></p><p>To use <b>basic matching</b> just type any text.<ul><li>Wildcards: <kbd>*</kbd> (asterisk) matches zero or more of any character(s), and <kbd>?</kbd> (question mark) matches any single character.</li><li>The match is always case-insensitive.</li><li>The match always starts from the beginning of a log line. To ignore characters at the start, use a leading <kbd>*</kbd> wildcard.</li><li>A trailing <kbd>*</kbd> is always implied (that is, matches anything to the end of the log line). To avoid this, use a RegEx.</li><li>You can match literal wildcard characters by prefixing them with a <kbd>\</kbd> (backslash) character (eg. "foo\*bar" matches "foo*bar").</li></ul></p><p>After <b>editing text</b>, press ENTER or TAB key (or click anywhere outside the box) to update the filter.</p><p>To <b>remove an entry</b> from the filter selector list, first choose it, and while in the line editor press <kbd>Shift-Delete</kbd> (or <kbd>Shift-Backspace</kbd>) key combination. The default filters cannot be removed. Up to 50 filters are stored.</p></body></html> - + <html><head><style>kbd {background-color: palette(alternate-base); font-size: large; white-space: nowrap;}</style></head><body><p>El filtro admite dos tipos de sintaxis: coincidencia básica con comodines comunes y expresiones regulares Perl-style (<code>pcre</code>).</p><p>Por defecto, un filtro solo mostrará líneas que coinciden (<b>inclusivo</b>). Para hacer un filtro <b>exclusivo</b> que elimine la lineas con coincidencias, prefija la expresión del filtro con un <kbd>!</kbd> (símbolo de exclamación).</p><p>Para usar <b>expresiones regulares</b> (RegEx), prefija el filtro de texto con un <kbd>/</kbd> (barra oblicua) o <kbd>^</kbd> (et). <ul><li>Pon el <kbd>/</kbd> o <kbd>^</kbd> después del indicador exclusivo <kbd>!</kbd> si estás usando uno.</li><li> Por defecto, la coincidencia distingue entre mayúsculas y minúsculas. Para hacerlo insensible, agrega el operador típico<kbd>/i</kbd> (barra invertida) al final del RegEx.</li><li>Si usas un et (^) para indicar RegEx, se convertirá en parte del Reg. Ex. (esto es, coincidencia desde el incio de línea).</li><li>Si el RegEx no es válido, el campo de edición del filtro mostrará un borde rojo y no se podrá habilitar el filtro.</li><li>Encuentra un recurso útil para probar RE (con una referencia completa) en <a href="http://www.regexr.com/">http://www.regexr.com/</a></li></ul></p><p>Para usar <b>coincidencia básica</b> simplemente teclee cualquier texto.<ul><li>Comodines: <kbd>*</kbd> (asterisco) coincidencia de ningúno o más caracter(es), y <kbd>?</kbd> (símbolo de interrogación) coincidecia de caracteres individuales.</li><li>La coincidecia es insensible a mayús/minus.</li><li>La coincidencia siempre empieza desde el inicio de la línea de reporte. Para ignorar caracteres al inicio, usa un comodín de comienzo <kbd>*</kbd>.</li><li>De final <kbd>*</kbd> está siempre implícito (esto es, cualquier coincidecia hasta el final de la línea de reporte). Para evitar esto, use ub RegEx.</li><li>Puedes hacer coincidir con caracteres comodines prefijándolos con el carácter <kbd>\</kbd> (barra invertida) (ej. "foo\*bar" coincide "foo*bar").</li></ul></p><p>Después de <b>editar texto</b>, presiona la tecla ENTER o TAB (o haz click fuera del texto para actualizar el filtro.</p><p>Para <b>eliminar una entrada</b> de la lista de selección de filtro, primero selecciónala, y mientras estás en la linea del editor pulsa la combinación de teclas <kbd>Shift-Delete</kbd> (o <kbd>Shift-Backspace</kbd>). Los filtros predeterminados no se pueden eliminar. Se guardan hasta 50 filtros.</p></body></html> - + Debug Console Filter Help - + Ayuda del filtro de la consola de depuración DownloadDialog + + Downloading: - Descargando: + Descargando: Unable to save the file %1: %2. - No se puede guardar el archivo %1: %2. + No se puede guardar el archivo %1: %2. Download failed: %1. - Descarga fallida: %1. + Descarga fallida: %1. @@ -2185,85 +2584,87 @@ To <b>remove a remembered entry</b> from the filter list, first cho Possible causes for this: - + Posibles causas de esto: - Eeprom is from a newer version of OpenTX - + - Eeprom es de una versión más nueva de OpenTX - Eeprom is not from OpenTX - + - Eeprom no es de OpenTX - Eeprom is not from Th9X - + - Eeprom no es de Th9X - Eeprom is not from Gruvin9X - + - Eeprom no es de Gruvin9X - Eeprom is not from ErSky9X - + - Eeprom no es de ErSky9X - Eeprom is not from Er9X - + - Eeprom no es de Er9X - Eeprom size is invalid - + - Tamaño de eeprom no es válido - Eeprom file system is invalid - + - Sistema de archivos de eeprom no es válido - Eeprom is from a unknown board - + - Eeprom es de una placa desconocida - Eeprom is from the wrong board - + - Eeprom es de una placa errónea - Eeprom backup not supported - + - Backup de Eeprom no soportado - Something that couldn't be guessed, sorry - + - Algo que no pudo ser adivinado, lo siento Warning: - + Advertencia: - Your radio probably uses a wrong firmware, eeprom size is 4096 but only the first 2048 are used - + Tu radio probablemente usa un firmware erróneo, + el tamaño de la eeprom es de 4096 pero sólo los primeros 2048 son usados - Your eeprom is from an old version of OpenTX, upgrading! To keep your original file as a backup, please choose File -> Save As specifying a different name. - + Tu eeprom es de una vesión anterior de OpenTX, actualizando! + Para mantener tu archivo original como un backup, por favor elige Archivo -> Guarda Como especificando un nombre diferente. @@ -2271,12 +2672,12 @@ To <b>remove a remembered entry</b> from the filter list, first cho Unable to open %1: %2 - + No se puede abrir %1: %2 Invalid EEPROM file %1 - + Fichero EEPROM %1 no válido @@ -2284,12 +2685,12 @@ To <b>remove a remembered entry</b> from the filter list, first cho <br>First Elevon Channel: - <br>Primer canal de Elevon: + <br>Primer canal de elevón: Second Elevon Channel: - Segundo canal de Elevon: + Segundo canal de elevón: @@ -2297,18 +2698,20 @@ To <b>remove a remembered entry</b> from the filter list, first cho INP - + (@%1) - + ExpoDialog + + Weight Peso @@ -2316,103 +2719,147 @@ To <b>remove a remembered entry</b> from the filter list, first cho + + + + + + GV - GV + + + Input name Nombre entrada + + Flight modes Modos de vuelo + + Switch - Switch + Interruptor + + Source - Origen + Fuente + + Line name - Nombre de linea + Nombre de línea + + Stick Side - Lado Stick + Lado stick + + Scale Escala + + Include Trim - Incluir Trim + Incluir trim + + No - No + + + Yes - Si + Sí + + Curve Curva + + Curve applied to the source. - Curva aplicada al origen. + Curva aplicada a la fuente. + + Offset Offset + + The source for the mixer - El origen de la mezcla + La fuente de la mezcla + + NEG - NEG + + + Source for the mixer. - Origen para la mezcla. + Fuente para la mezcla. + + Switch used to enable the line. If blank then the input is considered to be "ON" all the time. - Switch usado para activar la linea. -Si está en blanco entonces las entradas son consideradas como ON todo el tiempo. + Interruptor usado para activar la linea. +Si está en blanco entonces las entradas son consideradas ON todo el tiempo. + + POS - POS + + + ALL TODO @@ -2424,22 +2871,22 @@ Si está en blanco entonces las entradas son consideradas como ON todo el tiempo Popup menu available - + Disponible menú desplegable Clear All - + Limpiar todo Set All - + Fijar todo Invert All - + Invertir todo @@ -2447,57 +2894,57 @@ Si está en blanco entonces las entradas son consideradas como ON todo el tiempo Select All - + Selecciona todo Copy selection as TAB-delimited text - + Copiar selección como texto delimitado por TAB Copy selection as cooma-delimited text (CSV) - + Copiar selección como texto delimitado por comas (CSV) Copy selection as pipe-delimited text - + Copiar selección como texto delimitado por barras verticales Copy selection as HTML - + Copiar selección como HTML Save selection to file - + Guardar seleccíon a archivo Tab-delimited text - + Texto delimitado por TAB Comma-delimited text - + Texto delimitado por comas Pipe-delimited text - + Texto delimitado por barras verticales HTML - + Save to file - + Guardar a archivo @@ -2505,22 +2952,22 @@ Si está en blanco entonces las entradas son consideradas como ON todo el tiempo Throttle Channel: - Canal de Acelerador: + Canal de acelerador: Yaw Channel: - Canal de Yaw: + Canal de viraje: Pitch Channel: - Canal de pitch: + Canal de inclinación: Roll Channel: - Canal de roll: + Canal de balanceo: @@ -2528,565 +2975,604 @@ Si está en blanco entonces las entradas son consideradas como ON todo el tiempo Synchronize Files - + Sincroniza ficheros Are you sure you wish to abort the sync? - + ¿Seguro que quieres abortar la sincronización? Source Folder: - + Carpeta de origen: Destination Folder: - + Carpeta de destino: %1%2 Both directions, to destination folder first - + %1%2 ambas direcciones, a la carpeta de destino primero %1%2 Both directions, to source folder first - + %1%2 ambas direcciones, a la carpeta de origen primero %1 Only from source folder to destination folder - + %1 Sólo de la carpeta de origen a la carpeta de destino %1 Only from destination folder to source folder - + %1 Sólo de la carpeta de destino a la carpeta de origen How to handle overwriting files which already exist in the destination folder. - + Como manejar sobreescritura de archivos que ya existen en la carpte de destino. Copy only if newer and different (compare contents) - + Sólo copiar si es más reciente y diferente (comparar contenido) Copy only if newer (do not compare contents) - + Sólo copiar si más reciente (no comparar contenido) Copy only if different (ignore file time stamps) - + Copiar si es diferente (ignora marcas de tiempo del archivo) Always copy (force overwite existing files) - + Siempre copia (fuerza sobreescritura de archivos existentes) Any size - + Cualquier tamaño Skip files larger than this size. Enter zero for unlimited. - + Omitir archivos mayores de este tamaño. Cero para ilimitado. Minimum reporting level. Events of this type and of higher importance are shown. WARNING: High log rates may make the user interface temporarily unresponsive. - + Mínimo nivel de reporte. Eventos de este tipo y de mayor importancia son mostrados. +ADVERTENCIA: Altos niveles de reporte pueden hace que la interfaz de usuario no responda temporalemente. Skipped - + Omitido Created - + Creado Updated - + Actualizado Errors Only - + Sólo errores Test-run only - + Sólo Test-run Run as normal but do not actually copy anything. Useful for verifying results before real sync. - + Ejecución normal pero no copia nada. Útil para verificar resultados antes de una sincronización real. Log Level: - + Nivel de reporte: Filters: - + Filtros: The "Include" filter will only copy files which match the pattern(s). The "Exclude" filter will skip files matching the filter pattern(s). The Include filter is evaluated first. - + El filtro "Incluye" sólo copiará archivos que coincidan con el patrón(es). +El filtro "Excluye" omitirá archivos que coincidan con el patrón(es). +El filtro Incluye es evaluado primero. One or more file pattern(s) to exclude, separated by commas. Blank means exclude none. ?, *, and [...] wildcards accepted. - + Uno o más patrones de archivos a excluir, separados por comas. +Vacío significa incluir todos. Comodines ?, *, y [...] aceptados. One or more file pattern(s) to include, separated by commas. Blank means include all. ?, *, and [...] wildcards accepted. - + Uno o más patrones de archivos a incluir, separados por comas. +Vacío significa incluir todos. Comodines ?, *, y [...] aceptados. Include: - + Incluye: Exclude: - + Excluye: Case sensitive - + Distingue mayús/minus Follow links - + Sigue links Include hidden - + Incluye ocultos Recursive - + Recursivo Skip empty - + Omitir vacíos Apply filters - + Aplica filtros Filter Options: - + Opciones de filtro: Folder Options: - + Opciones de carpeta: Options - + Opciones Show extra options - + Muestra opciones extra Reset to defaults - + Resetear a predeterminados Close - Cerrar + Cerrar Sync. Direction: - + Dirección de sinc: Existing Files: - + Archivos existentes: Max. File Size: - + Max. tamaño archivo: MB - + KB - + Abort - + Abortar Start - Comenzar + Iniciar Total: <b>%1</b>; Created: <b>%2</b>; Updated: <b>%3</b>; Skipped: <b>%4</b>; Errors: <font color=%6><b>%5</b></font>; - + Total: <b>%1</b>; Creados: <b>%2</b>; Actualizados: <b>%3</b>; Omitidos: <b>%4</b>; Errores: <font color=%6><b>%5</b></font>; Current: <b>%1</b> of - + Actual: <b>%1</b> de Source folder not found. - + Carpeta de origen no encontrada. Destination folder not found. - + Carpeta de destino no encontrada. Source and destination folders are the same. - + Carpetas de origen y destino son las mismas. Firmware - + Channel values displayed in us - Visualizar los valores de canal en us + Visualiza los valores de canal en us - + No OverrideCH functions available - No hay funciones OverrideCH disponibles + Sin funciones OverrideCH - + Possibility to enable FAI MODE (no telemetry) at field - - - - - FAI MODE (no telemetry) always enabled - - - - - Removes D8 FrSky protocol support which is not legal for use in the EU on radios sold after Jan 1st, 2015 - + Posibilidad de habilitar el MODO FAI (sin telemetría) - + FAI MODE (no telemetry) always enabled + MODO FAI (sin telemetría) siempre activado + + + + Removes D8 FrSky protocol support which is not legal for use in the EU on radios sold after Jan 1st, 2015 + Elimina el soporte para el protocolo D8 FrSky el cual no es de uso legal en EU en radios vendidas después del 1 de enero de 2015 + + + + Disable HELI menu and cyclic mix support - Desactivar el menú de HELI y el soporte de mezcla de cíclico + Desactiva el menú de HELI y el soporte de mezcla de cíclico - - + + Disable Global variables - Desactivar las variables Globales + Desactiva las variables globales - - + + Enable Lua custom scripts screen - - - - - Use alternative SQT5 font - Usar fuente alternativa SQT5 - - - - Pots use in menus navigation - Usar potenciómetros en los menús de navegación - - - - FrSky Taranis X9D+ - - - - - Support for PPM internal module hack - - - - - Enable non certified firmwares - - - - - Disable RAS (SWR) - - - - - FrSky Taranis X9D+ 2019 - - - - - FrSky Taranis X9D - - - - - Haptic module installed - Módulo Haptic instalado - - - - FrSky Taranis X9E - - - - - Confirmation before radio shutdown - - - - - Horus gimbals installed (Hall sensors) - - - - - FrSky Taranis X9-Lite - - - - - - Support for auto update on boot - - - - - FrSky Taranis X7 / X7S - - - - - FrSky Taranis X-Lite S/PRO - - - - - FrSky Taranis X-Lite - - - - - FrSky Horus X10 / X10S - - - - - FrSky Horus X12S - - - - - Use ONLY with first DEV pcb version - - - - - Turnigy 9XR-PRO - - - - - Enable HELI menu and cyclic mix support - Activar menú HELI y el soporte de mezcla de cíclico - - - - Global variables - Variables globales - - - - In model setup menus automatically set source by moving the control - En el menú de ajuste de modelo se selecciona automáticamente el origen del control moviendolo - - - - In model setup menus automatically set switch by moving the control - En el menú de ajuste de modelo se selecciona automáticamente el switch de control moviendolo - - - - No graphical check boxes and sliders - Sin casillas de verificación ni sliders gráficos - - - - Battery graph - Gráfico batería + Habilita la pantalla de Lua custom scripts - Don't use bold font for highlighting active items - No usar la fuente negrita para destacar elementos activos + Use alternative SQT5 font + Usa la fuente alternativa SQT5 - - - Support for ACCESS internal module replacement - + + Pots use in menus navigation + Usa potenciómetros en los menús de navegación + + + + FrSky Taranis X9D+ + + + + + Support for PPM internal module hack + Soporte para el hack de PPM del módulo interno + + + + Enable non certified firmwares + Habilita firmware no certificado + + + + + Disable RAS (SWR) + Desactiva RAS (SWR) + + + + FrSky Taranis X9D+ 2019 + + + + + FrSky Taranis X9D + + + + + Haptic module installed + Módulo haptic instalado + + + + FrSky Taranis X9E + + + + + Confirmation before radio shutdown + Confirmar antes de apagar la radio - FrSky Horus X10 Express - + Horus gimbals installed (Hall sensors) + Gimbals Horus instalados (sensores Hall) - - Jumper T12 - + + FrSky Taranis X9-Lite + - - Enable non certified R9M firmwares - + + FrSky Taranis X7 / X7S + - - Turnigy 9XR with m128 chip - + + FrSky Taranis X-Lite S/PRO + - - Turnigy 9XR - - - - - 9X with stock board - - - - - Enable resetting values by pressing up and down at the same time - Activar el reseteo de valores presionando up y down al mismo tiempo - - - - 9X with stock board and m128 chip - - - - - 9X with AR9X board - - - - - 9X with Sky9x board - - - - - 9X with Gruvin9x board - + + FrSky Taranis X-Lite + + FrSky Horus X10 / X10S + + + + + FrSky Horus X10 Express / X10S Express + + + + + FrSky Horus X12S + + + + + Use ONLY with first DEV pcb version + Usar SÓLO con la primera versión DEV pcb + + + + Jumper T12 / T12 Pro + + + + + + Support for MULTI internal module + Soporte para módulo interno MULTI + + + + Jumper T16 / T16+ / T16 Pro + + + + + + Support for bluetooth module + Soporte para módulo bluetooth + + + + Radiomaster TX16s / TX16s Hall / TX16s Masterfire + + + + + Turnigy 9XR-PRO + + + + + Enable HELI menu and cyclic mix support + Activar menú HELI y el soporte de mezcla de cíclico + + + + Global variables + Variables globales + + + + In model setup menus automatically set source by moving the control + En el menú de ajuste de modelo se selecciona automáticamente el origen del control moviéndolo + + + + In model setup menus automatically set switch by moving the control + En el menú de ajuste de modelo se selecciona automáticamente el interruptor de control moviéndolo + + + + No graphical check boxes and sliders + Sin casillas de verificación ni sliders gráficos + + + + Battery graph + Gráfico batería + + + + Don't use bold font for highlighting active items + No usar la fuente negrita para destacar elementos activos + + + + FrSky Taranis X9-Lite S + + + + + FrSky Taranis X7 / X7S Access + FrSky Taranis X7 / X7S Access + + + + + Support for ACCESS internal module replacement + Soporte para módulo interno ACCESS de reemplazo + + + + Turnigy 9XR with m128 chip + Turnigy 9XR con chip m128 + + + + Turnigy 9XR + + + + + 9X with stock board + 9X con placa de stock + + + + Enable resetting values by pressing up and down at the same time + Activar el reseteo de valores presionando arriva y abajo al mismo tiempo + + + + 9X with stock board and m128 chip + 9X con placa de stock y chip m128 + + + + 9X with AR9X board + 9X con placa AR9X + + + + 9X with Sky9x board + 9X con placa Sky9x + + + + 9X with Gruvin9x board + 9X con placa Gruvin9x + + + DIY MEGA2560 radio - + FirmwarePreferencesDialog + + Downloads Descargas + + Check for updates - Comprobar Actualizaciones + Comprobar actualizaciones + + Firmware - Firmware + + + Download firmware - + Descargar firmware + + Download SD contents - + Descargar contenido SD + + Latest Download - Última Descarga + Última descarga Unknown - Desconocido + Desconocido @@ -3094,319 +3580,373 @@ Blank means include all. ?, *, and [...] wildcards accepted. No - No + Yes, controlled by a single channel - Si, controlado por un único canal + Sí, controlado por un único canal Yes, controlled by two channels - Si, controlado por dos canales + Sí, controlado por dos canales <br>First Flap Channel: - <br>Canal del primer Flap: + <br>Canal del primer flap: Second Flap Channel: - Canal del segundo Flap: + Canal del segundo flap: FlashEEpromDialog + + Write Models and Settings to Radio - Escribir Modelos y Ajustes a la Radio + Escribir modelos y ajustes a la radio + + Load... - + Cargar... + + Current Profile - Perfil Actual + Perfil actual + + Allows Companion to write to older version of the firmware - Permitir a Companion escribir a las versiones viejas de firmware + Permite a Companion escribir en las versiones anteriores de firmware + + Check Firmware compatibility - Comprobar la compatibilidad del firmware + Comprobar la compatibilidad del firmware + + <html><head/><body><p>Saves a dated copy of your eeprom to the backup folder you specified in the Companion settings before writing the current model to the radio.</p></body></html> - + <html><head/><body><p>Guarda una copia de la eeprom a la carpeta de backup especificada en los ajustes de Companion antes de escribir el modelo actual en la radio.</p></body></html> + + Backup before Write - + Guadar antes de escribir + + <html><head/><body><p>Modify calibration parameters using settings from current profile</p></body></html> - <html><head/><body><p>Modificar los parámetros de calibración utilizando la configuración de perfil actual</p></body></html> + <html><head/><body><p>Modifica los parámetros de calibración utilizando la configuración de perfil actual</p></body></html> + + Patch calibration setting from profile - Arreglar los ajustes de calibración desde el perfil + Arreglar los ajustes de calibración desde el perfil + + <html><head/><body><p>Modify HW parameters using settings from current profile</p></body></html> - <html><head/><body><p>Modificar los parámetros de HW usando los ajustes del perfil actual</p></body></html> + <html><head/><body><p>Modifica los parámetros de HW usando los ajustes del perfil actual</p></body></html> + + Patch HW settings from profile - + Arreglar los ajustes de HW desde el perfil + + Cancel - Cancelar + Cancelar + + Write to TX - Escribir al TX + Escribir al TX Current profile: %1 - + Perfil actual: %1 Choose Radio Backup file - Elegir archivo de copia de seguridad de la radio + Elegir archivo de copia de seguridad de la radio Wrong radio calibration data in profile, Settings not patched - Datos de calibración de radio incorrectos en el perfil, ajustes no corregidos + Datos de calibración de radio incorrectos en el perfil, ajustes no corregidos Wrong radio setting data in profile, Settings not patched - Datos de ajustes de radio incorrectos en el perfil, ajustes no corregidos + Datos de ajustes de radio incorrectos en el perfil, ajustes no corregidos Cannot write file %1: %2. - No se puede escribir el archivo %1: + No se puede escribir el archivo %1: %2. Error writing file %1: %2. - Error escribiendo el archivo %1: + Error escribiendo el archivo %1: %2. The radio firmware belongs to another product family, check file and preferences! - El firmware de la radio pertenece a otro producto, ¡comprueba el archivo y las preferencias! + El firmware de la radio pertenece a otro producto, ¡comprueba el archivo y las preferencias! The radio firmware is outdated, please upgrade! - El firmware de la radio está obsoleto, ¡por favor actializalo! + El firmware de la radio está obsoleto, ¡por favor actualízalo! Cannot check Models and Settings compatibility! Continue anyway? - ¡No se pueden comprobar la compatibilidad de Modelos y Ajustes! ¿Continuar de todas maneras? + ¡No se puede comprobar la compatibilidad de modelos y ajustes! ¿Continuar de todas maneras? FlashFirmwareDialog + + Flash Firmware - + Flash firmware + + Load... - + Cargando... + + Date & Time - Fecha & Hora + Fecha & Hora + + Variant - Variante + Variante + + Version - + Versión + + Use profile start screen - Usar la pantala de inicio del perfil + Usar la pantalla de inicio del perfil + + Use firmware start screen - Usar la pantalla de inicio del firmware + Usar la pantalla de inicio del firmware + + Use library start screen - Usar la libreria de pantalla de inicio + Usar la librería de pantalla de inicio + + Use another start screen - Usar otra pantalla de inicio + Usar otra pantalla de inicio + + Allows Companion to write to older version of the firmware - Permitir a Companion escribir a las versiones viejas de firmware + Permitir a Companion escribir a las versiones anteriores de firmware + + Check Hardware compatibility - + Verificar compatibilidad del hardware + + Backup and restore Models and Settings - Copia de seguridad y restauración de Modelos y Ajustes + Copia de seguridad y restauración de modelos y ajustes + + Cancel - Cancelar + Cancelar + + Write to TX - Escribir al TX + Escribir al TX Open Firmware File - Abrir archivo de Firmware + Abrir archivo de firmware %1 may not be a valid firmware file - %1 puede no ser un archivo de firmware válido + %1 puede no ser un archivo de firmware válido The firmware file is not valid. - El archivo de firmware no es válido. + El archivo de firmware no es válido. There is no start screen image in the firmware file. - No hay imagen de pantalla de inicio en el archivo de firmware. + No hay imagen de pantalla de inicio en el archivo de firmware. Profile image %1 is invalid. - El perfil de imagen %1 es inválido. + El perfil de imagen %1 no es válido. Open image file to use as radio start screen - Abir archivo de imagen para usar de pantalla de inicio de la radio + Abrir archivo de imagen para usar de pantalla de inicio de la radio Images (%1) - Imagenes (%1) + Imágenes (%1) Image could not be loaded from %1 - La imagen no puede ser cargada desde %1 + La imagen no puede ser cargada desde %1 The library image could not be loaded - La librería de imágen no puede ser cargada + La librería de imágen no puede ser cargada Splash image not found - + Imagen de inicio no encontrada Cannot save customized firmware - No se puede guardar el firmware personalizado + No se puede guardar el firmware personalizado Write Firmware to Radio - Escribir Firmware a la Radio + Escribir firmware a la radio Firmware check failed - + Ha fallado la verificación del firmware Could not check firmware from radio - + No se puede verificar el firmware de la radio New firmware is not compatible with the one currently installed! - + ¡El nuevo firmware no es compatible con el instalado actualmente! Conversion failed - Coversion fallida + Coversión fallida Cannot convert Models and Settings for use with this firmware, original data will be used - No se pueden convertir los Modelos y Ajustes para usar con este firmware, se usarán los datos originales + No se puede convertir los modelos y ajustes para usar con este firmware, se usarán los datos originales Restore failed - Restauración fallida + Restauración fallida Could not restore Models and Settings to Radio. The models and settings data file can be found at: %1 - No se ha podido restaurar los Modelos y Ajustes a la Radio. Los datos de los modelos y ajustes se pueden encontrar en: %1 + No se ha podido restaurar los modelos y ajustes a la radio. Los datos de los modelos y ajustes se pueden encontrar en: %1 Flashing done - + Flashing hecho @@ -3414,58 +3954,58 @@ Blank means include all. ?, *, and [...] wildcards accepted. Executable %1 not found - + Ejecutable %1 no encontrado Writing... - + Escribiendo... Reading... - + Leyendo... Verifying... - + Verificando... unknown - + desconocido ie: OpenTX for 9X board or OpenTX for 9XR board - Esto es: OpenTX para placas 9x o OpenTX para placas 9XR + Esto es: OpenTX para placas 9x o OpenTX para placas 9XR ie: OpenTX for M128 / 9X board or OpenTX for 9XR board with M128 chip - Esto es: OpenTX para placas M128 / 9x o OpenTX para placas 9XR con el chip M128 + Esto es: OpenTX para placas M128 / 9x o OpenTX para placas 9XR con el chip M128 ie: OpenTX for Gruvin9X board - Esto es: OpenTX para placas Gruvin9x + Esto es: OpenTX para placas Gruvin9x Your radio uses a %1 CPU!!! Please check advanced burn options to set the correct cpu type. - Tu radio usa un %1 CPU!!! + Tu radio usa un %1 CPU!!! -Por favor comprueba en las opciones avanzadas de gravado el tipo correcto de cpu. +Por favor comprueba en las opciones avanzadas de grabado el tipo correcto de cpu. Your radio uses a %1 CPU!!! Please select an appropriate firmware type to program it. - Tu radio usa un %1 CPU!!! + Tu radio usa un %1 CPU!!! Por favor elige el tipo de firmware apropiado para programarlo. @@ -3474,183 +4014,205 @@ Por favor elige el tipo de firmware apropiado para programarlo. You are currently using: %1 - + Actualmente estás usando: %1 Your radio does not seem connected to USB or the driver is not initialized!!!. - + ¡¡¡La radio no parece estar conectada al USB o el controlador no está inicializado!!! Flashing done (exit code = %1) - + Flashing hecho (código salida = %1) Flashing done with errors - + Flashing hecho con errores FUSES: Low=%1 High=%2 Ext=%3 - + FUSIBLES: Low=%1 High=%2 Ext=%3 FlightMode + + Fade In - + Transición entrada + + Fade Out - + Transición salida + + Name Nombre + + Switch - Switch + Interruptor + + + + + + trim6 + + + + + + + trim5 + FlightModeData - + FM - + FlightModePanel - + Rotary Encoder %1 - Codificador Rotativo %1 + Codificador rotativo %1 - + Name - Nombre + Nombre - + Value source - + Valor fuente - + Value - Valor + Valor + + + + GVAR%1 + - GVAR%1 - GVAR%1 - - - Popup enabled - Popup activado + Menú desplegable activado Popup menu available - + Menú desplegable disponible - + Trim disabled - Trim desactivado + Trim desactivado - + Own Trim - Trim propio + Trim propio - + Use Trim from Flight mode %1 - Usar Trim para el modo de vuelo %1 + Usar trim para modo de vuelo %1 - + Use Trim from Flight mode %1 + Own Trim as an offset - Usar Trim para el modo de vuelo %1 + Trim propio com un compensador - - - - Unit - Unidad - - - - Prec - + Usar trim para modo de vuelo %1 + trim propio con compensador - Min - + Unit + Unidad + Prec + + + + + Min + Mín + + + Max - + Máx - + 0._ - + - + 0.0 - 6P {0.0?} + - - + + &Clear - + &Limpiar - - + + Clear - + Limpiar - + Clear all current Flight Mode properties? - + ¿Limpiar todas las propiedades del modo de vuelo actual? FlightModesPanel - + Flight Mode %1 - Modo de vuelo%1 + Modo de vuelo %1 - + (%1) - (%1) + - + (default) - (Predeterminado) + (predeterminado) @@ -3658,17 +4220,17 @@ Actualmente estás usando: Has Flybar - Tiene Flybar + Tiene flybar Flybarless - Flybarless + Flybar: - Flybar: + @@ -3676,17 +4238,17 @@ Actualmente estás usando: Yellow - Amarillo + Amarillo Orange - Naranja + Naranja Red - Rojo + Rojo @@ -3695,23 +4257,27 @@ Actualmente estás usando: V - + --- - --- + FusesDialog + + Fuses - + Fusibles + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -3725,15 +4291,31 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">Proper states for AtMega 2560 :</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">EEPROM erase fuse not set: D7, 11, FC</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">EEPROM erase fuse set: D7, 19, FC</span></p></body></html> - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">Lee los fuses actuales en el controlador AVR.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">Estados apropiados para </span><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">AtMega 64 </span><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">:</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">EEPROM borrar fuse no fijado: 0E, 81, FF</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">EEPROM borra fuse fijado: 0E, 89, FF</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">Estados apropiados para AtMega 2560 :</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">EEPROM borrar fuse no fijado: D7, 11, FC</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">EEPROM borrar fuse fijado: D7, 19, FC</span></p></body></html> + + Read Fuses - Leer Fuses + Leer fusibles + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -3749,17 +4331,35 @@ p, li { white-space: pre-wrap; } <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">When in doubt consult either the project's page or the 9xforum (http://9xforums.com/forum/)</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">If you do get locked out - google lookup for &quot;dealing with Fuse Bricks&quot;.</span></p></body></html> - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:600; text-decoration: underline;">Resetear fusibles</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">Los fusibles en el AVR le dicen cómo comportarse. Al presionar este botón, los fusibles tienen los parámetros predeterminados necesarios en el FW. Estos parámetros son diferentes para el stock y 4,1 MB, verifique que haya seleccionado el tipo de procesador apropiado en las preferencias. </span> </p> +<p style = "- qt-parameter-type: empty; margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent : 0px; familia de fuentes: 'MS Shell Dlg 2'; tamaño de fuente: 8pt; "> <br /> </p> +<p style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'MS Shell Dlg 2'; font-size: 8pt;"> Este botón también establece la "Protección EEPROM" Fusible. </span> </p> +<p style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'MS Shell Dlg 2'; font-size: 8pt;"> Esto evita que se borre la EEPROM cuando se escribe la memoria flash. </span> </p> +<p style = "- qt-parameter-type: empty; margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent : 0px; familia de fuentes: 'MS Shell Dlg 2'; tamaño de fuente: 8pt; "> <br /> </p> +<p style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "familia-fuente: 'MS Shell Dlg 2'; tamaño de fuente: 8pt; peso de fuente: 600; decoración de texto: subrayado;"> ADVERTENCIA </span> </p> +<p style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'MS Shell Dlg 2'; font-size: 8pt;"> La configuración de los fusibles puede ocasionar problemas e incluso un bloqueo total de tu controlador. Haz esto solo si sabes lo que estás haciendo. </span> </p> +<p style = "- qt-parameter-type: empty; margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent : 0px; familia de fuentes: 'MS Shell Dlg 2'; tamaño de fuente: 8pt; "> <br /> </p> +<p style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'MS Shell Dlg 2'; font-size: 8pt;"> En caso de duda, consulta la página del proyecto o el 9xforum (http://9xforums.com/forum/) </span> </ p > +<p style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'MS Shell Dlg 2'; font-size: 8pt;"> Si quedas bloqueado, busca en google para & quot; tratar con Fuse Bricks & quot ;. </span> </p> </body> </html> + + Reset Fuses EEPROM - PROTECT - Resetear Fuses + Resetear fusibles EEPROM - PROTEGIDA + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -3775,16 +4375,35 @@ p, li { white-space: pre-wrap; } <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">When in doubt consult either the project's page or the 9xforum (http://9xforums.com/forum/)</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">If you do get locked out - google lookup for &quot;dealing with Fuse Bricks&quot;.</span></p></body></html> - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:600; text-decoration: underline;">Resetear fusibles</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;">Los fusibles en el AVR te dicen cómo comportarse. Al presionar este botón, los fusibles tienen los parámetros predeterminados necesarios en </span> <span style = "font-family: 'MS Shell Dlg 2'; font-size: 8pt;"> FW. Estos parámetros son diferentes para el stock y 4,1 MB, verifique que haya seleccionado el tipo de procesador apropiado en las preferencias. </span> </p> +<p style = "- qt-parameter-type: empty; margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent : 0px; familia de fuentes: 'MS Shell Dlg 2'; tamaño de fuente: 8pt; "> <br /> </p> +<p style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'MS Shell Dlg 2'; font-size: 8pt;"> Este botón también borra la "protección EEPROM" Fusible. </span> </p> +<p style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'MS Shell Dlg 2'; font-size: 8pt;"> Esto causa el borrado de la EEPROM cuando se escribe la memoria flash. </span> </p> +<p style = "- qt-parameter-type: empty; margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent : 0px; familia de fuentes: 'MS Shell Dlg 2'; tamaño de fuente: 8pt; "> <br /> </p> +<p style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "familia-fuente: 'MS Shell Dlg 2'; tamaño de fuente: 8pt; peso de fuente: 600; decoración de texto: subrayado;"> ADVERTENCIA </span> </p> +<p style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'MS Shell Dlg 2'; font-size: 8pt;"> La configuración de los fusibles puede ocasionar problemas e incluso un bloqueo total de su controlador. Haz esto solo si sabes lo que estás haciendo. </span> </p> +<p style = "- qt-parameter-type: empty; margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent : 0px; familia de fuentes: 'MS Shell Dlg 2'; tamaño de fuente: 8pt; "> <br /> </p> +<p style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'MS Shell Dlg 2'; font-size: 8pt;"> En caso de duda, consulta la página del proyecto o el 9xforum (http://9xforums.com/forum/) </span> </ p > +<p style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'MS Shell Dlg 2'; font-size: 8pt;"> Si quedas bloqueado, busca en google para & quot; tratar con Fuse Bricks & quot ;. </span> </p> </body> </html> + + Reset Fuses EEPROM - DELETE - + Resetear fusibles +EEPROM - BORRAR + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -3793,18 +4412,24 @@ p, li { white-space: pre-wrap; } <p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600; text-decoration: underline;"></p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Changing the fuses can mess up your radio.</p> <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Proceed only if you know what you are doing.</p></body></html> - + <html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; text-decoration: underline;">AVISO</span></p> +<p align="center" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600; text-decoration: underline;"></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Cambiar los fuses de la radio puede estropear la radio.</p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Continúa sólo si sabes lo que estás haciendo.</p></body></html> Reset Radio Fuses - + Resetear fusibles de la radio Read Fuses from Radio - + Leer fusibles de la radio @@ -3812,53 +4437,57 @@ p, li { white-space: pre-wrap; } % - + ? - + 0._ - + 0.0 - 6P {0.0?} + ?.? - + GV - GV + Own value - Valor propio + Valor propio Flight mode %1 value - Valor modo de vuelo%1 + Valor modo de vuelo %1 GeneralEdit + + Radio settings - + Ajustes radio + + General settings used throught the transmitter. These will be relevant for all models in the same EEPROM. Ajustes generales usados a través del transmisor. @@ -3872,32 +4501,36 @@ Estos puede ser relevantes para todos los modelos en el mismo EEPROM. Trainer - Trainer + Entrenador + + Store calib. and hw settings in selected profile - Guardar calib. y los ajustes de hw en el perfil seleccionado + Guardar calib. y ajustes hw en el perfil seleccionado + + Retrieve calib. and hw settings from profile - Recuperar calib. y los ajustes de hw de un perfil + Recuperar calib. y ajustes hw de un perfil Global Functions - + Funciones globales Hardware - + Hardware Calibration - + Calibración @@ -3907,12 +4540,12 @@ Estos puede ser relevantes para todos los modelos en el mismo EEPROM. Wrong data in profile, Switch/pot config not retrieved - + Datos erróneos en el perfil, configuración de interruptor/pot no se ha recuperado Wrong data in profile, hw related parameters were not retrieved - Datos incorrectos en el perfil,los parámetros de hw no se ha recuperado + Datos incorrectos en el perfil, los parámetros de hw no se han recuperado @@ -3928,236 +4561,330 @@ Estos puede ser relevantes para todos los modelos en el mismo EEPROM. GeneralSettings - + Radio Settings - + Ajustes de radio GeneralSetup + + Form - + Form + + Readonly Unlock - Desactivar solo lectura + Desactivar sólo lectura + + SC - + + + SE - + + + SA - + + + SF - SF + + + SH - + + + SD - + + + SB - + + + SG - + + + Timeshift from UTC - Zona horaria UTC + Zona horaria UTC + + Voice Language - Lenguaje de las Voces + Lenguaje de las voces + + Country Code - Codigo País + Código país + + Stick reverse - + Invertir stick + + FAI Mode - Modo FAI + Modo FAI + + Adjust RTC - + Ajustar RTC + + Vario pitch at max - Tono de vario al max + Tono de vario al máx + + + + Hz - + + + Speaker Volume - Volumen Altavoz + Volumen altavoz + + Backlight Switch - Switch de pantalla + Interruptor de luz de fondo + + Sound Mode - Modo sonido + Modo sonido + + Color 1 - + + + Color 2 - + + + Speaker Pitch (spkr only) - Tono del altavoz (solo altavoz) + Tono altavoz(sólo alt) + + If this value is not 0, any keypress will turn on the backlight and turn it off after the specified number of seconds. - Si este valor no es 0, cualquier pulsación encenderá la pantalla y se apagará despues de un número determinado de segundos. + Si este valor no es 0, cualquier pulsación encenderá la pantalla y se apagará despues de un número determinado de segundos. + + + + + + sec - seg + seg + + Backlight color - Color de pantalla + Color de pantalla + + Beeper - + Beeper + + Speaker - Altavoz + Altavoz + + BeeperVoice - BeeperVoz + VozBeeper + + SpeakerVoice - VozAltavoz + VozAltavoz + + Beep volume - Volumen Beep + Volumen beep + + Wav volume - Volumen Wav + Volumen wav + + Vario volume - Volumen Vario + Volumen vario + + Background volume - Volumen de Fondo + Volumen de fondo + + + + ms - + + + Backlight Auto OFF after - Apagado automático de pantalla después + Auto apagado de pantalla después de + + Backlight flash on alarm - Pantalla parpadea con una alarma + Pantalla parpadea con alarma + + Vario pitch at zero - Tono de vario a cero + Tono de vario en cero + + Vario repeat at zero - Vario repite a cero + Vario repite en cero + + This is the switch selectrion for turning on the backlight (if installed). - Este es el switch seleccionado para encender la pantalla (si está instalada). + Este es el interruptor seleccionado para encender la luz de fondo (si está instalada). + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">LCD Screen Contrast</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Values can be 20-45</span></p></body></html> - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> @@ -4166,41 +4893,57 @@ p, li { white-space: pre-wrap; } + + Backlight Brightness - Brillo pantalla + Brillo pantalla + + RotEnc Navigation - Navegación RotEnc + Navegación RotEnc + + Automatically adjust the radio's clock if a GPS is connected to telemetry. - + Ajusta automáticamente el reloj de la radio si se conecta un GPS a la telemetría. + + America - + América + + Japan - Japón + Japón + + Europe - Europa + Europa + + Backlight OFF Brightness - + Brillo luz de fondo OFF + + Mode selection: Mode 1: @@ -4220,7 +4963,7 @@ Mode 4: Right stick: Elevator, Rudder - Selección de Modo: + Selección de modo: Modo 1: Stick Izquierdo: Elevador, Timón @@ -4242,465 +4985,661 @@ Modo 4: + + Mode 1 (RUD ELE THR AIL) - Modo 1 (RUD ELE THR AIL) + Modo 1 (RUD ELE THR AIL) + + Mode 2 (RUD THR ELE AIL) - Modo 2 (RUD THR ELE AIL) + Modo 2 (RUD THR ELE AIL) + + Mode 3 (AIL ELE THR RUD) - Modo 3 (AIL ELE THR RUD) + Modo 3 (AIL ELE THR RUD) + + Mode 4 (AIL THR ELE RUD) - Modo 4 (AIL THR ELE RUD) + Modo 4 (AIL THR ELE RUD) + + <html><head/><body><p>Channel order</p><p><br/></p><p>Defines the order of the default mixes created on a new model.</p></body></html> - <html><head/><body><p>Orden de los canales</p><p><br/></p><p>Define el orden por defecto de las mezclas en un nuevo modelo</p></body></html> + <html><head/><body><p>Orden de los canales</p><p><br/></p><p>Define el orden por defecto de las mezclas en un nuevo modelo</p></body></html> + + If you enable FAI, only RSSI and RxBt sensors will keep working. This function cannot be disabled by the radio. - + Si activas FAI, sólo los sensores RSSI y RxBt seguirán funcionando. Esta función no puede ser deshabilitada en la radio. + + RSSI Poweroff Warning - + Aviso RSSI al apagado + + Low EEPROM Warning - + Advertencia de poca EEPROM + + Owner Registration ID - - - - - aaaaaaAA - + ID de propietario + + R E T A - R E T A + + + R E A T - R E A T + + + R T E A - R T E A + + + R T A E - R T A E + + + R A E T - R A E T + + + R A T E - R A T E + + + E R T A - E R T A + + + E R A T - E R A T + + + E T R A - E T R A + + + E T A R - E T A R + + + E A R T - E A R T + + + E A T R - E A T R + + + T R E A - T R E A + + + T R A E - T R A E + + + T E R A - T E R A + + + T E A R - T E A R + + + T A R E - T A R E + + + T A E R - T A E R + + + A R E T - A R E T + + + A R T E - A R T E + + + A E R T - A E R T + + + A E T R - A E T R + + + A T R E - A T R E + + + A T E R - A T E R + + + Power On Delay - + Retraso de encendido + + Jack Mode - + Modo jack + + Audio - + + + Trainer - Trainer + Entrenador + + DMS - + + + USB Mode - + Modo USB + + Power Off Delay - + Retraso de apagado + + + + Ask on Connect - + Preguntar al conectar + + Joystick (HID) - + Joystick (HID) + + USB Mass Storage - + Almacenamiento USB + + USB Serial (CDC) - + USB Serial (CDC) + + Stick Mode - Modo Stick + Modo sticks + + Metric - Métrico + Métrico + + Imperial - + Imperial + + Default Channel Order - Orden Prederterminado Canales + Orden prederterminado canales + + GPS Coordinates - Coordenadas GPS + Coordenadas GPS + + Min - + Mín + + + + v - + + + Max - + Máx + + Inactivity Timer - Tiempo de inactividad + Tiempo de inactividad + + Show Splash Screen on Startup - Mostrar Pantalla de Inicio al Enceder + Mostrar pantalla de inicio al encender + + Contrast - Contraste + Contraste + + Battery Meter Range - + Medidor de rango de batería + + Haptic Strength - Fuerza de Haptic + Fuerza de haptic + + LCD Display Type - Tipo de Pantalla LCD + Tipo de pantalla LCD + + "No Sound" Warning - Aviso "Sin Sonido" + Aviso "sin sonido" + + Battery Warning - Aviso de Bateria + Aviso de batería + + Haptic Length - Longitud Haptic + Duración haptic + + MAVLink Baud Rate - Transferencia Baud MAVLink + Velocidad de transmisión MAVLink + + + + Quiet - Silencio + Silencio + + Only Alarms - Solo Alarmas + Sólo alarmas + + + + No Keys - Sin teclas + No teclas + + + + All - Todo + Todo + + Battery warning voltage. This is the threashhold where the battery warning sounds. Acceptable values are 5v..10v - Voltaje de aviso de la batería. + Voltaje de aviso de la batería. Este es el umbral cuando la batería emite sonidos de aviso. Los valores aceptables son 5v..10v + + Standard - Estandar + Estándar + + Optrex - + + + If not zero will sound beeps if the transmitter has been left without inputs for the specified number of minutes. - Si no es cero emitirá sonidos si el transmisor de deja sin pulsaciones surante el numero específico de minutos. + Si no es cero emitirá sonidos si el transmisor se deja sin pulsaciones durante el número específico de minutos. + + + + + + nnnnnnNN + + + min - min + + + + + Show splash screen on startup - Mostrar pantalla de inicio al encender + Mostrar pantalla de inicio al encender + + --- - --- + + + 2s - 2s + + + 3s - 3s + + + 4s - 4s + + + 6s - 6s + + + 8s - 8s + + + 10s - 10s + + + 15s - 15s + + + 4800 Baud - + + + 9600 Baud - + + + 14400 Baud - + + + 19200 Baud - + + + 38400 Baud - + + + 57600 Baud - + + + 76800 Baud - + + + 115200 Baud - + + + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -4712,7 +5651,7 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Switch warning - will alert if switches are not in their defaul position</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Memory warning - will alert if there's not a lot of memory left</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Silent mode warning - will alert you if the beeper is set to quiet (0)</p></body></html> - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> @@ -4720,72 +5659,106 @@ p, li { white-space: pre-wrap; } <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Esto define los avisos al inicio.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Aviso de acelerador - te alertará sin el gas no esta en la posición inactiva</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Aviso de Switch - tealertará si los switches no están en su posición prederterminada</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Aviso de interruptor - te alertará si los interruptores no están en su posición prederterminada</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Aviso de memoria - te alertará si no hay suficiente memoria libre</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Aviso de silencio - te alertará si el beeper está en modo silencio (0)</p></body></html> + + + + X-Short - X-Corto + X-Corto + + + + Short - Corto + Corto + + + + Normal - + + + + + Long - Largo + Largo + + + + X-Long - X-Largo + X-Largo + + NMEA - + + + Play Delay (switch mid position) - Retardo de Play (switch en posición media) + Retardo de reproducción (interruptor en posición media) + + Measurement Units - Unidades de Medida + Unidades de medida + + Haptic Mode - Modo Haptic + Modo haptic + + Beeper Length - Longitud del beeper + Duración del beeper + + Beeper Mode - Modo Beeper + Modo beeper + + Beeper volume 0 - Quiet. No beeps at all. @@ -4793,18 +5766,20 @@ p, li { white-space: pre-wrap; } 2 - Normal. 3 - Loud. 4 - Extra loud. - Volumen Beeper + Volumen beeper 0 - Silencio. Ningun tipo de beep. -1 - Sin teclas. Los beeps suenan normal pero las teclas de menu no sonarán. +1 - No teclas. Los beeps suenan normal pero las teclas de menu no sonarán. 2 - Normal. 3 - Alto. 4 - Extra Alto. + + Alarms Only - Solo Alarmas + Sólo alarmas @@ -4812,129 +5787,131 @@ p, li { white-space: pre-wrap; } OFF - + Keys - Teclas + Teclas Sticks - + Sticks Keys + Sticks - Teclas + Sticks + Teclas + Sticks ON - ON + English - Inglés + Inglés Dutch - + Holandés French - Francés + Francés Italian - Italiano + Italiano German - Alemán + Alemán Czech - Checo + Checo Slovak - Eslovaco + Eslovaco Spanish - Español + Español Polish - Polaco + Polaco Portuguese - Portugués + Portugués Russian - + Ruso Swedish - Sueco + Sueco Hungarian - + Húngaro No - No + RotEnc A - + Rot Enc B - + Rot Enc C - + Rot Enc D - + Rot Enc E - + If you enable FAI, only RSSI and RxBt sensors will keep working. This function cannot be disabled by the radio. Are you sure ? - + Si activas FAI, sólo sensores RSSI and RxBt seguirán funcionando. +Esta función no puede ser deshabilitada en la radio. +¿ Estás seguro ? @@ -4942,433 +5919,568 @@ Are you sure ? No - No + Yes, controled by a switch - Si, controlado por un switch + Sí, controlado por un interruptor Yes, controlled by a pot - Si, controlado por un potenciómetro + Sí, controlado por un potenciómetro Hardware + + Form - - - - - SQ - - - - - SR - - - - - LS2 - - - - - SP - - - - - SO - - - - - S4 - - - - - RS - - - - - SB - - - - - PPM 2 - PPM 2 - - - - OFF - - - - - S-Port Mirror - S-Port Espejo - - - - Telemetry - Telemetría - - - - SBUS Trainer - - - - - Debug - Depurar - - - - Rud - Rud - - - - PPM 3 - PPM 3 - - - - S1 - - - - - S2 - - - - - S3 - - - - - PPM 1 - PPM 1 - - - - Serial Port - Puerto Serie - - - - v - - - - - PPM Multiplier - Multiplicador PPM - - - - Current Offset - - - - - PPM 4 - PPM 4 - - - - SA - - - - - Ele - Ele - - - - Antenna - - - - - S5 - - - - - Ail - Ail - - - - Thr - Thr - - - - SC - - - - - LS - LS - - - - SD - - - - - Battery Offset - - - - - SE - - - - - SF - SF - - - - SG - - - - - SH - - - - - SI - - - - - SJ - - - - - SK - + Form + + + SQ + + + + + + + SR + + + + + + + LS2 + + + + + + + SP + + + + + + + SO + + + + + + + S4 + + + + + + + RS + + + + + + + SB + + + + + + + PPM 2 + + + + + + + OFF + + + + + + + S-Port Mirror + S-Port + + + + + + Telemetry + Telemetría + + + + + + SBUS Trainer + Entrenador SBUS + + + + + + Debug + Depuración + + + + + + RTC Batt Check + Check Batería RTC + + + + + + Rud + + + + + + + PPM 3 + + + + + + + S1 + + + + + + + S2 + + + + + + + S3 + + + + + + + PPM 1 + + + + + + + Serial Port + Puerto Serie + + + + + + v + + + + + + + PPM Multiplier + Multiplicador PPM + + + + + + Current Offset + Offset actual + + + + + + PPM 4 + + + + + + + SA + + + + + + + Ele + + + + + + + Antenna + Antena + + + + + + S5 + + + + + + + Ail + + + + + + + Thr + + + + + + + SC + + + + + + + LS + + + + + + + SD + + + + + + + Battery Offset + Offset batería + + + + + + SE + + + + + + + SF + + + + + + + SG + + + + + + + SH + + + + + + + SI + + + + + + + SJ + + + + + + + SK + + + + + + SL - + + + SM - + + + SN - + - + + + RS2 - + + + Bluetooth - + Bluetooth + + ADC Filter - + Filtro ADC + + Device Name: - + Nombre dispositivo: HardwarePanel - - + + None - Ninguno + Ninguno 2 Positions Toggle - + 2 posiciones palanca 2 Positions - + 2 posiciones 3 Positions - + 3 posiciones - + Pot with detent - + Pos con fijador - + Multipos switch - + Interruptor multipos - + Pot without detent - + Pot sin fijador - + Slider with detent - - - - - OFF - - - - - Enabled - - - - - Telemetry - Telemetría + Slider con fijador + OFF + + + + + Enabled + Activado + + + + Telemetry + Telemetría + + + Trainer - Trainer + Entrenador - + Internal - + Interno - + Ask - + Preguntar - + Per model - + Por modelo - + Internal + External - + Interno + Externo - + External - + Externo Heli + + Invert Elevator - Invertir Elevador + Invertir elevador + + Invert Aileron - Invertir Aleron + Invertir alerón + + Invert Collective - Invertir Colectivo + Invertir colec. + + Invert Invertir + + Off + + 120 + + 120X + + 140 + + 90 + + Long. cyc - + Cíclico longitudinal + + Lateral cyc - + Cíclico lateral + + Collective Colectivo + + Swash Type - Tipo de Plato + Tipo de plato + + Swash Ring - + Plato @@ -5376,22 +6488,22 @@ Are you sure ? Throttle Channel: - Canal de Acelerador: + Canal de acelerador: Yaw Channel: - Canal de Yaw: + Canal de viraje: Pitch Channel: - Canal de pitch: + Canal de inclinación: Roll Channel: - Canal de roll: + Canal de balanceo: @@ -5399,19 +6511,20 @@ Are you sure ? Invalid EEPROM File %1 - Archivo EEPROM inválido %1 + Archivo EEPROM no válido %1 Cannot open file %1: %2. - + No se puede abrir el archivo %1: +%2. Error writing file %1: %2. - Error escribiendo el archivo %1: + Error escribiendo el archivo %1: %2. @@ -5421,30 +6534,30 @@ Are you sure ? Move Up - Mover Arriba + Mover arriba Ctrl+Up - + Ctrl+Arriba Move Down - Mover Abajo + Mover abajo Ctrl+Down - + Ctrl+Abajo Clear All Inputs - Limpiar Todas las entradas + Limpiar todas las entradas @@ -5454,7 +6567,7 @@ Are you sure ? Delete Selected Inputs? - ¿Borrar las Entradas Seleccionadas? + ¿Borrar las entradas seleccionadas? @@ -5474,7 +6587,7 @@ Are you sure ? Enter - + Intro @@ -5494,7 +6607,7 @@ Are you sure ? Ctrl+C - Ctrl+C + @@ -5504,7 +6617,7 @@ Are you sure ? Ctrl+X - Ctrl+X + @@ -5542,17 +6655,17 @@ Are you sure ? INV - INV + NOR - NOR + CH - + @@ -5560,7 +6673,7 @@ Are you sure ? GV - GV + @@ -5568,122 +6681,122 @@ Are you sure ? --- - --- + a>x - + a<x - + |a|>x - + |a|<x - + AND - + OR - + XOR - + a=b - + a!=b - + a>b - + a<b - + a>=b - + a<=b - + d>=x - + |d|>=x - + a=x - + a~x - + Timer - Temporizador + Temporizador Sticky - + Pegajoso Edge - + Borde Unknown - Desconocido + Desconocido L - + LSW - + @@ -5716,22 +6829,22 @@ Are you sure ? AND Switch - + Interruptor AND Popup menu available - + Menú emergente disponible (instant) - + (instante) (infinite) - + (infinito) @@ -5758,172 +6871,192 @@ Are you sure ? LogsDialog + + Companion Log Viewer - Visor de registros de Companion + Visor de registros de Companion + + Filename - Nombre Archivo + Nombre archivo + + Open LogFile - Abrir archivo Registros + Abrir archivo registros + + Zoom - + Zoom + + Save session CSV - + Guardar sesión CSV + + X - + + + Y - + + + Reset - Resetear + Resetear + + Fly sessions - Sesiones de vuelo + Sesiones de vuelo Telemetry logs - Registros de telemetría + Registros de telemetría Time (hh:mm:ss) - Hora (hh:mm:ss) + Hora (hh:mm:ss) Plot Title Change - + Cambia título de plot New plot title: - + Nuevo título de plot: Axis Label Change - + Cambia etiqueta de eje New axis label: - + Nueva etiqueta de eje: Graph Name Change - + Cambia nombre gráfico New graph name: - + Nuevo nombre gráfico: Error: no GPS data found - + Error: datos de GPS no encontrados The column containing GPS coordinates must be named "GPS". The columns for altitude "GAlt" and for speed "GSpd" are optional - + La columna conteniendo las coordenadas GPS debe llamarse "GPS". + +Las columnas para altitud "GAlt" y para velocidad "GSpd" son opcionales Cannot write file %1: %2. - No se puede escribir el archivo %1: + No se puede escribir el archivo %1: %2. Cursor A: %1 m - + Cursor A: %1 m Cursor B: %1 m - + Cursor B: %1 m Time delta: %1 - + Tiempo delta: %1 Climb rate: %1 m/s - + Velocidad de ascenso: %1 m/s Select your log file - Selecciona tu archivo de registros + Selecciona tu archivo de registros Available fields - Campos disponibles + Campos disponibles The selected logfile contains %1 invalid lines out of %2 total lines - El archivo de registros elegido contiene %1 lineas inválidas de un total de %2 lineas + El archivo de registros elegido contiene %1 líneas inválidas de un total de %2 líneas - total duration - + time span + lapso de tiempo duration - + duración (L1) - + (R1) - + (L2) - + (R2) - + @@ -5932,13 +7065,13 @@ The columns for altitude "GAlt" and for speed "GSpd" are opt File loaded - Archivo Cargado + Archivo cargado Save As - Guardar Como + Guardar como @@ -5969,24 +7102,24 @@ The columns for altitude "GAlt" and for speed "GSpd" are opt Archivo guardado - + Read Models and Settings From Radio - Leer los Modelos y Ajustes de la Radio + Leer los modelos y ajustes de la radio Save Radio Backup to File - Guardar Copia deSeguridad de la Radio a un Archivo + Guardar copia de seguridad de la radio a un archivo Read Radio Firmware to File - Leer el Firmware de la Radio a un Archivo + Leer el firmware de la radio a un archivo OpenTX Home Page: <a href='%1'>%1</a> - + OpenTX Home Page: <a href='%1'>%1</a> @@ -6008,18 +7141,18 @@ The columns for altitude "GAlt" and for speed "GSpd" are opt Compilation server too busy, try later - Servidor de compilación demasiado ocupado, inténtalo mas tarde + Servidor de compilación demasiado ocupado, inténtalo más tarde Unknown server failure, try later - Fallo desconocido de servidor, inténtalo mas tarde + Fallo desconocido de servidor, inténtalo más tarde Yes - Si + Sí @@ -6031,83 +7164,83 @@ The columns for altitude "GAlt" and for speed "GSpd" are opt Release Notes - Notas de la Versión + Notas de la versión - + Open Models and Settings file - Abrir archivo de Modelos y Ajustes + Abre archivo de modelos y ajustes - + New Nuevo - + Open... Abrir... - + Save Guardar - + Save As... - Guardar Como... + Guardar como... - + Compare models Comparar modelos - + Exit the application - Salir de la aplicación + Sale de la aplicación - + List available programmers Lista de programadores disponibles - + Show fuses dialog - + Muestra ventane de fusibles - + Show the application's About box - Mostrar la ventana de aplicación Acerca de + Muestra la ventana de aplicación Acerca de - + Set Menu Language - Menú Ajuste Lenguaje + Lenguaje - + Write Escribir - + %2 - %2 + - + Alt+%1 - + - + New Radio - Nueva Radio + Nueva radio @@ -6117,7 +7250,7 @@ The columns for altitude "GAlt" and for speed "GSpd" are opt Do you want to write the firmware to the radio now ? - ¿Te gustaría escribir el firmware a la radio ahora? + ¿Te gustaría escribir el firmware en la radio ahora? @@ -6130,421 +7263,423 @@ The columns for altitude "GAlt" and for speed "GSpd" are opt Acerca de Companion - + A monochrome black icon theme Tema de icono monocromo negro - + A monochrome white icon theme Tema de icono monocromo blanco - + A monochrome blue icon theme Tema de icono monocromo azul Diskimage (*.dmg) - + Imagen de disco(*.dmg) Would you like to open the disk image to install the new version? - + ¿Quieres abrir la imagen del disco para instalar la nueva versioń? A new release of Companion is available, please check the <a href='%1'>OpenTX website!</a> - + Una nueva versión de Companion está disponible, por favor visita <a href='%1'>OpenTX website!</a> There are unsaved file changes which you may lose when switching radio types. Do you wish to continue? - + Hay cambios sin guardar en el archivo que se perderán al cambiar de tipo de radio. + +¿Quieres continuar? No local SD structure path configured! - + ¡No configurada la ruta a la estructura SD local! No Radio or SD card detected! - + ¡No radio o tarjeta SD detectada! - + Close - Cerrar + Cerrar - + Close Models and Settings file - + Cierra el archivo de modelos y ajustes - + List of recently used files - + Lista de los archivos recientes - + Radio Profiles - + Perfiles de radio - + Create or Select Radio Profiles - + Crea o selecciona perfiles de radio - + Release notes... - + Notas de la versión... - + Show release notes - + Muestra notas de la versión - + Create a new Radio Settings Profile - + Crea un nuevo perfil de ajustes de radio - + Copy Current Radio Profile - + Copiar el perfil de radio actual - + Duplicate current Radio Settings Profile - + Duplica el perfil de radio actual - + Delete Current Radio Profile... - + Borrar el perfil de radio actual... - + Delete the current Radio Settings Profile - + Borra los ajustes actuales del perfil de radio actual - + Export Application Settings.. - + Exportar ajustes aplicación... - + Save all the current %1 and Simulator settings (including radio profiles) to a file. - + Guarda los ajustes actuales de %1 y del simulador (incluyendo perfiles de radio) a un archivo - + Import Application Settings.. - + Importar ajustes de la aplicación... - + Load %1 and Simulator settings from a prevously exported settings file. - + Carga los ajustes de %1 y del simulador desde un fichero de ajustes exportado previamente - - Tabbed Windows - - - - + Use tabs to arrange open windows. - + Usa las pestañas para organizar las ventanas abiertas - + + Tabbed Windows + Ventanas con pestañas + + + Tile Windows - + Ventanas en cascada - + Arrange open windows across all the available space. - + Organiza las ventanas en todo el espacio disponible - + Cascade Windows - + Ventanas en cascada - + Arrange all open windows in a stack. - + Organiza todas las ventanas abiertas en una cascada - + Close All Windows - + Cierra todas las ventanas - + Closes all open files (prompts to save if necessary. - + Cierra todos los archivos abiertos (pregunta guardar si es necesario) - + Window - - - - - Ctrl+Shift+S - - - - - Ctrl+Alt+L - + Ventana + Ctrl+Shift+S + + + + + Ctrl+Alt+L + + + + Ctrl+Alt+D - + - + Ctrl+Alt+R - + - + Small Pequeño - + Use small toolbar icons - Usar iconos pequeños en la barra de herramientas + Usa iconos pequeños en la barra de herramientas - + Use normal size toolbar icons - Usar iconos normales en la barra de herramientas + Usa iconos normales en la barra de herramientas - + Normal - + Normal - + Use big toolbar icons - Usar iconos grandes en la barra de herramientas + Usa iconos grandes en la barra de herramientas - + Big Grande - + Use huge toolbar icons - Usar iconos extra grandes en la barra de herramientas + Usa iconos extra grandes en la barra de herramientas - + Huge Extra Grande - + - Copy - + - Copiar - + Companion :: Open files warning - + Companion :: advertencia de archivos abiertos - + Please save or close modified file(s) before deleting the active profile. - + Por favor guarda o cierra los archivos modificados antes de borrar el perfil activo. - + Not possible to remove profile - No es posible eliminar el perfil + No se puede eliminar el perfil - + The default profile can not be removed. - El perfil prederterminado no se puede eliminar. + El perfil prederterminado no se puede eliminar. - + Confirm Delete Profile - + Confirma borrar perfil - + Are you sure you wish to delete the "%1" radio profile? There is no way to undo this action! - + ¿Seguro que quieres borrar el perfil de radio "%1"? ¡Esta acción no se puede deshacer! - + Please save or close all modified files before importing settings - + Por favor guarda o cierra todos los archivos modificados antes de importar ajustes - + <html><p>%1 and Simulator settings can be imported (restored) from a previosly saved export (backup) file. This will replace current settings with any settings found in the file.</p><p>An automatic backup of the current settings will be attempted. But if the current settings are useful then it is recommended that you make a manual backup first.</p><p>For best results when importing settings, <b>close any other %1 windows you may have open, and make sure the standalone Simulator application is not running.</p><p>Do you wish to continue?</p></html> - + <html><p>Los ajustes de %1 y del simulador pueden ser importados (restaurar) desde archvo exportado previamente (copia de seguridad). Esto reemplazará los ajustes actuales con los ajustes del archivo.</p><p>Se realizará automáticamente una copia de seguridad de los ajustes actuales. Pero si los ajustes actuales son útiles se recomienda que hagas una copia de seguridad manual primero.</p><p>Para los mejores resultados al importar ajustes, <b>cierra otras ventanas de %1 que tengas abiertas, y asegúrate que la aplicación del simulador no se está ejecutando.</p><p>¿Quieres continuar?</p></html> - + Confirm Settings Import - - - - - Select %1: - - - - - backup - + Confirma importar ajustes + Select %1: + Selecciona %1 + + + + backup + copia de seguridad + + + Press the 'Ignore' button to continue anyway. - + Presiona el botón de 'Ignorar' para continuar de todos modos. - + The settings could not be imported. - - - - - <html><p>New settings have been imported from:<br> %1.</p><p>%2 will now re-initialize.</p><p>Note that you may need to close and restart %2 before some settings like language and icon theme take effect.</p> - + Los ajustes no han podido ser importados. + <html><p>New settings have been imported from:<br> %1.</p><p>%2 will now re-initialize.</p><p>Note that you may need to close and restart %2 before some settings like language and icon theme take effect.</p> + <html><p>Nuevos ajustes han sido importados desde:<br> %1.</p><p>%2 ahora se reiniciará.</p><p>Ten en cuenta que puedes necesitar cerrar y reiniciar %2 antes de que algunos ajustes como el lenguaje y el tema de iconos se hagan efectivos.</p> + + + <p>The previous settings were backed up to:<br> %1</p> - + <p>Los ajustes anteriores fueron guardados en:<br> %1</p> Not enough flash available on this board for all the selected options - + No hay suficiente flash en esta placa para todas las opciones seleccionadas Compilation server temporary failure, try later - + Fallo temporal del servidor de compilación, intentalo más tarde Compilation error - + Error de compilación Invalid firmware - + Firmware no válido Invalid board - + Placa no válida Invalid language - + Lenguaje no válido - + Some text will not be translated until the next time you start Companion. Please note that some translations may not be complete. - + Algunos textos no serán traducidos hasta que reinicie Companion. Por favor ten en cuenta que algunas traducciones no están completas. Models and Settings read - + Lee modelos y ajustes No Companion release candidates are currently being served for this version, please switch release channel - + Actualmente no hay release candidates de Companion disponibles para esta versión, por favor cambia el canal de distribución No nightly Companion builds are currently being served for this version, please switch release channel - + Actualmente no hay nightly builds de Companion disponibles para esta versión, por favor cambia el canal de distribución No Companion release builds are currently being served for this version, please switch release channel - + Actualmente no hay distribuciones de Companion disponibles para esta versión, por favor cambia el canal de distribución Companion update check failed, new version information not found. - + El chequeo de la actualización de Companion ha fallado, la información de la nueva versión no se ha encontrado. No firmware release candidates are currently being served for this version, please switch release channel - + Actualmente no hay releases candidates de firmware disponibles para esta versión, por favor cambia el canal de distribución No firmware nightly builds are currently being served for this version, please switch release channel - + Actualmente no hay nightly builds de firmware disponibles para esta versión, por favor cambia el canal de distribución No firmware release builds are currently being served for this version, please switch release channel - + Actualmente no hay distribuciones de firmware disponibles para esta versión, por favor cambia el canal de distribución Release candidate builds are now available for this version, would you like to switch to using them? - + Ya hay disponibles release candidates para esta versión, ¿quieres cambiar para usarlas? Channel changed to RC, please restart the download process - + Canal cambiado a RC, por favor reinicia el proceso de descarga Official release builds are now available for this version, would you like to switch to using them? - + Ya hay disponibles distribuciones oficiales para esta versión, ¿quieres cambiar para usarlas? Channel changed to Release, please restart the download process - + Canal cambiado a Release, por favor reinicia el proceso de descarga This radio (%1) is not currently available in this firmware release channel - + Actualmente la radio (%1) no está disponible en este canal de distribución Firmware update check failed, new version information not found or invalid. - + El chequeo de la actualización del firmware ha fallado, la información de la versión no se ha encontrado o no es válida. @@ -6553,34 +7688,38 @@ Version %2 is available. Do you want to download it now? We recommend you view the release notes using the button below to learn about any changes that may be important to you. - + El firmware %1 parece que no se ha descargado anteriormente: +La versión %2 está disponible. +¿Quieres descargarla ahora? + +Te recomendamos que revises las notas de la versión usando el botón de abajo para los ver cambios que puedan ser importantes para tí. Do you want to download version %1 now ? - + ¿Quieres descargar ahora la versión %1? Ignore this version %1? - + ¿Ignorar esta versión %1? Local Folder - + Carpeta local Radio Folder - + Carpeta de radio This function is not yet implemented - + Esta función aún no está implementada @@ -6593,68 +7732,68 @@ We recommend you view the release notes using the button below to learn about an Derechos de autor del equipo OpenTX - + Create a new Models and Settings file - Crear un nuevo archivo de Modelos y Ajustes + Crea un nuevo archivo de modelos y ajustes - - + + Save Models and Settings file - Guardar el archivo de Modelos y Ajustes + Guarda el archivo de modelos y ajustes - + Exit Salir - + Use default system language. - + Usa el lenguaje predeterminado del sistema. - + Use %1 language (some translations may not be complete). - + Usa lenguaje %1 (algunas traducciones pueden no estar completas) - + Classical - Clasico + Clásico - + The classic companion9x icon theme - Tema de iconos clasicos de companion9x + Tema de iconos clásicos de companion9x - + Yerico - + Yerico - + Yellow round honey sweet icon theme Tema de iconos amarillo miel redondo - + Monochrome Monocromo - + MonoWhite MonoBlanco - + MonoBlue MonoAzul - + System language Lenguaje del sistema @@ -6667,231 +7806,237 @@ We recommend you view the release notes using the button below to learn about an Do you want to download it now? We recommend you view the release notes using the button below to learn about any changes that may be important to you. - + Una nueva versión del firmware %1 está disponible: + - actual es %2 + - nuevo es %3 + +¿Quieres descargar ahora? + +Te recomendamos que revises las notas de la versión usando el botón de abajo para los ver cambios que puedan ser importantes para tí. - + Synchronize SD - + Sincronizar SD - + OpenTX Companion %1 - Radio: %2 - Profile: %3 - + OpenTX Companion %1 - Radio: %2 - Perfil: %3 - + About... Acerca de... - + View Log File... - Ver Archivo de Registro... + Ver archivo de registro... - + Open and view log file - Abrir y ver el archivo de registro + Abre el archivo de registro - + Settings... Ajustes... - + Edit Settings - Editar Ajustes + Edita ajustes - + Download... Descargar... - + Download firmware and voice files - Descargar los archivos de firmware y voces + Descarga los archivos de firmware y voces - + Check for Updates... - Comprobar Actualizaciones... + Comprobar actualizaciones... - + Check OpenTX and Companion updates - Comprobar la actualizaciones de OpenTX y Companion + Comprueba las actualizaciones de OpenTX y Companion - + Compare Models... - Comparar Modelos... + Comparar modelos... - + Edit Radio Splash Image... - Editar Imagen de Inicio de la Radio... + Editar imagen de inicio de la radio... - + Edit the splash image of your Radio Editar la imagen de inicio de tu radio - + List programmers... Lista de programadores... - + Fuses... - + Fusibles... - - Read Firmware from Radio - Leer Firmware desde la Radio - - - - Read firmware from Radio - Leer firmware desde la Radio - - - - Write Firmware to Radio - Escribir Firmware a la Radio - - - - Write firmware to Radio - Escribir firmware a la Radio - - - - Add Radio Profile - Añadir perfil de Radio - - - - Manuals and other Documents - Manuales y otros Documentos - - - - Open the OpenTX document page in a web browser - Abrir la página de documentación de OpenTX en un navegador - - - - Write Models and Settings To Radio - Escribir Modelos y Ajustes a la Radio - - - - Write Models and Settings to Radio - Escribir Modelos y Ajustes a la Radio - - - - Read Models and Settings from Radio - Leer los Modelos y Ajustes de la Radio + Read Firmware from Radio + Leer firmware de la radio + + + + Read firmware from Radio + Leer firmware de la radio - Configure Communications... - Configurar Comunicaciones... + Write Firmware to Radio + Escribir firmware a la radio - Configure software for communicating with the Radio - Configurar software para la comunicación con la Radio + Write firmware to Radio + Escribir firmware a la radio - - Write Backup to Radio - Escribir Copia de Seguridad a la Radio - - - - Write Backup from file to Radio - Escribir Copia de Seguridad desde un archivo a la Radio - - - - Backup Radio to File - Copia de Seguridad de la Radio a un Archivo - - - - Save a complete backup file of all settings and model data in the Radio - Guardar una copia de seguridad completa de todos los datos de ajustes y modelos en la Radio + + Add Radio Profile + Añadir perfil de radio + Manuals and other Documents + Manuales y otros documentos + + + + Open the OpenTX document page in a web browser + Abre la página de documentación de OpenTX en un navegador + + + + Write Models and Settings To Radio + Escribir modelos y ajustes a la radio + + + + Write Models and Settings to Radio + Escribir modelos y ajustes a la radio + + + + + Read Models and Settings from Radio + Leer los modelos y ajustes de la radio + + + + Configure Communications... + Configurar comunicaciones... + + + + Configure software for communicating with the Radio + Configura software para la comunicación con la radio + + + + Write Backup to Radio + Escribir copia de seguridad a la radio + + + + Write Backup from file to Radio + Escribir copia de seguridad desde un archivo a la radio + + + + Backup Radio to File + Copia de seguridad de la radio a un archivo + + + + Save a complete backup file of all settings and model data in the Radio + Guardar una copia de seguridad completa de todos los datos de ajustes y modelos en la radio + + + Contributors... Contribuidores... - + A tribute to those who have contributed to OpenTX and Companion Un tributo a aquellos que han contribuido en OpenTX y Companion - + SD card synchronization - + Sincronización de la tarjeta SD - + Recent Files - Archivos Recientes + Archivos recientes - - Set Icon Theme - Selecciona el Tema de Iconos - - - - Set Icon Size - Selecciona el Tamaño de Iconos - - - + Set Icon Theme + Tema de iconos + + + + Set Icon Size + Tamaño de iconos + + + + File Archivo - - + + Edit Editar - + Settings Ajustes - + Read/Write Leer/Escribir - - + + Help Ayuda - + Ready Listo @@ -6899,63 +8044,58 @@ We recommend you view the release notes using the button below to learn about an MdiChild - + Editing model %1: Editando modelo %1: Delete - Borrar + Borrar Move to Category - + Mover a categoría Alt+S - + - + Do you want to overwrite radio general settings? - ¿Quieres sobreescribir los ajustes generales de la radio? + ¿Quieres sobreescribir los ajustes generales de la radio? - + This category is not empty! - + ¡Esta categoría no está vacía! - + New model Translators: do NOT use accents here, this is a default model name. - + Nuevo modelo - + <p><b>Currently selected radio type (%1) is not compatible with file %3 (from %2), models and settings need to be converted.</b></p> - + ><p><b>El tipo actualmente seleccionado de radio (%1) no es compatible con el archivo %3 (de %2), los modelos y ajustes necesitan ser convertidos.</b></p> - - Unable to find Horus radio SD card! - - - - + Models and Settings written - + Modelos y ajustes escritos - + Unable to find file %1! - ¡No es posible encontrar el archivo %1! + ¡No se puede encontrar el archivo %1! - + Error reading file %1: %2. Error leyendo el archivo %1: @@ -6969,303 +8109,313 @@ We recommend you view the release notes using the button below to learn about an Alt+Shift+E - + Ctrl+Alt+C - + Ctrl+Alt+V - + Alt+Shift+S - + Alt+C - + Alt+A - + Alt+R - + Alt+W - + Alt+U - + %n Model(s) As in "Copy 3 Models" or "Cut 1 Model" or "Delete 3 Models" action). - - - + + %n modelo + %n modelos %n Model(s) As in "Paste 3 Models" or "Insert 1 Model." - - - + + %n modelo + %n modelos %n Category(ies) As in "Delete 3 Categories" or "Delete 1 Category." - - - + + %n categoría + %n categorías Nothing selected - + Nada seleccionado Rename Category - + Renombrar categoría Edit Model - + Editar modelo Cut - + Cortar Copy - + Copiar Paste - + Pegar Insert - + Insertar Edit Radio Settings - + Editar ajustes de radio Copy Radio Settings - + Copiar ajustes de radio Paste Radio Settings - + Pegar ajustes de radio Simulate Radio - + Simular radio Add Category - + Añadir categoría Category - + Categoría Add Model - + Añadir modelo Model - Modelo + Modelo Restore from Backup - + Restaurar desde copia de seguridad Model Wizard - Asistente Modelos + Asistente modelos Set as Default - + Fijar como predeterminado Print Model - + Imprimir modelo Simulate Model - + Simular modelo Duplicate Model - + Duplicar modelo Show Category Actions Toolbar - + Muestra barra de acciones de categoría Show Radio Actions Toolbar - + Muestra barra de acciones de radio Show Model Actions Toolbar - + Muestra barra de acciones de modelo - + + read only + solo lectura + + + New category Translators do NOT use accent for this, this is the default category name on Horus. - + Nueva categoria - + Category index out of range. - + Índice de categoría fuera de rango. - + Cannot delete the last category. - + No se puede eliminar la última categoría. - + Cannot insert model, last model in list would be deleted. - + No se puede insertar el modelo, no hay slots de modelo disponibles. - + Cannot add model, could not find an available model slot. - + No se puede añadir el modelo, no hay slots de modelo disponibles. - + Cannot paste model, out of available model slots. - + No se puede pegar el modelo, no hay slots de modelo disponibles. - + You are replacing an existing model, are you sure? - + Estás reemplazando un modelo existente, ¿estás seguro? - + Delete %n selected model(s)? - - - + + ¿Borrar %n modelo seleccionado? + ¿Borrar %n modelos seleccionados? - + Delete %n selected category(ies)? - - - + + ¿Borrar %n categoría seleccionada? + ¿Borrar %n categorías seleccionadas? - + Cannot duplicate model, could not find an available model slot. - + No se puede duplicar el modelo, no hay un slot de modelo disponibles. - + Do you wish to continue with the conversion? - + ¿Quieres continuar la conversión? - + Choose <i>Apply</i> to convert the file, or <i>Close</i> to close it without conversion. - + Elige <i>Aplicar</i> para convertir el archivo, o <i>Cerrar</i> para cerrar sin conversión. - + <b>The conversion generated some important messages, please review them below.</b> - + <b>La conversión ha generado mensajes importantes, por favor revísalos.</b> - + Companion :: Conversion Result for %1 - + Companion :: Resultado de la conversión para %1 - + + Unable to find radio SD card! + ¡No se puede encontrar la tarjeta SD de la radio! + + + Error opening file %1: %2. Error abriendo el archivo %1: %2. - + Save As - Guardar Como + Guardar como - + Open backup Models and Settings file - Abrir archivo de copia de seguridad de Modelos y Ajustes + Abre archivo de copia de seguridad de modelos y ajustes - + %1 has been modified. Do you want to save your changes? %1 ha sido modificado. ¿Quieres guardar los cambios? - + Invalid binary backup File %1 - Archivo binariode copia de seguridad inválido %1 + Archivo binariode copia de seguridad no válido %1 - + Cannot write temporary file! ¡No se puede escribir el archivo temporal! @@ -7275,23 +8425,27 @@ Do you want to save your changes? MIX - + (@%1) - + MixerDialog + + Dialog Mezclas + + Source Fuente @@ -7300,71 +8454,107 @@ Do you want to save your changes? + + + + + + + + The source for the mixer - LA fuente de la mezcla + La fuente de la mezcla + + Weight - Carga + Peso + + + + + + GV - + GV + + Switch used by the mix. If blank then the mix is considered to be "ON" all the time. The value of the mixer is multiplied by this value and divided by 100. - Switch usado por la mezcla. + Interruptor usado por la mezcla. Si está en blanco entonces la mezcla se considera que está activa todo el tiempo. + + Offset - + Offset + + Include Trim - Incluir Trim + Incluir trim + + Curve Curva + + The curve used by the mix La curva usada por la mezcla + + Switch - + Interruptor + + Yes - Si + Sí + + No - No + + + Warning Aviso + + Name Nombre @@ -7373,6 +8563,14 @@ Si está en blanco entonces la mezcla se considera que está activa todo el tiem + + + + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -7384,44 +8582,57 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If Delay is not zero the actuation of the mix will be delayed by the specified amount of seconds.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If Slow is not zero then the speed of the mix will be set by the value specified -&gt; the value states the number of seconds it takes to transit from -100 to 100.</p></body></html> - + + + Mixer warning. Setting this value will cause a beep to be emmitted when this value is active. - Sellecionar este valor provocará un beep emitido cuando este activo. Aviso del mezclador. - +Selecionar este valor provocará un beep cuando el valor esté activo. + + OFF APAGADO + + 1 Beep + + 2 Beep 2 Beeo + + 3 Beep + + Multiplex - Opciones + + + Multiplexer This determines how mixer values are added. @@ -7429,9 +8640,9 @@ This determines how mixer values are added. "+" means the value of the current mix is added to the previous mixes in the same channel. "*" means the value of the current mix is amultiplied with the previous mixes in the same channel. "R" means the value replaces the previous values. If the switch is off the value will be ignored. - Opciones + Multiplexer -Esto determina como los valores de mezcla son añadidos. +Esto determina cómo los valores de mezcla son añadidos. "+" significa que el valor de la mezcla actual es añadido a la mezcla previa en el mismo canal. "*" significa que el valor de la mezcla actual es multiplicada por la mezcla previa en el mismo canal @@ -7439,73 +8650,91 @@ Esto determina como los valores de mezcla son añadidos. + + ADD AÑADIR + + MULTIPLY MULTIPLICAR + + REPLACE REEMPLAZAR + + Flight modes Modos de vuelo + + Include DR/Expo - Incluye DR/Expo + IncluirDR/Expo + + Delay Retardo + + Slow Lento + + Up Arriba + + Down Abajo DEST -> %1 - + Click to access popup menu - + Pulsa para acceder el menú emergente Clear All - + Limpiar todo Set All - + Fijar todo Invert All - + Ivertir todo @@ -7513,22 +8742,22 @@ Esto determina como los valores de mezcla son añadidos. Increase font size - + Aumentar tamaño de fuente Decrease font size - + Reducir tamaño de fuente Default font size - + Tamaño de fuente predeterminado Ctrl+0 - + @@ -7537,7 +8766,7 @@ Esto determina como los valores de mezcla son añadidos. Move Up - Mover Arriba + Mover arriba @@ -7549,7 +8778,7 @@ Esto determina como los valores de mezcla son añadidos. Move Down - Mover Abajo + Mover abajo @@ -7590,12 +8819,12 @@ Esto determina como los valores de mezcla son añadidos. Enter - Enter + Intro &Toggle highlight - &Seleccionar Palanca + &Seleccionar palanca @@ -7668,18 +8897,20 @@ Esto determina como los valores de mezcla son añadidos. Model: - + Modelo: Throttle Source - Fuente del acelerador + Fuente del acelerador ModelEdit + + Dialog Mensaje @@ -7691,7 +8922,7 @@ Esto determina como los valores de mezcla son añadidos. Heli - + Heli @@ -7701,7 +8932,7 @@ Esto determina como los valores de mezcla son añadidos. Logical Switches - Switches lógicos + Interruptor lógicos @@ -7711,7 +8942,7 @@ Esto determina como los valores de mezcla son añadidos. Outputs - Salidas + Salidas @@ -7735,6 +8966,8 @@ Esto determina como los valores de mezcla son añadidos. + + Simulate Simular @@ -7744,102 +8977,102 @@ Esto determina como los valores de mezcla son añadidos. Exponential - Exponencial + Exponencial Extra Fine - Extra Fino + Extra Fino Fine - Fino + Fino Medium - Medio + Medio Coarse - Duro + Duro Unknown - Desconocido + Desconocido Slave/Jack - + Slave/Jack Master/SBUS Module - + Módulo Master/SBUS Master/CPPM Module - + Módulo Master/CPPM Master/SBUS in battery compartment - + Master/SBUS en compartimento de la batería Master/Jack - + Enable - + Activar Disable - + Desactivar True - + Verdadero False - + Falso Yes - Si + Sí No - No + Y - + N - + ON - ON + @@ -7847,458 +9080,458 @@ Esto determina como los valores de mezcla son añadidos. OFF - + bytes - + Mode - Modo + Modo Channels - Canales + Canales Frame length - + Longitud frame PPM delay - Retardo PPM + Retardo PPM Polarity - Polaridad + Polaridad Protocol - Protocolo + Protocolo Delay - Retardo + Retardo Receiver - Receptor + Receptor Radio protocol - + Protocolo radio Subtype - + Subtipo Option value - + Valor opción Sub Type - + Sub tipo RF Output Power - + Potencia de salida RF 90 - 90 + 120 - 120 + 120X - 120X + 140 - 140 + MULT! - + Offset - Offset + Slow - Lento + Lento Warn - + Aviso Flight modes - Modos de vuelo + Modos de vuelo Flight mode - Modo de vuelo + Modo de vuelo All - Todo + Todo Edge - + Borde Sticky - + Pegajoso Timer - Temporizador + Temporizador missing - + falta Duration - Duración + Duración Extended Limits - Límites extendidos + Límites extendidos Display Checklist - Lista verificación pantalla + Mostrar lista de verificación Global Functions - + Funciones globales Manual - + Manual Auto - + Auto Failsafe Mode - Modo Failsafe + Modo failsafe Hold - Esperar + Mantener No Pulse - + Sin pulsos Not set - + No fijado No pulses - + Sin pulsos Silent - Silencio + Silencio Beeps - + Beeps Voice - Voz + Voz Haptic - Reproducir Haptic + Haptic Flight - + Vuelo Manual reset - + Reset manual Step - + Paso Display - + Mostrar Extended - + Extendido Never - + Nunca On Change - + Al cambiar Always - + Siempre Source - + Fuente Trim idle only - + Trim sólo al ralentí Warning - Aviso + Aviso Reversed - + Invertido Tmr - + Temporiz. FrSky S.PORT - + FrSky D - + FrSky D (cable) - + Alti - + Alti+ - + VSpeed - + Veloc. vert. A1 - + A2 - + A3 - + A4 - + FAS - + Cells - + Celdas Calculated - + Calculado Add - + Sumar Average - + Media Min - + Mínimo Max - + Máximo Multiply - + Multiplicar Totalise - + Total Cell - + Celda Consumption - + Consumo Distance - + Distancia Lowest - + Menor Cell %1 - + Celda %1 Highest - + Mayor Delta - + Formula - + Fórmula Id - + Instance - + Instancia @@ -8306,130 +9539,130 @@ Esto determina como los valores de mezcla son añadidos. Sensor - + Sources - + Fuentes GPS - + GPS Alt. - + Blades - Palas + Palas Multi. - + F - + Inst - + Alt - + Unit - Unidad + Unidad Prec - + Ratio - + Multi - + A/Offset - + Filter - + Filtro Persist - + Persist. Positive - Positivo + Positivo Log - + Reporte Numbers - + Números Bars - Barras + Barras Script - + Script Filename - Nombre Archivo + Nombre archivo Error: Unable to open or read file! - + Error: ¡No se puede abrir o leer el archivo! Persistent - + Persistente Off - Apagado + @@ -8439,89 +9672,89 @@ Esto determina como los valores de mezcla son añadidos. None - Ninguno + Ninguno Name - Nombre + Nombre Countdown - Cuenta Atrás + Cuenta atrás Minute call - + Cada minuto FM%1 - + FM%1%2 - + FM%1+%2 - + Weight - + Peso Switch - + Interruptor NoTrim - + No DR/Expo - + Offset(%1) - + Disabled in all flight modes - + Desactivado en todos los modos de vuelo instant - + instante Custom - A medida + Personalizado Standard - Estandar + Estándar @@ -8544,368 +9777,500 @@ Esto determina como los valores de mezcla son añadidos. Model Name: - Nombre Modelo: + Nombre modelo: Model Type: - Tipo Modelo: + Tipo modelo: Module - + + + Failsafe Mode - Modo Failsafe + Modo failsafe + + Start Comenzar - + + + PPM delay Retardo PPM + + Negative Negativo + + Positive Positivo + + Polarity Polaridad - + + + Trainer Mode - Modo Entrenador + Modo entrenador - + + + PPM Frame Length - Longitud Trama PPM + Longitud trama PPM + + CH - + + + Antenna - + Antena - + + + Option value - - - - - Bind on startup - + Valor opción + + RF Output Power - + Potencia de salida de RF - + + + Low Power - + Baja potencia - + + + us - + + + Multi Radio Protocol - + Multi Radio protocol - + + + Sub Type - + Sub tipo - + + + Master/Jack - + Master/Jack - + + + Slave/Jack - + Slave/Jack - + + + Master/SBUS Module - + Módulo Master/SBUS - + + + Master/CPPM Module - + Módulo Master/CPPM - + + + Master/SBUS in battery compartment - + Master/SBUS en compartimento de la batería - + + + Show values in: - + Muestra valores en: - + + + % abbreviation for percent - + - + + + μs abbreviation for microseconds - + - + + + ms + + Receiver 1 - + Receptor 1 + + + + + + X - + + + Receiver 2 - + Receptor 2 + + Receiver 3 - + Receptor 3 + + WARNING: changing RF Output Power needs RE-BIND - + AVISO: cambiar potencia salida de RF requiere RE-BIND - + + + Channels Canales - + + + Registration ID - + Registro ID - + + + WARNING: Requires non-certified firmware! - + AVISO: ¡Requiere firmware no certificado! - + + + Not set - + No fijado - + + + Hold - Esperar + Mantener - + + + Custom - A medida + Personalizado - + + + No Pulses Sin Pulsos - + + + Receiver Receptor - - Failsafe Positions - Posiciones Failsafe + + + + Master/Bluetooth + Master/Bluetooth - + + + + Slave/Bluetooth + Slave/Bluetooth + + + + + + Master/Multi + Master/Multi + + + + + + Disable Telemetry + Desactivar telemetría + + + + + + Disable Ch. Map + Desactivar mapa canales + + + + + + Failsafe Positions + Posiciones failsafe + + + + + Protocol Protocolo + + Receiver No. Receptor Nº. - + + + Output type - + Tipo de salida - + + + Open Drain - + - + + + Push Pull - + ModuleData - + Positive - Positivo + Positivo - + Negative - Negativo + Negativo - + Trainer Port - Puerto Entrenador + Puerto entrenador - + Internal Radio System - Sistema Interno de Radio + Sistema de radio interno - + External Radio Module - Modulo externo de Radio + Módulo externo de radio - + Extra Radio System - Extra Sistema de Radio + Sistema de radio extra - + Radio System - Sistema de Radio + Sistema de radio - + 10mW - 16CH - + - - + + 100mW - 16CH - + - + 500mW - 16CH - + - + Auto <= 1W - 16CH - + - - + + 25mW - 8CH - + - - + + 25mW - 16CH - + - + 200mW - 16CH (no telemetry) - + 200mW - 16CH (sin telemetría) - + 500mW - 16CH (no telemetry) - + 500mW - 16CH (sin telemetría) - + 100mW - 16CH (no telemetry) - + 100mW - 16CH (sin telemetría) ModulePanel - + Value - Valor + Valor - + Hold - Esperar + Mantener - + No Pulse - + Sin pulsos - + Ask - + Preguntar - + Internal - + Interno - + Internal + External - + Interno + Externo - + External - + Externo + + + + Autodetect Format + Autodetectar formato + + + + Bind on channel + Bind con canal @@ -8913,448 +10278,448 @@ Esto determina como los valores de mezcla son añadidos. Input - Entrada + Entrada Weight - + Peso Long. cyc - + Cíc. long. Lateral cyc - + Cíc. lateral Collective - Colectivo + Colectivo Flight modes - Modos de vuelo + Modos de vuelo Flight mode - Modo de vuelo + Modo de vuelo Switch - + Interruptores General - + EEprom Size - + Tamaño EEprom Model Image - Imagen del modelo + Imagen del modelo Throttle - Acelerador + Acelerador Trims - + Center Beep - + Beep en centro Switch Warnings - Avisos palancas (Switch) + Avisos interruptores Pot Warnings - Avisos Potenciómetros + Avisos potenciómetros Other - + Otro Timers - + Temporizadores Time - Hora + Hora Countdown - Cuenta Atrás + Cuenta atrás Modules - + Módulos Trainer port - + Puerto entrenador Helicopter - Helicóptero + Helicóptero Swash - + Type - + Tipo Ring - + Protocol - Protocolo + Protocolo Low - + Bajo Critical - + Crítico Telemetry audio - + Audio telemetría Altimetry - Altímetro + Altímetro Vario source - Fuente Variómetro + Fuente variómetro Vario limits > - + Límites variómetro Sink max - + Descenso máx Sink min - + Descenso mín Climb min - + Ascenso mín Climb max - + Ascenso máx Center silent - + Centro silencio Top Bar - + Barra superior Volts source - + Fuente de voltage Altitude source - + Fuente de altitud Various - Varios + Varios Serial protocol - + Protocolo serie FAS offset - + mAh count - Valor mAh + Valor mAh Persistent mAh - mAh Constantes + mAh persistente Current source - Fuente Actual + Fuente actual Blades - Palas + Palas Parameters - Parámetros + Parámetros Telemetry Sensors - + Sensores de telemetría Telemetry Screens - + Pantallas de telemetría GF%1 - + Global Functions - + Funciones globales Checklist - + Lista de verificación GV%1 - + RE%1 - + Channel - + Canal Name - Nombre + Nombre Prec - + Popup - + Emergente Outputs - Salidas + Salidas Subtrim - Subtrim + Direct - + Directo Curve - Curva + Curva PPM - + Linear - Lineal + Lineal Telemetry - Telemetría + Telemetría Offset - Offset + Min - + Mín Min.call - + Cada min Persist - + Persistente F.In - + Atn. entr. F.Out - + Atn.sal. Global vars - + Vars globales Max - + Máx Global Variables - Variables globales + Variables globales Inputs - Entradas + Entradas Mixers - Mezclas + Mezclas Curves - Curvas + Curvas L%1 - + Logical Switches - Switches lógicos + Interruptores lógicos SF%1 - SF%1 + Special Functions - Funciones especiales + Funciones especiales Analogs - + Analógicos Unit - Unidad + Unidad Scale - Escala + Escala RSSI Alarms - + Alarmas RSSI @@ -9362,52 +10727,47 @@ Esto determina como los valores de mezcla son añadidos. Subtype - + Subtipo Video TX frequency - + Frecuencia vídeo TX CC2500 frequency fine tune - + CC2500 ajuste fino de frecuencia Telemetry - Telemetría + Telemetría Radio output power - + Potencia de salida radio Servo output frequency - + Frecuencia de salida servo Option value - + Valor opción Fixed ID value - + Valor ID fijo DEFAULT - - - - - Custom - proto %1) - + PREDETERMINADO @@ -9415,45 +10775,45 @@ Esto determina como los valores de mezcla son añadidos. Throttle Channel: - Canal Throttle: + Canal de acelerador: Yaw Channel: - Canal Yaw: + Canal de viraje: Pitch Channel: - Canal Pitch: + Canal de inclinación: Roll Channel: - Canal Roll: + Canal de balanceo: OpenTxEepromInterface - - - Unknown error - - + Unknown error + Error desconocido + + + ... plus %1 errors - + ... más %1 errores - + Cannot write radio settings - + No se pueden escribir los ajustes de la radio - + Cannot write model %1 - + No se puede escribir el modelo %1 @@ -9461,12 +10821,12 @@ Esto determina como los valores de mezcla son añadidos. Throttle Cut - Corte de Gas + Corte de gas Throttle Timer - Temporizador de Gas + Temporizador de gas @@ -9480,62 +10840,71 @@ Esto determina como los valores de mezcla son añadidos. Error opening file %1: %2. - Error abriendo el archivo %1: + Error abriendo el archivo %1: %2. Error opening OTX archive %1 - + Error abriendo archivo OTX %1 Error initializing OTX archive writer - + Error inicializando el escritor de archivo OTX Error writing file %1: %2. - Error escribiendo el archivo %1: + Error escribiendo el archivo %1: %2. Error creating OTX file %1: %2. - + Error creando el fichero OTX %1: +%2. Error creating OTX archive - + Error creando el archivo OTX Error adding %1 to OTX archive - + Error añadiendo %1 al archivo OTX PrintDialog + + Close Cerrar + + Style - + Estilo + + Print Imprimir + + Print to file Imprimir a archivo @@ -9547,7 +10916,7 @@ Esto determina como los valores de mezcla son añadidos. Select PDF output file - Seleccionar archivo de salida PDF + Seleccionar archivo de salida PDF @@ -9559,27 +10928,46 @@ Esto determina como los valores de mezcla son añadidos. ProgressDialog + + Flash Firmware - + + + Close - Cerrar + Cerrar Cancel - Cancelar + Cancelar ProgressWidget + + Show Details - Mostrar detalles + Mostrar detalles + + + + QObject + + + WARNING + AVISO + + + + <p>Importing JumperTX data into OpenTX 2.3 is <b>not supported and dangerous.</b></p> <p>It is unfortunately not possible for us to differentiate JumperTX data from legitimate FrSky X10 data, but <b>You should only continue here if the file you opened comes from a real FrSky X10.</b></p> <p>Do you really want to continue?</p> + <p> Importar datos de JumperTX a OpenTX 2.3 <b> no es compatible y es peligroso. </b> </p> <p> Desafortunadamente, no es posible diferenciar los datos de JumperTX de los datos legítimos de FrSky X10, pero <b> Sólo debes continuar aquí si el archivo que se abrió proviene de un FrSky X10 real. </b> </p> <p> ¿Realmente deseas continuar? </p> @@ -9587,7 +10975,7 @@ Esto determina como los valores de mezcla son añadidos. Models - + Modelos @@ -9595,97 +10983,97 @@ Esto determina como los valores de mezcla son añadidos. is invalid - + es inválido converted to - + convertido a verify is - + verificar si [DBG] - + [NFO] - + [WRN] - + [CVT] - + [ERR] - + [INV] - + Event - + Evento Origin - + Fuente Comp - + Comp Sub-Component - + Sub-componente Field - + Campo Type - + Tipo Old - + Anterior Action - Acción + Acción New - Nuevo + Nuevo Seq - + @@ -9694,24 +11082,24 @@ Esto determina como los valores de mezcla son añadidos. Cannot write file %1: %2. - No se puede escribir el archivo %1: + No se puede escribir el archivo %1: %2. <b><u>WARNING!</u></b><br>This will reset the fuses of %1 to the factory settings.<br>Writing fuses can mess up your radio.<br>Do this only if you are sure they are wrong!<br>Are you sure you want to continue? - <b><u>¡AVISO!</u></b><br>Esto reseteará los fuses de %1 a los ajustes de fábrica.<br>Escribir fuses puede estropear tu radio.<br>¡Haz esto sólo si estás seguro que están mal!<br>¿Estás seguro de continuar? + <b><u>¡AVISO!</u></b><br>Esto reseteará los fusibles de %1 a los ajustes de fábrica.<br>Escribir los fusibles puede estropear tu radio.<br>¡Haz esto sólo si estás seguro que están mal!<br>¿Estás seguro de continuar? Could not delete temporary file: %1 - + No se puede borrar el archivo temporal: %1 - Unable to find Horus radio SD card! - + Unable to find radio SD card! + ¡No se puede encontrar la tarjeta SD de la radio! @@ -9719,28 +11107,34 @@ Esto determina como los valores de mezcla son añadidos. <p>Value (input): <b>%1</b></p> - + <p>Valor (entrada): <b>%1</b></p> Right-double-click to reset to center. - + Doble click derecho para reiniciar centro. RadioNotFoundDialog + + No Radio Found - No se ha encontrado la Radio + No se ha encontrado radio + + <html><head/><body><p>No Radio was found!</p><p>Make sure that you hold the lower trim buttons towards the center while you turn it on.</p><p>Then connect the USB wire.</p><p><span style=" font-family:'arial,sans-serif'; font-size:13px; font-style:italic; color:#222222; background-color:#ffffff;">Note: if you have a Taranis that has not had the firmware upgraded to 2.0 then this version of Companion will not work.</span></p></body></html> - + <html><head/><body> <p> ¡No se encontró radio! </p> <p> Asegúrate de mantener presionados los botones de ajuste inferiores hacia el centro mientras la enciendes. </p> <p> Luego, conecta el cable USB. </p> <p> <span style = "font-family: 'arial, sans-serif'; font-size: 13px; font-style: italic; color: # 222222; background-color : #ffffff; "> Nota: si tienes una Taranis que no tiene el firmware actualizado a 2.0, entonces esta versión de Companion no funcionará. </span> </p> </body> </html> + + OK @@ -9749,64 +11143,78 @@ Esto determina como los valores de mezcla son añadidos. RadioOutputsWidget - + + Form - + - + + View: - + Vista: - + + Logical Switches - Switches lógicos + Interruptores lógicos - + + Global Variables - Variables globales + Variables globales - + + Channel Outputs - + Salidas canales - + + Mix Outputs - + Salidas mixes - + + L o g i c - + L +ó +g +i +c +o - + + G l o b a l - + - + + C h a @@ -9815,27 +11223,34 @@ n e l s - + C +a +n +a +l +e +s - + + M i x e s - + FM%1 - + GV%1 - + @@ -9843,7 +11258,7 @@ s Latch/unlatch the momentary switch. - + Activa/desactiva el interruptor momentáneo. @@ -9854,7 +11269,7 @@ s V - + @@ -9862,428 +11277,428 @@ s s - + ft - + m - + °C - + ° - + % - + mph - + km/h - + m/s - + A - + mAh - + W - + g - + TrmR - + TrmE - + TrmT - + TrmA - + Trm5 - + Trm6 - + TrmH - + TrmV - + Batt - Batería + Batería Time - Hora + Hora Timer1 - Temporizador1 + Temporizador1 Timer2 - Temporizador 2 + Temporizador 2 Timer3 - Temporizador 3 + Temporizador 3 RAS - + RSSI Tx - + RSSI Rx - + A1 - + A2 - + A3 - + A4 - + Alt - + Rpm - + Fuel - Combustible + Combustible T1 - + T2 - + Speed - Velocidad + Velocidad Dist - + Distancia GPS Alt - + Cell - + Celda Cells - + Celdas Vfas - + Curr - + Cnsp - + Cons Powr - + AccX - + AccY - + AccZ - + Hdg - + VSpd - + VelocVert AirSpeed - + VelocAire dTE - + A1- - + A2- - + A3- - + A4- - + Alt- - + Alt+ - + Rpm+ - + T1+ - + T2+ - + Speed+ - Velocidad+ + Velocidad+ Dist+ - + AirSpeed+ - + VelocAire+ Cell- - + Celda- Cells- - + Celdas- Vfas- - + Curr+ - + Powr+ - + ACC - + GPS Time - Hora GPS + Hora GPS REa - + REb - + ??? - ??? + ---- - + I as in Input - + LUA%1%2 - + MAX - + CYC%1 - + TR as in Trainer - + SRC - + @@ -10291,165 +11706,170 @@ s ↑ - + ↓ - + - - + ! - + RudTrim Left - RudTrim Izquierda + RudTrim izquierda RudTrim Right - RudTrim Derecha + RudTrim derecha EleTrim Down - EleTrim Abajo + EleTrim Abajo EleTrim Up - EleTrim Arriba + EleTrim Arriba ThrTrim Down - ThrTrim Abajo + ThrTrim abajo ThrTrim Up - ThrTrim Arriba + ThrTrim arriba AilTrim Left - AilTrim Izquierda + AilTrim Izquierda AilTrim Right - AilTrim Derecha + AilTrim Derecha Trim 5 Down - + Trim 5 abajo Trim 5 Up - + Trim 5 arriba Trim 6 Down - + Trim 6 abajo Trim 6 Up - + Trim 6 arriba TrmH Left - + TrmH izquierda TrmH Right - + TrmH derecha TrmV Down - + TrmV abajo TrmV Up - + TrmV arriba REa - + REb - + OFF - + ON - ON + THs - + TH% - + THt - + - + ??? - ??? + One - Uno + Uno - + + Act + + + + ---- - + - + Telemetry - Telemetría + Telemetría - + SW - + @@ -10457,7 +11877,7 @@ s Companion Release Notes - Notas de la versión Companion + Notas de la versión de Companion @@ -10465,7 +11885,7 @@ s OpenTX Release Notes - Notas de la versión OpenTX + Notas de la versión de OpenTX @@ -10473,17 +11893,17 @@ s Played once, not during startup - Reproducir una vez, no en el inicio + Reproducir una vez, no durante el inicio No repeat - No Repetir + No repetir %1s - %1s + @@ -10496,7 +11916,7 @@ s Yes - Si + Sí @@ -10510,14 +11930,15 @@ s Error opening file %1: %2. - Error abriendo el archivo %1: + Error abriendo el archivo %1: %2. Error opening file %1 in write mode: %2. - + Error abriendo archivo %1 en modo de escritura: +%2. @@ -10526,293 +11947,352 @@ s V - + A - + mA - + kts - + m/s - + km/h - + mph - + m - + f - + °C - + °F - + % - + mAh - + W - + mW - + dB - + rpms - + g - + ° - + Rad - + hours - + horas minutes - + minutos seconds - + segundos - + + ml/minute + ml/minuto + + + TELE - - - - - Internal - - - - - External - + Setup + + Center beep Centro beep + + OFF - OFF + + + Model Image Imagen del modelo + + Exponential Exponencial + + Throttle Trim Idle Only - Trim de acelerador ajuste de ralentí + Trim acel. ralentí + + Extra Fine Extra Fino + + Fine Fino + + Medium Medio + + Coarse - Duro + Grueso + + Display Checklist - Lista verificación pantalla + Lista de verific. + + Timer 2 Temporizador 2 + + Timer 1 - Temporizador1 + Temporizador 1 + + Timer 3 - Temporizador3 + Temporizador 3 + + Never - + Nunca + + Top LCD Timer - + Temp. LCD superior + + On change - + Al cambiar + + Always - + Siempre + + Global Functions - + Funcs. globales + + Edit Checklist... - + Lista de verific... + + Throttle Source - Fuente del acelerador + Fuente acelerador + + Trim Step - Pasos de Trim + Paso de trim + + Trims Display - + Mostrar trims + + Warnings Avisos + + Switch Warnings - Avisos palancas (Switch) + Avisos interruptores + + Pot Warnings Avisos Potenciómetros + + Manual - + Manual + + Auto + + Model Modelo + + Extended Limits Límites extendidos + + Extended Trims Trims extendidos + + Throttle Warning Aviso acelerador + + Reverse throttle operation. If this is checked the throttle will be reversed. Idle will be forward, trim will also be reversed and the throttle warning will be reversed as well. @@ -10824,31 +12304,33 @@ Si está marcado el acelerador será invertido. El ralentí será delante, el t + + Reverse Throttle - Invertir acelerador (Throttle) + Invertir acelerador SetupPanel - + Timer %1 - + Temporizador %1 - + THR - + - + Profile Settings - + Ajustes de perfil - + SD structure path not specified or invalid - + Ruta de la SD no especificada o no válida @@ -10856,7 +12338,7 @@ Si está marcado el acelerador será invertido. El ralentí será delante, el t Elevator Channel: - Canal Profundidad (Elevator): + Canal de profundidad: @@ -10865,203 +12347,203 @@ Si está marcado el acelerador será invertido. El ralentí será delante, el t screenshot Simulator LCD screenshot file name prefix - + captura ENTER - + INTRO S - + PG-UP - + RE PÁG PG-DN - + AV PÁG DEL - + SUPR BKSP - + RETR ESC - + INS - + <font size=+3>+</font> - + <font size=+3>-</font> - + <font size=+3>&larr;</font> - + <font size=+3>&rarr;</font> - + <font size=+3>&uarr;</font> - + <font size=+3>&darr;</font> - + <font size=+3>&#x2686;</font> - + <font size=+3>&#x21b6;</font> - + <font size=+3>&#x21b7;</font> - + <font size=+3>&#x21c6;</font> - + <font size=+3>&#x21d3;</font> - + <font size=+3>&#x21d1;</font> - + <font size=+3>&#x21d5;</font> - + <img src='qrc:/images/simulator/icons/svg/mouse.svg' width=20 height=18 /> - + <img src='qrc:/images/simulator/icons/svg/arrow_click.svg' width=18 height=18 /> - + <pre>[ MENU ]</pre> - + <pre>[ PAGE ]</pre> - + <pre>[ EXIT ]</pre> - + <pre>[ ENT ]</pre> - + <pre>[ SHIFT ]</pre> - + <pre>[ UP ]</pre> - + <pre>[ DN ]</pre> - + <pre>[ <font size=+2>+</font> ]</pre> - + <pre>[ <font size=+2>-</font> ]</pre> - + <pre>[ PgUp ]</pre> - + <pre>[ PgDn ]</pre> - + <pre>[ MDL ]</pre> - + <pre>[ RTN ]</pre> - + <pre>[ SYS ]</pre> - + <pre>[ TELE ]</pre> - + <font size=+3>&#x2261;</font> - + @@ -11069,609 +12551,673 @@ Si está marcado el acelerador será invertido. El ralentí será delante, el t OpenTx Simulator - + Simulador de OpenTx Available profiles: - + Perfiles disponibles: ID: - + Name: - + Nombre: Available radios: - + Radios disponibles: Radio profile ID or Name to use for simulator. - + Perfil ID de radio o nombre a usar para simulador. profile - + perfil Radio type to simulate (usually defined in profile). - + Tipo de radio a simular (normalmente definido en el perfil). radio - + radio Directory containing the SD card image to use. The default is configured in the chosen Radio Profile. - + Directorio conteniendo la imagen de la tarjeta SD a usar. El predeterminado es configurado en el perfil de radio seleccionado. path - + ruta Data source type to use (applicable to Horus only). One of: - + Origen de datos a usar (sólo aplicable a Horus). Uno de: type - + tipo data-source - + origen-datos Radio data (.bin/.eeprom/.otx) image file to use OR data folder path (for Horus-style radios). NOTE: any existing EEPROM data incompatible with the selected radio type may be overwritten! - + Imagen de datos de radio (.bin/.eeprom/.otx) o carpeta (para radios estilo Horus) a usar. +NOTA: cualquier dato EEPROM incompatible con la radio seleccionada puede ser sobreescrito! [data-source] - + [origen-datos] Error: Profile ID %1 was not found. - + Error: Perfil ID %1 no encontrado. Unrecognized startup data source type: %1 - + Tipo de origen de datos de arranque desconocido: %1 WARNING: couldn't initialize SDL: %1 - + WARNING: No se puede inicializar SDL: +%1 ERROR: No simulator libraries available. - + ERROR: No hay librerías de simulador disponibles. ERROR: Couldn't start simulator, missing radio/profile/data file/folder. Profile ID: [%1]; Radio ID: [%2]; Data File: [%3] - + ERROR: No se puede iniciar el simulador, falta radio/perfil/datos ficheo/carpeta. + Perfil ID: [%1]; Radio ID: [%2]; +Archivo datos: [%3] ERROR: Radio profile or simulator firmware not found. Profile ID: [%1]; Radio ID: [%2] - + ERROR: Perfil de radio o firmware del simulador no encontrado. +Perfil ID: [%1]; Radio ID: [%2] Uknown error during Simulator startup. - + Error desconocido al iniciar el simulador. SimulatorMainWindow - + + OpenTx Simulator - + Simulador de OpenTX - + + View - + Vista - + + Radio Window - + Ventana de radio - + + Reload... - + Recargar... - + + Tools - + Herramientas - + + Toolbar - + Barra de herramientas - + + Reload Lua Scripts - + Recarga scripts Lua - + + Reload the Lua environment on the simulated radio. - + Recarga el entorno Lua en la simulación de la radio. - + + F7 - + - + + Reload Radio Data - + Recarga datos de radio - + + Reload all radio data without restarting the simulator. - + Recarga todos los datos de la radio sin reiniciar el simulador. - + + F9 - + - + + Key Mapping - + Mapa de teclas - + + Show keyboard maping reference. - + Muestra el mapa de teclas. - + + F1 - + - + + Joystick Settings - + Ajustes joystick - + + Open joystick configuration settings dialog. - + Abre la configuracíon de ajustes del joystick. - + + F3 - + - + + LCD Screenshot - + Captura LCD - + + Save a screenshot of the current simulated LCD screen. - + Guarda una captura de la simulación de la pantalla LCD. - + + F8 - + - + + Dock In Main Window - + Anclar en la ventana principal - + + Show the radio in the main window or as a separate "floating" window. - + Muestra la radio en la ventana principal o en una ventana "flotante" separada. - + + Menu Bar - + Barra superior - + + Show or hide the top menu bar. - + Muestra u oculta la barra superior. - + + Alt+M - + Alt+M - + + Constrain Width - + Restringir ancho - + + Set radio widget width to be a fixed size. - + Fija el ancho de widget de la radio a un tamaño fijo. - + + Constrain Height - + Restringir alto - + + Set radio widget height to be a fixed size. - + Fija el alto de widget de la radio a un tamaño fijo. ERROR: Failed to create simulator interface, possibly missing or bad library. - + ERROR: No se puede crear la interfaz de simulador, posiblemente falta o es erronea la librería. Alt+T - + Radio Outputs - + Salidas de radio F2 - + Telemetry Simulator - + Simulador de telemetría F4 - + Trainer Simulator - + Simulador de entrenador F5 - + Debug Output - + Salida de depuración F6 - + <b>Simulator Controls:</b> - + <b>Controles simulador:</b> <tr><th>Key/Mouse</th><th>Action</th></tr> note: must match html layout of each table row (keyTemplate). - + <tr><th>Tecla/Ratón</th><th>Acción</th></tr> <tr><td><kbd>%1</kbd></td><td>%2</td></tr> note: must match html layout of help text table header. - + <tr><td><kbd>%1</kbd></td><td>%2</td></tr> Simulator Help - + Ayuda simulador SimulatorStartupDialog - + + OpenTX Simulator - Startup Options - + Simulador de OpenTX - Opciones de arranque - + + Simulator Startup Options: - + Opciones de arranque del simulador: - + + Radio Profile: - + Perfil de radio: - + + Existing radio profiles are shown here.<br /> Create or edit profiles using the Companion application. - + Los perfiles de radio existentes se muestran aquí.<br /> +Crea o edita perfiles usando la aplicación de Companion. - + + Radio Type: - + Tipo de radio: - + + Existing radio simulators are shown here.<br /> The radio type specified in the selected profile is used by default. - + Los simuladores de radio existentes se muestran aquí.<br /> +Por defecto se us el tipo de radio especificado en en perfil seleccionado. - + + Data Source: - + Origen de datos: - + + Data File: - + Archivo de datos: - + + Data Folder: - + Carpeta de datos: - + + SD Image Path: - + Ruta de la imagen SD: - + + Radio data (.bin/.eeprom/.otx) image file to use. A new file with a default image will be created if necessary.<br /> <b>NOTE</b>: any existing EEPROM data incompatible with the selected radio type may be overwritten! - + Archivo de datos de la radio (.bin/.eeprom/.otx) a usar. Un nuevo archivo con imange predeterminada se creará si es necesario.<br /> +<b>NOTE</b>: cualquier EEPROM incompatible con la radio selccionada se sobreescribirá! - + + Select data file... - + Selecciona archivo de datos... - - - + + + + + + ... - + - + + Directory containing RADIO and MODELS folders to use.<br /> New folder(s) with default radio/model will be created here if necessary. - + Directorio conteniendo RADIO y MODELOS a usar.<br /> +Nuevas carpeta(s) con radio/modelo predeterminado se crearán aquí si es necesario. - + + Select data folder... - + Selecciona carpeta de datos... - + + Directory containing the SD card image to use.<br/> The default is configured in the chosen Radio Profile. - + Directorio que contiene la imagen de la tarjeta SD a usar.<br/> +El predeterminado es configurado en el Perfil de radio seleccionado. - + + Select SD card image folder... - + Selecciona la carpeta de la imagen de la tarjeta SD... - + + Select which of the data sources (File/Folder/SD Card) you would like to start the simulator with. - + Selecciona el origen de datos (Archivo/carpeta/tarjata SD) con el que quieres iniciar el simulador. - + + File - Archivo + Archivo - + + Folder - + Carpeta - + + SD Path - + Ruta SD All files (*.*) - + Todos los ficheros (*.*) Select a data file - + Selecciona un archivo de datos Select Data Directory - + Selecciona directorio de datos Select SD Card Image Folder - + Selecciona carpeta de imágenes de la tarjeta SD SimulatorWidget - + + Companion Simulator - Simulador Companion + Simulador Companion Radio Simulator (%1) - + Simulador radio (%1) - + Could not determine startup data source. - + No se pueden determinar los datos de arranque. - + Could not load data, possibly wrong format. - + No se puede cargar datos, posiblemente formato erróneo. - + Data Load Error - + Error de carga de de datos - + Invalid startup data provided. Plese specify a proper file/path. - + Datos de inicio inválidos. Por favor specifica un archivo/ruta válido. - + Simulator Startup Error - + Error de arranque del simulador - + Error saving data: could open file for writing: '%1' - + Error salvando datos: no se puede abrir el archivo como escritura: '%1' - + Error saving data: could not get data from simulator interface. - + Error salvando datos: no se puede obtener datos de la interfaz del simulador. - + An unexpected error occurred while attempting to save radio data to file '%1'. - + Ha ocurrido un error inesperado al intentar guardar los datos de la radio al archivo '%1'. - + Data Save Error - + Error de guardado de datos - + Radio firmware error: %1 - + Error del firmware de la radio: %1 - + - Flight Mode %1 (#%2) - + - Modo de vuelo %1 (#%2) - + Cannot open joystick, joystick disabled - No se puede abrir el joystick, joystick desactivado + No se puede abrir el joystick, joystick desactivado @@ -11679,12 +13225,12 @@ The default is configured in the chosen Radio Profile. Right-double-click to reset to center. - + Doble click derecho para reiniciar el centro. <p>Value (input): <b>%1</b></p> - + <p>Valor (entrada): <b>%1</b></p> @@ -11692,18 +13238,22 @@ The default is configured in the chosen Radio Profile. + + + + ... Splash Library - page %1 of %2 - LIbreria de pantallas de inicio - página %1 de %2 + LIbrería de pantallas de inicio - página %1 de %2 Invalid image in library %1 - Imagen inválida en la librería %1 + Imagen no válida en la librería %1 @@ -11724,56 +13274,69 @@ The default is configured in the chosen Radio Profile. Unable to find file %1! - ¡No es posible encontrar el archivo %1! + ¡No se puede encontrar el archivo %1! StyleEditDialog + + Style Sheet Editor - + Editor de hoja de estilo + + &Reset to default - + &Reiniciar a los predeterminados + + &Cancel - + &Cancelar + + &OK - + + + This feature does not validate your changes and assumes you are familiar with CSS syntax for QT. - + Esta propiedad no valida tus cambios y asume que eres familiar con la sintaxis CSS para QT. Cannot retrieve style %1 Error: %2 - + No se puede obtener el estilo %1 +Error: %2 Cannot retrieve default style %1 Error: %2 - + No se puede obtener el estilo predeterminado %1 +Error: %2 Cannot update custom style %1 Error: %2 - + No se puede actualizar el estilo personalizado %1 +Error: %2 @@ -11781,47 +13344,47 @@ Error: %2 Style sheet data read from '%1' - + Hoja de estilo leída desde '%1' Style sheet data unable to be read from '%1' - + No se puede leer hoja de estilo desde '%1' Cannot create folder '%1' - + No se puede crear el directorio '%1' Cannot open file for writing '%1': Error: %2 - + No se puede abrir el archivo para escritura '%1': Error: %2 Cannot write to file '%1': Error: %2 - + No se puede escribir en el archivo '%1': Error: %2 Cannot flush buffer for file '%1': Error: %2 - + No se puede vaciar buffer para el archivo '%1': Error: %2 Style sheet written to '%1' - + Hoja de estilo escrita a '%1' Custom style sheet deleted: '%1' - + Hoja de estilo personalizada borrada: '%1' Unable to delete custom style sheet: '%1' - + No se puede borrar hoja de estilo personalizada: '%1' @@ -11829,141 +13392,145 @@ Error: %2 [TEST RUN] - + [TEST RUN] Synchronization failed, nothing found to copy. - + Sincronización fallida, no se ha encontrado nada para copiar. Skipping large file: %1 (%2KB) - + Omitiendo archivo largo: %1 (%2KB) Creating directory: %1 - + Creando directorio: %1 Could not create directory: %1 - + No se puede crear el directorio: %1 Gathering file information for %1... - + Reuniendo información del archivo para %1... No files found in %1 - + Ficheros no encontrados en %1 Synchronization aborted at %1 of %2 files. - + Sincronización abortada con %1 de %2 ficheros. Synchronization finished with %1 files in %2m %3s. - + Sincronización finalizada con %1 ficheros en %2m %3s. Synchronizing: %1 To: %2 - + Sincronizando: %1 + a: %2 Starting synchronization: %1 -> %2 - + Iniciando sincronización: + %1 -> %2 + Too many errors, giving up. - + +Demasiados errores, abortando. Skipping filtered file: %1 - + Omitiendo archivo filtrado: %1 Skipping linked file: %1 - + Omitiendo archivo linkado: %1 Aborted synchronization of: - + Sincronizacíon abortada de: Finished synchronizing: - + Sincronización finalizada: Created: %1; Updated: %2; Skipped: %3; Errors: %4; - + Creado: %1; Actualizado: %2; Omitido: %3; Errores: %4; Directory exists: %1 - + Existe el directorio: %1 At least one of the file modification dates is in the future, error on: %1 - + Al menos una de las fechas de modificación de los ficheros está en el futuro, error en: %1 Skipping older file: %1 - + Omitiendo fichero más antiguo: %1 Could not open source file '%1': %2 - + No se puede abrir el archivo de origen '%1': %2 Could not open destination file '%1': %2 - + No se puede abrir el archivo de destino '%1': %2 Skipping identical file: %1 - + Omitiendo archivo idéntico: %1 Replacing file: %1 - + Reemplazando archivo:; %1 Creating file: %1 - + Creando archivo: %1 Could not delete destination file '%1': %2 - + No se puede borrar el archivo de destino '%1': %2 Copy failed: '%1' to '%2': %3 - + Copia fallida: '%1' a '%2': %3 @@ -11976,12 +13543,12 @@ Too many errors, giving up. Elevator Channel: - Canal Profundidad (Elevator): + Canal de profundidad: Only one channel still available!<br>You probably should configure your model without using the wizard. - + ¡Sólo hay un canal disponible!<br>Deberías configurar el modelo sin el asistente. @@ -11994,7 +13561,7 @@ Too many errors, giving up. Only Elevator - Solo profundidad + Sólo profundidad @@ -12011,299 +13578,433 @@ Too many errors, giving up. Telemetry + + A1 + + A2 + + RSSI + + Alarm 1 Alarma 1 + + + + ---- + + + + Yellow Amarillo + + + + Orange Naranja + + + + Red Rojo + + Alarm 2 Alarma 2 + + Disable telemetry audio warnings - + Desactivar avisos de telemetría + + Source - + Fuente + + Center Silent - + Centro silencioso + + Altitude source - + Fuente de altitud + + Volts source - + Fuente de voltage + + Top Bar - + Barra superior + + Serial Protocol - Protocolo Serie + Protocolo serie + + Sensors - + Sensores + + Disable multi sensor handling - + Desactivar soporte sensor múltiple + + Volt source Fuente Voltaje + + Current source Fuente Actual + + Protocol Protocolo + + None Ninguno + + FrSky Sensor Hub - + FrSky Sensor Hub + + Blades Palas + + Sink Max - Descenso Máximo + Máximo descenso + + Climb Max - Máximo Ascenso + Máximo ascenso + + Sink Min - Descenso Mínimo + Mínimo descenso + + Climb Min - Mínimo Ascenso + Mínimo ascenso + + Vario source - Fuente Variómetro + Fuente variómetro + + Vario limits - Límites Variómetro + Límites variómetro + + Altimetry Altímetro + + mAh + + A + + Various Varios + + mAh count Valor mAh + + FAS Offset + + Persistent mAh - mAh Constantes + mAh constantes TelemetryAnalog + + Unit Unidad + + Max Value - Valor Máximo + Valor máx + + Alarm 1 Alarma 1 + + + + ---- + + + + Yellow Amarillo + + + + Orange Naranja + + + + Red Rojo + + + + < + + + + > + + Alarm 2 Alarma 2 + + Offset - Offset + + + Volts (V) Voltios (V) + + Amps (A) Amperios (A) + + Speed (m/s or ft/s) Velocidad (m/s o pies/s) + + Raw (-) + + Speed (km/h or miles/h) Velocidad (km/h o millas/h) + + Meters (m or ft) Metros (m o pies) + + Temp (°) - Temp (°) + + + Fuel (%) Combustible (%) + + mAmps (mA) miliAmperios (mA) @@ -12317,18 +14018,20 @@ Too many errors, giving up. TelemetryCustomScreen + + Custom Screen Type Personalizar tipo pantalla None - Ninguno + Ninguno Numbers - + Números @@ -12338,25 +14041,33 @@ Too many errors, giving up. Script - + Script + + Min Mínimo + + Source Fuente + + Gauge Medida + + Max Máximo @@ -12364,104 +14075,104 @@ Too many errors, giving up. TelemetryPanel - + FrSky S.PORT - + FrSky D - + FrSky D (cable) - + Telemetry screen %1 Pantalla telemetría %1 - + Source - + Fuente - + Low Alarm - Alarma Baja + Alarma baja - + Critical Alarm Alarma crítica - + Winged Shadow How High - + Winged Shadow How High (not supported) Winged Shadow How High (no soportado) - + Alti - + Alti+ - + VSpeed - + VelocVert - - - + + + A1 - - - + + + A2 - - + + A3 - - + + A4 - - + + FAS - + Cells - + Celdas - + --- @@ -12470,448 +14181,649 @@ Too many errors, giving up. TelemetrySensor + + Form - - - - - Custom - A medida - - - - Calculated - + Form + + + Custom + Personalizado + + + + + + Calculated + Calculado + + + + + Id - + - + + + Instance - + Instancia - + + + Rx - + - - Mod. - - - - + + + Add - + Suma - + + + Average - + Media - + + + Min - + Mín - + + + Max - + Máx - + + + Multiply - + Multiplicar - + + + Totalize - + Total - + + + Cell - + Celda - + + + Consumption - + Consumo - + + + Dist - + Distancia - + + + Cells Sensor : - + Sensor celdas : - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + --- - --- + - + + + GPS Sensor : - + Sensor GPS: - + + + Alt. Sensor : - + Sensor alt: - + + + Sensor : - + - + + + V - + - + + + A - + - + + + mA - + - + + + kt - + - + + + m/s - + - + + + ft/s - + - + + + km/h - + - + + + mph - + - + + + m - + - + + + ft - + - + + + °C - + - + + + °F - + - + + + % - + % - + + + mAh - + - + + + W - + - + + + mW - + - + + + dBm - + - + + + g - + - + + + ° - + - + + + Rad - + - + + + mL - + - + + + US fl.Oz. - + - + + + Raw (-) - + - + + + + TELE## + + + + + + RPM - + - + + + + ml/min + + + + + + Precision - + Precisión - + + + Ratio - + Ratio - + + + Blades - Palas + Palas - + + + Offset - Offset + Offset - + + + Multiplier - + - + + + Auto Offset - + - + + + Filter - + Filtro - + + + Persistent - + Persistente - + + + Positive - Positivo + Positivo - + + + Logs - + TelemetrySensorPanel - + + TELE%1 + + + + + Popup menu available + Menú desplegable disponible + + + Lowest - + Menor - + Cell %1 - + Celda %1 - + Highest - + Mayor - + Delta - + + + + + Copy + Copiar + + + + Cut + Cortar + + + + Paste + Pegar + + + + Clear + Limpiar + + + + Clear All + Limpiar todo + + + + Clear Telemetry Sensor. Are you sure? + Limpiar el sensor de telemetría ¿Estás seguro? + + + + Clear all Telemetry Sensors. Are you sure? + Limpiar todos los sensores de telemetría ¿Estás seguro? TelemetrySimulator - + + Telemetry Simulator - + Simulador de telemetría - + + VFAS - + - + + RSSI - + - + + A1 - + - + + A2 - + - + + Simulate - Simular + Simular - + + Replay SD Log File - + Reproducir archivo SD de reporte - + + Replay rate - + Velocidad de reproducción - + + Load - + Cargar - + + |> - + - + + <| - + - + + > - + - + + <- - + - + + X - + - + + Row # Timestamp - + Col # +Tiempo - + + 1/5x - 1/5x + - + + 5x - 5x + - + + No Log File Currently Loaded - + Actualmente no hay cargado archivo de reporte - + + RAS - + - - - + + + + + + V / ratio - + - + + Db - + - + + RxBt - + @@ -12927,274 +14839,331 @@ Timestamp - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + <html><head/><body><p><br/></p></body></html> - + - + + Tmp1 - + Temporizador 1 - + + A3 - + - + + A4 - + - + + Tmp2 - + Temporizador 2 - + + Fuel - Combustible + Combustible - - + + + + °C - + - + + ml - + - + + % - + - - + + + + Meters - + Metros - + + Alt - + - + + VSpd - + VelocVertical - + + m/s - + - + + Fuel Qty - + Cant. combust. - - + + + + km/h - + - + + Hdg - + - + + ASpd - + VelocAire - - - + + + + + + G - + - + + GPS - + - + + Lat,Lon (dec.deg.) - + - + + AccX - + - + + dd-MM-yyyy hh:mm:ss - + - + + Date - + Fecha - + + Amps - + - + + AccZ - + - + + GAlt - + - - + + + + Volts - + Voltios - + + Cels - + Celdas - + + Curr - + - + + AccY - + - + + GSpd - + VelocTierra - + + Degrees - + Grados - + + Setting RSSI to zero simulates telemetry and radio link loss. - + Fijando RSSI a cero simula pérdida de telemetría y conexión con la radio. - + + Set RSSI to zero when paused. - + Fijar RSSI a cero en pausa. - + + Stop sending telemetry data when the Telemetry Simulator window is hidden. - + Para de enviar datos de telemetría cuado el simulador esté oculto. - + + Pause simulation when hidden. - + Pausar simulación cuando se oculte. - - + + + + RPM - + - + + When enabled, sends any non-blank values as simulated telemetry data. - + Cuando está activado, envía valores no vacíos como datos de telemetría simulados. Log File - + Archivo Log LOG Files (*.csv) - + Ficheros LOG (*.csv) ERROR - invalid file - + ERROR - archivo no válido @@ -13202,30 +15171,34 @@ hh:mm:ss Yes - Si + Sí No - No + <br>Throttle Channel: - <br>Canal de Acelerador: + <br>Canal de acelerador: Timer + + Countdown - Cuenta Atrás + Cuenta atrás + + Minute Call - Cada Minuto + Cada minuto @@ -13233,12 +15206,12 @@ hh:mm:ss TMR - + Timer %1 - + Temporizador %1 @@ -13247,22 +15220,23 @@ hh:mm:ss Use mouse scroll or UP/DOWN arrow keys to change time in small steps. CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. - + Usar el scroll del ratón o teclas ARRIBA/ABAJO para cambiar el tiempo en pequeños pasos. +CTRL + scroll o AV/RE PÁG para cambiar el tiempo en pasos grandes. m - + h - + s - + @@ -13285,7 +15259,7 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. Haptic - Reproducir Haptic + @@ -13307,28 +15281,38 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. Trainer + + Form - + + + Mode - Modo + Modo + + Input - Entrada + Entrada + + Weight - + Peso + + Rud - Rud + @@ -13339,6 +15323,22 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + Beeper volume 0 - Quiet. No beeps at all. @@ -13346,10 +15346,10 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. 2 - Normal. 3 - Loud. 4 - Extra loud. - Volumen Beeper + Volumen Beeper 0 - Silencio. Ningun tipo de beep. -1 - Sin teclas. Los beeps suenan normal pero las teclas de menu no sonarán. +1 - No teclas. Los beeps suenan normal pero las teclas de menú no sonarán. 2 - Normal. 3 - Alto. 4 - Extra Alto. @@ -13359,80 +15359,143 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + Off - Apagado + Apagado + + + + + + + + += (Sum) - + += (Suma) + + + + + + + + := (Replace) - := (Reemplazar) + := (Reemplazar) + + + + + + + + chn1 - + + + + + + + + + chn2 - + + + + + + + + + chn3 - + + + + + + + + + chn4 - + + + Ele - Ele + + + Thr - Thr + + + Ail - Ail + TrainerSimulator - + + Trainer simulator - + Simulador de entrenador @@ -13440,34 +15503,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. Index - + Índice Name - Nombre + Nombre Size - + Tamaño RX # - + Models Translators do NOT use accent for this, this is the default category name on Horus. - + Modelos Model %1 Translators: do NOT use accents here, this is a default model name. - + Modelo %1 @@ -13475,12 +15538,12 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. First Tail Channel: - Primer Canal de cola: + Primer canal de cola: Second Tail Channel: - Segundo Canal de cola: + Segundo canal de cola: @@ -13488,42 +15551,42 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. Hld Y - + Hold Vertical stick position. - + Mantener la posición vertical del stick. Fix Y - Fijar Y + Fijar Y Prevent Vertical movement of stick. - + Evitar el movimiento vertical del stick. Fix X - Fijar X + Fijar X Prevent Horizontal movement of stick. - + Evitar el movimiento horizontal del stick. Hld X - + Hold Horizontal stick position. - + Mantener la posición horizontal del stick. @@ -13531,7 +15594,7 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. Standard Wing - Ala estandar + Ala estándar @@ -13589,7 +15652,7 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. Flaps - + Flaps @@ -13681,7 +15744,7 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. Rotor Type - Tipo Rotor + Tipo rotor @@ -13703,7 +15766,7 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. Multirotor - + Multirotor @@ -13728,7 +15791,7 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. Manually check the direction of each control surface and reverse any channels that make controls move in the wrong direction. Remove the propeller/propellers before you try to control your model for the first time.<br>Please note that continuing removes all old model settings! - Comprobar manualmente la dirección de cada control de superficie y los reversos de cualquier canal para que el control de movimiento no se erroneo. Saca la hélice/hélices antes de intentar controlar tu modelo por primera vez.<br> ¡Por favor tenga en cuenta eliminar los ajustes viejos! + Comprobar manualmente la dirección de cada control de superficie y los reversos de cualquier canal para que el control de movimiento no sea erróneo. Saca la hélice/hélices antes de intentar controlar tu modelo por primera vez.<br> ¡Por favor ten en cuenta que continuar eliminar los ajustes anteriores del modelo! @@ -13743,17 +15806,17 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. Most aircraft have a main wing and a tail with control surfaces. Flying wings and delta winged aircraft only have a single wing. The main control surface on a standard wing controls the roll of the aircraft. This surface is called an aileron.<br>The control surface of a delta wing controls both roll and pitch. This surface is called an elevon. - La mayoría de los aviones tienen un ala principal y una cola con controles de superficie. Volando alas y alas delta solo hay un ala simple. El control principal de superficie en un ala estandar controla el alabeo del avión. Esta superficie se llama alerón.<br> El control de superficie de un ala delta controla ambos alabeo y cabeceo. Esta superficie se llama elevon. + La mayoría de los aviones tienen un ala principal y una cola con controles de superficie. Volando alas y alas delta sólo hay un ala simple. El control principal de superficie en un ala estandar controla el alabeo del avión. Esta superficie se llama alerón.<br> El control de superficie de un ala delta controla ambos alabeo y cabeceo. Esta superficie se llama elevon. Models use one or two channels to control the ailerons.<br>A so called Y-cable can be used to connect a single receiver channel to two separate aileron servos. If your servos are connected by a Y-cable you should select the single-servo option.<br><br>Aileron - Spektrum: CH2, Futaba: CH1 - Los modelos usan 1 o 2 canales para controlar los alerones.<br>Un cable en Y se puede usar para conectar un solo canal del receptor a dos servos separados de los alerones. Si usas servos conectados por un cable Y debes seleccionar la opcion de servo único.<br><br> Alerón Spektrum: CH2, Futaba CH1 + Los modelos usan 1 o 2 canales para controlar los alerones.<br>Un cable en Y se puede usar para conectar un sólo canal del receptor a dos servos separados de los alerones. Si usas servos conectados por un cable Y debes seleccionar la opcion de servo único.<br><br> Alerón - Spektrum: CH2, Futaba CH1 This wizard assumes that your flaps are controlled by a switch. If your flaps are controlled by a potentiometer you can change that manually later. - Este asistente asume que tus flaps estan controlados por un switch. Si tus flaps están controlados por un potenciómetro lo puedes cambiar manualmente mas tarde. + Este asistente asume que tus flaps estan controlados por un interruptor. Si tus flaps están controlados por un potenciómetro lo puedes cambiar manualmente más tarde. @@ -13833,12 +15896,12 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. Model Name: - Nombre Modelo: + Nombre modelo: Model Type: - Tipo Modelo: + Tipo Modelo: @@ -13855,17 +15918,23 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. burnConfigDialog + + AVRDUDE Location - Localización AVRDUDE + Ubicación AVRDUDE + + Location of AVRDUDE executable Locatioon of AVRDUDE executable - Localización del ejecutable AVRDUDE + Ubicación del ejecutable AVRDUDE + + Programmer Configuration Configuration AVRDUDE / SAM-BA Configuración del programador @@ -13875,36 +15944,62 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + The location of the AVRDUDE executable. The location of the AVRDUDE.EXE executable. - La localización del ejecutable AVRDUDE. + La ubicación del ejecutable AVRDUDE. + + DFU-Util Location - Localización de la utilidad DFU + Ubicación de la utilidad DFU + + + + + + Use this button to browse and look for the AVRDUDE executable file. - Usa este botón para explorar y mirar el archivo ejecutable de AVRDUDE. + Usa este botón para explorar y ver el archivo ejecutable de AVRDUDE. + + + + + + Browse... Explorar... + + Programmer Programador + + Programmer used for communicating with the controller. Please consult the programmer's documentation and the AVRDUDE documentation to select the appropriate programmer. Programador usado para la comunicación con el controlador. @@ -13912,23 +16007,35 @@ Por favor consulta la documentacion del programador y la documentación de AVRDU + + List all available programmers. Lista todos los programadores disponibles. + + List Available - Listado Disponibles + Listado disponibles + + + + Extra arguments that will be passed to AVRDUDE on every call - Argumentos extras que deben pasar a AVRDUDE en cada llamada + Argumentos extra que deben pasar a AVRDUDE en cada llamada + + + + Extra arguments used in AVRDUDE. This can be used for providing extra information to AVRDUDE. @@ -13940,69 +16047,99 @@ Por favor solamente usa esto si sabes lo que estás haciendo. No hay control de + + Extra Arguments Argumentos extra + + Show AVRDUDE help Mostrar la ayuda de AVRDUDE + + Show Help - Mostrar Ayuda + Mostrar ayuda + + Communication port to the programmer. Puerto de comunicaciones al programador. + + MCU + + at91sam3s8-9xr + + Alternate device Dispositivo alternativo + + Use advanced controls Usar controles avanzados + + + + Port Puerto + + SAM-BA Location - Localizacon SAM-BA + Ubicación SAM-BA + + + + Location of sam-ba executable - Localización del ejecutable sam-ba + Ubicación del ejecutable sam-ba + + ARM MCU + + sam-ba serial port Puerto serie sam-ba @@ -14026,32 +16163,40 @@ Por favor solamente usa esto si sabes lo que estás haciendo. No hay control de Select Location - Seleccionar localización + Seleccionar ubicación List available programmers - Lista de programadores disponibles + Lista de programadores disponibles Avrdude help - + Ayuda Avrdude <b><u>WARNING!</u></b><br>Normally CPU type is automatically selected according to the chosen firmware.<br>If you change the CPU type the resulting eeprom could be inconsistent. - <b><u>¡AVISO!</u></b><br>Normalmente el tipo de CPU ees automáticamente elegida para el tipo de firmware.<br>Si cambias el tipo de CPU el eeprom resultante podria ser inconsistente. + <b><u>¡AVISO!</u></b><br>Normalmente el tipo de CPU es automáticamente elegida para el tipo de firmware.<br>Si cambias el tipo de CPU el eeprom resultante podría ser inconsistente. + + + + CPU of your TX - CPU a tu TX + CPU de tu TX + + + + CPU present on your 9x radio Should be m64 for stock radios m2560 for v4.1 boards @@ -14064,87 +16209,101 @@ m2560 para las placas v4.1 joystickDialog - + + Configure Joystick - Configurar Joystick + Configurar joystick - + + Ch2 - + + Ch1 - + + Ch4 - + + Ch6 - + + Ch3 - + + Ch5 - + + Ch7 - + + Ch8 - + + Instructions Instrucciones - + + Enable - + Activar - + + Cancel Cancelar - + + Back - + Atrás - + + Start - Comenzar + Inicio @@ -14153,29 +16312,30 @@ m2560 para las placas v4.1 - + + Ok Not Assigned - + No asignado Stick - + Knob/Slider %1 - + Knob/Slider %1 No joysticks found - No se han encopntrado joysticks + No se han encontrado joysticks @@ -14186,158 +16346,48 @@ m2560 para las placas v4.1 Press the Start button to start the stick range calibration procedure. You may change the channel assignments or inversion at any time. - + Presiona el botón Inicio para empezar el procedimiento de calibración de los stick +Puedes cambiar la asinación de canales o inversión en cualquier momento. Move sticks and pots in every direction making full movement Press Next when finished - + Mueve los sticks y pots hasta el final en todas las direcciones +Presiona Siguiente al finalizar Place sticks and pots in middle position. Press Next when done - + Mueve los sticks y pots a la posición central +Presiona Siguiente al finalizar Map joystick channels to controls using comboboxes. Press Next when done. - + Mapea los canales de joystick a los controles usando las listas deplegables +Presiona Siguiente al finalizar. Check inversion checkbox to if necessary to reverse direction. Press Next when done. - + Revisa la casilla de inversión si es necesario invertir la dirección. +Presiona Siguiente cuando finalices. Press OK to save configuration Press Cancel to abort joystick calibration without saving. - + Presiona OK oara guardar la configuración +Presiona Cancelar para abortar la calibración del joystick sin guardar. Calibration not complete, save anyway? - - - - - preferencesDialog - - - Preferences - Preferencias - - - - Simulator capture folder - Carpeta de captura de simulador - - - - Use clipboard only - Usar sólo portapapeles - - - - - ... - - - - - Splash library behaviour - Libreria de pantallas de inicio - - - - Remember simulator switches - Recordar los switch en el simulador - - - - Include companion splashes - Incluir pantallas de inicio de companion - - - - Only user defined splashes - Solo pantallas de inicio definidas por el usuario - - - - Custom TX splash screen - Pantalla de inicio personalizada del TX - - - - Personal splash library - Pantallas de inicio personales - - - - Joystick - - - - - - Open Folder - Abrir Carpeta - - - - Blue - Blu - Azul - - - - Simu BackLight - Luz de fondo del simulador - - - - Green - Verde - - - - Red - Rojo - - - - Orange - Naranja - - - - Yellow - Amarillo - - - - Enable - Activado - - - - Calibrate - Calibrar - - - - Open Image - Abrir Imagen - - - - Invert Pixels - Ivertir Pixeles + Calibración incompleta, ¿guardar? From 70507779a8608dadf054e62520f62e2af82a81a1 Mon Sep 17 00:00:00 2001 From: Neil Horne Date: Mon, 4 May 2020 22:44:33 +1000 Subject: [PATCH 324/560] Option to prompt for radio profile on companion start (#7565) * Optional prompt for radio profile on companion start * Sort out timings and use std appdata function * Change dialog title --- companion/src/CMakeLists.txt | 3 + companion/src/apppreferencesdialog.cpp | 2 + companion/src/apppreferencesdialog.ui | 561 +++++++++++++------------ companion/src/mainwindow.cpp | 38 +- companion/src/mainwindow.h | 1 + companion/src/profilechooser.cpp | 62 +++ companion/src/profilechooser.h | 47 +++ companion/src/profilechooser.ui | 110 +++++ companion/src/storage/appdata.h | 1 + 9 files changed, 541 insertions(+), 284 deletions(-) create mode 100644 companion/src/profilechooser.cpp create mode 100644 companion/src/profilechooser.h create mode 100644 companion/src/profilechooser.ui diff --git a/companion/src/CMakeLists.txt b/companion/src/CMakeLists.txt index 14f24ccba..016d962a6 100644 --- a/companion/src/CMakeLists.txt +++ b/companion/src/CMakeLists.txt @@ -250,6 +250,7 @@ set(companion_SRCS wizarddialog.cpp styleeditdialog.cpp dialogs/filesyncdialog.cpp # TODO move to own lib with other dialogs + profilechooser.cpp ) set(companion_MOC_HDRS @@ -284,6 +285,7 @@ set(companion_MOC_HDRS styleeditdialog.h helpers_html.h dialogs/filesyncdialog.h + profilechooser.h ) set(companion_UIS @@ -305,6 +307,7 @@ set(companion_UIS flasheepromdialog.ui radionotfound.ui styleeditdialog.ui + profilechooser.ui ) if(WIN32) diff --git a/companion/src/apppreferencesdialog.cpp b/companion/src/apppreferencesdialog.cpp index e3817a9ba..c235788df 100644 --- a/companion/src/apppreferencesdialog.cpp +++ b/companion/src/apppreferencesdialog.cpp @@ -73,6 +73,7 @@ void AppPreferencesDialog::accept() g.OpenTxBranch(AppData::DownloadBranchType(ui->OpenTxBranch->currentIndex())); g.autoCheckFw(ui->autoCheckFirmware->isChecked()); g.showSplash(ui->showSplash->isChecked()); + g.promptProfile(ui->chkPromptProfile->isChecked()); g.simuSW(ui->simuSW->isChecked()); g.removeModelSlots(ui->opt_removeBlankSlots->isChecked()); g.newModelAction(ui->opt_newMdl_useWizard->isChecked() ? AppData::MODEL_ACT_WIZARD : ui->opt_newMdl_useEditor->isChecked() ? AppData::MODEL_ACT_EDITOR : AppData::MODEL_ACT_NONE); @@ -185,6 +186,7 @@ void AppPreferencesDialog::initSettings() ui->autoCheckCompanion->setChecked(g.autoCheckApp()); ui->autoCheckFirmware->setChecked(g.autoCheckFw()); ui->showSplash->setChecked(g.showSplash()); + ui->chkPromptProfile->setChecked(g.promptProfile()); ui->historySize->setValue(g.historySize()); ui->backLightColor->setCurrentIndex(g.backLight()); ui->volumeGain->setValue(profile.volumeGain() / 10.0); diff --git a/companion/src/apppreferencesdialog.ui b/companion/src/apppreferencesdialog.ui index 9ed6d0e4c..80301223d 100644 --- a/companion/src/apppreferencesdialog.ui +++ b/companion/src/apppreferencesdialog.ui @@ -6,7 +6,7 @@ 0 0 - 741 + 864 668 @@ -722,32 +722,21 @@ Mode 4: 6 - - - - - - Automatic check for OpenTX firmware updates - - - true - - - - - - - Automatic check for Companion updates - - - true - - - - + + + + + 0 + 0 + + + + Enable automatic backup before writing firmware + + - - + + 0 @@ -755,7 +744,66 @@ Mode 4: - Startup Settings + Google Earth Executable + + + + + + + + 0 + 0 + + + + + Releases (stable) + + + + + Release candidates (testing) + + + + + Nightly builds (unstable) + + + + + + + + + 0 + 0 + + + + + Only show user splash images + + + + + Show user and companion splash images + + + + + + + + Qt::Horizontal + + + + + + + Qt::Horizontal @@ -795,76 +843,27 @@ Mode 4: - - - - - 0 - 0 - - - - Automatic Backup Folder - - - - - - - - 0 - 0 - - - - Google Earth Executable - - - - Show splash screen when Companion starts + Show splash screen true - - - - Qt::Horizontal - - - - - - - - 0 - 0 - - - - Remember - - - - - + + - - + + true - - false - - + 0 @@ -872,127 +871,13 @@ Mode 4: - Select Folder + Select Executable - - - - - - false - - - - - - - - 0 - 0 - - - - Select Folder - - - - - - - - - Qt::Horizontal - - - - - - - - 0 - 0 - - - - Debug Output Logging - - - - - - - - 0 - 0 - - - - Enable automatic backup before writing firmware - - - - - - <html><head/><body><p>This option maintains the behaviour from older OpenTx versions where empty model slots are preserved when a model is deleted or moved. </p><p>When this option is de-selected, the other models may be re-arranged to fill the gap left by the removed model.</p></body></html> - - - Remove empty model slots when deleting models (only applies for radios w/out categories) - - - - - - - - 0 - 0 - - - - Output Logs Folder - - - - - - - Qt::Horizontal - - - - - - - - 0 - 0 - - - - - Only show user splash images - - - - - Show user and companion splash images - - - - - - - - Qt::Horizontal - - - - @@ -1026,38 +911,17 @@ Mode 4: - - + + - - - true - + false - - - Select Folder - - - - - - - - - - - true - - - - - + 0 @@ -1065,13 +929,62 @@ Mode 4: - Select Executable + Select Folder - + + + + + 0 + 0 + + + + Remember + + + + + + + + 0 + 0 + + + + Output Logs Folder + + + + + + + + 0 + 0 + + + + Startup Settings + + + + + + + <html><head/><body><p>This option maintains the behaviour from older OpenTx versions where empty model slots are preserved when a model is deleted or moved. </p><p>When this option is de-selected, the other models may be re-arranged to fill the gap left by the removed model.</p></body></html> + + + Remove empty model slots when deleting models (only applies for radios w/out categories) + + + + @@ -1084,47 +997,7 @@ Mode 4: - - - - Release channel - - - - - - - - 0 - 0 - - - - Splash Screen Library - - - - - - - - 0 - 0 - - - - Action on New Model - - - - - - - Qt::Horizontal - - - - + @@ -1148,29 +1021,163 @@ Mode 4: - - + + + + + + true + + + false + + + + + + + Select Folder + + + + + + + - + 0 0 + + Action on New Model + + + + + - - Releases (stable) - + + + true + + + false + + - - Release candidates (testing) - + + + + 0 + 0 + + + + Select Folder + + + + + + + + + + 0 + 0 + + + + Splash Screen Library + + + + + + + Release channel + + + + + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + Debug Output Logging + + + + + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + Automatic Backup Folder + + + + + + + + + Automatic check for OpenTX firmware updates + + + true + + - - Nightly builds (unstable) - + + + Automatic check for Companion updates + + + true + + + + + + + + Qt::Horizontal + + + + + + + Prompt for radio profile + diff --git a/companion/src/mainwindow.cpp b/companion/src/mainwindow.cpp index 06760fb41..2c230000b 100644 --- a/companion/src/mainwindow.cpp +++ b/companion/src/mainwindow.cpp @@ -49,6 +49,7 @@ #include "translations.h" #include "dialogs/filesyncdialog.h" +#include "profilechooser.h" #include #include @@ -130,10 +131,16 @@ MainWindow::MainWindow(): else { if (!g.previousVersion().isEmpty()) g.warningId(g.warningId() | AppMessages::MSG_UPGRADED); - if (checkProfileRadioExists(g.sessionId())) - QTimer::singleShot(updateDelay, this, SLOT(doAutoUpdates())); - else - g.warningId(g.warningId() | AppMessages::MSG_NO_RADIO_TYPE); + if (g.promptProfile()) { + QTimer::singleShot(updateDelay, this, SLOT(chooseProfile())); // add an extra second to give mainwindow time to load + updateDelay += 5000; // give user time to select profile before warnings + } + else { + if (checkProfileRadioExists(g.sessionId())) + QTimer::singleShot(updateDelay, this, SLOT(doAutoUpdates())); + else + g.warningId(g.warningId() | AppMessages::MSG_NO_RADIO_TYPE); + } } QTimer::singleShot(updateDelay, this, SLOT(displayWarnings())); @@ -468,7 +475,7 @@ void MainWindow::checkForFirmwareUpdateFinished(QNetworkReply * reply) const QString errorString = seekCodeString(qba, "ERROR"); const QString blockedRadios = seekCodeString(qba, "BLOCK"); long version; - + if (errorString == "NO_RC") return onUpdatesError(tr("No firmware release candidates are currently being served for this version, please switch release channel")); else if (errorString == "NO_NIGHTLY") @@ -481,7 +488,7 @@ void MainWindow::checkForFirmwareUpdateFinished(QNetworkReply * reply) msgbox.setText(tr("Release candidate builds are now available for this version, would you like to switch to using them?")); msgbox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgbox.setDefaultButton(QMessageBox::Yes); - + if(msgbox.exec() == QMessageBox::Yes) { g.OpenTxBranch(AppData::DownloadBranchType(AppData::BRANCH_RC_TESTING)); return onUpdatesError(tr("Channel changed to RC, please restart the download process")); @@ -493,7 +500,7 @@ void MainWindow::checkForFirmwareUpdateFinished(QNetworkReply * reply) msgbox.setText(tr("Official release builds are now available for this version, would you like to switch to using them?")); msgbox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgbox.setDefaultButton(QMessageBox::Yes); - + if(msgbox.exec() == QMessageBox::Yes) { g.OpenTxBranch(AppData::DownloadBranchType(AppData::BRANCH_RELEASE_STABLE)); return onUpdatesError(tr("Channel changed to Release, please restart the download process")); @@ -1807,3 +1814,20 @@ void MainWindow::autoClose() { this->close(); } + +void MainWindow::chooseProfile() +{ + QMap active; + active = g.getActiveProfiles(); + if (active.size() > 1) { + ProfileChooserDialog *pcd = new ProfileChooserDialog(this); + connect(pcd, &ProfileChooserDialog::profileChanged, this, &MainWindow::loadProfileId); + pcd->exec(); + delete pcd; + // doi here as need to wait until dialog dismissed and current radio type is set + if (checkProfileRadioExists(g.sessionId())) + doAutoUpdates(); + else + g.warningId(g.warningId() | AppMessages::MSG_NO_RADIO_TYPE); + } +} diff --git a/companion/src/mainwindow.h b/companion/src/mainwindow.h index 222c047e0..9369dacac 100644 --- a/companion/src/mainwindow.h +++ b/companion/src/mainwindow.h @@ -128,6 +128,7 @@ class MainWindow : public QMainWindow void exportSettings(); void importSettings(); void autoClose(); + void chooseProfile(); void openUpdatesWaitDialog(); void closeUpdatesWaitDialog(); diff --git a/companion/src/profilechooser.cpp b/companion/src/profilechooser.cpp new file mode 100644 index 000000000..17a9570e5 --- /dev/null +++ b/companion/src/profilechooser.cpp @@ -0,0 +1,62 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "profilechooser.h" +#include "ui_profilechooser.h" +#include "appdata.h" + +ProfileChooserDialog::ProfileChooserDialog(QWidget * parent): + QDialog(parent), + ui(new Ui::ProfileChooserDialog) +{ + ui->setupUi(this); + setWindowIcon(QIcon(":/icon.png")); + QComboBox *prof = ui->cboProfiles; + prof->clear(); + + QMap active; + active = g.getActiveProfiles(); + QMapIterator i(active); + while (i.hasNext()) { + i.next(); + prof->addItem(i.value(), i.key()); + } + + prof->setSizeAdjustPolicy(QComboBox::AdjustToContents); + prof->setCurrentIndex(prof->findData(g.id())); + connect(prof, SIGNAL(currentIndexChanged(int)), this, SLOT(on_cboProfilesCurrentIndexChanged(int))); +} + +ProfileChooserDialog::~ProfileChooserDialog() +{ + delete ui; +} + +void ProfileChooserDialog::on_cboProfilesCurrentIndexChanged(int index) +{ + QComboBox *prof = ui->cboProfiles; + + if ((prof->currentIndex() > -1)) { + int oldid = g.id(); + int newid = prof->currentData().toInt(); + if (oldid != newid) + emit profileChanged(newid); + } +} diff --git a/companion/src/profilechooser.h b/companion/src/profilechooser.h new file mode 100644 index 000000000..b40e6b359 --- /dev/null +++ b/companion/src/profilechooser.h @@ -0,0 +1,47 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef _PROFILECHOOSER_H_ +#define _PROFILECHOOSER_H_ + +#include + +namespace Ui { + class ProfileChooserDialog; +} + +class ProfileChooserDialog : public QDialog +{ + Q_OBJECT + + public: + ProfileChooserDialog(QWidget * parent = 0); + ~ProfileChooserDialog(); +signals: + void profileChanged(int newid); + + private slots: + void on_cboProfilesCurrentIndexChanged(int index); + + private: + Ui::ProfileChooserDialog *ui; +}; + +#endif // _PROFILECHOOSER_H_ diff --git a/companion/src/profilechooser.ui b/companion/src/profilechooser.ui new file mode 100644 index 000000000..10a6d6bbe --- /dev/null +++ b/companion/src/profilechooser.ui @@ -0,0 +1,110 @@ + + + ProfileChooserDialog + + + + 0 + 0 + 352 + 102 + + + + + 0 + 0 + + + + Select Profile + + + + + 20 + 20 + 311 + 66 + + + + + + + + + + 0 + 0 + + + + Profile + + + + + + + + 0 + 0 + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Ok + + + false + + + + + + + + + + buttonBox + accepted() + ProfileChooserDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + ProfileChooserDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/companion/src/storage/appdata.h b/companion/src/storage/appdata.h index 3ffa7d688..a17b9c1ce 100644 --- a/companion/src/storage/appdata.h +++ b/companion/src/storage/appdata.h @@ -575,6 +575,7 @@ class AppData: public CompStoreObj PROPERTY4(bool, snapToClpbrd, "snapshot_to_clipboard", false) PROPERTY4(bool, autoCheckApp, "startup_check_companion", true) PROPERTY4(bool, autoCheckFw, "startup_check_fw", true) + PROPERTY4(bool, promptProfile, "startup_prompt_profile", false) PROPERTY(bool, enableBackup, false) PROPERTY(bool, backupOnFlash, true) From 0e2b4e0a3fded9f0347ca1decb69e6a5a04295de Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 4 May 2020 15:46:43 +0200 Subject: [PATCH 325/560] Improve TX16s UARTS (#7568) * Rework TX16s UARTs * Rework TX16s UARTs --- .../common/arm/stm32/aux_serial_driver.cpp | 2 +- radio/src/targets/horus/hal.h | 59 ++++++++----------- radio/src/telemetry/frsky.h | 7 ++- 3 files changed, 30 insertions(+), 38 deletions(-) diff --git a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp index 38d7006d7..58f27fed5 100644 --- a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp @@ -104,7 +104,7 @@ void auxSerialInit(unsigned int mode, unsigned int protocol) break; } #endif - auxSerialSetup(FRSKY_SPORT_BAUDRATE, false); + auxSerialSetup(FRSKY_TELEM_MIRROR_BAUDRATE, false); break; #if defined(DEBUG) || defined(CLI) diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 063daae68..c37f1ba54 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -392,7 +392,7 @@ #endif // Serial Port (DEBUG) -#if defined(PCBX12S) +#if defined(PCBX12S) || defined(RADIO_TX16S) #define AUX_SERIAL_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1) #define AUX_SERIAL_RCC_APB1Periph RCC_APB1Periph_USART3 #define AUX_SERIAL_RCC_APB2Periph 0 @@ -407,47 +407,34 @@ #define AUX_SERIAL_USART_IRQn USART3_IRQn #define AUX_SERIAL_DMA_Stream_RX DMA1_Stream1 #define AUX_SERIAL_DMA_Channel_RX DMA_Channel_4 -#elif defined(RADIO_TX16S) && !defined(BLUETOOTH) - #define AUX_SERIAL_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_DMA2) - #define AUX_SERIAL_RCC_APB1Periph 0 - #define AUX_SERIAL_RCC_APB2Periph RCC_APB2Periph_USART6 - #define AUX_SERIAL_USART USART6 - #define AUX_SERIAL_GPIO_AF GPIO_AF_USART6 - #define AUX_SERIAL_USART_IRQn USART6_IRQn - #define AUX_SERIAL_GPIO GPIOG - #define AUX_SERIAL_GPIO_PIN_TX GPIO_Pin_14 // PG.14 - #define AUX_SERIAL_GPIO_PIN_RX GPIO_Pin_9 // PG.09 - #define AUX_SERIAL_GPIO_PinSource_TX GPIO_PinSource14 - #define AUX_SERIAL_GPIO_PinSource_RX GPIO_PinSource9 - #define AUX_SERIAL_USART_IRQHandler USART6_IRQHandler - #define AUX_SERIAL_DMA_Stream_RX DMA2_Stream6 - #define AUX_SERIAL_DMA_Channel_RX DMA_Channel_5 - #define AUX_SERIAL_PWR_GPIO GPIOB - #define AUX_SERIAL_PWR_GPIO_PIN GPIO_Pin_0 // PB.00 - #define TRAINER_BATTERY_COMPARTMENT - - #define AUX2_SERIAL_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1) - #define AUX2_SERIAL_PWR_GPIO GPIOA - #define AUX2_SERIAL_PWR_GPIO_PIN GPIO_Pin_15 // PA.15 - #define AUX2_SERIAL_RCC_APB1Periph RCC_APB1Periph_USART3 - #define AUX2_SERIAL_RCC_APB2Periph 0 - #define AUX2_SERIAL_GPIO GPIOB - #define AUX2_SERIAL_GPIO_PIN_TX GPIO_Pin_10 // PB.10 - #define AUX2_SERIAL_GPIO_PIN_RX GPIO_Pin_11 // PB.11 - #define AUX2_SERIAL_GPIO_PinSource_TX GPIO_PinSource10 - #define AUX2_SERIAL_GPIO_PinSource_RX GPIO_PinSource11 - #define AUX2_SERIAL_GPIO_AF GPIO_AF_USART3 - #define AUX2_SERIAL_USART USART3 - #define AUX2_SERIAL_USART_IRQHandler USART3_IRQHandler - #define AUX2_SERIAL_USART_IRQn USART3_IRQn - #define AUX2_SERIAL_DMA_Stream_RX DMA1_Stream1 - #define AUX2_SERIAL_DMA_Channel_RX DMA_Channel_4 +#if defined(RADIO_TX16S) + #define TRAINER_BATTERY_COMPARTMENT // allows serial port TTL trainer +#endif #else #define AUX_SERIAL_RCC_AHB1Periph 0 #define AUX_SERIAL_RCC_APB1Periph 0 #define AUX_SERIAL_RCC_APB2Periph 0 #endif +#if defined(RADIO_TX16S) && !defined(BLUETOOTH) + #define AUX2_SERIAL_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_DMA2) + #define AUX2_SERIAL_RCC_APB1Periph 0 + #define AUX2_SERIAL_RCC_APB2Periph RCC_APB2Periph_USART6 + #define AUX2_SERIAL_USART USART6 + #define AUX2_SERIAL_GPIO_AF GPIO_AF_USART6 + #define AUX2_SERIAL_USART_IRQn USART6_IRQn + #define AUX2_SERIAL_GPIO GPIOG + #define AUX2_SERIAL_GPIO_PIN_TX GPIO_Pin_14 // PG.14 + #define AUX2_SERIAL_GPIO_PIN_RX GPIO_Pin_9 // PG.09 + #define AUX2_SERIAL_GPIO_PinSource_TX GPIO_PinSource14 + #define AUX2_SERIAL_GPIO_PinSource_RX GPIO_PinSource9 + #define AUX2_SERIAL_USART_IRQHandler USART6_IRQHandler + #define AUX2_SERIAL_DMA_Stream_RX DMA2_Stream6 + #define AUX2_SERIAL_DMA_Channel_RX DMA_Channel_5 + #define AUX2_SERIAL_PWR_GPIO GPIOB + #define AUX2_SERIAL_PWR_GPIO_PIN GPIO_Pin_0 // PB.00 +#endif + // Telemetry #define TELEMETRY_RCC_AHB1Periph (RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA1) #define TELEMETRY_RCC_APB1Periph RCC_APB1Periph_USART2 diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index 763da1b32..623ecb67d 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -33,7 +33,12 @@ enum FrSkyDataState { STATE_DATA_XOR, }; -#define FRSKY_SPORT_BAUDRATE 57600 +#define FRSKY_SPORT_BAUDRATE 57600 +#if defined(RADIO_TX16S) +#define FRSKY_TELEM_MIRROR_BAUDRATE 115200 +#else +#define FRSKY_TELEM_MIRROR_BAUDRATE FRSKY_SPORT_BAUDRATE +#endif #define FRSKY_D_BAUDRATE 9600 From 19249febb5d06ad41e4c0557287c7249797967e7 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 4 May 2020 17:56:27 +0200 Subject: [PATCH 326/560] Re-add rxnum for multi rx (needed for trainer) --- radio/src/pulses/modules_helpers.h | 3 --- radio/src/telemetry/telemetry.h | 1 + 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h index c8e8411c4..244e58a79 100644 --- a/radio/src/pulses/modules_helpers.h +++ b/radio/src/pulses/modules_helpers.h @@ -384,9 +384,6 @@ inline bool isModuleRxNumAvailable(uint8_t moduleIdx) if (isModuleISRM(moduleIdx)) return true; - if (IS_RX_MULTI(moduleIdx)) - return false; - if (isModuleMultimodule(moduleIdx)) return true; diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index c7228a0ff..c92e722f0 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -121,6 +121,7 @@ extern uint8_t telemetryProtocol; #define IS_D16_MULTI(module) false #define IS_HOTT_MULTI(module) false #define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) + #define IS_RX_MULTI(module) false #endif #define IS_SPEKTRUM_PROTOCOL() (telemetryProtocol == PROTOCOL_TELEMETRY_SPEKTRUM) From 24615f777326d18d8a38e90d4bad169562a85fff Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 4 May 2020 18:06:40 +0200 Subject: [PATCH 327/560] Internal multi missing on server built tx16s firmware --- radio/util/build-firmware.py | 2 +- radio/util/fwoptions.py | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/radio/util/build-firmware.py b/radio/util/build-firmware.py index 8d85d542c..76bade5b6 100755 --- a/radio/util/build-firmware.py +++ b/radio/util/build-firmware.py @@ -151,7 +151,7 @@ def main(): elif board_name == "tx16s": cmake_options["PCB"] = "X10" cmake_options["PCBREV"] = "TX16S" - firmware_options = options_jumper_t16 + firmware_options = options_radiomaster_tx16s maxsize = 2 * 1024 * 1024 else: return INVALID_BOARD diff --git a/radio/util/fwoptions.py b/radio/util/fwoptions.py index 1b7e5cfad..811ff17b7 100755 --- a/radio/util/fwoptions.py +++ b/radio/util/fwoptions.py @@ -222,4 +222,16 @@ options_jumper_t16 = { "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), "internalmulti": ("INTERNAL_MODULE_MULTI", "YES", "NO"), "bluetooth": ("BLUETOOTH", "YES", "NO"), +} + +options_radiomaster_tx16s = { + "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), + "bluetooth": ("BLUETOOTH", "YES", "NO"), } \ No newline at end of file From 9b42f8c6b91f9668e7ba3cc63e6e2f1d853ea79b Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 5 May 2020 10:49:56 +0200 Subject: [PATCH 328/560] Improve companion trainer default --- companion/src/firmwares/generalsettings.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/companion/src/firmwares/generalsettings.cpp b/companion/src/firmwares/generalsettings.cpp index 1676e913c..9c38391c7 100644 --- a/companion/src/firmwares/generalsettings.cpp +++ b/companion/src/firmwares/generalsettings.cpp @@ -123,6 +123,12 @@ GeneralSettings::GeneralSettings() strcpy(bluetoothName, "taranis"); } + for (uint8_t i = 0; i < 4; i++) { + trainer.mix[i].mode = 2; // replace (:=) + trainer.mix[i].src = i; + trainer.mix[i].weight = 100; + } + templateSetup = g.profile[g.sessionId()].channelOrder(); stickMode = g.profile[g.sessionId()].defaultMode(); From ef84394a37c23fe70edb78e24c49ef30181dc7c6 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 5 May 2020 15:39:51 +0200 Subject: [PATCH 329/560] Add screenshot button to TX16S simu --- companion/src/images/simulator/TX16S/left.png | Bin 48315 -> 32296 bytes .../src/images/simulator/TX16S/left_page.png | Bin 48258 -> 32274 bytes .../src/images/simulator/TX16S/left_page2.png | Bin 48292 -> 32303 bytes .../src/images/simulator/TX16S/left_rtn.png | Bin 48242 -> 32217 bytes .../src/images/simulator/TX16S/left_sys.png | Bin 48264 -> 32243 bytes .../src/images/simulator/TX16S/left_tele.png | Bin 48266 -> 32206 bytes .../src/simulation/simulateduiwidgetTX16S.cpp | 2 +- 7 files changed, 1 insertion(+), 1 deletion(-) diff --git a/companion/src/images/simulator/TX16S/left.png b/companion/src/images/simulator/TX16S/left.png index ded33bf620b35487e831e385d89cb629313a76a5..83d12f301cb8995be656e602a46318fd8289f48e 100755 GIT binary patch literal 32296 zcmXt<1yEFPxW*Cb24QIgq**$Jg+HB2NiNOOox&1|bayC7OXt$DpmcX5-5~-C2ngss z-aB^~hGlo)#QS}3{GR7TYiTGG;?dxtp`j6~swn6HKWos?p0MCx0k4|1@OFV87;L7AyM+s4cbuP9196d&~IvIi_}(Swtz-H$ldNywAFr|IWGH*dL0O znu-5yJLf-jB@^TJvY`dr=7j~N{Q+BZisP@Ye_lribg0yZ{C7i8cpZdzOgHzJLW?uf zc6l3!=s&~EhY6vfZoV!F6QeV79vk0(Gq@>;K44X49I6u%7@n9A-S;#c*bezq@b~Ck z>}viduK(x{2k}}?>NoNdyu?=)$*`OD0dma+D8Hf8IR%Yq^xyD89(7O(Xrpu}UC`CLeuwQ98Jg@IP=l{ZGXXs8x1`++pMYCw=XAnSmGwgPz|7)zDctDCr?z+xwO!@WS$

jm$IqC+srV;)J}x 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 literal 48315 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%0DVye84p59*+IT-gr*Z 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

Oq{lfZ5#6z!mdP;iXANB`~QEFo3iC3RmH-_B-W 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 Kl&TbLL;nxZ+_gpk diff --git a/companion/src/images/simulator/TX16S/left_page.png b/companion/src/images/simulator/TX16S/left_page.png old mode 100755 new mode 100644 index 5c94a36e10ca2330b5d578e23cd18f696e3f99dd..9ea20a59fe26650972f132901ccd359b0b102b68 GIT binary patch delta 29086 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 z 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 YU9zgpZ^J!%H^4tNB~8T&`PV`J2b2+5X8-^I diff --git a/companion/src/images/simulator/TX16S/left_page2.png b/companion/src/images/simulator/TX16S/left_page2.png old mode 100755 new mode 100644 index b5a3bfecd874c8020818e42d2d6ec1e09cac3e75..6ef922970d1a63e6c8b4f5d7f160822adc758d89 GIT binary patch delta 28884 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 delta 29132 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 ZJN&)TGdvO4Id{MxWqA#`GMN{C{|D3`HVOa$ diff --git a/companion/src/images/simulator/TX16S/left_rtn.png b/companion/src/images/simulator/TX16S/left_rtn.png old mode 100755 new mode 100644 index cee2e20615267d178cee88b765ecc7bcc7d81c53..4fa7d04ff7f85b317b4285681ced474937dc5f3d GIT binary patch delta 27060 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 G@BaYgrtww) delta 27152 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%0AJeAxKX4>yJ$s<}i-L|iaQ#I!>O1y|W9vEvhd^vq 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 delta 27056 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 D$;&Z8 diff --git a/companion/src/images/simulator/TX16S/left_tele.png b/companion/src/images/simulator/TX16S/left_tele.png old mode 100755 new mode 100644 index 69b43a52d2ee14fbd9669b6b70d34f7a5e5080a8..a51f18bd1487277fa2e3b2b77ef32354b4d1c0f6 GIT binary patch delta 28731 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 diff --git a/companion/src/images/simulator/TX16S/right.png b/companion/src/images/simulator/TX16S/right.png old mode 100755 new mode 100644 diff --git a/companion/src/images/simulator/TX16S/right_ent.png b/companion/src/images/simulator/TX16S/right_ent.png old mode 100755 new mode 100644 diff --git a/companion/src/images/simulator/TX16S/right_mdl.png b/companion/src/images/simulator/TX16S/right_mdl.png old mode 100755 new mode 100644 diff --git a/companion/src/images/simulator/TX16S/top.png b/companion/src/images/simulator/TX16S/top.png old mode 100755 new mode 100644 From c14b5079d308644a4bf4e9ef5be60ab36d3590d9 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 6 May 2020 19:24:48 +0200 Subject: [PATCH 331/560] Add x7 access simu to mac companion --- tools/build-companion-nightly.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/build-companion-nightly.sh b/tools/build-companion-nightly.sh index 06f605c0d..98d6653e6 100755 --- a/tools/build-companion-nightly.sh +++ b/tools/build-companion-nightly.sh @@ -62,6 +62,10 @@ cmake ${COMMON_OPTIONS} -DPCB=X7 ${SRCDIR} make -j${JOBS} libsimulator rm CMakeCache.txt +cmake ${COMMON_OPTIONS} -DPCB=X7 -DPCBREV=ACCESS ${SRCDIR} +make -j${JOBS} libsimulator +rm CMakeCache.txt + cmake ${COMMON_OPTIONS} -DPCB=X7 -DPCBREV=T12 ${SRCDIR} make -j${JOBS} libsimulator rm CMakeCache.txt From 3fc5bc6d77ceb7313f51210f2a8827434ec324c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Charpentier?= Date: Thu, 7 May 2020 15:47:20 +0200 Subject: [PATCH 332/560] Updated French Translation (#7587) --- companion/src/translations/companion_fr.ts | 581 +++++++++++---------- 1 file changed, 300 insertions(+), 281 deletions(-) diff --git a/companion/src/translations/companion_fr.ts b/companion/src/translations/companion_fr.ts index c88f190f0..c8d06c20f 100644 --- a/companion/src/translations/companion_fr.ts +++ b/companion/src/translations/companion_fr.ts @@ -342,55 +342,60 @@ Manche Droit: Profondeur, Direction - - - - + + + + Select Folder Sélectionner dossier - + + Show splash screen + Afficher l'écran de démarrage + + + Select Executable Sélectionner exécutable - + Release channel Canal de version - + Releases (stable) Officiel (stable) - + Release candidates (testing) Candidate (test) - + Nightly builds (unstable) Nighlty (instable) - + Simulator Volume Gain Gain de volume du simulateur - + Simulator controls Commandes du simulateur - + Save switch/pot positions on simulator exit Enregistrer les positions des inters/pots à la sortie du simulateur - + Clear saved positions Effacer les positions enregistrées @@ -440,265 +445,265 @@ Manche Droit: Profondeur, Direction Paramètres de l'application - - Show splash screen when Companion starts - Afficher l'écran d'accueil au lancement de Companion - - - + Automatic check for Companion updates Vérifier la présence de mises à jour de Companion automatiquement - + Enable automatic backup before writing firmware Sauvegarder les paramètres et modèles automatiquement lors des transferts - + Automatic check for OpenTX firmware updates Vérifier la présence de mises à jour de firmware automatiquement - + Splash Screen Library Bibliothèque d'écrans d'accueil - + Google Earth Executable Exécutable Google Earth - + Only show user splash images Ne montrer que les images de l'utilisateur - + Show user and companion splash images Montrer les images de Companion et de l'utilisateur - + User Splash Screens Ecrans d'accueil personnalisés - + Automatic Backup Folder Dossier de sauvegardes automatiques - + Simulator Settings Paramètres du simulateur - + Simulator BackLight Rétroéclairage du simulateur - + Enable Actif - + Action on New Model Action par défaut "Ajout Modèle" - + Use model wizard Assistant - + Open model editor Éditer modèle - + Just create the model Créer modèle - + <html><head/><body><p>This option maintains the behaviour from older OpenTx versions where empty model slots are preserved when a model is deleted or moved. </p><p>When this option is de-selected, the other models may be re-arranged to fill the gap left by the removed model.</p></body></html> <html><head/><body><p><b><u>/!\</u> Uniquement pour les radios sans catégories <u>/!\</u></b></p><p>Cette option maintient le comportement des anciennes versions d’OpenTx où les emplacements des modèles vides sont conservés lorsqu'un modèle est supprimé ou déplacé.</p><p>Lorsque cette option est désélectionnée, les autres modèles peuvent être réarrangés pour combler l'écart laissé par le modèle supprimé.</p></body></html> - + most recently used files fichiers récemment utilisés - + Startup Settings Paramètres de démarrage - + Remember Mémoriser - + Output Logs Folder Dossier des logs sauvegardés - + Remove empty model slots when deleting models (only applies for radios w/out categories) Supprimer les emplacements vides lors de la suppression de modèles - + Debug Output Logging Log les messages de debug - + <html><head/><body><p>Keep a log of all debugging messages generated by the desktop Companion/Simulator applications. An OpenTX developer may request this to help diagnose an issue.</p></body></html> <html><head/><body><p>Garder un log de tous les messages de débogage générés par les applications Companion/Simulateur. Un développeur OpenTX peut demander ce log afin d'aider à diagnostiquer un problème.</p></body></html> - + Application (Companion/Simulator) Application (Companion/Simulateur) - + <html><head/><body><p>Keep a log of all messages generated by the radio firmware when running in Simulator. This is the same information one would also see in the Simulator <span style=" font-style:italic;">Debug Output</span> window.</p></body></html> <html><head/><body><p>Conserver un log de tous les messages générés par le firmware radio lors de l'exécution du Simulateur. C'est la même information visible depuis le Simulateur dans la <span style=" font-style:italic;">Fenêtre de débogage</span>.</p></body></html> - + Radio Firmware (in Simulator) Firmware radio (Simulateur) - + + Prompt for radio profile + Afficher le choix "profil radio" au démarrage + + + Blue Bleu - + Green Vert - + Red Rouge - + Orange Orange - + Yellow Jaune - + Screenshot capture folder Dossier des captures d'écran - + Joystick - + Calibrate Calibrer - + Only capture to clipboard Capturer dans le presse-papiers uniquement - + My Radio Ma radio - + <p><b>You cannot switch Radio Type or change Build Options while there are unsaved file changes. What do you wish to do?</b></p> <ul><li><i>Save All</i> - Save any open file(s) before saving Settings.<li><li><i>Reset</i> - Revert to the previous Radio Type and Build Options before saving Settings.</li><li><i>Cancel</i> - Return to the Settings editor dialog.</li></ul> <p><b>Vous ne pouvez pas changer de type de radio ou modifier les options de compilation tant que les changements ne sont pas sauvegardés. Que souhaitez-vous faire?</b></p> <ul><li><i>Sauvegarder tout</i> - Enregistrez le(s) fichier(s) ouvert(s) avant d'enregistrer les paramètres.<li><li><i>Réinitialiser</i> - Revenir aux précédentes options de type et de compilation de la radio avant d'enregistrer les paramètres</li><li><i>Annuler</i> - Retournez dans la boîte de dialogue de l'éditeur de paramètres.</li></ul> - + Select your snapshot folder Sélectionner le dossier où stocker les captures d'écran - + Note: Nightly builds are not available in this version, Release/RC update channel will be used. Remarque: la version " nightly" n'est pas disponible dans cette version. Le canal de mise à jour "officiel" sera utilisé. - - + + No joysticks found Aucun Joystick trouvé - + EMPTY: No radio settings stored in profile VIDE: Aucune donnée stockée dans le profil - + AVAILABLE: Radio settings of unknown age DISPONIBLE: Paramètres enregistrés à une date inconnue - + AVAILABLE: Radio settings stored %1 DISPONIBLE: Paramètres enregistrés le %1 - + Select your library folder Sélectionner le dossier de bibliothèque - - + + Select your Models and Settings backup folder Sélectionner le dossier dans lequel une sauvegarde des paramètres et modèles sera placée automatiquement lors de chaque opération - + Select a folder for application logs Sélectionner un dossier pour le log des applications - + Select Google Earth executable Sélectionner l'emplacement de l'exécutable Google Earth - + Select the folder replicating your SD structure Sélectionner un dossier contenant une copie des dossiers de la carte SD - + Open Image to load Ouvrir l'image à charger - + Images (%1) Images (%1) @@ -2135,7 +2140,7 @@ Si vous avez un fichier de sauvegarde des paramètres, vous pouvez l'import OpenTX ne supporte pas cette fonction sur cette carte - + OpenTX doesn't accept this radio protocol OpenTX ne supporte pas ce protocole radio @@ -3034,9 +3039,15 @@ Blanc signifie "inclure tous".Les métacaractères ?, * et [...] sont + Support for bluetooth module Prise en charge du module Bluetooth + + + Radiomaster TX16s / TX16s Hall / TX16s Masterfire + + Turnigy 9XR-PRO @@ -4073,7 +4084,7 @@ Communs à tous les modèles d'une même EEPROM. GeneralSettings - + Radio Settings Paramètres de la radio @@ -6083,79 +6094,79 @@ Les colonnes contenant l'altitude "GAlt" et la vitesse "GSpd MainWindow - - + + Edit Édition - + File Fichier - + New release available Nouvelle version disponible - + Error opening file %1: %2. Erreur à l'ouverture du fichier %1: %2. - + Compilation server too busy, try later Serveur de compilation surchargé, veuillez réessayer plus tard - + Unknown server failure, try later Erreur inconnue du serveur de compilation, veuillez réessayer plus tard - + Do you want to write the firmware to the radio now ? Voulez vous transférer le firmware à la radio maintenant ? - - + + Yes Oui - - + + No Non - - + + Release Notes Notes de version - + Compare models Comparer les modèles - + Show fuses dialog Afficher les paramètres des fusibles - + A monochrome black icon theme Thème avec icônes monochromes noires - + A new version of %1 firmware is available: - current is %2 - newer is %3 @@ -6172,511 +6183,511 @@ Voulez vous la télécharger maintenant ? Nous recommandons de lire attentivement les notes de version à l'aide du bouton ci-dessous, celles-ci peuvent contenir des infos importantes concernant les changements effectués depuis la version précédente. - - + + Synchronize SD Synchroniser la carte SD - + New Nouveau - + Open... Ouvrir... - + A monochrome white icon theme Thème avec icônes monochromes blanches - + A monochrome blue icon theme Thème avec icônes monochromes bleues - + Small Petites - + Use small toolbar icons Petites icônes de barre d'outils - + Use normal size toolbar icons Icônes de barre d'outils normales - + Normal Normales - + Use big toolbar icons Grosses icônes de barre d'outils - + Big Grandes - + Use huge toolbar icons Immenses icônes de barre d'outils - + Huge Immenses - + List programmers... Lister les programmateurs... - + Fuses... Fusibles... - - + + Read Firmware from Radio Lire le firmware de la radio - + Read firmware from Radio Lire le firmware de la radio - + Write Firmware to Radio Transférer le firmware à la radio - + Write firmware to Radio Transférer le firmware à la radio - + Add Radio Profile Ajouter un profil de radio - + Manuals and other Documents Manuels et documents - + Open the OpenTX document page in a web browser Ouvre la page de documentation d'OpenTX dans un navigateur - + Write Models and Settings To Radio Transférer les paramètres et modèles vers la radio - + Write Models and Settings to Radio Transférer les paramètres et modèles vers la radio - - + + Read Models and Settings from Radio Lire les paramètres et modèles depuis la radio - + OpenTX Companion %1 - Radio: %2 - Profile: %3 OpenTX Companion %1 - Radio: %2 - Profil: %3 - + List of recently used files Liste des fichiers récemment utilisés - + Radio Profiles Profil radio - + Create or Select Radio Profiles Créer ou Sélectionner un profil radio - + Configure Communications... Configurer les communications... - + Configure software for communicating with the Radio Configurer le programme gérant les communications avec la radio - + Write Backup to Radio Transférer une sauvegarde à la radio - + Write Backup from file to Radio Transférer une sauvegarde à la radio - + Backup Radio to File Sauvegarder la radio - + Save a complete backup file of all settings and model data in the Radio Créer une copie de sauvegarde de tous les paramètres et modèles de la radio - + Contributors... Contributeurs... - + A tribute to those who have contributed to OpenTX and Companion Remerciements à tout ceux qui ont contribué à OpenTX et Companion - + SD card synchronization Synchronisation de la carte SD - + Recent Files Fichiers récents - + Set Icon Theme Choisir le thème d'icônes - + Set Icon Size Choisir la taille des icônes - + Write Ecrire - + A new version of Companion is available (version %1)<br>Would you like to download it? Une nouvelle version de Companion est disponible (version %1)<br>Voulez-vous la télécharger ? - + OpenTX Home Page: <a href='%1'>%1</a> Page d'accueil d'OpenTX: <a href='%1'>%1</a> - + If you've found this program useful, please support by <a href='%1'>donating</a> Si vous trouvez ce programme utile, merci de le supporter par une <a href='%1'>donation</a> - + Ready Prêt - + Show the application's About box Afficher la fenêtre "A propos" de l'application - - + + File loaded Fichier chargé - - + + Open Models and Settings file Ouvrir un fichier de paramètres et modèles - + File saved Fichier sauvegardé - + Read Models and Settings From Radio Lire les paramètres et modèles depuis la radio - + Not enough flash available on this board for all the selected options Pas assez de place disponible pour les options sélectionnées - + Compilation server temporary failure, try later Erreur de compilation sur le serveur, veuillez réessayer plus tard - + Compilation error Erreur de compilation - + Invalid firmware Firmware invalide - + Invalid board Carte non valide - + Invalid language Language non valide - + Some text will not be translated until the next time you start Companion. Please note that some translations may not be complete. Certains textes ne seront pas traduits avant le prochain redémarrage de Companion. Veuillez noter que certaines traductions peuvent ne pas être complètes. - + Models and Settings read Lecture des modèles et paramètres - + Companion update check failed, new version information not found. La vérification de mise à jour de Companion a échoué, les infos sur une nouvelle version sont introuvables. - + Firmware update check failed, new version information not found or invalid. La vérification de mise à jour du Firmware a échoué, les infos sur une nouvelle version sont introuvables ou invalides. - + Local Folder Dossier "Local" - + Radio Folder Dossier "Radio" - - + + This function is not yet implemented Cette fonction n'est pas implémentée pour l'instant - + Save Radio Backup to File Sauvegarder la radio - + Read Radio Firmware to File Sauvegarder le firmware de la radio - + The OpenTX Companion project was originally forked from <a href='%1'>eePe</a> Le projet OpenTX Companion a été créé à partir d'<a href='%1'>eePe</a> - + Copyright OpenTX Team - + Create a new Models and Settings file Créer un nouveau fichier de paramètres et modèles - - + + Save Models and Settings file Enregistrer le fichier de paramètres et modèles - + Save Enregistrer - + Save As... Enregistrer sous... - + Close Fermer - + Close Models and Settings file Fermer le fichier de paramètres et modèles - + Exit the application Quitter l'application - + Exit Quitter - + Create a new Radio Settings Profile Créer un nouveau profil de paramètres et modèles - + Copy Current Radio Profile Copier le profil radio actuel - + Duplicate current Radio Settings Profile Dupliquer les paramètres radio du profil actuel - + Delete the current Radio Settings Profile Supprimer les paramètres radio du profil actuel - + Use default system language. Utiliser le langage système par défaut. - + Use %1 language (some translations may not be complete). Utiliser la langue %1 (certaines traductions peuvent être incomplètes). - + Classical Classique - + Diskimage (*.dmg) Image disque (*.dmg) - + Would you like to open the disk image to install the new version? Voulez-vous ouvrir l'image disque afin d'installer la nouvelle version ? - + Executable (*.exe) Exécutable (*.exe) - - + + Would you like to launch the installer? Voulez-vous lancer l'installateur ? - + No Companion release candidates are currently being served for this version, please switch release channel Aucune version "candidate" de Companion n'est actuellement disponible sur ce serveur, veuillez commuter sur le canal "officiel" - + No nightly Companion builds are currently being served for this version, please switch release channel Aucune version "nightly" de Companion n'est actuellement disponible sur ce serveur, veuillez commuter sur le canal "officiel" - + No Companion release builds are currently being served for this version, please switch release channel Aucune version "officielle" de Companion n'est actuellement disponible sur ce serveur, veuillez commuter sur le canal "candidate" ou "nightly" - + A new release of Companion is available, please check the <a href='%1'>OpenTX website!</a> Une nouvelle version de Companion est disponible, vérifiez le site OpenTX <a href='%1'> !</a> - + No firmware release candidates are currently being served for this version, please switch release channel Aucun firmware "candidate" n'est actuellement disponible sur ce serveur, veuillez commuter sur le canal "officiel" - + No firmware nightly builds are currently being served for this version, please switch release channel Aucun firmware "nightly" n'est actuellement disponible sur ce serveur, veuillez commuter sur le canal "officiel" - + No firmware release builds are currently being served for this version, please switch release channel Aucun firmware "officiel" n'est actuellement disponible sur ce serveur, veuillez commuter sur le canal "candidate" ou "nightly" - + Release candidate builds are now available for this version, would you like to switch to using them? Une version "candidate" est maintenant disponible pour cette version, voulez-vous commuter de canal afin de l'utiliser? - + Channel changed to RC, please restart the download process Canal commuté sur "candidate", veuillez redémarrer le processus de téléchargement - + Official release builds are now available for this version, would you like to switch to using them? Une version "officielle" est maintenant disponible pour cette version, voulez-vous commuter de canal afin de l'utiliser? - + Channel changed to Release, please restart the download process Canal commuté sur "officiel", veuillez redémarrer le processus de téléchargement - + This radio (%1) is not currently available in this firmware release channel Le firmware pour cette radio (%1) n'est actuellement pas disponible dans le canal "officiel" - + Firmware %1 does not seem to have ever been downloaded. Version %2 is available. Do you want to download it now? @@ -6689,18 +6700,18 @@ Voulez-vous le télécharger maintenant? Nous vous recommandons de consulter les notes de mise à jour à l'aide du bouton ci-dessous pour en savoir plus sur les modifications susceptibles de vous intéresser. - - + + Do you want to download version %1 now ? Voulez-vous télécharger la version %1 maintenant? - + Ignore this version %1? Ignorer cette version %1? - + There are unsaved file changes which you may lose when switching radio types. Do you wish to continue? @@ -6709,355 +6720,355 @@ Do you wish to continue? Êtes-vous sûr de vouloir continuer ? - + No local SD structure path configured! Aucun chemin de configuré pour la structure SD en local ! - + No Radio or SD card detected! Pas de Radio ou carte SD de détectée ! - + Release notes... Notes de version... - + Show release notes Afficher les notes de version - + Delete Current Radio Profile... Supprimer le profil radio actuel... - + Export Application Settings.. Exporter Préférences Application... - + Save all the current %1 and Simulator settings (including radio profiles) to a file. Enregistrez tous les paramètres actuels %1 et du simulateur (y compris les profils radio) dans un fichier. - + Import Application Settings.. Importer les paramètres de l'application... - + Load %1 and Simulator settings from a prevously exported settings file. Charger les paramètres %1 et les paramètres de Simulation depuis un fichier précédemment exporté. - + Tabbed Windows Fenêtres à onglets - + Use tabs to arrange open windows. Utilisez les onglets pour organiser les fenêtres ouvertes. - + Tile Windows Titre de la fenêtre - + Arrange open windows across all the available space. Disposez les fenêtres ouvertes sur tout l'espace disponible. - + Cascade Windows Fenêtres en cascade - + Arrange all open windows in a stack. Organisez toutes les fenêtres ouvertes dans une pile. - + Close All Windows Fermer toutes les fenêtres - + Closes all open files (prompts to save if necessary. Fermer tous les fichiers ouverts (proposer de sauvegarder si nécessaire). - + Window Fenêtre - + Ctrl+Shift+S - + Ctrl+Alt+L - + Ctrl+Alt+D - + Ctrl+Alt+R - + The classic companion9x icon theme Thème d'icônes classique de Companion - + Yerico - + Yellow round honey sweet icon theme Thème d'icônes rondes jaunes - + Monochrome - + MonoWhite Monochrome Blanc - + Alt+%1 - + - Copy - Copier - + Companion :: Open files warning Companion::Ouvrir les fichiers d'avertissement - + Please save or close modified file(s) before deleting the active profile. Veuillez sauvegarder ou fermer le(s) fichier(s) modifié(s) avant de supprimer le profil actif. - + Not possible to remove profile Impossible de supprimer le profil - + The default profile can not be removed. Le profil par défaut ne peut pas être supprimé. - + Confirm Delete Profile Confirmer la suppression du profil - + Are you sure you wish to delete the "%1" radio profile? There is no way to undo this action! Etes-vous sûr de vouloir supprimer le profil radio %1? Cette action est irréversible! - + Please save or close all modified files before importing settings Veuillez sauvegarder ou fermer tous les fichiers modifiés avant d'importer les paramètres - + <html><p>%1 and Simulator settings can be imported (restored) from a previosly saved export (backup) file. This will replace current settings with any settings found in the file.</p><p>An automatic backup of the current settings will be attempted. But if the current settings are useful then it is recommended that you make a manual backup first.</p><p>For best results when importing settings, <b>close any other %1 windows you may have open, and make sure the standalone Simulator application is not running.</p><p>Do you wish to continue?</p></html> <html><p>%1 et les paramètres du simulateur peuvent être importés (restaurés) à partir d’un fichier d’exportation (sauvegarde) préalablement sauvegardé. Ceci remplacera les paramètres actuels par tous les paramètres trouvés dans le fichier.</p><p>Une sauvegarde automatique des paramètres actuels sera tentée. Mais si les paramètres actuels sont utiles, il est recommandé de commencer par une sauvegarde manuelle.</p><p>Pour obtenir de meilleurs résultats lors de l'importation des paramètres,<b> fermez les autres fenêtres %1 que vous avez éventuellement ouvertes et assurez-vous que l'application autonome Simulator n'est pas en cours d'exécution. </p><p>Souhaitez-vous continuer? </p></html> - + Confirm Settings Import Confirmer les paramètres d'importation - + Select %1: Sélectionnez %1: - + backup sauvegarde - + Press the 'Ignore' button to continue anyway. Appuyez sur le bouton 'Ignorer' pour continuer quand même. - + The settings could not be imported. Les paramètres n'ont pas pu être importés. - + <html><p>New settings have been imported from:<br> %1.</p><p>%2 will now re-initialize.</p><p>Note that you may need to close and restart %2 before some settings like language and icon theme take effect.</p> <html><p>Les nouveaux paramètres ont été importés depuis:<br> %1. </p><p>%2 sera maintenant réinitialisé.</p><p>Notez que vous devrez peut-être fermer et redémarrer %2 avant que certains paramètres tels que la langue et le thème d’icône prennent effet.</p> - + <p>The previous settings were backed up to:<br> %1</p> <p>Les paramètres précédents ont été sauvegardés sous:<br> %1 </p> - + MonoBlue Monochrome Bleu - + System language Langue du système - + About... A propos... - + View Log File... Ouvrir un Log... - + Open and view log file Ouvrir et visualiser un log - + Settings... Préférences... - + Edit Settings Éditer les préférences - + Download... Télécharger... - + Download firmware and voice files Télécharger firmware et fichiers son - + Check for Updates... Vérifier les mises à jour... - + Check OpenTX and Companion updates Vérifier les mises à jour d'OpenTX et Companion - + Compare Models... Comparer 2 modèles... - + Edit Radio Splash Image... Éditer l'écran d'accueil de la radio... - + Edit the splash image of your Radio Éditer l'écran d'accueil de la radio - + List available programmers Lister les programmateurs supportés - - + + Save As Enregistrer Sous - - + + No updates available at this time. Aucune mise à jour disponible. - - + + Help Aide - + Checking for updates Recherche de mises à jour - + The new theme will be loaded the next time you start Companion. Le nouveau thème sera utilisé lors du prochain lancement de Companion. - + About Companion A propos de Companion - + Set Menu Language Choisir la langue des menus - + Settings Paramètres - + Read/Write Transfert - + %2 - + New Radio Nouvelle radio @@ -9614,11 +9625,6 @@ Mixage actif par défaut si non-renseigné. DEFAULT DÉFAUT - - - Custom - proto %1) - Personnaliser - proto %1) - MultirotorPage @@ -9766,6 +9772,19 @@ Mixage actif par défaut si non-renseigné. Fichiers ODF (*.odt);; Fichiers PDF (*.pdf);;Fichiers HTML (*.htm *.html);;Tous les fichiers (*) + + ProfileChooserDialog + + + Select Profile + Choisir Profil + + + + Profile + Profil + + ProgressDialog From 6bd989620ad6e91667e44c6376c86677507a4614 Mon Sep 17 00:00:00 2001 From: Marco Robustini Date: Fri, 8 May 2020 01:17:14 -0700 Subject: [PATCH 333/560] Update it.h.txt (#7589) Some alignments of the Italian language. --- radio/src/translations/it.h.txt | 36 ++++++++++++++++----------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 750f77a7c..72223e759 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -938,8 +938,8 @@ #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Interruttori")) #define TR_ANALOGS_BTN BUTTON(TR("Analogico","Analogici")) -#define TR_TOUCH_NOTFOUND "Touch hardware not found" -#define TR_TOUCH_EXIT "Touch screen to exit" +#define TR_TOUCH_NOTFOUND "Schermo touch non trovato" +#define TR_TOUCH_EXIT "Tocca lo schermo per uscire" #define TR_CALIBRATION TR("Calibraz.", "Calibrazione") #define TR_SET "[Set]" #define TR_TRAINER TR("Trainer", "Maestro/Allievo") @@ -1012,8 +1012,8 @@ #define TR_SPORT_UPDATE_POWER_MODE "SP Power" #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " -#define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens" -#define TR_TOUCH_PANEL "Touch panel:" +#define TR_NO_TELEMETRY_SCREENS "Nessuno Schermo Telemetria" +#define TR_TOUCH_PANEL "Schermo touch:" // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Nome" @@ -1058,21 +1058,21 @@ #define TR_LSW_DESCRIPTIONS { "Tipo o funzione di confronto", "Prima variabile", "Seconda variabile o costante", "Seconda variabile o costante", "Condizione aggiuntiva da abilitare linea", "Durata minima ON dell'interruttore logico", "Durata minima TRUE affinché l'interruttore si accenda" } // Horus layouts and widgets -#define TR_FIRST_CHANNEL "First channel" -#define TR_FILL_BACKGROUND "Fill background?" -#define TR_BG_COLOR "BG Color" +#define TR_FIRST_CHANNEL "Primo canale" +#define TR_FILL_BACKGROUND "Riempi lo sfondo?" +#define TR_BG_COLOR "Colore sfondo" #define TR_SLIDERS_TRIMS "Sliders+Trims" #define TR_SLIDERS "Sliders" -#define TR_FLIGHT_MODE "Flight mode" -#define TR_INVALID_FILE "Invalid File" -#define TR_TIMER_SOURCE "Timer source" -#define TR_SIZE "Size" -#define TR_SHADOW "Shadow" -#define TR_TEXT "Text" -#define TR_COLOR "Color" -#define TR_MAIN_VIEW_X "Main view X" -#define TR_PANEL1_BACKGROUND "Panel1 background" -#define TR_PANEL2_BACKGROUND "Panel2 background" +#define TR_FLIGHT_MODE "Modo di volo" +#define TR_INVALID_FILE "File invalido" +#define TR_TIMER_SOURCE "Sorgente timer" +#define TR_SIZE "Dimensione" +#define TR_SHADOW "Ombra" +#define TR_TEXT "Testo" +#define TR_COLOR "Colore" +#define TR_MAIN_VIEW_X "Vista principale X" +#define TR_PANEL1_BACKGROUND "Sfondo Panello 1" +#define TR_PANEL2_BACKGROUND "Sfondo Panello 2" // About screen #define TR_ABOUTUS TR(" INFO ", "INFO SU") @@ -1357,4 +1357,4 @@ #define ZSTR_CL15 "Cl15" #define ZSTR_CL16 "Cl16" #define ZSTR_CL17 "Cl17" -#define ZSTR_CL18 "Cl18" \ No newline at end of file +#define ZSTR_CL18 "Cl18" From 0e84377bf70e8e9d8533b2a00d4c1f9f462bb53d Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 8 May 2020 15:44:29 +0200 Subject: [PATCH 334/560] Update some multi strings --- companion/src/firmwares/moduledata.h | 5 ++++- radio/src/gui/gui_common.cpp | 2 ++ radio/src/pulses/modules_constants.h | 3 ++- radio/src/translations/untranslated.h | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/companion/src/firmwares/moduledata.h b/companion/src/firmwares/moduledata.h index 83744908a..ee969fd0d 100644 --- a/companion/src/firmwares/moduledata.h +++ b/companion/src/firmwares/moduledata.h @@ -126,7 +126,10 @@ enum MultiModuleRFProtocols { MODULE_SUBTYPE_MULTI_XN297DUMP, MODULE_SUBTYPE_MULTI_FRSKYX2, MODULE_SUBTYPE_MULTI_FRSKY_R9, - MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_FRSKY_R9 + MODULE_SUBTYPE_MULTI_PROPEL, + MODULE_SUBTYPE_MULTI_FRSKYL, + MODULE_SUBTYPE_MULTI_SKYARTEC, + MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_SKYARTEC }; enum TrainerProtocol { diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index 1ae1a45cc..69e954b03 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -888,6 +888,7 @@ const char STR_SUBTYPE_FLYZONE[] = "\005""FZ410"; const char STR_SUBTYPE_FX816[] = "\003""P38"; const char STR_SUBTYPE_ESKY150[] = "\003""4CH""7CH"; const char STR_SUBTYPE_FRSKYL[] = "\010""LR12\0 ""LR12 6ch"; +const char STR_SUBTYPE_FRSKYR9[] = "\x07""915MHz\0""868MHz\0""915 8ch""868 8ch"; const char* mm_options_strings::options[] = { nullptr, @@ -947,6 +948,7 @@ const mm_protocol_definition multi_protocols[] = { {MODULE_SUBTYPE_MULTI_FX816, 0, false, false, STR_SUBTYPE_FX816, nullptr}, {MODULE_SUBTYPE_MULTI_HOTT, 0, true, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_FRSKYX2, 4, true, false, STR_SUBTYPE_FRSKYX2, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_FRSKY_R9, 4, true, false, STR_SUBTYPE_FRSKYR9, nullptr}, {MODULE_SUBTYPE_MULTI_PROPEL, 0, false, false, NO_SUBTYPE, nullptr}, {MODULE_SUBTYPE_MULTI_FRSKYL, 1, false, false, STR_SUBTYPE_FRSKYL, STR_MULTI_RFTUNE}, {MM_RF_CUSTOM_SELECTED, 7, true, true, NO_SUBTYPE, STR_MULTI_OPTION}, diff --git a/radio/src/pulses/modules_constants.h b/radio/src/pulses/modules_constants.h index a519d0269..82e53421d 100644 --- a/radio/src/pulses/modules_constants.h +++ b/radio/src/pulses/modules_constants.h @@ -166,7 +166,8 @@ enum ModuleSubtypeMulti { MODULE_SUBTYPE_MULTI_FRSKY_R9, MODULE_SUBTYPE_MULTI_PROPEL, MODULE_SUBTYPE_MULTI_FRSKYL, - MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_FRSKY_R9 + MODULE_SUBTYPE_MULTI_SKYARTEC, + MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_SKYARTEC }; #define MODULE_SUBTYPE_MULTI_XN297DP 63-3 diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h index cbef5238b..b558eaa72 100644 --- a/radio/src/translations/untranslated.h +++ b/radio/src/translations/untranslated.h @@ -125,4 +125,4 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\007" -#define TR_MULTI_PROTOCOLS "FlySky\0""Hubsan\0""FrSky\0 ""Hisky\0 ""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0 ""KN\0 ""SymaX\0 ""SLT\0 ""CX10\0 ""CG023\0 ""Bayang\0""ESky\0 ""MT99XX\0""MJXq\0 ""Shenqi\0""FY326\0 ""SFHSS\0 ""J6 Pro\0""FQ777\0 ""Assan\0 ""Hontai\0""OpenLrs""FSky 2A""Q2x2\0 ""Walkera""Q303\0 ""GW008\0 ""DM002\0 ""Cabell\0""Esky150""H8 3D\0 ""Corona\0""CFlie\0 ""Hitec\0 ""WFly\0 ""Bugs\0 ""BugMini""Traxxas""NCC1701""E01X\0 ""V911S\0 ""GD00X\0 ""V761\0 ""KF606\0 ""Redpine""Potensi""ZSX\0 ""FlyZone""Scanner""FrSkyRX""FS2A_RX""HoTT\0 ""FX816\0 ""BayangR""Pelikan""Tiger\0 ""WK\0 ""XN297DU""FrSkyX2""FrSkyR9" +#define TR_MULTI_PROTOCOLS "FlySky\0""Hubsan\0""FrSky\0 ""Hisky\0 ""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0 ""KN\0 ""SymaX\0 ""SLT\0 ""CX10\0 ""CG023\0 ""Bayang\0""ESky\0 ""MT99XX\0""MJXq\0 ""Shenqi\0""FY326\0 ""SFHSS\0 ""J6 Pro\0""FQ777\0 ""Assan\0 ""Hontai\0""OpenLrs""FSky 2A""Q2x2\0 ""Walkera""Q303\0 ""GW008\0 ""DM002\0 ""Cabell\0""Esky150""H8 3D\0 ""Corona\0""CFlie\0 ""Hitec\0 ""WFly\0 ""Bugs\0 ""BugMini""Traxxas""NCC1701""E01X\0 ""V911S\0 ""GD00X\0 ""V761\0 ""KF606\0 ""Redpine""Potensi""ZSX\0 ""FlyZone""Scanner""FrSkyRX""FS2A_RX""HoTT\0 ""FX816\0 ""BayangR""Pelikan""Tiger\0 ""XK\0 ""XN297DU""FrSkyX2""FrSkyR9""Propel\0""FrSkyL\0""Skyartec" From 4b2f0ab9e84c9b951e66339811660120c3ccf3cb Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 9 May 2020 20:00:24 +0200 Subject: [PATCH 335/560] Update CREDITS.txt --- CREDITS.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index 69e242fac..7e85a8d98 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1730,3 +1730,6 @@ Tomas Sodergren Jörg Lemnitz TMac FPV Josef Schaeffler +Mike Frizell +MeCodeGoodSomeday + From 34281d8648de6549eaea19a7d86b2b3174705886 Mon Sep 17 00:00:00 2001 From: Augusto Zanellato Date: Sun, 10 May 2020 10:46:43 +0200 Subject: [PATCH 336/560] Fixed typo in Italian translation of companion (#7592) --- companion/src/translations/companion_it.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/companion/src/translations/companion_it.ts b/companion/src/translations/companion_it.ts index 21b3e87db..3572d1d4c 100644 --- a/companion/src/translations/companion_it.ts +++ b/companion/src/translations/companion_it.ts @@ -6797,7 +6797,7 @@ We recommend you view the release notes using the button below to learn about an Set Menu Language - Inposta Menu Lingua + Menù Impostazione Lingua From c17b0469c42804f83131eafa7981c316690bcae6 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 11 May 2020 08:35:48 +0200 Subject: [PATCH 337/560] Update CREDITS.txt --- CREDITS.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CREDITS.txt b/CREDITS.txt index 7e85a8d98..f70842e4f 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1732,4 +1732,4 @@ TMac FPV Josef Schaeffler Mike Frizell MeCodeGoodSomeday - +Timothy Fry From a4d6002178944cfe9e20535ecf80e0c4339f4694 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 11 May 2020 10:31:33 +0200 Subject: [PATCH 338/560] Save also on simple multi type change --- radio/src/gui/480x272/model_setup.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index 83c23161b..8108577d2 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -1137,6 +1137,7 @@ bool menuModelSetup(event_t event) g_model.moduleData[moduleIdx].setMultiProtocol(multiRfProto); g_model.moduleData[moduleIdx].subType = 0; resetMultiProtocolsOptions(moduleIdx); + storageDirty(EE_MODEL); } } #endif From f44305beb1ba7d6730d2fc9e05a4ae521b0b79b8 Mon Sep 17 00:00:00 2001 From: Kilrah Date: Wed, 13 May 2020 11:52:54 +0200 Subject: [PATCH 339/560] No BT on TX16S for now --- companion/src/firmwares/opentx/opentxinterface.cpp | 2 +- radio/util/fwoptions.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 13d75e2c0..44346310d 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -1348,7 +1348,7 @@ void registerOpenTxFirmwares() /* Radiomaster TX16S board */ firmware = new OpenTxFirmware("opentx-tx16s", Firmware::tr("Radiomaster TX16s / TX16s Hall / TX16s Masterfire"), BOARD_RADIOMASTER_TX16S); addOpenTxFrskyOptions(firmware); - firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module")); + // firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module")); addOpenTxRfOptions(firmware, FLEX); registerOpenTxFirmware(firmware); diff --git a/radio/util/fwoptions.py b/radio/util/fwoptions.py index 811ff17b7..7e5604fd9 100755 --- a/radio/util/fwoptions.py +++ b/radio/util/fwoptions.py @@ -233,5 +233,5 @@ options_radiomaster_tx16s = { "faichoice": ("FAI", "CHOICE", None), "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), - "bluetooth": ("BLUETOOTH", "YES", "NO"), + # "bluetooth": ("BLUETOOTH", "YES", "NO"), } \ No newline at end of file From 2e95562668966804dc233861db9d3fb3c4cbf6b1 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 14 May 2020 09:59:07 +0200 Subject: [PATCH 340/560] Black tx16s --- radio/sdcard/horus/THEMES/Darkblue/tx16s.bmp | Bin 164938 -> 164938 bytes radio/sdcard/horus/THEMES/Default/tx16s.bmp | Bin 124056 -> 164938 bytes 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 radio/sdcard/horus/THEMES/Darkblue/tx16s.bmp diff --git a/radio/sdcard/horus/THEMES/Darkblue/tx16s.bmp b/radio/sdcard/horus/THEMES/Darkblue/tx16s.bmp old mode 100755 new mode 100644 index 826fc35f000e449e374a24b2da04667d9f050c34..bb44eda4148d3957279826f501f8cb15548e386b GIT binary patch literal 164938 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 )^+{jLI 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�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 Date: Thu, 14 May 2020 13:06:06 +0200 Subject: [PATCH 341/560] Multi RX needs bind button too --- radio/src/gui/gui_common.h | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 5b8c61a97..b1b71eba0 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -141,10 +141,7 @@ void runFatalErrorScreen(const char * message); inline uint8_t MODULE_BIND_ROWS(int moduleIdx) { - if (IS_RX_MULTI(moduleIdx)) - return 0; - - if (isModuleXJTD8(moduleIdx) || isModuleSBUS(moduleIdx)) + if (isModuleXJTD8(moduleIdx) || isModuleSBUS(moduleIdx) || IS_RX_MULTI(moduleIdx)) return 1; if (isModulePPM(moduleIdx) || isModulePXX1(moduleIdx) || isModulePXX2(moduleIdx) || isModuleDSM2(moduleIdx) || isModuleMultimodule(moduleIdx)) From 61acd26497a6d4784abb22160afdc0cb9fa5f117 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 15 May 2020 10:09:25 +0200 Subject: [PATCH 342/560] Missing protection (when no bitmap on SD) --- radio/src/gui/480x272/model_select.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/480x272/model_select.cpp b/radio/src/gui/480x272/model_select.cpp index 9cb0f3979..539191372 100644 --- a/radio/src/gui/480x272/model_select.cpp +++ b/radio/src/gui/480x272/model_select.cpp @@ -62,7 +62,7 @@ void drawModel(coord_t x, coord_t y, ModelCell * model, bool current, bool selec if (selected) { lcdDrawSolidRect(x, y, MODELCELL_WIDTH+2, MODELCELL_HEIGHT+2, 1, TITLE_BGCOLOR); drawShadow(x, y, MODELCELL_WIDTH+2, MODELCELL_HEIGHT+2); - if (selectMode == MODE_MOVE_MODEL) { + if (selectMode == MODE_MOVE_MODEL && modelselModelMoveBackground) { lcd->drawMask(x+MODELCELL_WIDTH+2-modelselModelMoveBackground->getWidth(), y, modelselModelMoveBackground, TITLE_BGCOLOR); lcd->drawMask(x+MODELCELL_WIDTH+2-modelselModelMoveBackground->getWidth()+12, y+5, modelselModelMoveIcon, TEXT_BGCOLOR); } From 1cad34eb73e1ce6eb896afb6149cfe2c5ae86b2f Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 15 May 2020 14:50:13 +0200 Subject: [PATCH 343/560] Add lua table lib to colorlcd (#7599) * Add lua table lib to colorlcd * Allow require on colorlcd --- radio/src/thirdparty/Lua/src/lauxlib.h | 1 + radio/src/thirdparty/Lua/src/linit.c | 7 ++++++- radio/src/thirdparty/Lua/src/ltablib.c | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/radio/src/thirdparty/Lua/src/lauxlib.h b/radio/src/thirdparty/Lua/src/lauxlib.h index aab96bd1c..9cd4c02d3 100644 --- a/radio/src/thirdparty/Lua/src/lauxlib.h +++ b/radio/src/thirdparty/Lua/src/lauxlib.h @@ -29,6 +29,7 @@ extern const luaL_Reg mathlib[]; extern const luaL_Reg bitlib[]; extern const luaL_Reg iolib[]; extern const luaL_Reg strlib[]; +extern const luaL_Reg tab_funcs[]; extern const luaL_Reg opentxLib[]; extern const luaL_Reg lcdLib[]; diff --git a/radio/src/thirdparty/Lua/src/linit.c b/radio/src/thirdparty/Lua/src/linit.c index 940790e3d..4706a3ab7 100644 --- a/radio/src/thirdparty/Lua/src/linit.c +++ b/radio/src/thirdparty/Lua/src/linit.c @@ -28,7 +28,9 @@ */ static const luaL_Reg loadedlibs[] = { // {"_G", luaopen_base}, - // {LUA_LOADLIBNAME, luaopen_package}, +#if defined(PCBHORUS) + {LUA_LOADLIBNAME, luaopen_package}, +#endif // {LUA_COLIBNAME, luaopen_coroutine}, // {LUA_TABLIBNAME, luaopen_table}, {LUA_IOLIBNAME, luaopen_io}, @@ -51,6 +53,9 @@ const luaR_table lua_rotable[] = {LUA_STRLIBNAME, strlib, NULL}, {LUA_MATHLIBNAME, mathlib, mathlib_vals}, {LUA_BITLIBNAME, bitlib, NULL}, +#if defined(PCBHORUS) + {LUA_TABLIBNAME, tab_funcs, NULL}, +#endif {NULL, NULL, NULL} }; diff --git a/radio/src/thirdparty/Lua/src/ltablib.c b/radio/src/thirdparty/Lua/src/ltablib.c index c61903b08..d545a5325 100644 --- a/radio/src/thirdparty/Lua/src/ltablib.c +++ b/radio/src/thirdparty/Lua/src/ltablib.c @@ -256,7 +256,7 @@ static int sort (lua_State *L) { /* }====================================================== */ -static const luaL_Reg tab_funcs[] = { +const luaL_Reg tab_funcs[] = { {"concat", tconcat}, #if defined(LUA_COMPAT_MAXN) {"maxn", maxn}, From f0d8d340fd38f5c6b38ef9f628531e1437ea84e2 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 15 May 2020 14:51:36 +0200 Subject: [PATCH 344/560] Add AUX2 (#7588) AUX2 added --- radio/src/datastructs.h | 3 +- radio/src/debug.h | 1 + radio/src/gui/480x272/radio_hardware.cpp | 23 ++- radio/src/lua/api_general.cpp | 7 + radio/src/opentx.cpp | 4 + radio/src/serial.cpp | 4 + .../conversions/conversions_218_219.cpp | 2 +- .../common/arm/stm32/aux_serial_driver.cpp | 176 ++++++++++++++++++ .../common/arm/stm32/bootloader/boot.cpp | 9 +- radio/src/targets/horus/CMakeLists.txt | 8 +- radio/src/targets/horus/board.cpp | 6 + radio/src/targets/horus/board.h | 21 ++- radio/src/targets/horus/hal.h | 4 + radio/src/targets/simu/simpgmspace.cpp | 20 ++ radio/src/targets/taranis/board.h | 4 +- radio/src/targets/taranis/hal.h | 5 + radio/src/telemetry/crossfire.cpp | 5 + radio/src/telemetry/frsky.cpp | 5 + radio/src/telemetry/multi.cpp | 6 + radio/src/translations.cpp | 1 + radio/src/translations.h | 1 + radio/src/translations/cz.h.txt | 1 + radio/src/translations/de.h.txt | 1 + radio/src/translations/en.h.txt | 3 +- radio/src/translations/es.h.txt | 1 + radio/src/translations/fi.h.txt | 3 +- radio/src/translations/fr.h.txt | 1 + radio/src/translations/it.h.txt | 3 +- radio/src/translations/nl.h.txt | 3 +- radio/src/translations/pl.h.txt | 3 +- radio/src/translations/pt.h.txt | 3 +- radio/src/translations/se.h.txt | 3 +- 32 files changed, 323 insertions(+), 17 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 413c5efcd..a0571ac61 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -666,7 +666,8 @@ PACK(struct TrainerData { #if defined(PCBHORUS) #define EXTRA_GENERAL_FIELDS \ - NOBACKUP(uint8_t auxSerialMode); \ + NOBACKUP(uint8_t auxSerialMode:4); \ + NOBACKUP(uint8_t aux2SerialMode:4); \ swconfig_t switchConfig; \ uint16_t potsConfig; /* two bits per pot */ \ uint8_t slidersConfig; /* 1 bit per slider */ \ diff --git a/radio/src/debug.h b/radio/src/debug.h index 2ed2f209b..e73c73f29 100644 --- a/radio/src/debug.h +++ b/radio/src/debug.h @@ -38,6 +38,7 @@ extern "C" { #endif uint8_t auxSerialTracesEnabled(); +uint8_t aux2SerialTracesEnabled(); #if defined(SIMU) typedef void (*traceCallbackFunc)(const char * text); diff --git a/radio/src/gui/480x272/radio_hardware.cpp b/radio/src/gui/480x272/radio_hardware.cpp index 37f81bed3..3ba908ad9 100644 --- a/radio/src/gui/480x272/radio_hardware.cpp +++ b/radio/src/gui/480x272/radio_hardware.cpp @@ -70,7 +70,9 @@ enum MenuRadioHardwareItems { #if defined(AUX_SERIAL) ITEM_RADIO_HARDWARE_AUX_SERIAL_MODE, #endif - +#if defined(AUX2_SERIAL) + ITEM_RADIO_HARDWARE_AUX2_SERIAL_MODE, +#endif ITEM_RADIO_HARDWARE_JITTER_FILTER, ITEM_RADIO_HARDWARE_RAS, @@ -89,6 +91,11 @@ enum MenuRadioHardwareItems { #else #define AUX_SERIAL_ROW #endif +#if defined(AUX2_SERIAL) +#define AUX2_SERIAL_ROW 0, +#else +#define AUX2_SERIAL_ROW +#endif #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 #define SWITCHES_ROWS NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1, NAVIGATION_LINE_BY_LINE|1 @@ -159,6 +166,7 @@ bool menuRadioHardware(event_t event) EXTERNAL_ANTENNA_ROW AUX_SERIAL_ROW /* aux serial mode */ + AUX2_SERIAL_ROW /* aux2 serial mode */ 0, /* ADC filter */ READONLY_ROW /* RAS */, SPORT_POWER_ROWS @@ -371,6 +379,19 @@ bool menuRadioHardware(event_t event) break; #endif +#if defined(AUX2_SERIAL) + case ITEM_RADIO_HARDWARE_AUX2_SERIAL_MODE: + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_AUX2_SERIAL_MODE); +#if defined(RADIO_TX16S) + lcdDrawText(lcdNextPos, y, " (TTL)"); +#endif + g_eeGeneral.aux2SerialMode = editChoice(HW_SETTINGS_COLUMN2, y, STR_AUX_SERIAL_MODES, g_eeGeneral.aux2SerialMode, 0, UART_MODE_MAX, attr, event); + if (attr && checkIncDec_Ret) { + aux2SerialInit(g_eeGeneral.aux2SerialMode, modelTelemetryProtocol()); + } + break; +#endif + case ITEM_RADIO_HARDWARE_JITTER_FILTER: { lcdDrawText(MENUS_MARGIN_LEFT, y, STR_JITTER_FILTER); diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 06b11449c..778af80c6 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -1601,6 +1601,13 @@ static int luaSerialWrite(lua_State * L) while(wr_len--) auxSerialPutc(*p++); } #endif +#if defined(AUX2_SERIAL) + if (aux2SerialMode == UART_MODE_LUA) { + size_t wr_len = len; + const char* p = str; + while(wr_len--) aux2SerialPutc(*p++); + } +#endif #else debugPrintf("luaSerialWrite: %.*s",len,str); #endif diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index eeb2d2ef2..9e5ced95e 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1939,6 +1939,10 @@ void opentxInit() auxSerialInit(g_eeGeneral.auxSerialMode, modelTelemetryProtocol()); #endif +#if defined(AUX2_SERIAL) + aux2SerialInit(g_eeGeneral.aux2SerialMode, modelTelemetryProtocol()); +#endif + #if MENUS_LOCK == 1 getMovedSwitch(); if (TRIMS_PRESSED() && g_eeGeneral.switchUnlockStates==switches_states) { diff --git a/radio/src/serial.cpp b/radio/src/serial.cpp index 953a865f5..c83b2fd92 100644 --- a/radio/src/serial.cpp +++ b/radio/src/serial.cpp @@ -34,6 +34,10 @@ void serialPutc(char c) { if (auxSerialTracesEnabled()) auxSerialPutc(c); #endif +#if defined(AUX2_SERIAL) + if (aux2SerialTracesEnabled()) + aux2SerialPutc(c); +#endif } void serialPrintf(const char * format, ...) diff --git a/radio/src/storage/conversions/conversions_218_219.cpp b/radio/src/storage/conversions/conversions_218_219.cpp index fe047ed80..dfca770ac 100644 --- a/radio/src/storage/conversions/conversions_218_219.cpp +++ b/radio/src/storage/conversions/conversions_218_219.cpp @@ -400,7 +400,7 @@ void convertRadioData_218_to_219(RadioData & settings) #if defined(PCBHORUS) // 2 new pots from X10: // - copy btw. 'chkSum' and 'auxSerialMode' (excl.) - memcpy(&settings.chkSum, &oldSettings.chkSum, offsetof(RadioData, auxSerialMode) - offsetof(RadioData, chkSum)); + memcpy(&settings.chkSum, &oldSettings.chkSum, offsetof(RadioData, switchConfig) - sizeof(uint8_t) - offsetof(RadioData, chkSum)); // - move calibration data memcpy(&settings.calib[NUM_STICKS + 5], &oldSettings.calib[NUM_STICKS + 3], sizeof(CalibData) * (STORAGE_NUM_SLIDERS + STORAGE_NUM_MOUSE_ANALOGS)); memclear(&settings.calib[NUM_STICKS + 3], sizeof(CalibData) * 2); diff --git a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp index 58f27fed5..35a23073c 100644 --- a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp @@ -193,5 +193,181 @@ extern "C" void AUX_SERIAL_USART_IRQHandler(void) } #endif } +#endif + +#if defined(AUX2_SERIAL) +uint8_t aux2SerialMode = 0; +Fifo aux2SerialTxFifo; +AuxSerialRxFifo aux2SerialRxFifo __DMA (AUX2_SERIAL_DMA_Stream_RX); + +void aux2SerialSetup(unsigned int baudrate, bool dma) +{ + USART_InitTypeDef USART_InitStructure; + GPIO_InitTypeDef GPIO_InitStructure; + + GPIO_PinAFConfig(AUX2_SERIAL_GPIO, AUX2_SERIAL_GPIO_PinSource_RX, AUX2_SERIAL_GPIO_AF); + GPIO_PinAFConfig(AUX2_SERIAL_GPIO, AUX2_SERIAL_GPIO_PinSource_TX, AUX2_SERIAL_GPIO_AF); + + GPIO_InitStructure.GPIO_Pin = AUX2_SERIAL_GPIO_PIN_TX | AUX2_SERIAL_GPIO_PIN_RX; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_Init(AUX2_SERIAL_GPIO, &GPIO_InitStructure); + +#if defined(AUX2_SERIAL_PWR_GPIO) + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_InitStructure.GPIO_Pin = AUX2_SERIAL_PWR_GPIO_PIN; + GPIO_Init(AUX2_SERIAL_PWR_GPIO, &GPIO_InitStructure); +#endif + + USART_InitStructure.USART_BaudRate = baudrate; + USART_InitStructure.USART_WordLength = USART_WordLength_8b; + USART_InitStructure.USART_StopBits = USART_StopBits_1; + USART_InitStructure.USART_Parity = USART_Parity_No; + USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; + USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; + USART_Init(AUX2_SERIAL_USART, &USART_InitStructure); + + if (dma) { + DMA_InitTypeDef DMA_InitStructure; + aux2SerialRxFifo.clear(); + USART_ITConfig(AUX2_SERIAL_USART, USART_IT_RXNE, DISABLE); + USART_ITConfig(AUX2_SERIAL_USART, USART_IT_TXE, DISABLE); + DMA_InitStructure.DMA_Channel = AUX2_SERIAL_DMA_Channel_RX; + DMA_InitStructure.DMA_PeripheralBaseAddr = CONVERT_PTR_UINT(&AUX2_SERIAL_USART->DR); + DMA_InitStructure.DMA_Memory0BaseAddr = CONVERT_PTR_UINT(aux2SerialRxFifo.buffer()); + DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; + DMA_InitStructure.DMA_BufferSize = aux2SerialRxFifo.size(); + DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; + DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; + DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; + DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; + DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; + DMA_InitStructure.DMA_Priority = DMA_Priority_Low; + DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; + DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; + DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; + DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; + DMA_Init(AUX2_SERIAL_DMA_Stream_RX, &DMA_InitStructure); + USART_DMACmd(AUX2_SERIAL_USART, USART_DMAReq_Rx, ENABLE); + USART_Cmd(AUX2_SERIAL_USART, ENABLE); + DMA_Cmd(AUX2_SERIAL_DMA_Stream_RX, ENABLE); + } + else { + USART_Cmd(AUX2_SERIAL_USART, ENABLE); + USART_ITConfig(AUX2_SERIAL_USART, USART_IT_RXNE, ENABLE); + USART_ITConfig(AUX2_SERIAL_USART, USART_IT_TXE, DISABLE); + NVIC_SetPriority(AUX2_SERIAL_USART_IRQn, 7); + NVIC_EnableIRQ(AUX2_SERIAL_USART_IRQn); + } +} + +void aux2SerialInit(unsigned int mode, unsigned int protocol) +{ + aux2SerialStop(); + + aux2SerialMode = mode; + + switch (mode) { + case UART_MODE_TELEMETRY_MIRROR: +#if defined(CROSSFIRE) + if (protocol == PROTOCOL_TELEMETRY_CROSSFIRE) { + aux2SerialSetup(CROSSFIRE_TELEM_MIRROR_BAUDRATE, false); + break; + } +#endif + aux2SerialSetup(FRSKY_TELEM_MIRROR_BAUDRATE, false); + break; + +#if defined(DEBUG) || defined(CLI) + case UART_MODE_DEBUG: + aux2SerialSetup(DEBUG_BAUDRATE, false); + break; +#endif + + case UART_MODE_TELEMETRY: + if (protocol == PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY) { + aux2SerialSetup(FRSKY_D_BAUDRATE, true); + } + break; + + case UART_MODE_LUA: + aux2SerialSetup(DEBUG_BAUDRATE, false); + } +} + +void aux2SerialPutc(char c) +{ +#if !defined(SIMU) + int n = 0; + while (aux2SerialTxFifo.isFull()) { + delay_ms(1); + if (++n > 100) return; + } + aux2SerialTxFifo.push(c); + USART_ITConfig(AUX2_SERIAL_USART, USART_IT_TXE, ENABLE); +#endif +} + +void aux2SerialSbusInit() +{ + aux2SerialSetup(SBUS_BAUDRATE, true); + AUX2_SERIAL_USART->CR1 |= USART_CR1_M | USART_CR1_PCE ; + AUX2_SERIAL_POWER_ON(); +} + +void aux2SerialStop() +{ + DMA_DeInit(AUX2_SERIAL_DMA_Stream_RX); + USART_DeInit(AUX2_SERIAL_USART); +} + +uint8_t aux2SerialTracesEnabled() +{ +#if defined(DEBUG) + return (aux2SerialMode == UART_MODE_DEBUG); +#else + return false; +#endif +} + +#if !defined(SIMU) +extern "C" void AUX2_SERIAL_USART_IRQHandler(void) +{ + DEBUG_INTERRUPT(INT_SER2); + // Send + if (USART_GetITStatus(AUX2_SERIAL_USART, USART_IT_TXE) != RESET) { + uint8_t txchar; + if (aux2SerialTxFifo.pop(txchar)) { + /* Write one byte to the transmit data register */ + USART_SendData(AUX2_SERIAL_USART, txchar); + } + else { + USART_ITConfig(AUX2_SERIAL_USART, USART_IT_TXE, DISABLE); + } + } + +#if defined(CLI) + if (getSelectedUsbMode() != USB_SERIAL_MODE) { + // Receive + uint32_t status = AUX2_SERIAL_USART->SR; + while (status & (USART_FLAG_RXNE | USART_FLAG_ERRORS)) { + uint8_t data = AUX2_SERIAL_USART->DR; + if (!(status & USART_FLAG_ERRORS)) { + switch (aux2SerialMode) { + case UART_MODE_DEBUG: + cliRxFifo.push(data); + break; + } + } + status = AUX2_SERIAL_USART->SR; + } + } +#endif +} +#endif + #endif #endif // AUX_SERIAL diff --git a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp index b0079b49e..c849f9e9a 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp +++ b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp @@ -197,15 +197,15 @@ int main() RCC_AHB1PeriphClockCmd(PWR_RCC_AHB1Periph | KEYS_RCC_AHB1Periph | LCD_RCC_AHB1Periph | BACKLIGHT_RCC_AHB1Periph | - AUX_SERIAL_RCC_AHB1Periph | I2C_RCC_AHB1Periph | + AUX_SERIAL_RCC_AHB1Periph | AUX2_SERIAL_RCC_AHB1Periph | I2C_RCC_AHB1Periph | SD_RCC_AHB1Periph, ENABLE); RCC_APB1PeriphClockCmd(ROTARY_ENCODER_RCC_APB1Periph | LCD_RCC_APB1Periph | BACKLIGHT_RCC_APB1Periph | INTERRUPT_xMS_RCC_APB1Periph | I2C_RCC_APB1Periph | - AUX_SERIAL_RCC_APB1Periph | + AUX_SERIAL_RCC_APB1Periph | AUX2_SERIAL_RCC_APB1Periph | SD_RCC_APB1Periph, ENABLE); - RCC_APB2PeriphClockCmd(LCD_RCC_APB2Periph | BACKLIGHT_RCC_APB2Periph | RCC_APB2Periph_SYSCFG | AUX_SERIAL_RCC_APB2Periph, ENABLE); + RCC_APB2PeriphClockCmd(LCD_RCC_APB2Periph | BACKLIGHT_RCC_APB2Periph | RCC_APB2Periph_SYSCFG | AUX_SERIAL_RCC_APB2Periph | AUX2_SERIAL_RCC_APB2Periph, ENABLE); pwrInit(); keysInit(); @@ -249,6 +249,9 @@ int main() #if defined(DEBUG) && defined(AUX_SERIAL) auxSerialInit(UART_MODE_DEBUG, 0); // default serial mode (None if DEBUG not defined) #endif +#if defined(DEBUG) && defined(AUX2_SERIAL) + aux2SerialInit(UART_MODE_DEBUG, 0); // default serial mode (None if DEBUG not defined) +#endif __enable_irq(); diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index a02abfa12..b1a01e2e1 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -64,8 +64,9 @@ if (PCB STREQUAL X10) set(HARDWARE_TOUCH YES) set(USB_CHARGER YES) set(DEFAULT_THEME "DARKBLUE") + set(AUX_SERIAL ON) if (NOT BLUETOOTH) - set(AUX_SERIAL ON) + set(AUX2_SERIAL ON) endif() else() set(FLAVOUR x10) @@ -238,6 +239,11 @@ if (AUX_SERIAL) set(AUX_SERIAL_DRIVER ../common/arm/stm32/aux_serial_driver.cpp) endif() +if (AUX2_SERIAL) + add_definitions(-DAUX2_SERIAL) + set(AUX_SERIAL_DRIVER ../common/arm/stm32/aux_serial_driver.cpp) +endif() + set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} ${LCD_DRIVER} diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp index 15b14ac2f..704a6f27c 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -96,6 +96,7 @@ void boardInit() KEYS_RCC_AHB1Periph | ADC_RCC_AHB1Periph | AUX_SERIAL_RCC_AHB1Periph | + AUX2_SERIAL_RCC_AHB1Periph | TELEMETRY_RCC_AHB1Periph | TRAINER_RCC_AHB1Periph | BT_RCC_AHB1Periph | @@ -116,6 +117,7 @@ void boardInit() TIMER_2MHz_RCC_APB1Periph | AUDIO_RCC_APB1Periph | AUX_SERIAL_RCC_APB1Periph | + AUX2_SERIAL_RCC_APB1Periph | TELEMETRY_RCC_APB1Periph | TRAINER_RCC_APB1Periph | AUDIO_RCC_APB1Periph | @@ -135,6 +137,7 @@ void boardInit() TELEMETRY_RCC_APB2Periph | BT_RCC_APB2Periph | AUX_SERIAL_RCC_APB2Periph | + AUX2_SERIAL_RCC_APB2Periph | BACKLIGHT_RCC_APB2Periph, ENABLE); @@ -147,6 +150,9 @@ void boardInit() #if defined(DEBUG) && defined(AUX_SERIAL) auxSerialInit(UART_MODE_DEBUG, 0); // default serial mode (None if DEBUG not defined) #endif +#if defined(DEBUG) && defined(AUX2_SERIAL) + aux2SerialInit(UART_MODE_DEBUG, 0); // default serial mode (None if DEBUG not defined) +#endif TRACE("\nHorus board started :)"); TRACE("RCC->CSR = %08x", RCC->CSR); diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 437346078..74ebd7368 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -615,7 +615,7 @@ void sportUpdatePowerInit(); #define IS_SPORT_UPDATE_POWER_ON() (false) #endif -// Second serial port driver +// Aux serial port driver #if defined(AUX_SERIAL_GPIO) #define DEBUG_BAUDRATE 115200 extern uint8_t auxSerialMode; @@ -635,6 +635,25 @@ void auxSerialPowerOff(); #endif #endif +// Aux2 serial port driver +#if defined(AUX2_SERIAL) +extern uint8_t aux2SerialMode; +void aux2SerialInit(unsigned int mode, unsigned int protocol); +void aux2SerialPutc(char c); +#define aux2SerialTelemetryInit(protocol) aux2SerialInit(UART_MODE_TELEMETRY, protocol) +void aux2SerialSbusInit(); +void aux2SerialStop(); +void aux2SerialPowerOn(); +void aux2SerialPowerOff(); +#if defined(AUX2_SERIAL_PWR_GPIO) +#define AUX2_SERIAL_POWER_ON() aux2SerialPowerOn() +#define AUX2_SERIAL__POWER_OFF() aux2SerialPowerOff() +#else +#define AUX2_SERIAL_POWER_ON() +#define AUX2_SERIAL__POWER_OFF() +#endif +#endif + // Haptic driver void hapticInit(); void hapticDone(); diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index c37f1ba54..f964e0137 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -433,6 +433,10 @@ #define AUX2_SERIAL_DMA_Channel_RX DMA_Channel_5 #define AUX2_SERIAL_PWR_GPIO GPIOB #define AUX2_SERIAL_PWR_GPIO_PIN GPIO_Pin_0 // PB.00 +#else + #define AUX2_SERIAL_RCC_AHB1Periph 0 + #define AUX2_SERIAL_RCC_APB1Periph 0 + #define AUX2_SERIAL_RCC_APB2Periph 0 #endif // Telemetry diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index 73a4948ca..fa0122175 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -787,3 +787,23 @@ void auxSerialStop() { } #endif + +#if defined(AUX2_SERIAL) +AuxSerialRxFifo aux2SerialRxFifo(nullptr); +uint8_t aux2SerialMode; +void aux2SerialInit(unsigned int mode, unsigned int protocol) +{ +} + +void aux2SerialPutc(char c) +{ +} + +void aux2SerialSbusInit() +{ +} + +void aux2SerialStop() +{ +} +#endif diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index acba12d76..e62b71523 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -785,7 +785,7 @@ void hapticOff(); void hapticOn(); #endif -// Second serial port driver +// Aux serial port driver #if defined(AUX_SERIAL_GPIO) #define DEBUG_BAUDRATE 115200 #define AUX_SERIAL @@ -796,7 +796,7 @@ void auxSerialPutc(char c); void auxSerialSbusInit(); void auxSerialStop(); #define AUX_SERIAL_POWER_ON() -#define AUX_SERIAL__POWER_OFF() +#define AUX_SERIAL_POWER_OFF() #endif // BT driver diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index b55226edf..cfe9830b7 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -1323,6 +1323,11 @@ #define AUX_SERIAL_DMA_Channel_RX DMA_Channel_4 #endif +// No aux2 on taranis +#define AUX2_SERIAL_RCC_AHB1Periph 0 +#define AUX2_SERIAL_RCC_APB1Periph 0 +#define AUX2_SERIAL_RCC_APB2Periph 0 + // Telemetry #define TELEMETRY_RCC_AHB1Periph (RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA1) #define TELEMETRY_RCC_APB1Periph RCC_APB1Periph_USART2 diff --git a/radio/src/telemetry/crossfire.cpp b/radio/src/telemetry/crossfire.cpp index 724fbe1a0..07f3577f4 100644 --- a/radio/src/telemetry/crossfire.cpp +++ b/radio/src/telemetry/crossfire.cpp @@ -201,6 +201,11 @@ void processCrossfireTelemetryData(uint8_t data) auxSerialPutc(data); } #endif +#if defined(AUX2_SERIAL) + if (g_eeGeneral.aux2SerialMode == UART_MODE_TELEMETRY_MIRROR) { + aux2SerialPutc(data); + } +#endif if (telemetryRxBufferCount == 0 && data != RADIO_ADDRESS) { TRACE("[XF] address 0x%02X error", data); diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index 0fe1a5bfd..611ece4ac 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -32,6 +32,11 @@ void processFrskyTelemetryData(uint8_t data) auxSerialPutc(data); } #endif +#if defined(AUX2_SERIAL) + if (g_eeGeneral.aux2SerialMode == UART_MODE_TELEMETRY_MIRROR) { + aux2SerialPutc(data); + } +#endif if (pushFrskyTelemetryData(data)) { if (IS_FRSKY_SPORT_PROTOCOL()) { diff --git a/radio/src/telemetry/multi.cpp b/radio/src/telemetry/multi.cpp index 3719d660b..55f09eed3 100644 --- a/radio/src/telemetry/multi.cpp +++ b/radio/src/telemetry/multi.cpp @@ -322,6 +322,12 @@ static void processMultiTelemetryPaket(const uint8_t * packet, uint8_t module) auxSerialPutc(packet[c]); } #endif +#if defined(AUX2_SERIAL) + if (g_eeGeneral.aux2SerialMode == UART_MODE_TELEMETRY_MIRROR) { + for (uint8_t c=0; c < len; c++) + aux2SerialPutc(packet[c]); + } +#endif // Switch type switch (type) { diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 4f43e33d1..39a5bc556 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -564,6 +564,7 @@ const char STR_ALTITUDE[] = TR_ALTITUDE; const char STR_SCALE[] = TR_SCALE; const char STR_VIEW_CHANNELS[] = TR_VIEW_CHANNELS; const char STR_AUX_SERIAL_MODE[] = TR_AUX_SERIAL_MODE; +const char STR_AUX2_SERIAL_MODE[] = TR_AUX2_SERIAL_MODE; const char STR_THROTTLE_LABEL[] = TR_THROTTLE_LABEL; const char STR_SCRIPT[] = TR_SCRIPT; const char STR_INPUTS[] = TR_INPUTS; diff --git a/radio/src/translations.h b/radio/src/translations.h index 6b0038118..3e7536295 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -864,6 +864,7 @@ extern const char STR_SCALE[]; extern const char STR_VIEW_CHANNELS[]; extern const char STR_POTWARNING[]; extern const char STR_AUX_SERIAL_MODE[]; +extern const char STR_AUX2_SERIAL_MODE[]; extern const char STR_THROTTLE_LABEL[]; extern const char STR_SCRIPT[]; extern const char STR_INPUTS[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 08ae06de2..4c04f2bf1 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -981,6 +981,7 @@ #define TR_CHECKLIST TR(INDENT "Poznámky", INDENT "Zobrazit poznámky") #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Ofset") #define TR_AUX_SERIAL_MODE "Seriový port" +#define TR_AUX2_SERIAL_MODE "Seriový port 2" #define TR_SCRIPT "Skript" #define TR_INPUTS "Vstupy" #define TR_OUTPUTS "Výstupy" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 62478e7ed..c9e91bd45 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -987,6 +987,7 @@ #define TR_CHECKLIST TR(INDENT "Checkliste", INDENT "Checkliste anzeigen") //9XR-Pro #define TR_FAS_OFFSET TR(INDENT "FAS-Ofs", INDENT "FAS-Offset") #define TR_AUX_SERIAL_MODE "Serieller Port" +#define TR_AUX2_SERIAL_MODE "Serieller Port 2" #define TR_SCRIPT "Lua-Skript" #define TR_INPUTS "Eingaben" #define TR_OUTPUTS "Ausgaben" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 72363c477..e7c30c01e 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -985,7 +985,8 @@ #define TR_PREFLIGHT "Preflight Checks" #define TR_CHECKLIST TR(INDENT "Checklist", INDENT "Display checklist") #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS offset") -#define TR_AUX_SERIAL_MODE "Serial port" +#define TR_AUX_SERIAL_MODE "Serial port" +#define TR_AUX2_SERIAL_MODE "Serial port 2" #define TR_SCRIPT "Script" #define TR_INPUTS "Inputs" #define TR_OUTPUTS "Outputs" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index b022314fa..428505c1c 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -985,6 +985,7 @@ #define TR_CHECKLIST TR(INDENT "Lista verif", INDENT "Lista verificación") #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") #define TR_AUX_SERIAL_MODE "Puerto serie" +#define TR_AUX2_SERIAL_MODE "Puerto serie 2" #define TR_SCRIPT "Script" #define TR_INPUTS "Entradas" #define TR_OUTPUTS "Salidas" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index afaef5c33..4ff379551 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -999,7 +999,8 @@ #define TR_PREFLIGHT "Preflight Checks" #define TR_CHECKLIST INDENT "Display Checklist" #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") -#define TR_AUX_SERIAL_MODE "Serial port" +#define TR_AUX_SERIAL_MODE "Serial port" +#define TR_AUX2_SERIAL_MODE "Serial port 2" #define TR_SCRIPT "Script" #define TR_INPUTS "Inputs" #define TR_OUTPUTS "Outputs" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 422205dd5..e9e87f731 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -1002,6 +1002,7 @@ #define TR_CHECKLIST TR(INDENT "Notes", INDENT "Afficher notes") #define TR_FAS_OFFSET TR(INDENT "Corr FAS", INDENT "Correction FAS") #define TR_AUX_SERIAL_MODE "Port série" +#define TR_AUX2_SERIAL_MODE "Port série 2" #define TR_SCRIPT "Script" #define TR_INPUTS "Entrées" #define TR_OUTPUTS "Sorties" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 72223e759..37a494f8a 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -1001,7 +1001,8 @@ #define TR_PREFLIGHT "Controlli Prevolo" #define TR_CHECKLIST INDENT "Mostra Checklist" #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") -#define TR_AUX_SERIAL_MODE "Porta Seriale" +#define TR_AUX_SERIAL_MODE "Porta Seriale" +#define TR_AUX2_SERIAL_MODE "Porta Seriale 2" #define TR_SCRIPT "Script" #define TR_INPUTS "Ingresso" #define TR_OUTPUTS "Uscita" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index f36f75cf1..397cdd636 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -987,7 +987,8 @@ #define TR_PREFLIGHT "Preflight Checks" #define TR_CHECKLIST TR(INDENT "Checklist", INDENT "Toon Checklist") #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") -#define TR_AUX_SERIAL_MODE "Seriele poort" +#define TR_AUX_SERIAL_MODE "Seriele poort" +#define TR_AUX2_SERIAL_MODE "Seriele poort 2" #define TR_SCRIPT "Script" #define TR_INPUTS "Inputs" #define TR_OUTPUTS "Outputs" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 5fd59c2ec..370d757f6 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -1000,7 +1000,8 @@ #define TR_PREFLIGHT "Lista Ostrzeżeń" #define TR_CHECKLIST TR(INDENT "Czeklista",INDENT "Pokaż Listę Ostrzeżeń") #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") -#define TR_AUX_SERIAL_MODE "Port szreg." +#define TR_AUX_SERIAL_MODE "Port szreg." +#define TR_AUX2_SERIAL_MODE "Port szreg. 2" #define TR_SCRIPT "Skrypt" #define TR_INPUTS "Wejścia" #define TR_OUTPUTS "Wyjścia" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 857bc3c35..a9b5d0027 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -990,7 +990,8 @@ #define TR_PREFLIGHT "Preflight Checks" #define TR_CHECKLIST INDENT "Display Checklist" #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") -#define TR_AUX_SERIAL_MODE "Serial port" +#define TR_AUX_SERIAL_MODE "Serial port" +#define TR_AUX2_SERIAL_MODE "Serial port 2" #define TR_SCRIPT "Script" #define TR_INPUTS "Inputs" #define TR_OUTPUTS "Outputs" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index feff5f1d2..1578d86a1 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -1000,7 +1000,8 @@ #define TR_PREFLIGHT "Startkontroller" #define TR_CHECKLIST TR(INDENT "Checklista", INDENT "Visa Checklista") #define TR_FAS_OFFSET TR(INDENT "FAS Ofs", INDENT "FAS Offset") -#define TR_AUX_SERIAL_MODE "Serieporten" +#define TR_AUX_SERIAL_MODE "Serieporten" +#define TR_AUX2_SERIAL_MODE "Serieporten 2" #define TR_SCRIPT "Programkod" #define TR_INPUTS "Input" #define TR_OUTPUTS "Outputs" From a32a431436f7caff31329f8ea32d95f68fca7e32 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 15 May 2020 14:52:33 +0200 Subject: [PATCH 345/560] Improve Batt and Batt charging icon (#7584) --- radio/src/bitmaps/480x272/mask_txbat.png | Bin 601 -> 310 bytes .../bitmaps/480x272/mask_txbat_charging.png | Bin 4967 -> 553 bytes radio/src/gui/480x272/topbar.cpp | 16 ++++++++-------- 3 files changed, 8 insertions(+), 8 deletions(-) mode change 100755 => 100644 radio/src/bitmaps/480x272/mask_txbat_charging.png diff --git a/radio/src/bitmaps/480x272/mask_txbat.png b/radio/src/bitmaps/480x272/mask_txbat.png index fd59391909622330e0a5cfd8db19de74edd4a0c3..001d2751c03e3587780330fff21ee326b0d992a0 100644 GIT binary patch delta 237 zcmVST6hzNoh7Jjd5*mbP zn8BiED8^tYXlU4g9s~@)u|ObEV&Wn>$=%7%r~gk@Bnbx+IFd84ilT_V?*jm|*2wc5 zp67jZsWAq1U0;LKG-coSR?}2fg|=-kJz7K%hT->Td$<1o(2jn^AMEh~V-VAl6@Z1l00000NkvXXu0mjf)2(Xz delta 531 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 diff --git a/radio/src/gui/480x272/topbar.cpp b/radio/src/gui/480x272/topbar.cpp index 81b1f643a..f78174aa8 100644 --- a/radio/src/gui/480x272/topbar.cpp +++ b/radio/src/gui/480x272/topbar.cpp @@ -91,18 +91,18 @@ void drawTopBar() /* Tx battery */ uint8_t bars = GET_TXBATT_BARS(5); #if defined(USB_CHARGER) - if (usbChargerLed() && BLINK_ON_PHASE) { - lcdDrawBitmapPattern(LCD_W-130, 24, LBM_TOPMENU_TXBATT_CHARGING, MENU_TITLE_COLOR); + if (usbChargerLed()) { + lcdDrawBitmapPattern(LCD_W - 130, 25, LBM_TOPMENU_TXBATT_CHARGING, MENU_TITLE_COLOR); } else { -#endif - lcdDrawBitmapPattern(LCD_W - 130, 24, LBM_TOPMENU_TXBATT, MENU_TITLE_COLOR); - for (unsigned int i = 0; i < 5; i++) { - lcdDrawSolidFilledRect(LCD_W - 122 + 4 * i, 30, 2, 8, i >= bars ? MENU_TITLE_DISABLE_COLOR : MENU_TITLE_COLOR); - } -#if defined(USB_CHARGER) + lcdDrawBitmapPattern(LCD_W - 130, 25, LBM_TOPMENU_TXBATT, MENU_TITLE_COLOR); } +#else + lcdDrawBitmapPattern(LCD_W - 130, 25, LBM_TOPMENU_TXBATT, MENU_TITLE_COLOR); #endif + for (unsigned int i = 0; i < 5; i++) { + lcdDrawSolidFilledRect(LCD_W - 128 + 4 * i, 30, 2, 8, i >= bars ? MENU_TITLE_DISABLE_COLOR : MENU_TITLE_COLOR); + } topbar->refresh(); #if 0 From 51f841d2af51fb76c4e0dad8e4f93167bec533b6 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 15 May 2020 15:09:36 +0200 Subject: [PATCH 346/560] Fix haptic getCapabilities() (#7573) Fix haptic getCapabilities() --- companion/src/firmwares/opentx/opentxinterface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 44346310d..464c458ef 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -564,7 +564,7 @@ int OpenTxFirmware::getCapability(::Capability capability) case SoundPitch: return 1; case Haptic: - return (IS_2560(board) || IS_SKY9X(board) || IS_TARANIS_PLUS(board) || IS_TARANIS_SMALL(board) || IS_TARANIS_X9E(board) || IS_FAMILY_HORUS_OR_T16(board) || IS_JUMPER_T12(board) || id.contains("haptic")); + return board != Board::BOARD_TARANIS_X9D || id.contains("haptic"); case ModelTrainerEnable: if (IS_HORUS_OR_TARANIS(board) && board!=Board::BOARD_TARANIS_XLITE) return 1; From 682f0f1b0521304c1dc79f80c8088e75ec0fb75b Mon Sep 17 00:00:00 2001 From: Tom van Dijk <5869151+tomvand@users.noreply.github.com> Date: Fri, 15 May 2020 15:13:23 +0200 Subject: [PATCH 347/560] lua serialRead (#7520) Lua serial read --- radio/src/lua/api_general.cpp | 52 +++++++++++++++++++ radio/src/lua/lua_api.h | 5 ++ .../common/arm/stm32/aux_serial_driver.cpp | 13 +++++ .../src/targets/common/arm/stm32/usbd_cdc.cpp | 11 +++- 4 files changed, 79 insertions(+), 2 deletions(-) diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 778af80c6..6a4ab7c44 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -66,6 +66,10 @@ { "EVT_"#xxx"_LONG", EVT_KEY_LONG(yyy) }, \ { "EVT_"#xxx"_REPT", EVT_KEY_REPT(yyy) } +#if defined(LUA) && !defined(CLI) +Fifo * luaRxFifo = nullptr; +#endif + /*luadoc @function getVersion() @@ -1615,6 +1619,53 @@ static int luaSerialWrite(lua_State * L) return 0; } +/*luadoc +@function serialRead([num]) +@param num (optional): maximum number of bytes to read. + If non-zero, serialRead will read up to num characters from the buffer. + If 0 or left out, serialRead will read up to and including the first newline character or the end of the buffer. + Note that the returned string may not end in a newline if this character is not present in the buffer. + +@retval str string. Empty if no new characters were available. + +Reads characters from the serial port. The string is allowed to contain any character, including 0. + +@status current Introduced in TODO +*/ +static int luaSerialRead(lua_State * L) +{ + int num = luaL_optunsigned(L, 1, 0); + +#if defined(LUA) && !defined(CLI) + if (!luaRxFifo) { + luaRxFifo = new Fifo(); + if (!luaRxFifo) { + lua_pushlstring(L, "", 0); + return 1; + } + } + uint8_t str[LUA_FIFO_SIZE]; + uint8_t *p = str; + while (luaRxFifo->pop(*p)) { + p++; // increment only when pop was successful + if (p - str >= LUA_FIFO_SIZE) { + break; // Buffer full + } + if (num == 0 && (*(p - 1) == '\n' || *(p - 1) == '\r')) { + break; // Found newline + } + if (num > 0 && p - str >= num) { + break; // Requested number of characters reached + } + } + lua_pushlstring(L, (const char*)str, p - str); +#else + lua_pushlstring(L, "", 0); +#endif + + return 1; +} + const luaL_Reg opentxLib[] = { { "getTime", luaGetTime }, { "getDateTime", luaGetDateTime }, @@ -1662,6 +1713,7 @@ const luaL_Reg opentxLib[] = { { "multiBuffer", luaMultiBuffer }, #endif { "serialWrite", luaSerialWrite }, + { "serialRead", luaSerialRead }, { nullptr, nullptr } /* sentinel */ }; diff --git a/radio/src/lua/lua_api.h b/radio/src/lua/lua_api.h index 71a1cef01..a0dc8e919 100644 --- a/radio/src/lua/lua_api.h +++ b/radio/src/lua/lua_api.h @@ -41,6 +41,11 @@ extern "C" { #endif #endif +#if !defined(CLI) +#define LUA_FIFO_SIZE 256 +extern Fifo * luaRxFifo; +#endif + extern lua_State * lsScripts; extern lua_State * lsWidgets; extern bool luaLcdAllowed; diff --git a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp index 35a23073c..4ebef6790 100644 --- a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp @@ -192,6 +192,19 @@ extern "C" void AUX_SERIAL_USART_IRQHandler(void) } } #endif +#if defined(LUA) && !defined(CLI) + if (luaRxFifo && auxSerialMode == UART_MODE_LUA) { + // Receive + uint32_t status = AUX_SERIAL_USART->SR; + while (status & (USART_FLAG_RXNE | USART_FLAG_ERRORS)) { + uint8_t data = AUX_SERIAL_USART->DR; + if (!(status & USART_FLAG_ERRORS)) { + luaRxFifo->push(data); + } + status = AUX_SERIAL_USART->SR; + } + } +#endif } #endif diff --git a/radio/src/targets/common/arm/stm32/usbd_cdc.cpp b/radio/src/targets/common/arm/stm32/usbd_cdc.cpp index dd0233941..4d9409ec8 100644 --- a/radio/src/targets/common/arm/stm32/usbd_cdc.cpp +++ b/radio/src/targets/common/arm/stm32/usbd_cdc.cpp @@ -218,11 +218,18 @@ static uint16_t VCP_DataRx (uint8_t* Buf, uint32_t Len) #if defined(CLI) //copy data to the application FIFO - for (uint32_t i = 0; i < Len; i++) - { + for (uint32_t i = 0; i < Len; i++) { cliRxFifo.push(Buf[i]); } #endif +#if defined(LUA) && !defined(CLI) + // copy data to the LUA FIFO + if (luaRxFifo) { + for (uint32_t i = 0; i < Len; i++) { + luaRxFifo->push(Buf[i]); + } + } +#endif return USBD_OK; } From f7fc15d7b5d15b4dc6b77ab54ec5ce0cb5126c4a Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 15 May 2020 15:17:41 +0200 Subject: [PATCH 348/560] Cosmetics --- radio/src/gui/128x64/model_flightmodes.cpp | 3 ++- radio/src/lua/api_general.cpp | 17 +++++++++++------ .../common/arm/stm32/aux_serial_driver.cpp | 16 ++++++++-------- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/radio/src/gui/128x64/model_flightmodes.cpp b/radio/src/gui/128x64/model_flightmodes.cpp index b619121b6..cfe15842b 100644 --- a/radio/src/gui/128x64/model_flightmodes.cpp +++ b/radio/src/gui/128x64/model_flightmodes.cpp @@ -87,7 +87,8 @@ void menuModelFlightModeOne(event_t event) int8_t editMode = s_editMode; #if defined(GVARS) - if (s_currIdx == 0 && sub>=ITEM_MODEL_FLIGHT_MODE_SWITCH) sub += VERTICAL_SHIFT; + if (s_currIdx == 0 && sub>=ITEM_MODEL_FLIGHT_MODE_SWITCH) + sub += VERTICAL_SHIFT; for (uint8_t k=0; kpop(*p)) { p++; // increment only when pop was successful if (p - str >= LUA_FIFO_SIZE) { - break; // Buffer full + // buffer full + break; } - if (num == 0 && (*(p - 1) == '\n' || *(p - 1) == '\r')) { - break; // Found newline + if (num == 0) { + if (*(p - 1) == '\n' || *(p - 1) == '\r') { + // found newline + break; + } } - if (num > 0 && p - str >= num) { - break; // Requested number of characters reached + else if (p - str >= num) { + // requested number of characters reached + break; } } lua_pushlstring(L, (const char*)str, p - str); diff --git a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp index 4ebef6790..bc0e54504 100644 --- a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp @@ -194,16 +194,16 @@ extern "C" void AUX_SERIAL_USART_IRQHandler(void) #endif #if defined(LUA) && !defined(CLI) if (luaRxFifo && auxSerialMode == UART_MODE_LUA) { - // Receive - uint32_t status = AUX_SERIAL_USART->SR; - while (status & (USART_FLAG_RXNE | USART_FLAG_ERRORS)) { - uint8_t data = AUX_SERIAL_USART->DR; - if (!(status & USART_FLAG_ERRORS)) { - luaRxFifo->push(data); - } - status = AUX_SERIAL_USART->SR; + // Receive + uint32_t status = AUX_SERIAL_USART->SR; + while (status & (USART_FLAG_RXNE | USART_FLAG_ERRORS)) { + uint8_t data = AUX_SERIAL_USART->DR; + if (!(status & USART_FLAG_ERRORS)) { + luaRxFifo->push(data); } + status = AUX_SERIAL_USART->SR; } + } #endif } #endif From 40f9b05ce240758231cbbcecaca7254d26219c8e Mon Sep 17 00:00:00 2001 From: Neil Horne Date: Fri, 15 May 2020 23:25:50 +1000 Subject: [PATCH 349/560] Companion update model references from enhanced context menus (#7325) Companion update model references from enhanced context menus --- companion/src/firmwares/CMakeLists.txt | 1 + .../src/firmwares/adjustmentreference.cpp | 81 ++ companion/src/firmwares/adjustmentreference.h | 69 ++ companion/src/firmwares/curvereference.h | 1 + companion/src/firmwares/eeprominterface.h | 5 +- companion/src/firmwares/gvardata.cpp | 5 + companion/src/firmwares/gvardata.h | 3 +- companion/src/firmwares/io_data.cpp | 81 +- companion/src/firmwares/io_data.h | 32 +- companion/src/firmwares/modeldata.cpp | 996 +++++++++++++++++- companion/src/firmwares/modeldata.h | 109 +- companion/src/firmwares/moduledata.cpp | 56 + companion/src/firmwares/moduledata.h | 4 +- .../src/firmwares/opentx/opentxinterface.cpp | 9 + companion/src/firmwares/rawsource.h | 8 +- companion/src/firmwares/rawswitch.h | 9 +- companion/src/modeledit/channels.cpp | 161 +-- companion/src/modeledit/channels.h | 30 +- companion/src/modeledit/curves.cpp | 341 +++--- companion/src/modeledit/curves.h | 28 +- companion/src/modeledit/customfunctions.cpp | 143 +-- companion/src/modeledit/customfunctions.h | 30 +- companion/src/modeledit/flightmodes.cpp | 865 ++++++++++++--- companion/src/modeledit/flightmodes.h | 46 +- companion/src/modeledit/inputs.cpp | 504 ++++++--- companion/src/modeledit/inputs.h | 18 +- companion/src/modeledit/logicalswitches.cpp | 438 +++++--- companion/src/modeledit/logicalswitches.h | 66 +- companion/src/modeledit/setup.cpp | 293 ++++-- companion/src/modeledit/setup.h | 22 +- companion/src/modeledit/setup.ui | 2 +- 31 files changed, 3472 insertions(+), 984 deletions(-) create mode 100644 companion/src/firmwares/adjustmentreference.cpp create mode 100644 companion/src/firmwares/adjustmentreference.h diff --git a/companion/src/firmwares/CMakeLists.txt b/companion/src/firmwares/CMakeLists.txt index b6b8fcaba..502a04961 100644 --- a/companion/src/firmwares/CMakeLists.txt +++ b/companion/src/firmwares/CMakeLists.txt @@ -1,5 +1,6 @@ set(firmwares_SRCS + adjustmentreference.cpp boards.cpp curvereference.cpp customfunctiondata.cpp diff --git a/companion/src/firmwares/adjustmentreference.cpp b/companion/src/firmwares/adjustmentreference.cpp new file mode 100644 index 000000000..37b284ecd --- /dev/null +++ b/companion/src/firmwares/adjustmentreference.cpp @@ -0,0 +1,81 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "adjustmentreference.h" +#include "radiodata.h" // for ModelData + +AdjustmentReference::AdjustmentReference(int value) +{ + int val = value; + if (abs(val) > ADJUST_REF_GVAR_BASE && abs(val) <= ADJUST_REF_GVAR_BASE + CPN_MAX_GVARS) { + type = ADJUST_REF_GVAR; + val = val >= 0 ? val - ADJUST_REF_GVAR_BASE : val + ADJUST_REF_GVAR_BASE; + } + else + this->type = ADJUST_REF_VALUE; + + this->value = val; +} + +AdjustmentReference::AdjustmentReference(AdjustRefType type, int value) +{ + this->type = type; + if (isValid(value)) + this->value = value; + else + clear(); +} + +bool AdjustmentReference::isValid(const int value) const +{ + switch(type) { + case ADJUST_REF_VALUE: + if (abs(value) < ADJUST_REF_GVAR_BASE) + return true; + break; + case ADJUST_REF_GVAR: + if (abs(value) > 0 && abs(value) <= CPN_MAX_GVARS); + return true; + break; + } + return false; +} + +QString AdjustmentReference::toString(const ModelData * model, const bool sign) const +{ + QString ret; + + switch(type) { + case ADJUST_REF_GVAR: + ret = RawSource(SOURCE_TYPE_GVAR, abs(value) - 1).toString(model); + if (value < 0) + ret.prepend("-"); + else if (sign) + ret.prepend("+"); + break; + default: + ret = "%1%"; + if (sign && value > 0) + ret.prepend("+"); + ret = ret.arg(value); + break; + } + return ret; +} diff --git a/companion/src/firmwares/adjustmentreference.h b/companion/src/firmwares/adjustmentreference.h new file mode 100644 index 000000000..2a7b7e141 --- /dev/null +++ b/companion/src/firmwares/adjustmentreference.h @@ -0,0 +1,69 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef ADJUSTMENTREFERENCE_H +#define ADJUSTMENTREFERENCE_H + +#include + +class ModelData; + +constexpr int ADJUST_REF_GVAR_BASE { 10000 }; + +class AdjustmentReference { + Q_DECLARE_TR_FUNCTIONS(AdjustmentReference) + + public: + enum AdjustRefType { + ADJUST_REF_VALUE, + ADJUST_REF_GVAR, + }; + + AdjustmentReference() { clear(); } + explicit AdjustmentReference(int value); + AdjustmentReference(const AdjustRefType type, const int value); + + void clear() { memset(this, 0, sizeof(AdjustmentReference)); } + + bool isSet() const { return type != ADJUST_REF_VALUE || value != 0; } + bool isValid(const int value) const; + QString toString(const ModelData * model = nullptr, const bool sign = false) const; + + inline const int toValue() const + { + if (type == ADJUST_REF_GVAR) + return value >= 0 ? value + ADJUST_REF_GVAR_BASE : value - ADJUST_REF_GVAR_BASE; + else + return value; + } + + bool operator== ( const AdjustmentReference & other) const { + return (this->type == other.type) && (this->value == other.value); + } + + bool operator!= ( const AdjustmentReference & other) const { + return (this->type != other.type) || (this->value != other.value); + } + + AdjustRefType type; + int value; +}; + +#endif // ADJUSTMENTREFERENCE_H diff --git a/companion/src/firmwares/curvereference.h b/companion/src/firmwares/curvereference.h index ff5571bb5..cb5be4e73 100644 --- a/companion/src/firmwares/curvereference.h +++ b/companion/src/firmwares/curvereference.h @@ -50,6 +50,7 @@ class CurveReference { int value; QString toString(const ModelData * model = NULL, bool verbose = true) const; + bool isSet() const { return type != CURVE_REF_DIFF || value != 0; } }; #endif // CURVEREFERENCE_H diff --git a/companion/src/firmwares/eeprominterface.h b/companion/src/firmwares/eeprominterface.h index 9632af1ac..c2bf0dafa 100644 --- a/companion/src/firmwares/eeprominterface.h +++ b/companion/src/firmwares/eeprominterface.h @@ -100,6 +100,8 @@ enum Capability { GvarsName, NoTelemetryProtocol, TelemetryCustomScreens, + TelemetryCustomScreensBars, + TelemetryCustomScreensLines, TelemetryCustomScreensFieldsPerLine, TelemetryMaxMultiplier, HasVario, @@ -149,7 +151,8 @@ enum Capability { DangerousFunctions, HasModelCategories, HasSwitchableJack, - PwrButtonPress + PwrButtonPress, + Sensors }; class EEPROMInterface diff --git a/companion/src/firmwares/gvardata.cpp b/companion/src/firmwares/gvardata.cpp index 23c90cd2a..6ee1712d0 100644 --- a/companion/src/firmwares/gvardata.cpp +++ b/companion/src/firmwares/gvardata.cpp @@ -90,3 +90,8 @@ float GVarData::getMaxPrec() const { return getMax() * multiplierGet(); } + +bool GVarData::isEmpty() const +{ + return (name[0] == '\0' && min == 0 && max == 0 && (!popup) && prec == 0 && unit == 0); +} diff --git a/companion/src/firmwares/gvardata.h b/companion/src/firmwares/gvardata.h index 7718c5b21..e0d2da882 100644 --- a/companion/src/firmwares/gvardata.h +++ b/companion/src/firmwares/gvardata.h @@ -43,7 +43,7 @@ class GVarData { GVAR_PREC_MUL1 }; - char name[GVAR_NAME_LEN+1]; + char name[GVAR_NAME_LEN + 1]; int min; int max; bool popup; @@ -62,6 +62,7 @@ class GVarData { int getMax() const; float getMinPrec() const; float getMaxPrec() const; + bool isEmpty() const; }; diff --git a/companion/src/firmwares/io_data.cpp b/companion/src/firmwares/io_data.cpp index b0201d3d5..a958750d8 100644 --- a/companion/src/firmwares/io_data.cpp +++ b/companion/src/firmwares/io_data.cpp @@ -35,6 +35,10 @@ void ExpoData::convert(RadioDataConversionState & cstate) swtch.convert(cstate); } +bool ExpoData::isEmpty() const +{ + return (chn == 0 && mode == INPUT_MODE_NONE); +} /* * MixData @@ -48,6 +52,10 @@ void MixData::convert(RadioDataConversionState & cstate) swtch.convert(cstate); } +bool MixData::isEmpty() const +{ + return (destCh == 0); +} /* * LimitData @@ -87,17 +95,16 @@ void LimitData::clear() bool LimitData::isEmpty() const { - return (min == -1000 && max == 1000 && !revert && !offset && !ppmCenter && !symetrical && name[0] == '\0'); + return (min == -1000 && max == 1000 && !revert && !offset && !ppmCenter && !symetrical && name[0] == '\0' && !curve.isSet()); } - /* * CurveData */ CurveData::CurveData() { - clear(5); + clear(); } void CurveData::clear(int count) @@ -126,22 +133,20 @@ QString CurveData::nameToString(const int idx) const * FlightModeData */ -void FlightModeData::clear(const int phase) +void FlightModeData::clear(const int phaseIdx) { memset(reinterpret_cast(this), 0, sizeof(FlightModeData)); - if (phase != 0) { - for (int idx=0; idx(this), 0, sizeof(ExpoData)); } void convert(RadioDataConversionState & cstate); + bool isEmpty() const; }; enum MltpxValue { @@ -90,8 +93,11 @@ class MixData { char name[MIXDATA_NAME_LEN+1]; void clear() { memset(reinterpret_cast(this), 0, sizeof(MixData)); } + bool isEmpty() const; }; +#define LIMITDATA_NAME_LEN 6 + class LimitData { Q_DECLARE_TR_FUNCTIONS(LimitData) @@ -103,7 +109,7 @@ class LimitData { int offset; int ppmCenter; bool symetrical; - char name[6+1]; + char name[LIMITDATA_NAME_LEN+1]; CurveReference curve; QString minToString() const; QString maxToString() const; @@ -120,6 +126,8 @@ class CurvePoint { int8_t y; }; +#define CURVEDATA_NAME_LEN 6 + class CurveData { Q_DECLARE_TR_FUNCTIONS(CurveData) @@ -131,7 +139,7 @@ class CurveData { }; CurveData(); - void clear(int count); + void clear(int count = 5); bool isEmpty() const; QString nameToString(const int idx) const; @@ -139,9 +147,13 @@ class CurveData { bool smooth; int count; CurvePoint points[CPN_MAX_POINTS]; - char name[6+1]; + char name[CURVEDATA_NAME_LEN+1]; }; +#define FLIGHTMODE_NAME_LEN 10 +#define RENC_MAX_VALUE 1024 +#define RENC_MIN_VALUE -RENC_MAX_VALUE + class FlightModeData { Q_DECLARE_TR_FUNCTIONS(FlightModeData) @@ -151,14 +163,20 @@ class FlightModeData { int trimRef[CPN_MAX_TRIMS]; int trim[CPN_MAX_TRIMS]; RawSwitch swtch; - char name[10+1]; + char name[FLIGHTMODE_NAME_LEN+1]; unsigned int fadeIn; unsigned int fadeOut; int rotaryEncoders[CPN_MAX_ENCODERS]; int gvars[CPN_MAX_GVARS]; - void clear(const int phase); - QString nameToString(int index) const; + void clear(const int phaseIdx); + QString nameToString(int phaseIdx) const; void convert(RadioDataConversionState & cstate); + bool isEmpty(int phaseIdx) const; + bool isGVarEmpty(int phaseIdx, int gvIdx) const; + bool isREncEmpty(int phaseIdx, int reIdx) const; + int linkedFlightModeZero(int phaseIdx, int maxOwnValue) const; + int linkedGVarFlightModeZero(int phaseIdx) const; + int linkedREncFlightModeZero(int phaseIdx) const; }; class SwashRingData { diff --git a/companion/src/firmwares/modeldata.cpp b/companion/src/firmwares/modeldata.cpp index a2fdb4981..b72cc328a 100644 --- a/companion/src/firmwares/modeldata.cpp +++ b/companion/src/firmwares/modeldata.cpp @@ -25,6 +25,7 @@ #include "macros.h" #include "radiodataconversionstate.h" #include "helpers.h" +#include "adjustmentreference.h" /* * TimerData @@ -37,6 +38,10 @@ void TimerData::convert(RadioDataConversionState & cstate) mode.convert(cstate); } +bool TimerData::isEmpty() +{ + return (mode == RawSwitch(SWITCH_TYPE_TIMER_MODE, 0) && name[0] == '\0' && minuteBeep == 0 && countdownBeep == COUNTDOWN_SILENT && val == 0 && persistent == 0 /*&& pvalue == 0*/); +} /* * ModelData @@ -60,16 +65,16 @@ ModelData & ModelData::operator = (const ModelData & src) ExpoData * ModelData::insertInput(const int idx) { - memmove(&expoData[idx+1], &expoData[idx], (CPN_MAX_EXPOS-(idx+1))*sizeof(ExpoData)); + memmove(&expoData[idx + 1], &expoData[idx], (CPN_MAX_EXPOS - (idx + 1)) * sizeof(ExpoData)); expoData[idx].clear(); return &expoData[idx]; } bool ModelData::isInputValid(const unsigned int idx) const { - for (int i=0; imode == 0) break; + if (expo->mode == INPUT_MODE_NONE) break; if (expo->chn == idx) return true; } @@ -78,9 +83,9 @@ bool ModelData::isInputValid(const unsigned int idx) const bool ModelData::hasExpos(uint8_t inputIdx) const { - for (int i=0; i ModelData::expos(int input) const { QVector result; - for (int i=0; ichn==input && ed->mode!=0) { + if ((int)ed->chn == input && ed->mode != INPUT_MODE_NONE) { result << ed; } } @@ -113,9 +118,9 @@ QVector ModelData::expos(int input) const QVector ModelData::mixes(int channel) const { QVector result; - for (int i=0; idestCh == channel+1) { + if ((int)md->destCh == channel + 1) { result << md; } } @@ -126,8 +131,8 @@ void ModelData::removeInput(const int idx, bool clearName) { unsigned int chn = expoData[idx].chn; - memmove(&expoData[idx], &expoData[idx+1], (CPN_MAX_EXPOS-(idx+1))*sizeof(ExpoData)); - expoData[CPN_MAX_EXPOS-1].clear(); + memmove(&expoData[idx], &expoData[idx + 1], (CPN_MAX_EXPOS - (idx + 1)) * sizeof(ExpoData)); + expoData[CPN_MAX_EXPOS - 1].clear(); //also remove input name if removing last line for this input if (clearName && !expos(chn).size()) @@ -136,12 +141,12 @@ void ModelData::removeInput(const int idx, bool clearName) void ModelData::clearInputs() { - for (int i=0; igetCapability(VirtualInputs)) { - for (int i=0; ichn = i; expo->mode = INPUT_MODE_BOTH; expo->srcRaw = settings.getDefaultSource(i); expo->weight = 100; - strncpy(inputNames[i], Helpers::removeAccents(expo->srcRaw.toString(this)).toLatin1().constData(), sizeof(inputNames[i])-1); + strncpy(inputNames[i], Helpers::removeAccents(expo->srcRaw.toString(this)).toLatin1().constData(), sizeof(inputNames[i]) - 1); } } } @@ -222,9 +227,9 @@ void ModelData::setDefaultMixes(const GeneralSettings & settings) setDefaultInputs(settings); } - for (int i=0; idestCh = i+1; + mix->destCh = i + 1; mix->weight = 100; if (IS_ARM(board)) { mix->srcRaw = RawSource(SOURCE_TYPE_VIRTUAL_INPUT, i); @@ -240,8 +245,8 @@ void ModelData::setDefaultValues(unsigned int id, const GeneralSettings & settin clear(); used = true; sprintf(name, "MODEL%02d", id+1); - for (int i=0; i 1024; + return flightModeData[phaseIdx].gvars[gvarIdx] > GVAR_MAX_VALUE; } -int ModelData::getGVarFieldValue(int phaseIdx, int gvarIdx) +bool ModelData::isGVarLinkedCircular(int phaseIdx, int gvarIdx) { - int idx = flightModeData[phaseIdx].gvars[gvarIdx]; - for (int i=0; idx>GVAR_MAX_VALUE && i= phaseIdx) nextPhase += 1; + for (int i = 0; i < CPN_MAX_FLIGHT_MODES; i++) { + int val = flightModeData[phaseIdx].gvars[gvarIdx]; + if (phaseIdx == 0 || val <= GVAR_MAX_VALUE) + return false; + int nextPhase = val - (GVAR_MAX_VALUE + 1); + if (nextPhase >= phaseIdx) + nextPhase += 1; phaseIdx = nextPhase; - idx = flightModeData[phaseIdx].gvars[gvarIdx]; } - return idx; + return true; +} + +int ModelData::getGVarValue(int phaseIdx, int gvarIdx) +{ + for (int i = 0; i < CPN_MAX_FLIGHT_MODES; i++) { + int val = flightModeData[phaseIdx].gvars[gvarIdx]; + if (phaseIdx == 0 || val <= GVAR_MAX_VALUE) + return val; + int nextPhase = val - (GVAR_MAX_VALUE + 1); + if (nextPhase >= phaseIdx) + nextPhase += 1; + phaseIdx = nextPhase; + } + return flightModeData[0].gvars[gvarIdx]; // circular linked so return FM0 value +} + +bool ModelData::isREncLinked(int phaseIdx, int reIdx) +{ + return flightModeData[phaseIdx].rotaryEncoders[reIdx] > RENC_MAX_VALUE; +} + +bool ModelData::isREncLinkedCircular(int phaseIdx, int reIdx) +{ + for (int i = 0; i < CPN_MAX_FLIGHT_MODES; i++) { + int val = flightModeData[phaseIdx].rotaryEncoders[reIdx]; + if (phaseIdx == 0 || val <= RENC_MAX_VALUE) + return false; + int nextPhase = val - (RENC_MAX_VALUE + 1); + if (nextPhase >= phaseIdx) + nextPhase += 1; + phaseIdx = nextPhase; + } + return true; +} + +int ModelData::getREncValue(int phaseIdx, int reIdx) +{ + for (int i = 0; i < CPN_MAX_FLIGHT_MODES; i++) { + int val = flightModeData[phaseIdx].rotaryEncoders[reIdx]; + if (phaseIdx == 0 || val <= RENC_MAX_VALUE) + return val; + int nextPhase = val - (RENC_MAX_VALUE + 1); + if (nextPhase >= phaseIdx) + nextPhase += 1; + phaseIdx = nextPhase; + } + return flightModeData[0].rotaryEncoders[reIdx]; // circular linked so return FM0 value } void ModelData::setTrimValue(int phaseIdx, int trimIdx, int value) { - for (uint8_t i=0; i= 126 && var <= 130) - var = flightModeData[0].gvars[var-126]; + var = flightModeData[0].gvars[var - 126]; else if (var <= -126 && var >= -130) - var = - flightModeData[0].gvars[-126-var]; + var = - flightModeData[0].gvars[-126 - var]; } ModelData ModelData::removeGlobalVars() { ModelData result = *this; - for (int i=0; isize() <= MAX_REF_UPDATES) + updRefList->append(UpdateReferenceParams(type, action, index1, index2, shift)); + else + qDebug() << "Warning: Update ignored as the list of updates exceeds " << MAX_REF_UPDATES; + } +} + +int ModelData::updateAllReferences(const ReferenceUpdateType type, const ReferenceUpdateAction action, const int index1, const int index2, const int shift) +{ + //Stopwatch s1("ModelData::updateAllReferences"); + //s1.report("Start"); + + int loopcnt = 0; + int updcnt = 0; + updRefList = nullptr; + QVector updRefParams; // declaring this variable in ModelData class crashes program on opening model file + updRefList = &updRefParams; // so declare pointer variable in ModelData class and pass it the address of the local array + + if (updRefList) { + appendUpdateReferenceParams(type, action, index1, index2, shift); + + while (!updRefList->isEmpty()) + { + if (++loopcnt > MAX_REF_UPDATES) { + qDebug() << "Warning: Update iterations terminated early as the list exceeded " << MAX_REF_UPDATES; + break; + } + //qDebug() << "Start of iteration:" << loopcnt; + updcnt += updateReference(); + updRefList->removeFirst(); + } + } + + qDebug() << "Iterations:" << loopcnt << " References updated:" << updcnt; + //s1.report("Finish"); + + return updcnt; +} + +int ModelData::updateReference() +{ + UpdateReferenceParams p = updRefList->first(); + + if (p.action < REF_UPD_ACT_CLEAR || p.action > REF_UPD_ACT_SWAP || p.type < REF_UPD_TYPE_CHANNEL || p.type > REF_UPD_TYPE_TIMER) { + qDebug() << "Error - invalid parameters" << " > type:" << p.type << " action:" << p.action << " index1:" << p.index1 << " index2:" << p.index2 << " shift:" << p.shift; + return 0; + } + + memset(&updRefInfo, 0, sizeof(updRefInfo)); + updRefInfo.type = p.type; + updRefInfo.action = p.action; + updRefInfo.index1 = abs(p.index1); + updRefInfo.index2 = abs(p.index2); + updRefInfo.shift = p.shift; + + if ((updRefInfo.action == REF_UPD_ACT_SWAP && updRefInfo.index1 == updRefInfo.index2) || (updRefInfo.action == REF_UPD_ACT_SHIFT && updRefInfo.shift == 0)) { + qDebug() << "Warning - nothing to do" << " > type:" << updRefInfo.type << " action:" << updRefInfo.action << " index1:" << updRefInfo.index1 << " index2:" << updRefInfo.index2 << " shift:" << updRefInfo.shift; + return 0; + } + + //Stopwatch s1("ModelData::updateReference"); + //s1.report("Start"); + + Firmware *fw = getCurrentFirmware(); + + switch (updRefInfo.type) + { + case REF_UPD_TYPE_CHANNEL: + updRefInfo.srcType = SOURCE_TYPE_CH; + updRefInfo.maxindex = fw->getCapability(Outputs); + break; + case REF_UPD_TYPE_CURVE: + updRefInfo.maxindex = fw->getCapability(NumCurves); + break; + case REF_UPD_TYPE_FLIGHT_MODE: + updRefInfo.swtchType = SWITCH_TYPE_FLIGHT_MODE; + updRefInfo.maxindex = fw->getCapability(FlightModes); + break; + case REF_UPD_TYPE_GLOBAL_VARIABLE: + updRefInfo.srcType = SOURCE_TYPE_GVAR; + updRefInfo.maxindex = fw->getCapability(Gvars); + break; + case REF_UPD_TYPE_INPUT: + updRefInfo.srcType = SOURCE_TYPE_VIRTUAL_INPUT; + updRefInfo.maxindex = fw->getCapability(VirtualInputs); + break; + case REF_UPD_TYPE_LOGICAL_SWITCH: + updRefInfo.srcType = SOURCE_TYPE_CUSTOM_SWITCH; + updRefInfo.swtchType = SWITCH_TYPE_VIRTUAL; + updRefInfo.maxindex = fw->getCapability(LogicalSwitches); + break; + case REF_UPD_TYPE_SCRIPT: + updRefInfo.srcType = SOURCE_TYPE_LUA_OUTPUT; + updRefInfo.maxindex = fw->getCapability(LuaScripts); + break; + case REF_UPD_TYPE_SENSOR: + updRefInfo.srcType = SOURCE_TYPE_TELEMETRY; + updRefInfo.swtchType = SWITCH_TYPE_SENSOR; + updRefInfo.maxindex = fw->getCapability(Sensors); + break; + case REF_UPD_TYPE_TIMER: + updRefInfo.srcType = SOURCE_TYPE_SPECIAL; + updRefInfo.maxindex = fw->getCapability(Timers); + // rawsource index offset TODO refactor timers so be own category + updRefInfo.index1 += 2; + updRefInfo.index2 += 2; + updRefInfo.maxindex += 2; + break; + default: + qDebug() << "Error - unhandled reference type:" << updRefInfo.type; + return 0; + } + + updRefInfo.maxindex--; // getCapabilities and constants are 1 based + + //qDebug() << "updRefInfo - type:" << updRefInfo.type << " action:" << updRefInfo.action << " index1:" << updRefInfo.index1 << " index2:" << updRefInfo.index2 << " shift:" << updRefInfo.shift; + //qDebug() << "maxindex:" << updRefInfo.maxindex << "updRefInfo - srcType:" << updRefInfo.srcType << " swtchType:" << updRefInfo.swtchType; + + //s1.report("Initialise"); + + for (int i = fw->getCapability(NumFirstUsableModule); i < fw->getCapability(NumModules); i++) { + ModuleData *md = &moduleData[i]; + if (md->protocol != PULSES_OFF && md->failsafeMode == FAILSAFE_CUSTOM && md->hasFailsafes(fw)) + updateModuleFailsafes(md); + } + //s1.report("Modules"); + + for (int i = 0; i < CPN_MAX_TIMERS; i++) { + TimerData *td = &timers[i]; + if (!td->isModeOff()) { + updateTimerMode(td->mode); + if (td->isModeOff()) + appendUpdateReferenceParams(REF_UPD_TYPE_TIMER, REF_UPD_ACT_CLEAR, i); + } + } + //s1.report("Timers"); + + for (int i = 1; i < CPN_MAX_FLIGHT_MODES; i++) { // skip FM0 as switch not used + FlightModeData *fmd = &flightModeData[i]; + if (fmd->swtch.isSet()) { + updateSwitchRef(fmd->swtch); + if(!fmd->swtch.isSet()) + appendUpdateReferenceParams(REF_UPD_TYPE_FLIGHT_MODE, REF_UPD_ACT_CLEAR, i); + } + } + //s1.report("Flight Modes"); + + for (int i = 0; i < CPN_MAX_EXPOS; i++) { + ExpoData *ed = &expoData[i]; + if (!ed->isEmpty()) { + updateSourceRef(ed->srcRaw); + if (ed->srcRaw.isSet()) { + updateSwitchRef(ed->swtch); + updateCurveRef(ed->curve); + updateAdjustRef(ed->weight); + updateAdjustRef(ed->offset); + updateFlightModeFlags(ed->flightModes); + } + else { + unsigned int chnsave = ed->chn; + removeInput(i); + i--; + if (!hasExpos(chnsave)) + appendUpdateReferenceParams(REF_UPD_TYPE_INPUT, REF_UPD_ACT_CLEAR, chnsave); + } + } + } + //s1.report("Inputs"); + + for (int i = 0; i < CPN_MAX_MIXERS; i++) { + MixData *md = &mixData[i]; + if (!md->isEmpty()) { + updateDestCh(md); + if (!md->isEmpty()) { + updateSourceRef(md->srcRaw); + if (md->srcRaw.isSet()) { + updateSwitchRef(md->swtch); + updateCurveRef(md->curve); + updateAdjustRef(md->weight); + updateAdjustRef(md->sOffset); + updateFlightModeFlags(md->flightModes); + } + else { + removeMix(i); + i--; + } + } + } + } + //s1.report("Mixes"); + + for (int i = 0; i < CPN_MAX_CHNOUT; i++) { + LimitData *ld = &limitData[i]; + if (!ld->isEmpty()) { + updateAdjustRef(ld->min); + updateAdjustRef(ld->max); + updateAdjustRef(ld->offset); + updateLimitCurveRef(ld->curve); + } + } + //s1.report("Outputs"); + + for (int i = 0; i < CPN_MAX_LOGICAL_SWITCHES; i++) { + LogicalSwitchData *lsd = &logicalSw[i]; + if (!lsd->isEmpty()) { + bool clearlsd = false; + CSFunctionFamily family = lsd->getFunctionFamily(); + switch(family) { + case LS_FAMILY_VOFS: + updateSourceIntRef(lsd->val1); + if (lsd->val1 == 0) + clearlsd = true; + break; + case LS_FAMILY_STICKY: + case LS_FAMILY_VBOOL: + updateSwitchIntRef(lsd->val1); + updateSwitchIntRef(lsd->val2); + if (lsd->val1 == 0 && lsd->val2 == 0) + clearlsd = true; + break; + case LS_FAMILY_EDGE: + updateSwitchIntRef(lsd->val1); + if (lsd->val1 == 0) + clearlsd = true; + break; + case LS_FAMILY_VCOMP: + updateSourceIntRef(lsd->val1); + updateSourceIntRef(lsd->val2); + if (lsd->val1 == 0 && lsd->val2 == 0) + clearlsd = true; + break; + default: + break; + } + if (clearlsd) { + lsd->clear(); + appendUpdateReferenceParams(REF_UPD_TYPE_LOGICAL_SWITCH, REF_UPD_ACT_CLEAR, i); + } + else { + updateSwitchIntRef(lsd->andsw); + } + } + } + //s1.report("Logical Switches"); + + for (int i = 0; i < CPN_MAX_SPECIAL_FUNCTIONS; i++) { + CustomFunctionData *cfd = &customFn[i]; + if (!cfd->isEmpty()) { + updateAssignFunc(cfd); + if (!cfd->isEmpty()) { + updateSwitchRef(cfd->swtch); + if (cfd->func == FuncVolume || cfd->func == FuncPlayValue || (cfd->func >= FuncAdjustGV1 && cfd->func <= FuncAdjustGVLast && (cfd->adjustMode == FUNC_ADJUST_GVAR_GVAR || cfd->adjustMode == FUNC_ADJUST_GVAR_SOURCE))) { + updateSourceIntRef(cfd->param); + if (cfd->param == 0) + cfd->clear(); + } + } + } + } + //s1.report("Special Functions"); + + if (fw->getCapability(Heli)) { + updateSourceRef(swashRingData.aileronSource); + updateSourceRef(swashRingData.collectiveSource); + updateSourceRef(swashRingData.elevatorSource); + //s1.report("Heli"); + } + + if (fw->getCapability(Telemetry)) { + updateTelemetryRef(frsky.voltsSource); + updateTelemetryRef(frsky.altitudeSource); + updateTelemetryRef(frsky.currentSource); + updateTelemetryRef(frsky.varioSource); + for (int i = 0; i < fw->getCapability(TelemetryCustomScreens); i++) { + switch(frsky.screens[i].type) { + case TELEMETRY_SCREEN_BARS: + for (int j = 0; j < fw->getCapability(TelemetryCustomScreensBars); j++) { + FrSkyBarData *fbd = &frsky.screens[i].body.bars[j]; + updateSourceRef(fbd->source); + if (!fbd->source.isSet()) { + fbd->barMin = 0; + fbd->barMax = 0; + } + } + break; + case TELEMETRY_SCREEN_NUMBERS: + for (int j = 0; j < fw->getCapability(TelemetryCustomScreensLines); j++) { + FrSkyLineData *fld = &frsky.screens[i].body.lines[j]; + for (int k = 0; k < fw->getCapability(TelemetryCustomScreensFieldsPerLine); k++) { + updateSourceRef(fld->source[k]); + } + } + break; + default: + break; + } + } + //s1.report("Telemetry"); + } + + // TODO maybe less risk to leave it up to the user?? + /* + for (int i = 0; i < CPN_MAX_SENSORS; i++) { + SensorData *sd = &sensorData[i]; + if (sd->isAvailable() && sd->type == SensorData::TELEM_TYPE_CALCULATED) { + } + } + s1.report("Telemetry Sensors"); + */ + + // TODO needs lua incorporated into Companion as script needs to be parsed to determine if input field is source or value + /* + for (int i=0; i < CPN_MAX_SCRIPTS; i++) { + ScriptData *sd = &scriptData[i]; + if (sd->filename[0] != '\0') { + for (int j = 0; j < CPN_MAX_SCRIPT_INPUTS; j++) { + // get input parameters and for each one where type is SOURCE + if(inputtype = "SOURCE") + updateSourceIntRef(sd->inputs[j]); + } + } + } + s1.report("Custom Scripts"); + */ + + // TODO Horus CustomScreenData and TopBarData will need checking for updates but Companion does not current handle ie just data blobs refer modeldata.h + + qDebug() << "References updated this iteration:" << updRefInfo.updcnt; + //s1.report("Finish"); + + return updRefInfo.updcnt; +} + +template +void ModelData::updateTypeIndexRef(R & curRef, const T type, const int idxAdj, const bool defClear, const int defType, const int defIndex) +{ + //qDebug() << "Raw value: " << curRef.toValue() << " String:" << curRef.toString() << " Type: " << curRef.type << " Index:" << curRef.index << " idxAdj:" << idxAdj << " defClear:" << defClear << " defType:" << defType << " defIndex:" << defIndex; + if (!curRef.isSet() || curRef.type != type) + return; + + R newRef; + newRef.type = curRef.type; + newRef.index = abs(curRef.index); + + switch (updRefInfo.action) + { + case REF_UPD_ACT_CLEAR: + if (newRef.index != (updRefInfo.index1 + idxAdj)) + return; + if (defClear) + newRef.clear(); + else { + newRef.type = (T)defType; + newRef.index = defIndex; + } + break; + case REF_UPD_ACT_SHIFT: + if (newRef.index < (updRefInfo.index1 + idxAdj)) + return; + + newRef.index += updRefInfo.shift; + + if (newRef.index < (updRefInfo.index1 + idxAdj) || newRef.index > (updRefInfo.maxindex + idxAdj)) { + if (defClear) + newRef.clear(); + else { + newRef.type = (T)defType; + newRef.index = defIndex; + } + } + break; + case REF_UPD_ACT_SWAP: + if (newRef.index == updRefInfo.index1 + idxAdj) + newRef.index = updRefInfo.index2 + idxAdj; + else if (newRef.index == updRefInfo.index2 + idxAdj) + newRef.index = updRefInfo.index1 + idxAdj; + break; + default: + qDebug() << "Error - unhandled action:" << updRefInfo.action; + return; + } + + if (curRef.type != newRef.type || abs(curRef.index) != newRef.index) { + newRef.index = curRef.index < 0 ? -newRef.index : newRef.index; + //qDebug() << "Updated reference: " << curRef.toString() << " -> " << newRef.toString(); + curRef = newRef; + updRefInfo.updcnt++; + } +} + +template +void ModelData::updateTypeValueRef(R & curRef, const T type, const int idxAdj, const bool defClear, const int defType, const int defValue) +{ + //qDebug() << " String:" << curRef.toString() << " Type: " << curRef.type << " Value:" << curRef.value; + if (!curRef.isSet() || curRef.type != type) + return; + + R newRef; + newRef.type = curRef.type; + newRef.value = abs(curRef.value); + + switch (updRefInfo.action) + { + case REF_UPD_ACT_CLEAR: + if (newRef.value != (updRefInfo.index1 + idxAdj)) + return; + if (defClear) + newRef.clear(); + else { + newRef.type = (T)defType; + newRef.value = defValue; + } + break; + case REF_UPD_ACT_SHIFT: + if (newRef.value < (updRefInfo.index1 + idxAdj)) + return; + + newRef.value += updRefInfo.shift; + + if (newRef.value < (updRefInfo.index1 + idxAdj) || newRef.value > (updRefInfo.maxindex + idxAdj)) { + if (defClear) + newRef.clear(); + else { + newRef.type = (T)defType; + newRef.value = defValue; + } + } + break; + case REF_UPD_ACT_SWAP: + if (newRef.value == updRefInfo.index1 + idxAdj) + newRef.value = updRefInfo.index2 + idxAdj; + else if (newRef.value == updRefInfo.index2 + idxAdj) + newRef.value = updRefInfo.index1 + idxAdj; + break; + default: + qDebug() << "Error - unhandled action:" << updRefInfo.action; + return; + } + + if (curRef.type != newRef.type || abs(curRef.value) != newRef.value) { + newRef.value = curRef.value < 0 ? -newRef.value : newRef.value; + //qDebug() << "Updated reference: " << curRef.toString() << " -> " << newRef.toString(); + curRef = newRef; + updRefInfo.updcnt++; + } +} + +void ModelData::updateCurveRef(CurveReference & crv) +{ + if (updRefInfo.type == REF_UPD_TYPE_GLOBAL_VARIABLE && (crv.type == CurveReference::CURVE_REF_DIFF || crv.type == CurveReference::CURVE_REF_EXPO)) + updateAdjustRef(crv.value); + else if (updRefInfo.type == REF_UPD_TYPE_CURVE && crv.type == CurveReference::CURVE_REF_CUSTOM) + updateTypeValueRef(crv, CurveReference::CURVE_REF_CUSTOM, 1); +} + +void ModelData::updateLimitCurveRef(CurveReference & crv) +{ + CurveReference src = CurveReference(CurveReference::CURVE_REF_CUSTOM, crv.value); + updateCurveRef(src); + if (crv.value != src.value) + crv.value = src.value; +} + +void ModelData::updateAdjustRef(int & value) +{ + if (updRefInfo.type != REF_UPD_TYPE_GLOBAL_VARIABLE) + return; + + AdjustmentReference adj = AdjustmentReference(value); + updateTypeValueRef(adj, AdjustmentReference::ADJUST_REF_GVAR, 1); + if (value != adj.toValue()) + value = adj.toValue(); +} + +void ModelData::updateAssignFunc(CustomFunctionData * cfd) +{ + const int invalidateRef = -1; + int newRef = (int)cfd->func; + int idxAdj; + + switch (updRefInfo.type) + { + case REF_UPD_TYPE_CHANNEL: + if(cfd->func < FuncOverrideCH1 || cfd->func > FuncOverrideCH32) // TODO refactor to FuncOverrideCHLast + return; + idxAdj = FuncOverrideCH1; + break; + case REF_UPD_TYPE_GLOBAL_VARIABLE: + if (cfd->func < FuncAdjustGV1 || cfd->func > FuncAdjustGVLast) + return; + idxAdj = FuncAdjustGV1; + break; + case REF_UPD_TYPE_TIMER: + if (cfd->func < FuncSetTimer1 || cfd->func > FuncSetTimer3) // TODO refactor to FuncSetTimerLast + return; + idxAdj = FuncSetTimer1 - 2; // reverse earlier offset requiured for rawsource + break; + default: + return; + } + + switch (updRefInfo.action) + { + case REF_UPD_ACT_CLEAR: + if (newRef != (updRefInfo.index1 + idxAdj)) + return; + newRef = invalidateRef; + break; + case REF_UPD_ACT_SHIFT: + if (newRef < (updRefInfo.index1 + idxAdj)) + return; + + newRef += updRefInfo.shift; + + if (newRef < (updRefInfo.index1 + idxAdj) || newRef > (updRefInfo.maxindex + idxAdj)) + newRef = invalidateRef; + break; + case REF_UPD_ACT_SWAP: + if (newRef == updRefInfo.index1 + idxAdj) + newRef = updRefInfo.index2 + idxAdj; + else if (newRef == updRefInfo.index2 + idxAdj) + newRef = updRefInfo.index1 + idxAdj; + break; + default: + qDebug() << "Error - unhandled action:" << updRefInfo.action; + return; + } + + if (newRef == invalidateRef) { + cfd->clear(); + //qDebug() << "Function cleared"; + updRefInfo.updcnt++; + } + else if (cfd->func != (AssignFunc)newRef) { + //qDebug() << "Updated reference:" << cfd->func << " -> " << newRef; + cfd->func = (AssignFunc)newRef; + updRefInfo.updcnt++; + } +} + +void ModelData::updateDestCh(MixData * md) +{ + if (updRefInfo.type != REF_UPD_TYPE_CHANNEL) + return; + + const int invalidateRef = -1; + const int idxAdj = 1; + int newRef = md->destCh; + switch (updRefInfo.action) + { + case REF_UPD_ACT_CLEAR: + if (newRef != (updRefInfo.index1 + idxAdj)) + return; + newRef = invalidateRef; + break; + case REF_UPD_ACT_SHIFT: + if (newRef < (updRefInfo.index1 + idxAdj)) + return; + + newRef += updRefInfo.shift; + + if (newRef < (updRefInfo.index1 + idxAdj) || newRef > (updRefInfo.maxindex + idxAdj)) + newRef = invalidateRef; + break; + case REF_UPD_ACT_SWAP: + if (newRef == updRefInfo.index1 + idxAdj) + newRef = updRefInfo.index2 + idxAdj; + else if (newRef == updRefInfo.index2 + idxAdj) + newRef = updRefInfo.index1 + idxAdj; + break; + default: + qDebug() << "Error - unhandled action:" << updRefInfo.action; + return; + } + + if (newRef == invalidateRef) { + md->clear(); + //qDebug() << "Mix cleared"; + updRefInfo.updcnt++; + } + else if (md->destCh != static_cast(newRef)) { + //qDebug() << "Updated reference:" << md->destCh << " -> " << newRef; + md->destCh = newRef; + updRefInfo.updcnt++; + } +} + +void ModelData::updateFlightModeFlags(unsigned int & curRef) +{ + if (updRefInfo.type != REF_UPD_TYPE_FLIGHT_MODE || curRef == 0 /*all selected*/ || curRef == 511 /*all deselected*/) + return; + + if (updRefInfo.index1 > CPN_MAX_FLIGHT_MODES || updRefInfo.index2 > CPN_MAX_FLIGHT_MODES) + return; + + unsigned int newRef = curRef; + bool flag[CPN_MAX_FLIGHT_MODES]; + bool f; + + int mask = 1; + for (int i = 0; i < CPN_MAX_FLIGHT_MODES; i++) { + flag[i] = curRef & mask; + mask <<= 1; + } + + switch (updRefInfo.action) + { + case REF_UPD_ACT_CLEAR: + flag[updRefInfo.index1] = false; + break; + case REF_UPD_ACT_SHIFT: + if(updRefInfo.shift < 0) { + for (int i = updRefInfo.index1; i < CPN_MAX_FLIGHT_MODES; i++) { + if (i - updRefInfo.shift <= updRefInfo.maxindex) + flag[i] = flag[i - updRefInfo.shift]; + else + flag[i] = false; + } + } + else { + for (int i = CPN_MAX_FLIGHT_MODES - 1; i >= updRefInfo.index1; i--) { + if (i - updRefInfo.shift >= updRefInfo.index1) + flag[i] = flag[i - updRefInfo.shift]; + else + flag[i] = false; + } + } + break; + case REF_UPD_ACT_SWAP: + f = flag[updRefInfo.index1]; + flag[updRefInfo.index1] = flag[updRefInfo.index2]; + flag[updRefInfo.index2] = f; + break; + default: + qDebug() << "Error - unhandled action:" << updRefInfo.action; + return; + } + + newRef = 0; + for (int i = CPN_MAX_FLIGHT_MODES - 1; i >= 0 ; i--) { + if (flag[i]) + newRef++; + newRef <<= 1; + } + newRef >>= 1; + + if (curRef != newRef) { + //qDebug() << "Updated reference:" << curRef << " -> " << newRef; + curRef = newRef; + updRefInfo.updcnt++; + } +} + +void ModelData::updateTelemetryRef(unsigned int & curRef) +{ + if (updRefInfo.type != REF_UPD_TYPE_SENSOR) + return; + + const int idxAdj = 1; + int newRef = curRef; + switch (updRefInfo.action) + { + case REF_UPD_ACT_CLEAR: + if (newRef != (updRefInfo.index1 + idxAdj)) + return; + newRef = 0; + break; + case REF_UPD_ACT_SHIFT: + if (newRef < (updRefInfo.index1 + idxAdj)) + return; + + newRef += updRefInfo.shift; + + if (newRef < (updRefInfo.index1 + idxAdj) || newRef > (updRefInfo.maxindex + idxAdj)) + newRef = 0; + break; + case REF_UPD_ACT_SWAP: + if (newRef == updRefInfo.index1 + idxAdj) + newRef = updRefInfo.index2 + idxAdj; + else if (newRef == updRefInfo.index2 + idxAdj) + newRef = updRefInfo.index1 + idxAdj; + break; + default: + qDebug() << "Error - unhandled action:" << updRefInfo.action; + return; + } + + if (curRef != static_cast(newRef)) { + //qDebug() << "Updated reference:" << curRef << " -> " << newRef; + curRef = newRef; + updRefInfo.updcnt++; + } +} + +void ModelData::updateModuleFailsafes(ModuleData * md) +{ + if (updRefInfo.type != REF_UPD_TYPE_CHANNEL) + return; + + bool updated = false; + + switch (updRefInfo.action) + { + case REF_UPD_ACT_CLEAR: + break; + case REF_UPD_ACT_SHIFT: + if (updRefInfo.shift == 0 || updRefInfo.index1 < 0 || updRefInfo.index1 > CPN_MAX_CHNOUT - 1) + return; + + if (updRefInfo.shift > 0) { + for (int i = (CPN_MAX_CHNOUT - 1); i > updRefInfo.index1; i--) { + md->failsafeChannels[i] = md->failsafeChannels[i - 1]; + } + md->failsafeChannels[updRefInfo.index1] = 0; + } + else { + for (int i = (updRefInfo.index1 + 1); i < (CPN_MAX_CHNOUT - 1); i++) { + md->failsafeChannels[i - 1] = md->failsafeChannels[i]; + } + md->failsafeChannels[CPN_MAX_CHNOUT - 1] = 0; + } + updated = true; + break; + case REF_UPD_ACT_SWAP: + int tmp; + if (updRefInfo.index1 >= 0 && updRefInfo.index1 < CPN_MAX_CHNOUT) { + updated = true; + tmp = md->failsafeChannels[updRefInfo.index1]; + if (updRefInfo.index2 >= 0 && updRefInfo.index2 < CPN_MAX_CHNOUT) + md->failsafeChannels[updRefInfo.index1] = md->failsafeChannels[updRefInfo.index2]; + else + md->failsafeChannels[updRefInfo.index1] = 0; + } + else + tmp = 0; + if (updRefInfo.index2 >= 0 && updRefInfo.index2 < CPN_MAX_CHNOUT) + updated = true; + md->failsafeChannels[updRefInfo.index2] = tmp; + break; + default: + qDebug() << "Error - unhandled action:" << updRefInfo.action; + return; + } + + if (updated) { + //qDebug() << "Updated module failsafes"; + updRefInfo.updcnt++; + } +} + +int ModelData::linkedFlightModeIndexToValue(const int phaseIdx, const int useFmIdx, const int maxOwnValue) +{ + int val; + + if (phaseIdx == useFmIdx || phaseIdx < 0 || phaseIdx > (CPN_MAX_FLIGHT_MODES - 1) || useFmIdx < 0 || useFmIdx > (CPN_MAX_FLIGHT_MODES - 1)) + val = flightModeData[phaseIdx].linkedFlightModeZero(phaseIdx, maxOwnValue); + else + val = maxOwnValue + useFmIdx + (useFmIdx >= phaseIdx ? 0 : 1); + + return val; +} + +int ModelData::linkedFlightModeValueToIndex(const int phaseIdx, const int val, const int maxOwnValue) +{ + int idx = val - maxOwnValue - 1; + if (idx >= phaseIdx) + idx += 1; + return idx; +} + +int ModelData::getGVarFlightModeIndex(const int phaseIdx, const int gvarIdx) +{ + if (!isGVarLinked(phaseIdx, gvarIdx)) + return -1; + return (linkedFlightModeValueToIndex(phaseIdx, flightModeData[phaseIdx].gvars[gvarIdx], GVAR_MAX_VALUE)); +} + +void ModelData::setGVarFlightModeIndexToValue(const int phaseIdx, const int gvarIdx, const int useFmIdx) +{ + flightModeData[phaseIdx].gvars[gvarIdx] = linkedFlightModeIndexToValue(phaseIdx, useFmIdx, GVAR_MAX_VALUE); +} + +int ModelData::getREncFlightModeIndex(const int phaseIdx, const int reIdx) +{ + if (!isREncLinked(phaseIdx, reIdx)) + return -1; + return (linkedFlightModeValueToIndex(phaseIdx, flightModeData[phaseIdx].rotaryEncoders[reIdx], RENC_MAX_VALUE)); +} + +void ModelData::setREncFlightModeIndexToValue(const int phaseIdx, const int reIdx, const int useFmIdx) +{ + flightModeData[phaseIdx].rotaryEncoders[reIdx] = linkedFlightModeIndexToValue(phaseIdx, useFmIdx, RENC_MAX_VALUE); +} + +bool ModelData::isExpoParent(const int index) +{ + const ExpoData &ed = expoData[index]; + const QVector chexpos = expos(ed.chn); + return chexpos.constFirst() == &ed; +} + +bool ModelData::isExpoChild(const int index) +{ + const ExpoData &ed = expoData[index]; + const QVector chexpos = expos(ed.chn); + return chexpos.constFirst() != &ed; +} + +bool ModelData::hasExpoChildren(const int index) +{ + const ExpoData &ed = expoData[index]; + const QVector chexpos = expos(ed.chn); + return chexpos.constFirst() == &ed && chexpos.constLast() != &ed; +} + +bool ModelData::hasExpoSiblings(const int index) +{ + const ExpoData &ed = expoData[index]; + const QVector chexpos = expos(ed.chn); + return !isExpoParent(index) && chexpos.size() > 2; +} + +void ModelData::removeMix(const int idx) +{ + memmove(&mixData[idx], &mixData[idx + 1], (CPN_MAX_MIXERS - (idx + 1)) * sizeof(MixData)); + mixData[CPN_MAX_MIXERS - 1].clear(); +} diff --git a/companion/src/firmwares/modeldata.h b/companion/src/firmwares/modeldata.h index c4959d456..93e98588e 100644 --- a/companion/src/firmwares/modeldata.h +++ b/companion/src/firmwares/modeldata.h @@ -76,6 +76,8 @@ class TimerData { int pvalue; void clear() { memset(reinterpret_cast(this), 0, sizeof(TimerData)); mode = RawSwitch(SWITCH_TYPE_TIMER_MODE, 0); } void convert(RadioDataConversionState & cstate); + bool isEmpty(); + bool isModeOff() { return mode == RawSwitch(SWITCH_TYPE_TIMER_MODE, 0); } }; #define CPN_MAX_SCRIPTS 9 @@ -128,6 +130,8 @@ enum TrainerMode { TRAINER_MODE_MULTI }; +#define INPUT_NAME_LEN 4 + class ModelData { Q_DECLARE_TR_FUNCTIONS(ModelData) @@ -170,7 +174,7 @@ class ModelData { MixData mixData[CPN_MAX_MIXERS]; LimitData limitData[CPN_MAX_CHNOUT]; - char inputNames[CPN_MAX_INPUTS][4+1]; + char inputNames[CPN_MAX_INPUTS][INPUT_NAME_LEN+1]; ExpoData expoData[CPN_MAX_EXPOS]; CurveData curves[CPN_MAX_CURVES]; @@ -219,11 +223,23 @@ class ModelData { void setTrimValue(int phaseIdx, int trimIdx, int value); bool isGVarLinked(int phaseIdx, int gvarIdx); - int getGVarFieldValue(int phaseIdx, int gvarIdx); - float getGVarFieldValuePrec(int phaseIdx, int gvarIdx); + bool isGVarLinkedCircular(int phaseIdx, int gvarIdx); + int getGVarValue(int phaseIdx, int gvarIdx); + float getGVarValuePrec(int phaseIdx, int gvarIdx); + int getGVarFlightModeIndex(const int phaseIdx, const int gvarIdx); + void setGVarFlightModeIndexToValue(const int phaseIdx, const int gvarIdx, const int useFmIdx); + + bool isREncLinked(int phaseIdx, int reIdx); + bool isREncLinkedCircular(int phaseIdx, int reIdx); + int getREncValue(int phaseIdx, int reIdx); + int getREncFlightModeIndex(const int phaseIdx, const int reIdx); + void setREncFlightModeIndexToValue(const int phaseIdx, const int reIdx, const int useFmIdx); ModelData removeGlobalVars(); + int linkedFlightModeIndexToValue(const int phaseIdx, const int useFmIdx, const int maxOwnValue); + int linkedFlightModeValueToIndex(const int phaseIdx, const int val, const int maxOwnValue); + void clearMixes(); void clearInputs(); @@ -231,8 +247,95 @@ class ModelData { bool isAvailable(const RawSwitch & swtch) const; + enum ReferenceUpdateAction { + REF_UPD_ACT_CLEAR, + REF_UPD_ACT_SHIFT, + REF_UPD_ACT_SWAP, + }; + + enum ReferenceUpdateType { + REF_UPD_TYPE_CHANNEL, + REF_UPD_TYPE_CURVE, + REF_UPD_TYPE_FLIGHT_MODE, + REF_UPD_TYPE_GLOBAL_VARIABLE, + REF_UPD_TYPE_INPUT, + REF_UPD_TYPE_LOGICAL_SWITCH, + REF_UPD_TYPE_SCRIPT, + REF_UPD_TYPE_SENSOR, + REF_UPD_TYPE_TIMER, + }; + + struct UpdateReferenceParams + { + ReferenceUpdateType type; + ReferenceUpdateAction action; + int index1; + int index2; + int shift; + + UpdateReferenceParams() {} + UpdateReferenceParams(ReferenceUpdateType t, ReferenceUpdateAction a, int i1, int i2 = 0, int s = 0) : + type(t), action(a), index1(i1), index2(i2), shift(s) {} + }; + + int updateAllReferences(const ReferenceUpdateType type, const ReferenceUpdateAction action, const int index1, const int index2 = 0, const int shift = 0); + bool isExpoParent(const int index); + bool isExpoChild(const int index); + bool hasExpoChildren(const int index); + bool hasExpoSiblings(const int index); + void removeMix(const int idx); + protected: void removeGlobalVar(int & var); + + private: + QVector *updRefList = nullptr; + + struct UpdateReferenceInfo + { + ReferenceUpdateType type; + ReferenceUpdateAction action; + int index1; + int index2; + int shift; + int updcnt; + int maxindex; + RawSourceType srcType; + RawSwitchType swtchType; + }; + UpdateReferenceInfo updRefInfo; + + int updateReference(); + void appendUpdateReferenceParams(const ReferenceUpdateType type, const ReferenceUpdateAction action, const int index1, const int index2 = 0, const int shift = 0); + template + void updateTypeIndexRef(R & curref, const T type, const int idxAdj = 0, const bool defClear = true, const int defType = 0, const int defIndex = 0); + template + void updateTypeValueRef(R & curref, const T type, const int idxAdj = 0, const bool defClear = true, const int defType = 0, const int defValue = 0); + void updateAdjustRef(int & adj); + void updateAssignFunc(CustomFunctionData * cfd); + void updateCurveRef(CurveReference & crv); + void updateDestCh(MixData * md); + void updateLimitCurveRef(CurveReference & crv); + void updateFlightModeFlags(unsigned int & flags); + void updateTelemetryRef(unsigned int & idx); + void updateModuleFailsafes(ModuleData * md); + inline void updateSourceRef(RawSource & src) { updateTypeIndexRef(src, updRefInfo.srcType); } + inline void updateSwitchRef(RawSwitch & swtch) { updateTypeIndexRef(swtch, updRefInfo.swtchType, 1); } + inline void updateTimerMode(RawSwitch & swtch) { updateTypeIndexRef(swtch, updRefInfo.swtchType, 1, false, (int)SWITCH_TYPE_TIMER_MODE, 0); } + inline void updateSourceIntRef(int & value) + { + RawSource src = RawSource(value); + updateTypeIndexRef(src, updRefInfo.srcType); + if (value != src.toValue()) + value = src.toValue(); + } + inline void updateSwitchIntRef(int & value) + { + RawSwitch swtch = RawSwitch(value); + updateTypeIndexRef(swtch, updRefInfo.swtchType, 1); + if (value != swtch.toValue()) + value = swtch.toValue(); + } }; #endif // MODELDATA_H diff --git a/companion/src/firmwares/moduledata.cpp b/companion/src/firmwares/moduledata.cpp index a227dd5b8..370a6979b 100644 --- a/companion/src/firmwares/moduledata.cpp +++ b/companion/src/firmwares/moduledata.cpp @@ -181,3 +181,59 @@ QStringList ModuleData::powerValueStrings(int subType, Firmware * fw) strIdx += 2; return strings[strIdx]; } + +bool ModuleData::hasFailsafes(Firmware * fw) const +{ + return fw->getCapability(HasFailsafe) && ( + protocol == PULSES_ACCESS_ISRM || + protocol == PULSES_ACCST_ISRM_D16 || + protocol == PULSES_PXX_XJT_X16 || + protocol == PULSES_PXX_R9M || + protocol == PULSES_ACCESS_R9M || + protocol == PULSES_ACCESS_R9M_LITE || + protocol == PULSES_ACCESS_R9M_LITE_PRO || + protocol == PULSES_XJT_LITE_X16 || + protocol == PULSES_MULTIMODULE + ); +} + +int ModuleData::getMaxChannelCount() +{ + switch (protocol) { + case PULSES_ACCESS_ISRM: + return 24; + case PULSES_PXX_R9M: + case PULSES_ACCESS_R9M: + case PULSES_ACCESS_R9M_LITE: + case PULSES_ACCESS_R9M_LITE_PRO: + case PULSES_ACCST_ISRM_D16: + case PULSES_XJT_LITE_X16: + case PULSES_PXX_XJT_X16: + case PULSES_CROSSFIRE: + case PULSES_SBUS: + case PULSES_PPM: + return 16; + case PULSES_XJT_LITE_LR12: + case PULSES_PXX_XJT_LR12: + return 12; + case PULSES_PXX_DJT: + case PULSES_XJT_LITE_D8: + case PULSES_PXX_XJT_D8: + return 8; + case PULSES_LP45: + case PULSES_DSM2: + case PULSES_DSMX: + return 6; + case PULSES_MULTIMODULE: + if (multi.rfProtocol == MODULE_SUBTYPE_MULTI_DSM2) + return 12; + else + return 16; + break; + case PULSES_OFF: + break; + default: + break; + } + return 8; +} diff --git a/companion/src/firmwares/moduledata.h b/companion/src/firmwares/moduledata.h index ee969fd0d..0d1d7bb6f 100644 --- a/companion/src/firmwares/moduledata.h +++ b/companion/src/firmwares/moduledata.h @@ -159,7 +159,7 @@ class ModuleData { unsigned int modelId; unsigned int protocol; // type in datastructs.h int rfProtocol; // rfProtocol in datastructs.h - + unsigned int subType; bool invertedSerial; unsigned int channelsStart; @@ -207,6 +207,8 @@ class ModuleData { static QString indexToString(int index, Firmware * fw); static QString protocolToString(unsigned protocol); static QStringList powerValueStrings(int subType, Firmware * fw); + bool hasFailsafes(Firmware * fw) const; + int getMaxChannelCount(); }; #endif // MODULEDATA_H diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 464c458ef..8825a5c42 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -616,6 +616,10 @@ int OpenTxFirmware::getCapability(::Capability capability) return 0; else return IS_ARM(board) ? 4 : 2; + case TelemetryCustomScreensBars: + return (getCapability(TelemetryCustomScreens) ? 4 : 0); + case TelemetryCustomScreensLines: + return (getCapability(TelemetryCustomScreens) ? 4 : 0); case TelemetryCustomScreensFieldsPerLine: return HAS_LARGE_LCD(board) ? 3 : 2; case NoTelemetryProtocol: @@ -754,6 +758,11 @@ int OpenTxFirmware::getCapability(::Capability capability) return IS_TARANIS_XLITES(board); case PwrButtonPress: return IS_HORUS_OR_TARANIS(board) && (board!=Board::BOARD_TARANIS_X9D) && (board!=Board::BOARD_TARANIS_X9DP); + case Sensors: + if (IS_FAMILY_HORUS_OR_T16(board) || IS_TARANIS_X9(board)) + return 60; + else + return 40; default: return 0; } diff --git a/companion/src/firmwares/rawsource.h b/companion/src/firmwares/rawsource.h index e9273d399..f59ab70f5 100644 --- a/companion/src/firmwares/rawsource.h +++ b/companion/src/firmwares/rawsource.h @@ -227,11 +227,7 @@ class RawSource { AllSourceGroups = InputSourceGroups | GVarsGroup | TelemGroup | ScriptsGroup }; - RawSource(): - type(SOURCE_TYPE_NONE), - index(0) - { - } + RawSource() { clear(); } explicit RawSource(int value): type(RawSourceType(abs(value)/65536)), @@ -258,6 +254,8 @@ class RawSource { bool isSlider(int * sliderIndex = NULL, Board::Type board = Board::BOARD_UNKNOWN) const; bool isTimeBased(Board::Type board = Board::BOARD_UNKNOWN) const; bool isAvailable(const ModelData * const model = NULL, const GeneralSettings * const gs = NULL, Board::Type board = Board::BOARD_UNKNOWN) const; + bool isSet() const { return type != SOURCE_TYPE_NONE || index != 0; } + void clear() { type = SOURCE_TYPE_NONE; index = 0; } bool operator == ( const RawSource & other) const { return (this->type == other.type) && (this->index == other.index); diff --git a/companion/src/firmwares/rawswitch.h b/companion/src/firmwares/rawswitch.h index af49156c0..d79ac0aa6 100644 --- a/companion/src/firmwares/rawswitch.h +++ b/companion/src/firmwares/rawswitch.h @@ -65,11 +65,7 @@ class RawSwitch { AllSwitchContexts = AllModelContexts | GlobalFunctionsContext }; - RawSwitch(): - type(SWITCH_TYPE_NONE), - index(0) - { - } + RawSwitch() { clear(); } explicit RawSwitch(int value): type(RawSwitchType(abs(value)/256)), @@ -91,6 +87,8 @@ class RawSwitch { RawSwitch convert(RadioDataConversionState & cstate); QString toString(Board::Type board = Board::BOARD_UNKNOWN, const GeneralSettings * const generalSettings = NULL, const ModelData * const modelData = NULL) const; bool isAvailable(const ModelData * const model = NULL, const GeneralSettings * const gs = NULL, Board::Type board = Board::BOARD_UNKNOWN) const; + bool isSet() const { return type != SWITCH_TYPE_NONE || index != 0; } + void clear() { type = SWITCH_TYPE_NONE; index = 0; } bool operator== ( const RawSwitch& other) const { return (this->type == other.type) && (this->index == other.index); @@ -100,7 +98,6 @@ class RawSwitch { return (this->type != other.type) || (this->index != other.index); } - RawSwitchType type; int index; }; diff --git a/companion/src/modeledit/channels.cpp b/companion/src/modeledit/channels.cpp index 593121d83..450f785fd 100644 --- a/companion/src/modeledit/channels.cpp +++ b/companion/src/modeledit/channels.cpp @@ -120,7 +120,7 @@ Channels::Channels(QWidget * parent, ModelData & model, GeneralSettings & genera s1.report("header"); - for (int i=0; isetContextMenuPolicy(Qt::CustomContextMenu); label->setToolTip(tr("Popup menu available")); label->setMouseTracking(true); - connect(label, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(chn_customContextMenuRequested(QPoint))); + connect(label, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onCustomContextMenuRequested(QPoint))); tableLayout->addWidget(i, col++, label); // Channel name @@ -204,7 +204,7 @@ Channels::Channels(QWidget * parent, ModelData & model, GeneralSettings & genera Channels::~Channels() { // compiler warning if delete[] - for (int i=0; igetChannelsMax(); - for (int i=0 ; iupdateMinMax(10 * channelMax); chnMin[i]->updateMinMax(10 * channelMax); chnMax[i]->updateMinMax(10 * channelMax); @@ -280,7 +280,7 @@ void Channels::ppmcenterEdited() void Channels::update() { - for (int i=0; igetBoard())) { int numcurves = firmware->getCapability(NumCurves); curveCB[i]->clear(); - for (int j=-numcurves; j<=numcurves; j++) { + for (int j = -numcurves; j <= numcurves; j++) { curveCB[i]->addItem(CurveReference(CurveReference::CURVE_REF_CUSTOM, j).toString(model, false), j); } curveCB[i]->setCurrentIndex(model->limitData[i].curve.value + numcurves); @@ -312,118 +312,140 @@ void Channels::updateLine(int i) lock = false; } -void Channels::chnPaste() +void Channels::cmPaste() { - const QClipboard *clipboard = QApplication::clipboard(); - const QMimeData *mimeData = clipboard->mimeData(); - if (mimeData->hasFormat(MIMETYPE_CHN)) { - QByteArray chnData = mimeData->data(MIMETYPE_CHN); - LimitData *chn = &model->limitData[selectedChannel]; - memcpy(chn, chnData.constData(), sizeof(LimitData)); - updateLine(selectedChannel); + QByteArray data; + if (hasClipboardData(&data)) { + memcpy(&model->limitData[selectedIndex], data.constData(), sizeof(LimitData)); + updateLine(selectedIndex); emit modified(); } } -void Channels::chnDelete() +void Channels::cmDelete() { - int maxidx = chnCapability - 1; - for (int i=selectedChannel; ilimitData[i].isEmpty() || !model->limitData[i+1].isEmpty()) { - LimitData *chn1 = &model->limitData[i]; - LimitData *chn2 = &model->limitData[i+1]; - memcpy(chn1, chn2, sizeof(LimitData)); - updateLine(i); - } + if (QMessageBox::question(this, CPN_STR_APP_NAME, tr("Delete Channel. Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) + return; + + memmove(&model->limitData[selectedIndex], &model->limitData[selectedIndex + 1], (CPN_MAX_CHNOUT - (selectedIndex + 1)) * sizeof(LimitData)); + model->limitData[chnCapability - 1].clear(); + model->updateAllReferences(ModelData::REF_UPD_TYPE_CHANNEL, ModelData::REF_UPD_ACT_SHIFT, selectedIndex, 0, -1); + + for (int i = selectedIndex; i < chnCapability; i++) { + updateLine(i); } - model->limitData[maxidx].clear(); - updateLine(maxidx); + emit modified(); } -void Channels::chnCopy() +void Channels::cmCopy() { - QByteArray chnData; - chnData.append((char*)&model->limitData[selectedChannel],sizeof(LimitData)); + QByteArray data; + data.append((char*)&model->limitData[selectedIndex], sizeof(LimitData)); QMimeData *mimeData = new QMimeData; - mimeData->setData(MIMETYPE_CHN, chnData); + mimeData->setData(MIMETYPE_CHANNEL, data); QApplication::clipboard()->setMimeData(mimeData,QClipboard::Clipboard); } -void Channels::chnCut() +void Channels::cmCut() { - chnCopy(); - chnClear(); + cmCopy(); + cmClear(); } -void Channels::chn_customContextMenuRequested(QPoint pos) +void Channels::onCustomContextMenuRequested(QPoint pos) { QLabel *label = (QLabel *)sender(); - selectedChannel = label->property("index").toInt(); - + selectedIndex = label->property("index").toInt(); QPoint globalPos = label->mapToGlobal(pos); - const QClipboard *clipboard = QApplication::clipboard(); - const QMimeData *mimeData = clipboard->mimeData(); - bool hasData = mimeData->hasFormat(MIMETYPE_CHN); - bool moveUpAllowed = (selectedChannel > 0); - bool moveDownAllowed = (selectedChannel < (chnCapability - 1)); - bool insertAllowed = (selectedChannel < (chnCapability - 1)) && (model->limitData[chnCapability - 1].isEmpty()); - QMenu contextMenu; - contextMenu.addAction(CompanionIcon("copy.png"), tr("Copy"),this,SLOT(chnCopy())); - contextMenu.addAction(CompanionIcon("cut.png"), tr("Cut"),this,SLOT(chnCut())); - contextMenu.addAction(CompanionIcon("paste.png"), tr("Paste"),this,SLOT(chnPaste()))->setEnabled(hasData); - contextMenu.addAction(CompanionIcon("clear.png"), tr("Clear"),this,SLOT(chnClear())); + contextMenu.addAction(CompanionIcon("copy.png"), tr("Copy"),this,SLOT(cmCopy())); + contextMenu.addAction(CompanionIcon("cut.png"), tr("Cut"),this,SLOT(cmCut())); + contextMenu.addAction(CompanionIcon("paste.png"), tr("Paste"),this,SLOT(cmPaste()))->setEnabled(hasClipboardData()); + contextMenu.addAction(CompanionIcon("clear.png"), tr("Clear"),this,SLOT(cmClear())); contextMenu.addSeparator(); - contextMenu.addAction(CompanionIcon("arrow-right.png"), tr("Insert"),this,SLOT(chnInsert()))->setEnabled(insertAllowed); - contextMenu.addAction(CompanionIcon("arrow-left.png"), tr("Delete"),this,SLOT(chnDelete())); - contextMenu.addAction(CompanionIcon("moveup.png"), tr("Move Up"),this,SLOT(chnMoveUp()))->setEnabled(moveUpAllowed); - contextMenu.addAction(CompanionIcon("movedown.png"), tr("Move Down"),this,SLOT(chnMoveDown()))->setEnabled(moveDownAllowed); + contextMenu.addAction(CompanionIcon("arrow-right.png"), tr("Insert"),this,SLOT(cmInsert()))->setEnabled(insertAllowed()); + contextMenu.addAction(CompanionIcon("arrow-left.png"), tr("Delete"),this,SLOT(cmDelete())); + contextMenu.addAction(CompanionIcon("moveup.png"), tr("Move Up"),this,SLOT(cmMoveUp()))->setEnabled(moveUpAllowed()); + contextMenu.addAction(CompanionIcon("movedown.png"), tr("Move Down"),this,SLOT(cmMoveDown()))->setEnabled(moveDownAllowed()); contextMenu.addSeparator(); - contextMenu.addAction(CompanionIcon("clear.png"), tr("Clear All"),this,SLOT(chnClearAll())); + contextMenu.addAction(CompanionIcon("clear.png"), tr("Clear All"),this,SLOT(cmClearAll())); contextMenu.exec(globalPos); } -void Channels::chnMoveUp() +bool Channels::hasClipboardData(QByteArray * data) const { - swapChnData(selectedChannel, selectedChannel - 1); + const QClipboard * clipboard = QApplication::clipboard(); + const QMimeData * mimeData = clipboard->mimeData(); + if (mimeData->hasFormat(MIMETYPE_CHANNEL)) { + if (data) + data->append(mimeData->data(MIMETYPE_CHANNEL)); + return true; + } + return false; } -void Channels::chnMoveDown() +bool Channels::insertAllowed() const { - swapChnData(selectedChannel, selectedChannel + 1); + return ((selectedIndex < chnCapability - 1) && (model->limitData[chnCapability - 1].isEmpty())); } -void Channels::chnClear() +bool Channels::moveDownAllowed() const { - model->limitData[selectedChannel].clear(); - updateLine(selectedChannel); + return selectedIndex < chnCapability - 1; +} + +bool Channels::moveUpAllowed() const +{ + return selectedIndex > 0; +} + +void Channels::cmMoveUp() +{ + swapData(selectedIndex, selectedIndex - 1); +} + +void Channels::cmMoveDown() +{ + swapData(selectedIndex, selectedIndex + 1); +} + +void Channels::cmClear() +{ + if (QMessageBox::question(this, CPN_STR_APP_NAME, tr("Clear Channel. Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) + return; + + model->limitData[selectedIndex].clear(); + model->updateAllReferences(ModelData::REF_UPD_TYPE_CHANNEL, ModelData::REF_UPD_ACT_CLEAR, selectedIndex); + updateLine(selectedIndex); emit modified(); } -void Channels::chnClearAll() +void Channels::cmClearAll() { - for (int i=0; ilimitData[i].clear(); + model->updateAllReferences(ModelData::REF_UPD_TYPE_CHANNEL, ModelData::REF_UPD_ACT_CLEAR, i); updateLine(i); } emit modified(); } -void Channels::chnInsert() +void Channels::cmInsert() { - for (int i=(chnCapability - 1); i>selectedChannel; i--) { - if (!model->limitData[i].isEmpty() || !model->limitData[i-1].isEmpty()) { - memcpy(&model->limitData[i], &model->limitData[i-1], sizeof(LimitData)); - updateLine(i); - } - } - chnClear(); + memmove(&model->limitData[selectedIndex + 1], &model->limitData[selectedIndex], (CPN_MAX_CHNOUT - (selectedIndex + 1)) * sizeof(LimitData)); + model->limitData[selectedIndex].clear(); + model->updateAllReferences(ModelData::REF_UPD_TYPE_CHANNEL, ModelData::REF_UPD_ACT_SHIFT, selectedIndex, 0, 1); + update(); + emit modified(); } -void Channels::swapChnData(int idx1, int idx2) +void Channels::swapData(int idx1, int idx2) { if ((idx1 != idx2) && (!model->limitData[idx1].isEmpty() || !model->limitData[idx2].isEmpty())) { LimitData chntmp = model->limitData[idx2]; @@ -431,6 +453,7 @@ void Channels::swapChnData(int idx1, int idx2) LimitData *chn2 = &model->limitData[idx2]; memcpy(chn2, chn1, sizeof(LimitData)); memcpy(chn1, &chntmp, sizeof(LimitData)); + model->updateAllReferences(ModelData::REF_UPD_TYPE_CHANNEL, ModelData::REF_UPD_ACT_SWAP, idx1, idx2); updateLine(idx1); updateLine(idx2); emit modified(); diff --git a/companion/src/modeledit/channels.h b/companion/src/modeledit/channels.h index f50c72b89..caa0fca38 100644 --- a/companion/src/modeledit/channels.h +++ b/companion/src/modeledit/channels.h @@ -26,7 +26,7 @@ #include -constexpr char MIMETYPE_CHN[] = "application/x-companion-chn"; +constexpr char MIMETYPE_CHANNEL[] = "application/x-companion-channel"; class GVarGroup; @@ -68,19 +68,23 @@ class Channels : public ModelPanel void ppmcenterEdited(); void update(); void updateLine(int index); - void chnDelete(); - void chnCopy(); - void chnPaste(); - void chnCut(); - void chnMoveUp(); - void chnMoveDown(); - void chnInsert(); - void chnClear(); - void chnClearAll(); - void chn_customContextMenuRequested(QPoint pos); + void cmDelete(); + void cmCopy(); + void cmPaste(); + void cmCut(); + void cmMoveUp(); + void cmMoveDown(); + void cmInsert(); + void cmClear(); + void cmClearAll(); + void onCustomContextMenuRequested(QPoint pos); private: - void swapChnData(int idx1, int idx2); + bool hasClipboardData(QByteArray * data = nullptr) const; + bool insertAllowed() const; + bool moveDownAllowed() const; + bool moveUpAllowed() const; + void swapData(int idx1, int idx2); QLineEdit *name[CPN_MAX_CHNOUT]; LimitsGroup *chnOffset[CPN_MAX_CHNOUT]; LimitsGroup *chnMin[CPN_MAX_CHNOUT]; @@ -89,7 +93,7 @@ class Channels : public ModelPanel QComboBox *curveCB[CPN_MAX_CHNOUT]; QSpinBox *centerSB[CPN_MAX_CHNOUT]; QCheckBox *symlimitsChk[CPN_MAX_CHNOUT]; - int selectedChannel; + int selectedIndex; int chnCapability; }; diff --git a/companion/src/modeledit/curves.cpp b/companion/src/modeledit/curves.cpp index cf3eb9e71..5759e60e6 100644 --- a/companion/src/modeledit/curves.cpp +++ b/companion/src/modeledit/curves.cpp @@ -117,7 +117,12 @@ Curves::Curves(QWidget * parent, ModelData & model, GeneralSettings & generalSet lock = true; - if (!firmware->getCapability(HasCvNames)) { + maxCurves = firmware->getCapability(NumCurves); + hasNames = firmware->getCapability(HasCvNames); + hasEnhanced = firmware->getCapability(EnhancedCurves); + maxPoints = firmware->getCapability(NumCurvePoints); + + if (!hasNames) { ui->curveName->hide(); ui->curveNameLabel->hide(); } @@ -127,14 +132,14 @@ Curves::Curves(QWidget * parent, ModelData & model, GeneralSettings & generalSet connect(scene, SIGNAL(newPoint(int, int)), this, SLOT(onSceneNewPoint(int, int))); ui->curvePreview->setScene(scene); - int numcurves=firmware->getCapability(NumCurves); + int limit; - if (numcurves>16) { - limit=numcurves/2; + if (maxCurves > 16) { + limit = maxCurves / 2; } else { - limit=numcurves; + limit = maxCurves; } - for (int i=0; isetStyleSheet(QString("background-color: %1; color: white; padding: 2px 3px; border-style: outset; border-width: 1px; border-radius: 2px; border-color: inherit;").arg(colors[i].name())); #endif edit->setPalette(palette); - edit->setText(tr("Curve %1").arg(i+1)); + edit->setText(tr("Curve %1").arg(i + 1)); edit->setContextMenuPolicy(Qt::CustomContextMenu); edit->setToolTip(tr("Popup menu available")); - connect(edit, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(ShowContextMenu(const QPoint&))); + connect(edit, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(onCustomContextMenuRequested(const QPoint&))); connect(edit, SIGNAL(clicked()), this, SLOT(editCurve())); - if (icurvesLayout->addWidget(edit, i, 1, 1, 1); } else { - ui->curvesLayout2->addWidget(edit, i-limit, 2, 1, 1); + ui->curvesLayout2->addWidget(edit, i - limit, 2, 1, 1); } // The curve plot checkbox @@ -167,7 +172,7 @@ Curves::Curves(QWidget * parent, ModelData & model, GeneralSettings & generalSet plot->setProperty("index", i); plot->setPalette(palette); connect(plot, SIGNAL(toggled(bool)), this, SLOT(plotCurve(bool))); - if (icurvesLayout->addWidget(plot, i, 2, 1, 1); } else { ui->curvesLayout2->addWidget(plot, i-limit, 1, 1, 1); @@ -175,13 +180,13 @@ Curves::Curves(QWidget * parent, ModelData & model, GeneralSettings & generalSet } QSpacerItem * item = new QSpacerItem(1,1, QSizePolicy::Fixed, QSizePolicy::Expanding); - ui->curvesLayout->addItem(item,limit+1,1,1,1,0); - if (limit!=numcurves) { + ui->curvesLayout->addItem(item,limit + 1, 1, 1, 1, 0); + if (limit != maxCurves) { QSpacerItem * item2 = new QSpacerItem(1,1, QSizePolicy::Fixed, QSizePolicy::Expanding); - ui->curvesLayout2->addItem(item2,limit+1,1,1,1,0); + ui->curvesLayout2->addItem(item2,limit + 1, 1, 1, 1, 0); } - for (int i=0; isetProperty("index", i); spnx[i]->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); @@ -199,14 +204,14 @@ Curves::Curves(QWidget * parent, ModelData & model, GeneralSettings & generalSet ui->pointsLayout->addWidget(spny[i], i, 1, 1, 1); bool insert; - if (firmware->getCapability(EnhancedCurves)) { + if (hasEnhanced) { insert = (i >= 1); } else { - insert = (i==2 || i==4 || i==8 || i==16); + insert = (i == 2 || i == 4 || i ==8 || i == 16); } if (insert) { - ui->curvePoints->addItem(tr("%1 points").arg(i+1), i+1); + ui->curvePoints->addItem(tr("%1 points").arg(i + 1), i + 1); } } @@ -250,7 +255,7 @@ void Curves::update() { lock = true; - if (firmware->getCapability(HasCvNames)) { + if (hasNames) { ui->curveName->setText(model->curves[currentCurve].name); } @@ -272,7 +277,7 @@ void Curves::updateCurveType() int index = 0; - if (firmware->getCapability(EnhancedCurves)) { + if (hasEnhanced) { index = model->curves[currentCurve].count - 2; } else { @@ -305,35 +310,34 @@ void Curves::updateCurve() qreal width = scene->sceneRect().width(); qreal height = scene->sceneRect().height(); - qreal centerX = scene->sceneRect().left() + width/2; - qreal centerY = scene->sceneRect().top() + height/2; + qreal centerX = scene->sceneRect().left() + width / 2; + qreal centerY = scene->sceneRect().top() + height / 2; - QGraphicsSimpleTextItem *ti = scene->addSimpleText(tr("Editing curve %1").arg(currentCurve+1)); + QGraphicsSimpleTextItem *ti = scene->addSimpleText(tr("Editing curve %1").arg(currentCurve + 1)); ti->setPos(3, 3); - scene->addLine(centerX, GFX_MARGIN, centerX, height+GFX_MARGIN); - scene->addLine(GFX_MARGIN, centerY, width+GFX_MARGIN, centerY); + scene->addLine(centerX, GFX_MARGIN, centerX, height + GFX_MARGIN); + scene->addLine(GFX_MARGIN, centerY, width + GFX_MARGIN, centerY); QPen pen; pen.setWidth(1); pen.setStyle(Qt::SolidLine); - int numcurves = firmware->getCapability(NumCurves); - for (int k=0; kcurves[k].count; - for (int i=0; icurves[k].type == CurveData::CURVE_TYPE_CUSTOM) - scene->addLine(centerX + (qreal)model->curves[k].points[i].x*width/200,centerY - (qreal)model->curves[k].points[i].y*height/200,centerX + (qreal)model->curves[k].points[i+1].x*width/200,centerY - (qreal)model->curves[k].points[i+1].y*height/200, pen); + scene->addLine(centerX + (qreal)model->curves[k].points[i].x*width/200, centerY - (qreal)model->curves[k].points[i].y*height/200,centerX + (qreal)model->curves[k].points[i+1].x*width/200,centerY - (qreal)model->curves[k].points[i+1].y*height/200, pen); else - scene->addLine(GFX_MARGIN + i*width/(numpoints-1),centerY - (qreal)model->curves[k].points[i].y*height/200,GFX_MARGIN + (i+1)*width/(numpoints-1),centerY - (qreal)model->curves[k].points[i+1].y*height/200, pen); + scene->addLine(GFX_MARGIN + i*width/(numpoints-1), centerY - (qreal)model->curves[k].points[i].y*height/200,GFX_MARGIN + (i+1)*width/(numpoints-1),centerY - (qreal)model->curves[k].points[i+1].y*height/200, pen); } } } int numpoints = model->curves[currentCurve].count; - for (int i=0; isetProperty("index", i); @@ -341,26 +345,27 @@ void Curves::updateCurve() nodex->setBallSize(ui->pointSize->value()); nodex->setBallHeight(0); if (model->curves[currentCurve].type == CurveData::CURVE_TYPE_CUSTOM) { - if (i>0 && i 0 && i < numpoints - 1) { nodex->setFixedX(false); - nodex->setMinX(model->curves[currentCurve].points[i-1].x); - nodex->setMaxX(model->curves[currentCurve].points[i+1].x); + nodex->setMinX(model->curves[currentCurve].points[i - 1].x); + nodex->setMaxX(model->curves[currentCurve].points[i + 1].x); } else { nodex->setFixedX(true); } - nodex->setPos(centerX + (qreal)model->curves[currentCurve].points[i].x*width/200,centerY - (qreal)model->curves[currentCurve].points[i].y*height/200); + nodex->setPos(centerX + (qreal)model->curves[currentCurve].points[i].x * width / 200, centerY - (qreal)model->curves[currentCurve].points[i].y * height / 200); } else { nodex->setFixedX(true); - nodex->setPos(GFX_MARGIN + i*width/(numpoints-1), centerY - (qreal)model->curves[currentCurve].points[i].y*height/200); + nodex->setPos(GFX_MARGIN + i * width / (numpoints - 1), centerY - (qreal)model->curves[currentCurve].points[i].y * height / 200); } connect(nodex, SIGNAL(moved(int, int)), this, SLOT(onNodeMoved(int, int))); connect(nodex, SIGNAL(focus()), this, SLOT(onNodeFocus())); connect(nodex, SIGNAL(unfocus()), this, SLOT(onNodeUnfocus())); connect(nodex, SIGNAL(deleteMe()), this, SLOT(onNodeDelete())); scene->addItem(nodex); - if (i>0) scene->addItem(new Edge(nodel, nodex)); + if (i > 0) + scene->addItem(new Edge(nodel, nodex)); } lock = false; @@ -371,20 +376,20 @@ void Curves::updateCurvePoints() lock = true; int count = model->curves[currentCurve].count; - for (int i=0; ishow(); spny[i]->setValue(model->curves[currentCurve].points[i].y); if (model->curves[currentCurve].type == CurveData::CURVE_TYPE_CUSTOM) { spnx[i]->show(); - if (i==0 || i==model->curves[currentCurve].count-1) { + if (i == 0 || i == model->curves[currentCurve].count - 1) { spnx[i]->setDisabled(true); spnx[i]->setMaximum(+100); spnx[i]->setMinimum(-100); } else { spnx[i]->setDisabled(false); - spnx[i]->setMaximum(model->curves[currentCurve].points[i+1].x); - spnx[i]->setMinimum(model->curves[currentCurve].points[i-1].x); + spnx[i]->setMaximum(model->curves[currentCurve].points[i + 1].x); + spnx[i]->setMinimum(model->curves[currentCurve].points[i - 1].x); } spnx[i]->setValue(model->curves[currentCurve].points[i].x); } @@ -392,7 +397,7 @@ void Curves::updateCurvePoints() spnx[i]->hide(); } } - for (int i=count; ihide(); spnx[i]->hide(); } @@ -421,9 +426,9 @@ void Curves::onNodeMoved(int x, int y) spnx[index]->setValue(x); spny[index]->setValue(y); if (index > 0) - spnx[index-1]->setMaximum(x); - if (index < model->curves[currentCurve].count-1) - spnx[index+1]->setMinimum(x); + spnx[index - 1]->setMaximum(x); + if (index < model->curves[currentCurve].count - 1) + spnx[index + 1]->setMinimum(x); emit modified(); lock = false; } @@ -444,17 +449,14 @@ void Curves::onNodeUnfocus() bool Curves::allowCurveType(int points, CurveData::CurveType type) { - int numcurves = firmware->getCapability(NumCurves); - int totalpoints = 0; - for (int i=0; icurves[i].count); - CurveData::CurveType cvType = (i==currentCurve ? type : model->curves[i].type); - totalpoints += cvPoints + (cvType==CurveData::CURVE_TYPE_CUSTOM ? cvPoints-2 : 0); + for (int i = 0; i < maxCurves; i++) { + int cvPoints = (i == currentCurve ? points : model->curves[i].count); + CurveData::CurveType cvType = (i == currentCurve ? type : model->curves[i].type); + totalpoints += cvPoints + (cvType == CurveData::CURVE_TYPE_CUSTOM ? cvPoints - 2 : 0); } - int fwpoints = firmware->getCapability(NumCurvePoints); - if (totalpoints > fwpoints) { + if (totalpoints > maxPoints) { QMessageBox::warning(this, "companion", tr("Not enough free points in EEPROM to store the curve.")); return false; } @@ -472,8 +474,8 @@ void Curves::on_curvePoints_currentIndexChanged(int index) model->curves[currentCurve].count = numpoints; // TODO something better + reuse! - for (int i=0; icurves[currentCurve].points[i].x = (i >= numpoints-1 ? +100 : -100 + (200*i)/(numpoints-1)); + for (int i = 0; i < CPN_MAX_POINTS; i++) { + model->curves[currentCurve].points[i].x = (i >= numpoints - 1 ? +100 : -100 + (200 * i) / (numpoints - 1)); model->curves[currentCurve].points[i].y = 0; } @@ -491,12 +493,13 @@ void Curves::on_curveCustom_currentIndexChanged(int index) if (!lock) { CurveData::CurveType type = (CurveData::CurveType)index; int numpoints = ui->curvePoints->itemData(ui->curvePoints->currentIndex()).toInt(); + if (allowCurveType(model->curves[currentCurve].count, type)) { model->curves[currentCurve].type = type; // TODO something better + reuse! - for (int i=0; icurves[currentCurve].points[i].x = (i >= numpoints-1 ? +100 : -100 + (200*i)/(numpoints-1)); + for (int i = 0; i < CPN_MAX_POINTS; i++) { + model->curves[currentCurve].points[i].x = (i >= numpoints - 1 ? +100 : -100 + (200 * i) / (numpoints - 1)); model->curves[currentCurve].points[i].y = 0; } @@ -525,7 +528,7 @@ void Curves::on_curveName_editingFinished() void Curves::resizeEvent(QResizeEvent *event) { QRect qr = ui->curvePreview->contentsRect(); - ui->curvePreview->scene()->setSceneRect(GFX_MARGIN, GFX_MARGIN, qr.width()-GFX_MARGIN*2, qr.height()-GFX_MARGIN*2); + ui->curvePreview->scene()->setSceneRect(GFX_MARGIN, GFX_MARGIN, qr.width() - GFX_MARGIN * 2, qr.height() - GFX_MARGIN * 2); updateCurve(); ModelPanel::resizeEvent(event); } @@ -559,12 +562,12 @@ void Curves::on_curveApply_clicked() int index = ui->curveType->currentIndex(); int numpoints = model->curves[currentCurve].count; - for (int i=0; icurves[currentCurve].type == CurveData::CURVE_TYPE_CUSTOM) x = model->curves[currentCurve].points[i].x; else - x = -100.0 + (200.0/(numpoints-1))*i; + x = -100.0 + (200.0 / (numpoints - 1)) * i; bool apply = false; switch (ui->curveSide->currentIndex()) { @@ -572,11 +575,11 @@ void Curves::on_curveApply_clicked() apply = true; break; case 1: - if (x>=0) + if (x >= 0) apply = true; break; case 2: - if (x<0) + if (x < 0) apply = true; break; } @@ -591,68 +594,6 @@ void Curves::on_curveApply_clicked() emit modified(); } -void Curves::ShowContextMenu(const QPoint& pos) // this is a slot -{ - QPushButton *button = (QPushButton *)sender(); - int index = button->property("index").toInt(); - const QClipboard *clipboard = QApplication::clipboard(); - const QMimeData *mimeData = clipboard->mimeData(); - QPoint globalPos = button->mapToGlobal(pos); - QMenu myMenu; - QAction *action; - action = myMenu.addAction(CompanionIcon("copy.png"),tr("Copy")); - action->setProperty("index", CURVE_COPY); - - action = myMenu.addAction(CompanionIcon("paste.png"),tr("Paste")); - if (!mimeData->hasFormat("application/x-companion-curve-item")) { - action->setEnabled(false); - } - action->setProperty("index", CURVE_PASTE); - - action = myMenu.addAction(CompanionIcon("clear.png"),tr("Clear")); - action->setProperty("index", CURVE_RESET); - action = myMenu.addAction(CompanionIcon("clear.png"),tr("Clear all curves")); - action->setProperty("index", CURVE_RESETALL); - - QAction* selectedItem = myMenu.exec(globalPos); - if (selectedItem) { - int action=selectedItem->property("index").toInt(); - if (action==CURVE_COPY) { - QByteArray curveData; - QMimeData *mimeData2 = new QMimeData; - curveData.append((char*)&model->curves[index], sizeof(CurveData)); - mimeData2->setData("application/x-companion-curve-item", curveData); - QApplication::clipboard()->setMimeData(mimeData2, QClipboard::Clipboard); - } - else if (action==CURVE_PASTE) { - QByteArray curveData = mimeData->data("application/x-companion-curve-item"); - CurveData *curve = &model->curves[index]; - memcpy(curve, curveData.constData(), sizeof(CurveData)); - update(); - emit modified(); - } - else if (action==CURVE_RESET) { - int res = QMessageBox::question(this, "companion", tr("Are you sure you want to reset curve %1?").arg(index+1), QMessageBox::Yes | QMessageBox::No); - if (res == QMessageBox::Yes) { - model->curves[index].clear(5); - update(); - emit modified(); - } - } - else if (action==CURVE_RESETALL) { - int res = QMessageBox::question(this, "companion", tr("Are you sure you want to reset all curves?"), QMessageBox::Yes | QMessageBox::No); - if (res == QMessageBox::Yes) { - int numcurves = firmware->getCapability(NumCurves); - for (int i=0; icurves[i].clear(5); - } - update(); - emit modified(); - } - } - } -} - void Curves::onPointSizeEdited() { if (!lock) { @@ -690,7 +631,7 @@ void Curves::onSceneNewPoint(int x, int y) newidx = numpoints; } else { - for (int i=0; icurves[currentCurve].points[i].x) { newidx = i; break; @@ -699,8 +640,8 @@ void Curves::onSceneNewPoint(int x, int y) } numpoints++; model->curves[currentCurve].count = numpoints; - for (int idx=(numpoints-1); idx>(newidx); idx--) { - model->curves[currentCurve].points[idx] = model->curves[currentCurve].points[idx-1]; + for (int idx = (numpoints - 1); idx > newidx; idx--) { + model->curves[currentCurve].points[idx] = model->curves[currentCurve].points[idx - 1]; } model->curves[currentCurve].points[newidx].x = x; model->curves[currentCurve].points[newidx].y = y; @@ -709,6 +650,150 @@ void Curves::onSceneNewPoint(int x, int y) } } +void Curves::onCustomContextMenuRequested(QPoint pos) +{ + QPushButton *button = (QPushButton *)sender(); + selectedIndex = button->property("index").toInt(); + QPoint globalPos = button->mapToGlobal(pos); + + QMenu contextMenu; + contextMenu.addAction(CompanionIcon("copy.png"), tr("Copy"), this, SLOT(cmCopy())); + contextMenu.addAction(CompanionIcon("cut.png"), tr("Cut"), this, SLOT(cmCut())); + contextMenu.addAction(CompanionIcon("paste.png"), tr("Paste"), this, SLOT(cmPaste()))->setEnabled(hasClipboardData()); + contextMenu.addAction(CompanionIcon("clear.png"), tr("Clear"), this, SLOT(cmClear())); + contextMenu.addSeparator(); + contextMenu.addAction(CompanionIcon("arrow-right.png"), tr("Insert"), this, SLOT(cmInsert()))->setEnabled(insertAllowed()); + contextMenu.addAction(CompanionIcon("arrow-left.png"), tr("Delete"), this, SLOT(cmDelete())); + contextMenu.addAction(CompanionIcon("moveup.png"), tr("Move Up"), this, SLOT(cmMoveUp()))->setEnabled(moveUpAllowed()); + contextMenu.addAction(CompanionIcon("movedown.png"), tr("Move Down"), this, SLOT(cmMoveDown()))->setEnabled(moveDownAllowed()); + contextMenu.addSeparator(); + contextMenu.addAction(CompanionIcon("clear.png"), tr("Clear All"), this, SLOT(cmClearAll())); + + contextMenu.exec(globalPos); +} + +bool Curves::hasClipboardData(QByteArray * data) const +{ + const QClipboard * clipboard = QApplication::clipboard(); + const QMimeData * mimeData = clipboard->mimeData(); + if (mimeData->hasFormat(MIMETYPE_CURVE)) { + if (data) + data->append(mimeData->data(MIMETYPE_CURVE)); + return true; + } + return false; +} + +bool Curves::insertAllowed() const +{ + return ((selectedIndex < maxCurves - 1) && (model->curves[maxCurves - 1].isEmpty())); +} + +bool Curves::moveDownAllowed() const +{ + return selectedIndex < maxCurves - 1; +} + +bool Curves::moveUpAllowed() const +{ + return selectedIndex > 0; +} + +void Curves::cmClear() +{ + if (QMessageBox::question(this, CPN_STR_APP_NAME, tr("Clear Curve. Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) + return; + + model->curves[selectedIndex].clear(); + model->updateAllReferences(ModelData::REF_UPD_TYPE_CURVE, ModelData::REF_UPD_ACT_CLEAR, selectedIndex); + update(); + emit modified(); +} + +void Curves::cmClearAll() +{ + if (QMessageBox::question(this, CPN_STR_APP_NAME, tr("Clear all Curves. Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) + return; + + for (int i = 0; i < maxCurves; i++) { + model->curves[i].clear(); + model->updateAllReferences(ModelData::REF_UPD_TYPE_CURVE, ModelData::REF_UPD_ACT_CLEAR, i); + } + update(); + emit modified(); +} + +void Curves::cmCopy() +{ + QByteArray data; + data.append((char*)&model->curves[selectedIndex], sizeof(CurveData)); + QMimeData *mimeData = new QMimeData; + mimeData->setData(MIMETYPE_CURVE, data); + QApplication::clipboard()->setMimeData(mimeData,QClipboard::Clipboard); +} + +void Curves::cmCut() +{ + cmCopy(); + cmClear(); +} + +void Curves::cmDelete() +{ + if (QMessageBox::question(this, CPN_STR_APP_NAME, tr("Delete Curve. Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) + return; + + memmove(&model->curves[selectedIndex], &model->curves[selectedIndex + 1], (CPN_MAX_CURVES - (selectedIndex + 1)) * sizeof(CurveData)); + model->curves[maxCurves - 1].clear(); + model->updateAllReferences(ModelData::REF_UPD_TYPE_CURVE, ModelData::REF_UPD_ACT_SHIFT, selectedIndex, 0, -1); + update(); + emit modified(); +} + +void Curves::cmInsert() +{ + memmove(&model->curves[selectedIndex + 1], &model->curves[selectedIndex], (CPN_MAX_CURVES - (selectedIndex + 1)) * sizeof(CurveData)); + model->curves[selectedIndex].clear(); + model->updateAllReferences(ModelData::REF_UPD_TYPE_CURVE, ModelData::REF_UPD_ACT_SHIFT, selectedIndex, 0, 1); + update(); + emit modified(); +} + +void Curves::cmMoveDown() +{ + swapData(selectedIndex, selectedIndex + 1); +} + +void Curves::cmMoveUp() +{ + swapData(selectedIndex, selectedIndex - 1); +} + +void Curves::cmPaste() +{ + QByteArray data; + if (hasClipboardData(&data)) { + CurveData *cd = &model->curves[selectedIndex]; + memcpy(cd, data.constData(), sizeof(CurveData)); + update(); + emit modified(); + } +} + +void Curves::swapData(int idx1, int idx2) +{ + if ((idx1 != idx2) && (!model->curves[idx1].isEmpty() || !model->curves[idx2].isEmpty())) { + CurveData cdtmp = model->curves[idx2]; + CurveData *cd1 = &model->curves[idx1]; + CurveData *cd2 = &model->curves[idx2]; + memcpy(cd2, cd1, sizeof(CurveData)); + memcpy(cd1, &cdtmp, sizeof(CurveData)); + model->updateAllReferences(ModelData::REF_UPD_TYPE_CURVE, ModelData::REF_UPD_ACT_SWAP, idx1, idx2); + update(); + emit modified(); + } +} + CustomScene::CustomScene(QGraphicsView * view) : QGraphicsScene(view) { diff --git a/companion/src/modeledit/curves.h b/companion/src/modeledit/curves.h index a65ba8872..d9a5364a6 100644 --- a/companion/src/modeledit/curves.h +++ b/companion/src/modeledit/curves.h @@ -26,12 +26,7 @@ #include #include -enum CopyAction { - CURVE_COPY, - CURVE_PASTE, - CURVE_RESET, - CURVE_RESETALL -}; +constexpr char MIMETYPE_CURVE[] = "application/x-companion-curve"; namespace Ui { class Curves; @@ -71,7 +66,6 @@ class Curves : public ModelPanel private slots: void editCurve(); - void ShowContextMenu(const QPoint& pos); void plotCurve(bool checked); void on_curveName_editingFinished(); void on_curvePoints_currentIndexChanged(int index); @@ -86,6 +80,16 @@ class Curves : public ModelPanel void onSceneNewPoint(int x, int y); void onPointSizeEdited(); void onNodeDelete(); + void onCustomContextMenuRequested(QPoint pos); + void cmClear(); + void cmClearAll(); + void cmCopy(); + void cmCut(); + void cmDelete(); + void cmInsert(); + void cmPaste(); + void cmMoveDown(); + void cmMoveUp(); protected: virtual void resizeEvent(QResizeEvent *event); @@ -105,6 +109,16 @@ class Curves : public ModelPanel bool allowCurveType(int points, CurveData::CurveType type); void setPointY(int i, int x, int y); CustomScene * scene; + int maxCurves; + int hasNames; + int hasEnhanced; + int maxPoints; + int selectedIndex; + bool hasClipboardData(QByteArray * data = nullptr) const; + bool insertAllowed() const; + bool moveDownAllowed() const; + bool moveUpAllowed() const; + void swapData(int idx1, int idx2); }; #endif // _CURVES_H_ diff --git a/companion/src/modeledit/customfunctions.cpp b/companion/src/modeledit/customfunctions.cpp index fdba765d8..34f05a707 100644 --- a/companion/src/modeledit/customfunctions.cpp +++ b/companion/src/modeledit/customfunctions.cpp @@ -127,7 +127,7 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model, else label->setText(tr("GF%1").arg(i+1)); label->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum); - connect(label, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(fsw_customContextMenuRequested(QPoint))); + connect(label, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onCustomContextMenuRequested(QPoint))); tableLayout->addWidget(i, 0, label); // s1.report("label"); @@ -608,76 +608,63 @@ void CustomFunctionsPanel::update() lock = false; } -void CustomFunctionsPanel::fswPaste() +void CustomFunctionsPanel::cmPaste() { - const QClipboard *clipboard = QApplication::clipboard(); - const QMimeData *mimeData = clipboard->mimeData(); - if (mimeData->hasFormat(MIMETYPE_FSW)) { - QByteArray fswData = mimeData->data(MIMETYPE_FSW); - CustomFunctionData *fsw = &functions[selectedFunction]; - memcpy(fsw, fswData.constData(), sizeof(CustomFunctionData)); - resetCBsAndRefresh(selectedFunction); + QByteArray data; + if (hasClipboardData(&data)) { + memcpy(&functions[selectedIndex], data.constData(), sizeof(CustomFunctionData)); + resetCBsAndRefresh(selectedIndex); emit modified(); } } -void CustomFunctionsPanel::fswDelete() +void CustomFunctionsPanel::cmDelete() { - int maxidx = fswCapability - 1; - for (int i=selectedFunction; isetData(MIMETYPE_FSW, fswData); + mimeData->setData(MIMETYPE_CUSTOM_FUNCTION, data); QApplication::clipboard()->setMimeData(mimeData, QClipboard::Clipboard); } -void CustomFunctionsPanel::fswCut() +void CustomFunctionsPanel::cmCut() { - fswCopy(); - fswClear(); + cmCopy(); + cmClear(); } -void CustomFunctionsPanel::fsw_customContextMenuRequested(QPoint pos) +void CustomFunctionsPanel::onCustomContextMenuRequested(QPoint pos) { QLabel *label = (QLabel *)sender(); - selectedFunction = label->property("index").toInt(); - + selectedIndex = label->property("index").toInt(); QPoint globalPos = label->mapToGlobal(pos); - const QClipboard *clipboard = QApplication::clipboard(); - const QMimeData *mimeData = clipboard->mimeData(); - bool hasData = mimeData->hasFormat(MIMETYPE_FSW); - bool moveUpAllowed = (selectedFunction > 0); - bool moveDownAllowed = (selectedFunction < (fswCapability - 1)); - bool insertAllowed = (selectedFunction < (fswCapability - 1)) && (functions[fswCapability - 1].isEmpty()); - QMenu contextMenu; - contextMenu.addAction(CompanionIcon("copy.png"), tr("Copy"),this,SLOT(fswCopy())); - contextMenu.addAction(CompanionIcon("cut.png"), tr("Cut"),this,SLOT(fswCut())); - contextMenu.addAction(CompanionIcon("paste.png"), tr("Paste"),this,SLOT(fswPaste()))->setEnabled(hasData); - contextMenu.addAction(CompanionIcon("clear.png"), tr("Clear"),this,SLOT(fswClear())); + contextMenu.addAction(CompanionIcon("copy.png"), tr("Copy"),this,SLOT(cmCopy())); + contextMenu.addAction(CompanionIcon("cut.png"), tr("Cut"),this,SLOT(cmCut())); + contextMenu.addAction(CompanionIcon("paste.png"), tr("Paste"),this,SLOT(cmPaste()))->setEnabled(hasClipboardData()); + contextMenu.addAction(CompanionIcon("clear.png"), tr("Clear"),this,SLOT(cmClear())); contextMenu.addSeparator(); - contextMenu.addAction(CompanionIcon("arrow-right.png"), tr("Insert"),this,SLOT(fswInsert()))->setEnabled(insertAllowed); - contextMenu.addAction(CompanionIcon("arrow-left.png"), tr("Delete"),this,SLOT(fswDelete())); - contextMenu.addAction(CompanionIcon("moveup.png"), tr("Move Up"),this,SLOT(fswMoveUp()))->setEnabled(moveUpAllowed); - contextMenu.addAction(CompanionIcon("movedown.png"), tr("Move Down"),this,SLOT(fswMoveDown()))->setEnabled(moveDownAllowed); + contextMenu.addAction(CompanionIcon("arrow-right.png"), tr("Insert"),this,SLOT(cmInsert()))->setEnabled(insertAllowed()); + contextMenu.addAction(CompanionIcon("arrow-left.png"), tr("Delete"),this,SLOT(cmDelete())); + contextMenu.addAction(CompanionIcon("moveup.png"), tr("Move Up"),this,SLOT(cmMoveUp()))->setEnabled(moveUpAllowed()); + contextMenu.addAction(CompanionIcon("movedown.png"), tr("Move Down"),this,SLOT(cmMoveDown()))->setEnabled(moveDownAllowed()); contextMenu.addSeparator(); - contextMenu.addAction(CompanionIcon("clear.png"), tr("Clear All"),this,SLOT(fswClearAll())); + contextMenu.addAction(CompanionIcon("clear.png"), tr("Clear All"),this,SLOT(cmClearAll())); contextMenu.exec(globalPos); } @@ -762,25 +749,31 @@ void CustomFunctionsPanel::populateFuncParamCB(QComboBox *b, uint function, unsi } } -void CustomFunctionsPanel::fswMoveUp() +void CustomFunctionsPanel::cmMoveUp() { - swapFuncData(selectedFunction, selectedFunction - 1); + swapData(selectedIndex, selectedIndex - 1); } -void CustomFunctionsPanel::fswMoveDown() +void CustomFunctionsPanel::cmMoveDown() { - swapFuncData(selectedFunction, selectedFunction + 1); + swapData(selectedIndex, selectedIndex + 1); } -void CustomFunctionsPanel::fswClear() +void CustomFunctionsPanel::cmClear() { - functions[selectedFunction].clear(); - resetCBsAndRefresh(selectedFunction); + if (QMessageBox::question(this, CPN_STR_APP_NAME, tr("Clear Special Function. Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) + return; + + functions[selectedIndex].clear(); + resetCBsAndRefresh(selectedIndex); emit modified(); } -void CustomFunctionsPanel::fswClearAll() +void CustomFunctionsPanel::cmClearAll() { + if (QMessageBox::question(this, CPN_STR_APP_NAME, tr("Clear all Special Functions. Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) + return; + for (int i=0; iselectedFunction; i--) { - if (!functions[i].isEmpty() || !functions[i-1].isEmpty()) { - memcpy(&functions[i], &functions[i-1], sizeof(CustomFunctionData)); - resetCBsAndRefresh(i); - } + memmove(&functions[selectedIndex + 1], &functions[selectedIndex], (CPN_MAX_SPECIAL_FUNCTIONS - (selectedIndex + 1)) * sizeof(CustomFunctionData)); + functions[selectedIndex].clear(); + + for (int i = selectedIndex; i < (fswCapability - 1); i++) { + resetCBsAndRefresh(i); } - fswClear(); } -void CustomFunctionsPanel::swapFuncData(int idx1, int idx2) +void CustomFunctionsPanel::swapData(int idx1, int idx2) { if ((idx1 != idx2) && (!functions[idx1].isEmpty() || !functions[idx2].isEmpty())) { CustomFunctionData fswtmp = functions[idx2]; @@ -823,3 +815,30 @@ void CustomFunctionsPanel::resetCBsAndRefresh(int idx) refreshCustomFunction(idx); lock = false; } + +bool CustomFunctionsPanel::hasClipboardData(QByteArray * data) const +{ + const QClipboard * clipboard = QApplication::clipboard(); + const QMimeData * mimeData = clipboard->mimeData(); + if (mimeData->hasFormat(MIMETYPE_CUSTOM_FUNCTION)) { + if (data) + data->append(mimeData->data(MIMETYPE_CUSTOM_FUNCTION)); + return true; + } + return false; +} + +bool CustomFunctionsPanel::insertAllowed() const +{ + return ((selectedIndex < fswCapability - 1) && (model->curves[fswCapability - 1].isEmpty())); +} + +bool CustomFunctionsPanel::moveDownAllowed() const +{ + return selectedIndex < fswCapability - 1; +} + +bool CustomFunctionsPanel::moveUpAllowed() const +{ + return selectedIndex > 0; +} diff --git a/companion/src/modeledit/customfunctions.h b/companion/src/modeledit/customfunctions.h index fd257ce98..1c93f3e96 100644 --- a/companion/src/modeledit/customfunctions.h +++ b/companion/src/modeledit/customfunctions.h @@ -30,7 +30,7 @@ class RawSourceFilterItemModel; class RawSwitchFilterItemModel; class TimerEdit; -constexpr char MIMETYPE_FSW[] = "application/x-companion-fsw"; +constexpr char MIMETYPE_CUSTOM_FUNCTION[] = "application/x-companion-custom-function"; class RepeatComboBox: public QComboBox { @@ -67,7 +67,7 @@ class CustomFunctionsPanel : public GenericPanel void updateDataModels(); void customFunctionEdited(); void functionEdited(); - void fsw_customContextMenuRequested(QPoint pos); + void onCustomContextMenuRequested(QPoint pos); void refreshCustomFunction(int index, bool modified=false); void onChildModified(); bool playSound(int index); @@ -75,21 +75,25 @@ class CustomFunctionsPanel : public GenericPanel void toggleSound(bool play); void onMediaPlayerStateChanged(QMediaPlayer::State state); void onMediaPlayerError(QMediaPlayer::Error error); - void fswDelete(); - void fswCopy(); - void fswPaste(); - void fswCut(); - void fswMoveUp(); - void fswMoveDown(); - void fswInsert(); - void fswClear(); - void fswClearAll(); + void cmDelete(); + void cmCopy(); + void cmPaste(); + void cmCut(); + void cmMoveUp(); + void cmMoveDown(); + void cmInsert(); + void cmClear(); + void cmClearAll(); private: void populateFuncCB(QComboBox *b, unsigned int value); void populateGVmodeCB(QComboBox *b, unsigned int value); void populateFuncParamCB(QComboBox *b, uint function, unsigned int value, unsigned int adjustmode=0); - void swapFuncData(int idx1, int idx2); + bool hasClipboardData(QByteArray * data = nullptr) const; + bool insertAllowed() const; + bool moveDownAllowed() const; + bool moveUpAllowed() const; + void swapData(int idx1, int idx2); void resetCBsAndRefresh(int idx); RawSwitchFilterItemModel * rawSwitchItemModel; RawSourceFilterItemModel * rawSrcAllItemModel; @@ -113,7 +117,7 @@ class CustomFunctionsPanel : public GenericPanel QSlider * fswtchBLcolor[CPN_MAX_SPECIAL_FUNCTIONS]; QMediaPlayer * mediaPlayer; - int selectedFunction; + int selectedIndex; int fswCapability; }; diff --git a/companion/src/modeledit/flightmodes.cpp b/companion/src/modeledit/flightmodes.cpp index 53f5d7585..a38b493a9 100644 --- a/companion/src/modeledit/flightmodes.cpp +++ b/companion/src/modeledit/flightmodes.cpp @@ -29,21 +29,23 @@ FlightModePanel::FlightModePanel(QWidget * parent, ModelData & model, int phaseI ui(new Ui::FlightMode), phaseIdx(phaseIdx), phase(model.flightModeData[phaseIdx]), - reCount(firmware->getCapability(RotaryEncoders)), - gvCount(firmware->getCapability(Gvars)), rawSwitchItemModel(NULL) { ui->setupUi(this); ui->labelName->setContextMenuPolicy(Qt::CustomContextMenu); ui->labelName->setToolTip(tr("Popup menu available")); - connect(ui->labelName, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(name_customContextMenuRequested(const QPoint &))); + connect(ui->labelName, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onCustomContextMenuRequested(const QPoint &))); - int modesCount = firmware->getCapability(FlightModes); + board = getCurrentBoard(); + fmCount = firmware->getCapability(FlightModes); + gvCount = firmware->getCapability(Gvars); + reCount = firmware->getCapability(RotaryEncoders); + trimCount = Boards::getCapability(board, Board::NumTrims); // Flight mode name QRegExp rx(CHAR_FOR_NAMES_REGEX); - if (modesCount) { + if (fmCount) { ui->name->setValidator(new QRegExpValidator(rx, this)); ui->name->setMaxLength(firmware->getCapability(FlightModesName)); connect(ui->name, SIGNAL(editingFinished()), this, SLOT(phaseName_editingFinished())); @@ -65,13 +67,13 @@ FlightModePanel::FlightModePanel(QWidget * parent, ModelData & model, int phaseI if (firmware->getCapability(FlightModesHaveFades)) { int scale = firmware->getCapability(SlowScale); int range = firmware->getCapability(SlowRange); - ui->fadeIn->setMaximum(float(range)/scale); - ui->fadeIn->setSingleStep(1.0/scale); - ui->fadeIn->setDecimals((scale==1 ? 0 :1) ); + ui->fadeIn->setMaximum(float(range) / scale); + ui->fadeIn->setSingleStep(1.0 / scale); + ui->fadeIn->setDecimals((scale == 1 ? 0 :1) ); connect(ui->fadeIn, SIGNAL(editingFinished()), this, SLOT(phaseFadeIn_editingFinished())); - ui->fadeOut->setMaximum(float(range)/scale); - ui->fadeOut->setSingleStep(1.0/scale); - ui->fadeOut->setDecimals((scale==1 ? 0 :1)); + ui->fadeOut->setMaximum(float(range) / scale); + ui->fadeOut->setSingleStep(1.0 / scale); + ui->fadeOut->setDecimals((scale == 1 ? 0 :1)); connect(ui->fadeOut, SIGNAL(editingFinished()), this, SLOT(phaseFadeOut_editingFinished())); } else { @@ -81,78 +83,82 @@ FlightModePanel::FlightModePanel(QWidget * parent, ModelData & model, int phaseI // The trims QString labels[CPN_MAX_TRIMS]; - for(int i=0; i < CPN_MAX_STICKS; i++) { + for(int i = 0; i < CPN_MAX_STICKS; i++) { labels[i] = firmware->getAnalogInputName(i); } - labels[4] = "T5"; - labels[5] = "T6"; + labels[4] = "T5"; // TODO firmware function + labels[5] = "T6"; // TODO firmware function trimsLabel << ui->trim1Label << ui->trim2Label << ui->trim3Label << ui->trim4Label << ui->trim5Label << ui->trim6Label; trimsUse << ui->trim1Use << ui->trim2Use << ui->trim3Use << ui->trim4Use << ui->trim5Use << ui->trim6Use; trimsValue << ui->trim1Value << ui->trim2Value << ui->trim3Value << ui->trim4Value << ui->trim5Value << ui->trim6Value; trimsSlider << ui->trim1Slider << ui->trim2Slider << ui->trim3Slider << ui->trim4Slider << ui->trim5Slider << ui->trim6Slider; - Board::Type board = firmware->getBoard(); - - for (int i = getBoardCapability(board,Board::NumTrims); i < CPN_MAX_TRIMS; i++) { + for (int i = trimCount; i < CPN_MAX_TRIMS; i++) { trimsLabel[i]->hide(); trimsUse[i]->hide(); trimsValue[i]->hide(); trimsSlider[i]->hide(); } - for (int i = 0; i < getBoardCapability(board,Board::NumTrims); i++) { - trimsLabel[i]->setText(labels[CONVERT_MODE(i+1)-1]); - + for (int i = 0; i < trimCount; i++) { + trimsLabel[i]->setText(labels[CONVERT_MODE(i + 1) - 1]); QComboBox * cb = trimsUse[i]; cb->setProperty("index", i); if (IS_HORUS_OR_TARANIS(board)) { cb->addItem(tr("Trim disabled"), -1); } - for (int m=0; maddItem(tr("Own Trim"), m*2); + cb->addItem(tr("Own Trim"), m * 2); } else if (phaseIdx > 0) { - cb->addItem(tr("Use Trim from Flight mode %1").arg(m), m*2); + cb->addItem(tr("Use Trim from Flight mode %1").arg(m), m * 2); if (IS_HORUS_OR_TARANIS(board)) { - cb->addItem(tr("Use Trim from Flight mode %1 + Own Trim as an offset").arg(m), m*2+1); + cb->addItem(tr("Use Trim from Flight mode %1 + Own Trim as an offset").arg(m), m * 2 + 1); } } } connect(cb, SIGNAL(currentIndexChanged(int)), this, SLOT(phaseTrimUse_currentIndexChanged(int))); + int trimsMax = firmware->getCapability(ExtendedTrimsRange); + if (trimsMax == 0 || !model.extendedTrims) { + trimsMax = firmware->getCapability(TrimsRange); + } + trimsValue[i]->setProperty("index", i); + trimsValue[i]->setRange(-trimsMax, +trimsMax); connect(trimsValue[i], SIGNAL(valueChanged(int)), this, SLOT(phaseTrim_valueChanged())); trimsSlider[i]->setProperty("index", i); + trimsSlider[i]->setRange(-trimsMax, +trimsMax); + int chn = CONVERT_MODE(i + 1) - 1; + if (chn == 2/*TODO constant*/ && model.throttleReversed) + trimsSlider[i]->setInvertedAppearance(true); connect(trimsSlider[i], SIGNAL(valueChanged(int)), this, SLOT(phaseTrimSlider_valueChanged())); } // Rotary encoders if (reCount > 0) { QGridLayout *reLayout = new QGridLayout(ui->reGB); - for (int i=0; ireGB); - label->setText(tr("Rotary Encoder %1").arg(i+1)); + label->setText(tr("Rotary Encoder %1").arg(i + 1)); reLayout->addWidget(label, i, 0, 1, 1); if (phaseIdx > 0) { // RE link to another RE reUse[i] = new QComboBox(ui->reGB); reUse[i]->setProperty("index", i); Helpers::populateGvarUseCB(reUse[i], phaseIdx); - if (phase.rotaryEncoders[i] > 1024) { - reUse[i]->setCurrentIndex(phase.rotaryEncoders[i] - 1024); - } connect(reUse[i], SIGNAL(currentIndexChanged(int)), this, SLOT(phaseREUse_currentIndexChanged(int))); reLayout->addWidget(reUse[i], i, 1, 1, 1); } // RE value reValues[i] = new QSpinBox(ui->reGB); reValues[i]->setProperty("index", i); - reValues[i]->setMinimum(-1024); - reValues[i]->setMaximum(1024); + reValues[i]->setMinimum(RENC_MIN_VALUE); + reValues[i]->setMaximum(RENC_MAX_VALUE); connect(reValues[i], SIGNAL(editingFinished()), this, SLOT(phaseREValue_editingFinished())); reLayout->addWidget(reValues[i], i, 2, 1, 1); } @@ -206,15 +212,16 @@ FlightModePanel::FlightModePanel(QWidget * parent, ModelData & model, int phaseI gvLayout->addWidget(popupLabel, 0, headerCol++, 1, 1); } - for (int i=0; igvGB); - label->setText(tr("GVAR%1").arg(i+1)); + label->setText(tr("GVAR%1").arg(i + 1)); label->setProperty("index", i); label->setContextMenuPolicy(Qt::CustomContextMenu); - connect(label, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(gvLabel_customContextMenuRequested(const QPoint &))); - gvLayout->addWidget(label, i+1, col++, 1, 1); + label->setToolTip(tr("Popup menu available")); + connect(label, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(gvOnCustomContextMenuRequested(const QPoint &))); + gvLayout->addWidget(label, i + 1, col++, 1, 1); // GVar name int nameLen = firmware->getCapability(GvarsName); if (nameLen > 0) { @@ -222,24 +229,21 @@ FlightModePanel::FlightModePanel(QWidget * parent, ModelData & model, int phaseI gvNames[i]->setProperty("index", i); gvNames[i]->setMaxLength(nameLen); connect(gvNames[i], SIGNAL(editingFinished()), this, SLOT(GVName_editingFinished())); - gvLayout->addWidget(gvNames[i], i+1, col++, 1, 1); + gvLayout->addWidget(gvNames[i], i + 1, col++, 1, 1); } if (phaseIdx > 0) { // GVar link to another GVar gvUse[i] = new QComboBox(ui->gvGB); gvUse[i]->setProperty("index", i); Helpers::populateGvarUseCB(gvUse[i], phaseIdx); - if (phase.gvars[i] > GVAR_MAX_VALUE) { - gvUse[i]->setCurrentIndex(phase.gvars[i] - GVAR_MAX_VALUE); - } connect(gvUse[i], SIGNAL(currentIndexChanged(int)), this, SLOT(phaseGVUse_currentIndexChanged(int))); - gvLayout->addWidget(gvUse[i], i+1, col++, 1, 1); + gvLayout->addWidget(gvUse[i], i + 1, col++, 1, 1); } // GVar value gvValues[i] = new QDoubleSpinBox(ui->gvGB); gvValues[i]->setProperty("index", i); connect(gvValues[i], SIGNAL(editingFinished()), this, SLOT(phaseGVValue_editingFinished())); - gvLayout->addWidget(gvValues[i], i+1, col++, 1, 1); + gvLayout->addWidget(gvValues[i], i + 1, col++, 1, 1); if (IS_HORUS_OR_TARANIS(board) && phaseIdx == 0) { // GVar unit @@ -247,33 +251,33 @@ FlightModePanel::FlightModePanel(QWidget * parent, ModelData & model, int phaseI gvUnit[i]->setProperty("index", i); populateGvarUnitCB(gvUnit[i]); connect(gvUnit[i], SIGNAL(currentIndexChanged(int)), this, SLOT(phaseGVUnit_currentIndexChanged(int))); - gvLayout->addWidget(gvUnit[i], i+1, col++, 1, 1); + gvLayout->addWidget(gvUnit[i], i + 1, col++, 1, 1); // GVar precision gvPrec[i] = new QComboBox(ui->gvGB); gvPrec[i]->setProperty("index", i); populateGvarPrecCB(gvPrec[i]); connect(gvPrec[i], SIGNAL(currentIndexChanged(int)), this, SLOT(phaseGVPrec_currentIndexChanged(int))); - gvLayout->addWidget(gvPrec[i], i+1, col++, 1, 1); + gvLayout->addWidget(gvPrec[i], i + 1, col++, 1, 1); // GVar min gvMin[i] = new QDoubleSpinBox(ui->gvGB); gvMin[i]->setProperty("index", i); connect(gvMin[i], SIGNAL(editingFinished()), this, SLOT(phaseGVMin_editingFinished())); - gvLayout->addWidget(gvMin[i], i+1, col++, 1, 1); + gvLayout->addWidget(gvMin[i], i + 1, col++, 1, 1); // GVar max gvMax[i] = new QDoubleSpinBox(ui->gvGB); gvMax[i]->setProperty("index", i); connect(gvMax[i], SIGNAL(editingFinished()), this, SLOT(phaseGVMax_editingFinished())); - gvLayout->addWidget(gvMax[i], i+1, col++, 1, 1); + gvLayout->addWidget(gvMax[i], i + 1, col++, 1, 1); // Popups gvPopups[i] = new QCheckBox(ui->gvGB); gvPopups[i]->setProperty("index", i); //gvPopups[i]->setText(tr("Popup enabled")); connect(gvPopups[i], SIGNAL(toggled(bool)), this, SLOT(phaseGVPopupToggled(bool))); - gvLayout->addWidget(gvPopups[i], i+1, col++, 1, 1); + gvLayout->addWidget(gvPopups[i], i + 1, col++, 1, 1); } } } @@ -302,45 +306,35 @@ void FlightModePanel::update() ui->fadeOut->setValue(float(phase.fadeOut)/scale); for (int i = 0; i < getBoardCapability(firmware->getBoard(), Board::NumTrims); i++) { - int trimsMax = firmware->getCapability(ExtendedTrimsRange); - if (trimsMax == 0 || !model->extendedTrims) { - trimsMax = firmware->getCapability(TrimsRange); - } - trimsSlider[i]->setRange(-trimsMax, +trimsMax); - trimsValue[i]->setRange(-trimsMax, +trimsMax); - int chn = CONVERT_MODE(i+1)-1; - if (chn == 2/*TODO constant*/ && model->throttleReversed) - trimsSlider[i]->setInvertedAppearance(true); trimUpdate(i); } - for (int i=0; isetDisabled(false); - int idx = phase.rotaryEncoders[i]; - FlightModeData *phasere = &phase; - while (idx > 1024) { - int nextPhase = idx - 1025; - if (nextPhase >= phaseIdx) nextPhase += 1; - phasere = &model->flightModeData[nextPhase]; - idx = phasere->rotaryEncoders[i]; - reValues[i]->setDisabled(true); - } - reValues[i]->setValue(phasere->rotaryEncoders[i]); + for (int i = 0; i < reCount; i++) { + updateRotaryEncoder(i); } + + emit nameModified(); } + void FlightModePanel::updateGVar(int index) { lock = true; if (firmware->getCapability(GvarsName) > 0) { gvNames[index]->setText(model->gvarData[index].name); } + if (phaseIdx > 0) { + if (model->isGVarLinked(phaseIdx, index)) + gvUse[index]->setCurrentIndex(phase.gvars[index] - GVAR_MAX_VALUE); + else + gvUse[index]->setCurrentIndex(0); + } gvValues[index]->setDisabled(model->isGVarLinked(phaseIdx, index)); - setGVSB(gvValues[index], model->gvarData[index].getMin(), model->gvarData[index].getMax(), model->getGVarFieldValue(phaseIdx, index)); - if (IS_HORUS_OR_TARANIS(getCurrentBoard()) && phaseIdx == 0) { + setGVSB(gvValues[index], model->gvarData[index].getMin(), model->gvarData[index].getMax(), model->getGVarValue(phaseIdx, index)); + if (IS_HORUS_OR_TARANIS(board) && phaseIdx == 0) { gvUnit[index]->setCurrentIndex(model->gvarData[index].unit); gvPrec[index]->setCurrentIndex(model->gvarData[index].prec); setGVSB(gvMin[index], GVAR_MIN_VALUE, model->gvarData[index].getMax(), model->gvarData[index].getMin()); @@ -362,6 +356,20 @@ void FlightModePanel::setGVSB(QDoubleSpinBox * sb, int min, int max, int val) sb->setValue(val * mul); } +void FlightModePanel::updateRotaryEncoder(int index) +{ + lock = true; + if (phaseIdx > 0) { + if (model->isREncLinked(phaseIdx, index)) + reUse[index]->setCurrentIndex(phase.rotaryEncoders[index] - RENC_MAX_VALUE); + else + reUse[index]->setCurrentIndex(0); + } + reValues[index]->setDisabled(model->isREncLinked(phaseIdx, index)); + reValues[index]->setValue(model->getREncValue(phaseIdx, index)); + lock = false; +} + // TODO: pull units from GVarData void FlightModePanel::populateGvarUnitCB(QComboBox * cb) { @@ -380,45 +388,44 @@ void FlightModePanel::populateGvarPrecCB(QComboBox * cb) void FlightModePanel::phaseName_editingFinished() { - QLineEdit *lineEdit = qobject_cast(sender()); - strcpy(phase.name, lineEdit->text().toLatin1()); - emit modified(); - emit nameModified(); + QLineEdit *lineEdit = qobject_cast(sender()); + strcpy(phase.name, lineEdit->text().toLatin1()); + emit modified(); + emit nameModified(); } void FlightModePanel::phaseSwitchChanged(int index) { - if (lock) - return; - - bool ok; - const RawSwitch rs(ui->swtch->itemData(index).toInt(&ok)); - if (ok && phase.swtch.toValue() != rs.toValue()) { - phase.swtch = rs; - emit modified(); + if (!lock) { + bool ok; + const RawSwitch rs(ui->swtch->itemData(index).toInt(&ok)); + if (ok && phase.swtch.toValue() != rs.toValue()) { + phase.swtch = rs; + emit modified(); + } } } void FlightModePanel::phaseFadeIn_editingFinished() { - QDoubleSpinBox *spinBox = qobject_cast(sender()); - int scale = firmware->getCapability(SlowScale); - phase.fadeIn = round(spinBox->value()*scale); - emit modified(); + QDoubleSpinBox *spinBox = qobject_cast(sender()); + int scale = firmware->getCapability(SlowScale); + phase.fadeIn = round(spinBox->value()*scale); + emit modified(); } void FlightModePanel::phaseFadeOut_editingFinished() { - QDoubleSpinBox *spinBox = qobject_cast(sender()); - int scale = firmware->getCapability(SlowScale); - phase.fadeOut = round(spinBox->value()*scale); - emit modified(); + QDoubleSpinBox *spinBox = qobject_cast(sender()); + int scale = firmware->getCapability(SlowScale); + phase.fadeOut = round(spinBox->value()*scale); + emit modified(); } void FlightModePanel::trimUpdate(unsigned int trim) { lock = true; - int chn = CONVERT_MODE(trim+1)-1; + int chn = CONVERT_MODE(trim + 1) - 1; int value = model->getTrimValue(phaseIdx, chn); trimsSlider[trim]->setValue(value); trimsValue[trim]->setValue(value); @@ -428,9 +435,8 @@ void FlightModePanel::trimUpdate(unsigned int trim) trimsSlider[trim]->setEnabled(false); } else { - Board::Type board = firmware->getBoard(); if (IS_HORUS_OR_TARANIS(board)) - trimsUse[trim]->setCurrentIndex(1 + 2*phase.trimRef[chn] + phase.trimMode[chn] - (phase.trimRef[chn] > phaseIdx ? 1 : 0)); + trimsUse[trim]->setCurrentIndex(1 + 2 * phase.trimRef[chn] + phase.trimMode[chn] - (phase.trimRef[chn] > phaseIdx ? 1 : 0)); else trimsUse[trim]->setCurrentIndex(phase.trimRef[chn]); if (phaseIdx == 0 || phase.trimRef[chn] == phaseIdx || (IS_HORUS_OR_TARANIS(board) && phase.trimMode[chn] != 0)) { @@ -451,6 +457,7 @@ void FlightModePanel::phaseGVValue_editingFinished() QDoubleSpinBox *spinBox = qobject_cast(sender()); int gvar = spinBox->property("index").toInt(); phase.gvars[gvar] = spinBox->value() * model->gvarData[gvar].multiplierSet(); + emit datachanged(); emit modified(); } } @@ -462,6 +469,7 @@ void FlightModePanel::GVName_editingFinished() int gvar = lineedit->property("index").toInt(); memset(&model->gvarData[gvar].name, 0, sizeof(model->gvarData[gvar].name)); strcpy(model->gvarData[gvar].name, lineedit->text().toLatin1()); + emit datachanged(); emit modified(); } } @@ -478,7 +486,9 @@ void FlightModePanel::phaseGVUse_currentIndexChanged(int index) else { phase.gvars[gvar] = GVAR_MAX_VALUE + index; } - updateGVar(gvar); + if (model->isGVarLinkedCircular(phaseIdx, gvar)) + QMessageBox::warning(this, "Companion", tr("Warning: Global variable links back to itself. Flight Mode 0 value used.")); + emit datachanged(); emit modified(); lock = false; } @@ -490,8 +500,8 @@ void FlightModePanel::phaseGVUnit_currentIndexChanged(int index) QComboBox *comboBox = qobject_cast(sender()); int gvar = comboBox->property("index").toInt(); model->gvarData[gvar].unit = index; + emit datachanged(); emit modified(); - updateGVar(gvar); } } @@ -501,8 +511,8 @@ void FlightModePanel::phaseGVPrec_currentIndexChanged(int index) QComboBox *comboBox = qobject_cast(sender()); int gvar = comboBox->property("index").toInt(); model->gvarData[gvar].prec = index; + emit datachanged(); emit modified(); - updateGVar(gvar); } } @@ -513,19 +523,19 @@ void FlightModePanel::phaseGVMin_editingFinished() int gvar = spinBox->property("index").toInt(); model->gvarData[gvar].setMin(spinBox->value()); if (!model->isGVarLinked(phaseIdx, gvar)) { - if (model->getGVarFieldValuePrec(phaseIdx, gvar) < spinBox->value()) { + if (model->getGVarValuePrec(phaseIdx, gvar) < spinBox->value()) { phase.gvars[gvar] = model->gvarData[gvar].getMin(); } } - for (int x=1; xgetCapability(FlightModes); x++) { + for (int x = 1; x < fmCount; x++) { if (!model->isGVarLinked(x, gvar)) { if (model->flightModeData[x].gvars[gvar] < model->gvarData[gvar].getMin()) { model->flightModeData[x].gvars[gvar] = model->gvarData[gvar].getMin(); } } } + emit datachanged(); emit modified(); - updateGVar(gvar); } } @@ -536,19 +546,19 @@ void FlightModePanel::phaseGVMax_editingFinished() int gvar = spinBox->property("index").toInt(); model->gvarData[gvar].setMax(spinBox->value()); if (!model->isGVarLinked(phaseIdx, gvar)) { - if (model->getGVarFieldValuePrec(phaseIdx, gvar) > spinBox->value()) { + if (model->getGVarValuePrec(phaseIdx, gvar) > spinBox->value()) { phase.gvars[gvar] = model->gvarData[gvar].getMax(); } } - for (int x=1; xgetCapability(FlightModes); x++) { + for (int x = 1; x < fmCount; x++) { if (!model->isGVarLinked(x, gvar)) { if (model->flightModeData[x].gvars[gvar] > model->gvarData[gvar].getMax()) { model->flightModeData[x].gvars[gvar] = model->gvarData[gvar].getMax(); } } } + emit datachanged(); emit modified(); - updateGVar(gvar); } } @@ -582,11 +592,13 @@ void FlightModePanel::phaseREUse_currentIndexChanged(int index) phase.rotaryEncoders[re] = 0; } else { - phase.rotaryEncoders[re] = 1024 + index; ; + phase.rotaryEncoders[re] = RENC_MAX_VALUE + index; ; } update(); - lock = false; + if (model->isREncLinkedCircular(phaseIdx, re)) + QMessageBox::warning(this, "Companion", tr("Warning: Rotary encoder links back to itself. Flight Mode 0 value used.")); emit modified(); + lock = false; } } @@ -595,7 +607,7 @@ void FlightModePanel::phaseTrimUse_currentIndexChanged(int index) if (!lock) { QComboBox *comboBox = qobject_cast(sender()); int trim = comboBox->property("index").toInt(); - int chn = CONVERT_MODE(trim+1)-1; + int chn = CONVERT_MODE(trim + 1) - 1; int data = comboBox->itemData(index).toInt(); if (data < 0) { phase.trimMode[chn] = -1; @@ -603,7 +615,6 @@ void FlightModePanel::phaseTrimUse_currentIndexChanged(int index) phase.trim[chn] = 0; } else { - Board::Type board = firmware->getBoard(); if (IS_HORUS_OR_TARANIS(board)) { phase.trimMode[chn] = data % 2; phase.trimRef[chn] = data / 2; @@ -624,7 +635,7 @@ void FlightModePanel::phaseTrim_valueChanged() if (!lock) { QSpinBox *spinBox = qobject_cast(sender()); int trim = spinBox->property("index").toInt(); - int chn = CONVERT_MODE(trim+1)-1; + int chn = CONVERT_MODE(trim + 1) - 1; int value = spinBox->value(); model->setTrimValue(phaseIdx, chn, value); lock = true; @@ -639,7 +650,7 @@ void FlightModePanel::phaseTrimSlider_valueChanged() if (!lock) { QSlider *slider = qobject_cast(sender()); int trim = slider->property("index").toInt(); - int chn = CONVERT_MODE(trim+1)-1; + int chn = CONVERT_MODE(trim + 1) - 1; int value = slider->value(); model->setTrimValue(phaseIdx, chn, value); lock = true; @@ -649,78 +660,638 @@ void FlightModePanel::phaseTrimSlider_valueChanged() } } -void FlightModePanel::name_customContextMenuRequested(const QPoint & pos) +void FlightModePanel::onCustomContextMenuRequested(QPoint pos) { QLabel *label = (QLabel *)sender(); QPoint globalPos = label->mapToGlobal(pos); + QMenu contextMenu; - contextMenu.addAction(CompanionIcon("clear.png"), tr("&Clear"),this,SLOT(fmClear()),tr("Clear")); + contextMenu.addAction(CompanionIcon("copy.png"), tr("Copy"), this, SLOT(cmCopy())); + contextMenu.addAction(CompanionIcon("cut.png"), tr("Cut"), this, SLOT(cmCut())); + contextMenu.addAction(CompanionIcon("paste.png"), tr("Paste"), this, SLOT(cmPaste()))->setEnabled(hasClipboardData()); + contextMenu.addAction(CompanionIcon("clear.png"), tr("Clear"), this, SLOT(cmClear())); + contextMenu.addSeparator(); + contextMenu.addAction(CompanionIcon("arrow-right.png"), tr("Insert"), this, SLOT(cmInsert()))->setEnabled(insertAllowed()); + contextMenu.addAction(CompanionIcon("arrow-left.png"), tr("Delete"), this, SLOT(cmDelete())); + contextMenu.addAction(CompanionIcon("moveup.png"), tr("Move Up"), this, SLOT(cmMoveUp()))->setEnabled(moveUpAllowed()); + contextMenu.addAction(CompanionIcon("movedown.png"), tr("Move Down"), this, SLOT(cmMoveDown()))->setEnabled(moveDownAllowed()); + contextMenu.addSeparator(); + contextMenu.addAction(CompanionIcon("clear.png"), tr("Clear All"), this, SLOT(cmClearAll()))->setEnabled(phaseIdx == 0); + contextMenu.exec(globalPos); } -void FlightModePanel::fmClear() +bool FlightModePanel::hasClipboardData(QByteArray * data) const { - int res = QMessageBox::question(this, CPN_STR_APP_NAME, tr("Clear all current Flight Mode properties?"), QMessageBox::Yes | QMessageBox::No); - if (res == QMessageBox::Yes) { - phase.clear(phaseIdx); - if (phaseIdx == 0) { - if (IS_HORUS_OR_TARANIS(getCurrentBoard())) { - for (int i=0; i < gvCount; ++i) { - model->gvarData[i].clear(); + const QClipboard * clipboard = QApplication::clipboard(); + const QMimeData * mimeData = clipboard->mimeData(); + if (mimeData->hasFormat(MIMETYPE_FLIGHTMODE)) { + if (data) + data->append(mimeData->data(MIMETYPE_FLIGHTMODE)); + return true; + } + return false; +} + +bool FlightModePanel::insertAllowed() const +{ + return ((phaseIdx < fmCount - 1) && (model->flightModeData[fmCount - 1].isEmpty(fmCount - 1))); +} + +bool FlightModePanel::moveDownAllowed() const +{ + return phaseIdx < fmCount - 1; +} + +bool FlightModePanel::moveUpAllowed() const +{ + return phaseIdx > 0; +} + +void FlightModePanel::cmClear() +{ + if (QMessageBox::question(this, CPN_STR_APP_NAME, tr("Clear Flight Mode. Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) + return; + + phase.clear(phaseIdx); + + if (phaseIdx == 0) { + for (int i = 0; i < gvCount; i++) { + model->gvarData[i].clear(); + for (int j = 0; j < fmCount; j++) { + FlightModeData *fm = &model->flightModeData[j]; + fm->gvars[i] = fm->linkedGVarFlightModeZero(j); + } + model->updateAllReferences(ModelData::REF_UPD_TYPE_GLOBAL_VARIABLE, ModelData::REF_UPD_ACT_CLEAR, i); + } + } + else { + QComboBox * pswtch = ui->swtch; + RawSwitch item = RawSwitch(SWITCH_TYPE_NONE); + pswtch->setCurrentIndex(pswtch->findText(item.toString())); + for (int i = 0; i < gvCount; i++) { + phase.gvars[i] = phase.linkedGVarFlightModeZero(phaseIdx); + } + for (int i = 0; i < reCount; i++) { + phase.rotaryEncoders[i] = phase.linkedREncFlightModeZero(phaseIdx); + } + } + + model->updateAllReferences(ModelData::REF_UPD_TYPE_FLIGHT_MODE, ModelData::REF_UPD_ACT_CLEAR, phaseIdx); + + emit datachanged(); + emit modified(); +} + +void FlightModePanel::cmClearAll() +{ + if (QMessageBox::question(this, CPN_STR_APP_NAME, tr("Clear all Flight Modes. Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) + return; + + for (int j = 0; j < fmCount; j++) { + FlightModeData *fm = &model->flightModeData[j]; + fm->clear(j); + for (int i = 0; i < gvCount; i++) { + fm->gvars[i] = fm->linkedGVarFlightModeZero(j); + } + for (int i = 0; i < reCount; i++) { + fm->rotaryEncoders[i] = fm->linkedREncFlightModeZero(j); + } + model->updateAllReferences(ModelData::REF_UPD_TYPE_FLIGHT_MODE, ModelData::REF_UPD_ACT_CLEAR, j); + } + + for (int i = 0; i < gvCount; i++) { + model->gvarData[i].clear(); + model->updateAllReferences(ModelData::REF_UPD_TYPE_GLOBAL_VARIABLE, ModelData::REF_UPD_ACT_CLEAR, i); + } + + emit datachanged(); + emit modified(); +} + +void FlightModePanel::cmCopy() +{ + QByteArray data; + data.append((char*)&model->flightModeData[phaseIdx], sizeof(FlightModeData)); + QMimeData *mimeData = new QMimeData; + mimeData->setData(MIMETYPE_FLIGHTMODE, data); + QApplication::clipboard()->setMimeData(mimeData,QClipboard::Clipboard); +} + +void FlightModePanel::cmCut() +{ + cmCopy(); + cmClear(); +} + +void FlightModePanel::cmDelete() +{ + if (QMessageBox::question(this, CPN_STR_APP_NAME, tr("Delete Flight Mode. Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) + return; + + const int maxidx = fmCount - 1; + + memmove(&model->flightModeData[phaseIdx], &model->flightModeData[phaseIdx + 1], (CPN_MAX_FLIGHT_MODES - (phaseIdx + 1)) * sizeof(FlightModeData)); + model->flightModeData[maxidx].clear(maxidx); + + for (int j = 0; j < maxidx; j++) { + FlightModeData *fm = &model->flightModeData[j]; + + if (phaseIdx == 0 && j == 0) + fm->swtch = RawSwitch(0); + + for (int i = 0; i < trimCount; i++) { + if (phaseIdx == 0 && j == 0) { + fm->trimMode[i] = 0; + fm->trimRef[i] = 0; + } + else if (fm->trimRef[i] > phaseIdx && fm->trimMode[i] > -1) { + fm->trimRef[i]--; + } + else if (fm->trimRef[i] == phaseIdx) { + fm->trimMode[i] = 0; + fm->trimRef[i] = 0; + fm->trim[i] = 0; + } + } + + for (int i = 0; i < gvCount; i++) { + if (model->isGVarLinked(j, i)) { + int idx = model->getGVarFlightModeIndex(j, i); + if (phaseIdx == 0 && j == 0) + model->setGVarFlightModeIndexToValue(j, i, j); + else if (idx > phaseIdx) + model->setGVarFlightModeIndexToValue(j, i, idx - 1); + else if (idx == phaseIdx) + model->setGVarFlightModeIndexToValue(j, i, 0); + } + } + + for (int i = 0; i < reCount; i++) { + if (model->isREncLinked(j, i)) { + int idx = model->getREncFlightModeIndex(j, i); + if (phaseIdx == 0 && j == 0) + model->setREncFlightModeIndexToValue(j, i, j); + else if (idx > phaseIdx) + model->setREncFlightModeIndexToValue(j, i, idx - 1); + else if (idx == phaseIdx) + model->setREncFlightModeIndexToValue(j, i, 0); + } + } + } + + model->updateAllReferences(ModelData::REF_UPD_TYPE_FLIGHT_MODE, ModelData::REF_UPD_ACT_SHIFT, phaseIdx, 0, -1); + + emit datachanged(); + emit modified(); +} + +void FlightModePanel::cmInsert() +{ + const int maxidx = fmCount - 1; + + memmove(&model->flightModeData[phaseIdx + 1], &model->flightModeData[phaseIdx], (CPN_MAX_FLIGHT_MODES - (phaseIdx + 1)) * sizeof(FlightModeData)); + model->flightModeData[phaseIdx].clear(phaseIdx); + + for (int j = maxidx; j > 0; j--) { + FlightModeData *fm = &model->flightModeData[j]; + + for (int i = 0; i < trimCount; i++) { + if (phaseIdx == 0 and j == 1) + fm->trimRef[i] = j; + else if (fm->trimRef[i] >= phaseIdx) { + if (fm->trimRef[i] < maxidx) + fm->trimRef[i]++; + else { + fm->trimMode[i] = 0; + fm->trimRef[i] = 0; + fm->trim[i] = 0; } } } - else { - lock = true; - QComboBox * pswtch = ui->swtch; - RawSwitch item = RawSwitch(SWITCH_TYPE_NONE); - pswtch->setCurrentIndex(pswtch->findText(item.toString())); - if (gvCount > 0 && (firmware->getCapability(GvarsFlightModes))) { - for (int i=0; isetCurrentIndex((phase.gvars[i] > GVAR_MAX_VALUE ? (phase.gvars[i] - GVAR_MAX_VALUE) : 0)); - } + + for (int i = 0; i < gvCount; i++) { + if (model->isGVarLinked(j, i)) { + int idx = model->getGVarFlightModeIndex(j, i); + if (phaseIdx == 0 and j == 1) + model->setGVarFlightModeIndexToValue(j, i, j); + else if (idx >= phaseIdx) + model->setGVarFlightModeIndexToValue(j, i, idx + 1); } - for (int i=0; isetCurrentIndex((phase.rotaryEncoders[i] > GVAR_MAX_VALUE ? (phase.rotaryEncoders[i] - GVAR_MAX_VALUE) : 0)); - } - lock = false; } - update(); + + for (int i = 0; i < reCount; i++) { + if (model->isREncLinked(j, i)) { + int idx = model->getREncFlightModeIndex(j, i); + if (phaseIdx == 0 and j == 1) + model->setREncFlightModeIndexToValue(j, i, j); + else if (idx >= phaseIdx) + model->setREncFlightModeIndexToValue(j, i, idx + 1); + } + } + } + + model->updateAllReferences(ModelData::REF_UPD_TYPE_FLIGHT_MODE, ModelData::REF_UPD_ACT_SHIFT, phaseIdx, 0, 1); + + emit datachanged(); + emit modified(); +} + +void FlightModePanel::cmMoveDown() +{ + swapData(phaseIdx, phaseIdx + 1); +} + +void FlightModePanel::cmMoveUp() +{ + swapData(phaseIdx, phaseIdx - 1); +} + +void FlightModePanel::cmPaste() +{ + QByteArray data; + if (hasClipboardData(&data)) { + FlightModeData *fm = &model->flightModeData[phaseIdx]; + memcpy(fm, data.constData(), sizeof(FlightModeData)); + + if (phaseIdx == 0) + fm->swtch = RawSwitch(0); + + for (int i = 0; i < trimCount; i++) { + if (phaseIdx == 0) { + fm->trimMode[i] = 0; + fm->trimRef[i] = 0; + } + } + + // TODO fix up linked GVs but need to know source FM index to make adjustments + for (int i = 0; i < gvCount; i++) { + if (model->isGVarLinked(phaseIdx, i)) { + int linkedidx = model->getGVarFlightModeIndex(phaseIdx, i); + if (phaseIdx == 0 || linkedidx == phaseIdx) + model->setGVarFlightModeIndexToValue(phaseIdx, i, phaseIdx); + } + } + + // TODO fix up linked REs but need to know source FM index to make adjustments + for (int i = 0; i < reCount; i++) { + if (model->isREncLinked(phaseIdx, i)) { + int linkedidx = model->getREncFlightModeIndex(phaseIdx, i); + if (phaseIdx == 0 || linkedidx == phaseIdx) + model->setREncFlightModeIndexToValue(phaseIdx, i, phaseIdx); + } + } + + emit datachanged(); emit modified(); - emit nameModified(); } } -void FlightModePanel::gvLabel_customContextMenuRequested(const QPoint & pos) +void FlightModePanel::swapData(int idx1, int idx2) +{ + if (idx1 == idx2) + return; + + const int shift = idx2 - idx1; + + FlightModeData fmdtmp = model->flightModeData[idx2]; + FlightModeData *fmd1 = &model->flightModeData[idx1]; + FlightModeData *fmd2 = &model->flightModeData[idx2]; + memcpy(fmd2, fmd1, sizeof(FlightModeData)); + memcpy(fmd1, &fmdtmp, sizeof(FlightModeData)); + + if (idx1 == 0) + fmd1->swtch = RawSwitch(0); + else if (idx2 == 0) + fmd2->swtch = RawSwitch(0); + + for (int i = 0; i < trimCount; i++) { + if (fmd1->trimRef[i] == idx1) + fmd1->trimRef[i] = idx2; + else if (fmd1->trimRef[i] == idx2) + fmd1->trimRef[i] = idx1; + + if (fmd2->trimRef[i] == idx1) + fmd2->trimRef[i] = idx2; + else if (fmd2->trimRef[i] == idx2) + fmd2->trimRef[i] = idx1; + + if (idx1 == 0) { + fmd1->trimMode[i] = 0; + fmd1->trimRef[i] = 0; + } + else if (idx2 == 0) { + fmd2->trimMode[i] = 0; + fmd2->trimRef[i] = 0; + } + } + + for (int i = 0; i < gvCount; i++) { + if (model->isGVarLinked(idx1, i)) { + int linkedidx = model->getGVarFlightModeIndex(idx1, i); + if (linkedidx == idx1) + model->setGVarFlightModeIndexToValue(idx1, i, idx2 - shift); + else if (linkedidx == idx2) + model->setGVarFlightModeIndexToValue(idx1, i, idx1 + shift); + else + model->setGVarFlightModeIndexToValue(idx1, i, linkedidx); + } + + if (model->isGVarLinked(idx2, i)) { + int linkedidx = model->getGVarFlightModeIndex(idx2, i); + if (linkedidx == idx1) + model->setGVarFlightModeIndexToValue(idx2, i, idx2 - shift); + else if (linkedidx == idx2) + model->setGVarFlightModeIndexToValue(idx2, i, idx1 + shift); + else + model->setGVarFlightModeIndexToValue(idx2, i, linkedidx); + } + } + + for (int i = 0; i < reCount; i++) { + if (model->isREncLinked(idx1, i)) { + int linkedidx = model->getREncFlightModeIndex(idx1, i); + if (linkedidx == idx1) + model->setREncFlightModeIndexToValue(idx1, i, idx2 - shift); + else if (linkedidx == idx2) + model->setREncFlightModeIndexToValue(idx1, i, idx1 + shift); + else + model->setREncFlightModeIndexToValue(idx1, i, linkedidx); + } + + if (model->isREncLinked(idx2, i)) { + int linkedidx = model->getREncFlightModeIndex(idx2, i); + if (linkedidx == idx1) + model->setREncFlightModeIndexToValue(idx2, i, idx2 - shift); + else if (linkedidx == idx2) + model->setREncFlightModeIndexToValue(idx2, i, idx1 + shift); + else + model->setREncFlightModeIndexToValue(idx2, i, linkedidx); + } + } + + model->updateAllReferences(ModelData::REF_UPD_TYPE_FLIGHT_MODE, ModelData::REF_UPD_ACT_SWAP, idx1, idx2); + emit datachanged(); + emit modified(); +} + +void FlightModePanel::gvOnCustomContextMenuRequested(QPoint pos) { QLabel *label = (QLabel *)sender(); gvIdx = label->property("index").toInt(); QPoint globalPos = label->mapToGlobal(pos); + QMenu contextMenu; - contextMenu.addAction(CompanionIcon("clear.png"), tr("&Clear"),this,SLOT(gvClear()),tr("Clear")); + contextMenu.addAction(CompanionIcon("copy.png"), tr("Copy"), this, SLOT(gvCmCopy())); + contextMenu.addAction(CompanionIcon("cut.png"), tr("Cut"), this, SLOT(gvCmCut())); + contextMenu.addAction(CompanionIcon("paste.png"), tr("Paste"), this, SLOT(gvCmPaste()))->setEnabled(gvHasClipboardData()); + contextMenu.addAction(CompanionIcon("clear.png"), tr("Clear"), this, SLOT(gvCmClear())); + contextMenu.addSeparator(); + contextMenu.addAction(CompanionIcon("arrow-right.png"), tr("Insert"), this, SLOT(gvCmInsert()))->setEnabled(gvInsertAllowed()); + contextMenu.addAction(CompanionIcon("arrow-left.png"), tr("Delete"), this, SLOT(gvCmDelete()))->setEnabled(gvDeleteAllowed()); + contextMenu.addAction(CompanionIcon("moveup.png"), tr("Move Up"), this, SLOT(gvCmMoveUp()))->setEnabled(gvMoveUpAllowed()); + contextMenu.addAction(CompanionIcon("movedown.png"), tr("Move Down"), this, SLOT(gvCmMoveDown()))->setEnabled(gvMoveDownAllowed()); + contextMenu.addSeparator(); + contextMenu.addAction(CompanionIcon("clear.png"), tr("Clear All"), this, SLOT(gvCmClearAll())); + contextMenu.exec(globalPos); } -void FlightModePanel::gvClear() +bool FlightModePanel::gvHasClipboardData() const +{ + if (gvHasDefnClipboardData() || gvHasValueClipboardData()) + return true; + return false; +} + +bool FlightModePanel::gvHasDefnClipboardData(QByteArray * data) const +{ + const QClipboard * clipboard = QApplication::clipboard(); + const QMimeData * mimeData = clipboard->mimeData(); + if (phaseIdx == 0 && mimeData->hasFormat(MIMETYPE_GVAR_PARAMS)) { + if (data) { + data->clear(); + data->append(mimeData->data(MIMETYPE_GVAR_PARAMS)); + } + return true; + } + return false; +} + +bool FlightModePanel::gvHasValueClipboardData(QByteArray * data) const +{ + const QClipboard * clipboard = QApplication::clipboard(); + const QMimeData * mimeData = clipboard->mimeData(); + if (mimeData->hasFormat(MIMETYPE_GVAR_VALUE)) { + if (data) { + data->clear(); + data->append(mimeData->data(MIMETYPE_GVAR_VALUE)); + } + return true; + } + return false; +} + +bool FlightModePanel::gvDeleteAllowed() const +{ + return phaseIdx == 0; +} + +bool FlightModePanel::gvInsertAllowed() const +{ + bool ret = true; + if (phaseIdx == 0) { + if (!model->gvarData[gvCount - 1].isEmpty()) + ret = false; + for (int i = 0; i < fmCount; i++) { + if (model->flightModeData[i].gvars[gvCount - 1] != phase.linkedGVarFlightModeZero(i)) + ret = false; + } + } + else + ret = false; + + return ret; +} + +bool FlightModePanel::gvMoveDownAllowed() const +{ + return (phaseIdx == 0 && gvIdx < gvCount - 1); +} + +bool FlightModePanel::gvMoveUpAllowed() const +{ + return (phaseIdx == 0 && gvIdx > 0); +} + +void FlightModePanel::gvCmClear() { if (phaseIdx == 0) { - if (IS_HORUS_OR_TARANIS(getCurrentBoard())) { - model->gvarData[gvIdx].clear(); - phase.gvars[gvIdx] = 0; + if (QMessageBox::question(this, CPN_STR_APP_NAME, tr("Clear selected Global Variable across all Flight Modes. Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) + return; + model->gvarData[gvIdx].clear(); + for (int i = 0; i < fmCount; i++) { + model->flightModeData[i].gvars[gvIdx] = model->flightModeData[i].linkedGVarFlightModeZero(i); + } + model->updateAllReferences(ModelData::REF_UPD_TYPE_GLOBAL_VARIABLE, ModelData::REF_UPD_ACT_CLEAR, gvIdx); + } + else { + phase.gvars[gvIdx] = phase.linkedGVarFlightModeZero(phaseIdx); + } + emit datachanged(); + emit modified(); +} + +void FlightModePanel::gvCmClearAll() +{ + if (phaseIdx == 0) { + if (QMessageBox::question(this, CPN_STR_APP_NAME, tr("Clear all Global Variables for all Flight Modes. Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) + return; + for (int i = 0; i < gvCount; i++) { + model->gvarData[i].clear(); + for (int j = 0; j < fmCount; j++) { + model->flightModeData[j].gvars[i] = model->flightModeData[j].linkedGVarFlightModeZero(j); + } + model->updateAllReferences(ModelData::REF_UPD_TYPE_GLOBAL_VARIABLE, ModelData::REF_UPD_ACT_CLEAR, i); } } else { - lock = true; - if (gvCount > 0 && (firmware->getCapability(GvarsFlightModes))) { - phase.gvars[gvIdx] = GVAR_MAX_VALUE + 1; - gvUse[gvIdx]->setCurrentIndex(1); + if (QMessageBox::question(this, CPN_STR_APP_NAME, tr("Clear all Global Variables for this Flight Mode. Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) + return; + for (int i = 0; i < gvCount; i++) { + phase.gvars[i] = phase.linkedGVarFlightModeZero(phaseIdx); } - lock = false; } - update(); + emit datachanged(); emit modified(); } +void FlightModePanel::gvCmCopy() +{ + QMimeData *mimeData = new QMimeData; + QByteArray data; + if (phaseIdx == 0) { + data.append((char*)&model->gvarData[gvIdx], sizeof(GVarData)); + mimeData->setData(MIMETYPE_GVAR_PARAMS, data); + } + else { + mimeData->removeFormat(MIMETYPE_GVAR_PARAMS); + } + QApplication::clipboard()->setMimeData(mimeData, QClipboard::Clipboard); + int val = phase.gvars[gvIdx]; + if (model->isGVarLinked(phaseIdx, gvIdx)) + val = GVAR_MAX_VALUE + 1 + model->getGVarFlightModeIndex(phaseIdx, gvIdx); // store index in case paste is to another flight mode + data.setNum(val); + mimeData->setData(MIMETYPE_GVAR_VALUE, data); + QApplication::clipboard()->setMimeData(mimeData, QClipboard::Clipboard); +} + +void FlightModePanel::gvCmCut() +{ + gvCmCopy(); + if (phaseIdx > 0) { + gvCmClear(); + } + else { + model->gvarData[gvIdx].clear(); + phase.gvars[gvIdx] = 0; + model->updateAllReferences(ModelData::REF_UPD_TYPE_GLOBAL_VARIABLE, ModelData::REF_UPD_ACT_CLEAR, gvIdx); + emit datachanged(); + emit modified(); + } +} + +void FlightModePanel::gvCmDelete() +{ + if (phaseIdx > 0) + return; + int maxidx = gvCount - 1; + for (int i = gvIdx; i < maxidx; i++) { + memcpy(&model->gvarData[i], &model->gvarData[i + 1], sizeof(GVarData)); + for (int j = 0; j < fmCount; j++) { + model->flightModeData[j].gvars[i] = model->flightModeData[j].gvars[i + 1]; + } + } + + model->gvarData[maxidx].clear(); + for (int j = 0; j < fmCount; j++) { + model->flightModeData[j].gvars[maxidx] = model->flightModeData[j].linkedGVarFlightModeZero(j); + } + model->updateAllReferences(ModelData::REF_UPD_TYPE_GLOBAL_VARIABLE, ModelData::REF_UPD_ACT_SHIFT, gvIdx, 0, -1); + emit datachanged(); + emit modified(); +} + +void FlightModePanel::gvCmInsert() +{ + for (int i = (gvCount - 1); i > gvIdx; i--) { + memcpy(&model->gvarData[i], &model->gvarData[i - 1], sizeof(GVarData)); + for (int j = 0; j < fmCount; j++) { + model->flightModeData[j].gvars[i] = model->flightModeData[j].gvars[i - 1]; + } + } + model->gvarData[gvIdx].clear(); + for (int j = 0; j < fmCount; j++) { + model->flightModeData[j].gvars[gvIdx] = model->flightModeData[j].linkedGVarFlightModeZero(j); + } + model->updateAllReferences(ModelData::REF_UPD_TYPE_GLOBAL_VARIABLE, ModelData::REF_UPD_ACT_SHIFT, gvIdx, 0, 1); + emit datachanged(); + emit modified(); +} + +void FlightModePanel::gvCmMoveDown() +{ + if (phaseIdx == 0) + gvSwapData(gvIdx, gvIdx + 1); +} + +void FlightModePanel::gvCmMoveUp() +{ + if (phaseIdx == 0) + gvSwapData(gvIdx, gvIdx - 1); +} + +void FlightModePanel::gvCmPaste() +{ + QByteArray data; + if (phaseIdx == 0 && gvHasDefnClipboardData(&data)) { + GVarData *gvd = &model->gvarData[gvIdx]; + memcpy(gvd, data.constData(), sizeof(GVarData)); + } + if (gvHasValueClipboardData(&data)) { + int val = data.toInt(); + if (val > GVAR_MAX_VALUE) { + if (phaseIdx > 0) + model->setGVarFlightModeIndexToValue(phaseIdx, gvIdx, val - (GVAR_MAX_VALUE + 1)); // index stored in clipboard + else + phase.gvars[gvIdx] = 0; + } + else + phase.gvars[gvIdx] = val; + } + emit datachanged(); + emit modified(); +} + +void FlightModePanel::gvSwapData(int idx1, int idx2) +{ + if (phaseIdx == 0 && idx1 != idx2) { + GVarData datatmp = model->gvarData[idx2]; + GVarData *data1 = &model->gvarData[idx1]; + GVarData *data2 = &model->gvarData[idx2]; + memcpy(data2, data1, sizeof(GVarData)); + memcpy(data1, &datatmp, sizeof(GVarData)); + for (int j = 0; j < fmCount; j++) { + int valtmp = model->flightModeData[j].gvars[idx2]; + model->flightModeData[j].gvars[idx2] = model->flightModeData[j].gvars[idx1]; + model->flightModeData[j].gvars[idx1] = valtmp; + } + model->updateAllReferences(ModelData::REF_UPD_TYPE_GLOBAL_VARIABLE, ModelData::REF_UPD_ACT_SWAP, idx1, idx2); + emit datachanged(); + emit modified(); + } +} + /**********************************************************/ FlightModesPanel::FlightModesPanel(QWidget * parent, ModelData & model, GeneralSettings & generalSettings, Firmware * firmware): @@ -733,16 +1304,16 @@ FlightModesPanel::FlightModesPanel(QWidget * parent, ModelData & model, GeneralS QGridLayout * gridLayout = new QGridLayout(this); tabWidget = new QTabWidget(this); - for (int i=0; isetProperty("index", i); + connect(tab, &FlightModePanel::datachanged, this, &FlightModesPanel::update); connect(tab, &FlightModePanel::modified, this, &FlightModesPanel::modified); connect(tab, &FlightModePanel::nameModified, this, &FlightModesPanel::onPhaseNameChanged); connect(this, &FlightModesPanel::updated, tab, &FlightModePanel::update); tabWidget->addTab(tab, getTabName(i)); } gridLayout->addWidget(tabWidget, 0, 0, 1, 1); - connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(on_tabWidget_currentChanged(int))); } FlightModesPanel::~FlightModesPanel() diff --git a/companion/src/modeledit/flightmodes.h b/companion/src/modeledit/flightmodes.h index c5aa434fb..1986f1e46 100644 --- a/companion/src/modeledit/flightmodes.h +++ b/companion/src/modeledit/flightmodes.h @@ -26,6 +26,10 @@ class RawSwitchFilterItemModel; +constexpr char MIMETYPE_FLIGHTMODE[] = "application/x-companion-flightmode"; +constexpr char MIMETYPE_GVAR_PARAMS[] = "application/x-companion-gvar-params"; +constexpr char MIMETYPE_GVAR_VALUE[] = "application/x-companion-gvar-value"; + namespace Ui { class FlightMode; } @@ -42,6 +46,7 @@ class FlightModePanel : public ModelPanel signals: void nameModified(); + void datachanged(); private slots: void phaseName_editingFinished(); @@ -61,18 +66,36 @@ class FlightModePanel : public ModelPanel void phaseGVMax_editingFinished(); void phaseREValue_editingFinished(); void phaseREUse_currentIndexChanged(int index); - void name_customContextMenuRequested(const QPoint & pos); - void fmClear(); - void gvLabel_customContextMenuRequested(const QPoint & pos); - void gvClear(); + void onCustomContextMenuRequested(QPoint pos); + void cmClear(); + void cmClearAll(); + void cmCopy(); + void cmCut(); + void cmDelete(); + void cmInsert(); + void cmPaste(); + void cmMoveDown(); + void cmMoveUp(); + void gvOnCustomContextMenuRequested(QPoint pos); + void gvCmClear(); + void gvCmClearAll(); + void gvCmCopy(); + void gvCmCut(); + void gvCmDelete(); + void gvCmInsert(); + void gvCmPaste(); + void gvCmMoveDown(); + void gvCmMoveUp(); private: Ui::FlightMode *ui; int phaseIdx; FlightModeData & phase; + int fmCount; int reCount; int gvCount; int gvIdx; + int trimCount; QVector trimsLabel; QLineEdit * gvNames[CPN_MAX_GVARS]; QDoubleSpinBox * gvValues[CPN_MAX_GVARS]; @@ -88,12 +111,27 @@ class FlightModePanel : public ModelPanel QVector trimsValue; QVector trimsSlider; RawSwitchFilterItemModel * rawSwitchItemModel; + Board::Type board; void trimUpdate(unsigned int trim); void updateGVar(int index); + void updateRotaryEncoder(int index); void setGVSB(QDoubleSpinBox * spinBox, int min, int max, int val); void populateGvarUnitCB(QComboBox * cb); void populateGvarPrecCB(QComboBox * cb); + bool hasClipboardData(QByteArray * data = nullptr) const; + bool insertAllowed() const; + bool moveDownAllowed() const; + bool moveUpAllowed() const; + void swapData(int idx1, int idx2); + bool gvHasClipboardData() const; + bool gvHasDefnClipboardData(QByteArray * data = nullptr) const; + bool gvHasValueClipboardData(QByteArray * data = nullptr) const; + bool gvDeleteAllowed() const; + bool gvInsertAllowed() const; + bool gvMoveDownAllowed() const; + bool gvMoveUpAllowed() const; + void gvSwapData(int idx1, int idx2); }; class FlightModesPanel : public ModelPanel diff --git a/companion/src/modeledit/inputs.cpp b/companion/src/modeledit/inputs.cpp index 27ca4c42f..a5220019e 100644 --- a/companion/src/modeledit/inputs.cpp +++ b/companion/src/modeledit/inputs.cpp @@ -47,18 +47,18 @@ InputsPanel::InputsPanel(QWidget *parent, ModelData & model, GeneralSettings & g qbClear->setText(tr("Clear All Inputs")); qbClear->setIcon(CompanionIcon("clear.png")); - exposLayout->addWidget(ExposlistWidget,1,1,1,3); - exposLayout->addWidget(qbUp,2,1); - exposLayout->addWidget(qbClear,2,2); - exposLayout->addWidget(qbDown,2,3); + exposLayout->addWidget(ExposlistWidget, 1, 1, 1, 3); + exposLayout->addWidget(qbUp, 2, 1); + exposLayout->addWidget(qbClear, 2, 2); + exposLayout->addWidget(qbDown, 2, 3); connect(ExposlistWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(expolistWidget_customContextMenuRequested(QPoint))); connect(ExposlistWidget, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(expolistWidget_doubleClicked(QModelIndex))); - connect(ExposlistWidget, SIGNAL(mimeDropped(int,const QMimeData*,Qt::DropAction)), this, SLOT(mimeExpoDropped(int, const QMimeData*, Qt::DropAction))); + connect(ExposlistWidget, SIGNAL(mimeDropped(int, const QMimeData*,Qt::DropAction)), this, SLOT(mimeExpoDropped(int, const QMimeData*, Qt::DropAction))); - connect(qbUp, SIGNAL(pressed()),SLOT(moveExpoUp())); - connect(qbDown, SIGNAL(pressed()),SLOT(moveExpoDown())); - connect(qbClear, SIGNAL(pressed()),SLOT(clearExpos())); + connect(qbUp, SIGNAL(pressed()), SLOT(moveExpoUp())); + connect(qbDown, SIGNAL(pressed()), SLOT(moveExpoDown())); + connect(qbClear, SIGNAL(pressed()), SLOT(clearExpos())); connect(ExposlistWidget, SIGNAL(keyWasPressed(QKeyEvent*)), this, SLOT(expolistWidget_KeyPress(QKeyEvent*))); } @@ -71,9 +71,9 @@ void InputsPanel::update() { lock = true; ExposlistWidget->clear(); - for (int i=0; i < inputsCount; ++i) { + for (int i = 0; i < inputsCount; ++i) { bool filled = false; - for (uint j=0; j < CPN_MAX_EXPOS; ++j) { + for (uint j = 0; j < CPN_MAX_EXPOS; ++j) { const ExpoData & ed = model->expoData[j]; if ((int)ed.chn == i && ed.mode) { AddInputLine(j); @@ -81,7 +81,7 @@ void InputsPanel::update() } } if (!filled) { - AddInputLine(-i-1); + AddInputLine(-i - 1); } } lock = false; @@ -108,9 +108,8 @@ void InputsPanel::AddInputLine(int dest) const ExpoData &md = model->expoData[dest]; qba.append((const char*)&md, sizeof(ExpoData)); destId = md.chn + 1; - const QVector expos = model->expos(md.chn); - newChan = (expos.constFirst() == &md); - hasSibs = (expos.constLast() != &md); + newChan = model->isExpoParent(dest); + hasSibs = (model->hasExpoChildren(dest) || model->hasExpoSiblings(dest)); } QListWidgetItem *itm = new QListWidgetItem(getInputText(dest, newChan)); itm->setData(Qt::UserRole, qba); @@ -133,10 +132,10 @@ QString InputsPanel::getInputText(int dest, bool newChan) { QString str; if (dest < 0) { - str = modelPrinter.printInputName(-dest-1); + str = modelPrinter.printInputName(-dest - 1); } else { - const ExpoData & input = model->expoData[dest]; + const ExpoData &input = model->expoData[dest]; const int nameChars = (firmware->getCapability(VirtualInputs) ? 10 : 4); if (newChan) str = QString("%1").arg(modelPrinter.printInputName(input.chn), -nameChars, QChar(' ')); @@ -150,14 +149,14 @@ QString InputsPanel::getInputText(int dest, bool newChan) bool InputsPanel::gm_insertExpo(int idx) { - if (idx<0 || idx>=CPN_MAX_EXPOS || model->expoData[CPN_MAX_EXPOS-1].mode > 0) { - QMessageBox::information(this, CPN_STR_APP_NAME, tr("Not enough available inputs!")); + if (idx < 0 || idx >= CPN_MAX_EXPOS || model->expoData[CPN_MAX_EXPOS-1].mode > 0) { + QMessageBox::information(this, CPN_STR_APP_NAME, tr("Not enough available Inputs!")); return false; } int chn = model->expoData[idx].chn; - ExpoData * newExpo = model->insertInput(idx); + ExpoData *newExpo = model->insertInput(idx); newExpo->chn = chn; newExpo->weight = 100; newExpo->mode = INPUT_MODE_BOTH; @@ -172,107 +171,107 @@ void InputsPanel::gm_deleteExpo(int index, bool clearName) void InputsPanel::gm_openExpo(int index) { - if(index<0 || index>=CPN_MAX_EXPOS) return; + if (index < 0 || index >= CPN_MAX_EXPOS) + return; - ExpoData mixd(model->expoData[index]); + ExpoData ed(model->expoData[index]); - QString inputName; + QString inputName; + if (firmware->getCapability(VirtualInputs)) + inputName = model->inputNames[ed.chn]; + + ExpoDialog *g = new ExpoDialog(this, *model, &ed, generalSettings, firmware, inputName); + if (g->exec()) { + model->expoData[index] = ed; if (firmware->getCapability(VirtualInputs)) - inputName = model->inputNames[mixd.chn]; - - ExpoDialog *g = new ExpoDialog(this, *model, &mixd, generalSettings, firmware, inputName); - if (g->exec()) { - model->expoData[index] = mixd; - if (firmware->getCapability(VirtualInputs)) - strncpy(model->inputNames[mixd.chn], inputName.toLatin1().data(), 4); - emit modified(); - update(); - } - else { - if (expoInserted) { - gm_deleteExpo(index); - } - expoInserted=false; - update(); + strncpy(model->inputNames[ed.chn], inputName.toLatin1().data(), INPUT_NAME_LEN); + emit modified(); + update(); + } + else { + if (expoInserted) { + gm_deleteExpo(index); } + expoInserted=false; + update(); + } } int InputsPanel::getExpoIndex(unsigned int dch) { - unsigned int i = 0; - while (model->expoData[i].chn<=dch && model->expoData[i].mode && iexpoData[i].chn <= dch && model->expoData[i].mode && i < CPN_MAX_EXPOS) + i++; + if (i == CPN_MAX_EXPOS) + return -1; + return i; } - QList InputsPanel::createExpoListFromSelected() { - QList list; - foreach(QListWidgetItem *item, ExposlistWidget->selectedItems()) { - int idx= item->data(Qt::UserRole).toByteArray().at(0); - if(idx>=0 && idx list; + foreach (QListWidgetItem *item, ExposlistWidget->selectedItems()) { + int idx = item->data(Qt::UserRole).toByteArray().at(0); + if (idx >= 0 && idx < CPN_MAX_EXPOS) + list << idx; + } + return list; } - void InputsPanel::setSelectedByExpoList(QList list) { - for(int i=0; icount(); i++) { - int t = ExposlistWidget->item(i)->data(Qt::UserRole).toByteArray().at(0); - if(list.contains(t)) - ExposlistWidget->item(i)->setSelected(true); - } + for (int i = 0; i < ExposlistWidget->count(); i++) { + int t = ExposlistWidget->item(i)->data(Qt::UserRole).toByteArray().at(0); + if (list.contains(t)) + ExposlistWidget->item(i)->setSelected(true); + } } void InputsPanel::exposDelete(bool ask) { - QList list = createExpoListFromSelected(); - if(list.isEmpty()) return; + QList list = createExpoListFromSelected(); + if (list.isEmpty()) + return; - QMessageBox::StandardButton ret = QMessageBox::No; + QMessageBox::StandardButton ret = QMessageBox::No; - if(ask) - ret = QMessageBox::warning(this, "companion", - tr("Delete Selected Inputs?"), - QMessageBox::Yes | QMessageBox::No); + if (ask) + ret = QMessageBox::warning(this, CPN_STR_APP_NAME, tr("Delete selected Inputs. Are you sure?"), QMessageBox::Yes | QMessageBox::No); - - if ((ret == QMessageBox::Yes) || (!ask)) { - exposDeleteList(list, ask); - emit modified(); - update(); - } + if ((ret == QMessageBox::Yes) || (!ask)) { + exposDeleteList(list, ask); + emit modified(); + update(); + } } void InputsPanel::exposCut() { - exposCopy(); - exposDelete(false); + exposCopy(); + exposDelete(false); } void InputsPanel::exposCopy() { - QList list = createExpoListFromSelected(); + QList list = createExpoListFromSelected(); - QByteArray mxData; - foreach(int idx, list) { - mxData.append((char*)&model->expoData[idx], sizeof(ExpoData)); - } + QByteArray exData; + foreach (int idx, list) { + exData.append((char*)&model->expoData[idx], sizeof(ExpoData)); + } - QMimeData *mimeData = new QMimeData; - mimeData->setData("application/x-companion-expo", mxData); - QApplication::clipboard()->setMimeData(mimeData,QClipboard::Clipboard); + QMimeData *mimeData = new QMimeData; + mimeData->setData(MIMETYPE_EXPO, exData); + QApplication::clipboard()->setMimeData(mimeData, QClipboard::Clipboard); } void InputsPanel::mimeExpoDropped(int index, const QMimeData *data, Qt::DropAction action) { int idx = ExposlistWidget->item(index)->data(Qt::UserRole).toByteArray().at(0); - if (action==Qt::CopyAction) { + if (action == Qt::CopyAction) { pasteExpoMimeData(data, idx); } - else if (action==Qt::MoveAction) { + else if (action == Qt::MoveAction) { QList list = createExpoListFromSelected(); exposDeleteList(list, false); foreach (const int del, list) { @@ -285,30 +284,31 @@ void InputsPanel::mimeExpoDropped(int index, const QMimeData *data, Qt::DropActi void InputsPanel::pasteExpoMimeData(const QMimeData * mimeData, int destIdx) { - if (mimeData->hasFormat("application/x-companion-expo")) { - int idx; // mixer index + if (mimeData->hasFormat(MIMETYPE_EXPO)) { + int idx; // expo index int dch; if (destIdx < 0) { dch = -destIdx - 1; idx = getExpoIndex(dch) - 1; //get expo index to insert - } else { + } + else { idx = destIdx; dch = model->expoData[idx].chn; } - QByteArray mxData = mimeData->data("application/x-companion-expo"); + QByteArray exData = mimeData->data(MIMETYPE_EXPO); int i = 0; - while (i < mxData.size()) { + while (i < exData.size()) { idx++; if (!gm_insertExpo(idx)) break; - ExpoData *md = &model->expoData[idx]; - memcpy(md, mxData.mid(i, sizeof(ExpoData)).constData(), sizeof(ExpoData)); - const int oldChan = md->chn; - md->chn = dch; - maybeCopyInputName(oldChan, md->chn); + ExpoData *ed = &model->expoData[idx]; + memcpy(ed, exData.mid(i, sizeof(ExpoData)).constData(), sizeof(ExpoData)); + const int oldChan = ed->chn; + ed->chn = dch; + maybeCopyInputName(oldChan, ed->chn); i += sizeof(ExpoData); } @@ -334,83 +334,104 @@ void InputsPanel::exposDuplicate() exposPaste(); } - void InputsPanel::expoOpen(QListWidgetItem *item) { - if (!item) - item = ExposlistWidget->currentItem(); + if (!item) + item = ExposlistWidget->currentItem(); - int idx = item->data(Qt::UserRole).toByteArray().at(0); - if (idx<0) { - int ch = -idx-1; - idx = getExpoIndex(ch); // get expo index to insert - if (!gm_insertExpo(idx)) - return; - model->expoData[idx].chn = ch; - expoInserted=true; - } else { - expoInserted=false; - } - gm_openExpo(idx); + int idx = item->data(Qt::UserRole).toByteArray().at(0); + if (idx < 0) { + int ch = -idx - 1; + idx = getExpoIndex(ch); // get expo index to insert + if (!gm_insertExpo(idx)) + return; + model->expoData[idx].chn = ch; + expoInserted = true; + } + else { + expoInserted = false; + } + gm_openExpo(idx); } void InputsPanel::expoAdd() { - int index = ExposlistWidget->currentItem()->data(Qt::UserRole).toByteArray().at(0); + int index = ExposlistWidget->currentItem()->data(Qt::UserRole).toByteArray().at(0); - if(index<0) { // if empty then return relevant index - expoOpen(); - } else { - index++; - if (!gm_insertExpo(index)) - return; - model->expoData[index].chn = model->expoData[index-1].chn; - expoInserted=true; - } - gm_openExpo(index); + if (index < 0) { // if empty then return relevant index + expoOpen(); + } + else { + index++; + if (!gm_insertExpo(index)) + return; + model->expoData[index].chn = model->expoData[index-1].chn; + expoInserted = true; + } + gm_openExpo(index); } void InputsPanel::expolistWidget_customContextMenuRequested(QPoint pos) { - QPoint globalPos = ExposlistWidget->mapToGlobal(pos); + QPoint globalPos = ExposlistWidget->mapToGlobal(pos); - const QClipboard *clipboard = QApplication::clipboard(); - const QMimeData *mimeData = clipboard->mimeData(); - bool hasData = mimeData->hasFormat("application/x-companion-expo"); + const QClipboard *clipboard = QApplication::clipboard(); + const QMimeData *mimeData = clipboard->mimeData(); + bool hasData = mimeData->hasFormat(MIMETYPE_EXPO); - QMenu contextMenu; - contextMenu.addAction(CompanionIcon("add.png"), tr("&Add"),this,SLOT(expoAdd()),tr("Ctrl+A")); - contextMenu.addAction(CompanionIcon("edit.png"), tr("&Edit"),this,SLOT(expoOpen()),tr("Enter")); - contextMenu.addSeparator(); - contextMenu.addAction(CompanionIcon("clear.png"), tr("&Delete"),this,SLOT(exposDelete()),tr("Delete")); - contextMenu.addAction(CompanionIcon("copy.png"), tr("&Copy"),this,SLOT(exposCopy()),tr("Ctrl+C")); - contextMenu.addAction(CompanionIcon("cut.png"), tr("&Cut"),this,SLOT(exposCut()),tr("Ctrl+X")); - contextMenu.addAction(CompanionIcon("paste.png"), tr("&Paste"),this,SLOT(exposPaste()),tr("Ctrl+V"))->setEnabled(hasData); - contextMenu.addAction(CompanionIcon("duplicate.png"), tr("Du&plicate"),this,SLOT(exposDuplicate()),tr("Ctrl+U")); - contextMenu.addSeparator(); - contextMenu.addAction(CompanionIcon("moveup.png"), tr("Move Up"),this,SLOT(moveExpoUp()),tr("Ctrl+Up")); - contextMenu.addAction(CompanionIcon("movedown.png"), tr("Move Down"),this,SLOT(moveExpoDown()),tr("Ctrl+Down")); - contextMenu.addSeparator(); - contextMenu.addActions(ExposlistWidget->actions()); + selectedIdx = getIndexFromSelected(); + inputIdx = getInputIndexFromSelected(); - contextMenu.exec(globalPos); + QMenu contextMenu; + QMenu *contextMenuLines = contextMenu.addMenu(tr("Lines")); + contextMenuLines->addAction(CompanionIcon("add.png"), tr("&Add"), this, SLOT(expoAdd()), tr("Ctrl+A")); + contextMenuLines->addAction(CompanionIcon("edit.png"), tr("&Edit"), this, SLOT(expoOpen()), tr("Enter")); + contextMenuLines->addSeparator(); + contextMenuLines->addAction(CompanionIcon("clear.png"), tr("&Delete"), this, SLOT(exposDelete()), tr("Delete")); + contextMenuLines->addAction(CompanionIcon("copy.png"), tr("&Copy"), this, SLOT(exposCopy()), tr("Ctrl+C")); + contextMenuLines->addAction(CompanionIcon("cut.png"), tr("&Cut"), this, SLOT(exposCut()), tr("Ctrl+X")); + contextMenuLines->addAction(CompanionIcon("paste.png"), tr("&Paste"), this, SLOT(exposPaste()), tr("Ctrl+V"))->setEnabled(hasData); + contextMenuLines->addAction(CompanionIcon("duplicate.png"), tr("Du&plicate"), this, SLOT(exposDuplicate()), tr("Ctrl+U")); + contextMenuLines->addSeparator(); + contextMenuLines->addAction(CompanionIcon("moveup.png"), tr("Move Up"), this, SLOT(moveExpoUp()), tr("Ctrl+Up")); + contextMenuLines->addAction(CompanionIcon("movedown.png"), tr("Move Down"), this, SLOT(moveExpoDown()), tr("Ctrl+Down")); + + QMenu *contextMenuInputs = contextMenu.addMenu(tr("Input")); + contextMenuInputs->addAction(CompanionIcon("arrow-right.png"), tr("Insert"), this, SLOT(cmInputInsert()))->setEnabled(cmInputInsertAllowed()); + contextMenuInputs->addAction(CompanionIcon("arrow-left.png"), tr("Delete"), this, SLOT(cmInputDelete())); + contextMenuInputs->addAction(CompanionIcon("moveup.png"), tr("Move Up"), this, SLOT(cmInputMoveUp()))->setEnabled(cmInputMoveUpAllowed()); + contextMenuInputs->addAction(CompanionIcon("movedown.png"), tr("Move Down"), this, SLOT(cmInputMoveDown()))->setEnabled(cmInputMoveDownAllowed()); + contextMenuInputs->addSeparator(); + contextMenuInputs->addAction(CompanionIcon("clear.png"), tr("Clear"), this, SLOT(cmInputClear()))->setEnabled(isExpoIndex(selectedIdx)); + + contextMenu.addSeparator(); + contextMenu.addAction(CompanionIcon("clear.png"), tr("Clear All"), this, SLOT(clearExpos())); + contextMenu.addSeparator(); + contextMenu.addActions(ExposlistWidget->actions()); + contextMenu.exec(globalPos); } - void InputsPanel::expolistWidget_KeyPress(QKeyEvent *event) { - if(event->matches(QKeySequence::SelectAll)) expoAdd(); //Ctrl A - if(event->matches(QKeySequence::Delete)) exposDelete(); - if(event->matches(QKeySequence::Copy)) exposCopy(); - if(event->matches(QKeySequence::Cut)) exposCut(); - if(event->matches(QKeySequence::Paste)) exposPaste(); - if(event->matches(QKeySequence::Underline)) exposDuplicate(); + if (event->matches(QKeySequence::SelectAll)) + expoAdd(); //Ctrl A + if (event->matches(QKeySequence::Delete)) + exposDelete(); + if (event->matches(QKeySequence::Copy)) + exposCopy(); + if (event->matches(QKeySequence::Cut)) + exposCut(); + if (event->matches(QKeySequence::Paste)) + exposPaste(); + if (event->matches(QKeySequence::Underline)) + exposDuplicate(); - if(event->key()==Qt::Key_Return || event->key()==Qt::Key_Enter) expoOpen(); - if(event->matches(QKeySequence::MoveToNextLine)) - ExposlistWidget->setCurrentRow(ExposlistWidget->currentRow()+1); - if(event->matches(QKeySequence::MoveToPreviousLine)) - ExposlistWidget->setCurrentRow(ExposlistWidget->currentRow()-1); + if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter) + expoOpen(); + if (event->matches(QKeySequence::MoveToNextLine)) + ExposlistWidget->setCurrentRow(ExposlistWidget->currentRow() + 1); + if (event->matches(QKeySequence::MoveToPreviousLine)) + ExposlistWidget->setCurrentRow(ExposlistWidget->currentRow() - 1); } int InputsPanel::gm_moveExpo(int idx, bool dir) //true=inc=down false=dec=up @@ -418,7 +439,7 @@ int InputsPanel::gm_moveExpo(int idx, bool dir) //true=inc=down false=dec=up if (idx >= CPN_MAX_EXPOS || idx < 0 || (dir && idx >= CPN_MAX_EXPOS - 1) || (!dir && !idx)) return -1; - const int tdx = dir ? idx+1 : idx-1; + const int tdx = dir ? idx + 1 : idx-1; ExpoData temp; ExpoData &src = model->expoData[idx]; ExpoData &tgt = model->expoData[tdx]; @@ -432,7 +453,7 @@ int InputsPanel::gm_moveExpo(int idx, bool dir) //true=inc=down false=dec=up if (tgt.chn != src.chn || tgtempty) { const int oldChan = src.chn; - if (dir && src.chn < unsigned(inputsCount-1)) + if (dir && src.chn < unsigned(inputsCount - 1)) src.chn++; else if (!dir && src.chn > 0) src.chn--; @@ -452,7 +473,7 @@ void InputsPanel::moveExpoList(bool down) QList list = createExpoListFromSelected(); QList highlightList; bool mod = false; - foreach(int idx, list) { + foreach (int idx, list) { const int newIdx = gm_moveExpo(idx, down); if (newIdx > -1) { highlightList << newIdx; @@ -483,19 +504,22 @@ void InputsPanel::expolistWidget_doubleClicked(QModelIndex index) void InputsPanel::exposDeleteList(QList list, bool clearName) { - std::sort(list.begin(), list.end()); + std::sort(list.begin(), list.end()); - int iDec = 0; - foreach(int idx, list) { - gm_deleteExpo(idx-iDec, clearName); - iDec++; - } + int iDec = 0; + foreach (int idx, list) { + gm_deleteExpo(idx-iDec, clearName); + iDec++; + } } void InputsPanel::clearExpos() { - if (QMessageBox::question(this, tr("Clear Inputs?"), tr("Really clear all the inputs?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { + if (QMessageBox::question(this, CPN_STR_APP_NAME, tr("Clear all Inputs. Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { model->clearInputs(); + for (int i = 0; i < inputsCount; i++) { + model->updateAllReferences(ModelData::REF_UPD_TYPE_INPUT, ModelData::REF_UPD_ACT_CLEAR, i); + } emit modified(); update(); } @@ -512,8 +536,172 @@ void InputsPanel::maybeCopyInputName(int srcChan, int destChan) if (srcEmpty) { // if destination input name is empty, copy it from source expo input if (!strlen(model->inputNames[destChan])) - strncpy(model->inputNames[destChan], model->inputNames[srcChan], 5); + strncpy(model->inputNames[destChan], model->inputNames[srcChan], INPUT_NAME_LEN); // clear the emptry source channel name model->inputNames[srcChan][0] = 0; } } + +bool InputsPanel::cmInputInsertAllowed() const +{ + return ((!model->hasExpos(inputsCount - 1)) && (inputIdx < inputsCount - 1)); +} + +bool InputsPanel::cmInputMoveDownAllowed() const +{ + return (inputIdx >= 0 && (inputIdx < inputsCount - 1)); +} + +bool InputsPanel::cmInputMoveUpAllowed() const +{ + return inputIdx > 0; +} + +void InputsPanel::cmInputClear() +{ + if (QMessageBox::question(this, CPN_STR_APP_NAME, tr("Clear Input. Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) + return; + + for (int i = CPN_MAX_EXPOS - 1; i >= 0; i--) { + ExpoData *ed = &model->expoData[i]; + if ((int)ed->chn == inputIdx) + model->removeInput(i); + } + model->updateAllReferences(ModelData::REF_UPD_TYPE_INPUT, ModelData::REF_UPD_ACT_CLEAR, inputIdx); + update(); + emit modified(); +} + +void InputsPanel::cmInputDelete() +{ + if (QMessageBox::question(this, CPN_STR_APP_NAME, tr("Delete Input. Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) + return; + + for (int i = 0; i < CPN_MAX_EXPOS; i++) { + ExpoData *ed = &model->expoData[i]; + if ((int)ed->chn == inputIdx) + model->removeInput(i); + else if ((int)ed->chn > inputIdx) + ed->chn--; + } + + for (int i = inputIdx; i < inputsCount; i++) { + strncpy(model->inputNames[i], model->inputNames[i + 1], sizeof(model->inputNames[i]) - 1); + } + model->inputNames[inputsCount - 1][0] = 0; + + model->updateAllReferences(ModelData::REF_UPD_TYPE_INPUT, ModelData::REF_UPD_ACT_SHIFT, inputIdx, 0, -1); + update(); + emit modified(); +} + +void InputsPanel::cmInputInsert() +{ + for (int i = 0; i < CPN_MAX_EXPOS; i++) { + ExpoData *ed = &model->expoData[i]; + if ((int)ed->chn >= inputIdx) + ed->chn++; + } + + for (int i = inputsCount - 1; i > inputIdx; i--) { + strncpy(model->inputNames[i], model->inputNames[i - 1], sizeof(model->inputNames[i]) - 1); + } + model->inputNames[inputIdx][0] = 0; + + model->updateAllReferences(ModelData::REF_UPD_TYPE_INPUT, ModelData::REF_UPD_ACT_SHIFT, inputIdx, 0, 1); + update(); + emit modified(); +} + +void InputsPanel::cmInputMoveDown() +{ + cmInputSwapData(inputIdx, inputIdx + 1); +} + +void InputsPanel::cmInputMoveUp() +{ + cmInputSwapData(inputIdx - 1, inputIdx); +} + +void InputsPanel::cmInputSwapData(int idx1, int idx2) +{ + if (idx1 >= idx2 || (!model->hasExpos(idx1) && !model->hasExpos(idx2))) + return; + // save expos + int expoidx = -1; + QVector edtmp; + int i; + for (i = 0; i < CPN_MAX_EXPOS; i++) { + ExpoData *ed = &model->expoData[i]; + if ((int)ed->chn == idx1) { + edtmp << model->expoData[i]; + if (expoidx < 0) + expoidx = i; + } + else if ((int)ed->chn > idx1) + break; + } + // move expos up + const int offset = i - expoidx; + int expocnt; + for (int j = i; j < CPN_MAX_EXPOS; j++) { + ExpoData *ed = &model->expoData[j]; + if ((int)ed->chn == idx2) { + ExpoData *dest = &model->expoData[j - offset]; + memcpy(dest, &model->expoData[j], sizeof(ExpoData)); + dest->chn = idx1; + expocnt++; + } + else if ((int)ed->chn > idx2) + break; + } + // copy back saved expos + int cnt = 0; + foreach (ExpoData ed, edtmp) { + ExpoData *dest = &model->expoData[expoidx + expocnt + cnt]; + memcpy(dest, &ed, sizeof(ExpoData)); + dest->chn = idx2; + cnt++; + } + + // swap names + QByteArray *tname = new QByteArray(model->inputNames[idx2]); + strncpy(model->inputNames[idx2], model->inputNames[idx1], sizeof(model->inputNames[idx2]) - 1); + strncpy(model->inputNames[idx1], tname->data(), sizeof(model->inputNames[idx1]) - 1); + + model->updateAllReferences(ModelData::REF_UPD_TYPE_INPUT, ModelData::REF_UPD_ACT_SWAP, idx1, idx2); + update(); + emit modified(); +} + +bool InputsPanel::isInputIndex(const int index) +{ + if (index < 0) + return true; + else + return false; +} + +bool InputsPanel::isExpoIndex(const int index) +{ + return !isInputIndex(index); +} + +int InputsPanel::getIndexFromSelected() +{ + return ExposlistWidget->currentItem()->data(Qt::UserRole).toByteArray().at(0); +} + +int InputsPanel::getInputIndexFromSelected() +{ + const int selidx = getIndexFromSelected(); + int idx; + + if (isInputIndex(selidx)) + idx = -selidx - 1; + else { + const ExpoData *ed = &model->expoData[selidx]; + idx = ed->chn; + } + return idx; +} diff --git a/companion/src/modeledit/inputs.h b/companion/src/modeledit/inputs.h index 939d0a647..884573fef 100644 --- a/companion/src/modeledit/inputs.h +++ b/companion/src/modeledit/inputs.h @@ -25,6 +25,8 @@ #include "mixerslistwidget.h" #include "modelprinter.h" +constexpr char MIMETYPE_EXPO[] = "application/x-companion-expo"; + class InputsPanel : public ModelPanel { Q_OBJECT @@ -52,12 +54,19 @@ class InputsPanel : public ModelPanel void expoOpen(QListWidgetItem *item = NULL); void expoAdd(); void maybeCopyInputName(int srcChan, int destChan); + void cmInputClear(); + void cmInputDelete(); + void cmInputInsert(); + void cmInputMoveDown(); + void cmInputMoveUp(); private: bool expoInserted; MixersListWidget *ExposlistWidget; int inputsCount; ModelPrinter modelPrinter; + int selectedIdx; + int inputIdx; int getExpoIndex(unsigned int dch); bool gm_insertExpo(int idx); @@ -70,7 +79,14 @@ class InputsPanel : public ModelPanel void pasteExpoMimeData(const QMimeData * mimeData, int destIdx); void AddInputLine(int dest); QString getInputText(int dest, bool newChan); - + bool cmInputInsertAllowed() const; + bool cmInputMoveDownAllowed() const; + bool cmInputMoveUpAllowed() const; + void cmInputSwapData(int idx1, int idx2); + bool isInputIndex(const int index); + bool isExpoIndex(const int index); + int getIndexFromSelected(); + int getInputIndexFromSelected(); }; #endif // _INPUTS_H_ diff --git a/companion/src/modeledit/logicalswitches.cpp b/companion/src/modeledit/logicalswitches.cpp index 81f2f52e7..13e20b8f6 100644 --- a/companion/src/modeledit/logicalswitches.cpp +++ b/companion/src/modeledit/logicalswitches.cpp @@ -26,7 +26,7 @@ LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model, GeneralSettings & generalSettings, Firmware * firmware): ModelPanel(parent, model, generalSettings, firmware), - selectedSwitch(0) + selectedIndex(0) { Stopwatch s1("LogicalSwitchesPanel"); @@ -35,19 +35,22 @@ LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model, const int srcGroups = firmware->getCapability(GvarsInCS) ? 0 : (RawSource::AllSourceGroups & ~RawSource::GVarsGroup); rawSourceItemModel = new RawSourceFilterItemModel(&generalSettings, &model, srcGroups, this); + lsCapability = firmware->getCapability(LogicalSwitches); + lsCapabilityExt = firmware->getCapability(LogicalSwitchesExt); + QStringList headerLabels; headerLabels << "#" << tr("Function") << tr("V1") << tr("V2") << tr("AND Switch"); - if (firmware->getCapability(LogicalSwitchesExt)) { + if (lsCapabilityExt) { headerLabels << tr("Duration") << tr("Delay"); } - TableLayout * tableLayout = new TableLayout(this, firmware->getCapability(LogicalSwitches), headerLabels); + TableLayout * tableLayout = new TableLayout(this, lsCapability, headerLabels); s1.report("header"); const int channelsMax = model.getChannelsMax(true); lock = true; - for (int i=0; igetCapability(LogicalSwitches); i++) { + for (int i=0; isetProperty("index", i); @@ -56,96 +59,96 @@ LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model, label->setToolTip(tr("Popup menu available")); label->setMouseTracking(true); label->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum); - connect(label, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(csw_customContextMenuRequested(QPoint))); + connect(label, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onCustomContextMenuRequested(QPoint))); tableLayout->addWidget(i, 0, label); // The function - csw[i] = new QComboBox(this); - csw[i]->setProperty("index", i); - populateCSWCB(csw[i]); - connect(csw[i], SIGNAL(currentIndexChanged(int)), this, SLOT(functionChanged())); - tableLayout->addWidget(i, 1, csw[i]); + cbFunction[i] = new QComboBox(this); + cbFunction[i]->setProperty("index", i); + populateFunctionCB(cbFunction[i]); + connect(cbFunction[i], SIGNAL(currentIndexChanged(int)), this, SLOT(onFunctionChanged())); + tableLayout->addWidget(i, 1, cbFunction[i]); // V1 QHBoxLayout *v1Layout = new QHBoxLayout(); - cswitchSource1[i] = new QComboBox(this); - cswitchSource1[i]->setProperty("index",i); - connect(cswitchSource1[i], SIGNAL(currentIndexChanged(int)), this, SLOT(v1Edited(int))); - v1Layout->addWidget(cswitchSource1[i]); - cswitchSource1[i]->setVisible(false); - cswitchValue[i] = new QDoubleSpinBox(this); - cswitchValue[i]->setMaximum(channelsMax); - cswitchValue[i]->setMinimum(-channelsMax); - cswitchValue[i]->setAccelerated(true); - cswitchValue[i]->setDecimals(0); - cswitchValue[i]->setProperty("index", i); - connect(cswitchValue[i], SIGNAL(editingFinished()), this, SLOT(offsetEdited())); - v1Layout->addWidget(cswitchValue[i]); - cswitchValue[i]->setVisible(false); + cbSource1[i] = new QComboBox(this); + cbSource1[i]->setProperty("index",i); + connect(cbSource1[i], SIGNAL(currentIndexChanged(int)), this, SLOT(onV1Changed(int))); + v1Layout->addWidget(cbSource1[i]); + cbSource1[i]->setVisible(false); + dsbValue[i] = new QDoubleSpinBox(this); + dsbValue[i]->setMaximum(channelsMax); + dsbValue[i]->setMinimum(-channelsMax); + dsbValue[i]->setAccelerated(true); + dsbValue[i]->setDecimals(0); + dsbValue[i]->setProperty("index", i); + connect(dsbValue[i], SIGNAL(editingFinished()), this, SLOT(onOffsetChanged())); + v1Layout->addWidget(dsbValue[i]); + dsbValue[i]->setVisible(false); tableLayout->addLayout(i, 2, v1Layout); // V2 QHBoxLayout *v2Layout = new QHBoxLayout(); - cswitchSource2[i] = new QComboBox(this); - cswitchSource2[i]->setProperty("index", i); - connect(cswitchSource2[i], SIGNAL(currentIndexChanged(int)), this, SLOT(v2Edited(int))); - v2Layout->addWidget(cswitchSource2[i]); - cswitchSource2[i]->setVisible(false); - cswitchOffset[i] = new QDoubleSpinBox(this); - cswitchOffset[i]->setProperty("index",i); - cswitchOffset[i]->setMaximum(channelsMax); - cswitchOffset[i]->setMinimum(-channelsMax); - cswitchOffset[i]->setAccelerated(true); - cswitchOffset[i]->setDecimals(0); - connect(cswitchOffset[i], SIGNAL(editingFinished()), this, SLOT(offsetEdited())); - cswitchOffset[i]->setVisible(false); - v2Layout->addWidget(cswitchOffset[i]); - cswitchOffset2[i] = new QDoubleSpinBox(this); - cswitchOffset2[i]->setProperty("index",i); - cswitchOffset2[i]->setMaximum(channelsMax); - cswitchOffset2[i]->setMinimum(-channelsMax); - cswitchOffset2[i]->setAccelerated(true); - cswitchOffset2[i]->setDecimals(0); - cswitchOffset2[i]->setSpecialValueText(" " + tr("(instant)")); - connect(cswitchOffset2[i], SIGNAL(editingFinished()), this, SLOT(offsetEdited())); - cswitchOffset2[i]->setVisible(false); - v2Layout->addWidget(cswitchOffset2[i]); - cswitchTOffset[i] = new TimerEdit(this); - cswitchTOffset[i]->setProperty("index",i); - connect(cswitchTOffset[i],SIGNAL(editingFinished()),this,SLOT(offsetEdited())); - v2Layout->addWidget(cswitchTOffset[i]); - cswitchTOffset[i]->setVisible(false); + cbSource2[i] = new QComboBox(this); + cbSource2[i]->setProperty("index", i); + connect(cbSource2[i], SIGNAL(currentIndexChanged(int)), this, SLOT(onV2Changed(int))); + v2Layout->addWidget(cbSource2[i]); + cbSource2[i]->setVisible(false); + dsbOffset[i] = new QDoubleSpinBox(this); + dsbOffset[i]->setProperty("index",i); + dsbOffset[i]->setMaximum(channelsMax); + dsbOffset[i]->setMinimum(-channelsMax); + dsbOffset[i]->setAccelerated(true); + dsbOffset[i]->setDecimals(0); + connect(dsbOffset[i], SIGNAL(editingFinished()), this, SLOT(onOffsetChanged())); + dsbOffset[i]->setVisible(false); + v2Layout->addWidget(dsbOffset[i]); + dsbOffset2[i] = new QDoubleSpinBox(this); + dsbOffset2[i]->setProperty("index",i); + dsbOffset2[i]->setMaximum(channelsMax); + dsbOffset2[i]->setMinimum(-channelsMax); + dsbOffset2[i]->setAccelerated(true); + dsbOffset2[i]->setDecimals(0); + dsbOffset2[i]->setSpecialValueText(" " + tr("(instant)")); + connect(dsbOffset2[i], SIGNAL(editingFinished()), this, SLOT(onOffsetChanged())); + dsbOffset2[i]->setVisible(false); + v2Layout->addWidget(dsbOffset2[i]); + teOffset[i] = new TimerEdit(this); + teOffset[i]->setProperty("index",i); + connect(teOffset[i],SIGNAL(editingFinished()),this,SLOT(onOffsetChanged())); + v2Layout->addWidget(teOffset[i]); + teOffset[i]->setVisible(false); tableLayout->addLayout(i, 3, v2Layout); // AND - cswitchAnd[i] = new QComboBox(this); - cswitchAnd[i]->setProperty("index", i); - populateAndSwitchCB(cswitchAnd[i]); - connect(cswitchAnd[i], SIGNAL(currentIndexChanged(int)), this, SLOT(andEdited(int))); - tableLayout->addWidget(i, 4, cswitchAnd[i]); + cbAndSwitch[i] = new QComboBox(this); + cbAndSwitch[i]->setProperty("index", i); + populateAndSwitchCB(cbAndSwitch[i]); + connect(cbAndSwitch[i], SIGNAL(currentIndexChanged(int)), this, SLOT(onAndSwitchChanged(int))); + tableLayout->addWidget(i, 4, cbAndSwitch[i]); - if (firmware->getCapability(LogicalSwitchesExt)) { + if (lsCapabilityExt) { // Duration - cswitchDuration[i] = new QDoubleSpinBox(this); - cswitchDuration[i]->setProperty("index", i); - cswitchDuration[i]->setSingleStep(0.1); - cswitchDuration[i]->setMaximum(25); - cswitchDuration[i]->setMinimum(0); - cswitchDuration[i]->setAccelerated(true); - cswitchDuration[i]->setDecimals(1); - connect(cswitchDuration[i], SIGNAL(valueChanged(double)), this, SLOT(durationEdited(double))); - tableLayout->addWidget(i, 5, cswitchDuration[i]); + dsbDuration[i] = new QDoubleSpinBox(this); + dsbDuration[i]->setProperty("index", i); + dsbDuration[i]->setSingleStep(0.1); + dsbDuration[i]->setMaximum(25); + dsbDuration[i]->setMinimum(0); + dsbDuration[i]->setAccelerated(true); + dsbDuration[i]->setDecimals(1); + connect(dsbDuration[i], SIGNAL(valueChanged(double)), this, SLOT(onDurationChanged(double))); + tableLayout->addWidget(i, 5, dsbDuration[i]); // Delay - cswitchDelay[i] = new QDoubleSpinBox(this); - cswitchDelay[i]->setProperty("index", i); - cswitchDelay[i]->setSingleStep(0.1); - cswitchDelay[i]->setMaximum(25); - cswitchDelay[i]->setMinimum(0); - cswitchDelay[i]->setAccelerated(true); - cswitchDelay[i]->setDecimals(1); - connect(cswitchDelay[i], SIGNAL(valueChanged(double)), this, SLOT(delayEdited(double))); - tableLayout->addWidget(i, 6, cswitchDelay[i]); + dsbDelay[i] = new QDoubleSpinBox(this); + dsbDelay[i]->setProperty("index", i); + dsbDelay[i]->setSingleStep(0.1); + dsbDelay[i]->setMaximum(25); + dsbDelay[i]->setMinimum(0); + dsbDelay[i]->setAccelerated(true); + dsbDelay[i]->setDecimals(1); + connect(dsbDelay[i], SIGNAL(valueChanged(double)), this, SLOT(onDelayChanged(double))); + tableLayout->addWidget(i, 6, dsbDelay[i]); } } @@ -155,7 +158,7 @@ LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model, lock = false; update(); tableLayout->resizeColumnsToContents(); - tableLayout->pushRowsUp(firmware->getCapability(LogicalSwitches)+1); + tableLayout->pushRowsUp(lsCapability+1); s1.report("end"); } @@ -172,10 +175,10 @@ void LogicalSwitchesPanel::updateDataModels() lock = oldLock; } -void LogicalSwitchesPanel::functionChanged() +void LogicalSwitchesPanel::onFunctionChanged() { int i = sender()->property("index").toInt(); - unsigned newFunc = csw[i]->currentData().toUInt(); + unsigned newFunc = cbFunction[i]->currentData().toUInt(); if (model->logicalSw[i].func == newFunc) return; @@ -204,13 +207,13 @@ void LogicalSwitchesPanel::functionChanged() emit modified(); } -void LogicalSwitchesPanel::v1Edited(int value) +void LogicalSwitchesPanel::onV1Changed(int value) { if (!lock) { int i = sender()->property("index").toInt(); - model->logicalSw[i].val1 = cswitchSource1[i]->itemData(value).toInt(); + model->logicalSw[i].val1 = cbSource1[i]->itemData(value).toInt(); if (model->logicalSw[i].getFunctionFamily() == LS_FAMILY_VOFS) { - if (!offsetEditedAt(i)) + if (!offsetChangedAt(i)) updateLine(i); } else { @@ -219,25 +222,25 @@ void LogicalSwitchesPanel::v1Edited(int value) } } -void LogicalSwitchesPanel::v2Edited(int value) +void LogicalSwitchesPanel::onV2Changed(int value) { if (!lock) { int i = sender()->property("index").toInt(); - model->logicalSw[i].val2 = cswitchSource2[i]->itemData(value).toInt(); + model->logicalSw[i].val2 = cbSource2[i]->itemData(value).toInt(); emit modified(); } } -void LogicalSwitchesPanel::andEdited(int value) +void LogicalSwitchesPanel::onAndSwitchChanged(int value) { if (!lock) { int index = sender()->property("index").toInt(); - model->logicalSw[index].andsw = cswitchAnd[index]->itemData(value).toInt(); + model->logicalSw[index].andsw = cbAndSwitch[index]->itemData(value).toInt(); emit modified(); } } -void LogicalSwitchesPanel::durationEdited(double duration) +void LogicalSwitchesPanel::onDurationChanged(double duration) { if (!lock) { int index = sender()->property("index").toInt(); @@ -246,7 +249,7 @@ void LogicalSwitchesPanel::durationEdited(double duration) } } -void LogicalSwitchesPanel::delayEdited(double delay) +void LogicalSwitchesPanel::onDelayChanged(double delay) { if (!lock) { int index = sender()->property("index").toInt(); @@ -255,12 +258,12 @@ void LogicalSwitchesPanel::delayEdited(double delay) } } -void LogicalSwitchesPanel::offsetEdited() +void LogicalSwitchesPanel::onOffsetChanged() { - offsetEditedAt(sender()->property("index").toInt()); + offsetChangedAt(sender()->property("index").toInt()); } -bool LogicalSwitchesPanel::offsetEditedAt(int index) +bool LogicalSwitchesPanel::offsetChangedAt(int index) { if (lock) return false; @@ -275,7 +278,7 @@ bool LogicalSwitchesPanel::offsetEditedAt(int index) { RawSource source = RawSource(model->logicalSw[index].val1); RawSourceRange range = source.getRange(model, generalSettings, model->logicalSw[index].getRangeFlags()); - double currVal = source.isTimeBased() ? cswitchTOffset[index]->timeInSeconds() : cswitchOffset[index]->value(); + double currVal = source.isTimeBased() ? teOffset[index]->timeInSeconds() : dsbOffset[index]->value(); value = round((currVal - range.offset) / range.step); mod = (mod || value != model->logicalSw[index].val2); model->logicalSw[index].val2 = value; @@ -283,22 +286,22 @@ bool LogicalSwitchesPanel::offsetEditedAt(int index) } case LS_FAMILY_TIMER: - value = TimToVal(cswitchValue[index]->value()); + value = TimToVal(dsbValue[index]->value()); mod = (mod || value != model->logicalSw[index].val1); model->logicalSw[index].val1 = value; - value = TimToVal(cswitchOffset[index]->value()); + value = TimToVal(dsbOffset[index]->value()); mod = (mod || value != model->logicalSw[index].val2); model->logicalSw[index].val2 = value; break; case LS_FAMILY_EDGE: - if (sender() == cswitchOffset[index]) { - value = TimToVal(cswitchOffset[index]->value()); + if (sender() == dsbOffset[index]) { + value = TimToVal(dsbOffset[index]->value()); mod = (mod || value != model->logicalSw[index].val2); model->logicalSw[index].val2 = value; } else { - value = TimToVal(cswitchOffset2[index]->value()) - model->logicalSw[index].val2; + value = TimToVal(dsbOffset2[index]->value()) - model->logicalSw[index].val2; mod = (mod || value != model->logicalSw[index].val3); model->logicalSw[index].val3 = value; } @@ -347,8 +350,8 @@ void LogicalSwitchesPanel::updateLine(int i) lock = true; unsigned int mask; - csw[i]->setCurrentIndex(csw[i]->findData(model->logicalSw[i].func)); - cswitchAnd[i]->setCurrentIndex(cswitchAnd[i]->findData(RawSwitch(model->logicalSw[i].andsw).toValue())); + cbFunction[i]->setCurrentIndex(cbFunction[i]->findData(model->logicalSw[i].func)); + cbAndSwitch[i]->setCurrentIndex(cbAndSwitch[i]->findData(RawSwitch(model->logicalSw[i].andsw).toValue())); if (!model->logicalSw[i].func) { mask = 0; @@ -364,27 +367,27 @@ void LogicalSwitchesPanel::updateLine(int i) RawSource source = RawSource(model->logicalSw[i].val1); RawSourceRange range = source.getRange(model, generalSettings, model->logicalSw[i].getRangeFlags()); double value = range.step * model->logicalSw[i].val2 + range.offset; /* TODO+source.getRawOffset(model)*/ - cswitchSource1[i]->setModel(rawSourceItemModel); - cswitchSource1[i]->setCurrentIndex(cswitchSource1[i]->findData(source.toValue())); + cbSource1[i]->setModel(rawSourceItemModel); + cbSource1[i]->setCurrentIndex(cbSource1[i]->findData(source.toValue())); if (source.isTimeBased()) { mask |= VALUE_TO_VISIBLE; - cswitchTOffset[i]->setTimeRange(range.min, range.max); - cswitchTOffset[i]->setSingleStep(range.step); - cswitchTOffset[i]->setPageStep(range.step * 60); - cswitchTOffset[i]->setShowSeconds(range.step != 60); - cswitchTOffset[i]->setTime((int)value); + teOffset[i]->setTimeRange(range.min, range.max); + teOffset[i]->setSingleStep(range.step); + teOffset[i]->setPageStep(range.step * 60); + teOffset[i]->setShowSeconds(range.step != 60); + teOffset[i]->setTime((int)value); } else { mask |= VALUE2_VISIBLE; if (range.unit.isEmpty()) - cswitchOffset[i]->setSuffix(""); + dsbOffset[i]->setSuffix(""); else - cswitchOffset[i]->setSuffix(" " + range.unit); - cswitchOffset[i]->setDecimals(range.decimals); - cswitchOffset[i]->setMinimum(range.min); - cswitchOffset[i]->setMaximum(range.max); - cswitchOffset[i]->setSingleStep(range.step); - cswitchOffset[i]->setValue(value); + dsbOffset[i]->setSuffix(" " + range.unit); + dsbOffset[i]->setDecimals(range.decimals); + dsbOffset[i]->setMinimum(range.min); + dsbOffset[i]->setMaximum(range.max); + dsbOffset[i]->setSingleStep(range.step); + dsbOffset[i]->setValue(value); } break; @@ -393,58 +396,58 @@ void LogicalSwitchesPanel::updateLine(int i) case LS_FAMILY_STICKY: // no break case LS_FAMILY_VBOOL: mask |= SOURCE1_VISIBLE | SOURCE2_VISIBLE; - cswitchSource1[i]->setModel(rawSwitchItemModel); - cswitchSource1[i]->setCurrentIndex(cswitchSource1[i]->findData(model->logicalSw[i].val1)); - cswitchSource2[i]->setModel(rawSwitchItemModel); - cswitchSource2[i]->setCurrentIndex(cswitchSource2[i]->findData(model->logicalSw[i].val2)); + cbSource1[i]->setModel(rawSwitchItemModel); + cbSource1[i]->setCurrentIndex(cbSource1[i]->findData(model->logicalSw[i].val1)); + cbSource2[i]->setModel(rawSwitchItemModel); + cbSource2[i]->setCurrentIndex(cbSource2[i]->findData(model->logicalSw[i].val2)); break; case LS_FAMILY_EDGE: mask |= SOURCE1_VISIBLE | VALUE2_VISIBLE | VALUE3_VISIBLE; mask &= ~DELAY_ENABLED; - cswitchSource1[i]->setModel(rawSwitchItemModel); - cswitchSource1[i]->setCurrentIndex(cswitchSource1[i]->findData(model->logicalSw[i].val1)); - updateTimerParam(cswitchOffset[i], model->logicalSw[i].val2, 0.0); - updateTimerParam(cswitchOffset2[i], model->logicalSw[i].val2+model->logicalSw[i].val3, ValToTim(TimToVal(cswitchOffset[i]->value())-1)); - cswitchOffset2[i]->setSuffix((model->logicalSw[i].val3) ? "" : tr(" (infinite)")); + cbSource1[i]->setModel(rawSwitchItemModel); + cbSource1[i]->setCurrentIndex(cbSource1[i]->findData(model->logicalSw[i].val1)); + updateTimerParam(dsbOffset[i], model->logicalSw[i].val2, 0.0); + updateTimerParam(dsbOffset2[i], model->logicalSw[i].val2+model->logicalSw[i].val3, ValToTim(TimToVal(dsbOffset[i]->value())-1)); + dsbOffset2[i]->setSuffix((model->logicalSw[i].val3) ? "" : tr(" (infinite)")); break; case LS_FAMILY_VCOMP: mask |= SOURCE1_VISIBLE | SOURCE2_VISIBLE; - cswitchSource1[i]->setModel(rawSourceItemModel); - cswitchSource1[i]->setCurrentIndex(cswitchSource1[i]->findData(model->logicalSw[i].val1)); - cswitchSource2[i]->setModel(rawSourceItemModel); - cswitchSource2[i]->setCurrentIndex(cswitchSource2[i]->findData(model->logicalSw[i].val2)); + cbSource1[i]->setModel(rawSourceItemModel); + cbSource1[i]->setCurrentIndex(cbSource1[i]->findData(model->logicalSw[i].val1)); + cbSource2[i]->setModel(rawSourceItemModel); + cbSource2[i]->setCurrentIndex(cbSource2[i]->findData(model->logicalSw[i].val2)); break; case LS_FAMILY_TIMER: mask |= VALUE1_VISIBLE | VALUE2_VISIBLE; - updateTimerParam(cswitchValue[i], model->logicalSw[i].val1, 0.1); - updateTimerParam(cswitchOffset[i], model->logicalSw[i].val2, 0.1); + updateTimerParam(dsbValue[i], model->logicalSw[i].val1, 0.1); + updateTimerParam(dsbOffset[i], model->logicalSw[i].val2, 0.1); break; } } - cswitchSource1[i]->setVisible(mask & SOURCE1_VISIBLE); - cswitchSource2[i]->setVisible(mask & SOURCE2_VISIBLE); - cswitchValue[i]->setVisible(mask & VALUE1_VISIBLE); - cswitchOffset[i]->setVisible(mask & VALUE2_VISIBLE); - cswitchOffset2[i]->setVisible(mask & VALUE3_VISIBLE); - cswitchTOffset[i]->setVisible(mask & VALUE_TO_VISIBLE); - cswitchAnd[i]->setVisible(mask & LINE_ENABLED); - if (firmware->getCapability(LogicalSwitchesExt)) { - cswitchDuration[i]->setVisible(mask & DURATION_ENABLED); - cswitchDelay[i]->setVisible(mask & DELAY_ENABLED); + cbSource1[i]->setVisible(mask & SOURCE1_VISIBLE); + cbSource2[i]->setVisible(mask & SOURCE2_VISIBLE); + dsbValue[i]->setVisible(mask & VALUE1_VISIBLE); + dsbOffset[i]->setVisible(mask & VALUE2_VISIBLE); + dsbOffset2[i]->setVisible(mask & VALUE3_VISIBLE); + teOffset[i]->setVisible(mask & VALUE_TO_VISIBLE); + cbAndSwitch[i]->setVisible(mask & LINE_ENABLED); + if (lsCapabilityExt) { + dsbDuration[i]->setVisible(mask & DURATION_ENABLED); + dsbDelay[i]->setVisible(mask & DELAY_ENABLED); if (mask & DURATION_ENABLED) - cswitchDuration[i]->setValue(model->logicalSw[i].duration/10.0); + dsbDuration[i]->setValue(model->logicalSw[i].duration/10.0); if (mask & DELAY_ENABLED) - cswitchDelay[i]->setValue(model->logicalSw[i].delay/10.0); + dsbDelay[i]->setValue(model->logicalSw[i].delay/10.0); } lock = false; } -void LogicalSwitchesPanel::populateCSWCB(QComboBox *b) +void LogicalSwitchesPanel::populateFunctionCB(QComboBox *b) { int order[] = { LS_FN_OFF, @@ -514,63 +517,150 @@ void LogicalSwitchesPanel::populateAndSwitchCB(QComboBox *b) void LogicalSwitchesPanel::update() { updateDataModels(); - for (int i=0; igetCapability(LogicalSwitches); i++) { + for (int i=0; imimeData(); - if (mimeData->hasFormat("application/x-companion-csw")) { - QByteArray cswData = mimeData->data("application/x-companion-csw"); - LogicalSwitchData *csw = &model->logicalSw[selectedSwitch]; - memcpy(csw, cswData.constData(), sizeof(LogicalSwitchData)); - update(); + QByteArray data; + if (hasClipboardData(&data)) { + memcpy(&model->logicalSw[selectedIndex], data.constData(), sizeof(LogicalSwitchData)); + updateDataModels(); + updateLine(selectedIndex); emit modified(); } } -void LogicalSwitchesPanel::cswDelete() +void LogicalSwitchesPanel::cmDelete() { - model->logicalSw[selectedSwitch].clear(); + if (QMessageBox::question(this, CPN_STR_APP_NAME, tr("Delete Logical Switch. Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) + return; + + memmove(&model->logicalSw[selectedIndex], &model->logicalSw[selectedIndex + 1], (CPN_MAX_LOGICAL_SWITCHES - (selectedIndex + 1)) * sizeof(LogicalSwitchData)); + model->logicalSw[lsCapability - 1].clear(); + + model->updateAllReferences(ModelData::REF_UPD_TYPE_LOGICAL_SWITCH, ModelData::REF_UPD_ACT_SHIFT, selectedIndex, 0, -1); + update(); emit modified(); - updateLine(selectedSwitch); } -void LogicalSwitchesPanel::cswCopy() +void LogicalSwitchesPanel::cmCopy() { - QByteArray cswData; - cswData.append((char*)&model->logicalSw[selectedSwitch],sizeof(LogicalSwitchData)); + QByteArray data; + data.append((char*)&model->logicalSw[selectedIndex], sizeof(LogicalSwitchData)); QMimeData *mimeData = new QMimeData; - mimeData->setData("application/x-companion-csw", cswData); + mimeData->setData(MIMETYPE_LOGICAL_SWITCH, data); QApplication::clipboard()->setMimeData(mimeData,QClipboard::Clipboard); } -void LogicalSwitchesPanel::cswCut() +void LogicalSwitchesPanel::cmCut() { - cswCopy(); - cswDelete(); + cmCopy(); + cmClear(); } // TODO make something generic here! -void LogicalSwitchesPanel::csw_customContextMenuRequested(QPoint pos) +void LogicalSwitchesPanel::onCustomContextMenuRequested(QPoint pos) { - QLabel *label = (QLabel *)sender(); - selectedSwitch = label->property("index").toInt(); + QLabel *label = (QLabel *)sender(); + selectedIndex = label->property("index").toInt(); + QPoint globalPos = label->mapToGlobal(pos); - QPoint globalPos = label->mapToGlobal(pos); + QMenu contextMenu; + contextMenu.addAction(CompanionIcon("copy.png"), tr("Copy"),this,SLOT(cmCopy())); + contextMenu.addAction(CompanionIcon("cut.png"), tr("Cut"),this,SLOT(cmCut())); + contextMenu.addAction(CompanionIcon("paste.png"), tr("Paste"),this,SLOT(cmPaste()))->setEnabled(hasClipboardData()); + contextMenu.addAction(CompanionIcon("clear.png"), tr("Clear"),this,SLOT(cmClear())); + contextMenu.addSeparator(); + contextMenu.addAction(CompanionIcon("arrow-right.png"), tr("Insert"),this,SLOT(cmInsert()))->setEnabled(insertAllowed()); + contextMenu.addAction(CompanionIcon("arrow-left.png"), tr("Delete"),this,SLOT(cmDelete())); + contextMenu.addAction(CompanionIcon("moveup.png"), tr("Move Up"),this,SLOT(cmMoveUp()))->setEnabled(moveUpAllowed()); + contextMenu.addAction(CompanionIcon("movedown.png"), tr("Move Down"),this,SLOT(cmMoveDown()))->setEnabled(moveDownAllowed()); + contextMenu.addSeparator(); + contextMenu.addAction(CompanionIcon("clear.png"), tr("Clear All"),this,SLOT(cmClearAll())); - const QClipboard * clipboard = QApplication::clipboard(); - const QMimeData * mimeData = clipboard->mimeData(); - bool hasData = mimeData->hasFormat("application/x-companion-csw"); + contextMenu.exec(globalPos); +} - QMenu contextMenu; - contextMenu.addAction(CompanionIcon("copy.png"), tr("&Copy"),this,SLOT(cswCopy())); - contextMenu.addAction(CompanionIcon("cut.png"), tr("&Cut"),this,SLOT(cswCut())); - contextMenu.addAction(CompanionIcon("paste.png"), tr("&Paste"),this,SLOT(cswPaste()))->setEnabled(hasData); - contextMenu.addAction(CompanionIcon("clear.png"), tr("&Delete"),this,SLOT(cswDelete())); +bool LogicalSwitchesPanel::hasClipboardData(QByteArray * data) const +{ + const QClipboard * clipboard = QApplication::clipboard(); + const QMimeData * mimeData = clipboard->mimeData(); + if (mimeData->hasFormat(MIMETYPE_LOGICAL_SWITCH)) { + if (data) + data->append(mimeData->data(MIMETYPE_LOGICAL_SWITCH)); + return true; + } + return false; +} - contextMenu.exec(globalPos); +bool LogicalSwitchesPanel::insertAllowed() const +{ + return ((selectedIndex < lsCapability - 1) && (model->logicalSw[lsCapability - 1].isEmpty())); +} + +bool LogicalSwitchesPanel::moveDownAllowed() const +{ + return selectedIndex < lsCapability - 1; +} + +bool LogicalSwitchesPanel::moveUpAllowed() const +{ + return selectedIndex > 0; +} + +void LogicalSwitchesPanel::cmMoveUp() +{ + swapData(selectedIndex, selectedIndex - 1); +} + +void LogicalSwitchesPanel::cmMoveDown() +{ + swapData(selectedIndex, selectedIndex + 1); +} + +void LogicalSwitchesPanel::cmClear() +{ + model->logicalSw[selectedIndex].clear(); + model->updateAllReferences(ModelData::REF_UPD_TYPE_LOGICAL_SWITCH, ModelData::REF_UPD_ACT_CLEAR, selectedIndex); + update(); + emit modified(); +} + +void LogicalSwitchesPanel::cmClearAll() +{ + if (QMessageBox::question(this, CPN_STR_APP_NAME, tr("Clear all Logical Switches. Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) + return; + + for (int i=0; ilogicalSw[i].clear(); + model->updateAllReferences(ModelData::REF_UPD_TYPE_LOGICAL_SWITCH, ModelData::REF_UPD_ACT_CLEAR, i); + } + update(); + emit modified(); +} + +void LogicalSwitchesPanel::cmInsert() +{ + memmove(&model->logicalSw[selectedIndex + 1], &model->logicalSw[selectedIndex], (CPN_MAX_LOGICAL_SWITCHES - (selectedIndex + 1)) * sizeof(LogicalSwitchData)); + model->logicalSw[selectedIndex].clear(); + model->updateAllReferences(ModelData::REF_UPD_TYPE_LOGICAL_SWITCH, ModelData::REF_UPD_ACT_SHIFT, selectedIndex, 0, 1); + update(); + emit modified(); +} + +void LogicalSwitchesPanel::swapData(int idx1, int idx2) +{ + if ((idx1 != idx2) && (!model->logicalSw[idx1].isEmpty() || !model->logicalSw[idx2].isEmpty())) { + LogicalSwitchData lstmp = model->logicalSw[idx2]; + LogicalSwitchData *lsw1 = &model->logicalSw[idx1]; + LogicalSwitchData *lsw2 = &model->logicalSw[idx2]; + memcpy(lsw2, lsw1, sizeof(LogicalSwitchData)); + memcpy(lsw1, &lstmp, sizeof(LogicalSwitchData)); + model->updateAllReferences(ModelData::REF_UPD_TYPE_LOGICAL_SWITCH, ModelData::REF_UPD_ACT_SWAP, idx1, idx2); + update(); + emit modified(); + } } diff --git a/companion/src/modeledit/logicalswitches.h b/companion/src/modeledit/logicalswitches.h index fde3df0f4..2aea300c5 100644 --- a/companion/src/modeledit/logicalswitches.h +++ b/companion/src/modeledit/logicalswitches.h @@ -28,6 +28,8 @@ class RawSwitchFilterItemModel; class RawSourceFilterItemModel; class TimerEdit; +constexpr char MIMETYPE_LOGICAL_SWITCH[] = "application/x-companion-logical-switch"; + class LogicalSwitchesPanel : public ModelPanel { Q_OBJECT @@ -40,40 +42,50 @@ class LogicalSwitchesPanel : public ModelPanel private slots: void updateDataModels(); - void functionChanged(); - void v1Edited(int value); - void v2Edited(int value); - void andEdited(int value); - void durationEdited(double duration); - void delayEdited(double delay); - void offsetEdited(); - bool offsetEditedAt(int index); + void onFunctionChanged(); + void onV1Changed(int value); + void onV2Changed(int value); + void onAndSwitchChanged(int value); + void onDurationChanged(double duration); + void onDelayChanged(double delay); + void onOffsetChanged(); + bool offsetChangedAt(int index); void updateLine(int index); - void csw_customContextMenuRequested(QPoint pos); - void cswDelete(); - void cswCopy(); - void cswPaste(); - void cswCut(); + void onCustomContextMenuRequested(QPoint pos); + void cmDelete(); + void cmCopy(); + void cmPaste(); + void cmCut(); + void cmMoveUp(); + void cmMoveDown(); + void cmInsert(); + void cmClear(); + void cmClearAll(); private: - QComboBox * csw[CPN_MAX_LOGICAL_SWITCHES]; - QDoubleSpinBox * cswitchValue[CPN_MAX_LOGICAL_SWITCHES]; - QDoubleSpinBox * cswitchOffset[CPN_MAX_LOGICAL_SWITCHES]; - QDoubleSpinBox * cswitchOffset2[CPN_MAX_LOGICAL_SWITCHES]; - TimerEdit * cswitchTOffset[CPN_MAX_LOGICAL_SWITCHES]; - QComboBox * cswitchAnd[CPN_MAX_LOGICAL_SWITCHES]; - QDoubleSpinBox * cswitchDuration[CPN_MAX_LOGICAL_SWITCHES]; - QDoubleSpinBox * cswitchDelay[CPN_MAX_LOGICAL_SWITCHES]; - QComboBox * cswitchSource1[CPN_MAX_LOGICAL_SWITCHES]; - QComboBox * cswitchSource2[CPN_MAX_LOGICAL_SWITCHES]; + QComboBox * cbFunction[CPN_MAX_LOGICAL_SWITCHES]; + QDoubleSpinBox * dsbValue[CPN_MAX_LOGICAL_SWITCHES]; + QDoubleSpinBox * dsbOffset[CPN_MAX_LOGICAL_SWITCHES]; + QDoubleSpinBox * dsbOffset2[CPN_MAX_LOGICAL_SWITCHES]; + TimerEdit * teOffset[CPN_MAX_LOGICAL_SWITCHES]; + QComboBox * cbAndSwitch[CPN_MAX_LOGICAL_SWITCHES]; + QDoubleSpinBox * dsbDuration[CPN_MAX_LOGICAL_SWITCHES]; + QDoubleSpinBox * dsbDelay[CPN_MAX_LOGICAL_SWITCHES]; + QComboBox * cbSource1[CPN_MAX_LOGICAL_SWITCHES]; + QComboBox * cbSource2[CPN_MAX_LOGICAL_SWITCHES]; RawSwitchFilterItemModel * rawSwitchItemModel; RawSourceFilterItemModel * rawSourceItemModel; - int selectedSwitch; - - void populateCSWCB(QComboBox *b); + int selectedIndex; + void populateFunctionCB(QComboBox *b); void populateAndSwitchCB(QComboBox *b); void updateTimerParam(QDoubleSpinBox *sb, int timer, double minimum=0); - + int lsCapability; + int lsCapabilityExt; + void swapData(int idx1, int idx2); + bool hasClipboardData(QByteArray * data = nullptr) const; + bool insertAllowed() const; + bool moveDownAllowed() const; + bool moveUpAllowed() const; }; #endif // _LOGICALSWITCHES_H_ diff --git a/companion/src/modeledit/setup.cpp b/companion/src/modeledit/setup.cpp index 5e193faec..c813b0b9c 100644 --- a/companion/src/modeledit/setup.cpp +++ b/companion/src/modeledit/setup.cpp @@ -49,7 +49,7 @@ TimerPanel::TimerPanel(QWidget *parent, ModelData & model, TimerData & timer, Ge } else { ui->name->setMaxLength(length); - ui->name->setText(timer.name); + //ui->name->setText(timer.name); } // Mode @@ -85,6 +85,7 @@ TimerPanel::TimerPanel(QWidget *parent, ModelData & model, TimerData & timer, Ge QWidget::setTabOrder(ui->countdownBeep, ui->minuteBeep); QWidget::setTabOrder(ui->minuteBeep, ui->persistent); + update(); lock = false; } @@ -95,6 +96,9 @@ TimerPanel::~TimerPanel() void TimerPanel::update() { + lock = true; + ui->name->setText(timer.name); + int hour = timer.val / 3600; int min = (timer.val - (hour * 3600)) / 60; int sec = (timer.val - (hour * 3600)) % 60; @@ -116,7 +120,10 @@ void TimerPanel::update() ui->persistentValue->setText(QString(" %1(%2:%3:%4)").arg(sign<0 ? "-" :" ").arg(hours, 2, 10, QLatin1Char('0')).arg(minutes, 2, 10, QLatin1Char('0')).arg(seconds, 2, 10, QLatin1Char('0'))); } + ui->countdownBeep->updateValue(); ui->minuteBeep->setChecked(timer.minuteBeep); + ui->persistent->updateValue(); + lock = false; } QWidget * TimerPanel::getLastFocus() @@ -126,38 +133,43 @@ QWidget * TimerPanel::getLastFocus() void TimerPanel::on_value_editingFinished() { - unsigned val = ui->value->time().hour()*3600 + ui->value->time().minute()*60 + ui->value->time().second(); - if (timer.val != val) { - timer.val = val; - emit modified(); + if (!lock) { + unsigned val = ui->value->time().hour()*3600 + ui->value->time().minute()*60 + ui->value->time().second(); + if (timer.val != val) { + timer.val = val; + emit modified(); + } } } void TimerPanel::onModeChanged(int index) { - if (lock) - return; - - bool ok; - const RawSwitch rs(ui->mode->itemData(index).toInt(&ok)); - if (ok && timer.mode.toValue() != rs.toValue()) { - timer.mode = rs; - emit modified(); + if (!lock) { + bool ok; + const RawSwitch rs(ui->mode->itemData(index).toInt(&ok)); + if (ok && timer.mode.toValue() != rs.toValue()) { + timer.mode = rs; + emit modified(); + } } } void TimerPanel::on_minuteBeep_toggled(bool checked) { - timer.minuteBeep = checked; - emit modified(); + if (!lock) { + timer.minuteBeep = checked; + emit modified(); + } } void TimerPanel::on_name_editingFinished() { - if (QString(timer.name) != ui->name->text()) { - int length = ui->name->maxLength(); - strncpy(timer.name, ui->name->text().toLatin1(), length); - emit modified(); + if (!lock) { + if (QString(timer.name) != ui->name->text()) { + int length = ui->name->maxLength(); + strncpy(timer.name, ui->name->text().toLatin1(), length); + emit modified(); + } } } @@ -273,27 +285,12 @@ ModulePanel::~ModulePanel() delete ui; } -bool ModulePanel::moduleHasFailsafes() -{ - return firmware->getCapability(HasFailsafe) && ( - (PulsesProtocol)module.protocol == PulsesProtocol::PULSES_ACCESS_ISRM || - (PulsesProtocol)module.protocol == PulsesProtocol::PULSES_ACCST_ISRM_D16 || - (PulsesProtocol)module.protocol == PulsesProtocol::PULSES_PXX_XJT_X16 || - (PulsesProtocol)module.protocol == PulsesProtocol::PULSES_PXX_R9M || - (PulsesProtocol)module.protocol == PulsesProtocol::PULSES_ACCESS_R9M || - (PulsesProtocol)module.protocol == PulsesProtocol::PULSES_ACCESS_R9M_LITE || - (PulsesProtocol)module.protocol == PulsesProtocol::PULSES_ACCESS_R9M_LITE_PRO || - (PulsesProtocol)module.protocol == PulsesProtocol::PULSES_XJT_LITE_X16 || - (PulsesProtocol)module.protocol == PulsesProtocol::PULSES_MULTIMODULE - ); -} - void ModulePanel::setupFailsafes() { ChannelFailsafeWidgetsGroup grp; const int start = module.channelsStart; const int end = start + module.channelsCount; - const bool hasFailsafe = moduleHasFailsafes(); + const bool hasFailsafe = module.hasFailsafes(firmware); lock = true; @@ -382,48 +379,6 @@ void ModulePanel::setupFailsafes() lock = false; } -int ModulePanel::getMaxChannelCount() -{ - const PulsesProtocol protocol = (PulsesProtocol)module.protocol; - switch (protocol) { - case PULSES_ACCESS_ISRM: - return 24; - case PULSES_PXX_R9M: - case PULSES_ACCESS_R9M: - case PULSES_ACCESS_R9M_LITE: - case PULSES_ACCESS_R9M_LITE_PRO: - case PULSES_ACCST_ISRM_D16: - case PULSES_XJT_LITE_X16: - case PULSES_PXX_XJT_X16: - case PULSES_CROSSFIRE: - case PULSES_SBUS: - case PULSES_PPM: - return 16; - case PULSES_XJT_LITE_LR12: - case PULSES_PXX_XJT_LR12: - return 12; - case PULSES_PXX_DJT: - case PULSES_XJT_LITE_D8: - case PULSES_PXX_XJT_D8: - return 8; - case PULSES_LP45: - case PULSES_DSM2: - case PULSES_DSMX: - return 6; - case PULSES_MULTIMODULE: - if (module.multi.rfProtocol == MODULE_SUBTYPE_MULTI_DSM2) - return 12; - else - return 16; - break; - case PULSES_OFF: - break; - default: - break; - } - return 8; -} - void ModulePanel::update() { const PulsesProtocol protocol = (PulsesProtocol)module.protocol; @@ -510,7 +465,7 @@ void ModulePanel::update() mask |= MASK_PPM_FIELDS | MASK_CHANNELS_RANGE | MASK_CHANNELS_COUNT; } - if (moduleHasFailsafes()) { + if (module.hasFailsafes(firmware)) { mask |= MASK_FAILSAFES; } @@ -527,7 +482,7 @@ void ModulePanel::update() ui->label_channelsCount->setVisible(mask & MASK_CHANNELS_RANGE); ui->channelsCount->setVisible(mask & MASK_CHANNELS_RANGE); ui->channelsCount->setEnabled(mask & MASK_CHANNELS_COUNT); - ui->channelsCount->setMaximum(getMaxChannelCount()); + ui->channelsCount->setMaximum(module.getMaxChannelCount()); ui->channelsCount->setValue(module.channelsCount); ui->channelsCount->setSingleStep(firmware->getCapability(HasPPMStart) ? 1 : 2); @@ -695,7 +650,7 @@ void ModulePanel::onProtocolChanged(int index) { if (!lock && module.protocol != ui->protocol->itemData(index).toUInt()) { module.protocol = ui->protocol->itemData(index).toInt(); - module.channelsCount = getMaxChannelCount(); + module.channelsCount = module.getMaxChannelCount(); update(); emit modified(); } @@ -790,7 +745,7 @@ void ModulePanel::onMultiProtocolChanged(int index) if (rfProtocol > MODULE_SUBTYPE_MULTI_LAST) maxSubTypes=8; module.subType = std::min(module.subType, maxSubTypes -1); - module.channelsCount = getMaxChannelCount(); + module.channelsCount = module.getMaxChannelCount(); update(); emit modified(); lock = false; @@ -1064,16 +1019,28 @@ SetupPanel::SetupPanel(QWidget * parent, ModelData & model, GeneralSettings & ge RawSwitchFilterItemModel * swModel = new RawSwitchFilterItemModel(&generalSettings, &model, RawSwitch::TimersContext, this); connect(this, &SetupPanel::updated, swModel, &RawSwitchFilterItemModel::update); - for (int i=0; igetCapability(Timers)) { + timersCount = firmware->getCapability(Timers); + + for (int i = 0; i < CPN_MAX_TIMERS; i++) { + if (i < timersCount) { timers[i] = new TimerPanel(this, model, model.timers[i], generalSettings, firmware, prevFocus, swModel); ui->gridLayout->addWidget(timers[i], 1+i, 1); connect(timers[i], &TimerPanel::modified, this, &SetupPanel::modified); connect(this, &SetupPanel::updated, timers[i], &TimerPanel::update); + connect(this, &SetupPanel::timerUpdated, timers[i], &TimerPanel::update); prevFocus = timers[i]->getLastFocus(); + // TODO more reliable method required + QLabel *label = findChild(QString("label_timer%1").arg(i + 1)); + if (label) { // to stop crashing if not found + label->setProperty("index", i); + label->setContextMenuPolicy(Qt::CustomContextMenu); + label->setToolTip(tr("Popup menu available")); + label->setMouseTracking(true); + connect(label, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onTimerCustomContextMenuRequested(QPoint))); + } } else { - foreach(QLabel *label, findChildren(QRegularExpression(QString("label_timer%1").arg(i+1)))) { + foreach(QLabel *label, findChildren(QRegularExpression(QString("label_timer%1").arg(i + 1 )))) { //TODO more reliable method required label->hide(); } } @@ -1081,9 +1048,9 @@ SetupPanel::SetupPanel(QWidget * parent, ModelData & model, GeneralSettings & ge if (firmware->getCapability(HasTopLcd)) { ui->toplcdTimer->setField(model.toplcdTimer, this); - for (int i=0; igetCapability(Timers)) { - ui->toplcdTimer->addItem(tr("Timer %1").arg(i+1), i); + for (int i = 0; i < CPN_MAX_TIMERS; i++) { + if (itoplcdTimer->addItem(tr("Timer %1").arg(i + 1), i); } } } @@ -1528,3 +1495,155 @@ void SetupPanel::on_editText_clicked() } } +void SetupPanel::onTimerCustomContextMenuRequested(QPoint pos) +{ + QLabel *label = (QLabel *)sender(); + selectedTimerIndex = label->property("index").toInt(); + QPoint globalPos = label->mapToGlobal(pos); + + QMenu contextMenu; + contextMenu.addAction(CompanionIcon("copy.png"), tr("Copy"), this, SLOT(cmTimerCopy())); + contextMenu.addAction(CompanionIcon("cut.png"), tr("Cut"), this, SLOT(cmTimerCut())); + contextMenu.addAction(CompanionIcon("paste.png"), tr("Paste"), this, SLOT(cmTimerPaste()))->setEnabled(hasTimerClipboardData()); + contextMenu.addAction(CompanionIcon("clear.png"), tr("Clear"), this, SLOT(cmTimerClear())); + contextMenu.addSeparator(); + contextMenu.addAction(CompanionIcon("arrow-right.png"), tr("Insert"), this, SLOT(cmTimerInsert()))->setEnabled(insertTimerAllowed()); + contextMenu.addAction(CompanionIcon("arrow-left.png"), tr("Delete"), this, SLOT(cmTimerDelete())); + contextMenu.addAction(CompanionIcon("moveup.png"), tr("Move Up"), this, SLOT(cmTimerMoveUp()))->setEnabled(moveTimerUpAllowed()); + contextMenu.addAction(CompanionIcon("movedown.png"), tr("Move Down"), this, SLOT(cmTimerMoveDown()))->setEnabled(moveTimerDownAllowed()); + contextMenu.addSeparator(); + contextMenu.addAction(CompanionIcon("clear.png"), tr("Clear All"), this, SLOT(cmTimerClearAll())); + + contextMenu.exec(globalPos); +} + +bool SetupPanel::hasTimerClipboardData(QByteArray * data) const +{ + const QClipboard * clipboard = QApplication::clipboard(); + const QMimeData * mimeData = clipboard->mimeData(); + if (mimeData->hasFormat(MIMETYPE_TIMER)) { + if (data) + data->append(mimeData->data(MIMETYPE_TIMER)); + return true; + } + return false; +} + +bool SetupPanel::insertTimerAllowed() const +{ + return ((selectedTimerIndex < timersCount - 1) && (model->timers[timersCount - 1].isEmpty())); +} + +bool SetupPanel::moveTimerDownAllowed() const +{ + return selectedTimerIndex < timersCount - 1; +} + +bool SetupPanel::moveTimerUpAllowed() const +{ + return selectedTimerIndex > 0; +} + +void SetupPanel::cmTimerClear() +{ + if (QMessageBox::question(this, CPN_STR_APP_NAME, tr("Clear Timer. Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) + return; + + model->timers[selectedTimerIndex].clear(); + model->updateAllReferences(ModelData::REF_UPD_TYPE_TIMER, ModelData::REF_UPD_ACT_CLEAR, selectedTimerIndex); + emit timerUpdated(); + emit modified(); +} + +void SetupPanel::cmTimerClearAll() +{ + if (QMessageBox::question(this, CPN_STR_APP_NAME, tr("Clear all Timers. Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) + return; + + for (int i = 0; i < timersCount; i++) { + model->timers[i].clear(); + model->updateAllReferences(ModelData::REF_UPD_TYPE_TIMER, ModelData::REF_UPD_ACT_CLEAR, i); + } + emit timerUpdated(); + emit modified(); +} + +void SetupPanel::cmTimerCopy() +{ + QByteArray data; + data.append((char*)&model->timers[selectedTimerIndex], sizeof(TimerData)); + QMimeData *mimeData = new QMimeData; + mimeData->setData(MIMETYPE_TIMER, data); + QApplication::clipboard()->setMimeData(mimeData,QClipboard::Clipboard); +} + +void SetupPanel::cmTimerCut() +{ + cmTimerCopy(); + cmTimerClear(); +} + +void SetupPanel::cmTimerDelete() +{ + if (QMessageBox::question(this, CPN_STR_APP_NAME, tr("Delete Timer. Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) + return; + + int maxidx = timersCount - 1; + for (int i = selectedTimerIndex; i < maxidx; i++) { + if (!model->timers[i].isEmpty() || !model->timers[i + 1].isEmpty()) { + memcpy(&model->timers[i], &model->timers[i+1], sizeof(TimerData)); + } + } + model->timers[maxidx].clear(); + model->updateAllReferences(ModelData::REF_UPD_TYPE_TIMER, ModelData::REF_UPD_ACT_SHIFT, selectedTimerIndex, 0, -1); + emit timerUpdated(); + emit modified(); +} + +void SetupPanel::cmTimerInsert() +{ + for (int i = (timersCount - 1); i > selectedTimerIndex; i--) { + if (!model->timers[i].isEmpty() || !model->timers[i-1].isEmpty()) { + memcpy(&model->timers[i], &model->timers[i-1], sizeof(TimerData)); + } + } + model->timers[selectedTimerIndex].clear(); + model->updateAllReferences(ModelData::REF_UPD_TYPE_TIMER, ModelData::REF_UPD_ACT_SHIFT, selectedTimerIndex, 0, 1); + emit timerUpdated(); + emit modified(); +} + +void SetupPanel::cmTimerMoveDown() +{ + swapTimerData(selectedTimerIndex, selectedTimerIndex + 1); +} + +void SetupPanel::cmTimerMoveUp() +{ + swapTimerData(selectedTimerIndex, selectedTimerIndex - 1); +} + +void SetupPanel::cmTimerPaste() +{ + QByteArray data; + if (hasTimerClipboardData(&data)) { + TimerData *td = &model->timers[selectedTimerIndex]; + memcpy(td, data.constData(), sizeof(TimerData)); + emit timerUpdated(); + emit modified(); + } +} + +void SetupPanel::swapTimerData(int idx1, int idx2) +{ + if ((idx1 != idx2) && (!model->timers[idx1].isEmpty() || !model->timers[idx2].isEmpty())) { + TimerData tdtmp = model->timers[idx2]; + TimerData *td1 = &model->timers[idx1]; + TimerData *td2 = &model->timers[idx2]; + memcpy(td2, td1, sizeof(TimerData)); + memcpy(td1, &tdtmp, sizeof(TimerData)); + model->updateAllReferences(ModelData::REF_UPD_TYPE_TIMER, ModelData::REF_UPD_ACT_SWAP, idx1, idx2); + emit timerUpdated(); + emit modified(); + } +} diff --git a/companion/src/modeledit/setup.h b/companion/src/modeledit/setup.h index 586cba07d..fa9e4ad5b 100644 --- a/companion/src/modeledit/setup.h +++ b/companion/src/modeledit/setup.h @@ -24,6 +24,8 @@ #include "modeledit.h" #include "eeprominterface.h" +constexpr char MIMETYPE_TIMER[] = "application/x-companion-timer"; + class RawSwitchFilterItemModel; namespace Ui { @@ -62,7 +64,6 @@ class ModulePanel : public ModelPanel ModulePanel(QWidget *parent, ModelData & model, ModuleData & module, GeneralSettings & generalSettings, Firmware * firmware, int moduleIdx); virtual ~ModulePanel(); virtual void update(); - bool moduleHasFailsafes(); public slots: void onExtendedLimitsToggled(); @@ -71,7 +72,6 @@ class ModulePanel : public ModelPanel void channelsRangeChanged(); private slots: - int getMaxChannelCount(); void setupFailsafes(); void on_trainerMode_currentIndexChanged(int index); void onProtocolChanged(int index); @@ -129,6 +129,7 @@ class SetupPanel : public ModelPanel signals: void extendedLimitsToggled(); void updated(); + void timerUpdated(); private slots: void on_name_editingFinished(); @@ -148,6 +149,16 @@ class SetupPanel : public ModelPanel void potWarningToggled(bool checked); void on_potWarningMode_currentIndexChanged(int index); void on_editText_clicked(); + void onTimerCustomContextMenuRequested(QPoint pos); + void cmTimerClear(); + void cmTimerClearAll(); + void cmTimerCopy(); + void cmTimerCut(); + void cmTimerDelete(); + void cmTimerInsert(); + void cmTimerPaste(); + void cmTimerMoveDown(); + void cmTimerMoveUp(); private: Ui::Setup *ui; @@ -161,6 +172,13 @@ class SetupPanel : public ModelPanel void updatePotWarnings(); void updateBeepCenter(); void populateThrottleSourceCB(); + int timersCount; + int selectedTimerIndex; + bool hasTimerClipboardData(QByteArray * data = nullptr) const; + bool insertTimerAllowed() const; + bool moveTimerDownAllowed() const; + bool moveTimerUpAllowed() const; + void swapTimerData(int idx1, int idx2); }; #endif // _SETUP_H_ diff --git a/companion/src/modeledit/setup.ui b/companion/src/modeledit/setup.ui index 9ad725ce1..fc499ad63 100644 --- a/companion/src/modeledit/setup.ui +++ b/companion/src/modeledit/setup.ui @@ -590,7 +590,7 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi - + 50 From 0609cdb2d32ef5aacd26f8733545b8e7dc174ad0 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 15 May 2020 15:54:51 +0200 Subject: [PATCH 350/560] Alternative to display INT_MIN correctly (#7557) INT_MIN/INT_MAX --- radio/src/gui/128x64/lcd.cpp | 13 +++++++++++++ radio/src/gui/212x64/lcd.cpp | 13 +++++++++++++ radio/src/gui/480x272/lcd.cpp | 13 +++++++++++++ 3 files changed, 39 insertions(+) diff --git a/radio/src/gui/128x64/lcd.cpp b/radio/src/gui/128x64/lcd.cpp index c2c12fead..f3adae2ca 100644 --- a/radio/src/gui/128x64/lcd.cpp +++ b/radio/src/gui/128x64/lcd.cpp @@ -18,6 +18,7 @@ * GNU General Public License for more details. */ +#include #include "opentx.h" display_t displayBuf[DISPLAY_BUFFER_SIZE] __DMA; @@ -465,7 +466,19 @@ void lcdDrawNumber(coord_t x, coord_t y, int32_t val, LcdFlags flags, uint8_t le int idx = 0; int mode = MODE(flags); bool neg = false; + + if (val == INT_MAX) { + flags &= ~(LEADING0 | PREC1 | PREC2); + lcdDrawText(x, y, "INT_MAX", flags); + return; + } + if (val < 0) { + if (val == INT_MIN) { + flags &= ~(LEADING0 | PREC1 | PREC2); + lcdDrawText(x, y, "INT_MIN", flags); + return; + } val = -val; neg = true; } diff --git a/radio/src/gui/212x64/lcd.cpp b/radio/src/gui/212x64/lcd.cpp index c523643bb..a838003b3 100644 --- a/radio/src/gui/212x64/lcd.cpp +++ b/radio/src/gui/212x64/lcd.cpp @@ -18,6 +18,7 @@ * GNU General Public License for more details. */ +#include #include "opentx.h" #include "timers.h" @@ -402,7 +403,19 @@ void lcdDrawNumber(coord_t x, coord_t y, int32_t val, LcdFlags flags, uint8_t le int idx = 0; int mode = MODE(flags); bool neg = false; + + if (val == INT_MAX) { + flags &= ~(LEADING0 | PREC1 | PREC2); + lcdDrawText(x, y, "INT_MAX", flags); + return; + } + if (val < 0) { + if (val == INT_MIN) { + flags &= ~(LEADING0 | PREC1 | PREC2); + lcdDrawText(x, y, "INT_MIN", flags); + return; + } val = -val; neg = true; } diff --git a/radio/src/gui/480x272/lcd.cpp b/radio/src/gui/480x272/lcd.cpp index 34e8831d8..e2c660f73 100644 --- a/radio/src/gui/480x272/lcd.cpp +++ b/radio/src/gui/480x272/lcd.cpp @@ -20,6 +20,7 @@ #include #include +#include #include "opentx.h" #include "strhelpers.h" @@ -165,7 +166,19 @@ void lcdDrawNumber(coord_t x, coord_t y, int32_t val, LcdFlags flags, uint8_t le int idx = 0; int mode = MODE(flags); bool neg = false; + + if (val == INT_MAX) { + flags &= ~(LEADING0 | PREC1 | PREC2); + lcdDrawText(x, y, "INT_MAX", flags); + return; + } + if (val < 0) { + if (val == INT_MIN) { + flags &= ~(LEADING0 | PREC1 | PREC2); + lcdDrawText(x, y, "INT_MIN", flags); + return; + } val = -val; neg = true; } From 318e4dd516c569b75646de3eaaea4e03e2f7717b Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 15 May 2020 21:11:05 +0200 Subject: [PATCH 351/560] tx16s aux fixes --- radio/src/lua/api_general.cpp | 2 +- radio/src/lua/lua_api.h | 2 +- .../common/arm/stm32/aux_serial_driver.cpp | 24 ++++++++++++++++++- radio/src/targets/horus/board.cpp | 12 ++++++++++ radio/src/targets/horus/board.h | 10 ++++---- radio/src/targets/horus/hal.h | 4 +++- 6 files changed, 45 insertions(+), 9 deletions(-) diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 2121b36b6..fd06629e4 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -1634,9 +1634,9 @@ Reads characters from the serial port. The string is allowed to contain any char */ static int luaSerialRead(lua_State * L) { +#if defined(LUA) && !defined(CLI) int num = luaL_optunsigned(L, 1, 0); -#if defined(LUA) && !defined(CLI) if (!luaRxFifo) { luaRxFifo = new Fifo(); if (!luaRxFifo) { diff --git a/radio/src/lua/lua_api.h b/radio/src/lua/lua_api.h index a0dc8e919..53ef9df04 100644 --- a/radio/src/lua/lua_api.h +++ b/radio/src/lua/lua_api.h @@ -41,7 +41,7 @@ extern "C" { #endif #endif -#if !defined(CLI) +#if !defined(CLI) || defined(AUX2_SERIAL) #define LUA_FIFO_SIZE 256 extern Fifo * luaRxFifo; #endif diff --git a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp index bc0e54504..53dcec950 100644 --- a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp @@ -101,6 +101,7 @@ void auxSerialInit(unsigned int mode, unsigned int protocol) #if defined(CROSSFIRE) if (protocol == PROTOCOL_TELEMETRY_CROSSFIRE) { auxSerialSetup(CROSSFIRE_TELEM_MIRROR_BAUDRATE, false); + AUX_SERIAL_POWER_OFF(); break; } #endif @@ -110,17 +111,20 @@ void auxSerialInit(unsigned int mode, unsigned int protocol) #if defined(DEBUG) || defined(CLI) case UART_MODE_DEBUG: auxSerialSetup(DEBUG_BAUDRATE, false); + AUX_SERIAL_POWER_OFF(); break; #endif case UART_MODE_TELEMETRY: if (protocol == PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY) { auxSerialSetup(FRSKY_D_BAUDRATE, true); + AUX_SERIAL_POWER_OFF(); } break; case UART_MODE_LUA: auxSerialSetup(DEBUG_BAUDRATE, false); + AUX_SERIAL_POWER_ON(); } } @@ -192,7 +196,7 @@ extern "C" void AUX_SERIAL_USART_IRQHandler(void) } } #endif -#if defined(LUA) && !defined(CLI) +#if defined(LUA) & !defined(CLI) if (luaRxFifo && auxSerialMode == UART_MODE_LUA) { // Receive uint32_t status = AUX_SERIAL_USART->SR; @@ -204,6 +208,19 @@ extern "C" void AUX_SERIAL_USART_IRQHandler(void) status = AUX_SERIAL_USART->SR; } } +#if defined(AUX2_SERIAL) + if (luaRxFifo && aux2SerialMode == UART_MODE_LUA) { + // Receive + uint32_t status = AUX2_SERIAL_USART->SR; + while (status & (USART_FLAG_RXNE | USART_FLAG_ERRORS)) { + uint8_t data = AUX2_SERIAL_USART->DR; + if (!(status & USART_FLAG_ERRORS)) { + luaRxFifo->push(data); + } + status = AUX2_SERIAL_USART->SR; + } + } +#endif #endif } #endif @@ -288,26 +305,31 @@ void aux2SerialInit(unsigned int mode, unsigned int protocol) #if defined(CROSSFIRE) if (protocol == PROTOCOL_TELEMETRY_CROSSFIRE) { aux2SerialSetup(CROSSFIRE_TELEM_MIRROR_BAUDRATE, false); + AUX2_SERIAL_POWER_OFF(); break; } #endif aux2SerialSetup(FRSKY_TELEM_MIRROR_BAUDRATE, false); + AUX2_SERIAL_POWER_OFF(); break; #if defined(DEBUG) || defined(CLI) case UART_MODE_DEBUG: aux2SerialSetup(DEBUG_BAUDRATE, false); + AUX2_SERIAL_POWER_OFF(); break; #endif case UART_MODE_TELEMETRY: if (protocol == PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY) { aux2SerialSetup(FRSKY_D_BAUDRATE, true); + AUX2_SERIAL_POWER_OFF(); } break; case UART_MODE_LUA: aux2SerialSetup(DEBUG_BAUDRATE, false); + AUX2_SERIAL_POWER_ON(); } } diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp index 704a6f27c..25c0cbbdf 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -52,6 +52,18 @@ void auxSerialPowerOff() GPIO_ResetBits(AUX_SERIAL_PWR_GPIO, AUX_SERIAL_PWR_GPIO_PIN); } #endif +#if defined(AUX2_SERIAL_PWR_GPIO) +void aux2SerialPowerOn() +{ + GPIO_SetBits(AUX2_SERIAL_PWR_GPIO, AUX2_SERIAL_PWR_GPIO_PIN); +} + +void aux2SerialPowerOff() +{ + GPIO_ResetBits(AUX2_SERIAL_PWR_GPIO, AUX2_SERIAL_PWR_GPIO_PIN); +} +#endif + #if HAS_SPORT_UPDATE_CONNECTOR() void sportUpdateInit() diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 74ebd7368..7de47b95b 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -627,11 +627,11 @@ void auxSerialStop(); void auxSerialPowerOn(); void auxSerialPowerOff(); #if defined(AUX_SERIAL_PWR_GPIO) -#define AUX_SERIAL_POWER_ON() auxSerialPowerOn() -#define AUX_SERIAL__POWER_OFF() auxSerialPowerOff() +#define AUX_SERIAL_POWER_ON() auxSerialPowerOn() +#define AUX_SERIAL_POWER_OFF() auxSerialPowerOff() #else #define AUX_SERIAL_POWER_ON() -#define AUX_SERIAL__POWER_OFF() +#define AUX_SERIAL_POWER_OFF() #endif #endif @@ -647,10 +647,10 @@ void aux2SerialPowerOn(); void aux2SerialPowerOff(); #if defined(AUX2_SERIAL_PWR_GPIO) #define AUX2_SERIAL_POWER_ON() aux2SerialPowerOn() -#define AUX2_SERIAL__POWER_OFF() aux2SerialPowerOff() +#define AUX2_SERIAL_POWER_OFF() aux2SerialPowerOff() #else #define AUX2_SERIAL_POWER_ON() -#define AUX2_SERIAL__POWER_OFF() +#define AUX2_SERIAL_POWER_OFF() #endif #endif diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index f964e0137..b0d2042ae 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -393,7 +393,7 @@ // Serial Port (DEBUG) #if defined(PCBX12S) || defined(RADIO_TX16S) - #define AUX_SERIAL_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1) + #define AUX_SERIAL_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1) #define AUX_SERIAL_RCC_APB1Periph RCC_APB1Periph_USART3 #define AUX_SERIAL_RCC_APB2Periph 0 #define AUX_SERIAL_GPIO GPIOB @@ -407,6 +407,8 @@ #define AUX_SERIAL_USART_IRQn USART3_IRQn #define AUX_SERIAL_DMA_Stream_RX DMA1_Stream1 #define AUX_SERIAL_DMA_Channel_RX DMA_Channel_4 + #define AUX_SERIAL_PWR_GPIO GPIOA + #define AUX_SERIAL_PWR_GPIO_PIN GPIO_Pin_15 // PB.00 #if defined(RADIO_TX16S) #define TRAINER_BATTERY_COMPARTMENT // allows serial port TTL trainer #endif From 77d069785a4e1c2fa792826b2059cced46ebab74 Mon Sep 17 00:00:00 2001 From: Kilrah Date: Sun, 17 May 2020 09:17:52 +0200 Subject: [PATCH 352/560] Compilation fix - someone mixing languages :) (Ref #7325) --- companion/src/modeledit/flightmodes.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/companion/src/modeledit/flightmodes.cpp b/companion/src/modeledit/flightmodes.cpp index a38b493a9..1634aed3a 100644 --- a/companion/src/modeledit/flightmodes.cpp +++ b/companion/src/modeledit/flightmodes.cpp @@ -857,7 +857,7 @@ void FlightModePanel::cmInsert() FlightModeData *fm = &model->flightModeData[j]; for (int i = 0; i < trimCount; i++) { - if (phaseIdx == 0 and j == 1) + if (phaseIdx == 0 && j == 1) fm->trimRef[i] = j; else if (fm->trimRef[i] >= phaseIdx) { if (fm->trimRef[i] < maxidx) @@ -873,7 +873,7 @@ void FlightModePanel::cmInsert() for (int i = 0; i < gvCount; i++) { if (model->isGVarLinked(j, i)) { int idx = model->getGVarFlightModeIndex(j, i); - if (phaseIdx == 0 and j == 1) + if (phaseIdx == 0 && j == 1) model->setGVarFlightModeIndexToValue(j, i, j); else if (idx >= phaseIdx) model->setGVarFlightModeIndexToValue(j, i, idx + 1); @@ -883,7 +883,7 @@ void FlightModePanel::cmInsert() for (int i = 0; i < reCount; i++) { if (model->isREncLinked(j, i)) { int idx = model->getREncFlightModeIndex(j, i); - if (phaseIdx == 0 and j == 1) + if (phaseIdx == 0 && j == 1) model->setREncFlightModeIndexToValue(j, i, j); else if (idx >= phaseIdx) model->setREncFlightModeIndexToValue(j, i, idx + 1); From b79a55d668d510ed5a1fc769cda74ef01864c24d Mon Sep 17 00:00:00 2001 From: Kilrah Date: Sun, 17 May 2020 12:33:22 +0200 Subject: [PATCH 353/560] Multi protocol wasn't being saved in sorted mode --- radio/src/gui/128x64/model_setup.cpp | 1 + radio/src/gui/212x64/model_setup.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index eb7fea4ab..65c1d7a3c 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1023,6 +1023,7 @@ void menuModelSetup(event_t event) g_model.moduleData[moduleIdx].setMultiProtocol(multiRfProto); g_model.moduleData[moduleIdx].subType = 0; resetMultiProtocolsOptions(moduleIdx); + storageDirty(EE_MODEL); } } } diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 0de6b7294..808173efb 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -930,6 +930,7 @@ void menuModelSetup(event_t event) g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(multiRfProto); g_model.moduleData[EXTERNAL_MODULE].subType = 0; resetMultiProtocolsOptions(EXTERNAL_MODULE); + storageDirty(EE_MODEL); } } break; From ff04188240b00c47a0bf024a46970b1ea8faa199 Mon Sep 17 00:00:00 2001 From: Kilrah Date: Mon, 18 May 2020 09:08:56 +0200 Subject: [PATCH 354/560] Allow trainer multi on T12 Pro --- radio/src/dataconstants.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 65f12aa48..f67d0cb07 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -208,7 +208,7 @@ enum TrainerMode { }; #endif -#if defined(RADIO_FAMILY_T16) || defined(ALLOW_TRAINER_MULTI) +#if defined(RADIO_FAMILY_T16) || (defined(RADIO_T12) && 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 From e1be961ff588844704e2d52d11d7763a6b0d462e Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 18 May 2020 11:43:11 +0200 Subject: [PATCH 355/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index f70842e4f..c3e8483ea 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1733,3 +1733,4 @@ Josef Schaeffler Mike Frizell MeCodeGoodSomeday Timothy Fry +John Beech From 273b0ae81d29c4d47357c46611b93b2c066717c0 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 22 May 2020 10:12:43 +0200 Subject: [PATCH 356/560] Bring BT option back to TX16S --- companion/src/firmwares/opentx/opentxinterface.cpp | 2 +- radio/util/fwoptions.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 8825a5c42..fa02be60a 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -1357,7 +1357,7 @@ void registerOpenTxFirmwares() /* Radiomaster TX16S board */ firmware = new OpenTxFirmware("opentx-tx16s", Firmware::tr("Radiomaster TX16s / TX16s Hall / TX16s Masterfire"), BOARD_RADIOMASTER_TX16S); addOpenTxFrskyOptions(firmware); - // firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module")); + firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module")); addOpenTxRfOptions(firmware, FLEX); registerOpenTxFirmware(firmware); diff --git a/radio/util/fwoptions.py b/radio/util/fwoptions.py index 7e5604fd9..811ff17b7 100755 --- a/radio/util/fwoptions.py +++ b/radio/util/fwoptions.py @@ -233,5 +233,5 @@ options_radiomaster_tx16s = { "faichoice": ("FAI", "CHOICE", None), "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), - # "bluetooth": ("BLUETOOTH", "YES", "NO"), + "bluetooth": ("BLUETOOTH", "YES", "NO"), } \ No newline at end of file From a778aea8fb516c44e9f06481f52f880afa553321 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Fri, 22 May 2020 19:36:45 +0200 Subject: [PATCH 357/560] Fixes datacopy target (#7619) - removed GCC includes from parameters (causes duplicated typedef btw. GCC & clang otherwise). - make "frskyInstance" NOBACKUP (only 1 member can be backed up per union). --- radio/src/datastructs.h | 6 +++--- radio/src/targets/horus/CMakeLists.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index a0571ac61..213d9cc4d 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -329,10 +329,10 @@ PACK(struct TelemetrySensor { NOBACKUP(uint16_t persistentValue); }; union { - PACK(struct { + NOBACKUP(PACK(struct { uint8_t physID:5; uint8_t rxIndex:3; // 1 bit for module index, 2 bits for receiver index - }) frskyInstance; + }) frskyInstance); uint8_t instance; NOBACKUP(uint8_t formula); }; @@ -941,4 +941,4 @@ static inline void check_struct() #undef CHKSIZE } -#endif /* BACKUP */ \ No newline at end of file +#endif /* BACKUP */ diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index b1a01e2e1..7bed170cf 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -310,7 +310,7 @@ if(PYTHONINTERP_FOUND) add_custom_command( OUTPUT ${PROJECT_BINARY_DIR}/radio/src/datacopy.cpp WORKING_DIRECTORY ${RADIO_DIRECTORY}/src - COMMAND ${PYTHON_EXECUTABLE} ${RADIO_DIRECTORY}/util/generate_datacopy.py datastructs.h -DPCBHORUS -DPCBX10 -DCPUARM -DSTM32F4 -DSTM32F429_439xx -DCOLORLCD -DBACKUP -DSIMU -I. -Itargets/horus -Itargets/common/arm/stm32 -I${THIRDPARTY_DIR} -I${THIRDPARTY_DIR}/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/CMSIS/Device/ST/STM32F4xx/Include ${arm_gcc_include_path} > ${PROJECT_BINARY_DIR}/radio/src/datacopy.cpp + COMMAND ${PYTHON_EXECUTABLE} ${RADIO_DIRECTORY}/util/generate_datacopy.py datastructs.h -DPCBHORUS -DPCBX10 -DCPUARM -DSTM32F4 -DSTM32F429_439xx -DCOLORLCD -DBACKUP -DSIMU -I. -Itargets/horus -Itargets/common/arm/stm32 -I${THIRDPARTY_DIR} -I${THIRDPARTY_DIR}/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/CMSIS/Device/ST/STM32F4xx/Include > ${PROJECT_BINARY_DIR}/radio/src/datacopy.cpp DEPENDS ${RADIO_DIRECTORY}/src/datastructs.h ${RADIO_DIRECTORY}/util/generate_datacopy.py ) add_custom_target(datacopy From 2b7524a7a777deb0d662cbe0801b56bfe0d69bd5 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 22 May 2020 19:37:53 +0200 Subject: [PATCH 358/560] EXIT exist in all radios (#7618) --- radio/src/lua/api_general.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index fd06629e4..75bedea99 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -1869,9 +1869,7 @@ const luaR_value_entry opentxConstants[] = { { "EVT_VIRTUAL_EXIT", EVT_KEY_BREAK(KEY_EXIT) }, #endif -#if defined(KEYS_GPIO_REG_EXIT) { "EVT_EXIT_BREAK", EVT_KEY_BREAK(KEY_EXIT) }, -#endif #if defined(KEYS_GPIO_REG_ENTER) KEY_EVENTS(ENTER, KEY_ENTER), From 174e0b126d25166514774f3e63194b930f157579 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 22 May 2020 19:39:28 +0200 Subject: [PATCH 359/560] Fix x9 nav curve edit in mixerone (#7615) --- radio/src/gui/128x64/model_mix_edit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/model_mix_edit.cpp b/radio/src/gui/128x64/model_mix_edit.cpp index 681b425b4..a2180b6ac 100644 --- a/radio/src/gui/128x64/model_mix_edit.cpp +++ b/radio/src/gui/128x64/model_mix_edit.cpp @@ -150,7 +150,7 @@ void menuModelMixOne(event_t event) case MIX_FIELD_CURVE: lcdDrawTextAlignedLeft(y, STR_CURVE); - editCurveRef(MIXES_2ND_COLUMN, y, md2->curve, event, attr); + editCurveRef(MIXES_2ND_COLUMN, y, md2->curve, s_editMode > 0 ? event : 0, attr); break; #if defined(FLIGHT_MODES) From bb40239f5d66fff2ef79464256d691feea6c1774 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 22 May 2020 19:41:37 +0200 Subject: [PATCH 360/560] Always empty aux ports buffers (#7617) * Always read serial aux ports * Cosmetics --- .../common/arm/stm32/aux_serial_driver.cpp | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp index 53dcec950..8d24c00df 100644 --- a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp @@ -196,31 +196,18 @@ extern "C" void AUX_SERIAL_USART_IRQHandler(void) } } #endif + // Receive + uint32_t status = AUX_SERIAL_USART->SR; + while (status & (USART_FLAG_RXNE | USART_FLAG_ERRORS)) { + uint8_t data = AUX_SERIAL_USART->DR; + if (!(status & USART_FLAG_ERRORS)) { #if defined(LUA) & !defined(CLI) - if (luaRxFifo && auxSerialMode == UART_MODE_LUA) { - // Receive - uint32_t status = AUX_SERIAL_USART->SR; - while (status & (USART_FLAG_RXNE | USART_FLAG_ERRORS)) { - uint8_t data = AUX_SERIAL_USART->DR; - if (!(status & USART_FLAG_ERRORS)) { + if (luaRxFifo && auxSerialMode == UART_MODE_LUA) luaRxFifo->push(data); - } - status = AUX_SERIAL_USART->SR; - } - } -#if defined(AUX2_SERIAL) - if (luaRxFifo && aux2SerialMode == UART_MODE_LUA) { - // Receive - uint32_t status = AUX2_SERIAL_USART->SR; - while (status & (USART_FLAG_RXNE | USART_FLAG_ERRORS)) { - uint8_t data = AUX2_SERIAL_USART->DR; - if (!(status & USART_FLAG_ERRORS)) { - luaRxFifo->push(data); - } - status = AUX2_SERIAL_USART->SR; - } - } #endif + } + status = AUX_SERIAL_USART->SR; + } #endif } #endif @@ -401,8 +388,21 @@ extern "C" void AUX2_SERIAL_USART_IRQHandler(void) } } #endif +#if defined(AUX2_SERIAL) + // Receive + uint32_t status = AUX2_SERIAL_USART->SR; + while (status & (USART_FLAG_RXNE | USART_FLAG_ERRORS)) { + uint8_t data = AUX2_SERIAL_USART->DR; + if (!(status & USART_FLAG_ERRORS)) { +#if defined(LUA) + if (luaRxFifo && aux2SerialMode == UART_MODE_LUA) + luaRxFifo->push(data); +#endif + } + status = AUX2_SERIAL_USART->SR; + } } #endif #endif -#endif // AUX_SERIAL +#endif // AUX_SERIAL \ No newline at end of file From 61ca2cb64be140193459cb6005debc56b945eeb6 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 22 May 2020 19:53:22 +0200 Subject: [PATCH 361/560] Review font offset (#7622) Review font offset --- radio/src/fonts/480x272/CMakeLists.txt | 14 +++++++------- radio/src/fonts/480x272/font_dblsize.png | Bin 36974 -> 37236 bytes radio/src/fonts/480x272/font_midsize.png | Bin 26364 -> 26609 bytes radio/src/fonts/480x272/font_smlsize.png | Bin 12765 -> 12785 bytes radio/src/fonts/480x272/font_stdsize.png | Bin 22533 -> 22725 bytes radio/src/fonts/480x272/font_tinsize.png | Bin 8922 -> 8590 bytes radio/src/fonts/480x272/font_xxlsize.png | Bin 82621 -> 82882 bytes radio/src/lua/api_general.cpp | 3 +++ 8 files changed, 10 insertions(+), 7 deletions(-) diff --git a/radio/src/fonts/480x272/CMakeLists.txt b/radio/src/fonts/480x272/CMakeLists.txt index 09a68efdb..61ace50ce 100644 --- a/radio/src/fonts/480x272/CMakeLists.txt +++ b/radio/src/fonts/480x272/CMakeLists.txt @@ -10,12 +10,12 @@ set(FONT_OFFSET 1) #set(FONT_BOLD "Ubuntu/Ubuntu-Bold") #set(FONT_OFFSET 1) -add_truetype_font_target(480x272 tinsize ${FONT} 9 ${FONT_OFFSET}) -add_truetype_font_target(480x272 smlsize ${FONT} 13 ${FONT_OFFSET}) -add_truetype_font_target(480x272 stdsize ${FONT} 16 ${FONT_OFFSET}) -add_truetype_font_target(480x272 stdsizebold ${FONT_BOLD} 16 ${FONT_OFFSET}) -add_truetype_font_target(480x272 midsize ${FONT} 24 ${FONT_OFFSET}) -add_truetype_font_target(480x272 dblsize ${FONT_BOLD} 32 ${FONT_OFFSET}) -add_truetype_font_target(480x272 xxlsize ${FONT_BOLD} 64 ${FONT_OFFSET}) +add_truetype_font_target(480x272 tinsize ${FONT} 9 0) +add_truetype_font_target(480x272 smlsize ${FONT} 13 0) +add_truetype_font_target(480x272 stdsize ${FONT} 16 0) +add_truetype_font_target(480x272 stdsizebold ${FONT_BOLD} 16 1) +add_truetype_font_target(480x272 midsize ${FONT} 24 0) +add_truetype_font_target(480x272 dblsize ${FONT_BOLD} 32 0) +add_truetype_font_target(480x272 xxlsize ${FONT_BOLD} 64 0) add_custom_target(ttf_horus_fonts DEPENDS ${ttf_480x272_fonts_targets}) diff --git a/radio/src/fonts/480x272/font_dblsize.png b/radio/src/fonts/480x272/font_dblsize.png index 65f5a60fefc516349873fb46a1292e1dec345d76..b8d7d47173872ad24545b83e35f201a0a798fab3 100644 GIT binary patch literal 37236 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 diff --git a/radio/src/fonts/480x272/font_midsize.png b/radio/src/fonts/480x272/font_midsize.png index 0dc081f81a65ceee5cbd28d24b692832a1d9f9e9..4bc901499f9a2545775bfce40acf6e219f707c69 100644 GIT binary patch literal 26609 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 z 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

6(c;O{<*|C{{;#>MeCs8*>9f8K>}fpIA9|3E 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 TPAERrhQ)HnF4OB&58D3#W%5;{ diff --git a/radio/src/fonts/480x272/font_smlsize.png b/radio/src/fonts/480x272/font_smlsize.png index e19a1a13f9ac4392ada190d74122e4703bc3fb28..0c9dde7bded30273b8deaab112a010ddd013f678 100644 GIT binary patch literal 12785 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 YZk=u+@>d7&s~jk*N?M8)^5$Xx4+#zSnE(I) literal 12765 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 N8M7m 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 K-z&=^e)tD~WSThu diff --git a/radio/src/fonts/480x272/font_tinsize.png b/radio/src/fonts/480x272/font_tinsize.png index 8f2456ce2a5638c5318963201925d6c30163ceb1..1d5c7b32b6572094eb05faaf863d3e4ec3910e18 100644 GIT binary patch literal 8590 zcmZvCcQ}@B`1g%OGBdI>vPV{S_Lh~hw~Vq!_R8KWLfMZ!vapVZ}5~ZoGh=)UogCGc=vXa~b1i6xN`8zf`{ER(`ltK{t zN6K>2553YijXjM>`wz0NE35?PaNw|W1xt<76&114VKc~w8OdQ@388yYl+F55FUsQ1 z9WBBu*NHG5$jP$>UnvVM#75o7i*%Rvi8wpsZ5PV=I5NBPG*)@8dA|Km<~=cf8}&CL z{O^6ym_i9m9#anEURnjd{-dd!8NdC$eZ%R~ol??JV`i zU=h#`4-OuWa-D7UcXV_Nzv1WS*+MKEiQD5KKNaM2_JUjWf-gAB)aPQtd zBcf)HO$+A-B(F0w1J*|A-KS?~Tl|h(MP)TLHPzMeGhAWe-k6*GgKXT~=Reb&$a^*> zD=s!nFHqq!8X5`l@go)O=PE2WV*Y+d zaihWf8dUjWd8*#Y)XZ$b^g9myIc2(p|F@YLD&unf_dkD6zjqJkGOQb2#hIyhs;{o5 zBqu-gQu8w{Gj2Zk`7v!zi@I=Xdb+o#hx(omiAi5?Z&+yP)YO!_r>8c_*ZKMO#~)tt z+l&}BI6pVpjV9%=u(VuHN=;3D&7q4@m6eq}P7fOUFgG{H#>SSJnYnjkBuld0`Xi87@$qCWbAg0cs)nnpt9O?BS65c5-ZwTiIZjvie)_Zpo5X3~aBzVg zj_ae5DX#V40XsK0^W2$c<|8Acvb?;#A0LQ41Qiwg;e#iKhwdI8)ou)psousuK20ep zH|4c*a&lPI)3Yo18=IT|?d=JRiFFTkc1kNMD#HHx`=5n}UyVk&y1G7o{Fsc(Aat_c zWm$ncrTOVscDbFue@n~D!`tWE{F|SAVU9*YXFM`AjPWwt9pt_y7I3&2K_%pN6uYNSzkU0L!xkPMZp7{R z;T2PBYirR|f5I)dMkDv)+*}M8di$9=ya&~*BO1iwXM0k&n&vmxJ<@4vyaEI>dT3TaIz7)W2CF}?zW+Uk$xHtx)FjK!n zuMyv7V)FO%Ti{c+wl0W>z-l>J8)L-6!h&MCxls`HK(iWPE>)D4e);;9i-W_GB=}qR zitEg`ZwprD=JZH*b@h$82in>pXQrB(h+Q5lJ3G4yR9r>n>14SvZVs$2WIq*zlMoq6 zF6L1d8#~!yib|;a#`6q zIe#y7hHMiN5F`u_-;YLda&f(k`t!Z{=EzNBBO|lNB7TS46YmUjj7H}IPInZAhkpP5 zJw7@b^a{41ps?`2IjP9c-#^~Bi$+aUm?lv21e|*5^@d%)i6FWaCi$$<{mZXYQW(v9 zdwX9Vr)OkPBt8>uYHoJ0w?BLr5Ed48O=2`WEG&nO58u?()WyYxHJ*;t>ha@_&o^$| zU|?XN?x4p;yJH0AYRTYu(#KgpBMoD?CckkW}C3A(e8yXns zlp9fykhuT*V|?I4VIGZQ6%%WQN#o$)kn6mcf-1^aO*z=#rx!$}XpvZ1TJrPom^nD$ z-Dz%Wij9kFG~%XCqcdp_c!xsm{`^QqHW-3MP;mc^%&j}a!^2C<%VSoquGKj?^xwq{ z3=O@-X=Uf`+D&BdZ>8KZycRb%_uiwU@$qpQF%KS(ujDIIpADvz1?E8v#g)Zq;X?=2<32f2yv;h6YzUn6g#%n1+FR0ws^Z~Y7#Qs zh!D5nVVRH+7GB%jY_;sie{3z+NVj%1NHwA~VU7wng#H+F-}n0B>P-^s+yDN2pK0^= zeemE0Y9VvLSri-Ts5I{;w^*tsHdG~`B;4QM=g=w3)#M6+cP_GRb}VOVo_zV3 zCS=~#+x2s0rPk&XZIa%#rNZHsKL?vLqf)XmGN{~K;u|;C@HT(_lJOb*__4O8#{TKk zL%w)m!$*1KWx6@N6ff<47IpJ$UdcBt+KE4zAh&l4Oe>92xO&cIM&bm8NQg zp@p7zwy`OUiBWz0__n;(%{wOI-n)+t4b$Gg=TBdk+4gF=M$DW&M8R)8%CWh%Wm;(_ z?dZtuZyO=(vUKJ5XQ&B$>CyD`^cELi{PmmMvyEs{vWtt0OGwautnu;jfi_gTf1glNB@W=LrnZ*8s-Z#8*toT*sHnL3!|-ry zranAsenCM=ak2Eu4StTRD=R}Ol>!Z&c#4t#hBhvjh>d;WLTs1v^5t`!eAdDFc~c!7 zvXy5`OG`Y#*@t>MItAtB=X>j4-oB-jmF@oV?4PMBurRtn4yWrNXpb zq5p*@2{#8v8jm@;k({vaL0M_39RR+$c@B)!)0tq*>t?ESk+e`U{TdSmR;(j)8@r-LlsecD)F% zs;X*FzIt#_C3W)a#00?0+q5+8tuTVr$>O3SfxCClI-}1=yp7e=KKlOqn-xm`w@DJi zE452{&xo3HnSo|!X9uPZ4-fCxuU~;>n-}6RaqmpqVRBNtI0*?Vy_^~G$$B~>r3j=? zgGn7RVq5SNPSL|XlUw4YZ{vFt#+s>@WnfF&Q>EZzN$AM<>9u<~5%%^(q1PSAqJ7#p zzrFCPdboIv;KpB3G`zI=o{;0#{vAdfi#LJSsH!%cv6t@N>U=N3nMN1Djvhd8DQdK| zkf4Z&{$1D}PJMKQm5puDS$K6MgP553`t|E4ixIaFgpZG}wzd{FbXyY*=>Vpgn5cs; zp1Bk-eQVlWWkM}Rwkm<5$NmMp*BrQYjE z5VW<9&IAZWKt!#-1!`$muP8V;yh~4?g^!>kUeJNBm{b+wC~NJft3h;OAU{VkeAhoS z!S?jrA}3$l*x+Dh7PKBFx3aQAf^u`0o1Sd|R`~k*0wmKJDk$`g7i%lVQDWW^6BAQa zQ31BM9!}LVG`x-sjEt0*mI6ug3kn9D9B{D*{x?!Y(fmGpwnRik_z{fk?4s~HBIV+; z^EqENKQ9mH;Fe?nE~2EWD(1dMh|saKJoAqeqX>kiNb?6BCoBrl##baa2OTH#eU>dzK~c-Njl`U++1b%De6P^l3?2 z+RTp+iTU~YmX?-KWuh4XM1XQKPQ4cy8C;Pj2%@jA4}AlAJUJ;THa@%LI6Mr0TuIO^l3;jJ>QLE2u zlcb`ewe7`jtgBZMM967wZ+kmc;K?f#Y6&*uRbt|LI*EK#WTezcm1Tc&N{a5ohqiWh zt3Q9XB?hS`b2hpxUq!M@N}e8WFT(UALHh5l?*SN@nPunZ${HE9ynDwbBy@9-iJjf& zaN8U-H?X=|nqa34tj4|{= zEdWlywsm!NEihtWV5qCB14(ZWAV|mfcuiRu?i1pB7WVdjzo&SW?kg$1NJ+`!v%=W} z8`P5_=82A=P^fG-dU5|__dm0ZA3uI{xA5|6fVnR#D|`N2T1qOYrltni)!rQ5Zfq23 z-Tw2(5&8^7ft%akf&%6NO8{gpE(bHS(WxnHswdXg%xr8Tz6bW?O5NSvHXq;Kee(G> zBBiDl2YS4r;ZWDqAJgiguC9i%^3ku-3UGn{y^tVa4b>EGG$ff*|AC1KKEfj)VDIFF zg@79X3WqB|W1=IV<1lWCxUY>ac1KWAQWj`r&3*lfiSY3AbFi_YA@|?#VLkwk6Q;(G z=!OPgUtgzq@LpM2xxBnwL_{Pqcmum|;UFjp{W%o|T^L&nHEMN9g&uutrms)o-o4g| z2^|Lqhk(zE$6Zt!lXt2TUF0i0iRN&n?-Si5EF8^H*Vp$3RfBu|HadYLX9(t@zgehR zC|y8jv{lhkgeTq>x=aT>K?Thu3E^;^%YwBO)^{_BGSdZzZnmDTs9)VtJrhfhus`$6 zQcR1f5lVI$)BdxypzCF_@+9`aww*dFLgS8X6i##rP{oEVW2=Zf?j*G04uz3e#NiMeuE)y1@fGA1i5% zzhqQgo0%};{s)Zp_3KwbK|yCheJ!n=vN9tR6GvOyNb7tg$ZoQnORo~~s3FM>~zx@_E(277~zlEvmG6Wt3t>x_I7V?Hb&eoPS zqWg`Y11051T3QJv?*9E-sF8)gHIgP&QCs_UY|N!6lBg&hW}Dlz%@1Z8 zl$LzY+?#N*HGwUg&GuvlAL8-O?%H^?|%6y@Y- z!ERYwlTkv36B!%(P)FyIN_crc3=Lr*>0+Mhs;Z@6gfd)2{f}#6WA8tD^c84eaXM;m zZ?9Opu*-__m{Ge>UA}hc!-q3aiy(sbmdS*HBPYxB0l>MKn0g!XQ7BNjIRyneU^I-4 z!EBvuFUooWi$$9pzTvk~NT4;=)wQv=Zwb5z7|1Oyh7J~SniD6-8Oab6dh$81q@)Bi zUp70lMka2GDV!3yTfR4-$k&C1}*_@o{Fx_u~A_*#%GHWN%#?5JBk(lmTnB=(Atr;KOoO z1cZb%GDP>^f09sDQwzKE^ow16Rn;^M7}PZ?>O=d*nG-7B8E1@kts@TYMHh(){+L^o z3K2C}E9bZb*6ZbWES6seL}kQs1h>X)TO*zKU6dBov6RRLu(!ONmxc5eo)c|flkPE- zr!HCR=%?xIKJg8b_(Al15}!wnXoZ0ikrhQz5bl_tp*vBj)03$`yrq7-&SM~3`bTF5 z(N+zNK5V`S6B8yGU*4@n?gU=}b$XS-Kg>#FcT8H8l$G`2uf}>HnuK@ge5hZtW?KdL z30h1NSys@Q{I&6&h_E8QGTh=gRcY=V5)+@DP3PdS`OdH&nEh>PYKJi!(gE`bu6%!Q zPd!64EY)*s?&IFNs6(a|w5$bb$;oI&nHqYBhBRJ2Hj@d!a#icqUtSTN*HLr7;(X@+*n#m$YMA_JCi zREH`aR1y{@W@jTa=t=oY#&uax{IBJp4otQxeXx7Q(N2di3x_yC2|R{*NfdE)c7rVS&Mb` z^$|TV@NI1pJ_k2$-Ey+D44H@}5)~DN}0+&ijIas~R#lR5!ZDMjVf`K!kUsXv7;6#R*fx!KvH=eS^O!6b9e8YoUdJOruYEEh}H+?<4I%JBQkqms*#!o)a*9Vad{hrSV>7Fdv}u+6y)S0qoRn;)OB@rWn^R^_=5NYUfSBk zq`j;y4GpRN%gRbhWk!v=uxl^C^VrBGwlwGlxeV3>Yy)7;$5 z!pz+DjMYQW(6BH+A1a;`IzKxr&cU&fVj3{r9(b|8F==OKx5#}48Wa>{bWF?`Y6`q8 z$ifQa=I~5RB(I=gu02qahlkL_+QtS%w`qg3`IiDU2?>c^?5vCUISgc+EVL@Pf%;dpWj(xz*AR0_pAbi`okP)3= zD|VsJsgmxhf(3S02x)sxbgQ{kCFBlK^qZj)KXx#3J%XO7NX_)+Q}NLsR^=m78`&i~^*<&JJIeu}D%FDy!JX7cJ`t|GWe9lzX zi^Jsvh`8Y~UnM2U5oZ|IJ93${2un&{z_@@wg)j*Tf+Q3YAQ88p&}~V{$*5faB0EY- z%26v-)tFbWZk*x?RqHpAEE_>Ic%#>&Fdbbaa%*eu@V_f*%BY!%rcLo=8x);MYb*)L|GbuD74= z4uONC~fBG7yw?crKJUO;ox9&>6#Wu zoWa3>$xlzG7Py%B{P`_}8ZiIlb|_rU%P1`I#S2XnlX6g7Tkmc`9`0z3j*xL1krNSV z{U?cUQd7fug+)NGfu3Gyc=$QcEGRC>OyRNe=D$ND|C6VBf*k3_%PHXTa6rN67xm0Nyoe^PBGIkWy4+VPwQ`FaQyAbaIjf zIeu@i6-4EGyAaT8{=q^3Y1ueAf$@J#(jpyjaI(lY`cJ{#9V~-6nB3Q|Nf|Co_=s`K_%q4(|8g3OoTjZES1|1PMyrOCJ0+1eFd>PB!`^ z3lR`drM-Q-l(UtQou5y7^XBB(*v=OX$(*}M;Cdj`IXv`YEe4BbVPWCxE9O#{k(das z#2uEbs}oG!aTQKKIPf6vXS#hG92~?{qk|kNL$4DPW1^y@bxJ^&YH86kFu>KWD}$sY zXgQ3?ZXl6~Uw50KCS`nZ5a&`7U;~mtwjcY1zvo4G z+zIp8a-dH2@r{|!+F(=}FCSDhfnzqtSpsG_2>cT^AY1{_D^ z<^6yY7>LX?Jt4)Xpr8N^3DG-29Tbw0g$0W?^2W`ZfVUE@KL8uD?`b0)AdmG;P`Pfj z5`N_K$_>8%{(!VXL%>+B5i%nkU0pJAa#tL$?)r*s!l4l?iGzbfjo;tZg^rj#c|t)+ z$Ob7EYV^w}$_uNNu- zMY=v|8u%K*xGh_06zKoL!c~yuiz5U+?f3;LFBBg>1gXu-#&*qQ>ExL>?HvIDk~ZTI z=c8RKcY(0@wKdxx?11=?LWZ_4_SHbkwzo@)D?v;^Nl0jBZ(mkYBI@u>pr(x!czDIN z-f2Dn6iy9u+(GS8u`9^`2z;9A`udc_MBkmIu(UL)mvQ(uHmh*R1kwO*hd=M{-X1K{ z6mTY*>ydPZjwr;E^ZFm}Sq&u76#RrsG0@RRDe|;( z72w>A%eX12v#hxInvfHq^O&7=e>~0m%1TXL-FaY1*yd4vBWjzG^hUTjgPU};%8-F2 zrldsps%=Hc$B+RsKz<@5D2US50Gsw!*u_Fc1xFx2S9j9pQ)V2E*Z}}DkGhDM*iAAr zkmxzc*;idtFkk~iLvYHqFw=`5m!PSU1=a_s_txebP9zbd0;D;Qt*zTOW)j>1oSVQm z!qF`RJwQppJuNMuU-ID~0zwg1T{!vyNf=qd40){o$!0w~GOWeJl=%9!gQMf+*(-uT z4WMw)_;8Oh2@nng=#SQi0B}OuD=#k(>Dw627?=c|GCh~yQ&rH-^>uY98^G7GlD}iQ ziiwGdFuxxbou?+*=;2V*%+?k=ZWU7V|9$AIoYn(#E7UGy+cOg7vTrMw-}*F&Fx zx%Uk-DaIDTUBAMMLH2Tf=FWEAB1wxgDpii5s@98?6VJ}pHV6~}oVYSeN}8&u433Sx zTybE!VnjH*;*!wE=B^BBWKJHZ8+$kfaiM?|(%t8uxaJ~<3Q9gosU&KSC-=qNc`G?{ zIrvfmDrda*b1g>%$x>QL(5$CQ{<5+d=Pr5ydhG%J{{Hvcn_~l+4;8!T=d z4ZVX2Tz*@|NLnUMhPOAQPZAdr`~yexXYbSGLY!6f_?zX z;`NAHudJ%l($*I9*<0(kClAiZ_zt~FKA+viYcoO(DrRY2gq}`4QyjWeS+e$@O}`@=^**L`2td7Q`bUFQ|3sjfhPONEOd2!WEKtQLY`CSClFa|wQioCHWA$jvk* zS=0m9#PwG$hSwDi4h$KTwJUF?4&20%C6GhOVW5avwH!z?ab!^pDAfI%;heWVlU$Ev zQIooDwv?J4<&Bx^hlxpYRZF&#;YZ`y*~ebdjc4W?^DQ5@=PD*^|0aujJnKp1eR*)n z2al_K>OVg&8&*28GBVb8bXZwg1zpd~%4+HD?HwQg@#V`^aSA%RhIC~g^TsVNFE174Q1$#zQDETJ{Q;rYko$Z* zJe&2{^tbNZDI(c!Wm@e^lNlNsidx7_O-nd-0cy|V+e z)-c+y4+{th2! zD#Yxp7Svk7CRtg12$VcK%m@z;kBTDm*n9Qr)%TK;nc3NPS^Yse2~XGUx%RrcI$BX@ zO+Qt2_3f?G^L}zUZrxN11&j$QbYD)0Z=<~H!_-h~!i>YoH?86Hq9P(68vSIdU!S`F z9jkcu>>2uIUNj#cUt>dqtD76i)8F|Ze(+S>CDP6wgt^Rtr#K|3yP?%zX0&$L+j zG=KRY&PEK5j-G7KtEj1U4-5=Mvp*~{W9Q%q2?}y}@#5;$t7&8D=n%@8sMAmO@mwL&(F^Ka*2zHT~q)cn~+B6)iHminCIcQw{Ni$ z_I`O0IbyndOzi zujuyCQX3U@^*h=hK71&(n+)UH+uNfTclYCB4PBd^jf{+(ou8MBv7hg_PDDiH6qk~6 zo^t*#`}603E}4i%Tz?|^EU`mLAJ_)&n!_1dTr_VS)OqrU$HDM0g@=03^` zt_f37c;sA%M@NORvokXdukn^@$rD|l$;dP|yu~vgYj$vS6t$m{l9H-}JsAErJ#^0W z@$Ry?+qSH_dVXnX%>Li1pxluWePQ7WW{u=;=8jHI7v(A_*x20U@lgLn{?a%$C1qoM zU5!{4jh;K&Ss(&8R8UYbHa4cEP0G*b@?lU`R&Hu;7PJ}h zi!F26Foro}W@eVXii0ENQ3dPzQ)WkxB8FM9wzE?ZD=aK@b8}m}_c+|H=IF{_Z4Fgb z&)t3n$AzxKZ{H{=DH(Ch92{VGUY;KBNuKVKqW`X~@$>KylacWY2>jjH@F#e}PN)<-l2lXHK{%xr9IB=N1PIsvQ*@LfPw<>v-j@{i|KNqi~d2(!QY^aus3M*w(Yb&-p*38DzQs1v%&n+xcaZr0C zWMniH6yC8qIy#8=!oo9G6(yysrCv{;-sXs42=Md6)YH?uf4~1pYuNp$Ya}Fpip`0x z(NR-Znbu!=@nWm5Pg4;d$u|*(iG+mYy^x5=%F+_cty`ZyecGK3m%N5qXf?>Tz1>l4 z-izZC5Edq{Kqe+G4(q$>!y_oDz;!$yYtpcl{`D(+7Y9HUtjo_G<#n<@YB$Z|=<51N zP7ce;%El%sB}Id{X>RUQeEbN2AC3=0!DDX2a^f2=_EvNdM69$4%}Y&99Z@7LE#2nH z#l;m>FG87-k)f-rn;S+WtDxXG(J!x{kip1H=;h@F$nu$x8S6S3nUp1v3^d1k3UYD< z)|=wur)?2TG(($S1kKIOYu#lwqosfU+B*H2m{9Nehl$!fILLVN99m(t%#P^l)e5h3 zi4zA_%OD0EQPHZx!n?38*?Oi}1{}a8V237o>Zh2fx+i`yF)^DCXmk^lOH-40UyZoH z_=lFJrt9hPJ?e{5jNvqp|I4kastRT7d+O|5T2mt-EOLBu5~q4c&V-04JSOJG;Yo8a zdDLqRJ2Vy+mcxb;vESFP)g!P+9v;ei zNv{H?o6PAy<(x6vzkPNSA96sWyY z{rB&9RUeA!=FMxQr0vYgMn*;o^78MKU^KeByFJ|9B~I3g9T$5@FiB`=3=IvRTU(F* z{=K-d5k6#+ot;h2Z9FzIl9Q3)`z#Ry1H;$Xce4z*+sKF(MQmeZ)8?uWMsqY5sR6L+ z^;;hg%R(Y1I(mL;s&8^~V_^XZ;hqmeP;f9U4NXW$2;7r#2S%Ol#ti{6v9*;ID(FAr zrtj9jxeUvBczC8}W~3!jd(ph)ocexT5AzL`xSSju92(ydWM*d0<X!8WJ#iNU zi=+TQKMOm%6g1dh_|>{cM9thV@gs_WOI7kg7`-S?~pb9C(M{EF;> zR6xp1-IVt9tWHQ6g_+UOi7qV_$QgY{Ky9kVV8J9HAwic%zO=H^a9>?kwh7qcs?RsL zf{)MldA54e%?mKs0*zK#dA!u0aWU=Up`oEyeH0ZH88$ej5=CC(cB{Y$2CckLOjI?# zWo>KwZl`j8-x;J1K<-T5CgI{sTwGizgV(oIukGsmyu9_i(Ibt9key1&%dYVaDC!EK z;oV>~0Cz=YrSr>|tnBRPg_Y+Aj3Ock6@x~s#aKdo;wu(T(ZI_cZbjFvkKZPr|y8EoheH|1GTtbJWW@SACd3iyz-@oU5`GSGu8ddEd@2x^{10;on zh9@UYq@+yG{vB;^ZzG6;LhE>yi-x*-Sa^7FaIj1%aO`|%Y;PPNwlN_Q(eJ^*z~JBl z!-}FGKWGt6L&LHD{>Nr!W)>EQ3*FSWyxiSIn3yi-@Yzj>f%d)PTi@AT>g5IwPa;^z?Mf)pLL&wFH5yczC13!{801p+xEB<>krA z6Hs*wWOjD8wDe-5fg^#i5pUoHXhe`4OG_4qZNGj+6&DwO`^F>2iy%A#0=5AU}0d|5pU2e6oxp^wnkOXHg6UIa(sLYtbrh)6|%Cjz~o+NuDVQ>*eRxLjTAyWyw#Nz*kZ7{7zp6>ufahK zuvnB?Y*Sr-_#{x^kuRd657no$fsdV zl#Y*&!}Fb)5?A(sN6^BEsYZl1NfIzR|d|_xt6SA zq*g72IEt)^O|Nh{=h5^*mJ4D1<5>ULFauosg;61UK?dJ7o(%!6&B|#q{ppg0#=w&A z&B0Tj%v^bj?D*AZaERQ*(k)3@^I1=L9uxfsuu6Zn2GY1MnDokzI+f63W3AD8lO~r1 z}w}*wWu(1JGyUezL*|+tpsRH(d2^bz8hR20w zibzmWR$iHD4hCCBKtKS}89jZlG09x};&VpEWykrpwg4z}Zf-904Pv@Fl!t!>?1WFf zDFroku~v8pcvw+U(L)ali-43AdZezmSCXHt&`?&6k8lH14wBv0)|QKf1@s8RK~(XxZjl!=ezmod=}s;#jTNMbl&2M3T8^dyT@w+p-PE`ff8U_j+H zw!5e2SZ61@hzM1$kbMCI$u?dV7g_ z)#nx$L0Qpo{d`ZaSK}$nW~8Nct!7A7!uCzZ_wR#^jZAm%-hc2Q%0UH%O8fFfNlEDo zAlCQqI?~cJTeGd3F`qxP=pDk80}%d(8(LUETB6jJk&`nrHdbvrF7gqV%cQ0n-G1$` zneai=K&HyHmO2XcCLjPL{hP2bLRIaTFJA&++`W6ZWYF2kNmWC`&c-G>Cgz=+15Ahu z$UC>4tkhIf5VR0@!OUPF9{Xz*@JHaF_DJUG87j~H<)7Jr1n;-I1t*CyUu?}Z1LVu} zF0Zcx)gPT~)TSgPc)+9-)Skr~Rz^qbSXfx->BU7v^n-v_wPs3`UL`_L^&m?FWL*9N z4wj(}!Z|rPQ&jYMT;)G3*u&RUM%&66hXqND3F_k5dvL^-kR)ua0ny~KM=x)tD)k+r13vfH23(pvP% zK$87u>gqigzM{inX}IJv(S><% zSc>x!2X)lHV62|L&>IF&({lCmjtJ0odA*#xqGA9j!+Kxr@v$+`;#2u#NL_pTmzo-5 z1A`Mlm4Ktety$GO+Pb>V^BvLl12p91*?Df1V5EgG_{InN-UG7`wq=zW^Y97nl%9rq9pKJC&F4h{?iC4|CaoN94`J18pRB%*r~1Ph9b zNhfG2C{igPi3A-b(c`=SJt;Afg-nPUJcgaE?G*%=DovOzZavoI_2a=ym?(xlod*x- z#NA6g4s7=w_qMiP0M?bSgGG?m!+4t=0%_57rk|gziVEI8g4V6MN=UloWM%7c>!uVE z+d>($Gc#{fkz7I&6B7ZVn3$OUc#$EK^2W8is`Q#NhAWzsav(e_Pm+^#KBfOP4N{yvY9Yg_VONH!TfR>P-fQ z)SR3k+53I~;Jk6FAf!M{f-fT5hEc0~D_>ryYhq&e0LENt_8E+xp^sV=%rOC&$<*wfLM*mk(SX_QX`Y@5iwXgq@ z#zxd!OU{4t1{@9D+)B3n>z5NVA#C{AuhC{i$F8Z2{V`K$*T%4la)+^@Dip8URtSq+ z{p%ghh|*HNI|TZ4Via5Qu(P}nVq9*foDC3=)4oZS-DlMyq53{;XM6j>g9ir*&RrGs41$)VAniOWgplus#ed^o%yv){!4RNIU)lq|eIC1Wga#5C*EhV|i(5 zb8D-@VIJ4;2-Kmxd`ojPs0Xl69`<42f3XDrq)5EN_2&gS2*CoROE985Y{1BkAVNUd z1B-tC{8{QgSP?K*ON~VU^q!uc_*X85+rHawf9(&1n-vumAcVlSm)!felo1Z1W1%-C zye1)JRx5tg| zK%Q4tiX6(*j1<9PQg}E_FB}Iro;BNRYyV__m>(4#4YEr|SJ%O89wvnR#*O{mT|ns6 ztunAIz+k{hYI>xZ-V8V}HBiu&7J2x9r`;(Gjy)eK^6kZJ3#d6Dq_D6s&>znys^g*` z@$nV6wY8aeok9+=2L~;@f`ZJG;`UQ@nel0D129Ql)U4r}Y@$!m@ zimtA%0te#J;v=Sz6h=ignewz17DJu@q5v#B0YRvb&!rMeVK_{oprC;Cer4q%cKk4p zhl7(^L64+DSecUphcCf8uMh+R?04BxlT?9$fgtU`p53@{BjAy)t^f~@{cH%?sSBGZL)R} zLJy5swRj*Ap)=qMCSM)U>dSn|$)Td5QB_g#jR)!T42{MoBpe7U1tkP>26V6>4-aBq z4cl#RPrUE~fCK6VO<1zc#=-(#JuWKBulj+pam|-6f&TujZEY-ke56mkx3;#xL=Z{- zz0{=jY*BCrK#!rn3#pd zMM0OphEnGLC4Z@eEPLUSh+yis0v(&BZ$E>H!o?MFT)@B30Gl1!-h#ZgIQwe+PZ;{F zLfHefH&ZXy?n&uSwTG&iW4unF`16TDxyWo%r?53-Icezjqo+?cMXSUdmW2QfXcEgY zsG}!E{>NDu3gyL@$c~K6$k}V%6{DE+I)9~{0UW5LsQA8?LE}n34&An^>?~PP7VM3t z_Wom^snu0>Zf*@q0hz9)Vb|va@-&G2Ahu8=8{jE*Fq0=fP&>7INFuQSaahvuTp!(jtdE?_F zZE5+%-yfUoH7I3zdin=3#l<^twseb&i*T~vN7lu~g`2wo_OyJ*ccQ@er%GF6XXonD z(#Pm%EbgsSkvox~KCVvYqZE~tPzu^@iePEe%xr94K`040rV8hKVEP+;F@u7FAYgzP z0DfWD&6Qd;h=_;)Zw`yDd3`FPA1Qw_lB-$)V*h8h#^~rMR0RT%vGMVwm{5Fj@>p=( zke|TmrB(^xw3VeLtlR!aH4x$*S2u>@H4D#TJZvWt*k#FYg>r+@%i2Wx*K0rGlgX3CwG2l5Qc`YMt2 z2q%DC*oX4pyUxQUmJn}!sH}8%aS;^R+ufe;gvfnyZcb{^#nBNY^&cNBJlnByjGd_9 zU=;`@L6Iu=f&YK;^l2u*ADq0@7~v!K&d#rocL5mI8vThZ&)>cyc-EUtOGftK(W66; z$=A2wCh@>kzMn;@WOfn}{=^s7}n5VqD!^xSK znu=tj!M*+X@gwE+F)LEn)dl8O)7bb7^06h7JCVYWLv1_1kB^T}OJjs)0EwW_h)X~) zUTQN66$qo3oS2*pPX^4E|Jq~To7~;g1M_XpL$UUol@X-cCm80WMF5-si~4P%`b#-c z#NalyH8s84>3?IDksG_=T2RNC{qK3lQFd>Qr2g7-$tRIQSP4Z83V`>~o+#hNd4p+m zsAZLy07Gm~nsEuCRDT$$plQaoK`WNAV4@FRwoYV>qJcp*j=*(DLVUzrdE8xHp*JAA zgG8;!&EP7=L(GeS;RUXqwu*|%XV!$f*PBBv{rSBwx3)Zq6qvEN2pT3EE`o-N*vQXE z#Z0T?MK8#*o9G+QPEXELF?|@IS*I0NAR68bZ!Gcw`~TI;fLYO`;U75zoUaYWj#V5o zn_5||Ox62FNq#!!#yavMWYE&mnu--@KX;V6a&!whmJF<=18o4b3Ngc>$(#E;;KdiZ zC0D5;1 zj|{uKpAG%}5&v3mdEEtMYFY{JZ`<77o(Vf1o`vUzFF|*lKWMGLg74ET`1nj2Y;uyA z+jb{+t(g1n=j?3elk?KWix)8J`r%cJS10=(2Y(?v1T8SLag~XTjO^m96C}bMx4{K|SFA%Id14gTrvG>3&&iS=mD)qtl5W9&_Y{XL*Or)bOomReghl zd+>gP=fSv3l#v-P1S`<(V9HM(>f+b;^uY1tyKMqC8qi921qHLk#apqO-r|wt;^DPt u@1JFh5DFYBbglmP6_NkGEaGbYkKTrMn|%G8?<>5sf+)$U%jQd)`usnCGjDDH diff --git a/radio/src/fonts/480x272/font_xxlsize.png b/radio/src/fonts/480x272/font_xxlsize.png index 4de2330ff0f195a6de8822854df4ef3c5b131d80..cd38d5e6d40918886329bf63a8bd1df75a9e01d7 100644 GIT binary patch literal 82882 zcmb5Wby$^aw>~OJgMyTFN+U|Abayw>-H0?25(UmGq+1cBL_okZ z=K8*K&bRkI*R_9V{jrv^CUd^?ea17!UC;YmQ(fT(4h7D&Yu9clDavYJyGHp1{w#}y z3jZb$@eaL)a_yRutdy=_){hVNlEk8a{yu0qj(>k>Ek3(5HP+|{IRAPZ4jWtB8x(xo zL+QNhCNwlO3NL9~XR7J{KBWI2pAltASkU?W|IddLV2K;mJB(eN9noV?R~Yg7AKENl zNd0s59So6?kzrwBzCRbynW}4R-#^|-efbjqrTYK)-0r{hBy%YLr{9+V%eDE@R(xS$ zVTA10cdkcANB!Tj#e z!TxU}uSM;hoRrm?=5JTB21T057s=XSc)Y)S0id_xP^li6|s0RC&wGz z%?A|jCMy2e-IaK9(U)k3-qX|b@Zm!`ObR}SgjcVM)y_2Dh;j4rp{3B0la~gQ%mjyq zx7TFUKDi9g{B`5T4fwp?r})XtYN%%xmX-&n2iEWK9z415>j+1W2@w?$p?MI%$HKzG z!NI}ITx8np6|=)@H{^G;dBd9M)~#FX#)^gG)S^C`Mdr0O*tR`e!>UmM*AM$FaKhnG8^+VZ4(h%-RJNoSv3{t>j@){yFrrydhjR9W}(?~1x1rO{;f zIU_wi{lbsIkL6V9^MQNVTX_-IQ*Q&~ep z10NsX+;upNhohZ~%x zoZyP#=BFgvo=0$@$9ewm6>h~qPoE1LRIg08RJ&05CCvjuLPEOdI@;RI>RE;@KCZsL zzv05ydS4!GvT&@guMcGkzI}3eUR6~UM=AKQ!AZ~4llxAvs;a7_WN2n)W@F=TD0aBS z&za>eiK(dqj^hO)kH0rHH(&nxV*dBy=%pzaCKK1)y9?EpPuttu%gdc%)k*I?%*xIl zDQ^6y2W^u=x$8JJmX7Di#lo$gLj3-@)Y#C#RD67N^yk;kZM8>dXJ^zR-gLLEEG<2M zeb<{pprfNB*wob2G_u7%SJdX*5FUJWkEOu0-r<(*fKi-~I|zKJ0YFO~pd(PrD>cmw$d6kUsfy;yPtgmZ{R!)zwhL z^Jr6b;5&5oTiU}J{INV6osqZ=o|64lW-YAQyJ_6kSnaPL1fIYfcnx$s#e9W8IQ&$S zlInmKjLrPw#S8hDG_SL=R246v{5pSHL2H@&Lnk2QD%SIKnU?L-{yvHoE_eO9Sl3qc z^;{F;+qXF|P2Jqw{QdpQd=*}h8MGLsgq|+jS8drPNnLmTYiDbH z9cwpdxX!W*W0c6p!{hYgj90=9YZ3b%JA0W?9dlpUEk^lj2j`W}$Os4f=$q7jPtpyl zOtH%<>gtXf-Is(Ks(ROcx3;#9j%p5+!Dk+vJY9{?%F3dbi6SVob8-^#TAweVg{h(8iQIqc*8+y9Bcj}*F35+c`P^SAIZEERvPfwq~bx8*nqp&8h z3dB>3+S%F3SLMJQSe(@AI9ThYrl!W8g38Iq3%VtK?mAb$vSg_~R++=Cy(0U+O+9H@ zDv2jq)&8G8eq7#P=|VhT`Vgq_utV7T6W*I(J5?VapAP}Qu&yvMFv3snK$AlxG=u__3AbmnW8#W@}r&UyRPgl z@WSV^(p>&~^UVW%2pn(1=Qa!PAHUdr*cLR~*%@x?0(&Wix*6(BXRnH!+X_wUJOKrI zME-p36pW2R*@eA@7B<@-pW-Nc$4FZ`J3F1G$`bFg)12nYL^s_p8z|PuhEHdsu73CK z$-!!5>W2GbYkI8*Uf0FtB`yw5J!f{yKZTwQ%`N=R{(671zlS8(D?zt;vh^-lnOXj= z)zv)KW*BtqEijW}S{j_cOplMk;AG7lU{XnColwo-d!8l9o&q~jPi3bpOUSdcyF0?g zp)Y}c;EM~42gIU!I!|QEyYlMl1hFAqD<>z4TelJshyq1ZP0i5{fxglifxq`0e@2xc zX9ae62+WEde1cf4#iS#=5!#y(ZU_4-G8=={Ry{bK3s8paKZoBu$dqfbdRFzSBS#SM z&$EQnQ@?>4k|@g*c0K9O6(<*`2VHY>8Hd=J>FFJM)w6Q@>Zjv{DpEJ=UB9NLtnm@c zDk$g}li#qCd@;)l`W5^-4mSA1thFCoz$bauFo{_NemceAsz>&KPG4SA;3et)lmuU^|Y~qNU*TCSKw-uiM|PKAHZjx?nij#WZM9a+ftjW zwY7}EEeZ-_UEO-yLDGTG>bRtw7K11}M_VH-Cc4!@XI^_h*d4!AQ5Qazk?Ddt;cVmw zD^Xc_*Y@nq8|XM!lZzqhv^mS}6~lBA{&pMyX{-E#f&$n`h#M6tDO2$B zNFPnw?S&S>4Wd-#!gUP^Uuf2Up=)m#Ns&cORhkHLaKy@)*rdB}@cxC_8XHCD{cSvQ z9P|41>l=x>^SN)=eha!U>Qs8!Q}eZYP`_mdpkvh{W^`r6IEd&jgLJ&g#ePp#l_c6FmF;3yeD+Ydn9H3e?S)^ z44XXHFdWENdtz^6KR-G=l-w#A$(At3`pu6~Z&YH|;Q)PMpF8aS92lV_{y+sGAR}GADXlLs?0G%v7 zi#H;1Zx4O`+^^62+dm^SGg~6$4N1$}habE=J?S$`^vX$_Guaarr>o2cW6YQU%{}t= zE->;e)qU@OWamSzxd9EDnVH$9g)AzLN;pZhMfoPJxT+&{SM_UAUng^MMYT5Ao`5C3 zv<1=7Ky7kHK$|GjE7#U<_gwn~cu4FtAvIOM%2ZgHR$4};dFH6};_{u#Y*NsduU}0( z8-ZC=q=`QMPHg)}W7f*h*!W?yS0qV`4UKq^qCU|ze=7@%j{_Qp9WA~;S<&sk$q0K- zIX1b8$%O-Ea9uvX-c4%d(C;7h7avo)vB~%6o5Pf6F)#z&(i!YK;qDUbe{nAX6QxuJ9FchnX3OVX`T@ySuxyv-9CE7-TUQ&zOl7iLslT zn+Kjw>w0>7SLjz#oCQo2smT>4ma)O54MU)=V;bkc~T?w%f{?OV5R_m;9)T3UL~U#pDyPckd5qO77K)d)Qu%V6D0IDRc7 zm62WYNfHOHQUynfo+d{5i+^5jt*xWePk-LmrzqkNa0R}%alM07(-nZl&Q9sh9zZ%k zMvPP}YtN3h+~=DTt9kXAlRpIiNlmDI_#wb|ZyvyVjKHR@<5Jt@#^9^|Kq~mLT$6T{ zX)}jGRj5F;voiE^zz8ynT))nLIZF#pjgET!T>Jo(&#I@2uqU~~w3%l`qEPj8*i8G&QiqR;h?1d; zX}P6O5dXV83sqjh_J1Dq0RR!KDmO3hT1PaSPLYkBUD8`Yr%49@rpE6Q5UjtMKK1rW z1fT2vnua0x_s>rWX`Z{^#tR4A|6V!U+R8PlyKw`th5155Oxzt~#&d&Gpf&i-e;E?+9d6hIubSgb3b8 zzI^!-q=MBYAdD<%5`r!>ITwN^O985UV~>eZNMEb0HU0shS|WoHY3`3!vSFH6hF0OE`A7#klS z9~pUBn>Af&QumVzv)*Yc=IYnSkCFr3@3oE4ZL0_VVR~4RadDraP=Fz#DKRE03b@TT zd8|n5bH-B&atR1b_w`{V70Jbt!T_?lY=i&e?llsAKsG*qMdR z7Q

AeYdY|NPqc6NW_tCsjcuU7})Mem;P)D%&%%m-w3df~iR$C{>y^Ck1@~<>NM& zsfUNhaz`|Pq3%zglHLaT`GvlVbshm&K=L=C-v-7QECojV8c+HUP!o2)yv<%s)nx~H zgwuo+2H@)IYF}owp68=Su`ge`PnO&=k!L$NJbVud6M*|WaSaW>U~b9C$QacJej8_+ z`U`V(Z>ENkmzS4~?HhcG$1T3+vbC@sK~^BWyhWu>sc}Gesu06178E)ojdxdg1nY1` za+|cMs0gN<{>2}l6u=i@r*z-vWMQ%Ii6K!Y83vROuq6I&KEv~>e60JhtXP9k(J(Fh zz5p!-BG}O`ao!7`11L?gZL!8$K`+;}>Q*b!o6Jm=QalF>3yNxt zP$FO8Lc_yR+r*|)q4>+Mz6=bo!!+dJ*Z~O$riIgJ4$7UkVPPG>fvKpeg-;TRC0>*4>SYld`P6xR3*eRGBGjH(Xj#)2(je=^{cBQtRh9H+G0UAU2gCepo6`w?LvD< z$d8#CXpad$kR0+zQ?hDoDu+8h=Z2K^)TdAK4lfCa;U7-(HZd`=ERRd*)KXGXNI|8W z2tP&sgCACT;11+FXEUa*=m3V4gKmaNy^J(P!?7+G5HGQ!qX{( z&cM>eMU{Z(ji5Wtj{H(vunJ8ydkH8K5)vlpfazU8fi7gZdGjXFGs`cgj*g|W3|b95 zAy+}t835BYpC|y!g+bb1B@x~QbAu4=FU*ZEv~;AmT0w9`k)Uc#Oi5{gOJ`QgfP0&f zmIk8Mub)eQp?;@l^KWP)y4qgC`|c@tv-=&;|4C!?wP z95j`bo;wY=FSSjTXg#g11znA#FW5>eYbh@AG{G|%<(;j38|83=is67lIrNtO@BqJ?Mx~z<}-A+y4S&qJIwP zn}&kI3D6(#lZ_3y5_aVW3S&u0Njz5FSRiCWdleLHgmQzO9Y%PYgygPi(5uo4(odl%*jw%q*LjGR%mYOkvbk@<) zfre>nX68@umK>(bnOsACy^WdFOTu*3&8;m3pB&in?IC}s+b&+xO28CJ8l>g6ia3en zAXrDix%$NZ{P}Zw1KO_Y;6En^n_Vyf`)`twlLMlQbDrQyclq>!9L-S?9X6!OE3S<` zH)sL?ld(x*@TtyV4O~a61P>a)-=P%`vRKfEn*aa@{-hkjPLaxq= zVTMmnPeb#Bmjh6KFLWG*++_a^oS{AuIz@Kj`1p84$TaZ(&5aH0-5jpOj0_xY312TS zsHe5g60-l7?9u^R&*hiO0f|?HeTqdII8mR*%+yrM) zkWA3uNL+as(!}cea zA3uHs2`(O#9}oa9MDbD43FSJYZcu_Aya0*{fG=8FT0ucU6_r6G5YtftS^|B?-p%bH zum>>9fGyU-Mg@MA&25b#)uX-63DpkV11jbf!sLu;~gJyZ(r=P%2WD7~hg2sBmW>A%N*e)O-0DrzUOpTTZ@1vG2{-K~i_FyS3 zjcg;ahbMh#YD&+auoh4m>_#d33#4W9UomEQ2tX#|1}8a|4d{HRsHjaxcQ`p+{+#SO zB@2s)0L<~)!a&Vk0wvqL*=qw_6~Jq-+F<+m!ZN^*Kw0@dUAY5$ViEu4e}GxD;-;ok z7-s+{0e-1NfrAz$FAvxagk7LfNOp6y`T1#hxYJ|_eSI-pnN$bB|NOi>I&2?+{2)s& zUa*PIxA=}MEoFNgfa7ViD~2Y`3drKe))vdFLA`qvWMo;wkBUI75)-P1JFvg+(J2=g z_y_JHl#rA86A-Wf-OD!3z^ul-%|!-{%e-wFU(*njl(mhGl+;xDrZ$h2PFRS8wXUs^ z?48L{9ZgNiCK_t$2Y&k&PlEj5mGHHJ7#_fPelEMZxk*Y)%m)Pq$meM7S{_~}a-w;^ zkK6daiM%`>?M?OO;6FYfJjKMsNMg@5x`zPOP#$AKV-kvo1?3bFIDvZu4dh*QH4IWa z2L}g3!?cEmhS5bZR3q+p_x6GsE_mZ{&c#e}J*KlGo7iI4DT$%#d!6pp__ot*N~|L|PhkB>)xyn4G--^fPs+);E@2 zQMb5KISlrIqJYd|YI2Wp%{Sr+V{$*J8=!?NH0|x|{8{d}&i8)uuD8fsQE!eU11i1H zdul#At+8a&rZTqxq&DyS>Yn*<-ea1+p&{L0OaI`sW0b>tm|gc1ita_g*Sdv+eeV|#j~y{5vdl=i*7EM3{lV(YX;^*jIFVmK zAU-xWU#Aans*9_u)CL}S5OUFVwYAVJuGi|pO-)K7)W@qdZ-2<1Qbzg^1&U13;qz7QI;o{;BY-PWC zrNDItyZq$jWc?V{R9ILzq8o%){HY!0($aC<;qPf*!EI8f5iU@884xPfcSIzBsl2Gst=PN&vx zpK1FOGo$#-%&+OZ_J@auJUl#CXIr!z8vR2c<`WDRq zBVSF?!pbTy?iO`ow*CNe|07-b+~OnFM6RFIgIAOu6z)1jD_%m8;&$#oxgyL zEeA-4{J321=FS>c;zzAUQX zU@!U}4-cVD-{j;mY!}YCPXCKVARxW{{n$1f_wQFXHKj?_z=&YTl5q$4{J8fgXcq*L z_r|#RkrvoN&f7I#bXa$WtVqTb;ZX^B9Ip2x9iuF#Ue60~cS+cF z0sP4WffDiFz7K%vjhQV*_H~p9&262bE$|>Ba$|tk!>x!o*$I&hlU)cXrQ7cQ^9ctA z0Z2z9P}i97EkG3lc=c3!IGwk5cD7l+(iqsw&-vz~7!r=t<77-SG$c%<00|A|q!@HF zfW?G2n-Uc7sAce_^Er-}>J+ERDG>;%uxBB5-s9onAqG!bHBw=RUBuqLCsac8KX)-7 zMqVddqN1v9lm8KO@f(=D>W;Xz`i2s^LY`D1;KRbWker&Yv5p?Sd4;bSnH)M?>H$<# zT0f7&)5C*cTH{Jj2+A2Wo07TBw9HIsMUD0K#7R5AXaG0r>si;-)qSmZB%+R0j3oL; zG<>iOBNfI}&Px|nRlLhQAhC8fHnK+XvJ95K#3#RY43xvf(CNO3ocGz(K6{2W&`C`N z$b-8 zc)UD3@1IXzGc9)kwx)rDdo@%WG{rXN~^X8y0kZGEy1F_>-J`edSAZ!=g}GM@pTQkH{CVH^J}yO<0Dp5+Q|J@+*CLPe zSYy#{vuCX{mV&{iq9~I(XX~M=?B=!?j*iQ!;mEx9gd}%qb*%*USwE(p6eonw$(yz5zJf_Csl&@ZI3I>TJ1qd5^Zo@>fD2n74U7S7qO^pTgcq zOG|@M3&8{^;R&E>LqmA^Up^HT6jbXm5@fV}f{UDO3kCr7G&ndIc5X#wCFH<%cXt6v zK#J%H#ARw2YydY^vq{m($;rVOq7m_SfQ<>=iMahHupsCS+}59{guNnq%o(H&PJiuu z0bInQmN5x$0AxAkp84YF=;+*>am}#B$50f&ngLfA!fS^>r3@;KK^zK!=}ksSX#gPz zz}m>AnaA!*gVqun)eRl<#nxYh!~4erGcz-bi*0bL7Z(@74})?#L8cSFX1;p!rVZ{b zOf$IA^Icu}pwI$ggkv*r8Bkoe~t{`BJEI8{_dkPEMp44!;W0wC;z1#|mKf>*(0_7D0>w(qq7Mzb3P2 z)C)IYYunmwrCk2`*`A<)Vl?dmZiu2hm$)`4ni%QM^G)1$7)|hZ0iExwzmjDT4m{!X zy*U~-{L<=RwP%hpL(IR{SOzH4km(IPJey_03)|tLAsc-is@@H+GZ0n*y)MFAL2CxI zl%A2nZafAX*?Vu^9}+e&1I7;}1?+BQl$JVz_7AZd(Bq0UvY!AUXl)g9oxi4KY#abf z1~Cio-MJ|M4P)KuX=y?tA_4yXk9X%D1OAwMsX;D=2H#FWp%?f9G+&s_4)7&G4YO?A z319Q`@i_rC6I5YPv?|EnvqxQRg zw2Aroj3um{w}ZeaCTM||W@PAVo0D1CSh2ti>i`cCaz%faYCMQ9;*J_Qri0 z7OtthLh_70s>DM(${9=!$!~zF29~9?lG4(!YV%5Qw!qTqi{vz_jks&jumX!h_d!ck zRFqp)k5!623(Z?4@(8STz^8Q4dPuHaU3K`jb2eWAU-=QJ7CD?q56FE7B%DcOS@x`d zh$<@`n#5!0LItR8N%I-dIUJ4W0E0;t!dQ%5V2q)C5MX0zDdjlW*|`dE^MwjXchN5^ zJ`WA`tx%YS?WBuS_1f|nfqj7$8R+jHmKvY%3lkJm*z9G6lozs5Bp2tu%3=K@j3c6= zwB=3V#o(3pOAs`uI7i@MC!OuDT=!R62Ta9Aw6(DT!|+8y6Er-Ep0EusVMVf6H{nM% z0*M((NvpfNYFwiW3zslV2Z~p|e^*wAEkYfqFL!k`A_4nm-3yARO0^C=m;oH*rs1nZ zrrv5dek^`yseKO9U80Z$q^?lT-T?4)LAdR2zPPvm&_V17(F-+l3m1?$+}yZIY|>RB z3L`&k>)_xAHi29Q$h8BZ1uRkmZk`H@rY)nePev{OH0`> z-DooeRb^jTG%jYtyCCOMgz2EdiQ{Rx6&mdeti5Yo^PTD)2E`wDxRysOk=adYW%1Oimc{qyO+5s0W$a+nBBJi&L8!`VEI|dm(L^Y)bh88tCUKy!DI zBO}enE^$Wtrp7(tXsO@AL#7_qrFCjhf_{POMwRn?*)9C zo`cw7jRO$uzMB^^EuX8jx21Q$E60$H{Q%)p zV%x-J>BvV=IuTyrSW7F)%oKtM%=f_m8w`EK&WB~ds15=0(~uWH*fZ)_+1Y_h!)J%t z=R5*qaCy&?%+AF{4Ai(!##zQ?9*gfE$8rjDf}iLzBdLhgfd(Ff67<9+G8)oLvaIu8 zzhs2%;c4?mkJv=f z)D+w&wdU!p7tf#f=SV%J5%bH5>w#|olkep)qn_9l^hwY@osHD6Y}D-a__SA4)zyo1 z*fJd6c0%86vgs%6qcv#M6|&`-t+DP!y8OkefNtT_o!hgw;BBB;Uw{3vsC#ZM0B`|t zw()T)X_nKU?SDba!w?>kB7vz3klBes0IuuanI8%|XsRF_xJ;oJSX5a6v^Gv1(Z~8U zGU5)pA!pgn8&IEMxbi(thNgpYld8|+$|UnUB^g=0+d=>&QRaSFk&Fb`x{m5b9sy*y zj(IbJBcyb7eVs4x#Kn#t5;scN`0QDLS`w0*h(oP7taMf&=2euc4|e|UI0X)k4{i2T9N5P8wcn+ihUiYZA7Z1=?Jzl zy-%Sw+uGt6z*3SCbkI+mP6EdAFr;uTGK7K7~fy*9n!1SRjZI;&w_@HS@`?t zXyTYH%t9qnhdCMKnM7PqU*FsP*freT+&LLHsf08geqMzn;IN=jYp)FT_lK$46B1l( zTfET|a$k6l?oV;=VQbD1dZM2IBsyEzaZ5e^(KvG@ef5Os!&V{qdY|JFSkXB=FwY07 z{zBjqW7h;18{1Of&e%93JDav(Ef>;}RVIz`3*Yyzf8h-liU&96RqZ}}<0K-ek&MHa z+dDghGbrMWT{xh>$r$+o(-h|3K8uKs?y7ud&*lWUoQ-#}EjTla><(4wSkWwyKXB%a!8W*O-W@{RgnJfZ2d>-@Ar4mB{GM{r-A(^A1N1( z1AqgsRI@D^gjT?BQ`;+{$Rx3YfgWhrpk5i)gs+_f;*{j205B5jkP;p`G_tq&!GzMF zd0QGLV(cN&kIl^!P{;pX{dwv2Qh6}-uF(aNhk+%Hm*SYaw*t=*Xej)WT;lBgaZ?#Pi=? zL_Bb0h+;O7q>XUmYD$Yl;fBbkX57iorID(;9VmAtQ@M6+?s?qQ0vDyRopHbOm4T;~e0=Qfqjsb-3*sL*nhhlNjg7z-{6X*O z%T5Bl%kd{hc8HNUCTiLK(cMkV2l4N)O&UO|1MzN*%@sns85rwYbXq!oWQN!#&gx5o zSmBc*TwL+PU*7q8aNZPA`?XaHXsb`ROQEbbT5B{IuZx) zvYkbwc4V?$s5sQLHs@oA!yvu^qfjMh8Gm@B-T~?fHWRRgEaU_*thPWob62x>tuo~@ zhs@d~)-zNMjS-}CYZ3_?5ypdViDsCKx{6UDD4hgzN*OO8p4X9gQeR&W?03S5UFze| zkPBS2sRIEq3CUE25s{TKBgrsGh}?c@boGvjpv=IuuJZ9NgN_26RI5t8=%p+J2v|u) zy#*YstgLA~wlVSx*C;6|U2pcwKFbE55`+OVGBSsA_VYh~AWM{3lmft}Lj?o~5s&3- z9Q=9nwgm<7Bk1*RSRfGE!4(+Cn}K>ZQJ_R*chh@&H0)|AvGO|@{_bDj#m$}>L)$o4W!UM1LYfL-k?~AUe_lglsZ! zTBOP8HONH;QCI-%_l3f;enpSM5g?2ZT=d)b9^UCCbX;9tu7(KYsiF3M@J;ES*D4U0 zQ>bB^X>`vnnkJEzm6eRqyOAixcjZt<&Sg}KrrQZ(*EZtX^B9-8dL@3QjZF_GK(3$= z7Mwi;fe?dDnIVxNUgFzq9m|~$MekVvv+v6kgCSFq@i1CfDCF`S-I3k=LqOr!Q`C-B zoGs{sk{el~zVRdm4beOmWy_$rN(cT90izjJq@WX9%bP)`*~`}Q!-i2L(Uk|#X_@p` z2yBOe#NQRi@NYYsc)JA09^wq!Kk`5T;(cS1IJf~Kb|L39$jtD{AJeE_O{j%lXjxEt z5T;ExMZA4`&$imLGXk4Im^e(_bmVwtc{d+{yAPJBX z=7!Ay0psF|1%Osf)rwKjt}6!S-amG>lUGqz?&B5B=_{@l?QMFq8j=5KCto*LxQ??A zEw%cQ&+$q?L5@9pmaVJai{+=cI;cNJn#{1BekX2ty!CgBF1f$V;BA!}f4OdHr@mNp z^!-?4Lvn>@YPUms+=OFsZD*-%ut|EfcStxi9^&l^PzzBr+@KLN)PmD`OgrC@T9G3M zH@8-P(%Fl)L!y&{=VTeCQb7c*%@)3-7}8o=w@S8<0UlL*wJhLENS! z;e78zs7ZAgo{$XJlB&~p$(-IU^#~`Bu}@m?m&6Lve^+1cJ>TSM!vWSwTU*;dDP;fO zd(^Qv_jP7rD#}!p$g!s&^Vflbeox~3DY00WkN%C-tDS&UfaJ?y@BQeJ&Tw5hAsN}} z)(Gvno=ljm+J{wd3nstH<|j+t`p(LhYUjFeG_0Ti%`J};EzWZ4+Uv0}%NaP}#yY@| zTgD+pV{o5{5W;u{cO!!Gbfu(FEK5t|!{?!_Fs3q?wM&mdVRE_wQPp=K%^b(NPFIlg zN^#raQ3||}>e0v&$}OdbG#YfWv3^mA7=2J;IbgTd!sKnjgzX2x*$frgrzS)E-R=ziU#Ya7L&cLRJJVlT;2PGP6m zEpG-Pa{Z4&G%)@;E*WsvteUjqbcGSsKThv7F^Ex4DW9y3H z1(MyEH~Tis-4|Us;GB&&-!R4!fuN5dWE>9y9UL8%6!QH+#q(C?g|ygzYY ze=i#|yjJR=-PwQxsh>LqwPaEL0RhsR=5i&S5Onc&t&qGTEpy24d~P`dCNTeDOb_-U zII9qOOi`zng7~^aS!}o5Q(!}_5C@H$*YrBtRLj_+4lB_u9S3&>Jp>C7mqI+%SYI5d zMSwjW+=1UsC-l2?{1(O{^Sz0WADy;0RsIT^FDNn6F?uQQEbST@q22AP8Ia=;>dh{tYU|Kj*xBh2nLEl(u7V?CtD| z+$0$2TBd#avRbW07W*ow!kXLtQCbo?tr1&%Mib`Z(SYNUEu() z*D9Pq2or;(#CTs7U7{s=&Z!27FAYKBWzTHboM7W`2Z;_y;y9qQeO9A`!zd7fNr;)~ zota5H*h~dT1jl5?YQ`Zt*ias`GT$D8JY(Z@!^p&>x2K2u9qjg3&}2&+tQ;IlzICX8 zJ%$pDiUmh3HFO%`bIMN~Eb+RabzN-?-d4lK^n@de${dhyMrPOsasD~4h=>A zeyYu$XGJy*A9mMlqY5`{%@3~cqK|+Hq&(|jOz~mQT@NZ?Bn^3zV9s{#9fS4*m;FY} zDA2?PT9B+!OK9k|MTSN`nM9uS7h-p%*?y}=gC+|uJ=jF3)XnUZ!`x4bgrv5Q&smwg z?NZUxKN9*3$1{t)AU;+FU}^o|1e4KH(GdwuKOd3mT6@ebjv>_OO3#QHZxq8HsdWvS zsS8r6p<0|mE)V><>%V$0dq1nU?!9Rn1`5CChm@3*!WX_^6_hNLD29$~b4XZfh&;>f zC+Wsa_&J=1G~~NO2ii_fLoG<>(t(%}(0D$|2 zp}j5kJ}<%Y-+wpVGA9t85eoI7y8!TZZ$^6yyngy3bB0&8%ny^kCe|B$~| zH%1hjU)CVwf%*MplB0L_AhmpA%RsjOeTw7I+-P@PzS(rKScBH?UOTFtaXk(WE-p0B zxl$b#k@C3oe)j$iuTj!~xc%efg3`QT=$;tT3pPjxAThBcX8;j&aXL0RN$jQtz!+>{ zCvycRJY6C1O9A0Co-=z(NAl9scfduf5FrhXrNO@^yP1Id1vW8mP((xs{dxiN;l_9W zPY4Kv0OKd%K<2hvcOiQRhp$00fh-=jC8jQr$A+NK(B+G#?J+PtOFFf%J^^0Up&y3# z9?-nU3kS(g-?pWvBS&P<{ss3zsRwj`l)I1MosL^P!0#ng*AoIy7jy1r8QewW5u$nF zoLhV$#NZcZaJA}ygsp1-o4Kd~r#Ls4{(?w8v=aLeR&U)li4-)l9`;58m~pfDrVC>$ZZtyo?64^>)%qAgj$O@YxO! zD`M;G>mz7`oA^Eg9iN=j6XzS4W!#Vn1lNT=)(s{LMhppv|4yZuIiVyZ!+@G4eH@hw zwOxyLW(rG6Sn23O$45ZK#@?llXCzT4gjtBaWcI=`?d8i6P-u}!G_b)S-*zCth7oR0 zG7P`d*9C{yi-yp@Y-=bghEmFbFdo6x`DiCX5^>90EAj|sK zA(DnZ8=irb%QR*jeXtqPT$$0!!UG_h^4PsA(H|oFMdcXB1ETQeQWEf{v8eoAiTh*7lm_>K~wsWbse9WNGDNehA8%-yCoc> z`mquUX`_M*Jqk!u!YM1Mu$(Ceu=FOil_GYy(2yqsT-N&%6WV!-ex*m!`IRgH2SM}z zv(WKOb5m04e@?`Lc+><*G`x6Iy+QaJD=i#-;OCz!uV8}a44NGyOOBXS!Y18spcYX6 zIzi0v>;kA&DH@#GM=u)L)Rm7df)Rubyo1te7T7}e3Pd#WIOoNkMn(Tk&B)d9eG_sM zp5YL|2@Z#nk`g$5pt6FndEZ8#+FB;%A-04iDHdluqiiAWN4LhT%E(&Io3#;fR#FxR z{js?V`nX?Y3gE0s;TEJMU?2~Uj6g~R_Gp=_=u^EL{}#HX_L&U`XuBs&t9fu`l3|(k zkgQq}B1vW)c|@TP3&7#=@?69-@hIzrCm2u8pOUQk@D^G*d)Kz#Uy za$&OP9wOC*tpjC%bSzn4Px9aV&YG*CR3(JJ%U zo2|oqQ(jOIp>3QNUm*jB&|kl%7QV+pt<(8ajFVIK56>+;aAd{LG$6?Qz^@7@3s3OD z-w-%3$@jpCj-K9fD2*FT^nCZo^osF%$BFv4IpOVB=PH%W5Q(Xq!NtFM(@xV?86IUZ zl`)|h`3Pif7d@g0Q)JJV%72AP6pdpK)lEN*oI_(aW6u&22t;0T-@Aw3CLG2LL7t*N zuVl7S*Ha!2LEZ|*=Iu>O3pioA3-8YHbFukR^nGklcl}-2^$L|q8g9aQ9EZB*XDtLT z;Mp&iSaJY@Vh=>ob&6D1+RwF1b@5Q0()x6Tz@_f4k^}w#;N0OX0x5>M(ilVJYpyDO zE}imLnTHjb4;-<#W2Td~MyuCdfx|P<9owucR1?4qb|y-slQCy|(Q-mGp?T>9d+>*G zamYNEFTNB=RAb>#m@YtdT8b7H7C>^4d&hJtj)}513{AZ4dR9ljQn`L*I59*%DWwDY zNZlHA&|!%qW;*Yy?g|D2qsVE6KupfiDx4OtnSttS>Vdx7A(;9W&LQ!vfig;WL8d^P4KB7f>;q|^Lcfqg& z^xvlrp>VHY)BDs&@!Cvl1)^SbeH#BdT$D?Fr?YO@47T95CWncM$*8a%_`xW`-!?W1 zeL8O<5%+s6+4UO zhg`}z_DoNw4u6xPgRrzD&kg9w#(RTtv9Z^8ZJie0^K-PMAwof$dnpY^V57zfg3Sc< zl9H1lYCnRJBA61-vlV+uRduRX$%OK&_Q*{@;b;=Dy(y|Tkn+W2~%v*f!#%>a? zZ*D@uE6I6lc{%6X^LNJ5yu`xbzjT^G7G;1dM*itM&`?Zt^vZ`HC|2qJiuRsnt=`EO z+{s6Lv`>x9_(G#KwRa&1Mv#cY>8;dER+?w15%>zfUzN!Ngj#Bs zCu!kHMNeaPZMtQnf)iounZV>njEmOtj~qhvBuWw5ioq@#AO-1}GQbCT@dL}e=K~ru z$v49Vn=k&*z1x%?G$M;@3jEEr;iLpXbM778@s)oaYF;mc!(I|#emMNJ@PHYlt^JP? zJv}fG^UDBtOR&`+&bbY+kivP$#3!g(AZwvvVt$>QgYl^c=b0H8!XIO+Q}x2hJ4K`0 zK97Tl_h)Cmn;WXK=nB=;602){d<1spX>lke<~E(*KLUx+h3*NAAOwd!2=v&zr(Vrj zVs|?3t1={BfT=wr zT;%kQ30#%?oF6+rdi2Qa90*e9c|t`6=fJb~g@sJit~ZDk3$Tl?b96X={`!Zx%oz5F z5q}`G1MIbFDARXv#BN+4=p~%f`DV!WFTML~F5530Y)5weijsg=6`lRd4yCXq2ytec zAF}U7?l1S*YES zyh`NRzRG*HWY17wyn*dg`1iK#vvfFoTJ5zN8V*8E0{xVGYIC!2v!JxY$KDs@T}|3x z{pEf00J3h)kyVyf3C2(nB`lVyP<7yMH>olW3D$d^zXtF^%RQtKb@d%{bLa3`b7GdD z+=d^>a6on%Z>uzKL##2BJ?q8SBS=O~@a2BMVTrPYKw$B=v=gFr@N%pK=Sr5dL#}ey zB#M{ry?7UY0&&Hr>L-wR?4S*YK--+zY(*?5hXXt|Vm5X84^>2*XcsO2Q%9B4qdUKC zB*)3fqJX*Jx;X>4BQPPmK`qmFJMM6sjj9&{AhQ03jf73ZjFt*qC?I0=h5rD*SLRUK zs;5lyN)jIIb*O1YLpl+Ppe8HvSQP?~+FP>U(pvRNQyf`e?t;1HdDX^w@nJtYDb$cGi7{vFkf=>z5z zKP;Su%%qOWLBB`sKo=?Qgj0y}UW{}p${Mdlda81fk3hMM01?an3qkxE6kCqz^)F4H z)~CifkdTA8?M+GnPB=aT9RO$?C`khR{OGTHGPAOfX$yGr*+2@%pYwAJbac2GaPM7! z9ak8{n4PA7(@Dt81jy_S?F^J4h#G1IYGsnZmPiYK?MpW$Olf*&T0m_fY0m$y}#X&h z^{oHD*!#Y(;Wu4O=dBMN2^;k-rd?3Vg|6D?7Cg55+C-eWB-tqH$rh9LU8@B!l;sjER?#pLAVwZN1>!ho!pst2L@%LB8o z|CN3xlzt8V|5y4$oEq8QWP3+S@-PHtZ3&yQhF}B*3_9#S4Ci<%UkwiSLp!OZM!>v~ zGSt@-L?b9-43Ho2C|UppyOhQhlr@4hA#ll`UQ~S;8?!Sx$OA86ZGnNW zpnf>;>iRV~nGK%n{X}1>p0&&->TP630hD3Ka<6jvzVgt|}6I=rM z_>2}PLfWAR>|}dwh(M5i1o=mKYcHrYkhU;~oCNQyy*=8#4fq8iN{L8$?cjR*M9ZyP zw?1Z#j*bGcMIFnerrYxBtE-2=;gEa^W9{J{8U>d>ZUyfE(`Onib=h&Hqd$_jenLBH9F)FBf?SAy=QRVrWfpYQvg%53(9NE#KW0bo1s#! zguD$3PH}N@XfJ7-c3^q4x~#vwkDo_u(|%fiH&nnd}^yI-ULf<>@6Q zJ^=wAQ4Otfwdt3(c!_L+tpdmsnFFAk`fD$|-Y_z{W8DC&i~@-5ys`DS z{%PRNtwZ1sTta3H@CzVF#n<-(iaqA&JnfLe+FG8>aL^T*h5p)UAfj!4y~TP47okxO zy3eujaD}4^k&83YC)cy}d^`Rbs+5!mry%y6cyk=fDB2dhlz7YLzJDK+!=`==&shMo zE&Qmr0fjZL0E@!Z3z`zp3K$Q>dIlK5!ge1BoQqC*T&i4ZaTg{Y{S{Tw1gFV6`P9n}1K}p+n&DR$xzS%&!F& zjqf6TPF7A1Fo7gIxUQ#U`3My<)HZT_r{76OG1yhUgbsUJJdc%Oo(GP4geBphT|ul^ zI1%50-5xItog9J-1buk+2qL%&G&PXHSBRusvxXo60j)uh0F^M+9bdD4=meXz{fm}E zzA&#g>o8NzY{+D~r$rl;oUT~Niw42QBd?^y5%v>E8LEEio?-lTq&q!<8a?vn1hiMYS}Y_sfNm3-=+p2;z)qp+A-L|3EMmECMwxy^D2brg`s6< zHg)G4=3l;SRk7}oJVdePmX`5lfTh5GX~~XuXyQRPKt3WKXEupxA}B>StQ>HXkxoL- zF4CPCz`Eb3Px~R2jf@EdvhonT@c`u^LqjqIU^dJd#-Zz-YiTerLEUv~amEu)G<*-Q z8Ur_@42Nd2|MTp`ouuaE==yex&n*DreA%=W-BJY)D@tV?T|c2S;Fh%TeUoi~YK+~8 z(8nA(a{c21DjD4HjCEnJ5WW|BR*Fqn_yX#b#!-9i#oTF#%!p*9r);ezGB6|Wz23T8 zKiv~=)6&jC7{xJTqxBSJ?~X$yOcE_e-Q$!JywY61D{<(_Eg*A7bAs> zpe^tNwkTwCMc5N8|*l@5W>V{@XC3GRU*s-Q_B1E z?zuZJ>n)1Q9G>o-#K!}Xwk}9E!e-6Mscc_9`t6$`f+1j-QCB_RG^M;Qt+q^Lsp`ZM zY50B2tO^$+kQK-_%?uvxg*X?Ywc>s{K0_i(=GcM~VP#!_d~nQ& zsx8;D$2|Ks0(Q^g=aS;g%na5dl@lAH*hJx~jcD47pJH%VTUFGv4#%c;FRkb6ZntUr z$mh17`nSej+`Kw7Z&t5kuMZ?dkaz|yO$)DgEf&!5;(Vi|2VD;~zDi3+nCw}UW&C6? zfjlRZbN>TLifwbaWDu$Q#|Yni#G5TO92~M5szUshH4!J@n%D;Bcy{2)O+Hk5QE-rb zjj@0(k@VEn2n$W zf0{CM-AiO268hfCln8X=(I&YdZRe2-*7S`T=gPQdU~zzXqg@l$db9Lqd@*Q$B=JVd z#i%d@S zv*{S#-Go3HSe*myLl{6W&ahS$qYureFxPxLd;0YA4mWL-+<*(OftwRyAgE|Lx7Dg= zAg2JfVE&Lu`Fq56){cppIsKXTv6)f&<)_iPT&Kswk>?<($dtFO z422{5aut{15O?T05oP)BeoPbJiFMIz>pt!SkXTYVyhPqZ)W9QU&zZlWa%&=`;y_QQ zpR53<)TO?o8v*R31-VMvRUFxtTvhc6Q#xW`><=MQ?hxuofL_O&H*W%-`S!iv0yGth zYnz*82QgL8g!U`V!9KJR=_NfH#igZNO-(Bfyu}8yy6MWKaX3u8CINe*p^TReV{{@R z?jaX~WLMWUI(v8TegpcKT*S?cmL1yS{)L~$WcwL*qKjFlQ%2|I7w5UXTX()kF{2i; zNqaHFH$^K7E4KBwvRZxL9e=m<`+rK|s8)ZCY_2+%uPA1;RIC#-F9^F`;gdlyqGqZ+ z+pkyNJtaYm7rx)1LsLL>5&gE12Ou%q!|0+hfkw^QUj9%(CwV10OkkkerO4+D<`hai zlD2ylqs5gGwIIE@6}~dp8?IYPS9=}X7yI?{Smwy^c1kxK{mXjdIalkfFh{5O_d9=A zlpBtIzWd>-qNXPQ-0Ipu&ghK;(fDkDSYcpr&>OnB;Q0n z#@d)%d@Q=MYfakUL-pPI>t8T}Mwn6h#6H3-N@H-5nwV=%Grg;5m50sJ;ka{@dGpt49Qh>hKaUqipHv z@kRIprRVYh-%0x_Dk;gxLeNvHvW%pSxJ)8xS{{{`M|ue0+*E<@dtdr>C3=4rQ{ z&dX;gLU-~o*Bn&g&h9$6Ue5%;ZsP@$uc|Mw2&y~A2DxGowqhFIW=2LaG88mR`)^8G zix~AlX#HLKwBgMDboz}lhnovGh6Tuu|(t%D@!(=(*ll4f5=X-RG1rR>xnUvrTq_72ay~8(!^0?^A)OmV+gq1E2r0YLBgL z-N6xEvjK*p&D-QIFLb$ITr0KK_@oKbv^N9(5bW4dnLX%_&4f*x@1=t_A?h5~&wwmH z0(I8%nQ2wK4kTrkj|Zm6(%0>^;cq0;1siYsYf?^r8Q$2;jUB4Ef7Z#`*;yMlzi@Wa zVSQchxcA31($nex#zE;pDSdQSLXYKYJ7gxLL;m<{1Gs5=n283s#{d^b{|?4%+l3#z zglfuytsEG2)TNWq;koA!tstzD3?kpEDj4#9{&!JZpRQHNE%!iW%xod)IVdnza)4hZ zUC)HMUBtc}?U3ApeSd7@E;zC8`@uue`Ig8iG_FI^O4~CT+ZpJ9%r@}8IS%9MIn)$| z4ciNG*3$~>@YY}IJ?5rT|`49FbWuZ*F5 z{8bElU3yxeNCsJNE95HA6mtr06{uv!Q4N4r|C(DJeK$nXcWKdtE8Ww8S6{Z%5Tm{C zk7T2mFIc=Mo}MCdTBrs5$q>(Ba!rA!_1!VZPD$sAb!*xcKMRzlT{&yp9=^{-tReeu z`vYCyhp)^iXC1U3w^xd^v968Li%RkEEORAIelKl*bnh8Oc52T><^z{MtZ8!#z07NT z^GuJ}{ho=rX=9f_Rh}CRAe(0B^3T*Z#9>IG(gY= zuC5$iD0+$t3Q1{c2YZW8Lu-NUmwnAC0I(OK5(jJn^#82< zar?E$Tqjib^Q)$_ee?T04<5V?-k`H?Z|AmE_iC{jb|!XocYlS>2i#BGZyqR@5rJ?c zWqc7|!I+%dUBslmyMG!DF}8XDi_Y4KNfk~adnNQJx((Ly8Rn}9e8V8^2fA0G4WJ!B z2a)4R9?bF10Z>WGo_VL)b!mrq$j5%gu0x7shzdU7Z+rcVu@DkoBnsx{T-Y5f-&IgWf=RuZ#nME}|2fF;Ha)-W8uexdpE0;oFhNo2TLSMcb3gpkwxA z10cW}N}vH+kJBG{Q%ez#QjMg>%qH@--yS{J4Bb`ptu(9^7{6x3V0eH(P9kixj!p!? z>bMl@({jWXBbDy)W6pyD_tZc)gaGdJTjI$xoC-{d z|4DEvI0QTeKH(P+9>`&moL%0?P@s52qpys2iC1(h**fq2Iy#riI8SF}Zchn$uTn*| zBALX1e?~0_q)Z@*ppfxq=0A8*TWEwiXJi+)&eTu+4_gbR3u$4`{UM*Z8G;=7xi7RjW z8*-M9`mOSwJ6(lA>J0STW(-nEG}m*_2V6gGj;RQ4|7JUf?;O}0$dbxnBcaIlXQFr2 zxO&+ae|!=9C1YZrL>FNv6QS4(7a~q_*k6U`0Xuq3DLVsc;R)iSYHU4kc+ zW6-eCZlVCo?AZ^!;E4mOa+ylG)6>%cKpA|Z{Wcn489+3p+Pgfs_EGVm0#K-L1$?#K zA=40N`@0T+CRGJ!8N>7>K>76w3Tzp|eDX1^W;}>jhcKlc@C3quScVi^z|2fJLT-ob zbLj{;@g}CDUAd^e;t8G*k|+w z)S+)kgxXf>Uw7*73JQVsn;a-t^f#CY-vqo)O{JFmU}~QtOk(N&Up9my8;FKiE;%KGX4WF0gCc#SdDbeBQB_eQm;*R6fVwo4S z0Md#lR52*}#sT=H_Rj7t=EVmUZ$_f5=!zsf=;$!Y{EZA-vuz*P?$r{Jy&wD8!+xS9 zi&tEXkBcK~9YuA;*VbHH#SilwS@#*V*CnE^h;6|esYlteXS=887~U_D8%Z9g(Z1Uk zj-c|c8X6>7DeP$hEDME4&xQ$%rJ2&2OB9xl*HA9sbje*@Ttp#=`UYLj8F$Wc+YWtMGOY z*vzf`Ic}Cc^T&y}MSw(KjvGYMmTr8eMC+|vppDpX9EUWfvy#^VGJ8gj6P_YMe0&VL z`8;zEdw0iw2W-K`k=R^(7x}#>>pD@w(F==~zkxs`U51~^6JSbkiut~0msjboGhcTu zx^)S{@d>W8AYzCVlv2j|N6(%~L4)QeCY|63OkKt4iuk7^>Rk2Lud_&q#(Rn^cW$)8 zoIVT-?3fqi9XLjT|2*owf@}`I46c6|9_AAsLx8AAfI_m^*Hr({`~*f2%tTNs1ea`679kQ6H}}?7j+u{ zYpqctXFUijsGD+2C6jrKr4mkA*F2gEtXYt}$RTg$!FzHCySpzTr9Z&V)S01-9o>_f zz=w+8Qv1uY8-C}z;-J!C6qRfM@?=|qTdgSAM7e6uYKVm^;yDug%Ado1TqfJ zbUL13((DXMN=)1a!i3~P;#iGt8++;dj~^_J`>=sL18(5!gsVKy(TEU10&o%_?O9RH zQV^C}-z%AA)Sed@vo;Rl%OE$A-A;pIy(vzY_x%76AW9RdNP~^wO5{zQpbw<@Gm)Rh z+`6?z;z0ll+#}5WVP>)!NW)k`a)|q233u8!p2dPz2dv(hG|b*0;-k}7c_>bL58_m)OPtdjQv2f7dH1 zL4bv%u}kUcHh3hF)l%j95H$XtJ$s%i$9+Mk73hYrLuc}Ei~DLFi-bV*c;*|-14ToP zfx=UcU<(O*^xH(V`PhS4DX`%rowQk_?%hd+?xbe~R`>S9W(yYq3L1YU(i!IC*~Z=$ zVIm8BFB;>33F-uqJ`#f{pWv_+$+E@YzwLG>I-TG54(d_$+3m)FdR7mqR;>a`7xnrK zf!Oy`Jb?JoBsK)Bx@HPg2f`)t(SLl2#JfunAlusuc>hdSf=v+LGxY~GG0_@Xk%$J0 z{u*=Ji`LAa;0gYUdc}agQvqZ}lNP6<9<07%VT7RY{g@0&O6=<|eP!HJLMDfIDF|96 z?J!4Z7@ZEijHagD(9QFYyb+xfBhVN&ZQD5$9hH*8>3yvm+GYC}hFR!hqFP+)n>Jn6 z^j&TFX$`s-S7&7r=#=s;i%wz*t0g#Y9L8_F*dqKo1mWm&7a?$Oi#w(8YvI#{%a$2q z+StTK@O=`pWq@|b^+4MJ6AH!w&QUfFjvPR`*pZuiB#D0$v~G@;Kf)7nhA04a`0Lj< zm_iVpQaiUxK~)v)a~XWHYtz9mV`H8^K8UtJZ3Ph3h>sUGieG5b^TzixF{>N^R0PzZ z+`Xj^oe08zq^{%leE%#Th49dqD)J-X5dRe*iKhcmIuG7f;R(m9J^ixg6*|Od;V*M^ zEjgvT!oAzg%2#zOD<~@JAO;DPEuycTZxeyEYXbub)C`#O37`yk-JLodaKFUrdSO(Z zV98D#Lc=Es2-^i<8OCaGJM!{n7}b&KrlzaAM#jle1aP*^GsyG^*R<~>cu?4 zv1%1|n+!GiU_2GGSR-3cxx4EZ5Dmi!Dm`670t6*@Bwu92Dj z5jff6GWsi?*Z5S{PAQXD?!mJ;Sru;;JH}5?2MtQ!O}Ed!JaJ9z%?ID^U0j;KfgLXK z3iXN2>*W@@>AAO42uZj3HHD%`FfoJ8S!=Ar1_b)IcYK33H-yXfS^4=pt>_|BfIIfLB_>-_ckDEMQD7)lOF> zV;P{-dSnW-DoDt{AV0hgnR1vk)q=BDQ)^-&Hk;@y-)Cr<>1i~jC~XqI;8Ii^WU3;YRmy3Jb!5#kNLabFs* z?iq8G8~gy5E{RR<0_V+go#YBai{a?Rp)>JrIH3Oe1hN} zt^E5tIufF*c(A;%D)Ovo#8$dkThr-Gm7q?BNv07*ZesH+us#-UlfIwDScYhY1hj1R z_tU_Jq=WAvY0`>h19-`lMG$Pie+FHVVwhMiK_9Z&XY=tiHQh`W%~S~lB6C)(r!yS1 ze_R!!1)34f#loyKi0duI-j+KU<5ShREy~3e_UhyB@7u6Z< z(+Wq9BN=~LR)p&wqK19~_uA+18`TdDc{=ymet&-*Gze@%egQ-T7c{YQcO)yJ6hus# z=nBE9P~J{K?SbB6?t7yNO#(urs0*bfm(6gQt#ug~Emq2kE#I#~E{CTD{ucbnG%Z?p z060X7i@^6{D2Nbf6>q`~dg%J~-AI*~6riK;thD5My(LOYuKdXU@*e{x?5%zAo`Yy} zgO#NF#-?Ae3_{>E=4)&&n*jj5w4{WW1Ciw_6S5-Ac=VlGje_BtP^@>VwBMdi+PHBe z;vEf|%4am;MX%8@2dLbKQ1S4?0`R9C0z?JzpwFHdtXK%1Lk z)1k2RnfV7>Zr7ezXLVqlg`Q7BX5I{XAo^cbiuM`Oknb2f3g9m?OXq5smN0n0Xd6xh zlPT=Lv)7pqz)I;{NpUgR>V4FccQ6Zf{&K@%udXph@5R*T;kB^IC(aMz`zp#=gouU5 zjf>`9zE+a$>gLyOowdyWVuT>L1WbOB({SiZ?ddk5qeU#a4c3-fM9#(`XLjyb1_uZ% z?BZ`4Qp08Lc{hJ@WCzhzCPp&{L`7-AVHrwx3DivU=6gjD>TP+0JBi8g>6)8=$ZYNn zMxTG2Y5BTiW@v*<(V@2+(%zidX;CDWrgZGQv|hix4a&?!BXX5cx}=m8yGs&<`#VR!?@YwM6s@8W{)%#`3hGU1>3zsPA>}ng=3u$2 z#2BccLJkBC`EaPl+gSR)s1z(o#4q*u@nifEb$eW|ofl>@aXbu!Hq!-zD07$5AzojM zVq`gmP14lpZ<`*fso*%A#@gbbL{DcVSV<)M&jHgyQ*pSud)JFNZ3k^Z1O%TIQGbVp z(&%?QAS1E)&4edMb{yS-^!R`}7i9QLV0f}4Oe<__Jb;a9+s|c?s&}$F8mVC}U=<|p zu2>W5gxJvSvV1I*ot@7oF`&G^vZS3hP+`YvZ-tSYB>JF!clNGBaLF-37c}B`PW^@FG|?UziqxS&cP^z|45LNjH69$2ir&ID>ou6|6gnJh8l%dNJz@8PC+W4^bC!> zcV7DL*{?cBK8p-+M~g4m_QK=TrGlS<>mKxV=6zuZcx6?~NtRTK(k}g^l&hV_-(BSR zpskGpJo^h0E7)y08`sn!j+}n7r2oOq$lsgpi_>?p$gW?%DpOMRo+TY0Cw@iXSde8y z-568cf`26PkU2?y3w9FR@~Bvc061lZYo|}Mo0Zs$LETK^Vgiwv5+wc*Q=7#HE=gwWwmBWdS*!Br8;mGeQKp~7 zwEg7(&JXMVM#~haYqS#YnuFu@Mtnv6GSCc!EB4p8U6@m46zql=1ecDa`bo+%Ro;N< zG@-iAF{tWA24>Hk!7kX~LR!H~(C*WUEV9TkT;M)HlO_`p7ff=oCkkZNu2rmuq>4V1 zIkZ~Wb5da{^%&PZ$Rx=-n4$EcwAB9HRZY;V(;uuQYbrV1tCM?}1@G;aFz~dAx7&`7 z1ab)D^U?cQge5k49thbIaJR*NY{Ju;#_>!ulB0Qr@wB`~HOIh+Qk!v%Zb3V{P96@Q zMt$x3wP(@)W%Cqk%xJlwS5wfF!+T<$olIB4hVpKn*ieFpY{n)G1uAwb)Bcj_ypl|I{dh#NwUE8`LiqoUk1?&SwOdc!cK;5Cys#mw=kc@V^BPZLIB!H; z{zPdSz4XDfH-n#Sqrx`Kl^(v>IJe)7eqaL^8zsk`K9a}nP}@Ra>CZcM%*#($XL;K8 z?TWWEWQa0v=KOYnSJ28p%q@~5<@vS=rQBoUR=lX!4$VoYlH0D};-QU?jnCm*bzX}? zRqeaZ?mAm^;F$YHSd8L6MGICQ9;!I}&nb#LVVb zKh8ecT;i+~kIo*MQe(3Hds3%obR*R_7dE4~eK8}P? zAMuB6ZPJM75)`!Rae3`}*?JX&40Q_}BC09@9NueXo|X#EN4BXEv60kNU}FqEOlJ}m z4Igso9{Ftc(5>eLAIn!2WOu~YDbU5AMKfW0WO_)V-W5M8FOo-fR@It0=#Q&PRH+NNWE*>LJve;n7xbrPt}XJAj(>obo{~L@MU$qI{DCE-@&kR+-ea_O z_UTX$t?qTvo!OouM{r~+oPfh(=CI53&cE#K&8S=AUuQwOK=-`7#DZH!S($V0337@@ zD|cgvE(zL^1*W_+=K%moWxFnKg0sA4>$1cpsV`#t3EWAa%C;SX-8cr;Q(SGY^aq?) z{jj>@7z{b`z5vB+EDw#|r4L=RINc*7zkdDGw{NB949ZOpWHR=~#?R7sr$g;=Ou0MjCANQsDD6DMPDMPK@->VxyZ^ZlwREe3x6O z&>PsFRu%T)O_ox5SFc`07n)qpqLfRZ3&kK0K7B`DM~1WCM7~Uc8wKJVRn@t09R`*l(f48J;>e;kv0VDoq2JN>rQK{zL`Q1Ci=K} zq_r{0U9l-*S#ARj7&G@00%EH3%q?C0d+{7)Smf_fsZ{Khfttr3*d$t#-Skt}1Ru25 z{v|5FGa6CKEqu)R;URC#(f;26Aj;o-_0obaO02u z@7eflk{&AIsnrZWBpseVR^wEC{XRmHWh5r(vhemDS2&Wr+McRQ%FKQbob01ANbVNl zS>D{zzC@~gACov>apzQ-_Sx^0Ws_PLr?LC~d(m+)~NvZI)?DkVBD%mJCwvNSk`qpH9$0hPk7ONKvTEkKBMj~cB zbvby7Yd^`22|mLY`x3RXfUNYFZl!stpLEa$g31;;4qm?c63ms^$Q&urL1Y15yffyP zbPp@}*l=89bhOu2oTRF8x!nj;OdAK(aar%^L4+|Nxc}+Xr+8zL?hdL1JOh!JO4vB= zJ&cWII;GBa{O`&w8OvkGj)jGVVXlDl9MBSgZ9m}O)6+wU%0N92mKbJ?ykBDL@8uNAZhK{nj}T&-H$cBGWMT{wF(ji~FF%W=^zAhW4Gk7P~4B0Yk>?DqI`)G7--vJKf$&bRjz(fR!U!quH z<0*2Rr0iCZX@{vo|{2BwUydcJa|1^6u}m+&!Qh7?<-h$B5pk zrxj)&uPG4j_iUBxvAD z9?Q-Tf7^D}ckD8xa+THaq(tt`y>Oc;=#LCDF~yGkn_^w8|4p%El+=*uQtbu*NP+rn zpQT#uXj3xs%U8B>EES{nIsM-zr`=qf+5l&d|qP;l% zj0P%tBZ>AD%8X87X@&@MlAfWo^1&=Jlk>mYEvy6kAY|W#tv>$#?CGyOI^eAWF@#W4 z#cz0^cxAH9-$QJRVj%JB7@3Tl7>pMq%vk1aV2U(_Mga%?YVrT#L6eu0!*Ki9yAIDV z!L8{>5ErJvI$<#`keXIiQi3K$XcFvW03;~5GQ5Z2dJZ3!(D3er_zJ93I?ll(KxI)6h zcJFalnFfWxOs5h734te^r61>~m;K5^&HpTCZ% zbC`etYa)S5UD;$m!f^mEw!*6fT?`By8mo8Zb#Nf55x_H?lTwqrD(rQ!Cghkpz_tZ> zGD!E=2)G7mHiDXu!WTIH3jK(@r3tL2(i_jyCcW_Lc4@(R0h+n5gWeJ|Wi}K9u<;yA^(K)ojTvuUftk+B@)$?#PHl*mb4^&zX}Rpm72JP>vp-pQ6{@YYdXdk}Po< zj^K<9wyX1TyAp0(&bbAQfp}ofZHUSBA8t^*@1Ozv>p%}JdaH|o$=0nIml&2TE^S)X z&l|b$F)OsD7brAY4(Z^5Ey3rA?hCs$^9|)J^CEQjk7n*_`v=u}YA^~&ZcQ>r#yNR4 zH-ePU&1iwzeUz93?Q7eIDAULIpz)*?L=tz5JWIrLP_~KN&of#u=mCnqa6W;M+$bWh z(+}S$@M%}qf}PMwV^RXD-k>O}saX%mfz~7b33-r{==aNmG2~Mm+p|!mDVAN{tQh48UlSnt+BTB`{Ju;jWZETlj1MS%%Ae;vp^ zj_Yh+&shMe2w~na+_QW48~n_TS98wa-T3LzY&l46vlAKX@C;#6Ktk$W33ygBBk`aI zi^JKdq%clEH?uqO*Sy#(pL*sDC9x^?{buP;zhPHC_@;Gx#3#IMnFERoZ$Te$=&Cc{ ztHp_!iXUd+w4I=FG}ni+9H9s851|czhl{Bi0MwD(b zY3yqEU}X+^x+drknc^zVoC7#J>h*=umOaI8Z#V2p{pE3Ni;$4?a-z(F;7ZxQt}&kN zlM}2OXUAswPlN2|!pf?%mrc>+@!4s7{z%xu${7NCW#?A2>pX6B)*sGC z%xHeNk}mik{NtJ_9s}6vA%@343;7m=IY@@$Z*lLAuc;HY;{EkcNBP~O$>Iz;g&?hq zkH^>N!T0q-!C#n;!fkJPwrVR`KT;(1A)t|s^joeRb|I%KLo-zRAUQ$7MQIS){wukKaQ`s;nOpvZ z(;7f<-=p1VS!>pqJF}P!PVaJd9;|WOJTl^1p)3w7eQ*i>z5r(4U~yJ|11}L47ufGqM7A5?K;r1RYZFG|FJQO&HV8eO1@=BCHPG4V z2PP`@mK=oCFiI-~fr()&{8}&phyl;fCG8NIJnP>$SVZ0c0{AToANta5xGNS{&)_}8 z@<C!Fk1~@O-nMQ*QsJ8HY zcPd`==z|MW&tvD_GF@cn@7cEQ9R7gcaK2z)2*52=(4^!$x6yDYC!a&ZL1n4M1u2!q zuC?&W@yvSVxm8zep)OWmxFDQ=ndDqnTU(2aE$DS4J8A!=${J zMvo&|u^p>Uwf5nt!-7^^_b|326v8Ot6TWTyKKmYk?q4k%)vZ0s=JG3gT-)Tu1wq7% za!k9VM?!xZGcVQ>&IYCaehD>W9Jg1NkzoiM=;=`d3m7WyG0Z)d>=TW=%trAK6_y`7^I5{f~f1lWNv3GaVeJrkzAnK8xVJ!``OLp}!q9`U8)6})WSdlTB+1qD+%tAG;x=y9` z?ZH7{wx<K^G&_PT1IIikV)qf%Zk|3>b7G{BM?v%ysOVK>H! zVQD~V!$CkXEtUe45QX%rsz7v6jBqUZ=@Sk2)+MbUk=Qt+sX)5--9idpejC$-!#CVY zd^;yYt*v*+q^oJmUj&fTcao-L)MylDeVlaehxHG+#m~aiuYaaIQ)Rk2HS6rWe?}_V zzVK$OyZK`NyZ%cHHp5R;`r`W7RoXs$zJF((^#ozS?wESpZgukHYH|8+TQY#&q*zaV zr5UgN-+f~FzvMgruTKb_mVj~%@~j_@4a*mIHwQ|yaDuv+(#bwFG@H#(pRd8@;W-ozV%YSn%BdE zD-_cqFYI|8q!OBlh9DYQbJ&HRm2oH_0JjzB+=Jdt>7qloU%hIU#Oc zji7g1+d|7*NKhDtHZ@5QXU8yP0o_rmCoXeS-=jDVFOs*`FtE`xGRES&y!MGvv}?;p z+lq$fX6H*@sLTq=jfX!u>JB{;+lK0#JRXkkhK-2)!06u?BG@oo4Sm3{K$Vm}l7g1K zQ8`}hi(}n5bupn+rzvp2>XJD{9QiOkrQSJU92qB~Ok^V9rK$HK1ojR^MBWcDq?er> zW@R4Oo4d5|W-|U$=}0K6d}Ub0!GROwiI-yIY7w7SJzaPN;3!H`z`XsKx3@RgRqNqO zx27wlB}A@$y}Vg`baWdm{Uk>meVoS5AWTBprg? zxTir2Qy!)ygd~|1JuE>kwpa6ABFw<>%qBUAD(My1A;zNWhlRIBc7463k2x-X0pD8M z3bnu1pHDq)FJJy3{ERng2VQWXw>(_d31BE*g1BdmAVT)mTH9bg_8q0u96ea?yhj_- zI+8I8naUbl&TT>3Ne~E87lFMy#UE1Y1&DB7cLxKZP9c*Dd-H?m#x#Twr0*>?>RSzaQ|8J! zr}!b^=&YZzz{w@$x1fPYKgLfcJ&lN)_RrGpw~h(g?#JzGVQy)4^>h`{tLAt}`fset zP?X;5?>_{MAt9-H|6U{9WIlS4cKsPQ{S{KFzdvZ>sjv%rBS8g{{|+QJUPNscaUY7O{*@QjJx`gy+3p0XE!HDAkF?h_sSQ?<9 zk$&iiT!Ho?)|sMiX;Fs)eMd_{C}FV{BU{)X1QQ6~uRR5fdF6^ezJg`K--zh}SCDX2 zPEtYwVS00bFYj_c_J?5a=29pq}Vn!z|D{m#Cbr@CSQcDket6CK)@9lAnTYw({ zgH8FD@A zp0$9wR=nX^$8&;T?KmiUK!ljK0rFNZ@bpV+ywr1U@JkQSp(=#@S42WBVBkN*XH{np zW7ph3VuMv!p~A3tqDkWU4STGt@=-!R#t}cBH}jkt=8~;uClFy|?G?JM5T_v|Ul*O2 z!-GU$veUwX>4g^pVQKD|tYOe-4wUgk%Il<&IZBw$zn0I5cF5b24?#273Ejhu$6N zj~dsWczhC>v^P$T{AGmzNMrfg{OosDJ_qlM&kkmdN>dDO(sLk^hpX!_f(nehdZe30 z5+EH5{1Fzu|7G|m*0~;zYcDoC-rcz;CjTVwmB6K-^G#h6Th=JQ*J%Kw=Dt3nRkj`AV9aE ztJ$|#tU_+Tj~$gzO8w&Crgf8JVleF_D_sQJx9|M&!omCUKXf=Qd#dj%mpEs1%r29> zX(GUmIP7Ob>XuN|-Y~nf;Pc0y=#fGWj%CWq8AvDFa^ye#5jpehL5#}wpX%%aTlW+9 zJRq526ii3jzW<-bxLSq2wzg<0X~TxIwWiWqTA9%WXutQ4b1{MUy^d#ka9!I)Oi0M$ zt3uosv?WmggOS4cjzYHwu4T&pd1xWy0z!-L606U5c3cmEygH3jip~1SN^V|WqskFN z2DFfan@7W~c=6Uv)Lpw~(^(GX$%EIgbAylKl^kwPw%3+^lB;uW*?Y>YrtN5XuX-e3 zb-Spzc(r8-DQ%WC_2b7EH)^3whkY$Mx>P9_?^mgzssnnxc}w%tk&!JMHtfu{I4)?_ z`O<)8o=9dqhN}fxra<(Ie8a!d&-2QI^b(?`29! z*@&@$V!9EaUo_(rk5)q1L;W)4`s3P0X5u!8b3FgtW#Z~u?2pSSlz6+AAVXc<9E~=@ zgX|NN_5s9xvkd(do5p$v+%!-8%ub}KCnc$0Bqbg#!!0_q-)(=nktq}{a2)1|4sNDy zbaEIU7}O8=`&Z~n+Q1meY<3>&-9B!5jls6NHl{4x1)z0wbbfsvsz;APKaUkDagkuz zMt>+wNx@5c_WC3ZZZeUr{y!GGB7B`1s}W*F2hH!G@FS-A|9QlvbT_`J6jzQeVh~0P*(>Zy|9~sf*GXL z`!^sb(3>RlD49ckf`6~4XZpEwMHNoCC7`&+wNv;MZ0Hm7xKG;C??4YdKlVHt>tUQ9 z?Q(}aCa(JC2#^;a)n=tQ6B(B}Z}y0n?}6yf9JmD#lcvRbp$UBKI;l0lOShTzcRqc3 zX1@>gQ9R0cyeG1M!y?i6A;ReTZ9;aH`S{5b6$lD)CsCf@3!u4EH;elk$7>oGNbVlO z=yUGxSL~c{K_&Qlm$t)!(TMm2YXdpt;9IMrLs;9JHz?&oH59ia1y~mELDNed?Wexs zM@I8o_u&Tg&%;3txQ7TV;!y-jFa0CtCCfH>18A|10@Mn<0);HW1ZSwPT^rl`8mOD} znX;0SNuai!E!dDDY?^?>IYhjT-NmeFOYUsy#Fa3nRMSA2Qr=*N%85VjtA z1*gatrFP+Msj&YzI%*9_88sT+B<8(d=M5;Tr?@sP(iVY1WVQt7*%BHcY^ZBq*r;BJ zbqvICNtN2SeLMTqvSgjNynaIUD7t@~J4VPdi|Mg3`UpqEQ!9jnuQT~wQXiBUQGAe^ z8*{+9Q42rcq(efgeY6Q~II@okFtLD!l(08Q@I(YmUwH#wAM9dvSjq4upx7Yj84Vua znlI^+nG~MzEDReUg`QqikG1uciUZs3;}5KC@!EqA<@CM|@#pdZmtFQ<3ja+ghn^g2 zGM}N+IvunPG2fX(8od2`zm#0-#)9Q}#$W#NgCE5-qe6&wklr16C;a%|h2tvKZyb|^BKF3e@joj zo!}xc^SWbBv`OH|_ttRNP=N=w?MpnToAxN@KV^8fflHLKR0V=N<9*Dt0gDa)A-Jh3 zpHEtVz-Q^8eRvC9=LZdL-CDg5-Dd?ai@D7vKDbE#?f9MWSq8rMg>iO* zR;?=Wc9}`RiJU>RJ1PIO6(j_y2mOy$K%f7=S^>Nxbbx0 z`CP+SQ&Q~;N@P?N)?CVNDI{lZ@`=INl##+bEp(4rqk*Zx*Ek=SLuC7h`})pVZG~2G zJ8+cZZGmtnT3_;Ei4?TLHUlHBTKRq=d4*Fya;YIe6PAGq=5Bz7J=M|g8e_cC8Oz+o7%7u|*m@cyfh zb)f2hI}xJ4oo5{zAFqcyw(-s}9P$hizwpQ#NF2x$cq#N_+YuhdBPv=^(Roz~PCZPm zQ5S2Qng&8SERT~CZ%`BYd9I1U+qATGXjL0HC6wKZR+dS30m3vAM1+ZGC-*pq{SY9L1Az ztf(DVv>dIEKyBEyjU!);cGY_pc&)WGdbp$IcEvp!Aa5S*GOs8F%2sj3eF%o;PN9fr zhLL2}WgbLNh2sdxUS%f8F-3B(svZ66eqG$U7Ydss(|wOuoNZ85#QDbFwj3%e-R)o5 z{tF3ObG(*(r)AaEdA%Vm%huoDR9idx*F>uWR8s8a3^2DQDn;R4Y1kFDNv08{%^A1Emn9ZH1Bg(o|ef)qx=@f2Y6?s<#-IlD?7dGpguC5)36>xl5yhxa|RGg z-+v9>!sUdCdsQ%U1w^jw*Y@v~ZDwDu%r@I|_bv$?Av4`}#QAhZh2q40;Uqtj-y2qq z+5f}Yn}<^wuU)`~Z5}cgk&UfPO{P$4Z<$5rDUp&;3K>$7F;lV=p(yhdg(M_pC{u%( zG!l|%LP^uNo_f!@-uJq`>-*#DI_Lb+sqFnczu!HqweEGJLuGt7+;ZC{MJq?+wTBi9 zbUTpGGG&~Acc0;PK4!&=?Y}uKON9LFiB2AR>ZvYgOy!%4fR=A>Y4Cl+N@0C$AKmx( z@nPWGU{PcwYhLWEzqon7&O$#dH&J?e*BPiGM1FD@ zwj8ydK&1%m@5uAo$`LBtL_F`mdj4pC*p1TWjwjh++z@&;{0eUs6rHTwC40=!970L@ zCcYNzoW0g_N~1yTV8a3ttL@*dRH1e?l9v6Fez6q#`Dt|b$I6P(t3F@EE9R1LwRozg~|I`%wn)kJ|{cwp$yUZ9Z`uzL<9jl){ z__C!(X=XC`bM?4fd_mO0e~R_X|1H)jk65l;&u}J+b?HjF-P!V_5+K(wA4a=2uv!)o_dPg+3R+NU+LwX;cK<3bSKr53I~BKVs#y{fk@)cW4rdz=IHGyP)g zSJL*SuQ-pBHW5%_-MK>`VI$~G{9{&k2+w`PIgFn+3mY=C6@l-=2V;w?wMb4+9|raS zU%eK!8I6P#Qdn!&wiGmd;yI{6!u*%*%hR{XO zoxtI~f^pjCKUuSfdvfn%PBrCEma3<~cRfT$Fh$ozm*N>dfi!_UNnjnwL@T}n^9)!k zg*F`pXoNr+@F~DtTaJNKJ%g#+u&w%Jz!Ca&N6OJb)At1;%XP~6`1yglya16**3lNi z6oO-{B}iW74XSJWjG@NN;o)I|-rt2XFkAD$cB=HbhZoh}gOa-FWpMo1F=C)VAm5zj zrR_X+c3YO)tUhm=so@LQmELf%vEGS}0~`A5`1zwdg3WnGknzUNUsm0`DJ$9bYslr4CiZp~p87J*F@F1=JmLZ{ zd0-({m#S)OSNNr6aF$nKEHM1Au(0swcX6-p{i&t1K{%9_mZp1@AWQrt_;z6bD6Z~M zWRSCHUqw|_?o0{_!wVZ;+WDZ>2QYsAIy5TVd+xLj$Pai$#>BLNlc5F?-xA|w-kmWg z%tY4baX3+8o8F)|5GbyzfL%>c(8rOR?;$N7T{0LP987UF-5t#CNce?<`{~=U1*5)z z2sfBJg4=$B{{RjG9~+plqtNqf)eckv)HN<3sljz;o%{t&TXrvI2cBbL?ZrZ?r2h)>IGV1#S)gb}!jXn_>KR~*|O|MZ8151W#o7zScB&DvLB3>xE? zUMVo(a3{9QXlCz09K)eveSs?FH}Ll1o5lRwPjfTAh}ikFf|%H?s{~9bJ8q~Ce^yka zeCr^6hE}BF!zu$9R4}T#q^6~@iKfuT`QetT8X&V_gAXKV*|z~6M;;P_Jai6aI{Wgu zFJH)sFVUgUq{wV+F(^~Rl|e07E!+jWz~?&F-rf%NLBt0$_(Y>&&c03l{r#`I0@0oUs>gvOe>lxE-jBhFQ zg}Eqm{XO3;82(P#50r*Ja1GToq1}IR2O3w%vZvO`LN^et?zY8ye3JwK0sT=5`mlhWRfXQ7qDX<*)Dye*fS#zIAO9gt3+YIfGAG;TD zM)X0aFPwiV z4f=KF`T+EzUsBlIIF$0`vZ_r64{)qm1{TUe1VzEl{q>jtotqlVSw+v_S z%4u;=m(tx29QgLG?=3Ev*PCh7bD=o&IF3-De*|yRBzQIVJtNg(?cAQf$>!&#n&Xlp zR$x4?~810G@fNKt~zq)P)$t@5!sPT zkhV>?4M9}|1tsRqS3HZRr=+N21ZO}IhcA15%mwi+$0}gAO0chM2y;ET4N-57NeQET zc<9vZn^|?eFhql)Ux23jYQpb3aty~aUTF0LXNGf*UxeSB!6yWQkaTsa}?}z!aiWFlQ-a#pU0};ivzDJh{t=MSXx`Fx<6d; zB>?s9qO0jcpTIy+w^|eBxW6ApZYmOku(A^A{vtn*rumc&>O!)D%Ahc=y z^^nD=VfbZgY6@%*SoK4Y=FsJNSP+f+ltW`8m(_2A1uIy}8+#$oFWQmOi)Gk})iN8o ze|(upfbSbIMNWbBnUtF^K0qLVY}g%v;04U$U}^aUPZRS5i%UzTA$cUbQS>d>uqF+& zX9bQt?3*{=1{U!OqfcUcDd1bS@YHB0A4+#fLD2Fd!4uv}`o>b2%?8W(s zJB)&CsJJV}b(ly0(Bc8OVq|v)HKOBqBulWNTFk@f z5#hF3G|^4#JG{#Db<7SwH|w>ab5h>MrbNedqjW&x@Sr?;h4hd5K0H*(2R{%j8-kAI zgKu1(QFrbTOR{J|@@wS5SaBJ@B7BkyA#|pWDVOGEz_Lg7Rsd!(I(wXe;K)ZtmA>_i zwAR4i;kr^Bb{-qi;-nRVm*(YfZ@YuRQeww@=n^avuyv?v>K>9jCTLje4`Pijkds01o3vme3Fh3UNiq%2YBAvlGA{e>1mLWYCUmyqEy5wg{2;F`{urSo$vF|t zR|9w7tXvE^<3zq08|yDrTDR`<2G@w(F4GK#Hs3FzC(tgJUPEr)D zhE|WJTTp+t{7-Jq_Nne2R|-#&&yn=>2Fi8h!pe$?ArMqEQ)OGmZ~RY~&*%KrSgBvp zo5p8!H&)>HU6--%W$(Y)+YgOu3ON)~tujYi_PA#-{1LSO`Q+)lZbRA{BF3}JX8!)4 z0KYx4sKR%{&DaCoP0OS`J9@$lGZEtl`v1oGi%!2o_>7J=tvGioWJR9moyEA;&WSH* zsUtc^|LoI(TEozVE8-d(!~Gi%BkyYlT`rH!X);i9swLb_a7zwhZuQE+nl5(@J<6yH zjOXUu?P5kmW>1(GS8|!gL*9qW@dF7DM|lS45Y-#Rv+?gy zX@sEp01R!t^U4Nwb%Z+NQ-ZzX&=fj|V+fIA%B_Cm(`e#0Baq^NL3cq6Q{Xqiy!}8^ zgepR8yPn$!jB|yuH2P3bC(%ZCjXGDqc(9rl>cI&?wNtD*$@Hs~lT(BSXW*`3WaW zmJw~Hr#3LP>>7;Q#VxmX?LR>mdAxk^ewqmHczE7pN^V&tsz18_Mc$m5ZdUAGd-m+S zptzQQ>?dEe5h(_|XmbdCQT(aCKhITKAgM-~m3sqJU3Uq8rj&5Oi==qG{;)|zWOB&Lz>?H;?v;qx{a5JbOE2_qX zcTwxJz=4rNHZg|J+%BwJY3>8c_@6Qfbp@fnIAy)6h-&+=<;N)BcQZ_Zd4(@#q^9aM zvVXr#4D?p7(jg2&D6GY{Dvnn8;eaEV>#v^UJg{d^w))sR?iFfYDI;%7?lm~rSiQNIbN7K7~y3O2mjpt^f}zB`%$NN?{3y0l1_F<8=-f4?C#b1 zXXxdL2YQdHPc=AbMF`QFUg{~u#!IW4Tg*sD#Ivy6miu~k;cMgU?qDIV+_2qcvBSdV zl?lVQ$$A!4dZXt0ubJ9EUb(s7csfJ5{qS3~WCulM$nAW`Lp7DV2a$p3@33HK4-~Se z2>}^b)nxM5pEx3YgNnEz7>)O1yQJzFaZF$oq{6P6L+^02ARd65EsB{u>->!=66%Rl z;<=J)?Gf(gRJ};|rIcUcq%om^vconkuF%ZW`%(36;2+a{T9)&U?aKgXM{~oGGNH_Q zSyJ!%T$W$oOk}pc7pOj=q~ybQTUt?!y-?%kk&qOjL6t7cV;T2!wjC&<$*?3cT#s+6 zpzc~8Sh^5k&cFXelC^5_=kcLsg?v0>{yq^@N53s(fz|CVZTEAH{R-#TIiK*7HC%Oh z8UNx?j9TX)SK=B%!~)-g>H}U++pJ&nQb(2MUi&E(UD^=KW?MUGU43&< zm^56>P@Tx=?-YWGvK?P{?%w?Zb}$`TGDR^HuV3HmuyexBwYIjm_zVbXFzj=eZgD}) z3!OK8mFQ+flnDw(^)F41kGHz=lV~YvX-Sw;M6i0e9&UM;l=pKkXm|*Uy^mq*SDes` zK2MIt^+Bz%A3-sB))@eRORbO8Yz7e3b05yXL&(J}970pAJ6Dxv4;^QbtXud+zOE|xTZ$%6!Wk} z*1OaX`LCm^Mg$ql<)8@4%_aQBRx;mfYb(O{|8#9Pq(Qp<9P8>k&3e;Z2&Z17hW9_E zS%1H2zMHgSHXEy?$YiRZioKL{alUo0@18y6_fy(F%Ne&zh3;RkdtDHLrvb!dgk^9YhsW4^EU-XE4L}`T%08j7 zd2`!?2SBwC;c9kHTEQ6|eHLEsjdgc)MkgjF&dqo~U6a zHW1Q3Mv!Aca#3?%UipFiDX#COTMq*hViKJl&@weXyCuq%#ty)Z6SsgWdDY z!Jg6M=559TygvjQz9mFOvW5)a3{_HcBckGJudK2DMgSTHDqW;gg7$K6XR1%+-&=mn zhFjmE`j~6ck~5pIMa?%kw!>RAbt73NGRgD{;>%(;7&m=nmWf)OwtOY2*J+P6DRGU+ zueScjkI$x+M=%93aJpr%#f18`7JTX*_A1!5Lkego{Z^cTLe=KzHiW|O+s>sbMm?q| z`|Ou}-D%vN()s20T9M`vj>kQFk6aS5OB4y8cja4F=2Kqcaj;yGz2al$9vcm04Cwy7~j5 zTNxl%=aZED19B%bQyijDU@O@5Qg{0{!~~fgJN1*tVLAwXdWss_-Vg+ll)h|S_5$sU zg$8Ah?`2CEd+zLnxP+{AT>6~ch7H{vC@I;l8;TvNU$)iMI%jY9}q6TZ>|aO zV<8(;v&T(Tv#>ZwRK-2aa$$a+*sEYeb#DSZU~FPia0-fOU}Zl*$Rm~mmtu(9i(rH8 zz|cppOr8Te>Jd<@qoYHABm!$FOru`p+_?*e*Z9_OvD|U#VtV@2s-Csb@f8@wVk+qKL7cXMB z^ZmBAD_epE^0xszxCYR#k5j)3_TGNPhCB21A{&AQjT51)@eNyVNzI&_y>>=i zQ<*}EI&KCPc-bM6p~7xksyM^|G(G@`PzNe|JK#h-zi}X``Gd&XPlMd5s^;u+>tab5 z0SbItm5s*_urY?MetcqeacyuM2Vo6oY&>SXtgETX6-NhU4c`1QH@9)ZHFteiI;OXA zNKn8&jFWXd112pdCdP@6ED!&Il!coZgIblcEFrNImfG3*kdR=1ANu+z+eLk|12MLN zZ_$&X=Y^3QYsZwJLa`4F2_M4G_WO6xHujJ!5z>8OgZsn7$3~l@In|Dr+Lmj!ml7q60bI^E> zpUs=8;K(^Dch4eH>2F;3DomP_G$dbkO?+=_!v{-Q?6Y`*Im<9J?AhE4xCCdNx=diq zorkuKo@Q(K!sl7q>#Hu5dmq#Iw!Zgb+B6~_F)S=E$G85HMW0a7*Ycz>FZYZ#4y6=u zrDF0v>>sa=d@5aW#?q&;!pgk(UBK(*G_}i9ZT!z`Djl~>W$TgGYOdn@%v5zNbuMBt zWKR?pcI=I$UgY9qn&0co^mak#OJQBG;?2V2gDSG~iy=!;QTD6R=CnV8`|EV3b{Ja( zE#tJaWx7^IGA&X1_-b!>SyuPooWR4#^sa@x%6`<*s%OyAjxVa9xx~B0i4?8f|5h6k1MVp_V1Auw_=YBY=xW9Twb-zjKZhYv>!#)K&&8?4dc!|(Ek%EwE&K!)K4|xX z;7DPr4SXNqOi3FozSrI(&tjYn|JO2J-a^y;IdOHz7rdff9-y9!u+~7(!mon^r3HuT zNVN9DNhy&plAB;-ZSKS?A(5qaa1iE)1~s2iQT;?OhJVoXb~w5Lbdg|Gm%U^MR*kEM zDxT+B)mj5Itest5p4-kMKj>$Bw~A?N1HPFaD6wjTzs!+cd>B*yijM|F_-OLVDcRY9 zt7%kKCyXU{*p$k`M|JzP1-Od`zehI!1Cyr%OJBsAF+}=heCh{b3BSt^cS&^VNLy`Af&mX4?1FUTC;j-NVnJULV?TI#- zF2PFFy~1W3(&vit3i*bffL})K3?#wa@xD~mjV=Pn$A%Oe#-CuX(Y(;lSc11VyRy~v zQ4vbtD&_4S&f$0zY;0_i*5;UFY+lF5w8fn5VB+q@Xb&w<1W+KJ!1S;#I_yeEmnpU4 z-59D7L~|fh+hT&z2n7>Z?1RLv_I3?q0&DAjoGxK!y=21g854bo7Hv5j9Xmi{(-bms z;OI3BID&UzH%t-S-*vOHvSin-b>(R`(pld@3t`cimlwn&Zh!oJeS3z6(s+JIVdlUW z(VQ%72F=#s31bYEm(Aqs7#g-?z!3-e@ikoqoU@S%*X?jm7|#SMb98YKPQ**!zxS}x z&Q-WS5*t0#rv?H;({CK5fhU2;lawR+h#3;tITH{Yyna?+4om@H6P{emMJ$YE)N&Y& zxvWW#emuPxRU?mUQul~#L0Gj3_Zw!~Bok^C zjIVck?@?)=*${AtJzpCFfprJeOTv+vVO!+}DwgvJfq>wsA#dWp2RuB60o9;5AY5vP zocnc8^GX*wqu77!Y}z`BB!CCmBQ2&I-MHw5-uG_fPKK>tj>@b5fgPl z!uYv79u6uW$y-C4511f9{WUZQ;JmT%innjsB_SapDJePfVVx1NZ3^#AhJ6f$es-}P zq@XiPD#+NN9Ter|8AV0-`E&X^>3E%et8f)D!I^&fvNJLjrf-U6wnmUcQGKGDg$0Gq zmrXDf-2JGTV7^clVjU2%>r`L=bX6L`ZGy1H#jbv&+{wE#DQmk_l9(G!MUJjVRtcH@ z0m$QTbcSJpj$u7}qWV|$ziEIkL^1!c#zzzKhvgjKe-y-R zl|21g|I&6;`7A7B`&9%qF!+T^Kl7o|+}7}D_s3>r8J2*1UGL?&oP{GTI3F($S0~d`7$e z#8o*-`LE`%)|PW}kgu((Drvs{{~7G}aQcEVs21?6e!pB%2yqUN3=I-Nx{X&OcojPj z;)tN;lRc4-8`RtW4BgVqVELs?Qjs`hOQ2H;6DHmL==L`nUa_{b+oYi21s)IG1Z!}# zVY0Z2`wq;o&0~)n(`-iO$D{~r;{c6A{1v34i^q^Qh^~WI;bydc`D|n1Od5E;xrK$b z>({eoK_8`m>}Z=XloMcLW}nxocq`O+m|?*r5lWOnOx=2SGH*cjip+QGpgQC!pVDK~x!3U^-P7bxv;*h_j(Ag|$Q z5-Y;*l*0BjxhMrSEjB-Ie5FooAVERe=hehV8U;4ALDCroG)8V8Vz(#?6%56p`x#i$ zo;U~AX8o?3GDKF0c!r_qvkSjVtz-lGcF*W{=}}nAcjpp2gKN79bqB~NolDl%*1E!X zZP~zioqNyFl?+AxReA0!-}h;IO(ein#?b9D3gR5q(-OedUzTpk{wOn5NnvNIwlmg2 z9Ry~!TibKw5n2iSyHYtcOo6;^{>)@xw(cnA&iaqSM!LZCIoL7}?PfI3$-mC4`{!$= zV?}@*>tj5|?lSK1-XOD76}gD>`8t}Ps$}I z_1lbu{wj&KR>B8d?G8lAHINn{xt@Rs8U2&c%eP4Q5jx~OZlVYu#r%yyA20i_?0|}u z`X(EJ=SH7#ps#O^_PTSA^8-{c=(KCsuC7(sTtJ9|7Iwt73FJ3FMO}K@H)nhig~Q!H zzpu{NV1)qY>-JcPvt!^51;TbSZ286;Q;3nhhNb9$d9!i+hM>IXO|X(Ub?TIPFZdEE zFWwcxu-CN5Vna~)7wB~Iz27U{n#66cT*Zs_SGIGV<(L`_I+m{+SiG}CA~&_9F>|zU zc!gT!o+c(QCq`~D^7RcZA}!tBe9CXRJiiSyR>qGk(MGnDMoHFgfYUky@5Co0U=RXg z8yg@IYj@RjD{yw?ax`>w(j0Q|>s>(y|Y) z%-F~Wp45pD)otDS8%+e#E^GO|?N43bTs0jAg#qL_TvwRz!nwcv$R9>n9K#b7F z`)vD)tV|R%m!cXStb(@vjg+;sCWh3(^#Y6EOaw!=ayKQa$B+Z{_U8Mj-IxElVA1g3 zFv%{%vX&Jf@djNkkw67qiR;Ws>^Yx>7BzI_tB-Zl68<8@I;>T6qvu z5aKG2z99pVn*>5^8zK|r8oDE+#boaO8|7sIiyh}uo9*@~p1ftxLb`30Uwk5l%jNgZ zlnKrpmAJBh*s!fgVlfdBXLoI;dEESeLx!*kfla_5|6x)X1OEIc1YiS2^HGfKewEz*EviNu+Nz)@D4Y6)+v2wmx-)rit+%9owHiXY=yjDC)JxaT&hr$z%JeQ)_lr zfBR;4bK__$JGG1#l*yvZ$+&Ka)8C!-0>c|e68rhJXqEZM4^(#lryyi zlp@8RXeSvLy+7qN(GHwuPptIkh|s(P3M)T5OkE)}hU z&EL%5qRz#!s*Jw3C6%}mM$wrBoosW6e_GnZL9oaHUN;`Pm_YPw)Fd5~Ps{6y%&|ugn9q^99 zC5lLbte7f^Ml2FYVLr&11|+z9)lMTL3>g&IjONdt=v!r7+}!cp%mE8jmStQEn>WGg z;y^6a3ykhnM!9TQitQIMeI3x;0fb^HFm9Nj*Uv@3$|f&Q#@iCVjXgGwM-@nWE02MT z#d|!U9TdwDyFGoRE~567=9y0<-zTN}EMk`;9_i?4m$1X^bFulPqY<(Il^QmAc%a*< ziz9-;C|9tvfmgvSQ9jzTe4X2=2z{kw@UTO8jt=RFI-0;KfDW*;TRvq)ME2kYkaSw*%fkpr~I~TDEFS z_A2O*Mj;s6zvee`p+5#7@zM&E*Rbb8X$*HB%dZL=$d=H6M-?x(z&tIkXB&RLin20H z2CkZ027Eh^OB{Beh5#D9?nImc=bU$p4>w$#UjyFMO4Nn5b!TN&oNYw!OGnG998glV)bTQ}%TUH`J502eq$zAc;!%XaqIQYk#UuT#A7;(F%`!Nnar z&z1=_itQS`eP4k*oTZ~DvDsSdAfxj918jlgS&9W>p60(&T%L+dDg%wAVnlg;R9DBw0{|e?QrIY=4>_!b%^>Rn5v`EQK`CZG&&DnN za9O-2SsZt>7vtQ9%LCCDXKHw-Huv;Yq7kY#f_?#M@ciaQGy&*3uD)7#77pzUJZey= zd0Yy@ws!Nw+`<`B&C^QO8W1AT1Rz;BKEo6Q`i?P06_y=~H=!UUqP4drBy_XO>G6gX z*ry>p2An+k6WlO(hi52@P)-qQH%JxG0VSM0`y1C8*Z^`y{;utW!sEP=uNPr+LqDJo zU27h7vl(PPY9lYK7~hm9S!V7#M*d2;$zDPt&r zrIr=NBfcEH>cy#JV8B+zmin~~jc75HkyFV~3m@GlszCTU8li_rWROebXQHRgbh3776L^#^oH9VFo*!6Q$fh9}!^7MEhQfE|8QLnI|S@KQI9{-1Am{{UNb#bhg< z2Ji|XSd3f;vCaZ_k7R7qX6k|8XuoqW0%%gZ&wrH9c%!r=f^IR1nT z8IwQPuc$Gh80oA&4GwfTorP8Ta6wHywuFstVgI-TM+kumv5ARFVHv{^ z4w<&o0Sb%9(qSYI@`Wo`PNDM$_1i5tfC^E>c#t4wHXT_dH}K%WY6S)3r}jntF2J5a zH<-t$AmidWfo3SQ{N9o_PtHc&h&=rSnH~373tLjX`V6?xTQ5D%(LeLAw{HHiL-L}e zA^T<5`4}w+w^|mndthC}OE#H?mG`8C-Tp>C=ht^W_s9B1 zS$cfVW{%=>^qaY_^Dp?FOw0~G;un02#{MXpH2Y)8kZQi(`%9~r^cF1!{`GU_SFecE zbA& z@*!_;U`n)0DVHvB^-QJEA<{RFkhA9s$4LRq0rQLqvvgRjKzL+vkx~G$7y08HM!Enc z%bcKW+a?)a!S&W~uT{4rnwj6qTvIMQv%rwfsTu=C3TljZc^3+P*c53aZ@&=9vo>-jNQq^yO zt_d@duV>nwtiL{$q}y1KfpgF)Qo%P&DS zGchw~9J$D{psloaZK{G}2t2_`0}PgOw#Oh5l{Ee==r6V5N|~Q~yL03XidAS6WV{93 zK5@80`b!=<09_PyJA+vmX)7V~p;BBdn9ez1h!a1o5i2*0Pizo}QzZS*uaBpCw*>?Q zAZNUvnc=>8wd=`~D+rj77g~t6i}rsQgkN5X05_H`pv-2`tU&o&uwmEDs^Gavj17?vHmW(|I@&Zx$nh6Zuf!oHp!*D2H&)kGKp;6{^Z#?Nc_lb*k) z=Z18YDzM$cc$i%W{2A=$JR~FlfUHwgJONR!?qgzg+{3Qq0%SxG%GDdIAOTCw$S~42 zd+!c!s2k9AJYUrVn3Ud|Ye?DKqhzR~t78URj2?iYXpoA1bt$m@*pI_Km3O(gotQC@ zx~;us3p%IR-c^&J1pP4QQC*s_6PXxc8x>Xeu7YxmbBM3<0?k+mkQ*)n88>eRpuVP@ z_dzp!8Rvx<9zGODP?Qn;th$q$anTcq+3Z1pFOZc!Q#4j6mtH##kc`T&YNUq z^%iq}r`+%AItceu>sJA`wu9)s#l^*`zS~93en({fB#OiU2ksRcs9*p1Ra!tH25N@Z zn}L>Q$Btwas8{gZRWxs4><8n8XujMoYts0TQ(a(Q>fH;nfZ))Nzk;eiRUwufi?x3^ zn-Qc($a;|Ak#A&>0o9bSVYJNbM3o_B1PTrWPt5kW>q>bbz5|A{9i*5QW4s&6cM!pz zGWv2PRGq$W&8_}bora@9h0C5UqmZ6#SUQ}#VRwYigVxq@V5N|90^ZKmh7su+$lf$G z?7xze_BpHljl|R2O%aK`W|w<*{;NL!6N&rx9?Kl-@BWKzTJ=2VP}<*fQ7xRwV3*zf zPg_@vzF^=j(ZCYdQxeB=B5EDXbMHs;^67YVR4zApK|ZmoN2qm(-I4v5O{h1Y&QY4j zyP+7W&3e_#!<>s7_p{&SrMh)(>7QL=V9t3rvHW!X{pwZa{zdEu{&wuG6Sl>lH(yhV zfrf!*>kxYPzT=HR9g(%G$R54}RQ8-@k)eB{53Y?78LF4oNE9yi>2)k@d~i0h|8}e0o#><}y`PWb3)k@_Vva+@&#l`Up3FTWKwj>Um@!nn~tOz-;_jtz8*qABg%gK$|2Ne|*Y;iNljUu7~w7IA|QR@M5LMF2c5sBH=+1ZJ2FCZ)& zF!@kap*YcrVv=FCRA(v0SqE`I0zCbfK?F656;cZd7ZeSf7*A zb0n6O&QJK51o%);Dj*$w0WHhrts!FlG{?%l(QxHDnH7Hid>_t^=Xs!_d}3mq-N`^~ zVH}n|Xh-F1g(g#UGLp4j#2|tU1wi_bETGR)zg&;e{4kXW3VjMJRewIlae%DD>r~Kx z7Qd0PoDzeDvMAU*)fACzOtkH@V{9*|~CU9&39vNn*F&cIcAUNNp{PL94 zRMdmc+Q`sg%#3RpP*VyQOQ; zPh&V*$CZ~(PQlkIYg<%`&#MWge>jL%23S;G6(=JyQtIOHE95;iO`zRgg80D;;#~i* zz1_abE$+}mf!S=-LYR5T<|z|czTD2q=_lTu7v|j|17SP=6A}dMZ8qh3J&#QS)7$&EO?I&J#9A~bO97@Z`jbPNh=BB-4?Tr9-YSrKkDyK9Lw=6R4C531J}NnHyMo8 zmB#i(falp3$>*Pd(WNfXlrKH!iiJ^tdUBk#mmxgVBrnkR&(5%B+sc4xn>Kku$bjYA& z>kXwC{hfQ{6JYu!q%l&jaQa&l`$twEy=cebj_>d9aS69RiV#@4%0G-x$K>oCdoPx! z&*IC-jr!dLW^gc)?;@A?uO;%;<=_tjZB<(|-OTgwH!~pb|s`m}nGfYHEUian%QbWD2r03M99k zFrXo2V9&J8G|edUJCZ&GC@N*VG(MRA8+$L$v4r1$=|gcrNfGhx)6bAJN{BcOA92eM zvDm47K8bOmlqlfx(LXB+$^G5dXH;>v2K^M`bo=BuWQ|eL(Us1o3zLslc57+k1FwE6 zwqiwCa&aX)r0OZkNs5pS)9(I;WWj@l<`zD63m8W4*WWmy9Q71U&0w^|p9DCj&ie1a zzhfCTKqUVL4vEEr36^z6pqwIGFYfs=PQ9?lZ*!sn;Z`lD}o-!eH{lQ*BI(YTR=80+(^tLKrfP)j`I!C-``kr8773eJ>Z zTVpAa1QbBajG^LOn47b*>d`3#_6nH-+auBytpG2CF~{$gN4r3n(SE%|g%5WTj!@0< zeVrpE8$G(oBP=|q2(_^4tu>A?eZ!yNGL;fDb9K#mjAs7$&@RoK|6_qCw0f6LR2!*TBej5#` zO*D!C=E|%ze+cye#f8af=H{TY>I*;$4bF-a90`T3y&Px6e}oa*l!$gQK#? zPU46859;fYM-MpPIX*Et`M^ltl02G+vY@b$@wx(4>kld*15YEpedvauej$WCH{5w< zIgp27NAd&URL_V_P6^m6C;+{C0ZRbGF4(|kn0`Du=bb%+!;wAS-fM$My(P!slDEWmu(O>DL7h#Ex^)g{ z;$@V^%hC9NnvqIOF|MJo@?;Qd1>m&V{pfAhx->eKa2J%}n*eiyAb4-3y^@H@?>wKx zBM@>Uz1%>?Yi~Ey+-8FU1pxy#h}cx$`j`@^3LO%p1Ta|`&0nkc)OEYV1=hrWaK}A> zyq*7nJDLD@AZc^}-`X57t$S$+{RUKgouN;oRVF7&C1a})xu@TowC5Ivo?{KU8#VXy z=-CH}(b3#{?eaxh-Ut;*nZKHW#^;=Bp>3%XB2Eq*a*ACaZ`p4iG;7bf|5APJH8FOn zdDrg$DuyHa?BkB*G*BgcEtqGOHQCHiAkvHoZ>?jRZVmZm#Tii%5fNzUI#!iH8v;Xz zHNVc+ziNR`UOkJ2on2bJXxvD&!rHYg4quR_N8SJghTVg>;h)$GVPOoyZ}j>a3$l05 zKVq^M`VkR_n}=VBrI41U+jSHLXnaw~t~LfJa8vQP`fP7Df;TIdpFmxi zO|4odaQi~wrwiiRORQMY?wvDzI&gsS6)9$eg2}V(UGHR=7|Px7-39cgPU8ZU-<*dGo;%a zCiIG(^!<{Sz_{0Uf5vW^r+pZdq-j3CbHdJ5zLSaLs~|kGITYGu_+p+R^jkPu=CI=z z507x1E`G(N@=z(P*aU!M zPEHcZBv^$bFQ2300iyvn6^P-{z(DupOIQU2O2f+163G;D$CV-?f!LP{(|pt-IKtBB zU#qIAL8~_d)*sVHccJCDCcY@Q`H);!Z}vapUtlro-S+R;2&i(Vao7FZCiJ$$Ve$Sm z!~9iRF6+)*+0fQdI?rrTqvNGh9>U?!-@m>$`(xUME2qq;uRLT9t5}G{3=5as|D3OCHnWB?yuf>msY-qmCm}$*ABKFp2f zv+^aSsNV`7)!B3EsNWZQI==}ax_#LQEx8|!7H+A2P%vUQcgukCGSyJOfVAcl`>ys7 zwds%N@;bx+r#98Bts;$de)+L>Fyf}5b@lMG!uvMNQc+vEm;OU(>G_Bqy!@95AAO6G z9W?{GGH&C&UkYNj{DOMXrc;0eW3{PVjd$S82JrUX6{z$4(!$2A@m$Bxnh)5JKiiP! zTCo=cFw@@RlTg`dK$f=pfDXaGEbMW2U#+W`!jYYm?fCZf#?tL8m$sKA+FO#Dcz`d2 z>&i*9k3maF9=Hn{3(#doG=xCN(>V60xhd!pQJCz zlLQM^lLbb0SZmOJaBzGgSHQ?Nd+;|(Vop5;0BXFJYq5;Y+?YOv!36+j1*TP4UasU7 zBO?$;o*vktVGRHC4du*Ap^2(5mLYx?9k3ddfEoA}ncpCQF^9xyiMeBOnLG7c<2 zGk8CO8@5<;3xzI9%lJ7zeh5=vqXpckc?17T4_FzC$>Nn8_mb@DnqGatKaKGZm4{wP z{PYO}fUb6rm7}PKnT(Rr=kEQ$1|EHD>(1OmD`Zbsdp{HTap{w~k24bpR2s+MFcBr6X-^cA;N-Rec!VYTH!_ z0G)|}Qk@FVO@Nyiprfv#s^-~{l#9N?d|FLdp$UTJ8as0*ryVO#0ou<+7xHlKz_lc! zf#>?Z?H6&oNNIIfXKsw56m(gZqd)3smM_>iTnqQ@-d~q z+y0aJ^9ND=SLI_bWZU;`q6Sd;ZP|^5RNWqlRfUqPYzmdH0@=X7FlBKV^Lww+lJsYFGozr2_{bBn*K3f|pNXUp+RlJ5MU(7urMs{8n!0SJCH&*3_>O&S`Bc@# zFmy5Ac91|u!=>|>!WD!KY=%=d7eT}cF}HE**z~j*7QS2p9?}8?3CtshzcYYhJ!H&HZyT2L&CJ8xt(k;pS+v#wTd8;I==#}K9378D*0;Vw)3LxV;vJarb?5+a% z+)GH?wecY%r%%%=)&kThD#V?Z5%l5?f?tqbWw{j4=|0_jqr;lo48m z^O#vyJE(8-Zodw)*X-;pCJOXSQ9mDq^OV~&Vcp_ea41naW1)y;(}1mT-5IAypwQ4b zUA<<40eE7+<48VW(&(T`L@jzYW3|{$bW`$5O4gl*5oG7Pq1v!p9LdLUMEir6Jp%&; zm*IoK)QN#wEg2c+u~b5pfKWj#fuyZS`x;bO@7@_bE8t7GPb?zc;@pi&QA$=p_C9bl zee+&o$<5PegZRn7>w8zvKE1)Vin2yV<_+lnY-_sv6-%J*Yc_1)tGap$WgMONsyM`_ zu!Ez=#=$NCwUNxrJmAWBn41B1fpq!s^ahr?nx;M{+E?96Z78yj2O8hj*BRW$!W%+KIE zw|Uoz=>loM*F=#WFw&0m>CWI5%>H1{V}kDcH83EBme<0d;ICGbPRbBD=q|=2Lg|CymgqT z_dTe~&rs)Q%v67W_2>7kQ-4CuOVQCRH9D2{A)P^>8wvvp^#!~-XdT^@OXgmk`a|pY z1lrK$xY0!lm0aXWExU3@H9U%L74BDW>i0B7fK{Y1$r?!+30VFDdS1LrI(-*9Rc5iD zp+CNQv~}2yng! ztOaZ716k)Gh=Ac(^bY1br~a%GV%@Qh`w&`RJ!$@OCG2Ag#3Ch}R$2j_Qc^M4-4imkafOoz7k%CKOT&)c8qKO@id6Cdv7~O(&{u*#(3>o zGMORYDU(jG04xg)NM6-7oj0&p-M?Rt=Qdbh3yU5!Lr`eDv`?T;C9R!BJ&nfNrgMei z^Aj9Id!k3_Hy=Q^!+0|WbrV1b{K!Zlwx_%~Td_7{>+yMyk$g-iJO&W$pMwSuWe9*5 zPpc9O&5V1x#X?_pgLT+gyiQw%z5RWB_N-VyPs9Bs1j~s&;@T0N%0X|`Xy_6xy9SZE(KvQ~B0#(iqWeua*x487 z-wDd8fho(|lz5}%<;&kFzpH)S>X^W|?RQ`jRg>eoNMn==%h=kwjql@SSLb@0pY^2g zv#iDJ`9*7%%SymBx=b>*OxRK|_J_bUv|Zi**frY!s*O3D&peQdekE`AXt$(ZvHA@q z+9edo_kI}W?9C0iy7!pNm3y}t%bGy4o&5iiTWSFN;KGw;cQ|2+5nM?6mP$Ny2ne#! zuHX<0UoPX%KGfK~evbNPja`sDljk9|k+p>j9_KelyL?*@>8x|-#2s(i)5zx3)Cff` z+Ur!=W4}ZWE{$-QzZ;qM?i(wmy}q-oB|(NCDW_)8@kiE!d}*Qq6%_?j7EhpR1_r1x z6dIzoV{laApf}jv*1eT89FSf4<)xrCQQT!58oG7d`ThI%fOW2XZH8Vm_II8krL(== zyfYbHX5IH8)OFA|8+}kMz4V}^B~rZw6>?V=LB`b`h5V5etn(mAa@nn5xU$iqJS3Lq zg@!g-eha?O6o?3$s)84{u3x>HuxN3B$-_ensAHq)z9(2sIqv2RyRV?x5th60 zw)sg*hg1%LBhF?Ue)+O7J3H)aDa_Vm71zqk$KBKxplS+|n#R5>$;*cyxePa<0R$rJ zYKP`zSrhW#abiE>RN+w5hA=gZ6->T+DICY>`9a%9CxU~6>1=xt`%oxXFTaqMM)<_~ z=UltCZv5G~^mO)m^PM|CLV1LWvzHKrF^(}Jxb!DZYC`HwrQW2Ad4t9PijNq5euto)3BGo`Z} z%PV@fe;ByBd`icV5{|QVj|*FykjL1Z^Z@Q`!hZS}A#k8T5z4u%6cu{QfiCci8fA@c z_X^BO7%#nOB$Lj2}}m=J3M8dU-RSKA5Fxzy5NyXf6Za9^mBdG-3tWxN+C7tK%zH=*OBE=-QvU$<|tu;3&MM32^a|kxjOIzJp~{q-f^pEF96ii4t(jSZKdN+G^<*)EOORun=djyh2(4*o7rCmfX(d%*|wvr-? z7^%Cl(eApIq%qHu?(E#$4nxD+ku8{mxw8@6KRI?;1qCOvo(>+o%h-x&FuCuSs-vhq zxDB%|U#b-nX0GxFWWWV>{BWzo6D5WjqE0T(&d7`UGG-Mzi=Opf@nj8D6Z*>FgtesS zJzcr>JxrK%;yUeIP^A5I?H)G30dS~!A|;x5764~A1)r^mZT{W600ozNFS=Ro1W_nF zbp5djO>f&)pm8PpXLSoK0rnu(7EOxs7ivWAc<*QJC7d7%#2nf~CudovdCMMiRluf9d(Xk1){UlAO3t?HDch5S@B_H+IIp>gi381)H zSg;sd1IE%F6Y>dccVr4o0@Jx&%`f=@gif&ko}jc2hEU ziKsqYTv%A)!M%R{s^;vjr^--b_ep}Tk9l2D13VNxk?;GOia5BZoH)}AGSkv9uyJ#C zj;ovRuUs?lfG<{LhE^TZYZfxcwwp{%DOFm&+yJI@)BnJfZXsCrunJ4SpHdL(imG`y zj+ju{;lAP#8XU}aW)MrB=sk?%M4U8ma38okt4K*Dn-n&nNip}nit}E6Bd=%EFW^=1 zXq~)X77R7XS^?>@6PvStW8-Ikd z-_@M;MAcwxec*X!E+wL0hbkelNC+(^)Ts0iisHWgO*k?u9w|E-wUSFwTRJNA9wB>NvLJgND>-@7U4z)1>M^O@8P{daJE zo)kSr>J9WfQm(ER8k-|mbzd%9%fd^E&L@`~d7$kik3_w5xkSpH+MuTm4oYp8tj5Py zyx>1TX0T04ueM`Y+$#EBd-26VabcsPJ-%F4s@1>gCOb{K4-*qbTXhj}vBPdQo7qzT zZF@xHU%p;B?RzozgG^fQn(HW|yDdPSSQQhaOZCJ10|$&Hp>JRSK&jSGKki|NxT7si z19YheiFQaM!B&0m9s9i=wavI>9 z2(>UGYIhpNL>c~!3Y{Sm#bB^pL8Q!wWE>h%}QDQar^LQLQIpO8eL_N>3^hd)BJHuG)^ zNI3u~v17>~v=jR(-@SRmIy_F8Jm?y#@@8~_c!aqI-8t(@+cHo_pe{OZ_!>zLy1WJ> z&|<`B&+!bGpgza6r}DxD;4)BA5aydj!Kj#h0s^{e#`~>deFP9cGxH+~M<8RZSVw!! zk=QwiWTA}-fV7*Hl~s3h2gJ~rA|kc*gQTGhwi}o`-N)&>d_Lm$#HuDhT`*<5^rGII zUb+X9%dWW9c!X$jn93kAzR}X6jy(*aRU5$FL;J_#buwUfUopUQrgnfWaGyo&EFIuY-Wd?6?q+Uc7jLDB8dbp5OHRJUlq% zQ>!vs@v$}GgD>5LfDqB}j0DB;x6hx!#8?r6SK)--IVW}+ZYnxL14eRuGt<*3?0;j9 zi&dBl=CE8^v38h?;UjvTbMOG^H?uM}#!lldfW0VVAw-wVw|8|F6cK61lpG;Re-V`Y z4O&HOS+33T^YHk=r4l23Ny+%uNn2DECxo?o>$AKA;u`k7A9b;qm^||o%vAI|V8!t4 zqhWeX*ll3_!1nFL(qkJd%=0I7l26c)&Mbb zb+-nN VRE*^XXBIq*Sw@$|t_%ldV;-|T}xUw=c717aSXT;EBBlI082%AGjpzd4I z1FFss6kv8^mQ65m9|KQ3tr=gP*r~<;K9EcBtrm69A7fV8SPmfF6 z!SH|p=}6y9E?!>7^b(n33}(n2hR}M66^Esv|8%RyCqOJF*mJaNe2Zsu|=Lb6Ct@y?0$*MZkt zzr}W`YS0FLemMH)!Y`efnHhqViSm;w*5)iHtQKUCf8fmW%jZgPM@K|Ww1w|4H9H%$ zfIZhll&}U?RCF9?J*cTR!7DKE8c_JY^7i`rzLzhdVH9q(^svtCo3EkmMwbp!Z%K#* zJ}IiLC;+JlFxN`afurcx8y$mMsn=DHItB3L8%{0=?bk}tp&yKno`&se9XLzn+V5v( zm>21RtAH(y%7(gC7^9Nyp0BoHMI%P@y%rzMTJTtr@GIIWJl$8(`~(V#1G9bcX{vsB zd=p|re$fEQO3&Anm*WWoCB3V-B|+5n>Ykpxvj-m#J*vJ6QgG8MHl^{)dsK5j<4JK<8Ny_ z_-|`FN{oHD_%ZfjHR{r>gA2-@WOTQ;u>vT8ta5L7OFW|ybe{|?kq-HJwHN@!uKd8H zGal<*zA&+{Unh}M&}!n?2KBwZO$Ynv;=kpsJAAn`Y@31J*Q+Ia_^hF53W%V1CGs4} zXUjQx#_?u31KH{w067R|SGigMEAqvfLX1|2Z_uN~0>X3#>V+vc_nkYT#alq6GD!+l zUGMjR-}KwIzcoewFtrRe26)ysy$odM;v~$D z=66)0dxhW7tu7-CF%=cNI+*Pl-8-j0W^fsZ)&YOryv6!g(EOPWW#;7p3zW*o4paKt z7hh3WO!Yn)82AOG{mXq^neKDZ@DiR2Bu%qHc8=Ynv49p~YFn@^_7DOd3j46wa2F8a zb6a^u177msxDT$~c`br6NbIAI^igb%OIiW~+PO)8Sglt)E7h*rTW8-I=(AR~n#%Fn zX;U!@bb5RmpO5~$S3-qtSuYm2fi`;(!|uL5ln*JiCQ)9pstO%-`Z{!Jr;%_ zj2g(>6iX+A6^NUUt`;V**8n8edR!kI8(UxZQi3}Tl>NFN$8%S@M2tZLEu{f{BXv+$ zs_Xv!J+vfNYLM`@n1cuw(2_4`Mq*1LWmiYD()E@WLYD{p3XVa4X3iglyEv0VIF9)J zy~BVcMa%G-R34@CU3MNVF=T7GO_+f5E1XDA2d7{ZMGa!dO4hexx|KSUa{IRI+rJ+x zkZ5fzsiv3kjDNZgbFRTCbl1+U1bgr5o}niwn}%%hwK_v&s=`3)aT$R=2(-?H&u{D) z4E2A?EW|O*?Lq|1EVr*TvL^-bNYL?IT+Pj5xF7#G5bm13h|IQ|a-d^@2lL=TNOz_f z@(#?Oe8g#W<>lYTZ_^t;4yqy~x&pt0=C1#Nq}{qoU5)YMGS-!LSThrHhtHo8Ylw9L z_}1HjcH^BX*2qZ|3ePy)#QNk;ZevA}16k3K_HbOfj&9+~l}|~mYvAyt0`oz@qO?a_ zl$C*>#67d=%Kr*F+QFCC5my%Ky@C!Y1mrs&$aQGp*`}^8uuon>wFGVP^%2@n?_}d0 zy~T=Tg^p%aVwX^Q;$OymV9$#-js1J&=OtNLSxIjbZt7lGoakVdI#~^RD*Dthl%iu} z!0+#LYWRA2Ex?qP!c=i&&A5;w0jXTeOKVLBs~MOK^Ubz(GR+sKV9Udgu!|xC66&-q#AZ zQH*fsn#lyvTUz6rR*oBl*logHsN*`aqJK->LG}JmMI^2OHW3d8FqX>0Fd=T@= zR_~AyZOA_{t3q)GUgyI?ZK3z{>?|xrd|BtuD{RpxSikY7PQi#@6aTpiDg?yk2al0h zGY^a({j+?Yb`SFrbQwaz!kf~}nh(so{&iMK!PO&xeyeUE1!9c4n{v8_hSr9Lp{wCj z*ck(#4U}!Dehx)PE2Ygb%+=`q*xa}?+~scy=i^Bz9Ft#3A!QeZk?9sUgDq9?mAj>7 z329T;|8lh`8(W$6#t&t;W&}kaYzru0WaZ%cxBJ$kmYzQ^GD~K~X~$>P#`#0_NZcgQ zaSn<+!H2Nt%XWMQP8jAy)aXVWC@ihzk;oCf-QUmCe;m7Z5-(|DEWPmcD+ZsB&>TQ% zA+T8;F+dVeR8CgWo& z#~R!u*+#~FoS)1!etgUXqYW*9L8yuxr`_fXJ3I;Y7mC{f-|zW3kWz9CGVNXg=%e3{z+rery-&HU0LDz!0IlA;TpREcZe z9ZW4023^9=8$kk?865mtQU784A?!?RGwxtXH4vZ7-Skf!;%dxAn}+F9@7y?f$LhpI zp8cv1Z`@0S4!@01}?>%q+JRbwA%MT3Ax9r=XYy8;fqbA3ku)80lUJfBY(xW7%e3!Xn9*s=Ml4dc2p?1CWwth7&QoyeQp zSsXNf#hENW0qrsA!}`dWn3xXkglJ>`_5d23Ummo2#ATxJ4UYLuW^jTqNGQ z4BW*L%)KFIAMnK=r~W}mGK_<|x++8EXNqhl`UeK4`-4PLfh=5gI6zO8Ym9h^EN%a| z5TZ6k{yfT45XUY%*OX{Wl*8dVqS2&iY;O!wp43arveVe}Iv3@@H{hUdLM_17ft39O zl{{MyUG+nUG~~CUvE)YJk!y4C>OxM>(9>~$PFxQ)XwlasKG0P#PD7D-dItJ27XE?< z2xsn=nl0;<{a7ODPjBGMzQO5(^?H(x(8*9|)h}!Pa^5!N&zoo)X-c=%g)Ox|sGh zHn%K&{ zv#n5qByXqVHNILKWqJ=ekLqi{y-jnB7$l`nbs*^z9 zJa&*?t>)$D2i7P;)kh`0R#2Z!V)vltkMW71mX*+;m{1WoSNa1ZJlIWfrew3i6M=Me zAH3M$7_WFnE1N(wh8vtat!=td7Kt?-{=OjQw4N7Sgud1pR8f((NphJ7ilBRhE6BRM z0hn~AdSaDTTjnFh=WB9 z{g3DB+?qKetnf(hMyCZiOvuT}CCSFaW*x#EqLZa|4Wj$Ts`^b+KYl1>;bq?wS+R~gfbCF3AV^Vvecg`4D zMyr*9D~kSfMHuZyZy2f}-OE$|;E*itYeuWW7N4IQZ}Th-f2rW-!7?w*mfbyK-q|H~ zz);URHdB@vR$4zT!%2~`Ij+0&q6=>Mtdy`Cj69$xAY)u{np{xISDT)7YxxI*@G7ER z&=d7%)um+HFYVVEI?Myp#DnYNTaFvPY36zOI-2@{XdLWQu6F7C&nUGnMvXsJL}mW4 zm1L2N1c0Q$o3V#2O|$x-{pfyL2dlX5vkI#3V?iTREvvY28Q_P4K`awGgQxNr#a%DZ zOoFmB8E-6OsEx&3q~Z-JHUD9axss1P2o2ZuTyJgxi;wfPL(M%s24ZU z4>N*QQtf%^?}nSq>fnI-sP`Q72^*p~+^>@!!c9^AT9>?Qqt`P@l&|ja_LMk7-1G>k zknb;1d|>a7B5Y>SKcjdk3-u(_v(oyM1}QS^SuG3HZ%-C>6Dxv;@1xqfx2XfuHM>ac zMyD1OR_X){HI%Jd&+flm(N`5V_vTG_@Mf0pgVqV6D0B=CPoQ?J+^BCKcv?Rs(%CB@ z;B-MjO{-FAa&;J$$KRVbJS;3O<;yO*jpPF0b7*p3m7W0UoLE?88(?F@wJ}m2nEgT+ zX9Q*w^d(v}>!B1@P8)VUX~`@T^0f;sAc~+Ow;><>9vZ3ln4NEad=R!zGD11iz%=o7 zU{!tD)yyWHVA~0*N@E4~ngQR}KYuOr|NbO1vMsU;rLfps9Z{{H`-G8**cS_^oOhON z+01`DQLn|aeZ&)sv{_6 zOZ4FJM@YIo#pY?Ly=8M-Fx)By^MTXMK%8qTLoNmpNkZ(N`Z)LMw(2nSWy;q&%%!?b zsK-)M$G^^FDk9a9&SF6PL*SjX1YB=We7WvkkHsve44tPj!q%(9(j}~ZepUaT8(?Q$ zy8Tv(-Io3OP|~TNKePubb7KX^JqZzDS_ikm9@#GxOV#)# zWWgVX{*`hDie{R{)|l^#k=avme)kR;iTHhyNGWofNZRwJ2F~)jx^%O8HMAbi(2d=a zKYx75aOIpi6b8yqBi((!i69QfMKw8yNbZkbp?|?aIH2p_yu1sQcxHpT&4dKq8U}I# zqEh_64Mce((?2wH=0JtCG_U3NA1jVqPe_<7VsPWWst6?>olNQ{$7W~+0Ayrx^ZuZ7 zE^;Iu7nW4sc6fdo{qBt;zXWXu5p2&?IGYynO52!DCW+lgPOErdnuM2-lb5Ib$U2Vz zVj_}Hz8b%0`1;|wdz~w~xz7VmF)8W2w+Q-AcgKY=8<~!hGA6}GA()#kj5^0TsOv)R zZqm4Zv#P(CkXk0Th*Ia)@v!W^xO#fE1l!3%Z*K2qQ_{&zx}9Syq{s!xynY^^(Lsvk z8a}Nle#cxjqIMesjrLg9&}G9?rX%frT7OVDNoD;Vi+o6DDE=Yp#PNA#eCgaI&-f4N zriXH$)Z@Dtj0@lGQ~zD8;R0c0#hb9Iabdu{DCU0SqIPbaSC)VY72<^H zu#UY@n23fltg@Yu;5zbwv*p|4@6cP7+`NPPBILu=cA2-x&D^ljgkqOJDw8_a4$JRo z87KAi8VuU2++EyVq5zm@BbQ7yLeC0EIRB8u zJ#0J~T?8$;Y?7p;tZZs*>=nCPVoN!2;{F2OJIiH~3JQ-vQaPKCJ4xOV#EBK&&~@aV*gNBS)svDMtp9} z70!I<^fCtS%R9Fm3$$<{1qirrdlOMq@) zX9;%OiJLmf1?yMQAJ{l+qV7G^xEr|hK^bV! z5)5wB(Piy(dd>lSj&5y`)STEgH(Og9MOaH#zvn6I3$hUPnmA>WWv3Fe541c)wZrqKz8y z!i^xX#EQ&_l|eC7RaI4cU6W_S=yuK4txkcPAdN)ID)HS{E#H%R(!3?-XI@Qcs`=MXx|@4 zB#DWAQ=FfHjfVR-6*V+2EXqq|eSY5bmtfylRLat*0Q!~fQUZ!j*f6~hRVg~ z$Oq?F@DFmUK(|m(cNC07T+DYGI90YcMloMe3mrY(W%2Cs<1^S+)-ZRlCM`A9x>t*m z?|?MQ^L~GdueUeXx^?U>r@_ZAvwp_(5X9<=A#l}>8#)qiO>Gfg6jja@x~O_!nkTNZ zLR?iPe9~ap3;rd+Sw`%^Z17f{0iq&BsB0QKSuZs;sY!Q$Mdv@Cl70UC zhgYvUzMkM_(4BqzR;7P;R$|YINldfAq|DzxPq?)8YG4j?M1FppkGq+!Lj$-)(fN~~ z_~SJ))!w5G19PY*5^f!dZOf=y?FaTe^iagDZwC^lxePyf&_OFo=s*-DcAGehZydPf z*8Cn^%(aKu2fSCv>)8=^0kCcro3|N^)?t`mM_b=LSD~yxE|4&(bGfo3cR>o{OP@`K z4+dZ&?@t=70;!uE97hhTra>+1He8L0exlkfsfgx+x*5aa@AE#}bS971}; zd4fXeg6&;S6{QGAgNkj7ge$+pHC6^)Xy`=IKSvk4k0s%X>DRzEnf~V@fECDJDx9NO zq4o2Z50+-6ZcmvLLsb!RNaUS>vY#=iVNQ;^ThDNx4t7yCDCV<*5HULj4$tFDipL%} zxVn-)?7>!d<@O0eJmJ=L=y286#s0s=2;LoC@5=`dR_)_;obY>ybdZ~S4;6}%-;QKQ z8^Ng?7+t={Y#ZkGH92(mUon7?RsF;r_+ep>&If?6rehtL9fJfgNTVfe&Nb1@grfj9 z6%Kw8XTb()F4A35cia$(CFD~7>ltAamNhgJHh14?^ivUbjST{Vg0_j4-e~Kp_GpQk zEP`&0S6Q@f9O#0S-JVR(Vz4MpukrsggsrMKUF{NsJhRqP<&yD=Nyt;Q5iERjMVCsr(znjXnL10i@Q&Z@P`WgmeOMS9SR*dZK zVxw*xk17tKhK9alg2rk!8Il8=r8)b}MH)m>NeYGDGAykQ5ew7Y21Bc?D~NM(N1Pp| zCm<2Q6q+sjN69}yZtlMz$F2Htx$OOn=k>cZZqC)``cC%uT^A3uLHoz1pn2E$X1O|J z(>Bvum3zDv6g%q;lyp>D>#KeIh#;r%Z;*?iT%c9h2Z!{x)$JQE|bVi9E*#DhAFe+s^bm z|HQkX{r|-~LiX@$_mk(OUZVZGNUQXJ&*S(0C8>-iQ*ol8m9U9wX>hf6;hb&n;_e^w zefE!^z9x5NQIy1_t5bn%aM@FVtCxX}1QyA`Wux-lyss`Ej~^RcMshSKa3~{^m0rrT zmbbJV#0UqzCEf?`0>aVO)&}G5p~;*3Ls(GSQELHvR$L47MJ+UjU?!|}bkBotH>!Bp zp#At92=Q@WAiDb>A73%QC1cf|&8PmSPwh6ROPNrK&EC8GLqZ-b>ESRZO-NI%f2Rmpx>#hU#m^m5O6NkdN7s7KHTRs6p82mSWE`A)=b-mhGNds$|Nw+OIcLK?5DaUb#?F5dfsGs(-ka z{py}GwhB^CTjb&0fWn7!1eXK2*^6DnHa3p>jc2U9tTn1^9elF>bzpo9X6 z9%yhtJ!p6y11wnu1oY(mz5Ww7bT3fz^EF{IXIzRss@0D3m?E&7P0dLWcAh>|q>bzl zU*P+R<{r|e*q()fv|p$SgRx9ObqaY7be@2IzF_>_h z!Q^t+cRKEju1uNT38DfV0(i2dc6##zhkKt?J1H24B17C?mT1sfM6qU1OgMh*N;4=y z$V;eO=|XW(uLLRR0&pdE5qeBg!IHy!iL)$nxVJKTFCYnX>J)%!ffICa$01nW{<0WO z=_Vhhm0=Ag>^0+}xiIMPSGTZhKN8zh#QS;7?>Ps<bTbi7+hC9gpzxH?FRQlTBtQ;f*%Jl> zN#bvrsX>tz0okODJ%R1U=~749`+xil#yVBfWbv9GS%Qb0B;>1BN0cozMVhZ{w<}ob zB2qSZW}1jljahnzsDYb&9N2kZJliO`Iqn8P4>keEH>L%xyY0(w zJeC;h9a^|?DHQHa8GO7DUKW(h-nbNWh}cj==j zLQcbzoM9t^bpZjGYfi=2H#7hR&9{w)4G0$2K(l@*b59wj6qq>bTQY^CdCN4zf)O;3 z_gZ^7I5_&Xavio{Pd9%pwF`iVi_pbzus@F-Vus03+LL4qia_7Mj<~g;-L74$p{@?W zA781D6nb2bqfkff7x;=Jjc!)yqbH;(`w`5mk~XZMld-=-L=d>wf#oC}8T$j_CS<5V za^uF7`3JrX&Ex`ZkTM9z^_Fcp4B!f)a*~jes@jEWu_5aHlz(SQ83s*6avHLKHMH5*Ll}ztpk82 z6o?@z6ySRJga7sF+~Ij?I7wj1b^tpa(>6)e@xnR3B9+-ICjil=?~~F zdW#~kyB=M7=dK703dsF|u&~*oD>Dg3u0tpjDfIDqlF#|;8ehEPbpr%~18PSta zE?tL<4%T;LRYs;NF9XNkVLbJT9bn3YnUb%?)!@oU`ZCV!x2 zpf6$RUedKF9|Xc0#;1%>LYtVGAtee&HjDBC|A)d_NhYHsf5l1nRtzMi&ZKrtLWKps zoXRP2%$MH)xW_`9l*QT1$^K$tf^v_S0FGb>|GDnT*;xT@?vk1dajaNslNo{fZQwC; za>Z_3n(G;xgmotHpW<0vPGLgij-c0^$xbSQ?gH=uBC2Bm~B|S_Q=g z!|NROvHi1>>neVwRzH*)1Sqd zSxe9bW*tzpk6(l{H?}9r@j-XrfHsjczYI7C!9y`Hs6Txj8|tD_5>G63Fq%TaOUSI2 zMmZV00|EqicqGnTxv*&>v!sT!8|%BJt6_I8eOPv?XqBM}XD2XWo}DnDaTyNgJz@(c zrYKuEk7ZeIPL9r?7_>7=F?t*#+t_;zhK$ZeP0MvkLlnFrXue)-liAn>Cfjq!ALWTF ziywS8(OIC^)p@fvPrr7I%-Pn$@OU3RPgNK|pP`YF{GJH@1W^O=tn1g8ab8@UT*fS< zAwsPbewLJ185Z$efoiDV?iqCGcN5mEvi%e473z%12=$T+)ijeu?Jk+5zeC+RYjS~} zkc@p8g8CV>j^c^&8*HUFb(_7mJTkkrQ;rgl z&TqC-xm^0thw81u#0nC<`gpO~zvQaE7f+FyjmNqPl%}9(>Wgl@u{kYewTP5e;eBg8 zVB{#!iUTlZCh;h{CWfg;g^!vNGqNla`4pRN7qpUp~2m6$!? zG>nanfgcM@-r3I$&I^c|A|lvmvw#Z#auzQ6ql3JY|W5zIiHfWekH-q6#1jD5g!SHFU{AtfQP;B!)sfEeoT zAN{?w5jrvp$=B1<=iq{eVIHCtw6T#GFPoTPq4DM1TnEB37Hlgtq;Slj>gk!VwEUJR`{eSWS-2fwg5E((Ga>;LMDiajtcAb z%#4trAiUNGK<9(I2ELP^qL&U@5Oq0KP0eNSWDtT6fyRucQKGjVUc*^zt_HjdC_BzP+Z;Z zdtYdM{_3T8))<@bfLGuf{XzQ=>w#ZOpV0C+dwRa??{CEI$1Euf=>b-wFk7A6v?+NF z2(yu(WI&EY2m%P>qb*yuZ}$Y62*{UuDGYN;gk|uKm(jr>>U<2j6lZK=lEwZDd_|e1 zhj`dX!TI_5NcAnC^g`N!Ut#=OOc%BR8HoZz2cuc=@<8sKnVLdPgFox$>bem6>i0ys|6z~>6Tp}3AAi3kbn1t#9=!Cy6?7P9#pnK$v1A!yAdq#Bf93)Su z)!|8oh30@kHldpXdm0>7{4V;K(a|=1W{il4HR(84NR|(qZ;WOZ79N2}0Ar|}oE+jA z{amt}blI$|jG6+(lEh* zDD4X#Z!D^2;1rN;L*WdNok;5Y_I+Mh00%OK?2&_QBslPdIvcgbU#HCba0&pI2$%KI zqf6+2$d2)O5N8o&DqK>6mJUZ6^lZ}75ci<20ACQC2y|g@kv8x+DdRMGSy`kv!f_Rx z!tY4?xN}&(iJ`eFwj{$u8-jwInyUD=E=={%{0G#&ro!5`I{{`|dhcFV1mF!Iro6!^ z!CSB}Gs~9KqOz|e%ocFka66&(kpA);TkMEK*l5ylo{F!E?SnWLV2P+O5=FEQhT$~wo+Z@DsFSLE=-I$L5CCfz z>r`=%@qTcc(U8Cn#AQ);4{`K2hu~$DO+J9r`VZ*Vu?Ph6KwQk)3m1I-{T*<@9Z_7q zdmer(j*j3|u7d(J0yIvrD*&#NLG<3TjMygXx+GBiac)4?y1oRB zoLa~*&t+}FPE0aDklyg?3fOx@OnJ19vFKfW<#o9iMytr;Yk3I%DIn7Reo)m0m>GZ4 zmREOP*zLT2j7%wtVkMOd!FM_ek(-Ff__*lBFnR&Lk4ZA#019s$UlbZJ9f(D?vA?8# zR*J_0>t-g;_PO^DD@@*q_Dk8d6qB>k;;$paOM_37>7^x@(y4>ol=jTXTk$O8hyT>F z0_-bQ_pK}D!L~(fmajg6+5BunBfVxaa#%Xu3AXsui73n+pyL!i&qSZ% z8D-ivI$^6@!SX5!OS@Vc=5!Y2Esc%gE6t#`A18M1J74fy(x!iy#yqx<*QIfX)ynGC zHr)!W(V?u_kbxz>vV!=CV8UJa!HHc&m{oL0FoPD0{d9A6X()1%l9MBRN_SWT*nvgo zwM6g?ajT}fgeefD&p*Gc|9%|tq|t5P>crb#rCKrH>%q_Le+67MJSxg)?`kIewxR(0 z4i;3r*d7SJ-7TwNtOnS(ukp3%Ctt4#x*tzmk74BCle7ac3J%H?2bww`U?Ctk zwVh5Pe)^~ajra`zeiY)r$a0`3K^uJS!2H>Fy1u@z5T((gF8Jr#;#d-^r7Zt=gBdHd zd5_mdi`3gJ1Q!j4HQHcee=S0iL%3|(G1J)C*grP*3(2X0nE*GIX3jIR@xiuc!C&C- zPn&y<_)~Vx=Jr+g zX$Pjut}eo7x{3j-g>e7$_Oh?(^!W&?Ba4n$cW77?)(X;Ha@cq6A_&$AjfDLI0Ce92Gnc{&6$^ESz2 zl*T9-ct~pr=!i8H^>lnZovAPJ_&O9MOp;Slo=U9}*|zSol7KlyeA~9dLyBZ_6>245 z@rd5ChqCcUFD4`|8~%?6t|(w`xC_ZSg1Z3W7fJpZ59>qJ0w=MgH}neP{j26ZLkW`V zO2fM7(s8AyCDfr!!}3`9+N^O27IBn9mI-zk(;}>Z;zHxbDPT%`92&rHhk)RK~9ID=CE+_`h3w^4*9I9l~m&!2A(cq~5m5#bMH;%uR1)p(Te zwyRO?usTvy{wVzd?OWwZK_EP2zaZ?@hdu|2`1D zFmE2h3_Khx-jAbJBt}aa+H%jYM_n2f-;rgEaw(|r{%x<8-ALaNb`{8b+Yf!NC@vQB zlnQ@{E(}XlC8EM6XcY95F{l6ecWretDlx6at_vJ_l#^M!=}uw9&rN1M_=$JNhR08z zj$kD7h1i0EdD8eZ!eUKZ+vB|#3IhzN9-WCjdkfjOk{NqMVYAaG)RBaCE0YK8;`_}W z#OF`N9RfsPeG-NxC0qXcJ{xqf`sO2mE#rO1VXgp{#>?dDtY+bm@A_TKdJz`-)0$t zgM)AHkn-(@U7M~6fCFjyzj3M^2u8xihd42)3{nQyv0wDLjO2&=2})fZOey;NF@6HR zS=3B?7_wZ8=idgROC+k+{rji8g#Y~($5vc!Y&@2hb_M{3nvAscEUst5@f-1YLL@Ph z24|)@firHX*vkCT;Z`)s;gS>px5kT_nwf!_z(0O4;8k<1RrW*U1NlAR5Uf0aw8YBX z9BVQ|Ftq^T(a7UI*&k5>5s>A<%xP5Z*z_!zLx@Oo{syvSBPgs>RtbHDNN2boSdaKs z=ETYXY!E0xVT2Rej=6np_cE$BEYo`|luX!Hk<8QT_LAI$#J+L-z4I$-~D7n^fGAr@gxdP{qJ+ zGkmuo3A_}H6y))SaG_9>;_i~f*PzGSopbeXkdZ|7+y(`S2^CG;k&lyx@DapWoIit^ z5Eg%?KIp(jz)~Pw52%JC?t&2i^yyPvpt~tH#6g=LKf?9j&Hm?PGbLtC6XwfCh;8VO z`ax|@5CtU%b)J84@V%5ka||!bg^48+)z!h#(MzcJVRX<2z4PZ}Z^Z%~*$qPc{9C}; z_wevY5JeG-su{phX8s*XWR-GZd|WDMaJrm6moZoWfWlTUl>hH%s0crB00q9{m+xpX z2Kwdi%C-=%w__!yh717CCPo2Q77iJx`+9^y`<_8FKsfm; z3^I*btVy zS|k*PR&U;568sIv04e0y-i*J0iyL7}!XzTUJS&TB% z9xAG-l?h{Zw+lBKh2U@W>lnD8AZ6Eugp+t7fuUb}`EzCC)ev!~|`uE*@E rj=!af(i6*?b#rd!lz%e|W12@!z_$!Q7;FpP^r9qvZSHk}R(1i!E literal 82621 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 E3*vLeXaE2J diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 75bedea99..99dd8aeab 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -1728,6 +1728,9 @@ const luaR_value_entry opentxConstants[] = { { "DBLSIZE", DBLSIZE }, { "MIDSIZE", MIDSIZE }, { "SMLSIZE", SMLSIZE }, +#if defined(COLORLCD) + { "TINSIZE", TINSIZE }, +#endif { "INVERS", INVERS }, { "BOLD", BOLD }, { "BLINK", BLINK }, From e68662764fcaecd9d1578297e470d72eaebc5dc1 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 22 May 2020 19:55:04 +0200 Subject: [PATCH 362/560] Battcheck fixes (#7602) Battcheck reviewed --- CMakeLists.txt | 2 +- radio/sdcard/horus/WIDGETS/BattCheck/main.lua | 232 +++++++++++------- 2 files changed, 148 insertions(+), 86 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f0011a7aa..e9bca79b0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ set(VERSION_REVISION "8") set(VERSION_SUFFIX $ENV{OPENTX_VERSION_SUFFIX}) set(VERSION_FAMILY ${VERSION_MAJOR}.${VERSION_MINOR}) set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}${VERSION_SUFFIX}) -set(SDCARD_REVISION "0027") +set(SDCARD_REVISION "0028") set(SDCARD_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}V${SDCARD_REVISION}) cmake_minimum_required(VERSION 2.8) diff --git a/radio/sdcard/horus/WIDGETS/BattCheck/main.lua b/radio/sdcard/horus/WIDGETS/BattCheck/main.lua index 215d589ac..58790445a 100755 --- a/radio/sdcard/horus/WIDGETS/BattCheck/main.lua +++ b/radio/sdcard/horus/WIDGETS/BattCheck/main.lua @@ -19,15 +19,50 @@ -- Horus Widget to display the levels of lipo battery with per cell indication -- 3djc & Offer Shmuely -- Date: 2020 --- ver: 0.4 +-- ver: 0.5 +local version = "v0.5" local _options = { - { "Sensor", SOURCE, 0 }, -- default to 'Cels' - { "Color", COLOR, WHITE }, - { "Shadow", BOOL, 0 }, - { "LowestCell", BOOL, 1 } -- 0=main voltage display shows all-cell-voltage, 1=main voltage display shows lowest-cell + { "Sensor", SOURCE, 0 }, -- default to 'Cels' + { "Color", COLOR, WHITE }, + { "Shadow", BOOL, 0 }, + { "LowestCell", BOOL, 1 } -- 0=main voltage display shows all-cell-voltage, 1=main voltage display shows lowest-cell } +-- Data gathered from commercial lipo sensors + +local _lipoPercentListSplit = { + { { 3, 0 }, { 3.093, 1 }, { 3.196, 2 }, { 3.301, 3 }, { 3.401, 4 }, { 3.477, 5 }, { 3.544, 6 }, { 3.601, 7 }, { 3.637, 8 }, { 3.664, 9 }, { 3.679, 10 }, { 3.683, 11 }, { 3.689, 12 }, { 3.692, 13 } }, + { { 3.705, 14 }, { 3.71, 15 }, { 3.713, 16 }, { 3.715, 17 }, { 3.72, 18 }, { 3.731, 19 }, { 3.735, 20 }, { 3.744, 21 }, { 3.753, 22 }, { 3.756, 23 }, { 3.758, 24 }, { 3.762, 25 }, { 3.767, 26 } }, + { { 3.774, 27 }, { 3.78, 28 }, { 3.783, 29 }, { 3.786, 30 }, { 3.789, 31 }, { 3.794, 32 }, { 3.797, 33 }, { 3.8, 34 }, { 3.802, 35 }, { 3.805, 36 }, { 3.808, 37 }, { 3.811, 38 }, { 3.815, 39 } }, + { { 3.818, 40 }, { 3.822, 41 }, { 3.825, 42 }, { 3.829, 43 }, { 3.833, 44 }, { 3.836, 45 }, { 3.84, 46 }, { 3.843, 47 }, { 3.847, 48 }, { 3.85, 49 }, { 3.854, 50 }, { 3.857, 51 }, { 3.86, 52 } }, + { { 3.863, 53 }, { 3.866, 54 }, { 3.87, 55 }, { 3.874, 56 }, { 3.879, 57 }, { 3.888, 58 }, { 3.893, 59 }, { 3.897, 60 }, { 3.902, 61 }, { 3.906, 62 }, { 3.911, 63 }, { 3.918, 64 } }, + { { 3.923, 65 }, { 3.928, 66 }, { 3.939, 67 }, { 3.943, 68 }, { 3.949, 69 }, { 3.955, 70 }, { 3.961, 71 }, { 3.968, 72 }, { 3.974, 73 }, { 3.981, 74 }, { 3.987, 75 }, { 3.994, 76 } }, + { { 4.001, 77 }, { 4.007, 78 }, { 4.014, 79 }, { 4.021, 80 }, { 4.029, 81 }, { 4.036, 82 }, { 4.044, 83 }, { 4.052, 84 }, { 4.062, 85 }, { 4.074, 86 }, { 4.085, 87 }, { 4.095, 88 } }, + { { 4.105, 89 }, { 4.111, 90 }, { 4.116, 91 }, { 4.12, 92 }, { 4.125, 93 }, { 4.129, 94 }, { 4.135, 95 }, { 4.145, 96 }, { 4.176, 97 }, { 4.179, 98 }, { 4.193, 99 }, { 4.2, 100 } }, +} + +local function periodicInit(t, durationMili) + t.startTime = getTime(); + t.durationMili = durationMili; +end +local function periodicReset(t) + t.startTime = getTime(); +end +local function periodicHasPassed(t) + local elapsed = getTime() - t.startTime; + local elapsedMili = elapsed * 10; + if (elapsedMili < t.durationMili) then + return false; + end + return true; +end +local function periodicGetElapsedTime(t) + local elapsed = getTime() - t.startTime; + local elapsedMili = elapsed * 10; + return elapsedMili; +end + -- This function is run once at the creation of the widget local function create(zone, options) local wgt = { @@ -40,8 +75,8 @@ local function create(zone, options) telemResetLowestMinRSSI = 101, no_telem_blink = 0, isDataAvailable = 0, - cellDataLive = {0,0,0,0,0,0}, - cellDataHistoryLowest = {5,5,5,5,5,5}, + cellDataLive = { 0, 0, 0, 0, 0, 0 }, + cellDataHistoryLowest = { 5, 5, 5, 5, 5, 5 }, cellDataHistoryCellLowest = 5, cellMax = 0, cellMin = 0, @@ -50,7 +85,10 @@ local function create(zone, options) cellCount = 0, cellSum = 0, mainValue = 0, - secondaryValue = 0 + secondaryValue = 0, + periodic1 = { startTime = getTime(), durationMili = 1000 }, + periodicProfiler = { startTime = getTime(), durationMili = 5000 }, + profTimes = {}, } -- use default if user did not set, So widget is operational on "select widget" @@ -65,7 +103,9 @@ end -- This function allow updates when you change widgets settings local function update(wgt, options) - if (wgt == nil) then return end + if (wgt == nil) then + return + end wgt.options = options @@ -83,8 +123,8 @@ end local function onTelemetryResetEvent(wgt) wgt.telemResetCount = wgt.telemResetCount + 1 - wgt.cellDataLive = {0,0,0,0,0,0} - wgt.cellDataHistoryLowest = {5,5,5,5,5,5} + wgt.cellDataLive = { 0, 0, 0, 0, 0, 0 } + wgt.cellDataHistoryLowest = { 5, 5, 5, 5, 5, 5 } wgt.cellDataHistoryCellLowest = 5 end @@ -99,9 +139,12 @@ end local function detectResetEvent(wgt) local currMinRSSI = getValue('RSSI-') - if (currMinRSSI == nil) then return + if (currMinRSSI == nil) then + return + end + if (currMinRSSI == wgt.telemResetLowestMinRSSI) then + return end - if (currMinRSSI == wgt.telemResetLowestMinRSSI) then return end if (currMinRSSI < wgt.telemResetLowestMinRSSI) then -- rssi just got lower, record it @@ -118,28 +161,28 @@ local function detectResetEvent(wgt) end - --- This function return the percentage remaining in a single Lipo cel -local function getCellPercent(cellValue) +--- since running on long array found to be very intensive to hrous cpu, we are splitting the list to small lists +local function getCellPercent(wgt, cellValue) if cellValue == nil then return 0 end + local result = 0; - -- in case somehow voltage is higher, don't return nil - if (cellValue > 4.2) then - return 100 - end - - -- Data gathered from commercial lipo sensors - local myArrayPercentList = { {3,0},{3.093,1},{3.196,2},{3.301,3},{3.401,4},{3.477,5},{3.544,6},{3.601,7},{3.637,8},{3.664,9},{3.679,10},{3.683,11},{3.689,12},{3.692,13},{3.705,14},{3.71,15},{3.713,16},{3.715,17},{3.72,18},{3.731,19},{3.735,20},{3.744,21},{3.753,22},{3.756,23},{3.758,24},{3.762,25},{3.767,26},{3.774,27},{3.78,28},{3.783,29},{3.786,30},{3.789,31},{3.794,32},{3.797,33},{3.8,34},{3.802,35},{3.805,36},{3.808,37},{3.811,38},{3.815,39},{3.818,40},{3.822,41},{3.825,42},{3.829,43},{3.833,44},{3.836,45},{3.84,46},{3.843,47},{3.847,48},{3.85,49},{3.854,50},{3.857,51},{3.86,52},{3.863,53},{3.866,54},{3.87,55},{3.874,56},{3.879,57},{3.888,58},{3.893,59},{3.897,60},{3.902,61},{3.906,62},{3.911,63},{3.918,64},{3.923,65},{3.928,66},{3.939,67},{3.943,68},{3.949,69},{3.955,70},{3.961,71},{3.968,72},{3.974,73},{3.981,74},{3.987,75},{3.994,76},{4.001,77},{4.007,78},{4.014,79},{4.021,80},{4.029,81},{4.036,82},{4.044,83},{4.052,84},{4.062,85},{4.074,86},{4.085,87},{4.095,88},{4.105,89},{4.111,90},{4.116,91},{4.12,92},{4.125,93},{4.129,94},{4.135,95},{4.145,96},{4.176,97},{4.179,98},{4.193,99},{4.2,100} } - - for i, v in ipairs(myArrayPercentList) do - if v[1] >= cellValue then - result = v[2] - break + for i1, v1 in ipairs(_lipoPercentListSplit) do + --is the cellVal < last-value-on-sub-list? (first-val:v1[1], last-val:v1[#v1]) + if (cellValue <= v1[#v1][1]) then + -- cellVal is in this sub-list, find the exact value + for i2, v2 in ipairs(v1) do + if v2[1] >= cellValue then + result = v2[2] + return result + end + end end end - return result + -- in case somehow voltage is too high (>4.2), don't return nil + return 100 end --- This function returns a table with cels values @@ -152,20 +195,13 @@ local function calculateBatteryData(wgt) return end - -- this is necessary for simu where cell-count can change - if #wgt.cellDataHistoryLowest ~= #newCellData then - wgt.cellDataHistoryLowest = {} - for k, v in pairs(newCellData) do - wgt.cellDataHistoryLowest[k] = 5 -- invalid reading, set high value so the min() will update it soon - end - end - local cellMax = 0 local cellMin = 5 local cellSum = 0 for k, v in pairs(newCellData) do -- stores the lowest cell values in historical table - if v > 1 and v < wgt.cellDataHistoryLowest[k] then -- min 1v to consider a valid reading + if v > 1 and v < wgt.cellDataHistoryLowest[k] then + -- min 1v to consider a valid reading wgt.cellDataHistoryLowest[k] = v --- calc history lowest of all cells @@ -181,7 +217,8 @@ local function calculateBatteryData(wgt) end --- calc lowest of all cells - if v < cellMin and v > 1 then -- min 1v to consider a valid reading + if v < cellMin and v > 1 then + -- min 1v to consider a valid reading cellMin = v end --- sum of all cells @@ -197,7 +234,6 @@ local function calculateBatteryData(wgt) --- average of all cells wgt.cellAvg = wgt.cellSum / wgt.cellCount - wgt.cellPercent = getCellPercent(wgt.cellMin) wgt.cellDataLive = newCellData @@ -219,13 +255,19 @@ local function calculateBatteryData(wgt) wgt.secondaryValue = "-2" end - wgt.isDataAvailable = true + -- calculate intensive CPU data + if (periodicHasPassed(wgt.periodic1) or wgt.cellPercent == 0) then + + --wgt.cellPercent = getCellPercent(wgt, wgt.cellMin) -- use batt percentage by lowest cell voltage + wgt.cellPercent = getCellPercent(wgt, wgt.cellAvg) -- use batt percentage by average cell voltage + + periodicReset(wgt.periodic1) + end end - -- color for battery -- This function returns green at 100%, red bellow 30% and graduate in between local function getPercentColor(percent) @@ -242,34 +284,46 @@ end -- This function returns green at gvalue, red at rvalue and graduate in between local function getRangeColor(value, green_value, red_value) local range = math.abs(green_value - red_value) - if range==0 then return lcd.RGB(0, 0xdf, 0) end + if range == 0 then + return lcd.RGB(0, 0xdf, 0) + end + if value == nil then + return lcd.RGB(0, 0xdf, 0) + end if green_value > red_value then - if value > green_value then return lcd.RGB(0, 0xdf, 0) end - if value < red_value then return lcd.RGB(0xdf, 0, 0) end + if value > green_value then + return lcd.RGB(0, 0xdf, 0) + end + if value < red_value then + return lcd.RGB(0xdf, 0, 0) + end g = math.floor(0xdf * (value - red_value) / range) r = 0xdf - g return lcd.RGB(r, g, 0) else - if value > green_value then return lcd.RGB(0, 0xdf, 0) end - if value < red_value then return lcd.RGB(0xdf, 0, 0) end + if value > green_value then + return lcd.RGB(0, 0xdf, 0) + end + if value < red_value then + return lcd.RGB(0xdf, 0, 0) + end r = math.floor(0xdf * (value - green_value) / range) g = 0xdf - r return lcd.RGB(r, g, 0) end end - --- Zone size: 70x39 1/8th top bar local function refreshZoneTiny(wgt) local myString = string.format("%2.1fV", wgt.mainValue) - lcd.drawText(wgt.zone.x + wgt.zone.w -25, wgt.zone.y + 5, wgt.cellPercent .. "%", RIGHT + SMLSIZE + CUSTOM_COLOR + wgt.no_telem_blink) - lcd.drawText(wgt.zone.x + wgt.zone.w -25, wgt.zone.y + 20, myString, RIGHT + SMLSIZE + CUSTOM_COLOR + wgt.no_telem_blink) + lcd.drawText(wgt.zone.x + wgt.zone.w - 25, wgt.zone.y + 5, wgt.cellPercent .. "%", RIGHT + SMLSIZE + CUSTOM_COLOR + wgt.no_telem_blink) + lcd.drawText(wgt.zone.x + wgt.zone.w - 25, wgt.zone.y + 20, myString, RIGHT + SMLSIZE + CUSTOM_COLOR + wgt.no_telem_blink) -- draw batt lcd.drawRectangle(wgt.zone.x + 50, wgt.zone.y + 9, 16, 25, CUSTOM_COLOR, 2) - lcd.drawFilledRectangle(wgt.zone.x +50 + 4, wgt.zone.y + 7, 6, 3, CUSTOM_COLOR) + lcd.drawFilledRectangle(wgt.zone.x + 50 + 4, wgt.zone.y + 7, 6, 3, CUSTOM_COLOR) local rect_h = math.floor(25 * wgt.cellPercent / 100) - lcd.drawFilledRectangle(wgt.zone.x +50, wgt.zone.y + 9 + 25 - rect_h, 16, rect_h, CUSTOM_COLOR + wgt.no_telem_blink) + lcd.drawFilledRectangle(wgt.zone.x + 50, wgt.zone.y + 9 + 25 - rect_h, 16, rect_h, CUSTOM_COLOR + wgt.no_telem_blink) end --- Zone size: 160x32 1/8th @@ -307,13 +361,13 @@ local function refreshZoneMedium(wgt) end -- draw values - lcd.drawText(wgt.zone.x, wgt.zone.y + 35, string.format("%2.1fV", wgt.mainValue), DBLSIZE + CUSTOM_COLOR + wgt.shadowed + wgt.no_telem_blink) + lcd.drawText(wgt.zone.x + wgt.zone.w, wgt.zone.y, string.format("%2.1fV", wgt.mainValue), DBLSIZE + CUSTOM_COLOR + RIGHT + wgt.shadowed + wgt.no_telem_blink) -- more info if 1/4 is high enough (without trim & slider) if wgt.zone.h > 80 then - lcd.drawText(wgt.zone.x , wgt.zone.y + 70, string.format("%2.2fV" , wgt.secondaryValue), SMLSIZE + CUSTOM_COLOR + wgt.no_telem_blink) - lcd.drawText(wgt.zone.x + 50, wgt.zone.y + 70, string.format("dV %2.2fV", wgt.cellMax - wgt.cellMin), SMLSIZE + CUSTOM_COLOR + wgt.no_telem_blink) - lcd.drawText(wgt.zone.x , wgt.zone.y + 84, string.format("Min %2.2fV", wgt.cellDataHistoryCellLowest), SMLSIZE + CUSTOM_COLOR + wgt.no_telem_blink) + --lcd.drawText(wgt.zone.x + 50 , wgt.zone.y + 70, string.format("%2.2fV" , wgt.secondaryValue), SMLSIZE + CUSTOM_COLOR + wgt.no_telem_blink) + lcd.drawText(wgt.zone.x, wgt.zone.y + 70, string.format("dV %2.2fV", wgt.cellMax - wgt.cellMin), SMLSIZE + CUSTOM_COLOR + wgt.no_telem_blink) + lcd.drawText(wgt.zone.x, wgt.zone.y + 84, string.format("Min %2.2fV", wgt.cellDataHistoryCellLowest), SMLSIZE + CUSTOM_COLOR + wgt.no_telem_blink) end -- fill batt @@ -321,28 +375,21 @@ local function refreshZoneMedium(wgt) lcd.drawGauge(wgt.zone.x + myBatt.x, wgt.zone.y + myBatt.y, myBatt.w, myBatt.h, wgt.cellPercent, 100, CUSTOM_COLOR) -- draw cells - local cellH = wgt.zone.h / wgt.cellCount - if cellH > 20 then cellH =20 end + local cellH = 19 local cellX = 118 - local cellW = 58 + local cellW = wgt.zone.w / 3 + + local pos = { { x = 0, y = 38 }, { x = cellW, y = 38 }, { x = 2 * cellW, y = 38 }, { x = 0, y = 57 }, { x = cellW, y = 57 }, { x = 2 * cellW, y = 57 } } for i = 1, wgt.cellCount, 1 do - local cellY = wgt.zone.y + (i-1)* (cellH -1) + local cellY = wgt.zone.y + (i - 1) * (cellH - 1) -- fill current cell - lcd.setColor(CUSTOM_COLOR, getRangeColor(wgt.cellDataLive[i], wgt.cellMax, wgt.cellMax - 0.2)) --lcd.drawFilledRectangle(wgt.zone.x + cellX , cellY, 58, cellH, CUSTOM_COLOR) - local percentCurrent = getCellPercent(wgt.cellDataLive[i]) - local percentMin = getCellPercent(wgt.cellDataHistoryLowest[i]) - - lcd.drawFilledRectangle(wgt.zone.x + cellX , cellY, cellW * percentCurrent / 100, cellH, CUSTOM_COLOR) - - -- fill min - lcd.setColor(CUSTOM_COLOR, getRangeColor(wgt.cellDataHistoryLowest[i], wgt.cellMax, wgt.cellMax - 0.2)) - lcd.drawFilledRectangle(wgt.zone.x + cellX + ((percentCurrent - percentMin) / 100) , cellY, cellW - (cellW * (percentCurrent - percentMin) / 100), cellH, CUSTOM_COLOR) - + lcd.setColor(CUSTOM_COLOR, getRangeColor(wgt.cellDataLive[i], wgt.cellMax, wgt.cellMax - 0.2)) + lcd.drawFilledRectangle(wgt.zone.x + pos[i].x, wgt.zone.y + pos[i].y, cellW - 1, 20, CUSTOM_COLOR) lcd.setColor(CUSTOM_COLOR, WHITE) - lcd.drawText (wgt.zone.x + cellX + 10, cellY, string.format("%.2f", wgt.cellDataLive[i]), SMLSIZE + CUSTOM_COLOR + wgt.shadowed + wgt.no_telem_blink) - lcd.drawRectangle (wgt.zone.x + cellX , cellY, 59, cellH, CUSTOM_COLOR , 1) + lcd.drawText(wgt.zone.x + pos[i].x + 10, wgt.zone.y + pos[i].y, string.format("%.2f", wgt.cellDataLive[i]), CUSTOM_COLOR + wgt.shadowed) + lcd.drawRectangle(wgt.zone.x + pos[i].x, wgt.zone.y + pos[i].y, cellW, 20, CUSTOM_COLOR, 1) end -- draws bat @@ -447,7 +494,9 @@ end -- This function allow recording of lowest cells when widget is in background local function background(wgt) - if (wgt == nil) then return end + if (wgt == nil) then + return + end detectResetEvent(wgt) @@ -456,11 +505,21 @@ local function background(wgt) end local function refresh(wgt) - - if (wgt == nil) then return end - if (wgt.options == nil) then return end - if (wgt.zone == nil) then return end - if (wgt.options.LowestCell == nil) then return end + if (wgt == nil) then + return + end + if type(wgt) ~= "table" then + return + end + if (wgt.options == nil) then + return + end + if (wgt.zone == nil) then + return + end + if (wgt.options.LowestCell == nil) then + return + end if wgt.options.Shadow == 1 then wgt.shadowed = SHADOWED @@ -478,14 +537,17 @@ local function refresh(wgt) wgt.no_telem_blink = INVERS + BLINK end - - if wgt.zone.w > 380 and wgt.zone.h > 165 then refreshZoneXLarge(wgt) - elseif wgt.zone.w > 180 and wgt.zone.h > 145 then refreshZoneLarge(wgt) - elseif wgt.zone.w > 170 and wgt.zone.h > 65 then refreshZoneMedium(wgt) - elseif wgt.zone.w > 150 and wgt.zone.h > 28 then refreshZoneSmall(wgt) - elseif wgt.zone.w > 65 and wgt.zone.h > 35 then refreshZoneTiny(wgt) + if wgt.zone.w > 380 and wgt.zone.h > 165 then + refreshZoneXLarge(wgt) + elseif wgt.zone.w > 180 and wgt.zone.h > 145 then + refreshZoneLarge(wgt) + elseif wgt.zone.w > 170 and wgt.zone.h > 65 then + refreshZoneMedium(wgt) + elseif wgt.zone.w > 150 and wgt.zone.h > 28 then + refreshZoneSmall(wgt) + elseif wgt.zone.w > 65 and wgt.zone.h > 35 then + refreshZoneTiny(wgt) end - end -return { name="BattCheck", options=_options, create=create, update=update, background=background, refresh=refresh } +return { name = "BattCheck", options = _options, create = create, update = update, background = background, refresh = refresh } \ No newline at end of file From 741407174fc82251bed298eb85d71acf928da2a4 Mon Sep 17 00:00:00 2001 From: DanielGeA <33811722+dgatf@users.noreply.github.com> Date: Fri, 22 May 2020 18:57:07 +0100 Subject: [PATCH 363/560] Fix 7598 - Wrong Flight Mode Index when exiting from Gvar Menu (128x64 display) (#7601) Fix #7598 --- radio/src/curves.cpp | 8 ++---- radio/src/gui/128x64/gui.h | 2 +- radio/src/gui/128x64/menu_model.cpp | 1 + radio/src/gui/128x64/model_curve_edit.cpp | 26 ++++++++--------- radio/src/gui/128x64/model_flightmodes.cpp | 2 +- radio/src/gui/128x64/model_gvars.cpp | 12 ++++---- radio/src/gui/128x64/model_inputs_mixes.cpp | 4 +-- radio/src/gui/212x64/gui.h | 2 +- radio/src/gui/212x64/menu_model.cpp | 1 + radio/src/gui/212x64/model_curve_edit.cpp | 26 ++++++++--------- radio/src/gui/212x64/model_outputs.cpp | 2 +- radio/src/gui/480x272/menu_model.cpp | 1 + radio/src/gui/480x272/menus.h | 3 +- radio/src/gui/480x272/model_curves.cpp | 30 ++++++++++---------- radio/src/gui/480x272/model_outputs.cpp | 2 +- radio/src/gui/common/stdlcd/model_curves.cpp | 6 ++-- 16 files changed, 64 insertions(+), 64 deletions(-) diff --git a/radio/src/curves.cpp b/radio/src/curves.cpp index 3a1bf1f27..2606611c9 100644 --- a/radio/src/curves.cpp +++ b/radio/src/curves.cpp @@ -20,8 +20,6 @@ #include "opentx.h" -uint8_t s_curveChan; - int8_t * curveEnd[MAX_CURVES]; void loadCurves() { @@ -317,8 +315,8 @@ int applyCustomCurve(int x, uint8_t idx) point_t getPoint(uint8_t i) { point_t result = {0, 0}; - CurveInfo & crv = g_model.curves[s_curveChan]; - int8_t * points = curveAddress(s_curveChan); + CurveInfo & crv = g_model.curves[s_currIdxSubMenu]; + int8_t * points = curveAddress(s_currIdxSubMenu); bool custom = (crv.type == CURVE_TYPE_CUSTOM); uint8_t count = 5+crv.points; if (i < count) { @@ -333,5 +331,5 @@ point_t getPoint(uint8_t i) int applyCurrentCurve(int x) { - return applyCustomCurve(x, s_curveChan); + return applyCustomCurve(x, s_currIdxSubMenu); } diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h index b5ba20b5d..1e48d6746 100644 --- a/radio/src/gui/128x64/gui.h +++ b/radio/src/gui/128x64/gui.h @@ -216,7 +216,7 @@ extern uint8_t s_copyMode; extern int8_t s_copySrcRow; extern int8_t s_copyTgtOfs; extern uint8_t s_currIdx; -extern uint8_t s_curveChan; +extern uint8_t s_currIdxSubMenu; extern uint8_t s_copySrcIdx; extern uint8_t s_copySrcCh; extern int8_t s_currCh; diff --git a/radio/src/gui/128x64/menu_model.cpp b/radio/src/gui/128x64/menu_model.cpp index 4a450d143..b6f5b3bb3 100644 --- a/radio/src/gui/128x64/menu_model.cpp +++ b/radio/src/gui/128x64/menu_model.cpp @@ -45,3 +45,4 @@ void editSingleName(coord_t x, coord_t y, const char * label, char * name, uint8 } uint8_t s_currIdx; +uint8_t s_currIdxSubMenu; diff --git a/radio/src/gui/128x64/model_curve_edit.cpp b/radio/src/gui/128x64/model_curve_edit.cpp index 51294e1b3..8f606072c 100644 --- a/radio/src/gui/128x64/model_curve_edit.cpp +++ b/radio/src/gui/128x64/model_curve_edit.cpp @@ -50,8 +50,8 @@ void runPopupCurvePreset(event_t event) if (warningResult) { warningResult = 0; - CurveInfo & crv = g_model.curves[s_curveChan]; - int8_t * points = curveAddress(s_curveChan); + CurveInfo & crv = g_model.curves[s_currIdxSubMenu]; + int8_t * points = curveAddress(s_currIdxSubMenu); int k = 25 * reusableBuffer.curveEdit.preset; int dx = 2000 / (5+crv.points-1); for (uint8_t i=0; i<5+crv.points; i++) { @@ -71,14 +71,14 @@ void onCurveOneMenu(const char * result) POPUP_INPUT(STR_PRESET, runPopupCurvePreset); } else if (result == STR_MIRROR) { - CurveInfo & crv = g_model.curves[s_curveChan]; - int8_t * points = curveAddress(s_curveChan); + CurveInfo & crv = g_model.curves[s_currIdxSubMenu]; + int8_t * points = curveAddress(s_currIdxSubMenu); for (int i=0; i<5+crv.points; i++) points[i] = -points[i]; } else if (result == STR_CLEAR) { - CurveInfo & crv = g_model.curves[s_curveChan]; - int8_t * points = curveAddress(s_curveChan); + CurveInfo & crv = g_model.curves[s_currIdxSubMenu]; + int8_t * points = curveAddress(s_currIdxSubMenu); for (int i=0; i<5+crv.points; i++) points[i] = 0; if (crv.type == CURVE_TYPE_CUSTOM) { @@ -89,10 +89,10 @@ void onCurveOneMenu(const char * result) void menuModelCurveOne(event_t event) { - CurveData & crv = g_model.curves[s_curveChan]; - int8_t * points = curveAddress(s_curveChan); + CurveData & crv = g_model.curves[s_currIdxSubMenu]; + int8_t * points = curveAddress(s_currIdxSubMenu); - drawStringWithIndex(PSIZE(TR_MENUCURVES)*FW+FW, 0, STR_CV, s_curveChan+1); + drawStringWithIndex(PSIZE(TR_MENUCURVES)*FW+FW, 0, STR_CV, s_currIdxSubMenu+1); SIMPLE_SUBMENU(STR_MENUCURVES, 4 + 5+crv.points + (crv.type==CURVE_TYPE_CUSTOM ? 5+crv.points-2 : 0)); @@ -108,9 +108,9 @@ void menuModelCurveOne(event_t event) uint8_t newType = checkIncDecModelZero(event, crv.type, CURVE_TYPE_LAST); if (newType != crv.type) { for (int i = 1; i < 4 + crv.points; i++) { - points[i] = calcRESXto100(applyCustomCurve(calc100toRESX(getCurveX(5 + crv.points, i)), s_curveChan)); + points[i] = calcRESXto100(applyCustomCurve(calc100toRESX(getCurveX(5 + crv.points, i)), s_currIdxSubMenu)); } - if (moveCurve(s_curveChan, checkIncDec_Ret > 0 ? 3 + crv.points : -3 - crv.points)) { + if (moveCurve(s_currIdxSubMenu, checkIncDec_Ret > 0 ? 3 + crv.points : -3 - crv.points)) { if (newType == CURVE_TYPE_CUSTOM) { resetCustomCurveX(points, 5 + crv.points); } @@ -131,8 +131,8 @@ void menuModelCurveOne(event_t event) newPoints[0] = points[0]; newPoints[4 + count] = points[4 + crv.points]; for (int i = 1; i < 4 + count; i++) - newPoints[i] = calcRESXto100(applyCustomCurve(calc100toRESX(getCurveX(5 + count, i)), s_curveChan)); - if (moveCurve(s_curveChan, checkIncDec_Ret * (crv.type == CURVE_TYPE_CUSTOM ? 2 : 1))) { + newPoints[i] = calcRESXto100(applyCustomCurve(calc100toRESX(getCurveX(5 + count, i)), s_currIdxSubMenu)); + if (moveCurve(s_currIdxSubMenu, checkIncDec_Ret * (crv.type == CURVE_TYPE_CUSTOM ? 2 : 1))) { for (int i = 0; i < 5 + count; i++) { points[i] = newPoints[i]; if (crv.type == CURVE_TYPE_CUSTOM && i != 0 && i != 4 + count) diff --git a/radio/src/gui/128x64/model_flightmodes.cpp b/radio/src/gui/128x64/model_flightmodes.cpp index cfe15842b..b1b408b4a 100644 --- a/radio/src/gui/128x64/model_flightmodes.cpp +++ b/radio/src/gui/128x64/model_flightmodes.cpp @@ -148,7 +148,7 @@ void menuModelFlightModeOne(event_t event) drawStringWithIndex(INDENT_WIDTH, y, STR_GV, idx+1, posHorz==0 ? attr : 0); lcdDrawSizedText(4*FW, y,g_model.gvars[idx].name, LEN_GVAR_NAME, ZCHAR); if (attr && editMode>0 && posHorz==0) { - s_currIdx = sub - ITEM_MODEL_FLIGHT_MODE_GV1; + s_currIdxSubMenu = sub - ITEM_MODEL_FLIGHT_MODE_GV1; editMode = 0; pushMenu(menuModelGVarOne); } diff --git a/radio/src/gui/128x64/model_gvars.cpp b/radio/src/gui/128x64/model_gvars.cpp index 4299469fe..f2e25875a 100644 --- a/radio/src/gui/128x64/model_gvars.cpp +++ b/radio/src/gui/128x64/model_gvars.cpp @@ -64,10 +64,10 @@ enum GVarFields { void menuModelGVarOne(event_t event) { - GVarData * gvar = &g_model.gvars[s_currIdx]; + GVarData * gvar = &g_model.gvars[s_currIdxSubMenu]; - drawStringWithIndex(PSIZE(TR_GVARS)*FW+FW, 0, STR_GV, s_currIdx+1, 0); - drawGVarValue(32*FW, 0, s_currIdx, getGVarValue(s_currIdx, getFlightMode())); + drawStringWithIndex(PSIZE(TR_GVARS)*FW+FW, 0, STR_GV, s_currIdxSubMenu+1, 0); + drawGVarValue(32*FW, 0, s_currIdxSubMenu, getGVarValue(s_currIdxSubMenu, getFlightMode())); lcdDrawFilledRect(0, 0, LCD_W, FH, SOLID); SIMPLE_SUBMENU(STR_GVARS, GVAR_FIELD_LAST); @@ -92,13 +92,13 @@ void menuModelGVarOne(event_t event) case GVAR_FIELD_MIN: lcdDrawText(0, y, STR_MIN); - drawGVarValue(GVAR_2ND_COLUMN, y, s_currIdx, GVAR_MIN+gvar->min, LEFT|attr); + drawGVarValue(GVAR_2ND_COLUMN, y, s_currIdxSubMenu, GVAR_MIN+gvar->min, LEFT|attr); if (attr) gvar->min = checkIncDec(event, GVAR_MIN+gvar->min, GVAR_MIN, GVAR_MAX-gvar->max, EE_MODEL) - GVAR_MIN; break; case GVAR_FIELD_MAX: lcdDrawText(0, y, STR_MAX); - drawGVarValue(GVAR_2ND_COLUMN, y, s_currIdx, GVAR_MAX-gvar->max, LEFT|attr); + drawGVarValue(GVAR_2ND_COLUMN, y, s_currIdxSubMenu, GVAR_MAX-gvar->max, LEFT|attr); if (attr) gvar->max = GVAR_MAX - checkIncDec(event, GVAR_MAX-gvar->max, GVAR_MIN+gvar->min, GVAR_MAX, EE_MODEL); break; @@ -108,7 +108,7 @@ void menuModelGVarOne(event_t event) default: drawStringWithIndex(0, y, STR_FM, k-GVAR_FIELD_FM0); - editGVarValue(GVAR_2ND_COLUMN, y, event, s_currIdx, k-GVAR_FIELD_FM0, LEFT|attr); + editGVarValue(GVAR_2ND_COLUMN, y, event, s_currIdxSubMenu, k-GVAR_FIELD_FM0, LEFT|attr); break; } } diff --git a/radio/src/gui/128x64/model_inputs_mixes.cpp b/radio/src/gui/128x64/model_inputs_mixes.cpp index 03bdfb411..953ee64b1 100644 --- a/radio/src/gui/128x64/model_inputs_mixes.cpp +++ b/radio/src/gui/128x64/model_inputs_mixes.cpp @@ -271,7 +271,7 @@ void menuModelExpoOne(event_t event) CHECK_INCDEC_MODELVAR_ZERO(event, ed->curveParam, CURVE_BASE+MAX_CURVES-1); if (ed->curveParam) ed->curveMode = MODE_CURVE; if (ed->curveParam>=CURVE_BASE && event==EVT_KEY_LONG(KEY_ENTER)) { - s_curveChan = ed->curveParam - CURVE_BASE; + s_currIdxSubMenu = ed->curveParam - CURVE_BASE; pushMenu(menuModelCurveOne); } } @@ -442,7 +442,7 @@ void menuModelMixOne(event_t event) drawCurveName(COLUMN_X+MIXES_2ND_COLUMN, y, curveParam, attr); if (attr) { if (event==EVT_KEY_LONG(KEY_ENTER) && (curveParam<0 || curveParam>=CURVE_BASE)){ - s_curveChan = (curveParam<0 ? -curveParam-1 : curveParam-CURVE_BASE); + s_currIdxSubMenu = (curveParam<0 ? -curveParam-1 : curveParam-CURVE_BASE); pushMenu(menuModelCurveOne); } else { diff --git a/radio/src/gui/212x64/gui.h b/radio/src/gui/212x64/gui.h index 20dc6b09b..5968bd320 100644 --- a/radio/src/gui/212x64/gui.h +++ b/radio/src/gui/212x64/gui.h @@ -229,7 +229,6 @@ swsrc_t editSwitch(coord_t x, coord_t y, swsrc_t value, LcdFlags attr, event_t e void gvarWeightItem(coord_t x, coord_t y, MixData * md, LcdFlags attr, event_t event); -extern uint8_t s_curveChan; void editCurveRef(coord_t x, coord_t y, CurveRef & curve, event_t event, LcdFlags flags); extern uint8_t editNameCursorPos; @@ -247,6 +246,7 @@ extern uint8_t s_copyMode; extern int8_t s_copySrcRow; extern int8_t s_copyTgtOfs; extern uint8_t s_currIdx; +extern uint8_t s_currIdxSubMenu; extern uint8_t s_maxLines; extern uint8_t s_copySrcIdx; extern uint8_t s_copySrcCh; diff --git a/radio/src/gui/212x64/menu_model.cpp b/radio/src/gui/212x64/menu_model.cpp index 402189fb5..f8058499b 100644 --- a/radio/src/gui/212x64/menu_model.cpp +++ b/radio/src/gui/212x64/menu_model.cpp @@ -67,3 +67,4 @@ void editSingleName(coord_t x, coord_t y, const char * label, char *name, uint8_ } uint8_t s_currIdx; +uint8_t s_currIdxSubMenu; diff --git a/radio/src/gui/212x64/model_curve_edit.cpp b/radio/src/gui/212x64/model_curve_edit.cpp index 3d3b083a8..681480602 100644 --- a/radio/src/gui/212x64/model_curve_edit.cpp +++ b/radio/src/gui/212x64/model_curve_edit.cpp @@ -52,8 +52,8 @@ void runPopupCurvePreset(event_t event) if (warningResult) { warningResult = 0; - CurveInfo & crv = g_model.curves[s_curveChan]; - int8_t * points = curveAddress(s_curveChan); + CurveInfo & crv = g_model.curves[s_currIdxSubMenu]; + int8_t * points = curveAddress(s_currIdxSubMenu); int k = 25 * reusableBuffer.curveEdit.preset; int dx = 2000 / (5+crv.points-1); for (uint8_t i=0; i<5+crv.points; i++) { @@ -73,14 +73,14 @@ void onCurveOneMenu(const char * result) POPUP_INPUT(STR_PRESET, runPopupCurvePreset); } else if (result == STR_MIRROR) { - CurveInfo & crv = g_model.curves[s_curveChan]; - int8_t * points = curveAddress(s_curveChan); + CurveInfo & crv = g_model.curves[s_currIdxSubMenu]; + int8_t * points = curveAddress(s_currIdxSubMenu); for (int i=0; i<5+crv.points; i++) points[i] = -points[i]; } else if (result == STR_CLEAR) { - CurveInfo & crv = g_model.curves[s_curveChan]; - int8_t * points = curveAddress(s_curveChan); + CurveInfo & crv = g_model.curves[s_currIdxSubMenu]; + int8_t * points = curveAddress(s_currIdxSubMenu); for (int i=0; i<5+crv.points; i++) points[i] = 0; if (crv.type == CURVE_TYPE_CUSTOM) { @@ -92,10 +92,10 @@ void onCurveOneMenu(const char * result) void menuModelCurveOne(event_t event) { static uint8_t pointsOfs = 0; - CurveData & crv = g_model.curves[s_curveChan]; - int8_t * points = curveAddress(s_curveChan); + CurveData & crv = g_model.curves[s_currIdxSubMenu]; + int8_t * points = curveAddress(s_currIdxSubMenu); - drawStringWithIndex(PSIZE(TR_MENUCURVES)*FW+FW, 0, "CV", s_curveChan+1); + drawStringWithIndex(PSIZE(TR_MENUCURVES)*FW+FW, 0, "CV", s_currIdxSubMenu+1); lcdDrawText(11*FW+FW/2, 0, TR_PT "\002X\006Y"); lcdDrawFilledRect(0, 0, LCD_W, FH, SOLID, FILL_WHITE|GREY_DEFAULT); @@ -114,9 +114,9 @@ void menuModelCurveOne(event_t event) uint8_t newType = checkIncDecModelZero(event, crv.type, CURVE_TYPE_LAST); if (newType != crv.type) { for (int i = 1; i < 4 + crv.points; i++) { - points[i] = calcRESXto100(applyCustomCurve(calc100toRESX(getCurveX(5 + crv.points, i)), s_curveChan)); + points[i] = calcRESXto100(applyCustomCurve(calc100toRESX(getCurveX(5 + crv.points, i)), s_currIdxSubMenu)); } - if (moveCurve(s_curveChan, checkIncDec_Ret > 0 ? 3 + crv.points : -3 - crv.points)) { + if (moveCurve(s_currIdxSubMenu, checkIncDec_Ret > 0 ? 3 + crv.points : -3 - crv.points)) { if (newType == CURVE_TYPE_CUSTOM) { resetCustomCurveX(points, 5 + crv.points); } @@ -137,8 +137,8 @@ void menuModelCurveOne(event_t event) newPoints[0] = points[0]; newPoints[4 + count] = points[4 + crv.points]; for (int i = 1; i < 4 + count; i++) - newPoints[i] = calcRESXto100(applyCustomCurve(calc100toRESX(getCurveX(5 + count, i)), s_curveChan)); - if (moveCurve(s_curveChan, checkIncDec_Ret * (crv.type == CURVE_TYPE_CUSTOM ? 2 : 1))) { + newPoints[i] = calcRESXto100(applyCustomCurve(calc100toRESX(getCurveX(5 + count, i)), s_currIdxSubMenu)); + if (moveCurve(s_currIdxSubMenu, checkIncDec_Ret * (crv.type == CURVE_TYPE_CUSTOM ? 2 : 1))) { for (int i = 0; i < 5 + count; i++) { points[i] = newPoints[i]; if (crv.type == CURVE_TYPE_CUSTOM && i != 0 && i != 4 + count) diff --git a/radio/src/gui/212x64/model_outputs.cpp b/radio/src/gui/212x64/model_outputs.cpp index c1cd1de04..bc5f34d43 100644 --- a/radio/src/gui/212x64/model_outputs.cpp +++ b/radio/src/gui/212x64/model_outputs.cpp @@ -212,7 +212,7 @@ void menuModelLimits(event_t event) case ITEM_LIMITS_CURVE: drawCurveName(LIMITS_CURVE_POS, y, ld->curve, attr); if (attr && event==EVT_KEY_LONG(KEY_ENTER) && ld->curve>0) { - s_curveChan = (ld->curve<0 ? -ld->curve-1 : ld->curve-1); + s_currIdxSubMenu = (ld->curve<0 ? -ld->curve-1 : ld->curve-1); pushMenu(menuModelCurveOne); } if (active) { diff --git a/radio/src/gui/480x272/menu_model.cpp b/radio/src/gui/480x272/menu_model.cpp index 761bc9180..09ce6523f 100644 --- a/radio/src/gui/480x272/menu_model.cpp +++ b/radio/src/gui/480x272/menu_model.cpp @@ -151,6 +151,7 @@ void editName(coord_t x, coord_t y, char * name, uint8_t size, event_t event, ui } uint8_t s_currIdx; +uint8_t s_currIdxSubMenu; void copySelection(char * dst, const char * src, uint8_t size) { diff --git a/radio/src/gui/480x272/menus.h b/radio/src/gui/480x272/menus.h index f82baeb14..e9f4e7008 100644 --- a/radio/src/gui/480x272/menus.h +++ b/radio/src/gui/480x272/menus.h @@ -437,8 +437,6 @@ void editName(coord_t x, coord_t y, char *name, uint8_t size, event_t event, uin uint8_t editDelay(coord_t x, coord_t y, event_t event, uint8_t attr, uint8_t delay); void editCurveRef(coord_t x, coord_t y, CurveRef & curve, event_t event, LcdFlags flags); -extern uint8_t s_curveChan; - enum { WARNING_TYPE_WAIT, @@ -461,6 +459,7 @@ extern uint8_t s_copyMode; extern int8_t s_copySrcRow; extern int8_t s_copyTgtOfs; extern uint8_t s_currIdx; +extern uint8_t s_currIdxSubMenu; extern int8_t s_currCh; extern uint8_t s_copySrcIdx; extern uint8_t s_copySrcCh; diff --git a/radio/src/gui/480x272/model_curves.cpp b/radio/src/gui/480x272/model_curves.cpp index 3abf03ddb..a7f8adf29 100644 --- a/radio/src/gui/480x272/model_curves.cpp +++ b/radio/src/gui/480x272/model_curves.cpp @@ -52,8 +52,8 @@ void runPopupCurvePreset(event_t event) if (warningResult) { warningResult = 0; - CurveInfo & crv = g_model.curves[s_curveChan]; - int8_t * points = curveAddress(s_curveChan); + CurveInfo & crv = g_model.curves[s_currIdxSubMenu]; + int8_t * points = curveAddress(s_currIdxSubMenu); int k = 25 * reusableBuffer.curveEdit.preset; int dx = 2000 / (5+crv.points-1); for (uint8_t i=0; i<5+crv.points; i++) { @@ -73,14 +73,14 @@ void onCurveOneMenu(const char * result) POPUP_INPUT(STR_PRESET, runPopupCurvePreset); } else if (result == STR_MIRROR) { - CurveInfo & crv = g_model.curves[s_curveChan]; - int8_t * points = curveAddress(s_curveChan); + CurveInfo & crv = g_model.curves[s_currIdxSubMenu]; + int8_t * points = curveAddress(s_currIdxSubMenu); for (int i=0; i<5+crv.points; i++) points[i] = -points[i]; } else if (result == STR_CLEAR) { - CurveInfo & crv = g_model.curves[s_curveChan]; - int8_t * points = curveAddress(s_curveChan); + CurveInfo & crv = g_model.curves[s_currIdxSubMenu]; + int8_t * points = curveAddress(s_currIdxSubMenu); for (int i=0; i<5+crv.points; i++) points[i] = 0; if (crv.type == CURVE_TYPE_CUSTOM) { @@ -105,11 +105,11 @@ enum MenuModelCurveOneItems { bool menuModelCurveOne(event_t event) { static uint8_t pointsOfs = 0; - CurveData & crv = g_model.curves[s_curveChan]; - int8_t * points = curveAddress(s_curveChan); + CurveData & crv = g_model.curves[s_currIdxSubMenu]; + int8_t * points = curveAddress(s_currIdxSubMenu); SUBMENU_WITH_OPTIONS(STR_MENUCURVE, ICON_MODEL_CURVES, IS_COORDS1_LINE_NEEDED() ? 6 : 5, OPTION_MENU_NO_FOOTER, { 0, 0, 0, 0, uint8_t(5+crv.points-1), uint8_t(5+crv.points-1) }); - drawStringWithIndex(50, 3+FH, STR_CV, s_curveChan+1, MENU_TITLE_COLOR); + drawStringWithIndex(50, 3+FH, STR_CV, s_currIdxSubMenu+1, MENU_TITLE_COLOR); lcdDrawSolidFilledRect(0, MENU_FOOTER_TOP, 250, MENU_FOOTER_HEIGHT, HEADER_BGCOLOR); if (IS_COORDS1_LINE_NEEDED() && menuVerticalPosition == ITEM_CURVE_COORDS1) { @@ -139,9 +139,9 @@ bool menuModelCurveOne(event_t event) uint8_t newType = checkIncDecModelZero(event, crv.type, CURVE_TYPE_LAST); if (newType != crv.type) { for (int i = 1; i < 4 + crv.points; i++) { - points[i] = calcRESXto100(applyCustomCurve(calc100toRESX(-100 + i * 200 / (4 + crv.points)), s_curveChan)); + points[i] = calcRESXto100(applyCustomCurve(calc100toRESX(-100 + i * 200 / (4 + crv.points)), s_currIdxSubMenu)); } - if (moveCurve(s_curveChan, checkIncDec_Ret > 0 ? 3 + crv.points : -3 - crv.points)) { + if (moveCurve(s_currIdxSubMenu, checkIncDec_Ret > 0 ? 3 + crv.points : -3 - crv.points)) { if (newType == CURVE_TYPE_CUSTOM) { resetCustomCurveX(points, 5 + crv.points); } @@ -161,8 +161,8 @@ bool menuModelCurveOne(event_t event) newPoints[0] = points[0]; newPoints[4+count] = points[4+crv.points]; for (int i=1; i<4+count; i++) - newPoints[i] = calcRESXto100(applyCustomCurve(-RESX + (i * 2 * RESX) / (4 + count), s_curveChan)); - if (moveCurve(s_curveChan, checkIncDec_Ret*(crv.type==CURVE_TYPE_CUSTOM ? 2 :1))) { + newPoints[i] = calcRESXto100(applyCustomCurve(-RESX + (i * 2 * RESX) / (4 + count), s_currIdxSubMenu)); + if (moveCurve(s_currIdxSubMenu, checkIncDec_Ret*(crv.type==CURVE_TYPE_CUSTOM ? 2 :1))) { for (int i = 0; i < 5 + count; i++) { points[i] = newPoints[i]; if (crv.type == CURVE_TYPE_CUSTOM && i != 0 && i != 4 + count) @@ -298,7 +298,7 @@ void editCurveRef(coord_t x, coord_t y, CurveRef & curve, event_t event, LcdFlag drawCurveName(lcdNextPos+10, y, curve.value, (menuHorizontalPosition==1 ? attr : 0)); if (attr && menuHorizontalPosition==1) { if (event==EVT_KEY_LONG(KEY_ENTER) && curve.value!=0) { - s_curveChan = (curve.value<0 ? -curve.value-1 : curve.value-1); + s_currIdxSubMenu = (curve.value<0 ? -curve.value-1 : curve.value-1); pushMenu(menuModelCurveOne); } else { @@ -316,7 +316,7 @@ bool menuModelCurvesAll(event_t event) { SIMPLE_MENU(STR_MENUCURVES, MODEL_ICONS, menuTabModel, MENU_MODEL_CURVES, MAX_CURVES); - s_curveChan = menuVerticalPosition; + s_currIdxSubMenu = menuVerticalPosition; switch (event) { case EVT_KEY_BREAK(KEY_ENTER): diff --git a/radio/src/gui/480x272/model_outputs.cpp b/radio/src/gui/480x272/model_outputs.cpp index 3dd2d8f21..300f8909b 100644 --- a/radio/src/gui/480x272/model_outputs.cpp +++ b/radio/src/gui/480x272/model_outputs.cpp @@ -201,7 +201,7 @@ bool menuModelLimits(event_t event) case ITEM_LIMITS_CURVE: drawCurveName(LIMITS_CURVE_POS, y, ld->curve, attr); if (attr && event==EVT_KEY_LONG(KEY_ENTER) && ld->curve>0) { - s_curveChan = (ld->curve<0 ? -ld->curve-1 : ld->curve-1); + s_currIdxSubMenu = (ld->curve<0 ? -ld->curve-1 : ld->curve-1); pushMenu(menuModelCurveOne); } if (active) { diff --git a/radio/src/gui/common/stdlcd/model_curves.cpp b/radio/src/gui/common/stdlcd/model_curves.cpp index b650a96ab..6fd7c1d0b 100644 --- a/radio/src/gui/common/stdlcd/model_curves.cpp +++ b/radio/src/gui/common/stdlcd/model_curves.cpp @@ -60,7 +60,7 @@ void menuModelCurvesAll(event_t event) #endif case EVT_KEY_FIRST(KEY_ENTER): if (CURVE_SELECTED() && !READ_ONLY()) { - s_curveChan = sub; + s_currIdxSubMenu = sub; pushMenu(menuModelCurveOne); } break; @@ -93,7 +93,7 @@ void menuModelCurvesAll(event_t event) } if (CURVE_SELECTED()) { - s_curveChan = sub; + s_currIdxSubMenu = sub; #if LCD_W >= 212 drawCurve(23); #else @@ -142,7 +142,7 @@ void editCurveRef(coord_t x, coord_t y, CurveRef & curve, event_t event, LcdFlag drawCurveName(x, y, curve.value, flags); if (active && menuHorizontalPosition==1) { if (event==EVT_KEY_LONG(KEY_ENTER) && curve.value!=0) { - s_curveChan = (curve.value<0 ? -curve.value-1 : curve.value-1); + s_currIdxSubMenu = (curve.value<0 ? -curve.value-1 : curve.value-1); pushMenu(menuModelCurveOne); } else { From b8ff09e7e8d9e97aac784e63ff2b3ddaca3f8c8d Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 23 May 2020 06:49:12 +0200 Subject: [PATCH 364/560] Revert one of the latest changes because it doesn't compile anymore --- radio/src/targets/horus/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index 7bed170cf..b1a01e2e1 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -310,7 +310,7 @@ if(PYTHONINTERP_FOUND) add_custom_command( OUTPUT ${PROJECT_BINARY_DIR}/radio/src/datacopy.cpp WORKING_DIRECTORY ${RADIO_DIRECTORY}/src - COMMAND ${PYTHON_EXECUTABLE} ${RADIO_DIRECTORY}/util/generate_datacopy.py datastructs.h -DPCBHORUS -DPCBX10 -DCPUARM -DSTM32F4 -DSTM32F429_439xx -DCOLORLCD -DBACKUP -DSIMU -I. -Itargets/horus -Itargets/common/arm/stm32 -I${THIRDPARTY_DIR} -I${THIRDPARTY_DIR}/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/CMSIS/Device/ST/STM32F4xx/Include > ${PROJECT_BINARY_DIR}/radio/src/datacopy.cpp + COMMAND ${PYTHON_EXECUTABLE} ${RADIO_DIRECTORY}/util/generate_datacopy.py datastructs.h -DPCBHORUS -DPCBX10 -DCPUARM -DSTM32F4 -DSTM32F429_439xx -DCOLORLCD -DBACKUP -DSIMU -I. -Itargets/horus -Itargets/common/arm/stm32 -I${THIRDPARTY_DIR} -I${THIRDPARTY_DIR}/STM32F4xx_DSP_StdPeriph_Lib_V1.4.0/Libraries/CMSIS/Device/ST/STM32F4xx/Include ${arm_gcc_include_path} > ${PROJECT_BINARY_DIR}/radio/src/datacopy.cpp DEPENDS ${RADIO_DIRECTORY}/src/datastructs.h ${RADIO_DIRECTORY}/util/generate_datacopy.py ) add_custom_target(datacopy From 591d4498df600df736c24d0bcaacbb6c04dc50a4 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 23 May 2020 11:38:00 +0200 Subject: [PATCH 365/560] Add tinsize --- companion/src/firmwares/multiprotocols.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/companion/src/firmwares/multiprotocols.cpp b/companion/src/firmwares/multiprotocols.cpp index 7b13a2b19..b122ed027 100644 --- a/companion/src/firmwares/multiprotocols.cpp +++ b/companion/src/firmwares/multiprotocols.cpp @@ -75,6 +75,7 @@ static const QStringList STR_SUBTYPE_FLYZONE {"FZ-410 TX"}; static const QStringList STR_SUBTYPE_FRSKYX_RX {"D16 FCC", "D16 LBT"}; static const QStringList STR_SUBTYPE_FX816 {"P38"}; static const QStringList STR_SUBTYPE_ESKY150 {"4CH", "7CH"}; +static const QStringList STR_SUBTYPE_XK {"X450", "X420"}; static const QStringList NO_SUBTYPE {STR_MULTI_DEFAULT}; @@ -127,6 +128,7 @@ const Multiprotocols multiProtocols { {MODULE_SUBTYPE_MULTI_FX816, 0, false, STR_SUBTYPE_FX816, nullptr}, {MODULE_SUBTYPE_MULTI_HOTT, 0, true, NO_SUBTYPE, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_FRSKYX2, 3, true, STR_SUBTYPE_FRSKYX2, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_XK, 1, false, STR_SUBTYPE_XK, STR_MULTI_RFTUNE}, {MM_RF_CUSTOM_SELECTED, 7, true, STR_SUBTYPE_CUSTOM, STR_MULTI_OPTION}, // Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff) @@ -167,10 +169,10 @@ QString Multiprotocols::protocolToString(int protocol, bool custom) static const QStringList strings({ "FlySky", "Hubsan", "FrSky", "Hisky", "V2x2", "DSM", "Devo", "YD717", "KN", "SymaX", "SLT", "CX10", "CG023", "Bayang", "ESky", "MT99XX", "MJXQ", "Shenqi", "FY326", "SFHSS", "J6 PRO","FQ777","Assan","Hontai","Open LRS", - "FlySky AFHDS2A", "Q2x2", "Walkera", "Q303", "GW008", "DM002", "Cabell", "ESky 150", "H8 3D", "Corona", "CFlie", + "FlySky AFHDS2A", "Q2x2", "WK2x01", "Q303", "GW008", "DM002", "Cabell", "ESky 150", "H8 3D", "Corona", "CFlie", "Hitec", "Wfly", "Bugs", "Bugs Mini", "Traxxas", "NCC-1701-A", "E01X", "WL Heli V911S", "GD00X", "Volantex V761", "KFPlan KF606", "Redpine", "Potensic", "ZXS", "FlyZone", "Scanner", "FrSky RX", "FlySky AFHDS2A RX", "HoTT", "Fx816", - "Bayang RX", "Pelikan", "Tiger", "WK", "XN297 Dump", "FrSky X 2.1", "FrSky R9" + "Bayang RX", "Pelikan", "Tiger", "XK", "XN297 Dump", "FrSky X 2.1", "FrSky R9" }); return strings.value(protocol, CPN_STR_UNKNOWN_ITEM); From bbb76d5cc74fd2edfecf38364e1e4d666b6cafef Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 23 May 2020 14:16:31 +0200 Subject: [PATCH 366/560] Improve fonts tests --- radio/src/tests/fonts_480x272.png | Bin 9643 -> 14756 bytes radio/src/tests/lcd_480x272.cpp | 6 ++++++ radio/src/tests/primitives_480x272.png | Bin 5713 -> 5713 bytes radio/src/tests/transparency_480x272.png | Bin 5773 -> 5773 bytes 4 files changed, 6 insertions(+) diff --git a/radio/src/tests/fonts_480x272.png b/radio/src/tests/fonts_480x272.png index 3ba0dcbafa29a191f465726378c24a143053921f..c47657715dbc91385107bdf63a0efa40b0e99c1a 100644 GIT binary patch literal 14756 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 F{|orobhH2f literal 9643 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

N1iX3eKWbaSUoY# z`4lEl*vHqiki-3rT#}j;7w$$U8Fz1y#nH>?5IZ20Qe7mV$Y5MEF&6 z--DE~r@78}tcT0`d%JFZC3t<4{Wi;ew|!Jq`z(Z(ewMcU)JV&Fhn3yLg=!TthDu7& zOR@gtx)@>o<7^>o%yIrL#noox$K4Iw*ayjwFRepj zI$6lQ50;#TrkGHWicVsQ4}7&+9ki7Ua&{at(ed0A7(8h1DsjcfB5_$=dg8&x16w$P z7u<0TBYI2>I&H1keH8L$E-y*&NpF;HhQ#+FDrnVh;2Yuaj5}(@FnTYHeo5u?m5I(m zN-@s2yl-)T14&Xd!-O)wM%=+Q+uOYMMh+lY;|duV|3I z>+BlUOitST*}N}0*_7UJbu`@|3Ye|>WWzKQde+|f2J}DS-4g@b3$Qz_dtds5x2?`K zQ;9bL+gSL%g(A1&`r;_N-Il|dPFr!O?hBZYsxmF3H$|LXH4y~elv1zp{sca(+u^wq zSVW|tpqrGK!7YCZSoj$o2mAH*)2NnakNrJiuqDuK?*mub5@m;}qQuHUa2p}y&y^IE zI825_M$*w1iF+A0#wLeeD}_byXt>M4vZ#L36~>XM#%3Su0R}Y zKbr3n<@a8)Sa8w$+LcKUkeJRAcd@6UE0mKP9xinSP#oS3HalDOD|@kU9SBOyL*8Z< zvic-Oui2$g|L{c`D41Y%74}pELkpq!3c^x-r8nifl};(F zq!qo&jlH2KKjhCt`Zc@s6BY$Na$)~}dHnQ0Ka~3a{px;5oM;Z&O@PS{e9sBc*3gGy I)a+jT7Y*Kgs{jB1 diff --git a/radio/src/tests/lcd_480x272.cpp b/radio/src/tests/lcd_480x272.cpp index 769fccc5f..0127b4356 100644 --- a/radio/src/tests/lcd_480x272.cpp +++ b/radio/src/tests/lcd_480x272.cpp @@ -168,6 +168,12 @@ TEST(Lcd_480x272, fonts) lcdDrawText(30, 200, "The quick brown fox", TEXT_COLOR|VERTICAL|NO_FONTCACHE); // lcdDrawText(50, 200, "The quick brown fox jumps over the lazy dog", TEXT_COLOR|VERTICAL|NO_FONTCACHE); + lcdDrawText(50, 25, "The quick", TEXT_COLOR|TINSIZE); + lcdDrawText(50, 40, "The quick", TEXT_COLOR|SMLSIZE); + lcdDrawText(50, 55, "The quick", TEXT_COLOR|MIDSIZE); + lcdDrawText(50, 80, "The quick", TEXT_COLOR|DBLSIZE); + lcdDrawText(50, 120, "The quick", TEXT_COLOR|XXLSIZE); + lcdDrawText(8, 208, "The quick brown fox jumps over the lazy dog", TITLE_BGCOLOR|OPACITY(4)); lcdDrawText(5, 205, "The quick brown fox jumps over the lazy dog", TITLE_BGCOLOR|OPACITY(12)); diff --git a/radio/src/tests/primitives_480x272.png b/radio/src/tests/primitives_480x272.png index 68bb2f88655e889c9e3530c9de29d6945d1bcbcf..38630592fe2024e967443a5375067a711d97f717 100644 GIT binary patch delta 4628 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 Dh>Dwr delta 4633 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 diff --git a/radio/src/tests/transparency_480x272.png b/radio/src/tests/transparency_480x272.png index 2b0588eb91099c84eb5331edfa06082056dd42b4..05845c138402682c768e71045185ae4b96e02ce0 100644 GIT binary patch delta 4886 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 SJ@+KUpMyQbuIk*4KmG;FFcd@p delta 4865 zcma)Ac{H2b*VgN{Zih<;F%O@6DQ!Zuv|K}VQq_U#HP%!j4J9S zH`)?YDk_E$ZIKvSs!FOc$54VGf*9iWcCFv~{`mg--nI7o$2n)ObDrny{p|g|L}Q}y z<4*FY13%+ww@xdioD;tNw)S+mbK(T0sWaF-W|4}spg56*<9hV_Q7-;*g*t&4GocQ; zOkNm5u+m9KSX3JNjCxD-i7)U2t8v?o?Ujk6cfS5HTi@5W==t$4#jd8XytXDa0VSrF zz9o=>mG6+3tv-e`cqT32gXgKvNMiN0>X?dy|tG6)*LCVhv1mim;8adVD)2U=s3809qG}|F#SSZQ6BsvkAI5uL+%RHkjE_r9Y)U)qtU@>jtE-)XC~4s9qvWEds2t-Cot&cE~?=f{beJh#E_lI_cJ^2 zPN%MFu&xZoh({l?K7|#BL_SG_q&kNL{$qWryxyZ}oQ8 zXKTp|cVNQ1A73LP30nVb@N-s)pyQ9+i&TGE>3Vbkr6u}u8A1Ev7Z@6N+6VSI`Nq?PiqhX1n~~*Tz;kAKgkFU_PFhDeEjl@BSG zu8jVa&HQ{4Sjse`~+utXm#AG8$Af=xKQA- z;4zX{GymwhUtuEojIzC(qg4uJtdV*{9Bf|fG0DkEr;n|BI>f32!)^FN$H)UM9u>N4 zlEDaFVNJE{CG-f~LUd$c>CEEr|V6#<40+gkz9W;bgV=_RTZ6 zhbC0c^~K@EaX~X)tw*?0T%j1^!WQvGv&A?Kn6}XHM$W6dK$f`-Wg3I{3PEM{xdyTRPbjNx;1F-%8Lm-8iJ3;{z`Yh< z79D(Hv`0Pmz}xwl#bR-qiM*2ma8D(6*Q=zQQ%H`Q8`68PAX z_*t7SQQ3@5*I+!Dc$E|uL%B2<9!iAILI3SIM!BEU>OS*>=F$S(YfPwA2yECidhJ5| z%eu|R%^_5mW>hb$#ZtrCxA0isfxHyFz030U_iT9obmWV`9^o6=I~nuPM^x^zRVF#m zyM+YhzQWw<&CX0tRec?CI=0ZSnqM{CU(j8|6B=(IWsF1A>uhLk_mOeMvHg>C`nN^Kprz7_=X;Op+nBA zj;_lQBS}-EOj$_PpP#Qgs1}Ssg6k1cg?<_OO9}LV$OF-Zc~9=I1*rL6Ag7ao)Hm7_ zea0(GM)OxriVN0+joV~DLtd8=GoQixWBSJ#uDI`P5i>hL0+&=_F^E*ES~|DeK8U}< z`5qDWa%(3@{nPialtp~htfiBSa^93WEV&5?5c6B2orrfMUGc|mZK7r=F?aLQxdH&c zq;rNXa^f66CwUWL;5|qk( z)nQhRcw-EP>=x%&xpkggd2aF!vgGTy=monJJG1o~;@8aH;Y(3^g>j#X4(DT}{_6YW zxv24mL0eQwPgU%fDx`ITQ%OhBOw+_|H_3L0%|;Vg2?@J`Av^A28J2%gH|6L%1~yi{ ze9&i&2XE)H@HOSaa=fcAi1m%OY*mG1#eT_T^u~HK-pf#p?7eq0k!gR&w-g_wx&-l= z=aGdy$2gu@C-S?9$Go!KVA`7C$~6X>-qHZSn4w?yklJza)aH{4Qrog@zU%jyMwJPY zU^%8ilIcp|Gbw{X011lL*DHXMqv*4ZuYr1*J^u(uk-lSb_(%im8T^^gKToYIZ7*JYTN8Rpavzws!Ad-1d4!q5R0AEQ6T9>u2yE`=P# z{bDftlU=4}RKCOJr>U?HaB_WC~&VO6O+)#dZae)qvmk0tWi_^tR#jcxX6;&Hg2%J ziM4Hh*1m@RlVW}}5PzaQpg+3D@9IgdLvn-XK;Vz3vnX3;p%8-VLh}wJ``4Iuxh%NX z5Y4cuYLa^k==f5pk3;7swzG~0dfRIHUa)s*O)<-YR~06{@lgNyN`}7E7*Tzk5<}nv zb#W=q-$YLn|6Xj`C8kqy#Mj*UcklMCnqTc{D}1z>zE9iAffN_a^+2g5hh!Y)Ju+Xu zsrEC@l=W;PdOojak_zvd=lLaXig|6(oToC~t$sT*nt0`aj<|Kb(c_K^M1`=_sC(2s zAuQ`7m0+|WKYg{Z(lyyq-tNxiF!ws3pz|&~loo!vbY90pDd#xdV-~0&{5kiIcJ<}Q#c#>ct*%O9!Hbfa?xzESx^Oy=&%}S> zNXsUwLr(YFyym#(aeQ9-(N`Cwn9*oYTW^rtsl-%r6uC^pbV$WV5cd*26qubXGm&K~d6qpYtT#b4O>>D*LO-Db_JzJaXiSuhOty%wy8Z4OE_5=LIO*0_y zJ-eXNbIIqgAZNy#us!!#Guey8^#r9bq9&kB^N%(j_d~72O74B7ajbyD285s`%yq`? zG_8C094rP*^52@b{6TNsa^>11gP^1JOy~6z-pZGG|G*N-`c8FAOQ_<$quofCS zi&ha9^R89h7b>dfE>;x+3Xk0ykE3?yBbSp`X3yZOpPXU(HTbP3E|r`Qasvr%zptzh z|Eplk#WrZb&)xmj;mKw8efI0sT%|Ug7~&_Ih%V6{AT5$-`<67zES@8lPKNMTfUgW( z1!Jgdf4Q*Fx>i$khh{gv?&xGLt!)Sd+I&?jj@rhjtbT{P8R0C{-`t*4IB=-=khz*- z3Vs^hp1(g9G+0m`J2qs!JHp~~ckInVQ2Oyk3Ms30M}wcoLPQla=PD;w@588yoT4Hx|cOLL_6yjAkyHDD7IT)iMF z@w%=5G>ef2b!oZ38!pIKi*8wXSzXTG#77JT{*FGUB`0@ANki_*Z~yE#O^ZFH57Ak` zYGPnYO<4%Cu-Q(MFBp#9>n;;bi!vEQ!{Rpn(S@>nVzz*jDMP__m_@ zL@e!j6;yR2;ow^Imitg9-FKJV+g)ko0A(Zm>cC9H-3`j@M*cmB$%U1Pn)Rwp!z$S_ z)0l5NGw;v#Z(b5FRT1P)QxKcpS`QTEW)t-kfrJ0`Uj#Gi+<#Ke$&?qdJ=4p;x)DQh z+K#LGJKmmB82=DO$@zK%vgtvv)_p-;wU}q}zMy}5(i-Z$$=dME zUNIer_8R%)6ZtjBNT-Ip-+S(!!|7!L**7j%os>|ICWZyJbXw8_z|*O zZ_Mee4IwNYUdFP`GHxHt_MMl-CA(+L)|ZMltf7QzB5)C4jcbV7F3N+6dF;WQ-udCA zU}F_l1XgJvX^lyygN~>Idqt$i&djl2!{^wgNKt)}m{qxfA(sKJD|O^g>-W-GOgVUN zICeE@wPtVkkO07e1aKJX)3}3>P=!0Q*eKRW-{IPLH;iC zX_X@ydDgqF`#0h3J2n~a)vSDYk|Z=Pf0T|<{q4uJ9%|U}A>~(@R((5W4lkx;SINK_ z|CR75dtyJrYvk8|705e4Ao4%^cmFVLl;NoJ&3x8=0zMlcPo)G{pL%x{-Z7ZHbLb!$ z1p;fbQ9s!1e}4tz*LPzcr%>QEC-Z&CVPO1K$R;3T)vvb!_cHzdxc-*FDL4@+VneWc zXVriBs*HK9vA2)%(KsyN`~xe2wSRFR`KB@$^b6WgXwn=v{sZ6M&~%YY^YaV;dl^42 z?B From 895859e4876aa35164e76dd69fd8da2cca28db42 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sun, 24 May 2020 11:17:40 +0200 Subject: [PATCH 367/560] multi 1.3.1.1 support --- companion/src/firmwares/moduledata.h | 4 +++- radio/src/gui/128x64/model_setup.cpp | 4 ++-- radio/src/pulses/modules_constants.h | 4 +++- radio/src/telemetry/telemetry.h | 3 ++- radio/src/translations/untranslated.h | 2 +- 5 files changed, 11 insertions(+), 6 deletions(-) diff --git a/companion/src/firmwares/moduledata.h b/companion/src/firmwares/moduledata.h index 0d1d7bb6f..8ac4109e4 100644 --- a/companion/src/firmwares/moduledata.h +++ b/companion/src/firmwares/moduledata.h @@ -129,7 +129,9 @@ enum MultiModuleRFProtocols { MODULE_SUBTYPE_MULTI_PROPEL, MODULE_SUBTYPE_MULTI_FRSKYL, MODULE_SUBTYPE_MULTI_SKYARTEC, - MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_SKYARTEC + MODULE_SUBTYPE_MULTI_ESKY150V2, + MODULE_SUBTYPE_MULTI_DSM_RX, + MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_DSM_RX }; enum TrainerProtocol { diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 65c1d7a3c..4c7e72e9d 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -374,8 +374,8 @@ void menuModelSetup(event_t event) MODULE_POWER_ROW(EXTERNAL_MODULE), IF_NOT_PXX2_MODULE(EXTERNAL_MODULE, MODULE_OPTION_ROW(EXTERNAL_MODULE)), MULTIMODULE_MODULE_ROWS(EXTERNAL_MODULE) - FAILSAFE_ROWS(EXTERNAL_MODULE), - IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 1), // Range check and Register buttons + FAILSAFE_ROWS(EXTERNAL_MODULE), //ITEM_MODEL_SETUP_EXTERNAL_MODULE_FAILSAFE + IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 1), // Range check and Register buttons IF_PXX2_MODULE(EXTERNAL_MODULE, 0), // Module options IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // Receiver 1 IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // Receiver 2 diff --git a/radio/src/pulses/modules_constants.h b/radio/src/pulses/modules_constants.h index 82e53421d..52c0d5026 100644 --- a/radio/src/pulses/modules_constants.h +++ b/radio/src/pulses/modules_constants.h @@ -167,7 +167,9 @@ enum ModuleSubtypeMulti { MODULE_SUBTYPE_MULTI_PROPEL, MODULE_SUBTYPE_MULTI_FRSKYL, MODULE_SUBTYPE_MULTI_SKYARTEC, - MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_SKYARTEC + MODULE_SUBTYPE_MULTI_ESKY150V2, + MODULE_SUBTYPE_MULTI_DSM_RX, + MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_DSM_RX }; #define MODULE_SUBTYPE_MULTI_XN297DP 63-3 diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index c92e722f0..506b949a5 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -111,7 +111,8 @@ extern uint8_t telemetryProtocol; #define IS_D16_MULTI(module) (((g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKY) && (g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16 || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_8CH || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_CLONED)) \ || (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKYX2)) #define IS_HOTT_MULTI(module) (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_HOTT) - #define IS_RX_MULTI(module) ((g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_AFHDS2A_RX) || (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKYX_RX) || (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_BAYANG_RX)) + #define IS_RX_MULTI(module) ((g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_AFHDS2A_RX) || (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKYX_RX) \ + || (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_BAYANG_RX) || (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_DSM_RX)) #if defined(HARDWARE_INTERNAL_MODULE) #define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT || (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE && (IS_D16_MULTI(INTERNAL_MODULE)||IS_D16_MULTI(EXTERNAL_MODULE)))) #else diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h index b558eaa72..ff62c7f1d 100644 --- a/radio/src/translations/untranslated.h +++ b/radio/src/translations/untranslated.h @@ -125,4 +125,4 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\007" -#define TR_MULTI_PROTOCOLS "FlySky\0""Hubsan\0""FrSky\0 ""Hisky\0 ""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0 ""KN\0 ""SymaX\0 ""SLT\0 ""CX10\0 ""CG023\0 ""Bayang\0""ESky\0 ""MT99XX\0""MJXq\0 ""Shenqi\0""FY326\0 ""SFHSS\0 ""J6 Pro\0""FQ777\0 ""Assan\0 ""Hontai\0""OpenLrs""FSky 2A""Q2x2\0 ""Walkera""Q303\0 ""GW008\0 ""DM002\0 ""Cabell\0""Esky150""H8 3D\0 ""Corona\0""CFlie\0 ""Hitec\0 ""WFly\0 ""Bugs\0 ""BugMini""Traxxas""NCC1701""E01X\0 ""V911S\0 ""GD00X\0 ""V761\0 ""KF606\0 ""Redpine""Potensi""ZSX\0 ""FlyZone""Scanner""FrSkyRX""FS2A_RX""HoTT\0 ""FX816\0 ""BayangR""Pelikan""Tiger\0 ""XK\0 ""XN297DU""FrSkyX2""FrSkyR9""Propel\0""FrSkyL\0""Skyartec" +#define TR_MULTI_PROTOCOLS "FlySky\0""Hubsan\0""FrSky\0 ""Hisky\0 ""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0 ""KN\0 ""SymaX\0 ""SLT\0 ""CX10\0 ""CG023\0 ""Bayang\0""ESky\0 ""MT99XX\0""MJXq\0 ""Shenqi\0""FY326\0 ""SFHSS\0 ""J6 Pro\0""FQ777\0 ""Assan\0 ""Hontai\0""OpenLrs""FSky 2A""Q2x2\0 ""Walkera""Q303\0 ""GW008\0 ""DM002\0 ""Cabell\0""Esky150""H8 3D\0 ""Corona\0""CFlie\0 ""Hitec\0 ""WFly\0 ""Bugs\0 ""BugMini""Traxxas""NCC1701""E01X\0 ""V911S\0 ""GD00X\0 ""V761\0 ""KF606\0 ""Redpine""Potensi""ZSX\0 ""FlyZone""Scanner""FrSkyRX""FS2A_RX""HoTT\0 ""FX816\0 ""BayangR""Pelikan""Tiger\0 ""XK\0 ""XN297DU""FrSkyX2""FrSkyR9""Propel\0""FrSkyL\0""Skyarte""ESky-v2""DSM RX\0" From 14cd03a93a1238d703be8966be00b8af81b2b796 Mon Sep 17 00:00:00 2001 From: MRC3742 Date: Tue, 26 May 2020 01:30:57 -0400 Subject: [PATCH 368/560] Additional MPM 1.3.1.1 support updates (#7635) --- companion/src/firmwares/moduledata.h | 3 +- companion/src/firmwares/multiprotocols.cpp | 48 ++++++++++++++-------- radio/src/gui/gui_common.cpp | 38 +++++++++++------ radio/src/pulses/modules_constants.h | 3 +- radio/src/translations/untranslated.h | 2 +- 5 files changed, 63 insertions(+), 31 deletions(-) diff --git a/companion/src/firmwares/moduledata.h b/companion/src/firmwares/moduledata.h index 8ac4109e4..1df7380a1 100644 --- a/companion/src/firmwares/moduledata.h +++ b/companion/src/firmwares/moduledata.h @@ -131,7 +131,8 @@ enum MultiModuleRFProtocols { MODULE_SUBTYPE_MULTI_SKYARTEC, MODULE_SUBTYPE_MULTI_ESKY150V2, MODULE_SUBTYPE_MULTI_DSM_RX, - MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_DSM_RX + MODULE_SUBTYPE_MULTI_JJRC345, + MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_JJRC345 }; enum TrainerProtocol { diff --git a/companion/src/firmwares/multiprotocols.cpp b/companion/src/firmwares/multiprotocols.cpp index b122ed027..4feeb997f 100644 --- a/companion/src/firmwares/multiprotocols.cpp +++ b/companion/src/firmwares/multiprotocols.cpp @@ -39,8 +39,7 @@ static const QStringList STR_SUBTYPE_CUSTOM ({ }); static const QStringList STR_SUBTYPE_FLYSKY {"Standard", "V9x9", "V6x6", "V912", "CX20"}; static const QStringList STR_SUBTYPE_HUBSAN {"H107", "H301", "H501"}; -static const QStringList STR_SUBTYPE_FRSKY {"D16", "D8", "D16 8ch", "V8", "D16 EU-LBT", "D16 EU-LBT 8ch"}; -static const QStringList STR_SUBTYPE_FRSKYX2 {"D16", "D16 8ch", "D16 EU-LBT", "D16 EU-LBT 8ch"}; +static const QStringList STR_SUBTYPE_FRSKY {"D16", "D8", "D16 8ch", "V8", "D16 EU-LBT", "D16 EU-LBT 8ch", "D8 Cloned", "D16 Cloned"}; static const QStringList STR_SUBTYPE_HISKY {"Standard", "HK310"}; static const QStringList STR_SUBTYPE_V2X2 {"Standard", "JXD506"}; static const QStringList STR_SUBTYPE_DSM {"DSM2 22ms", "DSM2 11ms", "DSMX 22ms", "DSMX 11ms"}; @@ -52,6 +51,7 @@ static const QStringList STR_SUBTYPE_SLT {"V1 (6 Channel)", "V2 (8 Channel static const QStringList STR_SUBTYPE_CX10 {"Green", "Blue", "DM007", "-", "JC3015a", "JC3015b", "MK33041"}; static const QStringList STR_SUBTYPE_CG023 {"Standard", "YD829"}; static const QStringList STR_SUBTYPE_BAYANG {"Standard", "H8S3D", "X16 AH", "IRDRONE", "DHD D4"}; +static const QStringList STR_SUBTYPE_ESky {"Standard", "ET4"}; static const QStringList STR_SUBTYPE_MT99 {"MT99", "H7", "YZ", "LS", "FY805"}; static const QStringList STR_SUBTYPE_MJXQ {"WLH08", "X600", "X800", "H26D", "E010", "H26WH", "Phoenix"}; static const QStringList STR_SUBTYPE_FY326 {"Standard", "FY319"}; @@ -61,21 +61,29 @@ static const QStringList STR_SUBTYPE_Q2X2 {"Q222", "Q242", "Q282"}; static const QStringList STR_SUBTYPE_WK2x01 {"WK2801", "WK2401", "W6_5_1", "W6_6_1", "W6_HEL", "W6_HEL_I"}; static const QStringList STR_SUBTYPE_Q303 {"Standard", "CX35", "CX10D", "CX10WD"}; static const QStringList STR_SUBTYPE_CABELL {"Cabell V3", "Cab V3 Telem", "-", "-", "-", "-", "Set FailSafe", "Unbind"}; +static const QStringList STR_SUBTYPE_ESKY150 {"4 Channel", "7 Channel"}; static const QStringList STR_SUBTYPE_H83D {"H8 Mini 3D", "H20H", "H20 Mini", "H30 Mini"}; static const QStringList STR_SUBTYPE_CORONA {"Corona V1", "Corona V2", "Flydream V3"}; static const QStringList STR_SUBTYPE_HITEC {"Optima", "Optima Hub Telem", "Minima"}; -static const QStringList STR_SUBTYPE_TRAXXAS {"6519 RX"}; +static const QStringList STR_SUBTYPE_WFLY {"WFR0xS"}; static const QStringList STR_SUBTYPE_BUGS_MINI {"Standard", "Bugs 3H"}; +static const QStringList STR_SUBTYPE_TRAXXAS {"6519 RX"}; static const QStringList STR_SUBTYPE_E01X {"E012", "E015", "E016H"}; +static const QStringList STR_SUBTYPE_V911S {"Standard", "E119"}; static const QStringList STR_SUBTYPE_GD00X {"GD V1", "GD V2"}; static const QStringList STR_SUBTYPE_REDPINE {"Fast", "Slow"}; static const QStringList STR_SUBTYPE_POTENSIC {"A20 Firefly"}; static const QStringList STR_SUBTYPE_ZSX {"JJRC ZSX-280"}; static const QStringList STR_SUBTYPE_FLYZONE {"FZ-410 TX"}; -static const QStringList STR_SUBTYPE_FRSKYX_RX {"D16 FCC", "D16 LBT"}; +static const QStringList STR_SUBTYPE_FRSKYX_RX {"RX", "Clone TX"}; static const QStringList STR_SUBTYPE_FX816 {"P38"}; -static const QStringList STR_SUBTYPE_ESKY150 {"4CH", "7CH"}; static const QStringList STR_SUBTYPE_XK {"X450", "X420"}; +static const QStringList STR_SUBTYPE_XN297DUMP {"250K", "1M", "2M", "AUTO"}; +static const QStringList STR_SUBTYPE_FRSKYX2 {"D16", "D16 8ch", "D16 EU-LBT", "D16 EU-LBT 8ch", "D16 Cloned"}; +static const QStringList STR_SUBTYPE_FRSKYR9 {"915 MHz", "868 MHz", "915 MHz 8-Channel", "868 MHz 8-Channel"}; +static const QStringList STR_SUBTYPE_PROPEL {"74-Z"}; +static const QStringList STR_SUBTYPE_FRSKYL {"LR12", "LR12 6-Channel"}; +static const QStringList STR_SUBTYPE_ESKY150V2 {"150 V2"}; static const QStringList NO_SUBTYPE {STR_MULTI_DEFAULT}; @@ -85,7 +93,7 @@ static const QStringList NO_SUBTYPE {STR_MULTI_DEFAULT}; const Multiprotocols multiProtocols { {MODULE_SUBTYPE_MULTI_FLYSKY, 4, false, STR_SUBTYPE_FLYSKY, nullptr}, {MODULE_SUBTYPE_MULTI_HUBSAN, 2, false, STR_SUBTYPE_HUBSAN, STR_MULTI_VIDFREQ}, - {MODULE_SUBTYPE_MULTI_FRSKY, 5, false, STR_SUBTYPE_FRSKY, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_FRSKY, 7, false, STR_SUBTYPE_FRSKY, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_HISKY, 1, false, STR_SUBTYPE_HISKY, nullptr}, {MODULE_SUBTYPE_MULTI_V2X2, 1, false, STR_SUBTYPE_V2X2, nullptr}, {MODULE_SUBTYPE_MULTI_DSM2, 3, false, STR_SUBTYPE_DSM, nullptr}, @@ -93,14 +101,16 @@ const Multiprotocols multiProtocols { {MODULE_SUBTYPE_MULTI_YD717, 4, false, STR_SUBTYPE_YD717, nullptr}, {MODULE_SUBTYPE_MULTI_KN, 1, false, STR_SUBTYPE_KN, nullptr}, {MODULE_SUBTYPE_MULTI_SYMAX, 1, false, STR_SUBTYPE_SYMAX, nullptr}, - {MODULE_SUBTYPE_MULTI_SLT, 4, false, STR_SUBTYPE_SLT, nullptr}, + {MODULE_SUBTYPE_MULTI_SLT, 4, false, STR_SUBTYPE_SLT, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_CX10, 6, false, STR_SUBTYPE_CX10, nullptr}, {MODULE_SUBTYPE_MULTI_CG023, 1, false, STR_SUBTYPE_CG023, nullptr}, {MODULE_SUBTYPE_MULTI_BAYANG, 4, false, STR_SUBTYPE_BAYANG, STR_MULTI_TELEMETRY}, + {MODULE_SUBTYPE_MULTI_ESky, 1, false, STR_SUBTYPE_ESky, nullptr}, {MODULE_SUBTYPE_MULTI_MT99XX, 4, false, STR_SUBTYPE_MT99, nullptr}, {MODULE_SUBTYPE_MULTI_MJXQ, 6, false, STR_SUBTYPE_MJXQ, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_FY326, 1, false, STR_SUBTYPE_FY326, nullptr}, {MODULE_SUBTYPE_MULTI_SFHSS, 0, true, NO_SUBTYPE, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_J6PRO, 0, false, NO_SUBTYPE, nullptr}, {MODULE_SUBTYPE_MULTI_HONTAI, 3, false, STR_SUBTYPE_HONTAI, nullptr}, {MODULE_SUBTYPE_MULTI_OLRS, 0, false, NO_SUBTYPE, STR_MULTI_RFPOWER}, {MODULE_SUBTYPE_MULTI_FS_AFHDS2A, 3, true, STR_SUBTYPE_AFHDS2A, STR_MULTI_SERVOFREQ}, @@ -108,27 +118,32 @@ const Multiprotocols multiProtocols { {MODULE_SUBTYPE_MULTI_WK_2X01, 5, false, STR_SUBTYPE_WK2x01, nullptr}, {MODULE_SUBTYPE_MULTI_Q303, 3, false, STR_SUBTYPE_Q303, nullptr}, {MODULE_SUBTYPE_MULTI_CABELL, 7, false, STR_SUBTYPE_CABELL, STR_MULTI_OPTION}, + {MODULE_SUBTYPE_MULTI_ESKY150, 1, false, STR_SUBTYPE_ESKY150, nullptr}, {MODULE_SUBTYPE_MULTI_H83D, 3, false, STR_SUBTYPE_H83D, nullptr}, {MODULE_SUBTYPE_MULTI_CORONA, 2, false, STR_SUBTYPE_CORONA, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_HITEC, 2, false, STR_SUBTYPE_HITEC, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_WFLY, 0, false, STR_SUBTYPE_WFLY, nullptr}, {MODULE_SUBTYPE_MULTI_BUGS_MINI, 1, false, STR_SUBTYPE_BUGS_MINI, nullptr}, {MODULE_SUBTYPE_MULTI_TRAXXAS, 0, false, STR_SUBTYPE_TRAXXAS, nullptr}, {MODULE_SUBTYPE_MULTI_E01X, 2, false, STR_SUBTYPE_E01X, STR_MULTI_OPTION}, - {MODULE_SUBTYPE_MULTI_V911S, 0, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_GD00X, 1, false, STR_SUBTYPE_GD00X, nullptr}, + {MODULE_SUBTYPE_MULTI_V911S, 1, false, STR_SUBTYPE_V911S, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_GD00X, 1, false, STR_SUBTYPE_GD00X, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_KF606, 0, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_REDPINE, 1, false, STR_SUBTYPE_REDPINE, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_POTENSIC, 0, false, STR_SUBTYPE_POTENSIC, nullptr}, {MODULE_SUBTYPE_MULTI_ZSX, 0, false, STR_SUBTYPE_ZSX, nullptr}, {MODULE_SUBTYPE_MULTI_FLYZONE, 0, false, STR_SUBTYPE_FLYZONE, nullptr}, {MODULE_SUBTYPE_MULTI_FRSKYX_RX, 1, false, STR_SUBTYPE_FRSKYX_RX, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_ESky, 0, false, NO_SUBTYPE, nullptr}, - {MODULE_SUBTYPE_MULTI_J6PRO, 0, false, NO_SUBTYPE, nullptr}, - {MODULE_SUBTYPE_MULTI_ESKY150, 1, false, STR_SUBTYPE_ESKY150, nullptr}, - {MODULE_SUBTYPE_MULTI_FX816, 0, false, STR_SUBTYPE_FX816, nullptr}, {MODULE_SUBTYPE_MULTI_HOTT, 0, true, NO_SUBTYPE, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_FRSKYX2, 3, true, STR_SUBTYPE_FRSKYX2, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_FX816, 0, false, STR_SUBTYPE_FX816, nullptr}, {MODULE_SUBTYPE_MULTI_XK, 1, false, STR_SUBTYPE_XK, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_XN297DUMP, 3, false, STR_SUBTYPE_XN297DUMP, nullptr}, + {MODULE_SUBTYPE_MULTI_FRSKYX2, 4, true, STR_SUBTYPE_FRSKYX2, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_FRSKY_R9, 3, true, STR_SUBTYPE_FRSKYR9, nullptr}, + {MODULE_SUBTYPE_MULTI_PROPEL, 0, false, STR_SUBTYPE_PROPEL, nullptr}, + {MODULE_SUBTYPE_MULTI_FRSKYL, 1, false, STR_SUBTYPE_FRSKYL, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_SKYARTEC, 0, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_ESKY150V2, 0, false, STR_SUBTYPE_ESKY150V2, STR_MULTI_RFTUNE}, {MM_RF_CUSTOM_SELECTED, 7, true, STR_SUBTYPE_CUSTOM, STR_MULTI_OPTION}, // Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff) @@ -171,8 +186,9 @@ QString Multiprotocols::protocolToString(int protocol, bool custom) "Bayang", "ESky", "MT99XX", "MJXQ", "Shenqi", "FY326", "SFHSS", "J6 PRO","FQ777","Assan","Hontai","Open LRS", "FlySky AFHDS2A", "Q2x2", "WK2x01", "Q303", "GW008", "DM002", "Cabell", "ESky 150", "H8 3D", "Corona", "CFlie", "Hitec", "Wfly", "Bugs", "Bugs Mini", "Traxxas", "NCC-1701-A", "E01X", "WL Heli V911S", "GD00X", "Volantex V761", - "KFPlan KF606", "Redpine", "Potensic", "ZXS", "FlyZone", "Scanner", "FrSky RX", "FlySky AFHDS2A RX", "HoTT", "Fx816", - "Bayang RX", "Pelikan", "Tiger", "XK", "XN297 Dump", "FrSky X 2.1", "FrSky R9" + "KFPlan KF606", "Redpine", "Potensic", "ZSX", "FlyZone", "Scanner", "FrSky RX", "FlySky AFHDS2A RX", "HoTT", "Fx816", + "Bayang RX", "Pelikan", "Tiger", "XK", "XN297 Dump", "FrSky X 2.1", "FrSky R9", "Propel", "FrSky L", "Skyartec", + "ESky 150v2", "DSM RX", "JJRC345" }); return strings.value(protocol, CPN_STR_UNKNOWN_ITEM); diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index 69e954b03..1cbf5dcc2 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -853,7 +853,6 @@ int convertMultiToOtx(int type) const char STR_SUBTYPE_FLYSKY[] = "\004""Std\0""V9x9""V6x6""V912""CX20"; const char STR_SUBTYPE_HUBSAN[] = "\004""H107""H301""H501"; const char STR_SUBTYPE_FRSKY[] = "\011""D16\0 ""D8\0 ""D16 8ch\0 ""V8\0 ""LBT(EU)\0 ""LBT 8ch\0 ""D8Cloned\0""D16Cloned"; -const char STR_SUBTYPE_FRSKYX2[] = "\011""D16\0 ""D16 8ch\0 ""LBT(EU)\0 ""LBT 8ch\0 ""D16Cloned"; const char STR_SUBTYPE_HISKY[] = "\005""Std\0 ""HK310"; const char STR_SUBTYPE_V2X2[] = "\006""Std\0 ""JXD506"; const char STR_SUBTYPE_DSM[] = "\006""2 22ms""2 11ms""X 22ms""X 11ms"; @@ -865,6 +864,7 @@ const char STR_SUBTYPE_SLT[] = "\006""V1_6ch""V2_8ch""Q100\0 ""Q200\0 ""M const char STR_SUBTYPE_CX10[] = "\007""Green\0 ""Blue\0 ""DM007\0 ""-\0 ""JC3015a""JC3015b""MK33041"; const char STR_SUBTYPE_CG023[] = "\005""Std\0 ""YD829"; const char STR_SUBTYPE_BAYANG[] = "\007""Std\0 ""H8S3D\0 ""X16 AH\0""IRDrone""DHD D4"; +const char STR_SUBTYPE_ESky[] = "\003""Std""ET4"; const char STR_SUBTYPE_MT99[] = "\006""MT99\0 ""H7\0 ""YZ\0 ""LS\0 ""FY805"; const char STR_SUBTYPE_MJXQ[] = "\007""WLH08\0 ""X600\0 ""X800\0 ""H26D\0 ""E010\0 ""H26WH\0 ""Phoenix"; const char STR_SUBTYPE_FY326[] = "\005""Std\0 ""FY319"; @@ -874,21 +874,29 @@ const char STR_SUBTYPE_Q2X2[] = "\004""Q222""Q242""Q282"; const char STR_SUBTYPE_WK2x01[] = "\006""WK2801""WK2401""W6_5_1""W6_6_1""W6_HeL""W6_HeI"; const char STR_SUBTYPE_Q303[] = "\006""Std\0 ""CX35\0 ""CX10D\0""CX10WD"; const char STR_SUBTYPE_CABELL[] = "\007""V3\0 ""V3 Telm""-\0 ""-\0 ""-\0 ""-\0 ""F-Safe\0""Unbind\0"; +const char STR_SUBTYPE_ESKY150[] = "\003""4ch""7ch"; const char STR_SUBTYPE_H83D[] = "\007""Std\0 ""H20H\0 ""H20Mini""H30Mini"; const char STR_SUBTYPE_CORONA[] = "\005""V1\0 ""V2\0 ""FD V3"; const char STR_SUBTYPE_HITEC[] = "\007""Optima\0""Opt Hub""Minima\0"; +const char STR_SUBTYPE_WFLY[] = "\006""WFR0xS"; const char STR_SUBTYPE_BUGS_MINI[] = "\006""Std\0 ""Bugs3H"; const char STR_SUBTYPE_TRAXXAS[] = "\004""6519"; const char STR_SUBTYPE_E01X[] = "\005""E012\0""E015\0""E016H"; +const char STR_SUBTYPE_V911S[] = "\004""Std\0""E119"; const char STR_SUBTYPE_GD00X[] = "\005""GD_V1""GD_V2"; const char STR_SUBTYPE_REDPINE[] = "\004""Fast""Slow"; const char STR_SUBTYPE_POTENSIC[] = "\003""A20"; const char STR_SUBTYPE_ZSX[] = "\007""280JJRC"; const char STR_SUBTYPE_FLYZONE[] = "\005""FZ410"; +const char STR_SUBTYPE_FRSKYX_RX[] = "\007""RX\0 ""CloneTX"; const char STR_SUBTYPE_FX816[] = "\003""P38"; -const char STR_SUBTYPE_ESKY150[] = "\003""4CH""7CH"; +const char STR_SUBTYPE_XK[] = "\004""X450""X420"; +const char STR_SUBTYPE_XN297DUMP[] = "\004""250K""1M\0 ""2M\0 ""AUTO"; +const char STR_SUBTYPE_FRSKYX2[] = "\011""D16\0 ""D16 8ch\0 ""LBT(EU)\0 ""LBT 8ch\0 ""D16Cloned"; +const char STR_SUBTYPE_FRSKYR9[] = "\007""915MHz\0""868MHz\0""915 8ch""868 8ch"; +const char STR_SUBTYPE_PROPEL[] = "\004""74-Z"; const char STR_SUBTYPE_FRSKYL[] = "\010""LR12\0 ""LR12 6ch"; -const char STR_SUBTYPE_FRSKYR9[] = "\x07""915MHz\0""868MHz\0""915 8ch""868 8ch"; +const char STR_SUBTYPE_ESKY150V2[] = "\006""150 V2"; const char* mm_options_strings::options[] = { nullptr, @@ -914,14 +922,16 @@ const mm_protocol_definition multi_protocols[] = { {MODULE_SUBTYPE_MULTI_YD717, 4, false, false, STR_SUBTYPE_YD717, nullptr}, {MODULE_SUBTYPE_MULTI_KN, 1, false, false, STR_SUBTYPE_KN, nullptr}, {MODULE_SUBTYPE_MULTI_SYMAX, 1, false, false, STR_SUBTYPE_SYMAX, nullptr}, - {MODULE_SUBTYPE_MULTI_SLT, 4, false, true, STR_SUBTYPE_SLT, nullptr}, + {MODULE_SUBTYPE_MULTI_SLT, 4, false, true, STR_SUBTYPE_SLT, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_CX10, 6, false, false, STR_SUBTYPE_CX10, nullptr}, {MODULE_SUBTYPE_MULTI_CG023, 1, false, false, STR_SUBTYPE_CG023, nullptr}, {MODULE_SUBTYPE_MULTI_BAYANG, 4, false, false, STR_SUBTYPE_BAYANG, STR_MULTI_TELEMETRY}, + {MODULE_SUBTYPE_MULTI_ESky, 1, false, true, STR_SUBTYPE_ESky, nullptr}, {MODULE_SUBTYPE_MULTI_MT99XX, 4, false, false, STR_SUBTYPE_MT99, nullptr}, {MODULE_SUBTYPE_MULTI_MJXQ, 6, false, false, STR_SUBTYPE_MJXQ, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_FY326, 1, false, false, STR_SUBTYPE_FY326, nullptr}, {MODULE_SUBTYPE_MULTI_SFHSS, 0, true, true, NO_SUBTYPE, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_J6PRO, 0, false, true, NO_SUBTYPE, nullptr}, {MODULE_SUBTYPE_MULTI_HONTAI, 3, false, false, STR_SUBTYPE_HONTAI, nullptr}, {MODULE_SUBTYPE_MULTI_OLRS, 0, false, false, NO_SUBTYPE, STR_RFPOWER}, {MODULE_SUBTYPE_MULTI_FS_AFHDS2A, 3, true, true, STR_SUBTYPE_AFHDS2A, STR_MULTI_SERVOFREQ}, @@ -929,28 +939,32 @@ const mm_protocol_definition multi_protocols[] = { {MODULE_SUBTYPE_MULTI_WK_2X01, 5, false, true, STR_SUBTYPE_WK2x01, nullptr}, {MODULE_SUBTYPE_MULTI_Q303, 3, false, false, STR_SUBTYPE_Q303, nullptr}, {MODULE_SUBTYPE_MULTI_CABELL, 7, false, false, STR_SUBTYPE_CABELL, STR_MULTI_OPTION}, + {MODULE_SUBTYPE_MULTI_ESKY150, 1, false, false, STR_SUBTYPE_ESKY150, nullptr}, {MODULE_SUBTYPE_MULTI_H83D, 3, false, false, STR_SUBTYPE_H83D, nullptr}, {MODULE_SUBTYPE_MULTI_CORONA, 2, false, false, STR_SUBTYPE_CORONA, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_HITEC, 2, false, false, STR_SUBTYPE_HITEC, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_WFLY, 0, false, false, STR_SUBTYPE_WFLY, nullptr}, {MODULE_SUBTYPE_MULTI_BUGS_MINI, 1, false, false, STR_SUBTYPE_BUGS_MINI, nullptr}, {MODULE_SUBTYPE_MULTI_TRAXXAS, 0, false, false, STR_SUBTYPE_TRAXXAS, nullptr}, {MODULE_SUBTYPE_MULTI_E01X, 2, false, false, STR_SUBTYPE_E01X, STR_MULTI_OPTION}, + {MODULE_SUBTYPE_MULTI_V911S, 1, false, false, STR_SUBTYPE_V911S, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_GD00X, 1, false, false, STR_SUBTYPE_GD00X, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_KF606, 0, false, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_REDPINE, 1, false, false, STR_SUBTYPE_REDPINE, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_POTENSIC, 0, false, false, STR_SUBTYPE_POTENSIC, nullptr}, {MODULE_SUBTYPE_MULTI_ZSX, 0, false, false, STR_SUBTYPE_ZSX, nullptr}, {MODULE_SUBTYPE_MULTI_FLYZONE, 0, false, false, STR_SUBTYPE_FLYZONE, nullptr}, - {MODULE_SUBTYPE_MULTI_FRSKYX_RX, 0, false, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_ESky, 0, false, true, NO_SUBTYPE, nullptr}, - {MODULE_SUBTYPE_MULTI_J6PRO, 0, false, true, NO_SUBTYPE, nullptr}, - {MODULE_SUBTYPE_MULTI_ESKY150, 1, false, false, STR_SUBTYPE_ESKY150, nullptr}, - {MODULE_SUBTYPE_MULTI_FX816, 0, false, false, STR_SUBTYPE_FX816, nullptr}, + {MODULE_SUBTYPE_MULTI_FRSKYX_RX, 1, false, false, STR_SUBTYPE_FRSKYX_RX, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_HOTT, 0, true, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_FX816, 0, false, false, STR_SUBTYPE_FX816, nullptr}, + {MODULE_SUBTYPE_MULTI_XK, 1, false, false, STR_SUBTYPE_XK, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_XN297DUMP, 3, false, false, STR_SUBTYPE_XN297DUMP, STR_MULTI_RFCHAN}, {MODULE_SUBTYPE_MULTI_FRSKYX2, 4, true, false, STR_SUBTYPE_FRSKYX2, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_FRSKY_R9, 4, true, false, STR_SUBTYPE_FRSKYR9, nullptr}, - {MODULE_SUBTYPE_MULTI_PROPEL, 0, false, false, NO_SUBTYPE, nullptr}, - {MODULE_SUBTYPE_MULTI_FRSKYL, 1, false, false, STR_SUBTYPE_FRSKYL, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_FRSKY_R9, 3, true, false, STR_SUBTYPE_FRSKYR9, nullptr}, + {MODULE_SUBTYPE_MULTI_PROPEL, 0, false, false, STR_SUBTYPE_PROPEL, nullptr}, + {MODULE_SUBTYPE_MULTI_FRSKYL, 1, false, false, STR_SUBTYPE_FRSKYL, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_SKYARTEC, 0, false, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_ESKY150V2, 0, false, true, STR_SUBTYPE_ESKY150V2, STR_MULTI_RFTUNE}, {MM_RF_CUSTOM_SELECTED, 7, true, true, NO_SUBTYPE, STR_MULTI_OPTION}, // Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff) diff --git a/radio/src/pulses/modules_constants.h b/radio/src/pulses/modules_constants.h index 52c0d5026..829d35c32 100644 --- a/radio/src/pulses/modules_constants.h +++ b/radio/src/pulses/modules_constants.h @@ -169,7 +169,8 @@ enum ModuleSubtypeMulti { MODULE_SUBTYPE_MULTI_SKYARTEC, MODULE_SUBTYPE_MULTI_ESKY150V2, MODULE_SUBTYPE_MULTI_DSM_RX, - MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_DSM_RX + MODULE_SUBTYPE_MULTI_JJRC345, + MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_JJRC345 }; #define MODULE_SUBTYPE_MULTI_XN297DP 63-3 diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h index ff62c7f1d..d737b7c5e 100644 --- a/radio/src/translations/untranslated.h +++ b/radio/src/translations/untranslated.h @@ -125,4 +125,4 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\007" -#define TR_MULTI_PROTOCOLS "FlySky\0""Hubsan\0""FrSky\0 ""Hisky\0 ""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0 ""KN\0 ""SymaX\0 ""SLT\0 ""CX10\0 ""CG023\0 ""Bayang\0""ESky\0 ""MT99XX\0""MJXq\0 ""Shenqi\0""FY326\0 ""SFHSS\0 ""J6 Pro\0""FQ777\0 ""Assan\0 ""Hontai\0""OpenLrs""FSky 2A""Q2x2\0 ""Walkera""Q303\0 ""GW008\0 ""DM002\0 ""Cabell\0""Esky150""H8 3D\0 ""Corona\0""CFlie\0 ""Hitec\0 ""WFly\0 ""Bugs\0 ""BugMini""Traxxas""NCC1701""E01X\0 ""V911S\0 ""GD00X\0 ""V761\0 ""KF606\0 ""Redpine""Potensi""ZSX\0 ""FlyZone""Scanner""FrSkyRX""FS2A_RX""HoTT\0 ""FX816\0 ""BayangR""Pelikan""Tiger\0 ""XK\0 ""XN297DU""FrSkyX2""FrSkyR9""Propel\0""FrSkyL\0""Skyarte""ESky-v2""DSM RX\0" +#define TR_MULTI_PROTOCOLS "FlySky\0""Hubsan\0""FrSky\0 ""Hisky\0 ""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0 ""KN\0 ""SymaX\0 ""SLT\0 ""CX10\0 ""CG023\0 ""Bayang\0""ESky\0 ""MT99XX\0""MJXq\0 ""Shenqi\0""FY326\0 ""SFHSS\0 ""J6 Pro\0""FQ777\0 ""Assan\0 ""Hontai\0""OpenLrs""FlSky2A""Q2x2\0 ""Walkera""Q303\0 ""GW008\0 ""DM002\0 ""Cabell\0""Esky150""H8 3D\0 ""Corona\0""CFlie\0 ""Hitec\0 ""WFly\0 ""Bugs\0 ""BugMini""Traxxas""NCC1701""E01X\0 ""V911S\0 ""GD00X\0 ""V761\0 ""KF606\0 ""Redpine""Potensi""ZSX\0 ""FlyZone""Scanner""FrSkyRX""FS2A_RX""HoTT\0 ""FX816\0 ""BayanRX""Pelikan""Tiger\0 ""XK\0 ""XN297DU""FrSkyX2""FrSkyR9""Propel\0""FrSkyL\0""Skyarte""ESky-v2""DSM RX\0""JJRC345" From 8de1ff9151901bb4ab2b563658987ce28e24a6b2 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 26 May 2020 17:28:20 +0200 Subject: [PATCH 369/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index c3e8483ea..e3aae024e 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1734,3 +1734,4 @@ Mike Frizell MeCodeGoodSomeday Timothy Fry John Beech +Wojciech Winiarski From f0a1c65d952a7d7df32ca075dfba8d0251163a1d Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 27 May 2020 07:24:11 +0200 Subject: [PATCH 370/560] Add some plural audio units. This fixes #7636 --- radio/util/tts_it.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/util/tts_it.py b/radio/util/tts_it.py index ea6223801..2b87dd911 100755 --- a/radio/util/tts_it.py +++ b/radio/util/tts_it.py @@ -14,9 +14,9 @@ systemSounds.append(("mila", filename(101))) systemSounds.append(("mille", filename(102))) for i, s in enumerate(["virgola", "un", "e", "meno", "ora", "ore", "minuto", "minuti", "secondo", "secondi"]): systemSounds.append((s, filename(103 + i))) -for i, (s, f) in enumerate([("volt", "volt0"), - ("ampere", "amp0"), - ("milliampere", "mamp0"), +for i, (s, f) in enumerate([("volt", "volt0"),("volt", "volt1"), + ("ampere", "amp0"),("ampere", "amp1"), + ("milliampere", "mamp0"),("milliampere", "mamp1"), ("nodo", "knot0"), ("nodi", "knot1"), ("metri al secondo", "mps0"), ("metri al secondo", "msp1"), ("piedi al secondo", "fps0"), ("piedi al secondo", "fps1"), From 82b13ebe3f4cc25227c0d99e8ab2fd0f45c0e03a Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 27 May 2020 07:35:25 +0200 Subject: [PATCH 371/560] TX16S internal gps option (#7632) --- .../src/firmwares/opentx/opentxinterface.cpp | 4 +++- radio/src/options.h | 3 +++ radio/src/targets/horus/CMakeLists.txt | 6 +++-- radio/src/targets/horus/board.cpp | 1 + radio/src/targets/horus/gps_driver.cpp | 12 ++++++++-- radio/src/targets/horus/hal.h | 24 +++++++++++++++++-- radio/util/fwoptions.py | 1 + 7 files changed, 44 insertions(+), 7 deletions(-) diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index fa02be60a..150352da8 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -1357,8 +1357,10 @@ void registerOpenTxFirmwares() /* Radiomaster TX16S board */ firmware = new OpenTxFirmware("opentx-tx16s", Firmware::tr("Radiomaster TX16s / TX16s Hall / TX16s Masterfire"), BOARD_RADIOMASTER_TX16S); addOpenTxFrskyOptions(firmware); - firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module")); addOpenTxRfOptions(firmware, FLEX); + static const Firmware::Option opt_bt("bluetooth", Firmware::tr("Support for bluetooth module")); + static const Firmware::Option opt_internal_gps("internalgps", Firmware::tr("Support internal GPS")); + firmware->addOptionsGroup({opt_bt, opt_internal_gps}); registerOpenTxFirmware(firmware); /* 9XR-Pro */ diff --git a/radio/src/options.h b/radio/src/options.h index 2afb1596b..e8bf634c1 100644 --- a/radio/src/options.h +++ b/radio/src/options.h @@ -53,6 +53,9 @@ static const char * options[] = { #if defined(HORUS_STICKS) "horussticks", #endif +#if defined(INTERNAL_GPS) + "internalgps", +#endif #if defined(INTERNAL_MODULE_PPM) "internalppm", #endif diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index b1a01e2e1..dfa235baa 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -61,13 +61,15 @@ if (PCB STREQUAL X10) add_definitions(-DRADIO_FAMILY_T16) option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" ON) option(BLUETOOTH "Support for bluetooth module" OFF) + option(INTERNAL_GPS "Support for internal ublox GPS" OFF) set(HARDWARE_TOUCH YES) set(USB_CHARGER YES) set(DEFAULT_THEME "DARKBLUE") set(AUX_SERIAL ON) - if (NOT BLUETOOTH) + if (NOT BLUETOOTH AND NOT INTERNAL_GPS) set(AUX2_SERIAL ON) endif() + set(INTERNAL_GPS_BAUDRATE "9600" CACHE STRING "Baud rate for internal GPS") else() set(FLAVOUR x10) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON) @@ -94,7 +96,6 @@ elseif (PCB STREQUAL X12S) ${TARGET_SRC} audio_spi_driver.cpp x12s_adc_driver.cpp - gps_driver.cpp ) set(BITMAPS_TARGET x12s_bitmaps) set(FONTS_TARGET x12s_fonts) @@ -199,6 +200,7 @@ endif() if(INTERNAL_GPS) set(SRC ${SRC} gps.cpp) + set(TARGET_SRC ${TARGET_SRC} gps_driver.cpp) add_definitions(-DINTERNAL_GPS) message("Horus: Internal GPS enabled") endif() diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp index 25c0cbbdf..49a0f13f7 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -150,6 +150,7 @@ void boardInit() BT_RCC_APB2Periph | AUX_SERIAL_RCC_APB2Periph | AUX2_SERIAL_RCC_APB2Periph | + GPS_RCC_APB2Periph | BACKLIGHT_RCC_APB2Periph, ENABLE); diff --git a/radio/src/targets/horus/gps_driver.cpp b/radio/src/targets/horus/gps_driver.cpp index 7a5e464c4..0e165b978 100644 --- a/radio/src/targets/horus/gps_driver.cpp +++ b/radio/src/targets/horus/gps_driver.cpp @@ -33,8 +33,8 @@ void gpsInit(uint32_t baudrate) NVIC_InitTypeDef NVIC_InitStructure; // RX and TX pins - GPIO_PinAFConfig(GPIOA, GPS_TX_GPIO_PinSource, GPS_GPIO_AF); - GPIO_PinAFConfig(GPIOA, GPS_RX_GPIO_PinSource, GPS_GPIO_AF); + GPIO_PinAFConfig(GPS_UART_GPIO, GPS_TX_GPIO_PinSource, GPS_GPIO_AF); + GPIO_PinAFConfig(GPS_UART_GPIO, GPS_RX_GPIO_PinSource, GPS_GPIO_AF); GPIO_InitStructure.GPIO_Pin = (GPS_TX_GPIO_PIN | GPS_RX_GPIO_PIN); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; @@ -58,6 +58,14 @@ void gpsInit(uint32_t baudrate) NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); + +#if defined(GPS_PWR_GPIO) + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_InitStructure.GPIO_Pin = GPS_PWR_GPIO_PIN; + GPIO_Init(GPS_PWR_GPIO, &GPIO_InitStructure); + GPIO_SetBits(GPS_PWR_GPIO, GPS_PWR_GPIO_PIN); +#endif } #if defined(DEBUG) diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index b0d2042ae..5e7cd04c2 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -418,7 +418,7 @@ #define AUX_SERIAL_RCC_APB2Periph 0 #endif -#if defined(RADIO_TX16S) && !defined(BLUETOOTH) +#if defined(AUX2_SERIAL) #define AUX2_SERIAL_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_DMA2) #define AUX2_SERIAL_RCC_APB1Periph 0 #define AUX2_SERIAL_RCC_APB2Periph RCC_APB2Periph_USART6 @@ -435,6 +435,24 @@ #define AUX2_SERIAL_DMA_Channel_RX DMA_Channel_5 #define AUX2_SERIAL_PWR_GPIO GPIOB #define AUX2_SERIAL_PWR_GPIO_PIN GPIO_Pin_0 // PB.00 +#elif defined(RADIO_TX16S) && defined(INTERNAL_GPS) + #define GPS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOG) + #define GPS_RCC_APB1Periph 0 + #define GPS_RCC_APB2Periph RCC_APB2Periph_USART6 + #define GPS_USART USART6 + #define GPS_GPIO_AF GPIO_AF_USART6 + #define GPS_USART_IRQn USART6_IRQn + #define GPS_USART_IRQHandler USART6_IRQHandler + #define GPS_UART_GPIO GPIOG + #define GPS_TX_GPIO_PIN GPIO_Pin_14 // PG.14 + #define GPS_RX_GPIO_PIN GPIO_Pin_9 // PG.09 + #define GPS_TX_GPIO_PinSource GPIO_PinSource14 + #define GPS_RX_GPIO_PinSource GPIO_PinSource9 + #define GPS_PWR_GPIO GPIOB + #define GPS_PWR_GPIO_PIN GPIO_Pin_0 // PB.00 + #define AUX2_SERIAL_RCC_AHB1Periph 0 + #define AUX2_SERIAL_RCC_APB1Periph 0 + #define AUX2_SERIAL_RCC_APB2Periph 0 #else #define AUX2_SERIAL_RCC_AHB1Periph 0 #define AUX2_SERIAL_RCC_APB1Periph 0 @@ -900,6 +918,7 @@ #if defined(PCBX12S) #define GPS_RCC_AHB1Periph RCC_AHB1Periph_GPIOA #define GPS_RCC_APB1Periph RCC_APB1Periph_UART4 + #define GPS_RCC_APB2Periph 0 #define GPS_USART UART4 #define GPS_GPIO_AF GPIO_AF_UART4 #define GPS_USART_IRQn UART4_IRQn @@ -909,9 +928,10 @@ #define GPS_RX_GPIO_PIN GPIO_Pin_1 // PA.01 #define GPS_TX_GPIO_PinSource GPIO_PinSource0 #define GPS_RX_GPIO_PinSource GPIO_PinSource1 -#else +#elif !defined(INTERNAL_GPS) #define GPS_RCC_AHB1Periph 0 #define GPS_RCC_APB1Periph 0 + #define GPS_RCC_APB2Periph 0 #endif #endif // _HAL_H_ diff --git a/radio/util/fwoptions.py b/radio/util/fwoptions.py index 811ff17b7..8ee448f11 100755 --- a/radio/util/fwoptions.py +++ b/radio/util/fwoptions.py @@ -234,4 +234,5 @@ options_radiomaster_tx16s = { "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), "bluetooth": ("BLUETOOTH", "YES", "NO"), + "internalgps": ("INTERNAL_GPS", "YES", "NO"), } \ No newline at end of file From b324145d10c5ea2153390160e93fe3c7e96e6801 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 27 May 2020 12:28:21 +0200 Subject: [PATCH 372/560] Update CREDITS.txt --- CREDITS.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/CREDITS.txt b/CREDITS.txt index e3aae024e..b7ce3cb68 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -423,7 +423,6 @@ Pablo Gomez Martinez Alan Thoren Jack Clodfelter William Simon -James Houck Peter Fithern Thomas Svedman TechFixPros @@ -688,7 +687,6 @@ Shaun Currier Danilo Schiara John Hennig RK Custom Homes -James Houck Piet Teekens Tommy Widenflycht Johan Petrus Theophilus From 92396f4767d7cb7598935a8c8b1af092df0234a8 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 29 May 2020 14:40:50 +0200 Subject: [PATCH 373/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index b7ce3cb68..c8e43f756 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1733,3 +1733,4 @@ MeCodeGoodSomeday Timothy Fry John Beech Wojciech Winiarski +Armin Kuepfer From 8ebc4fa8917a7bf698ee74dbb372919638645624 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Charpentier?= Date: Fri, 29 May 2020 18:06:16 +0200 Subject: [PATCH 374/560] Updated French translation (#7640) * Initial state. * Updated French Translation. --- companion/src/translations/companion_fr.ts | 708 ++++++++++++++------- 1 file changed, 492 insertions(+), 216 deletions(-) diff --git a/companion/src/translations/companion_fr.ts b/companion/src/translations/companion_fr.ts index c8d06c20f..fff65e6d9 100644 --- a/companion/src/translations/companion_fr.ts +++ b/companion/src/translations/companion_fr.ts @@ -903,50 +903,65 @@ Manche Droit: Profondeur, Direction - + + Delete Channel. Are you sure? + Supprimer la Voie. Êtes-vous sûr? + + + Copy Copier - + Cut Couper - + Paste Coller - + Clear Effacer - + Insert Insérer - + Delete Supprimer - + Move Up Monter - + Move Down Descendre - + Clear All Effacer Tout + + + Clear Channel. Are you sure? + Effacer la Voie. Êtes-vous sûr? + + + + Clear all Channels. Are you sure? + Effacer toutes les Voies. Êtes-vous sûr? + ChecklistDialog @@ -1361,7 +1376,7 @@ Si vous avez un fichier de sauvegarde des paramètres, vous pouvez l'import CurveData - + CV CB @@ -1501,77 +1516,107 @@ Si vous avez un fichier de sauvegarde des paramètres, vous pouvez l'import Nom de la courbe - + Curve %1 Courbe %1 - + Popup menu available Menu contextuel disponible - + %1 points - + Linear Linéaire - + Single Expo Expo simple - + Symmetrical f(x)=-f(-x) Symétrique f(x)=-f(-x) - + Symmetrical f(x)=f(-x) Symétrique f(x)=f(-x) - + Copy Copier - + + Cut + Couper + + + Paste Coller - + Clear Effacer - - Clear all curves - Effacer toutes les courbes + + Insert + Insérer - - Are you sure you want to reset curve %1? - Etes-vous sûr de vouloir effacer la courbe %1 ? + + Delete + Supprimer - - Are you sure you want to reset all curves? - Etes-vous sûr de vouloir effacer toutes les courbes ? + + Move Up + Monter - + + Move Down + Descendre + + + + Clear All + Effacer Tout + + + + Clear Curve. Are you sure? + Effacer la Courbe. Êtes-vous sûr? + + + + Clear all Curves. Are you sure? + Effacer toutes les Courbes. Êtes-vous sûr? + + + + Delete Curve. Are you sure? + Supprimer la Courbe. Êtes-vous sûr? + + + Editing curve %1 Édition de la courbe %1 - + Not enough free points in EEPROM to store the curve. Pas assez de points disponibles en mémoire pour enregistrer la courbe. @@ -1871,70 +1916,85 @@ Si vous avez un fichier de sauvegarde des paramètres, vous pouvez l'import %1 - + + Delete Special Function. Are you sure? + Supprimer la Fonction Spéciale. Êtes-vous sûr? + + + Copy Copier - + Cut Couper - + Paste Coller - + Clear Effacer - + Insert Insérer - + Delete Supprimer - + Move Up Monter - + Move Down Descendre - + Clear All Effacer Tout - + Value Valeur - + Source Source - + GVAR VG - + Increment Incrément + + + Clear Special Function. Are you sure? + Effacer la Fonction Spéciale. Êtes-vous sûr? + + + + Clear all Special Functions. Are you sure? + Supprimer toutes les Fonctions Spéciales. Êtes-vous sûr? + CustomizeSplashDialog @@ -2877,274 +2937,279 @@ Blanc signifie "inclure tous".Les métacaractères ?, * et [...] sont Firmware - + Channel values displayed in us Positions de voies affichées en µs - + No OverrideCH functions available Désactive la fonction spéciale "Remplacer VOIExx" - + Possibility to enable FAI MODE (no telemetry) at field Possibilité d'activer le mode FAI (télémétrie désactivée) sur le terrain - + FAI MODE (no telemetry) always enabled Mode FAI (télémétrie toujours désactivée) - + Removes D8 FrSky protocol support which is not legal for use in the EU on radios sold after Jan 1st, 2015 Masque le protocole D8. Légalement obligatoire sur les radios Européennes importées après le 1er janvier 2015 - - + + Disable HELI menu and cyclic mix support Supprimer le menu HELICO et les mixages cycliques - - + + Disable Global variables Supprimer le support des variables globales - - + + Enable Lua custom scripts screen Activer l'écran des scripts Lua personnalisés - + Support for PPM internal module hack Support du remplacement du module interne par un module PPM - + Use alternative SQT5 font Utiliser la police alternative SQT5 - - + + Disable RAS (SWR) Désactiver le RAS (SWR). Utile uniquement pour les X9D+ avec un RAS/SWR non fonctionnel - + Pots use in menus navigation Support de la navigation dans les menus avec les POTS - + FrSky Taranis X9D+ - + FrSky Taranis X9D+ 2019 - + FrSky Taranis X9D - + Haptic module installed Module vibreur installé - + FrSky Taranis X9E - + Confirmation before radio shutdown Confirmation avant l'arrêt de la radio - + Horus gimbals installed (Hall sensors) Manches Horus à effet HALL installés - + FrSky Taranis X9-Lite - + FrSky Taranis X9-Lite S - + FrSky Taranis X7 / X7S - + FrSky Taranis X7 / X7S Access - + FrSky Taranis X-Lite S/PRO - + FrSky Taranis X-Lite - + FrSky Horus X10 / X10S - - + + Support for ACCESS internal module replacement Prise en charge du module de remplacement interne ACCESS - + FrSky Horus X10 Express / X10S Express - + FrSky Horus X12S - + Use ONLY with first DEV pcb version Exclusivement pour les Horus DEV - - + + Support for MULTI internal module Prise en charge du module MULTI interne - - + + Support for bluetooth module Prise en charge du module Bluetooth - + Radiomaster TX16s / TX16s Hall / TX16s Masterfire - + + Support internal GPS + Prise en charge du GPS interne + + + Turnigy 9XR-PRO - + Enable HELI menu and cyclic mix support Activer le menu hélico et les mixages CCPM - + Global variables Variables globales - + Enable non certified firmwares Activer les firmwares non certifiés - + In model setup menus automatically set source by moving the control Sélectionner les sources des mixeurs en bougeant le contrôle désiré - + In model setup menus automatically set switch by moving the control Sélectionner les interrupteurs en bougeant le contrôle désiré - + No graphical check boxes and sliders Pas de cases à cocher et de curseurs graphiques - + Battery graph Graphique de la batterie - + Don't use bold font for highlighting active items Ne pas mettre les lignes actives en gras - + Turnigy 9XR with m128 chip Turnigy 9XR avec une puce m128 - + Turnigy 9XR - + 9X with stock board 9X avec carte mère d'origine - + Enable resetting values by pressing up and down at the same time Permet la remise à zéro des valeurs en pressant haut-bas en même temps, valeur min avec gauche/bas, valeur max avec haut/droite, inversion avec gauche/droite - + 9X with stock board and m128 chip Carte 9x avec un chip m128 - + 9X with AR9X board 9X avec carte AR9X - + Jumper T12 / T12 Pro - + Jumper T16 / T16+ / T16 Pro - + 9X with Sky9x board 9X avec carte Sky9x - + 9X with Gruvin9x board 9X avec carte Gruvin9x - + DIY MEGA2560 radio Radio DIY à base de MEGA2560 @@ -3633,7 +3698,7 @@ Vous utilisez actuellement: FlightModeData - + FM PV @@ -3641,122 +3706,200 @@ Vous utilisez actuellement: FlightModePanel - + Rotary Encoder %1 Sélecteur Rotatif %1 - + Name Nom - + Value source Source valeur - + Value Valeur - + Unit - + Prec - + Min Min - + Max Max - + GVAR%1 VG%1 - + + Warning: Global variable links back to itself. Flight Mode 0 value used. + Avertissement: la Variable Globale boucle sur elle-même. La Phase de Vol 0 est utilisée. + + + + Warning: Rotary encoder links back to itself. Flight Mode 0 value used. + Avertissement: le Sélecteur Rotatif boucle sur lui-même. La Phase de Vol 0 est utilisée. + + + + + Copy + Copier + + + + + Cut + Couper + + + + + Paste + Coller + + + + + Insert + Insérer + + + + + Delete + Supprimer + + + + + Move Up + Monter + + + + + Move Down + Descendre + + + + + Clear All + Effacer Tout + + + + Clear Flight Mode. Are you sure? + Effacer la Phase de Vol. Êtes-vous sûr? + + + + Clear all Flight Modes. Are you sure? + Effacer toutes les Phases de Vol. Êtes-vous sûr? + + + + Delete Flight Mode. Are you sure? + Supprimer la Phase de Vol. Êtes-vous sûr? + + + + Clear selected Global Variable across all Flight Modes. Are you sure? + Effacer les Variables Globales selectionnées à travers toutes les Phases de Vol. Êtes-vous sûr? + + + + Clear all Global Variables for all Flight Modes. Are you sure? + Effacer toutes les Variables Globales pour toutes les Phases de Vol. Êtes-vous sûr? + + + + Clear all Global Variables for this Flight Mode. Are you sure? + Effacer toutes les Variables Globales pour cette Phase de Vol. Êtes-vous sûr? + + + Popup enabled Indication activée - + + Popup menu available Menu contextuel disponible - + Trim disabled Trim désactivé - + Own Trim Valeur indépendante - + Use Trim from Flight mode %1 Utiliser le trim de la phase de vol %1 - + Use Trim from Flight mode %1 + Own Trim as an offset Utiliser le trim de la phase de vol %1 + une valeur indépendante additionnée - + 0._ - + 0.0 - - - &Clear - &Effacer - - - - + + Clear Effacer - - - Clear all current Flight Mode properties? - Effacer tout les modes de vols ? - FlightModesPanel - + Flight Mode %1 Phase de vol %1 - + (%1) - + (default) (par défaut) @@ -5582,25 +5725,27 @@ Cette fonction ne peut pas être désactivée sur la radio. InputsPanel - + + Move Up Monter - + Ctrl+Up Ctrl+Haut - + + Move Down Descendre - + Ctrl+Down Ctrl+Bas @@ -5610,110 +5755,141 @@ Cette fonction ne peut pas être désactivée sur la radio. Effacer toutes les entrées - - Not enough available inputs! - Pas assez d'entrées disponibles ! + + Not enough available Inputs! + Pas assez d'Entrées disponibles! - - Delete Selected Inputs? - Supprimer les entrées sélectionnées ? + + Delete selected Inputs. Are you sure? + Supprimer les Entrées selectionnés. Êtes-vous sûr? - + + Lines + Linéaire + + + &Add &Ajouter - + Ctrl+A Ctrl+A - + &Edit &Édition - + Enter Entrée - + &Delete &Supprimer - + + Delete Supprimer - + &Copy &Copier - + Ctrl+C - + &Cut &Couper - + Ctrl+X - + &Paste &Coller - + Ctrl+V - + Du&plicate Du&pliquer - + Ctrl+U - - Clear Inputs? - Effacer toutes les entrées ? + + Input + Entrée - - Really clear all the inputs? - Voulez-vous vraiment effacer toutes les entrées ? + + Insert + Insérer + + + + Clear + Effacer + + + + Clear All + Effacer Tout + + + + Clear all Inputs. Are you sure? + Effacer toutes les Entrées. Êtes-vous sûr? + + + + Clear Input. Are you sure? + Effacer l'Entrée. Êtes-vous sûr? + + + + Delete Input. Are you sure? + Supprimer l'Entrée. Êtes-vous sûr? LimitData - + INV - + NOR - + CH VOIE @@ -5852,69 +6028,104 @@ Cette fonction ne peut pas être désactivée sur la radio. LogicalSwitchesPanel - + V1 - + V2 - + Duration Durée - + Delay Délai - + Function Fonction - + AND Switch ET supplémentaire - + Popup menu available Menu contextuel disponible - + (instant) - + (infinite) (infini) - - &Delete - &Supprimer - - - - &Copy - &Copier - - - - &Cut - &Couper + + Delete Logical Switch. Are you sure? + Supprimer l'Interrupteur Logique. Êtes-vous sûr? - &Paste - &Coller + Copy + Copier + + + + Cut + Couper + + + + Paste + Coller + + + + Clear + Effacer + + + + Insert + Insérer + + + + Delete + Supprimer + + + + Move Up + Monter + + + + Move Down + Descendre + + + + Clear All + Effacer Tout + + + + Clear all Logical Switches. Are you sure? + Effacer tous les Interrupteurs Logiques. Êtes-vous sûr? @@ -7457,12 +7668,12 @@ Enregistrer les changements ? MixData - + MIX - + (@%1) @@ -7857,12 +8068,12 @@ Mixage actif par défaut si non-renseigné. ModelData - + Model: Modèle: - + Throttle Source Source des gaz @@ -8998,12 +9209,12 @@ Mixage actif par défaut si non-renseigné. ModuleData - + Positive - + Negative Négative @@ -9084,47 +9295,47 @@ Mixage actif par défaut si non-renseigné. ModulePanel - + Value Valeur - + Hold Maintien - + No Pulse Pas d'impulsion - + Ask Demander - + Internal Interne - + Internal + External Interne + Externe - + External Externe - + Autodetect Format Format Détection auto - + Bind on channel Bind avec VOIE @@ -11075,25 +11286,90 @@ Si cette option est cochée, la voie des gaz est inversée: le ralenti est &apo SetupPanel - + + Popup menu available + Menu contextuel disponible + + + Timer %1 Chrono %1 - + THR GAZ - + Profile Settings Paramètres du profil - + SD structure path not specified or invalid Chemin de la structure SD non spécifié ou invalide + + + Copy + Copier + + + + Cut + Couper + + + + Paste + Coller + + + + Clear + Effacer + + + + Insert + Insérer + + + + Delete + Supprimer + + + + Move Up + Monter + + + + Move Down + Descendre + + + + Clear All + Effacer Tout + + + + Clear Timer. Are you sure? + Effacer le Chrono. Êtes-vous sûr? + + + + Clear all Timers. Are you sure? + Effacer tous les Chronos. Êtes-vous sûr? + + + + Delete Timer. Are you sure? + Supprimer le Chrono. Êtes-vous sûr? + SimpleTailPage @@ -13410,12 +13686,12 @@ hh:mm:ss TimerData - + TMR - + Timer %1 Chrono %1 From 3504a4bb40811bf10cc16bb29213f73447d8027f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 30 May 2020 10:51:26 +0200 Subject: [PATCH 375/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index c8e43f756..1f743164c 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1734,3 +1734,4 @@ Timothy Fry John Beech Wojciech Winiarski Armin Kuepfer +Alain Bregand From e3c97723cd7267ddeec80ff2387b1aaefa88eba4 Mon Sep 17 00:00:00 2001 From: DanielGeA Date: Sat, 30 May 2020 11:00:46 +0100 Subject: [PATCH 376/560] Fix 7641 (#7642) --- radio/src/gui/128x64/model_logical_switches.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/model_logical_switches.cpp b/radio/src/gui/128x64/model_logical_switches.cpp index 0ce6bb44b..c07be3c72 100644 --- a/radio/src/gui/128x64/model_logical_switches.cpp +++ b/radio/src/gui/128x64/model_logical_switches.cpp @@ -259,7 +259,7 @@ void menuModelLogicalSwitches(event_t event) LogicalSwitchData * cs = lswAddress(sub); if (cs->func) s_currIdx = sub; - POPUP_MENU_ADD_ITEM(STR_EDIT); + if (sub >=0) POPUP_MENU_ADD_ITEM(STR_EDIT); if (cs->func || cs->v1 || cs->v2 || cs->delay || cs->duration || cs->andsw) POPUP_MENU_ADD_ITEM(STR_COPY); if (clipboard.type == CLIPBOARD_TYPE_CUSTOM_SWITCH) From 100a405a835d9836844418aba25e9d6d26fb4244 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 30 May 2020 12:02:22 +0200 Subject: [PATCH 377/560] Cosmetics --- radio/src/gui/128x64/model_logical_switches.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/model_logical_switches.cpp b/radio/src/gui/128x64/model_logical_switches.cpp index c07be3c72..b0acc2ae4 100644 --- a/radio/src/gui/128x64/model_logical_switches.cpp +++ b/radio/src/gui/128x64/model_logical_switches.cpp @@ -254,12 +254,13 @@ void menuModelLogicalSwitches(event_t event) uint8_t k = 0; int8_t sub = menuVerticalPosition - HEADER_LINE; - if (event==EVT_KEY_FIRST(KEY_ENTER)) { + if (event == EVT_KEY_FIRST(KEY_ENTER)) { killEvents(event); LogicalSwitchData * cs = lswAddress(sub); if (cs->func) s_currIdx = sub; - if (sub >=0) POPUP_MENU_ADD_ITEM(STR_EDIT); + if (sub >= 0) + POPUP_MENU_ADD_ITEM(STR_EDIT); if (cs->func || cs->v1 || cs->v2 || cs->delay || cs->duration || cs->andsw) POPUP_MENU_ADD_ITEM(STR_COPY); if (clipboard.type == CLIPBOARD_TYPE_CUSTOM_SWITCH) From d6c0ae4645b8ffb77bf21b777f185cbc4e7bb880 Mon Sep 17 00:00:00 2001 From: DanielGeA Date: Sat, 30 May 2020 11:06:37 +0100 Subject: [PATCH 378/560] Fix 6853 (#7643) --- radio/src/gui/128x64/model_curve_edit.cpp | 3 +++ radio/src/gui/212x64/model_curve_edit.cpp | 3 +++ radio/src/gui/480x272/model_curves.cpp | 3 +++ 3 files changed, 9 insertions(+) diff --git a/radio/src/gui/128x64/model_curve_edit.cpp b/radio/src/gui/128x64/model_curve_edit.cpp index 8f606072c..2dfdaf567 100644 --- a/radio/src/gui/128x64/model_curve_edit.cpp +++ b/radio/src/gui/128x64/model_curve_edit.cpp @@ -125,6 +125,9 @@ void menuModelCurveOne(event_t event) lcdDrawNumber(INDENT_WIDTH, 6*FH+1, 5+crv.points, LEFT|attr); lcdDrawText(lcdLastRightPos, 6*FH+1, STR_PTS, attr); if (attr) { +#if defined(ROTARY_ENCODER_NAVIGATION) + rotencSpeed = ROTENC_LOWSPEED; +#endif int8_t count = checkIncDecModel(event, crv.points, -3, 12); // 2pts - 17pts if (checkIncDec_Ret) { int8_t newPoints[MAX_POINTS_PER_CURVE]; diff --git a/radio/src/gui/212x64/model_curve_edit.cpp b/radio/src/gui/212x64/model_curve_edit.cpp index 681480602..5cc622903 100644 --- a/radio/src/gui/212x64/model_curve_edit.cpp +++ b/radio/src/gui/212x64/model_curve_edit.cpp @@ -131,6 +131,9 @@ void menuModelCurveOne(event_t event) lcdDrawNumber(INDENT_WIDTH, 6*FH+1, 5+crv.points, LEFT|attr); lcdDrawText(lcdLastRightPos, 6*FH+1, STR_PTS, attr); if (attr) { +#if defined(ROTARY_ENCODER_NAVIGATION) + rotencSpeed = ROTENC_LOWSPEED; +#endif int8_t count = checkIncDecModel(event, crv.points, -3, 12); // 2pts - 17pts if (checkIncDec_Ret) { int8_t newPoints[MAX_POINTS_PER_CURVE]; diff --git a/radio/src/gui/480x272/model_curves.cpp b/radio/src/gui/480x272/model_curves.cpp index a7f8adf29..e53f9aad4 100644 --- a/radio/src/gui/480x272/model_curves.cpp +++ b/radio/src/gui/480x272/model_curves.cpp @@ -155,6 +155,9 @@ bool menuModelCurveOne(event_t event) lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + FH, STR_COUNT); lcdDrawNumber(MODEL_CURVE_ONE_2ND_COLUMN, MENU_CONTENT_TOP + FH, 5+crv.points, LEFT|attr, 0, NULL, STR_PTS); if (attr) { +#if defined(ROTARY_ENCODER_NAVIGATION) + rotencSpeed = ROTENC_LOWSPEED; +#endif int count = checkIncDecModel(event, crv.points, -3, 12); // 2pts - 17pts if (checkIncDec_Ret) { int newPoints[MAX_POINTS_PER_CURVE]; From fe9750fc0ce2b0b961e5827558a1dd80e7ee75eb Mon Sep 17 00:00:00 2001 From: DanielGeA Date: Sat, 30 May 2020 11:08:19 +0100 Subject: [PATCH 379/560] Fix 9x rotary encoder source (#7639) Fix rotary encoder source --- companion/src/firmwares/opentx/opentxeeprom.cpp | 2 +- radio/src/translations/untranslated.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index f2275fe61..e39d04180 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -128,7 +128,7 @@ inline int SWITCHES_CONFIG_SIZE(Board::Type board, int version) return 16; } -#define MAX_ROTARY_ENCODERS(board) (IS_SKY9X(board) ? 1 : 0) +#define MAX_ROTARY_ENCODERS(board) 0 #define MAX_FLIGHT_MODES(board, version) 9 #define MAX_TIMERS(board, version) 3 #define MAX_MIXERS(board, version) 64 diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h index d737b7c5e..88289ed22 100644 --- a/radio/src/translations/untranslated.h +++ b/radio/src/translations/untranslated.h @@ -78,7 +78,7 @@ #define TR_VTRAINERMODES TR_VTRAINER_MASTER_JACK TR_VTRAINER_SLAVE_JACK TR_VTRAINER_MASTER_CPPM_MODULE TR_VTRAINER_MASTER_BATTERY TR_VTRAINER_BLUETOOTH TR_VTRAINER_MULTI #endif -#define TR_VSRCRAW "---\0" TR_STICKS_VSRCRAW TR_POTS_VSRCRAW TR_ROTARY_ENCODERS TR_GYR_VSRCRAW "MAX\0" TR_CYC_VSRCRAW TR_TRIMS_VSRCRAW TR_SW_VSRCRAW TR_EXTRA_VSRCRAW +#define TR_VSRCRAW "---\0" TR_STICKS_VSRCRAW TR_POTS_VSRCRAW TR_GYR_VSRCRAW "MAX\0" TR_CYC_VSRCRAW TR_TRIMS_VSRCRAW TR_SW_VSRCRAW TR_EXTRA_VSRCRAW #if defined(MODULE_PROTOCOL_FLEX) #define TR_MODULE_R9M_LITE "R9ML\0 " From fa1e6f087cddcd634f28fcc0a00d44ab40f933ed Mon Sep 17 00:00:00 2001 From: pascallanger Date: Sat, 30 May 2020 12:11:36 +0200 Subject: [PATCH 380/560] Graupner HoTT: full telemetry (#7627) --- .../horus/SCRIPTS/TOOLS/Graupner HoTT.lua | 87 ++- .../SCRIPTS/TOOLS/Graupner HoTT.lua | 87 ++- .../SCRIPTS/TOOLS/Graupner HoTT.lua | 87 ++- radio/src/pulses/multi.cpp | 2 +- radio/src/telemetry/frsky_d.cpp | 6 +- radio/src/telemetry/frsky_sport.cpp | 2 + radio/src/telemetry/hott.cpp | 596 ++++++++++++++++-- radio/src/telemetry/multi.cpp | 3 +- radio/src/telemetry/telemetry_holders.h | 1 + radio/src/telemetry/telemetry_sensors.cpp | 2 + radio/src/telemetry/telemetry_sensors.h | 2 +- 11 files changed, 742 insertions(+), 133 deletions(-) diff --git a/radio/sdcard/horus/SCRIPTS/TOOLS/Graupner HoTT.lua b/radio/sdcard/horus/SCRIPTS/TOOLS/Graupner HoTT.lua index ff6a3254c..d0a7d4af8 100644 --- a/radio/sdcard/horus/SCRIPTS/TOOLS/Graupner HoTT.lua +++ b/radio/sdcard/horus/SCRIPTS/TOOLS/Graupner HoTT.lua @@ -21,19 +21,41 @@ -- To start operation: -- Write "HoTT" at address 0..3 -- Write 0xFF at address 4 will request the buffer to be cleared --- Write 0xDF at address 5 +-- Write 0x0F at address 5 -- Read buffer from address 6 access the RX text for 168 bytes, 21 caracters -- by 8 lines --- Write at address 5 sends an order to the RX: 0xDF=start, 0xD7=prev page, --- 0xDE=next page, 0xD9=enter, 0xDD=next or 0xDB=prev +-- Write at address 5 sends an order to the RX: 0xXF=start, 0xX7=prev page, +-- 0xXE=next page, 0xX9=enter, 0xXD=next or 0xXB=prev with X being the sensor +-- to request data from 8=RX only, 9=Vario, A=GPS, B=Cust, C=ESC, D=GAM, E=EAM -- Write at address 4 the value 0xFF will request the buffer to be cleared -- !! Before exiting the script must write 0 at address 0 for normal operation !! --############################################################################### +HoTT_Sensor = 0 +Timer_128 = 100 + local function HoTT_Release() multiBuffer( 0, 0 ) end +local function HoTT_Send(button) + multiBuffer( 5, 0x80+(HoTT_Sensor*16) + button) +end + +local function HoTT_Sensor_Inc() + local detected_sensors=multiBuffer( 4 ) + local a + if detected_sensors ~= 0xFF then + repeat + HoTT_Sensor=(HoTT_Sensor+1)%7 -- Switch to next sensor + if HoTT_Sensor ~= 0 then + a = math.floor(detected_sensors/ (2^(HoTT_Sensor-1))) -- shift right + end + until HoTT_Sensor==0 or a % 2 == 1 + HoTT_Send( 0x0F ) + end +end + local function HoTT_Draw_LCD() local i local value @@ -41,12 +63,14 @@ local function HoTT_Draw_LCD() local result local offset=0 + local sensor_name = { "", "+Vario", "+GPS", "+Cust", "+ESC", "+GAM", "+EAM" } + lcd.clear() if LCD_W == 480 then --Draw title lcd.drawFilledRectangle(0, 0, LCD_W, 30, TITLE_BGCOLOR) - lcd.drawText(1, 5, "Graupner HoTT RX configuration", MENU_TITLE_COLOR) + lcd.drawText(1, 5, "Graupner HoTT: config RX" .. sensor_name[HoTT_Sensor+1] .. " - Menu cycle Sensors", MENU_TITLE_COLOR) --Draw RX Menu if multiBuffer( 4 ) == 0xFF then lcd.drawText(10,50,"No HoTT telemetry...", BLINK) @@ -56,9 +80,9 @@ local function HoTT_Draw_LCD() value=multiBuffer( line*21+6+i ) if value > 0x80 then value = value - 0x80 - lcd.drawText(10+i*16,32+16*line,string.char(value).." ",INVERS) + lcd.drawText(10+i*16,32+20*line,string.char(value).." ",INVERS) else - lcd.drawText(10+i*16,32+16*line,string.char(value)) + lcd.drawText(10+i*16,32+20*line,string.char(value)) end end end @@ -68,14 +92,23 @@ local function HoTT_Draw_LCD() if multiBuffer( 4 ) == 0xFF then lcd.drawText(2,17,"No HoTT telemetry...",SMLSIZE) else - for line = 0, 7, 1 do - for i = 0, 21-1, 1 do - value=multiBuffer( line*21+6+i ) - if value > 0x80 then - value = value - 0x80 - lcd.drawText(2+i*6,1+8*line,string.char(value).." ",SMLSIZE+INVERS) - else - lcd.drawText(2+i*6,1+8*line,string.char(value),SMLSIZE) + if Timer_128 ~= 0 then + --Intro page + Timer_128 = Timer_128 - 1 + lcd.drawScreenTitle("Graupner Hott",0,0) + lcd.drawText(2,17,"Configuration of RX" .. sensor_name[HoTT_Sensor+1] ,SMLSIZE) + lcd.drawText(2,37,"Press menu to cycle Sensors" ,SMLSIZE) + else + --Menu page + for line = 0, 7, 1 do + for i = 0, 21-1, 1 do + value=multiBuffer( line*21+6+i ) + if value > 0x80 then + value = value - 0x80 + lcd.drawText(2+i*6,1+8*line,string.char(value).." ",SMLSIZE+INVERS) + else + lcd.drawText(2+i*6,1+8*line,string.char(value),SMLSIZE) + end end end end @@ -98,7 +131,10 @@ local function HoTT_Init() --Request init of the RX buffer multiBuffer( 4, 0xFF ) --Request RX to send the config menu - multiBuffer( 5, 0xDF ) + HoTT_Send( 0x0F ) + HoTT_Sensor = 0; + HoTT_Detected_Sensors=0; + Timer_128 = 100 end -- Main @@ -111,18 +147,21 @@ local function HoTT_Run(event) return 2 else if event == EVT_VIRTUAL_PREV_PAGE then - killEvents(event); - multiBuffer( 5, 0xD7 ) - elseif event == EVT_VIRTUAL_NEXT_PAGE then - multiBuffer( 5, 0xDE ) + killEvents(event) + HoTT_Send( 0x07 ) elseif event == EVT_VIRTUAL_ENTER then - multiBuffer( 5, 0xD9 ) - elseif event == EVT_VIRTUAL_NEXT then - multiBuffer( 5, 0xDD ) + HoTT_Send( 0x09 ) elseif event == EVT_VIRTUAL_PREV then - multiBuffer( 5, 0xDB ) + HoTT_Send( 0x0B ) + elseif event == EVT_VIRTUAL_NEXT then + HoTT_Send( 0x0D ) + elseif event == EVT_VIRTUAL_NEXT_PAGE then + HoTT_Send( 0x0E ) + elseif event == EVT_VIRTUAL_MENU then + Timer_128 = 100 + HoTT_Sensor_Inc() else - multiBuffer( 5, 0xDF ) + HoTT_Send( 0x0F ) end HoTT_Draw_LCD() return 0 diff --git a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/Graupner HoTT.lua b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/Graupner HoTT.lua index ff6a3254c..d0a7d4af8 100644 --- a/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/Graupner HoTT.lua +++ b/radio/sdcard/taranis-x7/SCRIPTS/TOOLS/Graupner HoTT.lua @@ -21,19 +21,41 @@ -- To start operation: -- Write "HoTT" at address 0..3 -- Write 0xFF at address 4 will request the buffer to be cleared --- Write 0xDF at address 5 +-- Write 0x0F at address 5 -- Read buffer from address 6 access the RX text for 168 bytes, 21 caracters -- by 8 lines --- Write at address 5 sends an order to the RX: 0xDF=start, 0xD7=prev page, --- 0xDE=next page, 0xD9=enter, 0xDD=next or 0xDB=prev +-- Write at address 5 sends an order to the RX: 0xXF=start, 0xX7=prev page, +-- 0xXE=next page, 0xX9=enter, 0xXD=next or 0xXB=prev with X being the sensor +-- to request data from 8=RX only, 9=Vario, A=GPS, B=Cust, C=ESC, D=GAM, E=EAM -- Write at address 4 the value 0xFF will request the buffer to be cleared -- !! Before exiting the script must write 0 at address 0 for normal operation !! --############################################################################### +HoTT_Sensor = 0 +Timer_128 = 100 + local function HoTT_Release() multiBuffer( 0, 0 ) end +local function HoTT_Send(button) + multiBuffer( 5, 0x80+(HoTT_Sensor*16) + button) +end + +local function HoTT_Sensor_Inc() + local detected_sensors=multiBuffer( 4 ) + local a + if detected_sensors ~= 0xFF then + repeat + HoTT_Sensor=(HoTT_Sensor+1)%7 -- Switch to next sensor + if HoTT_Sensor ~= 0 then + a = math.floor(detected_sensors/ (2^(HoTT_Sensor-1))) -- shift right + end + until HoTT_Sensor==0 or a % 2 == 1 + HoTT_Send( 0x0F ) + end +end + local function HoTT_Draw_LCD() local i local value @@ -41,12 +63,14 @@ local function HoTT_Draw_LCD() local result local offset=0 + local sensor_name = { "", "+Vario", "+GPS", "+Cust", "+ESC", "+GAM", "+EAM" } + lcd.clear() if LCD_W == 480 then --Draw title lcd.drawFilledRectangle(0, 0, LCD_W, 30, TITLE_BGCOLOR) - lcd.drawText(1, 5, "Graupner HoTT RX configuration", MENU_TITLE_COLOR) + lcd.drawText(1, 5, "Graupner HoTT: config RX" .. sensor_name[HoTT_Sensor+1] .. " - Menu cycle Sensors", MENU_TITLE_COLOR) --Draw RX Menu if multiBuffer( 4 ) == 0xFF then lcd.drawText(10,50,"No HoTT telemetry...", BLINK) @@ -56,9 +80,9 @@ local function HoTT_Draw_LCD() value=multiBuffer( line*21+6+i ) if value > 0x80 then value = value - 0x80 - lcd.drawText(10+i*16,32+16*line,string.char(value).." ",INVERS) + lcd.drawText(10+i*16,32+20*line,string.char(value).." ",INVERS) else - lcd.drawText(10+i*16,32+16*line,string.char(value)) + lcd.drawText(10+i*16,32+20*line,string.char(value)) end end end @@ -68,14 +92,23 @@ local function HoTT_Draw_LCD() if multiBuffer( 4 ) == 0xFF then lcd.drawText(2,17,"No HoTT telemetry...",SMLSIZE) else - for line = 0, 7, 1 do - for i = 0, 21-1, 1 do - value=multiBuffer( line*21+6+i ) - if value > 0x80 then - value = value - 0x80 - lcd.drawText(2+i*6,1+8*line,string.char(value).." ",SMLSIZE+INVERS) - else - lcd.drawText(2+i*6,1+8*line,string.char(value),SMLSIZE) + if Timer_128 ~= 0 then + --Intro page + Timer_128 = Timer_128 - 1 + lcd.drawScreenTitle("Graupner Hott",0,0) + lcd.drawText(2,17,"Configuration of RX" .. sensor_name[HoTT_Sensor+1] ,SMLSIZE) + lcd.drawText(2,37,"Press menu to cycle Sensors" ,SMLSIZE) + else + --Menu page + for line = 0, 7, 1 do + for i = 0, 21-1, 1 do + value=multiBuffer( line*21+6+i ) + if value > 0x80 then + value = value - 0x80 + lcd.drawText(2+i*6,1+8*line,string.char(value).." ",SMLSIZE+INVERS) + else + lcd.drawText(2+i*6,1+8*line,string.char(value),SMLSIZE) + end end end end @@ -98,7 +131,10 @@ local function HoTT_Init() --Request init of the RX buffer multiBuffer( 4, 0xFF ) --Request RX to send the config menu - multiBuffer( 5, 0xDF ) + HoTT_Send( 0x0F ) + HoTT_Sensor = 0; + HoTT_Detected_Sensors=0; + Timer_128 = 100 end -- Main @@ -111,18 +147,21 @@ local function HoTT_Run(event) return 2 else if event == EVT_VIRTUAL_PREV_PAGE then - killEvents(event); - multiBuffer( 5, 0xD7 ) - elseif event == EVT_VIRTUAL_NEXT_PAGE then - multiBuffer( 5, 0xDE ) + killEvents(event) + HoTT_Send( 0x07 ) elseif event == EVT_VIRTUAL_ENTER then - multiBuffer( 5, 0xD9 ) - elseif event == EVT_VIRTUAL_NEXT then - multiBuffer( 5, 0xDD ) + HoTT_Send( 0x09 ) elseif event == EVT_VIRTUAL_PREV then - multiBuffer( 5, 0xDB ) + HoTT_Send( 0x0B ) + elseif event == EVT_VIRTUAL_NEXT then + HoTT_Send( 0x0D ) + elseif event == EVT_VIRTUAL_NEXT_PAGE then + HoTT_Send( 0x0E ) + elseif event == EVT_VIRTUAL_MENU then + Timer_128 = 100 + HoTT_Sensor_Inc() else - multiBuffer( 5, 0xDF ) + HoTT_Send( 0x0F ) end HoTT_Draw_LCD() return 0 diff --git a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/Graupner HoTT.lua b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/Graupner HoTT.lua index ff6a3254c..d0a7d4af8 100644 --- a/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/Graupner HoTT.lua +++ b/radio/sdcard/taranis-x9/SCRIPTS/TOOLS/Graupner HoTT.lua @@ -21,19 +21,41 @@ -- To start operation: -- Write "HoTT" at address 0..3 -- Write 0xFF at address 4 will request the buffer to be cleared --- Write 0xDF at address 5 +-- Write 0x0F at address 5 -- Read buffer from address 6 access the RX text for 168 bytes, 21 caracters -- by 8 lines --- Write at address 5 sends an order to the RX: 0xDF=start, 0xD7=prev page, --- 0xDE=next page, 0xD9=enter, 0xDD=next or 0xDB=prev +-- Write at address 5 sends an order to the RX: 0xXF=start, 0xX7=prev page, +-- 0xXE=next page, 0xX9=enter, 0xXD=next or 0xXB=prev with X being the sensor +-- to request data from 8=RX only, 9=Vario, A=GPS, B=Cust, C=ESC, D=GAM, E=EAM -- Write at address 4 the value 0xFF will request the buffer to be cleared -- !! Before exiting the script must write 0 at address 0 for normal operation !! --############################################################################### +HoTT_Sensor = 0 +Timer_128 = 100 + local function HoTT_Release() multiBuffer( 0, 0 ) end +local function HoTT_Send(button) + multiBuffer( 5, 0x80+(HoTT_Sensor*16) + button) +end + +local function HoTT_Sensor_Inc() + local detected_sensors=multiBuffer( 4 ) + local a + if detected_sensors ~= 0xFF then + repeat + HoTT_Sensor=(HoTT_Sensor+1)%7 -- Switch to next sensor + if HoTT_Sensor ~= 0 then + a = math.floor(detected_sensors/ (2^(HoTT_Sensor-1))) -- shift right + end + until HoTT_Sensor==0 or a % 2 == 1 + HoTT_Send( 0x0F ) + end +end + local function HoTT_Draw_LCD() local i local value @@ -41,12 +63,14 @@ local function HoTT_Draw_LCD() local result local offset=0 + local sensor_name = { "", "+Vario", "+GPS", "+Cust", "+ESC", "+GAM", "+EAM" } + lcd.clear() if LCD_W == 480 then --Draw title lcd.drawFilledRectangle(0, 0, LCD_W, 30, TITLE_BGCOLOR) - lcd.drawText(1, 5, "Graupner HoTT RX configuration", MENU_TITLE_COLOR) + lcd.drawText(1, 5, "Graupner HoTT: config RX" .. sensor_name[HoTT_Sensor+1] .. " - Menu cycle Sensors", MENU_TITLE_COLOR) --Draw RX Menu if multiBuffer( 4 ) == 0xFF then lcd.drawText(10,50,"No HoTT telemetry...", BLINK) @@ -56,9 +80,9 @@ local function HoTT_Draw_LCD() value=multiBuffer( line*21+6+i ) if value > 0x80 then value = value - 0x80 - lcd.drawText(10+i*16,32+16*line,string.char(value).." ",INVERS) + lcd.drawText(10+i*16,32+20*line,string.char(value).." ",INVERS) else - lcd.drawText(10+i*16,32+16*line,string.char(value)) + lcd.drawText(10+i*16,32+20*line,string.char(value)) end end end @@ -68,14 +92,23 @@ local function HoTT_Draw_LCD() if multiBuffer( 4 ) == 0xFF then lcd.drawText(2,17,"No HoTT telemetry...",SMLSIZE) else - for line = 0, 7, 1 do - for i = 0, 21-1, 1 do - value=multiBuffer( line*21+6+i ) - if value > 0x80 then - value = value - 0x80 - lcd.drawText(2+i*6,1+8*line,string.char(value).." ",SMLSIZE+INVERS) - else - lcd.drawText(2+i*6,1+8*line,string.char(value),SMLSIZE) + if Timer_128 ~= 0 then + --Intro page + Timer_128 = Timer_128 - 1 + lcd.drawScreenTitle("Graupner Hott",0,0) + lcd.drawText(2,17,"Configuration of RX" .. sensor_name[HoTT_Sensor+1] ,SMLSIZE) + lcd.drawText(2,37,"Press menu to cycle Sensors" ,SMLSIZE) + else + --Menu page + for line = 0, 7, 1 do + for i = 0, 21-1, 1 do + value=multiBuffer( line*21+6+i ) + if value > 0x80 then + value = value - 0x80 + lcd.drawText(2+i*6,1+8*line,string.char(value).." ",SMLSIZE+INVERS) + else + lcd.drawText(2+i*6,1+8*line,string.char(value),SMLSIZE) + end end end end @@ -98,7 +131,10 @@ local function HoTT_Init() --Request init of the RX buffer multiBuffer( 4, 0xFF ) --Request RX to send the config menu - multiBuffer( 5, 0xDF ) + HoTT_Send( 0x0F ) + HoTT_Sensor = 0; + HoTT_Detected_Sensors=0; + Timer_128 = 100 end -- Main @@ -111,18 +147,21 @@ local function HoTT_Run(event) return 2 else if event == EVT_VIRTUAL_PREV_PAGE then - killEvents(event); - multiBuffer( 5, 0xD7 ) - elseif event == EVT_VIRTUAL_NEXT_PAGE then - multiBuffer( 5, 0xDE ) + killEvents(event) + HoTT_Send( 0x07 ) elseif event == EVT_VIRTUAL_ENTER then - multiBuffer( 5, 0xD9 ) - elseif event == EVT_VIRTUAL_NEXT then - multiBuffer( 5, 0xDD ) + HoTT_Send( 0x09 ) elseif event == EVT_VIRTUAL_PREV then - multiBuffer( 5, 0xDB ) + HoTT_Send( 0x0B ) + elseif event == EVT_VIRTUAL_NEXT then + HoTT_Send( 0x0D ) + elseif event == EVT_VIRTUAL_NEXT_PAGE then + HoTT_Send( 0x0E ) + elseif event == EVT_VIRTUAL_MENU then + Timer_128 = 100 + HoTT_Sensor_Inc() else - multiBuffer( 5, 0xDF ) + HoTT_Send( 0x0F ) end HoTT_Draw_LCD() return 0 diff --git a/radio/src/pulses/multi.cpp b/radio/src/pulses/multi.cpp index 9fe10113c..cfcff15d0 100644 --- a/radio/src/pulses/multi.cpp +++ b/radio/src/pulses/multi.cpp @@ -393,7 +393,7 @@ void sendSport(uint8_t moduleIdx) void sendHott(uint8_t moduleIdx) { - if (Multi_Buffer && memcmp(Multi_Buffer, "HoTT", 4) == 0 && Multi_Buffer[5] >= 0xD7 && Multi_Buffer[5] <= 0xDF) { + if (Multi_Buffer && memcmp(Multi_Buffer, "HoTT", 4) == 0 && (Multi_Buffer[5] & 0x80) && (Multi_Buffer[5] & 0x0F) >= 0x07) { // HoTT Lua script is running sendMulti(moduleIdx, Multi_Buffer[5]); } diff --git a/radio/src/telemetry/frsky_d.cpp b/radio/src/telemetry/frsky_d.cpp index 67445c193..c1ad3f9d5 100644 --- a/radio/src/telemetry/frsky_d.cpp +++ b/radio/src/telemetry/frsky_d.cpp @@ -227,6 +227,8 @@ void processHubPacket(uint8_t id, int16_t value) else if (id == VOLTS_ID) { unit = UNIT_CELLS; uint32_t cellData = (uint32_t)data; + if (((cellData & 0x00F0) >> 4) >= MAX_CELLS) + return; data = ((cellData & 0x00F0) << 12) + (((((cellData & 0xFF00) >> 8) + ((cellData & 0x000F) << 8))) / 5); } else if (id == GPS_DAY_MONTH_ID) { @@ -264,7 +266,7 @@ void processHubPacket(uint8_t id, int16_t value) data *= 10; } } - + setTelemetryValue(PROTOCOL_TELEMETRY_FRSKY_D, id, 0, 0, data, unit, precision); } @@ -326,4 +328,4 @@ void frskyDSetDefault(int index, uint16_t id) } storageDirty(EE_MODEL); -} +} \ No newline at end of file diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index 0e4f3920c..d5215e300 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -139,6 +139,8 @@ void sportProcessTelemetryPacket(uint16_t id, uint8_t subId, uint8_t instance, u if (unit == UNIT_CELLS) { uint8_t cellsCount = (data & 0xF0) >> 4; uint8_t cellIndex = (data & 0x0F); + if (cellIndex >= MAX_CELLS) + return; uint32_t mask = (cellsCount << 24) + (cellIndex << 16); setTelemetryValue(PROTOCOL_TELEMETRY_FRSKY_SPORT, id, subId, instance, mask + (((data & 0x000FFF00) >> 8) / 5), unit, precision); if (cellIndex+1 < cellsCount) { diff --git a/radio/src/telemetry/hott.cpp b/radio/src/telemetry/hott.cpp index f36236add..98b3c54cc 100644 --- a/radio/src/telemetry/hott.cpp +++ b/radio/src/telemetry/hott.cpp @@ -16,26 +16,27 @@ #include "opentx.h" /* Telemetry -packet[0] = TX RSSI value -packet[1] = TX LQI value -packet[2] = frame number -packet[3-12] telemetry data +packet[0] = TX RSSI value +packet[1] = TX LQI value +packet[2] = Telemetry type +packet[3] = Telemetry page +packet[4-13] = Telemetry data -The frame number takes the following values: 0x00, 0x01, 0x02, 0x03 and 0x04. The frames can be present or not, they also do not have to follow each others. -Here is a description of the telemetry data for each frame number: -- frame 0x00 -[3] = [12] = ?? -[4] = RX_Voltage*10 in V -[5] = Temperature-20 in °C -[6] = RX_RSSI -[7] = RX_LQI ?? -[8] = RX_STR ?? -[9,10] = [10]*256+[9]=max lost packet time in ms, max value seems 2s=0x7D0 -[11] = 0x00 ?? -- frame 0x01 Unknown -- frame 0x02 Unknown -- frame 0x03 Unknown -- frame 0x04 Unknown +Telemetry type: 0x00 RX, 0x09 Vario, 0x0A GPS, 0x0B not seen, 0x0C ESC, 0x0D GAM, 0x0E EAM, 0x80 Text config mode +Telemetry page: 0x00..0x04 for all telemetry except Text config mode which is 0x00..0x12. The pages can be present or not, they also do not have to follow each others. + +Here is a description of the RX telemetry: + [2] = 0x00 -> Telemetry type RX + [3] = 0x00 -> Telemetry page 0 + [4] = ?? looks to be a copy of [7] + [5] = RX_Voltage*10 in V + [6] = Temperature-20 in °C + [7] = RX_RSSI CC2500 formated (a<128:a/2-71dBm, a>=128:(a-256)/2-71dBm) + [8] = RX_LQI in % + [9] = RX_MIN_Voltage*10 in V + [10,11] = [11]*256+[10]=max lost packet time in ms, max value seems 2s=0x7D0 + [12] = 0x00 ?? + [13] = ?? looks to be a copy of [7] */ struct HottSensor @@ -49,22 +50,54 @@ struct HottSensor // telemetry frames enum { - HOTT_FRAME_00 = 0x00, - HOTT_FRAME_01 = 0x01, - HOTT_FRAME_02 = 0x02, - HOTT_FRAME_03 = 0x03, - HOTT_FRAME_04 = 0x04, + HOTT_PAGE_00 = 0x00, + HOTT_PAGE_01 = 0x01, + HOTT_PAGE_02 = 0x02, + HOTT_PAGE_03 = 0x03, + HOTT_PAGE_04 = 0x04, }; -#define HOTT_TELEM_NORMAL 0x00 -#define HOTT_TELEM_BIND 0x40 -#define HOTT_TELEM_MENU 0x80 +enum +{ + HOTT_TELEM_RX = 0x00, + HOTT_TELEM_VARIO = 0x09, + HOTT_TELEM_GPS = 0x0A, + HOTT_TELEM_ESC = 0x0C, + HOTT_TELEM_GAM = 0x0D, + HOTT_TELEM_EAM = 0x0E, + HOTT_TELEM_TEXT = 0x80, +}; // telemetry sensors ID enum { HOTT_ID_RX_VOLTAGE = 0x0004, // RX_Batt Voltage HOTT_ID_TEMP1 = 0x0005, // RX Temperature sensor + HOTT_ID_VARIO = 0x0006, // Vario sensor + HOTT_ID_ALT = 0x0007, // Alt sensor + HOTT_ID_HDG = 0x0008, // Heading sensor + HOTT_ID_GSPD = 0x0008, // Ground speed sensor + HOTT_ID_GPS_LAT_LONG = 0x0009, // GPS sensor + HOTT_ID_GPS_COUNT = 0x000A, // GPS sat count + HOTT_ID_CELS = 0x000B, // Cels L sensor + HOTT_ID_CELS_H = 0x000C, // Cels H sensor + HOTT_ID_VOLT1 = 0x000D, // Voltage sensor + HOTT_ID_VOLT2 = 0x000E, // Voltage sensor + HOTT_ID_AMP1 = 0x000F, // Amp sensor + HOTT_ID_AMP2 = 0x0010, // Amp sensor + HOTT_ID_RPM1 = 0x0011, // RPM sensor + HOTT_ID_RPM2 = 0x0012, // RPM sensor + HOTT_ID_ESC_VIN = 0x0013, // ESC Volt + HOTT_ID_ESC_CUR = 0x0014, // ESC Amp + HOTT_ID_ESC_TBEC = 0x0015, // BEC Temp + HOTT_ID_ESC_BCUR = 0x0016, // BEC Cur + HOTT_ID_ESC_VBEC = 0x0017, // BEC Volt + HOTT_ID_BCAPA = 0x0018, // Batt capacity + HOTT_ID_TEMP2 = 0x0019, // Temperature sensor 2 + HOTT_ID_AIR_SPEED = 0x001A, + HOTT_ID_VOLT3 = 0x001B, // Voltage sensor + HOTT_ID_FUEL = 0x001C, // Fuel percentage + HOTT_TX_RSSI_ID = 0xFF00, // Pseudo id outside 1 byte range of Hott sensors HOTT_TX_LQI_ID = 0xFF01, // Pseudo id outside 1 byte range of Hott sensors HOTT_RX_RSSI_ID = 0xFF02, // Pseudo id outside 1 byte range of Hott sensors @@ -72,18 +105,39 @@ enum }; const HottSensor hottSensors[] = { - //frame 00 - {HOTT_ID_RX_VOLTAGE, ZSTR_BATT, UNIT_VOLTS, 1}, // RX_Batt Voltage - {HOTT_ID_TEMP1, ZSTR_TEMP1, UNIT_CELSIUS, 0}, // RX Temperature sensor - //frame 01 - //frame 02 - //frame 03 - //frame 04 - {HOTT_TX_RSSI_ID, ZSTR_TX_RSSI, UNIT_RAW, 0}, // Pseudo id outside 1 byte range of Hott sensors - {HOTT_TX_LQI_ID, ZSTR_TX_QUALITY, UNIT_RAW, 0}, // Pseudo id outside 1 byte range of Hott sensors - {HOTT_RX_RSSI_ID, ZSTR_RSSI, UNIT_DB, 0}, // RX RSSI - {HOTT_RX_LQI_ID, ZSTR_RX_QUALITY, UNIT_RAW, 0}, // RX LQI - {0x00, NULL, UNIT_RAW, 0}, // sentinel + //HOTT_TELEM_RX + {HOTT_ID_RX_VOLTAGE, ZSTR_BATT, UNIT_VOLTS, 1}, // RX_Batt Voltage + {HOTT_ID_TEMP1, ZSTR_TEMP1, UNIT_CELSIUS, 0}, // Temperature sensor 1 + {HOTT_ID_TEMP2, ZSTR_TEMP2, UNIT_CELSIUS, 0}, // Temperature sensor 2 + {HOTT_ID_VARIO, ZSTR_VSPD, UNIT_METERS_PER_SECOND, 2}, // Vario sensor + {HOTT_ID_ALT, ZSTR_ALT, UNIT_METERS, 0}, // Alt sensor + {HOTT_ID_HDG, ZSTR_HDG, UNIT_DEGREE, 0}, // Heading sensor + {HOTT_ID_GSPD, ZSTR_GSPD, UNIT_KMH, 0}, // Ground speed sensor + {HOTT_ID_GPS_LAT_LONG, ZSTR_GPS, UNIT_GPS, 0}, // GPS position + {HOTT_ID_GPS_COUNT, ZSTR_SATELLITES, UNIT_RAW, 0}, // GPS sat count + {HOTT_ID_VOLT1, ZSTR_A1, UNIT_VOLTS, 1}, // Voltage sensor 1 + {HOTT_ID_VOLT2, ZSTR_A2, UNIT_VOLTS, 1}, // Voltage sensor 2 + {HOTT_ID_VOLT3, ZSTR_A3, UNIT_VOLTS, 1}, // Voltage sensor 3 + {HOTT_ID_AMP1, ZSTR_CURR, UNIT_AMPS, 1}, // Amp sensor 1 + {HOTT_ID_AMP2, ZSTR_CURR, UNIT_AMPS, 1}, // Amp sensor 2 + {HOTT_ID_RPM1, ZSTR_RPM, UNIT_RPMS, 0}, // RPM1 + {HOTT_ID_RPM2, ZSTR_RPM2, UNIT_RPMS, 0}, // RPM2 + {HOTT_ID_ESC_VIN, ZSTR_ESC_VIN, UNIT_VOLTS, 1}, // ESC VIN + {HOTT_ID_BCAPA, ZSTR_SMART_BAT_CAPACITY, UNIT_MAH, 2}, // Batt Capa + {HOTT_ID_ESC_CUR, ZSTR_ESC_CUR, UNIT_AMPS, 1}, // ESC Amp + {HOTT_ID_ESC_TBEC, ZSTR_ESC_TBEC, UNIT_CELSIUS, 0}, // ESC BEC Temp + {HOTT_ID_ESC_BCUR, ZSTR_ESC_BCUR, UNIT_AMPS, 1}, // ESC BEC Amp + {HOTT_ID_ESC_VBEC, ZSTR_ESC_VBEC, UNIT_VOLTS, 1}, // ESC BEC Volt + {HOTT_ID_CELS, ZSTR_CELLS, UNIT_CELLS, 2}, // Batt cells + {HOTT_ID_CELS_H, ZSTR_CELLS, UNIT_CELLS, 2}, // Batt H cells + {HOTT_ID_AIR_SPEED, ZSTR_ASPD, UNIT_KMH, 0}, // Air speed + {HOTT_ID_FUEL, ZSTR_FUEL, UNIT_PERCENT, 0}, // Fuel + + {HOTT_TX_RSSI_ID, ZSTR_TX_RSSI, UNIT_DB, 0}, // Pseudo id outside 1 byte range of Hott sensors + {HOTT_TX_LQI_ID, ZSTR_TX_QUALITY, UNIT_RAW, 0}, // Pseudo id outside 1 byte range of Hott sensors + {HOTT_RX_RSSI_ID, ZSTR_RSSI, UNIT_DB, 0}, // RX RSSI + {HOTT_RX_LQI_ID, ZSTR_RX_QUALITY, UNIT_RAW, 0}, // RX LQI + {0x00, NULL, UNIT_RAW, 0}, // sentinel }; const HottSensor * getHottSensor(uint16_t id) @@ -95,22 +149,30 @@ const HottSensor * getHottSensor(uint16_t id) return nullptr; } +int16_t processHoTTdBm(uint8_t value) +{ + if (value >= 128) { + value = 256 - value; + } + return value / 2 -71; +} + void processHottPacket(const uint8_t * packet) { // Set TX RSSI Value - setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_TX_RSSI_ID, 0, 0, packet[0]>>1, UNIT_RAW, 0); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_TX_RSSI_ID, 0, 0, processHoTTdBm(packet[0]), UNIT_RAW, 0); // Set TX LQI Value setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_TX_LQI_ID, 0, 0, packet[1], UNIT_RAW, 0); #if defined(LUA) - #define HOTT_MENU_NBR_PAGE 0x13 +#define HOTT_MENU_NBR_PAGE 0x13 // Config menu consists of the different telem pages put all together // [3] = config mennu page 0x00 to 0x12. // Page X [4] = seems like all the telem pages with the same value are going together to make the full config menu text. Seen so far 'a', 'b', 'c', 'd' // Page X [5..13] = 9 ascii chars to be displayed, char is highlighted when ascii|0x80 // Screen display is 21 characters large which means that once the first 21 chars are filled go to the begining of the next line // Menu commands are sent through TX packets: - // packet[28]= 0xXF=>no key press, 0xXD=>down, 0xXB=>up, 0xX9=>enter, 0xXE=>right, 0xX7=>left with X=0 or D + // packet[28]= 0xXF=>no key press, 0xXD=>down, 0xXB=>up, 0xX9=>enter, 0xXE=>right, 0xX7=>left with X=0, 9=Vario, A=GPS, B=Unknown, C=ESC, D=GAM, or E=EAM // packet[29]= 0xX1/0xX9 with X=0 or X counting 0,1,1,2,2,..,9,9 if (Multi_Buffer && memcmp(Multi_Buffer, "HoTT", 4) == 0) { // HoTT Lua script is running @@ -118,21 +180,31 @@ void processHottPacket(const uint8_t * packet) // Init memset(&Multi_Buffer[6], ' ', HOTT_MENU_NBR_PAGE * 9); // Clear text buffer } - - if (packet[3] < HOTT_MENU_NBR_PAGE && Multi_Buffer[5] >= 0xD7 && Multi_Buffer[5] <= 0xDF) { - Multi_Buffer[4] = packet[4]; // Store current menu being received + + if (packet[2] == HOTT_TELEM_TEXT && packet[3] < HOTT_MENU_NBR_PAGE && (Multi_Buffer[5] & 0x80) && (Multi_Buffer[5] & 0x0F) >= 0x07) { + Multi_Buffer[4] = packet[4]; // Store detected sensors memcpy(&Multi_Buffer[6 + packet[3] * 9], &packet[5], 9); // Store the received page in the buffer } return; } #endif + struct HottGPSMinutes + { + uint16_t value: 14; + uint16_t isNegative: 1; + uint16_t spare: 1; + }; + const HottSensor * sensor; int32_t value; + static uint8_t prev_page = 0, prev_value = 0; + static HottGPSMinutes min = {}; + int16_t deg = 0, sec = 0; - if (packet[2] == HOTT_TELEM_NORMAL) { - switch (packet[3]) { - case HOTT_FRAME_00: + switch (packet[2]) { // Telemetry type + case HOTT_TELEM_RX: + if (packet[3] == 0) { // Telemetry page: only page 0 is for RX // RX_VOLT value = packet[5]; sensor = getHottSensor(HOTT_ID_RX_VOLTAGE); @@ -142,21 +214,433 @@ void processHottPacket(const uint8_t * packet) sensor = getHottSensor(HOTT_ID_TEMP1); setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_TEMP1, 0, 0, value, sensor->unit, sensor->precision); // RX_RSSI - setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_RX_RSSI_ID, 0, 0, packet[7], UNIT_DB, 0); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_RX_RSSI_ID, 0, 0, processHoTTdBm(packet[7]), UNIT_DB, 0); // RX_LQI telemetryData.rssi.set(packet[8]); if (packet[8] > 0) telemetryStreaming = TELEMETRY_TIMEOUT10ms; setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_RX_LQI_ID, 0, 0, packet[8], UNIT_RAW, 0); - break; + } + break; - default: - // unknown - value = (packet[7] << 24) | (packet[6] << 16) | (packet[5] << 8) | packet[4]; - setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, 0xFE00 | packet[3], 0, 0, value, UNIT_RAW, 0); - break; - } + case HOTT_TELEM_VARIO: + // https://github.com/betaflight/betaflight/blob/1d8a0e9fd61cf01df7b34805e84365df72d9d68d/src/main/telemetry/hott.h#L240 + switch (packet[3]) { // Telemetry page 1,2,3,4 + case HOTT_PAGE_01: + // packet[6 ] uint8_t altitude_L; //#06 Altitude low uint8_t. In meters. A value of 500 means 0m + // packet[7 ] uint8_t altitude_H; //#07 Altitude high uint8_t + value = packet[6] + (packet[7] << 8) - 500; + sensor = getHottSensor(HOTT_ID_ALT); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_ALT, 0, HOTT_TELEM_VARIO, value, sensor->unit, sensor->precision); + + // packet[12] uint8_t climbrate_L; //#12 Climb rate in m/s. Steps of 0.01m/s. Value of 30000 = 0.00 m/s + // packet[13] uint8_t climbrate_H; //#13 Climb rate in m/s + value = packet[12] + (packet[13] << 8) - 30000; + sensor = getHottSensor(HOTT_ID_VARIO); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_VARIO, 0, HOTT_TELEM_VARIO, value, sensor->unit, sensor->precision); + break; + case HOTT_PAGE_02: + // packet[12] uint8_t compass_direction; //#42 Compass heading in 2� steps. 1 = 2� + value = packet[12] * 2; + sensor = getHottSensor(HOTT_ID_HDG); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_HDG, 0, HOTT_TELEM_VARIO, value, sensor->unit, sensor->precision); + break; + case HOTT_PAGE_03: + break; + case HOTT_PAGE_04: + break; + } + break; + + case HOTT_TELEM_GPS: + // https://github.com/betaflight/betaflight/blob/1d8a0e9fd61cf01df7b34805e84365df72d9d68d/src/main/telemetry/hott.h#L378 + switch (packet[3]) { // Telemetry page 1,2,3,4 + case HOTT_PAGE_01: + // packet[7 ] uint8_t flight_direction; //#07 flight direction in 2 degreees/step (1 = 2degrees); + value = packet[7] * 2; + sensor = getHottSensor(HOTT_ID_HDG); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_HDG, 0, HOTT_TELEM_GPS, value, sensor->unit, sensor->precision); + + // packet[8 ] uint8_t gps_speed_L; //08 km/h + // packet[9 ] uint8_t gps_speed_H; //#09 + value = packet[8] + (packet[9] << 8); + sensor = getHottSensor(HOTT_ID_GSPD); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_GSPD, 0, HOTT_TELEM_GPS, value, sensor->unit, sensor->precision); + + // packet[10] uint8_t pos_NS; //#10 north = 0, south = 1 + // packet[11] uint8_t pos_NS_dm_L; //#11 degree minutes ie N48�39�988 + // packet[12] uint8_t pos_NS_dm_H; //#12 + // packet[13] uint8_t pos_NS_sec_L; //#13 position seconds + min.value = (int16_t) (packet[11] + (packet[12] << 8)); + if (packet[10] == 1) { + min.isNegative = true; + } + break; + + case HOTT_PAGE_02: + if (prev_page == ((HOTT_TELEM_GPS << 4) | HOTT_PAGE_01)) { + // packet[4 ] uint8_t pos_NS_sec_H; //#14 + deg = min.value / 100; + min.value = min.value - deg * 100; + sec = prev_value + (packet[4] << 8); + value = deg * 1000000 + (min.value * 1000000 + sec * 100) / 60; + if (min.isNegative) { + value = -value; + } + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_GPS_LAT_LONG, 0, HOTT_TELEM_GPS, value, UNIT_GPS_LATITUDE, 0); + } + + // packet[5 ] uint8_t pos_EW; //#15 east = 0, west = 1 + // packet[6 ] uint8_t pos_EW_dm_L; //#16 degree minutes ie. E9�25�9360 + // packet[7 ] uint8_t pos_EW_dm_H; //#17 + // packet[8 ] uint8_t pos_EW_sec_L; //#18 position seconds + // packet[9 ] uint8_t pos_EW_sec_H; //#19 + min.value = (int16_t) (packet[6] + (packet[7] << 8)); + sec = (int16_t) (packet[8] + (packet[9] << 8)); + deg = min.value / 100; + min.value = min.value - deg * 100; + value = deg * 1000000 + (min.value * 1000000 + sec * 100) / 60; + if (packet[5] == 1) { + value = -value; + } + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_GPS_LAT_LONG, 0, HOTT_TELEM_GPS, value, UNIT_GPS_LONGITUDE, 0); + // packet[10] uint8_t home_distance_L; //#20 meters + // packet[11] uint8_t home_distance_H; //#21 + + // packet[12] uint8_t altitude_L; //#22 meters. Value of 500 = 0m + // packet[13] uint8_t altitude_H; //#23 + value = packet[12] + (packet[13] << 8) - 500; + sensor = getHottSensor(HOTT_ID_ALT); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_ALT, 0, HOTT_TELEM_GPS, value, sensor->unit, sensor->precision); + break; + + case HOTT_PAGE_03: + // packet[4 ] uint8_t climbrate_L; //#24 m/s 0.01m/s resolution. Value of 30000 = 0.00 m/s + // packet[5 ] uint8_t climbrate_H; //#25 + value = packet[4] + (packet[5] << 8) - 30000; + sensor = getHottSensor(HOTT_ID_VARIO); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_VARIO, 0, HOTT_TELEM_GPS, value, sensor->unit, sensor->precision); + + // packet[6 ] uint8_t climbrate3s; //#26 climbrate in m/3s resolution, value of 120 = 0 m/3s + // packet[7 ] uint8_t gps_satelites; //#27 sat count + sensor = getHottSensor(HOTT_ID_GPS_COUNT); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_GPS_COUNT, 0, HOTT_TELEM_GPS, packet[7], sensor->unit, sensor->precision); + // packet[8 ] uint8_t gps_fix_char; //#28 GPS fix character. display, 'D' = DGPS, '2' = 2D, '3' = 3D, '-' = no fix. Where appears this char??? + // packet[9 ] uint8_t home_direction;//#29 direction from starting point to Model position (2 degree steps) + // packet[10] uint8_t angle_roll; //#30 angle roll in 2 degree steps + // packet[11] uint8_t angle_nick; //#31 angle in 2degree steps + // packet[12] uint8_t angle_compass; //#32 angle in 2degree steps. 1 = 2�, 255 = - 2� (1 uint8_t) North = 0� + // packet[13] uint8_t gps_time_h; //#33 UTC time hours + break; + + case HOTT_PAGE_04: + // packet[4 ] uint8_t gps_time_m; //#34 UTC time minutes + // packet[5 ] uint8_t gps_time_s; //#35 UTC time seconds + // packet[6 ] uint8_t gps_time_sss; //#36 UTC time milliseconds + // packet[7 ] uint8_t msl_altitude_L;//#37 mean sea level altitude + // packet[8 ] uint8_t msl_altitude_H;//#38 + // packet[9 ] uint8_t vibration; //#39 vibrations level in % + // packet[10] uint8_t free_char1; //#40 appears right to home distance + // packet[11] uint8_t free_char2; //#41 appears right to home direction + // packet[12] uint8_t free_char3; //#42 GPS ASCII D=DGPS 2=2D 3=3D -=No Fix + break; + } + break; + + case HOTT_TELEM_ESC: + // https://github.com/betaflight/betaflight/blob/1d8a0e9fd61cf01df7b34805e84365df72d9d68d/src/main/telemetry/hott.h#L454 + switch (packet[3]) { // Telemetry page 1,2,3,4 + case HOTT_PAGE_01: + // packet[7 ] uint8_t input_v_L; //#07 Input voltage low byte + // packet[8 ] uint8_t input_v_H; //#08 + value = packet[7] + (packet[8] << 8); + sensor = getHottSensor(HOTT_ID_ESC_VIN); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_ESC_VIN, 0, HOTT_TELEM_ESC, value, sensor->unit, sensor->precision); + // packet[11] uint8_t batt_cap_L; //#11 battery capacity in 10mAh steps + // packet[12] uint8_t batt_cap_H; //#12 + value = packet[11] + (packet[12] << 8); + sensor = getHottSensor(HOTT_ID_BCAPA); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_BCAPA, 0, HOTT_TELEM_ESC, value, sensor->unit, sensor->precision); + // packet[13] uint8_t esc_temp; //#13 ESC temperature + value = packet[13] - 20; + sensor = getHottSensor(HOTT_ID_TEMP1); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_TEMP1, 0, HOTT_TELEM_ESC, value, sensor->unit, sensor->precision); + break; + + case HOTT_PAGE_02: + // packet[5 ] uint8_t current_L; //#15 Current in 0.1 steps + // packet[6 ] uint8_t current_H; //#16 + value = packet[5] + (packet[6] << 8); + sensor = getHottSensor(HOTT_ID_ESC_CUR); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_ESC_CUR, 0, HOTT_TELEM_ESC, value, sensor->unit, sensor->precision); + // packet[9 ] uint8_t rpm_L; //#19 RPM in 10U/min steps + // packet[10] uint8_t rpm_H; //#20 + value = (packet[9] + (packet[10] << 8)) * 10; + sensor = getHottSensor(HOTT_ID_RPM1); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_RPM1, 0, HOTT_TELEM_ESC, value, sensor->unit, sensor->precision); + break; + + case HOTT_PAGE_03: + // packet[8 ] uint8_t bec_v; //#28 BEC voltage + value = packet[8]; + sensor = getHottSensor(HOTT_ID_ESC_VBEC); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_ESC_VBEC, 0, HOTT_TELEM_ESC, value, sensor->unit, sensor->precision); + // packet[10] uint8_t bec_current; //#30 BEC current + value = packet[10]; + sensor = getHottSensor(HOTT_ID_ESC_BCUR); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_ESC_BCUR, 0, HOTT_TELEM_ESC, value, sensor->unit, sensor->precision); + break; + + case HOTT_PAGE_04: + // packet[4 ] uint8_t bec_temp; //#34 BEC temperature + value = packet[4] - 20; + sensor = getHottSensor(HOTT_ID_ESC_TBEC); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_ESC_TBEC, 0, HOTT_TELEM_ESC, value, sensor->unit, sensor->precision); + // packet[6 ] uint8_t motor_temp; //#36 Motor or external sensor temperature + value = packet[6] - 20; + sensor = getHottSensor(HOTT_ID_TEMP2); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_TEMP2, 0, HOTT_TELEM_ESC, value, sensor->unit, sensor->precision); + break; + } + break; + + case HOTT_TELEM_GAM: + // https://github.com/betaflight/betaflight/blob/1d8a0e9fd61cf01df7b34805e84365df72d9d68d/src/main/telemetry/hott.h#L151 + switch (packet[3]) { // Telemetry page 1,2,3,4 + case HOTT_PAGE_01: + sensor = getHottSensor(HOTT_ID_CELS); + // packet[7 ] uint8_t cell1_L; //#07 cell 1 voltage lower value. 0.02V steps, 124=2.48V + value = packet[7] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 0 << 16 | value, sensor->unit, sensor->precision); + // packet[8 ] uint8_t cell2_L; //#08 + value = packet[8] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 1 << 16 | value, sensor->unit, sensor->precision); + // packet[9 ] uint8_t cell3_L; //#09 + value = packet[9] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 2 << 16 | value, sensor->unit, sensor->precision); + // packet[10] uint8_t cell4_L; //#10 + value = packet[10] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 3 << 16 | value, sensor->unit, sensor->precision); + // packet[11] uint8_t cell5_L; //#11 + value = packet[11] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 4 << 16 | value, sensor->unit, sensor->precision); + // packet[12] uint8_t cell6_L; //#12 + value = packet[12] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 5 << 16 | value, sensor->unit, sensor->precision); + // packet[13] uint8_t batt1_L; //#13 battery 1 voltage LSB value. 0.1V steps. 50 = 5.5V + break; + + case HOTT_PAGE_02: + if (prev_page == ((HOTT_TELEM_GAM << 4) | HOTT_PAGE_01)) { + // packet[4 ] uint8_t batt1_H; //#14 + value = prev_value + (packet[4] << 8); + sensor = getHottSensor(HOTT_ID_VOLT2); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_VOLT2, 0, HOTT_TELEM_GAM, value, sensor->unit, sensor->precision); + } + // packet[5 ] uint8_t batt2_L; //#15 battery 2 voltage LSB value. 0.1V steps. 50 = 5.5V + // packet[6 ] uint8_t batt2_H; //#16 + value = packet[5] + (packet[6] << 8); + sensor = getHottSensor(HOTT_ID_VOLT3); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_VOLT3, 0, HOTT_TELEM_GAM, value, sensor->unit, sensor->precision); + // packet[7 ] uint8_t temperature1; //#17 temperature 1. offset of 20. a value of 20 = 0�C + value = packet[7] - 20; + sensor = getHottSensor(HOTT_ID_TEMP1); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_TEMP1, 0, HOTT_TELEM_GAM, value, sensor->unit, sensor->precision); + // packet[8 ] uint8_t temperature2; //#18 temperature 2. offset of 20. a value of 20 = 0�C + value = packet[8] - 20; + sensor = getHottSensor(HOTT_ID_TEMP2); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_TEMP2, 0, HOTT_TELEM_GAM, value, sensor->unit, sensor->precision); + // packet[9 ] uint8_t fuel_procent; //#19 Fuel capacity in %. Values 0--100, graphical display ranges: 0-25% 50% 75% 100% + value = packet[9]; + sensor = getHottSensor(HOTT_ID_FUEL); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_FUEL, 0, HOTT_TELEM_GAM, value, sensor->unit, sensor->precision); + // packet[10] uint8_t fuel_ml_L; //#20 Fuel in ml scale. Full = 65535! + // packet[11] uint8_t fuel_ml_H; //#21 + // packet[12] uint8_t rpm_L; //#22 RPM in 10 RPM steps. 300 = 3000rpm + // packet[13] uint8_t rpm_H; //#23 + value = (packet[12] + (packet[13] << 8)) * 10; + sensor = getHottSensor(HOTT_ID_RPM1); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_RPM1, 0, HOTT_TELEM_GAM, value, sensor->unit, sensor->precision); + break; + + case HOTT_PAGE_03: + // packet[4 ] uint8_t altitude_L; //#24 altitude in meters. offset of 500, 500 = 0m + // packet[5 ] uint8_t altitude_H; //#25 + value = packet[4] + (packet[5] << 8) - 500; + sensor = getHottSensor(HOTT_ID_ALT); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_ALT, 0, HOTT_TELEM_GAM, value, sensor->unit, sensor->precision); + // packet[6 ] uint8_t climbrate_L; //#26 climb rate in 0.01m/s. Value of 30000 = 0.00 m/s + // packet[7 ] uint8_t climbrate_H; //#27 + value = packet[6] + (packet[7] << 8) - 30000; + sensor = getHottSensor(HOTT_ID_VARIO); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_VARIO, 0, HOTT_TELEM_GAM, value, sensor->unit, sensor->precision); + // packet[8 ] uint8_t climbrate3s; //#28 climb rate in m/3sec. Value of 120 = 0m/3sec + // packet[9 ] uint8_t current_L; //#29 current in 0.1A steps + // packet[10] uint8_t current_H; //#30 + value = packet[9] + (packet[10] << 8); + sensor = getHottSensor(HOTT_ID_AMP1); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_AMP1, 0, HOTT_TELEM_GAM, value, sensor->unit, sensor->precision); + // packet[11] uint8_t main_voltage_L; //#31 Main power voltage using 0.1V steps + // packet[12] uint8_t main_voltage_H; //#32 + value = packet[11] + (packet[12] << 8); + sensor = getHottSensor(HOTT_ID_VOLT1); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_VOLT1, 0, HOTT_TELEM_GAM, value, sensor->unit, sensor->precision); + // packet[13] uint8_t batt_cap_L; //#33 used battery capacity in 10mAh steps + break; + + case HOTT_PAGE_04: + // packet[4 ] uint8_t batt_cap_H; //#34 + if (prev_page == ((HOTT_TELEM_GAM << 4) | HOTT_PAGE_03)) { + value = prev_value + (packet[4] << 8); + sensor = getHottSensor(HOTT_ID_BCAPA); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_BCAPA, 0, HOTT_TELEM_GAM, value, sensor->unit, sensor->precision); + } + // packet[5 ] uint8_t speed_L; //#35 (air?) speed in km/h(?) we are using ground speed here per default + // packet[6 ] uint8_t speed_H; //#36 + value = packet[5] + (packet[6] << 8); + sensor = getHottSensor(HOTT_ID_AIR_SPEED); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_AIR_SPEED, 0, HOTT_TELEM_GAM, value, sensor->unit, sensor->precision); + // packet[7 ] uint8_t min_cell_volt; //#37 minimum cell voltage in 2mV steps. 124 = 2,48V + // packet[8 ] uint8_t min_cell_volt_num; //#38 number of the cell with the lowest voltage + // packet[9 ] uint8_t rpm2_L; //#39 RPM in 10 RPM steps. 300 = 3000rpm + // packet[10] uint8_t rpm2_H; //#40 + value = (packet[9] + (packet[10] << 8)) * 10; + sensor = getHottSensor(HOTT_ID_RPM2); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_RPM2, 0, HOTT_TELEM_GAM, value, sensor->unit, sensor->precision); + // packet[11] uint8_t general_error_number;//#41 Voice error == 12. TODO: more docu + // packet[12] uint8_t pressure; //#42 Pressure up to 16bar. 0,1bar scale. 20 = 2bar + break; + } + break; + + case HOTT_TELEM_EAM: + // https://github.com/betaflight/betaflight/blob/1d8a0e9fd61cf01df7b34805e84365df72d9d68d/src/main/telemetry/hott.h#L288 + switch (packet[3]) { // Telemetry page 1,2,3,4 + case HOTT_PAGE_01: + sensor = getHottSensor(HOTT_ID_CELS); + // packet[7 ] uint8_t cell1_L; //#07 cell 1 voltage lower value. 0.02V steps, 124=2.48V + value = packet[7] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 0 << 16 | value, sensor->unit, sensor->precision); + // packet[8 ] uint8_t cell2_L; //#08 + value = packet[8] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 1 << 16 | value, sensor->unit, sensor->precision); + // packet[9 ] uint8_t cell3_L; //#09 + value = packet[9] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 2 << 16 | value, sensor->unit, sensor->precision); + // packet[10] uint8_t cell4_L; //#10 + value = packet[10] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 3 << 16 | value, sensor->unit, sensor->precision); + // packet[11] uint8_t cell5_L; //#11 + value = packet[11] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 4 << 16 | value, sensor->unit, sensor->precision); + // packet[12] uint8_t cell6_L; //#12 + value = packet[12] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 5 << 16 | value, sensor->unit, sensor->precision); + // packet[13] uint8_t cell7_L; //#13 + // value = packet[13] << 1; + // if(value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 6 << 16 | value, sensor->unit, sensor->precision); + break; + + case HOTT_PAGE_02: + sensor = getHottSensor(HOTT_ID_CELS); + // packet[4 ] uint8_t cell1_H; //#14 cell 1 voltage high value. 0.02V steps, 124=2.48V + value = packet[4] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS_H, 0, HOTT_TELEM_EAM, 0 << 16 | value, sensor->unit, sensor->precision); + // packet[5 ] uint8_t cell2_H; //#15 + value = packet[5] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS_H, 0, HOTT_TELEM_EAM, 1 << 16 | value, sensor->unit, sensor->precision); + // packet[6 ] uint8_t cell3_H; //#16 + value = packet[6] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS_H, 0, HOTT_TELEM_EAM, 2 << 16 | value, sensor->unit, sensor->precision); + // packet[7 ] uint8_t cell4_H; //#17 + value = packet[7] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS_H, 0, HOTT_TELEM_EAM, 3 << 16 | value, sensor->unit, sensor->precision); + // packet[8 ] uint8_t cell5_H; //#18 + value = packet[8] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS_H, 0, HOTT_TELEM_EAM, 4 << 16 | value, sensor->unit, sensor->precision); + // packet[9 ] uint8_t cell6_H; //#19 + value = packet[9] << 1; + if (value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS_H, 0, HOTT_TELEM_EAM, 5 << 16 | value, sensor->unit, sensor->precision); + // packet[10] uint8_t cell7_H; //#20 + //value = packet[10] << 1; + //if(value) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_CELS, 0, HOTT_TELEM_EAM, 13 << 16 | value, sensor->unit, sensor->precision); + // packet[11] uint8_t batt1_voltage_L; //#21 battery 1 voltage lower value in 100mv steps, 50=5V. optionally cell8_L value 0.02V steps + // packet[12] uint8_t batt1_voltage_H; //#22 + value = packet[11] + (packet[12] << 8); + sensor = getHottSensor(HOTT_ID_VOLT2); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_VOLT2, 0, HOTT_TELEM_EAM, value, sensor->unit, sensor->precision); + + // packet[13] uint8_t batt2_voltage_L; //#23 battery 2 voltage lower value in 100mv steps, 50=5V. optionally cell8_H value. 0.02V steps + break; + + case HOTT_PAGE_03: + if (prev_page == ((HOTT_TELEM_EAM << 4) | HOTT_PAGE_02)) { + // packet[4 ] uint8_t batt2_voltage_H; //#24 + value = prev_value + (packet[4] << 8); + sensor = getHottSensor(HOTT_ID_VOLT3); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_VOLT3, 0, HOTT_TELEM_EAM, value, sensor->unit, sensor->precision); + } + // packet[5 ] uint8_t temp1; //#25 Temperature sensor 1. 20=0�, 46=26� - offset of 20. + value = packet[5] - 20; + sensor = getHottSensor(HOTT_ID_TEMP1); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_TEMP1, 0, HOTT_TELEM_EAM, value, sensor->unit, sensor->precision); + // packet[6 ] uint8_t temp2; //#26 temperature sensor 2 + value = packet[6] - 20; + sensor = getHottSensor(HOTT_ID_TEMP2); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_TEMP2, 0, HOTT_TELEM_EAM, value, sensor->unit, sensor->precision); + + // packet[7 ] uint8_t altitude_L; //#27 Attitude lower value. unit: meters. Value of 500 = 0m + // packet[8 ] uint8_t altitude_H; //#28 + value = packet[7] + (packet[8] << 8) - 500; + sensor = getHottSensor(HOTT_ID_ALT); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_ALT, 0, HOTT_TELEM_EAM, value, sensor->unit, sensor->precision); + + // packet[9 ] uint8_t current_L; //#29 Current in 0.1 steps + // packet[10] uint8_t current_H; //#30 + value = packet[9] + (packet[10] << 8); + sensor = getHottSensor(HOTT_ID_AMP1); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_AMP1, 0, HOTT_TELEM_EAM, value, sensor->unit, sensor->precision); + // packet[11] uint8_t main_voltage_L; //#31 Main power voltage (drive) in 0.1V steps + // packet[12] uint8_t main_voltage_H; //#32 + value = packet[11] + (packet[12] << 8); + sensor = getHottSensor(HOTT_ID_VOLT1); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_VOLT1, 0, HOTT_TELEM_EAM, value, sensor->unit, sensor->precision); + // packet[13] uint8_t batt_cap_L; //#33 used battery capacity in 10mAh steps + break; + + case HOTT_PAGE_04: + // packet[4 ] uint8_t batt_cap_H; //#34 + if (prev_page == ((HOTT_TELEM_EAM << 4) | HOTT_PAGE_03)) { + value = prev_value + (packet[4] << 8); + sensor = getHottSensor(HOTT_ID_BCAPA); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_BCAPA, 0, HOTT_TELEM_EAM, value, sensor->unit, sensor->precision); + } + + // packet[5 ] uint8_t climbrate_L; //#35 climb rate in 0.01m/s. Value of 30000 = 0.00 m/s + // packet[6 ] uint8_t climbrate_H; //#36 + value = packet[5] + (packet[6] << 8) - 30000; + sensor = getHottSensor(HOTT_ID_VARIO); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_VARIO, 0, HOTT_TELEM_EAM, value, sensor->unit, sensor->precision); + + // packet[7 ] uint8_t climbrate3s; //#37 climbrate in m/3sec. Value of 120 = 0m/3sec + // packet[8 ] uint8_t rpm_L; //#38 RPM. Steps: 10 U/min + // packet[9 ] uint8_t rpm_H; //#39 + value = (packet[8] + (packet[9] << 8)) * 10; + sensor = getHottSensor(HOTT_ID_RPM1); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_RPM1, 0, HOTT_TELEM_EAM, value, sensor->unit, sensor->precision); + // packet[10] uint8_t electric_min; //#40 Electric minutes. Time does start, when motor current is > 3 A + // packet[11] uint8_t electric_sec; //#41 + // packet[12] uint8_t speed_L; //#42 (air?) speed in km/h. Steps 1km/h + // packet[13] uint8_t speed_H; //#43 + value = packet[12] + (packet[13] << 8); + sensor = getHottSensor(HOTT_ID_AIR_SPEED); + setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_AIR_SPEED, 0, HOTT_TELEM_EAM, value, sensor->unit, sensor->precision); + break; + } + break; } + prev_page = (packet[2] << 4) | packet[3]; // concatenate telemetry type and page + prev_value = packet[13]; // page overflow } void hottSetDefault(int index, uint16_t id, uint8_t subId, uint8_t instance) diff --git a/radio/src/telemetry/multi.cpp b/radio/src/telemetry/multi.cpp index 55f09eed3..42f612d57 100644 --- a/radio/src/telemetry/multi.cpp +++ b/radio/src/telemetry/multi.cpp @@ -21,6 +21,7 @@ #include "telemetry.h" #include "multi.h" +constexpr int32_t MULTI_DESIRED_VERSION = (1 << 24) | (3 << 16) | (1 << 8) | 1; #define MULTI_CHAN_BITS 11 extern uint8_t g_moduleIdx; @@ -561,7 +562,7 @@ void MultiModuleStatus::getStatusString(char * statusText) const return; } - if (major <= 1 && minor <= 3 && revision <= 0 && patch < 91 && SLOW_BLINK_ON_PHASE) { + if ((((major << 24) | (minor << 16) | (revision << 8) | patch) < MULTI_DESIRED_VERSION) && SLOW_BLINK_ON_PHASE) { strcpy(statusText, STR_MODULE_UPGRADE); } else { diff --git a/radio/src/telemetry/telemetry_holders.h b/radio/src/telemetry/telemetry_holders.h index 9db8d629f..3e99b27f4 100644 --- a/radio/src/telemetry/telemetry_holders.h +++ b/radio/src/telemetry/telemetry_holders.h @@ -27,6 +27,7 @@ #define TELEMETRY_AVERAGE_COUNT 3 // we actually average one more reading! #define RAW_FRSKY_MINMAX(v) v.values[TELEMETRY_AVERAGE_COUNT-1] +#define MAX_CELLS 6 class TelemetryValue { public: diff --git a/radio/src/telemetry/telemetry_sensors.cpp b/radio/src/telemetry/telemetry_sensors.cpp index 66b0e2255..1d0eb89b6 100644 --- a/radio/src/telemetry/telemetry_sensors.cpp +++ b/radio/src/telemetry/telemetry_sensors.cpp @@ -90,6 +90,8 @@ void TelemetryItem::setValue(const TelemetrySensor & sensor, int32_t val, uint32 uint32_t data = uint32_t(newVal); uint8_t cellsCount = (data >> 24); uint8_t cellIndex = ((data >> 16) & 0x0F); + if (cellIndex >= MAX_CELLS) + return; uint16_t cellValue = (data & 0xFFFF); if (cellsCount == 0) { cellsCount = (cellIndex >= cells.count ? cellIndex + 1 : cells.count); diff --git a/radio/src/telemetry/telemetry_sensors.h b/radio/src/telemetry/telemetry_sensors.h index def941861..6ca1c0c97 100644 --- a/radio/src/telemetry/telemetry_sensors.h +++ b/radio/src/telemetry/telemetry_sensors.h @@ -57,7 +57,7 @@ class TelemetryItem } consumption; struct { uint8_t count; - CellValue values[6]; + CellValue values[MAX_CELLS]; } cells; struct { uint16_t year; // full year (4 digits) From 7df6ec4c58304249c3be7694f0f17c20ace7b380 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 30 May 2020 15:33:10 +0200 Subject: [PATCH 381/560] Cosmetics in Trainer screen --- radio/src/gui/common/stdlcd/radio_trainer.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/radio/src/gui/common/stdlcd/radio_trainer.cpp b/radio/src/gui/common/stdlcd/radio_trainer.cpp index 58c338a8d..c14e27604 100644 --- a/radio/src/gui/common/stdlcd/radio_trainer.cpp +++ b/radio/src/gui/common/stdlcd/radio_trainer.cpp @@ -21,9 +21,9 @@ #include "opentx.h" #if LCD_W >= 212 - #define TRAINER_CALIB_COLUMN_WIDTH 12 + #define TRAINER_CALIB_COLUMN_WIDTH (6 * FW) #else - #define TRAINER_CALIB_COLUMN_WIDTH 8 + #define TRAINER_CALIB_COLUMN_WIDTH (4 * FW + 2) #endif void menuRadioTrainer(event_t event) @@ -86,8 +86,8 @@ void menuRadioTrainer(event_t event) if (attr) s_editMode = 0; lcdDrawText(0*FW, MENU_HEADER_HEIGHT+1+6*FH, STR_CAL, attr); - for (uint8_t i=0; i<4; i++) { - uint8_t x = (i*TRAINER_CALIB_COLUMN_WIDTH + 16) * FW/2; + for (uint8_t i = 0; i < 4; i++) { + uint8_t x = 8*FW + (i * TRAINER_CALIB_COLUMN_WIDTH); int32_t chVal = ppmInput[i] - g_eeGeneral.trainer.calib[i]; chVal *= g_eeGeneral.trainer.mix[i].studWeight * 10; chVal /= 512; From b6dfa477ef72db92ffe3cb1fe88433ca87e0f917 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 30 May 2020 15:35:32 +0200 Subject: [PATCH 382/560] Translations cosmetics --- radio/src/translations/cz.h.txt | 2 +- radio/src/translations/fr.h.txt | 2 +- radio/src/translations/nl.h.txt | 6 +++--- radio/src/translations/pl.h.txt | 6 +++--- radio/src/translations/se.h.txt | 6 +++--- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 4c04f2bf1..ac34feec2 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -836,7 +836,7 @@ #define TR_FLASH_EXTERNAL_MULTI TR("Flash Ext. Multi", "Flash External Multi") #define TR_FIRMWARE_UPDATE_ERROR TR("Chyba zápisu FW", "Chyba zápisu firmware") #define TR_FIRMWARE_UPDATE_SUCCESS "Úspěšný zápis FW" -#define TR_WRITING TR3("\14Zapisuji..", "\032Zapisuji..", "Zapisuji..") +#define TR_WRITING "Zapisuji.." #define TR_CONFIRM_FORMAT "Provést Formát?" #define TR_INTERNALRF "Interní RF modul" #define TR_INTERNAL_MODULE "Interní modul" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index e9e87f731..80f462c09 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -857,7 +857,7 @@ #define TR_FLASH_EXTERNAL_MULTI TR("Flash Ext. Multi", "Flash External Multi") #define TR_FIRMWARE_UPDATE_ERROR TR("Erreur màj FW","Erreur de mise à jour") #define TR_FIRMWARE_UPDATE_SUCCESS "Flash ok" -#define TR_WRITING TR("\14Ecriture...", "\032Ecriture...") +#define TR_WRITING "Ecriture..." #define TR_CONFIRM_FORMAT "Confirmer Formatage?" #define TR_INTERNALRF "HF interne" #define TR_INTERNAL_MODULE TR("Module int.","Module interne") diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 397cdd636..36377aca8 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -843,9 +843,9 @@ #define TR_FLASH_EXTERNAL_MULTI TR("Flash Ext. Multi", "Flash External Multi") #define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware update error") #define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" -#define TR_WRITING "\032Schrijven..." -#define TR_CONFIRM_FORMAT "Formatteren bevestigen?" -#define TR_INTERNALRF "Interne RF" +#define TR_WRITING "Schrijven..." +#define TR_CONFIRM_FORMAT "Formatteren bevestigen?" +#define TR_INTERNALRF "Interne RF" #define TR_INTERNAL_MODULE TR("Int. module","Internal module") #define TR_EXTERNAL_MODULE TR("Ext. module","External module") #define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 370d757f6..1753b3ec3 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -856,9 +856,9 @@ #define TR_FLASH_EXTERNAL_MULTI TR("Flash Ext. Multi", "Flash External Multi") #define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware update error") #define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" -#define TR_WRITING "\032Zapis... " -#define TR_CONFIRM_FORMAT "Zatwierdź Format?" -#define TR_INTERNALRF "Wewn.Moduł RF" +#define TR_WRITING "Zapis... " +#define TR_CONFIRM_FORMAT "Zatwierdź Format?" +#define TR_INTERNALRF "Wewn.Moduł RF" #define TR_INTERNAL_MODULE TR("Int. module","Internal module") #define TR_EXTERNAL_MODULE TR("Ext. module","External module") #define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 1578d86a1..8868d8106 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -856,9 +856,9 @@ #define TR_FLASH_EXTERNAL_MULTI TR("Flash Ext. Multi", "Flash External Multi") #define TR_FIRMWARE_UPDATE_ERROR TR("FW update Error","Firmware update error") #define TR_FIRMWARE_UPDATE_SUCCESS "Flash successful" -#define TR_WRITING "\032Skriver..." -#define TR_CONFIRM_FORMAT "Formatera Minnet?" -#define TR_INTERNALRF "Intern Radio" +#define TR_WRITING "Skriver..." +#define TR_CONFIRM_FORMAT "Formatera Minnet?" +#define TR_INTERNALRF "Intern Radio" #define TR_INTERNAL_MODULE TR("Int. module","Internal module") #define TR_EXTERNAL_MODULE TR("Ext. module","External module") #define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required" From c3f0e2ea88e6b43baaba7d71d94aab7145aa1b65 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 31 May 2020 16:45:48 +0200 Subject: [PATCH 383/560] Avoid Bluetooth fifo full (and 1ms wait in the mixer task...) (#7652) Avoid Bluetooth fifo full (and 1ms wait in the mixer task...) --- radio/src/bluetooth.cpp | 19 ++++++++++--------- radio/src/fifo.h | 6 +++--- radio/src/telemetry/crossfire.cpp | 3 ++- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/radio/src/bluetooth.cpp b/radio/src/bluetooth.cpp index a977d8990..025237eb2 100644 --- a/radio/src/bluetooth.cpp +++ b/radio/src/bluetooth.cpp @@ -48,17 +48,18 @@ Bluetooth bluetooth; void Bluetooth::write(const uint8_t * data, uint8_t length) { - BLUETOOTH_TRACE("BT>"); - for (int i=0; i"); + for (int i = 0; i < length; i++) { + BLUETOOTH_TRACE(" %02X", data[i]); + btTxFifo.push(data[i]); } - btTxFifo.push(data[i]); + BLUETOOTH_TRACE(CRLF); } - BLUETOOTH_TRACE(CRLF); + else { + BLUETOOTH_TRACE("[BT] TX fifo full!" CRLF); + } + bluetoothWriteWakeup(); } diff --git a/radio/src/fifo.h b/radio/src/fifo.h index 9aff60f57..8ef67be66 100644 --- a/radio/src/fifo.h +++ b/radio/src/fifo.h @@ -71,7 +71,7 @@ class Fifo return (ridx == widx); } - bool isFull() + bool isFull() const { uint32_t next = nextIndex(widx); return (next == ridx); @@ -82,7 +82,7 @@ class Fifo return (N + widx - ridx) & (N - 1); } - uint32_t hasSpace(uint32_t n) const + bool hasSpace(uint32_t n) const { return (N > (size() + n)); } @@ -103,7 +103,7 @@ class Fifo volatile uint32_t widx; volatile uint32_t ridx; - inline uint32_t nextIndex(uint32_t idx) + static inline uint32_t nextIndex(uint32_t idx) { return (idx + 1) & (N - 1); } diff --git a/radio/src/telemetry/crossfire.cpp b/radio/src/telemetry/crossfire.cpp index 07f3577f4..c71f6ce54 100644 --- a/radio/src/telemetry/crossfire.cpp +++ b/radio/src/telemetry/crossfire.cpp @@ -69,7 +69,7 @@ const CrossfireSensor & getCrossfireSensor(uint8_t id, uint8_t subId) void processCrossfireTelemetryValue(uint8_t index, int32_t value) { - if(!TELEMETRY_STREAMING()) + if (!TELEMETRY_STREAMING()) return; const CrossfireSensor & sensor = crossfireSensors[index]; @@ -201,6 +201,7 @@ void processCrossfireTelemetryData(uint8_t data) auxSerialPutc(data); } #endif + #if defined(AUX2_SERIAL) if (g_eeGeneral.aux2SerialMode == UART_MODE_TELEMETRY_MIRROR) { aux2SerialPutc(data); From ad83a78901ab78eb4598de77bae605084020ee30 Mon Sep 17 00:00:00 2001 From: Neil Horne Date: Mon, 1 Jun 2020 00:46:56 +1000 Subject: [PATCH 384/560] Align companion telemetry sensor units to radio (#7653) * Align cpn sensor units to radio * Add cpn conversion for sensor unit --- .../src/firmwares/opentx/opentxeeprom.cpp | 6 ++++++ companion/src/firmwares/sensordata.h | 21 ++++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index e39d04180..b49a4a7ab 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -1983,6 +1983,12 @@ class SensorField: public TransformedField { sensor.unit++; } + if (version < 219) { + if (sensor.unit > SensorData::UNIT_FLOZ) { + sensor.unit += 11; + } + } + qCDebug(eepromImport) << QString("imported %1").arg(internalField.getName()); } diff --git a/companion/src/firmwares/sensordata.h b/companion/src/firmwares/sensordata.h index 65a8a4957..3f995ea3e 100644 --- a/companion/src/firmwares/sensordata.h +++ b/companion/src/firmwares/sensordata.h @@ -74,10 +74,13 @@ class SensorData { UNIT_METERS_PER_SECOND, UNIT_FEET_PER_SECOND, UNIT_KMH, + UNIT_SPEED = UNIT_KMH, UNIT_MPH, UNIT_METERS, + UNIT_DIST = UNIT_METERS, UNIT_FEET, UNIT_CELSIUS, + UNIT_TEMPERATURE = UNIT_CELSIUS, UNIT_FAHRENHEIT, UNIT_PERCENT, UNIT_MAH, @@ -91,18 +94,30 @@ class SensorData { UNIT_MILLILITERS, UNIT_FLOZ, UNIT_MILLILITERS_PER_MINUTE, + UNIT_MAX = UNIT_MILLILITERS_PER_MINUTE, + UNIT_SPARE1, + UNIT_SPARE2, + UNIT_SPARE3, + UNIT_SPARE4, + UNIT_SPARE5, + UNIT_SPARE6, + UNIT_SPARE7, + UNIT_SPARE8, + UNIT_SPARE9, + UNIT_SPARE10, UNIT_HOURS, UNIT_MINUTES, UNIT_SECONDS, // FrSky format used for these fields, could be another format in the future - UNIT_FIRST_VIRTUAL, + UNIT_FIRST_VIRTUAL, UNIT_CELLS = UNIT_FIRST_VIRTUAL, UNIT_DATETIME, UNIT_GPS, + UNIT_BITFIELD, + UNIT_TEXT, + // Internal units (not stored in sensor unit) UNIT_GPS_LONGITUDE, UNIT_GPS_LATITUDE, - UNIT_GPS_LONGITUDE_EW, - UNIT_GPS_LATITUDE_NS, UNIT_DATETIME_YEAR, UNIT_DATETIME_DAY_MONTH, UNIT_DATETIME_HOUR_MIN, From 64def18735782cb126ca54925762f71b22f328da Mon Sep 17 00:00:00 2001 From: cheki <4509524+ku2works@users.noreply.github.com> Date: Mon, 1 Jun 2020 16:05:56 +0900 Subject: [PATCH 385/560] updated japanese translation. (#7656) Co-authored-by: ku2works --- companion/src/translations/companion_ja.ts | 2257 +++++++++++--------- 1 file changed, 1300 insertions(+), 957 deletions(-) diff --git a/companion/src/translations/companion_ja.ts b/companion/src/translations/companion_ja.ts index ddc8b2c37..da32c47fc 100644 --- a/companion/src/translations/companion_ja.ts +++ b/companion/src/translations/companion_ja.ts @@ -108,94 +108,94 @@ 送信機プロファイル - - - - - - + + + + + + Select Folder フォルダの選択 - - + + The profile specific folder, if set, will override general Backup folder プロファイル保存フォルダが指定される場合は、バックアップフォルダを上書き保存します - + Splash Screen 起動イメージ - + Select Image イメージの選択 - + Clear Image イメージの消去 - + Profile Name プロファイル名 - + Radio Type 送信機タイプ - + Menu Language メニュー言語 - + Build Options ビルドオプション - + SD Structure path SDカード保存先パス - + Backup folder バックアップフォルダ - + If set it will override the application general setting 設定されている場合はアプリケーション設定を上書き保存します - + if set, will override general backup enable 設定されている場合は有効なバックアップを上書き保存します - - + + Enable automatic backup before writing firmware 設定した場合は自動バックアップを有効にします - + General Settings 一般設定 - + Default Stick Mode 初期スティックモード - + Mode selection: Mode 1: @@ -218,464 +218,479 @@ Mode 4: - + Mode 1 (RUD ELE THR AIL) モード1 (左:エレベーター・ラダー 右:スロットル・エルロン) - + Mode 2 (RUD THR ELE AIL) モード2 (左:スロットル・ラダー 右:エレベーター・エルロン) - + Mode 3 (AIL ELE THR RUD) モード3 (左:エレベーター・エルロン 右:スロットル・ラダー) - + Mode 4 (AIL THR ELE RUD) モード4 (左:スロットル・エルロン 右:エレベーター・ラダー) - + Default Channel Order 初期チャンネルマップ - + <html><head/><body><p>Channel order</p><p><br/></p><p>Defines the order of the default mixes created on a new model.</p></body></html> <html><head/><body><p>チャンネルマップ</p><p><br/></p><p>モデル作成された際の初期チャンネルマップを定義します</p></body></html> - + R E T A ↔RUD ↕ELE ↕THR ↔AIL [R E T A] - + R E A T ↔RUD ↕ELE ↔AIL ↕THR [R E A T] - + R T E A ↔RUD ↕THR ↕ELE ↔AIL [R T E A] - + R T A E ↔RUD ↕THR ↔AIL ↕ELE [R T A E] - + R A E T ↔RUD ↔AIL ↕ELE ↕THR [R A E T] - + R A T E ↔RUD ↔AIL ↕THR ↕ELE [R A T E] - + E R T A ↕ELE ↔RUD ↕THR ↔AIL [E R T A] - + E R A T ↕ELE ↔RUD ↔AIL ↕THR [E R A T] - + E T R A ↕ELE ↕THR ↔RUD ↔AIL [E T R A] - + E T A R ↕ELE ↕THR ↔AIL ↔RUD [E T A R] - + E A R T ↕ELE ↔AIL ↔RUD ↕THR [E A R T] - + E A T R ↕ELE ↔AIL ↕THR ↔RUD [E A T R] - + T R E A ↕THR ↔RUD ↕ELE ↔AIL [T R E A] - + T R A E ↕THR ↔RUD ↔AIL ↕ELE [T R A E] - + T E R A ↕THR ↕ELE ↔RUD ↔AIL [T E R A] - + T E A R ↕THR ↕ELE ↔AIL ↔RUD [T E A R] - + T A R E ↕THR ↔AIL ↔RUD ↕ELE [T A R E] - + T A E R ↕THR ↔AIL ↕ELE ↔RUD [T A E R] - + A R E T ↔AIL ↔RUD ↕ELE ↕THR [A R E T] - + A R T E ↔AIL ↔RUD ↕THR ↕ELE [A R T E] - + A E R T ↔AIL ↕ELE ↔RUD ↕THR [A E R T] - + A E T R ↔AIL ↕ELE ↕THR ↔RUD [A E T R] - + A T R E ↔AIL ↕THR ↔RUD ↕ELE [A T R E] - + A T E R ↔AIL ↕THR ↕ELE ↔RUD [A T E R] - + Append version number to FW file name ファームウェア ファイル名にバージョン番号を追加 - + + Simulator controls + シミュレータ コントロール + + + + Save switch/pot positions on simulator exit + シミュレータ終了時にスイッチ/ポットのポジションを保存 + + + + Clear saved positions + 保存したポジションを消去 + + + Offer to write FW to Tx after download ダウンロード後、送信機にFWを適用可能な事を通知 - + Other Settings その他の設定 - + Application Settings アプリケーション設定 - + Automatic check for OpenTX firmware updates OpenTXファームアップデートの自動チェック - + Automatic check for Companion updates Companionアップデートの自動チェック - + most recently used files 最近使用したファイル - + Startup Settings スタートアップ設定 - + Google Earth Executable Google Earthの実行 - + Automatic Backup Folder 自動バックアップフォルダ - + Remember ファイル履歴 - - Show splash screen when Companion starts - Companion起動時に起動イメージを表示 - - - + Output Logs Folder ログ出力フォルダ - + <html><head/><body><p>This option maintains the behaviour from older OpenTx versions where empty model slots are preserved when a model is deleted or moved. </p><p>When this option is de-selected, the other models may be re-arranged to fill the gap left by the removed model.</p></body></html> <html><head/><body><p>このオプションは、機体モデルが削除または移動した際、そのモデルスロットが保持される旧版のOpenTxバージョンの挙動を維持します。</p><p>このオプションが選択されない場合は、他の機体モデルは削除により残された差異を埋めるために並べ替えるかもしれません。</p></body></html> - + Remove empty model slots when deleting models (only applies for radios w/out categories) モデルを削除するとき同時に空モデルスロットを削除 (カテゴリなしの機体モデルにのみ適用) - + Use model wizard 機体モデルウィザードを使用 - + Open model editor 機体モデルエディタを開く - + Just create the model 機体モデルの作成のみ - + Debug Output Logging 出力したログのデバッグ - + Only show user splash images オリジナルの起動イメージのみを表示 - + Show user and companion splash images オリジナルとCompanion標準イメージを表示 - + + Show splash screen + 起動イメージを表示 + + + Select Executable 実行ファイル選択 - + <html><head/><body><p>Keep a log of all debugging messages generated by the desktop Companion/Simulator applications. An OpenTX developer may request this to help diagnose an issue.</p></body></html> <html><head/><body><p>デスクトップのCompanion / シミュレータ アプリケーションにより生成された、すべてのデバッグメッセージのログを保存します。OpenTX開発者は問題を診断・解析するため、ログを要求するかもしれません。</p></body></html> - + Application (Companion/Simulator) アプリケーション (Companion / シミュレータ) - + <html><head/><body><p>Keep a log of all messages generated by the radio firmware when running in Simulator. This is the same information one would also see in the Simulator <span style=" font-style:italic;">Debug Output</span> window.</p></body></html> <html><head/><body><p>シミュレータで実行しているときは、送信機ファームウェアによって生成されたすべてのメッセージのログを保存してください。これはシミュレータの<span style = "font-style:italic;">デバッグ出力</span>ウィンドウにも同じ情報が表示されます。</p></body></html> - + Radio Firmware (in Simulator) 送信機ファームウェア (シミュレータ内) - + Splash Screen Library 起動イメージライブラリ - + User Splash Screens オリジナル起動イメージ - + Action on New Model 機体モデル新規作成 - + Release channel リリース状態 選択 - + Releases (stable) リリース版 (Stable) - + Release candidates (testing) Release candidates RC版 (Testing) - + Nightly builds (unstable) ナイトリービルド版 (Unstable) - + + Prompt for radio profile + 送信機プロファイルの呼び出し + + + Simulator Settings シミュレータ設定 - + Calibrate キャリブレート - + Blue 青色 - + Green 緑色 - + Red 赤色 - + Orange オレンジ - + Yellow 黄色 - + Screenshot capture folder 画面キャプチャフォルダ - + Only capture to clipboard キャプチャをクリップボードのみにコピー - + Enable 有効 - + Joystick スティック - + Simulator BackLight バックライト - - Remember simulator switch values - シミュレータで設定した各スイッチの値を記憶 - - - + Simulator Volume Gain シミュレータ 音量幅 - + My Radio マイ送信機 - + <p><b>You cannot switch Radio Type or change Build Options while there are unsaved file changes. What do you wish to do?</b></p> <ul><li><i>Save All</i> - Save any open file(s) before saving Settings.<li><li><i>Reset</i> - Revert to the previous Radio Type and Build Options before saving Settings.</li><li><i>Cancel</i> - Return to the Settings editor dialog.</li></ul> <p><b>ファイル変更後で保存されていない間は、送信機タイプの切り替えやビルドオプションの変更はできません。保存しますか?</b></p> <ul><li><i>すべて保存</i> - 設定を保存する前に、開いているファイルをすべて保存します  <li><li><i>リセット</i> - 設定を保存する前に、以前の送信機タイプとビルドオプションに戻します </li><li><i>キャンセル</i> - 設定エディタダイアログに戻ります </li></ul> - + Select your snapshot folder 画面キャプチャフォルダ選択してください - + Note: Nightly builds are not available in this version, Release/RC update channel will be used. 注: このバージョンではナイトリービルドは使用できません。リリース/RC版のアップデートチャネルが使用されます。 - - + + No joysticks found スティックが認識できません - + EMPTY: No radio settings stored in profile 空: プロファイルに送信機設定が保存されていません - + AVAILABLE: Radio settings of unknown age 利用可能: 詳細不明の送信機設定 - + AVAILABLE: Radio settings stored %1 利用可能: 送信機設定は %1 に保存されています - + Select your library folder ライブラリフォルダを選択してください - - + + Select your Models and Settings backup folder 機体モデルの選択とバックアップフォルダの設定をしてください - + Select a folder for application logs アプリケーションログフォルダを選択してください - + Select Google Earth executable Google Earth実行有無を選択してください - + Select the folder replicating your SD structure SDカード保存先フォルダを選択してください - + Open Image to load イメージを開いてロードします - + Images (%1) イメージ (%1) @@ -715,58 +730,58 @@ Mode 4: Boards - + Left Horizontal 左・横 - + Left Vertical 左・縦 - + Right Vertical 右・縦 - + Right Horizontal 右・横 - + Aux. 1 AUX. 1 - + Aux. 2 AUX. 2 - - + + Unknown 不明 - + Rud ラダー - + Ele エレベーター - + Thr スロットル - + Ail エルロン @@ -815,84 +830,124 @@ Mode 4: Channels - + Name 名称 - + Subtrim サブトリム - + Min 最小 - + Max 最大 - + Direction 方向 - + Curve カーブ - + PPM Center PPM センター - + Linear Subtrim 線形サブトリム - + CH%1 CH%1 - + Popup menu available 利用可能なポップアップメニュー - + --- --- - + INV リバース - - &Copy - &コピー - - - - &Cut - &切り取り + + Delete Channel. Are you sure? + チャンネルを削除します。よろしいですか? - &Paste - &貼り付け + Copy + コピー - &Delete - &削除 + Cut + 切り取り + + + + Paste + 貼り付け + + + + Clear + 消去 + + + + Insert + 挿入 + + + + Delete + 削除 + + + + Move Up + 上へ移動 + + + + Move Down + 下へ移動 + + + + Clear All + すべて消去 + + + + Clear Channel. Are you sure? + チャンネルを消去します。よろしいですか? + + + + Clear all Channels. Are you sure? + チャンネルをすべて消去します。よろしいですか? @@ -1310,7 +1365,7 @@ If you have a settings backup file, you may import that instead. CurveData - + CV CV @@ -1450,79 +1505,109 @@ If you have a settings backup file, you may import that instead. 点のサイズ - + Curve %1 カーブ %1 - + Popup menu available 利用可能なポップアップメニュー - + %1 points %1 点 - + Linear 線形 - + Single Expo シングルエクスポ - + Symmetrical f(x)=-f(-x) 対称 f(x)=-f(-x) - + Symmetrical f(x)=f(-x) 対称 f(x)=f(-x) - + Editing curve %1 カーブ %1 編集 - + Not enough free points in EEPROM to store the curve. EEPROMにカーブを保存する十分な空き容量がありません。 - + Copy コピー - + + Cut + 切り取り + + + Paste 貼り付け - + Clear 消去 - - Clear all curves - すべてのカーブ消去 + + Insert + 挿入 - - Are you sure you want to reset curve %1? - カーブ %1をリセットしてもよいですか? + + Delete + 削除 - - Are you sure you want to reset all curves? - すべてのカーブをリセットしてもよいですか? + + Move Up + 上へ移動 + + + + Move Down + 下へ移動 + + + + Clear All + すべて消去 + + + + Clear Curve. Are you sure? + カーブを消去します。よろしいですか? + + + + Clear all Curves. Are you sure? + カーブをすべて消去します。よろしいですか? + + + + Delete Curve. Are you sure? + カーブを削除します。よろしいですか? @@ -1569,193 +1654,198 @@ If you have a settings backup file, you may import that instead. + Trainer Channels + トレーナー チャンネル + + + Instant Trim トリム - + Play Sound サウンド 再生 - + Haptic タッチパネル - + Reset リセット - + Set Timer %1 設定: タイマー %1 - + Vario バリオ - + Play Track トラック 再生 - + Play Both 両方 実行 - + Play Value 値 実行 - + Play Script スクリプト 実行 - + SD Logs SDログ - + Volume 音量 - + Backlight バックライト - + Screenshot 画面キャプチャ - + Background Music BGM - + Background Music Pause BGM一時停止 - + Adjust %1 アジャスト %1 - + SetFailsafe Int. Module 設定: フェイルセーフ 内部モジュール - + SetFailsafe Ext. Module 設定: フェイルセーフ 外部モジュール - + RangeCheck Int. Module レンジチェック 内部モジュール - + RangeCheck Ext. Module レンジチェック 外部モジュール - + Bind Int. Module バインド 内部モジュール - + Bind Ext. Module バインド 外部モジュール - + Timer1 タイマー1 - + Timer2 タイマー2 - + Timer3 タイマー3 - + Flight フライト - + Telemetry テレメトリー - + Rotary Encoder エンコーダ再生 - + REa エンコーダ再生a - + REb エンコーダ再生b - + s s - - - + + + <font color=red><b>Inconsistent parameter</b></font> <font color=red><b>矛盾しているパラメータ</b></font> - + Value 値 - + played once, not during startup 起動時以外 1回実行 - + repeat(%1s) リピート(%1s) - + DISABLED 無効 - + CFN CFN @@ -1815,42 +1905,82 @@ If you have a settings backup file, you may import that instead. %1 - - &Copy - &コピー + + Delete Special Function. Are you sure? + スペシャルファンクションを削除します。よろしいですか? - - &Cut - &切り取り + + Copy + コピー - - &Paste - &貼り付け + + Cut + 切り取り - - &Delete - &削除 + + Paste + 貼り付け - + + Clear + 消去 + + + + Insert + 挿入 + + + + Delete + 削除 + + + + Move Up + 上へ移動 + + + + Move Down + 下へ移動 + + + + Clear All + すべて消去 + + + + Clear Special Function. Are you sure? + スペシャルファンクションを消去します。よろしいですか? + + + + Clear all Special Functions. Are you sure? + スペシャルファンクションをすべて消去します。よろしいですか? + + + Value 値 - + Source 選択元 - + GVAR GVAR - + Increment 増加 @@ -2043,23 +2173,23 @@ If you have a settings backup file, you may import that instead. このボードでは選択元 %1 をエクスポートできません! - + OpenTX only accepts %1 points in all curves OpenTXはすべてのカーブで %1 点のみを許容します - + OpenTx only accepts %1 points in all curves OpenTxはすべてのカーブで %1 点のみを許容します - - + + OpenTX on this board doesn't accept this function このボード上のOpenTXはこの機能を受け付けません - + OpenTX doesn't accept this radio protocol OpenTXはこの送信機プロトコルを受け付けません @@ -2139,12 +2269,12 @@ To <b>remove a remembered entry</b> from the filter list, first cho フィルタをON / OFFします。 - + <html><head><style>kbd {background-color: palette(alternate-base); font-size: large; white-space: nowrap;}</style></head><body><p>The filter supports two syntax types: basic matching with common wildcards as well as full Perl-style (<code>pcre</code>) Regular Expressions.</p><p>By default a filter will only show lines which match (<b>inclusive</b>). To make an <b>exclusive</b> filter which removes matching lines, prefix the filter expression with a <kbd>!</kbd> (exclamation mark).</p><p>To use <b>Regular Expressions</b> (RegEx), prefix the filter text with a <kbd>/</kbd> (slash) or <kbd>^</kbd> (up caret). <ul><li>Put the <kbd>/</kbd> or <kbd>^</kbd> after the exclusive <kbd>!</kbd> indicator if you're using one.</li><li>By default the match is case-sensitive. To make it insensitive, add the typical <kbd>/i</kbd> (slash i) operator at the end of your RegEx.</li><li>If you use a caret (^) to denote a RegEx, it will become part of the Reg. Ex. (that is, matches from start of line).</li><li>If the RegEx is invalid, the filter edit field should show a red border and you will not be able to enable the filter.</li><li>A useful resource for testing REs (with a full reference) can be found at <a href="http://www.regexr.com/">http://www.regexr.com/</a></li></ul></p><p>To use <b>basic matching</b> just type any text.<ul><li>Wildcards: <kbd>*</kbd> (asterisk) matches zero or more of any character(s), and <kbd>?</kbd> (question mark) matches any single character.</li><li>The match is always case-insensitive.</li><li>The match always starts from the beginning of a log line. To ignore characters at the start, use a leading <kbd>*</kbd> wildcard.</li><li>A trailing <kbd>*</kbd> is always implied (that is, matches anything to the end of the log line). To avoid this, use a RegEx.</li><li>You can match literal wildcard characters by prefixing them with a <kbd>\</kbd> (backslash) character (eg. "foo\*bar" matches "foo*bar").</li></ul></p><p>After <b>editing text</b>, press ENTER or TAB key (or click anywhere outside the box) to update the filter.</p><p>To <b>remove an entry</b> from the filter selector list, first choose it, and while in the line editor press <kbd>Shift-Delete</kbd> (or <kbd>Shift-Backspace</kbd>) key combination. The default filters cannot be removed. Up to 50 filters are stored.</p></body></html> <html><head><style>kbd {background-color: palette(alternate-base); font-size: large; white-space: nowrap;}</style></head><body><p>フィルタは2つのシンタックスタイプをサポートしています: 一般的なワイルドカードを用いた完全一致、そして完全なPerlスタイル (<code>pcre</code>) 正規表現です。初期値ではフィルタは一致する (<b>包括的</b>) な行のみを表示します。一致する行を削除する<b>排他的</b>フィルタを作成するには、フィルタ式の先頭に<kbd>!</kbd>(Exclamationマーク)を付けます。</p><p>To use <b>Regular Expressions</b> (RegEx), prefix the filter text with a <kbd>/</kbd> (slash) or <kbd>^</kbd> (up caret). <b>正規表現</b> (RegEx)を使用するには、フィルタテキストの先頭に<kbd>/</kbd> (スラッシュ) または<kbd>^</kbd>(アップキャレット)を付けます。<ul><li>既に <kbd>/</kbd> または <kbd>^</kbd> を使用している場合は、 <kbd>!</kbd> の後ろに置きます。</li><li>初期値では大文字と小文字が区別されます。それを鈍感にするには、正規表現の最後に典型的な <kbd>/i</kbd> (スラッシュ+i)演算子を追加します。</li> <li> 正規表現を表すためにキャレット『^』を使用すると、それは正規表現の一部になります。例(つまり、行頭から一致します。)</li> <li> 正規表現が無効な場合、フィルタ編集フィールドには赤い枠が表示されフィルタを有効にすることはできません。</li> <li> 正規表現のテストに役立つリソース(参考文献)は、<a href="http://www.regexr.com/"> http://www.regexr.com/にあります。</a></li> </ul></p><p><b>標準一致 basic matching</b> を使用するには、テキストを入力するだけです。<ul><li>ワイルドカード: <kbd>*</kbd> (アスタリスク)は0個以上の任意の文字に一致し、 <kbd>?</kbd> (クエスチョンマーク) は任意の1文字に一致します。</li><li>この一致では常に大文字と小文字が区別されません。</li><li>一致は常にログの先頭行から始まります。 先頭の文字を無視するには、先頭に<kbd>*</kbd>ワイルドカードを使用します。</li><li>末尾の <kbd>*</kbd> は常に暗黙的に指定されます。(つまり、ログ末尾行までが対象) これを回避するには、正規表現を使用します。</li><li>リテラルワイルドカード文字の前に <kbd>\</kbd> (バックスラッシュ) 文字を付けることで一致させることができます。(例: "foo\*bar"は"foo*bar"と一致)</li></ul></p><p><b>テキスト編集</b>後、EnterまたはTabキーを押して (またはボックスの外側をクリックし) フィルタを更新します。</p><p>フィルタセレクタリストから<b>エントリー削除</b>をするには、まずエントリーを選択しエディタで<kbd>Shift+Delete</kbd> (または<kbd>Shift+Backspace</kbd>) を押します。デフォルトのフィルタは削除できません。また最大50個のフィルタが保存されています。</p></body></html> - + Debug Console Filter Help デバッグコンソールフィルタ ヘルプ @@ -2795,275 +2925,279 @@ Blank means include all. ?, *, and [...] wildcards accepted. Firmware - + Channel values displayed in us 表示されるチャンネル値 - + No OverrideCH functions available 使用可能な上書きチャンネル機能はありません - + Possibility to enable FAI MODE (no telemetry) at field フィールドでFAIモード (テレメトリーなし) を有効にする可能性 - + FAI MODE (no telemetry) always enabled FAIモード (テレメトリーなし) を常に有効 - + Removes D8 FrSky protocol support which is not legal for use in the EU on radios sold after Jan 1st, 2015 2015/01/01以降に販売された送信機に対し、EUでの使用に適さないD8 FrSkyプロトコルサポートを削除 - + Enable non certified firmwares 認定されていないファームウェアを有効にする - - + + Disable HELI menu and cyclic mix support HELIメニューとサイクリックミックスサポートを無効にする - - + + Disable Global variables グローバル変数を無効にする - - + + Enable Lua custom scripts screen Luaカスタムスクリプト画面を有効にする - + Use alternative SQT5 font SQT5 代替フォントを使用する - + Pots use in menus navigation メニューナビゲーションでダイヤルを使用 - + FrSky Taranis X9D+ FrSky Taranis X9D+ - + Support for PPM internal module hack PPM内部モジュールハックのサポート - + + Disable RAS (SWR) RAS (SWR)を無効にする - + FrSky Taranis X9D+ 2019 - + FrSky Taranis X9D FrSky Taranis X9D - + Haptic module installed タッチパネル対応モジュールをインストール - + FrSky Taranis X9E FrSky Taranis X9E - + Confirmation before radio shutdown 送信機シャットダウン前の確認 - + Horus gimbals installed (Hall sensors) Horusジンバル (ホールセンサー) をインストール - + FrSky Taranis X9-Lite FrSky Taranis X9-Lite - - - - - - Support for auto update on boot - 起動時の自動更新サポート - - - + FrSky Taranis X9-Lite S - + FrSky Taranis X7 / X7S FrSky Taranis X7 / X7S - + FrSky Taranis X-Lite S/PRO FrSky Taranis X-Lite S/PRO - + FrSky Taranis X-Lite FrSky Taranis X-Lite - + FrSky Horus X10 / X10S FrSky Horus X10 / X10S - - FrSky Horus X10 / X10S Express - - - - + FrSky Horus X12S FrSky Horus X12S - + Use ONLY with first DEV pcb version 初期DEV pcbバージョンでのみ使用 - - Jumper T16 / T16+ - - - - + + Support for MULTI internal module MULTI内部モジュールのサポート - + + Support for bluetooth module Bluetoothモジュールのサポート - + Turnigy 9XR-PRO Turnigy 9XR-PRO - + Enable HELI menu and cyclic mix support HELIメニューとサイクリックミックスのサポートを有効にする - + Global variables グローバル変数 - + In model setup menus automatically set source by moving the control モデル設定メニューでは、コントローラーを動かし自動的に選択元を設定します - + In model setup menus automatically set switch by moving the control モデル設定メニューでは、コントローラーを動かし自動的にスイッチを設定します - + No graphical check boxes and sliders グラフィカルなチェックボックスとスライダーはありません - + Battery graph バッテリーグラフ - + Don't use bold font for highlighting active items 有効なアイテムを強調表示するために太字フォントを使用しない - - + + FrSky Taranis X7 / X7S Access + FrSky Taranis X7 / X7S ACCESS + + + + Support for ACCESS internal module replacement ACCESS内部モジュール変更のサポート - - Jumper T12 - - - - - Enable non certified R9M firmwares - 非認定 R9Mファームウェアを有効 - - - + Turnigy 9XR with m128 chip Turnigy 9XR m128チップ搭載 - + Turnigy 9XR Turnigy 9XR - + 9X with stock board 9X ストックボード - + Enable resetting values by pressing up and down at the same time 上下に同時に押し、値のリセットを有効にする - + 9X with stock board and m128 chip 9X ストックボード+m128 chip - + 9X with AR9X board 9X AR9Xボード - + + FrSky Horus X10 Express / X10S Express + FrSky Horus X10 Express / X10S Express + + + + Jumper T12 / T12 Pro + Jumper T12 / T12 Pro + + + + Jumper T16 / T16+ / T16 Pro + Jumper T16 / T16+ / T16 Pro + + + + Radiomaster TX16s / TX16s Hall / TX16s Masterfire + Radiomaster TX16s / TX16s Hall / TX16s Masterfire + + + + Support internal GPS + 内蔵GPSサポート + + + 9X with Sky9x board 9X Sky9Xボード - + 9X with Gruvin9x board 9X Gruvin9X - + DIY MEGA2560 radio DIY MEGA2560 送信機 @@ -3538,11 +3672,21 @@ You are currently using: Switch スイッチ + + + trim6 + トリム6 + + + + trim5 + トリム5 + FlightModeData - + FM FM @@ -3550,122 +3694,200 @@ You are currently using: FlightModePanel - + + Popup menu available 利用可能なポップアップメニュー - + Trim disabled トリム 無効 - + Own Trim 独自トリム - + Use Trim from Flight mode %1 フライトモードからトリムを使用してください %1 - + Use Trim from Flight mode %1 + Own Trim as an offset フライトモードからトリムを使用してください %1+オフセット独自トリム - + Rotary Encoder %1 ロータリーエンコーダ %1 - + Name 名称 - + Value source 元値 - + Value 値 - + Unit ユニット - + Prec - + Min 最小 - + Max 最大 - + Popup enabled ポップアップ有効 - + GVAR%1 - + 0._ - + 0.0 0.0 - - - &Clear - &消去 + + Warning: Global variable links back to itself. Flight Mode 0 value used. + 警告: フライトモード0の値を使用するとグローバル変数としてリンクされます。 - - + + Warning: Rotary encoder links back to itself. Flight Mode 0 value used. + 警告: フライトモード0の値を使用するとロータリーエンコーダとしてリンクされます。 + + + + + Copy + コピー + + + + + Cut + 切り取り + + + + + Paste + 貼り付け + + + + + Insert + 挿入 + + + + + Delete + 削除 + + + + + Move Up + 上へ移動 + + + + + Move Down + 下へ移動 + + + + + Clear All + すべて消去 + + + + Clear Flight Mode. Are you sure? + フライトモードを消去します。よろしいですか? + + + + Clear all Flight Modes. Are you sure? + フライトモードをすべて消去します。よろしいですか? + + + + Delete Flight Mode. Are you sure? + フライトモードを削除します。よろしいですか? + + + + Clear selected Global Variable across all Flight Modes. Are you sure? + すべてのフライトモードの選択したグローバル変数を消去します。よろしいですか? + + + + Clear all Global Variables for all Flight Modes. Are you sure? + すべてのフライトモードのすべてのグローバル変数を消去します。よろしいですか? + + + + Clear all Global Variables for this Flight Mode. Are you sure? + このフライトモードのすべてのグローバル変数を消去します。よろしいですか? + + + + Clear 消去 - - - Clear all current Flight Mode properties? - 現在のフライトモードのプロパティをすべて消去しますか? - FlightModesPanel - + Flight Mode %1 フライトモード %1 - + (%1) (%1) - + (default) (初期値) @@ -3993,7 +4215,7 @@ These will be relevant for all models in the same EEPROM. GeneralSettings - + Radio Settings 送信機設定 @@ -4462,6 +4684,11 @@ p, li { white-space: pre-wrap; } Show splash screen on startup 起動時、起動イメージ表示 + + + nnnnnnNN + nnnnnnNN + Power On Delay @@ -4648,11 +4875,6 @@ Acceptable values are 5v..10v Owner Registration ID オーナー登録ID - - - aaaaaaAA - - R E T A @@ -5283,8 +5505,8 @@ Are you sure ? HardwarePanel - - + + None なし @@ -5304,67 +5526,67 @@ Are you sure ? 3 ポジション - + Pot with detent ダイヤル (ノッチあり) - + Multipos switch マルチPosスイッチ - + Pot without detent ダイヤル (ノッチなし) - + Slider with detent スライダー (ノッチあり) - + OFF OFF - + Enabled 有効 - + Telemetry テレメトリー - + Trainer トレーナー - + Internal 内部 - + Ask 確認 - + Per model Per モデル - + Internal + External 内部 + 外部 - + External 外部 @@ -5491,138 +5713,171 @@ Are you sure ? InputsPanel - + + Move Up 上へ移動 - + Ctrl+Up - + + Move Down 下へ移動 - + Ctrl+Down Clear All Inputs - すべての入力を消去 + すべての入力項目を消去 - - Not enough available inputs! - 入力項目が足りません! + + Not enough available Inputs! + 入力項目が不足しています! - - Delete Selected Inputs? - 選択した入力を削除しますか? + + Delete selected Inputs. Are you sure? + 選択した入力項目を削除します。よろしいですか? - + + Lines + 直線 + + + &Add &追加 - + Ctrl+A - + &Edit &編集 - + Enter Enter - + &Delete &削除 - + + Delete 削除 - + &Copy &コピー - + Ctrl+C - + &Cut &切り取り - + Ctrl+X - + &Paste &貼り付け - + Ctrl+V - + Du&plicate &複製 - + Ctrl+U - - Clear Inputs? - 入力を消去しますか? + + Input + 入力 - - Really clear all the inputs? - すべての入力を本当に消去しますか? + + Insert + 挿入 + + + + Clear + 消去 + + + + Clear All + すべて消去 + + + + Clear all Inputs. Are you sure? + すべての入力項目を消去します。よろしいですか? + + + + Clear Input. Are you sure? + 入力項目を消去します。よろしいですか? + + + + Delete Input. Are you sure? + 入力項目を削除します。よろしいですか? LimitData - + INV リバース - + NOR ノーマル - + CH CH @@ -5761,69 +6016,104 @@ Are you sure ? LogicalSwitchesPanel - + Function 機能 - + V1 - + V2 - + AND Switch & スイッチ - + Duration 期間 - + Delay 遅延 - + Popup menu available 利用可能なポップアップメニュー - + (instant) (瞬間) - + (infinite) (無制限) - - &Copy - &コピー - - - - &Cut - &切り取り + + Delete Logical Switch. Are you sure? + 論理スイッチを削除します。よろしいですか? - &Paste - &貼り付け + Copy + コピー - &Delete - &削除 + Cut + 切り取り + + + + Paste + 貼り付け + + + + Clear + 消去 + + + + Insert + 挿入 + + + + Delete + 削除 + + + + Move Up + 上へ移動 + + + + Move Down + 下へ移動 + + + + Clear All + すべて消去 + + + + Clear all Logical Switches. Are you sure? + 論理スイッチをすべて消去します。よろしいですか? @@ -5971,8 +6261,8 @@ The columns for altitude "GAlt" and for speed "GSpd" are opt - total duration - 合計期間 + time span + 期間 @@ -6003,123 +6293,123 @@ The columns for altitude "GAlt" and for speed "GSpd" are opt MainWindow - + Diskimage (*.dmg) ディスクイメージ (*.dmg) - + Would you like to open the disk image to install the new version? 新しいバージョンをインストールするためにディスクイメージを開きますか? - + Executable (*.exe) 実行ファイル (*.exe) - - + + Would you like to launch the installer? インストーラを起動しますか? - - + + File loaded ファイルがロードされました - + Checking for updates アップデートの確認 - + A new version of Companion is available (version %1)<br>Would you like to download it? Companionの新しいバージョンがあります。 (version %1)<br>ダウンロードしますか? - - + + Save As 名前を付けて保存 - + New release available 新リリースが利用可能 - + A new release of Companion is available, please check the <a href='%1'>OpenTX website!</a> Companionの新リリースが利用可能です。<a href='%1'>OpenTX Webサイト</a>をチェックしてください - - + + No updates available at this time. 現時点で利用可能なアップデートはありません。 - + Error opening file %1: %2. ファイル %1 を開くときにエラーが発生しました: %2. - + Not enough flash available on this board for all the selected options 選択されたすべてのオプションに対してこのボードでは十分な書き込みが行えません - + Compilation server temporary failure, try later コンパイルサーバが一時的に失敗しました。後程お試しください - + Compilation server too busy, try later コンパイルサーバがビジー状態です。後程お試しください - + Compilation error コンパイルエラー - + Invalid firmware 無効なファームウェア - + Invalid board 無効なボード - + Invalid language 無効な言語 - + Unknown server failure, try later 不明なサーバの障害です。後程お試しください - + Do you want to write the firmware to the radio now ? 今すぐファームウェアを送信機に書き込みますか? - + Firmware update check failed, new version information not found or invalid. ファームウェアアップデートの確認に失敗しました。新しいバージョン情報が見つからないか、または無効です。 - + Firmware %1 does not seem to have ever been downloaded. Version %2 is available. Do you want to download it now? @@ -6132,31 +6422,31 @@ We recommend you view the release notes using the button below to learn about an 重要な変更については、下のボタンをクリックしてリリースノートを参照することをお勧めします。 - - + + Yes はい - - + + No いいえ - - + + Release Notes リリースノート - - + + Do you want to download version %1 now ? 今すぐバージョン %1 をダウンロードしますか? - + A new version of %1 firmware is available: - current is %2 - newer is %3 @@ -6173,29 +6463,29 @@ We recommend you view the release notes using the button below to learn about an 重要な変更については、下のボタンをクリックしてリリースノートを参照することをお勧めします。 - + Ignore this version %1? このバージョン %1 を無視しますか? - + The new theme will be loaded the next time you start Companion. 次回Companionを起動したときに、新しいテーマがロードされます。 - - + + Open Models and Settings file 機体モデルと設定ファイルを開く - + File saved ファイル 保存 - + There are unsaved file changes which you may lose when switching radio types. Do you wish to continue? @@ -6204,780 +6494,780 @@ Do you wish to continue? そのまま続けますか? - - + + Synchronize SD SDカードを同期する - + No local SD structure path configured! SDカード保存先パスが設定されていません! - + No Companion release candidates are currently being served for this version, please switch release channel 現在このバージョンのCompanion RC版は提供されていません。リリース状態を切り替えてください - + No nightly Companion builds are currently being served for this version, please switch release channel 現在、このバージョンのCompanion ナイトリービルド版は提供されていません。リリース状態を切り替えてください - + No Companion release builds are currently being served for this version, please switch release channel このバージョンのCompanion リリース版は現在提供されていません。リリース状態を切り替えてください - + Companion update check failed, new version information not found. Companionアップデートの確認に失敗しました。新しいバージョン情報が見つかりません。 - + No firmware release candidates are currently being served for this version, please switch release channel 現在、このバージョンのファームウェア RC版は提供されていません。リリース状態を切り替えてください - + No firmware nightly builds are currently being served for this version, please switch release channel 現在、このバージョンのファームウェア ナイトリービルド版は提供されていません。リリース状態を切り替えてください - + No firmware release builds are currently being served for this version, please switch release channel 現在、このバージョンのファームウェア リリース版は提供されていません。リリース状態を切り替えてください - + Release candidate builds are now available for this version, would you like to switch to using them? RC版はこのバージョンで利用可能になりました。それらに切り替えますか? - + Channel changed to RC, please restart the download process リリース状態をRC版に変更しました。ダウンロードプロセスを再起動してください - + Official release builds are now available for this version, would you like to switch to using them? このバージョンの公式リリース版が利用可能になりました。それらに切り替えますか? - + Channel changed to Release, please restart the download process リリース状態をリリース版に変更しました。ダウンロードプロセスを再起動してください - + This radio (%1) is not currently available in this firmware release channel この送信機 (%1) は、現在このファームウェアリリース状態では利用できません - + No Radio or SD card detected! 送信機またはSDカードが検出されませんでした! - + Local Folder ローカルフォルダ - + Radio Folder 送信機フォルダ - - + + Read Firmware from Radio 送信機からファームウェアを読み込み - - + + Read Models and Settings from Radio 送信機から機体モデルや設定を読み込み - + Models and Settings read 機体モデルと設定の読み込み - - + + This function is not yet implemented この機能はまだ実装されていません - + Save Radio Backup to File 送信機のバックアップをファイルに保存 - + Read Radio Firmware to File 送信機ファームウェアからファイルへの読み込み - + OpenTX Home Page: <a href='%1'>%1</a> OpenTX ホームページ: <a href='%1'>%1</a> - + The OpenTX Companion project was originally forked from <a href='%1'>eePe</a> OpenTX Companionプロジェクトは元々<a href='%1'>eePe</a>から派生しました - + If you've found this program useful, please support by <a href='%1'>donating</a> このプログラムが役に立つと感じた場合は、<a href='%1'>寄付</a>でのサポートをお願いします - + Copyright OpenTX Team Copyright OpenTX Team - + About Companion Companionについて - + OpenTX Companion %1 - Radio: %2 - Profile: %3 OpenTX Companion %1 - 送信機: %2 - プロファイル: %3 - + New 新規 - + Create a new Models and Settings file 新規モデルと設定ファイルを作成します - + Open... 開く... - + Save 保存 - - + + Save Models and Settings file 機体モデルと設定ファイルを保存します - + Save As... 名前を付けて保存... - + Close 閉じる - + Close Models and Settings file 機体モデルと設定ファイルを閉じます - + Exit 終了 - + Exit the application アプリケーションを終了します - + About... バージョン情報... - + Show the application's About box アプリケーションのバージョン情報を表示します - + Recent Files 最近使用したファイル - + List of recently used files 最近使用したファイルを一覧表示 - + Radio Profiles 送信機プロファイル - + Create or Select Radio Profiles 送信機プロファイルを作成または選択します - + View Log File... ログファイルを表示... - + Open and view log file ログファイルを開いて表示します - + Settings... 設定... - + Edit Settings 設定を編集します - + Download... ダウンロード... - + Download firmware and voice files ファームウェアと音声ファイルをダウンロードします - + Check for Updates... アップデートのチェック... - + Check OpenTX and Companion updates OpenTXとCompanionのアップデートを確認します - + Release notes... リリースノート... - + Show release notes リリースノートを表示します - + Compare Models... 機体モデルを比較... - + Compare models 機体モデルを比較します - + Edit Radio Splash Image... 送信機の起動イメージを編集... - + Edit the splash image of your Radio 送信機の起動イメージを編集します - + List programmers... プログラムを一覧表示... - + List available programmers 利用可能なプログラムを一覧表示します - + Fuses... ヒューズ... - + Show fuses dialog ヒューズダイアログを表示します - + Read firmware from Radio 送信機からファームウェアを読み込み - + Write Firmware to Radio 送信機にファームウェアを書き込み - + Write firmware to Radio 送信機にファームウェアを書き込み - + SD card synchronization SDカードの同期 - + Manuals and other Documents マニュアルと他の文書 - + Open the OpenTX document page in a web browser WebブラウザでOpenTXドキュメントページを開く - + Write Models and Settings To Radio 機体モデルと設定を送信機に書き込み - + Write Models and Settings to Radio 機体モデルと設定を送信機に書き込み - + Read Models and Settings From Radio 送信機から機体モデルや設定を読み込み - + Configure Communications... 送信機疎通を設定... - + Configure software for communicating with the Radio 送信機と疎通するためのソフトウェアを設定します - + Write Backup to Radio 送信機からバックアップを書き出す - + Write Backup from file to Radio 送信機ファイルからバックアップを書き出します - + Backup Radio to File ファイルを送信機にバックアップ - + Save a complete backup file of all settings and model data in the Radio すべての設定とモデルデータの完全なバックアップファイルを送信機に保存します - + Contributors... 貢献者... - + A tribute to those who have contributed to OpenTX and Companion OpenTXとCompanionに貢献した人々への賛辞 - + Add Radio Profile 送信機プロファイルの追加 - + Create a new Radio Settings Profile 新しい送信機設定プロファイルを作成します - + Copy Current Radio Profile 現在の送信機プロファイルをコピー - + Duplicate current Radio Settings Profile 現在の送信機設定プロファイルを複製します - + Delete Current Radio Profile... 現在の送信機プロファイルを削除... - + Delete the current Radio Settings Profile 現在の送信機設定プロファイルを削除します - + Export Application Settings.. アプリケーション設定のエクスポート.. - + Save all the current %1 and Simulator settings (including radio profiles) to a file. 現在のすべての%1およびシミュレータ設定(送信機プロファイル含)をファイルに保存します。 - + Import Application Settings.. アプリケーション設定をインポート.. - + Load %1 and Simulator settings from a prevously exported settings file. 以前にエクスポートした設定ファイルから%1とシミュレーション設定を読み込みます。 - + Tabbed Windows タブ付きウィンドウ - + Use tabs to arrange open windows. 開いているウィンドウを並べ替えるのにタブを使用します。 - + Tile Windows ウィンドウのタイトル - + Arrange open windows across all the available space. 利用可能なすべてのスペースに開いているウィンドウを配置します。 - + Cascade Windows ウィンドウを重ねる - + Arrange all open windows in a stack. 開いているウィンドウをすべて重ねて配置します。 - + Close All Windows すべてのウィンドウを閉じる - + Closes all open files (prompts to save if necessary. 開いているファイルをすべて閉じます (必要に応じ保存を求められます)。 - - + + Edit 編集 - - + + File ファイル - + Settings 設定 - + Set Icon Theme アイコンテーマ設定 - + Set Icon Size アイコンサイズ設定 - + Read/Write 読み込み/書き込み - + Window ウィンドウ - - + + Help ヘルプ - + Write 書き込み - + Some text will not be translated until the next time you start Companion. Please note that some translations may not be complete. 次にCompanionを起動するまで一部のテキストは翻訳されません。いくつかの翻訳は完全ではないかもしれませんのでご注意ください。 - + Ctrl+Shift+S - + Ctrl+Alt+L - + Ctrl+Alt+D - + Ctrl+Alt+R - + Classical クラシック - + The classic companion9x icon theme クラシック Companion9x アイコンテーマ - + Yerico イェリコ - + Yellow round honey sweet icon theme Yellow round honey sweet アイコンテーマ - + Monochrome モノクローム - + A monochrome black icon theme A monochrome black アイコンテーマ - + MonoBlue モノブルー - + A monochrome blue icon theme A monochrome blue アイコンテーマ - + MonoWhite モノホワイト - + A monochrome white icon theme A monochrome white アイコンテーマ - + Small 小サイズ - + Use small toolbar icons 小サイズのツールバーアイコンを使用 - + Normal 標準サイズ - + Use normal size toolbar icons 標準サイズのツールバーアイコンを使用 - + Big 大サイズ - + Use big toolbar icons 大サイズのツールバーアイコンを使用 - + Huge 特大サイズ - + Use huge toolbar icons 特大サイズのツールバーアイコンを使用 - + Set Menu Language メニュー言語を設定 - + System language システム言語 - + Use default system language. デフォルトのシステム言語を使用します。 - + Use %1 language (some translations may not be complete). %1言語を使用します (一部の翻訳が不完全な場合あり)。 - + Ready 準備完了 - + %2 %2 - + Alt+%1 - + New Radio 新規 送信機 - + - Copy - コピー - + Companion :: Open files warning Companion :: ファイルを開くときの警告 - + Please save or close modified file(s) before deleting the active profile. 有効なプロファイルを削除する前に、変更したファイルを保存するか閉じてください。 - + Not possible to remove profile プロファイルを削除できません - + The default profile can not be removed. デフォルトプロファイルは削除できません。 - + Confirm Delete Profile プロファイル削除の確認 - + Are you sure you wish to delete the "%1" radio profile? There is no way to undo this action! 『%1』送信機プロファイルを削除してもよろしいですか?この操作を元に戻すことはできません! - + Please save or close all modified files before importing settings 設定をインポートする前に、変更したファイルをすべて保存するか閉じてください - + <html><p>%1 and Simulator settings can be imported (restored) from a previosly saved export (backup) file. This will replace current settings with any settings found in the file.</p><p>An automatic backup of the current settings will be attempted. But if the current settings are useful then it is recommended that you make a manual backup first.</p><p>For best results when importing settings, <b>close any other %1 windows you may have open, and make sure the standalone Simulator application is not running.</p><p>Do you wish to continue?</p></html> <html><p>%1とシミュレータの設定は、以前に保存したエクスポート(バックアップ)ファイルからインポート(復元)できます。これにより、現在の設定がファイル内の設定に置き換えられます。</p><p>現在の設定の自動バックアップが実行されます。ただし、現在の設定が便利な場合は、まず手動バックアップを作成することをお勧めします。</p><p>設定をインポートし最良の結果を得るには、<b>開いている%1ウィンドウをすべて閉じます。スタンドアロンのシミュレーターアプリケーションが実行されていません。</p><p>続行しますか?</p></html> - + Confirm Settings Import 設定のインポートの確認 - + Select %1: %1を選択: - + backup バックアップ - + Press the 'Ignore' button to continue anyway. とにかく続行するには『無視』ボタンを押してください。 - + The settings could not be imported. 設定をインポートできませんでした。 - + <html><p>New settings have been imported from:<br> %1.</p><p>%2 will now re-initialize.</p><p>Note that you may need to close and restart %2 before some settings like language and icon theme take effect.</p> <html><p>新しい設定は次の場所からインポートされました。<br>%1.</p><p>%2は再初期化されます。</p><p>場合によっては閉じて再起動する必要があります。言語やアイコンテーマなどの設定が有効になる前に%2が発生しました。</p> - + <p>The previous settings were backed up to:<br> %1</p> <p>以前の設定は次の場所にバックアップされました:<br> %1</p> @@ -7194,159 +7484,164 @@ Do you wish to continue? 空き容量 - + + read only + 読み取りのみ + + + New category Translators do NOT use accent for this, this is the default category name on Horus. 新規カテゴリ - + Category index out of range. カテゴリインデックスが範囲外です。 - + Cannot delete the last category. 最後のカテゴリは削除できません。 - + This category is not empty! このカテゴリは空ではありません! - + Cannot insert model, last model in list would be deleted. 機体モデルを挿入できません。リストの最後のモデルが削除されます。 - + Cannot add model, could not find an available model slot. 機体モデルを追加できません。利用可能なモデルスロットが見つかりません。 - + New model Translators: do NOT use accents here, this is a default model name. 新規モデル - + Cannot paste model, out of available model slots. 利用可能なモデルスロットから、機体モデルを貼り付けることができません。 - + You are replacing an existing model, are you sure? 既存の機体モデルを差し替えます。よろしいですか? - + Do you want to overwrite radio general settings? 送信機の一般設定を上書きしますか? - + Delete %n selected model(s)? 選択した機体モデルを %n つ削除しますか? - + Delete %n selected category(ies)? 選択したカテゴリ(ies)を %n つ削除しますか? - + Cannot duplicate model, could not find an available model slot. 機体モデルを複製できません。利用なモデルスロットが見つかりません。 - + Editing model %1: 機体モデル %1 を編集しています: - + Save As 名前を付けて保存 - + %1 has been modified. Do you want to save your changes? %1 は変更されました。 変更を保存しますか? - + <p><b>Currently selected radio type (%1) is not compatible with file %3 (from %2), models and settings need to be converted.</b></p> <p><b>現在選択されている送信機タイプ (%1) はファイル %3 (from %2) と互換性がありません。機体モデルと設定を変換する必要があります。</b></p> - + Do you wish to continue with the conversion? 変換を続けますか? - + Choose <i>Apply</i> to convert the file, or <i>Close</i> to close it without conversion. ファイルを変換するには<i>適用</i>を、変換せずに閉じるには<i>閉じる</i>を選択します。 - + <b>The conversion generated some important messages, please review them below.</b> <b>変換によっていくつかの重要なメッセージが出力されました。下記の内容を確認してください。</b> - + Companion :: Conversion Result for %1 Companion :: %1 の変換結果 - - Unable to find Horus radio SD card! - Horus送信機のSDカードが見つかりません! + + Unable to find radio SD card! + 送信機のSDカードが見つかりません! - + Models and Settings written 機体モデルと設定が書かれました - + Cannot write temporary file! 一時ファイルを書き込めません! - + Open backup Models and Settings file バックアップ機体モデルと設定ファイルを開く - + Unable to find file %1! ファイル %1 が見つかりません! - + Error opening file %1: %2. ファイル %1 を開くときにエラーが発生しました: %2. - + Error reading file %1: %2. ファイル %1 の読み取りエラーです: %2. - + Invalid binary backup File %1 無効なバイナリバックアップファイルです %1 @@ -7354,12 +7649,12 @@ Do you want to save your changes? MixData - + MIX ミックス - + (@%1) @@ -7754,12 +8049,12 @@ If blank then the mix is considered to be "ON" all the time. ModelData - + Model: 機体モデル: - + Throttle Source スロットル値 @@ -8700,12 +8995,7 @@ If blank then the mix is considered to be "ON" all the time. 受信機 3 - - Bind on startup - 起動時バインド - - - + Low Power 低パワー @@ -8715,158 +9005,183 @@ If blank then the mix is considered to be "ON" all the time. 警告: 送信出力を変更するには再バインドが必要です - + Channels チャンネル - + PPM delay PPM 遅延 - + us - + PPM Frame Length PPM フレーム長 - + ms ms - + Antenna アンテナ - + Output type 出力タイプ - + Open Drain オープン ドレン - + Push Pull プッシュ プル - + Option value オプション値 - + Protocol プロトコル - + Registration ID 登録ID - + Multi Radio Protocol マルチプロトコル - + Sub Type サブタイプ - + Failsafe Mode フェイルセーフモード - + Not set 設定なし - + Hold ホールド - + Custom カスタム - + No Pulses パルスなし - + Receiver 受信機 - + Trainer Mode トレーナーモード - + Master/Jack マスター/Jack - + Slave/Jack スレーブ/Jack - + Master/SBUS Module マスター/SBUSモジュール - + Master/CPPM Module マスター/CPPMモジュール - + Master/SBUS in battery compartment マスター/バッテリーカバー内SBUB - + WARNING: Requires non-certified firmware! 警告: 未認定のR9Mファームウェアが必要です! - + + Master/Bluetooth + マスター/Bluetooth + + + + Slave/Bluetooth + スレーブ/Bluetooth + + + + Master/Multi + マスター/Multi + + + + Disable Telemetry + テレメトリー無効 + + + + Disable Ch. Map + チャンネルマップ無効 + + + Failsafe Positions フェイルセーフポジション - + Show values in: 値の表示: - + % abbreviation for percent - + μs abbreviation for microseconds @@ -8948,12 +9263,12 @@ If blank then the mix is considered to be "ON" all the time. 100mW - 16CH (テレメトリーなし) - + Positive ノーマル - + Negative リバース @@ -8961,40 +9276,50 @@ If blank then the mix is considered to be "ON" all the time. ModulePanel - + Value 値 - + Hold ホールド - + No Pulse パルスなし - + Ask 確認 - + Internal 内部 - + Internal + External 内部 + 外部 - + External 外部 + + + Autodetect Format + フォーマット自動検出 + + + + Bind on channel + チャンネルへバインド + MultiModelPrinter @@ -9492,11 +9817,6 @@ If blank then the mix is considered to be "ON" all the time. DEFAULT 初期値 - - - Custom - proto %1) - カスタム - プロトコル%1) - MultirotorPage @@ -9524,22 +9844,22 @@ If blank then the mix is considered to be "ON" all the time. OpenTxEepromInterface - + Unknown error 不明のエラー - + ... plus %1 errors ...追加 %1 エラー - + Cannot write radio settings 送信機設定を書き込めません - + Cannot write model %1 機体モデル %1 を書き込めません @@ -9644,6 +9964,19 @@ If blank then the mix is considered to be "ON" all the time. ODFファイル (*.odt);;PDFファイル (*.pdf);;HTMLファイル (*.htm *.html);;すべてのファイル (*) + + ProfileChooserDialog + + + Select Profile + プロファイル選択 + + + + Profile + プロファイル + + ProgressDialog @@ -9812,8 +10145,8 @@ If blank then the mix is considered to be "ON" all the time. - Unable to find Horus radio SD card! - Horus送信機のSDカードが見つかりません! + Unable to find radio SD card! + 送信機のSDカードが見つかりません! @@ -10750,7 +11083,12 @@ X - + + ml/minute + + + + TELE @@ -10930,25 +11268,90 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi SetupPanel - + + Popup menu available + 利用可能なポップアップメニュー + + + Timer %1 タイマー %1 - + THR - + Profile Settings プロファイル設定 - + SD structure path not specified or invalid SDカード保存先パスが指定されていないか無効です + + + Copy + コピー + + + + Cut + 切り取り + + + + Paste + 貼り付け + + + + Clear + 消去 + + + + Insert + 挿入 + + + + Delete + 削除 + + + + Move Up + 上へ移動 + + + + Move Down + 下へ移動 + + + + Clear All + すべて消去 + + + + Clear Timer. Are you sure? + タイマーを消去します。よろしいですか? + + + + Clear all Timers. Are you sure? + タイマーをすべて消去します。よろしいですか? + + + + Delete Timer. Are you sure? + タイマーを削除します。よろしいですか? + SimpleTailPage @@ -11671,62 +12074,62 @@ The default is configured in the chosen Radio Profile. 送信機シミュレータ (%1) - + Could not determine startup data source. 起動データ元を特定できませんでした。 - + Could not load data, possibly wrong format. データをロードできません、フォーマットが間違っている可能性があります。 - + Data Load Error データロード エラー - + Invalid startup data provided. Plese specify a proper file/path. 無効なスタートアップデータが提供されました。正しいファイル/パスを指定してください。 - + Simulator Startup Error シミュレータ スタートアップ エラー - + Error saving data: could open file for writing: '%1' データ保存エラー: 書き込み用にファイルを開くことができました: 「%1」 - + Error saving data: could not get data from simulator interface. データ保存エラー: シミュレータのインターフェイスからデータを取得できませんでした。 - + An unexpected error occurred while attempting to save radio data to file '%1'. 送信機データをファイル「%1」に保存しようとしたときに予期せぬエラーが発生しました。 - + Data Save Error データ保存 エラー - + Cannot open joystick, joystick disabled スティックが接続不可、もしくはスティックが無効です - + Radio firmware error: %1 送信機 ファームウェア エラー: %1 - + - Flight Mode %1 (#%2) - フライトモード %1 (#%2) @@ -12427,104 +12830,104 @@ Too many errors, giving up. TelemetryPanel - + Telemetry screen %1 テレメトリースクリーン %1 - + FrSky S.PORT - + FrSky D - + FrSky D (cable) - + Source 信号元 - + Low Alarm 低アラーム - + Critical Alarm クリティカルアラーム - + Winged Shadow How High Winged Shadow How High - + Winged Shadow How High (not supported) Winged Shadow How High (サポートなし) - + Alti - + Alti+ - + VSpeed - - - + + + A1 - - - + + + A2 - - + + A3 - - + + A4 - - + + FAS - + Cells セル - + --- --- @@ -12537,274 +12940,284 @@ Too many errors, giving up. フォーム - + + TELE## + TELE## + + + Custom カスタム - + Calculated 計算値 - + Id ID - + Instance インスタンス - + Rx 受信 - + Add 追加 - + Average 平均 - + Min 最小 - + Max 最大 - + Multiply 乗算 - + Totalize 合計 - + Cell セル - + Consumption 消費 - + Dist 距離 - + Cells Sensor : セル センサー : - - - - - - - - + + + + + + + + --- --- - + GPS Sensor : GPS センサー : - + Alt. Sensor : 高度 センサー : - + Sensor : センサー : - + Raw (-) Raw (-) - + V V - + A - + mA - + kt - + m/s - + ft/s - + km/h - + mph - + m 分 - + ft - + °C - + °F - + % - + mAh - + W - + mW - + dBm - + RPM - + g - + ° - + Rad - + mL - + US fl.Oz. - + + ml/min + + + + Precision 精度 - + Ratio レシオ - + Blades ブレード - + Offset オフセット - + Multiplier 乗算 - + Auto Offset 自動オフセット - + Filter フィルタ - + Persistent 持続 - + Positive ノーマル - + Logs ログ @@ -12812,25 +13225,70 @@ Too many errors, giving up. TelemetrySensorPanel - + + TELE%1 + + + + + Popup menu available + 利用可能なポップアップメニュー + + + Lowest より低く - + Cell %1 セル %1 - + Highest より高く - + Delta 差分 + + + Copy + コピー + + + + Cut + 切り取り + + + + Paste + 貼り付け + + + + Clear + 消去 + + + + Clear All + すべて消去 + + + + Clear Telemetry Sensor. Are you sure? + テレメトリーセンサーを消去します。よろしいですか? + + + + Clear all Telemetry Sensors. Are you sure? + テレメトリーセンサーのすべてを消去します。よろしいですか? + TelemetrySimulator @@ -13209,12 +13667,12 @@ hh:mm:ss TimerData - + TMR - + Timer %1 タイマー %1 @@ -14192,119 +14650,4 @@ Press Cancel to abort joystick calibration without saving. キャリブレーションが完了していません。そのまま保存しますか? - - preferencesDialog - - - Preferences - 設定 - - - - Simu BackLight - シミュレータ バックライト - - - - Simulator capture folder - シミュレータ キャプチャフォルダ - - - - Joystick - スティック - - - - Remember simulator switches - シミュレータスイッチの記憶 - - - - Enable - 有効 - - - - Use clipboard only - クリップボードのみを使用 - - - - Calibrate - キャリブレート - - - - Blue - 青色 - - - - Green - 緑色 - - - - Red - 赤色 - - - - Orange - オレンジ - - - - Yellow - 黄色 - - - - - Open Folder - フォルダを開く - - - - Personal splash library - 個人イメージライブラリ - - - - Include companion splashes - 標準Companion起動イメージ - - - - Only user defined splashes - ユーザ設定の起動イメージのみ - - - - Splash library behaviour - 起動イメージライブラリの動作 - - - - Custom TX splash screen - カスタム起動イメージ - - - - Open Image - イメージを開く - - - - - ... - ... - - - - Invert Pixels - ピクセルを反転 - - From c6eedb1cbed3d8dacf2afa5c8f04676e0a1f1e6c Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 1 Jun 2020 12:49:06 +0200 Subject: [PATCH 386/560] Option INTERNAL_MODULE_PPM=YES was broken --- radio/src/pulses/pulses.cpp | 7 +++++++ radio/src/pulses/pulses.h | 1 + 2 files changed, 8 insertions(+) diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index afcbaa061..f0e48f4b6 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -319,6 +319,13 @@ static void enablePulsesInternalModule(uint8_t protocol) intmoduleTimerStart(MULTIMODULE_PERIOD); break; #endif + +#if defined(INTERNAL_MODULE_PPM) + case PROTOCOL_CHANNELS_PPM: + intmodulePpmStart(); + break; +#endif + default: break; } diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index e8c3ce8af..eba14a463 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -330,6 +330,7 @@ void sendByteDsm2(uint8_t b); void putDsm2Flush(); void putDsm2SerialBit(uint8_t bit); void sendByteSbus(uint8_t b); +void intmodulePpmStart(); void intmodulePxx1PulsesStart(); void intmodulePxx1SerialStart(); void extmodulePxx1PulsesStart(); From d2a4c79a7ab020cfe066bc8d69254fdca28d13a7 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 1 Jun 2020 12:50:30 +0200 Subject: [PATCH 387/560] Option "internalppm" removed from Companion. DIY people should be able to compile their firmware by themselves. --- companion/src/firmwares/opentx/opentxinterface.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 150352da8..2fed78ab4 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -1218,11 +1218,6 @@ void addOpenTxTaranisOptions(OpenTxFirmware * firmware) addOpenTxFontOptions(firmware); } -void addPPMInternalModuleHack(OpenTxFirmware * firmware) -{ - firmware->addOption("internalppm", Firmware::tr("Support for PPM internal module hack")); -} - void addOpenTxArm9xOptions(OpenTxFirmware * firmware, bool dblkeys = true) { addOpenTxCommonOptions(firmware); @@ -1249,7 +1244,6 @@ void registerOpenTxFirmwares() firmware = new OpenTxFirmware("opentx-x9d+", Firmware::tr("FrSky Taranis X9D+"), BOARD_TARANIS_X9DP); firmware->addOption("noras", Firmware::tr("Disable RAS (SWR)")); addOpenTxTaranisOptions(firmware); - addPPMInternalModuleHack(firmware); registerOpenTxFirmware(firmware); addOpenTxRfOptions(firmware, EU + FLEX); @@ -1264,7 +1258,6 @@ void registerOpenTxFirmwares() firmware->addOption("noras", Firmware::tr("Disable RAS (SWR)")); firmware->addOption("haptic", Firmware::tr("Haptic module installed")); addOpenTxTaranisOptions(firmware); - addPPMInternalModuleHack(firmware); registerOpenTxFirmware(firmware); addOpenTxRfOptions(firmware, EU + FLEX); @@ -1273,7 +1266,6 @@ void registerOpenTxFirmwares() firmware->addOption("shutdownconfirm", Firmware::tr("Confirmation before radio shutdown")); firmware->addOption("horussticks", Firmware::tr("Horus gimbals installed (Hall sensors)")); addOpenTxTaranisOptions(firmware); - addPPMInternalModuleHack(firmware); registerOpenTxFirmware(firmware); addOpenTxRfOptions(firmware, EU + FLEX); From f6ddfb759733f7120acfc77d355e0d8ec207e79d Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 1 Jun 2020 15:24:04 +0200 Subject: [PATCH 388/560] 9XR-PRO navigation fixes --- radio/src/gui/128x64/model_setup.cpp | 30 +++++++++++++--------------- radio/src/gui/212x64/lcd.h | 6 +++--- radio/src/gui/gui_common.h | 1 + 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 4c7e72e9d..5ced958d3 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -116,8 +116,6 @@ enum MenuModelSetupItems { #if defined(MULTIMODULE) ITEM_MODEL_SETUP_EXTERNAL_MODULE_PROTOCOL, ITEM_MODEL_SETUP_EXTERNAL_MODULE_SUBTYPE, -#endif -#if defined(MULTIMODULE) ITEM_MODEL_SETUP_EXTERNAL_MODULE_STATUS, ITEM_MODEL_SETUP_EXTERNAL_MODULE_SYNCSTATUS, #endif @@ -406,13 +404,14 @@ void menuModelSetup(event_t event) NUM_STICKS+NUM_POTS+NUM_SLIDERS-1, // Center beeps 0, // Global functions - LABEL(ExternalModule), + LABEL(ExternalModule), MODULE_TYPE_ROWS(EXTERNAL_MODULE), MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) MULTIMODULE_STATUS_ROWS(EXTERNAL_MODULE) MODULE_CHANNELS_ROWS(EXTERNAL_MODULE), IF_NOT_ACCESS_MODULE_RF(EXTERNAL_MODULE, MODULE_BIND_ROWS(EXTERNAL_MODULE)), // line reused for PPM: PPM settings IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // RxNum + 0, // Output type (OpenDrain / PushPull) MODULE_POWER_ROW(EXTERNAL_MODULE), IF_NOT_PXX2_MODULE(EXTERNAL_MODULE, MODULE_OPTION_ROW(EXTERNAL_MODULE)), MULTIMODULE_MODULE_ROWS(EXTERNAL_MODULE) @@ -732,24 +731,24 @@ void menuModelSetup(event_t event) } } - for (uint8_t i=0; i>= 2; + c = '0' + (states & 0x03); + states >>= 2u; } else { if ((states & 0x01) && swactive) - attr = INVERS; + swattr = INVERS; c = *(STR_VSWITCHES - 2 + 9 + (3*(i+1))); - states >>= 1; + states >>= 1u; } if (attr && (menuHorizontalPosition == i)) { - attr = BLINK | INVERS; + swattr = BLINK | INVERS; } - lcdDrawChar(MODEL_SETUP_2ND_COLUMN+i*FW, y, (swactive) ? c : '-', attr); + lcdDrawChar(MODEL_SETUP_2ND_COLUMN+i*FW, y, swactive ? c : '-', swattr); lcdDrawText(MODEL_SETUP_2ND_COLUMN+(NUM_SWITCHES*FW), y, "<]", (menuHorizontalPosition == NUM_SWITCHES-1 && !NO_HIGHLIGHT()) ? attr : 0); } #endif @@ -807,10 +806,9 @@ void menuModelSetup(event_t event) case ITEM_MODEL_SETUP_BEEP_CENTER: lcdDrawTextAlignedLeft(y, STR_BEEPCTR); - for (uint8_t i=0; i Date: Mon, 1 Jun 2020 15:33:59 +0200 Subject: [PATCH 389/560] 9XR-PRO Extra module broken --- radio/src/pulses/pulses.h | 1 + radio/src/targets/sky9x/board.h | 3 +++ 2 files changed, 4 insertions(+) diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index eba14a463..3b3fffca5 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -338,6 +338,7 @@ void extmodulePxx1SerialStart(); void extmodulePpmStart(); void intmoduleStop(); void extmoduleStop(); +void extramodulePpmStart(); inline void startPulses() { diff --git a/radio/src/targets/sky9x/board.h b/radio/src/targets/sky9x/board.h index 952e48282..4a8587194 100644 --- a/radio/src/targets/sky9x/board.h +++ b/radio/src/targets/sky9x/board.h @@ -410,4 +410,7 @@ bool telemetrySecondPortReceive(uint8_t & data); extern const uint8_t BootCode[]; +// Pulses driver +#define HARDWARE_EXTRA_MODULE + #endif // _BOARD_SKY9X_H_ From 36839dd417c66a1db4fd37e0fbc76c17b6b0379b Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 1 Jun 2020 16:02:20 +0200 Subject: [PATCH 390/560] [Horus] Gauge percent was not vertically centered --- radio/src/gui/480x272/widgets/gauge.cpp | 6 +++--- radio/src/gui/480x272/widgets/modelbmp.cpp | 2 +- radio/src/gui/480x272/widgets/outputs.cpp | 2 +- radio/src/gui/480x272/widgets/text.cpp | 2 +- radio/src/gui/480x272/widgets/timer.cpp | 2 +- radio/src/gui/480x272/widgets/value.cpp | 2 +- radio/src/lua/widgets.cpp | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/radio/src/gui/480x272/widgets/gauge.cpp b/radio/src/gui/480x272/widgets/gauge.cpp index 099920abc..2558f8319 100644 --- a/radio/src/gui/480x272/widgets/gauge.cpp +++ b/radio/src/gui/480x272/widgets/gauge.cpp @@ -28,7 +28,7 @@ class GaugeWidget: public Widget { } - virtual void refresh(); + void refresh() override; static const ZoneOption options[]; }; @@ -38,7 +38,7 @@ const ZoneOption GaugeWidget::options[] = { { STR_MIN, ZoneOption::Integer, OPTION_VALUE_SIGNED(-RESX), OPTION_VALUE_SIGNED(-RESX), OPTION_VALUE_SIGNED(RESX) }, { STR_MAX, ZoneOption::Integer, OPTION_VALUE_SIGNED(RESX), OPTION_VALUE_SIGNED(-RESX), OPTION_VALUE_SIGNED(RESX) }, { STR_COLOR, ZoneOption::Color, OPTION_VALUE_UNSIGNED(RED) }, - { NULL, ZoneOption::Bool } + { nullptr, ZoneOption::Bool } }; void GaugeWidget::refresh() @@ -64,7 +64,7 @@ void GaugeWidget::refresh() // Gauge lcdSetColor(color); lcdDrawSolidFilledRect(zone.x, zone.y + 16, zone.w, 16, TEXT_INVERTED_COLOR); - lcdDrawNumber(zone.x+zone.w/2, zone.y + 17, percent, SMLSIZE | CUSTOM_COLOR | CENTERED, 0, NULL, "%"); + lcdDrawNumber(zone.x + zone.w/2, zone.y + 16, percent, SMLSIZE | CUSTOM_COLOR | CENTERED, 0, nullptr, "%"); lcd->invertRect(zone.x + w, zone.y + 16, zone.w - w, 16, CUSTOM_COLOR); } diff --git a/radio/src/gui/480x272/widgets/modelbmp.cpp b/radio/src/gui/480x272/widgets/modelbmp.cpp index 131d59b2b..09e632ab3 100644 --- a/radio/src/gui/480x272/widgets/modelbmp.cpp +++ b/radio/src/gui/480x272/widgets/modelbmp.cpp @@ -63,7 +63,7 @@ class ModelBitmapWidget: public Widget } } - virtual void refresh() + void refresh() override { uint32_t new_hash = hash(g_model.header.bitmap, sizeof(g_model.header.bitmap)); new_hash ^= hash(g_model.header.name, sizeof(g_model.header.name)); diff --git a/radio/src/gui/480x272/widgets/outputs.cpp b/radio/src/gui/480x272/widgets/outputs.cpp index 0628b5faa..467657519 100644 --- a/radio/src/gui/480x272/widgets/outputs.cpp +++ b/radio/src/gui/480x272/widgets/outputs.cpp @@ -33,7 +33,7 @@ class OutputsWidget: public Widget { } - virtual void refresh(); + void refresh() override; uint8_t drawChannels(const uint16_t & x, const uint16_t & y, const uint16_t & w, const uint16_t & h, const uint8_t & firstChan, const bool & bg_shown, const uint16_t & bg_color) { diff --git a/radio/src/gui/480x272/widgets/text.cpp b/radio/src/gui/480x272/widgets/text.cpp index ce18b7b26..f297798eb 100644 --- a/radio/src/gui/480x272/widgets/text.cpp +++ b/radio/src/gui/480x272/widgets/text.cpp @@ -30,7 +30,7 @@ class TextWidget: public Widget { } - virtual void refresh(); + void refresh() override; static const ZoneOption options[]; }; diff --git a/radio/src/gui/480x272/widgets/timer.cpp b/radio/src/gui/480x272/widgets/timer.cpp index 424db91e7..58c53c4d4 100644 --- a/radio/src/gui/480x272/widgets/timer.cpp +++ b/radio/src/gui/480x272/widgets/timer.cpp @@ -28,7 +28,7 @@ class TimerWidget: public Widget { } - virtual void refresh(); + void refresh() override; static const ZoneOption options[]; }; diff --git a/radio/src/gui/480x272/widgets/value.cpp b/radio/src/gui/480x272/widgets/value.cpp index 96fc885db..c7fe6ce99 100644 --- a/radio/src/gui/480x272/widgets/value.cpp +++ b/radio/src/gui/480x272/widgets/value.cpp @@ -28,7 +28,7 @@ class ValueWidget: public Widget { } - virtual void refresh(); + void refresh() override; static const ZoneOption options[]; }; diff --git a/radio/src/lua/widgets.cpp b/radio/src/lua/widgets.cpp index 165d95eff..4ab6b967e 100644 --- a/radio/src/lua/widgets.cpp +++ b/radio/src/lua/widgets.cpp @@ -265,7 +265,7 @@ class LuaWidget: public Widget virtual void update(); - virtual void refresh(); + void refresh() override; virtual void background(); From d2345aa3fe813ead7e2554ea0c97ce3c34c314be Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 1 Jun 2020 16:03:59 +0200 Subject: [PATCH 391/560] Fix std font 1px vertical shift --- radio/src/fonts/480x272/CMakeLists.txt | 2 +- radio/src/fonts/480x272/font_stdsize.png | Bin 22725 -> 22533 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/fonts/480x272/CMakeLists.txt b/radio/src/fonts/480x272/CMakeLists.txt index 61ace50ce..a8b57384e 100644 --- a/radio/src/fonts/480x272/CMakeLists.txt +++ b/radio/src/fonts/480x272/CMakeLists.txt @@ -12,7 +12,7 @@ set(FONT_OFFSET 1) add_truetype_font_target(480x272 tinsize ${FONT} 9 0) add_truetype_font_target(480x272 smlsize ${FONT} 13 0) -add_truetype_font_target(480x272 stdsize ${FONT} 16 0) +add_truetype_font_target(480x272 stdsize ${FONT} 16 1) add_truetype_font_target(480x272 stdsizebold ${FONT_BOLD} 16 1) add_truetype_font_target(480x272 midsize ${FONT} 24 0) add_truetype_font_target(480x272 dblsize ${FONT_BOLD} 32 0) diff --git a/radio/src/fonts/480x272/font_stdsize.png b/radio/src/fonts/480x272/font_stdsize.png index 4baafebab04bba97e18003f589693dd4dcfe21b6..afd1e98b5230abd370ac2c4a23eb003abe54624c 100644 GIT binary patch literal 22533 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 K-z&=^e)tD~WSThu literal 22725 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 N8M7m zrLe&8B)t&$xO-H5a^3}*CNn~xEVWW~VUQBSB%?Ybhm;+jZ3Kd%GZc@=0I1L7!oob0 zUCMfXII=14_SrtG^PRUD9EWX&)`u<)xxnzLp|7ukw`ui-ULibQr!yV5nIc8GfkUrf zj^xey&W5x=rmZt%`Ye8uExlt1&sOihi1@9}ehjG>Z0M3tDUI#rTCsrGQC3j_4HqQ~ zvl5kIjCC!7QzEN!T#bdjxqC}vJZqQR$WbVtzK< z*u3pp?fv`b;VXS-m3idmQQY73^uSh`pP)|97-{no*vBXpBwlr5k49?W=;tF6oo&~q z>|hy0e%wmwW(PGZrU8`JjJWC1KlqfX44gUm;Iy6w0&jNtA4LY#TsiO?@9uWXwQj43 zAc}JmTd+TjQjy#rt*<3hL3OMCRMfSMtgsls05IR15&HOkMZTCCxw+rDlYTC7qkYY@ zqxt!po5N8iY8E(KkB*B_DD0AQv$K5_it%1v7UK+Y-9h&elTrpI*4YlpduU98VY4gg zcn`2DRc^OE3n0*685tX^m_B_&tl<9TLI?B&FjDg!vJbqn#EfSK!j{cY%l5V90z; zZouxJFtAityF=tO-FasJ5c(6YfX{tZ_mt7HBu6Lj-=%ZLe?vL!HJmw7-kM@Ct*uY+ z90Xxt(lxS&Hw?qwe0)|Q42?N1DB1)|q=7+4aSITGmD|kn7PX#A?r&b3NWa9PUH80Y zCy8%=Q7om-&Jr>zr)+d^&|sY42d~4WnnqWOTg+x7?tsJktY;ksOV+47?%vj!fVvgs z=g%rxSqv-71BJFow!C51#-R?uK-Not+YtXN9%_E!%V@%6!fA8v$vqXIdQ-fe-68ws zTe#i|mO9K0m6ecdn-=&Upd}0o4c%@%A~mU)((uK_4Hp$SUA9R%-{)G%W?RcGB4!KH za_f>777CpQv*q$9RudFV0+;b@ZgqYA&m<1Gy9d$o-~p#MAgmDreSkCwr=)6=gG3@J zS^9V@v7!L?`g(fo8K$`mrzD0%!wr3$jvYlUhT6+L^rYBkBh;NBZGgw2!qXHp1#`b% z4m1o409X)|=_OYvN^!{nDV_T!c*=*D7Hge=?^hPW^Rdi>2dxaKZ(R?^B zT5<9fL&*GlXCEC;i~8GQi6Me9^bwN+0`dqsRjcJ;VK#}&8-)zJ_3IN@VQexXr*1Ga zBNCw&5qN{o+deY)P}aAh*owd2PtYr|)hS_!PBFSiM?|1k>IBK6w~+h$Tg(Y#WeCnQ zD|8J5mKk&xc>=?78Rd+gcihQAwsTJCulx^S2H{_hrjU8&_ z1?wl5s}XJJi@;^6BLuF1py^(IZ~RZ1tZWl>UtxHuAT#3O6QUI=NDbe1Xn+Ev>Mks2 zFWnJ#zlnw7@^{%rQd$L$F1Ym`M5`^h}@Qy88=nvWVvU~q^sw( zo_^hXva6>D?D5ixVSZ-fZtdG-;ssEtcM{i>013qe0t_ Date: Mon, 1 Jun 2020 19:31:59 +0200 Subject: [PATCH 392/560] Please Travis after font fixes --- radio/src/tests/fonts_480x272.png | Bin 14756 -> 14769 bytes radio/src/tests/primitives_480x272.png | Bin 5713 -> 5713 bytes radio/src/tests/transparency_480x272.png | Bin 5773 -> 5773 bytes tools/commit-tests.sh | 2 +- 4 files changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/tests/fonts_480x272.png b/radio/src/tests/fonts_480x272.png index c47657715dbc91385107bdf63a0efa40b0e99c1a..abd3e1f72f3bee0adaa26f9c32958dd41613f8d5 100644 GIT binary patch literal 14769 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 literal 14756 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 F{|orobhH2f diff --git a/radio/src/tests/primitives_480x272.png b/radio/src/tests/primitives_480x272.png index 38630592fe2024e967443a5375067a711d97f717..68bb2f88655e889c9e3530c9de29d6945d1bcbcf 100644 GIT binary patch delta 4633 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 delta 4628 zcmXw7dpy(a``6Qf%A-}zlyoGEc!bBXoT-S+VT|N3S|d3n*+&tfQ8}eGinJUyF>{)% zl6jCV$2n|~<6~oT7wdql>$>kAa1Zzy9f;m}U$5YwLMC6M zMV4#E_UsNO`uX;UyH^afO}AbD$zLtrTEpH?pFf-7bYeK0?%m&Z^EoVt-tcw1s<8C= zDqT?0^RHLu%Fff-X~ymp1ZTsSl~~w6;mt18|m4u038jm^|fdWlA%kRO&B}{}s6DE%RkwU)0WX}+QMxU(8{&k~)$O6k}Os7t7bQ|d`8)dTg zQSx=E%vWtUbvGCL@we`ot7cJ0XKneVKIc5TvbuJ%=&RS2Q+|myA4HiuT9jfn94tz| zM0^xANI&{)Mug&DnH`}h(Z{+mHZK?sFh+N1(QI7dEO(aORL;47&;0gav*@F&w~ILwP_EAkEvf9}3mb+02ACkPV0?7OlOhEF2yyuKRv0%$ zev)|4NYSACJun!)M{(u&fk(%rtzyySPYj`U4CXKri*G&e<3}j+tRC%ZN=f(Y44ZFB z1>F?H+%k;WTyGLV4d{}W&YP-@pkZ*%GD4}nT1Z+ck5BeDLjCpAHx2;pT9|DQr(Ocx z4j(alanj+%J3finM#H4ew$5~40$mw%>MEDDeA;f3ULB4zo}QcUr=4N(E74(&BvC`H z3dZ-Hzv7-tA8CUz0r_hA3%3?4-w_cDsTm)m>kLR<+n-`ojD7YXYe6@+P(O#Uv;d*v z5yCdDIx?PNp5w2`1>#qJKNu<-3bq;v$(NPPq|sQnt4?N4uFc5QQnBr|n|JISRbVg= z4u!#kZGz8Hyv}wJCoUgsk06(`mPUMU31ZGBYg9<${Nw#bwC3DcG=Wa%O)OpwKeSeX z4QQWKFl`F>;XEZ^XopxkyD=a!xtgW#au&F6bx)@k^Tq&# z=&F%5`(=CXHMr{)a<6*&#HIX`+pkrS$)FC-H?tB_;g!>aBc}8cjYF1V!KzA^7~Q?f zM8fVhatg+bzYJ84%KP(A?sU1uHW9LZp|;%r>bfv8M}97 zU5+hl@i{k29$Q?mC!^yECEG8>lZEWDbDU09RY|>PUU_AQDWoiLeyz;ugu*`edWWkp8;jc{9TNYojfC)J- z*OjfZIlpfCaREMi38Qi%8KiPBC_4OYik-6GV*M2 z1iN$D{%6(i4mKGoihK`Yh#|ABdBTKJH?O>yfIjC?(5|aQgL+#(j)rj*?WM|LRY1!b z0>OHe=5W`_M|b0+z4F!-UIJ!stD+&0))jwLt~ixTjfx_;SS?M>8Wp`41OkFQMsjoj zTCcUT#YoL@UGf4aKbahoTfV523<`VgcGSVcW)PZyA4nTABnVC{N6I8urs*JPI5JFggmXFY?u$cEX!Ez4_#;7NeIipvA-spnB&{GUb? ztqP$f$j!H~*efL(FU*FAzq~6-#=Qj@1Q9IWu_W^kKt&s&>_%h>m5)q&js< z5u=t*Ixr5aXQ3$1CSBW}!>*kjfvyZvnZWPuXEDncL1`B%S}(WLZl|D(^?U*byH*7n%grEhL^V!2r4n&Lmi zmE$rsBear15vtw@9-7;%++J<+iKXqv$aU=;2%?M~09vp4ai-|+2pm)T0v7Gp=C7D( zH@S@P!i=1%R9Qe4tzbKu3GQ8h{M_Es{$F~@{tZ6bk3nm+U;yr~2u0X9&(C8lJ`9{; zP>fw3N+*L{WR(KusZFkr{XNG9um_RR#q4r<%aaZh<`0?ZGV$>6J~S_=uR}j`(kQc{ zyapI_)NE@VtRa_YpOkI|cXigNN^{B4RK?hwbrMx__w}=x>-}l6cTcpno;Zc7oeo!# zNwIvgdi(;_8t1YMKVJHD(x^)>;L06k@x|at1_E<^;CMtKfXr+h0iM$et z_?rFEi~sZRx%5iXvi;Eyo(ez4@*oHDf`GMORZB#(kl1~!ZDuy1>Mbd=Si>0og3(d` z%~a-9-vwjzqhsRI0Ml{R9N1fOOlpL#`fp+bVnB43vItg{45KB2j%Nl8lNbM{1rtSQ z{ZO8JE{zk&^%pk(&@3f0WU;o6n$-v0A8?S3Fm4e~ZT@T8-Fm+XqnN#Ns*;yLz<2n{ z1~?`tgFcb5`V}Ta#3*mZwnvV$`xc4gU?r z|LNQ+ifj=yC`<2|TxuYa#Qj~w^3fCrEk<_nw(nKnGjlloOklE!klz&~E=>&!b$lUT z#A5O^GIZLOTlGHKn=GakYbc%Un%287$7|yjNQYVLNVoFZjIUmgZJjbtG%)#T0az4m z#hxvdc5W@!kY7~jtM3b*`UW*IReN95%f~cw!d8Ww1MLGL`g+tS9>oMs>ybEN^7j19 z9i`xKF@u37;qn|ViWhMq-Z1iQ%uwvWwz`V?R>9E|SyM^rxvt`*cHh(YCFETKHS9g~ z#bunUR@=o7fspy?%l6c&31MNpv%b}DviD?w&y3jRzXO?Xvodk@A_GHMxH)FOda_&? z>N217z2=IP3xh;{C)N5R;c2d43p!Xzo#|@_R2|PRN8KY%@^G_Blx9!klPrH`Qqgo)9B+Dlgk-7;cN3y8VFmhb{CTbgH zS{tph(o-&zWfhC-K@*yu`z%cj0u9+1oRN66%S@T1P_wu*Sx5vHkISCBr=MqcR}>7s zZ|SM4C|y%gsj-jI<|J@fK^X>5H^?l9=-;B|jI!YE*pLcmE$`7Uz@9MZ6iqMOqmo=z zh;rmK#jLw@>P(mL65*@u*PBAQ?ptgBB$9Q;O#NgZvxcVVfwQjN&wzP5NodbyjBAAS))8$CGv|Df=}<uS$!NXo@n8KdW`nLSzb7w~W z71YJ-j2b0gTZ6!6txbHYxdX#dGbk=NBY)*ll7ovZ(3rN%Q4@jWlbCVJ4MNjs*eDuL z&JM%YvH-Z0C@pNM)x@zqL&DFP@N;T?&n9UL{AJ|@+lc9xRo@N8ZsPM@0N zce&Ip!5gD8sU3Y_VJ_4S0vV`aULccA7`}}v;m8SF&FNr_s_#PV-##g9#HrG#e5%0K z0|HFndf!CotYLb&(8Ss+`Hn6NEX~Z-eGjYt;&RNO7<}3AM*8m+1G3mhGKp`XWrP=#E-%Q3n5kxv5%tz;v+t zKPB7^TZ~Chx$iXfo5`6GS~}JVCxAM`fj$AjX$%)vh*JoKL_51SzgDOW&bNaiV!zHK zN_s+18m#BLaXV`hl7>D(A-O6y%^%!n()F8k*Zpco`>tmCwegW$?c()ZCe$0HY2&P4 zf4{H+7gpzvneTCfhXmOldb@U}`8(iG?4~r18=gkH&hLRF%r79r-q;6+}Bus5C?o7l21hnwaP;Etc$#PlK5^6Lo5PaJL0xb+GYm`QQlC-6`NqZ!m5B|SN z>@_=4&d#uH+u_Mr*0u*|DD9}e#J%)H@h07GJ8TvIyZ68c#O9&UQUb4JQT^18D3QP6 zT5SFfiH|!2vVR@Y@GP@yVI!Sd*BChzj)(YzX2<92yZ-ANlT1(1jg_EhXC6|JF*#o@Gwv~Q zT3u{Vm&tx8yYi}t7mA|PwOL!L+3KbqV~yOw%TLcAPooU93!Hy-^5 Dh>Dwr diff --git a/radio/src/tests/transparency_480x272.png b/radio/src/tests/transparency_480x272.png index 05845c138402682c768e71045185ae4b96e02ce0..2b0588eb91099c84eb5331edfa06082056dd42b4 100644 GIT binary patch delta 4865 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 delta 4886 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 SJ@+KUpMyQbuIk*4KmG;FFcd@p diff --git a/tools/commit-tests.sh b/tools/commit-tests.sh index a15b698e7..92b5542f0 100755 --- a/tools/commit-tests.sh +++ b/tools/commit-tests.sh @@ -5,7 +5,7 @@ set -e set -x # Allow variable core usage, default uses all cpu cores, to set 8 cores for example : commit-tests.sh -j8 -num_cpus=$(grep 'physical id' /proc/cpuinfo | sort -u | wc -l) +num_cpus=$(nproc) : "${CORES:=$num_cpus}" # Default build treats warnings as errors, set -Wno-error to override, e.g.: commit-tests.sh -Wno-error : "${WERROR:=1}" From fb6145267162012d7b10fc604368272d4a9c9c60 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 2 Jun 2020 07:57:41 +0200 Subject: [PATCH 393/560] Fix wrong mix order in quad wizard --- CMakeLists.txt | 2 +- radio/sdcard/taranis-x7/SCRIPTS/WIZARD/multi.lua | 4 ++-- radio/sdcard/taranis-x9/SCRIPTS/WIZARD/multi.lua | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e9bca79b0..e0e9d6bad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ set(VERSION_REVISION "8") set(VERSION_SUFFIX $ENV{OPENTX_VERSION_SUFFIX}) set(VERSION_FAMILY ${VERSION_MAJOR}.${VERSION_MINOR}) set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}${VERSION_SUFFIX}) -set(SDCARD_REVISION "0028") +set(SDCARD_REVISION "0029") set(SDCARD_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}V${SDCARD_REVISION}) cmake_minimum_required(VERSION 2.8) diff --git a/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/multi.lua b/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/multi.lua index f4677ed4e..321b7324f 100755 --- a/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/multi.lua +++ b/radio/sdcard/taranis-x7/SCRIPTS/WIZARD/multi.lua @@ -165,8 +165,8 @@ end -- Init function local function init() thrCH1 = defaultChannel(2) - rollCH1 = defaultChannel(0) - yawCH1 = defaultChannel(3) + rollCH1 = defaultChannel(3) + yawCH1 = defaultChannel(0) pitchCH1 = defaultChannel(1) local ver, radio, maj, minor, rev = getVersion() if string.match(radio, "x7") then diff --git a/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/multi.lua b/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/multi.lua index 3296626ad..c78b982a9 100644 --- a/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/multi.lua +++ b/radio/sdcard/taranis-x9/SCRIPTS/WIZARD/multi.lua @@ -164,8 +164,8 @@ end -- Init function local function init() thrCH1 = defaultChannel(2) - rollCH1 = defaultChannel(0) - yawCH1 = defaultChannel(3) + rollCH1 = defaultChannel(3) + yawCH1 = defaultChannel(0) pitchCH1 = defaultChannel(1) local ver, radio, maj, minor, rev = getVersion() -- if string.match(radio, "x7") then From c8b31fc904a79198f72e5715ea2e7fd6282b6338 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 2 Jun 2020 09:16:41 +0200 Subject: [PATCH 394/560] Secure screen DMA transfers (#7657) Secure DMA write to LCD buffer --- radio/src/targets/horus/lcd_driver.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/radio/src/targets/horus/lcd_driver.cpp b/radio/src/targets/horus/lcd_driver.cpp index 110db0007..691dd28ce 100644 --- a/radio/src/targets/horus/lcd_driver.cpp +++ b/radio/src/targets/horus/lcd_driver.cpp @@ -41,6 +41,14 @@ uint32_t CurrentLayer = LCD_FIRST_LAYER; #define NRST_LOW() do { LCD_GPIO_NRST->BSRRH = LCD_GPIO_PIN_NRST; } while(0) #define NRST_HIGH() do { LCD_GPIO_NRST->BSRRL = LCD_GPIO_PIN_NRST; } while(0) +static inline bool coordsWithinScreen(coord_t x, coord_t y, coord_t w, coord_t h) +{ + if (x < 0 || y < 0 || (x + w) > LCD_W || (y + h) > LCD_H) + return false; + else + return true; +} + static void LCD_AF_GPIOConfig(void) { GPIO_InitTypeDef GPIO_InitStructure; @@ -383,6 +391,9 @@ void DMAFillRect(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, ui y = desth - (y + h); #endif + if (dest == displayBuf && !coordsWithinScreen(x, y, w, h)) + return; + DMA2D_DeInit(); DMA2D_InitTypeDef DMA2D_InitStruct; @@ -414,6 +425,9 @@ void DMACopyBitmap(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, srcy = srch - (srcy + h); #endif + if (dest == displayBuf && !coordsWithinScreen(x, y, w, h)) + return; + DMA2D_DeInit(); DMA2D_InitTypeDef DMA2D_InitStruct; @@ -454,6 +468,9 @@ void DMACopyAlphaBitmap(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_ srcy = srch - (srcy + h); #endif + if (dest == displayBuf && !coordsWithinScreen(x, y, w, h)) + return; + DMA2D_DeInit(); DMA2D_InitTypeDef DMA2D_InitStruct; From 515aa9bcdb137de7336742fd83cab3d27a65065f Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 2 Jun 2020 09:17:08 +0200 Subject: [PATCH 395/560] Fix wizard in DarkBlue theme --- .../horus/SCRIPTS/WIZARD/glider/wizard.lua | 39 +++++++++--------- .../horus/SCRIPTS/WIZARD/plane/wizard.lua | 41 +++++++++---------- 2 files changed, 39 insertions(+), 41 deletions(-) diff --git a/radio/sdcard/horus/SCRIPTS/WIZARD/glider/wizard.lua b/radio/sdcard/horus/SCRIPTS/WIZARD/glider/wizard.lua index a07089513..86b08451e 100644 --- a/radio/sdcard/horus/SCRIPTS/WIZARD/glider/wizard.lua +++ b/radio/sdcard/horus/SCRIPTS/WIZARD/glider/wizard.lua @@ -149,14 +149,13 @@ local function runMotorConfig(event) lcd.drawBitmap(BackgroundImg, 0, 0) lcd.drawBitmap(ImgPageDn, 455, 95) lcd.drawBitmap(ImgEngine, 310, 50) - lcd.setColor(CUSTOM_COLOR, lcd.RGB(255, 255, 255)) fields = MotorFields lcd.drawText(40, 20, "Does your model have a motor ?", TEXT_COLOR) - lcd.drawFilledRectangle(40, 45, 200, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 45, 200, 30, TEXT_BGCOLOR) fields[2][4]=0 if fields[1][5] == 1 then lcd.drawText(40, 100, "What channel is it on ?", TEXT_COLOR) - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) fields[2][4]=1 end local result = runFieldsPage(event) @@ -190,7 +189,7 @@ local function runAilConfig(event) lcd.drawBitmap(ImgAilL, 395, 235) drawMark(308, 115, "A") drawMark(422, 220, "A") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") setFieldsVisible(1, 0) elseif fields[1][5] == 2 then @@ -198,16 +197,16 @@ local function runAilConfig(event) lcd.drawBitmap(ImgAilL, 395, 235) drawMark(308, 115, "A") drawMark(422, 220, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) drawMark(152, 164, "B") setFieldsVisible(1, 1) else setFieldsVisible(0, 0) end lcd.drawText(40, 20, "Number of ailerons on your model ?", TEXT_COLOR) - lcd.drawFilledRectangle(40, 45, 400, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 45, 400, 30, TEXT_BGCOLOR) local result = runFieldsPage(event) return result end @@ -235,7 +234,7 @@ local function runFlapsConfig(event) lcd.drawBitmap(ImgFlp, 358, 202) drawMark(332, 132, "A") drawMark(412, 215, "A") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") setFieldsVisible(1, 0) elseif fields[1][5] == 2 then @@ -243,16 +242,16 @@ local function runFlapsConfig(event) lcd.drawBitmap(ImgFlp, 358, 202) drawMark(332, 132, "A") drawMark(412, 215, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) drawMark(152, 164, "B") setFieldsVisible(1, 1) else setFieldsVisible(0, 0) end lcd.drawText(40, 20, "Does your model have flaps ?", TEXT_COLOR) - lcd.drawFilledRectangle(40, 45, 400, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 45, 400, 30, TEXT_BGCOLOR) local result = runFieldsPage(event) return result end @@ -283,7 +282,7 @@ local function runTailConfig(event) lcd.drawBitmap(ImgTail, 252, 100) drawMark(360, 125, "A") drawMark(390, 155, "A") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") setFieldsVisible(1, 0, 0) end @@ -293,9 +292,9 @@ local function runTailConfig(event) drawMark(415, 150, "A") drawMark(380, 120, "A") drawMark(390, 185, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) drawMark(152, 164, "B") setFieldsVisible(1, 1, 0) end @@ -305,11 +304,11 @@ local function runTailConfig(event) drawMark(415, 150, "C") drawMark(380, 120, "A") drawMark(390, 185, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) drawMark(152, 164, "B") - lcd.drawFilledRectangle(40, 202, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 202, 100, 30, TEXT_BGCOLOR) drawMark(152, 204, "C") setFieldsVisible(1, 1, 1) end @@ -317,14 +316,14 @@ local function runTailConfig(event) lcd.drawBitmap(ImgVTail, 252, 100) drawMark(315, 110, "A") drawMark(382, 120, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) drawMark(152, 164, "B") setFieldsVisible(1, 1, 0) end lcd.drawText(40, 20, "Pick the tail config of your model", TEXT_COLOR) - lcd.drawFilledRectangle(40, 45, 400, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 45, 400, 30, TEXT_BGCOLOR) local result = runFieldsPage(event) return result end diff --git a/radio/sdcard/horus/SCRIPTS/WIZARD/plane/wizard.lua b/radio/sdcard/horus/SCRIPTS/WIZARD/plane/wizard.lua index 3c44e5ad5..8a43ed159 100755 --- a/radio/sdcard/horus/SCRIPTS/WIZARD/plane/wizard.lua +++ b/radio/sdcard/horus/SCRIPTS/WIZARD/plane/wizard.lua @@ -144,19 +144,18 @@ local ImgEngine local function runMotorConfig(event) lcd.clear() if ImgEngine == nil then - ImgEngine = Bitmap.open("img/prop.png") + ImgEngine = Bitmap.open("img/prop.png") end lcd.drawBitmap(BackgroundImg, 0, 0) lcd.drawBitmap(ImgPageDn, 455, 95) lcd.drawBitmap(ImgEngine, 310, 50) - lcd.setColor(CUSTOM_COLOR, lcd.RGB(255, 255, 255)) fields = MotorFields lcd.drawText(40, 20, "Does your model have a motor ?", TEXT_COLOR) - lcd.drawFilledRectangle(40, 45, 200, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 45, 200, 30, TEXT_BGCOLOR) fields[2][4]=0 if fields[1][5] == 1 then lcd.drawText(40, 100, "What channel is it on ?", TEXT_COLOR) - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) fields[2][4]=1 end local result = runFieldsPage(event) @@ -190,7 +189,7 @@ local function runAilConfig(event) lcd.drawBitmap(ImgAilL, 275, 210) drawMark(362, 132, "A") drawMark(302, 227, "A") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") setFieldsVisible(1, 0) elseif fields[1][5] == 2 then @@ -198,16 +197,16 @@ local function runAilConfig(event) lcd.drawBitmap(ImgAilL, 275, 210) drawMark(362, 132, "A") drawMark(302, 227, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) drawMark(152, 164, "B") setFieldsVisible(1, 1) else setFieldsVisible(0, 0) end lcd.drawText(40, 20, "Number of ailerons on your model ?", TEXT_COLOR) - lcd.drawFilledRectangle(40, 45, 400, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 45, 400, 30, TEXT_BGCOLOR) local result = runFieldsPage(event) return result end @@ -235,7 +234,7 @@ local function runFlapsConfig(event) lcd.drawBitmap(ImgFlp, 285, 191) drawMark(362, 132, "A") drawMark(302, 227, "A") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") setFieldsVisible(1, 0) elseif fields[1][5] == 2 then @@ -243,16 +242,16 @@ local function runFlapsConfig(event) lcd.drawBitmap(ImgFlp, 285, 191) drawMark(362, 132, "A") drawMark(302, 227, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) drawMark(152, 164, "B") setFieldsVisible(1, 1) else setFieldsVisible(0, 0) end lcd.drawText(40, 20, "Does your model have flaps ?", TEXT_COLOR) - lcd.drawFilledRectangle(40, 45, 400, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 45, 400, 30, TEXT_BGCOLOR) local result = runFieldsPage(event) return result end @@ -283,7 +282,7 @@ local function runTailConfig(event) lcd.drawBitmap(ImgTail, 252, 100) drawMark(275, 120, "A") drawMark(390, 155, "A") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") setFieldsVisible(1, 0, 0) end @@ -293,9 +292,9 @@ local function runTailConfig(event) drawMark(275, 120, "A") drawMark(390, 155, "A") drawMark(370, 112, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) drawMark(152, 164, "B") setFieldsVisible(1, 1, 0) end @@ -305,11 +304,11 @@ local function runTailConfig(event) drawMark(275, 120, "A") drawMark(390, 155, "C") drawMark(370, 112, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) drawMark(152, 164, "B") - lcd.drawFilledRectangle(40, 202, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 202, 100, 30, TEXT_BGCOLOR) drawMark(152, 204, "C") setFieldsVisible(1, 1, 1) end @@ -317,14 +316,14 @@ local function runTailConfig(event) lcd.drawBitmap(ImgVTail, 252, 100) drawMark(315, 110, "A") drawMark(382, 120, "B") - lcd.drawFilledRectangle(40, 122, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 122, 100, 30, TEXT_BGCOLOR) drawMark(152, 124, "A") - lcd.drawFilledRectangle(40, 162, 100, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 162, 100, 30, TEXT_BGCOLOR) drawMark(152, 164, "B") setFieldsVisible(1, 1, 0) end lcd.drawText(40, 20, "Pick the tail config of your model", TEXT_COLOR) - lcd.drawFilledRectangle(40, 45, 400, 30, CUSTOM_COLOR) + lcd.drawFilledRectangle(40, 45, 400, 30, TEXT_BGCOLOR) local result = runFieldsPage(event) return result end From f7a3aeac74eccfede32f5b309ea44bae9a28e287 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 2 Jun 2020 09:18:06 +0200 Subject: [PATCH 396/560] Cosmetics --- radio/src/targets/horus/lcd_driver.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/radio/src/targets/horus/lcd_driver.cpp b/radio/src/targets/horus/lcd_driver.cpp index 691dd28ce..444994d02 100644 --- a/radio/src/targets/horus/lcd_driver.cpp +++ b/radio/src/targets/horus/lcd_driver.cpp @@ -41,15 +41,12 @@ uint32_t CurrentLayer = LCD_FIRST_LAYER; #define NRST_LOW() do { LCD_GPIO_NRST->BSRRH = LCD_GPIO_PIN_NRST; } while(0) #define NRST_HIGH() do { LCD_GPIO_NRST->BSRRL = LCD_GPIO_PIN_NRST; } while(0) -static inline bool coordsWithinScreen(coord_t x, coord_t y, coord_t w, coord_t h) +inline bool coordsWithinScreen(coord_t x, coord_t y, coord_t w, coord_t h) { - if (x < 0 || y < 0 || (x + w) > LCD_W || (y + h) > LCD_H) - return false; - else - return true; + return x >= 0 && y >= 0 && x + w <= LCD_W && y + h <= LCD_H; } -static void LCD_AF_GPIOConfig(void) +static void LCD_AF_GPIOConfig() { GPIO_InitTypeDef GPIO_InitStructure; From 837dffecdc54eb8271afb5d754f767690161ba98 Mon Sep 17 00:00:00 2001 From: WismyYao Date: Tue, 2 Jun 2020 16:38:57 +0800 Subject: [PATCH 397/560] Wismy/vfr (#7661) Change 'FLR' to 'VFR' Show R9M power in 'mW' --- radio/src/telemetry/frsky.h | 2 +- radio/src/telemetry/frsky_sport.cpp | 16 +++++++++++++--- 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 +- 13 files changed, 25 insertions(+), 15 deletions(-) diff --git a/radio/src/telemetry/frsky.h b/radio/src/telemetry/frsky.h index 623ecb67d..751196d1c 100644 --- a/radio/src/telemetry/frsky.h +++ b/radio/src/telemetry/frsky.h @@ -192,7 +192,7 @@ enum FrSkyDataState { #define DIY_STREAM_FIRST_ID 0x5000 #define DIY_STREAM_LAST_ID 0x50FF #define FACT_TEST_ID 0xF000 -#define FRAME_LOSS_RATE_ID 0xF010 +#define VALID_FRAME_RATE_ID 0xF010 #define RSSI_ID 0xF101 #define ADC1_ID 0xF102 #define ADC2_ID 0xF103 diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index d5215e300..bf816cf04 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -30,7 +30,7 @@ struct FrSkySportSensor { }; const FrSkySportSensor sportSensors[] = { - { FRAME_LOSS_RATE_ID, FRAME_LOSS_RATE_ID, 0, ZSTR_FLR, UNIT_PERCENT, 0 }, + { VALID_FRAME_RATE_ID, VALID_FRAME_RATE_ID, 0, ZSTR_VFR, UNIT_PERCENT, 0 }, { RSSI_ID, RSSI_ID, 0, ZSTR_RSSI, UNIT_DB, 0 }, #if defined(MULTIMODULE) { TX_RSSI_ID, TX_RSSI_ID, 0, ZSTR_TX_RSSI , UNIT_DB , 0 }, @@ -224,9 +224,19 @@ void sportProcessTelemetryPacketWithoutCrc(uint8_t origin, const uint8_t * packe } #endif } + else if (dataId == VALID_FRAME_RATE_ID) { + data = 100 - SPORT_DATA_U8(packet); + } else if (dataId == R9_PWR_ID) { - uint32_t r9pwr[] = {100, 200, 500, 1000}; - data = r9pwr[SPORT_DATA_U8(packet) & 0x03]; + // receive 'dBm' and show by 'mw' + static const uint32_t r9pwrs[][2] = {{0, 1}, {5, 3}, {10, 10}, {13, 20}, {14, 25}, {20, 100}, {23, 200}, {27, 500}, {30, 1000}}; + uint32_t dBm = SPORT_DATA_U8(packet); + for (auto & r9pwr : r9pwrs) { + if (dBm == r9pwr[0]) { + data = r9pwr[1]; + break; + } + } } else if (dataId == XJT_VERSION_ID) { telemetryData.xjtVersion = HUB_DATA_U16(packet); diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index ac34feec2..115f2ab17 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -1193,7 +1193,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" -#define ZSTR_FLR "FLR" +#define ZSTR_VFR "VFR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index c9e91bd45..842050723 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -1200,7 +1200,7 @@ #define TR_AUTH_FAILURE "Auth-failure" // ---------------------------------------------------------------- -#define ZSTR_FLR "FLR" +#define ZSTR_VFR "VFR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index e7c30c01e..c17be6890 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -1197,7 +1197,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" -#define ZSTR_FLR "FLR" +#define ZSTR_VFR "VFR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 428505c1c..699a47368 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -1196,7 +1196,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltaje") #define TR_AUTH_FAILURE "Fallo " LCDW_128_480_LINEBREAK "autentificación" -#define ZSTR_FLR "FLR" +#define ZSTR_VFR "VFR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 4ff379551..1396855a9 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -1205,7 +1205,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" -#define ZSTR_FLR "FLR" +#define ZSTR_VFR "VFR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 80f462c09..bfd07bd25 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -1221,7 +1221,7 @@ #define TR_RTC_CHECK TR("Vérif. RTC", "Vérif. pile RTC") #define TR_AUTH_FAILURE "Auth-failure" -#define ZSTR_FLR "FLR" +#define ZSTR_VFR "VFR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 37a494f8a..b9a9cf639 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -1214,7 +1214,7 @@ #define TR_RTC_CHECK TR("Controllo RTC", "Controllo voltaggio RTC") #define TR_AUTH_FAILURE "Auth-failure" -#define ZSTR_FLR "FLR" +#define ZSTR_VFR "VFR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 36377aca8..c50884c73 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -1206,7 +1206,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" -#define ZSTR_FLR "FLR" +#define ZSTR_VFR "VFR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 1753b3ec3..2e1389e2c 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -1213,7 +1213,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" -#define ZSTR_FLR "FLR" +#define ZSTR_VFR "VFR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index a9b5d0027..fb0e97e48 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -1202,7 +1202,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" -#define ZSTR_FLR "FLR" +#define ZSTR_VFR "VFR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 8868d8106..deacd3518 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -1213,7 +1213,7 @@ #define TR_RTC_CHECK TR("Check RTC", "Check RTC voltage") #define TR_AUTH_FAILURE "Auth-failure" -#define ZSTR_FLR "FLR" +#define ZSTR_VFR "VFR" #define ZSTR_RSSI "RSSI" #define ZSTR_R9PW "R9PW" #define ZSTR_RAS "SWR" From 13b81841c4d38ad430a6314c478b19ff4c8685b2 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 2 Jun 2020 10:40:58 +0200 Subject: [PATCH 398/560] Cosmetics in a comment --- radio/src/telemetry/frsky_sport.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index bf816cf04..d26946534 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -228,7 +228,7 @@ void sportProcessTelemetryPacketWithoutCrc(uint8_t origin, const uint8_t * packe data = 100 - SPORT_DATA_U8(packet); } else if (dataId == R9_PWR_ID) { - // receive 'dBm' and show by 'mw' + // convert 'dBm' to 'mW' static const uint32_t r9pwrs[][2] = {{0, 1}, {5, 3}, {10, 10}, {13, 20}, {14, 25}, {20, 100}, {23, 200}, {27, 500}, {30, 1000}}; uint32_t dBm = SPORT_DATA_U8(packet); for (auto & r9pwr : r9pwrs) { From 0001c277ff204f347b42592190e25e3364e82a69 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 2 Jun 2020 22:48:39 +0200 Subject: [PATCH 399/560] Bluetooth RX fifo size is not big enough --- radio/src/targets/horus/board.h | 2 +- radio/src/targets/taranis/board.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 7de47b95b..44d8a5d10 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -675,7 +675,7 @@ void gpsSendByte(uint8_t byte); // BT driver #define BT_TX_FIFO_SIZE 64 -#define BT_RX_FIFO_SIZE 128 +#define BT_RX_FIFO_SIZE 256 #define BLUETOOTH_BOOTLOADER_BAUDRATE 230400 #define BLUETOOTH_FACTORY_BAUDRATE 57600 #define BLUETOOTH_DEFAULT_BAUDRATE 115200 diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index e62b71523..7dd0050a5 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -808,7 +808,7 @@ void auxSerialStop(); #define BLUETOOTH_FACTORY_BAUDRATE 57600 #endif #define BT_TX_FIFO_SIZE 64 -#define BT_RX_FIFO_SIZE 128 +#define BT_RX_FIFO_SIZE 256 void bluetoothInit(uint32_t baudrate, bool enable); void bluetoothWriteWakeup(); uint8_t bluetoothIsWriting(); From f34b5216a78d23c48ccacbe7b025916ba02190fe Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 3 Jun 2020 19:59:17 +0200 Subject: [PATCH 400/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 1f743164c..e18ed5192 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1735,3 +1735,4 @@ John Beech Wojciech Winiarski Armin Kuepfer Alain Bregand +James Thompson From a468005adade485263eaf7e11b687345b0a784d5 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 4 Jun 2020 15:13:32 +0200 Subject: [PATCH 401/560] 2nd attempt to fix #7613 (#7670) --- companion/src/firmwares/opentx/opentxeeprom.cpp | 15 ++++----------- radio/src/datastructs.h | 9 +++++++-- radio/src/telemetry/telemetry_sensors.cpp | 2 +- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index b49a4a7ab..ec702514c 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -1880,7 +1880,7 @@ class CustomScreenField: public StructField { class SensorField: public TransformedField { public: - SensorField(DataField * parent, const ModelData& model, SensorData & sensor, Board::Type board, unsigned int version): + SensorField(DataField * parent, const ModelData & model, SensorData & sensor, Board::Type board, unsigned int version): TransformedField(parent, internalField), internalField(this, "Sensor"), sensor(sensor), @@ -1948,16 +1948,9 @@ class SensorField: public TransformedField { else { sensor.id = _id; sensor.subid = _subid; - if (model.moduleData[0].isPxx1Module() || model.moduleData[1].isPxx1Module()) { - sensor.instance = (_instance & 0x1F) + (version <= 218 ? 0 : 1); // 5 bits instance - sensor.rxIdx = 0x03; // 2 bits Rx idx - sensor.moduleIdx = 0x01; // 1 bit module idx - } - else { - sensor.instance = (_instance & 0x1F) + 1; - sensor.rxIdx = (_instance >> 5) & 0x03; // 2 bits Rx idx - sensor.moduleIdx = (_instance >> 7) & 0x1; // 1 bit module idx - } + sensor.instance = (_instance & 0x1F) + (version <= 218 ? 0 : 1); // 5 bits instance + sensor.rxIdx = (_instance >> 5) & 0x03; // 2 bits Rx idx + sensor.moduleIdx = (_instance >> 7) & 0x1; // 1 bit module idx sensor.ratio = _ratio; sensor.offset = _offset; } diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 213d9cc4d..899190096 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -387,10 +387,15 @@ PACK(struct TelemetrySensor { return true; if (protocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) { +#if defined(SIMU) + if (((this->instance ^ instance) & 0x1F) == 0) + return true; +#else if (((this->instance ^ instance) & 0x9F) == 0 && (this->instance >> 5) != TELEMETRY_ENDPOINT_SPORT && (instance >> 5) != TELEMETRY_ENDPOINT_SPORT) { this->instance = instance; // update the instance in case we had telemetry switching return true; } +#endif } return false; @@ -471,11 +476,11 @@ PACK(struct ModuleData { // Helper functions to set both of the rfProto protocol at the same time NOBACKUP(inline uint8_t getMultiProtocol() { - return ((uint8_t) (rfProtocol & 0x0f)) + (multi.rfProtocolExtra << 4); + return ((uint8_t) (rfProtocol & 0x0F)) + (multi.rfProtocolExtra << 4); }) NOBACKUP(inline void setMultiProtocol(uint8_t proto) { - rfProtocol = (uint8_t) (proto & 0x0f); + rfProtocol = (uint8_t) (proto & 0x0F); multi.rfProtocolExtra = (proto & 0x70) >> 4; }) }); diff --git a/radio/src/telemetry/telemetry_sensors.cpp b/radio/src/telemetry/telemetry_sensors.cpp index 1d0eb89b6..449879c5a 100644 --- a/radio/src/telemetry/telemetry_sensors.cpp +++ b/radio/src/telemetry/telemetry_sensors.cpp @@ -499,7 +499,7 @@ int setTelemetryValue(TelemetryProtocol protocol, uint16_t id, uint8_t subId, ui { bool sensorFound = false; - for (int index=0; index Date: Thu, 4 Jun 2020 20:52:41 +0200 Subject: [PATCH 402/560] Update CREDITS.txt --- CREDITS.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index e18ed5192..341241272 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1736,3 +1736,5 @@ Wojciech Winiarski Armin Kuepfer Alain Bregand James Thompson +Dautremépuis Benoit +Adriano Emanuele Figliola From f0569b7a84b7ba29cbbed1840a4c7ec8e412b97e Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 5 Jun 2020 10:23:34 +0200 Subject: [PATCH 403/560] Remove unnecessary code (handled by hardware) --- .../targets/common/arm/stm32/bootloader/boot.cpp | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp index c849f9e9a..59027be27 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp +++ b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp @@ -210,21 +210,6 @@ int main() pwrInit(); keysInit(); - // USB charger handling -#if defined(USB_CHARGER) - if (!WAS_RESET_BY_WATCHDOG_OR_SOFTWARE() && !pwrPressed()) { - ledInit(); - usbChargerInit(); - ledOff(); - while (!pwrPressed()) { - if(usbChargerLed()) - GPIO_SetBits(LED_GPIO, LED_GREEN_GPIO_PIN); - else - ledOff(); - } - } -#endif - // wait a bit for the inputs to stabilize... if (!WAS_RESET_BY_WATCHDOG_OR_SOFTWARE()) { for (uint32_t i = 0; i < 150000; i++) { From 0087c172ab068db1d3e152db23cfbee79eae72c7 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 5 Jun 2020 16:02:53 +0200 Subject: [PATCH 404/560] Fixes #7662 --- radio/src/gui/480x272/model_setup.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index 8108577d2..bc5185a2d 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -352,10 +352,10 @@ void runPopupRegister(event_t event) // loop index (will be removed in future) lcdDrawText(REGISTER_COLUMN_1, REGISTER_TOP + 8 + FH, "UID"); - lcdDrawNumber(REGISTER_COLUMN_2, REGISTER_TOP + 8 + FH, reusableBuffer.moduleSetup.pxx2.registerLoopIndex, menuVerticalPosition == ITEM_REGISTER_MODULE_INDEX ? (s_editMode ? INVERS + BLINK : INVERS) : 0); if (menuVerticalPosition == ITEM_REGISTER_MODULE_INDEX && s_editMode) { CHECK_INCDEC_MODELVAR_ZERO(event, reusableBuffer.moduleSetup.pxx2.registerLoopIndex, 2); } + lcdDrawNumber(REGISTER_COLUMN_2, REGISTER_TOP + 8 + FH, reusableBuffer.moduleSetup.pxx2.registerLoopIndex, menuVerticalPosition == ITEM_REGISTER_MODULE_INDEX ? (s_editMode ? INVERS : INVERS) : 0); // RX name if (reusableBuffer.moduleSetup.pxx2.registerStep < REGISTER_RX_NAME_RECEIVED) { From f6ce40e7c85dd94ba6413409c2c755e538d8dc2d Mon Sep 17 00:00:00 2001 From: Kilrah Date: Fri, 5 Jun 2020 18:08:45 +0200 Subject: [PATCH 405/560] Fix typo --- radio/src/gui/128x64/model_special_functions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/model_special_functions.cpp b/radio/src/gui/128x64/model_special_functions.cpp index bfcee26c3..2eaad8f2b 100644 --- a/radio/src/gui/128x64/model_special_functions.cpp +++ b/radio/src/gui/128x64/model_special_functions.cpp @@ -147,7 +147,7 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF #if defined(PCBTARANIS) #if defined(PCBXLITE) - // ENT LONG on xlite brings up switch type menu, so this menu is activated with SHIT + ENT LONG + // ENT LONG on xlite brings up switch type menu, so this menu is activated with SHIFT + ENT LONG if (menuHorizontalPosition==0 && event==EVT_KEY_LONG(KEY_ENTER) && IS_SHIFT_PRESSED() && !READ_ONLY()) { #else if (menuHorizontalPosition<0 && event==EVT_KEY_LONG(KEY_ENTER) && !READ_ONLY()) { From d2a4635f36066d222bf583094918e8e59f8eb76b Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 6 Jun 2020 13:33:40 +0200 Subject: [PATCH 406/560] Fix RxNun missing on 128x64 This fixes #7687 --- radio/src/gui/128x64/model_setup.cpp | 2 +- radio/src/gui/212x64/model_setup.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 5ced958d3..fb35dee26 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -416,7 +416,7 @@ void menuModelSetup(event_t event) IF_NOT_PXX2_MODULE(EXTERNAL_MODULE, MODULE_OPTION_ROW(EXTERNAL_MODULE)), MULTIMODULE_MODULE_ROWS(EXTERNAL_MODULE) FAILSAFE_ROWS(EXTERNAL_MODULE), - IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 1), // Range check and Register buttons + IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 1), // Range check and Register buttons IF_PXX2_MODULE(EXTERNAL_MODULE, 0), // Module options IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // Receiver 1 IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // Receiver 2 diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 808173efb..33833727e 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -1141,7 +1141,7 @@ void menuModelSetup(event_t event) lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER_NUM); } if (isModuleBindRangeAvailable(moduleIdx)) { - if (!IS_RX_MULTI(moduleIdx)) { + if (isModuleRxNumAvailable(moduleIdx)) { lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz == 0 ? attr : 0) | LEADING0 | LEFT, 2); bindButtonPos = lcdNextPos + FW; } From 9d8f00065c1c91d51d54e247c1ea8bc8f5e94500 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 6 Jun 2020 16:47:37 +0200 Subject: [PATCH 407/560] Sanitize AUDIO_FILENAME_MAXLEN (#7688) --- radio/src/audio.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/radio/src/audio.h b/radio/src/audio.h index 0f4821a82..4e312f71a 100644 --- a/radio/src/audio.h +++ b/radio/src/audio.h @@ -64,8 +64,7 @@ template class BitField { #define INDEX_LOGICAL_SWITCH_AUDIO_FILE(index, event) (2*(index)+(event)) #define INDEX_PHASE_AUDIO_FILE(index, event) (2*(index)+(event)) - -#define AUDIO_FILENAME_MAXLEN (42) // max length (example: /SOUNDS/fr/123456789012/1234567890-off.wav) +constexpr uint8_t AUDIO_FILENAME_MAXLEN = (sizeof("/SOUNDS/fr/") - 1) + LEN_MODEL_NAME + 1 + LEN_FLIGHT_MODE_NAME + (sizeof("-off.wav") - 1); // max length (example: /SOUNDS/fr/123456789012/1234567890-off.wav) #define AUDIO_QUEUE_LENGTH (16) // must be a power of 2! #define AUDIO_SAMPLE_RATE (32000) From 9aa9f36b5df3a3658490751fd008ed30be5d5c4b Mon Sep 17 00:00:00 2001 From: DanielGeA Date: Sun, 7 Jun 2020 21:59:05 +0100 Subject: [PATCH 408/560] Add dinamic bit shift for flight modes fading (#7690) --- radio/src/mixer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/mixer.cpp b/radio/src/mixer.cpp index d361ac479..cda081576 100644 --- a/radio/src/mixer.cpp +++ b/radio/src/mixer.cpp @@ -947,7 +947,7 @@ void evalMixes(uint8_t tick10ms) mixerCurrentFlightMode = p; evalFlightModeMixes(p==fm ? e_perout_mode_normal : e_perout_mode_inactive_flight_mode, p==fm ? tick10ms : 0); for (uint8_t i=0; i> 4) * fp_act[p]; + sum_chans512[i] += (chans[i] >> (17-__builtin_clz(abs(chans[i])))) * fp_act[p]; weight += fp_act[p]; } } @@ -978,7 +978,7 @@ void evalMixes(uint8_t tick10ms) // at the end chans[i] = chans[i]/256 => -1024..1024 // interpolate value with min/max so we get smooth motion from center to stop // this limits based on v original values and min=-1024, max=1024 RESX=1024 - int32_t q = (flightModesFade ? (sum_chans512[i] / weight) << 4 : chans[i]); + int32_t q = (flightModesFade ? (sum_chans512[i] / weight) << (17-__builtin_clz(abs(chans[i]))) : chans[i]); ex_chans[i] = q / 256; From db8da58453b535e29bc123524170b3f519db29de Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 7 Jun 2020 23:00:28 +0200 Subject: [PATCH 409/560] Cosmetics --- radio/src/mixer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/mixer.cpp b/radio/src/mixer.cpp index cda081576..373981044 100644 --- a/radio/src/mixer.cpp +++ b/radio/src/mixer.cpp @@ -947,7 +947,7 @@ void evalMixes(uint8_t tick10ms) mixerCurrentFlightMode = p; evalFlightModeMixes(p==fm ? e_perout_mode_normal : e_perout_mode_inactive_flight_mode, p==fm ? tick10ms : 0); for (uint8_t i=0; i> (17-__builtin_clz(abs(chans[i])))) * fp_act[p]; + sum_chans512[i] += (chans[i] >> (17 - __builtin_clz(abs(chans[i])))) * fp_act[p]; weight += fp_act[p]; } } @@ -978,7 +978,7 @@ void evalMixes(uint8_t tick10ms) // at the end chans[i] = chans[i]/256 => -1024..1024 // interpolate value with min/max so we get smooth motion from center to stop // this limits based on v original values and min=-1024, max=1024 RESX=1024 - int32_t q = (flightModesFade ? (sum_chans512[i] / weight) << (17-__builtin_clz(abs(chans[i]))) : chans[i]); + int32_t q = (flightModesFade ? (sum_chans512[i] / weight) << (17 - __builtin_clz(abs(chans[i]))) : chans[i]); ex_chans[i] = q / 256; From 3054d91da0bee38eda0e6a56b6b8cad76392fcd8 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 8 Jun 2020 08:35:40 +0200 Subject: [PATCH 410/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 341241272..a7c69bff2 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1738,3 +1738,4 @@ Alain Bregand James Thompson Dautremépuis Benoit Adriano Emanuele Figliola +Stefano Bortolotti From 9547e1c999aebfc89bf08577d89a11bedf376de7 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 8 Jun 2020 08:47:19 +0200 Subject: [PATCH 411/560] Typo --- companion/src/firmwares/adjustmentreference.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/companion/src/firmwares/adjustmentreference.cpp b/companion/src/firmwares/adjustmentreference.cpp index 37b284ecd..7181e15dd 100644 --- a/companion/src/firmwares/adjustmentreference.cpp +++ b/companion/src/firmwares/adjustmentreference.cpp @@ -45,15 +45,12 @@ AdjustmentReference::AdjustmentReference(AdjustRefType type, int value) bool AdjustmentReference::isValid(const int value) const { - switch(type) { + switch (type) { case ADJUST_REF_VALUE: - if (abs(value) < ADJUST_REF_GVAR_BASE) - return true; - break; + return abs(value) < ADJUST_REF_GVAR_BASE; + case ADJUST_REF_GVAR: - if (abs(value) > 0 && abs(value) <= CPN_MAX_GVARS); - return true; - break; + return abs(value) > 0 && abs(value) <= CPN_MAX_GVARS; } return false; } From 6609481c2306973e5258240a80a97822a8c02747 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 8 Jun 2020 10:08:20 +0200 Subject: [PATCH 412/560] Another attempt to fix #6063 (#7706) --- radio/src/gui/480x272/model_select.cpp | 11 +++++----- radio/src/storage/modelslist.cpp | 8 +++---- radio/src/storage/modelslist.h | 29 ++++++++++++++------------ 3 files changed, 26 insertions(+), 22 deletions(-) diff --git a/radio/src/gui/480x272/model_select.cpp b/radio/src/gui/480x272/model_select.cpp index 539191372..36dac8ba8 100644 --- a/radio/src/gui/480x272/model_select.cpp +++ b/radio/src/gui/480x272/model_select.cpp @@ -95,11 +95,10 @@ void setCurrentCategory(unsigned int index) if (currentCategory->size() > 0) setCurrentModel(0); else - currentModel = NULL; + currentModel = nullptr; } #if defined(LUA) - #define MAX_WIZARD_NAME_LEN (sizeof(WIZARD_PATH)+20) #define WIZARD_SPACING 40 #define WIZARD_LEFT_SPACING 30 @@ -248,6 +247,7 @@ void onModelSelectMenu(const char * result) storageCheck(true); memcpy(g_eeGeneral.currModelFilename, currentModel->modelFilename, LEN_MODEL_FILENAME); modelslist.setCurrentModel(currentModel); + modelslist.setCurrentCategory(currentCategory); loadModel(g_eeGeneral.currModelFilename, true); storageDirty(EE_GENERAL); storageCheck(true); @@ -264,6 +264,7 @@ void onModelSelectMenu(const char * result) selectMode = MODE_SELECT_MODEL; setCurrentModel(currentCategory->size() - 1); modelslist.setCurrentModel(currentModel); + modelslist.setCurrentCategory(currentCategory); modelslist.onNewModelCreated(currentModel, &g_model); #if defined(LUA) chainMenu(menuModelWizard); @@ -274,7 +275,7 @@ void onModelSelectMenu(const char * result) memcpy(duplicatedFilename, currentModel->modelFilename, sizeof(duplicatedFilename)); if (findNextFileIndex(duplicatedFilename, LEN_MODEL_FILENAME, MODELS_PATH)) { sdCopyFile(currentModel->modelFilename, MODELS_PATH, duplicatedFilename, MODELS_PATH); - ModelCell* dup_model = modelslist.addModel(currentCategory, duplicatedFilename); + ModelCell * dup_model = modelslist.addModel(currentCategory, duplicatedFilename); dup_model->fetchRfData(); setCurrentModel(currentCategory->size() - 1); } @@ -344,7 +345,7 @@ void initModelsList() bool menuModelSelect(event_t event) { const std::list& cats = modelslist.getCategories(); - switch(event) { + switch (event) { case 0: // no need to refresh the screen return false; @@ -387,7 +388,7 @@ bool menuModelSelect(event_t event) categoriesVerticalPosition -= 1; setCurrentCategory(categoriesVerticalPosition); modelslist.moveModel(model, previous_category, currentCategory); - setCurrentModel(currentCategory->size()-1); + setCurrentModel(currentCategory->size() - 1); } killEvents(event); break; diff --git a/radio/src/storage/modelslist.cpp b/radio/src/storage/modelslist.cpp index b706b9891..972e24800 100644 --- a/radio/src/storage/modelslist.cpp +++ b/radio/src/storage/modelslist.cpp @@ -288,8 +288,8 @@ ModelsList::~ModelsList() void ModelsList::init() { loaded = false; - currentCategory = NULL; - currentModel = NULL; + currentCategory = nullptr; + currentModel = nullptr; modelsCount = 0; } @@ -368,12 +368,12 @@ void ModelsList::save() f_close(&file); } -void ModelsList::setCurrentCategorie(ModelsCategory* cat) +void ModelsList::setCurrentCategory(ModelsCategory * cat) { currentCategory = cat; } -void ModelsList::setCurrentModel(ModelCell* cell) +void ModelsList::setCurrentModel(ModelCell * cell) { currentModel = cell; if (!currentModel->valid_rfData) diff --git a/radio/src/storage/modelslist.h b/radio/src/storage/modelslist.h index c5a157207..7da9d4b46 100644 --- a/radio/src/storage/modelslist.h +++ b/radio/src/storage/modelslist.h @@ -40,8 +40,8 @@ struct SimpleModuleData class ModelCell { public: - char modelFilename[LEN_MODEL_FILENAME+1]; - char modelName[LEN_MODEL_NAME+1]; + char modelFilename[LEN_MODEL_FILENAME + 1]; + char modelName[LEN_MODEL_NAME + 1]; BitmapBuffer * buffer; bool valid_rfData; @@ -51,10 +51,10 @@ public: ModelCell(const char * name); ~ModelCell(); - void save(FIL* file); + void save(FIL * file); - void setModelName(char* name); - void setRfData(ModelData* model); + void setModelName(char * name); + void setRfData(ModelData * model); void setModelId(uint8_t moduleIdx, uint8_t id); void setRfModuleData(uint8_t moduleIdx, ModuleData* modData); @@ -68,7 +68,7 @@ public: class ModelsCategory: public std::list { public: - char name[LEN_MODEL_FILENAME+1]; + char name[LEN_MODEL_FILENAME + 1]; ModelsCategory(const char * name); ~ModelsCategory(); @@ -98,21 +98,25 @@ public: void save(); void clear(); - const std::list& getCategories() const { + const std::list & getCategories() const + { return categories; } - void setCurrentCategorie(ModelsCategory* cat); - ModelsCategory* getCurrentCategory() const { + void setCurrentCategory(ModelsCategory * cat); + ModelsCategory * getCurrentCategory() const + { return currentCategory; } - void setCurrentModel(ModelCell* cell); - ModelCell* getCurrentModel() const { + void setCurrentModel(ModelCell * cell); + ModelCell * getCurrentModel() const + { return currentModel; } - unsigned int getModelsCount() const { + unsigned int getModelsCount() const + { return modelsCount; } @@ -133,7 +137,6 @@ public: protected: FIL file; - }; extern ModelsList modelslist; From 31d734d14a61d5f7268b36a6d6e39464afd41603 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 8 Jun 2020 10:46:16 +0200 Subject: [PATCH 413/560] Companion failsafe fix (#7705) Companion failsafe fix --- companion/src/firmwares/io_data.h | 3 +- companion/src/firmwares/modeldata.cpp | 26 +++++----- companion/src/firmwares/moduledata.h | 7 ++- .../src/firmwares/opentx/opentxeeprom.cpp | 10 ++-- companion/src/modeledit/setup.cpp | 50 ++++++++++++++----- companion/src/modeledit/setup.h | 7 ++- companion/src/modelprinter.cpp | 5 +- 7 files changed, 70 insertions(+), 38 deletions(-) diff --git a/companion/src/firmwares/io_data.h b/companion/src/firmwares/io_data.h index 05136f210..b70b174ea 100644 --- a/companion/src/firmwares/io_data.h +++ b/companion/src/firmwares/io_data.h @@ -109,7 +109,8 @@ class LimitData { int offset; int ppmCenter; bool symetrical; - char name[LIMITDATA_NAME_LEN+1]; + int failsafe; + char name[LIMITDATA_NAME_LEN + 1]; CurveReference curve; QString minToString() const; QString maxToString() const; diff --git a/companion/src/firmwares/modeldata.cpp b/companion/src/firmwares/modeldata.cpp index b72cc328a..3386ba41d 100644 --- a/companion/src/firmwares/modeldata.cpp +++ b/companion/src/firmwares/modeldata.cpp @@ -1174,8 +1174,7 @@ void ModelData::updateModuleFailsafes(ModuleData * md) bool updated = false; - switch (updRefInfo.action) - { + switch (updRefInfo.action) { case REF_UPD_ACT_CLEAR: break; case REF_UPD_ACT_SHIFT: @@ -1183,16 +1182,16 @@ void ModelData::updateModuleFailsafes(ModuleData * md) return; if (updRefInfo.shift > 0) { - for (int i = (CPN_MAX_CHNOUT - 1); i > updRefInfo.index1; i--) { - md->failsafeChannels[i] = md->failsafeChannels[i - 1]; + for (int i = CPN_MAX_CHNOUT - 1; i > updRefInfo.index1; i--) { + limitData[i].failsafe = limitData[i - 1].failsafe; } - md->failsafeChannels[updRefInfo.index1] = 0; + limitData[updRefInfo.index1].failsafe = 0; } else { - for (int i = (updRefInfo.index1 + 1); i < (CPN_MAX_CHNOUT - 1); i++) { - md->failsafeChannels[i - 1] = md->failsafeChannels[i]; + for (int i = updRefInfo.index1 + 1; i < CPN_MAX_CHNOUT - 1; i++) { + limitData[i - 1].failsafe = limitData[i].failsafe; } - md->failsafeChannels[CPN_MAX_CHNOUT - 1] = 0; + limitData[CPN_MAX_CHNOUT - 1].failsafe = 0; } updated = true; break; @@ -1200,17 +1199,18 @@ void ModelData::updateModuleFailsafes(ModuleData * md) int tmp; if (updRefInfo.index1 >= 0 && updRefInfo.index1 < CPN_MAX_CHNOUT) { updated = true; - tmp = md->failsafeChannels[updRefInfo.index1]; + tmp = limitData[updRefInfo.index1].failsafe; if (updRefInfo.index2 >= 0 && updRefInfo.index2 < CPN_MAX_CHNOUT) - md->failsafeChannels[updRefInfo.index1] = md->failsafeChannels[updRefInfo.index2]; + limitData[updRefInfo.index1].failsafe = limitData[updRefInfo.index2].failsafe; else - md->failsafeChannels[updRefInfo.index1] = 0; + limitData[updRefInfo.index1].failsafe = 0; } else tmp = 0; - if (updRefInfo.index2 >= 0 && updRefInfo.index2 < CPN_MAX_CHNOUT) + if (updRefInfo.index2 >= 0 && updRefInfo.index2 < CPN_MAX_CHNOUT) { updated = true; - md->failsafeChannels[updRefInfo.index2] = tmp; + limitData[updRefInfo.index2].failsafe = tmp; + } break; default: qDebug() << "Error - unhandled action:" << updRefInfo.action; diff --git a/companion/src/firmwares/moduledata.h b/companion/src/firmwares/moduledata.h index 1df7380a1..d356c3012 100644 --- a/companion/src/firmwares/moduledata.h +++ b/companion/src/firmwares/moduledata.h @@ -158,7 +158,11 @@ class ModuleData { Q_DECLARE_TR_FUNCTIONS(ModuleData) public: - ModuleData() { clear(); } + ModuleData() + { + clear(); + } + unsigned int modelId; unsigned int protocol; // type in datastructs.h int rfProtocol; // rfProtocol in datastructs.h @@ -168,7 +172,6 @@ class ModuleData { unsigned int channelsStart; int channelsCount; // 0=8 channels unsigned int failsafeMode; - int failsafeChannels[CPN_MAX_CHNOUT]; struct PPM { int delay; diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index ec702514c..17c5b03a5 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -2184,7 +2184,7 @@ class ModuleUnionField: public UnionField { class ModuleField: public TransformedField { public: - ModuleField(DataField * parent, ModuleData & module, Board::Type board, unsigned int version): + ModuleField(DataField * parent, ModuleData & module, ModelData & model, Board::Type board, unsigned int version): TransformedField(parent, internalField), internalField(this, "Module"), module(module), @@ -2198,8 +2198,8 @@ class ModuleField: public TransformedField { internalField.Append(new UnsignedField<3>(this, module.subType)); internalField.Append(new BoolField<1>(this, module.invertedSerial)); if (version <= 218) { - for (int i=0; i<32; i++) { - internalField.Append(new SignedField<16>(this, module.failsafeChannels[i])); + for (int i = 0; i < 32; i++) { + internalField.Append(new SignedField<16>(this, model.limitData[i].failsafe)); } } @@ -2393,12 +2393,12 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig int modulesCount = (version <= 218 ? 3 : 2); for (int module = 0; module < modulesCount; module++) { - internalField.Append(new ModuleField(this, modelData.moduleData[module], board, version)); + internalField.Append(new ModuleField(this, modelData.moduleData[module], modelData, board, version)); } if (version >= 219) { for (int i = 0; i < 32; i++) { - internalField.Append(new SignedField<16>(this, modelData.moduleData[0].failsafeChannels[i])); + internalField.Append(new SignedField<16>(this, modelData.limitData[i].failsafe)); } } diff --git a/companion/src/modeledit/setup.cpp b/companion/src/modeledit/setup.cpp index c813b0b9c..43eaf11fe 100644 --- a/companion/src/modeledit/setup.cpp +++ b/companion/src/modeledit/setup.cpp @@ -792,18 +792,22 @@ void ModulePanel::on_lowPower_stateChanged(int state) module.multi.lowPowerMode = (state == Qt::Checked); } -// updtSb (update spin box(es)): 0=none or bitmask of FailsafeValueDisplayTypes -void ModulePanel::setChannelFailsafeValue(const int channel, const int value, quint8 updtSb) +void ModulePanel::onFailsafeModified(unsigned channel) { - if (channel < 0 || channel >= CPN_MAX_CHNOUT) - return; + updateFailsafeUI(channel, FAILSAFE_DISPLAY_PERCENT | FAILSAFE_DISPLAY_USEC); +} - module.failsafeChannels[channel] = value; +void ModulePanel::updateFailsafeUI(unsigned channel, quint8 updtSb) +{ + int value = model->limitData[channel].failsafe; double pctVal = divRoundClosest(value * 1000, 1024) / 10.0; - // qDebug() << value << pctVal; if (failsafeGroupsMap.contains(channel)) { const ChannelFailsafeWidgetsGroup & grp = failsafeGroupsMap.value(channel); + bool disable = (value == FAILSAFE_CHANNEL_HOLD || value == FAILSAFE_CHANNEL_NOPULSE); + if (grp.combo) { + grp.combo->setCurrentIndex(grp.combo->findData(disable ? value : 0)); + } if ((updtSb & FAILSAFE_DISPLAY_PERCENT) && grp.sbPercent) { grp.sbPercent->blockSignals(true); grp.sbPercent->setValue(pctVal); @@ -815,8 +819,21 @@ void ModulePanel::setChannelFailsafeValue(const int channel, const int value, qu grp.sbUsec->blockSignals(false); } } - if (!lock) +} + +// updtSb (update spin box(es)): 0=none or bitmask of FailsafeValueDisplayTypes +void ModulePanel::setChannelFailsafeValue(const int channel, const int value, quint8 updtSb) +{ + if (channel < 0 || channel >= CPN_MAX_CHNOUT) + return; + + model->limitData[channel].failsafe = value; + updateFailsafeUI(channel, updtSb); + + if (!lock) { + emit failsafeModified(channel); emit modified(); + } } void ModulePanel::onFailsafeUsecChanged(int value) @@ -853,8 +870,9 @@ void ModulePanel::onFailsafeComboIndexChanged(int index) bool ok = false; int channel = sender()->property("index").toInt(&ok); if (ok) { - module.failsafeChannels[channel] = cb->itemData(index).toInt(); + model->limitData[channel].failsafe = cb->itemData(index).toInt(); updateFailsafe(channel); + emit failsafeModified(channel); emit modified(); } lock = false; @@ -886,12 +904,12 @@ void ModulePanel::onExtendedLimitsToggled() } } -void ModulePanel::updateFailsafe(int channel) +void ModulePanel::updateFailsafe(unsigned channel) { if (channel >= CPN_MAX_CHNOUT || !failsafeGroupsMap.contains(channel)) return; - const int failsafeValue = module.failsafeChannels[channel]; + const int failsafeValue = model->limitData[channel].failsafe; const ChannelFailsafeWidgetsGroup & grp = failsafeGroupsMap.value(channel); const bool valDisable = (failsafeValue == FAILSAFE_CHANNEL_HOLD || failsafeValue == FAILSAFE_CHANNEL_NOPULSE); @@ -903,7 +921,7 @@ void ModulePanel::updateFailsafe(int channel) grp.sbUsec->setDisabled(valDisable); if (!valDisable) - setChannelFailsafeValue(channel, failsafeValue, (FAILSAFE_DISPLAY_PERCENT | FAILSAFE_DISPLAY_USEC)); + setChannelFailsafeValue(channel, failsafeValue, FAILSAFE_DISPLAY_PERCENT | FAILSAFE_DISPLAY_USEC); } void ModulePanel::onClearAccessRxClicked() @@ -1166,13 +1184,21 @@ SetupPanel::SetupPanel(QWidget * parent, ModelData & model, GeneralSettings & ge ui->trimsDisplay->hide(); } - for (int i=firmware->getCapability(NumFirstUsableModule); igetCapability(NumModules); i++) { + for (int i = firmware->getCapability(NumFirstUsableModule); i < firmware->getCapability(NumModules); i++) { modules[i] = new ModulePanel(this, model, model.moduleData[i], generalSettings, firmware, i); ui->modulesLayout->addWidget(modules[i]); connect(modules[i], &ModulePanel::modified, this, &SetupPanel::modified); connect(this, &SetupPanel::extendedLimitsToggled, modules[i], &ModulePanel::onExtendedLimitsToggled); } + for (int i = firmware->getCapability(NumFirstUsableModule); i < firmware->getCapability(NumModules); i++) { + for (int j = firmware->getCapability(NumFirstUsableModule); j < firmware->getCapability(NumModules); j++) { + if (i != j) { + connect(modules[i], SIGNAL(failsafeModified(unsigned)), modules[j], SLOT(onFailsafeModified(unsigned))); + } + } + } + if (firmware->getCapability(ModelTrainerEnable)) { modules[CPN_MAX_MODULES] = new ModulePanel(this, model, model.moduleData[CPN_MAX_MODULES], generalSettings, firmware, -1); ui->modulesLayout->addWidget(modules[CPN_MAX_MODULES]); diff --git a/companion/src/modeledit/setup.h b/companion/src/modeledit/setup.h index fa9e4ad5b..1470e4e2f 100644 --- a/companion/src/modeledit/setup.h +++ b/companion/src/modeledit/setup.h @@ -61,15 +61,17 @@ class ModulePanel : public ModelPanel Q_OBJECT public: - ModulePanel(QWidget *parent, ModelData & model, ModuleData & module, GeneralSettings & generalSettings, Firmware * firmware, int moduleIdx); + ModulePanel(QWidget * parent, ModelData & model, ModuleData & module, GeneralSettings & generalSettings, Firmware * firmware, int moduleIdx); virtual ~ModulePanel(); virtual void update(); public slots: void onExtendedLimitsToggled(); + void onFailsafeModified(unsigned index); signals: void channelsRangeChanged(); + void failsafeModified(unsigned index); private slots: void setupFailsafes(); @@ -95,7 +97,7 @@ class ModulePanel : public ModelPanel void onFailsafeUsecChanged(int value); void onFailsafePercentChanged(double value); void onFailsafesDisplayValueTypeChanged(int type); - void updateFailsafe(int channel); + void updateFailsafe(unsigned channel); void on_optionValue_editingFinished(); void onClearAccessRxClicked(); @@ -114,6 +116,7 @@ class ModulePanel : public ModelPanel Ui::Module *ui; QMap failsafeGroupsMap; static quint8 failsafesValueDisplayType; // FailsafeValueDisplayTypes + void updateFailsafeUI(unsigned channel, quint8 updtSb); }; class SetupPanel : public ModelPanel diff --git a/companion/src/modelprinter.cpp b/companion/src/modelprinter.cpp index ac9f6f066..dde8517e0 100644 --- a/companion/src/modelprinter.cpp +++ b/companion/src/modelprinter.cpp @@ -897,9 +897,8 @@ QString ModelPrinter::printFailsafe(int idx) ModuleData module = model.moduleData[idx]; strl << printLabelValue(tr("Failsafe Mode"), printFailsafeMode(module.failsafeMode)); if (module.failsafeMode == FAILSAFE_CUSTOM) { - for (int i=0; i Date: Mon, 8 Jun 2020 14:40:53 +0200 Subject: [PATCH 414/560] Fixes #7694 --- radio/src/gui/480x272/menus.h | 9 +++++++++ radio/src/gui/480x272/radio_sdmanager.cpp | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/480x272/menus.h b/radio/src/gui/480x272/menus.h index e9f4e7008..0177397f2 100644 --- a/radio/src/gui/480x272/menus.h +++ b/radio/src/gui/480x272/menus.h @@ -570,6 +570,15 @@ inline void POPUP_WAIT(const char * s) popupFunc = runPopupWarning; } +inline void DRAW_POPUP_WAIT(const char * s) +{ + warningText = s; + warningInfoText = nullptr; + warningType = WARNING_TYPE_WAIT; + runPopupWarning(0); + warningText = nullptr; +} + inline void POPUP_INFORMATION(const char * s) { warningText = s; diff --git a/radio/src/gui/480x272/radio_sdmanager.cpp b/radio/src/gui/480x272/radio_sdmanager.cpp index 96fb7c18d..fbf12764c 100644 --- a/radio/src/gui/480x272/radio_sdmanager.cpp +++ b/radio/src/gui/480x272/radio_sdmanager.cpp @@ -568,12 +568,12 @@ bool menuRadioSdManager(event_t _event) for (auto rx = 0; rx < popupMenuItemsCount; rx++) { popupMenuItems[rx] = reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversNames[rx]; } - //popupMenuTitle = STR_PXX2_SELECT_RX; + // popupMenuTitle = STR_PXX2_SELECT_RX; POPUP_MENU_START(onUpdateReceiverSelection); } } else { - POPUP_WAIT(STR_WAITING_FOR_RX); + DRAW_POPUP_WAIT(STR_WAITING_FOR_RX); } } } From 48c227d5f5b095f0f6babcd1e11f629657a75809 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 8 Jun 2020 15:11:34 +0200 Subject: [PATCH 415/560] Add a title to the popups on Horus --- radio/src/gui/480x272/menus.h | 1 + radio/src/gui/480x272/model_setup.cpp | 2 +- radio/src/gui/480x272/popups.cpp | 9 +++++++-- radio/src/gui/480x272/radio_sdmanager.cpp | 2 +- radio/src/gui/common/stdlcd/popups.h | 1 + 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/radio/src/gui/480x272/menus.h b/radio/src/gui/480x272/menus.h index 0177397f2..5173bb04d 100644 --- a/radio/src/gui/480x272/menus.h +++ b/radio/src/gui/480x272/menus.h @@ -502,6 +502,7 @@ inline void DISPLAY_WARNING(event_t event) #define MENU_MAX_DISPLAY_LINES 9 #define MENU_LINE_LENGTH (LEN_MODEL_NAME+12) +extern const char * popupMenuTitle; extern const char * popupMenuItems[POPUP_MENU_MAX_LINES]; extern uint16_t popupMenuItemsCount; extern uint16_t popupMenuOffset; diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index bc5185a2d..5f9d680cf 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -1455,7 +1455,7 @@ bool menuModelSetup(event_t event) for (auto rx = 0; rx < popupMenuItemsCount; rx++) { popupMenuItems[rx] = reusableBuffer.moduleSetup.bindInformation.candidateReceiversNames[rx]; } - // popupMenuTitle = STR_PXX2_SELECT_RX; + popupMenuTitle = STR_PXX2_SELECT_RX; POPUP_MENU_START(onPXX2BindMenu); } } diff --git a/radio/src/gui/480x272/popups.cpp b/radio/src/gui/480x272/popups.cpp index 2d8caeca3..672922d33 100644 --- a/radio/src/gui/480x272/popups.cpp +++ b/radio/src/gui/480x272/popups.cpp @@ -27,6 +27,7 @@ uint8_t warningType; uint8_t warningResult = 0; uint8_t warningInfoFlags = ZCHAR; PopupFunc popupFunc = nullptr; +const char * popupMenuTitle = nullptr; const char *popupMenuItems[POPUP_MENU_MAX_LINES]; uint8_t popupMenuSelectedItem = 0; uint16_t popupMenuItemsCount = 0; @@ -61,6 +62,10 @@ void drawPopupBackgroundAndBorder(coord_t x, coord_t y, coord_t w, coord_t h) { lcdDrawSolidFilledRect(x + 1, y + 1, w - 2, h - 2, TEXT_BGCOLOR); lcdDrawSolidRect(x, y, w, h, 1, ALARM_COLOR); + if (popupMenuTitle) { + lcdDrawSolidFilledRect(x, y - FH, w, FH, TEXT_INVERTED_BGCOLOR); + lcdDrawText(x + w / 2, y - FH, popupMenuTitle, BOLD | CENTERED | TEXT_INVERTED_COLOR); + } } void runPopupWarning(event_t event) @@ -167,9 +172,9 @@ const char * runPopupMenu(event_t event) break; } - int y = (LCD_H - (display_count*(FH+1))) / 2; + int y = (LCD_H - (display_count*(FH + 1)) + (popupMenuTitle ? FH : 0) + FH) / 2; - drawPopupBackgroundAndBorder(MENU_X, y, MENU_W, display_count * (FH+1) + 2); + drawPopupBackgroundAndBorder(MENU_X, y, MENU_W, display_count * (FH + 1) + 2); for (uint8_t i=0; i Date: Mon, 8 Jun 2020 17:53:39 +0200 Subject: [PATCH 416/560] Cosmetics --- radio/src/gui/480x272/radio_sdmanager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/480x272/radio_sdmanager.cpp b/radio/src/gui/480x272/radio_sdmanager.cpp index b5134bb3e..24c9d2c7b 100644 --- a/radio/src/gui/480x272/radio_sdmanager.cpp +++ b/radio/src/gui/480x272/radio_sdmanager.cpp @@ -523,7 +523,7 @@ bool menuRadioSdManager(event_t _event) reusableBuffer.sdManager.offset = menuVerticalOffset; - for (uint8_t i=0; i Date: Mon, 8 Jun 2020 17:57:26 +0200 Subject: [PATCH 417/560] Cosmetics --- radio/src/gui/128x64/model_setup.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index fb35dee26..cc625e367 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1419,7 +1419,8 @@ void menuModelSetup(event_t event) #if defined(HARDWARE_INTERNAL_MODULE) case ITEM_MODEL_SETUP_INTERNAL_MODULE_FAILSAFE: #endif - case ITEM_MODEL_SETUP_EXTERNAL_MODULE_FAILSAFE: { + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_FAILSAFE: + { ModuleData &moduleData = g_model.moduleData[moduleIdx]; lcdDrawTextAlignedLeft(y, STR_FAILSAFE); lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VFAILSAFE, moduleData.failsafeMode, menuHorizontalPosition == 0 ? attr : 0); From 8f7d3c9786bf22d52da969a337e7c1d0f37947cc Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 8 Jun 2020 18:34:58 +0200 Subject: [PATCH 418/560] Cosmetics --- radio/src/bluetooth.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/bluetooth.cpp b/radio/src/bluetooth.cpp index 025237eb2..22daa0c42 100644 --- a/radio/src/bluetooth.cpp +++ b/radio/src/bluetooth.cpp @@ -176,7 +176,7 @@ void Bluetooth::processTrainerByte(uint8_t data) switch (dataState) { case STATE_DATA_START: if (data == START_STOP) { - dataState = STATE_DATA_IN_FRAME ; + dataState = STATE_DATA_IN_FRAME; bufferIndex = 0; } else { @@ -189,7 +189,7 @@ void Bluetooth::processTrainerByte(uint8_t data) dataState = STATE_DATA_XOR; // XOR next byte } else if (data == START_STOP) { - dataState = STATE_DATA_IN_FRAME ; + dataState = STATE_DATA_IN_FRAME; bufferIndex = 0; } else { From 2edfa73dc1c1368ca6c817266b030ae3c7a57e57 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 8 Jun 2020 19:06:55 +0200 Subject: [PATCH 419/560] Cosmetics --- radio/src/targets/horus/extmodule_driver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/targets/horus/extmodule_driver.cpp b/radio/src/targets/horus/extmodule_driver.cpp index 0da9e46a5..e4b28244e 100644 --- a/radio/src/targets/horus/extmodule_driver.cpp +++ b/radio/src/targets/horus/extmodule_driver.cpp @@ -362,7 +362,7 @@ void extmoduleSendInvertedByte(uint8_t byte) // wait } time += 34; - for (i = 0 ; i < 8 ; i += 1) { + for (i = 0; i < 8; i++) { if (byte & 1) { GPIO_ResetBits(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PIN); } From 9493b4500a7a1839f876d52f2581fb6a205dc011 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 8 Jun 2020 19:14:13 +0200 Subject: [PATCH 420/560] Cosmetics --- radio/src/gui/common/stdlcd/model_inputs.cpp | 2 +- radio/src/gui/common/stdlcd/model_mixes.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/common/stdlcd/model_inputs.cpp b/radio/src/gui/common/stdlcd/model_inputs.cpp index edf245654..c396db061 100644 --- a/radio/src/gui/common/stdlcd/model_inputs.cpp +++ b/radio/src/gui/common/stdlcd/model_inputs.cpp @@ -26,7 +26,7 @@ uint8_t getExposCount() { uint8_t count = 0; - uint8_t ch ; + uint8_t ch; for (int i=MAX_EXPOS-1 ; i>=0; i--) { ch = EXPO_VALID(expoAddress(i)); diff --git a/radio/src/gui/common/stdlcd/model_mixes.cpp b/radio/src/gui/common/stdlcd/model_mixes.cpp index c2714a3b0..d5324e509 100644 --- a/radio/src/gui/common/stdlcd/model_mixes.cpp +++ b/radio/src/gui/common/stdlcd/model_mixes.cpp @@ -26,7 +26,7 @@ uint8_t getMixesCount() { uint8_t count = 0; - uint8_t ch ; + uint8_t ch; for (int i=MAX_MIXERS-1; i>=0; i--) { ch = mixAddress(i)->srcRaw; From dee71500a8030d718999af0017c4378560835e9a Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 8 Jun 2020 19:59:43 +0200 Subject: [PATCH 421/560] Cosmetics --- radio/src/targets/horus/extmodule_driver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/targets/horus/extmodule_driver.cpp b/radio/src/targets/horus/extmodule_driver.cpp index e4b28244e..7e8b90937 100644 --- a/radio/src/targets/horus/extmodule_driver.cpp +++ b/radio/src/targets/horus/extmodule_driver.cpp @@ -376,7 +376,7 @@ void extmoduleSendInvertedByte(uint8_t byte) time += 35 ; } GPIO_ResetBits(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PIN); - __enable_irq() ; // No need to wait for the stop bit to complete + __enable_irq(); // No need to wait for the stop bit to complete while ((uint16_t) (getTmr2MHz() - time) < 34) { // wait } From 5276a4d42a29485039d7c444f50ecf1f1c176904 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 8 Jun 2020 20:46:34 +0200 Subject: [PATCH 422/560] Cosmetics for another attempt --- radio/src/gui/212x64/model_setup.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 33833727e..1b9d612ad 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -536,7 +536,7 @@ void menuModelSetup(event_t event) break; case ITEM_MODEL_SETUP_THROTTLE_REVERSED: - ON_OFF_MENU_ITEM(g_model.throttleReversed, MODEL_SETUP_2ND_COLUMN, y, STR_THROTTLEREVERSE, attr, event ) ; + ON_OFF_MENU_ITEM(g_model.throttleReversed, MODEL_SETUP_2ND_COLUMN, y, STR_THROTTLEREVERSE, attr, event ); break; case ITEM_MODEL_SETUP_THROTTLE_TRACE: From 62bcb1dbadd35c05ddf6418dce5377921abf41f2 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 8 Jun 2020 21:25:39 +0200 Subject: [PATCH 423/560] VC++ compilation fix --- radio/src/datastructs.h | 20 +------------------- radio/src/telemetry/telemetry_sensors.cpp | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 899190096..9ff05975a 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -381,25 +381,7 @@ PACK(struct TelemetrySensor { bool isPrecConfigurable() const; int32_t getPrecMultiplier() const; int32_t getPrecDivisor() const; - bool isSameInstance(TelemetryProtocol protocol, uint8_t instance) - { - if (this->instance == instance) - return true; - - if (protocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) { -#if defined(SIMU) - if (((this->instance ^ instance) & 0x1F) == 0) - return true; -#else - if (((this->instance ^ instance) & 0x9F) == 0 && (this->instance >> 5) != TELEMETRY_ENDPOINT_SPORT && (instance >> 5) != TELEMETRY_ENDPOINT_SPORT) { - this->instance = instance; // update the instance in case we had telemetry switching - return true; - } -#endif - } - - return false; - } + bool isSameInstance(TelemetryProtocol protocol, uint8_t instance); ); }); diff --git a/radio/src/telemetry/telemetry_sensors.cpp b/radio/src/telemetry/telemetry_sensors.cpp index 449879c5a..0896e1424 100644 --- a/radio/src/telemetry/telemetry_sensors.cpp +++ b/radio/src/telemetry/telemetry_sensors.cpp @@ -720,3 +720,23 @@ int32_t TelemetrySensor::getPrecDivisor() const if (prec == 1) return 10; return 1; } + +bool TelemetrySensor::isSameInstance(TelemetryProtocol protocol, uint8_t instance) +{ + if (this->instance == instance) + return true; + + if (protocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) { +#if defined(SIMU) + if (((this->instance ^ instance) & 0x1F) == 0) + return true; +#else + if (((this->instance ^ instance) & 0x9F) == 0 && (this->instance >> 5) != TELEMETRY_ENDPOINT_SPORT && (instance >> 5) != TELEMETRY_ENDPOINT_SPORT) { + this->instance = instance; // update the instance in case we had telemetry switching + return true; + } +#endif + } + + return false; +} From e7e8c95c4584ff14c068230fd8c7c2907d44c9ac Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 8 Jun 2020 21:51:51 +0200 Subject: [PATCH 424/560] VC++ compilation fix --- radio/src/targets/simu/simpgmspace.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/radio/src/targets/simu/simpgmspace.h b/radio/src/targets/simu/simpgmspace.h index 302355fd7..ed9d16b4b 100644 --- a/radio/src/targets/simu/simpgmspace.h +++ b/radio/src/targets/simu/simpgmspace.h @@ -23,11 +23,16 @@ #ifndef __GNUC__ #include +#include #define sleep(x) Sleep(x) #define strcasecmp _stricmp #define strncasecmp _tcsnicmp #define chdir _chdir #define getcwd _getcwd +inline int __builtin_clz(unsigned x) +{ + return (int)__lzcnt(x); +} #else #include #define sleep(x) usleep(1000*x) From dcd53bdf054609f0bbec81b8f09e26d555cfe779 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 9 Jun 2020 08:27:21 +0200 Subject: [PATCH 425/560] Cosmetics --- radio/src/gui/128x64/model_setup.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index cc625e367..d5e9d1004 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -511,7 +511,7 @@ void menuModelSetup(event_t event) break; case 2: qr.rem -= checkIncDecModel(event, qr.rem+2, 1, 62)-2; - timer->start -= qr.rem ; + timer->start -= qr.rem; if ((int16_t)timer->start < 0) timer->start=0; if ((int16_t)timer->start > 5999) timer->start=32399; // 8:59:59 break; @@ -585,7 +585,7 @@ void menuModelSetup(event_t event) break; case ITEM_MODEL_SETUP_THROTTLE_REVERSED: - ON_OFF_MENU_ITEM(g_model.throttleReversed, MODEL_SETUP_2ND_COLUMN, y, STR_THROTTLEREVERSE, attr, event ) ; + ON_OFF_MENU_ITEM(g_model.throttleReversed, MODEL_SETUP_2ND_COLUMN, y, STR_THROTTLEREVERSE, attr, event ); break; case ITEM_MODEL_SETUP_THROTTLE_TRACE: From 563761c114fa18c73cdb0885277614fa76f636c7 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 9 Jun 2020 08:35:08 +0200 Subject: [PATCH 426/560] Silence warning --- companion/src/modeledit/inputs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/companion/src/modeledit/inputs.cpp b/companion/src/modeledit/inputs.cpp index a5220019e..806de54fc 100644 --- a/companion/src/modeledit/inputs.cpp +++ b/companion/src/modeledit/inputs.cpp @@ -643,7 +643,7 @@ void InputsPanel::cmInputSwapData(int idx1, int idx2) } // move expos up const int offset = i - expoidx; - int expocnt; + int expocnt = 0; for (int j = i; j < CPN_MAX_EXPOS; j++) { ExpoData *ed = &model->expoData[j]; if ((int)ed->chn == idx2) { From 38f6d5772fc9344e664801b4cb30c17a4db443da Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 9 Jun 2020 10:46:22 +0200 Subject: [PATCH 427/560] Change binaries version (origin added: otx / frsky / tbs / radiomaster) --- companion/src/helpers.cpp | 1 - companion/src/mainwindow.cpp | 1 - companion/src/storage/firmwareinterface.cpp | 2 -- companion/src/storage/firmwareinterface.h | 2 -- radio/src/CMakeLists.txt | 5 +++++ radio/src/stamp.cpp | 18 ++++++++++-------- 6 files changed, 15 insertions(+), 14 deletions(-) diff --git a/companion/src/helpers.cpp b/companion/src/helpers.cpp index eb594b9b6..63b374062 100644 --- a/companion/src/helpers.cpp +++ b/companion/src/helpers.cpp @@ -565,7 +565,6 @@ QPixmap makePixMap(const QImage & image) return QPixmap::fromImage(result); } - int version2index(const QString & version) { int result = 999; diff --git a/companion/src/mainwindow.cpp b/companion/src/mainwindow.cpp index 2c230000b..4753e0b71 100644 --- a/companion/src/mainwindow.cpp +++ b/companion/src/mainwindow.cpp @@ -360,7 +360,6 @@ void MainWindow::checkForCompanionUpdateFinished(QNetworkReply * reply) return onUpdatesError(tr("Companion update check failed, new version information not found.")); int webVersion = version2index(version); - int ownVersion = version2index(VERSION); if (ownVersion < webVersion) { diff --git a/companion/src/storage/firmwareinterface.cpp b/companion/src/storage/firmwareinterface.cpp index 369af6504..f480ae527 100644 --- a/companion/src/storage/firmwareinterface.cpp +++ b/companion/src/storage/firmwareinterface.cpp @@ -36,7 +36,6 @@ FirmwareInterface::FirmwareInterface(const QString & filename): flash(FSIZE_MAX, 0), flashSize(0), - versionId(0), eepromVersion(0), eepromVariant(0), splashOffset(0), @@ -80,7 +79,6 @@ FirmwareInterface::FirmwareInterface(const QString & filename): eepromVersion = eepromId.toInt(); } - versionId = version2index(version); seekSplash(); isValidFlag = !version.isEmpty(); } diff --git a/companion/src/storage/firmwareinterface.h b/companion/src/storage/firmwareinterface.h index ce9aa994a..2912ec6ff 100644 --- a/companion/src/storage/firmwareinterface.h +++ b/companion/src/storage/firmwareinterface.h @@ -46,7 +46,6 @@ class FirmwareInterface QString getFlavour() const; bool isHardwareCompatible(const FirmwareInterface &previousFirmware) const; inline QString getVersion() { return version; } - unsigned int getVersionId() { return versionId; } inline int getEEpromVersion() { return eepromVersion; } inline int getEEpromVariant() { return eepromVariant; } inline QString getEEpromId() { return eepromId; } @@ -72,7 +71,6 @@ class FirmwareInterface QString time; QString flavour; QString version; - int versionId; QString eepromId; int eepromVersion; int eepromVariant; diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 989457f92..61db95377 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -52,6 +52,7 @@ option(MODULE_PROTOCOL_FCC "Add support for FCC modules" ON) option(MODULE_PROTOCOL_LBT "Add support for EU/LBT modules" ON) option(MODULE_PROTOCOL_FLEX "Add support for non certified FLEX modules" OFF) option(MODULE_PROTOCOL_D8 "Add support for D8 modules" ON) +option(OTX_RELEASE "Used to build OpenTX released firmware" OFF) option(FRSKY_RELEASE "Used to build FrSky released firmware" OFF) option(TBS_RELEASE "Used to build TBS released firmware" OFF) option(ALLOW_TRAINER_MULTI "Allow multi trainer" OFF) @@ -336,6 +337,10 @@ if(MODULE_PROTOCOL_D8) add_definitions(-DMODULE_PROTOCOL_D8) endif() +if(OTX_RELEASE) + add_definitions(-DOTX_RELEASE) +endif() + if(JUMPER_RELEASE) add_definitions(-DJUMPER_RELEASE) endif() diff --git a/radio/src/stamp.cpp b/radio/src/stamp.cpp index f4f8b836a..06b601b69 100644 --- a/radio/src/stamp.cpp +++ b/radio/src/stamp.cpp @@ -33,26 +33,28 @@ #endif #if defined(FRSKY_RELEASE) -#define DISPLAY_VERSION "FrSky" +#define DISPLAY_VERSION "-frsky" #elif defined(JUMPER_RELEASE) -#define DISPLAY_VERSION "JumperRC" +#define DISPLAY_VERSION "-jumper" #elif defined(RADIOMASTER_RELEASE) -#define DISPLAY_VERSION "Radiomaster" +#define DISPLAY_VERSION "-radiomaster" #elif defined(TBS_RELEASE) -#define DISPLAY_VERSION "TBS" +#define DISPLAY_VERSION "-tbs" +#elif defined(OTX_RELEASE) +#define DISPLAY_VERSION "-otx" #else -#define DISPLAY_VERSION VERSION +#define DISPLAY_VERSION #endif #if defined(COLORLCD) - const char vers_stamp[] = "VERS" TAB ": " "opentx-" FLAVOUR "-" DISPLAY_VERSION " (" GIT_STR ")"; + const char vers_stamp[] = "VERS" TAB ": " "opentx-" FLAVOUR "-" VERSION DISPLAY_VERSION " (" GIT_STR ")"; const char date_stamp[] = "DATE" TAB ": " DATE; const char time_stamp[] = "TIME" TAB ": " TIME; const char eeprom_stamp[] = "EEPR" TAB ": " EEPROM_STR; #elif defined(BOARD_NAME) - const char vers_stamp[] = "FW" TAB ": opentx-" BOARD_NAME "\036VERS" TAB ": " DISPLAY_VERSION " (" GIT_STR ")" "\036DATE" TAB ": " DATE " " TIME "\036EEPR" TAB ": " EEPROM_STR; + const char vers_stamp[] = "FW" TAB ": opentx-" BOARD_NAME "\036VERS" TAB ": " VERSION DISPLAY_VERSION " (" GIT_STR ")" "\036DATE" TAB ": " DATE " " TIME "\036EEPR" TAB ": " EEPROM_STR; #else - const char vers_stamp[] = "FW" TAB ": opentx-" FLAVOUR "\036VERS" TAB ": " DISPLAY_VERSION " (" GIT_STR ")" "\036DATE" TAB ": " DATE " " TIME "\036EEPR" TAB ": " EEPROM_STR; + const char vers_stamp[] = "FW" TAB ": opentx-" FLAVOUR "\036VERS" TAB ": " VERSION DISPLAY_VERSION " (" GIT_STR ")" "\036DATE" TAB ": " DATE " " TIME "\036EEPR" TAB ": " EEPROM_STR; #endif /** From 8967b8356d3767b13f8fa856038553f7a590a2f0 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 9 Jun 2020 11:02:10 +0200 Subject: [PATCH 428/560] Remove unneeded extension --- radio/src/CMakeLists.txt | 5 ----- radio/src/stamp.cpp | 2 -- 2 files changed, 7 deletions(-) diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 61db95377..989457f92 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -52,7 +52,6 @@ option(MODULE_PROTOCOL_FCC "Add support for FCC modules" ON) option(MODULE_PROTOCOL_LBT "Add support for EU/LBT modules" ON) option(MODULE_PROTOCOL_FLEX "Add support for non certified FLEX modules" OFF) option(MODULE_PROTOCOL_D8 "Add support for D8 modules" ON) -option(OTX_RELEASE "Used to build OpenTX released firmware" OFF) option(FRSKY_RELEASE "Used to build FrSky released firmware" OFF) option(TBS_RELEASE "Used to build TBS released firmware" OFF) option(ALLOW_TRAINER_MULTI "Allow multi trainer" OFF) @@ -337,10 +336,6 @@ if(MODULE_PROTOCOL_D8) add_definitions(-DMODULE_PROTOCOL_D8) endif() -if(OTX_RELEASE) - add_definitions(-DOTX_RELEASE) -endif() - if(JUMPER_RELEASE) add_definitions(-DJUMPER_RELEASE) endif() diff --git a/radio/src/stamp.cpp b/radio/src/stamp.cpp index 06b601b69..0c90f5c71 100644 --- a/radio/src/stamp.cpp +++ b/radio/src/stamp.cpp @@ -40,8 +40,6 @@ #define DISPLAY_VERSION "-radiomaster" #elif defined(TBS_RELEASE) #define DISPLAY_VERSION "-tbs" -#elif defined(OTX_RELEASE) -#define DISPLAY_VERSION "-otx" #else #define DISPLAY_VERSION #endif From 9f41e81fc99b929c7f70892220119891a3ca20e1 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 9 Jun 2020 11:10:02 +0200 Subject: [PATCH 429/560] Compilation fix when no multimodule on X9D+ --- radio/src/gui/gui_common.h | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 3aeee3128..4fbd63194 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -264,6 +264,7 @@ inline uint8_t MULTIMODULE_HASOPTIONS(uint8_t moduleIdx) #else #define MULTIMODULE_STATUS_ROWS(moduleIdx) #define MULTIMODULE_MODULE_ROWS(moduleIdx) +#define MULTIMODULE_TYPE_ROW(moduleIdx) #define MULTIMODULE_SUBTYPE_ROWS(moduleIdx) #define MULTIMODULE_TYPE_ROWS(moduleIdx) #define MULTIMODULE_MODE_ROWS(moduleIdx) (uint8_t)0 From 2a8c1f914dfeb6200c338063e1197d78dd8907ed Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 10 Jun 2020 12:16:50 +0200 Subject: [PATCH 430/560] FrSky build script updated (new boards added) --- radio/src/opentx.cpp | 2 +- tools/build-frsky.py | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 9e5ced95e..3186e8975 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -765,7 +765,7 @@ void doSplash() } #endif -#if defined(FRSKY_RELEASE) +#if defined(FRSKY_RELEASE) && !defined(COLORLCD) static uint8_t secondSplash = false; if (!secondSplash && get_tmr10ms() >= tgtime-200) { secondSplash = true; diff --git a/tools/build-frsky.py b/tools/build-frsky.py index e4478a2a8..5a5cb26ac 100755 --- a/tools/build-frsky.py +++ b/tools/build-frsky.py @@ -87,6 +87,14 @@ boards = { "CROSSFIRE": "NO", "DEFAULT_MODE": "2", }, + "X9E": { + "PCB": "X9E", + "LUA": "NO_MODEL_SCRIPTS", + "GVARS": "YES", + "MULTIMODULE": "NO", + "CROSSFIRE": "NO", + "DEFAULT_MODE": "2", + }, "X7_FCC": { "PCB": "X7", "LUA": "NO_MODEL_SCRIPTS", @@ -114,7 +122,32 @@ boards = { "MULTIMODULE": "NO", "CROSSFIRE": "NO", "DEFAULT_MODE": "2", - } + }, + "X10S": { + "PCB": "X10", + "LUA": "NO_MODEL_SCRIPTS", + "GVARS": "YES", + "MULTIMODULE": "NO", + "CROSSFIRE": "NO", + "DEFAULT_MODE": "2", + }, + "X10SExpress": { + "PCB": "X10", + "PCBREV": "EXPRESS", + "LUA": "NO_MODEL_SCRIPTS", + "GVARS": "YES", + "MULTIMODULE": "NO", + "CROSSFIRE": "NO", + "DEFAULT_MODE": "2", + }, + "X12S": { + "PCB": "X12S", + "LUA": "NO_MODEL_SCRIPTS", + "GVARS": "YES", + "MULTIMODULE": "NO", + "CROSSFIRE": "NO", + "DEFAULT_MODE": "2", + }, } translations = [ From 4eed0ae7601cd146fded9b789a0a4d3f5e35caf1 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 11 Jun 2020 09:28:18 +0200 Subject: [PATCH 431/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index a7c69bff2..4394e66db 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1739,3 +1739,4 @@ James Thompson Dautremépuis Benoit Adriano Emanuele Figliola Stefano Bortolotti +Gerald Zierer From 054117722497ffba0fb36a5f2a74cf1c63381ca4 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 13 Jun 2020 10:15:03 +0200 Subject: [PATCH 432/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 4394e66db..2df7ffa7a 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1740,3 +1740,4 @@ Dautremépuis Benoit Adriano Emanuele Figliola Stefano Bortolotti Gerald Zierer +Alessio Noto From 5198b9a8a7b632f850e78d2f85d8c6d8925665bc Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 12 Jun 2020 11:22:06 +0200 Subject: [PATCH 433/560] Attempt to fix the progress bar issue on Companion Read Firmware function (DFU mode) --- companion/src/downloaddialog.cpp | 2 +- companion/src/flashfirmwaredialog.cpp | 2 +- companion/src/process_flash.cpp | 17 ++++++++++++++--- companion/src/radiointerface.cpp | 3 +-- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/companion/src/downloaddialog.cpp b/companion/src/downloaddialog.cpp index 3f70e6529..d5c037645 100644 --- a/companion/src/downloaddialog.cpp +++ b/companion/src/downloaddialog.cpp @@ -54,7 +54,7 @@ DownloadDialog::DownloadDialog(QWidget *parent, QString src, QString tgt): reply = qnam.get(QNetworkRequest(QUrl(src))); connect(reply, SIGNAL(finished()), this, SLOT(httpFinished())); connect(reply, SIGNAL(readyRead()), this, SLOT(httpReadyRead())); - connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(updateDataReadProgress(qint64,qint64))); + connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(updateDataReadProgress(qint64, qint64))); } } diff --git a/companion/src/flashfirmwaredialog.cpp b/companion/src/flashfirmwaredialog.cpp index 9a2b688ab..fd6046f92 100644 --- a/companion/src/flashfirmwaredialog.cpp +++ b/companion/src/flashfirmwaredialog.cpp @@ -112,7 +112,7 @@ void FlashFirmwareDialog::updateUI() } QImage image; - switch(imageSource) { + switch (imageSource) { case FIRMWARE: ui->useFirmwareSplash->setChecked(true); image = firmware.getSplash(); diff --git a/companion/src/process_flash.cpp b/companion/src/process_flash.cpp index 599d7e653..22baa83c6 100644 --- a/companion/src/process_flash.cpp +++ b/companion/src/process_flash.cpp @@ -134,15 +134,18 @@ void FlashProcess::onKillTimerElapsed() #endif } -void FlashProcess::analyseStandardOutput(const QString &text) +void FlashProcess::analyseStandardOutput(const QString & text) { + +// qDebug() << text; + currStdoutLine.append(text); if (currStdoutLine.contains("size = ")) { int pos = currStdoutLine.lastIndexOf("size = "); QString temp = currStdoutLine.mid(pos+7); pos = temp.lastIndexOf("\n"); int size = temp.left(pos).toInt(); - progress->setMaximum(size/2048); + progress->setMaximum(size / 2048); } if (currStdoutLine.contains("\n")) { int nlPos = currStdoutLine.lastIndexOf("\n"); @@ -168,7 +171,15 @@ void FlashProcess::analyseStandardOutput(const QString &text) int end = text.indexOf("%"); if (start > 0) { start += 9; - int value = text.mid(start, end-start).toInt(); + int value = text.mid(start, end - start).toInt(); + progress->setValue(value); + } + } + + if (text.contains("Upload\t[")) { + int end = text.indexOf("%"); + if (end > 0) { + int value = text.mid(end - 3, 3).toInt(); progress->setValue(value); } } diff --git a/companion/src/radiointerface.cpp b/companion/src/radiointerface.cpp index c3214958a..fbc03186f 100644 --- a/companion/src/radiointerface.cpp +++ b/companion/src/radiointerface.cpp @@ -253,7 +253,6 @@ void resetAvrdudeFuses(bool eepromProtect, ProgressWidget * progress) } } - bool readFirmware(const QString & filename, ProgressWidget * progress) { bool result = false; @@ -274,7 +273,7 @@ bool readFirmware(const QString & filename, ProgressWidget * progress) } } - if (result == false) { + if (!result) { qDebug() << "readFirmware: reading" << filename << "with" << getRadioInterfaceCmd() << getReadFirmwareArgs(filename); FlashProcess flashProcess(getRadioInterfaceCmd(), getReadFirmwareArgs(filename), progress); result = flashProcess.run(); From 281daa7a671de8a692c3eb09a318bd1999c1bf8b Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 12 Jun 2020 14:47:52 +0200 Subject: [PATCH 434/560] Attempt to fix the progress bar issue on Companion Read Firmware function on Windows, dfu-util 0.7 (DFU mode) --- companion/src/process_flash.cpp | 12 ++++++++---- companion/src/process_flash.h | 4 ++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/companion/src/process_flash.cpp b/companion/src/process_flash.cpp index 22baa83c6..77a77ea4d 100644 --- a/companion/src/process_flash.cpp +++ b/companion/src/process_flash.cpp @@ -136,10 +136,8 @@ void FlashProcess::onKillTimerElapsed() void FlashProcess::analyseStandardOutput(const QString & text) { - -// qDebug() << text; - currStdoutLine.append(text); + if (currStdoutLine.contains("size = ")) { int pos = currStdoutLine.lastIndexOf("size = "); QString temp = currStdoutLine.mid(pos+7); @@ -147,17 +145,23 @@ void FlashProcess::analyseStandardOutput(const QString & text) int size = temp.left(pos).toInt(); progress->setMaximum(size / 2048); } + if (currStdoutLine.contains("\n")) { int nlPos = currStdoutLine.lastIndexOf("\n"); currStdoutLine = currStdoutLine.mid(nlPos+1); } + if (!currStdoutLine.isEmpty()) { if (currStdoutLine.at(0) == QChar('.')) { int pos = currStdoutLine.lastIndexOf("."); progress->setValue(pos); } else if (currStdoutLine.startsWith("Starting upload: [")) { - int pos = (currStdoutLine.lastIndexOf("#")-19)*100/256; + int pos = (currStdoutLine.lastIndexOf("#") - 19) * 100 / 256; + progress->setValue(pos); + } + else if (currStdoutLine.startsWith("[") && progress->getText().contains("bytes_per_hash=2048")) { + int pos = (currStdoutLine.lastIndexOf("#") - 1) * 2048 / (2 * 1024 * 1024); // TODO depends on bin size progress->setValue(pos); } } diff --git a/companion/src/process_flash.h b/companion/src/process_flash.h index c39be2644..530938590 100644 --- a/companion/src/process_flash.h +++ b/companion/src/process_flash.h @@ -53,10 +53,10 @@ protected: void analyseStandardError(const QString &text); void errorWizard(); void addReadFuses(); - ProgressWidget *progress; + ProgressWidget * progress; const QString cmd; const QStringList args; - QProcess *process; + QProcess * process; bool hasErrors; QString currStdoutLine; QString currStderrLine; From e494f043cf3a483f0250f0dc0fda0c9a890aacde Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 12 Jun 2020 17:13:45 +0200 Subject: [PATCH 435/560] Attempt to fix the progress bar issue on Companion Read Firmware function on Windows, dfu-util 0.7 (DFU mode) --- companion/src/process_flash.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/companion/src/process_flash.cpp b/companion/src/process_flash.cpp index 77a77ea4d..50a07e522 100644 --- a/companion/src/process_flash.cpp +++ b/companion/src/process_flash.cpp @@ -161,7 +161,7 @@ void FlashProcess::analyseStandardOutput(const QString & text) progress->setValue(pos); } else if (currStdoutLine.startsWith("[") && progress->getText().contains("bytes_per_hash=2048")) { - int pos = (currStdoutLine.lastIndexOf("#") - 1) * 2048 / (2 * 1024 * 1024); // TODO depends on bin size + int pos = (currStdoutLine.lastIndexOf("#") - 1) * 2048 * 100 / (2 * 1024 * 1024); // TODO depends on bin size progress->setValue(pos); } } From b795a72ef43a046eaeae6f7d1abcf9325ae7951d Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 13 Jun 2020 12:46:38 +0200 Subject: [PATCH 436/560] Cosmetics (bootloader title bar) --- companion/src/process_flash.cpp | 2 +- companion/src/storage/firmwareinterface.cpp | 2 +- radio/src/targets/common/arm/stm32/bootloader/boot.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/companion/src/process_flash.cpp b/companion/src/process_flash.cpp index 50a07e522..ca8c3479e 100644 --- a/companion/src/process_flash.cpp +++ b/companion/src/process_flash.cpp @@ -292,7 +292,7 @@ void FlashProcess::errorWizard() DeviceStr = "Atmega 2561"; } } - if (fwexist==false) { + if (!fwexist) { QMessageBox::warning(nullptr, "Companion - Tip of the day", tr("Your radio uses a %1 CPU!!!\n\nPlease check advanced burn options to set the correct cpu type.").arg(DeviceStr)); } else { diff --git a/companion/src/storage/firmwareinterface.cpp b/companion/src/storage/firmwareinterface.cpp index f480ae527..a07ebbd67 100644 --- a/companion/src/storage/firmwareinterface.cpp +++ b/companion/src/storage/firmwareinterface.cpp @@ -64,7 +64,7 @@ FirmwareInterface::FirmwareInterface(const QString & filename): // old version format int index = version.lastIndexOf('-'); flavour = version.mid(0, index); - version = version.mid(index+1); + version = version.mid(index + 1); } date = seekLabel(DATE_MARK); time = seekLabel(TIME_MARK); diff --git a/radio/src/targets/common/arm/stm32/bootloader/boot.h b/radio/src/targets/common/arm/stm32/bootloader/boot.h index 4f8e7edc7..13e6e3036 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/boot.h +++ b/radio/src/targets/common/arm/stm32/bootloader/boot.h @@ -24,7 +24,7 @@ #include "stamp.h" #if LCD_W < 212 - #define BOOTLOADER_TITLE " OTX Bootloader - " VERSION + #define BOOTLOADER_TITLE " Bootloader - " VERSION #else #define BOOTLOADER_TITLE " OpenTX Bootloader - " VERSION #endif From edf65f0b282a2b64ee5896a711f8971d8b9d1900 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 13 Jun 2020 12:50:44 +0200 Subject: [PATCH 437/560] Version parsing fix --- companion/src/helpers.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/companion/src/helpers.cpp b/companion/src/helpers.cpp index 63b374062..2b0f62503 100644 --- a/companion/src/helpers.cpp +++ b/companion/src/helpers.cpp @@ -580,6 +580,10 @@ int version2index(const QString & version) result = parts[1].toInt(); // nightly build up to 899 mainVersion = parts[0]; } + else if (version.contains("-")) { + parts = version.split("-"); + mainVersion = parts[0]; + } parts = mainVersion.split('.'); if (parts.size() > 2) result += 1000 * parts[2].toInt(); From e9728d263c619357c99e3c234f60e9fb10a5dc7d Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 13 Jun 2020 12:52:27 +0200 Subject: [PATCH 438/560] Revert last non working Progress bar for Windows fix --- companion/src/process_flash.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/companion/src/process_flash.cpp b/companion/src/process_flash.cpp index ca8c3479e..502b3c7ca 100644 --- a/companion/src/process_flash.cpp +++ b/companion/src/process_flash.cpp @@ -160,10 +160,6 @@ void FlashProcess::analyseStandardOutput(const QString & text) int pos = (currStdoutLine.lastIndexOf("#") - 19) * 100 / 256; progress->setValue(pos); } - else if (currStdoutLine.startsWith("[") && progress->getText().contains("bytes_per_hash=2048")) { - int pos = (currStdoutLine.lastIndexOf("#") - 1) * 2048 * 100 / (2 * 1024 * 1024); // TODO depends on bin size - progress->setValue(pos); - } } if (text.contains("Complete ")) { From 18461a3b28105ccd730699ab59decf92f762cda2 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 13 Jun 2020 14:26:25 +0200 Subject: [PATCH 439/560] Progressbar for "Download firmware" --- companion/src/process_flash.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/companion/src/process_flash.cpp b/companion/src/process_flash.cpp index 502b3c7ca..ee01e29d0 100644 --- a/companion/src/process_flash.cpp +++ b/companion/src/process_flash.cpp @@ -176,7 +176,7 @@ void FlashProcess::analyseStandardOutput(const QString & text) } } - if (text.contains("Upload\t[")) { + if (text.contains("Upload\t[") || text.contains("Download\t[")) { int end = text.indexOf("%"); if (end > 0) { int value = text.mid(end - 3, 3).toInt(); From 24cd7611cf62c39e1f9e6a61b49ecd5d827962ba Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 13 Jun 2020 14:59:13 +0200 Subject: [PATCH 440/560] Bootloader cosmetics --- radio/src/gui/128x64/lcd.cpp | 20 ++++++---- radio/src/gui/128x64/lcd.h | 4 +- radio/src/gui/212x64/lcd.cpp | 18 +++++---- radio/src/opentx.h | 2 +- radio/src/stamp.cpp | 28 ++++++-------- .../common/arm/stm32/bootloader/bin_files.cpp | 6 +-- .../common/arm/stm32/bootloader/boot.h | 4 +- .../common/arm/stm32/usbd_storage_msd.cpp | 10 ++--- .../targets/horus/bootloader/boot_menu.cpp | 2 +- .../targets/taranis/bootloader/boot_menu.cpp | 37 +++++++++---------- 10 files changed, 64 insertions(+), 67 deletions(-) diff --git a/radio/src/gui/128x64/lcd.cpp b/radio/src/gui/128x64/lcd.cpp index f3adae2ca..9118fef5d 100644 --- a/radio/src/gui/128x64/lcd.cpp +++ b/radio/src/gui/128x64/lcd.cpp @@ -116,7 +116,6 @@ void lcdPutPattern(coord_t x, coord_t y, const uint8_t * pattern, uint8_t width, } } -#if !defined(BOOT) struct PatternData { uint8_t width; @@ -143,10 +142,11 @@ uint8_t getPatternWidth(const PatternData * pattern) void getCharPattern(PatternData * pattern, unsigned char c, LcdFlags flags) { +#if !defined(BOOT) uint32_t fontsize = FONTSIZE(flags); unsigned char c_remapped = 0; - if (fontsize == DBLSIZE || (flags&BOLD)) { + if (fontsize == DBLSIZE || (flags & BOLD)) { // To save space only some DBLSIZE and BOLD chars are available // c has to be remapped. All non existing chars mapped to 0 (space) if (c>=',' && c<=':') @@ -203,6 +203,11 @@ void getCharPattern(PatternData * pattern, unsigned char c, LcdFlags flags) pattern->height = 7; pattern->data = (c < 0xC0) ? &font_5x7[(c-0x20)*5] : &font_5x7_extra[(c-0xC0)*5]; } +#else + pattern->width = 5; + pattern->height = 7; + pattern->data = &font_5x7[(c-0x20)*5]; +#endif } uint8_t getCharWidth(char c, LcdFlags flags) @@ -211,7 +216,6 @@ uint8_t getCharWidth(char c, LcdFlags flags) getCharPattern(&pattern, c, flags); return getPatternWidth(&pattern); } -#endif void lcdDrawChar(coord_t x, coord_t y, const unsigned char c, LcdFlags flags) { @@ -288,12 +292,15 @@ void lcdDrawChar(coord_t x, coord_t y, const unsigned char c) lcdDrawChar(x, y, c, 0); } -#if !defined(BOOT) uint8_t getTextWidth(const char * s, uint8_t len, LcdFlags flags) { uint8_t width = 0; - for (int i=0; len==0 || iheight = 7; pattern->data = (c < 0xC0) ? &font_5x7[(c-0x20)*5] : &font_5x7_extra[(c-0xC0)*5]; } +#else + pattern->width = 5; + pattern->height = 7; + pattern->data = &font_5x7[(c-0x20) * 5]; +#endif } uint8_t getCharWidth(char c, LcdFlags flags) @@ -220,7 +225,6 @@ uint8_t getCharWidth(char c, LcdFlags flags) getCharPattern(&pattern, c, flags); return getPatternWidth(&pattern); } -#endif void lcdDrawChar(coord_t x, coord_t y, const unsigned char c, LcdFlags flags) { @@ -240,12 +244,15 @@ void lcdDrawChar(coord_t x, coord_t y, const unsigned char c) lcdDrawChar(x, y, c, 0); } -#if !defined(BOOT) uint8_t getTextWidth(const char * s, uint8_t len, LcdFlags flags) { uint8_t width = 0; - for (int i=0; len==0 || iflavour, "unknown", sizeof("unknown")); - tag->version = "unknown"; + memcpy(tag->flavour, "unknown", sizeof("unknown")); + tag->version = "unknown"; } // skip "opentx-" diff --git a/radio/src/targets/common/arm/stm32/bootloader/boot.h b/radio/src/targets/common/arm/stm32/bootloader/boot.h index 13e6e3036..c9e36269b 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/boot.h +++ b/radio/src/targets/common/arm/stm32/bootloader/boot.h @@ -34,12 +34,12 @@ #if LCD_W >= 480 #define STR_INVALID_FIRMWARE "Not a valid firmware file" #elif LCD_W >= 212 - #define STR_OR_PLUGIN_USB_CABLE INDENT "Or plug in a USB cable for mass storage" + #define STR_OR_PLUGIN_USB_CABLE "Or plug in a USB cable for mass storage" #define STR_HOLD_ENTER_TO_START "\012Hold [ENT] to start writing" #define STR_INVALID_FIRMWARE "\011Not a valid firmware file! " #define STR_INVALID_EEPROM "\011Not a valid EEPROM file! " #else - #define STR_OR_PLUGIN_USB_CABLE INDENT "Or plug in a USB cable" + #define STR_OR_PLUGIN_USB_CABLE "Or plug in a USB cable" #define STR_HOLD_ENTER_TO_START "\006Hold [ENT] to start" #define STR_INVALID_FIRMWARE "\004Not a valid firmware! " #define STR_INVALID_EEPROM "\004Not a valid EEPROM! " diff --git a/radio/src/targets/common/arm/stm32/usbd_storage_msd.cpp b/radio/src/targets/common/arm/stm32/usbd_storage_msd.cpp index b60e5da8f..1fbfb970a 100644 --- a/radio/src/targets/common/arm/stm32/usbd_storage_msd.cpp +++ b/radio/src/targets/common/arm/stm32/usbd_storage_msd.cpp @@ -408,7 +408,7 @@ const FATDirEntry_t g_DIRroot[] = 0xA302, 0x3D55, 0x0002, - sizeof(firmware_txt) + strlen(getOtherVersion(nullptr)) + sizeof(firmware_txt) + strlen(getFirmwareVersion()) }, { { 'F', 'I', 'R', 'M', 'W', 'A', 'R', 'E'}, @@ -512,13 +512,11 @@ int32_t fat12Read(uint8_t * buffer, uint16_t sector, uint16_t count) else if (sector == 3) { memcpy(buffer, g_DIRroot, sizeof(g_DIRroot) ) ; } - else if (sector == 4) - { + else if (sector == 4) { memcpy(buffer, firmware_txt, sizeof(firmware_txt)); - memcpy(buffer + sizeof(firmware_txt), getOtherVersion(nullptr), strlen(getOtherVersion(nullptr))); + strcpy((char *)(buffer + sizeof(firmware_txt)), getFirmwareVersion()); } - else if (sector < RESERVED_SECTORS) - { + else if (sector < RESERVED_SECTORS) { // allocated to firmware.txt } else if (sector < RESERVED_SECTORS + (FLASHSIZE/BLOCK_SIZE )) { diff --git a/radio/src/targets/horus/bootloader/boot_menu.cpp b/radio/src/targets/horus/bootloader/boot_menu.cpp index d64f2c7f8..025b0d7ef 100644 --- a/radio/src/targets/horus/bootloader/boot_menu.cpp +++ b/radio/src/targets/horus/bootloader/boot_menu.cpp @@ -84,7 +84,7 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char* str) bootloaderDrawFooter(); lcdDrawText( 36, 242, "Current Firmware:"); - lcdDrawText(200, 242, getOtherVersion(nullptr)); + lcdDrawText(200, 242, getFirmwareVersion()); } else if (st == ST_USB) { diff --git a/radio/src/targets/taranis/bootloader/boot_menu.cpp b/radio/src/targets/taranis/bootloader/boot_menu.cpp index 4a2eb1497..d6f6a86ac 100644 --- a/radio/src/targets/taranis/bootloader/boot_menu.cpp +++ b/radio/src/targets/taranis/bootloader/boot_menu.cpp @@ -21,28 +21,25 @@ void bootloaderDrawFilename(const char *str, uint8_t line, bool selected) void bootloaderDrawScreen(BootloaderState st, int opt, const char *str) { lcdClear(); - lcdDrawText(0, 0, BOOTLOADER_TITLE, INVERS); + lcdDrawText(LCD_W / 2, 0, BOOTLOADER_TITLE, CENTERED); + lcdInvertLine(0); if (st == ST_START) { lcdDrawTextAlignedLeft(2*FH, "\010Write Firmware"); lcdDrawTextAlignedLeft(3*FH, "\010Restore EEPROM"); lcdDrawTextAlignedLeft(4*FH, "\010Exit"); - -#if LCD_W >= 212 - lcdDrawTextAlignedLeft(6*FH, "\001Curr FW:"); - lcdDrawText(50, 6*FH, getOtherVersion(nullptr)); -#else - lcdDrawTextAlignedLeft(6 * FH, "\001FW:"); - - // Remove opentx- from string - const char *other_ver = getOtherVersion(nullptr); - if (strstr(other_ver, "opentx-")) - other_ver = other_ver + 7; - lcdDrawText(20, 6 * FH, other_ver); -#endif - lcdInvertLine(2 + opt); - lcdDrawTextAlignedLeft(7 * FH, STR_OR_PLUGIN_USB_CABLE); + + lcdDrawText(LCD_W / 2, 5 * FH + FH / 2, STR_OR_PLUGIN_USB_CABLE, CENTERED); + + // Remove "opentx-" from string + const char * vers = getFirmwareVersion(); +#if LCD_W < 212 + if (strncmp(vers, "opentx-", 7) == 0) + vers += 7; +#endif + lcdDrawText(LCD_W / 2, 7 * FH, vers, CENTERED); + lcdInvertLine(7); } else if (st == ST_USB) { lcdDrawTextAlignedLeft(4 * FH, STR_USB_CONNECTED); @@ -65,11 +62,11 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char *str) } else if (opt == FC_OK) { if (memoryType == MEM_FLASH) { - const char * vers = getOtherVersion((char *) Block_buffer); + const char * vers = getFirmwareVersion((const char *)Block_buffer); #if LCD_W < 212 - // Remove opentx- from string - if (strstr(vers, "opentx-")) - vers = vers + 7; + // Remove "opentx-" from string + if (strncmp(vers, "opentx-", 7) == 0) + vers += 7; #endif bootloaderDrawMsg(INDENT_WIDTH, vers, 0, false); } From 977846d7091dd434d2e3d6449a0250fb1037b07f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 13 Jun 2020 15:06:58 +0200 Subject: [PATCH 441/560] Bootloader cosmetics on Horus now --- .../targets/horus/bootloader/boot_menu.cpp | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/radio/src/targets/horus/bootloader/boot_menu.cpp b/radio/src/targets/horus/bootloader/boot_menu.cpp index 025b0d7ef..911d98b43 100644 --- a/radio/src/targets/horus/bootloader/boot_menu.cpp +++ b/radio/src/targets/horus/bootloader/boot_menu.cpp @@ -67,24 +67,22 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char* str) lcdDrawSolidFilledRect(0, 0, LCD_W, LCD_H, TEXT_BGCOLOR); if (st == ST_START) { + bootloaderDrawTitle(88, BOOTLOADER_TITLE); - bootloaderDrawTitle(88, BOOTLOADER_TITLE); - - lcdDrawBitmapPattern(90, 72, LBM_FLASH, TEXT_COLOR); - lcdDrawText(124, 75, "Write Firmware"); + lcdDrawBitmapPattern(90, 72, LBM_FLASH, TEXT_COLOR); + lcdDrawText(124, 75, "Write Firmware"); - lcdDrawBitmapPattern(90, 107, LBM_EXIT, TEXT_COLOR); - lcdDrawText(124, 110, "Exit"); + lcdDrawBitmapPattern(90, 107, LBM_EXIT, TEXT_COLOR); + lcdDrawText(124, 110, "Exit"); - lcdDrawSolidRect(119, (opt == 0) ? 72 : 107, 270, 26, 2, LINE_COLOR); - - lcd->drawBitmap(60, 166, &BMP_PLUG_USB); - lcdDrawText(195, 175, "Or plug in a USB cable"); - lcdDrawText(195, 200, "for mass storage"); + lcdDrawSolidRect(119, (opt == 0) ? 72 : 107, 270, 26, 2, LINE_COLOR); - bootloaderDrawFooter(); - lcdDrawText( 36, 242, "Current Firmware:"); - lcdDrawText(200, 242, getFirmwareVersion()); + lcd->drawBitmap(60, 166, &BMP_PLUG_USB); + lcdDrawText(195, 175, "Or plug in a USB cable"); + lcdDrawText(195, 200, "for mass storage"); + + bootloaderDrawFooter(); + lcdDrawText(LCD_W / 2, 242, getFirmwareVersion(), CENTERED); } else if (st == ST_USB) { From 51ab3b1939bd82ff3f1f03cfa255481eaccf2625 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 13 Jun 2020 15:14:44 +0200 Subject: [PATCH 442/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 2df7ffa7a..0fd19015e 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1741,3 +1741,4 @@ Adriano Emanuele Figliola Stefano Bortolotti Gerald Zierer Alessio Noto +Walter Fowler From 17db3dff101380ad8b210b254984683845fa675f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 13 Jun 2020 15:19:34 +0200 Subject: [PATCH 443/560] Bootloader cosmetics again --- radio/src/targets/taranis/bootloader/boot_menu.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/radio/src/targets/taranis/bootloader/boot_menu.cpp b/radio/src/targets/taranis/bootloader/boot_menu.cpp index d6f6a86ac..b1d1a9a50 100644 --- a/radio/src/targets/taranis/bootloader/boot_menu.cpp +++ b/radio/src/targets/taranis/bootloader/boot_menu.cpp @@ -25,10 +25,9 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char *str) lcdInvertLine(0); if (st == ST_START) { - lcdDrawTextAlignedLeft(2*FH, "\010Write Firmware"); - lcdDrawTextAlignedLeft(3*FH, "\010Restore EEPROM"); - lcdDrawTextAlignedLeft(4*FH, "\010Exit"); - lcdInvertLine(2 + opt); + lcdDrawText(3*FW, 2*FH, "Write Firmware", opt == 0 ? INVERS : 0); + lcdDrawText(3*FW, 3*FH, "Restore EEPROM", opt == 1 ? INVERS : 0); + lcdDrawText(3*FW, 4*FH, "Exit", opt == 2 ? INVERS : 0); lcdDrawText(LCD_W / 2, 5 * FH + FH / 2, STR_OR_PLUGIN_USB_CABLE, CENTERED); From 89efdadba7fc88802b862a7c26669ed00ccc77fb Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 14 Jun 2020 18:16:31 +0200 Subject: [PATCH 444/560] Update CREDITS.txt --- CREDITS.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index 0fd19015e..52ec9a9a8 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1742,3 +1742,8 @@ Stefano Bortolotti Gerald Zierer Alessio Noto Walter Fowler +Robert Black +Klaus Kernstock +Michael Wittich +AG-Software +Dietmar Drees From 23aaafbfa27fd306e2491702cf03b632d8ea89af Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 14 Jun 2020 18:41:37 +0200 Subject: [PATCH 445/560] Fixes #7731 --- companion/src/downloaddialog.cpp | 2 +- companion/src/flashfirmwaredialog.cpp | 3 +-- companion/src/storage/firmwareinterface.h | 2 +- radio/src/stamp.cpp | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/companion/src/downloaddialog.cpp b/companion/src/downloaddialog.cpp index d5c037645..5b9b2dfa0 100644 --- a/companion/src/downloaddialog.cpp +++ b/companion/src/downloaddialog.cpp @@ -114,7 +114,7 @@ void DownloadDialog::updateDataReadProgress(qint64 bytesRead, qint64 totalBytes) void DownloadDialog::fileError() { delete file; - file = NULL; + file = nullptr; reject(); } diff --git a/companion/src/flashfirmwaredialog.cpp b/companion/src/flashfirmwaredialog.cpp index fd6046f92..4650cd4c0 100644 --- a/companion/src/flashfirmwaredialog.cpp +++ b/companion/src/flashfirmwaredialog.cpp @@ -21,7 +21,6 @@ #include "flashfirmwaredialog.h" #include "ui_flashfirmwaredialog.h" #include "appdata.h" -#include "process_flash.h" #include "helpers.h" #include "progressdialog.h" #include "radiointerface.h" @@ -202,7 +201,7 @@ void FlashFirmwareDialog::on_useExternalSplash_clicked() void FlashFirmwareDialog::on_useLibrarySplash_clicked() { QString fileName; - SplashLibraryDialog *ld = new SplashLibraryDialog(this, &fileName); + auto ld = new SplashLibraryDialog(this, &fileName); ld->exec(); if (!fileName.isEmpty()) { QImage image(fileName); diff --git a/companion/src/storage/firmwareinterface.h b/companion/src/storage/firmwareinterface.h index 2912ec6ff..d6dee286b 100644 --- a/companion/src/storage/firmwareinterface.h +++ b/companion/src/storage/firmwareinterface.h @@ -39,7 +39,7 @@ class FirmwareInterface { public: - FirmwareInterface(const QString &filename); + FirmwareInterface(const QString & filename); inline QString getDate() { return date; } inline QString getTime() { return time; } int getSize() { return flashSize; } diff --git a/radio/src/stamp.cpp b/radio/src/stamp.cpp index 31deb5486..e8b67bdff 100644 --- a/radio/src/stamp.cpp +++ b/radio/src/stamp.cpp @@ -45,7 +45,7 @@ #endif #if defined(COLORLCD) - const char vers_stamp[] = "VERS" TAB ": " "opentx-" FLAVOUR "-" VERSION DISPLAY_VERSION " (" GIT_STR ")"; + const char vers_stamp[] = "VERS" TAB ": " VERSION DISPLAY_VERSION " (" GIT_STR ")"; const char date_stamp[] = "DATE" TAB ": " DATE; const char time_stamp[] = "TIME" TAB ": " TIME; const char eeprom_stamp[] = "EEPR" TAB ": " EEPROM_STR; From d4e11966cd21b4a5c142ab1e7dc7fb1e281d9468 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 14 Jun 2020 18:42:22 +0200 Subject: [PATCH 446/560] Bump to 2.3.9 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e0e9d6bad..23596aff6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ project(OpenTX) set(VERSION_MAJOR "2") set(VERSION_MINOR "3") -set(VERSION_REVISION "8") +set(VERSION_REVISION "9") set(VERSION_SUFFIX $ENV{OPENTX_VERSION_SUFFIX}) set(VERSION_FAMILY ${VERSION_MAJOR}.${VERSION_MINOR}) set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}${VERSION_SUFFIX}) From 60e1edc15936aeda3be2294fc981261357c1849a Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 14 Jun 2020 18:46:28 +0200 Subject: [PATCH 447/560] Fixes #7734 --- radio/src/mixer.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/radio/src/mixer.cpp b/radio/src/mixer.cpp index 373981044..3f373ae6e 100644 --- a/radio/src/mixer.cpp +++ b/radio/src/mixer.cpp @@ -947,7 +947,7 @@ void evalMixes(uint8_t tick10ms) mixerCurrentFlightMode = p; evalFlightModeMixes(p==fm ? e_perout_mode_normal : e_perout_mode_inactive_flight_mode, p==fm ? tick10ms : 0); for (uint8_t i=0; i> (17 - __builtin_clz(abs(chans[i])))) * fp_act[p]; + sum_chans512[i] += (chans[i] >> 4) * fp_act[p]; weight += fp_act[p]; } } @@ -978,7 +978,7 @@ void evalMixes(uint8_t tick10ms) // at the end chans[i] = chans[i]/256 => -1024..1024 // interpolate value with min/max so we get smooth motion from center to stop // this limits based on v original values and min=-1024, max=1024 RESX=1024 - int32_t q = (flightModesFade ? (sum_chans512[i] / weight) << (17 - __builtin_clz(abs(chans[i]))) : chans[i]); + int32_t q = (flightModesFade ? (sum_chans512[i] / weight) << 4 : chans[i]); ex_chans[i] = q / 256; @@ -1011,5 +1011,4 @@ void evalMixes(uint8_t tick10ms) } } } - } From 72ebe902f4d940f8bcea2071e9fb50a5937486b7 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 14 Jun 2020 19:45:08 +0200 Subject: [PATCH 448/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 52ec9a9a8..d7a0557ef 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1747,3 +1747,4 @@ Klaus Kernstock Michael Wittich AG-Software Dietmar Drees +Winfried Goers From 5b126480d241b596248b4ef3ccb6a9c953479535 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 14 Jun 2020 19:53:22 +0200 Subject: [PATCH 449/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index d7a0557ef..35748e899 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1748,3 +1748,4 @@ Michael Wittich AG-Software Dietmar Drees Winfried Goers +Steve Schoonover From ab8913052c4c89278cd88dea803f14581182768e Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 15 Jun 2020 11:11:57 +0200 Subject: [PATCH 450/560] Colorlcd popup improve (#7740) Popups improvement --- radio/src/gui/128x64/model_setup.cpp | 2 +- radio/src/gui/212x64/model_setup.cpp | 2 +- radio/src/gui/480x272/menus.h | 5 +++++ radio/src/gui/480x272/model_setup.cpp | 2 +- radio/src/gui/480x272/popups.cpp | 3 +-- radio/src/gui/480x272/radio_sdmanager.cpp | 2 +- radio/src/gui/common/stdlcd/model_setup_pxx1.cpp | 1 + radio/src/gui/common/stdlcd/model_setup_pxx2.cpp | 2 +- radio/src/gui/common/stdlcd/popups.h | 5 +++++ radio/src/gui/common/stdlcd/radio_sdmanager.cpp | 2 +- radio/src/main.cpp | 1 + radio/src/translations.cpp | 1 + radio/src/translations.h | 1 + radio/src/translations/cz.h.txt | 3 ++- radio/src/translations/de.h.txt | 5 +++-- radio/src/translations/en.h.txt | 5 +++-- radio/src/translations/es.h.txt | 3 ++- radio/src/translations/fi.h.txt | 5 +++-- radio/src/translations/fr.h.txt | 3 ++- radio/src/translations/it.h.txt | 1 + radio/src/translations/nl.h.txt | 5 +++-- radio/src/translations/pl.h.txt | 5 +++-- radio/src/translations/pt.h.txt | 5 +++-- radio/src/translations/se.h.txt | 5 +++-- 24 files changed, 49 insertions(+), 25 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index d5e9d1004..be8c15092 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1104,7 +1104,7 @@ void menuModelSetup(event_t event) for (uint8_t i=0; i 0 ? (index < popupMenuItemsCount ? index : popupMenuItemsCount - 1) : 0); } +inline void POPUP_MENU_TITLE(const char * s) +{ + popupMenuTitle = s; +} + inline void POPUP_MENU_START(PopupMenuHandler handler) { if (handler != popupMenuHandler) { diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index 5f9d680cf..f2f207654 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -1455,7 +1455,7 @@ bool menuModelSetup(event_t event) for (auto rx = 0; rx < popupMenuItemsCount; rx++) { popupMenuItems[rx] = reusableBuffer.moduleSetup.bindInformation.candidateReceiversNames[rx]; } - popupMenuTitle = STR_PXX2_SELECT_RX; + POPUP_MENU_TITLE(STR_PXX2_SELECT_RX); POPUP_MENU_START(onPXX2BindMenu); } } diff --git a/radio/src/gui/480x272/popups.cpp b/radio/src/gui/480x272/popups.cpp index 672922d33..d95eea7cd 100644 --- a/radio/src/gui/480x272/popups.cpp +++ b/radio/src/gui/480x272/popups.cpp @@ -178,8 +178,7 @@ const char * runPopupMenu(event_t event) for (uint8_t i=0; i 0 ? (index < popupMenuItemsCount ? index : popupMenuItemsCount) : 0); } +inline void POPUP_MENU_TITLE(const char * s) +{ + popupMenuTitle = s; +} + inline void POPUP_MENU_START(PopupMenuHandler handler) { if (handler != popupMenuHandler) { diff --git a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp index e719951b3..ffb4ff0bd 100644 --- a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp +++ b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp @@ -580,7 +580,7 @@ void menuRadioSdManager(event_t _event) for (auto rx = 0; rx < popupMenuItemsCount; rx++) { popupMenuItems[rx] = reusableBuffer.sdManager.otaUpdateInformation.candidateReceiversNames[rx]; } - popupMenuTitle = STR_PXX2_SELECT_RX; + POPUP_MENU_TITLE(STR_PXX2_SELECT_RX); POPUP_MENU_START(onUpdateReceiverSelection); } } diff --git a/radio/src/main.cpp b/radio/src/main.cpp index 6c2520e72..1490fb989 100644 --- a/radio/src/main.cpp +++ b/radio/src/main.cpp @@ -50,6 +50,7 @@ void handleUsbConnection() #if defined(DEBUG) POPUP_MENU_ADD_ITEM(STR_USB_SERIAL); #endif + POPUP_MENU_TITLE(STR_SELECT_MODE); POPUP_MENU_START(onUSBConnectMenu); } else { diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 39a5bc556..906bf56c7 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -288,6 +288,7 @@ const char STR_BEEP_VOLUME[] = INDENT TR_BEEP_VOLUME; const char STR_WAV_VOLUME[] = INDENT TR_WAV_VOLUME; const char STR_BG_VOLUME[] = INDENT TR_BG_VOLUME; const char STR_SELECT_MODEL[] = TR_SELECT_MODEL; +const char STR_SELECT_MODE[] = TR_SELECT_MODE; const char STR_CREATE_CATEGORY[] = TR_CREATE_CATEGORY; const char STR_RENAME_CATEGORY[] = TR_RENAME_CATEGORY; const char STR_DELETE_CATEGORY[] = TR_DELETE_CATEGORY; diff --git a/radio/src/translations.h b/radio/src/translations.h index 3e7536295..c10c7ffde 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -465,6 +465,7 @@ extern const char STR_BEEP_VOLUME[]; extern const char STR_WAV_VOLUME[]; extern const char STR_BG_VOLUME[]; extern const char STR_SELECT_MODEL[]; +extern const char STR_SELECT_MODE[]; extern const char STR_CREATE_CATEGORY[]; extern const char STR_RENAME_CATEGORY[]; extern const char STR_DELETE_CATEGORY[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 115f2ab17..2086ff7a8 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -679,6 +679,7 @@ #define TR_VOLTAGE INDENT"Napětí" #define TR_CURRENT INDENT"Proud" #define TR_SELECT_MODEL "Vyber model" +#define TR_SELECT_MODE "Select mode" #define TR_CREATE_CATEGORY "Nová kategorie" #define TR_RENAME_CATEGORY "Přejmenovat kategorii" #define TR_DELETE_CATEGORY "Odstranit kategorii" @@ -901,7 +902,7 @@ #define TR_POWERMETER_ATTN_NEEDED "Útlumový člen nutný!" #define TR_PXX2_SELECT_RX "Vyber RX..." #define TR_PXX2_DEFAULT "" -#define TR_BT_SELECT_DEVICE "Vyberte zařízení..." +#define TR_BT_SELECT_DEVICE "Vyberte zařízení" #define TR_DISCOVER "Hledat" #define TR_BUTTON_INIT BUTTON("Init") #define TR_WAITING "Čekám..." diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 842050723..fc900bcdf 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -681,6 +681,7 @@ #define TR_VOLTAGE TR(INDENT "Spg", INDENT "Spannungsquelle") //9XR-Pro #define TR_CURRENT TR(INDENT "Strom", INDENT "Stromquelle") #define TR_SELECT_MODEL "Modell auswählen" +#define TR_SELECT_MODE "Select mode" #define TR_CREATE_CATEGORY "Modelltyp erstellen" #define TR_RENAME_CATEGORY "Modelltyp umbenennen" #define TR_DELETE_CATEGORY "Modelltyp löschen" @@ -901,9 +902,9 @@ #define TR_BYTES "Bytes" #define TR_MODULE_BIND BUTTON(TR("Bnd","Bind")) //9XR-Pro #define TR_POWERMETER_ATTN_NEEDED "Attenuator needed" -#define TR_PXX2_SELECT_RX "Select RX..." +#define TR_PXX2_SELECT_RX "Select RX" #define TR_PXX2_DEFAULT "" -#define TR_BT_SELECT_DEVICE "Select device..." +#define TR_BT_SELECT_DEVICE "Select device" #define TR_DISCOVER "Discover" #define TR_BUTTON_INIT BUTTON("Init") #define TR_WAITING "Waiting..." diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index c17be6890..8bde18bf1 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -680,6 +680,7 @@ #define TR_VOLTAGE TR(INDENT "Voltage", INDENT "Voltage source") #define TR_CURRENT TR(INDENT "Current", INDENT "Current source") #define TR_SELECT_MODEL "Select model" +#define TR_SELECT_MODE "Select mode" #define TR_CREATE_CATEGORY "Create category" #define TR_RENAME_CATEGORY "Rename category" #define TR_DELETE_CATEGORY "Delete category" @@ -900,9 +901,9 @@ #define TR_BYTES "bytes" #define TR_MODULE_BIND BUTTON(TR("Bnd", "Bind")) #define TR_POWERMETER_ATTN_NEEDED "Attenuator needed" -#define TR_PXX2_SELECT_RX "Select RX..." +#define TR_PXX2_SELECT_RX "Select RX" #define TR_PXX2_DEFAULT "" -#define TR_BT_SELECT_DEVICE "Select device..." +#define TR_BT_SELECT_DEVICE "Select device" #define TR_DISCOVER "Discover" #define TR_BUTTON_INIT BUTTON("Init") #define TR_WAITING "Waiting..." diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 699a47368..fcfade7a1 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -682,6 +682,7 @@ #define TR_VOLTAGE INDENT"Voltaje" #define TR_CURRENT INDENT"Actual" #define TR_SELECT_MODEL TR("Selec. modelo", "Seleccionar modelo") +#define TR_SELECT_MODE "Select mode" #define TR_CREATE_CATEGORY "Crear categoría" #define TR_RENAME_CATEGORY "Renombrar categoría" #define TR_DELETE_CATEGORY "Borrar categoría" @@ -904,7 +905,7 @@ #define TR_POWERMETER_ATTN_NEEDED "Necesita atenuador" #define TR_PXX2_SELECT_RX "Selecciona RX..." #define TR_PXX2_DEFAULT "" -#define TR_BT_SELECT_DEVICE "Selecciona dispositivo..." +#define TR_BT_SELECT_DEVICE "Selecciona dispositivo" #define TR_DISCOVER "Buscar" #define TR_BUTTON_INIT BUTTON("Init") #define TR_WAITING "Espera..." diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 1396855a9..22b2ac966 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -698,6 +698,7 @@ #define TR_VOLTAGE INDENT"Voltage" #define TR_CURRENT INDENT"Current" #define TR_SELECT_MODEL "Select Model" +#define TR_SELECT_MODE "Select mode" #define TR_CREATE_CATEGORY "Create Category" #define TR_RENAME_CATEGORY "Rename Category" #define TR_DELETE_CATEGORY "Delete Category" @@ -918,9 +919,9 @@ #define TR_BYTES "bytes" #define TR_MODULE_BIND "[Bind]" #define TR_POWERMETER_ATTN_NEEDED "Attenuator needed" -#define TR_PXX2_SELECT_RX "Select RX..." +#define TR_PXX2_SELECT_RX "Select RX" #define TR_PXX2_DEFAULT "" -#define TR_BT_SELECT_DEVICE "Select device..." +#define TR_BT_SELECT_DEVICE "Select device" #define TR_DISCOVER "Discover" #define TR_BUTTON_INIT BUTTON("Init") #define TR_WAITING "Waiting..." diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index bfd07bd25..5ef45e312 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -701,6 +701,7 @@ #define TR_VOLTAGE TR(INDENT "Tension",INDENT "Source tension") #define TR_CURRENT TR(INDENT "Courant",INDENT "Source courant") #define TR_SELECT_MODEL "Sélect. modèle" +#define TR_SELECT_MODE "Select mode" #define TR_CREATE_CATEGORY "Créer une catégorie" #define TR_RENAME_CATEGORY "Renommer la catégorie" #define TR_DELETE_CATEGORY "Supprimer la catégorie" @@ -922,7 +923,7 @@ #define TR_POWERMETER_ATTN_NEEDED "Atténuateur requis" #define TR_PXX2_SELECT_RX "Sélect RX..." #define TR_PXX2_DEFAULT "" -#define TR_BT_SELECT_DEVICE "Sélect appareil..." +#define TR_BT_SELECT_DEVICE "Sélect appareil" #define TR_DISCOVER "Découvrir" #define TR_BUTTON_INIT BUTTON("Init") #define TR_WAITING "Attente..." diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index b9a9cf639..22416cdd2 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -700,6 +700,7 @@ #define TR_VOLTAGE TR(INDENT "Voltagg.",INDENT "Voltaggio") #define TR_CURRENT TR(INDENT "Corrente",INDENT "Corrente") #define TR_SELECT_MODEL TR("Scegli mod.", "Scegli Modello") +#define TR_SELECT_MODE "Select mode" #define TR_CREATE_CATEGORY "Crea Categoria" #define TR_RENAME_CATEGORY "Rinomina Categoria" #define TR_DELETE_CATEGORY "Cancella Categoria" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index c50884c73..a3c642135 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -686,6 +686,7 @@ #define TR_VOLTAGE TR(INDENT "Spg", INDENT "Spanningsbron") //9XR-Pro #define TR_CURRENT TR(INDENT "Stroom", INDENT "Stroombron") #define TR_SELECT_MODEL "Kies Model" +#define TR_SELECT_MODE "Select mode" #define TR_CREATE_CATEGORY "Create Category" #define TR_RENAME_CATEGORY "Rename Category" #define TR_DELETE_CATEGORY "Delete Category" @@ -906,9 +907,9 @@ #define TR_BYTES "bytes" #define TR_MODULE_BIND TR("[Bnd]", "[Bind]") #define TR_POWERMETER_ATTN_NEEDED "Attenuator needed" -#define TR_PXX2_SELECT_RX "Select RX..." +#define TR_PXX2_SELECT_RX "Select RX" #define TR_PXX2_DEFAULT "" -#define TR_BT_SELECT_DEVICE "Select device..." +#define TR_BT_SELECT_DEVICE "Select device" #define TR_DISCOVER "Discover" #define TR_BUTTON_INIT BUTTON("Init") #define TR_WAITING "Waiting..." diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 2e1389e2c..e64b4edff 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -699,6 +699,7 @@ #define TR_VOLTAGE TR (INDENT"Napięcie",INDENT"Źródło Napięcia") #define TR_CURRENT TR (INDENT"Prąd",INDENT"Źródło Prądu") #define TR_SELECT_MODEL "Wybór modelu" +#define TR_SELECT_MODE "Select mode" #define TR_CREATE_CATEGORY "Create Category" #define TR_RENAME_CATEGORY "Rename Category" #define TR_DELETE_CATEGORY "Delete Category" @@ -919,9 +920,9 @@ #define TR_BYTES "bajty" #define TR_MODULE_BIND TR("[BND]","[Bind]") #define TR_POWERMETER_ATTN_NEEDED "Attenuator needed" -#define TR_PXX2_SELECT_RX "Select RX..." +#define TR_PXX2_SELECT_RX "Select RX" #define TR_PXX2_DEFAULT "" -#define TR_BT_SELECT_DEVICE "Select device..." +#define TR_BT_SELECT_DEVICE "Select device" #define TR_DISCOVER "Discover" #define TR_BUTTON_INIT BUTTON("Init") #define TR_WAITING "Waiting..." diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index fb0e97e48..75830e538 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -689,6 +689,7 @@ #define TR_VOLTAGE INDENT"Volts" #define TR_CURRENT INDENT"Amperes" #define TR_SELECT_MODEL "Selec. Modelo" +#define TR_SELECT_MODE "Select mode" #define TR_CREATE_CATEGORY "Create Category" #define TR_RENAME_CATEGORY "Rename Category" #define TR_DELETE_CATEGORY "Delete Category" @@ -909,9 +910,9 @@ #define TR_BYTES "bytes" #define TR_MODULE_BIND "[Bind]" #define TR_POWERMETER_ATTN_NEEDED "Attenuator needed" -#define TR_PXX2_SELECT_RX "Select RX..." +#define TR_PXX2_SELECT_RX "Select RX" #define TR_PXX2_DEFAULT "" -#define TR_BT_SELECT_DEVICE "Select device..." +#define TR_BT_SELECT_DEVICE "Select device" #define TR_DISCOVER "Discover" #define TR_BUTTON_INIT BUTTON("Init") #define TR_WAITING "Waiting..." diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index deacd3518..368ad237b 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -698,6 +698,7 @@ #define TR_VOLTAGE INDENT"Volt" #define TR_CURRENT INDENT"Ampere" #define TR_SELECT_MODEL "Välj Modell" +#define TR_SELECT_MODE "Select mode" #define TR_CREATE_CATEGORY "Skapa Kategori" #define TR_RENAME_CATEGORY "Byt Kat.namn" #define TR_DELETE_CATEGORY "Ta Bort Kategori" @@ -919,9 +920,9 @@ #define TR_BYTES "byte" #define TR_MODULE_BIND TR("[Bnd]", "[Bind]") #define TR_POWERMETER_ATTN_NEEDED "Attenuator needed" -#define TR_PXX2_SELECT_RX "Select RX..." +#define TR_PXX2_SELECT_RX "Select RX" #define TR_PXX2_DEFAULT "" -#define TR_BT_SELECT_DEVICE "Select device..." +#define TR_BT_SELECT_DEVICE "Select device" #define TR_DISCOVER "Discover" #define TR_BUTTON_INIT BUTTON("Init") #define TR_WAITING "Waiting..." From 463910c9039001332b1cc80241ce701dde0023c6 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 15 Jun 2020 11:12:52 +0200 Subject: [PATCH 451/560] Bsongis/navigation issue internal module receiver row (#7726) Navigation issue (212x64, when internal module is XJT D8): invisible cursor on "Receiver" row --- radio/src/gui/128x64/model_setup.cpp | 32 +++++----- .../src/gui/128x64/model_telemetry_sensor.cpp | 2 +- radio/src/gui/212x64/model_setup.cpp | 60 +++++++++---------- radio/src/gui/480x272/model_setup.cpp | 44 +++++++------- radio/src/gui/gui_common.h | 35 ++++++++--- radio/src/pulses/modules_helpers.h | 5 ++ radio/src/translations/en.h.txt | 4 +- 7 files changed, 97 insertions(+), 85 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index be8c15092..47b8e4958 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -158,8 +158,6 @@ enum MenuModelSetupItems { }; #define MODEL_SETUP_2ND_COLUMN (LCD_W-11*FW) -#define MODEL_SETUP_BIND_OFS 2*FW+1 -#define MODEL_SETUP_RANGE_OFS 4*FW+3 #define MODEL_SETUP_SET_FAILSAFE_OFS 7*FW-2 #define IF_PXX2_MODULE(module, xxx) (isModulePXX2(module) ? (uint8_t)(xxx) : HIDDEN_ROW) @@ -311,7 +309,7 @@ void onBluetoothConnectMenu(const char * result) MULTIMODULE_SUBTYPE_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_SUBTYPE */ \ MULTIMODULE_STATUS_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_STATUS, ITEM_MODEL_SETUP_INTERNAL_MODULE_SYNCSTATUS */ \ MODULE_CHANNELS_ROWS(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS */ \ - IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(IF_INTERNAL_MODULE_ON(MODULE_BIND_ROWS(INTERNAL_MODULE)))), /* *ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE */\ + IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, MODULE_BIND_ROWS(INTERNAL_MODULE)), /* *ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE */\ IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_MODEL_NUM */ \ MODULE_OPTION_ROW(INTERNAL_MODULE), /* ITEM_MODEL_SETUP_INTERNAL_MODULE_OPTIONS */ \ MULTIMODULE_MODULE_ROWS(INTERNAL_MODULE) /* ITEM_MODEL_SETUP_INTERNAL_MODULE_AUTOBIND */ \ @@ -1300,8 +1298,7 @@ void menuModelSetup(event_t event) lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, (int16_t)moduleData.ppm.frameLength*5 + 225, (menuHorizontalPosition<=0 ? attr : 0) | PREC1|LEFT); lcdDrawText(lcdLastRightPos, y, STR_MS); lcdDrawText(MODEL_SETUP_2ND_COLUMN+5*FW+2, y, moduleData.sbus.noninverted ? STR_NOT_INVERTED : STR_NORMAL, (CURSOR_ON_LINE() || menuHorizontalPosition==1) ? attr : 0); - - if (attr && s_editMode>0) { + if (attr && s_editMode > 0) { switch (menuHorizontalPosition) { case 0: CHECK_INCDEC_MODELVAR(event, moduleData.ppm.frameLength, -33, 35); @@ -1313,19 +1310,17 @@ void menuModelSetup(event_t event) } } else { + lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER); horzpos_t l_posHorz = menuHorizontalPosition; - coord_t xOffsetBind = MODEL_SETUP_BIND_OFS; - if (!isModuleRxNumAvailable(moduleIdx)) { - xOffsetBind = 0; - lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER); - if (attr) l_posHorz += 1; + coord_t bindButtonPos = MODEL_SETUP_2ND_COLUMN; + if (isModuleRxNumAvailable(moduleIdx)) { + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2); + bindButtonPos = lcdNextPos + 2; } - else { - lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER_NUM); + else if (attr) { + l_posHorz += 1; } if (isModuleBindRangeAvailable(moduleIdx)) { - if (xOffsetBind) - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2); if (attr && l_posHorz == 0) { if (s_editMode > 0) { CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], getMaxRxNum(moduleIdx)); @@ -1342,9 +1337,10 @@ void menuModelSetup(event_t event) } } } - lcdDrawText(MODEL_SETUP_2ND_COLUMN+xOffsetBind, y, STR_MODULE_BIND, l_posHorz==1 ? attr : 0); - if (!IS_RX_MULTI(moduleIdx)) - lcdDrawText(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0); + lcdDrawText(bindButtonPos, y, STR_MODULE_BIND, l_posHorz == 1 ? attr : 0); + if (isModuleRangeAvailable(moduleIdx)) { + lcdDrawText(lcdNextPos + 2, y, STR_MODULE_RANGE, l_posHorz == 2 ? attr : 0); + } uint8_t newFlag = 0; #if defined(MULTIMODULE) if (getMultiBindStatus(moduleIdx) == MULTI_BIND_FINISHED) { @@ -1387,7 +1383,7 @@ void menuModelSetup(event_t event) } } #else - if (attr && l_posHorz>0 && s_editMode>0) { + if (attr && l_posHorz > 0 && s_editMode > 0) { if (l_posHorz == 1) newFlag = MODULE_MODE_BIND; else if (l_posHorz == 2) diff --git a/radio/src/gui/128x64/model_telemetry_sensor.cpp b/radio/src/gui/128x64/model_telemetry_sensor.cpp index 301b956c1..33dcaf60c 100644 --- a/radio/src/gui/128x64/model_telemetry_sensor.cpp +++ b/radio/src/gui/128x64/model_telemetry_sensor.cpp @@ -24,7 +24,7 @@ enum SensorFields { SENSOR_FIELD_NAME, SENSOR_FIELD_TYPE, SENSOR_FIELD_ID, - SENSOR_FIELD_FORMULA=SENSOR_FIELD_ID, + SENSOR_FIELD_FORMULA = SENSOR_FIELD_ID, SENSOR_FILED_RECEIVER_NAME, SENSOR_FIELD_UNIT, SENSOR_FIELD_PRECISION, diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index c3d911012..f2933d5b7 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -86,7 +86,7 @@ enum MenuModelSetupItems { ITEM_MODEL_SETUP_INTERNAL_MODULE_LABEL, ITEM_MODEL_SETUP_INTERNAL_MODULE_TYPE, ITEM_MODEL_SETUP_INTERNAL_MODULE_CHANNELS, - ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_BIND, + ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE, ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_MODEL_NUM, ITEM_MODEL_SETUP_INTERNAL_MODULE_FAILSAFE, ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_REGISTER_RANGE, @@ -103,7 +103,7 @@ enum MenuModelSetupItems { ITEM_MODEL_SETUP_EXTERNAL_MODULE_SYNCSTATUS, #endif ITEM_MODEL_SETUP_EXTERNAL_MODULE_CHANNELS, - ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_BIND, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE, ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_MODEL_NUM, ITEM_MODEL_SETUP_EXTERNAL_MODULE_OPTIONS, #if defined(MULTIMODULE) @@ -347,10 +347,10 @@ void menuModelSetup(event_t event) LABEL(InternalModule), INTERNAL_MODULE_TYPE_ROWS, MODULE_CHANNELS_ROWS(INTERNAL_MODULE), - IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, IF_INTERNAL_MODULE_ON(isModuleBindRangeAvailable(INTERNAL_MODULE)? (uint8_t)2 : (uint8_t)1)), // RxNum, Range check and Register buttons + IF_NOT_ACCESS_MODULE_RF(INTERNAL_MODULE, MODULE_BIND_ROWS(INTERNAL_MODULE)), // RxNum, [Bind] and [Range] buttons IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), // RxNum for ACCESS IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), // Failsafe - IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 1), // Range check and Register buttons + IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 1), // [Range] and [Register] buttons IF_PXX2_MODULE(INTERNAL_MODULE, 0), // Module options IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), // Receiver 1 IF_ACCESS_MODULE_RF(INTERNAL_MODULE, 0), // Receiver 2 @@ -1086,8 +1086,8 @@ void menuModelSetup(event_t event) } break; - case ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_BIND: - case ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_BIND: + case ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE: + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); ModuleData & moduleData = g_model.moduleData[moduleIdx]; @@ -1098,8 +1098,7 @@ void menuModelSetup(event_t event) lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+6*FW, y, (moduleData.ppm.delay*50)+300, (CURSOR_ON_LINE() || menuHorizontalPosition==1) ? attr : 0); lcdDrawChar(lcdLastRightPos, y, 'u'); lcdDrawChar(MODEL_SETUP_2ND_COLUMN+12*FW, y, moduleData.ppm.pulsePol ? '+' : '-', (CURSOR_ON_LINE() || menuHorizontalPosition==2) ? attr : 0); - - if (attr && s_editMode>0) { + if (attr && s_editMode > 0) { switch (menuHorizontalPosition) { case 0: CHECK_INCDEC_MODELVAR(event, moduleData.ppm.frameLength, -20, 35); @@ -1117,9 +1116,8 @@ void menuModelSetup(event_t event) lcdDrawTextAlignedLeft(y, STR_REFRESHRATE); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, (int16_t)moduleData.ppm.frameLength*5 + 225, (menuHorizontalPosition<=0 ? attr : 0) | PREC1|LEFT); lcdDrawText(lcdLastRightPos, y, STR_MS); - lcdDrawText(MODEL_SETUP_3RD_COLUMN, y, moduleData.sbus.noninverted ? "not inverted" : "normal", (CURSOR_ON_LINE() || menuHorizontalPosition==1) ? attr : 0); - - if (attr && s_editMode>0) { + lcdDrawText(MODEL_SETUP_3RD_COLUMN, y, moduleData.sbus.noninverted ? STR_NOT_INVERTED : STR_NORMAL, (CURSOR_ON_LINE() || menuHorizontalPosition==1) ? attr : 0); + if (attr && s_editMode > 0) { switch (menuHorizontalPosition) { case 0: CHECK_INCDEC_MODELVAR(event, moduleData.ppm.frameLength, -33, 35); @@ -1131,25 +1129,19 @@ void menuModelSetup(event_t event) } } else { + lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER); horzpos_t l_posHorz = menuHorizontalPosition; coord_t bindButtonPos = MODEL_SETUP_2ND_COLUMN; - if (!isModuleRxNumAvailable(moduleIdx)) { - lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER); - if (attr) l_posHorz += 1; + if (isModuleRxNumAvailable(moduleIdx)) { + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz == 0 ? attr : 0) | LEADING0 | LEFT, 2); + bindButtonPos = lcdNextPos + FW; } - else { - lcdDrawText(INDENT_WIDTH, y, STR_RECEIVER_NUM); + else if (attr) { + l_posHorz += 1; } if (isModuleBindRangeAvailable(moduleIdx)) { - if (isModuleRxNumAvailable(moduleIdx)) { - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz == 0 ? attr : 0) | LEADING0 | LEFT, 2); - bindButtonPos = lcdNextPos + FW; - } - else { - bindButtonPos = MODEL_SETUP_2ND_COLUMN; - } - if (attr && l_posHorz==0) { - if (s_editMode>0) { + if (attr && l_posHorz == 0) { + if (s_editMode > 0) { CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], getMaxRxNum(moduleIdx)); if (checkIncDec_Ret) { modelHeaders[g_eeGeneral.currModel].modelId[moduleIdx] = g_model.header.modelId[moduleIdx]; @@ -1164,9 +1156,10 @@ void menuModelSetup(event_t event) } } } - lcdDrawText(bindButtonPos, y, STR_MODULE_BIND, l_posHorz==1 ? attr : 0); - if (!IS_RX_MULTI(moduleIdx)) - lcdDrawText(lcdNextPos + FW, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0); + lcdDrawText(bindButtonPos, y, STR_MODULE_BIND, l_posHorz == 1 ? attr : 0); + if (isModuleRangeAvailable(moduleIdx)) { + lcdDrawText(lcdNextPos + FW, y, STR_MODULE_RANGE, l_posHorz == 2 ? attr : 0); + } uint8_t newFlag = 0; #if defined(MULTIMODULE) if (getMultiBindStatus(moduleIdx) == MULTI_BIND_FINISHED) { @@ -1174,8 +1167,8 @@ void menuModelSetup(event_t event) s_editMode = 0; } #endif - if (attr && l_posHorz>0) { - if (s_editMode>0) { + if (attr && l_posHorz > 0) { + if (s_editMode > 0) { if (l_posHorz == 1) { if (isModuleR9MNonAccess(moduleIdx) || isModuleD16(moduleIdx)) { if (event == EVT_KEY_BREAK(KEY_ENTER)) { @@ -1202,8 +1195,9 @@ void menuModelSetup(event_t event) } moduleState[moduleIdx].mode = newFlag; #if defined(MULTIMODULE) - if (newFlag == MODULE_MODE_BIND) + if (newFlag == MODULE_MODE_BIND) { setMultiBindStatus(moduleIdx, MULTI_BIND_INITIATED); + } #endif } } @@ -1454,12 +1448,12 @@ void menuModelSetup(event_t event) if (old_editMode > 0 && s_editMode == 0) { switch(menuVerticalPosition) { - case ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_BIND: + case ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE: if (menuHorizontalPosition == 0) checkModelIdUnique(g_eeGeneral.currModel, INTERNAL_MODULE); break; - case ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_BIND: + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE: if (menuHorizontalPosition == 0) checkModelIdUnique(g_eeGeneral.currModel, EXTERNAL_MODULE); break; diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index f2f207654..191813f38 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -100,7 +100,7 @@ enum MenuModelSetupItems { ITEM_MODEL_SETUP_EXTERNAL_MODULE_SYNCSTATUS, #endif ITEM_MODEL_SETUP_EXTERNAL_MODULE_CHANNELS, - ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_BIND, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE, ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_MODEL_NUM, ITEM_MODEL_SETUP_EXTERNAL_MODULE_OPTIONS, #if defined(MULTIMODULE) @@ -129,8 +129,6 @@ enum MenuModelSetupItems { #define MODEL_SETUP_2ND_COLUMN 200 #define MODEL_SETUP_3RD_COLUMN 270 #define MODEL_SETUP_4TH_COLUMN 350 -#define MODEL_SETUP_BIND_OFS 40 -#define MODEL_SETUP_RANGE_OFS 80 #define MODEL_SETUP_SET_FAILSAFE_OFS 100 #define MODEL_SETUP_SLIDPOT_SPACING 45 @@ -1348,6 +1346,7 @@ bool menuModelSetup(event_t event) } } break; + #if defined(HARDWARE_INTERNAL_MODULE) case ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_REGISTER_RANGE: #endif @@ -1355,7 +1354,7 @@ bool menuModelSetup(event_t event) { lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_MODULE); drawButton(MODEL_SETUP_2ND_COLUMN, y, STR_REGISTER, (menuHorizontalPosition == 0 ? attr : 0)); - if (!IS_RX_MULTI(moduleIdx)) + if (isModuleRangeAvailable(moduleIdx)) drawButton(MODEL_SETUP_2ND_COLUMN + MODEL_SETUP_SET_FAILSAFE_OFS, y, STR_MODULE_RANGE, (menuHorizontalPosition == 1 ? attr : 0)); if (attr) { if (moduleState[moduleIdx].mode == MODULE_MODE_NORMAL && s_editMode > 0) { @@ -1374,8 +1373,9 @@ bool menuModelSetup(event_t event) s_editMode = 0; } } - } break; + } + #if defined(HARDWARE_INTERNAL_MODULE) case ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_OPTIONS: #endif @@ -1387,6 +1387,7 @@ bool menuModelSetup(event_t event) pushMenu(menuModelModuleOptions); } break; + #if defined(HARDWARE_INTERNAL_MODULE) case ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_1: case ITEM_MODEL_SETUP_INTERNAL_MODULE_PXX2_RECEIVER_2: @@ -1471,10 +1472,11 @@ bool menuModelSetup(event_t event) } } break; + #if defined(HARDWARE_INTERNAL_MODULE) case ITEM_MODEL_SETUP_INTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE: #endif - case ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_BIND: + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE: { ModuleData & moduleData = g_model.moduleData[moduleIdx]; if (isModulePPM(moduleIdx)) { @@ -1500,7 +1502,6 @@ bool menuModelSetup(event_t event) lcdDrawText(MENUS_MARGIN_LEFT, y, STR_REFRESHRATE); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, (int16_t)moduleData.ppm.frameLength*5 + 225, (menuHorizontalPosition<=0 ? attr : 0) | PREC1|LEFT, 0, NULL, STR_MS); lcdDrawText(MODEL_SETUP_3RD_COLUMN, y, moduleData.sbus.noninverted ? "not inverted" : "normal", (CURSOR_ON_LINE() || menuHorizontalPosition==1) ? attr : 0); - if (attr && s_editMode>0) { switch (menuHorizontalPosition) { case 0: @@ -1513,21 +1514,19 @@ bool menuModelSetup(event_t event) } } else { + lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_RECEIVER); int l_posHorz = menuHorizontalPosition; - coord_t xOffsetBind = MODEL_SETUP_BIND_OFS; - if (!isModuleRxNumAvailable(moduleIdx)) { - xOffsetBind = 0; - lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_RECEIVER); - if (attr) l_posHorz += 1; + coord_t bindButtonPos = MODEL_SETUP_2ND_COLUMN; + if (isModuleRxNumAvailable(moduleIdx)) { + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0 | LEFT, 2); + bindButtonPos += 40; } - else { - lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_RECEIVER_NUM); + else if (attr) { + l_posHorz += 1; } if (isModuleBindRangeAvailable(moduleIdx)) { - if (xOffsetBind) - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0 | LEFT, 2); - if (attr && l_posHorz==0) { - if (s_editMode>0) { + if (attr && l_posHorz == 0) { + if (s_editMode > 0) { CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], getMaxRxNum(moduleIdx)); if (event == EVT_KEY_LONG(KEY_ENTER)) { killEvents(event); @@ -1539,9 +1538,10 @@ bool menuModelSetup(event_t event) } } } - drawButton(MODEL_SETUP_2ND_COLUMN+xOffsetBind, y, STR_MODULE_BIND, (moduleState[moduleIdx].mode == MODULE_MODE_BIND ? BUTTON_ON : BUTTON_OFF) | (l_posHorz==1 ? attr : 0)); - if (!IS_RX_MULTI(moduleIdx)) - drawButton(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, (moduleState[moduleIdx].mode == MODULE_MODE_RANGECHECK ? BUTTON_ON : BUTTON_OFF) | (l_posHorz==2 ? attr : 0)); + drawButton(bindButtonPos, y, STR_MODULE_BIND, (moduleState[moduleIdx].mode == MODULE_MODE_BIND ? BUTTON_ON : BUTTON_OFF) | (l_posHorz==1 ? attr : 0)); + if (isModuleRangeAvailable(moduleIdx)) { + drawButton(bindButtonPos + 80, y, STR_MODULE_RANGE, (moduleState[moduleIdx].mode == MODULE_MODE_RANGECHECK ? BUTTON_ON : BUTTON_OFF) | (l_posHorz==2 ? attr : 0)); + } uint8_t newFlag = 0; #if defined(MULTIMODULE) if (getMultiBindStatus(moduleIdx) == MULTI_BIND_FINISHED) { @@ -1791,7 +1791,7 @@ bool menuModelSetup(event_t event) checkModelIdUnique(INTERNAL_MODULE); break; #endif - case ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_BIND: + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE: if (menuHorizontalPosition != 0) break; case ITEM_MODEL_SETUP_EXTERNAL_MODULE_TYPE: diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 4fbd63194..8aa034226 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -141,27 +141,44 @@ void runFatalErrorScreen(const char * message); inline uint8_t MODULE_BIND_ROWS(int moduleIdx) { - if (isModuleXJTD8(moduleIdx) || isModuleSBUS(moduleIdx) || IS_RX_MULTI(moduleIdx)) + if (isModuleMultimodule(moduleIdx)) { + if (IS_RX_MULTI(moduleIdx)) + return 1; + else + return 2; + } + else if (isModuleXJTD8(moduleIdx) || isModuleSBUS(moduleIdx)) { return 1; - - if (isModulePPM(moduleIdx) || isModulePXX1(moduleIdx) || isModulePXX2(moduleIdx) || isModuleDSM2(moduleIdx) || isModuleMultimodule(moduleIdx)) + } + else if (isModulePPM(moduleIdx) || isModulePXX1(moduleIdx) || isModulePXX2(moduleIdx) || isModuleDSM2(moduleIdx)) { return 2; - else + } + else { return HIDDEN_ROW; + } } inline uint8_t MODULE_CHANNELS_ROWS(int moduleIdx) { - if (!IS_MODULE_ENABLED(moduleIdx) || IS_RX_MULTI(moduleIdx)) + if (!IS_MODULE_ENABLED(moduleIdx)) { return HIDDEN_ROW; - - if (isModuleDSM2(moduleIdx) || isModuleCrossfire(moduleIdx) || isModuleSBUS(moduleIdx) || (isModuleMultimodule(moduleIdx) && g_model.moduleData[moduleIdx].getMultiProtocol() != MODULE_SUBTYPE_MULTI_DSM2)) + } + else if (isModuleMultimodule(moduleIdx)) { + if (IS_RX_MULTI(moduleIdx)) + return HIDDEN_ROW; + else if (g_model.moduleData[moduleIdx].getMultiProtocol() == MODULE_SUBTYPE_MULTI_DSM2) + return 1; + else + return 0; + } + else if (isModuleDSM2(moduleIdx) || isModuleCrossfire(moduleIdx) || isModuleSBUS(moduleIdx)) { return 0; - else + } + else { return 1; + } } - #if defined(MULTIMODULE) inline uint8_t MULTI_DISABLE_CHAN_MAP_ROW(uint8_t moduleIdx) { diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h index 244e58a79..cdaf58336 100644 --- a/radio/src/pulses/modules_helpers.h +++ b/radio/src/pulses/modules_helpers.h @@ -424,6 +424,11 @@ inline bool isModuleBindRangeAvailable(uint8_t moduleIdx) return isModulePXX2(moduleIdx) || isModulePXX1(moduleIdx) || isModuleDSM2(moduleIdx) || isModuleMultimodule(moduleIdx); } +inline bool isModuleRangeAvailable(uint8_t moduleIdx) +{ + return isModuleBindRangeAvailable(moduleIdx) && !IS_RX_MULTI(moduleIdx); +} + constexpr uint8_t MAX_RXNUM = 63; inline uint8_t getMaxRxNum(uint8_t idx) diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 8bde18bf1..eae2ad25a 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -841,8 +841,8 @@ #define TR_WRITING "Writing..." #define TR_CONFIRM_FORMAT "Confirm Format?" #define TR_INTERNALRF "Internal RF" -#define TR_INTERNAL_MODULE TR("Int. module","Internal module") -#define TR_EXTERNAL_MODULE TR("Ext. module","External module") +#define TR_INTERNAL_MODULE TR("Int. module", "Internal module") +#define TR_EXTERNAL_MODULE TR("Ext. module", "External module") #define TR_OPENTX_UPGRADE_REQUIRED "OpenTX upgrade required" #define TR_TELEMETRY_DISABLED "Telem. disabled" #define TR_MORE_OPTIONS_AVAILABLE "More options available" From af58426261679328a9891cb9d8bc7cabbb772ff7 Mon Sep 17 00:00:00 2001 From: MRC3742 Date: Mon, 15 Jun 2020 05:38:55 -0400 Subject: [PATCH 452/560] Update MPM to 1.3.1.9 (#7682) --- companion/src/firmwares/moduledata.h | 3 ++- companion/src/firmwares/multiprotocols.cpp | 12 ++++++++---- radio/src/gui/gui_common.cpp | 10 +++++++--- radio/src/pulses/modules_constants.h | 5 +++-- radio/src/translations/untranslated.h | 2 +- 5 files changed, 21 insertions(+), 11 deletions(-) diff --git a/companion/src/firmwares/moduledata.h b/companion/src/firmwares/moduledata.h index d356c3012..86614b392 100644 --- a/companion/src/firmwares/moduledata.h +++ b/companion/src/firmwares/moduledata.h @@ -132,7 +132,8 @@ enum MultiModuleRFProtocols { MODULE_SUBTYPE_MULTI_ESKY150V2, MODULE_SUBTYPE_MULTI_DSM_RX, MODULE_SUBTYPE_MULTI_JJRC345, - MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_JJRC345 + MODULE_SUBTYPE_MULTI_Q90C, + MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_Q90C }; enum TrainerProtocol { diff --git a/companion/src/firmwares/multiprotocols.cpp b/companion/src/firmwares/multiprotocols.cpp index 4feeb997f..737bd36ed 100644 --- a/companion/src/firmwares/multiprotocols.cpp +++ b/companion/src/firmwares/multiprotocols.cpp @@ -50,7 +50,7 @@ static const QStringList STR_SUBTYPE_SYMAX {"Standard", "Syma X5C"}; static const QStringList STR_SUBTYPE_SLT {"V1 (6 Channel)", "V2 (8 Channel)", "Q100", "Q200", "MR100"}; static const QStringList STR_SUBTYPE_CX10 {"Green", "Blue", "DM007", "-", "JC3015a", "JC3015b", "MK33041"}; static const QStringList STR_SUBTYPE_CG023 {"Standard", "YD829"}; -static const QStringList STR_SUBTYPE_BAYANG {"Standard", "H8S3D", "X16 AH", "IRDRONE", "DHD D4"}; +static const QStringList STR_SUBTYPE_BAYANG {"Standard", "H8S3D", "X16 AH", "IRDRONE", "DHD D4", "QX100"}; static const QStringList STR_SUBTYPE_ESky {"Standard", "ET4"}; static const QStringList STR_SUBTYPE_MT99 {"MT99", "H7", "YZ", "LS", "FY805"}; static const QStringList STR_SUBTYPE_MJXQ {"WLH08", "X600", "X800", "H26D", "E010", "H26WH", "Phoenix"}; @@ -76,7 +76,9 @@ static const QStringList STR_SUBTYPE_POTENSIC {"A20 Firefly"}; static const QStringList STR_SUBTYPE_ZSX {"JJRC ZSX-280"}; static const QStringList STR_SUBTYPE_FLYZONE {"FZ-410 TX"}; static const QStringList STR_SUBTYPE_FRSKYX_RX {"RX", "Clone TX"}; +static const QStringList STR_SUBTYPE_HOTT {"Sync", "No_Sync"}; static const QStringList STR_SUBTYPE_FX816 {"P38"}; +static const QStringList STR_SUBTYPE_PELIKAN {"Pro", "Lite"}; static const QStringList STR_SUBTYPE_XK {"X450", "X420"}; static const QStringList STR_SUBTYPE_XN297DUMP {"250K", "1M", "2M", "AUTO"}; static const QStringList STR_SUBTYPE_FRSKYX2 {"D16", "D16 8ch", "D16 EU-LBT", "D16 EU-LBT 8ch", "D16 Cloned"}; @@ -104,7 +106,7 @@ const Multiprotocols multiProtocols { {MODULE_SUBTYPE_MULTI_SLT, 4, false, STR_SUBTYPE_SLT, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_CX10, 6, false, STR_SUBTYPE_CX10, nullptr}, {MODULE_SUBTYPE_MULTI_CG023, 1, false, STR_SUBTYPE_CG023, nullptr}, - {MODULE_SUBTYPE_MULTI_BAYANG, 4, false, STR_SUBTYPE_BAYANG, STR_MULTI_TELEMETRY}, + {MODULE_SUBTYPE_MULTI_BAYANG, 5, false, STR_SUBTYPE_BAYANG, STR_MULTI_TELEMETRY}, {MODULE_SUBTYPE_MULTI_ESky, 1, false, STR_SUBTYPE_ESky, nullptr}, {MODULE_SUBTYPE_MULTI_MT99XX, 4, false, STR_SUBTYPE_MT99, nullptr}, {MODULE_SUBTYPE_MULTI_MJXQ, 6, false, STR_SUBTYPE_MJXQ, STR_MULTI_RFTUNE}, @@ -134,8 +136,9 @@ const Multiprotocols multiProtocols { {MODULE_SUBTYPE_MULTI_ZSX, 0, false, STR_SUBTYPE_ZSX, nullptr}, {MODULE_SUBTYPE_MULTI_FLYZONE, 0, false, STR_SUBTYPE_FLYZONE, nullptr}, {MODULE_SUBTYPE_MULTI_FRSKYX_RX, 1, false, STR_SUBTYPE_FRSKYX_RX, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_HOTT, 0, true, NO_SUBTYPE, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_HOTT, 1, true, STR_SUBTYPE_HOTT, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_FX816, 0, false, STR_SUBTYPE_FX816, nullptr}, + {MODULE_SUBTYPE_MULTI_PELIKAN, 1, false, STR_SUBTYPE_PELIKAN, nullptr}, {MODULE_SUBTYPE_MULTI_XK, 1, false, STR_SUBTYPE_XK, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_XN297DUMP, 3, false, STR_SUBTYPE_XN297DUMP, nullptr}, {MODULE_SUBTYPE_MULTI_FRSKYX2, 4, true, STR_SUBTYPE_FRSKYX2, STR_MULTI_RFTUNE}, @@ -144,6 +147,7 @@ const Multiprotocols multiProtocols { {MODULE_SUBTYPE_MULTI_FRSKYL, 1, false, STR_SUBTYPE_FRSKYL, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_SKYARTEC, 0, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_ESKY150V2, 0, false, STR_SUBTYPE_ESKY150V2, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_Q90C, 0, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, {MM_RF_CUSTOM_SELECTED, 7, true, STR_SUBTYPE_CUSTOM, STR_MULTI_OPTION}, // Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff) @@ -188,7 +192,7 @@ QString Multiprotocols::protocolToString(int protocol, bool custom) "Hitec", "Wfly", "Bugs", "Bugs Mini", "Traxxas", "NCC-1701-A", "E01X", "WL Heli V911S", "GD00X", "Volantex V761", "KFPlan KF606", "Redpine", "Potensic", "ZSX", "FlyZone", "Scanner", "FrSky RX", "FlySky AFHDS2A RX", "HoTT", "Fx816", "Bayang RX", "Pelikan", "Tiger", "XK", "XN297 Dump", "FrSky X 2.1", "FrSky R9", "Propel", "FrSky L", "Skyartec", - "ESky 150v2", "DSM RX", "JJRC345" + "ESky 150v2", "DSM RX", "JJRC345", "Q90C" }); return strings.value(protocol, CPN_STR_UNKNOWN_ITEM); diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index 1cbf5dcc2..29666fd26 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -863,7 +863,7 @@ const char STR_SUBTYPE_SYMAX[] = "\003""Std""X5C"; const char STR_SUBTYPE_SLT[] = "\006""V1_6ch""V2_8ch""Q100\0 ""Q200\0 ""MR100\0"; const char STR_SUBTYPE_CX10[] = "\007""Green\0 ""Blue\0 ""DM007\0 ""-\0 ""JC3015a""JC3015b""MK33041"; const char STR_SUBTYPE_CG023[] = "\005""Std\0 ""YD829"; -const char STR_SUBTYPE_BAYANG[] = "\007""Std\0 ""H8S3D\0 ""X16 AH\0""IRDrone""DHD D4"; +const char STR_SUBTYPE_BAYANG[] = "\007""Std\0 ""H8S3D\0 ""X16 AH\0""IRDrone""DHD D4\0""QX100\0 "; const char STR_SUBTYPE_ESky[] = "\003""Std""ET4"; const char STR_SUBTYPE_MT99[] = "\006""MT99\0 ""H7\0 ""YZ\0 ""LS\0 ""FY805"; const char STR_SUBTYPE_MJXQ[] = "\007""WLH08\0 ""X600\0 ""X800\0 ""H26D\0 ""E010\0 ""H26WH\0 ""Phoenix"; @@ -889,7 +889,9 @@ const char STR_SUBTYPE_POTENSIC[] = "\003""A20"; const char STR_SUBTYPE_ZSX[] = "\007""280JJRC"; const char STR_SUBTYPE_FLYZONE[] = "\005""FZ410"; const char STR_SUBTYPE_FRSKYX_RX[] = "\007""RX\0 ""CloneTX"; +const char STR_SUBTYPE_HOTT[] = "\007""Sync\0 ""No_Sync"; const char STR_SUBTYPE_FX816[] = "\003""P38"; +const char STR_SUBTYPE_PELIKAN[] = "\004""Pro\0""Lite"; const char STR_SUBTYPE_XK[] = "\004""X450""X420"; const char STR_SUBTYPE_XN297DUMP[] = "\004""250K""1M\0 ""2M\0 ""AUTO"; const char STR_SUBTYPE_FRSKYX2[] = "\011""D16\0 ""D16 8ch\0 ""LBT(EU)\0 ""LBT 8ch\0 ""D16Cloned"; @@ -925,7 +927,7 @@ const mm_protocol_definition multi_protocols[] = { {MODULE_SUBTYPE_MULTI_SLT, 4, false, true, STR_SUBTYPE_SLT, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_CX10, 6, false, false, STR_SUBTYPE_CX10, nullptr}, {MODULE_SUBTYPE_MULTI_CG023, 1, false, false, STR_SUBTYPE_CG023, nullptr}, - {MODULE_SUBTYPE_MULTI_BAYANG, 4, false, false, STR_SUBTYPE_BAYANG, STR_MULTI_TELEMETRY}, + {MODULE_SUBTYPE_MULTI_BAYANG, 5, false, false, STR_SUBTYPE_BAYANG, STR_MULTI_TELEMETRY}, {MODULE_SUBTYPE_MULTI_ESky, 1, false, true, STR_SUBTYPE_ESky, nullptr}, {MODULE_SUBTYPE_MULTI_MT99XX, 4, false, false, STR_SUBTYPE_MT99, nullptr}, {MODULE_SUBTYPE_MULTI_MJXQ, 6, false, false, STR_SUBTYPE_MJXQ, STR_MULTI_RFTUNE}, @@ -955,8 +957,9 @@ const mm_protocol_definition multi_protocols[] = { {MODULE_SUBTYPE_MULTI_ZSX, 0, false, false, STR_SUBTYPE_ZSX, nullptr}, {MODULE_SUBTYPE_MULTI_FLYZONE, 0, false, false, STR_SUBTYPE_FLYZONE, nullptr}, {MODULE_SUBTYPE_MULTI_FRSKYX_RX, 1, false, false, STR_SUBTYPE_FRSKYX_RX, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_HOTT, 0, true, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_HOTT, 1, true, false, STR_SUBTYPE_HOTT, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_FX816, 0, false, false, STR_SUBTYPE_FX816, nullptr}, + {MODULE_SUBTYPE_MULTI_PELIKAN, 1, false, false, STR_SUBTYPE_PELIKAN, nullptr}, {MODULE_SUBTYPE_MULTI_XK, 1, false, false, STR_SUBTYPE_XK, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_XN297DUMP, 3, false, false, STR_SUBTYPE_XN297DUMP, STR_MULTI_RFCHAN}, {MODULE_SUBTYPE_MULTI_FRSKYX2, 4, true, false, STR_SUBTYPE_FRSKYX2, STR_MULTI_RFTUNE}, @@ -965,6 +968,7 @@ const mm_protocol_definition multi_protocols[] = { {MODULE_SUBTYPE_MULTI_FRSKYL, 1, false, false, STR_SUBTYPE_FRSKYL, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_SKYARTEC, 0, false, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_ESKY150V2, 0, false, true, STR_SUBTYPE_ESKY150V2, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_Q90C, 0, false, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, {MM_RF_CUSTOM_SELECTED, 7, true, true, NO_SUBTYPE, STR_MULTI_OPTION}, // Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff) diff --git a/radio/src/pulses/modules_constants.h b/radio/src/pulses/modules_constants.h index 829d35c32..1e5879d92 100644 --- a/radio/src/pulses/modules_constants.h +++ b/radio/src/pulses/modules_constants.h @@ -166,11 +166,12 @@ enum ModuleSubtypeMulti { MODULE_SUBTYPE_MULTI_FRSKY_R9, MODULE_SUBTYPE_MULTI_PROPEL, MODULE_SUBTYPE_MULTI_FRSKYL, - MODULE_SUBTYPE_MULTI_SKYARTEC, + MODULE_SUBTYPE_MULTI_SKYARTEC, //65 MODULE_SUBTYPE_MULTI_ESKY150V2, MODULE_SUBTYPE_MULTI_DSM_RX, MODULE_SUBTYPE_MULTI_JJRC345, - MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_JJRC345 + MODULE_SUBTYPE_MULTI_Q90C, + MODULE_SUBTYPE_MULTI_LAST = MODULE_SUBTYPE_MULTI_Q90C }; #define MODULE_SUBTYPE_MULTI_XN297DP 63-3 diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h index 88289ed22..38631545a 100644 --- a/radio/src/translations/untranslated.h +++ b/radio/src/translations/untranslated.h @@ -125,4 +125,4 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\007" -#define TR_MULTI_PROTOCOLS "FlySky\0""Hubsan\0""FrSky\0 ""Hisky\0 ""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0 ""KN\0 ""SymaX\0 ""SLT\0 ""CX10\0 ""CG023\0 ""Bayang\0""ESky\0 ""MT99XX\0""MJXq\0 ""Shenqi\0""FY326\0 ""SFHSS\0 ""J6 Pro\0""FQ777\0 ""Assan\0 ""Hontai\0""OpenLrs""FlSky2A""Q2x2\0 ""Walkera""Q303\0 ""GW008\0 ""DM002\0 ""Cabell\0""Esky150""H8 3D\0 ""Corona\0""CFlie\0 ""Hitec\0 ""WFly\0 ""Bugs\0 ""BugMini""Traxxas""NCC1701""E01X\0 ""V911S\0 ""GD00X\0 ""V761\0 ""KF606\0 ""Redpine""Potensi""ZSX\0 ""FlyZone""Scanner""FrSkyRX""FS2A_RX""HoTT\0 ""FX816\0 ""BayanRX""Pelikan""Tiger\0 ""XK\0 ""XN297DU""FrSkyX2""FrSkyR9""Propel\0""FrSkyL\0""Skyarte""ESky-v2""DSM RX\0""JJRC345" +#define TR_MULTI_PROTOCOLS "FlySky\0""Hubsan\0""FrSky\0 ""Hisky\0 ""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0 ""KN\0 ""SymaX\0 ""SLT\0 ""CX10\0 ""CG023\0 ""Bayang\0""ESky\0 ""MT99XX\0""MJXq\0 ""Shenqi\0""FY326\0 ""SFHSS\0 ""J6 Pro\0""FQ777\0 ""Assan\0 ""Hontai\0""OpenLrs""FlSky2A""Q2x2\0 ""Walkera""Q303\0 ""GW008\0 ""DM002\0 ""Cabell\0""Esky150""H8 3D\0 ""Corona\0""CFlie\0 ""Hitec\0 ""WFly\0 ""Bugs\0 ""BugMini""Traxxas""NCC1701""E01X\0 ""V911S\0 ""GD00X\0 ""V761\0 ""KF606\0 ""Redpine""Potensi""ZSX\0 ""FlyZone""Scanner""FrSkyRX""FS2A_RX""HoTT\0 ""FX816\0 ""BayanRX""Pelikan""Tiger\0 ""XK\0 ""XN297DU""FrSkyX2""FrSkyR9""Propel\0""FrSkyL\0""Skyartc""ESky-v2""DSM RX\0""JJRC345""Q90C\0 " From 5b9d2167c1aa933225540a9997d64af9236474fa Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 15 Jun 2020 14:21:25 +0200 Subject: [PATCH 453/560] Update CREDITS.txt --- CREDITS.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index 35748e899..7fa64d9aa 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1749,3 +1749,9 @@ AG-Software Dietmar Drees Winfried Goers Steve Schoonover +N. Haasnoot (monthly) +Wolfram Bahmann +Florian Reck +Gary Bancroft +Karl-Heinz Behn +Stuart Godsmark From 417f36b543a08154c676973b8251b1b626c15cd0 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 15 Jun 2020 15:07:07 +0200 Subject: [PATCH 454/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 7fa64d9aa..0cd309253 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1755,3 +1755,4 @@ Florian Reck Gary Bancroft Karl-Heinz Behn Stuart Godsmark +Josko Povse From 4cca618f1ec0b8a90f54fa4a2d544a97183f82f2 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 15 Jun 2020 16:03:20 +0200 Subject: [PATCH 455/560] Fixes #7739 --- radio/src/audio.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/radio/src/audio.h b/radio/src/audio.h index 4e312f71a..0db4bed45 100644 --- a/radio/src/audio.h +++ b/radio/src/audio.h @@ -18,8 +18,8 @@ * GNU General Public License for more details. */ -#ifndef _AUDIO_ARM_H_ -#define _AUDIO_ARM_H_ +#ifndef _AUDIO_H_ +#define _AUDIO_H_ #include #include "ff.h" @@ -64,7 +64,11 @@ template class BitField { #define INDEX_LOGICAL_SWITCH_AUDIO_FILE(index, event) (2*(index)+(event)) #define INDEX_PHASE_AUDIO_FILE(index, event) (2*(index)+(event)) -constexpr uint8_t AUDIO_FILENAME_MAXLEN = (sizeof("/SOUNDS/fr/") - 1) + LEN_MODEL_NAME + 1 + LEN_FLIGHT_MODE_NAME + (sizeof("-off.wav") - 1); // max length (example: /SOUNDS/fr/123456789012/1234567890-off.wav) +// max length (example: /SOUNDS/fr/123456789012/1234567890-off.wav) +constexpr uint8_t AUDIO_MODEL_FILENAME_MAXLEN = (sizeof("/SOUNDS/fr/") - 1) + LEN_MODEL_NAME + 1 + LEN_FLIGHT_MODE_NAME + (sizeof("-off.wav") - 1); +constexpr uint8_t AUDIO_LUA_FILENAME_MAXLEN = 42; +constexpr uint8_t AUDIO_FILENAME_MAXLEN = (AUDIO_LUA_FILENAME_MAXLEN > AUDIO_MODEL_FILENAME_MAXLEN ? AUDIO_LUA_FILENAME_MAXLEN : AUDIO_MODEL_FILENAME_MAXLEN); + #define AUDIO_QUEUE_LENGTH (16) // must be a power of 2! #define AUDIO_SAMPLE_RATE (32000) @@ -652,4 +656,4 @@ void referenceModelAudioFiles(); bool isAudioFileReferenced(uint32_t i, char * filename/*at least AUDIO_FILENAME_MAXLEN+1 long*/); -#endif // _AUDIO_ARM_H_ +#endif // _AUDIO_H_ From bbfdf1b209c113bf9c516f9d235cd2e0a61e7561 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 15 Jun 2020 16:07:05 +0200 Subject: [PATCH 456/560] Comment added --- radio/src/audio.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/audio.h b/radio/src/audio.h index 0db4bed45..35e3cb810 100644 --- a/radio/src/audio.h +++ b/radio/src/audio.h @@ -66,7 +66,7 @@ template class BitField { // max length (example: /SOUNDS/fr/123456789012/1234567890-off.wav) constexpr uint8_t AUDIO_MODEL_FILENAME_MAXLEN = (sizeof("/SOUNDS/fr/") - 1) + LEN_MODEL_NAME + 1 + LEN_FLIGHT_MODE_NAME + (sizeof("-off.wav") - 1); -constexpr uint8_t AUDIO_LUA_FILENAME_MAXLEN = 42; +constexpr uint8_t AUDIO_LUA_FILENAME_MAXLEN = 42; // Some scripts use long audio paths, even on 128x64 boards constexpr uint8_t AUDIO_FILENAME_MAXLEN = (AUDIO_LUA_FILENAME_MAXLEN > AUDIO_MODEL_FILENAME_MAXLEN ? AUDIO_LUA_FILENAME_MAXLEN : AUDIO_MODEL_FILENAME_MAXLEN); #define AUDIO_QUEUE_LENGTH (16) // must be a power of 2! From 702567504da46bb5581e83bfe6dd134047d52acd Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 15 Jun 2020 16:09:26 +0200 Subject: [PATCH 457/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 0cd309253..52d2c6627 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1756,3 +1756,4 @@ Gary Bancroft Karl-Heinz Behn Stuart Godsmark Josko Povse +David Reese From 8ea3464df7dbc53dab90a7302e4ff53c54f58515 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 15 Jun 2020 16:19:27 +0200 Subject: [PATCH 458/560] Cosmetics --- radio/src/audio.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/radio/src/audio.h b/radio/src/audio.h index 35e3cb810..ab6228616 100644 --- a/radio/src/audio.h +++ b/radio/src/audio.h @@ -86,8 +86,6 @@ constexpr uint8_t AUDIO_FILENAME_MAXLEN = (AUDIO_LUA_FILENAME_MAXLEN > AUDIO_MOD #define BEEP_MIN_FREQ (150) #define BEEP_MAX_FREQ (15000) #define BEEP_DEFAULT_FREQ (2250) -#define BEEP_KEY_UP_FREQ (BEEP_DEFAULT_FREQ+150) -#define BEEP_KEY_DOWN_FREQ (BEEP_DEFAULT_FREQ-150) #if defined(AUDIO_DUAL_BUFFER) enum AudioBufferState From 27b5d2ff36b7e64767bbc35081150a09b475e5c9 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 15 Jun 2020 21:15:30 +0200 Subject: [PATCH 459/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 52d2c6627..181b9bb9a 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1757,3 +1757,4 @@ Karl-Heinz Behn Stuart Godsmark Josko Povse David Reese +Paul Pearson From 9c70be755a85b0eec9c1e36b8fb22c4c5c026ca4 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 16 Jun 2020 07:20:21 +0200 Subject: [PATCH 460/560] HoTT BCpT scaling fix This fixes #7744 --- radio/src/telemetry/hott.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/src/telemetry/hott.cpp b/radio/src/telemetry/hott.cpp index 98b3c54cc..0d97a274e 100644 --- a/radio/src/telemetry/hott.cpp +++ b/radio/src/telemetry/hott.cpp @@ -123,7 +123,7 @@ const HottSensor hottSensors[] = { {HOTT_ID_RPM1, ZSTR_RPM, UNIT_RPMS, 0}, // RPM1 {HOTT_ID_RPM2, ZSTR_RPM2, UNIT_RPMS, 0}, // RPM2 {HOTT_ID_ESC_VIN, ZSTR_ESC_VIN, UNIT_VOLTS, 1}, // ESC VIN - {HOTT_ID_BCAPA, ZSTR_SMART_BAT_CAPACITY, UNIT_MAH, 2}, // Batt Capa + {HOTT_ID_BCAPA, ZSTR_SMART_BAT_CAPACITY, UNIT_MAH, 0}, // Batt Capa {HOTT_ID_ESC_CUR, ZSTR_ESC_CUR, UNIT_AMPS, 1}, // ESC Amp {HOTT_ID_ESC_TBEC, ZSTR_ESC_TBEC, UNIT_CELSIUS, 0}, // ESC BEC Temp {HOTT_ID_ESC_BCUR, ZSTR_ESC_BCUR, UNIT_AMPS, 1}, // ESC BEC Amp @@ -358,7 +358,7 @@ void processHottPacket(const uint8_t * packet) setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_ESC_VIN, 0, HOTT_TELEM_ESC, value, sensor->unit, sensor->precision); // packet[11] uint8_t batt_cap_L; //#11 battery capacity in 10mAh steps // packet[12] uint8_t batt_cap_H; //#12 - value = packet[11] + (packet[12] << 8); + value = (packet[11] + (packet[12] << 8)) * 10; sensor = getHottSensor(HOTT_ID_BCAPA); setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_BCAPA, 0, HOTT_TELEM_ESC, value, sensor->unit, sensor->precision); // packet[13] uint8_t esc_temp; //#13 ESC temperature @@ -491,7 +491,7 @@ void processHottPacket(const uint8_t * packet) case HOTT_PAGE_04: // packet[4 ] uint8_t batt_cap_H; //#34 if (prev_page == ((HOTT_TELEM_GAM << 4) | HOTT_PAGE_03)) { - value = prev_value + (packet[4] << 8); + value = (prev_value + (packet[4] << 8)) * 10; sensor = getHottSensor(HOTT_ID_BCAPA); setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_BCAPA, 0, HOTT_TELEM_GAM, value, sensor->unit, sensor->precision); } From bfc30af29878426e0b412052be6c9c9d4747d5f0 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 16 Jun 2020 08:00:05 +0200 Subject: [PATCH 461/560] HoTT BCpT scaling fix (missed one sensor) --- radio/src/telemetry/hott.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/telemetry/hott.cpp b/radio/src/telemetry/hott.cpp index 0d97a274e..f35b1544d 100644 --- a/radio/src/telemetry/hott.cpp +++ b/radio/src/telemetry/hott.cpp @@ -611,7 +611,7 @@ void processHottPacket(const uint8_t * packet) case HOTT_PAGE_04: // packet[4 ] uint8_t batt_cap_H; //#34 if (prev_page == ((HOTT_TELEM_EAM << 4) | HOTT_PAGE_03)) { - value = prev_value + (packet[4] << 8); + value = (prev_value + (packet[4] << 8)) * 10; sensor = getHottSensor(HOTT_ID_BCAPA); setTelemetryValue(PROTOCOL_TELEMETRY_HOTT, HOTT_ID_BCAPA, 0, HOTT_TELEM_EAM, value, sensor->unit, sensor->precision); } From 798c98d506a8174d2ef14744ab4870a02f4d09d0 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 16 Jun 2020 08:39:17 +0200 Subject: [PATCH 462/560] Fix some spanish translation This fixes #7743 --- radio/src/translations/es.h.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index fcfade7a1..16752d94f 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -240,12 +240,12 @@ #define TR_FSW_RESET_TELEM TR("Telm", "Telemetría") #if LCD_W >= 212 - #define TR_FSW_RESET_TIMERS "Timer 1\0 ""Timer 2\0 ""Timer 3\0 " + #define TR_FSW_RESET_TIMERS "Timer 1\0 ""Timer 2\0 ""Timer 3\0 " #else #define TR_FSW_RESET_TIMERS "Tmr1""Tmr2""Tmr3" #endif -#define TR_VFSWRESET TR(TR_FSW_RESET_TIMERS "Todo" TR_FSW_RESET_TELEM, TR_FSW_RESET_TIMERS "Todo\0 " TR_FSW_RESET_TELEM) +#define TR_VFSWRESET TR(TR_FSW_RESET_TIMERS "Todo" TR_FSW_RESET_TELEM, TR_FSW_RESET_TIMERS "Vuelo\0 " TR_FSW_RESET_TELEM) #define LEN_FUNCSOUNDS TR("\004", "\006") #define TR_FUNCSOUNDS TR("Bp1\0""Bp2\0""Bp3\0""Avs1""Avs2""Chee""Rata""Tick""Sirn""Ring""SciF""Robt""Chrp""Tada""Crck""Alrm", "Beep1 ""Beep2 ""Beep3 ""Aviso1""Aviso2""Cheep ""Ratata""Tick ""Sirena""Ring ""SciFi ""Robot ""Chirp ""Tada ""Crickt""AlmClk") From edc57f70cc3ba5a9479e81d75035c0f836c522a0 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 16 Jun 2020 09:01:53 +0200 Subject: [PATCH 463/560] Update CREDITS.txt --- CREDITS.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index 181b9bb9a..f488b3c7a 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1758,3 +1758,5 @@ Stuart Godsmark Josko Povse David Reese Paul Pearson +Stuart Olson +Pierre Connan From e4336857869a53e3fdc699c0ae333e46230995e8 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 16 Jun 2020 10:04:18 +0200 Subject: [PATCH 464/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index f488b3c7a..4fcf98a29 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1760,3 +1760,4 @@ David Reese Paul Pearson Stuart Olson Pierre Connan +Henk Eeltink From fca11fc6b6df65939ced578e113f4bb1941bd88e Mon Sep 17 00:00:00 2001 From: DanielGeA Date: Wed, 17 Jun 2020 14:55:42 +0100 Subject: [PATCH 465/560] Fix mixer overflow (#7747) --- radio/src/mixer.cpp | 2 +- radio/src/tests/gtests.h | 1 + radio/src/tests/mixer.cpp | 61 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/radio/src/mixer.cpp b/radio/src/mixer.cpp index 3f373ae6e..0e75f94d7 100644 --- a/radio/src/mixer.cpp +++ b/radio/src/mixer.cpp @@ -947,7 +947,7 @@ void evalMixes(uint8_t tick10ms) mixerCurrentFlightMode = p; evalFlightModeMixes(p==fm ? e_perout_mode_normal : e_perout_mode_inactive_flight_mode, p==fm ? tick10ms : 0); for (uint8_t i=0; i> 4) * fp_act[p]; + sum_chans512[i] += limit(-0x6fff, chans[i] >> 4, 0x6fff) * fp_act[p]; weight += fp_act[p]; } } diff --git a/radio/src/tests/gtests.h b/radio/src/tests/gtests.h index ab5c35abd..a1f6f5d24 100644 --- a/radio/src/tests/gtests.h +++ b/radio/src/tests/gtests.h @@ -65,6 +65,7 @@ inline void MODEL_RESET() memset(&anaInValues, 0, sizeof(anaInValues)); extern uint8_t s_mixer_first_run_done; s_mixer_first_run_done = false; + evalMixes(1); // this is needed to reset fp_act lastFlightMode = 255; } diff --git a/radio/src/tests/mixer.cpp b/radio/src/tests/mixer.cpp index 8d8058d31..074f7f6ca 100644 --- a/radio/src/tests/mixer.cpp +++ b/radio/src/tests/mixer.cpp @@ -47,6 +47,22 @@ class MixerTest : public OpenTxTest {}; } \ } while (0) +#define CHECK_FLIGHT_MODE_TRANSITION(channel, duration, initValue, endValue) \ + do { \ + uint32_t delta = 0xffff / duration; \ + int32_t weightInit = 0xffff; \ + int32_t weightEnd = 0; \ + for (int i = 0; i <= (duration); i++) { \ + evalMixes(1); \ + GTEST_ASSERT_LE( abs(((initValue) * weightInit + (endValue) * weightEnd) / 0xffff - channelOutputs[(channel)]), 1); \ + weightInit = weightInit - delta; \ + weightEnd = weightEnd + delta; \ + } \ + for (int i = 0; i < 100; i++) { /* be sure the transition is finished*/ \ + evalMixes(1); \ + } \ + } while (0) + TEST_F(TrimsTest, throttleTrim) { g_model.thrTrim = 1; @@ -659,3 +675,48 @@ TEST(Trainer, UnpluggedTest) ppmInput[0] = 1024; CHECK_DELAY(0, 5000); } + +TEST_F(MixerTest, flightModeTransition) +{ + SYSTEM_RESET(); + MODEL_RESET(); + MIXER_RESET(); + modelDefault(0); + g_model.flightModeData[1].swtch = TR(SWSRC_ID2, SWSRC_SA2); + g_model.flightModeData[0].fadeIn = 100; + g_model.flightModeData[0].fadeOut = 100; + g_model.flightModeData[1].fadeIn = 100; + g_model.flightModeData[1].fadeOut = 100; + g_model.mixData[0].destCh = 0; + g_model.mixData[0].mltpx = MLTPX_REP; + g_model.mixData[0].srcRaw = MIXSRC_MAX; + g_model.mixData[0].flightModes = 0b11110; + g_model.mixData[0].weight = 100; + g_model.mixData[1].destCh = 0; + g_model.mixData[1].mltpx = MLTPX_REP; + g_model.mixData[1].srcRaw = MIXSRC_MAX; + g_model.mixData[1].flightModes = 0b11101; + g_model.mixData[1].weight = -10; + evalMixes(1); + simuSetSwitch(0, 1); + CHECK_FLIGHT_MODE_TRANSITION(0, 1000, 1024, -102); +} + +TEST_F(MixerTest, flightModeOverflow) +{ + SYSTEM_RESET(); + MODEL_RESET(); + MIXER_RESET(); + modelDefault(0); + g_model.flightModeData[1].swtch = TR(SWSRC_ID2, SWSRC_SA2); + g_model.flightModeData[0].fadeIn = 100; + g_model.flightModeData[0].fadeOut = 100; + g_model.mixData[0].destCh = 0; + g_model.mixData[0].mltpx = MLTPX_REP; + g_model.mixData[0].srcRaw = MIXSRC_MAX; + g_model.mixData[0].flightModes = 0; + g_model.mixData[0].weight = 250; + evalMixes(1); + simuSetSwitch(0, 1); + CHECK_FLIGHT_MODE_TRANSITION(0, 1000, 1024, 1024); +} From 9b64561246f1f44274bd2b87e7218fc95f005a70 Mon Sep 17 00:00:00 2001 From: Neil Horne Date: Fri, 19 Jun 2020 07:25:24 +1000 Subject: [PATCH 466/560] Automate Companion About copyright years (#7754) --- companion/src/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/companion/src/mainwindow.cpp b/companion/src/mainwindow.cpp index 4753e0b71..af1aa72f0 100644 --- a/companion/src/mainwindow.cpp +++ b/companion/src/mainwindow.cpp @@ -1065,7 +1065,7 @@ void MainWindow::about() aboutStr.append("

"); aboutStr.append(QString("Version %1, %2").arg(VERSION).arg(__DATE__)); aboutStr.append("

"); - aboutStr.append(tr("Copyright OpenTX Team") + "
© 2011-2019
"); + aboutStr.append(tr("Copyright OpenTX Team") + QString("
© 2011-%1
").arg(QString(__DATE__).right(4))); QMessageBox msgBox(this); msgBox.setWindowIcon(CompanionIcon("information.png")); msgBox.setWindowTitle(tr("About Companion")); From d419c19d1902a690e62d61012224f82ebdddaa84 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 19 Jun 2020 12:54:39 +0200 Subject: [PATCH 467/560] Update CREDITS.txt --- CREDITS.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index 4fcf98a29..db6aeaa1c 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1761,3 +1761,5 @@ Paul Pearson Stuart Olson Pierre Connan Henk Eeltink +Robert Miller +George Walker From 32f5526bd6e2707c74e2a8dd5d0894c8a5a7e2aa Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 19 Jun 2020 22:52:21 +0200 Subject: [PATCH 468/560] Update CREDITS.txt --- CREDITS.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index db6aeaa1c..f81e514b8 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1763,3 +1763,5 @@ Pierre Connan Henk Eeltink Robert Miller George Walker +Александр Щитов +Heiko Polig From 36301696c01a29c8a4fe0e8ed6d34db0ef400b4b Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 21 Jun 2020 18:56:20 +0200 Subject: [PATCH 469/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index f81e514b8..357729882 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1765,3 +1765,4 @@ Robert Miller George Walker Александр Щитов Heiko Polig +Gary Wild From 3b287eb5125e96c1756004590b9748a9a9a6c3e3 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 21 Jun 2020 18:57:02 +0200 Subject: [PATCH 470/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 357729882..6a5983a80 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1766,3 +1766,4 @@ George Walker Александр Щитов Heiko Polig Gary Wild +Peter Sarcher From 52f1e02247cf0438b54a3b1ba42b53cf1fe2f9fe Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 22 Jun 2020 07:44:58 +0200 Subject: [PATCH 471/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 6a5983a80..c895be582 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1767,3 +1767,4 @@ George Walker Heiko Polig Gary Wild Peter Sarcher +Steve Schoonover From 1fccb73e88987cdaed03be8383f63257531917b8 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 22 Jun 2020 10:46:28 +0200 Subject: [PATCH 472/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index c895be582..5bb418852 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1768,3 +1768,4 @@ Heiko Polig Gary Wild Peter Sarcher Steve Schoonover +Francisco Orcera Exposito From 6d29faa48b269cb6150b4974707e27f655d4d462 Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 22 Jun 2020 13:11:54 +0200 Subject: [PATCH 473/560] Version increment (we probably forgot it a t 2.3.9 release) --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 23596aff6..18d2bc919 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ project(OpenTX) set(VERSION_MAJOR "2") set(VERSION_MINOR "3") -set(VERSION_REVISION "9") +set(VERSION_REVISION "10") set(VERSION_SUFFIX $ENV{OPENTX_VERSION_SUFFIX}) set(VERSION_FAMILY ${VERSION_MAJOR}.${VERSION_MINOR}) set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}${VERSION_SUFFIX}) From 5bf197439a95338263007c501e9f382d68e278a8 Mon Sep 17 00:00:00 2001 From: Jakub Date: Mon, 22 Jun 2020 16:44:35 +0200 Subject: [PATCH 474/560] Support of FRM302 module. (#7533) AFHDS3 support added --- companion/src/firmwares/CMakeLists.txt | 1 + companion/src/firmwares/afhds3.cpp | 12 + companion/src/firmwares/afhds3.h | 12 + companion/src/firmwares/moduledata.cpp | 41 +- companion/src/firmwares/moduledata.h | 8 +- .../src/firmwares/opentx/opentxeeprom.cpp | 38 +- companion/src/firmwares/opentx/opentxeeprom.h | 3 + .../src/firmwares/opentx/opentxinterface.cpp | 47 +- companion/src/modeledit/setup.cpp | 51 +- companion/src/modeledit/setup.h | 1 + companion/src/modeledit/setup_module.ui | 174 ++++- companion/src/modelprinter.cpp | 5 + radio/src/dataconstants.h | 3 +- radio/src/datastructs.h | 18 + radio/src/gui/128x64/model_setup.cpp | 93 ++- radio/src/gui/212x64/model_setup.cpp | 97 ++- radio/src/gui/480x272/model_setup.cpp | 90 ++- .../gui/common/stdlcd/model_setup_afhds3.cpp | 48 ++ radio/src/gui/gui_common.cpp | 12 + radio/src/gui/gui_common.h | 26 +- radio/src/pulses/afhds3.cpp | 706 ++++++++++++++++++ radio/src/pulses/afhds3.h | 595 +++++++++++++++ radio/src/pulses/modules_constants.h | 10 + radio/src/pulses/modules_helpers.h | 64 +- radio/src/pulses/pulses.cpp | 77 ++ radio/src/pulses/pulses.h | 38 +- radio/src/pulses/pulses_common.h | 21 + radio/src/targets/common/arm/CMakeLists.txt | 14 +- radio/src/targets/horus/CMakeLists.txt | 1 + radio/src/targets/horus/extmodule_driver.cpp | 24 + radio/src/targets/horus/telemetry_driver.cpp | 25 +- radio/src/targets/sky9x/CMakeLists.txt | 1 + radio/src/targets/taranis/CMakeLists.txt | 1 + .../src/targets/taranis/extmodule_driver.cpp | 20 +- .../src/targets/taranis/telemetry_driver.cpp | 28 +- radio/src/telemetry/flysky_ibus.cpp | 25 +- radio/src/telemetry/flysky_ibus.h | 2 + radio/src/telemetry/telemetry.cpp | 17 +- radio/src/telemetry/telemetry.h | 11 +- radio/src/telemetry/telemetry_sensors.cpp | 8 +- radio/src/translations.cpp | 15 +- radio/src/translations.h | 11 + radio/src/translations/cz.h.txt | 6 + radio/src/translations/de.h.txt | 6 + radio/src/translations/en.h.txt | 6 + radio/src/translations/es.h.txt | 6 + radio/src/translations/fi.h.txt | 6 + radio/src/translations/fr.h.txt | 6 + radio/src/translations/it.h.txt | 6 + radio/src/translations/nl.h.txt | 6 + radio/src/translations/pl.h.txt | 6 + radio/src/translations/pt.h.txt | 6 + radio/src/translations/se.h.txt | 6 + radio/src/translations/untranslated.h | 9 +- radio/util/fwoptions.py | 30 +- 55 files changed, 2435 insertions(+), 164 deletions(-) create mode 100644 companion/src/firmwares/afhds3.cpp create mode 100644 companion/src/firmwares/afhds3.h create mode 100644 radio/src/gui/common/stdlcd/model_setup_afhds3.cpp create mode 100644 radio/src/pulses/afhds3.cpp create mode 100644 radio/src/pulses/afhds3.h diff --git a/companion/src/firmwares/CMakeLists.txt b/companion/src/firmwares/CMakeLists.txt index 502a04961..48e6394bc 100644 --- a/companion/src/firmwares/CMakeLists.txt +++ b/companion/src/firmwares/CMakeLists.txt @@ -18,6 +18,7 @@ set(firmwares_SRCS rawswitch.cpp sensordata.cpp telem_data.cpp + afhds3.cpp er9x/er9xeeprom.cpp er9x/er9xinterface.cpp ersky9x/ersky9xeeprom.cpp diff --git a/companion/src/firmwares/afhds3.cpp b/companion/src/firmwares/afhds3.cpp new file mode 100644 index 000000000..000fb252c --- /dev/null +++ b/companion/src/firmwares/afhds3.cpp @@ -0,0 +1,12 @@ +#include "afhds3.h" +#include "macros.h" + +QString Afhds3Data::protocolToString(unsigned int protocol) { + const char * const afhds3Protocols[] = { + "PWM/IBUS", + "PWM/SBUS", + "PPM/IBUS", + "PPM/SBUS", + }; + return CHECK_IN_ARRAY(afhds3Protocols, protocol); +} diff --git a/companion/src/firmwares/afhds3.h b/companion/src/firmwares/afhds3.h new file mode 100644 index 000000000..ea4257fba --- /dev/null +++ b/companion/src/firmwares/afhds3.h @@ -0,0 +1,12 @@ +#ifndef AFHDS3_H +#define AFHDS3_H + +#include + +class Afhds3Data +{ + Q_DECLARE_TR_FUNCTIONS(Afhds3) +public: + static QString protocolToString(unsigned int protocol); +}; +#endif // AFHDS3_H diff --git a/companion/src/firmwares/moduledata.cpp b/companion/src/firmwares/moduledata.cpp index 370a6979b..c899632af 100644 --- a/companion/src/firmwares/moduledata.cpp +++ b/companion/src/firmwares/moduledata.cpp @@ -21,6 +21,7 @@ #include "moduledata.h" #include "eeprominterface.h" #include "multiprotocols.h" +#include "afhds3.h" #include "radiodataconversionstate.h" void ModuleData::convert(RadioDataConversionState & cstate) @@ -87,7 +88,6 @@ QString ModuleData::rfProtocolToString() const switch (protocol) { case PULSES_MULTIMODULE: return Multiprotocols::protocolToString((int)multi.rfProtocol); - default: return CPN_STR_UNKNOWN_ITEM; } @@ -108,10 +108,10 @@ QString ModuleData::subTypeToString(int type) const switch (protocol) { case PULSES_MULTIMODULE: return Multiprotocols::subTypeToString((int)multi.rfProtocol, (unsigned)type); - case PULSES_PXX_R9M: return CHECK_IN_ARRAY(strings, type); - + case PULSES_AFHDS3: + return Afhds3Data::protocolToString(type); default: return CPN_STR_UNKNOWN_ITEM; } @@ -119,8 +119,8 @@ QString ModuleData::subTypeToString(int type) const QString ModuleData::powerValueToString(Firmware * fw) const { - const QStringList & strRef = powerValueStrings(subType, fw); - return strRef.value(pxx.power, CPN_STR_UNKNOWN_ITEM); + const QStringList & strRef = powerValueStrings((enum PulsesProtocol)protocol, subType, fw); + return strRef.value(protocol == PULSES_AFHDS3 ? afhds3.rfPower : pxx.power, CPN_STR_UNKNOWN_ITEM); } // static @@ -159,14 +159,15 @@ QString ModuleData::protocolToString(unsigned protocol) "FrSky ACCESS R9M 2019", "FrSky ACCESS R9M Lite", "FrSky ACCESS R9M Lite Pro", - "FrSky XJT lite (D16)", "FrSky XJT lite (D8)", "FrSky XJT lite (LR12)" + "FrSky XJT lite (D16)", "FrSky XJT lite (D8)", "FrSky XJT lite (LR12)", + "AFHDS3" }; return CHECK_IN_ARRAY(strings, protocol); } // static -QStringList ModuleData::powerValueStrings(int subType, Firmware * fw) +QStringList ModuleData::powerValueStrings(enum PulsesProtocol protocol, int subType, Firmware * fw) { static const QStringList strings[] = { { tr("10mW - 16CH"), tr("100mW - 16CH"), tr("500mW - 16CH"), tr("Auto <= 1W - 16CH") }, // full-size FCC @@ -174,12 +175,21 @@ QStringList ModuleData::powerValueStrings(int subType, Firmware * fw) { tr("100mW - 16CH") }, // mini FCC { tr("25mW - 8CH"), tr("25mW - 16CH"), tr("100mW - 16CH (no telemetry)") } // mini EU }; - int strIdx = 0; - if (subType == MODULE_SUBTYPE_R9M_EU) - strIdx += 1; - if (fw->getCapability(HasModuleR9MMini)) - strIdx += 2; - return strings[strIdx]; + static const QStringList afhds3Strings = { + tr("25 mW"), tr("100 mW"), tr("500 mW"), tr("1 W"), tr("2 W") + }; + + switch(protocol) { + case PULSES_AFHDS3: + return afhds3Strings; + default: + int strIdx = 0; + if (subType == MODULE_SUBTYPE_R9M_EU) + strIdx += 1; + if (fw->getCapability(HasModuleR9MMini)) + strIdx += 2; + return strings[strIdx]; + } } bool ModuleData::hasFailsafes(Firmware * fw) const @@ -193,7 +203,8 @@ bool ModuleData::hasFailsafes(Firmware * fw) const protocol == PULSES_ACCESS_R9M_LITE || protocol == PULSES_ACCESS_R9M_LITE_PRO || protocol == PULSES_XJT_LITE_X16 || - protocol == PULSES_MULTIMODULE + protocol == PULSES_MULTIMODULE || + protocol == PULSES_AFHDS3 ); } @@ -230,6 +241,8 @@ int ModuleData::getMaxChannelCount() else return 16; break; + case PULSES_AFHDS3: + return 18; case PULSES_OFF: break; default: diff --git a/companion/src/firmwares/moduledata.h b/companion/src/firmwares/moduledata.h index 86614b392..d3e851879 100644 --- a/companion/src/firmwares/moduledata.h +++ b/companion/src/firmwares/moduledata.h @@ -58,6 +58,7 @@ enum PulsesProtocol { PULSES_XJT_LITE_X16, PULSES_XJT_LITE_D8, PULSES_XJT_LITE_LR12, + PULSES_AFHDS3, PULSES_PROTOCOL_LAST }; @@ -190,6 +191,11 @@ class ModuleData { int optionValue; } multi; + struct Afhds3 { + unsigned int rxFreq; + unsigned int rfPower; + } afhds3; + struct PXX { unsigned int power; // 0 10 mW, 1 100 mW, 2 500 mW, 3 1W bool receiverTelemetryOff; // false = receiver telem enabled @@ -213,7 +219,7 @@ class ModuleData { QString powerValueToString(Firmware * fw) const; static QString indexToString(int index, Firmware * fw); static QString protocolToString(unsigned protocol); - static QStringList powerValueStrings(int subType, Firmware * fw); + static QStringList powerValueStrings(enum PulsesProtocol protocol, int subType, Firmware * fw); bool hasFailsafes(Firmware * fw) const; int getMaxChannelCount(); }; diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index 17c5b03a5..119bbe396 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -2113,6 +2113,40 @@ class ModuleUnionField: public UnionField { unsigned int version; }; + class Afhds3Field: public UnionField::TransformedMember { + public: + Afhds3Field(DataField * parent, ModuleData& module): + UnionField::TransformedMember(parent, internalField), + internalField(this, "AFHDS3") + { + ModuleData::Afhds3& afhds3 = module.afhds3; + internalField.Append(new UnsignedField<3>(this, minBindPower)); + internalField.Append(new UnsignedField<3>(this, afhds3.rfPower)); + internalField.Append(new UnsignedField<1>(this, emissionFCC)); + internalField.Append(new BoolField<1>(this, operationModeUnicast)); + internalField.Append(new BoolField<1>(this, operationModeUnicast)); + internalField.Append(new UnsignedField<16>(this, defaultFailSafeTimout)); + internalField.Append(new UnsignedField<16>(this, afhds3.rxFreq)); + } + + bool select(const unsigned int& attr) const override { + return attr == PULSES_AFHDS3; + } + + void beforeExport() override {} + + void afterImport() override {} + + private: + StructField internalField; + + unsigned int minBindPower = 0; + unsigned int emissionFCC = 0; + unsigned int defaultFailSafeTimout = 1000; + bool operationModeUnicast = true; + }; + + class AccessField: public UnionField::TransformedMember { public: AccessField(DataField * parent, ModuleData& module): @@ -2173,8 +2207,10 @@ class ModuleUnionField: public UnionField { ModuleUnionField(DataField * parent, ModuleData & module, Board::Type board, unsigned int version): UnionField(parent, module.protocol) { - if (version >= 219) + if (version >= 219) { Append(new AccessField(parent, module)); + Append(new Afhds3Field(parent, module)); + } Append(new PxxField(parent, module, version)); Append(new MultiField(parent, module)); Append(new PPMField(parent, module.ppm)); diff --git a/companion/src/firmwares/opentx/opentxeeprom.h b/companion/src/firmwares/opentx/opentxeeprom.h index ac1cf09dc..ced4dccb6 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.h +++ b/companion/src/firmwares/opentx/opentxeeprom.h @@ -107,6 +107,9 @@ class ProtocolsConversionTable: public ConversionTable addConversion(PULSES_XJT_LITE_X16, val); addConversion(PULSES_XJT_LITE_D8, val); addConversion(PULSES_XJT_LITE_LR12, val++); + if (version >= 219) { + addConversion(PULSES_AFHDS3, val++); + } } }; diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 2fed78ab4..c405f9699 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -823,6 +823,7 @@ bool OpenTxFirmware::isAvailable(PulsesProtocol proto, int port) case PULSES_SBUS: case PULSES_MULTIMODULE: case PULSES_CROSSFIRE: + case PULSES_AFHDS3: return true; case PULSES_ACCESS_R9M: return IS_TARANIS_XLITE(board) || IS_TARANIS_X9LITE(board) || board == BOARD_TARANIS_X9DP_2019 || board == BOARD_X10_EXPRESS || (IS_FAMILY_HORUS_OR_T16(board) && id.contains("internalaccess")); @@ -832,7 +833,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)); default: return false; } @@ -1184,19 +1185,25 @@ void addOpenTxCommonOptions(OpenTxFirmware * firmware) enum RfOptions { NONE = 0, EU = 1 << 0, - FLEX = 1 << 1 + FLEX = 1 << 1, + AFHDS3 = 1 << 2 }; void addOpenTxRfOptions(OpenTxFirmware * firmware, uint8_t options) { static const Firmware::Option opt_eu("eu", Firmware::tr("Removes D8 FrSky protocol support which is not legal for use in the EU on radios sold after Jan 1st, 2015")); static const Firmware::Option opt_fl("flexr9m", Firmware::tr("Enable non certified firmwares")); - if (options == EU + FLEX) + static const Firmware::Option opt_afhds3("afhds3", Firmware::tr("Enable AFHDS3 support")); + + + if ((options & (EU + FLEX)) == EU + FLEX) firmware->addOptionsGroup({opt_eu, opt_fl}); - else if (options == EU) + else if ((options & EU) != 0) firmware->addOption(opt_eu); - else if (options == FLEX) + else if ((options & FLEX) != 0) firmware->addOption(opt_fl); + if ((options & AFHDS3) != 0) + firmware->addOption(opt_afhds3); } void addOpenTxFontOptions(OpenTxFirmware * firmware) @@ -1245,13 +1252,13 @@ void registerOpenTxFirmwares() firmware->addOption("noras", Firmware::tr("Disable RAS (SWR)")); addOpenTxTaranisOptions(firmware); registerOpenTxFirmware(firmware); - addOpenTxRfOptions(firmware, EU + FLEX); + addOpenTxRfOptions(firmware, EU + FLEX + AFHDS3); /* FrSky Taranis X9D+ 2019 board */ firmware = new OpenTxFirmware("opentx-x9d+2019", Firmware::tr("FrSky Taranis X9D+ 2019"), BOARD_TARANIS_X9DP_2019); addOpenTxTaranisOptions(firmware); registerOpenTxFirmware(firmware); - addOpenTxRfOptions(firmware, FLEX); + addOpenTxRfOptions(firmware, FLEX + AFHDS3); /* FrSky Taranis X9D board */ firmware = new OpenTxFirmware("opentx-x9d", Firmware::tr("FrSky Taranis X9D"), BOARD_TARANIS_X9D); @@ -1259,7 +1266,7 @@ void registerOpenTxFirmwares() firmware->addOption("haptic", Firmware::tr("Haptic module installed")); addOpenTxTaranisOptions(firmware); registerOpenTxFirmware(firmware); - addOpenTxRfOptions(firmware, EU + FLEX); + addOpenTxRfOptions(firmware, EU + FLEX + AFHDS3); /* FrSky Taranis X9E board */ firmware = new OpenTxFirmware("opentx-x9e", Firmware::tr("FrSky Taranis X9E"), BOARD_TARANIS_X9E); @@ -1267,37 +1274,37 @@ void registerOpenTxFirmwares() firmware->addOption("horussticks", Firmware::tr("Horus gimbals installed (Hall sensors)")); addOpenTxTaranisOptions(firmware); registerOpenTxFirmware(firmware); - addOpenTxRfOptions(firmware, EU + FLEX); + addOpenTxRfOptions(firmware, EU + FLEX + AFHDS3); /* FrSky X9-Lite board */ firmware = new OpenTxFirmware("opentx-x9lite", Firmware::tr("FrSky Taranis X9-Lite"), BOARD_TARANIS_X9LITE); addOpenTxTaranisOptions(firmware); registerOpenTxFirmware(firmware); - addOpenTxRfOptions(firmware, FLEX); + addOpenTxRfOptions(firmware, FLEX + AFHDS3); /* FrSky X9-LiteS board */ firmware = new OpenTxFirmware("opentx-x9lites", Firmware::tr("FrSky Taranis X9-Lite S"), BOARD_TARANIS_X9LITES); addOpenTxTaranisOptions(firmware); registerOpenTxFirmware(firmware); - addOpenTxRfOptions(firmware, FLEX); + addOpenTxRfOptions(firmware, FLEX + AFHDS3); /* FrSky X7 board */ firmware = new OpenTxFirmware("opentx-x7", Firmware::tr("FrSky Taranis X7 / X7S"), BOARD_TARANIS_X7); addOpenTxTaranisOptions(firmware); registerOpenTxFirmware(firmware); - addOpenTxRfOptions(firmware, EU + FLEX); + addOpenTxRfOptions(firmware, EU + FLEX + AFHDS3); /* FrSky X7 Access board */ firmware = new OpenTxFirmware("opentx-x7access", Firmware::tr("FrSky Taranis X7 / X7S Access"), BOARD_TARANIS_X7_ACCESS); addOpenTxTaranisOptions(firmware); registerOpenTxFirmware(firmware); - addOpenTxRfOptions(firmware, FLEX); + addOpenTxRfOptions(firmware, FLEX + AFHDS3); /* FrSky X-Lite S/PRO board */ firmware = new OpenTxFirmware("opentx-xlites", Firmware::tr("FrSky Taranis X-Lite S/PRO"), BOARD_TARANIS_XLITES); addOpenTxTaranisOptions(firmware); registerOpenTxFirmware(firmware); - addOpenTxRfOptions(firmware, FLEX); + addOpenTxRfOptions(firmware, FLEX + AFHDS3); /* FrSky X-Lite board */ firmware = new OpenTxFirmware("opentx-xlite", Firmware::tr("FrSky Taranis X-Lite"), BOARD_TARANIS_XLITE); @@ -1311,13 +1318,13 @@ void registerOpenTxFirmwares() addOpenTxFrskyOptions(firmware); firmware->addOption("internalaccess", Firmware::tr("Support for ACCESS internal module replacement")); registerOpenTxFirmware(firmware); - addOpenTxRfOptions(firmware, EU + FLEX); + addOpenTxRfOptions(firmware, EU + FLEX + AFHDS3); /* FrSky X10 Express board */ firmware = new OpenTxFirmware("opentx-x10express", Firmware::tr("FrSky Horus X10 Express / X10S Express"), BOARD_X10_EXPRESS); addOpenTxFrskyOptions(firmware); registerOpenTxFirmware(firmware); - addOpenTxRfOptions(firmware, FLEX); + addOpenTxRfOptions(firmware, FLEX + AFHDS3); /* FrSky X12 (Horus) board */ firmware = new OpenTxFirmware("opentx-x12s", Firmware::tr("FrSky Horus X12S"), BOARD_HORUS_X12S); @@ -1325,7 +1332,7 @@ void registerOpenTxFirmwares() firmware->addOption("internalaccess", Firmware::tr("Support for ACCESS internal module replacement")); firmware->addOption("pcbdev", Firmware::tr("Use ONLY with first DEV pcb version")); registerOpenTxFirmware(firmware); - addOpenTxRfOptions(firmware, EU + FLEX); + addOpenTxRfOptions(firmware, EU + FLEX + AFHDS3); /* Jumper T12 board */ firmware = new OpenTxFirmware("opentx-t12", QCoreApplication::translate("Firmware", "Jumper T12 / T12 Pro"), BOARD_JUMPER_T12); @@ -1336,20 +1343,20 @@ void registerOpenTxFirmwares() firmware->addOption("internalmulti", Firmware::tr("Support for MULTI internal module")); addOpenTxFontOptions(firmware); registerOpenTxFirmware(firmware); - addOpenTxRfOptions(firmware, FLEX); + addOpenTxRfOptions(firmware, FLEX + AFHDS3); /* Jumper T16 board */ firmware = new OpenTxFirmware("opentx-t16", Firmware::tr("Jumper T16 / T16+ / T16 Pro"), BOARD_JUMPER_T16); addOpenTxFrskyOptions(firmware); firmware->addOption("internalmulti", Firmware::tr("Support for MULTI internal module")); firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module")); - addOpenTxRfOptions(firmware, FLEX); + addOpenTxRfOptions(firmware, FLEX + AFHDS3); registerOpenTxFirmware(firmware); /* Radiomaster TX16S board */ firmware = new OpenTxFirmware("opentx-tx16s", Firmware::tr("Radiomaster TX16s / TX16s Hall / TX16s Masterfire"), BOARD_RADIOMASTER_TX16S); addOpenTxFrskyOptions(firmware); - addOpenTxRfOptions(firmware, FLEX); + addOpenTxRfOptions(firmware, FLEX + AFHDS3); static const Firmware::Option opt_bt("bluetooth", Firmware::tr("Support for bluetooth module")); static const Firmware::Option opt_internal_gps("internalgps", Firmware::tr("Support internal GPS")); firmware->addOptionsGroup({opt_bt, opt_internal_gps}); diff --git a/companion/src/modeledit/setup.cpp b/companion/src/modeledit/setup.cpp index 43eaf11fe..b1fb9af72 100644 --- a/companion/src/modeledit/setup.cpp +++ b/companion/src/modeledit/setup.cpp @@ -192,6 +192,8 @@ void TimerPanel::on_name_editingFinished() #define MASK_SBUSPPM_FIELDS (1<<11) #define MASK_SUBTYPES (1<<12) #define MASK_ACCESS (1<<13) +#define MASK_RX_FREQ (1<<14) +#define MASK_RF_POWER (1<<15) quint8 ModulePanel::failsafesValueDisplayType = ModulePanel::FAILSAFE_DISPLAY_PERCENT; @@ -271,7 +273,7 @@ ModulePanel::ModulePanel(QWidget * parent, ModelData & model, ModuleData & modul connect(ui->multiProtocol, static_cast(&QComboBox::currentIndexChanged), this, &ModulePanel::onMultiProtocolChanged); connect(this, &ModulePanel::channelsRangeChanged, this, &ModulePanel::setupFailsafes); connect(ui->btnGrpValueType, static_cast(&QButtonGroup::buttonClicked), this, &ModulePanel::onFailsafesDisplayValueTypeChanged); - + connect(ui->rxFreq, static_cast(&QSpinBox::valueChanged), this, &ModulePanel::onRfFreqChanged); connect(ui->clearRx1, SIGNAL(clicked()), this, SLOT(onClearAccessRxClicked())); connect(ui->clearRx2, SIGNAL(clicked()), this, SLOT(onClearAccessRxClicked())); connect(ui->clearRx3, SIGNAL(clicked()), this, SLOT(onClearAccessRxClicked())); @@ -391,7 +393,7 @@ void ModulePanel::update() mask |= MASK_PROTOCOL; switch (protocol) { case PULSES_PXX_R9M: - mask |= MASK_R9M | MASK_SUBTYPES; + mask |= MASK_R9M | MASK_RF_POWER | MASK_SUBTYPES; case PULSES_ACCESS_R9M: case PULSES_ACCESS_R9M_LITE: case PULSES_ACCESS_R9M_LITE_PRO: @@ -450,6 +452,11 @@ void ModulePanel::update() if (pdef.hasFailsafe || (module.multi.rfProtocol == MODULE_SUBTYPE_MULTI_FRSKY && (module.subType == 0 || module.subType == 2 || module.subType > 3 ))) mask |= MASK_FAILSAFES; break; + case PULSES_AFHDS3: + module.channelsCount = 18; + mask |= MASK_CHANNELS_RANGE| MASK_CHANNELS_COUNT | MASK_FAILSAFES; + mask |= MASK_SUBTYPES | MASK_RX_FREQ | MASK_RF_POWER; + break; case PULSES_OFF: break; default: @@ -516,16 +523,16 @@ void ModulePanel::update() } // R9M options - ui->r9mPower->setVisible(mask & MASK_R9M); - ui->label_r9mPower->setVisible(mask & MASK_R9M); + ui->r9mPower->setVisible(mask & MASK_RF_POWER); + ui->label_r9mPower->setVisible(mask & MASK_RF_POWER); ui->warning_r9mPower->setVisible((mask & MASK_R9M) && module.subType == MODULE_SUBTYPE_R9M_EU); ui->warning_r9mFlex->setVisible((mask & MASK_R9M) && module.subType > MODULE_SUBTYPE_R9M_EU); - if (mask & MASK_R9M) { + if (mask & MASK_RF_POWER) { const QSignalBlocker blocker(ui->r9mPower); ui->r9mPower->clear(); - ui->r9mPower->addItems(ModuleData::powerValueStrings(module.subType, firmware)); - ui->r9mPower->setCurrentIndex(module.pxx.power); + ui->r9mPower->addItems(ModuleData::powerValueStrings(protocol, module.subType, firmware)); + ui->r9mPower->setCurrentIndex(mask & MASK_R9M ? module.pxx.power : module.afhds3.rfPower); } // module subtype @@ -542,6 +549,9 @@ void ModulePanel::update() if (firmware->getCapability(HasModuleR9MFlex)) i = 2; break; + case PULSES_AFHDS3: + numEntries = 4; + break; default: break; } @@ -606,6 +616,8 @@ void ModulePanel::update() // Failsafes ui->label_failsafeMode->setVisible(mask & MASK_FAILSAFES); ui->failsafeMode->setVisible(mask & MASK_FAILSAFES); + //hide reciever mode for afhds3 + qobject_cast(ui->failsafeMode->view())->setRowHidden(FAILSAFE_RECEIVER, protocol == PULSES_AFHDS3); if ((mask & MASK_FAILSAFES) && module.failsafeMode == FAILSAFE_CUSTOM) { if (ui->failsafesGroupBox->isHidden()) { @@ -635,6 +647,9 @@ void ModulePanel::update() } } } + + ui->label_rxFreq->setVisible((mask & MASK_RX_FREQ)); + ui->rxFreq->setVisible((mask & MASK_RX_FREQ)); } void ModulePanel::on_trainerMode_currentIndexChanged(int index) @@ -666,9 +681,14 @@ void ModulePanel::on_ppmPolarity_currentIndexChanged(int index) void ModulePanel::on_r9mPower_currentIndexChanged(int index) { - if (!lock && module.pxx.power != (unsigned int)index) { - module.pxx.power = index; - emit modified(); + if (!lock) { + + if (module.protocol == PULSES_AFHDS3 && module.afhds3.rfPower != (unsigned int)index) { + module.afhds3.rfPower = index; + emit modified(); + } + else if(module.pxx.power != (unsigned int)index) + module.pxx.power = index; } } @@ -766,12 +786,21 @@ void ModulePanel::onSubTypeChanged() if (!lock && module.subType != type) { lock=true; module.subType = type; - update(); + if (module.protocol != PULSES_AFHDS3) { + update(); + } emit modified(); lock = false; } } +void ModulePanel::onRfFreqChanged(int freq) { + if (module.afhds3.rxFreq != (unsigned int)freq) { + module.afhds3.rxFreq = (unsigned int)freq; + emit modified(); + } +} + void ModulePanel::on_disableTelem_stateChanged(int state) { module.multi.disableTelemetry = (state == Qt::Checked); diff --git a/companion/src/modeledit/setup.h b/companion/src/modeledit/setup.h index 1470e4e2f..fbd56ed86 100644 --- a/companion/src/modeledit/setup.h +++ b/companion/src/modeledit/setup.h @@ -97,6 +97,7 @@ class ModulePanel : public ModelPanel void onFailsafeUsecChanged(int value); void onFailsafePercentChanged(double value); void onFailsafesDisplayValueTypeChanged(int type); + void onRfFreqChanged(int freq); void updateFailsafe(unsigned channel); void on_optionValue_editingFinished(); void onClearAccessRxClicked(); diff --git a/companion/src/modeledit/setup_module.ui b/companion/src/modeledit/setup_module.ui index c0a54d024..654af2a54 100644 --- a/companion/src/modeledit/setup_module.ui +++ b/companion/src/modeledit/setup_module.ui @@ -126,6 +126,12 @@ 0 + + + 100 + 0 + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -173,6 +179,15 @@ 0 + + + 100 + 0 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + @@ -214,6 +229,12 @@ 0 + + + 100 + 0 + + QComboBox::AdjustToContents @@ -417,6 +438,7 @@ + @@ -485,6 +507,12 @@ 0 + + + 80 + 0 + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -529,6 +557,12 @@ 0 + + + 80 + 0 + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -573,6 +607,15 @@ 0 + + + 80 + 0 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + ms @@ -617,19 +660,58 @@ 0 + + + 80 + 0 + + QComboBox::AdjustToContents + + + + RX Frequency + + + + + + Option value + + + + + + + + 0 + 0 + + + + + 80 + 0 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + Output type - + @@ -652,21 +734,7 @@ - - - - Option value - - - - - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - + Qt::Horizontal @@ -679,6 +747,34 @@ + + + + + 0 + 0 + + + + + 80 + 0 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + Hz + + + 50 + + + 400 + + + @@ -711,11 +807,17 @@ - + 0 0 + + + 180 + 0 + + QComboBox::AdjustToContents @@ -754,11 +856,17 @@ - + 0 0 + + + 150 + 0 + + QComboBox::AdjustToContents @@ -774,11 +882,17 @@ - + 0 0 + + + 150 + 0 + + QComboBox::AdjustToContents @@ -847,11 +961,17 @@ - + 0 0 + + + 150 + 0 + + QComboBox::AdjustToContents @@ -901,11 +1021,17 @@ - + 0 0 + + + 150 + 0 + + QComboBox::AdjustToContents @@ -934,17 +1060,17 @@ Master/SBUS in battery compartment - + Master/Bluetooth - + Slave/Bluetooth - + Master/Multi diff --git a/companion/src/modelprinter.cpp b/companion/src/modelprinter.cpp index dde8517e0..1d1881a75 100644 --- a/companion/src/modelprinter.cpp +++ b/companion/src/modelprinter.cpp @@ -224,6 +224,11 @@ QString ModelPrinter::printModule(int idx) str << printLabelValue(tr("Sub Type"), module.subTypeToString()); str << printLabelValue(tr("RF Output Power"), module.powerValueToString(firmware)); } + if (module.protocol == PULSES_AFHDS3) { + str << printLabelValue(tr("Output Type"), module.subTypeToString()); + str << printLabelValue(tr("RF Output Power"), module.powerValueToString(firmware)); + str << printLabelValue(tr("RX Output Frequency"), QString("%1Hz").arg(module.afhds3.rxFreq)); + } } } result = str.join(" "); diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index f67d0cb07..d47b0eeae 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -269,7 +269,8 @@ enum TelemetryProtocol PROTOCOL_TELEMETRY_HITEC, PROTOCOL_TELEMETRY_HOTT, PROTOCOL_TELEMETRY_MULTIMODULE, - PROTOCOL_TELEMETRY_LAST=PROTOCOL_TELEMETRY_MULTIMODULE, + PROTOCOL_TELEMETRY_AFHDS3, + PROTOCOL_TELEMETRY_LAST=PROTOCOL_TELEMETRY_AFHDS3, PROTOCOL_TELEMETRY_LUA }; diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 9ff05975a..f164b1ce2 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -454,6 +454,24 @@ PACK(struct ModuleData { uint8_t receivers; // 5 bits spare char receiverName[PXX2_MAX_RECEIVERS_PER_MODULE][PXX2_LEN_RX_NAME]; }) pxx2); + NOBACKUP(PACK(struct { + uint8_t bindPower:3; + uint8_t runPower:3; + uint8_t emi:1; + uint8_t telemetry:1; + uint16_t failsafeTimeout; + uint8_t rx_freq[2]; + uint16_t rxFreq() + { + return (uint16_t)rx_freq[0] | (((uint16_t)rx_freq[1]) << 8); + } + + void setRxFreq(uint16_t value) + { + rx_freq[0] = value & 0xFF; + rx_freq[1] = value >> 8; + } + } afhds3)); }; // Helper functions to set both of the rfProto protocol at the same time diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 47b8e4958..658a90a4e 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -118,12 +118,22 @@ enum MenuModelSetupItems { ITEM_MODEL_SETUP_EXTERNAL_MODULE_SUBTYPE, ITEM_MODEL_SETUP_EXTERNAL_MODULE_STATUS, ITEM_MODEL_SETUP_EXTERNAL_MODULE_SYNCSTATUS, +#endif +#if defined(AFHDS3) + ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS_PROTOCOL, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_MODE, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_STATUS, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_POWER_STATUS, #endif ITEM_MODEL_SETUP_EXTERNAL_MODULE_CHANNELS, ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE, ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_MODEL_NUM, #if defined(PCBSKY9X) && defined(REVX) ITEM_MODEL_SETUP_EXTERNAL_MODULE_OUTPUT_TYPE, +#endif +#if defined(AFHDS3) + ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_RX_FREQ, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_ACTUAL_POWER, #endif ITEM_MODEL_SETUP_EXTERNAL_MODULE_POWER, ITEM_MODEL_SETUP_EXTERNAL_MODULE_OPTIONS, @@ -132,6 +142,7 @@ enum MenuModelSetupItems { ITEM_MODEL_SETUP_EXTERNAL_MODULE_DISABLE_TELEM, ITEM_MODEL_SETUP_EXTERNAL_MODULE_DISABLE_MAPPING, #endif + ITEM_MODEL_SETUP_EXTERNAL_MODULE_FAILSAFE, ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_REGISTER_RANGE, ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_OPTIONS, @@ -204,11 +215,6 @@ inline uint8_t MODULE_TYPE_ROWS(int moduleIdx) { if (isModuleXJT(moduleIdx) || isModuleR9MNonAccess(moduleIdx) || isModuleDSM2(moduleIdx)) return 1; -#if defined(MULTIMODULE) - else if (isModuleMultimodule(moduleIdx)) { - return 0; - } -#endif else return 0; } @@ -300,6 +306,9 @@ void onBluetoothConnectMenu(const char * result) #if defined(PXX2) #include "common/stdlcd/model_setup_pxx2.cpp" #endif +#if defined(AFHDS3) +#include "common/stdlcd/model_setup_afhds3.cpp" +#endif #if defined(HARDWARE_INTERNAL_MODULE) #define INTERNAL_MODULE_ROWS \ @@ -364,9 +373,12 @@ void menuModelSetup(event_t event) MULTIMODULE_TYPE_ROWS(EXTERNAL_MODULE) // PROTOCOL MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) // SUBTYPE MULTIMODULE_STATUS_ROWS(EXTERNAL_MODULE) + AFHDS3_PROTOCOL_ROW(EXTERNAL_MODULE) + AFHDS3_MODE_ROWS(EXTERNAL_MODULE) MODULE_CHANNELS_ROWS(EXTERNAL_MODULE), IF_NOT_ACCESS_MODULE_RF(EXTERNAL_MODULE, MODULE_BIND_ROWS(EXTERNAL_MODULE)), // line reused for PPM: PPM settings IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // RxNum + AFHDS3_MODULE_ROWS(EXTERNAL_MODULE) MODULE_POWER_ROW(EXTERNAL_MODULE), IF_NOT_PXX2_MODULE(EXTERNAL_MODULE, MODULE_OPTION_ROW(EXTERNAL_MODULE)), MULTIMODULE_MODULE_ROWS(EXTERNAL_MODULE) @@ -406,6 +418,7 @@ void menuModelSetup(event_t event) MODULE_TYPE_ROWS(EXTERNAL_MODULE), MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) MULTIMODULE_STATUS_ROWS(EXTERNAL_MODULE) + MODULE_CHANNELS_ROWS(EXTERNAL_MODULE), IF_NOT_ACCESS_MODULE_RF(EXTERNAL_MODULE, MODULE_BIND_ROWS(EXTERNAL_MODULE)), // line reused for PPM: PPM settings IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // RxNum @@ -1047,6 +1060,21 @@ void menuModelSetup(event_t event) break; #endif +#if defined(AFHDS3) + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS_PROTOCOL: + lcdDrawTextAlignedLeft(y, TR_PROTO); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_AFHDS3_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].subType, attr); + if (attr && s_editMode > 0 && menuHorizontalPosition == 0) { + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].subType, AFHDS_SUBTYPE_FIRST, AFHDS_SUBTYPE_LAST); + } + break; + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_MODE: + lcdDrawText(INDENT_WIDTH, y, TR_TELEMETRY_TYPE); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, + g_model.moduleData[EXTERNAL_MODULE].afhds3.telemetry ? STR_AFHDS3_ONE_TO_ONE_TELEMETRY : TR_AFHDS3_ONE_TO_MANY); + break; +#endif + #if defined(PCBTARANIS) case ITEM_MODEL_SETUP_TRAINER_LABEL: lcdDrawTextAlignedLeft(y, STR_TRAINER); @@ -1352,7 +1380,7 @@ void menuModelSetup(event_t event) if (attr && l_posHorz > 0) { if (s_editMode > 0) { if (l_posHorz == 1) { - if (isModuleR9MNonAccess(moduleIdx) || isModuleD16(moduleIdx)) { + if (isModuleR9MNonAccess(moduleIdx) || isModuleD16(moduleIdx) || isModuleAFHDS3(moduleIdx)) { #if defined(PCBXLITE) if (EVT_KEY_MASK(event) == KEY_ENTER) { #elif defined(NAVIGATION_9X) @@ -1361,6 +1389,12 @@ void menuModelSetup(event_t event) if (event == EVT_KEY_BREAK(KEY_ENTER)) { #endif killEvents(event); +#if defined(AFHDS3) + if (isModuleAFHDS3(moduleIdx)) { + startBindMenuAfhds3(moduleIdx); + continue; + } +#endif startBindMenu(moduleIdx); continue; } @@ -1604,6 +1638,14 @@ void menuModelSetup(event_t event) module.multi.lowPowerMode = editCheckBox(module.multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, IS_RX_MULTI(moduleIdx) ? STR_MULTI_LNA_DISABLE : STR_MULTI_LOWPOWER, attr, event); } #endif +#if defined(AFHDS3) + else if (isModuleAFHDS3(EXTERNAL_MODULE)) { + lcdDrawText(INDENT_WIDTH, y, STR_RFPOWER); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_AFHDS3_POWERS, g_model.moduleData[EXTERNAL_MODULE].afhds3.runPower, LEFT | attr); + if (attr) + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].afhds3.runPower, afhds3::RUN_POWER::RUN_POWER_FIRST, afhds3::RUN_POWER::RUN_POWER_LAST); + } +#endif } break; @@ -1630,7 +1672,25 @@ void menuModelSetup(event_t event) case ITEM_MODEL_SETUP_EXTERNAL_MODULE_DISABLE_MAPPING: g_model.moduleData[moduleIdx].multi.disableMapping = editCheckBox(g_model.moduleData[moduleIdx].multi.disableMapping, MODEL_SETUP_2ND_COLUMN, y, INDENT TR_DISABLE_CH_MAP, attr, event); break; +#endif +#if defined(AFHDS3) + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_RX_FREQ: + lcdDrawText(INDENT_WIDTH, y, STR_AFHDS3_RX_FREQ); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[EXTERNAL_MODULE].afhds3.rxFreq(), attr | LEFT); + if (attr) { + uint16_t rxFreq = g_model.moduleData[EXTERNAL_MODULE].afhds3.rxFreq(); + CHECK_INCDEC_MODELVAR(event, rxFreq, MIN_FREQ, MAX_FREQ); + g_model.moduleData[EXTERNAL_MODULE].afhds3.setRxFreq(rxFreq); + } + break; + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_ACTUAL_POWER: + lcdDrawText(INDENT_WIDTH, y, STR_AFHDS3_ACTUAL_POWER); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_AFHDS3_POWERS, actualAfhdsRunPower(EXTERNAL_MODULE), LEFT); + break; +#endif + +#if defined(MULTIMODULE) #if defined(HARDWARE_INTERNAL_MODULE) case ITEM_MODEL_SETUP_INTERNAL_MODULE_STATUS: #endif @@ -1638,7 +1698,7 @@ void menuModelSetup(event_t event) lcdDrawTextAlignedLeft(y, STR_MODULE_STATUS); char statusText[64]; - getMultiModuleStatus(moduleIdx).getStatusString(statusText); + getModuleStatusString(moduleIdx, statusText); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, statusText); break; } @@ -1647,9 +1707,26 @@ void menuModelSetup(event_t event) #endif case ITEM_MODEL_SETUP_EXTERNAL_MODULE_SYNCSTATUS: { lcdDrawTextAlignedLeft(y, STR_MODULE_SYNC); + char statusText[64]; + getModuleSyncStatusString(moduleIdx, statusText); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, statusText); + break; + } +#endif + +#if defined(AFHDS3) + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_STATUS: { + lcdDrawTextAlignedLeft(y, STR_MODULE_STATUS); char statusText[64]; - getMultiSyncStatus(moduleIdx).getRefreshString(statusText); + getModuleStatusString(moduleIdx, statusText); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, statusText); + break; + } + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_POWER_STATUS: { + lcdDrawText(INDENT_WIDTH, y, STR_AFHDS3_POWER_SOURCE); + char statusText[64]; + getModuleSyncStatusString(moduleIdx, statusText); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, statusText); break; } diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index f2933d5b7..e6d8758e2 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -101,6 +101,11 @@ enum MenuModelSetupItems { ITEM_MODEL_SETUP_EXTERNAL_MODULE_PROTOCOL, ITEM_MODEL_SETUP_EXTERNAL_MODULE_STATUS, ITEM_MODEL_SETUP_EXTERNAL_MODULE_SYNCSTATUS, +#endif +#if defined(AFHDS3) + ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_MODE, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_STATUS, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_POWER_STATUS, #endif ITEM_MODEL_SETUP_EXTERNAL_MODULE_CHANNELS, ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE, @@ -110,6 +115,10 @@ enum MenuModelSetupItems { ITEM_MODEL_SETUP_EXTERNAL_MODULE_AUTOBIND, ITEM_MODEL_SETUP_EXTERNAL_MODULE_DISABLE_TELEM, ITEM_MODEL_SETUP_EXTERNAL_MODULE_DISABLE_MAPPING, +#endif +#if defined(AFHDS3) + ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_RX_FREQ, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_ACTUAL_POWER, #endif ITEM_MODEL_SETUP_EXTERNAL_MODULE_POWER, ITEM_MODEL_SETUP_EXTERNAL_MODULE_FAILSAFE, @@ -247,7 +256,7 @@ void editTimerCountdown(int timerIdx, coord_t y, LcdFlags attr, event_t event) inline uint8_t EXTERNAL_MODULE_TYPE_ROW() { - if (isModuleXJT(EXTERNAL_MODULE) || isModuleR9MNonAccess(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE)) + if (isModuleXJT(EXTERNAL_MODULE) || isModuleR9MNonAccess(EXTERNAL_MODULE) || isModuleDSM2(EXTERNAL_MODULE) || isModuleAFHDS3(EXTERNAL_MODULE)) return 1; else return 0; @@ -304,6 +313,10 @@ void onBluetoothConnectMenu(const char * result) #if defined(PXX2) #include "common/stdlcd/model_setup_pxx2.cpp" #endif +#if defined(AFHDS3) +#include "common/stdlcd/model_setup_afhds3.cpp" +#endif + void menuModelSetup(event_t event) { @@ -360,11 +373,13 @@ void menuModelSetup(event_t event) EXTERNAL_MODULE_TYPE_ROW(), MULTIMODULE_TYPE_ROW(EXTERNAL_MODULE) MULTIMODULE_STATUS_ROWS(EXTERNAL_MODULE) + AFHDS3_MODE_ROWS(EXTERNAL_MODULE) MODULE_CHANNELS_ROWS(EXTERNAL_MODULE), IF_NOT_ACCESS_MODULE_RF(EXTERNAL_MODULE, MODULE_BIND_ROWS(EXTERNAL_MODULE)), IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // RxNum for ACCESS IF_NOT_PXX2_MODULE(EXTERNAL_MODULE, MODULE_OPTION_ROW(EXTERNAL_MODULE)), MULTIMODULE_MODULE_ROWS(EXTERNAL_MODULE) + AFHDS3_MODULE_ROWS(EXTERNAL_MODULE) MODULE_POWER_ROW(EXTERNAL_MODULE), FAILSAFE_ROWS(EXTERNAL_MODULE), IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 1), // Range check and Register buttons @@ -810,6 +825,11 @@ void menuModelSetup(event_t event) lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0); else if (isModuleR9MNonAccess(EXTERNAL_MODULE)) lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0)); +#if defined(AFHDS3) + else if (isModuleAFHDS3(EXTERNAL_MODULE)) { + lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_AFHDS3_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0)); + } +#endif if (attr && menuHorizontalPosition == 0) { if (s_editMode > 0) { g_model.moduleData[EXTERNAL_MODULE].type = MODULE_TYPE_NONE; @@ -850,6 +870,11 @@ void menuModelSetup(event_t event) MODULE_SUBTYPE_R9M_FCC, MODULE_SUBTYPE_R9M_LAST, EE_MODEL, isR9MModeAvailable); } +#if defined(AFHDS3) + else if (isModuleAFHDS3(EXTERNAL_MODULE)) { + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, AFHDS_SUBTYPE_FIRST, AFHDS_SUBTYPE_LAST); + } +#endif else { g_model.moduleData[EXTERNAL_MODULE].subType = checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].subType, MODULE_SUBTYPE_PXX1_ACCST_D16, MODULE_SUBTYPE_PXX1_LAST, EE_MODEL, @@ -898,6 +923,7 @@ void menuModelSetup(event_t event) case ITEM_MODEL_SETUP_EXTERNAL_MODULE_PROTOCOL: { lcdDrawTextAlignedLeft(y, TR_TYPE); + uint8_t multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(); lcdDrawMultiProtocolString(MODEL_SETUP_2ND_COLUMN, y, EXTERNAL_MODULE, multi_rfProto, menuHorizontalPosition == 0 ? attr : 0); if (MULTIMODULE_HAS_SUBTYPE(EXTERNAL_MODULE)) @@ -946,7 +972,6 @@ void menuModelSetup(event_t event) } break; #endif - case ITEM_MODEL_SETUP_TRAINER_LABEL: lcdDrawTextAlignedLeft(y, STR_TRAINER); break; @@ -1170,8 +1195,14 @@ void menuModelSetup(event_t event) if (attr && l_posHorz > 0) { if (s_editMode > 0) { if (l_posHorz == 1) { - if (isModuleR9MNonAccess(moduleIdx) || isModuleD16(moduleIdx)) { + if (isModuleR9MNonAccess(moduleIdx) || isModuleD16(moduleIdx) || isModuleAFHDS3(moduleIdx)) { if (event == EVT_KEY_BREAK(KEY_ENTER)) { +#if defined(AFHDS3) + if (isModuleAFHDS3(moduleIdx)) { + startBindMenuAfhds3(moduleIdx); + continue; + } +#endif startBindMenu(moduleIdx); continue; } @@ -1327,6 +1358,14 @@ void menuModelSetup(event_t event) else if (isModuleMultimodule(moduleIdx)) { g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, IS_RX_MULTI(moduleIdx) ? STR_MULTI_LNA_DISABLE : STR_MULTI_LOWPOWER, attr, event); } +#endif +#if defined(AFHDS3) + else if (isModuleAFHDS3(EXTERNAL_MODULE)) { + lcdDrawText(INDENT_WIDTH, y, STR_RFPOWER); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_AFHDS3_POWERS, g_model.moduleData[EXTERNAL_MODULE].afhds3.runPower, LEFT | attr); + if (attr) + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].afhds3.runPower, afhds3::RUN_POWER::RUN_POWER_FIRST, afhds3::RUN_POWER::RUN_POWER_LAST); + } #endif break; } @@ -1346,26 +1385,68 @@ void menuModelSetup(event_t event) case ITEM_MODEL_SETUP_EXTERNAL_MODULE_DISABLE_MAPPING: g_model.moduleData[EXTERNAL_MODULE].multi.disableMapping = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.disableMapping, MODEL_SETUP_2ND_COLUMN, y, INDENT TR_DISABLE_CH_MAP, attr, event); break; +#endif +#if defined(AFHDS3) + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_RX_FREQ: + lcdDrawText(INDENT_WIDTH, y, STR_AFHDS3_RX_FREQ); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[EXTERNAL_MODULE].afhds3.rxFreq(), attr | LEFT); + if (attr) { + uint16_t rxFreq = g_model.moduleData[EXTERNAL_MODULE].afhds3.rxFreq(); + CHECK_INCDEC_MODELVAR(event, rxFreq, MIN_FREQ, MAX_FREQ); + g_model.moduleData[EXTERNAL_MODULE].afhds3.setRxFreq(rxFreq); + } + break; + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_ACTUAL_POWER: + lcdDrawText(INDENT_WIDTH, y, STR_AFHDS3_ACTUAL_POWER); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_AFHDS3_POWERS, actualAfhdsRunPower(EXTERNAL_MODULE), LEFT); + break; +#endif + +#if defined (MULTIMODULE) case ITEM_MODEL_SETUP_EXTERNAL_MODULE_STATUS: { - lcdDrawTextAlignedLeft(y, STR_MODULE_STATUS); + lcdDrawText(INDENT_WIDTH, y, STR_MODULE_STATUS); char statusText[64]; - getMultiModuleStatus(EXTERNAL_MODULE).getStatusString(statusText); + getModuleStatusString(EXTERNAL_MODULE, statusText); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, statusText); break; } - case ITEM_MODEL_SETUP_EXTERNAL_MODULE_SYNCSTATUS: { - lcdDrawTextAlignedLeft(y, STR_MODULE_SYNC); + lcdDrawText(INDENT_WIDTH, y, STR_MODULE_SYNC); char statusText[64]; - getMultiSyncStatus(EXTERNAL_MODULE).getRefreshString(statusText); + getModuleSyncStatusString(EXTERNAL_MODULE, statusText); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, statusText); break; } #endif +#if defined (AFHDS3) + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_MODE: + lcdDrawTextAlignedLeft(y, STR_TYPE); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, + g_model.moduleData[EXTERNAL_MODULE].afhds3.telemetry ? STR_AFHDS3_ONE_TO_ONE_TELEMETRY : TR_AFHDS3_ONE_TO_MANY); + break; + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_STATUS: + { + lcdDrawTextAlignedLeft(y, TR_MODULE_STATUS); + char statusText[64]; + getModuleStatusString(EXTERNAL_MODULE, statusText); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, statusText); + break; + } + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_POWER_STATUS: + { + lcdDrawText(INDENT_WIDTH, y, STR_AFHDS3_POWER_SOURCE); + char statusText[64]; + getModuleSyncStatusString(EXTERNAL_MODULE, statusText); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, statusText); + break; + } +#endif + + #if defined(PXX2) case ITEM_MODEL_SETUP_REGISTRATION_ID: lcdDrawTextAlignedLeft(y, STR_REG_ID); diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index 191813f38..ebda41874 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -98,6 +98,11 @@ enum MenuModelSetupItems { #if defined(MULTIMODULE) ITEM_MODEL_SETUP_EXTERNAL_MODULE_STATUS, ITEM_MODEL_SETUP_EXTERNAL_MODULE_SYNCSTATUS, +#endif +#if defined(AFHDS3) + ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_MODE, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_STATUS, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_POWER_STATUS, #endif ITEM_MODEL_SETUP_EXTERNAL_MODULE_CHANNELS, ITEM_MODEL_SETUP_EXTERNAL_MODULE_NOT_ACCESS_RXNUM_BIND_RANGE, @@ -107,6 +112,10 @@ enum MenuModelSetupItems { ITEM_MODEL_SETUP_EXTERNAL_MODULE_AUTOBIND, ITEM_MODEL_SETUP_EXTERNAL_MODULE_DISABLE_TELEM, ITEM_MODEL_SETUP_EXTERNAL_MODULE_DISABLE_MAPPING, +#endif +#if defined(AFHDS3) + ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_RX_FREQ, + ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_ACTUAL_POWER, #endif ITEM_MODEL_SETUP_EXTERNAL_MODULE_POWER, ITEM_MODEL_SETUP_EXTERNAL_MODULE_FAILSAFE, @@ -115,7 +124,6 @@ enum MenuModelSetupItems { ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_RECEIVER_1, ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_RECEIVER_2, ITEM_MODEL_SETUP_EXTERNAL_MODULE_PXX2_RECEIVER_3, - ITEM_MODEL_SETUP_TRAINER_LABEL, ITEM_MODEL_SETUP_TRAINER_MODE, #if defined(BLUETOOTH) @@ -156,6 +164,10 @@ void onBluetoothConnectMenu(const char * result) #include "common/stdlcd/model_setup_pxx1.cpp" +#if defined(AFHDS3) +#include "common/stdlcd/model_setup_afhds3.cpp" +#endif + void onPXX2R9MBindModeMenu(const char * result) { if (result == STR_16CH_WITH_TELEMETRY) { @@ -502,7 +514,7 @@ int getSwitchWarningsCount() inline uint8_t MODULE_TYPE_ROWS(int moduleIdx) { - if (isModuleXJT(moduleIdx) || isModuleR9MNonAccess(moduleIdx) || isModuleDSM2(moduleIdx) || isModulePXX2(moduleIdx)) + if (isModuleXJT(moduleIdx) || isModuleR9MNonAccess(moduleIdx) || isModuleDSM2(moduleIdx) || isModulePXX2(moduleIdx) || isModuleAFHDS3(moduleIdx)) return 1; #if defined(MULTIMODULE) else if (isModuleMultimodule(moduleIdx)) { @@ -622,11 +634,13 @@ bool menuModelSetup(event_t event) LABEL(ExternalModule), MODULE_TYPE_ROWS(EXTERNAL_MODULE), MULTIMODULE_STATUS_ROWS(EXTERNAL_MODULE) + AFHDS3_MODE_ROWS(EXTERNAL_MODULE) MODULE_CHANNELS_ROWS(EXTERNAL_MODULE), IF_NOT_ACCESS_MODULE_RF(EXTERNAL_MODULE, MODULE_BIND_ROWS(EXTERNAL_MODULE)), IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 0), // RxNum for ACCESS IF_NOT_PXX2_MODULE(EXTERNAL_MODULE, MODULE_OPTION_ROW(EXTERNAL_MODULE)), MULTIMODULE_MODULE_ROWS(EXTERNAL_MODULE) + AFHDS3_MODULE_ROWS(EXTERNAL_MODULE) MODULE_POWER_ROW(EXTERNAL_MODULE), FAILSAFE_ROWS(EXTERNAL_MODULE), IF_ACCESS_MODULE_RF(EXTERNAL_MODULE, 1), // Range check and Register buttons @@ -1074,6 +1088,11 @@ bool menuModelSetup(event_t event) if (MULTIMODULE_HAS_SUBTYPE(moduleIdx)) lcdDrawMultiSubProtocolString(MODEL_SETUP_4TH_COLUMN, y, moduleIdx, g_model.moduleData[moduleIdx].subType, menuHorizontalPosition==2 ? attr : 0); } +#endif +#if defined(AFHDS3) + else if (isModuleAFHDS3(moduleIdx)) { + lcdDrawTextAtIndex(lcdNextPos + 15, y, STR_AFHDS3_PROTOCOLS, g_model.moduleData[moduleIdx].subType, (menuHorizontalPosition==1 ? attr : 0)); + } #endif if (attr && menuHorizontalPosition == 0 && moduleIdx == EXTERNAL_MODULE) { if (s_editMode > 0) { @@ -1143,6 +1162,11 @@ bool menuModelSetup(event_t event) g_model.moduleData[moduleIdx].subType = checkIncDec(event, g_model.moduleData[moduleIdx].subType, MODULE_SUBTYPE_R9M_FCC, MODULE_SUBTYPE_R9M_LAST, EE_MODEL, isR9MModeAvailable); } +#if defined(AFHDS3) + else if (isModuleAFHDS3(moduleIdx)) { + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].subType, AFHDS_SUBTYPE_FIRST, AFHDS_SUBTYPE_LAST); + } +#endif else { CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].subType, MODULE_SUBTYPE_PXX1_ACCST_D16, MODULE_SUBTYPE_PXX1_LAST); } @@ -1552,8 +1576,14 @@ bool menuModelSetup(event_t event) if (attr && l_posHorz>0) { if (s_editMode>0) { if (l_posHorz == 1) { - if (isModuleR9MNonAccess(moduleIdx) || isModuleD16(moduleIdx)) { + if (isModuleR9MNonAccess(moduleIdx) || isModuleD16(moduleIdx) || isModuleAFHDS3(moduleIdx)) { if (event == EVT_KEY_BREAK(KEY_ENTER)) { +#if defined(AFHDS3) + if (isModuleAFHDS3(moduleIdx)) { + startBindMenuAfhds3(moduleIdx); + continue; + } +#endif startBindMenu(moduleIdx); continue; } @@ -1707,6 +1737,14 @@ bool menuModelSetup(event_t event) lcdDrawText(MENUS_MARGIN_LEFT, y, IS_RX_MULTI(moduleIdx) ? STR_MULTI_LNA_DISABLE : STR_MULTI_LOWPOWER); g_model.moduleData[moduleIdx].multi.lowPowerMode = editCheckBox(g_model.moduleData[moduleIdx].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, attr, event); } +#endif +#if defined(AFHDS3) + else if (isModuleAFHDS3(moduleIdx)) { + lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_RFPOWER); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_AFHDS3_POWERS, g_model.moduleData[moduleIdx].afhds3.runPower, LEFT | attr); + if (attr) + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].afhds3.runPower, afhds3::RUN_POWER::RUN_POWER_FIRST, afhds3::RUN_POWER::RUN_POWER_LAST); + } #endif } break; @@ -1722,7 +1760,6 @@ bool menuModelSetup(event_t event) lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_AUTOBIND); g_model.moduleData[moduleIdx].multi.autoBindMode = editCheckBox(g_model.moduleData[moduleIdx].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, attr, event); break; - #if defined(HARDWARE_INTERNAL_MODULE) case ITEM_MODEL_SETUP_INTERNAL_MODULE_DISABLE_TELEM: #endif @@ -1730,7 +1767,6 @@ bool menuModelSetup(event_t event) lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_DISABLE_TELEM); g_model.moduleData[moduleIdx].multi.disableTelemetry = editCheckBox(g_model.moduleData[moduleIdx].multi.disableTelemetry, MODEL_SETUP_2ND_COLUMN, y, attr, event); break; - #if defined(HARDWARE_INTERNAL_MODULE) case ITEM_MODEL_SETUP_INTERNAL_MODULE_DISABLE_MAPPING: #endif @@ -1738,29 +1774,65 @@ bool menuModelSetup(event_t event) lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_DISABLE_CH_MAP); g_model.moduleData[moduleIdx].multi.disableMapping = editCheckBox(g_model.moduleData[moduleIdx].multi.disableMapping, MODEL_SETUP_2ND_COLUMN, y, attr, event); break; +#endif +#if defined(AFHDS3) + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_MODE: + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_TYPE); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, + g_model.moduleData[EXTERNAL_MODULE].afhds3.telemetry ? STR_AFHDS3_ONE_TO_ONE_TELEMETRY : TR_AFHDS3_ONE_TO_MANY); + break; + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_RX_FREQ: + lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_AFHDS3_RX_FREQ); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].afhds3.rxFreq(), attr | LEFT, 0, NULL, "Hz"); + if (attr) { + uint16_t rxFreq = g_model.moduleData[moduleIdx].afhds3.rxFreq(); + CHECK_INCDEC_MODELVAR(event, rxFreq, MIN_FREQ, MAX_FREQ); + g_model.moduleData[moduleIdx].afhds3.setRxFreq(rxFreq); + } + break; + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_ACTUAL_POWER: + lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_AFHDS3_ACTUAL_POWER); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_AFHDS3_POWERS, actualAfhdsRunPower(moduleIdx), LEFT); + break; +#endif + +#if defined(MULTIMODULE) || defined(AFHDS3) #if defined(HARDWARE_INTERNAL_MODULE) case ITEM_MODEL_SETUP_INTERNAL_MODULE_STATUS: +#endif +#if defined(AFHDS3) + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_STATUS: #endif case ITEM_MODEL_SETUP_EXTERNAL_MODULE_STATUS: { lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MODULE_STATUS); char statusText[64]; - getMultiModuleStatus(moduleIdx).getStatusString(statusText); + getModuleStatusString(moduleIdx, statusText); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, statusText); break; } #if defined(HARDWARE_INTERNAL_MODULE) case ITEM_MODEL_SETUP_INTERNAL_MODULE_SYNCSTATUS: +#endif +#if defined(AFHDS3) + case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_POWER_STATUS: #endif case ITEM_MODEL_SETUP_EXTERNAL_MODULE_SYNCSTATUS: { - lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MODULE_SYNC); - +#if defined(AFHDS3) + if (isModuleAFHDS3(moduleIdx)) { + lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_AFHDS3_POWER_SOURCE); + } + else +#endif + { + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MODULE_SYNC); + } char statusText[64]; - getMultiSyncStatus(moduleIdx).getRefreshString(statusText); + getModuleSyncStatusString(moduleIdx, statusText); lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, statusText); break; } diff --git a/radio/src/gui/common/stdlcd/model_setup_afhds3.cpp b/radio/src/gui/common/stdlcd/model_setup_afhds3.cpp new file mode 100644 index 000000000..a094ef83a --- /dev/null +++ b/radio/src/gui/common/stdlcd/model_setup_afhds3.cpp @@ -0,0 +1,48 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + + +void onBindMenuAfhds3(const char * result) +{ + uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition - HEADER_LINE); + + if (result == STR_AFHDS3_ONE_TO_ONE_TELEMETRY) { + g_model.moduleData[EXTERNAL_MODULE].afhds3.telemetry = 1; + } + else if (result == STR_AFHDS3_ONE_TO_MANY) { + g_model.moduleData[EXTERNAL_MODULE].afhds3.telemetry = 0; + } + else { + return; + } + + moduleState[moduleIdx].mode = MODULE_MODE_BIND; +} + +void startBindMenuAfhds3(uint8_t moduleIdx) +{ + uint8_t selection = 0; +#if defined(AFHDS3) + POPUP_MENU_ADD_ITEM(STR_AFHDS3_ONE_TO_ONE_TELEMETRY); + POPUP_MENU_ADD_ITEM(STR_AFHDS3_ONE_TO_MANY); +#endif + POPUP_MENU_SELECT_ITEM(selection); + POPUP_MENU_START(onBindMenuAfhds3); +} diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index 29666fd26..16929cc7e 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -551,6 +551,7 @@ bool isModuleUsingSport(uint8_t moduleBay, uint8_t moduleType) case MODULE_TYPE_ISRM_PXX2: case MODULE_TYPE_R9M_LITE_PXX2: case MODULE_TYPE_R9M_LITE_PRO_PXX2: + case MODULE_TYPE_AFHDS3: return false; case MODULE_TYPE_XJT_PXX1: @@ -663,6 +664,11 @@ bool isExternalModuleAvailable(int moduleType) return false; #endif +#if !defined(AFHDS3) + if (moduleType == MODULE_TYPE_AFHDS3) + return false; +#endif + return true; } @@ -708,6 +714,12 @@ bool isTelemetryProtocolAvailable(int protocol) } #endif +#if !defined(AFHDS3) + if (protocol == PROTOCOL_TELEMETRY_AFHDS3) { + return false; + } +#endif + #if defined(PCBHORUS) if (protocol == PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY) { return false; diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 8aa034226..c7229f5c7 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -147,7 +147,7 @@ inline uint8_t MODULE_BIND_ROWS(int moduleIdx) else return 2; } - else if (isModuleXJTD8(moduleIdx) || isModuleSBUS(moduleIdx)) { + else if (isModuleXJTD8(moduleIdx) || isModuleSBUS(moduleIdx) || isModuleAFHDS3(moduleIdx)) { return 1; } else if (isModulePPM(moduleIdx) || isModulePXX1(moduleIdx) || isModulePXX2(moduleIdx) || isModuleDSM2(moduleIdx)) { @@ -276,9 +276,10 @@ inline uint8_t MULTIMODULE_HASOPTIONS(uint8_t moduleIdx) #define MULTIMODULE_TYPE_ROWS(moduleIdx) isModuleMultimodule(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW, #define MULTIMODULE_SUBTYPE_ROWS(moduleIdx) isModuleMultimodule(moduleIdx) ? MULTIMODULE_RFPROTO_COLUMNS(moduleIdx) : HIDDEN_ROW, #define MULTIMODULE_OPTIONS_ROW(moduleIdx) (isModuleMultimodule(moduleIdx) && MULTIMODULE_HASOPTIONS(moduleIdx)) ? (uint8_t) 0: HIDDEN_ROW -#define MODULE_POWER_ROW(moduleIdx) (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) || isModuleR9MNonAccess(moduleIdx)) ? (isModuleR9MLiteNonPro(moduleIdx) ? (isModuleR9M_FCC_VARIANT(moduleIdx) ? READONLY_ROW : (uint8_t)0) : (uint8_t)0) : HIDDEN_ROW +#define MODULE_POWER_ROW(moduleIdx) (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) || isModuleR9MNonAccess(moduleIdx) || isModuleAFHDS3(moduleIdx)) ? (isModuleR9MLiteNonPro(moduleIdx) ? (isModuleR9M_FCC_VARIANT(moduleIdx) ? READONLY_ROW : (uint8_t)0) : (uint8_t)0) : HIDDEN_ROW #else +#define MULTIMODULE_TYPE_ROWS(moduleIdx) #define MULTIMODULE_STATUS_ROWS(moduleIdx) #define MULTIMODULE_MODULE_ROWS(moduleIdx) #define MULTIMODULE_TYPE_ROW(moduleIdx) @@ -286,11 +287,28 @@ inline uint8_t MULTIMODULE_HASOPTIONS(uint8_t moduleIdx) #define MULTIMODULE_TYPE_ROWS(moduleIdx) #define MULTIMODULE_MODE_ROWS(moduleIdx) (uint8_t)0 #define MULTIMODULE_OPTIONS_ROW(moduleIdx) HIDDEN_ROW -#define MODULE_POWER_ROW(moduleIdx) isModuleR9MNonAccess(moduleIdx) ? (isModuleR9MLiteNonPro(moduleIdx) ? (isModuleR9M_FCC_VARIANT(moduleIdx) ? READONLY_ROW : (uint8_t)0) : (uint8_t)0) : HIDDEN_ROW +#define MODULE_POWER_ROW(moduleIdx) isModuleR9MNonAccess(moduleIdx) || isModuleAFHDS3(moduleIdx) ? (isModuleR9MLiteNonPro(moduleIdx) ? (isModuleR9M_FCC_VARIANT(moduleIdx) ? READONLY_ROW : (uint8_t)0) : (uint8_t)0) : HIDDEN_ROW +#endif + +#if defined(AFHDS3) +#define AFHDS3_PROTOCOL_ROW(moduleIdx) isModuleAFHDS3(moduleIdx) ? TITLE_ROW : HIDDEN_ROW, +#define AFHDS3_MODE_ROWS(moduleIdx) isModuleAFHDS3(moduleIdx) ? TITLE_ROW : HIDDEN_ROW, isModuleAFHDS3(moduleIdx) ? TITLE_ROW : HIDDEN_ROW, isModuleAFHDS3(moduleIdx) ? TITLE_ROW : HIDDEN_ROW, +#define AFHDS3_MODULE_ROWS(moduleIdx) isModuleAFHDS3(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW, isModuleAFHDS3(moduleIdx) ? (uint8_t) TITLE_ROW : HIDDEN_ROW, +#else +#define AFHDS3_PROTOCOL_ROW(moduleIdx) +#define AFHDS3_MODE_ROWS(moduleIdx) +#define AFHDS3_MODULE_ROWS(moduleIdx) #endif #define FAILSAFE_ROWS(moduleIdx) isModuleFailsafeAvailable(moduleIdx) ? (g_model.moduleData[moduleIdx].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : HIDDEN_ROW -#define MODULE_OPTION_ROW(moduleIdx) (isModuleR9MNonAccess(moduleIdx) || isModuleSBUS(moduleIdx) ? TITLE_ROW : MULTIMODULE_OPTIONS_ROW(moduleIdx)) + +inline uint8_t MODULE_OPTION_ROW(uint8_t moduleIdx) { + if(isModuleR9MNonAccess(moduleIdx) || isModuleSBUS(moduleIdx)) + return TITLE_ROW; + if(isModuleAFHDS3(moduleIdx)) + return HIDDEN_ROW; + return MULTIMODULE_OPTIONS_ROW(moduleIdx); +} void editStickHardwareSettings(coord_t x, coord_t y, int idx, event_t event, LcdFlags flags); diff --git a/radio/src/pulses/afhds3.cpp b/radio/src/pulses/afhds3.cpp new file mode 100644 index 000000000..bd3f577a3 --- /dev/null +++ b/radio/src/pulses/afhds3.cpp @@ -0,0 +1,706 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "afhds3.h" +#include "../debug.h" +#include "../definitions.h" +#include + +#define FAILSAFE_HOLD 1 +#define FAILSAFE_CUSTOM 2 +#define MAX_RETRIES_AFHDS3 5 + +extern void processFlySkySensor(const uint8_t * packet, uint8_t type); + +extern void extmoduleSerialStart(uint32_t baudrate, uint32_t period_half_us, bool inverted); + +namespace afhds3 +{ + +static const char* const moduleStateText[] = +{ + "Not ready", + "HW Error", + "Binding", + "Connecting", + "Connected", + "Standby", + "Waiting for update", + "Updating", + "Updating RX", + "Updating RX failed", + "Testing", + "Ready", + "HW test" +}; + +static const char* const powerSourceText[] = +{ + "Unknown", + "Internal", + "External" +}; + +static const COMMAND periodicRequestCommands[] = +{ + COMMAND::MODULE_STATE, + COMMAND::MODULE_POWER_STATUS, + COMMAND::MODULE_GET_CONFIG, + COMMAND::VIRTUAL_FAILSAFE +}; + +//Address used in transmitted frames - it constrains of target address and source address +const uint8_t FrameAddress = DeviceAddress::TRANSMITTER | (DeviceAddress::MODULE << 4); + +//Static collection of afhds3 object instances by module +PulsesData* AFHDS3PulsesData[EXTERNAL_MODULE + 1] = { nullptr, nullptr }; + +//friends function that can access telemetry parsing method +void processTelemetryData(uint8_t module, uint8_t data, uint8_t* rxBuffer, uint8_t& rxBufferCount, uint8_t maxSize) +{ + if (AFHDS3PulsesData[module]) { + AFHDS3PulsesData[module]->processTelemetryData(data, rxBuffer, rxBufferCount, maxSize); + } +} + +void CommandFifo::clearCommandFifo() +{ + memclear(commandFifo, sizeof(commandFifo)); + setIndex = getIndex = 0; +} + +void CommandFifo::enqueueACK(COMMAND command, uint8_t frameNumber) +{ + uint32_t next = nextIndex(setIndex); + if (next != getIndex) { + commandFifo[setIndex].command = command; + commandFifo[setIndex].frameType = FRAME_TYPE::RESPONSE_ACK; + commandFifo[setIndex].payload = 0; + commandFifo[setIndex].payloadSize = 0; + commandFifo[setIndex].frameNumber = frameNumber; + commandFifo[setIndex].useFrameNumber = true; + setIndex = next; + } +} + +void CommandFifo::enqueue(COMMAND command, FRAME_TYPE frameType, bool useData, uint8_t byteContent) +{ + uint32_t next = nextIndex(setIndex); + if (next != getIndex) { + commandFifo[setIndex].command = command; + commandFifo[setIndex].frameType = frameType; + commandFifo[setIndex].payload = byteContent; + commandFifo[setIndex].payloadSize = useData ? 1 : 0; + commandFifo[setIndex].frameNumber = 0; + commandFifo[setIndex].useFrameNumber = false; + setIndex = next; + } +} + +void PulsesData::getStatusString(char * buffer) const +{ + strcpy(buffer, this->state <= ModuleState::STATE_READY ? moduleStateText[this->state] : "Unknown"); +} + +void PulsesData::getPowerStatus(char* buffer) const +{ + strcpy(buffer, this->powerSource <= MODULE_POWER_SOURCE::EXTERNAL ? powerSourceText[this->powerSource] : "Unknown"); +} + +void PulsesData::processTelemetryData(uint8_t byte, uint8_t* rxBuffer, uint8_t& rxBufferCount, uint8_t maxSize) +{ + if (rxBufferCount == 0 && byte != AfhdsSpecialChars::START) { + TRACE("AFHDS3 [SKIP] %02X", byte); + this->esc_state = 0; + return; + } + + if (byte == AfhdsSpecialChars::ESC) { + this->esc_state = rxBufferCount; + return; + } + + if (rxBufferCount > 1 && byte == AfhdsSpecialChars::END) { + rxBuffer[rxBufferCount++] = byte; + parseData(rxBuffer, rxBufferCount); + rxBufferCount = 0; + return; + } + + if (this->esc_state && byte == AfhdsSpecialChars::ESC_END) { + byte = AfhdsSpecialChars::END; + } + else if (esc_state && byte == AfhdsSpecialChars::ESC_ESC) { + byte = AfhdsSpecialChars::ESC; + } + //reset esc index + this->esc_state = 0; + + if (rxBufferCount >= maxSize) { + TRACE("AFHDS3 [BUFFER OVERFLOW]"); + rxBufferCount = 0; + } + rxBuffer[rxBufferCount++] = byte; +} + +bool PulsesData::isConnectedUnicast() +{ + return cfg.config.telemetry == TELEMETRY::TELEMETRY_ENABLED && this->state == ModuleState::STATE_SYNC_DONE; +} + +bool PulsesData::isConnectedMulticast() +{ + return cfg.config.telemetry == TELEMETRY::TELEMETRY_DISABLED && this->state == ModuleState::STATE_SYNC_RUNNING; +} + +void PulsesData::setupFrame() +{ + if (operationState == State::AWAITING_RESPONSE) { + if (repeatCount++ < MAX_RETRIES_AFHDS3) { + return; //re-send + } + else + { + TRACE("AFHDS3 [NO RESP] module state %d", this->state); + clearFrameData(); + this->state = ModuleState::STATE_NOT_READY; + } + } + else if (operationState == State::UNKNOWN) { + this->state = ModuleState::STATE_NOT_READY; + } + repeatCount = 0; + if (this->state == ModuleState::STATE_NOT_READY) { + TRACE("AFHDS3 [GET MODULE READY]"); + putFrame(COMMAND::MODULE_READY, FRAME_TYPE::REQUEST_GET_DATA); + return; + } + + //check waiting commands + if (!isEmpty()) { + Frame f = commandFifo[getIndex]; + putFrame(f.command, f.frameType, &f.payload, f.payloadSize, f.useFrameNumber ? &f.frameNumber : &frame_index); + getIndex = nextIndex(getIndex); + TRACE("AFHDS3 [CMD QUEUE] cmd: %d frameType %d, useFrameNumber %d frame Number %d size %d", f.command, f.frameType, f.useFrameNumber, f.frameNumber, f.payloadSize); + return; + } + + //config should be loaded already + if (syncSettings()) { + return; + } + + //if module is ready but not started + if (this->state == ModuleState::STATE_READY || this->state == ModuleState::STATE_STANDBY) { + cmdCount = 0; + repeatCount = 0; + requestInfoAndRun(true); + return; + } + + ::ModuleSettingsMode moduleMode = getModuleMode(module_index); + + if (moduleMode == ::ModuleSettingsMode::MODULE_MODE_BIND) { + if (state != STATE_BINDING) { + TRACE("AFHDS3 [BIND]"); + setConfigFromModel(); + putFrame(COMMAND::MODULE_SET_CONFIG, FRAME_TYPE::REQUEST_SET_EXPECT_DATA, cfg.buffer, sizeof(cfg.buffer)); + requestedModuleMode = MODULE_MODE_E::BIND; + enqueue(COMMAND::MODULE_MODE, FRAME_TYPE::REQUEST_SET_EXPECT_DATA, true, requestedModuleMode); + return; + } + } + else if (moduleMode == ::ModuleSettingsMode::MODULE_MODE_RANGECHECK) { + if (cfg.config.runPower != RUN_POWER::RUN_POWER_FIRST) { + TRACE("AFHDS3 [RANGE CHECK]"); + cfg.config.runPower = RUN_POWER::RUN_POWER_FIRST; + uint8_t data[] = { 0x13, 0x20, 0x02, cfg.config.runPower, 0 }; + TRACE("AFHDS3 SET TX POWER %d", moduleData->afhds3.runPower); + putFrame(COMMAND::SEND_COMMAND, FRAME_TYPE::REQUEST_SET_EXPECT_DATA, data, sizeof(data)); + return; + } + } + else if (moduleMode == ::ModuleSettingsMode::MODULE_MODE_NORMAL) { //exit bind + if (state == STATE_BINDING) { + TRACE("AFHDS3 [EXIT BIND]"); + requestedModuleMode = MODULE_MODE_E::RUN; + putFrame(COMMAND::MODULE_MODE, FRAME_TYPE::REQUEST_SET_EXPECT_DATA, &requestedModuleMode, 1); + return; + } + } + + bool isConnected = isConnectedUnicast() || isConnectedMulticast(); + + if (cmdCount++ >= 150) { + cmdCount = 0; + if (cmdIndex >= sizeof(periodicRequestCommands)) { + cmdIndex = 0; + } + COMMAND cmd = periodicRequestCommands[cmdIndex++]; + + if (cmd == COMMAND::VIRTUAL_FAILSAFE) { + if (isConnected) { + if (isConnectedMulticast()) { + TRACE("AFHDS ONE WAY FAILSAFE"); + uint16_t failSafe[MAX_CHANNELS + 1] = { ((MAX_CHANNELS << 8) | CHANNELS_DATA_MODE::FAIL_SAFE), 0 }; + setFailSafe((int16_t*) (&failSafe[1])); + putFrame(COMMAND::CHANNELS_FAILSAFE_DATA, FRAME_TYPE::REQUEST_SET_NO_RESP, (uint8_t*) failSafe, MAX_CHANNELS * 2 + 2); + } + else { + TRACE("AFHDS TWO WAYS FAILSAFE"); + uint8_t failSafe[3 + MAX_CHANNELS * 2] = { 0x11, 0x60, MAX_CHANNELS * 2 }; + setFailSafe((int16_t*) (failSafe + 3)); + putFrame(COMMAND::SEND_COMMAND, FRAME_TYPE::REQUEST_SET_EXPECT_DATA, failSafe, 3 + MAX_CHANNELS * 2); + } + } + else { + putFrame(COMMAND::MODULE_STATE, FRAME_TYPE::REQUEST_GET_DATA); + } + } + else + { + putFrame(cmd, FRAME_TYPE::REQUEST_GET_DATA); + } + } + else if (isConnected) { + sendChannelsData(); + } + else { + //default frame - request state + putFrame(MODULE_STATE, FRAME_TYPE::REQUEST_GET_DATA); + } +} + +void PulsesData::init(uint8_t moduleIndex, bool resetFrameCount) +{ + module_index = moduleIndex; + AFHDS3PulsesData[module_index] = this; + //clear local vars because it is member of union + moduleData = &g_model.moduleData[module_index]; + operationState = State::UNKNOWN; + state = ModuleState::STATE_NOT_READY; + clearFrameData(); +} + +void PulsesData::clearFrameData() +{ + TRACE("AFHDS3 clearFrameData"); + reset(); + clearCommandFifo(); + repeatCount = 0; + cmdCount = 0; + cmdIndex = 0; + this->frame_index = 1; + this->timeout = 0; + this->esc_state = 0; +} + +void PulsesData::putBytes(uint8_t* data, int length) +{ + for (int i = 0; i < length; i++) { + uint8_t byte = data[i]; + this->crc += byte; + if (END == byte) { + sendByte(ESC); + sendByte(ESC_END); + } + else if (ESC == byte) { + sendByte(ESC); + sendByte(ESC_ESC); + } + else { + sendByte(byte); + } + } +} + +void PulsesData::putFrame(COMMAND command, FRAME_TYPE frame, uint8_t* data, uint8_t dataLength, uint8_t* frameIndex) +{ + //header + operationState = State::SENDING_COMMAND; + reset(); + this->crc = 0; + sendByte(START); + if (frameIndex == nullptr) { + frameIndex = &this->frame_index; + } + uint8_t buffer[] = { FrameAddress, *frameIndex, frame, command }; + putBytes(buffer, 4); + + //payload + if (dataLength > 0) { + putBytes(data, dataLength); + } + //footer + uint8_t crcValue = this->crc ^ 0xff; + putBytes(&crcValue, 1); + sendByte(END); + *frameIndex = *frameIndex + 1; + + switch (frame) { + case FRAME_TYPE::REQUEST_GET_DATA: + case FRAME_TYPE::REQUEST_SET_EXPECT_ACK: + case FRAME_TYPE::REQUEST_SET_EXPECT_DATA: + operationState = State::AWAITING_RESPONSE; + break; + default: + operationState = State::IDLE; + } + + flush(); +} + +bool checkCRC(const uint8_t* data, uint8_t size) +{ + uint8_t crc = 0; + //skip start byte + for (uint8_t i = 1; i < size; i++) { + crc += data[i]; + } + return (crc ^ 0xff) == data[size]; +} + +bool containsData(enum FRAME_TYPE frameType) +{ + return (frameType == FRAME_TYPE::RESPONSE_DATA || + frameType == FRAME_TYPE::REQUEST_SET_EXPECT_DATA || + frameType == FRAME_TYPE::REQUEST_SET_EXPECT_ACK || + frameType == FRAME_TYPE::REQUEST_SET_EXPECT_DATA || + frameType == FRAME_TYPE::REQUEST_SET_NO_RESP); +} + +void PulsesData::setState(uint8_t state) +{ + if (state == this->state) { + return; + } + uint8_t oldState = this->state; + this->state = state; + if (oldState == ModuleState::STATE_BINDING) { + setModuleMode(module_index, ::ModuleSettingsMode::MODULE_MODE_NORMAL); + } + if (state == ModuleState::STATE_NOT_READY) { + operationState = State::UNKNOWN; + } +} + +void PulsesData::requestInfoAndRun(bool send) +{ + if (!send) { + enqueue(COMMAND::MODULE_VERSION, FRAME_TYPE::REQUEST_GET_DATA); + } + enqueue(COMMAND::MODULE_POWER_STATUS, FRAME_TYPE::REQUEST_GET_DATA); + requestedModuleMode = MODULE_MODE_E::RUN; + enqueue(COMMAND::MODULE_MODE, FRAME_TYPE::REQUEST_SET_EXPECT_DATA, true, (uint8_t) MODULE_MODE_E::RUN); + if (send) { + putFrame(COMMAND::MODULE_VERSION, FRAME_TYPE::REQUEST_GET_DATA); + } +} + +void PulsesData::parseData(uint8_t* rxBuffer, uint8_t rxBufferCount) +{ + + if (!checkCRC(rxBuffer, rxBufferCount - 2)) { + TRACE("AFHDS3 [INVALID CRC]"); + return; + } + AfhdsFrame* responseFrame = reinterpret_cast(rxBuffer); + if (containsData((enum FRAME_TYPE) responseFrame->frameType)) { + switch (responseFrame->command) { + case COMMAND::MODULE_READY: + TRACE("AFHDS3 [MODULE_READY] %02X", responseFrame->value); + if (responseFrame->value == MODULE_STATUS_READY) { + setState(ModuleState::STATE_READY); + requestInfoAndRun(); + } + else { + setState(ModuleState::STATE_NOT_READY); + } + break; + case COMMAND::MODULE_GET_CONFIG: + std::memcpy((void*) cfg.buffer, &responseFrame->value, sizeof(cfg.buffer)); + TRACE("AFHDS3 [MODULE_GET_CONFIG] bind power %d run power %d mode %d pwm/ppm %d ibus/sbus %d", cfg.config.bindPower, cfg.config.runPower, cfg.config.telemetry, cfg.config.pulseMode, cfg.config.serialMode); + break; + case COMMAND::MODULE_VERSION: + std::memcpy((void*) &version, &responseFrame->value, sizeof(version)); + TRACE("AFHDS3 [MODULE_VERSION] Product %d, HW %d, BOOT %d, FW %d", version.productNumber, version.hardwereVersion, version.bootloaderVersion, version.firmwareVersion); + break; + case COMMAND::MODULE_POWER_STATUS: + powerSource = (enum MODULE_POWER_SOURCE) responseFrame->value; + TRACE("AFHDS3 [MODULE_POWER_STATUS], %d", powerSource); + break; + case COMMAND::MODULE_STATE: + TRACE("AFHDS3 [MODULE_STATE] %02X", responseFrame->value); + setState(responseFrame->value); + break; + case COMMAND::MODULE_MODE: + TRACE("AFHDS3 [MODULE_MODE] %02X", responseFrame->value); + if (responseFrame->value != CMD_RESULT::SUCCESS) { + setState(ModuleState::STATE_NOT_READY); + } + else { + if (requestedModuleMode == MODULE_MODE_E::RUN) { + enqueue(COMMAND::MODULE_GET_CONFIG, FRAME_TYPE::REQUEST_GET_DATA); + enqueue(COMMAND::MODULE_STATE, FRAME_TYPE::REQUEST_GET_DATA); + } + requestedModuleMode = MODULE_MODE_UNKNOWN; + } + break; + case COMMAND::MODULE_SET_CONFIG: + if (responseFrame->value != CMD_RESULT::SUCCESS) { + setState(ModuleState::STATE_NOT_READY); + } + TRACE("AFHDS3 [MODULE_SET_CONFIG], %02X", responseFrame->value); + break; + case COMMAND::TELEMETRY_DATA: + { + uint8_t* telemetry = &responseFrame->value; + + if (telemetry[0] == 0x22) { + telemetry++; + while (telemetry < rxBuffer + rxBufferCount) { + uint8_t length = telemetry[0]; + uint8_t id = telemetry[1]; + if (id == 0xFE) { + id = 0xF7; //use new id because format is different + } + if (length == 0 || telemetry + length > rxBuffer + rxBufferCount) { + break; + } + if (length == 4) { + //one byte value fill missing byte + uint8_t data[] = { id, telemetry[2], telemetry[3], 0 }; + ::processFlySkySensor(data, 0xAA); + } + if (length == 5) { + if (id == 0xFA) { + telemetry[1] = 0xF8; //remap to afhds3 snr + } + ::processFlySkySensor(telemetry + 1, 0xAA); + } + else if (length == 6 && id == FRM302_STATUS) { + //convert to ibus + uint16_t t = (uint16_t) (((int16_t) telemetry[3] * 10) + 400); + uint8_t dataTemp[] = { ++id, telemetry[2], (uint8_t) (t & 0xFF), (uint8_t) (t >> 8) }; + ::processFlySkySensor(dataTemp, 0xAA); + uint8_t dataVoltage[] = { ++id, telemetry[2], telemetry[4], telemetry[5] }; + ::processFlySkySensor(dataVoltage, 0xAA); + } + else if (length == 7) { + ::processFlySkySensor(telemetry + 1, 0xAC); + } + telemetry += length; + } + } + } + break; + case COMMAND::COMMAND_RESULT: + { + //AfhdsFrameData* respData = responseFrame->GetData(); + //TRACE("COMMAND RESULT %02X result %d datalen %d", respData->CommandResult.command, respData->CommandResult.result, respData->CommandResult.respLen); + } + break; + } + } + + if (responseFrame->frameType == FRAME_TYPE::REQUEST_GET_DATA || responseFrame->frameType == FRAME_TYPE::REQUEST_SET_EXPECT_DATA) { + TRACE("Command %02X NOT IMPLEMENTED!", responseFrame->command); + } + else if (responseFrame->frameType == FRAME_TYPE::REQUEST_SET_EXPECT_ACK) { + //check if such request is not queued + if (!isEmpty()) { + Frame f = commandFifo[getIndex]; + if (f.frameType == FRAME_TYPE::RESPONSE_ACK && f.frameNumber == responseFrame->frameNumber) { + TRACE("ACK for frame %02X already queued", responseFrame->frameNumber); + return; + } + } + TRACE("AFHDS3 [QUEUE ACK] cmd %02X type %02X number %02X", responseFrame->command, responseFrame->frameType, responseFrame->frameNumber); + enqueueACK((enum COMMAND) responseFrame->command, responseFrame->frameNumber); + } + else if (responseFrame->frameType == FRAME_TYPE::RESPONSE_DATA || responseFrame->frameType == FRAME_TYPE::RESPONSE_ACK) { + if (operationState == State::AWAITING_RESPONSE) { + operationState = State::IDLE; + } + } +} + +inline bool isSbus(uint8_t mode) +{ + return (mode & 1); +} + +inline bool isPWM(uint8_t mode) +{ + return mode < 2; +} + +RUN_POWER PulsesData::getMaxRunPower() +{ + if (powerSource == MODULE_POWER_SOURCE::EXTERNAL) { + return RUN_POWER::PLUS_33dBm; + } + + return RUN_POWER::PLUS_27dbm; +} + +RUN_POWER PulsesData::actualRunPower() +{ + uint8_t actualRfPower = cfg.config.runPower; + if (getMaxRunPower() < actualRfPower) { + actualRfPower = getMaxRunPower(); + } + return (RUN_POWER) actualRfPower; +} + +RUN_POWER PulsesData::getRunPower() +{ + RUN_POWER targetPower = (RUN_POWER) moduleData->afhds3.runPower; + if (getMaxRunPower() < targetPower) { + targetPower = getMaxRunPower(); + } + return targetPower; +} + +bool PulsesData::syncSettings() +{ + RUN_POWER targetPower = getRunPower(); + + /*not sure if we need to prevent them in bind mode*/ + if (getModuleMode(module_index) != ::ModuleSettingsMode::MODULE_MODE_BIND && targetPower != cfg.config.runPower) { + cfg.config.runPower = moduleData->afhds3.runPower; + uint8_t data[] = { 0x13, 0x20, 0x02, moduleData->afhds3.runPower, 0 }; + TRACE("AFHDS3 SET TX POWER %d", moduleData->afhds3.runPower); + putFrame(COMMAND::SEND_COMMAND, FRAME_TYPE::REQUEST_SET_EXPECT_DATA, data, sizeof(data)); + return true; + } + + //other settings only in 2 way mode (state must be synchronized) + if (this->state != ModuleState::STATE_SYNC_DONE) { + return false; + } + + if (moduleData->afhds3.rxFreq() != cfg.config.pwmFreq) { + cfg.config.pwmFreq = moduleData->afhds3.rxFreq(); + uint8_t data[] = { 0x17, 0x70, 0x02, (uint8_t) (moduleData->afhds3.rxFreq() & 0xFF), (uint8_t) (moduleData->afhds3.rxFreq() >> 8) }; + TRACE("AFHDS3 SET RX FREQ"); + putFrame(COMMAND::SEND_COMMAND, FRAME_TYPE::REQUEST_SET_EXPECT_DATA, data, sizeof(data)); + return true; + } + PULSE_MODE modelPulseMode = isPWM(moduleData->subType) ? PULSE_MODE::PWM_MODE : PULSE_MODE::PPM_MODE; + if (modelPulseMode != cfg.config.pulseMode) { + cfg.config.pulseMode = modelPulseMode; + TRACE("AFHDS3 PWM/PPM %d", modelPulseMode); + uint8_t data[] = { 0x16, 0x70, 0x01, (uint8_t) (modelPulseMode) }; + putFrame(COMMAND::SEND_COMMAND, FRAME_TYPE::REQUEST_SET_EXPECT_DATA, data, sizeof(data)); + return true; + } + + SERIAL_MODE modelSerialMode = isSbus(moduleData->subType) ? SERIAL_MODE::SBUS_MODE : SERIAL_MODE::IBUS; + if (modelSerialMode != cfg.config.serialMode) { + cfg.config.serialMode = modelSerialMode; + TRACE("AFHDS3 IBUS/SBUS %d", modelSerialMode); + uint8_t data[] = { 0x18, 0x70, 0x01, (uint8_t) (modelSerialMode) }; + putFrame(COMMAND::SEND_COMMAND, FRAME_TYPE::REQUEST_SET_EXPECT_DATA, data, sizeof(data)); + return true; + } + + if (moduleData->afhds3.failsafeTimeout != cfg.config.failSafeTimout) { + moduleData->afhds3.failsafeTimeout = cfg.config.failSafeTimout; + uint8_t data[] = { 0x12, 0x60, 0x02, (uint8_t) (moduleData->afhds3.failsafeTimeout & 0xFF), (uint8_t) (moduleData->afhds3.failsafeTimeout >> 8) }; + putFrame(COMMAND::SEND_COMMAND, FRAME_TYPE::REQUEST_SET_EXPECT_DATA, data, sizeof(data)); + TRACE("AFHDS3 FAILSAFE TMEOUT, %d", moduleData->afhds3.failsafeTimeout); + return true; + } + return false; +} + +void PulsesData::sendChannelsData() +{ + uint8_t channels_start = moduleData->channelsStart; + uint8_t channelsCount = 8 + moduleData->channelsCount; + uint8_t channels_last = channels_start + channelsCount; + int16_t buffer[MAX_CHANNELS + 1] = { ((MAX_CHANNELS << 8) | CHANNELS_DATA_MODE::CHANNELS), 0 }; + + for (uint8_t channel = channels_start, index = 1; channel < channels_last; channel++, index++) { + int16_t channelValue = convert(::getChannelValue(channel)); + buffer[index] = channelValue; + } + putFrame(COMMAND::CHANNELS_FAILSAFE_DATA, FRAME_TYPE::REQUEST_SET_NO_RESP, (uint8_t*) buffer, sizeof(buffer)); +} + +void PulsesData::stop() +{ + TRACE("AFHDS3 STOP"); + requestedModuleMode = MODULE_MODE_E::STANDBY; + putFrame(COMMAND::MODULE_MODE, FRAME_TYPE::REQUEST_SET_EXPECT_DATA, &requestedModuleMode, 1); +} + +void PulsesData::setConfigFromModel() +{ + cfg.config.bindPower = moduleData->afhds3.bindPower; + cfg.config.runPower = getRunPower(); + cfg.config.emiStandard = EMI_STANDARD::FCC; + cfg.config.telemetry = moduleData->afhds3.telemetry; //always use bidirectional mode + cfg.config.pwmFreq = moduleData->afhds3.rxFreq(); + cfg.config.serialMode = isSbus(moduleData->subType) ? SERIAL_MODE::SBUS_MODE : SERIAL_MODE::IBUS; + cfg.config.pulseMode = isPWM(moduleData->subType) ? PULSE_MODE::PWM_MODE : PULSE_MODE::PPM_MODE; + //use max channels - because channel count can not be changed after bind + cfg.config.channelCount = MAX_CHANNELS; + cfg.config.failSafeTimout = moduleData->afhds3.failsafeTimeout; + setFailSafe(cfg.config.failSafeMode); +} + +inline int16_t PulsesData::convert(int channelValue) +{ + //pulseValue = limit(0, 988 + ((channelValue + 1024) / 2), 0xfff); + //988 - 750 = 238 + //238 * 20 = 4760 + //2250 - 2012 = 238 + //238 * 20 = 4760 + // 988 ---- 2012 + //-10240 ---- 10240 + //-1024 ---- 1024 + return ::limit(FAILSAFE_MIN, channelValue * 10, FAILSAFE_MAX); +} + +uint8_t PulsesData::setFailSafe(int16_t* target) +{ + int16_t pulseValue = 0; + uint8_t channels_start = moduleData->channelsStart; + uint8_t channels_last = channels_start + 8 + moduleData->channelsCount; + + for (uint8_t channel = channels_start; channel < channels_last; channel++) { + if (moduleData->failsafeMode == FAILSAFE_CUSTOM) { + pulseValue = convert(g_model.failsafeChannels[channel]); + } + else if (moduleData->failsafeMode == FAILSAFE_HOLD) { + pulseValue = FAILSAFE_KEEP_LAST; + } + else { + pulseValue = convert(::getChannelValue(channel)); + } + target[channel - channels_start] = pulseValue; + } + //return max channels because channel count can not be change after bind + return (uint8_t) (MAX_CHANNELS); +} + +} diff --git a/radio/src/pulses/afhds3.h b/radio/src/pulses/afhds3.h new file mode 100644 index 000000000..774293b65 --- /dev/null +++ b/radio/src/pulses/afhds3.h @@ -0,0 +1,595 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef PULSES_AFHDS3_H_ +#define PULSES_AFHDS3_H_ + +#include "bitfield.h" +#include "definitions.h" +#include "dataconstants.h" +#include "opentx_types.h" +#include "myeeprom.h" +#include "opentx_helpers.h" +#include "pulses_common.h" +#include +#include "fifo.h" + +#define AFHDS_MAX_PULSES 72 +//max number of transitions measured so far 290 + 10% +#define AFHDS_MAX_PULSES_TRANSITIONS 320 +//#define AFHDS3_SLOW + +#if defined(EXTMODULE_USART) && defined(EXTMODULE_TX_INVERT_GPIO) +#define AFHDS3_BAUDRATE 1500000 +#define AFHDS3_COMMAND_TIMEOUT 5 +#elif !defined(AFHDS3_SLOW) +// 1s = 1 000 000 us +// 1000000/115200 = 8,68 us +// actual timer is ticking in 0,5 us = 8,68*2 = 17,36 because it must be integer take 17 +// difference 1000000 / x = 8.5 --> x = 117 647 = difference = 1.2 % +// allowed half a bit difference on the last bit -- should be fine +#define AFHDS3_BAUDRATE 115200 +//Because timer is ticking with 0.5us +#define BITLEN_AFHDS (17) + +#define AFHDS3_COMMAND_TIMEOUT 15 +#else +// 1000000/57600 = 17,36 us +#define AFHDS3_BAUDRATE 57600 +// 64* 86 = 11 110 +#define AFHDS3_COMMAND_TIMEOUT 20 +#define BITLEN_AFHDS (35) +#endif + +#define AFHDS3_FRAME_HALF_US AFHDS3_COMMAND_TIMEOUT * 2000 + +//get channel value outside of afhds3 namespace +int32_t getChannelValue(uint8_t channel); + +//use uint16_t instead of pulse_duration_t +namespace afhds3 +{ +enum AfhdsSpecialChars +{ + END = 0xC0, //Frame end + START = END, + ESC_END = 0xDC, //Escaped frame end - in case END occurs in fame then ESC ESC_END must be used + ESC = 0xDB, //Escaping character + ESC_ESC = 0xDD, //Escaping character in case ESC occurs in fame then ESC ESC_ESC must be used +}; + +struct Data +{ +#if defined(EXTMODULE_USART) && defined(EXTMODULE_TX_INVERT_GPIO) + uint8_t pulses[AFHDS_MAX_PULSES]; + uint8_t * ptr; +#else + uint32_t pulsesSize; + uint16_t pulses[AFHDS_MAX_PULSES_TRANSITIONS]; + uint32_t total; + #endif + + uint8_t frame_index; + uint8_t crc; + uint8_t state; + uint8_t timeout; + uint8_t esc_state; + + void reset() + { +#if !(defined(EXTMODULE_USART) && defined(EXTMODULE_TX_INVERT_GPIO)) + total = 0; +#endif + pulsesSize = 0; + } +#if defined(EXTMODULE_USART) && defined(EXTMODULE_TX_INVERT_GPIO) + void sendByte(uint8_t b) + { + *ptr++ = b; + } + const uint8_t* getData() + { + return pulses; + } + void flush() + { + } +#else + inline void _send_level(uint16_t v) + { + if (pulsesSize >= AFHDS_MAX_PULSES_TRANSITIONS) { + return; + } + pulses[pulsesSize++] = v; + total += v; + } + void sendByte(uint8_t b) + { + if (pulsesSize >= AFHDS_MAX_PULSES_TRANSITIONS) { + return; + } + //use 8n1 + //parity: If the parity is enabled, then the MSB bit of the data to be transmitted is changed by the parity bit + //start is always 0 + bool level = 0; + uint16_t length = BITLEN_AFHDS; //start bit + for (uint8_t i = 0; i <= 8; i++) + { //8 data bits + Stop=1 + bool next_level = b & 1; + if (level == next_level) { + length += BITLEN_AFHDS; + } + else { + _send_level(length); + length = BITLEN_AFHDS; + level = next_level; + } + b = (b >> 1) | 0x80; // shift left to get next bit, fill msb with stop bit - needed just once + } + _send_level(length); //last bit (stop) + + } + //add remaining time of frame + void flush() + { + uint16_t diff = AFHDS3_FRAME_HALF_US - total; + pulses[pulsesSize - 1] += diff; + //ensure 2 ms break + if (pulses[pulsesSize - 1] < 4000) + { + pulses[pulsesSize - 1] = 4050; + } + total += diff; + } + + const uint16_t* getData() + { + return pulses; + } +#endif + uint32_t getSize() + { + return pulsesSize; + } +}; + +enum DeviceAddress +{ + TRANSMITTER = 0x01, + MODULE = 0x03, +}; + +enum FRAME_TYPE +{ + REQUEST_GET_DATA = 0x01, //Get data response: ACK + DATA + REQUEST_SET_EXPECT_DATA = 0x02, //Set data response: ACK + DATA + REQUEST_SET_EXPECT_ACK = 0x03, //Set data response: ACK + REQUEST_SET_NO_RESP = 0x05, //Set data response: none + RESPONSE_DATA = 0x10, //Response ACK + DATA + RESPONSE_ACK = 0x20, //Response ACK + NOT_USED = 0xff +}; + +enum COMMAND +{ + MODULE_READY = 0x01, + MODULE_STATE = 0x02, + MODULE_MODE = 0x03, + MODULE_SET_CONFIG = 0x04, + MODULE_GET_CONFIG = 0x06, + CHANNELS_FAILSAFE_DATA = 0x07, + TELEMETRY_DATA = 0x09, + SEND_COMMAND = 0x0C, + COMMAND_RESULT = 0x0D, + MODULE_POWER_STATUS = 0x0F, + MODULE_VERSION = 0x1F, + VIRTUAL_FAILSAFE = 0x99, // virtual command used to trigger failsafe + UNDEFINED = 0xFF +}; + +enum COMMAND_DIRECTION +{ + RADIO_TO_MODULE = 0, + MODULE_TO_RADIO = 1 +}; + +enum DATA_TYPE +{ + READY_DT, // 8 bytes 0x01 Not ready 0x02 Ready + STATE_DT, // See MODULE_STATE + MODE_DT, + MOD_CONFIG_DT, + CHANNELS_DT, + TELEMETRY_DT, + MODULE_POWER_DT, + MODULE_VERSION_DT, + EMPTY_DT, +}; +//enum used by command response -> translate to ModuleState +enum MODULE_READY_E +{ + MODULE_STATUS_UNKNOWN = 0x00, + MODULE_STATUS_NOT_READY = 0x01, + MODULE_STATUS_READY = 0x02 +}; + +enum ModuleState +{ + STATE_NOT_READY = 0x00, //virtual + STATE_HW_ERROR = 0x01, + STATE_BINDING = 0x02, + STATE_SYNC_RUNNING = 0x03, + STATE_SYNC_DONE = 0x04, + STATE_STANDBY = 0x05, + STATE_UPDATING_WAIT = 0x06, + STATE_UPDATING_MOD = 0x07, + STATE_UPDATING_RX = 0x08, + STATE_UPDATING_RX_FAILED = 0x09, + STATE_RF_TESTING = 0x0a, + STATE_READY = 0x0b, //virtual + STATE_HW_TEST = 0xff, +}; + +//used for set command +enum MODULE_MODE_E +{ + STANDBY = 0x01, + BIND = 0x02, //after bind module will enter run mode + RUN = 0x03, + RX_UPDATE = 0x04, //after successful update module will enter standby mode, otherwise hw error will be raised + MODULE_MODE_UNKNOWN = 0xFF +}; + +enum CMD_RESULT +{ + FAILURE = 0x01, + SUCCESS = 0x02, +}; + +#define MIN_FREQ 50 +#define MAX_FREQ 400 +#define MAX_CHANNELS 18 +#define FAILSAFE_KEEP_LAST 0x8000 +#define FAILSAFE_MIN -15000 +#define FAILSAFE_MAX 15000 + +enum BIND_POWER +{ + MIN_16dBm = 0x00, + BIND_POWER_FIRST = MIN_16dBm, + MIN_5dBm = 0x01, + MIN_0dbm = 0x02, + PLUS_5dBm = 0x03, + PLUS_14dBm = 0x04, + BIND_POWER_LAST = PLUS_14dBm, +}; + +enum RUN_POWER +{ + PLUS_15bBm = 0x00, + RUN_POWER_FIRST = PLUS_15bBm, + PLUS_20bBm = 0x01, + PLUS_27dbm = 0x02, + PLUS_30dBm = 0x03, + PLUS_33dBm = 0x04, + RUN_POWER_LAST = PLUS_33dBm, +}; + +enum EMI_STANDARD +{ + FCC = 0x00, + CE = 0x01 +}; + +enum TELEMETRY +{ + TELEMETRY_DISABLED = 0x00, + TELEMETRY_ENABLED = 0x01 +}; + +enum PULSE_MODE +{ + PWM_MODE = 0x00, + PPM_MODE = 0x01, +}; + +enum SERIAL_MODE +{ + IBUS = 0x00, + SBUS_MODE = 0x02 +}; + +PACK(struct Config_s { + uint8_t bindPower; + uint8_t runPower; + uint8_t emiStandard; + uint8_t telemetry; + uint16_t pwmFreq; + uint8_t pulseMode; + uint8_t serialMode; + uint8_t channelCount; + uint16_t failSafeTimout; + int16_t failSafeMode[MAX_CHANNELS]; +}); + +union Config_u +{ + Config_s config; + uint8_t buffer[sizeof(Config_s)]; +}; + +enum CHANNELS_DATA_MODE +{ + CHANNELS = 0x01, + FAIL_SAFE = 0x02, +}; + +PACK(struct ChannelsData { + uint8_t mode; + uint8_t channelsNumber; + int16_t data[MAX_CHANNELS]; +}); + +union ChannelsData_u +{ + ChannelsData data; + uint8_t buffer[sizeof(ChannelsData)]; +}; + +PACK(struct TelemetryData +{ + uint8_t sensorType; + uint8_t length; + uint8_t type; + uint8_t semsorID; + uint8_t data[8]; +}); + +enum MODULE_POWER_SOURCE +{ + INTERNAL = 0x01, + EXTERNAL = 0x02, +}; + +PACK(struct ModuleVersion +{ + uint32_t productNumber; + uint32_t hardwereVersion; + uint32_t bootloaderVersion; + uint32_t firmwareVersion; + uint32_t rfVersion; +}); + +PACK(struct CommandResult_s +{ + uint16_t command; + uint8_t result; + uint8_t respLen; +}); + +union AfhdsFrameData +{ + uint8_t value; + Config_s Config; + ChannelsData Channels; + TelemetryData Telemetry; + ModuleVersion Version; + CommandResult_s CommandResult; +}; + +PACK(struct AfhdsFrame +{ + uint8_t startByte; + uint8_t address; + uint8_t frameNumber; + uint8_t frameType; + uint8_t command; + uint8_t value; + + AfhdsFrameData* GetData() + { + return reinterpret_cast(&value); + } +}); + +#define FRM302_STATUS 0x56 + +enum State +{ + UNKNOWN = 0, + SENDING_COMMAND, + AWAITING_RESPONSE, + IDLE +}; + +//one byte frames for request queue +struct Frame +{ + enum COMMAND command; + enum FRAME_TYPE frameType; + uint8_t payload; + uint8_t frameNumber; + bool useFrameNumber; + uint8_t payloadSize; +}; + +//simple fifo implementation because Pulses is used as member of union and can not be non trivial type +struct CommandFifo +{ + Frame commandFifo[8]; + volatile uint32_t setIndex; + volatile uint32_t getIndex; + + void clearCommandFifo(); + + inline uint32_t nextIndex(uint32_t idx) + { + return (idx + 1) & (sizeof(commandFifo) / sizeof(commandFifo[0]) - 1); + } + + inline uint32_t prevIndex(uint32_t idx) + { + if (idx == 0) + { + return (sizeof(commandFifo) / sizeof(commandFifo[0]) - 1); + } + return (idx - 1); + } + + inline bool isEmpty() const + { + return (getIndex == setIndex); + } + + inline void skip() + { + getIndex = nextIndex(getIndex); + } + + void enqueueACK(COMMAND command, uint8_t frameNumber); + + void enqueue(COMMAND command, FRAME_TYPE frameType, bool useData = false, uint8_t byteContent = 0); + +}; + +void processTelemetryData(uint8_t module, uint8_t byte, uint8_t* rxBuffer, uint8_t& rxBufferCount, uint8_t maxSize); + +class PulsesData: public Data, CommandFifo +{ + public: + /** + * Initialize class for operation + * @param moduleIndex index of module one of INTERNAL_MODULE, EXTERNAL_MODULE + * @param resetFrameCount flag if current frame count should be reseted + */ + + void init(uint8_t moduleIndex, bool resetFrameCount = true); + + /** + * Fills DMA buffers with frame to be send depending on actual state + */ + void setupFrame(); + + /** + * Gets actual module status into provided buffer + * @param statusText target buffer for status + */ + void getStatusString(char * statusText) const; + + /** + * Gets actual power source and voltage + */ + void getPowerStatus(char* buffer) const; + + RUN_POWER actualRunPower(); + + /** + * Sends stop command to prevent any further module operations + */ + void stop(); + + protected: + + void setConfigFromModel(); + + private: + + inline void putBytes(uint8_t* data, int length); + + inline void putFrame(COMMAND command, FRAME_TYPE frameType, uint8_t* data = nullptr, uint8_t dataLength = 0, uint8_t* frame_index = nullptr); + + void parseData(uint8_t* rxBuffer, uint8_t rxBufferCount); + + void setState(uint8_t state); + + bool syncSettings(); + + void requestInfoAndRun(bool send = false); + + uint8_t setFailSafe(int16_t* target); + + inline int16_t convert(int channelValue); + + void sendChannelsData(); + + void clearFrameData(); + + void processTelemetryData(uint8_t byte, uint8_t* rxBuffer, uint8_t& rxBufferCount, uint8_t maxSize); + + //friendship declaration - use for passing telemetry + friend void processTelemetryData(uint8_t module, uint8_t byte, uint8_t* rxBuffer, uint8_t& rxBufferCount, uint8_t maxSize); + + /** + * Returns max power that currently can be set - use it to validate before synchronization of settings + */ + RUN_POWER getMaxRunPower(); + + RUN_POWER getRunPower(); + + bool isConnectedUnicast(); + + bool isConnectedMulticast(); + + /** + * Index of the module + */ + uint8_t module_index; + /** + * Target mode to be set to the module one of MODULE_MODE_E + */ + uint8_t requestedModuleMode; + /** + * Internal operation state one of UNKNOWN, SENDING_COMMAND, AWAITING_RESPONSE, IDLE + * Used to avoid sending commands when not allowed to + */ + State operationState; + /** + * Actual repeat count for requested command/operation - incremented by every attempt sending anything + */ + uint16_t repeatCount; + /** + * Command count used for counting actual number of commands sent in run mode + */ + uint32_t cmdCount; + /** + * Command index of command to be send when cmdCount reached necessary value + */ + uint32_t cmdIndex; + /** + * Actual power source of the module - should be requested time to time + * Currently requested once + */ + enum MODULE_POWER_SOURCE powerSource; + /** + * Pointer to module config - it is making operations easier and faster + */ + ModuleData* moduleData; + /** + * Actual module configuration - must be requested from module + */ + Config_u cfg; + + /** + * Actual module version - must be requested from module + */ + ModuleVersion version; +}; +} /* Namespace ahfds3 */ +#endif /* PULSES_AFHDS3_H_ */ diff --git a/radio/src/pulses/modules_constants.h b/radio/src/pulses/modules_constants.h index 1e5879d92..4f391243a 100644 --- a/radio/src/pulses/modules_constants.h +++ b/radio/src/pulses/modules_constants.h @@ -37,6 +37,7 @@ enum ModuleType { MODULE_TYPE_R9M_LITE_PRO_PXX2, MODULE_TYPE_SBUS, MODULE_TYPE_XJT_LITE_PXX2, + MODULE_TYPE_AFHDS3, //no more protocols possible because of 4 bits value MODULE_TYPE_COUNT, MODULE_TYPE_MAX = MODULE_TYPE_COUNT - 1 }; @@ -218,4 +219,13 @@ enum AntennaModes { ANTENNA_MODE_LAST = ANTENNA_MODE_EXTERNAL }; +enum AfhdsModes { + AFHDS_SUBTYPE_FIRST, + AFHDS_SUBTYPE_PWM_IBUS = AFHDS_SUBTYPE_FIRST, + AFHDS_SUBTYPE_PWM_SBUS, + AFHDS_SUBTYPE_PPM_IBUS, + AFHDS_SUBTYPE_PPM_SBUS, + AFHDS_SUBTYPE_LAST = AFHDS_SUBTYPE_PPM_SBUS +}; + #endif // _MODULES_CONSTANTS_H_ diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h index cdaf58336..5f2cca40f 100644 --- a/radio/src/pulses/modules_helpers.h +++ b/radio/src/pulses/modules_helpers.h @@ -299,8 +299,32 @@ inline bool isModuleSBUS(uint8_t moduleIdx) return g_model.moduleData[moduleIdx].type == MODULE_TYPE_SBUS; } +inline bool isModuleAFHDS3(uint8_t idx) +{ + return g_model.moduleData[idx].type == MODULE_TYPE_AFHDS3; +} + +inline bool isModulePxx2(uint8_t idx) +{ + if (idx != EXTERNAL_MODULE) + return false; +#if defined(PXX2) + #if defined(HARDWARE_EXTERNAL_MODULE_SIZE_SML) + if (g_model.moduleData[idx].type == MODULE_TYPE_XJT_LITE_PXX2 || + g_model.moduleData[idx].type == MODULE_TYPE_R9M_LITE_PRO_PXX2) + return true; + #endif + #if defined(HARDWARE_EXTERNAL_MODULE_SIZE_SML) + if (g_model.moduleData[idx].type == MODULE_TYPE_R9M_LITE_PXX2) + return true; + #endif +#endif + return false; +} + // order is the same as in enum Protocols in myeeprom.h (none, ppm, pxx, pxx2, dsm, crossfire, multi, r9m, r9m2, sbus) -static const int8_t maxChannelsModules[] = { 0, 8, 8, 16, -2, 8, 4, 8, 16, 8}; // relative to 8! +//qba667 count is not matching! +static const int8_t maxChannelsModules[] = { 0, 8, 8, 16, -2, 8, 4, 8, 16, 8, 10}; // relative to 8! static const int8_t maxChannelsXJT[] = { 0, 8, 0, 4 }; // relative to 8! constexpr int8_t MAX_TRAINER_CHANNELS_M8 = MAX_TRAINER_CHANNELS - 8; @@ -325,6 +349,9 @@ inline int8_t maxModuleChannels_M8(uint8_t moduleIdx) return 8; // always 16 channels in FCC / FLEX } } + else if (isModuleAFHDS3(moduleIdx)) { + return 10; + } else { return maxChannelsModules[g_model.moduleData[moduleIdx].type]; } @@ -401,7 +428,7 @@ inline bool isModuleFailsafeAvailable(uint8_t moduleIdx) return g_model.moduleData[moduleIdx].subType == MODULE_SUBTYPE_PXX1_ACCST_D16; #if defined(MULTIMODULE) - if (isModuleMultimodule(moduleIdx)){ + if (isModuleMultimodule(moduleIdx)) { MultiModuleStatus &status = getMultiModuleStatus(moduleIdx); if (status.isValid()) { return status.supportsFailsafe(); @@ -413,6 +440,11 @@ inline bool isModuleFailsafeAvailable(uint8_t moduleIdx) } #endif +#if defined(AFHDS3) + if (isModuleAFHDS3(moduleIdx)) + return true; +#endif + if (isModuleR9M(moduleIdx)) return true; @@ -421,7 +453,7 @@ inline bool isModuleFailsafeAvailable(uint8_t moduleIdx) inline bool isModuleBindRangeAvailable(uint8_t moduleIdx) { - return isModulePXX2(moduleIdx) || isModulePXX1(moduleIdx) || isModuleDSM2(moduleIdx) || isModuleMultimodule(moduleIdx); + return isModulePXX2(moduleIdx) || isModulePXX1(moduleIdx) || isModuleDSM2(moduleIdx) || isModuleMultimodule(moduleIdx) || isModuleAFHDS3(moduleIdx); } inline bool isModuleRangeAvailable(uint8_t moduleIdx) @@ -548,6 +580,30 @@ inline void resetAccessAuthenticationCount() #endif } +inline void resetAfhds3Options(uint8_t moduleIdx) +{ + auto & data = g_model.moduleData[moduleIdx]; + data.rfProtocol = 0; + data.subType = 0; +#if defined(AFHDS3) + data.afhds3.bindPower = 0; + data.afhds3.runPower = 0; + data.afhds3.emi = 0; + data.afhds3.telemetry = 1; + data.afhds3.rx_freq[0] = 50; + data.afhds3.rx_freq[1] = 0; + data.afhds3.failsafeTimeout = 1000; + data.channelsCount = 14 - 8; + data.failsafeMode = 1; + //" PWM+i"" PWM+s"" PPM+i"" PPM+s" + data.subType = 0; + for (uint8_t channel = 0; channel < MAX_OUTPUT_CHANNELS; channel++) { + g_model.failsafeChannels[channel] = 0; + } +#endif +} + + inline void setModuleType(uint8_t moduleIdx, uint8_t moduleType) { ModuleData & moduleData = g_model.moduleData[moduleIdx]; @@ -558,6 +614,8 @@ inline void setModuleType(uint8_t moduleIdx, uint8_t moduleType) moduleData.sbus.refreshRate = -31; else if (moduleData.type == MODULE_TYPE_PPM) setDefaultPpmFrameLength(moduleIdx); + else if (moduleData.type == MODULE_TYPE_AFHDS3) + resetAfhds3Options(moduleIdx); else resetAccessAuthenticationCount(); } diff --git a/radio/src/pulses/pulses.cpp b/radio/src/pulses/pulses.cpp index f0e48f4b6..f669f5fdb 100755 --- a/radio/src/pulses/pulses.cpp +++ b/radio/src/pulses/pulses.cpp @@ -28,6 +28,7 @@ InternalModulePulsesData intmodulePulsesData __DMA; ExternalModulePulsesData extmodulePulsesData __DMA; TrainerPulsesData trainerPulsesData __DMA; +//use only for PXX void ModuleState::startBind(BindInformation * destination, ModuleCallback bindCallback) { bindInformation = destination; @@ -40,6 +41,56 @@ void ModuleState::startBind(BindInformation * destination, ModuleCallback bindCa #endif } +void getModuleStatusString(uint8_t moduleIdx, char * statusText) +{ + *statusText = 0; +#if defined(MULTIMODULE) + if (isModuleMultimodule(moduleIdx)) { + //change it + getMultiModuleStatus(moduleIdx).getStatusString(statusText); + } +#endif +#if defined(AFHDS3) + if (moduleIdx == EXTERNAL_MODULE && isModuleAFHDS3(moduleIdx)) { + extmodulePulsesData.afhds3.getStatusString(statusText); + } +#endif +} + +void getModuleSyncStatusString(uint8_t moduleIdx, char * statusText) +{ + *statusText = 0; +#if defined(MULTIMODULE) + if (isModuleMultimodule(moduleIdx)) { + getMultiSyncStatus(moduleIdx).getRefreshString(statusText); + } +#endif +#if defined(AFHDS3) + if (moduleIdx == EXTERNAL_MODULE && isModuleAFHDS3(moduleIdx)) { + extmodulePulsesData.afhds3.getPowerStatus(statusText); + } +#endif +} + +#if defined(AFHDS3) +uint8_t actualAfhdsRunPower(int moduleIndex) +{ + if (moduleIndex == EXTERNAL_MODULE && isModuleAFHDS3(moduleIndex)) { + return (uint8_t)extmodulePulsesData.afhds3.actualRunPower(); + } + return 0; +} +#endif + +ModuleSettingsMode getModuleMode(int moduleIndex) +{ + return (ModuleSettingsMode)moduleState[moduleIndex].mode; +} +void setModuleMode(int moduleIndex, ModuleSettingsMode mode) +{ + moduleState[moduleIndex].mode = mode; +} + uint8_t getModuleType(uint8_t module) { uint8_t type = g_model.moduleData[module].type; @@ -136,6 +187,12 @@ uint8_t getRequiredProtocol(uint8_t module) break; #endif +#if defined(AFHDS3) + case MODULE_TYPE_AFHDS3: + protocol = PROTOCOL_CHANNELS_AFHDS3; + break; +#endif + default: protocol = PROTOCOL_CHANNELS_NONE; break; @@ -214,6 +271,14 @@ void enablePulsesExternalModule(uint8_t protocol) break; #endif +#if defined(AFHDS3) + case PROTOCOL_CHANNELS_AFHDS3: + extmodulePulsesData.afhds3.init(EXTERNAL_MODULE); + extmoduleSerialStart(AFHDS3_BAUDRATE, AFHDS3_COMMAND_TIMEOUT * 2000, false); + break; +#endif + + default: break; } @@ -281,6 +346,13 @@ bool setupPulsesExternalModule(uint8_t protocol) return true; #endif +#if defined(AFHDS3) + case PROTOCOL_CHANNELS_AFHDS3: + extmodulePulsesData.afhds3.setupFrame(); + scheduleNextMixerCalculation(EXTERNAL_MODULE, AFHDS3_COMMAND_TIMEOUT); + return true; +#endif + default: scheduleNextMixerCalculation(EXTERNAL_MODULE, 50/*ms*/); return false; @@ -438,3 +510,8 @@ void setCustomFailsafe(uint8_t moduleIndex) } } } + +int32_t getChannelValue(uint8_t channel) { + return channelOutputs[channel] + 2*PPM_CH_CENTER(channel) - 2*PPM_CENTER; +} + diff --git a/radio/src/pulses/pulses.h b/radio/src/pulses/pulses.h index 3b3fffca5..f92629f6e 100644 --- a/radio/src/pulses/pulses.h +++ b/radio/src/pulses/pulses.h @@ -27,6 +27,7 @@ #include "pxx1.h" #include "pxx2.h" #include "multi.h" +#include "afhds3.h" #include "modules_helpers.h" #include "ff.h" @@ -56,29 +57,14 @@ #define IS_MULTIMODULE_PROTOCOL(protocol) (0) #endif -#define IS_SBUS_PROTOCOL(protocol) (protocol == PROTOCOL_CHANNELS_SBUS) +#if defined(AFHDS3) +#define IS_AFHDS3_PROTOCOL(protocol) (protocol == PROTOCOL_CHANNELS_AFHDS3) +#else +#define IS_AFHDS3_PROTOCOL(protocol) (0) +#endif extern uint8_t s_pulses_paused; -enum ModuleSettingsMode -{ - MODULE_MODE_NORMAL, - MODULE_MODE_SPECTRUM_ANALYSER, - MODULE_MODE_POWER_METER, - MODULE_MODE_GET_HARDWARE_INFO, - MODULE_MODE_MODULE_SETTINGS, - MODULE_MODE_RECEIVER_SETTINGS, - MODULE_MODE_BEEP_FIRST, - MODULE_MODE_REGISTER = MODULE_MODE_BEEP_FIRST, - MODULE_MODE_BIND, - MODULE_MODE_SHARE, - MODULE_MODE_RANGECHECK, - MODULE_MODE_RESET, - MODULE_MODE_AUTHENTICATION, - MODULE_MODE_OTA_UPDATE, -}; - - PACK(struct PXX2Version { uint8_t major; uint8_t revision:4; @@ -293,6 +279,10 @@ union ExternalModulePulsesData { Dsm2PulsesData dsm2; #endif +#if defined(AFHDS3) + afhds3::PulsesData afhds3; +#endif + PpmPulsesData ppm; CrossfirePulsesData crossfire; @@ -338,6 +328,11 @@ void extmodulePxx1SerialStart(); void extmodulePpmStart(); void intmoduleStop(); void extmoduleStop(); +void getModuleStatusString(uint8_t moduleIdx, char * statusText); +void getModuleSyncStatusString(uint8_t moduleIdx, char * statusText); +#if defined(AFHDS3) +uint8_t actualAfhdsRunPower(int moduleIndex); +#endif void extramodulePpmStart(); inline void startPulses() @@ -369,6 +364,7 @@ enum ChannelsProtocols { PROTOCOL_CHANNELS_SBUS, PROTOCOL_CHANNELS_PXX2_LOWSPEED, PROTOCOL_CHANNELS_PXX2_HIGHSPEED, + PROTOCOL_CHANNELS_AFHDS3 }; inline void stopPulses() @@ -434,4 +430,4 @@ inline bool isModuleInBeepMode() return false; } -#endif // _PULSES_H_ \ No newline at end of file +#endif // _PULSES_H_ diff --git a/radio/src/pulses/pulses_common.h b/radio/src/pulses/pulses_common.h index 83058f635..80f5518a1 100644 --- a/radio/src/pulses/pulses_common.h +++ b/radio/src/pulses/pulses_common.h @@ -31,6 +31,27 @@ typedef uint16_t trainer_pulse_duration_t; +enum ModuleSettingsMode +{ + MODULE_MODE_NORMAL, + MODULE_MODE_SPECTRUM_ANALYSER, + MODULE_MODE_POWER_METER, + MODULE_MODE_GET_HARDWARE_INFO, + MODULE_MODE_MODULE_SETTINGS, + MODULE_MODE_RECEIVER_SETTINGS, + MODULE_MODE_BEEP_FIRST, + MODULE_MODE_REGISTER = MODULE_MODE_BEEP_FIRST, + MODULE_MODE_BIND, + MODULE_MODE_SHARE, + MODULE_MODE_RANGECHECK, + MODULE_MODE_RESET, + MODULE_MODE_AUTHENTICATION, + MODULE_MODE_OTA_UPDATE, +}; + +ModuleSettingsMode getModuleMode(int moduleIndex); +void setModuleMode(int moduleIndex, ModuleSettingsMode mode); + template class DataBuffer { public: diff --git a/radio/src/targets/common/arm/CMakeLists.txt b/radio/src/targets/common/arm/CMakeLists.txt index 97ca896c6..3a8846dfc 100644 --- a/radio/src/targets/common/arm/CMakeLists.txt +++ b/radio/src/targets/common/arm/CMakeLists.txt @@ -148,7 +148,7 @@ endif() if(MULTIMODULE) add_definitions(-DMULTIMODULE) - set(SRC ${SRC} pulses/multi.cpp telemetry/spektrum.cpp telemetry/flysky_ibus.cpp telemetry/hitec.cpp telemetry/hott.cpp telemetry/multi.cpp io/multi_firmware_update.cpp) + set(SRC ${SRC} pulses/multi.cpp telemetry/spektrum.cpp telemetry/hitec.cpp telemetry/hott.cpp telemetry/multi.cpp io/multi_firmware_update.cpp) endif() if(CROSSFIRE) @@ -163,6 +163,18 @@ if(CROSSFIRE) ) endif() +if(AFHDS3) + add_definitions(-DAFHDS3) + set(PULSES_SRC + ${PULSES_SRC} + afhds3.cpp + ) +endif() + +if(MULTIMODULE OR AFHDS3) + set(SRC ${SRC} telemetry/flysky_ibus.cpp ) +endif() + add_definitions(-DCPUARM) add_definitions(-DGPS) add_definitions(-DBOLD_FONT -DBATTGRAPH -DTHRTRACE) diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index dfa235baa..4fa4238de 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -2,6 +2,7 @@ option(DISK_CACHE "Enable SD card disk cache" ON) option(UNEXPECTED_SHUTDOWN "Enable the Unexpected Shutdown screen" ON) option(PXX1 "PXX1 protocol support" ON) option(PXX2 "PXX2 protocol support" OFF) +option(AFHDS3 "AFHDS3 TX Module" ON) option(MULTIMODULE "DIY Multiprotocol TX Module (https://github.com/pascallanger/DIY-Multiprotocol-TX-Module)" ON) set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") diff --git a/radio/src/targets/horus/extmodule_driver.cpp b/radio/src/targets/horus/extmodule_driver.cpp index 7e8b90937..9c04aeb21 100644 --- a/radio/src/targets/horus/extmodule_driver.cpp +++ b/radio/src/targets/horus/extmodule_driver.cpp @@ -316,6 +316,30 @@ void extmoduleSendNextFrame() break; #endif +#if defined(AFHDS3) + case PROTOCOL_CHANNELS_AFHDS3: + { +#if defined(EXTMODULE_USART) && defined(EXTMODULE_TX_INVERT_GPIO) + extmoduleSendBuffer(extmodulePulsesData.afhds3.getData(), extmodulePulsesData.afhds3.getSize()); +#else + const uint16_t* dataPtr = extmodulePulsesData.afhds3.getData(); + uint32_t dataSize = extmodulePulsesData.afhds3.getSize(); + //Peripheral data size + //we know that afdhds3 uses 2 byte values! + uint32_t dmaSize = (EXTMODULE_TIMER_DMA_SIZE & (DMA_SxCR_PSIZE_0 | DMA_SxCR_PSIZE_1)) | DMA_SxCR_MSIZE_0; + + EXTMODULE_TIMER->CCR2 = dataPtr[dataSize -1] - 4000; // 2mS in advance + EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA + EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | dmaSize | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; + EXTMODULE_TIMER_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); + EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(dataPtr); + EXTMODULE_TIMER_DMA_STREAM->NDTR = (uint32_t)dataSize; + EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA +#endif + } + break; +#endif + #if defined(DSM2) case PROTOCOL_CHANNELS_SBUS: #if defined(PCBX10) || PCBREV >= 13 diff --git a/radio/src/targets/horus/telemetry_driver.cpp b/radio/src/targets/horus/telemetry_driver.cpp index ffb1cbc2c..23318dd7e 100644 --- a/radio/src/targets/horus/telemetry_driver.cpp +++ b/radio/src/targets/horus/telemetry_driver.cpp @@ -45,7 +45,8 @@ void telemetryPortInit(uint32_t baudrate, uint8_t mode) USART_DeInit(TELEMETRY_USART); return; } - + //deinit inverted mode + telemetryPortInvertedInit(0); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TELEMETRY_DMA_TX_Stream_IRQ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; @@ -136,6 +137,9 @@ void telemetryPortInit(uint32_t baudrate, uint8_t mode) // soft serial vars static uint8_t rxBitCount; static uint8_t rxByte; +// single bit length expresses in half us +static uint16_t bitLength; +static uint16_t probeTimeFromStartBit; void telemetryPortInvertedInit(uint32_t baudrate) { @@ -155,6 +159,20 @@ void telemetryPortInvertedInit(uint32_t baudrate) rxBitCount = 0; + switch(baudrate) { + case 115200: + bitLength = 17; + probeTimeFromStartBit = 23; //because pin is not probed immediately + break; + case 57600: + bitLength = 35; //34 was used before - I prefer to use use 35 because of lower error + probeTimeFromStartBit = 48; // 48 used in original implementation + break; + default: + bitLength = 2000000/baudrate; //because of 0,5 us tick + probeTimeFromStartBit = 3000000/baudrate; + } + // configure bit sample timer TELEMETRY_TIMER->PSC = (PERI2_FREQUENCY * TIMER_MULT_APB2) / 2000000 - 1; // 0.5uS TELEMETRY_TIMER->CCER = 0; @@ -196,7 +214,7 @@ void telemetryPortInvertedRxBit() { if (rxBitCount < 8) { if (rxBitCount == 0) { - TELEMETRY_TIMER->ARR = 34; + TELEMETRY_TIMER->ARR = bitLength; rxByte = 0; } else { @@ -209,7 +227,6 @@ void telemetryPortInvertedRxBit() ++rxBitCount; } else if (rxBitCount == 8) { - telemetryNoDMAFifo.push(rxByte); rxBitCount = 0; @@ -360,7 +377,7 @@ extern "C" void TELEMETRY_EXTI_IRQHandler(void) if (rxBitCount == 0) { - TELEMETRY_TIMER->ARR = 48; // 1,5 cycle from start at 57600bps + TELEMETRY_TIMER->ARR = probeTimeFromStartBit; // 1,5 cycle from start at 57600bps TELEMETRY_TIMER->CR1 |= TIM_CR1_CEN; // disable start bit interrupt diff --git a/radio/src/targets/sky9x/CMakeLists.txt b/radio/src/targets/sky9x/CMakeLists.txt index 0036e3630..4188444fe 100644 --- a/radio/src/targets/sky9x/CMakeLists.txt +++ b/radio/src/targets/sky9x/CMakeLists.txt @@ -10,6 +10,7 @@ set(TARGET_DIR sky9x) set(RADIO_DEPENDENCIES ${RADIO_DEPENDENCIES} 9x_bitmaps) set(PPM_LIMITS_SYMETRICAL YES) set(PXX1 YES) +set(AFHDS3 NO) add_definitions(-DDISABLE_MULTI_UPDATE) if(PCB STREQUAL 9XRPRO) diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index fe9a02922..82dbcef91 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -2,6 +2,7 @@ option(SHUTDOWN_CONFIRMATION "Shutdown confirmation" OFF) option(LCD_DUAL_BUFFER "Dual LCD Buffer" OFF) option(PXX1 "PXX1 protocol support" ON) option(PXX2 "PXX2 protocol support" OFF) +option(AFHDS3 "AFHDS3 TX Module" OFF) option(INTERNAL_MODULE_PPM "Support for PPM internal module" OFF) option(AUTOUPDATE "Auto update internal chips from SD" OFF) diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 19bd04525..0910f156e 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -278,7 +278,25 @@ void extmoduleSendNextFrame() extmoduleSendBuffer(extmodulePulsesData.pxx2.getData(), extmodulePulsesData.pxx2.getSize()); break; #endif - +#if defined(AFHDS3) + case PROTOCOL_CHANNELS_AFHDS3: + { +#if defined(EXTMODULE_USART) && defined(EXTMODULE_TX_INVERT_GPIO) + extmoduleSendBuffer(extmodulePulsesData.afhds3.getData(), extmodulePulsesData.afhds3.getSize()); +#else + const uint16_t* dataPtr = extmodulePulsesData.afhds3.getData(); + uint32_t dataSize = extmodulePulsesData.afhds3.getSize(); + EXTMODULE_TIMER->CCR2 = dataPtr[dataSize -1] - 4000; // 2mS in advance + EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA + EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; + EXTMODULE_TIMER_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); + EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(dataPtr); + EXTMODULE_TIMER_DMA_STREAM->NDTR = dataSize; + EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA +#endif + } + break; +#endif #if defined(SBUS) || defined(DSM2) || defined(MULTIMODULE) case PROTOCOL_CHANNELS_SBUS: EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_SBUS_POLARITY(EXTERNAL_MODULE) ? 0 : EXTMODULE_TIMER_OUTPUT_POLARITY); // reverse polarity for Sbus if needed diff --git a/radio/src/targets/taranis/telemetry_driver.cpp b/radio/src/targets/taranis/telemetry_driver.cpp index e5b0d8cfe..b46eca541 100644 --- a/radio/src/targets/taranis/telemetry_driver.cpp +++ b/radio/src/targets/taranis/telemetry_driver.cpp @@ -40,7 +40,8 @@ void telemetryPortInit(uint32_t baudrate, uint8_t mode) USART_DeInit(TELEMETRY_USART); return; } - + //deinit inverted mode + telemetryPortInvertedInit(0); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TELEMETRY_DMA_TX_Stream_IRQ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; @@ -87,11 +88,10 @@ void telemetryPortInit(uint32_t baudrate, uint8_t mode) // soft serial vars static uint8_t rxBitCount; static uint8_t rxByte; +// single bit length expresses in half us +static uint16_t bitLength; +static uint16_t probeTimeFromStartBit; -//TODO: -// - only 57600 supported for now -// - handle other bitrates as well? -// void telemetryPortInvertedInit(uint32_t baudrate) { if (baudrate == 0) { @@ -116,6 +116,20 @@ void telemetryPortInvertedInit(uint32_t baudrate) rxBitCount = 0; + switch(baudrate) { + case 115200: + bitLength = 17; + probeTimeFromStartBit = 25; + break; + case 57600: + bitLength = 35; //34 was used before - I prefer to use use 35 because of lower error + probeTimeFromStartBit = 52; //round down - 48 used in original implementation + break; + default: + bitLength = 2000000/baudrate; //because of 0,5 us tick + probeTimeFromStartBit = 3000000/baudrate; + } + // configure bit sample timer TELEMETRY_TIMER->PSC = (PERI2_FREQUENCY * TIMER_MULT_APB2) / 2000000 - 1; // 0.5uS TELEMETRY_TIMER->CCER = 0; @@ -162,7 +176,7 @@ void telemetryPortInvertedRxBit() { if (rxBitCount < 8) { if (rxBitCount == 0) { - TELEMETRY_TIMER->ARR = 34; + TELEMETRY_TIMER->ARR = bitLength; rxByte = 0; } else { @@ -333,7 +347,7 @@ void check_telemetry_exti() if (rxBitCount == 0) { - TELEMETRY_TIMER->ARR = 48; // 1,5 cycle from start at 57600bps + TELEMETRY_TIMER->ARR = probeTimeFromStartBit; // 1,5 cycle from start at 57600bps TELEMETRY_TIMER->CR1 |= TIM_CR1_CEN; // disable start bit interrupt diff --git a/radio/src/telemetry/flysky_ibus.cpp b/radio/src/telemetry/flysky_ibus.cpp index af4d4b82c..4b2d05da9 100644 --- a/radio/src/telemetry/flysky_ibus.cpp +++ b/radio/src/telemetry/flysky_ibus.cpp @@ -61,7 +61,8 @@ enum AFHDS2A_ID_GPS_DIST = 0x14, // 2 bytes distance from home m unsigned AFHDS2A_ID_ARMED = 0x15, // 2 bytes AFHDS2A_ID_FLIGHT_MODE = 0x16, // 2 bytes - + AFHDS3_FRM_TEMP = 0x57, //virtual + AFHDS3_FRM_EXT_V = 0x58, //virtual AFHDS2A_ID_PRES = 0x41, // Pressure AFHDS2A_ID_ODO1 = 0x7C, // Odometer1 AFHDS2A_ID_ODO2 = 0x7D, // Odometer2 @@ -79,8 +80,9 @@ enum AFHDS2A_ID_S88 = 0x88, AFHDS2A_ID_S89 = 0x89, AFHDS2A_ID_S8a = 0x8A, - - AFHDS2A_ID_ALT_FLYSKY = 0xF9, // Altitude 2 bytes signed in m - used in FlySky native TX - SIGNED value + AFHDS2A_ID_RX_SIG_AFHDS3 = 0xF7, // SIG + AFHDS2A_ID_RX_SNR_AFHDS3 = 0xF8, // SNR + AFHDS2A_ID_ALT_FLYSKY = 0xF9, // Altitude 2 bytes signed in m - used in FlySky native TX AFHDS2A_ID_RX_SNR = 0xFA, // SNR AFHDS2A_ID_RX_NOISE = 0xFB, // Noise AFHDS2A_ID_RX_RSSI = 0xFC, // RSSI @@ -120,6 +122,8 @@ const FlySkySensor flySkySensors[] = { {AFHDS2A_ID_FLIGHT_MODE, ZSTR_FLIGHT_MODE, UNIT_RAW, 0}, // 2 bytes index {AFHDS2A_ID_PRES, ZSTR_PRES, UNIT_RAW, 2}, // 4 bytes In fact Temperature + Pressure -> Altitude {AFHDS2A_ID_PRES | 0x100, ZSTR_TEMP2, UNIT_CELSIUS, 1}, // 2 bytes Temperature + {AFHDS3_FRM_TEMP, ZSTR_TEMP2, UNIT_CELSIUS, 1}, // 2 bytes temperature + {AFHDS3_FRM_EXT_V, ZSTR_TXV, UNIT_VOLTS, 2}, // 2 bytes voltage {AFHDS2A_ID_ODO1, ZSTR_ODO1, UNIT_METERS, 2}, // 2 bytes Odometer1 -- some magic with 330 needed {AFHDS2A_ID_ODO2, ZSTR_ODO2, UNIT_METERS, 2}, // 2 bytes Odometer2 -- some magic with 330 needed {AFHDS2A_ID_SPE, ZSTR_ASPD, UNIT_KMH, 2}, // 2 bytes Speed km/h -- some magic with 330 needed @@ -128,7 +132,8 @@ const FlySkySensor flySkySensors[] = { {AFHDS2A_ID_GPS_LON, ZSTR_GPS, UNIT_RAW, 7}, // 4 bytes signed WGS84 in degrees * 1E7 {AFHDS2A_ID_GPS_ALT, ZSTR_GPSALT, UNIT_METERS, 2}, // 4 bytes signed GPS alt m*100 {AFHDS2A_ID_ALT, ZSTR_ALT, UNIT_METERS, 2}, // 4 bytes signed Alt m*100 - + {AFHDS2A_ID_RX_SIG_AFHDS3, ZSTR_RX_QUALITY, UNIT_RAW, 0}, // RX error rate + {AFHDS2A_ID_RX_SNR_AFHDS3, ZSTR_RX_SNR, UNIT_DB, 1}, // RX SNR {AFHDS2A_ID_RX_SNR, ZSTR_RX_SNR, UNIT_DB, 0}, // RX SNR {AFHDS2A_ID_RX_NOISE, ZSTR_RX_NOISE, UNIT_DB, 0}, // RX Noise {AFHDS2A_ID_RX_RSSI, ZSTR_RSSI, UNIT_DB, 0}, // RX RSSI (0xfc) @@ -140,7 +145,7 @@ const FlySkySensor flySkySensors[] = { int32_t getALT(uint32_t value); -static void processFlySkySensor(const uint8_t * packet, uint8_t type) +void processFlySkySensor(const uint8_t * packet, uint8_t type) { uint8_t buffer[8]; uint16_t id = packet[0]; @@ -156,13 +161,17 @@ static void processFlySkySensor(const uint8_t * packet, uint8_t type) if (id == 0) id = 0x100; // Some part of OpenTX does not like sensor with id and instance 0, remap to 0x100 if (id == AFHDS2A_ID_RX_NOISE || id == AFHDS2A_ID_RX_RSSI) { - value = -value; + value = 135 - value; } else if (id == AFHDS2A_ID_RX_ERR_RATE) { value = 100 - value; telemetryData.rssi.set(value); if (value > 0) telemetryStreaming = TELEMETRY_TIMEOUT10ms; } + else if(id == AFHDS2A_ID_RX_SIG_AFHDS3) { + telemetryData.rssi.set(value); + if(value>0) telemetryStreaming = TELEMETRY_TIMEOUT10ms; + } else if (id == AFHDS2A_ID_PRES && value) { // Extract temperature to a new sensor setTelemetryValue(PROTOCOL_TELEMETRY_FLYSKY_IBUS, id | 0x100, 0, instance, ((value >> 19) - 400), UNIT_CELSIUS, 1); @@ -216,7 +225,7 @@ static void processFlySkySensor(const uint8_t * packet, uint8_t type) for (const FlySkySensor * sensor = flySkySensors; sensor->id; sensor++) { if (sensor->id != id) continue; if (sensor->unit == UNIT_CELSIUS) value -= 400; // Temperature sensors have 40 degree offset - else if (sensor->unit == UNIT_VOLTS) value = (uint16_t) value; // Voltage types are unsigned 16bit integers + else if (sensor->unit == UNIT_VOLTS) value = (int16_t) value; // Voltage types are unsigned 16bit integers setTelemetryValue(PROTOCOL_TELEMETRY_FLYSKY_IBUS, id, 0, instance, value, sensor->unit, sensor->precision); return; } @@ -390,4 +399,4 @@ int32_t getALT(uint32_t value) if (neg ^ tempNegative) result = result * -1; return result; -} \ No newline at end of file +} diff --git a/radio/src/telemetry/flysky_ibus.h b/radio/src/telemetry/flysky_ibus.h index bfb0db640..dd30e0058 100644 --- a/radio/src/telemetry/flysky_ibus.h +++ b/radio/src/telemetry/flysky_ibus.h @@ -21,6 +21,8 @@ #ifndef _FLYSKY_IBUS_H #define _FLYSKY_IBUS_H +void processFlySkySensor(const uint8_t *packet, uint8_t type); + void processFlySkyTelemetryData(uint8_t data, uint8_t * rxBuffer, uint8_t &rxBufferCount); void flySkySetDefault(int index, uint16_t id, uint8_t subId, uint8_t instance); diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 4e7bc8550..a5f1af94f 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -20,6 +20,7 @@ #include "opentx.h" #include "multi.h" +#include "pulses/afhds3.h" uint8_t telemetryStreaming = 0; uint8_t telemetryRxBuffer[TELEMETRY_RX_PACKET_SIZE]; // Receive buffer. 9 bytes (full packet), worst case 18 bytes with byte-stuffing (+1) @@ -59,6 +60,13 @@ void processTelemetryData(uint8_t data) } #endif +#if defined(AFHDS3) + if (telemetryProtocol == PROTOCOL_TELEMETRY_AFHDS3) { + afhds3::processTelemetryData(EXTERNAL_MODULE, data, telemetryRxBuffer, telemetryRxBufferCount, TELEMETRY_RX_PACKET_SIZE); + return; + } +#endif + processFrskyTelemetryData(data); } @@ -103,7 +111,7 @@ void telemetryWakeup() #endif #if defined(EXTMODULE_USART) - while (extmoduleFifo.getFrame(frame)) { + while (isModulePxx2(EXTERNAL_MODULE) && extmoduleFifo.getFrame(frame)) { processPXX2Frame(EXTERNAL_MODULE, frame); } #endif @@ -294,6 +302,13 @@ void telemetryInit(uint8_t protocol) } #endif +#if defined(AFHDS3) && !defined(SIMU) + else if (protocol == PROTOCOL_TELEMETRY_AFHDS3) { + telemetryPortInvertedInit(AFHDS3_BAUDRATE); + telemetryPortSetDirectionInput(); + } +#endif + else { telemetryPortInit(FRSKY_SPORT_BAUDRATE, TELEMETRY_SERIAL_WITHOUT_DMA); #if defined(LUA) diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index 506b949a5..74671bbd4 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -28,11 +28,13 @@ #if defined(MULTIMODULE) #include "spektrum.h" - #include "flysky_ibus.h" #include "hitec.h" #include "hott.h" #include "multi.h" #endif +#if defined(MULTIMODULE) || defined(AFHDS3) + #include "flysky_ibus.h" +#endif extern uint8_t telemetryStreaming; // >0 (true) == data is streaming in. 0 = no data detected for some time @@ -54,7 +56,7 @@ constexpr uint8_t TELEMETRY_TIMEOUT10ms = 100; // 1 second #define TELEMETRY_SERIAL_8E2 1 #define TELEMETRY_SERIAL_WITHOUT_DMA 2 -#if defined(CROSSFIRE) || defined(MULTIMODULE) +#if defined(CROSSFIRE) || defined(MULTIMODULE) || defined(AFHDS3) #define TELEMETRY_RX_PACKET_SIZE 128 // multi module Spektrum telemetry is 18 bytes, FlySky is 37 bytes #else @@ -162,6 +164,11 @@ inline uint8_t modelTelemetryProtocol() return PROTOCOL_TELEMETRY_MULTIMODULE; } #endif +#endif +#if defined(AFHDS3) + if (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_AFHDS3) { + return PROTOCOL_TELEMETRY_AFHDS3; + } #endif // default choice return PROTOCOL_TELEMETRY_FRSKY_SPORT; diff --git a/radio/src/telemetry/telemetry_sensors.cpp b/radio/src/telemetry/telemetry_sensors.cpp index 0896e1424..d94a8471a 100644 --- a/radio/src/telemetry/telemetry_sensors.cpp +++ b/radio/src/telemetry/telemetry_sensors.cpp @@ -526,13 +526,15 @@ int setTelemetryValue(TelemetryProtocol protocol, uint16_t id, uint8_t subId, ui crossfireSetDefault(index, id, instance); break; #endif +#if defined(MULTIMODULE) || defined(AFHDS3) + case PROTOCOL_TELEMETRY_FLYSKY_IBUS: + flySkySetDefault(index,id, subId, instance); + break; +#endif #if defined(MULTIMODULE) case PROTOCOL_TELEMETRY_SPEKTRUM: spektrumSetDefault(index, id, subId, instance); break; - case PROTOCOL_TELEMETRY_FLYSKY_IBUS: - flySkySetDefault(index,id, subId, instance); - break; case PROTOCOL_TELEMETRY_HITEC: hitecSetDefault(index, id, subId, instance); break; diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 906bf56c7..ab57c5a33 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -68,6 +68,8 @@ ISTR(XJT_ACCST_RF_PROTOCOLS); ISTR(ISRM_RF_PROTOCOLS); ISTR(R9M_PXX2_RF_PROTOCOLS); ISTR(DSM_PROTOCOLS); +ISTR(AFHDS3_PROTOCOLS); +ISTR(AFHDS3_POWERS); ISTR(CURVE_TYPES); ISTR(VSENSORTYPES); ISTR(VFORMULAS); @@ -468,6 +470,7 @@ const char STR_BINDING_1_8_TELEM_OFF[] = TR_BINDING_CH1_8_TELEM_OFF; const char STR_BINDING_9_16_TELEM_ON[] = TR_BINDING_CH9_16_TELEM_ON; const char STR_BINDING_9_16_TELEM_OFF[] = TR_BINDING_CH9_16_TELEM_OFF; const char STR_CHANNELRANGE[] = TR_CHANNELRANGE; +const char STR_RXFREQUENCY[] = TR_RXFREQUENCY; const char STR_ANTENNACONFIRM1[] = TR_ANTENNACONFIRM1; const char STR_ANTENNACONFIRM2[] = TR_ANTENNACONFIRM2; const char STR_USE_INTERNAL_ANTENNA[] = TR_USE_INTERNAL_ANTENNA; @@ -715,8 +718,16 @@ const char STR_MULTI_SERVOFREQ[] = TR_MULTI_SERVOFREQ; const char STR_MULTI_MAX_THROW[] = TR_MULTI_MAX_THROW; const char STR_MULTI_RFCHAN[] = TR_MULTI_RFCHAN; const char STR_NEEDS_FILE[] = TR_NEEDS_FILE; -const char STR_EXT_MULTI_SPEC[] = TR_EXT_MULTI_SPEC; -const char STR_INT_MULTI_SPEC[] = TR_INT_MULTI_SPEC; +const char STR_EXT_MULTI_SPEC[] = TR_EXT_MULTI_SPEC; +const char STR_INT_MULTI_SPEC[] = TR_INT_MULTI_SPEC; + +#if defined(AFHDS3) +const char STR_AFHDS3_RX_FREQ[] = TR_AFHDS3_RX_FREQ; +const char STR_AFHDS3_ACTUAL_POWER[] = TR_AFHDS3_ACTUAL_POWER; +const char STR_AFHDS3_POWER_SOURCE[] = TR_AFHDS3_POWER_SOURCE; +const char STR_AFHDS3_ONE_TO_ONE_TELEMETRY[] =TR_AFHDS3_ONE_TO_ONE_TELEMETRY; +const char STR_AFHDS3_ONE_TO_MANY[] = TR_AFHDS3_ONE_TO_MANY; +#endif #if LCD_W < 212 const char STR_SUBTYPE[] = TR_SUBTYPE; diff --git a/radio/src/translations.h b/radio/src/translations.h index c10c7ffde..a4b9fbb32 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -164,6 +164,16 @@ extern const char STR_DSM_PROTOCOLS[]; extern const char STR_MULTI_PROTOCOLS[]; #endif +#if defined(AFHDS3) +extern const char STR_AFHDS3_ONE_TO_ONE_TELEMETRY[]; +extern const char STR_AFHDS3_ONE_TO_MANY[]; +extern const char STR_AFHDS3_PROTOCOLS[]; +extern const char STR_AFHDS3_POWERS[]; +extern const char STR_AFHDS3_RX_FREQ[]; +extern const char STR_AFHDS3_ACTUAL_POWER[]; +extern const char STR_AFHDS3_POWER_SOURCE[]; +#endif + extern const char STR_CURVE_TYPES[]; extern const char STR_VSENSORTYPES[]; extern const char STR_VFORMULAS[]; @@ -764,6 +774,7 @@ extern const char STR_BINDING_1_8_TELEM_OFF[]; extern const char STR_BINDING_9_16_TELEM_ON[]; extern const char STR_BINDING_9_16_TELEM_OFF[]; extern const char STR_CHANNELRANGE[]; +extern const char STR_RXFREQUENCY[]; extern const char STR_ANTENNASELECTION[]; extern const char STR_ANTENNACONFIRM1[]; extern const char STR_ANTENNACONFIRM2[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 2086ff7a8..7ae453e04 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -935,6 +935,12 @@ #define TR_UNIT "Jednotky" #define TR_TELEMETRY_NEWSENSOR INDENT "Přidat senzor ručně" #define TR_CHANNELRANGE TR(INDENT "Kanály", INDENT "Rozsah kanálů") +#define TR_AFHDS3_RX_FREQ TR("RX freq.", "RX frequency") +#define TR_AFHDS3_ONE_TO_ONE_TELEMETRY TR("Unicast/Tel.", "Unicast/Telemetry") +#define TR_AFHDS3_ONE_TO_MANY "Multicast" +#define TR_AFHDS3_ACTUAL_POWER TR("Act. pow", "Actual power") +#define TR_AFHDS3_POWER_SOURCE TR("Power src.", TR("Power src.", "Power source")) +#define TR_RXFREQUENCY TR(INDENT "RX Freq.", INDENT "RX Frequency") #define TR_ANTENNACONFIRM1 "Opravdu přepnout?" #if defined(PCBX12S) #define LEN_ANTENNA_MODES "\023" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index fc900bcdf..e0e4eb437 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -941,6 +941,12 @@ #define TR_UNIT "Einheit" #define TR_TELEMETRY_NEWSENSOR INDENT "Sensor hinzufügen ..." #define TR_CHANNELRANGE TR(INDENT "Kanäle", INDENT "Ausgangs Kanäle") //wg 9XR-Pro +#define TR_AFHDS3_RX_FREQ TR("RX freq.", "RX frequency") +#define TR_AFHDS3_ONE_TO_ONE_TELEMETRY TR("Unicast/Tel.", "Unicast/Telemetry") +#define TR_AFHDS3_ONE_TO_MANY "Multicast" +#define TR_AFHDS3_ACTUAL_POWER TR("Act. pow", "Actual power") +#define TR_AFHDS3_POWER_SOURCE TR("Power src.", "Power source") +#define TR_RXFREQUENCY TR(INDENT "RX Freq.", INDENT "RX Frequency") #define TR_ANTENNACONFIRM1 "Ant. umschalten" #if defined(PCBX12S) #define LEN_ANTENNA_MODES "\023" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index eae2ad25a..a270a1f34 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -663,6 +663,11 @@ #define TR_MULTI_SERVOFREQ TR("Servo rate", "Servo update rate") #define TR_MULTI_MAX_THROW TR("Max. Throw", "Enable max. throw") #define TR_MULTI_RFCHAN TR("RF Channel", "Select RF channel") +#define TR_AFHDS3_RX_FREQ TR("RX freq.", "RX frequency") +#define TR_AFHDS3_ONE_TO_ONE_TELEMETRY TR("Unicast/Tel.", "Unicast/Telemetry") +#define TR_AFHDS3_ONE_TO_MANY "Multicast" +#define TR_AFHDS3_ACTUAL_POWER TR("Act. pow", "Actual power") +#define TR_AFHDS3_POWER_SOURCE TR("Power src.", "Power source") #define TR_SYNCMENU "[Sync]" #define TR_LIMIT INDENT "Limit" #define TR_MINRSSI "Min Rssi" @@ -940,6 +945,7 @@ #define TR_UNIT "Unit" #define TR_TELEMETRY_NEWSENSOR INDENT "Add a new sensor..." #define TR_CHANNELRANGE TR(INDENT "Ch. Range", INDENT "Channel Range") +#define TR_RXFREQUENCY TR(INDENT "RX Freq.", INDENT "RX Frequency") #define TR_ANTENNACONFIRM1 "EXT. ANTENNA" #if defined(PCBX12S) #define LEN_ANTENNA_MODES "\023" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 16752d94f..822ace072 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -938,6 +938,12 @@ #define TR_UNIT "Unidad" #define TR_TELEMETRY_NEWSENSOR INDENT "Añadir sensor..." #define TR_CHANNELRANGE INDENT "Canales" +#define TR_AFHDS3_RX_FREQ TR("RX freq.", "RX frequency") +#define TR_AFHDS3_ONE_TO_ONE_TELEMETRY TR("Unicast/Tel.", "Unicast/Telemetry") +#define TR_AFHDS3_ONE_TO_MANY "Multicast" +#define TR_AFHDS3_ACTUAL_POWER TR("Act. pow", "Actual power") +#define TR_AFHDS3_POWER_SOURCE TR("Power src.", "Power source") +#define TR_RXFREQUENCY TR(INDENT "RX Freq.", INDENT "RX Frequency") #define TR_ANTENNACONFIRM1 "ANTENA EXT." #if defined(PCBX12S) #define LEN_ANTENNA_MODES "\020" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 22b2ac966..ec28eabcb 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -954,6 +954,12 @@ #define TR_UNIT "Unit" #define TR_TELEMETRY_NEWSENSOR INDENT "Add a new sensor..." #define TR_CHANNELRANGE INDENT "Channel Range" +#define TR_AFHDS3_RX_FREQ TR("RX freq.", "RX frequency") +#define TR_AFHDS3_ONE_TO_ONE_TELEMETRY TR("Unicast/Tel.", "Unicast/Telemetry") +#define TR_AFHDS3_ONE_TO_MANY "Multicast" +#define TR_AFHDS3_ACTUAL_POWER TR("Act. pow", "Actual power") +#define TR_AFHDS3_POWER_SOURCE TR("Power src.", "Power source") +#define TR_RXFREQUENCY TR(INDENT "RX Freq.", INDENT "RX Frequency") #define TR_ANTENNACONFIRM1 "EXT. ANTENNA" #if defined(PCBX12S) #define LEN_ANTENNA_MODES "\023" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 5ef45e312..466effb38 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -956,6 +956,12 @@ #define TR_UNIT "Unité" #define TR_TELEMETRY_NEWSENSOR TR(INDENT"Nouveau capteur...", INDENT "Ajout d'un nouveau capteur...") #define TR_CHANNELRANGE TR(INDENT "Canaux", INDENT "Plage de canaux") +#define TR_AFHDS3_RX_FREQ TR("RX freq.", "RX frequency") +#define TR_AFHDS3_ONE_TO_ONE_TELEMETRY TR("Unicast/Tel.", "Unicast/Telemetry") +#define TR_AFHDS3_ONE_TO_MANY "Multicast" +#define TR_AFHDS3_ACTUAL_POWER TR("Act. pow", "Actual power") +#define TR_AFHDS3_POWER_SOURCE TR("Power src.", "Power source") +#define TR_RXFREQUENCY TR(INDENT "RX Freq.", INDENT "RX Frequency") #define TR_ANTENNACONFIRM1 "Vraiment changer?" #if defined(PCBX12S) #define LEN_ANTENNA_MODES "\021" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 22416cdd2..cea9b2716 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -956,6 +956,12 @@ #define TR_UNIT "Unita" #define TR_TELEMETRY_NEWSENSOR INDENT "Aggiungi nuovo sensore" #define TR_CHANNELRANGE INDENT "Numero Canali" +#define TR_AFHDS3_RX_FREQ TR("RX freq.", "RX frequency") +#define TR_AFHDS3_ONE_TO_ONE_TELEMETRY TR("Unicast/Tel.", "Unicast/Telemetry") +#define TR_AFHDS3_ONE_TO_MANY "Multicast" +#define TR_AFHDS3_ACTUAL_POWER TR("Act. pow", "Actual power") +#define TR_AFHDS3_POWER_SOURCE TR("Power src.", "Power source") +#define TR_RXFREQUENCY TR(INDENT "RX Freq.", INDENT "RX Frequency") #define TR_ANTENNACONFIRM1 "ANTENNA EST." #if defined(PCBX12S) #define LEN_ANTENNA_MODES "\023" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index a3c642135..5c4310875 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -942,6 +942,12 @@ #define TR_UNIT "Eenheid" #define TR_TELEMETRY_NEWSENSOR INDENT "Sensor toevoegen ..." #define TR_CHANNELRANGE TR(INDENT "Kanalen", INDENT "Uitgangs Kanalen") //wg 9XR-Pro +#define TR_AFHDS3_RX_FREQ TR("RX freq.", "RX frequency") +#define TR_AFHDS3_ONE_TO_ONE_TELEMETRY TR("Unicast/Tel.", "Unicast/Telemetry") +#define TR_AFHDS3_ONE_TO_MANY "Multicast" +#define TR_AFHDS3_ACTUAL_POWER TR("Act. pow", "Actual power") +#define TR_AFHDS3_POWER_SOURCE TR("Power src.", "Power source") +#define TR_RXFREQUENCY TR(INDENT "RX Freq.", INDENT "RX Frequency") #define TR_ANTENNACONFIRM1 "Antennes wisselen?" #if defined(PCBX12S) #define LEN_ANTENNA_MODES "\023" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index e64b4edff..9f3efa84f 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -955,6 +955,12 @@ #define TR_UNIT "Jedn" #define TR_TELEMETRY_NEWSENSOR INDENT "Dodaj nowy czujnik..." #define TR_CHANNELRANGE TR(INDENT "ZakrKn",INDENT "Zakres kanału") +#define TR_AFHDS3_RX_FREQ TR("RX freq.", "RX frequency") +#define TR_AFHDS3_ONE_TO_ONE_TELEMETRY TR("Unicast/Tel.", "Unicast/Telemetry") +#define TR_AFHDS3_ONE_TO_MANY "Multicast" +#define TR_AFHDS3_ACTUAL_POWER TR("Act. pow", "Actual power") +#define TR_AFHDS3_POWER_SOURCE TR("Power src.", "Power source") +#define TR_RXFREQUENCY TR(INDENT "RX Freq.", INDENT "RX Frequency") #define TR_ANTENNACONFIRM1 "EXT. ANTENNA" #if defined(PCBX12S) #define LEN_ANTENNA_MODES "\023" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 75830e538..e11cd03e6 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -945,6 +945,12 @@ #define TR_UNIT "Unit" #define TR_TELEMETRY_NEWSENSOR INDENT "Add a new sensor..." #define TR_CHANNELRANGE INDENT "Channel Range" +#define TR_AFHDS3_RX_FREQ TR("RX freq.", "RX frequency") +#define TR_AFHDS3_ONE_TO_ONE_TELEMETRY TR("Unicast/Tel.", "Unicast/Telemetry") +#define TR_AFHDS3_ONE_TO_MANY "Multicast" +#define TR_AFHDS3_ACTUAL_POWER TR("Act. pow", "Actual power") +#define TR_AFHDS3_POWER_SOURCE TR("Power src.", "Power source") +#define TR_RXFREQUENCY TR(INDENT "RX Freq.", INDENT "RX Frequency") #define TR_ANTENNACONFIRM1 "EXT. ANTENNA" #if defined(PCBX12S) #define LEN_ANTENNA_MODES "\023" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 368ad237b..ab1e44f3b 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -955,6 +955,12 @@ #define TR_UNIT "Enhet" #define TR_TELEMETRY_NEWSENSOR INDENT "Lägg till sensor..." #define TR_CHANNELRANGE INDENT "Kanalområde" +#define TR_AFHDS3_RX_FREQ TR("RX freq.", "RX frequency") +#define TR_AFHDS3_ONE_TO_ONE_TELEMETRY TR("Unicast/Tel.", "Unicast/Telemetry") +#define TR_AFHDS3_ONE_TO_MANY "Multicast" +#define TR_AFHDS3_ACTUAL_POWER TR("Act. pow", "Actual power") +#define TR_AFHDS3_POWER_SOURCE TR("Power src.", "Power source") +#define TR_RXFREQUENCY TR(INDENT "RX Freq.", INDENT "RX Frequency") #define TR_ANTENNACONFIRM1 "EXT. ANTENNA" #if defined(PCBX12S) #define LEN_ANTENNA_MODES "\023" diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h index 38631545a..97a431879 100644 --- a/radio/src/translations/untranslated.h +++ b/radio/src/translations/untranslated.h @@ -87,7 +87,7 @@ #endif #define LEN_EXTERNAL_MODULE_PROTOCOLS "\014" -#define TR_EXTERNAL_MODULE_PROTOCOLS "OFF\0 ""PPM\0 ""XJT\0 ""ISRM\0 ""DSM2\0 ""CRSF\0 ""MULTI\0 ""R9M\0 ""R9M ACCESS\0 " TR_MODULE_R9M_LITE "R9ML ACCESS\0""R9MLP\0 ""R9MLP ACCESS""SBUS\0 ""XJT Lite" +#define TR_EXTERNAL_MODULE_PROTOCOLS "OFF\0 ""PPM\0 ""XJT\0 ""ISRM\0 ""DSM2\0 ""CRSF\0 ""MULTI\0 ""R9M\0 ""R9M ACCESS\0 " TR_MODULE_R9M_LITE "R9ML ACCESS\0""R9MLP\0 ""R9MLP ACCESS""SBUS\0 ""XJT Lite\0 ""AFHDS3" #define LEN_INTERNAL_MODULE_PROTOCOLS LEN_EXTERNAL_MODULE_PROTOCOLS #define TR_INTERNAL_MODULE_PROTOCOLS TR_EXTERNAL_MODULE_PROTOCOLS @@ -125,4 +125,11 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\007" + #define TR_MULTI_PROTOCOLS "FlySky\0""Hubsan\0""FrSky\0 ""Hisky\0 ""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0 ""KN\0 ""SymaX\0 ""SLT\0 ""CX10\0 ""CG023\0 ""Bayang\0""ESky\0 ""MT99XX\0""MJXq\0 ""Shenqi\0""FY326\0 ""SFHSS\0 ""J6 Pro\0""FQ777\0 ""Assan\0 ""Hontai\0""OpenLrs""FlSky2A""Q2x2\0 ""Walkera""Q303\0 ""GW008\0 ""DM002\0 ""Cabell\0""Esky150""H8 3D\0 ""Corona\0""CFlie\0 ""Hitec\0 ""WFly\0 ""Bugs\0 ""BugMini""Traxxas""NCC1701""E01X\0 ""V911S\0 ""GD00X\0 ""V761\0 ""KF606\0 ""Redpine""Potensi""ZSX\0 ""FlyZone""Scanner""FrSkyRX""FS2A_RX""HoTT\0 ""FX816\0 ""BayanRX""Pelikan""Tiger\0 ""XK\0 ""XN297DU""FrSkyX2""FrSkyR9""Propel\0""FrSkyL\0""Skyartc""ESky-v2""DSM RX\0""JJRC345""Q90C\0 " + +#define LEN_AFHDS3_PROTOCOLS "\x008" +#define TR_AFHDS3_PROTOCOLS "PWM/IBUS""PWM/SBUS""PPM/IBUS""PPM/SBUS" + +#define LEN_AFHDS3_POWERS "\006" +#define TR_AFHDS3_POWERS "25 mW\0""100 mW""500 mW""1 W\0 ""2 W\0 " diff --git a/radio/util/fwoptions.py b/radio/util/fwoptions.py index 8ee448f11..cae773561 100755 --- a/radio/util/fwoptions.py +++ b/radio/util/fwoptions.py @@ -77,7 +77,8 @@ options_taranis_x9d = { "internalppm": ("INTERNAL_MODULE_PPM", "YES", "NO"), "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), "eu": ("MODULE_PROTOCOL_D8", "NO", "YES"), - "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None) + "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), + "afhds3": ("AFHDS3", "YES", "NO") } options_taranis_x9dp = { @@ -93,7 +94,8 @@ options_taranis_x9dp = { "internalppm": ("INTERNAL_MODULE_PPM", "YES", "NO"), "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), "eu": ("MODULE_PROTOCOL_D8", "NO", "YES"), - "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None) + "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), + "afhds3": ("AFHDS3", "YES", "NO") } options_taranis_x9lite = { @@ -110,7 +112,8 @@ options_taranis_x9lite = { "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), "eu": ("MODULE_PROTOCOL_D8", "NO", "YES"), "internalpxx1": ("INTERNAL_MODULE_PXX1", "YES", "NO"), - "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None) + "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), + "afhds3": ("AFHDS3", "YES", "NO") } options_taranis_xlite = { @@ -124,7 +127,8 @@ options_taranis_xlite = { "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), "eu": ("MODULE_PROTOCOL_D8", "NO", "YES"), - "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None) + "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), + "afhds3": ("AFHDS3", "YES", "NO") } options_taranis_xlites = { @@ -140,7 +144,8 @@ options_taranis_xlites = { "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), "eu": ("MODULE_PROTOCOL_D8", "NO", "YES"), "internalpxx1": ("INTERNAL_MODULE_PXX1", "YES", "NO"), - "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None) + "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), + "afhds3": ("AFHDS3", "YES", "NO") } options_taranis_x9e = { @@ -156,7 +161,8 @@ options_taranis_x9e = { "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), "eu": ("MODULE_PROTOCOL_D8", "NO", "YES"), "horussticks": ("STICKS", "HORUS", "STANDARD"), - "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None) + "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), + "afhds3": ("AFHDS3", "YES", "NO") } options_horus_x12s = { @@ -170,7 +176,8 @@ options_horus_x12s = { "eu": ("MODULE_PROTOCOL_D8", "NO", "YES"), "pcbdev": ("PCBREV", "10", None), "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), - "internalaccess": [("INTERNAL_MODULE_PXX1", "NO", None), ("INTERNAL_MODULE_PXX2", "YES", None)] + "internalaccess": [("INTERNAL_MODULE_PXX1", "NO", None), ("INTERNAL_MODULE_PXX2", "YES", None)], + "afhds3": ("AFHDS3", "YES", "NO") } options_horus_x10 = { @@ -183,7 +190,8 @@ options_horus_x10 = { "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), "eu": ("MODULE_PROTOCOL_D8", "NO", "YES"), "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), - "internalaccess": [("INTERNAL_MODULE_PXX1", "NO", None), ("INTERNAL_MODULE_PXX2", "YES", None)] + "internalaccess": [("INTERNAL_MODULE_PXX1", "NO", None), ("INTERNAL_MODULE_PXX2", "YES", None)], + "afhds3": ("AFHDS3", "YES", "NO") } options_horus_x10express = { @@ -196,7 +204,8 @@ options_horus_x10express = { "faichoice": ("FAI", "CHOICE", None), "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), "eu": ("MODULE_PROTOCOL_D8", "NO", "YES"), - "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None) + "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), + "afhds3": ("AFHDS3", "YES", "NO") } options_jumper_t12 = { @@ -209,6 +218,7 @@ options_jumper_t12 = { "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), "internalmulti": ("INTERNAL_MODULE_MULTI", "YES", "NO"), + "afhds3": ("AFHDS3", "YES", "NO") } options_jumper_t16 = { @@ -222,6 +232,7 @@ options_jumper_t16 = { "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), "internalmulti": ("INTERNAL_MODULE_MULTI", "YES", "NO"), "bluetooth": ("BLUETOOTH", "YES", "NO"), + "afhds3": ("AFHDS3", "YES", "NO") } options_radiomaster_tx16s = { @@ -235,4 +246,5 @@ options_radiomaster_tx16s = { "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), "bluetooth": ("BLUETOOTH", "YES", "NO"), "internalgps": ("INTERNAL_GPS", "YES", "NO"), + "afhds3": ("AFHDS3", "YES", "NO") } \ No newline at end of file From 5d4f6679e5d4715223f7a8e8982d824de7c12594 Mon Sep 17 00:00:00 2001 From: DanielGeA Date: Mon, 22 Jun 2020 15:52:52 +0100 Subject: [PATCH 475/560] Remove Avr boards (#7713) Remove AVR --- companion/src/CMakeLists.txt | 16 +- companion/src/burnconfigdialog.cpp | 197 +----- companion/src/burnconfigdialog.h | 20 - companion/src/burnconfigdialog.ui | 660 +----------------- companion/src/firmwares/CMakeLists.txt | 2 - companion/src/firmwares/boards.cpp | 37 +- companion/src/firmwares/boards.h | 24 - .../src/firmwares/customfunctiondata.cpp | 19 +- companion/src/firmwares/eeprominterface.cpp | 3 - companion/src/firmwares/eeprominterface.h | 3 - companion/src/firmwares/generalsettings.cpp | 4 +- companion/src/firmwares/modeldata.cpp | 29 +- companion/src/firmwares/modeldata.h | 3 - .../src/firmwares/opentx/opentxeeprom.cpp | 14 +- companion/src/firmwares/opentx/opentxeeprom.h | 3 - .../src/firmwares/opentx/opentxinterface.cpp | 206 ++---- companion/src/firmwares/rawsource.cpp | 220 +----- companion/src/firmwares/rawsource.h | 4 - companion/src/firmwares/telem_data.cpp | 3 - companion/src/generaledit/generaledit.cpp | 4 +- companion/src/generaledit/generalsetup.cpp | 15 +- companion/src/mainwindow.cpp | 20 +- companion/src/mainwindow.h | 2 - companion/src/modeledit/CMakeLists.txt | 1 - companion/src/modeledit/channels.cpp | 2 +- companion/src/modeledit/customfunctions.cpp | 36 +- companion/src/modeledit/expodialog.cpp | 14 +- companion/src/modeledit/logicalswitches.cpp | 26 +- companion/src/modeledit/modeledit.cpp | 2 +- companion/src/modeledit/setup.cpp | 15 +- companion/src/modeledit/telemetry.cpp | 467 ++----------- companion/src/modeledit/telemetry.h | 37 - companion/src/modelprinter.cpp | 3 +- companion/src/multimodelprinter.cpp | 59 +- companion/src/radiointerface.cpp | 226 ++---- companion/src/radiointerface.h | 4 - companion/src/storage/rlefile.cpp | 134 +--- companion/src/wizarddata.cpp | 19 +- launchpad/common/rules | 3 - radio/src/io/frsky_firmware_update.cpp | 2 +- radio/src/targets/simu/opentxsimulator.cpp | 4 +- 41 files changed, 276 insertions(+), 2286 deletions(-) diff --git a/companion/src/CMakeLists.txt b/companion/src/CMakeLists.txt index 016d962a6..f33f430ad 100644 --- a/companion/src/CMakeLists.txt +++ b/companion/src/CMakeLists.txt @@ -24,8 +24,6 @@ set(COMPANION_OSX_APP_BUNDLE_NAME "OpenTX Companion ${VERSION_MAJOR}.${VERSION_M # On OS X we copy dfu-util to the application bundle. This the path from which we copy # the binary (default homebrew path) set(DFU_UTIL_PATH "/usr/local/bin/dfu-util") -set(AVRDUDE_PATH "/usr/local/bin/avrdude") -set(AVRDUDE_CONF "/usr/local/etc/avrdude.conf") option(ALLOW_NIGHTLY_BUILDS "Allow nightly builds download / update") # Disabled by default if(ALLOW_NIGHTLY_BUILDS) @@ -239,7 +237,6 @@ set(companion_SRCS flasheepromdialog.cpp printdialog.cpp modelprinter.cpp - fusesdialog.cpp logsdialog.cpp downloaddialog.cpp splashlibrarydialog.cpp @@ -259,7 +256,6 @@ set(companion_MOC_HDRS burnconfigdialog.h comparedialog.h printdialog.h - fusesdialog.h logsdialog.h creditsdialog.h releasenotesdialog.h @@ -291,7 +287,6 @@ set(companion_MOC_HDRS set(companion_UIS mdichild.ui comparedialog.ui - fusesdialog.ui logsdialog.ui apppreferencesdialog.ui fwpreferencesdialog.ui @@ -407,7 +402,7 @@ elseif(WIN32) install(TARGETS ${SIMULATOR_NAME} DESTINATION ${INSTALL_DESTINATION}) install(FILES ${simulator_plugins} DESTINATION "${INSTALL_DESTINATION}") # supporting utilities - set(INSTALL_TEMP_FILES avrdude.exe avrdude.conf dfu-util.exe libusb0.dll libusb-1.0.dll license.txt) + set(INSTALL_TEMP_FILES dfu-util.exe libusb0.dll libusb-1.0.dll license.txt) foreach(tmpfile ${INSTALL_TEMP_FILES}) install(FILES "${COMPANION_SRC_DIRECTORY}/../targets/windows/${tmpfile}" DESTINATION ${INSTALL_DESTINATION}) endforeach() @@ -554,14 +549,11 @@ IF(APPLE) set(${COMPANION_SOURCES} ${COMPANION_SOURCES} ${PROJECT_SOURCE_DIR}/images/${MACOSX_BUNDLE_ICON_FILE}) install(FILES ${MAC_ICON_FILE} DESTINATION ${companion_res_dir} COMPONENT Runtime) - # Copy dfu-util and avrdude, resolve symlink first + # Copy dfu-util, resolve symlink first get_filename_component(DFU_UTIL_ABSOLUTE_PATH ${DFU_UTIL_PATH} REALPATH) - get_filename_component(AVRDUDE_ABSOLUTE_PATH ${AVRDUDE_PATH} REALPATH) - get_filename_component(AVRDUDECONF_ABSOLUTE_PATH ${AVRDUDE_CONF} REALPATH) - install(PROGRAMS ${DFU_UTIL_ABSOLUTE_PATH} ${AVRDUDE_ABSOLUTE_PATH} DESTINATION ${companion_res_dir} COMPONENT Runtime) - install(FILES ${AVRDUDECONF_ABSOLUTE_PATH} DESTINATION ${companion_res_dir} COMPONENT Runtime) + install(PROGRAMS ${DFU_UTIL_ABSOLUTE_PATH} DESTINATION ${companion_res_dir} COMPONENT Runtime) - set(bundle_tools_path "\${CMAKE_INSTALL_PREFIX}/${companion_res_dir}/dfu-util;\${CMAKE_INSTALL_PREFIX}/${companion_res_dir}/avrdude") + set(bundle_tools_path "\${CMAKE_INSTALL_PREFIX}/${companion_res_dir}/dfu-util;") # Include depencies (adding frameworks, fixing the embbeded libraries) diff --git a/companion/src/burnconfigdialog.cpp b/companion/src/burnconfigdialog.cpp index 0fe22be03..43a60c7ea 100644 --- a/companion/src/burnconfigdialog.cpp +++ b/companion/src/burnconfigdialog.cpp @@ -36,61 +36,23 @@ burnConfigDialog::burnConfigDialog(QWidget *parent) : { ui->setupUi(this); setWindowIcon(CompanionIcon("configure.png")); - ui->avrdude_programmer->model()->sort(0); getSettings(); - populateProgrammers(); Board::Type board = getCurrentBoard(); if (IS_STM32(board)) { setWindowTitle(tr("DFU-UTIL Configuration")); - ui->avrArgs->hide(); - ui->avrdude_location->hide(); - ui->avrdude_port->hide(); - ui->avrdude_programmer->hide(); - ui->label_av1->hide(); - ui->label_av2->hide(); - ui->label_av4->hide(); - ui->label_av5->hide(); - ui->pushButton->hide(); - ui->pushButton_3->hide(); - ui->pushButton_4->hide(); ui->label_sb1->hide(); ui->label_sb3->hide(); ui->samba_location->hide(); ui->samba_port->hide(); ui->sb_browse->hide(); } - else if (IS_SKY9X(board)) { - setWindowTitle(tr("SAM-BA Configuration")); - ui->avrArgs->hide(); - ui->avrdude_location->hide(); - ui->avrdude_port->hide(); - ui->avrdude_programmer->hide(); - ui->label_av1->hide(); - ui->label_av2->hide(); - ui->label_av4->hide(); - ui->label_av5->hide(); - ui->pushButton->hide(); - ui->pushButton_3->hide(); - ui->pushButton_4->hide(); - ui->label_dfu1->hide(); - ui->dfu_location->hide(); - ui->dfu_browse->hide(); - } else { - setWindowTitle(tr("AVRDUDE Configuration")); - ui->label_sb1->hide(); - ui->label_sb3->hide(); - ui->samba_location->hide(); - ui->samba_port->hide(); - ui->sb_browse->hide(); + setWindowTitle(tr("SAM-BA Configuration")); ui->label_dfu1->hide(); - ui->label_dfu2->hide(); ui->dfu_location->hide(); ui->dfu_browse->hide(); } - ui->label_av3->hide(); - ui->avrdude_mcu->hide(); ui->label_sb2->hide(); ui->arm_mcu->hide(); ui->label_dfu2->hide(); @@ -105,46 +67,26 @@ burnConfigDialog::~burnConfigDialog() delete ui; } -QStringList burnConfigDialog::getAvrdudeArgs() -{ - QStringList args = avrArgs; - if (!avrPort.isEmpty()) - args << "-P" << avrPort; - -#if defined(__APPLE__) - args << "-C" << QFileInfo(QApplication::applicationDirPath() + "/../Resources/avrdude.conf").absoluteFilePath(); -#endif - return args; -} void burnConfigDialog::getSettings() { - avrLoc = g.avrdudeLocation(); sambaLoc = g.sambaLocation(); dfuLoc = g.dfuLocation(); #if defined WIN32 || !defined __GNUC__ - if ( avrLoc.isEmpty()) - avrLoc = QFileInfo("avrdude.exe").absoluteFilePath(); if ( sambaLoc.isEmpty()) sambaLoc = QFileInfo("sam-ba.exe").absoluteFilePath(); if ( dfuLoc.isEmpty()) dfuLoc = QFileInfo("dfu-util.exe").absoluteFilePath(); #elif defined __APPLE__ - if ( avrLoc.isEmpty()) - avrLoc = QFileInfo(QApplication::applicationDirPath() + "/../Resources/avrdude").absoluteFilePath(); if ( sambaLoc.isEmpty()) sambaLoc = "/usr/local/bin/sam-ba"; if ( dfuLoc.isEmpty()) dfuLoc = QFileInfo(QApplication::applicationDirPath() + "/../Resources/dfu-util").absoluteFilePath(); #elif defined __FreeBSD__ - if (avrLoc.isEmpty()) - avrLoc = "/usr/local/bin/avrdude"; if (dfuLoc.isEmpty()) dfuLoc = "/usr/local/bin/dfu-util"; #else - if ( avrLoc.isEmpty()) - avrLoc = "/usr/bin/avrdude"; if ( sambaLoc.isEmpty()) sambaLoc = "/usr/bin/sam-ba"; if ( dfuLoc.isEmpty()) @@ -152,45 +94,22 @@ void burnConfigDialog::getSettings() #endif dfuArgs = g.dfuArguments().split(" ", QString::SkipEmptyParts); - avrArgs = g.avrArguments().split(" ", QString::SkipEmptyParts); - avrProgrammer = g.programmer(); - avrPort = g.avrPort(); - avrMCU = g.mcu(); armMCU = g.armMcu(); sambaPort = g.sambaPort(); - ui->avrdude_location->setText(getAVRDUDE()); - ui->avrArgs->setText(avrArgs.join(" ")); - ui->samba_location->setText(getSAMBA()); ui->samba_port->setText(getSambaPort()); ui->dfu_location->setText(getDFU()); ui->dfuArgs->setText(getDFUArgs().join(" ")); - int idx1 = ui->avrdude_programmer->findText(getProgrammer()); - int idx2 = ui->avrdude_port->findText(getPort()); - int idx3 = ui->avrdude_mcu->findText(getMCU()); int idx4 = ui->arm_mcu->findText(getArmMCU()); - if(idx1>=0) ui->avrdude_programmer->setCurrentIndex(idx1); - if(idx2>=0) ui->avrdude_port->setCurrentIndex(idx2); - if(idx3>=0) ui->avrdude_mcu->setCurrentIndex(idx3); if(idx4>=0) ui->arm_mcu->setCurrentIndex(idx4); QFile file; - if (file.exists(avrLoc)) { - ui->pushButton_3->setEnabled(true); - } else { - ui->pushButton_3->setDisabled(true); - } } void burnConfigDialog::putSettings() { - g.avrdudeLocation( avrLoc ); - g.programmer( avrProgrammer); - g.mcu( avrMCU ); - g.avrPort( avrPort ); - g.avrArguments( avrArgs.join(" ") ); g.sambaLocation( sambaLoc ); g.sambaPort( sambaPort ); g.armMcu( armMCU ); @@ -198,73 +117,6 @@ void burnConfigDialog::putSettings() g.dfuArguments( dfuArgs.join(" ") ); } -void burnConfigDialog::populateProgrammers() -{ - QString fileName = QFileInfo(avrLoc).canonicalPath() + "/avrdude.conf"; //for windows - if(!QFileInfo(fileName).exists()) fileName = "/etc/avrdude.conf"; //for linux - if(!QFileInfo(fileName).exists()) fileName = "/etc/avrdude/avrdude.conf"; //for linux - if(!QFileInfo(fileName).exists()) return; // not found avrdude.conf - returning - - QFile file(fileName); - - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return; - - QStringList items; - QString line = ""; - QString prevline = ""; - QTextStream in(&file); - while (!in.atEnd()) - { - prevline = line; - line = in.readLine(); - - if(prevline.left(10).toLower()=="programmer") - items << line.section('"',1,1); - } - file.close(); - - items.sort(); - - QString avrProgrammer_temp = avrProgrammer; - ui->avrdude_programmer->clear(); - ui->avrdude_programmer->addItems(items); - int idx1 = ui->avrdude_programmer->findText(avrProgrammer_temp); - if(idx1>=0) ui->avrdude_programmer->setCurrentIndex(idx1); -} - -void burnConfigDialog::on_avrdude_programmer_currentIndexChanged(QString ) -{ - avrProgrammer = ui->avrdude_programmer->currentText(); -} - -void burnConfigDialog::on_avrdude_mcu_currentIndexChanged(QString ) -{ - avrMCU = ui->avrdude_mcu->currentText(); -} - -void burnConfigDialog::on_avrdude_location_editingFinished() -{ - avrLoc = ui->avrdude_location->text(); - if (avrLoc.isEmpty()) { - ui->pushButton_3->setDisabled(true); - } else { - QFile file; - if (file.exists(avrLoc)) { - ui->pushButton_3->setEnabled(true); - } - } -} - -void burnConfigDialog::on_avrArgs_editingFinished() -{ - avrArgs = ui->avrArgs->text().split(" ", QString::SkipEmptyParts); -} - -void burnConfigDialog::on_avrdude_port_currentIndexChanged(QString ) -{ - avrPort = ui->avrdude_port->currentText(); -} - void burnConfigDialog::on_samba_location_editingFinished() { sambaLoc = ui->samba_location->text(); @@ -280,17 +132,6 @@ void burnConfigDialog::on_arm_mcu_currentIndexChanged(QString ) armMCU = ui->arm_mcu->currentText(); } -void burnConfigDialog::on_pushButton_clicked() -{ - QString fileName = QFileDialog::getOpenFileName(this, tr("Select Location"),ui->avrdude_location->text()); - - if(!fileName.isEmpty()) - { - ui->avrdude_location->setText(fileName); - avrLoc = fileName; - } -} - void burnConfigDialog::on_sb_browse_clicked() { QString fileName = QFileDialog::getOpenFileName(this, tr("Select Location"),ui->samba_location->text()); @@ -322,27 +163,6 @@ void burnConfigDialog::on_dfuArgs_editingFinished() dfuArgs = ui->dfuArgs->text().split(" ", QString::SkipEmptyParts); } -void burnConfigDialog::listAvrdudeProgrammers() -{ - ProgressDialog progressDialog(this, tr("List available programmers"), CompanionIcon("list.png"), true); - FlashProcess flashProcess(ui->avrdude_location->text(), QStringList() << "-c?", progressDialog.progress()); - flashProcess.run(); -} - -// TODO choose better name when no merge in progress.... -void burnConfigDialog::on_pushButton_3_clicked() -{ - listAvrdudeProgrammers(); -} - -// TODO choose better name when no merge in progress.... -void burnConfigDialog::on_pushButton_4_clicked() -{ - ProgressDialog progressDialog(this, tr("Avrdude help"), CompanionIcon("configure.png"), true); - FlashProcess flashProcess(ui->avrdude_location->text(), QStringList() << "-?", progressDialog.progress()); - flashProcess.run(); -} - void burnConfigDialog::on_advCtrChkB_toggled(bool checked) { Board::Type board = getCurrentBoard(); @@ -351,31 +171,20 @@ void burnConfigDialog::on_advCtrChkB_toggled(bool checked) ui->label_dfu2->show(); ui->dfuArgs->show(); } - else if (IS_SKY9X(board)) { + else { ui->label_sb2->show(); ui->arm_mcu->show(); } - else { - ui->label_av3->show(); - ui->avrdude_mcu->show(); - QMessageBox::warning(this, CPN_STR_APP_NAME, - tr("WARNING!
Normally CPU type is automatically selected according to the chosen firmware.
If you change the CPU type the resulting eeprom could be inconsistent."), - QMessageBox::Ok); - } } else { if (IS_STM32(board)) { ui->label_dfu2->hide(); ui->dfuArgs->hide(); } - else if (IS_SKY9X(board)) { + else { ui->label_sb2->hide(); ui->arm_mcu->hide(); } - else { - ui->label_av3->hide(); - ui->avrdude_mcu->hide(); - } } QTimer::singleShot(0, this, SLOT(shrink())); } diff --git a/companion/src/burnconfigdialog.h b/companion/src/burnconfigdialog.h index 5cf7bb375..06810bbd2 100644 --- a/companion/src/burnconfigdialog.h +++ b/companion/src/burnconfigdialog.h @@ -39,45 +39,25 @@ public: burnConfigDialog(QWidget *parent = 0); ~burnConfigDialog(); - QString getAVRDUDE() {return avrLoc;} QString getSAMBA() {return sambaLoc;} QString getDFU() {return dfuLoc;} - QStringList getAvrdudeArgs(); QStringList getDFUArgs() {return dfuArgs;} - QString getProgrammer() {return avrProgrammer;} - QString getMCU() {return avrMCU;} QString getArmMCU() {return armMCU;} - QString getPort() {return avrPort;} QString getSambaPort() {return sambaPort;} - void listAvrdudeProgrammers(); - private: Ui::burnConfigDialog *ui; void populateProgrammers(); - QString avrLoc; QString sambaLoc; QString dfuLoc; - QStringList avrArgs; - QString avrProgrammer; - QString avrMCU; QString armMCU; - QString avrPort; QString sambaPort; QStringList dfuArgs; private slots: void shrink(); - void on_avrArgs_editingFinished(); - void on_pushButton_4_clicked(); - void on_pushButton_3_clicked(); - void on_pushButton_clicked(); - void on_avrdude_location_editingFinished(); - void on_avrdude_programmer_currentIndexChanged(QString ); - void on_avrdude_mcu_currentIndexChanged(QString ); - void on_avrdude_port_currentIndexChanged(QString ); void on_samba_location_editingFinished(); void on_samba_port_editingFinished(); void on_arm_mcu_currentIndexChanged(QString ); diff --git a/companion/src/burnconfigdialog.ui b/companion/src/burnconfigdialog.ui index 36d343884..e52aaf797 100644 --- a/companion/src/burnconfigdialog.ui +++ b/companion/src/burnconfigdialog.ui @@ -45,615 +45,7 @@
- - - - Location of sam-ba executable - - - The location of the AVRDUDE executable. - - - dfu-util - - - - - - - DFU-Util Location - - - - - - - Location of AVRDUDE executable - - - The location of the AVRDUDE executable. - - - - - - - - - - Use this button to browse and look for the AVRDUDE executable file. - - - Browse... - - - - - - - Programmer - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - Programmer used for communicating with the controller. -Please consult the programmer's documentation and the AVRDUDE documentation to select the appropriate programmer. - - - QComboBox::InsertAlphabetically - - - - c2n232i - - - - - dasa3 - - - - - dasa - - - - - siprog - - - - - ponyser - - - - - 89isp - - - - - frank-stk200 - - - - - blaster - - - - - ere-isp-avr - - - - - atisp - - - - - dapa - - - - - xil - - - - - futurlec - - - - - abcmini - - - - - picoweb - - - - - sp12 - - - - - alf - - - - - bascom - - - - - dt006 - - - - - pony-stk200 - - - - - stk200 - - - - - bsd - - - - - pavr - - - - - dragon_pdi - - - - - dragon_dw - - - - - dragon_hvsp - - - - - dragon_pp - - - - - dragon_isp - - - - - dragon_jtag - - - - - jtag2pdi - - - - - jtag2avr32 - - - - - jtagmkII_avr32 - - - - - jtag2dw - - - - - jtag2isp - - - - - jtag2 - - - - - jtag2fast - - - - - jtag2slow - - - - - jtagmkII - - - - - jtag1slow - - - - - jtag1 - - - - - jtagmkI - - - - - avr911 - - - - - avr109 - - - - - butterfly - - - - - usbtiny - - - - - usbasp - - - - - avr910 - - - - - stk600hvsp - - - - - stk600pp - - - - - stk600 - - - - - stk500hvsp - - - - - stk500pp - - - - - stk500v2 - - - - - mib510 - - - - - stk500v1 - - - - - stk500 - - - - - buspirate - - - - - avrisp2 - - - - - avrispmkII - - - - - avrispv2 - - - - - avrisp - - - - - arduino - - - - - - - - List all available programmers. - - - List Available - - - - - - - Extra arguments that will be passed to AVRDUDE on every call - - - Extra arguments used in AVRDUDE. -This can be used for providing extra information to AVRDUDE. - -Please only use this if you know what you are doing. There are no error checks and you could cripple your controller. - - - - - - - - - - Extra Arguments - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - Show AVRDUDE help - - - Show Help - - - - - - - Communication port to the programmer. - - - - - - - - - - usb - - - - - com1 - - - - - com2 - - - - - com3 - - - - - com4 - - - - - com5 - - - - - com6 - - - - - com7 - - - - - com8 - - - - - com9 - - - - - com10 - - - - - com11 - - - - - com12 - - - - - com13 - - - - - com14 - - - - - com15 - - - - - lpt1 - - - - - lpt2 - - - - - lpt3 - - - - - lpt4 - - - - - avrdoper - - - - - /dev/ttyUSB0 - - - - - /dev/ttyUSB1 - - - - - - - - Port - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - AVRDUDE Location - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - MCU - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - CPU of your TX - - - CPU present on your 9x radio -Should be m64 for stock radios -m2560 for v4.1 boards - - - QComboBox::InsertAlphabetically - - - - m64 - - - - - m128 - - - - - m2560 - - - - - + CPU of your TX @@ -678,7 +70,27 @@ m2560 for v4.1 boards
- + + + + Location of sam-ba executable + + + The location of the AVRDUDE executable. + + + dfu-util + + + + + + + DFU-Util Location + + + + SAM-BA Location @@ -688,7 +100,7 @@ m2560 for v4.1 boards - + Location of sam-ba executable @@ -701,7 +113,7 @@ m2560 for v4.1 boards - + ARM MCU @@ -711,7 +123,7 @@ m2560 for v4.1 boards - + Port @@ -721,7 +133,7 @@ m2560 for v4.1 boards - + sam-ba serial port @@ -734,14 +146,14 @@ m2560 for v4.1 boards - + Alternate device - + Extra arguments that will be passed to AVRDUDE on every call @@ -757,7 +169,7 @@ Please only use this if you know what you are doing. There are no error checks - + Use this button to browse and look for the AVRDUDE executable file. @@ -767,7 +179,7 @@ Please only use this if you know what you are doing. There are no error checks - + Use this button to browse and look for the AVRDUDE executable file. @@ -777,14 +189,14 @@ Please only use this if you know what you are doing. There are no error checks - + - + Use advanced controls @@ -809,14 +221,6 @@ Please only use this if you know what you are doing. There are no error checks - avrdude_location - pushButton - avrdude_programmer - pushButton_3 - avrdude_mcu - avrdude_port - avrArgs - pushButton_4 samba_location sb_browse arm_mcu diff --git a/companion/src/firmwares/CMakeLists.txt b/companion/src/firmwares/CMakeLists.txt index 48e6394bc..1b99964fa 100644 --- a/companion/src/firmwares/CMakeLists.txt +++ b/companion/src/firmwares/CMakeLists.txt @@ -19,8 +19,6 @@ set(firmwares_SRCS sensordata.cpp telem_data.cpp afhds3.cpp - er9x/er9xeeprom.cpp - er9x/er9xinterface.cpp ersky9x/ersky9xeeprom.cpp ersky9x/ersky9xinterface.cpp opentx/opentxeeprom.cpp diff --git a/companion/src/firmwares/boards.cpp b/companion/src/firmwares/boards.cpp index cfadf5936..a189e16c8 100644 --- a/companion/src/firmwares/boards.cpp +++ b/companion/src/firmwares/boards.cpp @@ -25,18 +25,13 @@ // Update: These are now all only used within this class. // External access is only via getEEpromSize() and getFlashSize() -#define EESIZE_STOCK 2048 -#define EESIZE_M128 4096 -#define EESIZE_GRUVIN9X 4096 #define EESIZE_TARANIS (32*1024) #define EESIZE_SKY9X (128*4096) #define EESIZE_9XRPRO (128*4096) #define EESIZE_MAX EESIZE_9XRPRO // getFlashSize() (and these macros) is only used by radiointerface::getDfuArgs (perhaps can find a better way?) -#define FSIZE_STOCK (64*1024) -#define FSIZE_M128 (128*1024) -#define FSIZE_GRUVIN9X (256*1024) + #define FSIZE_TARANIS (512*1024) #define FSIZE_SKY9X (256*1024) #define FSIZE_9XRPRO (512*1024) @@ -82,12 +77,6 @@ uint32_t Boards::getFourCC(Type board) case BOARD_AR9X: case BOARD_9XRPRO: return 0x3278746F; - case BOARD_MEGA2560: - case BOARD_GRUVIN9X: - return 0x3178746F; - case BOARD_9X_M64: - case BOARD_9X_M128: - return 0; case BOARD_JUMPER_T12: return 0x3D78746F; case BOARD_JUMPER_T16: @@ -104,13 +93,6 @@ uint32_t Boards::getFourCC(Type board) int Boards::getEEpromSize(Board::Type board) { switch (board) { - case BOARD_9X_M64: - return EESIZE_STOCK; - case BOARD_9X_M128: - return EESIZE_M128; - case BOARD_MEGA2560: - case BOARD_GRUVIN9X: - return EESIZE_GRUVIN9X; case BOARD_SKY9X: return EESIZE_SKY9X; case BOARD_9XRPRO: @@ -144,13 +126,6 @@ int Boards::getEEpromSize(Board::Type board) int Boards::getFlashSize(Type board) { switch (board) { - case BOARD_9X_M64: - return FSIZE_STOCK; - case BOARD_9X_M128: - return FSIZE_M128; - case BOARD_MEGA2560: - case BOARD_GRUVIN9X: - return FSIZE_GRUVIN9X; case BOARD_SKY9X: return FSIZE_SKY9X; case BOARD_9XRPRO: @@ -412,7 +387,7 @@ QString Boards::getAnalogInputName(Board::Type board, int index) index -= getCapability(board, Board::Sticks); - if (IS_9X(board) || IS_2560(board) || IS_SKY9X(board)) { + if (IS_SKY9X(board)) { const QString pots[] = { "P1", "P2", @@ -496,14 +471,6 @@ bool Boards::isBoardCompatible(Type board1, Type board2) QString Boards::getBoardName(Board::Type board) { switch (board) { - case BOARD_9X_M64: - return "9X"; - case BOARD_9X_M128: - return "9X128"; - case BOARD_GRUVIN9X: - return "Gruvin9x"; - case BOARD_MEGA2560: - return "MEGA2560"; case BOARD_TARANIS_X7: return "Taranis X7/X7S"; case BOARD_TARANIS_X7_ACCESS: diff --git a/companion/src/firmwares/boards.h b/companion/src/firmwares/boards.h index e4149a298..937703eda 100644 --- a/companion/src/firmwares/boards.h +++ b/companion/src/firmwares/boards.h @@ -32,10 +32,6 @@ namespace Board { enum Type { BOARD_UNKNOWN = -1, - BOARD_9X_M64 = 0, - BOARD_9X_M128, - BOARD_MEGA2560, - BOARD_GRUVIN9X, BOARD_SKY9X, BOARD_9XRPRO, BOARD_AR9X, @@ -191,26 +187,6 @@ class Boards // temporary aliases for transition period, use Boards class instead. #define getBoardCapability(b__, c__) Boards::getCapability(b__, c__) -inline bool IS_9X(Board::Type board) -{ - return board == Board::BOARD_9X_M64 || board == Board::BOARD_9X_M128; -} - -inline bool IS_STOCK(Board::Type board) -{ - return board == Board::BOARD_9X_M64; -} - -inline bool IS_M128(Board::Type board) -{ - return board == Board::BOARD_9X_M128; -} - -inline bool IS_2560(Board::Type board) -{ - return board == Board::BOARD_GRUVIN9X || board == Board::BOARD_MEGA2560; -} - inline bool IS_SKY9X(Board::Type board) { return board == Board::BOARD_SKY9X || board == Board::BOARD_9XRPRO || board == Board::BOARD_AR9X; diff --git a/companion/src/firmwares/customfunctiondata.cpp b/companion/src/firmwares/customfunctiondata.cpp index 9313ace5a..3248f1fa4 100644 --- a/companion/src/firmwares/customfunctiondata.cpp +++ b/companion/src/firmwares/customfunctiondata.cpp @@ -112,13 +112,10 @@ void CustomFunctionData::populateResetParams(const ModelData * model, QComboBox { int val = 0; Firmware * firmware = Firmware::getCurrentVariant(); - Board::Type board = firmware->getBoard(); b->addItem(tr("Timer1"), val++); b->addItem(tr("Timer2"), val++); - if (IS_ARM(board)) { - b->addItem( tr("Timer3"), val++); - } + b->addItem( tr("Timer3"), val++); b->addItem(tr("Flight"), val++); b->addItem(tr("Telemetry"), val++); int reCount = firmware->getCapability(RotaryEncoders); @@ -132,7 +129,7 @@ void CustomFunctionData::populateResetParams(const ModelData * model, QComboBox if ((int)value < b->count()) { b->setCurrentIndex(value); } - if (model && IS_ARM(board)) { + if (model) { for (unsigned i=0; isensorData[i].isAvailable()) { RawSource item = RawSource(SOURCE_TYPE_TELEMETRY, 3*i); @@ -210,14 +207,8 @@ QString CustomFunctionData::paramToString(const ModelData * model) const case FUNC_ADJUST_GVAR_INCDEC: float val; QString unit; - if (IS_ARM(getCurrentBoard())) { - val = param * model->gvarData[func - FuncAdjustGV1].multiplierGet(); - unit = model->gvarData[func - FuncAdjustGV1].unitToString(); - } - else { - val = param; - unit = ""; - } + val = param * model->gvarData[func - FuncAdjustGV1].multiplierGet(); + unit = model->gvarData[func - FuncAdjustGV1].unitToString(); return QString("Increment: %1%2").arg(val).arg(unit); } } @@ -233,7 +224,7 @@ QString CustomFunctionData::repeatToString() const return ""; } else { - unsigned int step = IS_ARM(getCurrentBoard()) ? 1 : 10; + unsigned int step = 1; return tr("repeat(%1s)").arg(step*repeatParam); } } diff --git a/companion/src/firmwares/eeprominterface.cpp b/companion/src/firmwares/eeprominterface.cpp index d4121a8a4..90272d0ad 100644 --- a/companion/src/firmwares/eeprominterface.cpp +++ b/companion/src/firmwares/eeprominterface.cpp @@ -75,10 +75,7 @@ void EEPROMInterface::showEepromErrors(QWidget *parent, const QString &title, co if (errors.test(UNSUPPORTED_NEWER_VERSION)) { errorsList << tr("- Eeprom is from a newer version of OpenTX"); } if (errors.test(NOT_OPENTX)) { errorsList << tr("- Eeprom is not from OpenTX"); } - if (errors.test(NOT_TH9X)) { errorsList << tr("- Eeprom is not from Th9X"); } - if (errors.test(NOT_GRUVIN9X)) { errorsList << tr("- Eeprom is not from Gruvin9X"); } if (errors.test(NOT_ERSKY9X)) { errorsList << tr("- Eeprom is not from ErSky9X"); } - if (errors.test(NOT_ER9X)) { errorsList << tr("- Eeprom is not from Er9X"); } if (errors.test(WRONG_SIZE)) { errorsList << tr("- Eeprom size is invalid"); } if (errors.test(WRONG_FILE_SYSTEM)) { errorsList << tr("- Eeprom file system is invalid"); } if (errors.test(UNKNOWN_BOARD)) { errorsList << tr("- Eeprom is from a unknown board"); } diff --git a/companion/src/firmwares/eeprominterface.h b/companion/src/firmwares/eeprominterface.h index c2bf0dafa..b3680b4ba 100644 --- a/companion/src/firmwares/eeprominterface.h +++ b/companion/src/firmwares/eeprominterface.h @@ -235,10 +235,7 @@ enum EepromLoadErrors { WRONG_SIZE, WRONG_FILE_SYSTEM, NOT_OPENTX, - NOT_TH9X, - NOT_GRUVIN9X, NOT_ERSKY9X, - NOT_ER9X, UNKNOWN_BOARD, WRONG_BOARD, BACKUP_NOT_SUPPORTED, diff --git a/companion/src/firmwares/generalsettings.cpp b/companion/src/firmwares/generalsettings.cpp index 9c38391c7..f307dbf26 100644 --- a/companion/src/firmwares/generalsettings.cpp +++ b/companion/src/firmwares/generalsettings.cpp @@ -110,9 +110,7 @@ GeneralSettings::GeneralSettings() backlightOffBright = 20; } - if (IS_ARM(board)) { - speakerVolume = 12; - } + speakerVolume = 12; if (IS_JUMPER_T16(board)) strcpy(bluetoothName, "t16"); diff --git a/companion/src/firmwares/modeldata.cpp b/companion/src/firmwares/modeldata.cpp index 3386ba41d..3add6de8b 100644 --- a/companion/src/firmwares/modeldata.cpp +++ b/companion/src/firmwares/modeldata.cpp @@ -207,36 +207,25 @@ bool ModelData::isEmpty() const void ModelData::setDefaultInputs(const GeneralSettings & settings) { - Board::Type board = getCurrentBoard(); - if (IS_ARM(board)) { - for (int i = 0; i < CPN_MAX_STICKS; i++) { - ExpoData * expo = &expoData[i]; - expo->chn = i; - expo->mode = INPUT_MODE_BOTH; - expo->srcRaw = settings.getDefaultSource(i); - expo->weight = 100; - strncpy(inputNames[i], Helpers::removeAccents(expo->srcRaw.toString(this)).toLatin1().constData(), sizeof(inputNames[i]) - 1); - } + for (int i = 0; i < CPN_MAX_STICKS; i++) { + ExpoData * expo = &expoData[i]; + expo->chn = i; + expo->mode = INPUT_MODE_BOTH; + expo->srcRaw = settings.getDefaultSource(i); + expo->weight = 100; + strncpy(inputNames[i], Helpers::removeAccents(expo->srcRaw.toString(this)).toLatin1().constData(), sizeof(inputNames[i]) - 1); } } void ModelData::setDefaultMixes(const GeneralSettings & settings) { - Board::Type board = getCurrentBoard(); - if (IS_ARM(board)) { - setDefaultInputs(settings); - } + setDefaultInputs(settings); for (int i = 0; i < CPN_MAX_STICKS; i++) { MixData * mix = &mixData[i]; mix->destCh = i + 1; mix->weight = 100; - if (IS_ARM(board)) { - mix->srcRaw = RawSource(SOURCE_TYPE_VIRTUAL_INPUT, i); - } - else { - mix->srcRaw = RawSource(SOURCE_TYPE_STICK, i); - } + mix->srcRaw = RawSource(SOURCE_TYPE_VIRTUAL_INPUT, i); } } diff --git a/companion/src/firmwares/modeldata.h b/companion/src/firmwares/modeldata.h index 93e98588e..df5c6d33d 100644 --- a/companion/src/firmwares/modeldata.h +++ b/companion/src/firmwares/modeldata.h @@ -41,13 +41,10 @@ class RadioDataConversionState; class RSSIAlarmData { public: RSSIAlarmData() { clear(); } - unsigned int level[2]; // AVR Only int warning; int critical; bool disabled; void clear() { - this->level[0] = 2; - this->level[1] = 3; this->warning = 45; this->critical = 42; this->disabled = false; diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index 119bbe396..8b0e8643d 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -721,13 +721,7 @@ class FlightModeField: public TransformedField { trim = 501 + phase.trimRef[i] - (phase.trimRef[i] > index ? 1 : 0); else trim = std::max(-500, std::min(500, phase.trim[i])); - if (board == BOARD_9X_M64 || (board == BOARD_9X_M128 && version >= 215)) { - trimBase[i] = trim >> 2; - trimExt[i] = (trim & 0x03); - } - else { - trimBase[i] = trim; - } + trimBase[i] = trim; } } } @@ -751,11 +745,7 @@ class FlightModeField: public TransformedField { phase.trim[i] = 0; } else { - int trim; - if (board == BOARD_9X_M64 || (board == BOARD_9X_M128 && version >= 215)) - trim = ((trimBase[i]) << 2) + (trimExt[i] & 0x03); - else - trim = trimBase[i]; + int trim = trimBase[i]; if (trim > 500) { phase.trimRef[i] = trim - 501; if (phase.trimRef[i] >= index) diff --git a/companion/src/firmwares/opentx/opentxeeprom.h b/companion/src/firmwares/opentx/opentxeeprom.h index ced4dccb6..29d5b0b93 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.h +++ b/companion/src/firmwares/opentx/opentxeeprom.h @@ -37,9 +37,6 @@ #define TARANIS_X9LITES_VARIANT 0x0801 #define JUMPER_T12_VARIANT 0x4001 -#define SIMU_STOCK_VARIANTS (GVARS_VARIANT|FRSKY_VARIANT) -#define SIMU_M128_VARIANTS (M128_VARIANT|SIMU_STOCK_VARIANTS) - class OpenTxGeneralData: public TransformedField { public: OpenTxGeneralData(GeneralSettings & generalData, Board::Type board, unsigned int version, unsigned int variant=0); diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index c405f9699..f329d98bb 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -58,14 +58,6 @@ OpenTxEepromInterface::~OpenTxEepromInterface() const char * OpenTxEepromInterface::getName() { switch (board) { - case BOARD_9X_M64: - return "OpenTX for 9X board"; - case BOARD_9X_M128: - return "OpenTX for M128 / 9X board"; - case BOARD_MEGA2560: - return "OpenTX for MEGA2560 board"; - case BOARD_GRUVIN9X: - return "OpenTX for Gruvin9x board / 9X"; case BOARD_JUMPER_T12: return "OpenTX for Jumper T12"; case BOARD_JUMPER_T16: @@ -280,16 +272,7 @@ unsigned long OpenTxEepromInterface::load(RadioData &radioData, const uint8_t * uint8_t OpenTxEepromInterface::getLastDataVersion(Board::Type board) { - switch (board) { - case BOARD_9X_M64: - return 216; - case BOARD_GRUVIN9X: - case BOARD_MEGA2560: - case BOARD_9X_M128: - return 217; - default: - return 219; - } + return 219; } void OpenTxEepromInterface::showErrors(const QString & title, const QStringList & errors) @@ -325,10 +308,7 @@ int OpenTxEepromInterface::save(uint8_t * eeprom, const RadioData & radioData, u efile->EeFsCreate(eeprom, size, board, version); - if (board == BOARD_9X_M128) { - variant |= M128_VARIANT; - } - else if (IS_TARANIS_X9E(board)) { + if (IS_TARANIS_X9E(board)) { variant |= TARANIS_X9E_VARIANT; } else if (IS_TARANIS_X9LITES(board)) { @@ -445,43 +425,26 @@ int OpenTxFirmware::getCapability(::Capability capability) case Models: if (IS_FAMILY_HORUS_OR_T16(board)) return 0; - else if (IS_ARM(board)) + else return 60; - else if (board == BOARD_9X_M128) - return 30; - else if (IS_2560(board)) - return 30; - else - return 16; case Imperial: - if (IS_ARM(board)) - return 0; - else - return id.contains("imperial") ? 1 : 0; + return 0; case ModelImage: return (board == BOARD_TARANIS_X9D || IS_TARANIS_PLUS(board) || board == BOARD_TARANIS_X9DP_2019 || IS_FAMILY_HORUS_OR_T16(board)); case HasBeeper: - return (!IS_ARM(board)); + return false; case HasPxxCountry: return 1; case HasGeneralUnits: - if (IS_ARM(board)) - return 1; - else - return 0; + return true; case HasNegAndSwitches: - return IS_ARM(board); + return true; case PPMExtCtrl: return 1; case PPMFrameLength: return 40; case FlightModes: - if (IS_ARM(board)) - return 9; - else if (IS_2560(board)) - return 6; - else - return 5; + return 9; case FlightModesHaveFades: return 1; case Heli: @@ -493,7 +456,7 @@ int OpenTxFirmware::getCapability(::Capability capability) if (IS_HORUS_OR_TARANIS(board)) return id.contains("nogvars") ? 0 : 9; else if (id.contains("gvars")) - return IS_ARM(board) ? 9 : 5; + return 9; else return 0; case ModelName: @@ -501,66 +464,48 @@ int OpenTxFirmware::getCapability(::Capability capability) case FlightModesName: return (IS_HORUS_OR_TARANIS(board) ? 10 : 6); case GvarsName: - return (IS_9X(board) ? 0 : 3); + return 3; case GvarsInCS: case HasFAIMode: return 1; case GvarsAreNamed: case GvarsFlightModes: - return ((IS_ARM(board) || IS_2560(board)) ? 1 : 0); + return 1; case Mixes: - return (IS_ARM(board) ? 64 : 32); + return 64; case OffsetWeight: - return (IS_ARM(board) ? 500 : 245); + return 500; case Timers: - return (IS_ARM(board) ? 3 : 2); + return 3; case TimersName: if (HAS_LARGE_LCD(board)) return 8; - else if (IS_ARM(board)) + else return 3; - else - return 0; case PermTimers: - return (IS_2560(board) || IS_ARM(board)); + return true; case CustomFunctions: - if (IS_ARM(board)) - return 64; - else if (IS_2560(board) || board == BOARD_9X_M128) - return 24; - else - return 16; + return 64; case SafetyChannelCustomFunction: return id.contains("nooverridech") ? 0 : 1; case LogicalSwitches: - if (IS_ARM(board)) - return 64; - else - return 12; + return 64; case CustomAndSwitches: - if (IS_ARM(board)) - return getCapability(LogicalSwitches); - else - return 15/*4bits*/- 9/*sw positions*/; + return getCapability(LogicalSwitches); case LogicalSwitchesExt: - return (IS_ARM(board) ? true : false); + return true; case RotaryEncoders: - if (board == BOARD_GRUVIN9X) - return 2; - else if (IS_SKY9X(board)) - return 1; - else return 0; case Outputs: - return (IS_ARM(board) ? 32 : 16); + return 32; case NumCurvePoints: - return (IS_ARM(board) ? 512 : 104); + return 512; case VoicesAsNumbers: - return (IS_ARM(board) ? 0 : 1); + return 0; case VoicesMaxLength: - return (IS_ARM(board) ? (IS_TARANIS_X9(board) ? 8 : 6) : 0); + return (IS_TARANIS_X9(board) ? 8 : 6); case MultiLangVoice: - return (IS_ARM(board) ? 1 : 0); + return 1; case SoundPitch: return 1; case Haptic: @@ -571,7 +516,7 @@ int OpenTxFirmware::getCapability(::Capability capability) else return 0; case MaxVolume: - return (IS_ARM(board) ? 23 : 7); + return 23; case MaxContrast: if (IS_TARANIS_SMALL(board) || IS_JUMPER_T12(board)) return 30; @@ -583,7 +528,7 @@ int OpenTxFirmware::getCapability(::Capability capability) else return 10; case HasSoundMixer: - return (IS_ARM(board) ? 1 : 0); + return 1; case ExtraInputs: return 1; case TrimsRange: @@ -593,29 +538,26 @@ int OpenTxFirmware::getCapability(::Capability capability) case Simulation: return 1; case NumCurves: - return (HAS_LARGE_LCD(board) ? 32 : (IS_ARM(board) ? 16 : 8)); + return (HAS_LARGE_LCD(board) ? 32 : 16); case HasMixerNames: - return (IS_ARM(board) ? (IS_TARANIS_X9(board) ? 8 : 6) : false); + return (IS_TARANIS_X9(board) ? 8 : 6); case HasExpoNames: - return (IS_ARM(board) ? (IS_TARANIS_X9(board) ? 8 : 6) : false); + return (IS_TARANIS_X9(board) ? 8 : 6); case HasNoExpo: return (IS_HORUS_OR_TARANIS(board) ? false : true); case ChannelsName: - return (IS_ARM(board) ? (HAS_LARGE_LCD(board) ? 6 : 4) : 0); + return (HAS_LARGE_LCD(board) ? 6 : 4); case HasCvNames: - return (IS_ARM(board) ? 1 : 0); + return 1; case Telemetry: - if (IS_2560(board) || IS_ARM(board) || id.contains("frsky") || id.contains("telemetrez")) - return TM_HASTELEMETRY | TM_HASOFFSET | TM_HASWSHH; - else - return 0; + return 1; case TelemetryBars: return 1; case TelemetryCustomScreens: if (IS_FAMILY_HORUS_OR_T16(board)) return 0; else - return IS_ARM(board) ? 4 : 2; + return 4; case TelemetryCustomScreensBars: return (getCapability(TelemetryCustomScreens) ? 4 : 0); case TelemetryCustomScreensLines: @@ -627,7 +569,7 @@ int OpenTxFirmware::getCapability(::Capability capability) case TelemetryUnits: return 0; case TelemetryMaxMultiplier: - return (IS_ARM(board) ? 32 : 8); + return 32; case PPMCenter: return (IS_HORUS_OR_TARANIS(board) ? 500 : (id.contains("ppmca") ? 125 : 0)); case PPMUnitMicroseconds: @@ -639,11 +581,11 @@ int OpenTxFirmware::getCapability(::Capability capability) case HasVario: return 1; case HasVarioSink: - return ((IS_2560(board) || IS_ARM(board)) ? true : false); + return true; case HasFailsafe: - return (IS_ARM(board) ? 32 : 0); + return 32; case NumModules: - return (IS_ARM(board) ? 2 : 1); + return 2; case NumFirstUsableModule: return (IS_JUMPER_T12(board) ? 1 : 0); case HasModuleR9MFlex: @@ -651,23 +593,23 @@ int OpenTxFirmware::getCapability(::Capability capability) case HasModuleR9MMini: return IS_TARANIS_XLITE(board) && !id.contains("stdr9m"); case HasPPMStart: - return (IS_ARM(board) ? true : false); + return true; case HastxCurrentCalibration: return (IS_SKY9X(board) ? true : false); case HasVolume: - return (IS_ARM(board) ? true : false); + return true; case HasBrightness: - return (IS_ARM(board) ? true : false); + return true; case PerModelTimers: return 1; case SlowScale: - return (IS_ARM(board) ? 10 : 2); + return 10; case SlowRange: - return (IS_ARM(board) ? 250 : 15); + return 250; case CSFunc: return 18; case HasSDLogs: - return ((IS_2560(board) || IS_ARM(board)) ? true : false); + return true; case LcdWidth: if (IS_FAMILY_HORUS_OR_T16(board)) return 480; @@ -694,19 +636,19 @@ int OpenTxFirmware::getCapability(::Capability capability) case GetThrSwitch: return (IS_HORUS_OR_TARANIS(board) ? SWITCH_SF1 : SWITCH_THR); case HasDisplayText: - return IS_ARM(board) ? 1 : 0; + return 1; case HasTopLcd: return IS_TARANIS_X9E(board) ? 1 : 0; case GlobalFunctions: - return IS_ARM(board) ? 64 : 0; + return 64; case VirtualInputs: - return IS_ARM(board) ? 32 : 0; + return 32; case InputsLength: return HAS_LARGE_LCD(board) ? 4 : 3; case TrainerInputs: - return IS_ARM(board) ? 16 : 8; + return 16; case RtcTime: - return IS_ARM(board) || IS_2560(board) ? 1 : 0; + return 1; case LuaScripts: return IS_HORUS_OR_TARANIS(board) && id.contains("lua") ? 7 : 0; case LuaInputsPerScript: @@ -715,17 +657,13 @@ int OpenTxFirmware::getCapability(::Capability capability) return IS_HORUS_OR_TARANIS(board) ? 6 : 0; case LimitsPer1000: case EnhancedCurves: - return IS_ARM(board); + return 1; case HasFasOffset: - return (IS_STOCK(board) ? false : true); + return true; case HasMahPersistent: - return (IS_ARM(board) ? true : false); + return true; case SimulatorVariant: - if (board == BOARD_9X_M64) - return SIMU_STOCK_VARIANTS; - else if (board == BOARD_9X_M128) - return SIMU_M128_VARIANTS; - else if (IS_TARANIS_X9E(board)) + if (IS_TARANIS_X9E(board)) return TARANIS_X9E_VARIANT; else if (IS_TARANIS_X9LITES(board)) return TARANIS_X9LITES_VARIANT; @@ -744,7 +682,7 @@ int OpenTxFirmware::getCapability(::Capability capability) case MavlinkTelemetry: return id.contains("mavlink") ? 1 : 0; case SportTelemetry: - return IS_ARM(board) ? 1 : 0; + return 1; case HasInputDiff: case HasMixerExpo: return (IS_HORUS_OR_TARANIS(board) ? true : false); @@ -777,10 +715,8 @@ QTime OpenTxFirmware::getMaxTimerStart() { if (IS_HORUS_OR_TARANIS(board)) return QTime(23, 59, 59); - else if (IS_ARM(board)) - return QTime(8, 59, 59); else - return QTime(0, 59, 59); + return QTime(8, 59, 59); } bool OpenTxFirmware::isAvailable(PulsesProtocol proto, int port) @@ -947,14 +883,9 @@ EepromLoadErrors OpenTxEepromInterface::checkVersion(unsigned int version) // M128 revert because too much RAM used! case 216: // A lot of things (first github release) - if (IS_2560(board) || IS_M128(board)) { - return OLD_VERSION; - } case 217: // 3 logical switches removed on M128 / gruvin9x boards - if (IS_ARM(board)) { return OLD_VERSION; - } case 218: // ACCESS // switches add for X7/X10/X12S @@ -974,21 +905,7 @@ EepromLoadErrors OpenTxEepromInterface::checkVersion(unsigned int version) bool OpenTxEepromInterface::checkVariant(unsigned int version, unsigned int variant) { bool variantError = false; - if (board == BOARD_9X_M128 && !(variant & M128_VARIANT)) { - if (version == 212) { - uint8_t tmp[1000]; - for (int i = 1; i < 31; i++) { - efile->openRd(i); - int sz = efile->readRlc2(tmp, sizeof(tmp)); - if (sz == 849) { - qWarning() << " warning: M128 variant not set (but model size seems ok)"; - return true; - } - } - } - variantError = true; - } - else if (IS_TARANIS_X9E(board)) { + if (IS_TARANIS_X9E(board)) { if (variant != TARANIS_X9E_VARIANT) { variantError = true; } @@ -1080,9 +997,6 @@ unsigned long OpenTxEepromInterface::loadBackup(RadioData &radioData, const uint case 0x32: backupBoard = BOARD_SKY9X; break; - case 0x31: - backupBoard = BOARD_GRUVIN9X; - break; default: dbg << " unknown board"; errors.set(UNKNOWN_BOARD); @@ -1379,14 +1293,6 @@ void registerOpenTxFirmwares() addOpenTxArm9xOptions(firmware); registerOpenTxFirmware(firmware); - // These are kept only for import purposes, marked as deprecated to hide from UI. - registerOpenTxFirmware(new OpenTxFirmware("opentx-9xr", Firmware::tr("Turnigy 9XR"), BOARD_9X_M64), true); - registerOpenTxFirmware(new OpenTxFirmware("opentx-9xr128", Firmware::tr("Turnigy 9XR with m128 chip"), BOARD_9X_M128), true); - registerOpenTxFirmware(new OpenTxFirmware("opentx-9x", Firmware::tr("9X with stock board"), BOARD_9X_M64), true); - registerOpenTxFirmware(new OpenTxFirmware("opentx-9x128", Firmware::tr("9X with stock board and m128 chip"), BOARD_9X_M128), true); - registerOpenTxFirmware(new OpenTxFirmware("opentx-gruvin9x", Firmware::tr("9X with Gruvin9x board"), BOARD_GRUVIN9X), true); - registerOpenTxFirmware(new OpenTxFirmware("opentx-mega2560", Firmware::tr("DIY MEGA2560 radio"), BOARD_MEGA2560), true); - Firmware::setDefaultVariant(Firmware::getFirmwareForId("opentx-x9d+")); Firmware::setCurrentVariant(Firmware::getDefaultVariant()); } diff --git a/companion/src/firmwares/rawsource.cpp b/companion/src/firmwares/rawsource.cpp index 401eb9781..1cb5bcfbb 100644 --- a/companion/src/firmwares/rawsource.cpp +++ b/companion/src/firmwares/rawsource.cpp @@ -32,10 +32,7 @@ float RawSourceRange::getValue(int value) { - if (IS_ARM(getCurrentBoard())) - return float(value) * step; - else - return min + float(value) * step; + return float(value) * step; } @@ -48,11 +45,10 @@ RawSourceRange RawSource::getRange(const ModelData * model, const GeneralSetting RawSourceRange result; Firmware * firmware = Firmware::getCurrentVariant(); - Board::Type board = firmware->getBoard(); switch (type) { case SOURCE_TYPE_TELEMETRY: - if (IS_ARM(board)) { + { div_t qr = div(index, 3); const SensorData & sensor = model->sensorData[qr.quot]; if (sensor.prec == 2) @@ -65,192 +61,8 @@ RawSourceRange RawSource::getRange(const ModelData * model, const GeneralSetting result.max = +30000 * result.step; result.decimals = sensor.prec; result.unit = sensor.unitString(); + break; } - else { - result.offset = -DBL_MAX; - - switch (index) { - case TELEMETRY_SOURCE_TX_BATT: - result.step = 0.1; - result.decimals = 1; - result.max = 25.5; - result.unit = tr("V"); - break; - case TELEMETRY_SOURCE_TX_TIME: - result.step = 60; - result.max = 24 * 60 * result.step - 60; // 23:59:00 with 1-minute resolution - result.unit = tr("s"); - break; - case TELEMETRY_SOURCE_TIMER1: - case TELEMETRY_SOURCE_TIMER2: - case TELEMETRY_SOURCE_TIMER3: - result.step = 5; - result.max = 255 * result.step; - result.unit = tr("s"); - break; - case TELEMETRY_SOURCE_RSSI_TX: - case TELEMETRY_SOURCE_RSSI_RX: - result.max = 100; - result.offset = 128; - break; - case TELEMETRY_SOURCE_A1_MIN: - case TELEMETRY_SOURCE_A2_MIN: - case TELEMETRY_SOURCE_A3_MIN: - case TELEMETRY_SOURCE_A4_MIN: - if (model) result = model->frsky.channels[index-TELEMETRY_SOURCE_A1_MIN].getRange(); - break; - case TELEMETRY_SOURCE_A1: - case TELEMETRY_SOURCE_A2: - case TELEMETRY_SOURCE_A3: - case TELEMETRY_SOURCE_A4: - if (model) result = model->frsky.channels[index-TELEMETRY_SOURCE_A1].getRange(); - break; - case TELEMETRY_SOURCE_ALT: - case TELEMETRY_SOURCE_ALT_MIN: - case TELEMETRY_SOURCE_ALT_MAX: - case TELEMETRY_SOURCE_GPS_ALT: - result.step = 8; - result.min = -500; - result.max = 1540; - if (firmware->getCapability(Imperial) || settings.imperial) { - result.step = (result.step * 105) / 32; - result.min = (result.min * 105) / 32; - result.max = (result.max * 105) / 32; - result.unit = tr("ft"); - } - else { - result.unit = tr("m"); - } - break; - case TELEMETRY_SOURCE_T1: - case TELEMETRY_SOURCE_T1_MAX: - case TELEMETRY_SOURCE_T2: - case TELEMETRY_SOURCE_T2_MAX: - result.min = -30; - result.max = 225; - result.unit = tr("°C"); - break; - case TELEMETRY_SOURCE_HDG: - result.step = 2; - result.max = 360; - result.offset = 256; - result.unit = tr("°"); - break; - case TELEMETRY_SOURCE_RPM: - case TELEMETRY_SOURCE_RPM_MAX: - result.step = 50; - result.max = 12750; - break; - case TELEMETRY_SOURCE_FUEL: - result.max = 100; - result.unit = tr("%"); - break; - case TELEMETRY_SOURCE_ASPEED: - case TELEMETRY_SOURCE_ASPEED_MAX: - result.decimals = 1; - result.step = 2.0; - result.max = (2*255); - if (firmware->getCapability(Imperial) || settings.imperial) { - result.step *= 1.150779; - result.max *= 1.150779; - result.unit = tr("mph"); - } - else { - result.step *= 1.852; - result.max *= 1.852; - result.unit = tr("km/h"); - } - break; - case TELEMETRY_SOURCE_SPEED: - case TELEMETRY_SOURCE_SPEED_MAX: - result.step = 2; - result.max = (2*255); - if (firmware->getCapability(Imperial) || settings.imperial) { - result.step *= 1.150779; - result.max *= 1.150779; - result.unit = tr("mph"); - } - else { - result.step *= 1.852; - result.max *= 1.852; - result.unit = tr("km/h"); - } - break; - case TELEMETRY_SOURCE_VERTICAL_SPEED: - result.step = 0.1; - result.min = -12.5; - result.max = 13.0; - result.decimals = 1; - result.unit = tr("m/s"); - break; - case TELEMETRY_SOURCE_DTE: - result.max = 30000; - break; - case TELEMETRY_SOURCE_DIST: - case TELEMETRY_SOURCE_DIST_MAX: - result.step = 8; - result.max = 2040; - result.unit = tr("m"); - break; - case TELEMETRY_SOURCE_CELL: - case TELEMETRY_SOURCE_CELL_MIN: - result.step = 0.02; - result.max = 5.1; - result.decimals = 2; - result.unit = tr("V"); - break; - case TELEMETRY_SOURCE_CELLS_SUM: - case TELEMETRY_SOURCE_CELLS_MIN: - case TELEMETRY_SOURCE_VFAS: - case TELEMETRY_SOURCE_VFAS_MIN: - result.step = 0.1; - result.max = 25.5; - result.decimals = 1; - result.unit = tr("V"); - break; - case TELEMETRY_SOURCE_CURRENT: - case TELEMETRY_SOURCE_CURRENT_MAX: - result.step = 0.5; - result.max = 127.5; - result.decimals = 1; - result.unit = tr("A"); - break; - case TELEMETRY_SOURCE_CONSUMPTION: - result.step = 100; - result.max = 25500; - result.unit = tr("mAh"); - break; - case TELEMETRY_SOURCE_POWER: - case TELEMETRY_SOURCE_POWER_MAX: - result.step = 5; - result.max = 1275; - result.unit = tr("W"); - break; - case TELEMETRY_SOURCE_ACCX: - case TELEMETRY_SOURCE_ACCY: - case TELEMETRY_SOURCE_ACCZ: - result.step = 0.01; - result.decimals = 2; - result.max = 2.55; - result.min = 0; - result.unit = tr("g"); - break; - default: - result.max = 125; - break; - } - - if (result.offset == -DBL_MAX) { - result.offset = result.max - (127*result.step); - } - - if (flags & (RANGE_DELTA_FUNCTION | RANGE_ABS_FUNCTION)) { - result.offset = 0; - result.min = result.step * -127; - result.max = result.step * 127; - } - } - break; case SOURCE_TYPE_LUA_OUTPUT: result.max = 30000; @@ -414,7 +226,7 @@ QString RawSource::toString(const ModelData * model, const GeneralSettings * con return CHECK_IN_ARRAY(special, index); case SOURCE_TYPE_TELEMETRY: - if (IS_ARM(board)) { + { div_t qr = div(index, 3); if (model) result = model->sensorData[qr.quot].nameToString(qr.quot); @@ -424,9 +236,6 @@ QString RawSource::toString(const ModelData * model, const GeneralSettings * con result += (qr.rem == 1 ? "-" : "+"); return result; } - else { - return CHECK_IN_ARRAY(telemetry, index); - } case SOURCE_TYPE_GVAR: if (model) @@ -486,13 +295,7 @@ bool RawSource::isSlider(int * sliderIndex, Board::Type board) const bool RawSource::isTimeBased(Board::Type board) const { - if (board == Board::BOARD_UNKNOWN) - board = getCurrentBoard(); - - if (IS_ARM(board)) - return (type == SOURCE_TYPE_SPECIAL && index > 0); - else - return (type==SOURCE_TYPE_TELEMETRY && (index==TELEMETRY_SOURCE_TX_TIME || index==TELEMETRY_SOURCE_TIMER1 || index==TELEMETRY_SOURCE_TIMER2 || index==TELEMETRY_SOURCE_TIMER3)); + return (type == SOURCE_TYPE_SPECIAL && index > 0); } bool RawSource::isAvailable(const ModelData * const model, const GeneralSettings * const gs, Board::Type board) const @@ -516,20 +319,9 @@ bool RawSource::isAvailable(const ModelData * const model, const GeneralSettings return false; if (type == SOURCE_TYPE_TELEMETRY) { - if (IS_ARM(board) && !model->sensorData[div(index, 3).quot].isAvailable()) { + if (!model->sensorData[div(index, 3).quot].isAvailable()) { return false; } - else if (!IS_ARM(board)) { - Firmware * fw = getCurrentFirmware(); - if (type == (int)TELEMETRY_SOURCE_TX_TIME && !fw->getCapability(RtcTime)) - return false; - - if (type == (int)TELEMETRY_SOURCE_RAS && !fw->getCapability(SportTelemetry)) - return false; - - if (type == (int)TELEMETRY_SOURCE_TIMER3 && fw->getCapability(Timers) < 3) - return false; - } } } diff --git a/companion/src/firmwares/rawsource.h b/companion/src/firmwares/rawsource.h index f59ab70f5..b3220dbd3 100644 --- a/companion/src/firmwares/rawsource.h +++ b/companion/src/firmwares/rawsource.h @@ -159,10 +159,6 @@ enum TelemetrySource { TELEMETRY_SOURCE_RESERVE = -1 }; -#define TM_HASTELEMETRY 0x01 -#define TM_HASOFFSET 0x02 -#define TM_HASWSHH 0x04 - enum RawSourceType { SOURCE_TYPE_NONE, SOURCE_TYPE_VIRTUAL_INPUT, diff --git a/companion/src/firmwares/telem_data.cpp b/companion/src/firmwares/telem_data.cpp index af31f3b38..99743c7e2 100644 --- a/companion/src/firmwares/telem_data.cpp +++ b/companion/src/firmwares/telem_data.cpp @@ -48,9 +48,6 @@ RawSourceRange FrSkyChannelData::getRange() const void FrSkyScreenData::clear() { memset(reinterpret_cast(this), 0, sizeof(FrSkyScreenData)); - if (!IS_ARM(getCurrentBoard())) { - type = TELEMETRY_SCREEN_NUMBERS; - } } void FrSkyData::clear() diff --git a/companion/src/generaledit/generaledit.cpp b/companion/src/generaledit/generaledit.cpp index 7b424ec02..34d090e65 100644 --- a/companion/src/generaledit/generaledit.cpp +++ b/companion/src/generaledit/generaledit.cpp @@ -56,9 +56,7 @@ GeneralEdit::GeneralEdit(QWidget * parent, RadioData & radioData, Firmware * fir } addTab(new GeneralSetupPanel(this, generalSettings, firmware), tr("Setup")); - if (IS_ARM(firmware->getBoard())) { - addTab(new CustomFunctionsPanel(this, NULL, generalSettings, firmware), tr("Global Functions")); - } + addTab(new CustomFunctionsPanel(this, NULL, generalSettings, firmware), tr("Global Functions")); addTab(new TrainerPanel(this, generalSettings, firmware), tr("Trainer")); addTab(new HardwarePanel(this, generalSettings, firmware), tr("Hardware")); addTab(new CalibrationPanel(this, generalSettings, firmware), tr("Calibration")); diff --git a/companion/src/generaledit/generalsetup.cpp b/companion/src/generaledit/generalsetup.cpp index 1f74e2734..773e66734 100644 --- a/companion/src/generaledit/generalsetup.cpp +++ b/companion/src/generaledit/generalsetup.cpp @@ -234,12 +234,7 @@ ui(new Ui::GeneralSetup) ui->memwarnChkB->setChecked(!generalSettings.disableMemoryWarning); // Default is zero=checked ui->alarmwarnChkB->setChecked(!generalSettings.disableAlarmWarning); // Default is zero=checked - if (IS_ARM(firmware->getBoard())) { - ui->rssiPowerOffWarnChkB->setChecked(!generalSettings.disableRssiPoweroffAlarm); // Default is zero=checked - } - else { - ui->rssiPowerOffWarnChkB->hide(); - } + ui->rssiPowerOffWarnChkB->setChecked(!generalSettings.disableRssiPoweroffAlarm); // Default is zero=checked if (IS_FAMILY_HORUS_OR_T16(firmware->getBoard())) { ui->splashScreenChkB->hide(); @@ -302,13 +297,7 @@ ui(new Ui::GeneralSetup) ui->backlightColor2_label->hide(); } - if (IS_ARM(firmware->getBoard())) { - ui->switchesDelay->setValue(10*(generalSettings.switchesDelay+15)); - } - else { - ui->switchesDelay->hide(); - ui->switchesDelayLabel->hide(); - } + ui->switchesDelay->setValue(10*(generalSettings.switchesDelay+15)); ui->blAlarm_ChkB->setChecked(generalSettings.flashBeep); if (!firmware->getCapability(HasBatMeterRange)) { diff --git a/companion/src/mainwindow.cpp b/companion/src/mainwindow.cpp index af1aa72f0..50574ecd5 100644 --- a/companion/src/mainwindow.cpp +++ b/companion/src/mainwindow.cpp @@ -26,7 +26,6 @@ #include "apppreferencesdialog.h" #include "fwpreferencesdialog.h" #include "firmwareinterface.h" -#include "fusesdialog.h" #include "downloaddialog.h" #include "printdialog.h" #include "version.h" @@ -939,10 +938,8 @@ void MainWindow::readEeprom() QString tempFile; if (IS_FAMILY_HORUS_OR_T16(board)) tempFile = generateProcessUniqueTempFileName("temp.otx"); - else if (IS_ARM(board)) - tempFile = generateProcessUniqueTempFileName("temp.bin"); else - tempFile = generateProcessUniqueTempFileName("temp.hex"); + tempFile = generateProcessUniqueTempFileName("temp.bin"); qDebug() << "MainWindow::readEeprom(): using temp file: " << tempFile; @@ -1029,14 +1026,6 @@ void MainWindow::burnConfig() void MainWindow::burnList() { burnConfigDialog bcd(this); - bcd.listAvrdudeProgrammers(); -} - -void MainWindow::burnFuses() -{ - FusesDialog *fd = new FusesDialog(this); - fd->exec(); - delete fd; } void MainWindow::compare() @@ -1232,8 +1221,6 @@ void MainWindow::retranslateUi(bool showMsg) trAct(changelogAct, tr("Release notes..."), tr("Show release notes")); trAct(compareAct, tr("Compare Models..."), tr("Compare models")); trAct(editSplashAct, tr("Edit Radio Splash Image..."), tr("Edit the splash image of your Radio")); - trAct(burnListAct, tr("List programmers..."), tr("List available programmers")); - trAct(burnFusesAct, tr("Fuses..."), tr("Show fuses dialog")); trAct(readFlashAct, tr("Read Firmware from Radio"), tr("Read firmware from Radio")); trAct(writeFlashAct, tr("Write Firmware to Radio"), tr("Write firmware to Radio")); trAct(sdsyncAct, tr("Synchronize SD"), tr("SD card synchronization")); @@ -1295,7 +1282,6 @@ void MainWindow::createActions() editSplashAct = addAct("paintbrush.png", SLOT(customizeSplash())); burnListAct = addAct("list.png", SLOT(burnList())); - burnFusesAct = addAct("fuses.png", SLOT(burnFuses())); readFlashAct = addAct("read_flash.png", SLOT(readFlash())); writeFlashAct = addAct("write_flash.png", SLOT(writeFlash())); writeEepromAct = addAct("write_eeprom.png", SLOT(writeEeprom())); @@ -1400,10 +1386,6 @@ void MainWindow::createMenus() burnMenu->addAction(readFlashAct); burnMenu->addSeparator(); burnMenu->addSeparator(); - if (!IS_ARM(getCurrentBoard())) { - burnMenu->addAction(burnFusesAct); - burnMenu->addAction(burnListAct); - } windowMenu = menuBar()->addMenu(""); windowMenu->addAction(actTabbedWindows); diff --git a/companion/src/mainwindow.h b/companion/src/mainwindow.h index 9369dacac..0be249f04 100644 --- a/companion/src/mainwindow.h +++ b/companion/src/mainwindow.h @@ -111,7 +111,6 @@ class MainWindow : public QMainWindow void readBackup(); void burnConfig(); void burnList(); - void burnFuses(); void contributors(); void sdsync(); void changelog(); @@ -210,7 +209,6 @@ class MainWindow : public QMainWindow QAction *readEepromAct; QAction *burnConfigAct; QAction *burnListAct; - QAction *burnFusesAct; QAction *writeFlashAct; QAction *readFlashAct; QAction *writeBUToRadioAct; diff --git a/companion/src/modeledit/CMakeLists.txt b/companion/src/modeledit/CMakeLists.txt index 300fb27cc..31e727081 100644 --- a/companion/src/modeledit/CMakeLists.txt +++ b/companion/src/modeledit/CMakeLists.txt @@ -42,7 +42,6 @@ set(modeledit_UIS setup_timer.ui setup_module.ui flightmode.ui - telemetry_analog.ui telemetry_customscreen.ui telemetry_sensor.ui ) diff --git a/companion/src/modeledit/channels.cpp b/companion/src/modeledit/channels.cpp index 450f785fd..0cde45109 100644 --- a/companion/src/modeledit/channels.cpp +++ b/companion/src/modeledit/channels.cpp @@ -45,7 +45,7 @@ LimitsGroup::LimitsGroup(Firmware * firmware, TableLayout * tableLayout, int row spinbox->setSuffix("%"); } - if (IS_ARM(board) || deflt == 0 /*it's the offset*/) { + if (deflt == 0 /*it's the offset*/) { spinbox->setDecimals(1); } else { diff --git a/companion/src/modeledit/customfunctions.cpp b/companion/src/modeledit/customfunctions.cpp index 34f05a707..6b8456eb2 100644 --- a/companion/src/modeledit/customfunctions.cpp +++ b/companion/src/modeledit/customfunctions.cpp @@ -29,7 +29,7 @@ RepeatComboBox::RepeatComboBox(QWidget *parent, int & repeatParam): QComboBox(parent), repeatParam(repeatParam) { - unsigned int step = IS_ARM(getCurrentBoard()) ? 1 : 10; + unsigned int step = 1; int value = repeatParam/step; setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed); @@ -58,7 +58,7 @@ void RepeatComboBox::onIndexChanged(int index) void RepeatComboBox::update() { - unsigned int step = IS_ARM(getCurrentBoard()) ? 1 : 10; + unsigned int step = 1; int value = repeatParam/step; if (step == 1) { value++; @@ -422,29 +422,20 @@ void CustomFunctionsPanel::refreshCustomFunction(int i, bool modified) if (cfn.adjustMode == FUNC_ADJUST_GVAR_CONSTANT || cfn.adjustMode == FUNC_ADJUST_GVAR_INCDEC) { if (modified) cfn.param = fswtchParam[i]->value() * model->gvarData[gvidx].multiplierSet(); - if (IS_ARM(getCurrentBoard())) { - fswtchParam[i]->setDecimals(model->gvarData[gvidx].prec); - fswtchParam[i]->setSingleStep(model->gvarData[gvidx].multiplierGet()); - fswtchParam[i]->setSuffix(model->gvarData[gvidx].unitToString()); - if (cfn.adjustMode==FUNC_ADJUST_GVAR_INCDEC) { - double rng = abs(model->gvarData[gvidx].getMax() - model->gvarData[gvidx].getMin()); - rng *= model->gvarData[gvidx].multiplierGet(); - fswtchParam[i]->setMinimum(-rng); - fswtchParam[i]->setMaximum(rng); - } - else { - fswtchParam[i]->setMinimum(model->gvarData[gvidx].getMinPrec()); - fswtchParam[i]->setMaximum(model->gvarData[gvidx].getMaxPrec()); - } - fswtchParam[i]->setValue(cfn.param * model->gvarData[gvidx].multiplierGet()); + fswtchParam[i]->setDecimals(model->gvarData[gvidx].prec); + fswtchParam[i]->setSingleStep(model->gvarData[gvidx].multiplierGet()); + fswtchParam[i]->setSuffix(model->gvarData[gvidx].unitToString()); + if (cfn.adjustMode==FUNC_ADJUST_GVAR_INCDEC) { + double rng = abs(model->gvarData[gvidx].getMax() - model->gvarData[gvidx].getMin()); + rng *= model->gvarData[gvidx].multiplierGet(); + fswtchParam[i]->setMinimum(-rng); + fswtchParam[i]->setMaximum(rng); } else { - fswtchParam[i]->setDecimals(0); - fswtchParam[i]->setSingleStep(1); - fswtchParam[i]->setMinimum(-125); - fswtchParam[i]->setMaximum(125); - fswtchParam[i]->setValue(cfn.param); + fswtchParam[i]->setMinimum(model->gvarData[gvidx].getMinPrec()); + fswtchParam[i]->setMaximum(model->gvarData[gvidx].getMaxPrec()); } + fswtchParam[i]->setValue(cfn.param * model->gvarData[gvidx].multiplierGet()); widgetsMask |= CUSTOM_FUNCTION_NUMERIC_PARAM; } else { @@ -679,7 +670,6 @@ void CustomFunctionsPanel::populateFuncCB(QComboBox *b, unsigned int value) ((i==FuncPlayHaptic) && !firmware->getCapability(Haptic)) || ((i==FuncPlayBoth) && !firmware->getCapability(HasBeeper)) || ((i==FuncLogs) && !firmware->getCapability(HasSDLogs)) || - ((i==FuncSetTimer1 || i==FuncSetTimer2) && !IS_ARM(firmware->getBoard())) || ((i==FuncSetTimer3) && firmware->getCapability(Timers) < 3) || ((i==FuncScreenshot) && !IS_HORUS_OR_TARANIS(firmware->getBoard())) || ((i>=FuncRangeCheckInternalModule && i<=FuncBindExternalModule) && (!model || !firmware->getCapability(DangerousFunctions))) || diff --git a/companion/src/modeledit/expodialog.cpp b/companion/src/modeledit/expodialog.cpp index 0745f5c84..95aaeca66 100644 --- a/companion/src/modeledit/expodialog.cpp +++ b/companion/src/modeledit/expodialog.cpp @@ -46,18 +46,8 @@ ExpoDialog::ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expoData, G setWindowTitle(tr("Edit %1").arg(RawSource(srcType, ed->chn).toString(&model, &generalSettings))); QRegExp rx(CHAR_FOR_NAMES_REGEX); - if (IS_ARM(getCurrentBoard())) { - gvWeightGroup = new GVarGroup(ui->weightGV, ui->weightSB, ui->weightCB, ed->weight, model, 100, -100, 100); - gvOffsetGroup = new GVarGroup(ui->offsetGV, ui->offsetSB, ui->offsetCB, ed->offset, model, 0, -100, 100); - } - else { - gvWeightGroup = new GVarGroup(ui->weightGV, ui->weightSB, ui->weightCB, ed->weight, model, 100, 0, 100); - gvOffsetGroup = NULL; - ui->offsetLabel->hide(); - ui->offsetGV->hide(); - ui->offsetSB->hide(); - ui->offsetCB->hide(); - } + gvWeightGroup = new GVarGroup(ui->weightGV, ui->weightSB, ui->weightCB, ed->weight, model, 100, -100, 100); + gvOffsetGroup = new GVarGroup(ui->offsetGV, ui->offsetSB, ui->offsetCB, ed->offset, model, 0, -100, 100); curveGroup = new CurveGroup(ui->curveTypeCB, ui->curveGVarCB, ui->curveValueCB, ui->curveValueSB, ed->curve, model, firmware->getCapability(HasInputDiff) ? 0 : (HIDE_DIFF | HIDE_NEGATIVE_CURVES)); diff --git a/companion/src/modeledit/logicalswitches.cpp b/companion/src/modeledit/logicalswitches.cpp index 13e20b8f6..63a2ae22f 100644 --- a/companion/src/modeledit/logicalswitches.cpp +++ b/companion/src/modeledit/logicalswitches.cpp @@ -479,10 +479,6 @@ void LogicalSwitchesPanel::populateFunctionCB(QComboBox *b) int func = order[i]; if (func == LS_FN_NEQUAL || func == LS_FN_EGREATER || func == LS_FN_ELESS) continue; - if (!IS_ARM(firmware->getBoard())) { - if (func == LS_FN_VEQUAL || func == LS_FN_EDGE) - continue; - } b->addItem(LogicalSwitchData(func).funcToString(), func); } b->setMaxVisibleItems(10); @@ -490,27 +486,7 @@ void LogicalSwitchesPanel::populateFunctionCB(QComboBox *b) void LogicalSwitchesPanel::populateAndSwitchCB(QComboBox *b) { - if (IS_ARM(firmware->getBoard())) { - b->setModel(rawSwitchItemModel); - } - else { - RawSwitch item; - - b->clear(); - - item = RawSwitch(SWITCH_TYPE_NONE); - b->addItem(item.toString(), item.toValue()); - - for (int i=1; i <= Boards::getCapability(firmware->getBoard(), Board::SwitchPositions); i++) { - item = RawSwitch(SWITCH_TYPE_SWITCH, i); - b->addItem(item.toString(), item.toValue()); - } - - for (int i=1; i<=6; i++) { - item = RawSwitch(SWITCH_TYPE_VIRTUAL, i); - b->addItem(item.toString(), item.toValue()); - } - } + b->setModel(rawSwitchItemModel); b->setVisible(true); } diff --git a/companion/src/modeledit/modeledit.cpp b/companion/src/modeledit/modeledit.cpp index 59fb408c4..af3166c7f 100644 --- a/companion/src/modeledit/modeledit.cpp +++ b/companion/src/modeledit/modeledit.cpp @@ -65,7 +65,7 @@ ModelEdit::ModelEdit(QWidget * parent, RadioData & radioData, int modelId, Firmw s1.report("LS"); addTab(new CustomFunctionsPanel(this, &radioData.models[modelId], radioData.generalSettings, firmware), tr("Special Functions")); s1.report("CF"); - if (firmware->getCapability(Telemetry) & TM_HASTELEMETRY) + if (firmware->getCapability(Telemetry)) addTab(new TelemetryPanel(this, radioData.models[modelId], radioData.generalSettings, firmware), tr("Telemetry")); onTabIndexChanged(ui->tabWidget->currentIndex()); // make sure to trigger update on default tab panel diff --git a/companion/src/modeledit/setup.cpp b/companion/src/modeledit/setup.cpp index b1fb9af72..3fc74a3e7 100644 --- a/companion/src/modeledit/setup.cpp +++ b/companion/src/modeledit/setup.cpp @@ -36,7 +36,6 @@ TimerPanel::TimerPanel(QWidget *parent, ModelData & model, TimerData & timer, Ge timer(timer), ui(new Ui::Timer) { - Board::Type board = firmware->getBoard(); ui->setupUi(this); @@ -65,10 +64,8 @@ TimerPanel::TimerPanel(QWidget *parent, ModelData & model, TimerData & timer, Ge ui->countdownBeep->setField(timer.countdownBeep, this); ui->countdownBeep->addItem(tr("Silent"), TimerData::COUNTDOWN_SILENT); ui->countdownBeep->addItem(tr("Beeps"), TimerData::COUNTDOWN_BEEPS); - if (IS_ARM(board) || IS_2560(board)) { - ui->countdownBeep->addItem(tr("Voice"), TimerData::COUNTDOWN_VOICE); - ui->countdownBeep->addItem(tr("Haptic"), TimerData::COUNTDOWN_HAPTIC); - } + ui->countdownBeep->addItem(tr("Voice"), TimerData::COUNTDOWN_VOICE); + ui->countdownBeep->addItem(tr("Haptic"), TimerData::COUNTDOWN_HAPTIC); ui->value->setMaximumTime(firmware->getMaxTimerStart()); @@ -1205,13 +1202,7 @@ SetupPanel::SetupPanel(QWidget * parent, ModelData & model, GeneralSettings & ge ui->potWarningMode->hide(); } - if (IS_ARM(board)) { - ui->trimsDisplay->setField(model.trimsDisplay, this); - } - else { - ui->labelTrimsDisplay->hide(); - ui->trimsDisplay->hide(); - } + ui->trimsDisplay->setField(model.trimsDisplay, this); for (int i = firmware->getCapability(NumFirstUsableModule); i < firmware->getCapability(NumModules); i++) { modules[i] = new ModulePanel(this, model, model.moduleData[i], generalSettings, firmware, i); diff --git a/companion/src/modeledit/telemetry.cpp b/companion/src/modeledit/telemetry.cpp index 83565c03e..99915eae5 100644 --- a/companion/src/modeledit/telemetry.cpp +++ b/companion/src/modeledit/telemetry.cpp @@ -20,7 +20,6 @@ #include "telemetry.h" #include "ui_telemetry.h" -#include "ui_telemetry_analog.h" #include "ui_telemetry_customscreen.h" #include "ui_telemetry_sensor.h" #include "helpers.h" @@ -29,291 +28,6 @@ #include -TelemetryAnalog::TelemetryAnalog(QWidget *parent, FrSkyChannelData & analog, ModelData & model, GeneralSettings & generalSettings, Firmware * firmware): - ModelPanel(parent, model, generalSettings, firmware), - ui(new Ui::TelemetryAnalog), - analog(analog), - lock(false) -{ - ui->setupUi(this); - - float ratio = analog.getRatio(); - - if (analog.type==0 || analog.type==1 || analog.type==2) { - ui->RatioSB->setDecimals(1); - ui->RatioSB->setMaximum(25.5*firmware->getCapability(TelemetryMaxMultiplier)); - } - else { - ui->RatioSB->setDecimals(0); - ui->RatioSB->setMaximum(255*firmware->getCapability(TelemetryMaxMultiplier)); - } - ui->RatioSB->setValue(ratio); - - update(); - - ui->UnitCB->setCurrentIndex(analog.type); - ui->alarm1LevelCB->setCurrentIndex(analog.alarms[0].level); - ui->alarm1GreaterCB->setCurrentIndex(analog.alarms[0].greater); - ui->alarm2LevelCB->setCurrentIndex(analog.alarms[1].level); - ui->alarm2GreaterCB->setCurrentIndex(analog.alarms[1].greater); - - if (!(firmware->getCapability(Telemetry) & TM_HASOFFSET)) { - ui->CalibSB->hide(); - ui->CalibLabel->hide(); - } - else { - ui->label_Max->setText(tr("Range")); - } - - disableMouseScrolling(); -} - -void TelemetryAnalog::update() -{ - float ratio = analog.getRatio(); - float step = ratio / 255; - float mini = (ratio * analog.offset) / 255; - float maxi = mini + ratio; - - ui->alarm1ValueSB->setDecimals(2); - ui->alarm1ValueSB->setSingleStep(step); - ui->alarm1ValueSB->setMinimum(mini); - ui->alarm1ValueSB->setMaximum(maxi); - ui->alarm1ValueSB->setValue(mini + step*analog.alarms[0].value); - - ui->alarm2ValueSB->setDecimals(2); - ui->alarm2ValueSB->setSingleStep(step); - ui->alarm2ValueSB->setMinimum(mini); - ui->alarm2ValueSB->setMaximum(maxi); - ui->alarm2ValueSB->setValue(mini + step*analog.alarms[1].value); - - ui->CalibSB->setDecimals(2); - ui->CalibSB->setMaximum(step*127); - ui->CalibSB->setMinimum(-step*128); - ui->CalibSB->setSingleStep(step); - ui->CalibSB->setValue(mini); -} - -static int findmult(float value, float base) -{ - int vvalue = value*10; - int vbase = base*10; - vvalue--; - - int mult = 0; - for (int i=8; i>=0; i--) { - if (vvalue/vbase >= (1<RatioSB->setDecimals(1); - ui->RatioSB->setMaximum(25.5*firmware->getCapability(TelemetryMaxMultiplier)); - break; - default: - ui->RatioSB->setDecimals(0); - ui->RatioSB->setMaximum(255*firmware->getCapability(TelemetryMaxMultiplier)); - break; - } - ui->RatioSB->setValue(ratio); - update(); - emit modified(); -} - -void TelemetryAnalog::on_RatioSB_valueChanged() -{ - if (!lock) { - if (analog.type==0 || analog.type==1 || analog.type==2) { - analog.multiplier = findmult(ui->RatioSB->value(), 25.5); - float singlestep =(1<RatioSB->setSingleStep(singlestep); - ui->RatioSB->setValue(round(ui->RatioSB->value()/singlestep)*singlestep); - lock=false; - } - else { - analog.multiplier = findmult(ui->RatioSB->value(), 255); - float singlestep = (1<RatioSB->setSingleStep(singlestep); - ui->RatioSB->setValue(round(ui->RatioSB->value()/singlestep)*singlestep); - lock = false; - } - emit modified(); - } -} - -void TelemetryAnalog::on_RatioSB_editingFinished() -{ - if (!lock) { - float ratio, calib, alarm1value,alarm2value; - - if (analog.type==0 || analog.type==1 || analog.type==2) { - analog.multiplier = findmult(ui->RatioSB->value(), 25.5); - ui->CalibSB->setSingleStep((1<alarm1ValueSB->setSingleStep((1<alarm2ValueSB->setSingleStep((1<RatioSB->value()*10))/(1 <RatioSB->value(), 255); - ui->CalibSB->setSingleStep(1<alarm1ValueSB->setSingleStep(1<alarm2ValueSB->setSingleStep(1<RatioSB->value()/(1 << analog.multiplier)); - } - ui->CalibSB->setMaximum((ui->RatioSB->value()*127)/255); - ui->CalibSB->setMinimum((ui->RatioSB->value()*-128)/255); - ui->alarm1ValueSB->setMaximum(ui->RatioSB->value()); - ui->alarm2ValueSB->setMaximum(ui->RatioSB->value()); - repaint(); - ratio=analog.ratio * (1 << analog.multiplier); - calib=ui->CalibSB->value(); - alarm1value=ui->alarm1ValueSB->value(); - alarm2value=ui->alarm2ValueSB->value(); - if (analog.type==0) { - calib*=10; - alarm1value*=10; - alarm2value*=10; - } - if (calib>0) { - if (calib>((ratio*127)/255)) { - analog.offset=127; - } - else { - analog.offset=round(calib*255/ratio); - } - } - if (calib<0) { - if (calib<((ratio*-128)/255)) { - analog.offset=-128; - } - else { - analog.offset=round(calib*255/ratio); - } - } - analog.alarms[0].value=round((alarm1value*255-analog.offset*(analog.ratio<CalibSB->value()/ratio)); - calib=ratio*analog.offset/255.0; - alarm1value=ui->alarm1ValueSB->value(); - alarm2value=ui->alarm2ValueSB->value(); - if (alarm1value(ratio+calib)) { - alarm1value=ratio+calib; - } - if (alarm2value(ratio+calib)) { - alarm2value=ratio+calib; - } - analog.alarms[0].value=round(((alarm1value-calib)*255)/ratio); - analog.alarms[1].value=round(((alarm2value-calib)*255)/ratio); - } - else { - analog.offset=0; - analog.alarms[0].value=0; - analog.alarms[1].value=0; - } - update(); - emit modified(); -} - -void TelemetryAnalog::on_alarm1LevelCB_currentIndexChanged(int index) -{ - analog.alarms[0].level = index; - emit modified(); -} - - -void TelemetryAnalog::on_alarm1GreaterCB_currentIndexChanged(int index) -{ - analog.alarms[0].greater = index; - emit modified(); -} - -void TelemetryAnalog::on_alarm1ValueSB_editingFinished() -{ - float ratio = analog.getRatio(); - float calib, alarm1value; - - calib=analog.offset; - alarm1value=ui->alarm1ValueSB->value(); - - if (alarm1value<((calib*ratio)/255)) { - analog.alarms[0].value=0; - } - else if (alarm1value>(ratio+(calib*ratio)/255)) { - analog.alarms[0].value=255; - } - else { - analog.alarms[0].value = round((alarm1value-((calib*ratio)/255))/ratio*255); - } - update(); - emit modified(); -} - -void TelemetryAnalog::on_alarm2LevelCB_currentIndexChanged(int index) -{ - analog.alarms[1].level = index; - emit modified(); -} - -void TelemetryAnalog::on_alarm2GreaterCB_currentIndexChanged(int index) -{ - analog.alarms[1].greater = index; - emit modified(); -} - -void TelemetryAnalog::on_alarm2ValueSB_editingFinished() -{ - float calib, alarm2value; - float ratio = analog.getRatio(); - calib = analog.offset; - alarm2value = ui->alarm2ValueSB->value(); - if (alarm2value<((calib*ratio)/255)) { - analog.alarms[1].value=0; - } - else if (alarm2value>(ratio+(calib*ratio)/255)) { - analog.alarms[1].value=255; - } - else { - analog.alarms[1].value = round((alarm2value-((calib*ratio)/255))/ratio*255); - } - update(); - emit modified(); -} - -TelemetryAnalog::~TelemetryAnalog() -{ - delete ui; -} /******************************************************/ @@ -377,8 +91,7 @@ TelemetryCustomScreen::TelemetryCustomScreen(QWidget *parent, ModelData & model, disableMouseScrolling(); lock = true; - if (IS_ARM(firmware->getBoard())) - ui->screenType->addItem(tr("None"), TELEMETRY_SCREEN_NONE); + ui->screenType->addItem(tr("None"), TELEMETRY_SCREEN_NONE); ui->screenType->addItem(tr("Numbers"), TELEMETRY_SCREEN_NUMBERS); ui->screenType->addItem(tr("Bars"), TELEMETRY_SCREEN_BARS); if (IS_TARANIS(firmware->getBoard())) @@ -439,14 +152,8 @@ void TelemetryCustomScreen::updateBar(int line) if (source.type != SOURCE_TYPE_NONE) { RawSourceRange range = source.getRange(model, generalSettings); - if (!IS_ARM(getCurrentBoard())) { - int max = round((range.max - range.min) / range.step); - if (int(255-screen.body.bars[line].barMax) > max) { - screen.body.bars[line].barMax = 255 - max; - } - } float minVal = range.getValue(screen.body.bars[line].barMin); - float maxVal = IS_ARM(getCurrentBoard()) ? screen.body.bars[line].barMax : 255 - screen.body.bars[line].barMax; + float maxVal = screen.body.bars[line].barMax; maxVal = range.getValue(maxVal); if (source.isTimeBased()) { @@ -552,10 +259,7 @@ void TelemetryCustomScreen::barMinChanged(double value) { if (!lock) { int line = sender()->property("index").toInt(); - if (IS_ARM(getCurrentBoard())) - screen.body.bars[line].barMin = round(value / minSB[line]->singleStep()); - else - screen.body.bars[line].barMin = round((value-minSB[line]->minimum()) / minSB[line]->singleStep()); + screen.body.bars[line].barMin = round(value / minSB[line]->singleStep()); // TODO set min (maxSB) emit modified(); } @@ -565,10 +269,7 @@ void TelemetryCustomScreen::barMaxChanged(double value) { if (!lock) { int line = sender()->property("index").toInt(); - if (IS_ARM(getCurrentBoard())) - screen.body.bars[line].barMax = round((value) / maxSB[line]->singleStep()); - else - screen.body.bars[line].barMax = 255 - round((value-minSB[line]->minimum()) / maxSB[line]->singleStep()); + screen.body.bars[line].barMax = round((value) / maxSB[line]->singleStep()); // TODO set max (minSB) emit modified(); } @@ -583,10 +284,7 @@ void TelemetryCustomScreen::barTimeChanged() if (!te) return; - if (IS_ARM(getCurrentBoard())) - valRef = round(te->timeInSeconds() / te->singleStep()); - else - valRef = round((te->timeInSeconds() - te->minimumTime()) / te->singleStep()); + valRef = round(te->timeInSeconds() / te->singleStep()); emit modified(); } @@ -946,29 +644,17 @@ TelemetryPanel::TelemetryPanel(QWidget *parent, ModelData & model, GeneralSettin model.frsky.usrProto = 1; } - if (IS_ARM(firmware->getBoard())) { - ui->varioSource->setField(model.frsky.varioSource, this); - ui->varioCenterSilent->setField(model.frsky.varioCenterSilent, this); - ui->A1GB->hide(); - ui->A2GB->hide(); - for (unsigned i= 0; i < CPN_MAX_SENSORS; ++i) { - TelemetrySensorPanel * panel = new TelemetrySensorPanel(this, model.sensorData[i], i, model, generalSettings, firmware); - ui->sensorsLayout->addWidget(panel); - sensorPanels[i] = panel; - connect(panel, SIGNAL(dataModified()), this, SLOT(update())); - connect(panel, SIGNAL(modified()), this, SLOT(onModified())); - connect(panel, SIGNAL(clearAllSensors()), this, SLOT(on_clearAllSensors())); - } - } - else { - ui->sensorsGB->hide(); - ui->altimetryGB->hide(); - analogs[0] = new TelemetryAnalog(this, model.frsky.channels[0], model, generalSettings, firmware); - ui->A1Layout->addWidget(analogs[0]); - connect(analogs[0], SIGNAL(modified()), this, SLOT(onAnalogModified())); - analogs[1] = new TelemetryAnalog(this, model.frsky.channels[1], model, generalSettings, firmware); - ui->A2Layout->addWidget(analogs[1]); - connect(analogs[1], SIGNAL(modified()), this, SLOT(onModified())); + ui->varioSource->setField(model.frsky.varioSource, this); + ui->varioCenterSilent->setField(model.frsky.varioCenterSilent, this); + ui->A1GB->hide(); + ui->A2GB->hide(); + for (unsigned i= 0; i < CPN_MAX_SENSORS; ++i) { + TelemetrySensorPanel * panel = new TelemetrySensorPanel(this, model.sensorData[i], i, model, generalSettings, firmware); + ui->sensorsLayout->addWidget(panel); + sensorPanels[i] = panel; + connect(panel, SIGNAL(dataModified()), this, SLOT(update())); + connect(panel, SIGNAL(modified()), this, SLOT(onModified())); + connect(panel, SIGNAL(clearAllSensors()), this, SLOT(on_clearAllSensors())); } if (IS_TARANIS_X9(firmware->getBoard())) { @@ -1017,10 +703,8 @@ void TelemetryPanel::update() populateTelemetrySourcesComboBox(ui->varioSource, model, false); } - if (IS_ARM(firmware->getBoard())) { - for (unsigned i=0; iupdate(); - } + for (unsigned i=0; iupdate(); } emit updated(); @@ -1032,52 +716,29 @@ void TelemetryPanel::setup() lock = true; - if (IS_ARM(firmware->getBoard())) { - ui->telemetryProtocol->addItem(tr("FrSky S.PORT"), 0); - ui->telemetryProtocol->addItem(tr("FrSky D"), 1); - if (IS_9XRPRO(firmware->getBoard()) || - (IS_TARANIS(firmware->getBoard()) && generalSettings.auxSerialMode == 2)) { - ui->telemetryProtocol->addItem(tr("FrSky D (cable)"), 2); - } - ui->telemetryProtocol->setCurrentIndex(model->telemetryProtocol); - ui->ignoreSensorIds->setField(model->frsky.ignoreSensorIds, this); - ui->disableTelemetryAlarms->setField(model->rssiAlarms.disabled); - } - else { - ui->telemetryProtocolLabel->hide(); - ui->telemetryProtocol->hide(); - ui->ignoreSensorIds->hide(); - ui->disableTelemetryAlarms->hide(); + ui->telemetryProtocol->addItem(tr("FrSky S.PORT"), 0); + ui->telemetryProtocol->addItem(tr("FrSky D"), 1); + if (IS_9XRPRO(firmware->getBoard()) || + (IS_TARANIS(firmware->getBoard()) && generalSettings.auxSerialMode == 2)) { + ui->telemetryProtocol->addItem(tr("FrSky D (cable)"), 2); } + ui->telemetryProtocol->setCurrentIndex(model->telemetryProtocol); + ui->ignoreSensorIds->setField(model->frsky.ignoreSensorIds, this); + ui->disableTelemetryAlarms->setField(model->rssiAlarms.disabled); ui->rssiAlarmWarningSB->setValue(model->rssiAlarms.warning); ui->rssiAlarmCriticalSB->setValue(model->rssiAlarms.critical); - if (!IS_ARM(firmware->getBoard())) { - ui->rssiSourceLabel->hide(); - ui->rssiSourceCB->hide(); - ui->rssiAlarmWarningCB->setCurrentIndex(model->rssiAlarms.level[0]); - ui->rssiAlarmCriticalCB->setCurrentIndex(model->rssiAlarms.level[1]); - } - else { - ui->rssiSourceLabel->show(); - ui->rssiSourceLabel->setText(tr("Source")); - ui->rssiSourceCB->setField(model->rssiSource, this); - ui->rssiSourceCB->show(); - populateTelemetrySourcesComboBox(ui->rssiSourceCB, model, false); - ui->rssiAlarmWarningCB->hide(); - ui->rssiAlarmCriticalCB->hide(); - ui->rssiAlarmWarningLabel->setText(tr("Low Alarm")); - ui->rssiAlarmCriticalLabel->setText(tr("Critical Alarm")); - } + ui->rssiSourceLabel->show(); + ui->rssiSourceLabel->setText(tr("Source")); + ui->rssiSourceCB->setField(model->rssiSource, this); + ui->rssiSourceCB->show(); + populateTelemetrySourcesComboBox(ui->rssiSourceCB, model, false); - /*if (IS_ARM(firmware->getBoard())) { - for (int i=0; i, model, generalSettings, firmware); - ui->sensorsLayout->addWidget(panel); - sensorPanels[i] = panel; - } - }*/ + ui->rssiAlarmWarningCB->hide(); + ui->rssiAlarmCriticalCB->hide(); + ui->rssiAlarmWarningLabel->setText(tr("Low Alarm")); + ui->rssiAlarmCriticalLabel->setText(tr("Critical Alarm")); int varioCap = firmware->getCapability(HasVario); if (!varioCap) { @@ -1109,7 +770,7 @@ void TelemetryPanel::setup() ui->altimetryGB->setVisible(firmware->getCapability(HasVario)), ui->frskyProtoCB->setDisabled(firmware->getCapability(NoTelemetryProtocol)); - if (firmware->getCapability(Telemetry) & TM_HASWSHH) { + if (firmware->getCapability(Telemetry)) { ui->frskyProtoCB->addItem(tr("Winged Shadow How High")); } else { @@ -1117,38 +778,6 @@ void TelemetryPanel::setup() } ui->variousGB->hide(); - if (!IS_ARM(firmware->getBoard())) { - if (!(firmware->getCapability(HasFasOffset)) && !(firmware_id.contains("fasoffset"))) { - ui->fasOffset_label->hide(); - ui->fasOffset_DSB->hide(); - } - else { - ui->fasOffset_DSB->setValue(model->frsky.fasOffset/10.0); - ui->variousGB->show(); - } - - if (!(firmware->getCapability(HasMahPersistent))) { - ui->mahCount_label->hide(); - ui->mahCount_SB->hide(); - ui->mahCount_ChkB->hide(); - } - else { - if (model->frsky.mAhPersistent) { - ui->mahCount_ChkB->setChecked(true); - ui->mahCount_SB->setValue(model->frsky.storedMah); - } - else { - ui->mahCount_SB->setDisabled(true); - } - ui->variousGB->show(); - } - - ui->frskyProtoCB->setCurrentIndex(model->frsky.usrProto); - ui->bladesCount->setValue(model->frsky.blades); - populateVarioSource(); - populateVoltsSource(); - populateCurrentSource(); - } lock = false; } @@ -1170,10 +799,8 @@ void TelemetryPanel::populateVoltsSource() cb->setField(model->frsky.voltsSource, this); cb->addItem(tr("A1"), TELEMETRY_VOLTS_SOURCE_A1); cb->addItem(tr("A2"), TELEMETRY_VOLTS_SOURCE_A2); - if (IS_ARM(firmware->getBoard())) { - cb->addItem(tr("A3"), TELEMETRY_VOLTS_SOURCE_A3); - cb->addItem(tr("A4"), TELEMETRY_VOLTS_SOURCE_A4); - } + cb->addItem(tr("A3"), TELEMETRY_VOLTS_SOURCE_A3); + cb->addItem(tr("A4"), TELEMETRY_VOLTS_SOURCE_A4); cb->addItem(tr("FAS"), TELEMETRY_VOLTS_SOURCE_FAS); cb->addItem(tr("Cells"), TELEMETRY_VOLTS_SOURCE_CELLS); } @@ -1185,10 +812,8 @@ void TelemetryPanel::populateCurrentSource() cb->addItem(tr("---"), TELEMETRY_CURRENT_SOURCE_NONE); cb->addItem(tr("A1"), TELEMETRY_CURRENT_SOURCE_A1); cb->addItem(tr("A2"), TELEMETRY_CURRENT_SOURCE_A2); - if (IS_ARM(firmware->getBoard())) { - cb->addItem(tr("A3"), TELEMETRY_CURRENT_SOURCE_A3); - cb->addItem(tr("A4"), TELEMETRY_CURRENT_SOURCE_A4); - } + cb->addItem(tr("A3"), TELEMETRY_CURRENT_SOURCE_A3); + cb->addItem(tr("A4"), TELEMETRY_CURRENT_SOURCE_A4); cb->addItem(tr("FAS"), TELEMETRY_CURRENT_SOURCE_FAS); } @@ -1223,18 +848,6 @@ void TelemetryPanel::on_frskyProtoCB_currentIndexChanged(int index) } } -void TelemetryPanel::on_rssiAlarmWarningCB_currentIndexChanged(int index) -{ - model->rssiAlarms.level[0] = index; - emit modified(); -} - -void TelemetryPanel::on_rssiAlarmCriticalCB_currentIndexChanged(int index) -{ - model->rssiAlarms.level[1] = index; - emit modified(); -} - void TelemetryPanel::on_rssiAlarmWarningSB_editingFinished() { model->rssiAlarms.warning= ui->rssiAlarmWarningSB->value(); diff --git a/companion/src/modeledit/telemetry.h b/companion/src/modeledit/telemetry.h index 39f3a42ad..28dc7643c 100644 --- a/companion/src/modeledit/telemetry.h +++ b/companion/src/modeledit/telemetry.h @@ -31,45 +31,11 @@ class RawSourceFilterItemModel; class TimerEdit; namespace Ui { - class TelemetryAnalog; class TelemetryCustomScreen; class TelemetrySensor; class Telemetry; } -class TelemetryAnalog: public ModelPanel -{ - Q_OBJECT - - friend class TelemetryPanel; - - public: - TelemetryAnalog(QWidget *parent, FrSkyChannelData & analog, ModelData & model, GeneralSettings & generalSettings, Firmware * firmware); - virtual ~TelemetryAnalog(); - - signals: - void modified(); - - private slots: - void on_UnitCB_currentIndexChanged(int index); - void on_RatioSB_editingFinished(); - void on_RatioSB_valueChanged(); - void on_CalibSB_editingFinished(); - void on_alarm1LevelCB_currentIndexChanged(int index); - void on_alarm1GreaterCB_currentIndexChanged(int index); - void on_alarm1ValueSB_editingFinished(); - void on_alarm2LevelCB_currentIndexChanged(int index); - void on_alarm2GreaterCB_currentIndexChanged(int index); - void on_alarm2ValueSB_editingFinished(); - - private: - Ui::TelemetryAnalog *ui; - FrSkyChannelData & analog; - bool lock; - - void update(); -}; - class TelemetryCustomScreen: public ModelPanel { Q_OBJECT @@ -155,8 +121,6 @@ class TelemetryPanel : public ModelPanel void onModified(); void on_frskyProtoCB_currentIndexChanged(int index); void on_bladesCount_editingFinished(); - void on_rssiAlarmWarningCB_currentIndexChanged(int index); - void on_rssiAlarmCriticalCB_currentIndexChanged(int index); void on_rssiAlarmWarningSB_editingFinished(); void on_rssiAlarmCriticalSB_editingFinished(); void on_varioLimitMin_DSB_editingFinished(); @@ -170,7 +134,6 @@ class TelemetryPanel : public ModelPanel private: Ui::Telemetry *ui; - TelemetryAnalog * analogs[4]; TelemetryCustomScreen * telemetryCustomScreens[4]; TelemetrySensorPanel * sensorPanels[CPN_MAX_SENSORS]; diff --git a/companion/src/modelprinter.cpp b/companion/src/modelprinter.cpp index 1d1881a75..bd56876c6 100644 --- a/companion/src/modelprinter.cpp +++ b/companion/src/modelprinter.cpp @@ -973,8 +973,7 @@ QString ModelPrinter::printSettingsTrim() { QStringList str; str << printLabelValue(tr("Step"), printTrimIncrementMode()); - if (IS_ARM(firmware->getBoard())) - str << printLabelValue(tr("Display"), printTrimsDisplayMode()); + str << printLabelValue(tr("Display"), printTrimsDisplayMode()); str << printLabelValue(tr("Extended"), printBoolean(model.extendedTrims, BOOLEAN_YESNO)); return str.join(" "); } diff --git a/companion/src/multimodelprinter.cpp b/companion/src/multimodelprinter.cpp index f9d039d69..9d57e1f62 100644 --- a/companion/src/multimodelprinter.cpp +++ b/companion/src/multimodelprinter.cpp @@ -292,7 +292,7 @@ QString MultiModelPrinter::print(QTextDocument * document) if (firmware->getCapability(GlobalFunctions)) str.append(printGlobalFunctions()); str.append(printSpecialFunctions()); - if (firmware->getCapability(Telemetry) & TM_HASTELEMETRY) { + if (firmware->getCapability(Telemetry)) { str.append(printTelemetry()); str.append(printSensors()); if (firmware->getCapability(TelemetryCustomScreens)) { @@ -751,32 +751,19 @@ QString MultiModelPrinter::printTelemetry() MultiColumns columns(modelPrinterMap.size()); columns.appendSectionTableStart(); - // Analogs on non ARM boards - if (!IS_ARM(firmware->getBoard())) { - columns.appendRowHeader(QStringList() << tr("Analogs") << tr("Unit") << tr("Scale") << tr("Offset")); - for (int i=0; i<2; i++) { - columns.appendRowStart(QString("A%1").arg(i+1), 20); - COMPARECELLWIDTH(FrSkyChannelData::unitString(model->frsky.channels[i].type), 20); - COMPARECELLWIDTH(QString::number((model->frsky.channels[i].ratio / (model->frsky.channels[i].type==0 ? 10.0 : 1)), 10, (model->frsky.channels[i].type==0 ? 1 : 0)), 20); - COMPARECELLWIDTH(QString::number((model->frsky.channels[i].offset*(model->frsky.channels[i].ratio / (model->frsky.channels[i].type==0 ?10.0 : 1)))/255, 10, (model->frsky.channels[i].type==0 ? 1 : 0)), 40); - columns.appendRowEnd(); - } - } - else { - // Protocol - columns.appendRowStart(tr("Protocol"), 20); - COMPARECELL(modelPrinter->printTelemetryProtocol(model->telemetryProtocol)); - columns.appendRowEnd(); - } + // Protocol + columns.appendRowStart(tr("Protocol"), 20); + COMPARECELL(modelPrinter->printTelemetryProtocol(model->telemetryProtocol)); + columns.appendRowEnd(); // RSSI alarms { columns.appendRowStart(tr("RSSI Alarms"), 20); columns.appendCellStart(80); - COMPARESTRING("", (IS_ARM(getCurrentBoard()) ? tr("Low") : FrSkyAlarmData::alarmLevelName(model->rssiAlarms.level[0])), false); + COMPARESTRING("", tr("Low"), false); columns.append(": "); COMPARESTRING("", QString("< %1").arg(QString::number(model->rssiAlarms.warning, 10)), true); - COMPARESTRING("", (IS_ARM(getCurrentBoard()) ? tr("Critical") : FrSkyAlarmData::alarmLevelName(model->rssiAlarms.level[1])), false); + COMPARESTRING("", tr("Critical"), false); columns.append(": "); COMPARESTRING("", QString("< %1").arg(QString::number(model->rssiAlarms.critical, 10)), true); COMPARESTRING(tr("Telemetry audio"), modelPrinter->printRssiAlarmsDisabled(model->rssiAlarms.disabled), false); @@ -818,39 +805,9 @@ QString MultiModelPrinter::printTelemetry() columns.appendRowEnd(); } - if (IS_ARM(firmware->getBoard())) { - ROWLABELCOMPARECELL("Multi sensors", 0, modelPrinter->printIgnoreSensorIds(!model->frsky.ignoreSensorIds), 0); - } + ROWLABELCOMPARECELL("Multi sensors", 0, modelPrinter->printIgnoreSensorIds(!model->frsky.ignoreSensorIds), 0); // Various - if (!IS_ARM(firmware->getBoard())) { - columns.appendRowHeader(QStringList() << tr("Various")); - if (!firmware->getCapability(NoTelemetryProtocol)) { - columns.appendRowStart("", 20); - LABELCOMPARECELL(tr("Serial protocol"), modelPrinter->printTelemetrySource(model->frsky.voltsSource), 80); - columns.appendRowEnd(); - } - columns.appendRowStart("", 20); - columns.appendCellStart(80); - QString firmware_id = g.profile[g.id()].fwType(); - if (firmware->getCapability(HasFasOffset) && firmware_id.contains("fasoffset")) { - COMPARESTRING(tr("FAS offset"), QString("%1 A").arg(model->frsky.fasOffset/10.0), true); - } - if (firmware->getCapability(HasMahPersistent)) { - COMPARESTRING(tr("mAh count"), QString("%1 mAh").arg(model->frsky.storedMah), true); - COMPARESTRING(tr("Persistent mAh"), modelPrinter->printMahPersistent(model->frsky.mAhPersistent), false); - } - columns.appendRowEnd(); - columns.appendRowStart("", 20); - columns.appendCellStart(80); - COMPARESTRING(tr("Volts source"), modelPrinter->printVoltsSource(model->frsky.voltsSource), true); - COMPARESTRING(tr("Current source"), modelPrinter->printCurrentSource(model->frsky.currentSource), false); - columns.appendCellEnd(); - columns.appendRowEnd(); - columns.appendRowStart("", 20); - LABELCOMPARECELL(tr("Blades"), model->frsky.blades, 80); - columns.appendRowEnd(); - } columns.appendTableEnd(); str.append(columns.print()); return str; diff --git a/companion/src/radiointerface.cpp b/companion/src/radiointerface.cpp index fbc03186f..0ad24fe6c 100644 --- a/companion/src/radiointerface.cpp +++ b/companion/src/radiointerface.cpp @@ -36,43 +36,8 @@ QString getRadioInterfaceCmd() if (IS_STM32(board)) { return bcd.getDFU(); } - else if (IS_SKY9X(board)) { + else return bcd.getSAMBA(); - } - else { - return bcd.getAVRDUDE(); - } -} - -QStringList getAvrdudeArgs(const QString & cmd, const QString & filename) -{ - QStringList args; - burnConfigDialog bcd; - QString programmer = bcd.getProgrammer(); - QString mcu = bcd.getMCU(); - Board::Type board = getCurrentBoard(); - - args << "-c" << programmer << "-p"; - if (IS_2560(board)) - args << "m2560"; - else if (board == Board::BOARD_9X_M128) - args << "m128"; - else - args << mcu; - - args << bcd.getAvrdudeArgs(); - - QString fullcmd = cmd + filename; - if (QFileInfo(filename).suffix().toUpper() == "HEX") - fullcmd += ":i"; - else if (QFileInfo(filename).suffix().toUpper()=="BIN") - fullcmd += ":r"; - else - fullcmd += ":a"; - - args << "-U" << fullcmd; - - return args; } QStringList getDfuArgs(const QString & cmd, const QString & filename) @@ -119,11 +84,8 @@ QStringList getReadEEpromCmd(const QString & filename) if (IS_STM32(eepromInterface->getBoard())) { // impossible } - else if (IS_SKY9X(eepromInterface->getBoard())) { - result = getSambaArgs(QString("SERIALFLASH::Init 0\n") + "receive_file {SerialFlash AT25} \"" + filename + "\" 0x0 0x80000 0\n"); - } else { - result = getAvrdudeArgs("eeprom:r:", filename); + result = getSambaArgs(QString("SERIALFLASH::Init 0\n") + "receive_file {SerialFlash AT25} \"" + filename + "\" 0x0 0x80000 0\n"); } return result; } @@ -135,11 +97,8 @@ QStringList getWriteEEpromCmd(const QString & filename) // impossible return QStringList(); } - else if (IS_SKY9X(board)) { - return getSambaArgs(QString("SERIALFLASH::Init 0\n") + "send_file {SerialFlash AT25} \"" + filename + "\" 0x0 0\n"); - } else { - return getAvrdudeArgs("eeprom:w:", filename); + return getSambaArgs(QString("SERIALFLASH::Init 0\n") + "send_file {SerialFlash AT25} \"" + filename + "\" 0x0 0\n"); } } @@ -152,11 +111,8 @@ QStringList getWriteFirmwareArgs(const QString & filename) else if (board == Board::BOARD_SKY9X) { return getSambaArgs(QString("send_file {Flash} \"") + filename + "\" 0x400000 0\n" + "FLASH::ScriptGPNMV 2\n"); } - else if (board == Board::BOARD_9XRPRO || board == Board::BOARD_AR9X) { - return getSambaArgs(QString("send_file {Flash} \"") + filename + "\" 0x400000 0\n" + "FLASH::ScriptGPNMV 2\n"); - } else { - return getAvrdudeArgs("flash:w:", filename); + return getSambaArgs(QString("send_file {Flash} \"") + filename + "\" 0x400000 0\n" + "FLASH::ScriptGPNMV 2\n"); } } @@ -169,87 +125,8 @@ QStringList getReadFirmwareArgs(const QString & filename) else if (board == Board::BOARD_SKY9X) { return getSambaArgs(QString("receive_file {Flash} \"") + filename + "\" 0x400000 0x40000 0\n"); } - else if (board == Board::BOARD_9XRPRO) { - return getSambaArgs(QString("receive_file {Flash} \"") + filename + "\" 0x400000 0x80000 0\n"); - } else { - return getAvrdudeArgs("flash:r:", filename); - } -} - -void readAvrdudeFuses(ProgressWidget * progress) -{ - burnConfigDialog bcd; - QStringList args; - args << "-c" << bcd.getProgrammer() << "-p" << bcd.getMCU() << bcd.getAvrdudeArgs() << "-U" << "lfuse:r:-:i" << "-U" << "hfuse:r:-:i" << "-U" << "efuse:r:-:i"; - FlashProcess flashProcess(bcd.getAVRDUDE(), args, progress); - flashProcess.run(); -} - -void resetAvrdudeFuses(bool eepromProtect, ProgressWidget * progress) -{ - //fuses - //avrdude -c usbasp -p m64 -U lfuse:w:<0x0E>:m - //avrdude -c usbasp -p m64 -U hfuse:w:<0x89>:m 0x81 for eeprom protection - //avrdude -c usbasp -p m64 -U efuse:w:<0xFF>:m - - burnConfigDialog bcd; - QMessageBox::StandardButton ret = QMessageBox::No; - ret = QMessageBox::warning(NULL, CPN_STR_APP_NAME, - QCoreApplication::translate("RadioInterface", - "WARNING!" \ - "
This will reset the fuses of %1 to the factory settings.
" - "Writing fuses can mess up your radio.
Do this only if you are sure they are wrong!
" - "Are you sure you want to continue?").arg(bcd.getMCU()), - QMessageBox::Yes | QMessageBox::No); - if (ret == QMessageBox::Yes) { - QStringList args = bcd.getAvrdudeArgs(); - QStringList str; - if (bcd.getMCU() == "m2560") { - args << "-B8"; - QString erStr = eepromProtect ? "hfuse:w:0x51:m" : "hfuse:w:0x59:m"; - str << "-U" << "lfuse:w:0xD7:m" << "-U" << erStr << "-U" << "efuse:w:0xFC:m"; - //use hfuse = 0x81 to prevent eeprom being erased with every flashing - } - else { - QString lfuses; - QString tempFile = generateProcessUniqueTempFileName("ftemp.bin"); - QStringList argread; - argread << "-c" << bcd.getProgrammer() << "-p" << bcd.getMCU() << args <<"-U" << "lfuse:r:"+tempFile+":r"; - FlashProcess flashProcess(bcd.getAVRDUDE(), argread, progress); - flashProcess.run(); - QFile file(tempFile); - if (file.exists() && file.size()==1) { - file.open(QIODevice::ReadOnly); - char bin_flash[1]; - file.read(bin_flash, 1); - if (bin_flash[0]==0x0E) { - lfuses = "lfuse:w:0x0E:m"; - } - else { - lfuses = "lfuse:w:0x3F:m"; - } - file.close(); - qunlink(tempFile); - } - else { - lfuses = "lfuse:w:0x3F:m"; - } - - QString erStr = eepromProtect ? "hfuse:w:0xC1:m" : "hfuse:w:0xC9:m"; - str << "-U" << lfuses << "-U" << erStr << "-U" << "efuse:w:0xFF:m"; - //use hfuse = 0x81 to prevent eeprom being erased with every flashing - } - - QStringList arguments; - if (bcd.getMCU() == "m2560") { - arguments << "-c" << bcd.getProgrammer() << "-p" << bcd.getMCU() << args << "-u" << str; - } - else { - arguments << "-c" << bcd.getProgrammer() << "-p" << bcd.getMCU() << args << "-B" << "100" << "-u" << str; - } - FlashProcess flashProcess(bcd.getAVRDUDE(), arguments, progress); - flashProcess.run(); + return getSambaArgs(QString("receive_file {Flash} \"") + filename + "\" 0x400000 0x80000 0\n"); } } @@ -264,13 +141,11 @@ bool readFirmware(const QString & filename, ProgressWidget * progress) return false; } - if (IS_ARM(getCurrentBoard())) { - QString path = findMassstoragePath("FIRMWARE.BIN"); - if (!path.isEmpty()) { - qDebug() << "readFirmware: reading" << path << "into" << filename; - CopyProcess copyProcess(path, filename, progress); - result = copyProcess.run(); - } + QString path = findMassstoragePath("FIRMWARE.BIN"); + if (!path.isEmpty()) { + qDebug() << "readFirmware: reading" << path << "into" << filename; + CopyProcess copyProcess(path, filename, progress); + result = copyProcess.run(); } if (!result) { @@ -288,13 +163,11 @@ bool readFirmware(const QString & filename, ProgressWidget * progress) bool writeFirmware(const QString & filename, ProgressWidget * progress) { - if (IS_ARM(getCurrentBoard())) { - QString path = findMassstoragePath("FIRMWARE.BIN"); - if (!path.isEmpty()) { - qDebug() << "writeFirmware: writing" << path << "from" << filename; - CopyProcess copyProcess(filename, path, progress); - return copyProcess.run(); - } + QString path = findMassstoragePath("FIRMWARE.BIN"); + if (!path.isEmpty()) { + qDebug() << "writeFirmware: writing" << path << "from" << filename; + CopyProcess copyProcess(filename, path, progress); + return copyProcess.run(); } qDebug() << "writeFirmware: writing" << filename << "with" << getRadioInterfaceCmd() << getWriteFirmwareArgs(filename); @@ -339,26 +212,25 @@ bool readEeprom(const QString & filename, ProgressWidget * progress) } } else { - if (IS_ARM(board)) { - QString path = findMassstoragePath("EEPROM.BIN"); - if (path.isEmpty()) { - // On previous OpenTX we called the EEPROM file "TARANIS.BIN" :( - path = findMassstoragePath("TARANIS.BIN"); - } - if (path.isEmpty()) { - // Mike's bootloader calls the EEPROM file "ERSKY9X.BIN" :( - path = findMassstoragePath("ERSKY9X.BIN"); - } - if (path.isEmpty()) { - RadioNotFoundDialog dialog(progress); - dialog.exec(); - return false; - } - CopyProcess copyProcess(path, filename, progress); - if (!copyProcess.run()) { - return false; - } + QString path = findMassstoragePath("EEPROM.BIN"); + if (path.isEmpty()) { + // On previous OpenTX we called the EEPROM file "TARANIS.BIN" :( + path = findMassstoragePath("TARANIS.BIN"); } + if (path.isEmpty()) { + // Mike's bootloader calls the EEPROM file "ERSKY9X.BIN" :( + path = findMassstoragePath("ERSKY9X.BIN"); + } + if (path.isEmpty()) { + RadioNotFoundDialog dialog(progress); + dialog.exec(); + return false; + } + CopyProcess copyProcess(path, filename, progress); + if (!copyProcess.run()) { + return false; + } + if (!IS_STM32(board)) { FlashProcess flashProcess(getRadioInterfaceCmd(), getReadEEpromCmd(filename), progress); @@ -375,20 +247,18 @@ bool writeEeprom(const QString & filename, ProgressWidget * progress) { Board::Type board = getCurrentBoard(); - if (IS_ARM(board)) { - QString path = findMassstoragePath("EEPROM.BIN"); - if (path.isEmpty()) { - // On previous OpenTX we called the EEPROM file "TARANIS.BIN" :( - path = findMassstoragePath("TARANIS.BIN"); - } - if (path.isEmpty()) { - // Mike's bootloader calls the EEPROM file "ERSKY9X.BIN" :( - path = findMassstoragePath("ERSKY9X.BIN"); - } - if (!path.isEmpty()) { - CopyProcess copyProcess(filename, path, progress); - return copyProcess.run(); - } + QString path = findMassstoragePath("EEPROM.BIN"); + if (path.isEmpty()) { + // On previous OpenTX we called the EEPROM file "TARANIS.BIN" :( + path = findMassstoragePath("TARANIS.BIN"); + } + if (path.isEmpty()) { + // Mike's bootloader calls the EEPROM file "ERSKY9X.BIN" :( + path = findMassstoragePath("ERSKY9X.BIN"); + } + if (!path.isEmpty()) { + CopyProcess copyProcess(filename, path, progress); + return copyProcess.run(); } if (!IS_TARANIS(board)) { @@ -396,10 +266,8 @@ bool writeEeprom(const QString & filename, ProgressWidget * progress) return flashProcess.run(); } - if (IS_ARM(board)) { - RadioNotFoundDialog dialog(progress); - dialog.exec(); - } + RadioNotFoundDialog dialog(progress); + dialog.exec(); return false; } diff --git a/companion/src/radiointerface.h b/companion/src/radiointerface.h index f896d96c5..37053fac5 100644 --- a/companion/src/radiointerface.h +++ b/companion/src/radiointerface.h @@ -30,13 +30,9 @@ QString getRadioInterfaceCmd(); QString findMassstoragePath(const QString &filename, bool onlyPath = false); -QStringList getAvrdudeArgs(const QString &cmd, const QString &filename); QStringList getSambaArgs(const QString &tcl); QStringList getDfuArgs(const QString &cmd, const QString &filename); -void readAvrdudeFuses(ProgressWidget *progress); -void resetAvrdudeFuses(bool eepromProtect, ProgressWidget *progress); - QStringList getReadEEpromCmd(const QString &filename); QStringList getWriteEEpromCmd(const QString &filename); QStringList getReadFirmwareArgs(const QString &filename); diff --git a/companion/src/storage/rlefile.cpp b/companion/src/storage/rlefile.cpp index fe297339f..4d38adac9 100644 --- a/companion/src/storage/rlefile.cpp +++ b/companion/src/storage/rlefile.cpp @@ -64,7 +64,7 @@ void RleFile::EeFsCreate(uint8_t *eeprom, int size, Board::Type board, unsigned } } } - else if (IS_TARANIS(board)) { + else { eeFsArm = (EeFsArm *)eeprom; eeFsVersion = 5; eeFsSize = 8+4*62; @@ -84,36 +84,6 @@ void RleFile::EeFsCreate(uint8_t *eeprom, int size, Board::Type board, unsigned eeFsArm->freeList = eeFsFirstBlock; // EeFsFlush(); } - else { - eeFs = (EeFs *)eeprom; - eeFsVersion = (IS_2560(board) || board==Board::BOARD_9X_M128) ? 5 : 4; - eeFsBlockSize = 16; - eeFsLinkSize = 1; - - if (eeFsVersion == 5) { - eeFsSize = 4+3*36; - eeFsFirstBlock = 1; - eeFsBlocksOffset = 112 - 16; - eeFsBlocksMax = 1 + (4096-112)/16; - } - else { - eeFsSize = 4+3*20; - eeFsFirstBlock = 4; - eeFsBlocksOffset = 0; - eeFsBlocksMax = 2048/16; - } - - memset(eeprom, 0, size); - eeFs->version = eeFsVersion; - eeFs->mySize = eeFsSize; - eeFs->freeList = 0; - eeFs->bs = eeFsBlockSize; - for (unsigned int i=eeFsFirstBlock; ifreeList = eeFsFirstBlock; - // EeFsFlush(); - } } PACK(struct EepromFileHeader @@ -146,7 +116,7 @@ bool RleFile::EeFsOpen(uint8_t *eeprom, int size, Board::Type board) searchFat(); return 1; } - else if (IS_TARANIS(board)) { + else { eeFsArm = (EeFsArm *)eeprom; eeFsVersion = eeFsArm->version; eeFsSize = 8+4*62; @@ -157,29 +127,6 @@ bool RleFile::EeFsOpen(uint8_t *eeprom, int size, Board::Type board) eeFsBlocksMax = 1 + (Boards::getEEpromSize(board)-eeFsSize) / eeFsBlockSize; return eeFsArm->mySize == eeFsSize; } - else { - eeFs = (EeFs *)eeprom; - eeFsVersion = eeFs->version; - eeFsBlockSize = 16; - eeFsLinkSize = 1; - if (eeFsVersion == 5) { - eeFsSize = 4+3*36; - eeFsFirstBlock = 1; - eeFsBlocksOffset = 112 - 16; - eeFsBlocksMax = 1 + (4096-112)/16; - } - else if (eeFsVersion == 4) { - eeFsSize = 4+3*20; - eeFsFirstBlock = 4; - eeFsBlocksOffset = 0; - eeFsBlocksMax = 2048/16; - } - else { - return 0; - } - - return eeFs->mySize == eeFsSize; - } } void RleFile::eeprom_read_block (void *pointer_ram, unsigned int pointer_eeprom, size_t size) @@ -206,25 +153,16 @@ void RleFile::EeFsWrite(unsigned int blk, unsigned int ofs, uint8_t val) unsigned int RleFile::EeFsGetLink(unsigned int blk) { - if (IS_ARM(board)) { - int16_t ret; - eeprom_read_block((uint8_t *)&ret, blk*eeFsBlockSize+eeFsBlocksOffset, eeFsLinkSize); - return ret; - } - else { - return EeFsRead(blk, 0); - } + int16_t ret; + eeprom_read_block((uint8_t *)&ret, blk*eeFsBlockSize+eeFsBlocksOffset, eeFsLinkSize); + return ret; } void RleFile::EeFsSetLink(unsigned int blk, unsigned int val) { - if (IS_ARM(board)) { - int16_t s_link = val; - eeprom_write_block((uint8_t *)&s_link, (blk*eeFsBlockSize)+eeFsBlocksOffset, eeFsLinkSize); - } - else { - EeFsWrite(blk, 0, val); - } + int16_t s_link = val; + eeprom_write_block((uint8_t *)&s_link, (blk*eeFsBlockSize)+eeFsBlocksOffset, eeFsLinkSize); + } uint8_t RleFile::EeFsGetDat(unsigned int blk, unsigned int ofs) @@ -244,10 +182,7 @@ unsigned int RleFile::EeFsGetFree() unsigned int ret = 0; unsigned int i; - if (IS_ARM(board)) - i = eeFsArm->freeList; - else - i = eeFs->freeList; + i = eeFsArm->freeList; while (i) { ret += eeFsBlockSize-eeFsLinkSize; @@ -266,14 +201,8 @@ void RleFile::EeFsFree(unsigned int blk) unsigned int i = blk; while (EeFsGetLink(i)) i = EeFsGetLink(i); - if (IS_ARM(board)) { - EeFsSetLink(i, eeFsArm->freeList); - eeFsArm->freeList = blk; //chain in front - } - else { - EeFsSetLink(i, eeFs->freeList); - eeFs->freeList = blk; //chain in front - } + EeFsSetLink(i, eeFsArm->freeList); + eeFsArm->freeList = blk; //chain in front } /* @@ -283,12 +212,9 @@ unsigned int RleFile::EeFsAlloc() { if (IS_FAMILY_HORUS_OR_T16(board)) return 0; - unsigned int ret = (IS_ARM(board) ? eeFsArm->freeList : eeFs->freeList); + unsigned int ret = eeFsArm->freeList; if (ret) { - if (IS_ARM(board)) - eeFsArm->freeList = EeFsGetLink(ret); - else - eeFs->freeList = EeFsGetLink(ret); + eeFsArm->freeList = EeFsGetLink(ret); EeFsSetLink(ret, 0); } return ret; @@ -299,7 +225,7 @@ unsigned int RleFile::size(unsigned int id) if (IS_FAMILY_HORUS_OR_T16(board)) return 0; else - return IS_ARM(board) ? eeFsArm->files[id].size : eeFs->files[id].size; + return eeFsArm->files[id].size; } unsigned int RleFile::openRd(unsigned int i_fileId) @@ -327,15 +253,12 @@ unsigned int RleFile::openRd(unsigned int i_fileId) else { m_fileId = i_fileId; m_pos = 0; - m_currBlk = (IS_ARM(board) ? eeFsArm->files[m_fileId].startBlk : eeFs->files[m_fileId].startBlk); + m_currBlk = eeFsArm->files[m_fileId].startBlk; m_ofs = 0; m_zeroes = 0; m_bRlc = 0; m_err = ERR_NONE; //error reasons - if (IS_ARM(board)) - return eeFsArm->files[m_fileId].typ; - else - return eeFs->files[m_fileId].typ; + return eeFsArm->files[m_fileId].typ; } } @@ -344,14 +267,14 @@ unsigned int RleFile::read(uint8_t *buf, unsigned int i_len) if (IS_FAMILY_HORUS_OR_T16(board)) return 0; - unsigned int len = IS_ARM(board) ? eeFsArm->files[m_fileId].size : eeFs->files[m_fileId].size; + unsigned int len = eeFsArm->files[m_fileId].size; len -= m_pos; if (i_len > len) i_len = len; len = i_len; while(len) { if (!m_currBlk) break; *buf++ = EeFsGetDat(m_currBlk, m_ofs++); - if (m_ofs >= (eeFsBlockSize-(IS_ARM(board)? 2 : 1))) { + if (m_ofs >= (eeFsBlockSize - 2)) { m_ofs = 0; m_currBlk = EeFsGetLink(m_currBlk); } @@ -492,10 +415,7 @@ unsigned int RleFile::write(const uint8_t *buf, unsigned int i_len) unsigned int len = i_len; if (!m_currBlk && m_pos==0) { - if (IS_ARM(board)) - eeFsArm->files[m_fileId].startBlk = m_currBlk = EeFsAlloc(); - else - eeFs->files[m_fileId].startBlk = m_currBlk = EeFsAlloc(); + eeFsArm->files[m_fileId].startBlk = m_currBlk = EeFsAlloc(); } while (len) { @@ -527,23 +447,15 @@ unsigned int RleFile::write(const uint8_t *buf, unsigned int i_len) void RleFile::create(unsigned int i_fileId, unsigned int typ) { openRd(i_fileId); //internal use - if (IS_ARM(board)) { - eeFsArm->files[i_fileId].typ = typ; - eeFsArm->files[i_fileId].size = 0; - } - else { - eeFs->files[i_fileId].typ = typ; - eeFs->files[i_fileId].size = 0; - } + eeFsArm->files[i_fileId].typ = typ; + eeFsArm->files[i_fileId].size = 0; + } void RleFile::closeTrunc() { unsigned int fri=0; - if (IS_ARM(board)) - eeFsArm->files[m_fileId].size = m_pos; - else - eeFs->files[m_fileId].size = m_pos; + eeFsArm->files[m_fileId].size = m_pos; if (m_currBlk && ( fri = EeFsGetLink(m_currBlk))) EeFsSetLink(m_currBlk, 0); if(fri) EeFsFree( fri ); //chain in } diff --git a/companion/src/wizarddata.cpp b/companion/src/wizarddata.cpp index f544ee4b0..25adaee24 100644 --- a/companion/src/wizarddata.cpp +++ b/companion/src/wizarddata.cpp @@ -61,27 +61,28 @@ void WizMix::maxMixSwitch(char *name, MixData &mix, int channel, int sw, int wei void WizMix::addMix(ModelData &model, Input input, int weight, int channel, int & mixIndex) { if (input != NO_INPUT) { - bool isHorusOrTaranis = IS_ARM(getCurrentBoard()); if (input >= RUDDER_INPUT && input <= AILERONS_INPUT) { MixData & mix = model.mixData[mixIndex++]; mix.destCh = channel+1; - if (isHorusOrTaranis){ + if (IS_SKY9X(getCurrentBoard())) { + mix.srcRaw = RawSource(SOURCE_TYPE_STICK, input-1); + } + else { int channel = settings.getDefaultChannel(input-1); mix.srcRaw = RawSource(SOURCE_TYPE_VIRTUAL_INPUT, channel); } - else - mix.srcRaw = RawSource(SOURCE_TYPE_STICK, input-1); + mix.weight = weight; } else if (input==FLAPS_INPUT){ // There ought to be some kind of constants for switches somewhere... - maxMixSwitch((char *)"Flaps Up", model.mixData[mixIndex++], channel+1, isHorusOrTaranis ? SWITCH_SA0 :-SWITCH_ELE , weight); //Taranis-Horus SA-UP, 9X ELE-UP - maxMixSwitch((char *)"Flaps Dn", model.mixData[mixIndex++], channel+1, isHorusOrTaranis ? SWITCH_SA2 : SWITCH_ELE , -weight); //Taranis-Horus SA-DOWN, 9X ELE-DOWN + maxMixSwitch((char *)"Flaps Up", model.mixData[mixIndex++], channel+1, IS_SKY9X(getCurrentBoard()) ? -SWITCH_ELE : SWITCH_SA0, weight); //Taranis-Horus SA-UP, 9X ELE-UP + maxMixSwitch((char *)"Flaps Dn", model.mixData[mixIndex++], channel+1, IS_SKY9X(getCurrentBoard()) ? SWITCH_ELE : SWITCH_SA2, -weight); //Taranis-Horus SA-DOWN, 9X ELE-DOWN } else if (input==AIRBRAKES_INPUT){ - maxMixSwitch((char *)"AirbkOff", model.mixData[mixIndex++], channel+1, isHorusOrTaranis ? SWITCH_SE0 :-SWITCH_RUD , -weight); //Taranis-Horus SE-UP, 9X RUD-UP - maxMixSwitch((char *)"AirbkOn", model.mixData[mixIndex++], channel+1, isHorusOrTaranis ? SWITCH_SE2 : SWITCH_RUD , weight); //Tatanis-Horus SE-DOWN, 9X RUD-DOWN + maxMixSwitch((char *)"AirbkOff", model.mixData[mixIndex++], channel+1, IS_SKY9X(getCurrentBoard()) ? -SWITCH_RUD : SWITCH_SE0, -weight); //Taranis-Horus SE-UP, 9X RUD-UP + maxMixSwitch((char *)"AirbkOn", model.mixData[mixIndex++], channel+1, IS_SKY9X(getCurrentBoard()) ? SWITCH_RUD : SWITCH_SE2, weight); //Tatanis-Horus SE-DOWN, 9X RUD-DOWN } } } @@ -120,7 +121,7 @@ WizMix::operator ModelData() mix.srcRaw = SOURCE_TYPE_MAX; mix.weight = -100; mix.swtch.type = SWITCH_TYPE_SWITCH; - mix.swtch.index = IS_ARM(getCurrentBoard()) ? SWITCH_SF0 : SWITCH_THR; + mix.swtch.index = IS_SKY9X(getCurrentBoard()) ? SWITCH_THR : SWITCH_SF0; mix.mltpx = MLTPX_REP; memset(mix.name, 0, sizeof(mix.name)); strncpy(mix.name, "Cut", MIXDATA_NAME_LEN); diff --git a/launchpad/common/rules b/launchpad/common/rules index cf96b0fda..2ee5a0a6c 100755 --- a/launchpad/common/rules +++ b/launchpad/common/rules @@ -15,9 +15,6 @@ STM32_OPTIONS = -DLUA=YES build: mkdir $(BUILDDIR); - cd $(BUILDDIR); cmake $(COMMON_OPTIONS) -DPCB=9X ../ ; make libsimulator - cd $(BUILDDIR); cmake $(COMMON_OPTIONS) -DPCB=GRUVIN9X ../ ; make libsimulator - cd $(BUILDDIR); cmake $(COMMON_OPTIONS) -DPCB=MEGA2560 ../ ; make libsimulator cd $(BUILDDIR); cmake $(COMMON_OPTIONS) -DPCB=SKY9X ../ ; make libsimulator cd $(BUILDDIR); cmake $(COMMON_OPTIONS) -DPCB=9XRPRO ../ ; make libsimulator diff --git a/radio/src/io/frsky_firmware_update.cpp b/radio/src/io/frsky_firmware_update.cpp index 2d9a62d5e..eb1ab0df4 100644 --- a/radio/src/io/frsky_firmware_update.cpp +++ b/radio/src/io/frsky_firmware_update.cpp @@ -160,7 +160,7 @@ const uint8_t * FrskyDeviceFirmwareUpdate::readFullDuplexFrame(ModuleFifo & fifo const uint8_t * FrskyDeviceFirmwareUpdate::readHalfDuplexFrame(uint32_t timeout) { - for (int i=timeout; i>=0; i--) { + for (int i = timeout; i >= 0; i--) { uint8_t byte ; while (telemetryGetByte(&byte)) { if (pushFrskyTelemetryData(byte)) { diff --git a/radio/src/targets/simu/opentxsimulator.cpp b/radio/src/targets/simu/opentxsimulator.cpp index edc435c12..f7e4f80e9 100644 --- a/radio/src/targets/simu/opentxsimulator.cpp +++ b/radio/src/targets/simu/opentxsimulator.cpp @@ -613,10 +613,8 @@ class OpenTxSimulatorFactory: public SimulatorFactory return Board::BOARD_TARANIS_X9LITES; #elif defined(PCBX9LITE) return Board::BOARD_TARANIS_X9LITE; -#elif defined(PCBTARANIS) - return Board::BOARD_TARANIS_X9D; #else - return Board::BOARD_9X_M64; + return Board::BOARD_TARANIS_X9D; #endif } }; From 02b61fff24a99add17feb4a9fccc96606f7c3717 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 22 Jun 2020 18:37:39 +0200 Subject: [PATCH 476/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 5bb418852..92fd0a455 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1769,3 +1769,4 @@ Gary Wild Peter Sarcher Steve Schoonover Francisco Orcera Exposito +Alan Powell From 2d01916055a8654f1ae44e3d574464b3de0c77cb Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 22 Jun 2020 21:15:47 +0200 Subject: [PATCH 477/560] Preliminary T18 support (#7581) --- companion/src/CMakeLists.txt | 2 + companion/src/companion.qrc | 10 + companion/src/firmwares/boards.cpp | 6 + companion/src/firmwares/boards.h | 10 +- companion/src/firmwares/generalsettings.h | 1 + companion/src/firmwares/multiprotocols.cpp | 2 +- .../src/firmwares/opentx/opentxeeprom.cpp | 8 +- .../src/firmwares/opentx/opentxinterface.cpp | 11 +- companion/src/generaledit/generalsetup.cpp | 6 + companion/src/generaledit/generalsetup.ui | 790 +++++++++--------- .../src/images/simulator/JumperT18/bottom.png | Bin 0 -> 250 bytes .../src/images/simulator/JumperT18/left.png | Bin 0 -> 38029 bytes .../images/simulator/JumperT18/left_mdl.png | Bin 0 -> 37985 bytes .../images/simulator/JumperT18/left_page.png | Bin 0 -> 38006 bytes .../images/simulator/JumperT18/left_sys.png | Bin 0 -> 38021 bytes .../images/simulator/JumperT18/left_tele.png | Bin 0 -> 37972 bytes .../src/images/simulator/JumperT18/right.png | Bin 0 -> 36816 bytes .../images/simulator/JumperT18/right_ent.png | Bin 0 -> 36767 bytes .../images/simulator/JumperT18/right_rtn.png | Bin 0 -> 36822 bytes .../src/images/simulator/JumperT18/top.png | Bin 0 -> 439 bytes companion/src/simulation/CMakeLists.txt | 2 + companion/src/simulation/simulateduiwidget.h | 13 + .../simulation/simulateduiwidgetJumperT18.cpp | 69 ++ .../simulation/simulateduiwidgetJumperT18.ui | 197 +++++ .../src/simulation/simulatorstartupdialog.cpp | 2 +- companion/src/simulation/simulatorwidget.cpp | 3 + radio/sdcard/horus/THEMES/Darkblue/t18.bmp | Bin 0 -> 164938 bytes radio/sdcard/horus/THEMES/Default/t18.bmp | Bin 0 -> 164938 bytes radio/src/bitmaps/480x272/CMakeLists.txt | 3 + radio/src/datastructs.h | 5 + radio/src/gui/128x64/model_setup.cpp | 5 +- radio/src/gui/128x64/radio_diagkeys.cpp | 2 +- radio/src/gui/212x64/model_setup.cpp | 5 +- radio/src/gui/212x64/radio_diagkeys.cpp | 2 +- radio/src/gui/480x272/bitmapbuffer.h | 8 +- radio/src/gui/480x272/lcd.h | 2 +- radio/src/gui/480x272/model_setup.cpp | 5 +- radio/src/gui/480x272/radio_diagkeys.cpp | 2 +- radio/src/gui/480x272/radio_setup.cpp | 20 +- radio/src/gui/480x272/themes/darkblue.cpp | 2 + radio/src/gui/480x272/themes/default.cpp | 2 + radio/src/gui/gui_common.cpp | 3 +- radio/src/opentx.cpp | 4 + radio/src/opentx.h | 2 +- radio/src/pulses/modules_helpers.h | 4 + radio/src/sdcard.h | 2 + .../targets/common/arm/stm32/adc_driver.cpp | 2 + .../common/arm/stm32/bootloader/boot.cpp | 3 +- .../targets/common/arm/stm32/pwr_driver.cpp | 17 + .../arm/stm32/rotary_encoder_driver.cpp | 2 +- radio/src/targets/horus/CMakeLists.txt | 7 + radio/src/targets/horus/backlight_driver.cpp | 18 + radio/src/targets/horus/board.cpp | 1 + radio/src/targets/horus/board.h | 9 + radio/src/targets/horus/hal.h | 23 +- radio/src/targets/horus/lcd_driver.cpp | 33 +- radio/src/targets/sky9x/board.h | 1 + radio/src/targets/taranis/board.h | 1 + radio/src/targets/taranis/hal.h | 1 + radio/src/translations.cpp | 3 + radio/src/translations.h | 6 +- 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 | 4 +- radio/util/build-firmware.py | 5 + tools/build-companion-nightly.sh | 4 + tools/build-jumper.py | 6 + 76 files changed, 952 insertions(+), 426 deletions(-) create mode 100644 companion/src/images/simulator/JumperT18/bottom.png create mode 100755 companion/src/images/simulator/JumperT18/left.png create mode 100755 companion/src/images/simulator/JumperT18/left_mdl.png create mode 100755 companion/src/images/simulator/JumperT18/left_page.png create mode 100755 companion/src/images/simulator/JumperT18/left_sys.png create mode 100755 companion/src/images/simulator/JumperT18/left_tele.png create mode 100644 companion/src/images/simulator/JumperT18/right.png create mode 100644 companion/src/images/simulator/JumperT18/right_ent.png create mode 100644 companion/src/images/simulator/JumperT18/right_rtn.png create mode 100644 companion/src/images/simulator/JumperT18/top.png create mode 100644 companion/src/simulation/simulateduiwidgetJumperT18.cpp create mode 100644 companion/src/simulation/simulateduiwidgetJumperT18.ui create mode 100755 radio/sdcard/horus/THEMES/Darkblue/t18.bmp create mode 100755 radio/sdcard/horus/THEMES/Default/t18.bmp diff --git a/companion/src/CMakeLists.txt b/companion/src/CMakeLists.txt index f33f430ad..3cf15d85f 100644 --- a/companion/src/CMakeLists.txt +++ b/companion/src/CMakeLists.txt @@ -351,6 +351,8 @@ elseif(PCB STREQUAL X10 AND PCBREV STREQUAL T16) set(FLAVOUR t16) elseif(PCB STREQUAL X10 AND PCBREV STREQUAL TX16S) set(FLAVOUR tx16s) +elseif(PCB STREQUAL X10 AND PCBREV STREQUAL T18) + set(FLAVOUR t18) else() string(TOLOWER ${PCB} FLAVOUR) endif() diff --git a/companion/src/companion.qrc b/companion/src/companion.qrc index ce172fbb7..cddc2fa3e 100644 --- a/companion/src/companion.qrc +++ b/companion/src/companion.qrc @@ -190,6 +190,16 @@ images/simulator/JumperT16/left_tele.png images/simulator/JumperT16/right_ent.png images/simulator/JumperT16/right_rtn.png + images/simulator/JumperT18/left.png + images/simulator/JumperT18/right.png + images/simulator/JumperT18/top.png + images/simulator/JumperT18/bottom.png + images/simulator/JumperT18/left_mdl.png + images/simulator/JumperT18/left_page.png + images/simulator/JumperT18/left_sys.png + images/simulator/JumperT18/left_tele.png + images/simulator/JumperT18/right_ent.png + images/simulator/JumperT18/right_rtn.png images/simulator/TX16S/left.png images/simulator/TX16S/right.png images/simulator/TX16S/top.png diff --git a/companion/src/firmwares/boards.cpp b/companion/src/firmwares/boards.cpp index a189e16c8..a39fe3369 100644 --- a/companion/src/firmwares/boards.cpp +++ b/companion/src/firmwares/boards.cpp @@ -81,6 +81,8 @@ uint32_t Boards::getFourCC(Type board) return 0x3D78746F; case BOARD_JUMPER_T16: return 0x3F78746F; + case BOARD_JUMPER_T18: + return 0x4078746F; case BOARD_RADIOMASTER_TX16S: return 0x3878746F; case BOARD_UNKNOWN: @@ -116,6 +118,7 @@ int Boards::getEEpromSize(Board::Type board) case BOARD_X10: case BOARD_X10_EXPRESS: case BOARD_JUMPER_T16: + case BOARD_JUMPER_T18: case BOARD_RADIOMASTER_TX16S: return 0; } @@ -147,6 +150,7 @@ int Boards::getFlashSize(Type board) case BOARD_X10: case BOARD_X10_EXPRESS: case BOARD_JUMPER_T16: + case BOARD_JUMPER_T18: case BOARD_RADIOMASTER_TX16S: return FSIZE_HORUS; case BOARD_UNKNOWN: @@ -507,6 +511,8 @@ QString Boards::getBoardName(Board::Type board) return "Horus X10/X10S Express"; case BOARD_JUMPER_T16: return "Jumper T16"; + case BOARD_JUMPER_T18: + return "Jumper T18"; case BOARD_RADIOMASTER_TX16S: return "Radiomaster TX16S"; default: diff --git a/companion/src/firmwares/boards.h b/companion/src/firmwares/boards.h index 937703eda..ed5ab9e25 100644 --- a/companion/src/firmwares/boards.h +++ b/companion/src/firmwares/boards.h @@ -51,9 +51,10 @@ namespace Board { BOARD_JUMPER_T12, BOARD_JUMPER_T16, BOARD_RADIOMASTER_TX16S, + BOARD_JUMPER_T18, }; - constexpr int BOARD_TYPE_MAX = BOARD_RADIOMASTER_TX16S ; + constexpr int BOARD_TYPE_MAX = BOARD_JUMPER_T18; enum PotType { @@ -207,6 +208,11 @@ inline bool IS_JUMPER_T16(Board::Type board) return board == Board::BOARD_JUMPER_T16; } +inline bool IS_JUMPER_T18(Board::Type board) +{ + return board == Board::BOARD_JUMPER_T18; +} + inline bool IS_RADIOMASTER_TX16S(Board::Type board) { return board == Board::BOARD_RADIOMASTER_TX16S; @@ -214,7 +220,7 @@ inline bool IS_RADIOMASTER_TX16S(Board::Type board) inline bool IS_FAMILY_T16(Board::Type board) { - return board == Board::BOARD_JUMPER_T16 || board == Board::BOARD_RADIOMASTER_TX16S; + return board == Board::BOARD_JUMPER_T16 || board == Board::BOARD_RADIOMASTER_TX16S || board == Board::BOARD_JUMPER_T18; } inline bool IS_TARANIS_XLITE(Board::Type board) diff --git a/companion/src/firmwares/generalsettings.h b/companion/src/firmwares/generalsettings.h index a111cac1e..cdb72d9c8 100644 --- a/companion/src/firmwares/generalsettings.h +++ b/companion/src/firmwares/generalsettings.h @@ -142,6 +142,7 @@ class GeneralSettings { unsigned int countryCode; bool jitterFilter; bool rtcCheckDisable; + bool keysBacklight; unsigned int imperial; char ttsLanguage[2+1]; int beepVolume; diff --git a/companion/src/firmwares/multiprotocols.cpp b/companion/src/firmwares/multiprotocols.cpp index 737bd36ed..f6ab2ac12 100644 --- a/companion/src/firmwares/multiprotocols.cpp +++ b/companion/src/firmwares/multiprotocols.cpp @@ -26,8 +26,8 @@ #define STR_MULTI_SUBTYPE QT_TRANSLATE_NOOP("Multiprotocols", "Subtype") #define STR_MULTI_VIDFREQ QT_TRANSLATE_NOOP("Multiprotocols", "Video TX frequency") #define STR_MULTI_RFTUNE QT_TRANSLATE_NOOP("Multiprotocols", "CC2500 frequency fine tune") +#define STR_MULTI_RFPOWER QT_TRANSLATE_NOOP("Multiprotocols", "RF power") #define STR_MULTI_TELEMETRY QT_TRANSLATE_NOOP("Multiprotocols", "Telemetry") -#define STR_MULTI_RFPOWER QT_TRANSLATE_NOOP("Multiprotocols", "Radio output power") #define STR_MULTI_SERVOFREQ QT_TRANSLATE_NOOP("Multiprotocols", "Servo output frequency") #define STR_MULTI_OPTION QT_TRANSLATE_NOOP("Multiprotocols", "Option value") #define STR_MULTI_FIXEDID QT_TRANSLATE_NOOP("Multiprotocols", "Fixed ID value") diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index 8b0e8643d..b7e4d8644 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -2607,7 +2607,13 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type else internalField.Append(new SpareBitsField<2>(this)); internalField.Append(new BoolField<1>(this, generalData.rtcCheckDisable)); - internalField.Append(new SpareBitsField<2>(this)); + if (IS_JUMPER_T18(board)) { + internalField.Append(new BoolField<1>(this, generalData.keysBacklight)); + internalField.Append(new SpareBitsField<1>(this)); + } + else { + internalField.Append(new SpareBitsField<2>(this)); + } for (int i=0; i<4; i++) { internalField.Append(new SignedField<16>(this, generalData.trainer.calib[i])); diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index f329d98bb..ea13bdb18 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -62,6 +62,8 @@ const char * OpenTxEepromInterface::getName() return "OpenTX for Jumper T12"; case BOARD_JUMPER_T16: return "OpenTX for Jumper T16"; + case BOARD_JUMPER_T18: + return "OpenTX for Jumper T18"; case BOARD_RADIOMASTER_TX16S: return "OpenTX for Radiomaster TX16S"; case BOARD_TARANIS_X9D: @@ -738,7 +740,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); + return id.contains("internalmulti") || IS_RADIOMASTER_TX16S(board) || IS_JUMPER_T18(board); default: return false; } @@ -1276,6 +1278,13 @@ void registerOpenTxFirmwares() firmware->addOptionsGroup({opt_bt, opt_internal_gps}); registerOpenTxFirmware(firmware); + /* Jumper T18 board */ + firmware = new OpenTxFirmware("opentx-t18", Firmware::tr("Jumper T18"), BOARD_JUMPER_T18); + addOpenTxFrskyOptions(firmware); + firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module")); + registerOpenTxFirmware(firmware); + addOpenTxRfOptions(firmware, FLEX); + /* 9XR-Pro */ firmware = new OpenTxFirmware("opentx-9xrpro", Firmware::tr("Turnigy 9XR-PRO"), BOARD_9XRPRO); addOpenTxArm9xOptions(firmware, false); diff --git a/companion/src/generaledit/generalsetup.cpp b/companion/src/generaledit/generalsetup.cpp index 773e66734..16ef5b271 100644 --- a/companion/src/generaledit/generalsetup.cpp +++ b/companion/src/generaledit/generalsetup.cpp @@ -197,6 +197,12 @@ ui(new Ui::GeneralSetup) ui->label_OFFBright->hide(); } + if (!IS_JUMPER_T18(firmware->getBoard())) { + ui->keysBl_ChkB->hide(); + ui->keysBl_ChkB->setDisabled(true); + ui->label_KeysBl->hide(); + } + if (!firmware->getCapability(SoundMod)) { ui->soundModeCB->setDisabled(true); ui->label_soundMode->hide(); diff --git a/companion/src/generaledit/generalsetup.ui b/companion/src/generaledit/generalsetup.ui index 98f9e76dd..7353b9c4b 100644 --- a/companion/src/generaledit/generalsetup.ui +++ b/companion/src/generaledit/generalsetup.ui @@ -554,348 +554,13 @@
- - - - - 0 - 0 - - - - 23 - - - - - - - RotEnc Navigation - - - - - - - - - - - - - - - 0 - 0 - - - - Stick reverse - - - - - - - - - - - - - This is the switch selectrion for turning on the backlight (if installed). - - - - - -1 - - - - - - - Backlight flash on alarm - - - - - - - Backlight Auto OFF after - - - - - - - Backlight Switch - - - - - - - ms - - - 200 - - - 1000 - - - 10 - - - 500 - - - - - - Voice Language - - - - - - - Hz - - - 300 - - - 1100 - - - 10 - - - 700 - - - - - - - - - 1 - - - - - - - 2 - - - - - - - 3 - - - - - - - 4 - - - - - - - - - Vario repeat at zero - - - - - - - Vario pitch at zero - - - - - - - FAI Mode - - - - - - - Backlight OFF Brightness - - - - - - - 100 - - - - - - - - 0 - 0 - - - - - - - - - - If this value is not 0, any keypress will turn on the backlight and turn it off after the specified number of seconds. - - - sec - - - 600 - - - 5 - - - - - - - - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">LCD Screen Contrast</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Values can be 20-45</span></p></body></html> - - - 1 - - - 20 - - - 1 - - - - - - - Hz - - - 1300 - - - 2900 - - - 10 - - - 1700 - - - - Timeshift from UTC - - - - 5 - - - 100 - - - - - - - - America - - - - - Japan - - - - - Europe - - - - - - - - If you enable FAI, only RSSI and RxBt sensors will keep working. This function cannot be disabled by the radio. - - - - - - - - - - - Beeper - - - - - Speaker - - - - - BeeperVoice - - - - - SpeakerVoice - - - - - - - - Backlight Brightness - - - @@ -992,24 +657,288 @@ p, li { white-space: pre-wrap; } - - + + + + + - Backlight color + Sound Mode - - + + - Vario pitch at max + - - + + + + + + 1 + + + + + + + 2 + + + + + + + 3 + + + + + + + 4 + + + + + + + + + + + + + + + This is the switch selectrion for turning on the backlight (if installed). + + + + + -1 + + + + + + + Hz + + + 300 + + + 1100 + + + 10 + + + 700 + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + ms + + + 200 + + + 1000 + + + 10 + + + 500 + + + + + + + + 0 + 0 + + - Speaker Pitch (spkr only) + Stick reverse + + + + + + + nnnnnnNN + + + 8 + + + + + + + + Beeper + + + + + Speaker + + + + + BeeperVoice + + + + + SpeakerVoice + + + + + + + + Backlight OFF Brightness + + + + + + + + 0 + 0 + + + + 23 + + + + + + + RotEnc Navigation + + + + + + + 5 + + + 100 + + + + + + + Backlight Switch + + + + + + + + America + + + + + Japan + + + + + Europe + + + + + + + + Vario pitch at zero + + + + + + + If you enable FAI, only RSSI and RxBt sensors will keep working. This function cannot be disabled by the radio. + + + + + + + + + + Backlight Auto OFF after + + + + + + + Hz + + + 1300 + + + 2900 + + + 10 + + + 1700 + + + + + + + 100 + + + + + + + FAI Mode @@ -1044,31 +973,56 @@ p, li { white-space: pre-wrap; } - + + + + Backlight color + + + + + + + Owner Registration ID + + + + + + + + 0 + 0 + + + + + + + + + + If this value is not 0, any keypress will turn on the backlight and turn it off after the specified number of seconds. + + + sec + + + 600 + + + 5 + + + + Country Code - - - - - - - Sound Mode - - - - - - - Speaker Volume - - - - + @@ -1098,36 +1052,96 @@ p, li { white-space: pre-wrap; } - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - + + - Owner Registration ID + Backlight Brightness - - - - nnnnnnNN + + + + Vario repeat at zero - - 8 + + + + + + Voice Language + + + + + + + Backlight flash on alarm + + + + + + + Vario pitch at max + + + + + + + + + + Speaker Pitch (spkr only) + + + + + + + Speaker Volume + + + + + + + + + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">LCD Screen Contrast</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Values can be 20-45</span></p></body></html> + + + 1 + + + 20 + + + 1 + + + + + + + Keys Backlight + + + + + + + diff --git a/companion/src/images/simulator/JumperT18/bottom.png b/companion/src/images/simulator/JumperT18/bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..8f0d29f7e4c93a2b813c766f31b5ce2b2cda5d22 GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0y~yV0-{%b8)Z%$()+rqdmmtT}V`<;yxP*J(3 zi(^Q|oVRy2@*Xzeadq@spuqfU&;LbjTuV=IIY#`*Yr1c{A@TLz`3wyIR)zC3G?)t| zFlZdIVLcB{>DqNWabOM8?tDnm{r-UW|2^CXQ literal 0 HcmV?d00001 diff --git a/companion/src/images/simulator/JumperT18/left.png b/companion/src/images/simulator/JumperT18/left.png new file mode 100755 index 0000000000000000000000000000000000000000..4683595ece3009762ca2824a00d2ed375fa48f0a GIT binary patch literal 38029 zcmXtA1yojD)1^TgNokR8kdp517Lb%q>FyFl5Tv_XKpN@p?(Xhx{=@sNUzZCP@!aR0 zJF{oco;`e5l$St3#7BgHfIyLw6jcTv10WzE-y^_*|LO2!a)J+VhB6YO5HGKPGn(>a zz-QjrNq%;KfIz~0{Rat=l!6C73GXN+CkDR>3kUz{)2%3T83Y6=gp{a|s_Xn?REtx}U9;Woq||I!&t@Ut~qrB>BibB^5AQx?XLUn@V;#Y(Hw z#tsfzu_n%bWv$qF|_(oS1(SaT81cXf%~(yyeB z?35}}YetiUcU(GVHfzUKb#dX4JY=%w1zvdT!c8W+^Zc&S+R93^c}M-kpoJe=g3>C1Ylq`4bhDm6f|UCgAPkgx6G78i7*+*C!$&Sum`S^s>!VESIG; z>M|U2c5x}4vY6Z2$^~Bwar#oKp3Zv$4i0=ZQMOyXIM#`q2wb0oIMTXaCm41Z+%ft0 zE&ERcCY5pIQnS1`;UniagM;?0Cns0)p2gXT$$oyHLGl|BfSi#neQdF}`%pY}UT| z@0qJre0=;`>yCZ>>8Ivea3+Qo<=~S6ZKU)T(d29Iz`4W@7=weX(P1o|IRLMMk{ml^ z(oy;MnQ*zX@*|IcK<%BU_fGq+`yX|>e|2@`&i||{=je6Vn&X|oQvw$+S+dav7aueG z8s0_Lh-vw2V2i#UeB+b_His{6s(k($lU;HQc?F1+fvxdBfBv)|85`Zv6M%DheOi@s zRUizr$EXQ$IHFnx%*)h^Inqb0d5J@yxs!(u@9*cgFX~^CKV6$LroyJy zvSV#@`oL*c=ZSvWq*^PtnKOAPuQ}P}^-XEggP*$}{&zwASgFJK8p+-*B-1e`L*V=e zwn~%>XScWWrYzVGuG|eAuKf3Ia1mjP!F5yR!5P5Pb(mgKNxgmjM51iT%1H=xHtw%# z5Fl|ndV1i+WD~Q=rH&uFtT-&|br`LtySjov{^Z!OP+`(3Q)88=(ta*gM+yMNM`7?9CGcs_G6)sjhb8vmRr{Zx?S_@)z7Nkybaq;i)bu`OK zGd2(ibFREKcb;kPE__iSKrO11K%x*J!>vUf@Soj*E4<;16>B}*gQ_ggRi;@y2aogO zjyK_{oY@`^h;am2m=b)#&y&X3f)I9In=LZmF;Kb9keafEyHSqI6+^>LKkfX#*me0Rl zI`N)K<8?E%ZMup(IywSp1)dS^A`I>?zJe)>wU-+KcZ~imdoF#c=p0nkxacO@_<^`x z=m!#ZxrAPT1zYxWh(W@)T?1RJx6M=T)^iK+G&teYCpSm?`?R+*U-WUX2F}iUNEQSh zI|OFYyicJ4Xk2ghVS4POx*YCJyOw zH8`jesFyFLA{Cld;@JkTr!4SLDNuhj3Jj_zC;ML-g)wW1;^a^*2cR~m382&mGcAa zYasjv&jW!w)e@6_sPp^@c_VDp$UU-%0(DF(H}vK3Yxb2vaD@v=8HAT4w+ugnXFAsd!BD2UuKtGHzG!O5ndM0+L+Eg zPAchJiU12x2eIvk(--FEKHFi`p?gIs7h-w;dS;~$R)8GX z`pbZW^spL$W>v2yRgH5Q?GjeZouMM@BVIw3n6TM*yN)n8~*i>t@p%h`1{QOHcsvfD$5d;QY@;S=UL7v|{6o3nl@ulD}auOgQ0o$_Q2n%vey< z8NU{5RcT=b&`?(|^!Vs!W@fI}LP+M1kN$>{wBn58qq^tYA2{4u^9p?d0h_$HUcCQfxMya52Dg z0P_(k6%LSLfZD#egAkXaj8SYc7fWsFpSyjEMd zA9haUzbQu00t98_5kFE)|NzDD8t8nWSw4}FTZb>b0a&vmpSO#a^!g%nz@2gdX=Bz$*`JJZ?2-Z$Cz*zMK zDpms2;P|GYF-3x6nwt1PiE{SxvJPl#1%$vi$LkN`yqU>s0PgPg0`6Ym7=2!lJ4%a> zTx3{bhDO3)g~or|ii(EzicQs8PqDPV={OM^rdOlu`+x^Wh-YJkOQBIXC0w}^(JulD zGiQavN-B5J+wJ}33e%8NvUXu%;d-?#0A045+Nyuh9~t>d;qFgE4?wqQP|Xr$DNj!d zMC|67pKen@yzmR8kEj%6{{5l32%s9^$NQEooa4hoO~80G%5>*I(~@EO#JbI0a|)UT z@VH(1OH#F9pen(^0Y0q%c&m1Pwq}=r=$t=czKT`kWLB*O;w%edlF5S_l;P?HYmck_ z*u=!6le0`}{2Yz=*2pz3 zCXEZV!;TAi(ux=m>V@v^V6W$k^jea~Rrvov4rCX7`pC*Boffkz1+)%8YHVr=>U=@6 zEPBG)XqCo+YlB#<`KDbR6bHwq2N0Vh8KenfJk)@{3CjZ5^2F=J=30wY-$s>8P0np)roeNNMIt*091X}XP%n}lV zpxZJbvupuBDOC>`SpB=o(HA$l-r2v{vg;=q-T5;z@+d^$G1KYamxuHC7AufEfR+1% zsI>pH!zkp{`|>5%UEQ-rs92Z*mc^@mX#Far`kz2K_fv8wt8UAkvwEckLpv9O zWK&(B^j)8>iTuY|R_=yf4qvO1wUJRrO-+pzck1)FQk^|6C^;bPgVsT#gc2@`@$)U; zF&cF$tTh|{d$T{F6ab1da}Z?j&7Y1IL{b-$9`wsoyW`L_~z3__XHF6(n3SN9k7ggcX z0Sq=upc}XK+#qmvb2In3;Pf#9jqkF@2_I;jP?B*iA8$+2tvCo83JcaSnMQAzK}k7- z<4W62MWti>rBt>^78VB1A5PYpV~+s z{a(4;*w|R=GAbhNEsIi_Qd{u?Aw{OV zz{=PLQ{8VTWQGLD|KP3^*U(}~x}eBFPim73Rvr3%!3 zfrq&f;V*4QBsn#pV+Ii`!jaqOd#nM; zT$=?J!=M;(eVbS4MY?bS5d--CD-Bs~gMPTKZLwZ?I(9jd5V-$EL`*#Y@1)sM@2+3t zwKo8`;{WEE%~#6Dtllzl)RTHD&@vwlGJ<7jx~rKh&O%^WlH z0q47y{@mC6@^rEQkh;usi|$&&=ThQ&JK1*r>dNVom3CaSQ1w-uXjxIHHyg3^CF2A~ ze1FfKk^Ehqjvyi!Xfg*k4*SlFgzG}9GBQ{tVQ>Lvw9yc2XPLXUD zAOF03;g>(H_$h#V8AS{v90?MyudiJe=+jEo2fSZy0P%i0vR$x!?6%b`n~{ONM0`&- z-rGi{ANfAh6DSmhN@ALtngX@~U1`pr4!=?$nH-n?#vNoK$l_B&pa8vAEr^x<^|fr! z=anwmN^)=B~WM$a7elJFze-yaWMHLtv7htQA-GsPE5~;F z1G(t*Gf5+@${VC2d!FTpIG{p-Ts{jlaY-8wKB02Dew08-%OnJ(d^9cpOpY=BUms;% zrX8y5r}S)#h9K2pD-Iba6OW02kwMTl5=S0w4aC#PQ4LMd&{gVdQt_$!ih_`XJp69{ z-t5>L$V7nrI9lEv3Wu|68C*>=8{=VA7k6EzPx)f=``aYwGFm%ipKkqIV`sRTlP-DE z>yyOqyk8+HM-;O0D!^ z1bKY~`|yGO1GrMJs4K_Sizn0cDflCwmx%<|&JC~yv`2;72MoW)XVV3I(i-Udsa7j5 zQx%D+5U$DvQr<#YDBt6?1_lvE_Bh+wMU97@|Diq86a=>~k~vKpK9nS%@9gS|cW%73 zUu+Ag1<*J|u)yL?hJ zM;*u|fN;)^7u@(zcCacSQ-a>XDu~YzQ{i2P`!@t{K>98pX1?P2cdMiF%5WZCNq_M9 z$>}@pRQafi59`brCC6uL^_ zh8s;Y2DCd}*n?E`<~DN_tiEt8a%SmgmNt9rP!ZWbeVndzPEt)8u}UJhbFWmtFkPWT(yK%Mnl1Fv`DmC+5P21>zxL$;pRe-nMpu-3sMhN-KR8DAZJR*Vt z%8k>Wv%++;kzjLJo9jeDO+g8lW1F~lr#hWny-l>(oI7>??#^xh9q)@^fDZSpXJi<$ zz1H!!TK?Ee$cL}2^<$=>F?rP#L3j9my@yO+zG%u~cc(|A`;uf%P+0+{&@hW=e+FQR zapj!i*R_wEJwTn+EPi0Vx34G6c|#Q=B|V^w1_cj2)nKRnI1l8h$z zv)}rNn!XaCS70C7{l=3s{mP9gIr#g}TssS!JHps$O`1fMfItzutxVmcmyGr>*eR$u z?>HCmz9FBR8ychyXetKH9UMNg;T7WKgBOT1Rg}-yMO^jB-G{`yMJl$aJmrZA4-eN@ zZY+cOu|{$CqEBU|TT{-Qrqi=}Vj z>0jYR;*Uz2dNK%a^n>iN0V84qSpSX-rMbLQSf5NvjE1z!;xVTXFwKS~oBkGu_U|gE zP2L}V6A0aRXNJ8oFF1bx7ee=g(hx%s7-1NhS$RN6%3ZiO)eH;_sCqQ^u-z_q85)3E z@t#z@Q)%hlZ4Y?xiVZhx!g3G=*lieX{vHV_RgDvSFzd4G3#FHS2#l|E0O+J^ogVIl zA&?I8>RG(dCzaK0A}Yiv%yh9~Kn(>N42_PiAN5}xG80(KN4cIwdppDSdG}uQ!|f(7 zgC6(s#9 zFtj+kKvG<^xbwd+Kov3wQ`&5a|6Qb2nuDW>8zqd~ypS*Y_`>Yz7iz%wP$!JNNHgeX zY)5_RfE;+C2y^$gW^;zHcO6V zzd54C5ZfJf8UcKRQ3rp>tz@e=q7cFJM>T+S=OoE^rW%6T&A%ln>^`h-H>i1{Coc>9Elz4`0DSJztxMRsI0gyd*R4_)wMV|&V0GM3a# z9JIYdhRa09Hqy1U#9!A+!lz9a;%R3Pgi%Djwpi_amj`grvAoH31*(O zo_|5IN=iinp=#mCmt(nyEH5Iwf(L(acc<>?R>r1^7~zDh^|Ft($~C(oq_rsxT}E8w zPz1mX?ItikiO(YLqrerug9G=yA1Qd)OP6o?) zw7L-He^~|ZuNM{AzNmb%Q*?JmGB)QA~LMA+ zUDzv8LYf2nPHv3%Bocx;&gFsdiPF-1C2=;7Kz5lA%qcfF$+1c9{x}Z70ZH>Ds4qa; zCsV(2ZZHkdko}$0P^tq^<)H(l&FzWbQ5=tx&dg}AwW_kdgKiX;S3!5E=~?^{3jnJ?ZA# zmz3aRrs<4{DJqQn`~B*@DiuKC1%P9#%Wi_wg%`+k<5+SRCb1+rJrIY2av!`K@8E$Uzl4YO}j z)$yb#W921gRwbgSxRU|jlBSeY{OR5nJLVPr*^X*?z!#@+_}gp7e(T7vfTQl~ZN7N_{tji2oGr@k3n0aVC8s3uHcqE};5r-r2(cHh}1waeGquOsk8FTmb zcjgS-_!*}b^Lzi6%shsZ%}LSj6vxu)gFUs2ymu%a3X>_&ee%ZMad5>+Dk{l0##SS& z)6kMy+jLpamCe@~xZRkhRk4gFZCKs#=9fdP&1F!>dwYB4m!$g_aniZIKf0SWX26ii zhioHzQ`TBmt({f~X~L|J;}VBX7fg-<@-WA074jX!j)8u4_3(tn6ROhy{0r_)s8ovq zOfZ_|#Wd-bTf=C!Q+}miRc~lgNR0xEFBV1gm<{#0r=~UED}L5p)Mq-+^dp6jzU`2K zK4|lk&hW};juljKLlF8dZ(+*)2D-hvSHuANs{FwpV<^^%<#<9EPEd)p2rjNar@72h z5=mSuHJp9M4xye;*P$){o2Nk44QSJd~g+LHk$@+f7TGB`5}XD*l|cdy5@9vaEHo$7sUp44F? zs{rbRI|RXvw0dZZHwG}SvprO_+w5R8@c789DZGM`mw~MrM6z~x2A@{DaFmB1rxJB? zlsUGnQ1)vJjk`rc&Ah3O2C|N<`?>X2raLXj6buUdltjCfro`RaCMHyXe?{prIX;_L z`crby1hTMPF5(ZB{8I!n_>UYAIzwdjY+d*#5}(=jX+VS1#dA3=ill^C`!Fc#Aqp5K zg1yma9QF4&o9?MLT{7jp?goYgB|?9ONg{uJqdsqQOd2xbwDC_11=LB*25=S8k=D&;mjlyZOq~jJA3j5t zn^c-hMZ+ZOS99^(!G@A;U2sR}AXAQ8e4|nS)oD*Q)+mC#-@#tA*xLCF)-jHb}*!Xe$Uw%rzl;tzoBjZD4_NBo)`;DZ=1l5x^)#l zVRxHq!IcD@_07)8x)RR8fBRAldD6D*3>iC6pP$& zsdxH(U<6&j)-5W2RVn@9N4*qEs7I4-l&*^E!+_0QVzZcvXt<(P?Xwc` z+{IoF?T&kGHaq4>Mti=;*U1?lwm)MlrMa%G#48FI{)%Y$zqWnfxwbKK#4+VB{x~F5 zYxu$JSdE@rMYr-btBMl^Mos&(n&A^%4!Le*j#GS*Vh@u4FDl3Bt zsxcU-Iue;f_HA4N5r-W*CM$|_f)`#?14TWy1QL3|1+P%7^(H#5OKT5n(Qhwj>|gp= z;s{mT0EG|=?CydQqO?&6wpi4`84krz>!7+E-AY*@{1+)H;wY7OB-Rr%v&^{yrG{}i z(Y%e<4AivZ@})uvJ39y8v;X{5|5lRw1w+w>5}TLlBXR}yv0vn;&`uz=wi1I_^I zuU5SFP9Vof>&LiuuB?UD@^53T0DNWYh63d4n3TWzli!=7#Im#f!7g&_1Rjt;Lj z4IFukUa6rQ7#rt-je6m$<|-hX>rkHpYTswjgl$WRRq$@%|3XrexQbEz;^HdjzxPws_ z)Iu1stU}vHWv+4`n1q`JUM(4U#zg=bJmCCo#y6dR7du} z-aZ(`&mz|eY+-^Cs+PcBFvSp%G(wvrR{~sFK-lje9vOL^=DzCx(;m|pr#tKGp!@qn zL`axp=7TltdIMZ#KzK9|CHJE$e*)THZ|A5g>7O+dx}{MP!n}*FZB^I^B#v||K~qv! zxC&>IF03i+J!LiYqUbOh*YBQ^G>&i>%xA)#ELG#*@DlM`bQqzxhuIQMN78b?y7Dog zaXkX+GSd zjZ``AV|GxoTY?3B(5O4;Kg2(P2}b3`#RchEG2;)6@TBbGfw9l>f*YH=S`zw1b_&H) z{h&Wpo~+Vgl*1%n%H9%O=|TH>WrLbct z!Vd3BF3J@jzWHu~xk`HH;pBvE^Pw#~KMvali4~Y%09|ata%=Vg3c(bbP)+o}mj5*w zlo4oUF6j&{z!+PaB=IDSrky1qI$$HHs|q5A3(^UTVlJtaA?6N7#UL6*`k&V0#ieUn z{2+~UA(x;&ev|Hq_x(irJeWC*_&i_ukrY|VEQ&=2+Kx?xx4|aKQgUV^8#(zLaT$v6 z4sZn5nJd9^#p^3Nn5@6S(a~;h{PV$&erxXF;6Rc7{AgQrO*c*fR=(P9Q$-}=v~R4M zdb>FPp!ze%gA_kWH}%S(t)!p2E?u;oN(9}A=_*n2R1ugr0F&wKv}z<>pcV{lY@6>) zXhpK-WxhzVlky&+YSh=)n+LS5ViHNB;9cd)@lcnv5f!E|-CO)Qs$TO3 zUU|#MJ?n;26TLOZWlJ!-1@1#&dE#l5j^(2?+IQq$%L6maxr?2VQXml>AKUc5RI2MT zeVoq9w~TRJ6`3eYhAo6KP+;Kf(VCnUr1eSrc7%qOT=2tEk1dNY%{O8j|0)uzrS~7U zw0fF9qJFF6I7YiJlU57vwX$s6mw-huoR;{5fAEp&sbpWR%ai*s7YMYDM5EK(AizM7 zyz0zt+(I7)>CwasH%VB~kJ-kOcnHFl(X6PTa0i=*2d8l--?F|HWDySA=fP}54(XUA zC$M*H#pX~iJYNiy&V9RoA&Kd+7@#dqC&26^yC>$9)N60(KwDX>g`-J8>M|A97_Lv5 zi5^sAd}{?GR;o&yNn2v6z-#yIn}KcPnK<6IxI|phAYE87wyYT=dTk$!k;8~Q`@(sGgRkYU}`>mdo`DbM5_GZz;E7adEttZ*=>&>+JS)Nx5 z)xb(tqfX_^c8{rdaJl!-Iui;V3l<^;+86Ja5C4rrzG z0}w=TVDn;r4{T+eA%yL~Qao<551C%!oUJP!?U7s>+Y;^W!H1fihUw!e@mIdRoGvGA zt<$7ug780?YUB~Oc`wn^A2khB96NNZPhH#?1Gjz#&f0BLu1L(XmN3nlJ=_z*`6qcN zA=QdD6gbb#aHgo_M`1ZF-}AVD4G=V)HcK`)sO6c>Y8c|N%TxM88>{y&b|M8s?&x7+ zW1mn~A^W5A^hNctCwNuW+2#=HYj(hzeWIy7-#a^*!0FU6uueJLSRX(kgN6`mwWM$1J) z&=}ziC{R0XK;Xufm}~7txXn|4Vl+e~LfVy?K!lk(xEkflwRXAxZ0!1Q{rIr^sHs0v zbH2wL0xaa8TV^Wv7_LSlfrnB#;Qi=N3{SOHr2QA7SYR$S1GALZp&`cvG!u(^0$B)f zmVmY!n1;21J-sKAWF-+@qA0J87;3}&^v!YLsxo{?`5kk#Qqa_TG>J^fglFsnu5!_W zKf1bK<3GUtx9x7*%zcfy#ru#liu9?7lQ4AVGo;3nX%%Q#c=e76Lzh%1vOoEB+ zR=z?ngazmDP?9ZgezEi#s-m&CKd)pttek;cJwRv}ME3 zbj}L3o4;DrA!a5$ee2aC`pNHJ*sAD+OdVV8l0>M>ard2jB&}%SUxyp^8MCDQWbxSA z4DR4CoqJuVMT|SoA9RVY#!1>lDT&{-qql>CJXzFscbY+2*o?nMnBoUWk@JL&1&{ZO zV#wb_bOJn%vT0S<7aMafV-zjDiKwn#;Ff2ckB#m7YC|tlQmw;|$CsMwjQ}NUEM6I! zWLjMFcW2p+i@@hQ_dmF}1a8H;1lQmhb9K6GqB-slAEn;XY0$t4+y&ag*-x>+4C{MNitreMurO*EkdAdb689JrA$^z;V_|}F#dotu{X+^XcgvD z)S1{BuIq-Opa(s&EWS-0{ee-ce@BIhIP_h@F2Su*m$Wpn7re(gt%g_DeCDhb+905f z0G4<^>EPpl_LDUFq>&x#wQi!~g+7zY8i2`VEzj z_+-lZ4%h~Te6%nWGc2{%f;$W>)Zs#83vY;rfkmV6yU&f>nGBoQ7$PY_p1V8{j_qqb zg?_6_x*1X^Q@HIjgcqio&tOWXHNZbHda`3w|Ku8nP!3nOV40<#UHLulP_KhvQ+=9k zl|3{h2a356bK8@*K-ZdYR5UQc1H;|*wR1m(u%jAl+233+(!oZAeJ%N5hza~wG&I|w zp`gw7)D1T{jGqZ_UGGea4iLLIzaaHaFl_MlWjZsGipG=vR^b@d0kQP}%x|9Q@LGDBEi=~X)Ubr+NOSo2wg?W|>46OLe( zdlNDDxEI7RgMUAoQuvv9t$J{PPI;a}zvB2Gy(CK|)HYF%C&(cGCV7Dl%Q{ZDVvkJN?`0!9A6`~7gQ>2SHlp<)Jxy7%iywx?0m?0_D>9_j8h~RzOL88TxTy5)hpk4T)3+5i#kZi3pns1tDcYTY}c6u;< zhbfbav&JCsa(t0|%z;fF;F<8;6@QzZzc>WpOLn_Hx3=)YL-+RkcATj`CGs&$-QhJ44GCDJkWMKF_uG+N}f}_OPO%R@=-v!iEa>A7cPdY;U z)n@eS#Rs@&Qu(go$8Y1I3qzA{ey<4W=}8#IZ^fE!kgbLreYGB?yhaYK-!WFF-{F)% zBNz{V35*?Hpf`NA= zy1K1ZY63>`HM(WcwQV;~6&1TAU-b0g_f}@36pp@TUCI{aeUYk4yo>X&K{$gBbDYE? z9c(}QD*Is?{va>;kM+f^g$)P6V2eXB-`fJ_if&>=fnvO3E$MZR#kYR6EJ3zf=kavF zMF32oK+G?u(Fli^oEQ)gIiLZrPdy6ly^K+Li$dDbIl-Htk4l>|LNYSgH_i z@bt_as+KKKfe1NV16Cg91hvVOI$ucYJI~iKDPa1u@Fbr4uLcs80P)zWjtB~^8v=P1 zq`lN-i*@=biBUnF1^BAb+=K{q5;f=!OYZX@fNr9qq5@Ov>hPr&>}K8XPFh4pw^EC= zSedxXhA-NSjKC9LMR8Y@Xl(N)tzKss2)(0-r2R7}+u~-v+g`upi`qiQ0c^>8GKDD8 z#d+R%@}tedP^`Qf{GWSXZb`rv#ZmQ)E|MP^Wy->k_(8A-=AYVm+Zu&7r;h4^oRAN2 zCWVY~RHORmzdp8GZwBfW!oyn-S5u-X9GKE1wG~P_*4=^0RCQwMkT5QL^7O%#zi4D6 zw&Y$bgnN^2s4uorB+4DI;biU?mhOdB6$bvKI2@YQ^y`ZGFJp601d|fkW zcYG(?F#O}3Ty=?UO6;7VH2Emx=Mt5ZYdR%Nh*n5V!4(Yr_o1|NzVe)!e#fxy`7z2d z%gfZYqN5V9ruuWbdV2Z&{mU<_OcL2j1q7~#+P_4mB&VS>)Rfu1+##@3G7w#WX%j49 z^d2`qT`ycOv^*_b?~Y~jT)_qnHEBh(Of~Pc-WYT@^f?wtmB=2|#}%b*a3+eBj8-%C z7wTe<*8cqUb5B3>ybOQI4W{uS(hvNX3rb53IOM87yF> z2Vl#u0IdRLMKGiS&7V?l8|bJ&tDE6n)f8&+yHwh{o~B` z5Sfkg0dNdv*tbI2^Id^@K?vcwN-F~cZ|Uzc`d!E~BO&hbF7Eh!RjxcaP($NQ-U_DS zK~lvr>@ui#eS$ruF7`Oc4C#f>$M1D_Gc<$^902ZU($+-{l;H7N9Yzs97ItC8QB#iO zT*{tb`)*U3Hnr0Cp#21G@xQ$pOgZWZiGpBdv-7rS5^3q?5?Gug1@gKSSxOgW1++7F z#tahE!0I-q!t*eHj!DQW=&%gcuF=qOz6&0lKp%B2e1gC2l|q`$jg3{np2?#oOTmCi za%*Gjw3A8U!;BZ0gF+vGihk}!C{qpy9+|pgqBq?3Z?|fsKMg1kL~kUF*+DMfh9`{7mo3N$PAx4kXyhd zBl+*C^*MA^-a2B6=@RMKo0@PAku*yPvwR!*ofq2#3OKO5VGRwaEqo7x3mL6wM`Xs( z&PX0Tx#=iZLbMo^V6JS{2tA`QY>m8E9NZg%W3c9KVmZS~b0xMmGl=nR&?z`|f57W8#tS(QKM3+^w$6d7E0p;KN$Y>Ze)K~`zNqL=`VpQ)t=W0Y zNv{1VHh&}p1uQq7OzvlURgMdJI=9W%yCpZipS8+(3KXAX{r;2x?Khfuh4&khPUPZk zppy;=Hk{&a#SJZJ86NtXS%|OTN|z~p{isA1F*B2+r;;4?HbwB&-UB12*Zn z%?DZwLRNkA-^1ve)37%ml8sc1Mm-ci`#!+^yC3@Lbc@(F- zr{i#(>Q>)mMiXJ&=K+*~eXr-pr%ft>3W-SKxn$es#J}!!97KxS>4|XUrE5_v(M0FE z+&5$fm|!943RLzbt$^7dV0D%d&YsK3I^o?uq-8!w;Wp$V{7>6a1OgA8e^rKmAE+Q`)v~odnB(bOIWXhW}jLOG`_q z-um>Q1wfDJl{Bmp_P2{t(@UHhz6MT$zOAkxxjYqZhWMJFSQ1!Ja9sZW-6$8mxGl)b zkv> z#|?B=s4oBgRioWPAF#5v{@kRCHqJXA096h{iG^u0!LE`O?vjp}AQUE5w>BX8PVMQ9 zXgomvyo6nbu^;{dDUPX3nVbX;^6mwMlBMRSpN7;Q85BQ}5`9`_NJ*b@OlL*G5q(pY zk&p0w&m=&V)?Cel333AA*ew6G(J|x8(ai|rV8SjS*O@X1HMfGc8iU&1@|@L3*yEI? z>Y4rii@v&$f4Kg}0=;sH4ySVyjkiahUD_5TjixssE9(~(; z(@om%@>i_Q~vrOt#{W(#K{zm&=UXc|HY^3YcgS8OgJxNVT2|RWj>6^^@ zjmuka%bdhoAM>!ycEK!q4TKUv?3A@oy>+wY9ma&Tq*oQ=P`^Pr5UZ*y(j1H~Hu)!> z(0nBypU7AEZ)d>kTPmWd zLhp<;zuAE;Rx?DyRV}N-DEVi#RmSOs_RJ~B8mU7eq1@9k{4EFCD`V{1{MMYJBNn|b zmyaog!G8>~CJ`az*o>7C*sVW6|GyU?`B@>1Q}4DN_jSP+EYGMctgN6}+zGB>jdN-K z_NUpOw5ZNNzUU^f1xvZ|dxDl@lK+~)G$LxEzV_&8+C9@%BspcqMKKJpYP9iC7Mt(W zF1zj@#4iv&s;Ar#fx%)}irEM>+K4|GYT2FlF&hf6_OBcN$#rIRixQz~y%oyyzDMem zOP$JD6tRI`$5ADGHR?}*)eirLL(q=yo04zaXT(+YYI?4G@ojJ-d$5vd=<~ZPziOaJnG>`~`W{ z5}`aaqL{fr`k~SfY|~1f_UzgYT6F*DHsMy01X3eX$p^)e*9FZODh1{KOJb5x44rQR zKZvtpBjql+^j!Nc;7RhC}G%pX;`t z;@Rk?6u`P8yK6RQH4UuzB@=s^(F1dbH5&euxB_QCa5r&S{#CqgfpH;knXF(HopbY_ z&vXbX7Mf+MZvr2joe{UfMDn)qdlGt`76D16mCGCR68{`#MwtTwMEkZ<->9N>?GpGl z`ZJ`H(naX%;S#zjakfemzmq8aYpA#F^7gb3kHuyOR&(sE$CmIiEcBbvAYwt9Q5 zYA$-zvspNcU7HZ{^{mQ59J=i1SWpJOElXu+v>vra#dWVo@BqqRW|@j0?MxNajWK zfx8Fm!|m^91hp}AMkVRf^3J3zjXs2$vj|h&MrmKHL31$Z`dxh#G65!$>FH?{qnm3n zH*_M$uw4qO31~^~pP`Q9D=-LYMLcdF`WvK`nr&>%`}VJb8R9unIG5YMK}KDKFbT#9 z+Z87N;18^sa`<$)^SYP;eig*SZg!+UDjU)IGbwFf>|kJ0gf3naIv6w&h9)eGJu4UW zayN2#2DidMQPns46E!F0<0G@p?bqq2ihbYvQ0ZHnpX`~w%Hh4Baa`cS{3{O(jljL6 z{-lhhqC`^ePbKpM4Ir_Ax0P+nQ%w`_t^3h-uZ^O-i23XqYS6<^AfJc`eH?1VvQVGt zbZC7vypKr#@+TqSx@J{NWl8(UnTJ%(UHA=eqaAy#cF?ErF2gXfjuKe*u11I@1>L^M zfvxk;^dYFTg5`+f&cF;qrI40mlN;uD&?qf1;wMvHTWfmKbd%>k`=a! z!<&=8FMJ}7geJ?gt9+54vQ_8Am~fkJmcvm=lmvERu=kWPuJTP~J}E0x67i$Ye8< zwXh7|3qd>4mXK7*`|JulZwSmUFYEex7m8X;jSUJ1#X64D9mhmOeNu|(5_A1On$9vT z%I@ppbV--eE!`H{oFS)v}s@a;Eo0$^i^rn!%n8FhW#R zRf`TNjA2OgSDeCcF)CfFdl*FV+*tYF@iGl=Hjt5#A%4ptM+xFQ^PW_r8}WLI-X}&! zy83s2{Oh{&xB4ECcKrQEAg6hg#w2foGbmR-5ENrx5%#C7 z4pZA*^lLaK#$B#DWY&05FEO4DkD)t!S7i%4bRpa@yX6d;;v@X00Gi=s;hv139 zTv1G2FZj#;_7KYb`9TeL>vVy`#7z_{WORWlw(n8Nc2vYXT=;h2Cq-bBv5`?|?emS~ z_dc(&oVb|j-#A9e8(G$%I4-p|l8JlGeGQ(J=GW zl$f`oL1Y-?@f>i2vGZwaVfPuc#(+_z!|K^C_TL27&WZkI7$@TXr65AwUTL$9hl>j~ zE1@0z2VigtA(0(v1{i&$Ul+$eYaU}r3{ZAiaUp+`%ponwv3_2mha%^T-ji7da1l>mQc zV4q@?ptR5Qe6;c%qnm(CH}@HBnh|uo4HNgEgm{E6;-agqYgAbltH9O+4v%M}EDROX z-?G^15h9b$APToVYXi)1DFADbSe~t z)Y(<)kPIqu-i}H@Q*9oR#cl#0>z*#V0K5Qs_+4r9PVAhrby3?CXQ0}O1BMB2>}67* z&yDa4KY#+dp(~vo5UNxPu+B^*ccXG?&n2rxuGX#!&CkwFqeY6fbH}u|^0Sxl+hp;N zatMg5!{!>A?;wQl!EEATNjcUo944Inxlb1$L;V-144z%Kq7T5Q1+WLs|Hir+CO#g$ z4?Hi^^z1;rjxqcAXTfS8Bi>f-u3)QyT%}_%!0PTtJ+C9InkgIEXs?8E+PD3?<>g8|*Whj`{5PD2mpco$cWdm}jUfR)YnY%3BRe5HKa`}oFdZ%R@2Bl+$5 zzYEWOCYrH|z)-k8KKi7CzIwgq+NX$c>u%_)j+x3w8LM;3$K5W^+N?K+#d*D=)X6Nb zHGzeNC3T6;lsR2F`!v;m*x#Ab5`OzabJeBw;n&)>Yl-cpOD$X@7r3YyaCOoX(V!Gp^sw-^DwzZ_GuQ}LsW_j*M7zbJ(Y2R5+uV(@Sq#XFT%_%$`x)BC!CGaOK&o^N^GbScOM zIodm7a9P3M!YXi+q9FAL2j}8!>8aaT28f5qY6hwSKu2Js zHgdN-!lvCFBFj1P$*ZOAaoxed5gQHjNz@3kU8~E_R~^;z(ltQ#xA{|_;!UyYSb=z^ zL@!wQyzqVhe#Y4MusMaY{p-%I1FE=amniC6Lb_lM^yJXVZ*W#+#&y5IO9Y~t*^mX@ zK^!^i*JvePBD=)&JJ_z%Ok|X3v&xR$jh{IRR-f!x3LXn{`94roXxTG~V$7otIWw&t zQdtez%I6xDq(F!!46q2C%KjC@RT^fBXBW_7sP?qf-)G5h1Kd@~Z}o{LSbc3* zWi)k#Fer@t;F*m|ou#(Ii~`)HsMu@!qB$v|A9kw*{B7}7-R~>nI(Kw;235QlZo2HY4lPK1M*{gi9T^`be+kfIWaQ*XyUXcT z4JwnN^MCJYg<+&nGYwQH<$fdQc7K{DHHzeIaMyiFq9`4+*<5N)*sp`cn|rcTGB05ZWMAR-5q!^GttG zx#xtbEbWD3T&_}M`i;6*##3b%8oLM;q@{iRX6p@d=P!Na#2e*vr6Yhru_NO2>(#OC z5H!R-{{Faz5PYZ7$<^M_keF%qcO^M4CSV%*-E3KF)GtUCH0wvcPr$O9pFjgb4<&&p zdtnKGK;bZ8bb;R)-*`Qm-eCl^2Ai9k`KT2u21+F*JY-U+db)pjk_7v|wXc)eT+TXw zpa1v`E91f=Tvdw8{8SulHMhRTCtF7;BQp_310vbM#>NKb)y6igTo>wDq&*}<#t19* zmox=hZ5QSUEs8V+K%WVwyRswg$ucr0?FI|ycm`|3V>I05%-+CO22p1GU_2@7qg!eq zNbX<%*x~2ofM@=;Tz71}(VfN|Ze5T|o;Ob&68I+6<^}*9G&``W=}wVJR9|$dkZ8kw z!4xdwr5t|oHrHUrt{LzR!a~b@|6W}1G+8sM!J4XZNngjzfmrx2>Cr09r7_v`lQU!lO_5@6ZVnflYrbYD7c58o{pa!AN|)>KVBPw zX@atduS03-_-6i}_x}F=)>{Gk>SQlF4B1#E_yx_aI)3SgNTvX3uH2kD_2o$oR}Q|| zq|8Ekc1$LNK-%hYrFPP)nV9Wc)B^q4Q+2UjEu{!yPXV*ir%sIPo1i*ljX52yw)B+W z!^4qaM6>{)5|;lRUp>L$z{vDo$`EPR0GnkqXpP?|lh2>wQ)C*SPD{}XPSzb-92DFG zZ!Ncf!}z@9Tj0H>dnmyX!$R67A6=$N>cb|tx};tPif?SohZv;}i6skC`@UELU(rJ= z-wfkaY)GJ*VBc?ZH_DHS)L9ooUFSmo;oL5E)Q75PAN#G;#eZooEZVD;CmB^i(WG|g z_nW~nuRm>ZDo-*oF`>B?g`dmn@*d1_Ix%W#OSH!3Js_AXq7SDjo<0b=*p9WZS@~FS zxC|`}NQ5gbiw$pZj6cSal#$f5WXh1XhWjJEPHg9UdH%H9HE-7(Ks=qR`r}JsqQ4hW zsK{99_s~shCIU{%Mxdv)k+7eV<~;RmCsW8J*M!+p_s+bRqhd0CTapYv5PWwbTQ+ou zL`0Y>RgN5j9y&3oE1l<21&w)MGz|HUR+E~3~ zsjaBIIbrAsiR}AKf46}K@jv9)!|i+DyNilvwuauzWn)K=qM6|r!A!^M{KRIC038YN zUe6E-LM?TL8V5UHQGqCOlp43QTy!UzxJ}$03OENZ2F^u_x*OFr{#WQMpU05G40`3y zSdRoXx?dRDo`%}dl1%_@%q-2ty%&)s{cUF8Uvaa4awU*Y63|JY9R>Xc(!3@BWIpp7 zo}2i05B={#$mQWm7QQPT#s;Lx?&{lmV%smia(VzGXy9;7Sn?T2mi6NOdaBkb8r^%e zckc1Hdx#J{DN#$Rgh^Y23bahGXDTdpa< z%jzp%#X+9{0d&B!gHgI38=XrNRru~t`Hd@3q+)LL znI~~IE_94QhyRY@CkndKJH$*hK|@3K7aya(|Aa!d^6x9e+oE#oiAGl_QGogLSeYil z`TqLwwoeyKdckku2w*+me`IwFPF=aUx#8+#r-XeTwwP{46@bsYQsWDw?hnR`h#540 z)=>%wbo!L;(l)W^LPiv{FMZ5l2}8Rfh~mGE22vC+!Y0>Hj=8kc&DG0&DOvs?3N#qc zqRw_yzSR=z1V0DpC)n88fu56Pn<=HISVMMcrb47hAFqIC^3d}cdI~N^K^$m)*j7F` zlbA@sCi2aflzoDNuQciY_P~If-kVhpsA%qNpx=h_xO@ zN=6p?;{q(-u~9bDY`y`omMM1h1~Ni(L*9o~@4?kiPmh$@l^^kR`=)I0w<68l`IfnB zqtXW_nCB(4tPHD5^o0*K6d}DIfF1kv)OAN`0Ahy}NCa&3R1|Z>-VTz?=JD@3d{W_D zg@4JFZ5HxLW)^2+p|78Kpx0#%+>l>(2o4)(Io&^Y0$|>MC zx55`SCD@q}iJ83;BpnCZkz*6MrMkdL#D8Pges*Yzw}dABFN1lEEPk|gJnf1-mc7%% zPMP!Ph;pl;7O{0K_TZ*4bjYVz9*eF_~g8sHeCYThu#|F_M@PaOLjEk#9D z93X2oiIX}7D~b{)1I`SQ98Cf-z`z$S^Y;9Kav5=;rysUtc5fZvc%R!Z>dHCGA*LNs zsR{Y4@Dvw#9HQv_-lNqd29lNJP+?Ai1Oq_UtZ{yXnu)e#?3+xV@q{LTt)R>zLlwUa zyp(1lWDHAK2bVdzD8?M-H8f_nTlOP`85vlPfNS#cEK-VTOkUq;QnLe?7(SDg%9Pt;jQN9S2r1x5|fr~DQp==%$oa@s~K4JN+Ko$l&a?}>U}oWFk8=||)g zrK3M{<>!>Qfpv%N{||vMBwz|_6lU*Axsf#Sg0kse0cZG#l@^~hY!Ij zxIToZ`D5kV*3q>PYU=`uO@`QbblmC_Md% zZfC9&N;5cYwBRR~P|#T(ng}-q7+M9a%)w`a)TG&ld&eSu_Zwl^%`yJR)_WI}IrZ$o z<9g$|X96*xusDE&7Dm=WKvZ;QN(u##e}dJ{t`68so^Tf82RBuJ+r(Q}-2%dD+LoKA zw@{ooiT!19k6~|o(2TuQ_@BATTuH;VMxCJ#Ey7#xe2$kv6!zKmt zn{{9z)HVF}Mleg$NCjMWK~Er#WCt)yJ;)Rx=w`mYLWUfU=zlcSU1*}GU+l7{m+tLI z#|>_h2xQLuu!8xLAjy?#Y|Z2gQPMI#)#E7derUTbHeR-Ja&zbwV101c_9myb#jzk< zqbd!=PZE1(me}T9+Y{x$E60~3B`(dyA^r~Ar-Ox1|4sHdEx-RfSV&m={8gp?>C1J>MX16?3U8ZZT*8N4^G5tFq2KMLcb=i8h(icO8nOg zb~43dy(wYWS64xHu~C83Wj&?#?-RfN-Bktl_~##A|Jl#EQWRc0FsXAurxijV7ha}t zML6wsriCV6o>1A>MXzlm)B-0AB!m*=Uck8FkPt_&HsuoXrb6rHD?cl_gz3yd&&*F@ z5+WN=8IfsA!6pdZk~8kgq$a1zrFc zMyt)uhcTqSm`tI7`%?IQc>L;Xtg~{yHkrf%Px$4G8iY6ug>dbt!R^d<1IF%!+BdUV z{v5grZ^0p|9PQDHrR8O%)RH^^_7r>ERShN&ajx!}2k=pGdGq(C!nO?xCI047b)4kL zoS{kn4Yh(zF=+^WVj|~DF9K{~ROItkN75By^er5fDSrUqHb0kWMDX?fBeu|_F5Y_# z{fNT4z}QIMw0au|N`)iCPx+S#FmVgPU#c{Qho%;Hz$|77Y&%;KL7(y;$QX1F0F5;P zR!iASHve*z|7Z_3Q5_czyjN>rW1=YM3d(y;R*vUdKy8+ku4F9V@$t1H=5fTh6wh|ePl0*GO%&_$zZxhRI`bWvM~#+)r@+x$bq2R zT^%fP13Jo;LD!|h)${EEv`ZglSLgZ1eY(fi>^g@19glwP=pv_)vnj6=q|e-l2g~I2 z!2Uf4UMJ)4UN{WCcMnVQGFH+syO#~gPA$I9n~}~K^KY=0SHY+nnCjO6lC_(#j`MM$o(=CB+79Td-&)IXW^KPs zu>X(8zaD&PwSj2qzAv^`=oy7jUhh(IwCls)Fy^=F`e|*oQT4HX=6hMahIKY6sw9Ff z_YcEn4f>#jNiNt(Z@Q^3-kCQhNfBM}rCntSk!6(Xly ztf6j*!t(TAd;HHk1R`1>4e32UhSL4^C^*TO-_4&$)6y-59SoMSE-eo$&#@E&V3VJy z>X_{$SA%}SE1^OD?{~1&0Q%lkbZ?A$K|QePx`TaP6d|Bi$-54nz~8>$rs0*-Vrnm} zCEuUVBD{~>6}guvv#apq%V(svWr-Cd6+{g`nE8J#fX4?x-ymGRd?M|s=mucFQeBwp z%=!kl3X*76uilNP;8Pljp!>kft?Zy{U!^$L7wkps&iJFcB!J}>0D&{=8B%aC3T%h+ zX$39J(?ObksMgJo%}dx{_rKumVc({(QI<6dDMRr3Q2a&Cfel$9Sf6Y_(y!DJuCr5O zTR{C?HIzMyt(Xm5Qvh{Sp!Nc!c=f;t#-Rab>7Pm{mc(jPO6-*AvE)){x8^}U*S+g*I_+uWwbpT3cV z6kv>iS1oQHq$}G@QB)p6@^tOj(q=^`h_c$)p_RFSoXDxJ#{N`RjL%jU6zFeK=?}oT zW%%BKSonQEEbZi}Y*+b;MxE^882Zj%+)~jA3k##a&og87e!w+Z1nNhyIj=z0)`DQZ zf_7dxW*Ew1X%LEvigs#p%-EHmG5Q7UguXS)S-fU!V6g7Cmtt`4t=eQ1$HzPFR@g14 zK7Q?lbgHL(<1@1VU{!Z{h7636A(28%#WA;E_eLY8LVg-(q=R4zz6J|Uibe};MS>s zmYsEz7l!#vz~ItV_l>fZ7+s)UcGqLO)7)dIQ=`?sxGs(^MwZaBZYKGO6?#3f_f}Mx zaFgHQX?Oos=TpejyIbVlVUb%1aUCt~#9U#6E>&PU7g>TR!;zP8=ajX0SwR1kC<;_; zRwij7o5{%=U@p093LI{CYrA_8ipUds*DAl~{9}uq2BfC+7Uf}nB;pFytDY3qTQkZ0 zyswL#ALZUuEO!4Cd= zQp_;V^o1RB0tVg38O}kot35 zQnu-eaRA?pv%R=paOmebx)}*smc@rW!{24{uzO4W9K@I!U1Ie`MVsA9*Me%q3(VA2 z2vn+nX9SghTlvT|$?T*nJ7QDqXv9(B^W}t9rGNjtT_OZV>bk&tmL>sDs=`C24J;JA ztn)8xIO6@&npfp8P5)Ew+X632&m+Td-ylq0>66!*ZqYra+<}V=!-Ko=TrOj$zUGMt zy{@dT>4lrkAb(f5z&hCFb}#Pkdf-sGyrpd*U&VU=>Xqxm!|i#uc2Jg_T3AL9yu_nX zAT^@*#lRPosAx(I7*yI)mkkMEE-`)f$l$|gEiiZd6MkQL6de00S5K#*pr{pv4GJzE zz-^m9vN1@>_#^wzE}#o7(Gw^PicE4SCno(>>P7WD6CRn{z4Qs({~g*cfvIKU2Ihdh z5vtIO5`v}6EkZ|?%YQ28PGsqD+r~zTY^`zhbBnqSu~92K6H7bk)PCrHPhu7PJ^ug! z;4{Gy+%iAHQxcoRc1-(jnLv6{8S7-k*B zLgDEj;KZ)3x1wyh)Xzrugv^omNbFF@WohAtL? zy*pr)r%4j1&rwMUTXVFs8zODSbWo7s#j8(C}rg9 z^*K5^(g$C`&7zML?^wAtBmrpqnTiaUwcvk0YNfo%MkpfI*$GsYlmBz>%`tf6o-+JB zMa-yE?%x!C)lPvmTZOmA8^3n~>Jh{r<;m0EW+}Zcpe}0&iE`y3#sG?HK%}ydrw~&? zjoXu9_LXn1xwNVhEq3F{&#|=^A&HGq1!Q>8N`-wDnznEzb3cL5z3adBe+wuveyG$4!%{)$C?{qT@*zq=!Vw#z8*1EO2MamC+H&?? z8B>(aafgjP`Z{C=ZToxBcnyRU{hy^nf*I{a1FYIZK1k**QPW(!4V5^5(SU8@{H+=u z9-dE3%o*GtuAVb6euQIv#G%HE#;*P1KY~u3h)7sg5oSh4&z|<|Ucg+Ri7dg7LuXeo zZ$;KyKqLwGJO?ajR(5uP)&?KqJ~UfKp0DQ4hw%z;Y!a6z9IV{s@hy)b3-1B8pOBEy zu%GseJ0#1*&22g?Je&+=Dn|Dyyk4PI`!ybxRPqm9vqUezXaJV8s}bfpfD38?n7(-T z*+q*Dun^%B60(<1y74Ra(cEVcvm~W|vAx8g6lW&H#Ec#CB~xz;f`^AE+E${|Sc^4f z>*KQo@S@MtWV#ws0y~&Omy@Z*X_mude9{`agw6(PpXa}Q5A#Gh_gjAxmq=hSf&YzG zC8iXH(hsE%TqL0nQs?m4a)Pd-Z(R_LyZl8;?g}MomV3}&;1Q+jD!4PGDzM$gyTxk1 zaYZ2#V}$G$%JSO(WDt`y(UaE2gn2W+w4`4;LY|6IdAUUb;Z97>Fe^Ien0VR_iY>?$ z=6+9uTWnkYizcf4phCN9TfQ<#!B0Sik!C-$diMxw)BD*fxqh9YMHePS^1@U-vA&@- z8JfbYLY>ImpjX&X@y{VeDUR@`&-NavY#O5ZR;1fC_ixh6rrCHyYqbn^^&b3GYqrln zt+m7AsN|^2Xq8pcU%L~N)71CDBO&M+7@TXce{1AQ#Bfa(7Pq(O>jj@;{AtDD)$D9a zw6n(N9}ye5vFOaw9XpwJk9F6K^H_Nl!Fa5<7X^ttNgR70B2m~{F~@jo_ab~8=x`Xwf-x=J$y?|!2R7>*GRb;2sXKs^M zqu1$n^mq0T4b>kW=D3R1XKUx|v@U`+Y2Qf_FD7ZCdLO_VGAJvLJ82tw&au&+67-}$ z4uJ}D6jK^qeWzMER5|v!ytH>%YAi>2(6?d#_Jf_H|0fHJJ^-3mR#txVgyYG}k|*%J zcb95{awaZOrA~+sbC`=>=@dsxw`f`;ysLFFg|{|SKar#Oz>==REnoq^GUoHd-y9bF z+sp^j`I()a@_Vx!TiLwarQf&X1Mx6PDDGTb-ed|;1*w;DLJA!(siQyR@-hwEJsF*% zK@Q=HohSZmh3s$M<~#IBa27+YB2;1!WvbisBc* z^l9{)CD%QtL0DAObD7S5IROPGq68X%7E(okCq933(~6e~y;kIB)FOY+AtfbcedMv+ z0xXbX`T7LFSmE=RYY%~usX{;q+o^2Eb?T78T8NW#{nhu?!|xPXnB5^7YP_f?Ln=vq zk%gbf7u{w zk{U=vwTp65ZDjS&*@fbzInDYy@~x~T$*FjNvj_Kyub)e?>BY#@Yuszm<{A}MiPKJ& z>c$_a;Q%V~#6SN6i&f#Gp>;>K>h^P*K_!O{3!w;6G{P&ot=?qub!7^F(x3va0-vF! zCWXH=r<(DYWP)(-C8~>7oZ2Zf1pm~NbF64>#mHsGfb;|-OnOa3!6v#IouIi19_3a- z0N>3XF23=JtFnXZ*}Y?vVVWO!a3K0e5_t@Z{x^!yYhg2#WQ zftz8z$r;9vD6zj>Mo?7L3CPVvcY1{B1eFY7LyTpvAVjazWFgdOcBkDqdmCH7t%<_l z@@&9TI6FJPn+%9K@~J!(7op%+iP6@>n`J^6=Pmic+`u@nHs7P?aRQz5bL&KvhfAcg z;~{2Tl^PA~wq(H7xWdu1fGGP6k<7}-9c!rx(^~Mf#eAENi0IjxdJ`!ypjuI0LNOIM zHYh_y6yv9oBUAVuB@Ty~v=eJR_d%Y%qHviU3j}59ff*;n`>#ZRyQHL6Z-Nuoh^WN_ z4^gb6KSH;by38e`o@(lYx|=FwMKvY-ceK~ASB4Bm>HvLP;PROsJogZ)43&fBnFe1P zV2-b?T~9~j32|_kaC39NG(0nFE01JiDgJ5q3FEdhGxKevW_)>i%)ox&5W=mFoQyjlR}O`>t^qM*nyF8o`$GX(UY z+}M?IO9TziDmPN<)>&ASU4dq)QQ*y+hQ#wO z%R&>ZL;qu%b^sHK%lwVUiOa@s-}dNP-FQ+YpogB0-rjFY#K;t-GZkmg72IP{ zU#G*Zr$@0WkTYY7^R!kUKqgV#)05JwQZS_3>dvVeHqf#YXqyw3or8meL3G|`95Y&G z_lTaJ-l-ay*2o19-W|v7Y`|7+dh>J>%g+g2-h7v35Dw}~ZwVz^l1> zs&y~5>T6-Kb&yH<6ZsH)i$sgea+1}t7pD=*pmyHK+7xZ#00>Ku_s*0RdL-T> z@+D+ithi>E<&?6 zhy|oC9pj6-88HRWn(cGNFEsjpy*e|u#3k4)V#-cdn>go5WsD;U55`gcS!l|*rni3J z*5&{vh5(YSd6&VoDTl8J;{;UHBaQN@+9o*gEkVo-Pn>aXj6I>d)hw5Io*e$rp+(8_ zKWO==!NHDwc(Y3|zy7?kqLGEgM9h&PV;lb_^Sn}bbbMpAetoxFk&{dBaKiW;AL8r# zYta-O_TLpCnzQ#*D&I8Y@_=dsfT8dlZPW)DKky0Ngl|wLTFMYiJGHO^e?Q}R{%Qsj zhLo*z5FXC(kV3C#nHoc}aA}cb)SU^=c#4J$L63NBX7M0ekV{KfSKcuBG;Ibhkvfio zZpTrp>g|IdF~#5mlw)-ifbL6lH+@7TNT~-Uq?rHU3d0NJf?ykR)1rvT*R6&WBerU` zQZ+I8^pGkoMQ~a;i0caJDKxlK;vCtu{QA6v+S^6r#-OPm*{Be2J|Mp0aT!I41O39_ z^9FAZjL^_7XR#|Kw?UAFJEzVhA{#!Micok*HL-kUQxqbeay~=kD@M2Ou_Y1ckGJH7 zO!tP3oEtbjiX}<$urj^1X3W(uox~&k10te!DOq7uNDJaOZy#U!Dxo+S_a2Pia%Tk1@<`BPa6@!8C#Q4IDYufUttLraY#Z*HmuU<`LY z9Y?8X*MjM=Gn(#XTHF$<$(Ub(A0jiaAhR}0w(XNJiztZ_TdW%k+p#Zzc>@dOkz*>I zc`@XlLdixSP5=#J=FL5LplZJq#=Jk{!9){KY+U>fGcDm#vJ7ed%uwC?t>T{yMQR)@GL-_Rh|%(l}is=O8xw3GUKZ7f}Vu{6mp|Dqkx5dgDdq&YUH;(805A)iHr zU$OpZ!kkwl|H=AlI-8@Pz_S_~Vyl z8z?D&jFg1PH(&oSC3^MBr6p$wIy*UWg6%F?iy52$y4bq!Hvzl6yIDG3-D?XQYzt*Z zW*1GS)a8`yFVWT7{Fv_u9T7Y3y&3d_nd53>4$|2ZEWUWBCQ3h!+lC7i%~R29Vhl!5 zyIX8ZZJwz0gT=r1n+!|qK2)|;g@27BlTlC{2M%|F?!cRBK{>$Ydss8OH$pDT$8i}e z-&ZT7LhXxV@5`wjd*vupbxxL2^;|g4Gl(^Ii71f>f0F0SQ5T!l4N>ni+^w${i1=QO zW*Ml5NMWmmMz@zt*hlA$x)=oF=XhnkM|ubE0$%XtB!RZJQ5dU8`RPDxG>g zXHUtr>uNHKDN(1(hl!I>O0fTVJ3Bd_KVKeij6hnTu($Hh%ZDkS4u4Y?F*qrGYAWdp zQyo~wT714>z7|N-tJM-X!I95u%C_k$XgfCE=s02Jp<-eFpOjnWPC$I)vpU$sR9S!5 zBr^kuK8o!=@nV_&z%Bvs?L5z%qS!LWA};^p0*QCAp#5beE_*l!gzh)5*uWVUCkdF?hEr@}#Yt|5g$mi?Pizl;43PM;f z^WxUC?LrWzV+>hwOyHUO$Z9@cnAR`o6*(=TWMyQWW-IKvyDHd&w$;ko`lE?_(0=kZ*T9vM1)e{QB6$>9)O}Tu*_H3 zh_hu6Gq^P()Rny&9R=AmSesU-2y*VtRb`Wo_(vw3&_8;t5%{KBBVEKT1G|iGHK5tX z9(g>Avvd6WMOm-E4i@!_Wd%ln^T3lYsS9lVA7?c8-%E#0iue3PuBA3HvN>PR!lGUeyDZ)8ar44c5)k>e^4yPJeD!0!}_r}(^|IVwec$y-^(;@r6C zZVTFtOD1@pjRL(LSlebPn%Wg7A(xUdj>mr~gE{AHwLV(X=X^~3PB1H5K3*UojBaSJ z_{egY0Fa_TZj!9k>ll0Y|67^=$=>Av#xGaEdpGU0-0BJ|zga6gr&@)5WIM1K&`+>D zHN1P;z?mgTA6OY4#^*VtjD1fD8y(~NmLB9-ZG#N0;@rR20bZsQrgxjd$;I$d|rr_|VP zfHqoe>3VeZy*ki~YK^SbXz@)W;yx(+K;h^r=%%0@>m=~nra)uA2@efVu8vTdAvIWB zQczgff#&x6_PD(t*}Lc((@bsJOpVe6z z85#J+noDJv-F*Y=n1%L#$DK(Ygenh7;se-d_f3C*hvlD{n&Pw|SvGb9ejh9_E zVCbTPQo@PH?MHi@-)G;h=ZMlR3_fRgGr8ZkMPVU_;JYu{NaT&FUWQ{N>+w^|f-CNk zTO}V0R%=yisY^NgXAI0O>X`uGT1 z7L>nJL#5kcw-5OZo4^A=qAwzI#@%{*Hy%x1$!1unygGvg-~|=MsfYt3ej`{%PUbW@Nxh?v-yp*j&_Lz)aQ6!)OefmXx?M=wn4{ziZhKoXLn%hQh zr54ofvR{9$ln4zCP;pLdwVlVU4!{*84oLWg{Z>XsMz|pU@PdI$#dh37DX!2DNh_ov zdcPwQ3|5hhr{;I_IzU3ogXb4aoQ2z>|V52z(IV8bfPZx-nvRGBZG$3l<} z!~gq3>rBxc!ZjZ%Z6d8a?z|i%RzZ^f_si%o;@BW{{hWFt!0B?P6*b6Cmaa`$L>|Lw z`WN1hXbQwwWigN@Ng`t6GbfH3_}mg>AyQ1FG}}jbU;4@me;=PcqW$yl;298GJp9%2 zyk59^@;qGPy@#++$KHyhPhEkWtWRTmCcm|~v~(t6q+(h8HxLt) z0Aumr)Yls<7xd!@W z4Gaw4p1iaKB;gy^m&S#y3&#Y=1+L(ibkVBpn7W)Cvis@Jo$l*h6XWCGh6X?pxlvuC zS2UEg=6Llf9nILR`eLk6EQW1j$( z?qIdUH$!ttkNrq`Y;Sj-d#5mg>m$M|tr3J$h{Yxhi@Kz(N?}Px+_CEiy!ECnOK!I( zsTg$(>t=%xHOZ72Z5}M`ew{^hUEV!}wh`K1jDk%CDWxj1&}a9i_cO#-N-&?06!DYMn_{lUbn9`1K5|b9dRW)*IrQ(jrARe_B#;U z3HB+xaf8&hujbVhN+(2Ok2e9}uCW^WCKoZ-tfjN_$dpHv0kIZv5gaTn`|Bd*GJAwx zbpE}&`^LY4%}k?F-(#a+kS3*-uN4!OscGpl#?%mI52O*i{Im8@Is^z7%Eb0_U3$s) z!;)-heSKXiVebnH_B#syn*xw9h?Nxrk!EX}Rv#C`8$jEX34D*P)f^LZ#F_2FQ?e=j zH7aTs+ofzqepi(#sJxoV2Os@wxpuM)Nwbx%kHt`SA6m z{5@o&+ISvY0gyx#kb6cQOig=0cwg73`NFSXjR5^p^6wXLeXz2!8kvAHOs8WSnLi2k zB+m~7vU*Ww7Oo74nf8@tZdM@@U48;qccOV5;y-_FC3|opup8{u@Q!RV-?BQr<&Y2C zC4P^>lQ+ZI0Oo;37cN2&!?&s;!_2c@hr#8y5iRxJQX{n)8ASJw$Df?n?pLohGA<_k zueg18OFlc;+3kIT1bGUQ85kKUFVbXYJl;-x0@2S~!`Sqpcy+k<4(Rz-tdX0HI_Tmr zxsptqugcyJnaT8EU;3LNX;RpwK#(}hS^?m`OhK;3=eK823k(NibuD^jWF%_%FikD4 z*3}7li7aIi~peQj+TY*R-&u8AMr-iYjY*P;vSX;9k$!Wqb8nXZ_(ERHV zKQ12#$bWKCj10A>xiDcUm0M4viySfpNfhs1->>>kCVG*5S#NyKc^nyuTH6g!x5Eku zrQISF{0^3Df!zZztjf)zl=^TkJ-=0Kj2fd&SFi3rG80Ds7u5{}tQ~&`&~vS69&QH3 zuDX6~P<6y31zB}pu&3K^b?xqm86tspQ!Bfbfw%l?fPP|m89WJ`5^S5PGTiNb_A>B0 zss^+jH4VQF4I-n$b|W>P9eaxj_o`H;T3=<)%7QPnAjhUf`YDvD^4DQ*?7TYtwU0=+ za?UgCAs$B2 z`mb}zG;_;gkmc3EzBn`#5m3h)p1t~4Z4)2IjlI@GCzcU_VgVo=KP`au_T%_;qRWv} zrt!$AI)SE|y5Q$2a+Gc*y#cf@J2@(}f`Wo>y(n#ADs;QpY|{7`r`d)N?CDd0qjOXw zfgc^*dY3ct%1~tg5|b_FbbsgxJT%EcsTzap(?fa{5Mk>{dG@(b4H9t`$Ug3IxosF( zxO(E*8}O!dfymJ3o{xl_{OkUF-LHd#>SS}A%Ss57f6LoX^d;7s^Y-_8jmAc=N^;&p zFb!y#f*I0!7-jUFz?Jl+;&z+|Ho=7oGcMv+2m?X-=N|Jj%rUJC6WFrBNC)aD8IW+c zcX@}Xr7!uku#g@b6VqB-@`uc?rM!Ld(36aaw~?EOLWLkQ>mi;%6Dmt%u3rG}iz77uRDFhMt-hMD2tM5QWDUBfMW^;4BLbf&ox zXcjh~SF%;(?xA^76#&|H)zPd(;lV0ZVbFIVLy2m2S?&ZL!99BAorI7h(^SzrwLtRM z(HSkjt-l;3d%!{ww1%m(UEDBYVJJP8W;KoEN91eibGD+AK8@N-e^d%BOC>7F)MVN$ zf(SA(Li}!hD?NXRbBg`s9q6JHd_a}Qr!GITS;RyfB6A9PM~ilEJVO@6K!*#ay*47z69J6`6$ zmD?&h*Mh6;RaEKT+hZxE< zAk^^4$jYv$ZuAC4LOJId=cE;qB7-QUm3ft+>ilyt*Oq?91nV2c{FAMf2ev;HJUFz- zUBLL8zE$H7cjhBVAJMzcCKTo6O`T?(jL6@sOt%7;H^WKPh|7-!E@3xR`n4U8pxEQk z_-LVHV6+AB6Y+8RFBz!sk*{6lkoTzOOAZI7=7$3id(6#1-0f$NvkE32*irJ;3-35QVhut=}t&##+n>u#>YI zQoOn95k=0wZXA--D_5>Ko)KYM?o+}k{{{y^8%s(IiQ3G{q-JBOForU(d4F;fotMTn1-p9nsx_O< z6d6||cmhL5!~g#NzV&)Nhc&aTh6vHy+uLrB6KxDtc8>+m(uyJ{X*QcSIXP)FGczeW z15Prti3|rbAE0ouHepDNcXxMfVPU~_Es08cUjx208Vw)yQ`lP@JKX7JtE%5+jhi-w4D1@wd=LdAG^yWPGZ zqZjGqyZe?%mt*q8LuPQ41<_qhf1lGAUu=csasA|ZB-@~)HIE9tPxi!Bvf6W zsI;PNE1jOoq6zZ8xm?b6cXxeoNJYuGRy5)!qZ8cyA?uZf$M(gHWiML08Hx==vm-Q9+){hK+@?D!mDf zaH`C&SBMISC}BmlpkhL&)7#9T@R0c%>b9fbNhhw=dz9y-(_4JUq*|@o+}xa%%VirI z8?zfXZrJkjveVBHexQt`ufPOzJmso8baHZHl}g1bmC6M%ifCh`)d52(oleJQW@fz7 zfsq9-P%~@QNY)_~l0b4IWe2G|AWY}WBAptR(xcHq8Fd0ig=TAO%XPR_PC(gPV`F1> z+V9)?`nqpaMS59Z%5Ip}h;~E}P)k}fv-S0Lk2YGBa7|Ih9v&W^(cWscnq9qm)qC;R zu3hsH`&O&v1E@@E>mSzplrKtxN&TxX_c24}OQNlyjGbPuXZ3pB39#fR@o#G)M!DDN zbQ}%TIHdtJUi%d17rl ztGEYisw%$Gs7ze~@Cb>nead!19x*`)er|5grFG}$=dD_;It0vpi2*v{G^)3A&+{eo z`MlN7zoaVC>*(9W#Dwc55vrAu!=UW7Yu8et8geWpr#j)3%Vjrgr>u>5KIO5to)vyK zGaJt3tS_Dxz`lSx(ME{hQ~wL)RK^JE=IXhebem!H0)}a#4DlEXr%Oy$mrGLP{XHAS@E~K-EPW}MoF!z^)M)ZL-Pa$fs%7v zgd9Yn?iik_=ZOk@uBhp#(^@Jw7{$NAKU8*@-y<1}>&i7bF)?A2laoIGsmyYXkV8X5 zPUSy2IkDvS?c4po{N*o$>+9xH4^owk5ZCSV5_2ek_9td}>R?8LUbQngpq9!IL%uY|;7Jv;N^`baECnqPa zW34_}Aews0j*pMMVF!acw#e1BZewG^i93oDkXV8ffEqGo6(_t%oY8$kLQ%WCF)}dE z0_c~#@x~j!d;0Y0|EbsOL)+Wir^RA%V03iU=I7^ac6QcQR#t3xch>=wXkVywD`x*- z*+gq(-N7K3OaXETtvMyFk%cK|LWtf+#mw&ZcRSzKKF zQ~~#mH{STq8#ivW2L=Xgb#--stg}=q+3nl6y?dsL?6EbingYt(SEw^WwA0hmRw|Xe zJc{qHEm|sxqobpg$(GJZUb%9`6=()URYl=hkVYn=IDJYKApzt1qRLX|8C8$xJJJl} zXSp`C+sQ*Hl}c7Bl`NObx#f^b|LEWj_=EB(qUC_h1nY`*r|Ywl?oRmODwk-ArDa`BXt^@BgKD>XA$dKM9e4Wtzbvj&7lw5T;n ziZ1Z{-qWW~Q$r|`&JHZTxw)Cb^VRA&S|`=(b^lCieGr>c^fWl>Tm$4+L{1(e6$urF z`eFc&D|wg(n?8f6S*a{EXbR3}_~8$K`0Ky_{qO&8V`Jk#s@1A(Y-~7j^yQadwwpI^ z+S1aJe|Xhlq^4zIK>M^`pcugT__%dC9S5QmZq@{o6W?mJ{M4(KA_K!@+*BR4nFhj7RJX9a7Q@H{_Mj5WvjjqGML_GvU;*_;g7HP)i m^Lgv_dbYK-<>qay*?$8haWQvy4V)(c0000(>q)WQ%yZpcPE|*K! zFvHyEo_o*Pd!Kzm73C!{(1_4rU|=vHQew*BUw;@FSPB#*@IP&Vx7^?#BtscVF_`C< zKUr;sao`nHJ1Na?FfizEU;e_vq@)pm7m*zxa^lFFh)Br1I6oQ$31MK!VIX3{sxFHo zZRXJ?UmUMGet)_jF&gDxaBzoNT0EJLQ}2La0=5uwA_b zRz{8PC9XV1>8>8Ss*g5$?lTo!1hLO5%7fPT7Xt3b_w93b<(4{(m(kBR(WPD;wymwL zT*Pl9`h9^z?gDP$KPsK6S+FuKof#To(&o+_`;Q@^2KXC=s3AIYd3&6=T6XBjf2>v%MX~=CV#*SKT&KcvNFSS;Y!s6yJ*vB z>EG3Jb_i1;$?KL zzRw)pvR7xq`v4w3L!%sdwd;#U=}f}?*5l^6YpHsv)A0(w`(A!xnR+RB+&ZwM-;^HC zqAcoDFoH#iBPF;}M-9g+h}pm;$ycscWiWa4611|{p%us+-eUTjclL(W{m##|I#7fn z?aZ{+ymo;p>G8zSnBBNm6U2JfrqQ4NoQ3E)`rf>8>FW3AIdiNT;yyhQxFE8xRTX|KD}ls zILt9CRnJOO0ioc5U%oYQIFLn`39sw=g9f9F-ij2+U+3rFEE|`)^!CxW0}Ve3+^oUh z4=Q*W+P2>ofF#oDeqFKL;l28Ax%G>srKLI@PItj+_yPX!RN3d%+r!$54elTt^2g7R zxu5^;$ZY1DF_1(LF5R3wJgnT^-LDSxo)qVt2yHtXVpL~N1XrNnuWQiQ@W|;i z6w%vL-W425aBRU9>fiV}e{$!_9|G=W&dgTvcF%$p7ar}}@U1Oa%9ZQ!5?gYF3A3{n z*va$rbA8;KXA2ULOJ*!M-A~qhJ@1!R8=O}?=X5!_}{Uw>x7LnnTP^s-n?Qobs^$9;_}f3k;8Qa%@bz1ty;!>gmE zuH}?ukh?(+>w=@{L%sD7=oK0@WjAg19RKC`IXz0e*kN%pvEv3h;z|=&4N}3a#|l^_ z$SLj*H`Q`9ag5kZpFy;tV5=o^4Zu zY!JVc2urr|{I!*x}M43KSS69Cpijb+y zocNNW?RY>QCmM-r#7dUk{(C(c5f{6UzSd$D0Mgg}Z|8O+GLIAA$IRz*@5AG#f5%qe zzD?1@K{~lI9F?E37*CW6uUjze(k*XAx$uvVK~-z0t~LM%<%;F`jO8l**kfRJZte)Y zZs04KtHiWLh0;42tNzVwhHbZCZ9Mi$GRayf`p;s@*10PvDG~W`U|-zYGPdlSzkA-8 z34p>=4XwL1G*HOks}{+|5@IA9jmvqu84zq}TyYz2zv*LHTzwc_o!{Ozz4=U5AL4E0 zeA3zynisjQuzUQ?)}lReIRE8%fYSg{=3-;VqxJpDb^8~V_M05fzi%^9kX5I2Fow##3QwfTe508Hr`JuYJL&qw(Ea%^aeegl98a8GFp*ZS~ zBvxlg5D}<=3C=M)I5@bv*i-r67yS3%e^;2#Czw|c=VRWR5;vJqm|mI3ZNF%o!oOcTy|cqKRU9$ANe9+lq^frl(D*lc;9*E-9t&Wtf1U~8f+5+HrV-i zrJluO9UTUBE;Hns;rDWiHV3`aai>bqm1Cs0pv=-B#_Cy|kn8#+43!f$*X zh$Djlv;fB(q$H-W9J{xFP$n3w{(+_HRwjlpVzn_R%D7+bf_m-wlEbX6th9yC1^z)E zGgk=4hAaf+_3z5aELbw{rV9_ZM^mqMC*Ciuu6EQkEm+MCZQ0YYxz)uvQXZAf9RTzI z3VlDt1%P<|U2ACX+O*28SP25^k<{>c>w?29@6ZY%}zBw7Wk`Ec`ips1eFk5%0x$2{OBrmzT|`=~T@^ z8F)+tzV(fMl;=vs81IpLO(r~0Q4eR!|I1eX1R~c0a=;6!nwU@;**ws~-rTYO1PWI} zVnqxX&R?-S}GD=glPV-UX27Ycmf>*X_>%I119KqHnLY%l!2Q zQ};8Ou<0Ah+kqzlOJOm8nbyu8Tw3wG(<)a-SJN%yK~_gsgxZ&+gZpDl_*5m)!VUll zfDxbsg38s6PZuCN!w5>!{=(i~F@OvI6|15p@McQ;`QFF!%(Ykiu+tgcbpAN=oJzdu zJ*ktIHw*t=Y#drSH##D+mo8e09Me=WVHPlUrzOLX5auth)g=SRC`DF0Q(0O0AC5Rc zkbbUzGqot0@xo0_!O{*-HwHkmf5#=JOnuHfeVmKOHOTpB+k*D&>CJ?ngD6_VMh6>4 zS919}AYmAO2h-TFK8`MPl6Bbi*&&2;&J#BVf+{^sy|CGzCBykk3GMbIDv2MEg`r2;RyQLWLmR8r~P)vIG;2 zn@v~iw$SMIBp)SxWco8hS>gYfr|?; zC`HE>j*YdoCV*ju3Ym+0d*)eRJl}mwzxWHFXym|#oj3GzJqm&;z_LL-2AwyjrJEbz zoZ%hH)5LYss~(JlTdQ754W~%vtO8)QC0FW8YG!9&T3Kl*FE9TddAgkD@-J@mztR~i zK2l@`-wxW0VnsUW^uc9>2rhkI2D!;oEZQ3*mmhKec({7>Sy85~YygB_SX@kLyZIY_ zwVi6a*m~S<*=Vy|W5wle^6jyGMsWER$j*QXtik<|&bK?mZ8GN|0r>#Xn4n9!LM$RDC{hpU*Q$pjmgmvunZs0FKIe2`RF^`8p;Jiy>~E%YiR zFeKz~V52&JY7d$w)T_V*%a|fALz&DF*{;ff=*CxwGOWUccQlpxRM&RB;(panY&$>9 z(qYBYcA-4KMRv_m>^Qh{{=(lt+8Qmw@oq0vFHKGk#ONx3&9UVm0;tS?c&%!UYw*YP zU#f&=?^O(J@fdLP=PSJ~839ANS{U=11%&BvFpgG(hnf!^IcDfv>vGg(*^QOIdN6>H z;oIk~RcILxS$v3aKYDt42ng~&D-&x2iULy7ycHKZm9nQMfOR%2Kg}!Ku2LR%B?W5$ zoqnzYka%f+zG~3;tUA|jiy8c$rG*95zDAoyVqG?I9_foF!7K+|Gmuh*zX9AQOJmfg z%MyQHyI@84(8>Qm7qOYEY?|T@c--SzVn-eKs>c-gR?nyN%*OiqdLfBfXw-2aM?AQy zn?Lg8hD_ILCu$kKs@4|?CM5&%i{vB9?N<<+B#$T*f_t%!9_aUYoB7;azhr&i$KquG zxbV|m<@2IN{bIt~o3Dl_W!TJq()xu{s2&*mjC&4?3<=UzK1o_-Id~^%fg*O%c~(g# z*3-A18;C~%T1psr}NpW%X}P)qi75)3Hr z(dC?86|6hnVHjM7~ zH99OZA2w;rwV8u)j$0z#NyOyxWE--!v3U~pl@^B5Xv*NOF)NM0;Y=(SW>19>J7*-o zS*8caEn9INMRKoHkv*)v6nI9i26{EnNz{~b;6HI?mm zC6AA*&uwid-RQG>4sS4XDI-CN0H+t!zX9#K9ZsPb5EbwvxE4b5`WkRTxKiuE1p_Iu zOLkJDnC3rjEPZrU8)_qqpINxFC?CP4`u+R26kI<{<5TZ~x1$C=Pg8NEx6o!!7tB9Q!3J&56vmPl} zu)_1mrL@-aqS-A5R2=9H{x1?85ar-JN?9<;miHXW7OeUWVVj;(?$k=v{zt8rjuvlk zUFQckuk;D>2AV#R8_E0ii;)*H)m&bvad3x!iYOe3BD7vjM2XG-zAKi^enV1H z67~qrc#@ooV>D!J8h=DaWnZmX`?dA+Q;LP#AQYg=(NQ^&Hc?=80j~ss#ag#~mkaw= zcARb1w&q{Pvx(Iwry?%F)*rRL}AtIsSBc(NbU1DCJ@tm>TK)HxI6* zGtxMmU3XOzJLk<{BM|=#6g~>*2jk|e+XBtP!O00oM9g-lzA>)YLm5}NvMs&}^77q= zmIrMu$Te}7mzVRV8{hY(rm4Fd)i6`O%QCv^jBWvjJs~D_#ER@Nfjwa>K;|SW0r_Pcz2@oV#!;A%4$A z$lu4#HJLDWEe@-?s|Wb?C+RE{Url%+mBD!8a##at2VA|Mei6bYr)v`&DG0#H0f z#`xiHmBo|Cyx$qmMP2OiJs<%uo^!Mh8nfXqAkgCchQ-|ZrYhI?eJEMJu==-^t=ma* zvTQ%dH2hu{sw-fq z1Ys++YRNupVnEm5@A~bnPjYdi>9rHi;&yTRBia6MDpWnUqf9`tT z>*J*RTjz3$rcfnSI0dVs$hZ-jYQ}ou)^-wmYhwcc9_H^Yy!0#`UO3>BqBPxY#m_q} z(4MxoHpb+jc2=xefaQSJ5SFfG8yesLbh6$vZ=fUqo0)$caK_Be5Zr*>hB!JvLU~-FE_7%{PSxb`>VSv=_KJDjKMb5 za$Qbro?6%mMbHcocN3%ml0|D@IS}nS(fsc}^f_gff9RjV(qOn?_~vvP)l2&pQ9Wd` zT1e3(^wD&4{hVdpj^=(aa`kH1& zf(KjIcCZ!c@|kq^Oh7ACXz}b{7u~8vbg6Oz5m_mCoMD|SX=CQ{U;Af1x1&-IYUS#p zBlcciq${wzgdYpy3jTBRLv?|&R-vSP^a;eBP#J-hH2}m79H}yF$qn@K3?M=QLI{D1 zsX1qd9gc8g53IoY-CuIdmsWgp#oS)7MCKd^BcC?E`nCyaSMmc=X$ufaxnEbTyH7M(k}>)DKEg@YED z^v6({o99~Q14Q^U+2)zoN0d_@4}0RCxuK>IO4wcTkNkhSN-*h>_hrdwNuCL zekO|dh|%WTS=ijZOPI}5WAg7q5;=`^8JAuD*Zr$QO2qS zIx0Yu^s0D&-_Aa8A@gubLhgho)*{hTT?x}KqT}M?vK)@h15#iV z8U5b-Azrh7G6y9HtvC5s<9~Y?*xGeV*6w!~=JTf+qywg%X>kd3W1aU_)+giflJFy- zYX#&gK$>4AYLJJO1%_yL5qVF3Y_v+FGO%7YMsYg-(_Xa!FN@inQUzi1743)M%Q;p+)YvS3T@ zRkqjjCjVv4K_pBo41Yq^i@N|nw7Ie@!1(KOM*c&}%)w>n;p=}rjo(V+$s$>IKXv(> z$u%HQ!iWO(20(7ZQR;U2kEx>|gnePgVLWf*T;7qCW|!#-(IvbNt4|5nQ?2mT#SG7x zlY29%ijFLi_2;!M23(8t?PITYOY?)HYo#%9n8}T->;>!a{R`783~2uqZAQk>x> zT|zB!4vQYr8pWzW#ATPY6V^eXK-D4lxB}dEM*jH>`YuI|b89j_{&&SdG?|`(Ed3-( zf-N8EQcp0Z5nZW*(kGOS(|OQ{c|+vPNvwP=!;GP=$fuV2z4&S6~*zt>-&#r9oy%8Z*yaQ zichzo3B6m*%}b`5;P{gp0w^l zxV^!S@`F28AvIZ4v_aB0h>9-=Nm4PnrIPbhvJy>I;!vDfQwpWgt@5+%Y#skHfuk;S zbhB$%O~4g7CxwQXJM8b@cWRc$jBrRD=7_dsiS^47G^bGPXO3Lf(1<7|VdvIaNe2Tr zHwZVerQY#4wJvilUO4)NB0(=G?T387^N0PCNB#p;#D>;ZVmpivX!MNI?yS>dHB}>R z`d4w$^c;cGg;Uv$Z_snTMynh9_V^aPMI}!pRzxl=rVLZSxOJAEA2L@I`#})$Wv(ZO zIT2??!#b`g;GLNF+BAcOHueO^P&aFY48F{0lpz{X`MoJ#J$V{0?yVF9in*|a3dh*} zdl>1VR?jG}n0k&%S*s~Tn&S-l!k6}4c(jK`izz%1^qcW$Fc}`3)8qw zb~z|xn-C(s=~h63Uml4u(nC)uHQO$d&se)3)hmZhsXc`l1(6?o!v)0qwB{Z)>D&H4WYJg z$|8-JDvL^aqaBkc{iST*;`ME7g+V+UEel~el3t~TU9t_#R zXJ5Crm4v@h+}SreckmBzyN4gR^6$)#woVY=vkVrp=ut6!C-k=7gP+4?=JI(~R;ce6z{s!y`?)6Qoh zU8Qk`{UFT*G?fiD(Ve)&WbH)kNh&5bi7>tQoDd@;t`)#99b+4 zr8YAl`mhj`Vc0heNgQ3F5CEn~4_e&yN9prE_$bWV{`wh(D1d1$kI|)#l_5@)ZK%9Y{11 zoE4c90rA!@<9w3a^1Ky+qc=IV@F_42mdh%h1G)f~f4rw|X?y*Qg-#b&h+lFv49CCZ z&sjgPBz%HBJ#q|nfsP64wjcGyvOb!Yui6dvZ&L3yuhwOoGJ{V@x4Je&M~@donqIl* z{3X%{eR8OsxF4^G`^ng5nf?G@2TBAbLsSXZ5IiXf2{0W<_jb7Q4CThxx_(U&E-F^_ z{ko4sDr{^-g8`#aE5$5V-G8s7OLQ3znm-#PZk9QLbb(8rraAnSfKnhdLp1T!Dd>M) z@-BxZ>c?DmQhlgGYUcIk3ylzs!7P|^;BB*edm)wvv^=eQ(2~l6bgW`p@6aXPr;&7s z24y|MLli&E!=GbCUbB zrxQL%UC+6st8YY#sbR&7Si6^EOB2$F44#{v2@ z9v}1T*FKdBhO~_A8ooqr1sR5ws>kaGZf&GFU-a#tm+v$;(NCv_q|{+vj6*o$!Zgqi zQJC7WIa0Sj<=-Rwht_FnOP5F)eu~*{mN!?>R07cZ>Jc(jXN(2XR?#n{?~2VXdlk$xACcI@*m=iJ=obdTu{)D^e6FdPlIxL>K%^V(Zx;C*x$#6pLGhV=0f>FX7 zRk!8-T>2yYy36#kxL`n;!*pDFD}jPMX9~rxP+grn*G~d`iJf|z`{uVrJrV5a9)jYF z2t1{vnt$fzkeE+@x&iMS7#PUDgXEQ=mn{pRL{wG?3!j>_!v@2>s_+f9@v4cujsZOe zCue6P&!qONO4zffCoijWcU|g_qaZ566$+kh`lzS){0u2WZoDMv>by3K8m3CFpfxBw zw8N{8(?!>2!JRUsK%sG58Y^KMxyjCSMn5r+chG7H=Mb&@asp`k%D&z7n2PSIq3Kz3;$UB1pO z&D;DobMm6ap^`TT_~bN@_hoc{0wn%B3P`cF|cB2CMm zb!=>oL{f*O{BPb5Cvl-q$*LzmM_7B+n~(*z$=_7YSirjL*WS&Cc&jturjG4o^Rv+F zx6jX$wXk5xuKuflqT6h)t*uF;rysKo@0`Pay)>-5s?726X&6(P6Mo>zw;a#h-cZVEh%luCfvqUV@rUcx6 zL!2kluOSRAloYH)k%xOzg&M5rf8+qeov|n6NC8@!VOzS^GzC9XqKvP#IA%fN+UWui zqd4;CdjkzN{eB$Q^49fCF5?Uk+WY1^= ziYV}05MV>rP^~%uvt|3pfg57UvmniVK^(m20r^(q*N+&kz?H?0#pe%gjgG~c!QE3< z!zzglqjw4QkfL`$!e%`c>it+ZSxuNs)B$CJ+y2dw3@iw}#xDFHFnNAX?FB@Z7cZG`2+e% zZ&JRq-V5++#J_zdv4nubqNJ`Gz?Am7QTneagFC*jOeRLJ3r5bXW7J|@jx-pRPgoXb zK0ONvpc4SF&C%v2mDEECx>0Y=_U^vD!;iP)JfB)-v0X5m3W1vsc$XyPhK>Jn2v72B zy}odLSc4v4!CZMLMFrAE@$&N4fOY}$$?wGJub3OBJpC${V#I&+1Ts5{v@A9~(#^PF zU&nTU-;pNahp+HqSO?EoIzN^(b<~pnOxxYllYbUdxFHsJyRInVjFxSAOGr$3|`h_SM1U@xVIbP%osEGbP+%sTjm!NVjS|oL{*7OB|u!Q>^ywsxfjk|kYYcQaT8m<%sar8doF%;$-=0g2Cm4jx-+?BOG z();$Oo%QWmOB6y){Fl$^@^pB&PTz9uScVJX3blC7inAqdHg~mf&S$1(hM3ZySTiw= z;#s!2dxaP)aR+mX`xAE9Pa=SA12jjN!YE(*Rl%5KFP;~CT^EWU6iP?=%y~pu8BW2a z+Io7R|MHyuIu9x0Zah##ps4FWX5zJx$u8V`1wafgc9n$aX5>!zPw2+g)jtsrwE;}< z>u=FTMnRAr&aYN_=DodH4-#gI%$aS&{OUN=Y+TgHL(xqRUD86%r(L#X_1a21-Z8Mb zhZh&q1yg&ty7@z-aUX$@XE(WY)WGj?Gyc-0w6z_05Ii0_Frlg6-D?fyJIUUg>qDnU zG*I}!O>I|1r_I309?}XtUn)vj0b>DDz7Sh8kO0bv1d-gq5I|X5o7-d_`52bixi* zymY=|rewdd=Atjl7 z;^C#!>JO6#%gF@ zk(VTcB`TKWWvu4{=Zzl3+?6msz%z9IfQ0VY=QtPnZwo_Vj>pWfbIhQzRke1C>zjR( zKwMOlezKb+>16p{y`LMvODRJeF6HWDQTk&r!5BUU#S{-Ft+JFZ{Waw)O`IfoRiNGV zzo*NGc<_FZ3QyY;(*iBqPu1V)Qc*yB(1pSLs2A?e8;mg~jry++K!k z;@LZty)s`mtVSUgj!`LlTOC10V48@l9oY!eQzx+&?)dYI*6zi^#cdVdPPGp}kuEIPbR$D|(PS%8nd>|4=hrqU^_rL>r^*iU@Gd?zdGrL> zP-=5h2F4VtfImy$aP1P)>~>ED{u$JYR86QqQLR?$$S)FA>L(p%7`{52Dpc_AyNt8C z@acB=TMIc8>Lo*{2)jsG=(_+s0!Oz&xy<3IHca+5j6fJ&$#&9%&ePZK(t|xj3$Zdh zOXX`kMnr^?|0+GyvWC zQ?-?!A9lsHKX4Mj9Z~sJqIn2EcI4P+j_tg(Re00op|Y4isU~`GKD~>SxY`_i3j_uA z(wP^FqXtcHOo@3_aAy;lhu>$4rs*yUCV>cJRfGDb&4D)u9C}+%f${q_`@p(rYwGO;}o z##u}tvo~P``1zP{M)KZE1Ml`WesSlxI(KVl&y4Ml8ITV#|k4rRFS ztXn-$?;jFD4floCV|&?u%GYWU9{rjnOjg3ttX8eL$nTpFki-08(0@ysA(`zi&kVmj zh*Za@UHF`=Y4#&97ub44ODU5Ot^?gAq(kd|jL7*LNFU?N7V^vFPkwwVe)ENr#cfNR z&l7{slQ20~DyoT!K2xEsiNaJr$97E;myy0+w=x*oIY%mGaO*7Z-_NZ|G&eg7m+)#C zIdGL@lWJu^+w<#u=ey^&T#+NjCF423n}#hMhBozz8n@<0rjp|*7oxG%HZ_) zJ=IZW3C-1YV<7p@m%ZXjRzBuW(_v0Ddiz|F`WN3kEC*KzPxdkm*pp0{Z~f?szn@Vh zNF{6*7cxPPWLqrZCHrg{HL!ApJ6D(=&-*7sJi7&B(0XqxGcu8DlHj{+M} z7eXfJ9`d}yQU-GmfU3Oo+MC5fDj0rOsQQ3jl@iVZFfD>cH|PX^q~8YBpCLEvyVfhC zwx7BPc(ldzpP(Epf|!4U=?e~!Z{7%k`HXCw#CZ8?!Yq&DqocqB*DUcJp;y780Pct1UYn9i`K!o8VjMj9L2>b~Ao_8Ga zI+br<(V8K2LflXnoeJNh-RLgUf!((v@Y7I~l(zx{94}@AU>^j|B7_NML0(jiI^Y2T z&@o9rOxR5F^i8v52tR0d-Pkfz44GYxg_`8jblq=fKEQE+hUxr@>ki4wHv9X-i;BXR zA`&7cW<4gPoOU*d{P(_C9hUN^HZu#8e-tB?j^ED`(P1DZNNqikGb!X#G8O@A=J9o9 z-L9oD5)JlllE{Kp31~-uFE~|XjR%%iU_63?9ucr-g5@|6(hsNH_l-nJya&!*V97dK zTO+5zebr_ITqn%7t3@U1$T1Epxy)?(n9mjPa`i@$JHSekEiHSE3!~AvgmJyMU_$gc zW~f#vuAkl@!Dl}g{NgWPzBoBK;XSmn`TL|YCWO6soq$O62Wjd;09Kl*8&YRz+XNcCc?x-o1v%NOyx*`7m+20|DQthld`ay z@ziyu8Bqm)fw3%useD?F@iJApJePXCR{iMc=*ddawi^y^5=@G2{P32QKkDn=v{Yw#*x|tVSpDv$)YVD9@(SyvPCK|!H3z)Hpob|VJUC%Sz)NbjRyvB zU_5i*Nq0U3{##UrhN*=Syno^)KF)2rnCRsl5OfTQthc5=QPqDmJ5`-C<0u6L7jXzB zY`=IefZfyCc@A*?O4&*^p(s&ER`FWwTnWv|)_3tXo4M^o7H442@$;A&QBFh{1GEVo z1v5mftpm7oWlo`UmR~Y6Sq@>ESM;>LSgDE%%yXcv37eX=37q^-vrk8>Pouz02US$; zIKU%Tsi4tLFnvIw;40_prz0BbuHDVZE+dYOEGJJ%L=pKNg4#g1u3>@vX`0VMjx=L- zOqs)91$)o#9E?{nvj3MH$ZUa!@toh}heX+#>pAv01BL8dy@;P{24@@P;>| ztd#nKF6@P+U9GquFL($vDtMj6z1TQ_PZj^xTfnw?xNjD(GY`)RPZ5^wSw?$n>5$)j zsL(q@7x|$~`q6^FOE}h4;g%FyQ7BtTb?TsOk#&f^^#kETsf!TWkSUj9k&|SH-q0aI)b#HExH--ot5D3=hH@s}&#r zy7bmxiRJ(6#@USASOKYmliix zJ(+J=McSZ`KCQ2L1rsHl;FuPYN9p;BuT~7D0h_z<9W^>U7Fy3g?UOMVrzd& z@oK9`b+w6A(62g!;G2~Dahm+tLQ(PR+kNZ1q;I?RCdK%d16J5>)jyHBxFy4!yhEx! zaLCB>iUb=obu!%02q=-}TJTPaVn z(-|!dlN5_@pWF$}!y73+3$xC+NurVLoZl+`2#SG6*>WV}FcU8A#3Y(wrcss)`_tq%;ZCrnKxw@H6o>6>}APW3;pHv#59q3444~)wl2R`4_4+y zWYy4%FU50=P11Vvl$AP@;vv9aZRJa!de z966z4TZXE2g?|9jZ{m&eOxH266PRhIWB=V&BOqIHSQ%&Q;X?0Ex4$=%G?o5l&tQ$@=O=-W%z+lvWNAiP1n# z)J|TII}bjN(bu47NAmtfZw6e#;4ONCQwi8|PRgY-aIdqC0&(@bD|1urfH~vD70qHq zlC`!|L+Y=}O}yf0J;RC-1DMm(=kvA5Ir(eujF6>kD2WOGHIQ~?H}eyUG}RTX@f%dB zrCl|IUWEsP^C{tiFlSvWlX|T_6`7G%i46xn_iC1e!#atx}hx=G9&EWif~m>BSNQ_zVGMmj_i1IvW4 z({D_osmQ)ielUrN!}`JOWeU)#Rk(`rLWtLLGo0Vo-fM5jA*uCB*sb8Z7I);(WA}aE zl|=tYKyFAZORpZLl1U+kEWDn|Y2 zmjs(2dz=g0ACp@2>iOv^H2Owi(2#Nt+6@W(hU3{rUg!WZoZaQ(s zCSo+zM}crp62HCDR8s2;Vt*t<7z%MePa5B)zGa5@I>+K)T(jJEX#cwE9H=rl3fm-) znR4kdmASc!{!bBX9A#GM*hfs#)W`YQN*~&V(2UzAk@GcSWCn5C=Dj>h>MJNwK089Q z=UqNq0ECiID{CV5SaRldEcrnmtOaD~crH@%qAg)RNIzC7G>;6=4vYxDEONYDy2R8E zx!C8EGNfG$3#A%_5a^HH54jg6*@Fmn6D}gcl
Kd0b;~o#hwy&C)Z5Z)2FvFDkW^ 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 C)6ud3 literal 0 HcmV?d00001 diff --git a/companion/src/images/simulator/JumperT18/left_page.png b/companion/src/images/simulator/JumperT18/left_page.png new file mode 100755 index 0000000000000000000000000000000000000000..5fbeafbdee6af1d7051d63e5ed8790ad30b75320 GIT binary patch literal 38006 zcmXtA1yEJr*QGm^MpC+^MOwNWd?F>?AcAyBi*$E)mq>TMAKi^~cgJ`5&wS%JIPdx1 zz4x4b_Fil4wFyyClEy?ML4$#T!IYJePy;{xVPIgXP>{gCbcJ8@fgeal^3oD8&o6&6 zTMA;pE2#D|pT5Dspuc|k3k#E+N(5d+c9K<;MBYF|LKdK@w8O50fuV$vl@QbTF+bd5 zQDLI}{ZeG){r$zEO-W7o5Tw`_f(XNq@yWf6G&g`_lB^oO?x`Dc4rw*Zila<7Y1+A`ELgyOI2f zqN)AwL)+)h&d#PmK|#Fa5jIsiv&NiNmu@ygo8#FG)t?(|Kh;6%&d3xlaOV_13&rB~yb){=SL@>hgJNrl$3fGM0p)Pr?}u z;4T8hJBp`@!CO{!5Z;Utn-;y4q<|6V_IbQqUa1Dtrxv}2HG6Y2GqW{_@P`yAge{?l zA+!`y1}W330dEu(6!4}%JI`~~7>7)22qdFSYCbK@&Q?n07`Et*{Qmvhnm1+6tp)2k z3ToPAc6@N413sr!VnR<(ACi%xRKS`svhd%3zriYj>pTDWVII~)ebv~g`=44-?B==a z!qQS5_^R#gZSWq^^1fx=-HlhmP+p!IBX|_>Af;25bJn~yr$4NRHaVMDHJD6P@jlVT zR5=OQsNx0m{4;T2eg1ElC1wCDQe}^kAy~MrbJv449Xu}dj7A+6Yp|q_jTkGMWm;up z<~rb$W9E3gXzcWHash;@OmWsGr`m&~foOd8SW z?Bzwy>p>TTI&<0x_KqMdAiVD@DF)J7o|G!y5f#{jDxF%jB4e=KZY}BGo0ckdcAW$k znU6D|?v9Q|FAJD4Qt^h!GXw0>fB*egI%hp^&5Mp4KC;;YcK&mj*0eQm*}~zxId^rB z5pH^jOVofdi@=8uHB*-O1U|@VN(E~a_Q^R6)pB`8;3D&f&ipMbEHl-WyH4|tjj3R1 z!8-Gjgm;=6!rnFh3xFkhNdpKyxVODO8FluqpGx;m%(uY~nvvnI&zU*E5Jo;4O} z400y@ij$*VSX`_Hx6`7>&Qea!@%W(2X13`#2ady~TZ@6oA1QAT`QSc4z}`K2&2qTm zxDw7;PiHF?dD$cU#j!lW=$r15Qn@(7@c%8-`DTJ*W%L0CHTxu5Dtg2;-Rg@@}(%I zjBIxt1QEVXp-O?ygVl9zB2!569=q{gRBl?Tzh3cPdD_%}>N#3!GTXnLAKa|Av9^9W zB}P@|NeXnP>$5bLZjbQyk`w!`&b;|v^-r!kW_Y^ zEbUrv^M&pYYOXrb*=NH^`AXG_Kv1LF`uX>hXfVZ{JU>Q||1_#1;?=>EtP1zfGcF75 z$(D5MdXiRrO;-($H3(K+Hp12)jk-uH4Uh^}PuI7%9?N%+tza2e*)I{##jD<2AFniI zJRX=`mFPbXPVd+K?}CHO6|+lCE;iu6paqD}a(g*EcDlywK8wtFjc?zCXOYT0D~_A# zUEfmJ%?4lwz1_cba|ZE$e}8{<)N~91%Pw-`FH)(k?>Pn50BTyJ!@-}XRJLS`T(T;X zp`I?6XDyuZxnc$+x>vl-dKJhHb&yZBt%6g!sZi6e4sflh&oh>FMldOOVW``g^M zdlnJl(MvB~?B6RoGmj_N;7oy|kd~S{+v0wGaM-X?Pw}`T?R>l}bbmL~X6tgah~0zkN=HWXYTIZs^coO1NQSS0`4kfYtLBog(c0h%qO~A|UI12C2rj z!774WsCw7Qjn>bkz=V?+RElYHZjfCA({>e^wm|64#n3AsP&}F5us>F+egTInDEMX7#4^6qV>kW?>UYaGEB{TaSubwUnMCx9)X&Qw2=aswo zmZ!UYtun2Tp~@V|8*p4nzwpC)B3nyJPD%Mwpn<>4IFod`2iWn@Op9WnY$66A0y5Ot z5?(Si2>Ur}g5lo{I7tdy>oa-8^t4li?c3G3O3KQI_bbn>OKl*EN1ks*uK2vq`RZF* zY$kTO4M;Pb)VwK}Pb>1Z_5*{CeK(DW>Ga)45h+&pz!{JPp=2G<3Dy)=EA!FLl`M z(?#FD_BzjW8FB;_TP=ZVvf1eE%mkQ&tPp1@Zd<{Famsd%xSJcQtTM< zhrfBy<^%Ctg)My34sQ2QUjHr{B>Po2uLQya_@QUaut+BnS>nFqCaSIT#{cD)sS2+t zshp^m=cjv6%*3SvpOGy}wMw%7%PyCAChc$2W&4aLna{6&cXBd{g@t8=D-vm&Ggj%= zVhbJ-Ex=Dw70=d>l*$cpnhYywdjIm317h|J*llbI;aUK@MuhK6ZES45h@A`X%RXi- z6J^9sdBnG0#CR39G+&I%zifp2%}Ew0GrFG^0j2`A8IM?Ken23~c^aS>ZW1jPf`2%7 zKLqR7?0+Es)~lG|eS`H8Qc&Pa`7=}>xY?b+>J-OrkLjeXi#12_x*UG>&0)=mURG1vJ-Fv+ya&iK**0};{NiiaHchL zFj9(iF)D3qX_BGUr--Je0Ns#_cv*YZRK8;vTlX$JV@()h&eK;EDw!(2y!W)?O^Jt^ z+E`gJucBt~NZoj|20sWMn>Fe}^3dcQPB^{x)RH z3C<%xZ9mynP?CzZ*%HvFYHDh@0L%cmRy^;&f@p))R+|6J^tI*xl$)L{B%d^PO~!`Ok{lYi-Bpj#Lm18fO1jnZenR zV^N((LHj3BI;{^OXN;I#!@kXHMHT>yYT;zHjwtSJQ6Y6eoCL`Bodm#^y&Tp0NZa}q zKDHZ{>D6=2Q`wZ$^GYQ*a}b#T%>eAY=IQs$urX{3s>d2-G!DZd8v*;CExaHJR?xfg z&^t=CE&#VdwaoG;g9)CVbD;00`gb}DKECwFp-cGTq)RmN*3-Xgzr4v-j9clHCwArP z+YQ%9iP*xnNg6=YtOV!)l>)3;rdIUx#*l*u;edYEy>c+K@2_FB%GwS%&maSoP3+Es z6b2vwrA0=GA8&F}9fb9TnSlJyl$I-K$yghTxITBKDb#==)Xde=E2k$W%^e+;A08b1wElIx)%`8QdKpq? z8Z$tng8CqIssQ*>wqAu9Ua<_-B?9Alf<`1!S52x@Ulnm+mtm&qw=RIKd3kvcZnrZU z^dI-MuR4$^W)Bw{SW}>SbGmI-m&$xyAQjs-kpA%jEGE?h(Uv4UkS9eE@Sl2zPjvzD zNZk5G8ZWfToEt3&Zpcrb7Uj9whuYMh1w8NUy4wplZ0krKlLy0A z;owF+0t^U3F6?#iO$e=lWR1Bjje6c#f?S?x#5SIxD?oZJ4`)MHDJu`XUbjQ~^I`0* z=IqTU;m)u3)2LR~<>4E=EAhZzAyA>>XQc?hBM?P$}9msBM3I0Q?m8-l1@ssN` zagE+Hn7EQrWaQ-Y3wCWbfG)H?Y_h*lIU%oy8?=I-W^0scuC@&eRq6N{Hlur^$JeY7 z7J?3@A7}n&cqlqA5Zxg5NXEv#XlDNf4ggFYDRXH8s$LUFd@oStDkkHh`{|#^Qx{lI zYb&dv{E1z&-<@$yi6h%D)hFv_`p~&cJ|9Iog!~#g_CNHpDN8DIwuB*o|G@bVaP;C$ z!3?1I6O<7ckk@62{tK_I@YrOoud2fB?-%P-*R-A?}nqX0N9#dBU<8G@@cwEsp8{>UF`RjbfV0 zs3hLIbmOFf3Or#=Bs}c&$BPZ9iZI$rY2GX_M+2& z6JFpkck;6Xm77IZxq++ToGZ8Y{kklm8Pqwz(f)UX zGv1Hd0DV=nd*2RSmDza?y+rxy>Z+Vwke{!c{<55fSt{hgK5~llhO8SkQGssSwgLXv zE=6RFsDUh0d|{;dl8Pv8WE;fp*OlAUn99Pgk z9sdn?CzDXjRjAM0!sSmeP@Nl0r7MNI#;*7Zf-|8^j4MT!)J2#PaasVIz6tPUa8L60 zV-a4)$jHc7>tXEk4Q-D$pb));I^86`;FXwV6F@g7CmhD=$rw9sK%@YS*V)6v+SC*z zQEF#YzIL~-CA zwUuHw-*nt+^}=8FN-6*nYB2>=pbC^Vg%f&Mg}aXvWkIuX&HIF9IxO?Oy;Alucj_zz zHty~p;)$zJYsWSl48<(Eu*0QZQ0vR1Urm3un*&#w(Q}7BUD-WPr@J4$2jwFqNHwY# z2nYb+0kS+S>8=Nl*9g>}G$s1XlqfA`tGZawM-80zq{iz2fv8#52l$x7XV@j-|f5wJURW+O$cD0D?;y6!mFiY zuNghBTN6O-s(kdQj3r6tZV(P+Wf*4Shc-uh$QLz=H2%VMR#r-kB&vVWp&e4wrgyVx zSO9pT(`dib;N1?!IE)!@$|v5GI&D4I9zD-XO{<25mxT#fkN=DMg|Y{$mgX2@Ou9wuHlor=5rcX8qgHmb<-@tAm;mNRdW$ zhXGEB`VJN4Q}#y>-jts4Z#{Uy`{vp-M6`jSl!~dTsV`u8IRDmz+#`qD2I57xQ#56% zRix4B|FV406h3&55_W8grClc=()1d^{&`Bi18mFv@p1+TG!XFN4@ryU82%STe8|Sb zvZIM88?gb?PioaDUgqK2@eOi_CrUan!s`B}!L(>Q4lvB1a9vKSJKtZ~xF0ocA2e>K z*MJ=YC=X;d_(lecf8uP}>@oX76C`0sR3UYm;;IaW@Ey^dj{g8SgFS>Z9;c+?h6ayJ z5)R9&?`bybV%a=DaZO!BS4pTEFDxv8#EK8s4AA-K&!4F}XZWSy>HONEP^djC`Vi7+ zc>8X)4)W_a##-12rznRGe^EWl0u_Z)pyDOI>Eq{@#W5DHR zO-DyAU~#PvX`sl59U75xsAQ?lOG`^ct*~C51GHF$QTToGU5X4mp`=8fe7)+z? z{M_7J+(Zc}Ap0+c1!~ImK}4is%se*n%E1SvUrg!p-U0J(J6`sx$R6y5TY1m8PkApE z^Bea?c)IXxq#m3@vv#ymZLtX{04NR*51IRka?z^e_7l5xh&hoeB(mAXqZI6VrxvYZ z7>ly})O5qFHa_s9Xj?w1#dZ6Y&+OZmVe7>e{Y2DkBs-Qu5AXxR%+DXgKH3#N{!@+^rnfk5sNsA<{lFf-*O214Q0&R9-j ze$3WxY@Dm14*imbj|5ObVGm@-#YY!gmTW%*yt4!mZW=WT*U}N;STGk9XXhgqBD={8m#O<}aAwZES{5IUpk$bD}1pT<1S!jP#Hk9Utota9;%Y zRw~iG1|-MuVA4%Km-`ACo4gw<>o#kL6C(=2LVdd-Wj^XxCN8Xkpex~*r1sX&N&Ux8hIhkUJv{%*~LvN-KsR4 zvZ#UU^QWg(WE2!ZqLT@ouJM5VN=r+xY1~0`0@6S)04S}nVwxqE)k?i4^=`nhzvVjsTXoZHBz-B!zPkAhLM7K-MbBxq@PVnEo`jq-4Vaf)1 z|8`vlO_5)S)&!_i6B84&LO-5-ks6&UZ^`kOHfk6D*?KbV!e0#-J7$eUDis`VY`h?T z@$Lx8_S9HVUPdA+6vn-cVP%DIbLCzgsTNJS!Qeb;Ja)0Qf5_Nq%dp2M^wd1brlmG;#$@|&sWKK9> z6A!e00F4mC*WAZf#p`kOK0Fy;QWO?RQ#!o4;m;3_??wuI1-c0p3}ZhgFk}%J4Kpxz zw*rOpkA@Qld5AWbe!$v4>hf~fb|kFuv}^qML}eS1#86s6`xB*7ybu*p$+>dYxo(4Q; zNLhSV)gde;4-}}}|BZ}%Jv=3!SpD`=Q_|A|eROc8zniU6fOd%3?(zf*4{W9uf;0m9 zk)h-GnN|sYFjtga!#FARA9H{QHU?rU{|O2GhWfmxXI4%3y`Gz2&0>r|N(8!~X-yJl zP!|zfg(%)9ble(0o~PWewsZWlo%4SOa1OQ_Jq`Pi6Y-{_yIWeWXiMKsIbFO#QJDmC z$C53dDbMAc$H@U=Z;Ms~!CQ+!(Cl)k!Wy|U)cc9_%hHRRl{Wmqxd|viWkfms-fWDZ z;D)vsc>3ZQoh%8{u0MC3AW{cj9{fYov@hU5j_=4HJ*HMN@Wt0S$6z)p-gP38AMkwi zr357mAq@euJqAbH7@Hx+-Q`|Zth~b6a;y~Kds7#Ciq^Exc@O44#YRw(V(qGFabSsn zn*734tk_P!hXTP7YRardquw2r*!^!u2h-#dPQ1uTrF2U7A=?r2;=GdKu2EJz*>bHN zC3a!0Oic8ett}%_o-g59cbR!E(1=)gV$4emPQe?;lNnxy?H>sovKlnok|XknCXF{^ z9P~66mY1#7in$%qr8WC#Hrt8SuAkRZrZU9pjyHm_zMP*H6n^-yl{O~C!HRy+KO z2KUr8usQ(&?TerY>iq%@oD{+_Ab<0Q2B{H(@ztM#f})Qk!NV}(0Bf3vjg|33Cs|hk zO`HZvx~*P&@v_O6k6-`F#EGjH#hQ#;eAdfn--hOgv!B~z+Q-U`Sd22I{$@F$K`*8|+ zM6AMVQ*NA}pIha@Ye;1+90pQe3vh&rlG4nWkw)=a?4kIY))0^O?(1~dI=pk1_9t%n zJ@LD3Lt;Phgbhw1gXLowU$HyN;y!AXF?YA{#*%*rrPSJtN4l92cXUHAL>o5vpL;BK z3{7&N`=o<%Yh~YKwYiU>EU7MO7S;MqzKP;J>@|+5HXcv67m%H@mKBw$J5^OyJqL3X zNC%-XEW=Ubc(~t+Su%2q*h6j1xk8bONd%e3y3w^xh)>uqK5++3seKUs3kZqgKb~mu zj-9hr0|!BpB6L{y5Ti8lTM~q`M$n=}Xxwuav_}lb+4b4CCyLk*KRd-ZL!rTX)3jtu zYI7&hApy_ghWma~w4YqkxB%W3C~W{FqW=jb2#Cec6C$#t{-m>|$8kT(f;`%BNxiIwI99fZ zy(K&2#!)(s0R)H&sxeH#^misTo~HTC1L5den_%5 zUHvXxjLQfBctGCok#1%FQsWEaNFO~0IqpgKKX9gnewcH1LAjzmd=!18 zd9>Dy^yy!EJNB32Yo&-{Z(pIN|N19FdR_RI?0Z)?jA(JqvLe>Kx&w0gt|qV-U~HhE~r68u^U2yQ2 zTVlz*eaMyX(+Qlpm?jy%?N2Xjdpr#`6r>c(my!lLqahU-YwZ^1wq4@0V2}5EN zAv+5N>H?B3K$Zfe{1=%7+Y-?8Tl9j+jyee8SZ1eUN9r86gBteQwK$9S@suLpbxye+ zWw8^z<4Ci#QlnD&q?c;IewO7+Ng93AB@e&f>noS(nb{gAs_u#+7NulqCV&dxS=ay3 z5dN}q-wziWcWI(q5P;#6ZLERG5-02VWhRo~SFJ$8q;418#>EdPVn*-j?dUSF3#{97 znm}Ni-~H?c8zu9Wmn=t;fZ77P)h538*DwC3%hDbFp$SM z{X=9>J|~@%B;2U^qn%J@xGeZ^8uo|ua`O{u*d zK_BJ7aMt0J3^gUR^-B*1LY}CVJ_`XXH!%iM*5Mn(Zy7cJT>5cpy(v+P5#0@*IzVP& z^JjZ&^ZvZ1NXS6K0W~cDQ}`7b&OHs4bGlAw`uB19OV%er5mw}M`XZcnz9keJ#VMlb zx}e9^|5#oz@N}d5cRj=^dj7~B8=E7`jTpeNrHZpSi41HBhTvCZ> zxL1CdZ&85X$VsM^8?-}v zm+U)!)`4*mVE#rtraYl_OqWC$mYq*_QvsH8#j;I@r4vb$OnUyT^PGjOL zBMFyz-q|1y&X@(lA9d!E6jiYta1s8JWg*A3s|1zqe;iUwLOGIn`K9gce z;UQgHR-s0RMLcp}U7uY?{6R7zG`~7sNxC5Jcgj`VCk?&)35&?H#^3mo9HEs7fA8C! z&V&Od-X$r(U1I2H`@bP8ERw*-A5}xtn$j_#48&%;{7Kt`@)rk&SA%0NwRM8n3kgrS z0y}E*49Q(K$7RL9Kb=~V@=wE{O}NwL=hJ;;T}5ot(GgB{qhVvB8FGn^ z6O)Upg=Z`N)}`$a(>(Ag89Drtrp0gkiWRT|GbrQtUqzDd^|Ks_kpk5#gjVh&#N~nC zFt_CZ|L6kd@@|;UqnrXV$j*(!L$v-;wgq$`08JnLo{LBmF|+O1IE$eWD!#1njRNNj zkB(+F5{C7PVJ-peiaaEKQm$YXOMyOo`SI6(*1XjUbZC|gqATR;DkL9D8T@o38W=2) zOzSNnw_b`%J92VoKB|a}3iz5(NF^M19hF{+s+Dm^A8W>-L~46x%F$1pfs&DTJxI701dd4y9E8il#dN z>{2Co+~2;fsAG4#A9nmMz( zfAnH7E1C2mD1*tVj1;caNXrM!Sf<2cu`~^b@RP>HW~|}KFC$2d1Ys|&mVc-GRa~DG zc~f8&#CYO8_TTr=WqSf;lV~go>Ir&dqS_yWQx#z1c#I=tb5JH_>VU7Hj-7Z?woubc}nleQ+@Rcd7hE5i-(?HN_xD6vF) zH#~0Ns9c|^vE>6W=_P)cFa{on7R93OyVaJ;i zXm9pazqrB1##AE(FII`yi#0xjy4cQlG0zbC(ntb5M+@Lj;ifXY@^mX_peOoOkIJBz zU0R6piJ#0it~*HMiVZG7m^Ap5M1pwvwOWfgKWx4u<>UrzPz@^ZAiQ{iK<$gX(Io5* zmV}N?ZSJtpXF51KmAyS7w^s%}K48N8l^j3NZQ+;eUi)U}{HCL7`4INtHv0{_@|*9V z@9^RpT1{gw`bYjESr_bu@cwD@5cXEBo9w?87_)|ZL*u;wjC|n;?CFsBCYJtKIa+`i zXVf-s4}eUdBZ4p|2N2zS7|Jieyhkg7i@vZWyz?{`W(Eosajf+lc9wiZ${y6h9EO2u zYn!6UzC^SbYnAz_^^AhPZ*9g(vO%Gk2>D}R3%jsI{^x%XdG=Th+H0ac%9ieI*xBt^ zg#q4zFx5cW@7{;}Mq+|Pyr>Qn*=Y7`9hqCh-LISNZEny0{zj;dHT#gJ#6WQC{4Lv_ zeW(Dg0K$J(lqGeuu>-+7pPIOwXGweF&%pi~%f7|eEy`ShKagG28@J7M@(VZufw7Mz zl=?;11zO{aMRPmdoh_b9^)Qbumjox>IjCe2I0-upPO7kSk$&Bc28at6cI?ZKVSP2( zfqM%G!;4xe$}pvPB6Pwqs-^Xwbg%`urux?lFVgb^?eY4X7}<7rr#;BnsAep`RgKRM z{2UGaDRuSEk%T>Bg2dY+$+l!pn?G$kd1U*=qgyj~fL5Vq5;2enx_SJ&ht3P+fNda=JA5bIZ25T6nQnbZ+w@=kX+)m{mexOY}@jD#I?MHKy^2 zMqw;IRyg5&gY`AWx_=B-TSq5v@Y^fkIVv1^t9ammtwdb*&^{?E$6h=k5g)@{!0B0J z;#&vns9n}yf?|q?rfU8<(CW3yB+&eeJMWG{kb$yxkYtvQ+O@dTuNLPj=}_l~s_5&( zZ^XCzn<{h1xyhH>%grr$wzhcChJ}E!cqM8O0@tnDVyy3s`J}A|(LrPLYN4)$(7T5+3u%$;}N8P^*z=&KH|F z($0y}_$492Z0|G475JlkBtXo64a{nprzoM@h_nwIJW#Vsywg>c!(ECC6Fah78Ux;tF@JSmt~NuJZ`_(A+-FO1tZU;$ z2Cl6VV(NRDiME;wi2NUbfMwwDNJA==$&vPlSC%~Z#=l)NN{_24QIC&2qH9PiH10od zttdu)+_&abdy2`}dF(jl>2^q}C9B_YotS=C`$plOD3;xQ>c$fw7){8>M=1tQD0jJq zqYH@1kNc~K{hbFLgOU2PUBMJ<;FV~bsoABy9Es5Do>KFt8dajcDQ+j6d}e042F6IB z#R1pH&z_5R`By>;QC+~``qGjFKY-`!XtD8|iTInMWF&W#U-upKe_s2^lfCI&?~;+i z*9w#OVyRL(*F4gfDPltx*Fiix0=|Znt~KNW*!W!{T6UjezceR_-8wzF#4fn?xm_og z7F`JB2MQW(%xPv)7U?42Tzh>s)vlZ@#Y7kCDjoj&3BpVRyn^6&a83_5`6?B2!?_Fl z!F0*&FB71Eb&Vs}FPRcQl)zp4v){-sXdt>ud*>152zTkLqp>1c%2d1~;upF*%5_1m z8LVcqU2auA#y!Os&SWR{9Rt7dq6Oj4+p}Ama%151Gs-fcBU3FF{l^7=7@Xa{`4vA@ z>yJdaK3jqqkwU4>)??h~Y#}I$Ca@_GD(7^@-qjrvV2_S*XFQMZzOuM%r-* zCm&`YV~ajV+7)Y@T;ENBTxv-3P8{Ls1<%QaiScjh_v_KQ9>SOFfr-8$t-chRrMZ(Y zXarW@oibpv?L8*Rii*V|=#^-2I#J+xT^o-9GXOf@k3+9c@NqZ?k**95 zK=c>W{|A>Ngc}`1uG)e3py5)cg?={?>I3&>0*w!3rW(#!W4V@Vd*?>o---`SwxRmD zjGNF?m>ero z7~*}3nmed{9c2Vwu{O1hjTWFMk3sim<+zXk4UXFQZY{7(00HxNqeO7I+?HnjB(Qw| zFXl_<9vFUr=Z3CFFiq*BN$h?dQLme83kr*pn!019xt}8QB=q zjJQN^mseJ>Gq!yR(%|2bgagDwX)VJ}Hfzmm0|q=me+$^J-u~j9TvhTE7(pJ>_9dLO zcYO~S;b=Fv0o@kWvsn(q6}v%6aIcgtGiqb+QYlNMuJToh1wa4QEM1P z+#BTd-P}aD0#r0o0ts|gdjx=W`i&Ej2jIZC#m`=?9}xo8$|+7eCabx7S);?Ku>=tE zE@%h!PQGat)vB{VTICN*8&^8s_o~9D9WM_07mG8PpLj887@Xr$6$zZebArHxk+A3%HngE0v+~#QZR3xb2<$KK8r6*e$UY;nW{8I z(Gw$kUllIZ^j132ouEp4lABF<;=(~Vw*DN5&QYrq+ zGGKTKoB4U*OMLOV0+nosQ!Sq7IxMLNF&%XO*VYUf?kf9ryTnV_XpX}aa4vj@0LCG7NoGdxXZb8b@hU+fR8%)6Hvg4^51 zmoEBq`7q_`7U+_J-aKgc!8deVKUP)lP<$6iqkK%^-cbLL#2^$?Y@z+i#cJNB1(!HOxO^dH(s*8zXYZuwZupHuy*u`#%Q^btKuCD zaSS^O)~m?ycz{w9{*30&=7PYpJ?C_1AD%_oc`h(z5+2Tz-z7{`yo{) z`+M6ecU|Q2ZV}yoYMuy~-F2R#=wCwT%r8}WIGXd{UeE4dzKlg(U0szcRA`F+{wQ0T zy&64JyruWvShZrIu4hvo^jzv`^m%F~X*;-pCl5pe1XkkqZ+j{V=4f-onHtZH3gp&f zFyz?ewPjEANczY&Y)aJ-KgNSehFFhn}O7(scfUDovTReB=|{Neg_P%yqLNvJWhOpN&UV? z3`yJ;+a)?RiITeQCU7i$rx1A(HheQv7RNr76)GJ1ZQ@dL&cczMeb zg#wyWCpF9Q1@z5$gbURUVx4+m@zK({dP4So4;;@+?O#_y-xNz#+rpGZ7w=ABW+uXE z{sAL1z|Gx%)OxcXc2!s53AJ5m^~`I{tZdXSIW3sKesd!{oNLQTW*M!Kf2Aw0IdU2{ zOsBOoPq?X3fwuFxPlkTiAnUAxWJ&vi*kepaKY2z%WlZIPWpo#)IWPr+#PFGcW75WK zdZJ$i(q0bdTjV;GyiCwVtnv5vkMx&THU9A7gV>{9m`G}3ZcMsFi#&Cm8>;B{kUw0D ziqWD)^eg6BDiyFif+8Xjr%XcrDYK#a+Pe>@nYa(gs~j4vmp_@~!bpYq`BBEMzK=1Z zd;yDlXo*)5Ey0#$*1;;{b{iYh@oJ|~&4GCx1`&$Keda|X3$yYiof~OLF(?y%i65=2}kn!9x?r9WOZ&S_yib>*AD8jX1I%lC0u}aVSJ}UVf5( zjd`^nIML7~i<36^w8rz*N1^)=+K{Gu$2K#`cfnr@&S@^KHqLJopVY0>iLgU=dvnhs zrVeh>tJJgNby6}0))qH>gXt#8klYIEIC-g30M8z@8^v(QU-mpQY$zhBN zgVr{a1#<>Pd^$JG;=LNXdZGlowze-4UYXZlF_`+`idr_&)Bt%+L=v8{J>gomZ-$Qq z^$V=S(eeBV^w-L3 zA@^f}1O&u{#d|-Np%%@XeS$`fC@S0MQ~0y9*C~Z26TEKtu&1xRE2*6#i`KuqS|yNY zeRsTZmM9k9{y5wX8WUFcbd>6>vV(2Ke~w@oJssMYT3-#CP6VmpI_CA!=YdK(tc|vxfSq{R&3!pjeY+`H^RqjzVp84qAIFjQQbu*IVXhlZ8&`|Jp1Wm z>7csG-}GKpVWOTpN!?&#EvP>*H-b!uC-h)(o*hSm$o%{}e+*1{O@vGmehjFb+3)e8 zItu6Im4g4#VPC<#hAxiQYS3FHI>TB`$a30}-*%`R9bIP1OZ7-lsmw=U{uX}~a#nx!2fh)%MT#krDX9b|%9&JE^=k~Qe2!BfWkajINcDRQOAI$`CUpBH1MRk1 z*_kf|SLwB?<+jzac@q?7pDhuwv9PSYy+x#ue@c7+V+ILBb71Jt&sI~7CuUd*aX79$ zh8vG(9)K?3q1d9xW6#n3#;!#?e!!U)l9i^av$#SIw4-Qd(2!hfpHRMC| z-;{J;V2KDwUt>n7Xi5kFkMe6RAH`GaJZyPNwR z?}2|4gSW2&-VF>py^xT@7oX?h(NW+w{MX&wg>DrUdSC6$J!L8$@&P-e({P?jmLYsv$s7^ln# zUJqr$ik~LQp7s}An*AoFkLX=bppJZ2gcH%s^}EM%^E|b8-JAfxfw4M&?ue^Q7#3et zTGX1|59--rE*WTvVxb}YYePRdi|<|svjLZ+!n-l`Y+}T=*33C(MD=8Td@d|xK2)j_P?fIldj)fX2r{Mw z0>2+NK5xm9lauRNc+a@!m5bX1oWi5M^^Qi}c4?bMu(39+NGaNMl7QM5A=p`Kn9#!R z?u)4;^c@?p_;<7?L-WbV$O4X>Mg}IcV+jQtZ8?%T8*}!zxW92pTmeA~KszG{mX}_R z(zh`&h}^15JeC98H*yUv6~=wwa`a0&W;CW52ZNaZV;R7W&+JiAUpHpgLH)J0ZjE3_ z@^cCncg|g580d@R&Tsn$d*Tij1Pl0ch8Xtr0{uFRG1%8i_G^&SSp}SnYzwP3gv@}H zc8Q@7PZ*Np;hZO2x_*V1s8J_0pnW=rK_8S=LWEccC;D1339mE%Ic6P7*mfgH8ZLFU z7DO=*$d13}B|-ZCdjTNAD*OT5yaag$p#oqihoMXGe3%Q2b$t~Wg>a9T9|M=*hEutX zdt0p@!}2KI_9aad-;Ndowp2XiM(#ifCj+1cLSpiFBhTcOu9q2(2K z<4uT}AZ0=DTsZjs08(9s41D+bDseNXQEj$JesYrNb<|+m%b#?@HF=qP+i}id?e0AGVw1h2OVY)NCZUQt0lauai^ zqDE;{jnqJ*=h;S>)wK4w3TtzjmeprAckM!BJ-Og|@m2deIb&o%4{aC!;LZ*(%vkn) z2ck9TVc$dTyk7H$Mmq}z=W}scP&H%GO!RI577f}!hA~!|WhiXsGz7{MH-#XsyK9NE zUVHTC-JZav5LC3^B~jLZU+!RKweMHuew(=%j3pp>5uLUROG73tA+W0qhoC%_){JBF zrH4VEu%Omp$`Tqs6c$Kox5f|Cf7?Y!DNprhQc{XSd|~hXo4fN(cJDb*vOGbjQVcm6 z%b^W7ZbQyg94dwVi#!-8JiHRo3u8}e#r*=!yt*F^;Cy3r^*XThq3W1O$=2U>EC0*x zzKHtNzAz!#s$@^vcF629`5{r}Wp=^LY+Ft`X7F_kBIBk~R6EdvUM3z0^*zSY-S&z^ z@xOlC@p~>8ajIgD_qPbV&dN+OH9+Gjv04{4@Ot;yJHn3> z9X@FFW&E_4)NWRuy~Q}A4?81F*6X!{xF5+$ zt5JJf-7?)QwInZOHcbz!SGq@5pnq}*R^_65x0%_4a*QQULj>m|{@(jX*-EZOZ{@_x zTIcyEZeCfn?hG)u0+c2&BzkaMI~zM4QdB$qE1>69dTOdJaa*ZxVRj)(eBlSJNX5^1 z_m8b$h>$@Cc{8pOxBt}|@6GS4Rl4Xc_1nGdW7Bn~-+ljlf*BV9P`FH)Ql!}xv|6EK zS5J}w6Nq38J#$>$L47_sJ4*(Q%X_}-&{#aIrxT>zrB=@mEcN;Zle)oak^O75{*Gt5 zGKjE7RLSv^8yJ5>Yzay^GOmih(_C)2j}>(D>_~`gxx1RW{c_!Ou%hj#TT$PJb+|;yG4JJe-DO5Ln%=~`$(fjENlI`p$bdX5m2BeJoF<3A_!#t;OUkTj1?pqw3Dsb-l|jt zuG24|nUrps!II%ol*A!}$&;RZbTtJR&i|}O;E5(ZpcxC-O(jfGowi@S{chV6!>+!0 zxo45j%qV665hsK=blFCpEmWb$VA`P?KH_nS z{p$fHl=IVmjnWH)5Q$?q+bLj0tC{T7C8hFt)Sfkya395Cl%a}4LSWkUp|Kvqc3}8p z2YvI0RBUTh$m}uVwbrqhm`4dO@^s}UjhUN=2jMH+aOIf*4k~z#ZSU2G>hE>R?^)VI z2j|xkMSHDmybHN%5eZsLmddOsw7fYMy<8J75b`i0R5^4Fb&$|y5o)!9)w4RsW ztvR`Rd1)kpd5Ra-IYj69E+~O0bAFoF1gX#uRw%ist68~vg3{au+?CHI*RxXy4Au4* zf2m_*zCi~zWK@bdHK!>@;1{kpEYAVH?Rh$N3f9f}d3{ZRZHyFGz`3XfgHqk!5)^fN86tx8WiQsFHjkLkPbYH1C!iVv!wHH&&`I2<}&!Pns4U0Ln5ibt7Q zbBbb+n`24Il1J5S>VYa^8BDYM4~dew`}x?XYnlCN0Le#vL& zGY!5gyLt_`eE265p^O|IdFXpTKMESdV>-IEnXjTUSw^^&>9D_5+_#B;d}z^EZ(!s} zH;Ae|69>9O^QWh-_FR%8B52_?yD1uj?S9R}C zRa2h+02$qi&L)SSl&*Csk-c-gs^VyBZ=Jn7heNJzhKdUJ>3sg z)l;)4&ia4}!;|S|PTGVoxbZz!XG?*~?8kIp(@_;0fe-ST0g;o}o$c73{nLb7ke@(}Skpm~ErX<3ya`87F$Y(c(zdlf5(y$_4g| zFJgD#>ygP=33B>9`c!?Sm4k4x#&u_9+iM94t!`Rsg&luVl60p2cZqnYiXr^bj~Szi zf%NPTI53IRegr-?eq4tYgi3$PJz`*$c|6kFX_{Yq5Q%CbyjO0?=qfS{FTF4k%A4qi zBf@SrQam7p^9481OD9C!LbrhB5m+|-4*LylS-_WV7vUzLNZ#^)=&QiU-y~zpL{5Vp zt_|;bml6~b*{fiJ+8XRuW5g;jZR=3F7dtcwH$4kHdzT1(8YJvyTdqDpDSAa%g-_!* za0b{33p=&~ZQZP`1-Ko=a_mAHYu-K%TAiK_7*nGj3|xY30dP3;s`k!|6}VMoatsn6 zW!4ESBNQZvabsz5d(~?H(4~(`4}r16FN>XYym`7be43W~q?lMLSIg#w_)Lu2_n@9*AFo#A1yHvkZeKLXLng}=ck672 z(ufCy#y84FkkfC_X+!*eJMrQkNvrhB-j-)F8B255rooX#WP`2 zCcq>=W&SaduBr74OQ!{_(5YSyn)Hasn@8NaWQzb| zF1va|lUXLuO^<&u-?}F!@nq0F9>R_wvAFk zCjwPMTE+4vj-L&~;DzS=OVT{FE|~JKVyCH6qB|5Ce8Lvf?>i?D8f={9M z_%83VfvU%f%&~Lk|KUsYnG)2JRg7XP0_#*mTcq+Nx(zhgFBI zB6M#G+4989kGfQ&<+8EfMU=r*@02T`MMdIcdm-xXFgMFF6>?Gw#oaHOHh~Ankfe;) zx?R~5RbRuv{S2g@={_465=Oszj*4>D^o)Z1>uE5z^^sFPI=o5WOpVEPer_$dt}5V8GJoZK=CYf@}kE z)4-b66J1cMo=K8ya-yZ6^mM&==Cngb%5+nrw0~S^uE&#=zh?Hp$;AspqwsZkhos8V z&N1bAwd~>-!`-!g3Y{&%*NRkLa=?1}1TXezjKZ%|IokI#7XNkYBE$z1#kcnzNHfFfAI{|nM z_=IIdufK**X5b=nti)Aj6e9kp7#7f>d7-g(LX`Jcz%7sMz;;sq&KXg(FIl3v%FiG$ zD#x*=UVgxLtDI{98v0@6?8C^ZpiP$keFmc13)y%%4!B4?YD|2Xfz5Rt7x9*;(0auO zM+I@-#Y0(`cpldu&+ZQELW3BC%EfmrwH(RR&hliVy=Sn0P#c}(mt+MiX#p>FgIOTv zujw^yh#E;BYIJ_z*&o#AO}`UnS@-rkfsD2AjFDKzs}yYQ1=Fdk?zq zynm1CJH>}8-+kWW{A`8fV4!+NZo=LOkOuXvUMr0IBd9F?e-$2D9S5Dqw$BD_HIs%} zhrftNeiE2D%K%kr@Xed%;QE$~?3-q^p5oe`2=%1&F^SZJ3h+yQ%m>|9{Nuv8yH{M zuP-?CL#5|s?3$3}Ul)wXy#|WtS2^na(Ph57piXYGV^z=hQ8Fu4vXf%sExD5G6Ok9z*+SX zAr;he;qcclGJ-6JZZKDuGlklsbj2m42meU1K6_wNUS@&J4Kr}`B52TL2z)E=A<>%y z#SZ|)J$u&g4-C2;!9j-p{ZH}4Hc$RapPg$@ExE*x^`IRR2M2dgk*~Nj!Rq+j_&Pf> zqyctOWI}*RVAW@C)V4KbK^l_bE1yWx*I#88>I+5*tn2}brE~#XJGnxCA)*ryW>JU7 zX6>alkA}s`V}abMvxbA$Cx8Adf8*|c3#z~7XO7MHv9#F-4s_*KbTMBnbiD@f@mjJx z03Z?Sq_Rq8hac77iwl8#11b~k);6%%SVcBSoQB=$QKrbX;B2$;937S zmZJo$z<^SSk62d5Tdhu@KJ?_Q`&ZDx=Cb^k_#vFM^68UE-Pu% zS9OO>x`Ftrz=~Mls65jYKekXigrit$i9_^{f)n>Lebj{hG)EbD>wkh`K3<}fYKuJB z)t!Uy?SI??8)Bmt+zHJU6X-cjiHLAKKmuP+?kOzQb@DuwCnF0aFs7j9fnc0t|(qV~c7=$A@!jj8=m4^hk(` zs9Vh5IX-s&xwM2vtherB!{y{FDU7~wk0v6{9P%?_vq`#?Hz^hhO?)_wdb0ii8aKXu z4~tfXBZk$D8hWITo|KIVkg@n% za{(2QyZc|mGv?`;3x`~fUaP4QX;}ODOeX_!OrX zlZ@x|4$gb1r@kPpyj(KfPW+w>_+2)(PW&pS@5WhJKTnHH{fa4bXSI`F`nI4o%3_oO zz&q7&Jf=eY#>RJhoqrLgQqYbd&9=5J?|wI=nFol}wRXhBCTi88+OzGsxJqyke(_EP zPSU*qHq9DDa^jFSa>QP$){Qm?#53ooE{QynLqKf+{FvkUYGZ>NLPO@U6JY)=K$1ZM ztWDjHSMX*UG)QyNsbbBjh;#soK_%%&a;Sdw2HnqBl7r2Lk$pJcFfdKl0wzP&@r_{{ zUxJpUlZWTW%tOim)FZAg{pH$#PmndtS1%eC;0M4yfVcNdO#oZu?|LjDkdoLQ>ZaXU z9Q7iB$z!kMfB$}gzB`x)Jp+fo6V)CiM5eBItQR%O-h-zUIvxU_os(mlK_2NV&GCX) zQz9dP4J!*CW`ghCZ##p|)LVSzE_;waC!R_*Y63;-5ZFHVQ~IMJmg8x`o{DDJ3PctF z*1#D>_l%(gCTCy^jT*E<{f8>xkmdXIaDBY`^sovR7|22!m1P6ws^yTx?SeG?z{u;G z&`gGuk4(4aY?u=)HM?&}(ju}@0LtsR^683yO9SjCSI=tMW3T(Dr5XD)i$twaHbht% zx-fY}vKb1e8bT5^B_&eQA*34ptzg!V$(W7X&!WnoyKr9300@vAO^mT4VCk@>Q~}P3 z49D`4f@apm`7=5Zv^@l&I-b_F#IC^0|DljUl>85=fkMaTZVG#?4nNmQiIMoRcC>CE zU>_|3G0L9mkgg+g5Gj!J8?gDA)yc8H0e}!7Lcsra_;6v66C1sZ>X7It$rIYYz}w+S z7R7Sl>zUX&zH)GV59IR4mkZ`CfZu`4o-ZdKu&{#uu-?QUXojbRjRBWcTj`COk$|}@ zQH!A7%rf|wPm=n&Nn@v2HK%zR%GV~i6#uYk7tE+IdHM(1nm zjhiN9o8@M?^My80n$tFK*fy2-J1Cw9B9m94zyrWfoP+Y6Rq~g{e!aiY%WTALLZHVF zw0(Rfh5A0o)x~8pXz~CU2nqnL0EG@VZ!^NSCkaqd^&i&E*wN`4#?WtA`IoOy$$uw> z33NqOoY(5J8=K!%4*I?0U+68~c0i{EO5>OYNU+Z({G={}-Z>VN=!|w2B!U$#U6)@Q zf%?)v!V?o2;pggVoM0o{oGSA#OWRSSXVhWXOEc7ZG(vt{x$n>0$Irsr28evmpn;{g zpJZyc9>@Nk9eXZM!0i;C5WXE~**%0WUakbKsILmr@A5GDAGR~4vxFwBX<3Mq(r;z6 zH2hQx#()Op)x7$jiW@c&WdfY3cH(SYYDU9LnIbP$t+1IG1wq)PT%h02lk4iGx5(H% zQh=jrFam^ zjk9ct_WG_9gVv}ekOQT{Y%n3=JvTQui_Z^hZW#c5b((c+i*gf3*PE%Rb5=d`6ZtRA z+)ycG!{axi=6r9}A)bVG$RRQ=Wk9zE6gAFZ#|JM=*MEAN5lbb@14Lw@ ziJ-9zV516p@D_h0iM{gvk{JiS4K1cOyJ?%KP4)Wk$-XoGV-fCr5-|LbX zd&ZUsCEqrp$-Ok6792X=G$M*Z9*OD?p3@1rK~YS=%G zb%U=S)VbxWb4gW)o_rzL)mH+O78TcPXo(+6s?~;*4bx?Ol&F_&Pa;}-<|v%?0PP{~ z13Z$i_Xkjs1J6jg-rkQ!ygE&mCi|=W3%=hjMvGu20A4)=KlMDi%<)#{1NhwBGItu9 zPLq~J4)l2@2%yOmDg=Orn! z1S%l$K}vPmkf3DIfSLuo$OBP&nt%K-Ry;9&oV#dWrWwQ+F$VF*EleF<^5E}jPnWgu zRfNlNHhf`-rL-V2WA&fA@==M!J(-LGeH@c?nARO3iCkn`ous*EZQe)V40K$^HP zNJM47P7t6mt*l08JeQ1|D2Lzwh3h%<9YyB>(|Ib6#mjq2C1pb6pn*xFbQfS}c#LY8EBAUHuw zb7Val@Pm3&JfE8jfz-jh_bzGctZ91Wlk^#m@C=4CD=EQwWss3}v)cR47b;@|(-2;c z+&me03m}mO6m6kWqqva|({#R(5==?O;ONloU=_*cfaZgS1 z!x=+ydw!bHgmU5;?UO#=p6BnmJ4{E`WcD?PCMmahiemo=tu-J6{3p#)` z-^0BwidfWy39ipg5N==a(+eu=v9%Z0P#s>=kv}p+PL^;)^;EVS;nnaUZ%AE>$#l_g zlN>brkOc|^LuUV93((Kz!~4Zg@`+b$`Mu5z^0SqXbSO=Oi2xu9(Bo^~Axi~>zYT%r z<~fz1zip*j<%Y*@0Ny%4hG2?5L|{TH^C)5uC!qQEWW0^-vuMnj?j~GwIDZwzHYW8K z_73{>a!%nlAzSpoMni!>`J5%kfE}!C`;c5Wmi}_k=%H{=_JHqydY-{1@+O&uiJ0jM z&OIJhxzU+Tfe{m~GgNa6XV-|+5b^LG0+Aslw^1Hi&bbr zBFiCP4J9Rp&z=GM0%Wun7e>iz$TTC%QZOz^UWrk)nQr=J^rQh?oIxjoI{l&uqE;T0 z1GcKt6_9kl;2mHD12bv)gR7t-HW>|kGr8wmz$>_l6J%#7&dR>&~ z8Hxw*jgPyfpnEw1g|54>k?f(A9(V$(W9bNnUp@^LmyQa$)X zY-_~USN^LM(?z4R`Q$4B;ml#~-JXReGQqRvd=YUh1@7=FE#fTh#3Xp_v*r z(_=tyP&ig%29)=h3nojjy*KX)8Y#u>pz&XAKG;rF`X zcP}HgNoQy;y3P!BU27*A>Ks?I|FQ-V$=$8sQjOMKcHjT@BXiD`WNLKwbogM}d%@m% z|I=A34qqQdlRcoF!st8vyH$c*61H_dSm0>Mb=tv28t7fxrcHDCgnhNtjfQ9hEB-+Y zT~@B-&%10V;yIhy{HN*tvDU0>^$l-8{pB?Sn#{4(`V;#Tjbs}$xyoir=+=@E%PA{E ze6bEvF-{Z^eQ{rqrvL8wHYJIglV19n0pbo5-Y&2G^7B}FY5HZ&EMKq|j`I3{dMoPP zDn%Cn{l4R@bEfv<^DOhd#aNkNK!KEVy+8LBGg`0@k;t62HEri%XFmJS6o>9*Bc*zb z7W5B>I{#rM>&*aUtcfA=!Ntl^qX=-v<=a*0hn$S;B+HEpOGYRS@y>&zbX62^m=JpkT}!2f$Up2hqHFhZjOK{Dqyx5-D6{@~B^v-=K!6m94We z)rupjQ|iej{}8wBi7oAS6s8y|-M%X%+L@YYm?s!z0_hOIOAkb(^sUs488;*}te-E{ z>K7uz{4-g~-=Rz8q`jXYG_Pj8$t9?wuj26$Y1+&>p;Z?KueghspO0xUZYy1)A*r^@ob@`S`Bl<-qX(A|vSItt<$b z(IP)iSE%>#CKBI&olqtdg)M7(y!kx5nLk!I>!+4r3F~E@^L*jnvz(YiD^e9Mg)X)@ zdd^~8ws444BbVqR#DF_e2`V!}ML$?6PW5CBbBnz@?D~D?`@Z$*?<$Hvea(Y%cg|Q&ShPeU_Ke`G0ic z*9J&2(3n`OTCR+|pK&mTcEa_cc)XIL3d~1}0C^RmnL%UcAJ(D4njVFxAJK6RlV5v3 zOwQ|eBEkOvd&6=ENR>TON%GRUgIjl=Eo~yPakmaB)QFGSV!`|`H+&sP3;+z>#b+!g zKtvABP9qc$z+;5Ts&=Zq5p^M9%LRqX_b1F$OHM4FbfeY_(SI|Ig()ixaW?+phfU8UOJY+?ycYr;$PpnH(L*HZ0Z@1Cq{{)g$h z>LvXOSp(0F^8)U{EJtG5vH1vG=DfOE2-<`67Cs?M<#Z;96FuK{kHGV(W+|}`{Ndxz zTNkh*4U+v+aWOzRfUf(i3GwJ2j&veA@4VW1mQ^`2XqAy-x<7|3|Y6iSB?gM^_lY#v%TFN#-8KJPY2Wc~3u=+n$Cz4V*qMt-Oi* z@6Cj8Y*wo)nV{AT@w9$*JY0f7a9URAB>dRN_W|OvMBOxWh_%utp%>FE(gU1OZdbo( zyQ9-z5>#;~yD0aKcSqaD@d$RsFlVcY?<@EBrmM}lmsPt{%Ngr)2?=<44Lcb2UsSxA zFDf|sWX*L+1iEoC;IB%*iSqDRU|?Xpl9YUx=XVzQ%p=+sC>!OZHL-a}CY7hFBt{ZA zXxfQm6wnUdGG8MtA7J^V?tpnsgVAoWKKTw{iN7>7SOMD&V2m5MlQF(-Iyfv@)VNrI zPEve|DrMA4?$oiI05eu&6B7@jq>*VY=irJ8R&pvTFB*A%tB3G9XsbRG0ghZ!zoAuv zH=wzLu!v{!tP%KCmXt8YdCV?ZZ|Lagfcb(QB=N?tI4bynMaqUk3}buQUL?j!jEx;P zv?25LmM#GSfn-~WQsWAB;mr5%F+g$%rm412BN4V)IQjLpqQ;Wf%d4!yMk+M^Zxk+= zn3(*o;2&kGdYgwB`RW>J|7)n!rTj#e{wbrzni%~ydg;k+mW{7yx{AZxyq@~ zXxoIkHI|lEc+{}H{z5uSOIM~!R;O%vIs*`%@`7X+QfS?v7&^i{DT00ZGlo!hC9g3L zez&}=Bw$N4WXvxTy|i51y+T*Cna=}L2495Hp`l-(AbJJUC&*DY7KN$A%)`!xj(mgZ zL*V>8N2pud(Hp;mdI<@MsK-7sN2l?}h!xEadF^Ha+{#5%<}Th=a|hj+BK z?N9TFKIKE`&2x)n;;6O>9UBIx@J`*rO7}Ch&$Ri7q7}F=nV6X$Xq6D-$&piQkJhU` zLaKq96WKgwYwQ6N;z3AoT^DYYxm&6~^R{IdJ>M2x!rZ{RR z7-?>9{`8g?lQ9x2H%#*;{5#!&+{*H@n_Uyjk_Mudg1&Q?ydaSmmE#`{(UoYuiB%n^ z^Lu)FdZ2}M_VHQ1jjOA)yd794^1}ImoZ*#9kF^>XCfD#CTgOkHXuiB@cAcB+mCfhM zQhf$YR^Qi<+P5^sVQibg8O4mD&{Zn>*x>!%%L`C7vmKQ3vKQBu#)jhH5>Y+)_&!iV z=b&=`QP?H>aLW^OGdk)f&ONqo5W#4Fgedf-P3xIDS(SgDZLD%Aw}%xD=#Ty2z=w_P z#W%4EO7b-l9jhg7W#{Ssdrh1X6?G`LkT>ib{E7AlH@;m8R9-)jCCkMN*A2DP_Sxb0 zO(1#7BSqmA_9(?JjnN1=4R@6(@;$+f@lWr7NNptPE(1FK@}PWL;E2q7z57RW-gAq% zxHx~SY}A)>jc$aeQx0u7C@%B5S$ir_px z$Hj>iy!P+*NYLKqMd23^@Hj9V{_yi%%L4{%YUt|f%X_XO_4vZXs78c!uXfXyzhm9L zfHyR@_i(8ub$|n(3h^ZtEJDdEkwKlX(_TH%J#)XNe7ii7r=7yeAvLWSO4`3G%}p2W zR_30MNyMtfa$qcnSo(T+N+ooLExZWxJ1Rse-|m?2e05EdYe=!LALlG>?A1mP-0FeV z+V#zba{pdJks8CezoT(ZZt#Y`mZ4o30XB$rddk`i3nym0Yi--psJu-}HHPsRun>xq zMkA6iZuKQeuX8Rl4=p7Z6wuaEH4s-%-zxu`Es_h5?J>bU-189SQXVRtXZ210!{(;Q zpf)r#^ouJzr{V?Wa^gI_%%NQ-69on^j*VMu`$;m1B<`J9GgWOg3|3cqJo!*KH ze?!)Ox7FJl#Ap{C&wxu>2oQA}5(5;dCZFhNZKx9z6z7VSOihZ$ve1=iXp2T|W>Xa9 zF`44VAz;b|Rp5Mxz~+!7Mjy4K@ve>!6=@Z}Z{&Om{5u52p+wiTD?TX+yqD2~`2`7$QWVOG<@FOhtN zbAmiwMx6)Ul07M{p&o7`iVHE`y17k*pa}#mny7kncs>ks!g!Uz9%K|0 z4cAX3M5+SG1tUs{%oey8Z;!mV=;9lUQZ{jWi5{#pdlVHF0Up1^8w1=(RuLN;2}vXn zn%QmM7=q9F6G?Rn8qj0Z>4=S^xbxH~DA1sba+)&65w1;J6Mp7QTtC;*?+@T`_iO0g z7@>@*1TyQqkCF5t;1`+qL#_CGZS;;HGR{Wb5+jhImA4X(3C zkfxvo{!stt9dgm(8*w{diEl*ik;D2FZ^1QY(LlH&0yV^ZSzmt}%aI)!8Tq}uSRYF9 zgS+!0QD}j#u56TLg@7h^OvQDQCzu)B+ecdicXr+KYB)=wD1}M$juP1=t^<9*Zvv7L zOdaHXiNVS7%I)ek6Z#b{WKA2cH{fiP8EksAaoBR7D5RX6oVsS{l;lWtK_9BGudjVK zQ!iiKCNEJdzmN_b(73S`i-lYD8*uU=(PQdJpQXcD9Ymn7rIYVPsqxusde9)+LW$?j zU~K^e?Y~?VWC#pJDl03gU`5c3Ken>eOnE;1+FS9Bnm@`ZZol{T_KJ95HF`l8g_B?S zVZ!T5u+Wz!O<23JI_exuqI*iT#gL5-Z^~e)D=WU4oqZF|gN-MmeW};{W%Z<8z$F_} zLIA0mKe=|cu^ANWa{M^r8y6FkO+{dRn{Nty*JZj@{Cwzi#+hqPKb=o36eU7Y71v*4 z9g(`C2;!jZ$z17AJc1!|9L31#xwJ<|Y@S}(Ya6b^HfXeQic_IhrEJfUeBw5TAlY0) zuyFErZqYTGAqm=MRWC(YPA^rwYDA=@R2E2`0pT8w%|=lcMKqLnlC<(xM(81c$iB4l zdT+`WGm_u|VAG*^iA_$Q znX1sQUGsYV2sq(k3rUC`ZvR|){)~KUGYTIDe1F6*kf(&lD*H`!2D21t@4bTWx!j*#0DwznTN3ATe9b_e=h`nQC< zQ;2Dsaw1r4&gCh17oot5KMEKDSg20SDy*s441JV2>btUHGB@w#v2CF2uKN3~-$}~b zYpC!T3XO;rxb0+rZ*5tlU(VvfWVhp`BRqHwCdtJ`ME0B97r((0ilLQ;JX45Ki4h5O zD8H(H>-;v^qJ=d~@RHM0;eoh^I}!_qBepMn4}DlHQ{1>(yp+XAAQbe%RXh(TFhsLj zAKV{1+2e@~v07piZmx60HQI;GPGeRy4K7zoiVaatHW?xIO&gd7(OXq`uWW)UKffuP zf&7RYnoe4$Tzf0=l%iOhqiCzKcnrN=Si)08A1TtEmM#)Xp%O9ZBh;Et=A}!n3x>$k zB@TVoJ5{GRApiWyfGzvb0$EjK%2W3T;%_z4MY5$i$AC|cU%9BZA5ZIU-tn{vjJdjh zSOqB>#^&bl|EuI6r7t-%U?XCVg`;4d9M}cJn6|MfzVXqSMV2*=YW+hBWt83&H=Q}N z!aDS8wM(JGL{t3E!pmV>91aUjd4&Ahknv1 z=}elC_m}@{FVA%pFR<*A>~M{rA`&~u;wdk`Zh7&)Fo@ikq3QU6l-p=fFauw&C@1}> z)Ze72FIb|v8fX=8Y1%6z{4^r;NY%6L3@YkOQlgG>cDrWsRTqns(ZylE0a*ixZ?~6+ z#%A4tqIlpN6;({CrBS#OOWZawrh`}d2D<3JS{l*AKDc!0)?oT{%61jHXNu{LV)jIG z)8&~9TavHeH92A%)Gp}s6))dgHezC8w*FM#a&+9Y^F|e=R0>zrB$(#6`WuzTAjq3jPDpWP9Zo^_#)MGtHz$&UT(%A#Tmh&7SWhb>!G25C(dzmWpPKLUoUb+D1jA zfTs38jXcTA9eu)r$sO&MpUt4%JLyYwcJiJN$^qK?PWzbUF$xOTBXpNua06CjS=K z6Q8P#s^z$-Cmlr}Hkki|GllNc`-;HWGe%tVzCs5Ozvc{>JL+YTe`79a;{OLXQ&d)892ZXGWvaR;BzHQ?H!7(@c=aS?&GJ5GRX) z0-~$(Hj&{~{j7EPi;=aF@e_qM%j##QoWCe^G#zi8ijuN9BZIW|`0`iCO(90~IP6Y@ zO@*8|o{K|*O`xI#kJw+p!#kn~o`o7!RDKI$bNUxiBqU%j$*cXyZM zsr)^-mlrgOUTx=$wdcDj<|&HjnVdPRKNw)E0-gxa`&7<3Rshcz^o0$8$n>axKiYed z_DatwBQLK-XvMo9Kz;>-&E?ddEK7bkdu(q*-hl$zO$nVov)8_ z@n|=Vdj(2o)=06^PLg-q@7sDs8|-YshQg0TD4JQiu+mf_>|K!yija``sTx|xuANzXOkR&x{fA^0bQv+Atx;J*bxKp4wS64cF4|4c!wgzIkal49x_`saw ze`aC2L|8C@}@zIk%f5j%G4rjXc z^#cggWgIyu9=91K0+D0>o8+tiODlc+y#Tg!R$%mU_09Zoy2iXa02{Jdr8KWmi97Bv zv>7-^^lNH#|FoVrOOiea7XIm#*N7VKJq>(xjH?1Oh!xpR9KbHl-MtR8?xJ)YB#eD5wCqFN(sv}@mIlJXxF+EF{Zin>AdKfe=ZvMP>v&3 zV@U~-mIVv(xAeCi+vARYl;+XZmYMntzou06+{xz(wCR1$5KZ?0*de#hDYmE$3E7>W zpI;r`xP7adHYbPjd6?zq;75dx)b4v- z^PCcDYiFlJp&CKri1ZyRHeh7_CxwgH%J+@Gh zOll#_NA-U(letFL^>l?_!KC(8gofa{hoj>dC=;K(>Cn<4+}bRm|IAu(4GVx{^248m z(?RZlDNx8~<3iss+1@Cx$V4u9H7?@@egL3Hl!5r38AU9#pWENk{B8NqC<@i-zs4S< zR*qOx+}mYKQSKP0s>b4taLhofim&SmpNJk>>$xEh222An9vJx z)G{=+$bkhX4L!IHg%1{pCmaert~^O;s9J39kSYp|NVTVjDy`6_mG7j?KZ)Z?(<90h z&Zp!)!Aj5!5R@eflj1E>3Tp)v)%Y@2O54%{UjeBf&|owv#Zf&A^Clz~!PC9^^muK$ zv8!MP6zo@bhqYN5OV8FHsfT?Hf2+&|pq4vc?+*_U-&?C8b3en4Kwaj~cW(uEAvhho z=*yLxX3Etn!MWH*=A3P3y_=7!Q=vPaVzW#*jVCM6kYd=6&HSrTxJVe*(CQ&>9>*=A z-jvJ~RblU#{puXiIMdm0AvBiUyws?AIj#HO_V+jIg<*lHw~voqDbNyK1J$_C|BH%y zI5aPN^s}{PvMDHkSssdiktQhn7fzY1{r8`?0d+eOOUu&$o|qz4J~7POK=8mb7s9Ta zVj1YfW$DuO?kind)r)(f3nTe#cZQOhYOJ{hQwhFsB*@-G&780O_TIsZGYJ@ZjK__e zBE~kD0U#!b7F!iz@By{>f87sXI`99q@6Kv*`QVIi>|N$#f35eepxXi`4b?nR-sBaR z7=-mhQ(f~b1CfuYV$jbsTiSxT8qTA(NsizMri38x2d$?-pZU!&^ zOGS<;4Naoty`+*C1Z&9uuL?50C!9=D!`CQ;H zqn@=fQ1qeNTLT0F5kxLGZgshj8>%$KQD>5K=je1%K2XOj6R{Syp@IY9gO=XHf%oj_ z*>1(|Y64#ZXHyb#2ARtK3n?y4n@kwI=y2ofvb4QwhJz!Rfym3~f*17&B-Bo~N#$i_ zxhH%E^4r_IE{)XI&~Xc%M=B&`aEJr`M8KDC{8bo{sIaFI1bwdrzAl=InyM<{%(Ci> zr2P8NZ7?5S2POQ_6vxm;6LOP(*bCxdrvQXyT_Yb99|ELO>a-7lg)>id^U>Z7-Nn`x ztS(K32sX|^$ezQ0vIO*cuRbJDR=+XM)C?Z#98pPP*5{KzR~7WwWy=e4*IpV~HrI@% zN2R~Z+1!(8kNK3~Ce`SXs60#a<7~-jnzjWPF5dzpK16<5eg1QhKwj)A`#0k_Y8X5! zJM^2u+pt5~Gw!bkSlHOPUYuy**+01NGV}7TwRMvQfsN#T>4L7-t34-idgg;NvYYbS z8l~(zN-{E0g^A)nahYnHo10$y(~Jwr`g8bnFIth;h^@-Ec*!z^OXKma;1Abo94+{H ziiT08UjFu+3slGnB9z^I>Lr9r)nzeBP)|XPQvAzGilpDNvF@6CTDSoANOqtReh%3N z7gVE7k0xI4PU94Lt~I3-%9IY;t=7`Tolj0 zQL$y@`o-GC<*zQ6;Uy-xsGJ=fMtci)mu_CjKY)D3Ccvm&1O*PL{+8c&-3e$m6Z`Nd_Ig5GgzL{{;r?sm-Fp?)~|T)wQ+0B%g7h zL6y&A15?w>H*|@%f5(GQ+Pb>_d=?%Uiy-9S$<#03)+DkgDk|L3C8cPDR;`mPOv(Mg zx-|4egP%j_bH9BqdfEnEv{2lQi&1i;6m`ghX3rgx$vS{$cAq9agOiI31P0%xeZT}&=+)o#{@FYL1z9>f zI}<_HsWN<~Fi)6n=?qLSu^D+p_2wQSO5Yg1~{K1^Qkzcpt|$#$hIunfp$BBTgH z#j8XXT+c0iJ-eZgm}H$^!p?YU0b)R9{?)9Uztn5jN5#$4bR;oE!qA+6#oM(0b%a@B;ud{f{ zRzJ}P=Qy7z{Kst&?m|(KuWJ6$1G_Cli$}gQFTHm*oQyFAK8Az~bSD+~+LctTIcuD7 zs_2#MA&#K@vOJ5Zluwc9P-2~kEX+(69R*>et*FTdTwnlpe=(!+tg5d-ss}4Rc6Ros zSDO`pWY}in^%1@K+@aY>vatYe7UQWee`3^#V!}oB$vl_;1C<4JjhJc)gSd;~>10bh$Ugy)Fidy%-mk<|k znw!&;nt?BxrGmqNjBt8*UyjUS1$~A$%5?OXZbDoO?#-F}YD?7LApztdvIQ1Wx1${P*UG;vLoWy*-URvg%WCo8qIY($hNMWD{M5)i7{sG$YMM$xBcg z;##1OU^(HB>^8cCS)&B}PU{TQOCofyQ0WoZ7_FBtMNlo$$?6?NDxwpX2tRoh{>FcJ z2`e|NeJ^UJl=JK4n)1uG3P|U^UkkxG0s){q-D)vlH~k#MdxPDZD*ao_f>dE$^RhQK zf+iaI6)vt8oJ8&2yy~DJRfzoiI)tGY~&k-iSaT2fKza0ut(Vk$ok;vtJZ+{=$Q-hCNJQw z0vub{eXOu(Gw>t*4?Y7jHvCHnHuB4*{O<&|p+%v(vNh^(3O*D#U1qiS>3QmJS(k^q zr|cNELe@?jw|IepFd#;LrGPHNNH0FGe0K;uPeOT;Z>)DI0;3LYjMSz~v>j~6Su{Q>gvpuM>3Joa+=A0yLTrR6uSH*;eYU!WAj9MLCA4-{}LT?AA0@*Umovqx- z%W!UmMrqzkYWzpSF;U4A;AeR_{_o?nf^zxq-#XJypShi#ootHeas%*>8aeO8SS7N) zn*E%}ygc})c)m*EjUkWOxtb2P4uO!D>t!oE~jP`cbmLYR2`?$q6d@Ct$dxL9ia}%zt!md zo7J){oQKydFKHsktKJ^71S`^Gz74$c@Q5prP0!6$rwvM&QTAXmfYVTpbj?xVs~)m& zP0*1a6x-%2H)L1(Pj+!l4P>OX#6fDn3hZA;tOvUnB2V?J>b!o^W2C@?)M1#k^(QZQg#R1oR z5T(nD9-fqYy+*fKqj3+<+RcXzWZ-{z&yM6KYT6+#l+%Rl5R+>pDqF6~a;(L$Y)C7z z-s|32c&*(eHokjab5;stog%fhvigOLEO}mUarAtQS?W7iOk)66Au7TNo^%*F`OgNw zYoLuV;G|8{;*eqg4D6uSNy6{@2M*FV37zN|N9AR33rjOg56a1}W3Fxd%!t-EiiIXy zVMoAr>B*x!_ze-nyCUEiMuF#eOF$#xWYeN z&V`kLvYFEeyiPVywwm;0VUm+d9apn>#%&^*G3%(~+6ZfSPU>$z?h~vf;87#a5l=xX zT*ufMl-LN-Ux9WQR0ZJ{RzHo4P@R1^O9Xqjs4DasPsk;DZm@B~nvSa%Qsm!o+9Dc` zzQ$r*F}aMO+ckfQ4LJbUC&fer59coHdUAJ2Nd9L=#!vFjwl><0b-E<~7f=bW_CuN1 zyg#{#&P!@psCf(#MZKq(2-o|dlsa{~*9f9zr*=@8?Z6vcE3Bx24dRM|9GjZO&F@T3 zPTJ+mm#x)mrO3D%!4nud8vb{8cdg&=JFJ;yHAIN6R;zB06KxDtc8?pLr4>a^(rUGA zYHG@6XJ=D(2JB>J6B!O>K0x7QZNiWkZ*Ong;^Ly~S`wA?yas$}Hk&@`r?9s+b~w}7 zxvG=knYoyXGC{85;#u4SrTE8}Zdx@}iwtjaCPhzUQqN}7*%UMTjOnC^77Y>Q3g`|) zgo^R-PN#EDMlaII`~AL8`b3dYZr;IJJ-@K9V7Xk*Ha9mtSJ1Ku6pf};Sog_)h zP*ppZyeG+^s^-V(X4Pn<`l;1wDI?ejh!Mv3_V!%HFRR+oiKu?RZ_CTep0h=*Z1V{%>T#oZ2H}|mPu+5&YO6A_pr&b* z;~sI8LPFL16O~q!ZKcywSu{c3HLr(9mhl0L!M| z@7qToedG`&^>vi+Jw86Ra=CoYjXvrn@<7lF&@(W)&8l8wyWRG%sY0ACL?z8Ey=hu@ z5=G(^6rZhDNHlk1`KZ+s#~lkbm&>I@#-bZA*MrI(-A*+v=lzuk!%(oo$8ngsR4RFo zf{m!`ZM8=Nh@wj5nJE?mikqyiu6hHcP$<~K!h)aEWY;`!ZXhL(`ZZ}4L6S#5UIChT zaq5#vn|x_$$(EOwJz^=GTd7oRV`Ibm{eDWyhxb+j=;r38KL~}I8FZ!Gg04?O85QKI zY*<(*tJ0g$2&c;YdW5KOh!R#*3o0gbI=#&d3J;mjP`4euCY`ue?@^wUPH%CINv&41 z`T2P(l}a`?HfGnaU$>Q&6{nve{6HB=Ux5kcxXV>{=;-LkDwT>=DwT6$6w$^=s{@8o zy4|kL&dz$J10xGwpk~&pk*q@~B!T2a$_`R_K$y-KMLIPsrAMQKGU^133eD!`rt5I4 zoPe^o#>U3%jSrR;`jjc7*%0kxzxGh1I@_h_S43C9#=?Ee1#DebLZ zuiNFzm%SH%<;oQwv2VBAK7h)!wtldlr(7rrCiSnn+{X-=i$q&N89V)c-x`gE6JW_t z;%93jM!DDRb{!4Wy6}7Cj8N`A>=ZOtK*jJjqOAhbu zTD{Ro$rEeaS;alLr>f!`jmp#|0FRL9+NW$Mxml&WE zPNRA|=R6mg&*!aic9E(`ucL1h6BDkNM5tCq4ui5+u3SllYRIvaoa%&ADwW)@ow7FK z`IN`ndRF+|%xpN9vt#kJ0QLpki8ey~p88)Xr!q!RH&@T)tb6ABpyJ|sUneFeY-VQ0 zC&JZjkEWY?Uls}lXSkD8Ym-kCQN|>bVzFqgR?Di@>PfL!92g%Tx2spL+Q%P%Y|oxO zbDkWvts;HVniuXJ1Ex_uM8mFzNxTx8&1Opfh>Tt>4mEu0log-d>-AEOG)ih!t%pJR z49yc11WL|u5pocPx?^~zo+m2sy`rY0PHU;$U=;rb|4`Xsevf1@-dB#viHQlDnws+Y zPi2;Cgd7?gaw`AP(UB#$ZrwWm%U}L7xW2wVFh4)<5b%u~H*9Tf%{c-p2$3Zv1E$Y_ z$@==bmxHlPBFW+5QC~-#LN8=f zs29cVIXXIW9c%T;0@2i6c6fN`4Lcaru|=+~b>(u|i93oDkXV8ffEqGo6(_t%oY8$k zLQ%WCF)}dE0_c~#`R1Fyd-CMT|7kQDL)B{aq);dfjE;`l!oq^h&CS{B>Z)yTZ##ez z?F*G|#q1v}n`n)!D;NZmsUTf6k^4waQLR=}HphB#5IfuL_Ni^NocFpD*flh*RC|e= z%MJqZ+}qo8rI(1tYL5Ua9bj1OeNg*TLGA49q=tJn(kP{$#X#a3opyoV0l1W~q6)U! zlE>j@X=&**1>85^eDgoAU%%cN7#Og%wY34V&SJ4>w{G3??wKmG$JVrJ3Mg-1q0R`= z&dkhMu~_u-D89e8XsIL)4h~W#TRJCs>Cz=vpcxcZ6@_O(8kvY<_bE|?1dQX0DodSb zR6U++q#4G~a%^a~lZQ|&7Ohw;S}vD!%OREi(ZLl%K_E3gi=S#J6cVudYy`r z9v&Xr;QQ~t|Eo9Nc;o*U3I!6xlfAt?8y+6E8#iv){QSHlco8!vGC;tr*X#D=$rJBY z#3%xnftx)sG2t+5mVK`>gW)5xOIxj$BWw!lXnn7X6Bj=16sq^P;w5pwMUhSgq9T&W zXJkDnc$(x%JPe(s)I5lLM3Spo7x5^e(m+d-&8a?|8XcL1p~=NR$-uxs?MFZQ(SJRD z{P_R2TCM!@^76p!?5qoHzW(~_?r9lS#&rIXx>sp(ahH?zgFmn;H8WRw77>O8q!kIX z282ems5ME7F7W)`lP6D7Lnx8X4lKU0v5~^_)#^A}Cp8)k|4wRs5Svo;G}!4J1LRjk zP97o^2^EI=VgQdTd6)*9K7*)PsVp>T3eIQv;SYcK>%af~@Bgn{F8@cZRw|>8Go12?%-o`!qZ>142)6Ik+p8x;=07*qoM6N<$f*jDdJOBUy literal 0 HcmV?d00001 diff --git a/companion/src/images/simulator/JumperT18/left_sys.png b/companion/src/images/simulator/JumperT18/left_sys.png new file mode 100755 index 0000000000000000000000000000000000000000..777f996e42306d177142d92f6ec0da0d88c9d5d2 GIT binary patch literal 38021 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≦(b3W9=qR8JD39LY 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 Unul#n>Hq)$07*qoM6N<$f|$hiTmS$7 literal 0 HcmV?d00001 diff --git a/companion/src/images/simulator/JumperT18/left_tele.png b/companion/src/images/simulator/JumperT18/left_tele.png new file mode 100755 index 0000000000000000000000000000000000000000..3867d3eed5f6c1b8fbfdac2fb999b93b035ad4aa GIT binary patch literal 37972 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
lcdwidget.h
+ 1 + + + ButtonsWidget + QWidget +
buttonswidget.h
+ 1 +
+ + + + diff --git a/companion/src/simulation/simulatorstartupdialog.cpp b/companion/src/simulation/simulatorstartupdialog.cpp index 32d343321..b7faf0261 100644 --- a/companion/src/simulation/simulatorstartupdialog.cpp +++ b/companion/src/simulation/simulatorstartupdialog.cpp @@ -86,7 +86,7 @@ void SimulatorStartupDialog::changeEvent(QEvent *e) // FIXME : need a better way to check for this bool SimulatorStartupDialog::usesCategorizedStorage(const QString & name) { - return name.contains(QRegExp("(x12|x10|horus|16)", Qt::CaseInsensitive)); + return name.contains(QRegExp("(x12|x10|horus|16|18)", Qt::CaseInsensitive)); } bool SimulatorStartupDialog::usesCategorizedStorage() diff --git a/companion/src/simulation/simulatorwidget.cpp b/companion/src/simulation/simulatorwidget.cpp index d20e34cc7..f70813442 100644 --- a/companion/src/simulation/simulatorwidget.cpp +++ b/companion/src/simulation/simulatorwidget.cpp @@ -94,6 +94,9 @@ SimulatorWidget::SimulatorWidget(QWidget * parent, SimulatorInterface * simulato case Board::BOARD_JUMPER_T16: radioUiWidget = new SimulatedUIWidgetJumperT16(simulator, this); break; + case Board::BOARD_JUMPER_T18: + radioUiWidget = new SimulatedUIWidgetJumperT18(simulator, this); + break; case Board::BOARD_RADIOMASTER_TX16S: radioUiWidget = new SimulatedUIWidgetTX16S(simulator, this); break; diff --git a/radio/sdcard/horus/THEMES/Darkblue/t18.bmp b/radio/sdcard/horus/THEMES/Darkblue/t18.bmp new file mode 100755 index 0000000000000000000000000000000000000000..c1220ca1b707e5d86b0335ad7d9abc884dccb0ca GIT binary patch literal 164938 zcmeF)1-PBX)iz-23Z>Mjy9;%9ccDtD0(JKmx8hD)T#A$676OEXAfzZE&(vK1^{;>3JT`Movz)1Y7}N6pJIsIt zrn28tX*)2D|EQ0VOXA5Er_SQSKmYm9LQf@@zA0g%cJfCNZpvJiWF3o>$6)zn^8Ihw z%|inA^sj&YYx(VOe_MX@o8OdQ|N7VE`s=T6LHd`!{AIcBy6ei%fBy6Gv!DH}{NyJ; zDL?-4kIRpK^rP~_AO5ghbImp7>Z`9VS6y{gx$?>@Tlm2beo%zVF1xIS?|=XME&ks3 zzE^}xF1e&!dg-MtzWCyc%Xhx>ofa;-=%RArg%_3!F1X;vaQ^w{7va3~&MW7hd+tbr zzVvCVemvuwPeMOW^X=D@HOZ5<-mIT2$c2mqG84$}+H0?E^8Cdwe$iwbdEaou4MngA z_Tu-y|9$!6AOBeX^rt_SKmYm9E&Sy#e`$MVzxwdEzx}NYhQI&)?$(LS|pk3NdR9}CCVWPUp zPrpkV@3`ZRWmwo@haJjI3EOYKeM#7EyX}hLbJCN=>SZkH!TDrugR;oyZ+zn$Mc8GR zUCM5|?N)Z*efP4*9($C%_S&oLv(G-|o8SCq*>Au7%KrQBe`7fCzyr&nhaOrEKm70( zjyU3oa`e$hm*bB=zRaCF_r`GY$tRZu3l@~qPd~k!dFGkrTi^Ot(?xW~cfb4HrpxFy zdIHb!%in)FvxqO`Ku6ib4}IuEZEyD6bI%+1XYalDZhK^(gzQznUk4m;K=EbP1QzGZPCYZ?~!>z1BsAk*{#_dYLaz?B5t!69MSU3YDq z3ctj3p1th#3+`^a?Y1p!v&}YT>#etLVaqMIEL&``McI7w&C6H6`qi@Orkl2~$tIhW zjW*h-Y`Ecu<;!3Ga{1J!K2;VjT-bcq+ya`DX8b|NEOxvtQZcU{W5= zz-XvKujh;M{&R0PK8t-G3_X7Pw0c?hAeQ^j(t|-i;Z@&f()#Yx>2I>QpHJ4HkEDmi%Jr!%Hp1t~+dA?qb}3op8bl z&HmyE-}SxkeQ&chWC#1f9L&OV@UF~RCFc_77wMd1`gHR8b58QokA9OD3(4z0hf~Uu z7Mou<)TalzqfXW&-Q!Pw{~6{|H~8zZn7mh)#PeK3~(Ge(~tTuXFD>ZIJ~tSM!Q zVMdL-GjLMJmio=%9p)YP;w(_!s^go(yOn& zdMoGWzWwcQFK>F&o60-i`Ofl&H@u;|^{sDhZC?A@*S31{^rhabUiGThhdkxD`pQ?n zvX#q|*8UZ*ctv^r>tEmUrHyHR+N`?js;!<_o8+r6&luv@z3z3b4{3E$U%qtuH}^hI zpDBOyo8R2Vke9SF^AVfBv|#;WG9e!^oh+@4T&2l&jWyON?|%2Y%UWx#Rn}Z{%~mGQ zXF5z89;M}d<};sZX?f1%pZLTlTHY7G_{H+cPkyp|gFDyPk=}Av&b>(UI+~+>Gtg^}~ zEq=;Vp3>^5C;hzVJ+D0NX-{i;&wlo^Tc6^mKmF1yTX zt**BERwg#Kw(4bW^uO`+!G36~u6o*Ar?hh15R_}r2C72_^2AxMHu{e3Q*IpftvO@r z2hNnksqwUdH)CcE@F}f-vLcgUQa#+(ufEhJ7yTK>x^YpNd1)^#RxXdMrRA9udCOCV zU&$j&GSZ*e7y`M7$)6nbZ!P9w&dSN-BOm!lvq8?H-ZjbJvdovv%{vuy=FDk689Pcg zYz_I+5!RPIA`9y$2Xevz^0l{cLq_nfjyC)Ua)MiZswXcPlO{vhRY$+_?71MVPvwI7 zq+GxJXXS9Ce{10iT@g zl!ph(jcfm2@q=|AQAR)?QyPRjWE(&{Q_Pt9MM=i0^;d-nm(_ztk8 z9hpdL!?(aw<<1s-bV1sALVxP0s|}gLgL3^?yYj5lnCc1E14rgyp3>@(5gzCp@55>R zS~FRwAAO;neKAjaWxd9Q@0`&iH*KspZR~@6CO`7g-hQfYTy>Sp^I5*M@yt_RbgjOX zY3J0Of3=hLeuy^Cuj;|QbFFi;&-zhUTleqoft-VtJ1;v!8=vfyX`?TB z%G|4%xAxljEFY)zt)6^o^WI>C4O%~BmAuS_tn^Pd+W8D)#aIr)*7I`Awe zM;s$pm?cAd0_Wjpbcy{{Zf|fwUpT71G4zSwaBolT9q!o+v34*JKEjf^>=EwZFg<4M z@EW$Poh;5e>#Q5^se7!>B!|Kmb8vTt-{eNuL`RT~v^A0eTWXDBdd@zP8(i22dG?Fk ztlR#QyM4zE!Cj6v+6wj_mQo+~^#xl3%(}CIak%x4ly-0k^ZHJ?IxtVa=N&0~pq{xH z!&u>(x#`QgrC}NV;6omKnKL}Vp!LB3T>(4x+*;IwHS2~YeQ6`#`p8b3)YW(NgE^5i zOh>Pfk+GCnlXmz*w({`FXY10AoWdvTx7O$c<&hKpploGU;vIcUI z7rDT?b!dlI)=Ca!n6=8YcI9LPKe&NI{5bfMFHc|EyoBd;LF~6-;aKTXZvLz?2%xP>1AcG3fs}ubhCW#Fu}L_o{`ym zd4e|K2(0LvOoMT{(mtA(IooSzQZnabySI`rmM_n}kaMj&D0cJ7PkwSs+e7zA>bWO+ z%wrzY%H1dBu1FqxtG_2c@rmuMt3UO%b04T5cT(E$Yt>Wc&Pre8sGf59k9yRjTA%L5 zlxv^6FJl>#@8aG{9s0_g=`rQjr(D1AZH+Jpr{qFb_zjQtL%w~s56bY5-cV-$l+j0I zPxs&${3_Rm4#6>c4IkByzENgBV8fW&Wv}F=OuoJ1=dowjEVdSVYL500_q3liYgYUI z!?MO5?*f>cIa&+ZTNhnoZ>&MEH*iZIxsNB)U>gT=r!Nif@nO`(2fVR2+Te(C{!BQc z91rOj_2HU5Cr`M+Vfcd^X*h#D_25??48x>#z^pmLl{-~>z}=E^{b?&tnKfH0Y-+0x zercQWl;;jv9A86U+UQ#yY4gyhxyhHO4K8V?|E$Not-A7*o3k-94{OE~>(y3$a~8Bw z7EUX}MfKFDAK=nGvwp3aTrx-F!Kym!15Crey~GcDL8sw|y}}(q8V;2Ej2HG3*L>Di zTDf|B0(ttUXZ07~4QI>)-^~l|aEA{UuK8Y4Z*ThaOqm_$n&^=DyX4NU(r@k>*=2zY z=qNJ64ejVB0oG%Ga7wwnJPX5@*cbKjNuJnedm(Kcc(B(Gd)UL8-ZUTkZhr7brUKnA z4_;ux9>BgbZS*5gxpm-)Hu_Sgo-)`}2CuLVN8t+&z&;Map?;Oi*It>=u&*z9IA=c6 zcm><)n7evn^GTm#pUn-QjH3^2;5;1Dmw75zpY1Y+v@$j(ZOv0#duWcvjJ<+W!5Y)v z9AQ~M#)WbC&bf`fxA!;_-6n0X;R0Xmcle@=ouWteCDxz1_MOkj&$WNnFZgT?&I-XF z-^X`?JX6fyO!LMan(rXtI-3Hs{84kKJJ}sFqz7;XFW3xx;e(NB_@bO#@r7K(_&~9RcFhl#@IXCygOP9uK42A|lv|fQ zf)99uN%&C**5#|GKXt=DxH1O;*6>rAATK(`e3XYnI4Z4AefzAA{=*^V<`mu1&)8D|9{GWI#1Fz*`h8jXb4N~3L{~e%kSAX`eu_M6 z!vS2t8*(HMJc4_eS0)cH@IyX-j6Tu^cfui`$=$oN;f?*VSH`uMo=e-mM?B&YO<%*C zV2{`2iTUDhll#cG5zV=T(pBv z@{|2Am7|Z;uFJ;=AoAI<&t{%SNta58K zU-h&Vi|+`z0?n2aa$i_6JAs17GYhUg3&*Y>hNMs||fk zCiWgztiid-8OPq)^Ak@z@y73s&NP2~r`;UM60g})`$*30B)Pc<2oK=iT5*7UTn(tzbH3_PNjVxew~4j&y>&KCN$`^#y0?1J2~9yl*3|Zt~R8 zPMh?fa&h|T^U^kX>Le}B`1q|%kj~iVn=)hKP1Yb^TAp^waWdudQm(G?| zMV>xzi@x%XxiWotcbzZDCv!JsKj|HIkAK475VPg-`=G23DNCNu(tMJ^Sebk}SX!Jq zWDsA5jFibsx{u`x^kV8L?}M^F(5*g;6WAMhu#-G#`GP!g^7xJ^W5cAyf-*KEpQV$R ze0$uNODhY<9{SLSwl&yOb_GZ1LiWSn@ws5Z-pA(1V_W3q9Hc(J$a60MYwF2^FFbOO z$6vG$WC(}O+Ri!bkGa$H?tf?UkB?>_aGX7aXZQSY<6ecXF<-U;=5dDnV4wV8A77NI z!{?I55#=}}t)9NMmG-?1Tu~o)*c{(4As_ngKKHp#(~&rWH{yhF$7kt$PFhUveR*G& z^1-~+&p3UouFu2z?em7U(Y9YhpH@G8_w&(b|2gT@&*zEav==9+YhT658;nyf=J&Bp z_yfcCk`9D_dxsbJV(;+9e&ZEiN*)`6BR=DXJa!0QP5}T<%_jqTVaYmC5n~2wVfj@K^`I@)$8tlV3Igy#bmV__(KrZSj3t!}^hcjdz zzTlWN4)M{H_@4K?XSv_~?$>myy|&MMF<577VspX;c{rkO?1?>= z=d%!-B*v5U7aPSVWb@nw&@t-y4jf!MgWFHPFE>+vzQ=j&vBx%i;xHZHdxi9b`O!1( z(LATe1^9-2a=-^RhaBk{Wn_k1((2%la``wCTNU3-9=_n1aoJzzD84vfo2?7($x0e$ z`n-IGtEuo|ux-YZukW6FgM3g2-Ujoh`nl&q(y*>yaq{|jSbp-vOA>HKpL`-`EBBf9 z0$1!SEWo>19^6Z_HTc5DNW+Slu2nBK2R~ptMR@UQt5c|P=A5WG}`*5W1+a3;UyCmF5yVQlr zq$i8jgL8F){hlL9FRncG(qH--#vzaSBhA%fkbC zY?5+ZfhBEm1;>0=p65F9@PzE$OTmM_oPD*Y-*NbqQ%?Cm?|P1tL(W!k?VieftP}p( zL$;EQ#C!5l&wB9&KjM#tFY&?ff!uIIj6>`So1+i>(Z+YtaS@lot%DCfxY@S{Jm3NC zPR-f0=L}f}%SlfZhXYF+>lc2~KI7(dVs%n4={{C3pW${`I(dCOtZtA0KHc*`em?hg zk{;wr>JQ6zU%=Mf>t6S2IEXIfYuQ7%zz2H^+xAl#+X4@8E-yAo9=j6GN#lv2FI-Z` z9RWRV|KU=7zmGtl=Us-QjykIS-tIX0lCk`5Fn!_t#~#ADv$=a{b_Q?g8Fz(#dw~qd zi2V3h_+y=7dCJ3q*cW}WDdgPq1($Hk_{LNpm)L0cXlxEX!|R}ZnTRWk%MaG4Gw!iJ zUFmROs&UViomuBMccfb2xv!mvLH|!1kV2ZAzaZXZjiHjWUmb!f`9s!#xMGXj&nC)UZdoVzNV8i>3h2P()T-6 z&ZK?MoupHSEBC$cecN+qWq80x7o_biEW?exg?IKx9{j^QT+xO2qD^cLzNn`SzTg_4 z&S&l1OBvJMu5!QYrLFTXJOJK+JC)S5MNY6d_)XsmfxHvm9mGWSHy5b(|qfQ6k zQ;oxy!8L%7xZ8Bt22swW6%EFCwr$E?qLR&!ZG}TL3SzU zA!i+Hf=irJm%cSNy^1${70>Kv;?M6MxHET#aZf=m*6-c|Z#;W5ck9IsIt4GR!S80l zzx%i&k36z*McQ`}4m<3ymX9m)_@eUtX2I;)vv1^;{_seDUg)=S1iFw+ZYw-3bd~=N^6N%X1L2Vqb7d8|MJ{z$aXD&X|cm z|K5=2jMnMh8vYdD$vY6%YJT`c56}~A4O!ujwc-NK_`N9n!56j%U)UODd^UVZ8rR4m z_au0uZ~971&yX?yfIXg!H!wMj15?cl)<+#r7iZFM@IKWz{Gm_X3wZB|&4Fk872gb2 z^8SnaFYmO$OwROt7Ww=ccMHnxEkA~?gbDU0oTIaGP=HD6f=_nJSadeOkN-}W&(!;! z-c^8KHrTxddBpd0-)EiP7oZEw8?Wdab-ZV1ooq9IEquWlzZ(}$`S*r!2w(6^J-oq7 z_YHK8zS(WEbpLIi+LzJ~?=M$WwK z4O^rxPLLfgdDqc7McSDa@6^L9=Vtc?u%RDmXMY^>S=v0*^?fxQp;KXxe#d8bSN-p+ zjnnSpX9=PIGi$;2ehUuq{n4-pj!mer{~Hbz7gltQC)ND14%0 z@RLsB1LKtXILT(Q>wE+DhTJCOjk4(uJ>Ex|o-WR$-yZ)lAU62V9R*Qa_)BT z;NN8&=U={G>faWi3#nl-Yc){b-5p5Q)_4d$P+ zz5F|TqKC-EJ&G~)&HnT0^hw6{%RM+=;Mh3MIFoU3l$`1N3eKk^URu6nE^y0+un(T4 z;fei&2Q~+eaRXNP25gQr-q5Sz4IJ4^{l))>3HPmh4LpP`Sn;gKIL=4*11@3Ac(CG* zP9N?Z{5vw^{=*&b#*qJKT(>xQCm!Mzu z1l%AKwuzl_E+Rv=j6dvNz**Ej;7fQTJ(K+D@jl9Qa5^3Fl5%IzPqRMfOYb}R4x8^L zunBmBFZLB)=zU|r3Y)~Xzy&+uj)1*kgYbr(fqDB1C+>`LR)z)qVOx}`XRn=S=wUda zvz;r9=iKdlJ`;cb%~JB9Bdpa~gFM&|YxPbazFQ9&;k&y5a`XNgoq{9o5%8Z4VMqCR zKGQpN4qMJ2^_iTNvDx$r&ghdbhd1_*&8O$cd0FC3Z;wXF8+}a&XY{!wydm>pb@}M_ zf#1yL*e~`07T{f)-psiL&w{1i-pC7Yj3tc=&bqNPY>hPhNt-u}@N0}=JiLJ&m~gM= z-`bstKmTUAxzQ19fID&=abAagXF2mHC$>fm=hEt%yLDQZdjYnuM`sB3#9FnX ze{e~jdq;N#`o$UCaUX#<_rCYN+xWwHBX2PDm>ySp)ZFR&BcD-*CE-tB$JqGr@P|LV zamO8)yJuYC%fo=Z&)t_hB=vjVus8H1eDULy;|;q6WA>hZj*sk&Kqu=H4(Lrh!6SZ} zv#>L@z4uILCV0b7JNMjko6pHNf@QuEU(#I7+dkqzo~@7)mcvc^%xqvTBASI>>f(%Qf+ zpV{3e8$qXfUVtzBCb-~t^G(<#dg_&f0BykwmGhUYkKPQJ6|*;c;8?ObjRI884&SC~Iv4A@XdHGyF4W zInQ5k1sAo&KODg==O%nJoOtvpQsOZj{aizC*uwLDjybxVSBpsM#Y)*)8l=V z>0x})zx>3~d_KuXEJw$=0$&)H~j+Ff;!g9N3#Z4 zXG7@?vS35lEd42Wzl~SUN$~CL#Ga8eS=k46&OJ3BY{#4qV}fw7umUx<7O8%HFs~fE~PHxBS~|yUdYI zCNI2!b2djCYw*lPIqc7!JGWeV>80h8OD<{8Lw)wH06V2U8L=;T<$16>6y?h39&+Iu zc-H1lLY*by#$VQ<14eX&!p#Mg5d!1sd(X8;`G+go?;p^XVY&Qo~f z+=^;wgwzwXJDV*!3TTKS7mpt1*X{zHb+b@xF$_MkRSVDedM5?a|>>| zZ^R4hreoMC{GhMg3FtfZ@g%{C)i^u}cf|ZOWAc;f zRnKp{GiV><8^q_f_prkM;-}?&L$A6sfD!nDv)CK{zrMW3$S-4G=v>_4@4%9N%mq(i z2)6h&#&ZY77A{z@VC=s!;I{?njPS-Y81{xOmbO-RTF&#hf@9_l{|`e)Ja)`EN_Zk%`(2Vt*8$ zbDw5Rw%>QwS6XSM#vQokbKpy2_r`oPIu>5&J!kp;d=o!Sx&EDBopI?*J_f&x?*~hC zIV{4Y^*G-cgO8&w-Z=ZfEuY^xeVl)OlY{LuKL6C**b;MxeQSj!@?#J9S9F1xuE7oG zpgikkL&(qlTOaTve8L-db@ThwfBSlawi z@I@cS7x(vR&L#Y2&!Opkdj;q0j`NN4z5TRT-p3t$e&Yxfft>$ck>T9vq-I z*bnl_GaLNyyo=t!FSbeAc}L*8;wnDkiuL0UeWJ`cl+F21djVY3FPj4+ z`lWx}G4YMmWpC(V=Nt1F_ix(VaKjCaAI@I5ZQgj}%z-y}z@FlQ=aJ@2zc_>77<*w& zerrP+?2GgKif+;mx$*n-2a9+kkN?GP`RxJg&-X&%ioNGov+MY)ZXbf_nTUh?>4>Mo znY0}Rcfuccy)e#KqsL&D-sD%of><7|xFcf&>{re=_F14uaZ0(q>0{XN9Y+1JC9nW{ z&H&QR0M^8A!ICo%d!r7Wj5m1O|GS0busfbdI=j0kfonWxFWEtJj!l49_K>aN)AC8J z4d?lD*6v(n4ekYfr^ojbJd--8UJ?2Bdx%-q})_8-f z)4>^i2K!TuZwhz#SA+G9Z$5OYdriI?oZ^V{P3{HgJ9k3fLBtE(a>gCBH$89kjf?#C zJTs?e1x1ju%4ZiS&%)`9d3+EfYmG#jh_<=9% zjB*@-cRrZ4lcV*=*Ya=v3cgEf4ByE+{q)nDEyEjkAfB_bW4Io)WXHIE%1Ju{V4c zKAJNQ9f>z|p|QM^k@_h3IAddVa$PVvAq}#_-U&+?l|=@Hqc`$CNKd zR?cwbVQ#pME4V~2;CAl1aEIN&d1oTJz`2m_um*P|xRiS{ca(y1a^a)m4td%;e9ZZV z?jb{G8-9VYacf!TOt|@@{Jq%B{fW8g?9d<~}2XepXK6u=}p?2MM*R{JZbHiVA zaxdWC!d&qNr|Akl6x%>n&LiFz(1uR2CVnp)ghSSqd&TGx<#pj*q-iqS?A6mFBbP1zVQau*$400us5(^|DESy+`i(4vp#zg z--<2{Z|GG1OV9V=osXv-o{^{f5%nY{AQx`R=jrClu>MEIA$v2*usE&^mh-*bKYK2KH|~S!H|G)W3(#}k zt#TH@3w(&Z32$%*Z|FmNOE&Il=}$UXKX`*H@WAJRGkxL>yTfNuhBtIFOyZ4qQ9Mr> z$6wwb{n3wp)Ybrl=Eg^2AK46c#QNwC_@-Ojqgf9hlO4f%GVz`P+3`c^ojku`k9^i1 z4?PPN_<`()GY+o0LnA+Wj4pu_=STa*-c7~USlcjMk0WnX+(|#9;?E#A@>%~$i;YWf z!8$v_{@Xjx3-}&z&VRS}o=G^1s2h8eXW{fD9E3Myk2h?E=bkXd)`UBFArA)A7k-62tl{fGa%#SL*soa78VQqSTOq4d~ z>_wgl*gJa$2e3|`I^XES{gN{btlMw<&lj`jbf-Ip@QPi6hxzm8Hyh$?!`IQLdjYnE zUUi0`kJ&kP2o9Cg*{}<@h-62Vk3xWE=QX)<~}I0mu#a zoQDLu#k%MVYsNu(ie1vTHsq*18<%s9-^*qHjp@A(cArkUDL&b-y5q1dlZ`Pd&ZM7V zJXo5%LB8liUSet3biVQ46YlWG-Rsb?IKw}Hd43aK@U6x6fnJ1**dk@@41Rgezz3l# zVas_b_ql8t-q5#rgMV~6&Z-B8@|3}tXC34G`|fwY+wLUdL$bU0V1DN8`9A#sv@GyD|zpo3vR zd+&w{xfh@}-O;i$YzYj(lQf;{jLq)g4SU1ZX#-EjQ#S73?7ZND3z}Ta&HC`(odw&9 zGjs*qkb|=gTSHFLc+dVuHf##+JB>Xx$M|XR&Q3TJnj3DgGwuwnM_?z&DtF5GLO-yd{8oM+A6FnxzMekWF}jKF z!AH8r*%EKuN0SRX?;I-Fx9R2$UQLGgQI_?%A4Pg;crvU_xPvp{k32YcW^pIrPK`dK z-|U++I{l9mun!ZSr+6-bOLQPVj9sEL;YFaE;l;f`+G%U=wP9~?gN-s5c%h5=i0l%) zz>#VaHesLN%@ZFlsk9^|WO5>FEJHL~ex^$28igkI0#s1JK>@uF< z4h~trby_>SieG$Q9I^+3zUR%G*Y?7={_StSKji(Waq#BbTBNy2|n`E@Cx?$ zf%F+)$#1`m>+fIx`d7QlaP~Gf-oP(g$Y(QGHqbf4{5`X=X1*G`D|r5o3q4%bXb1q>^_y(}fN8_)-h5ZX(U|Slma0GX7L7sH%3H*mA`pfx7tPf{k*rb2y za?j5Bb^3)f=Lli4-?|;O-{w2n-c^Q8bAxYd!+WxE_F#wjYSQik=oLDJ{s@1_Kyc^o zUJV!cr}C`5zdMvKkDk$<|4Z-im+{Abn1lT?FLy4ZxQAX^UQLGiQIz$VA4Pg;IWw#s z{>bO2IdAfr?T0f7-wU>J04DH3Y;Wb;Q#epA4;G~DdpN9U z*qr!n{WE{|gB;~)gCk@u#u0o`jwjl)?b-BQ3N z4Ax8iK2DpP%8_tjN!q3Euo!NKfx??{+$O@)PW-{lg7=2NUot z4~JkQ9H0;Fu{O9sFQ-ghX*P$wvG;g}Q)2eUKGEsULwq3|#4+aqzP`C$b=6f9!F=TT zcw;T@=G{Z{p`5qa4IFY_fnULAI)n^hpIpcQ&-5YIR$7@D&&U)v)WxyX#SitB$Brp; z_rfN*=jR`KS74Z**5f%imp90T)C*Vo&uQ1kgMAF^Pn`s9lNQ5S|2gT2^3z_q00T)6 z#`@~Zr8DMW-Pj6sCJO5GV-9}Sj=v`G<@wFHL#M((_yXV3a1SGNDn7vkI|2vipMQQk zyW$nx_k7Ww4a)gOTfESgPw#w#H~8v2&3}O%zQ5-ho&}BbH=_Lph&AC2Tj-2p?YZ~h zKhpDTvoj3*hZE#Rhmei5Af4}PlA|;^;tReh4_~ZXnjFyuoC9Ll?3bx-Xk3JyF<6Oz?%BTI?aTLW@CKi7 z#on_;@?eC$VN+ny{WadW7choz_K73J*TVlbuo+k_Jv@=$0jx;Riv-CtE{OZg5 zyd~+QZ`-GP9!->1f1axt6d{j@vZ`Oa+)aA41SJPhI|cn}9aiGv59Q!jbJNB_Cc zlO7h}ZnBVZQfIJ_lqX+3>BN0n-NAnPyuq@xwchk6P8)G#k-YTL*HZ^Bz3=2*8~3hk zi@mkia34J?-#)@Z@}2K-0j_c%Krgc?>gAqIIUA#n`uM00Zn&F*Mdt|ihA(H#*dp`u zJO1PP!yEX=8}HUhH*`H;iH^Y$oWKv57tBAO!xu5W$ftMsV`QvvoFH5L zz!!DH7j@VlWjIFHxEtUb#P+xkJM>~DEtHNu~ zZ}@3+x@U&Qb3egPGsm7cqrQ(G><@3OBfMb)t;1cP_b$!V^BcIuBl02}oPceCJn#WG zVw>fM54fN{+pI1=#Qw-rCWKEp^T<2xwA0#r=o)s~b5ns1awep2-1*5PU%sU0t^8i) z?l9#mm*=zhZ@v4VKW*K2=ubU)?mE*i{pSAN+6D8-yF}XRN1nd*p|1Yq=|jHp=pUbx z7Mm-*U~cNWQ}v9@9Oaq6`S6vkNgmxM-<}BS^I_ESSYq*D7xDH?7D0#}m7xmQ(U*f~DDeQ@Qu}L@wU%79C zAu_aX&)@kxp5JH(WA@B?-CIm2ZwBpHcta06ce%%~9zL4=$7N>;=W=_CH?WT%un*f} zpRI$>Wv#GJUdm%rhg$vtx z^~^KRZ0|uRKl|*nTfO=9J099ugL3ti`;8rUJE`Y4tduKLUpwbl_d~`shB2kpQ(w8d zVxQH?+{`)c#QHO~bG3Tfq})1{3)Y#nnX|fNWv<$gm9fZIU2XNLFS<&s4mnFl#`=I& zZQ$JANyDo>vqyBN7>?oG9xF?Kc%WZ4LObKhgAL>0NXm_+Ex#=sgE4u=F}^-CymOBAB)vxy=aca=s4B~v$pZ&(6^|CkS=6quv?#J0g?_#p!xI_1nCD~aI zIjF~`irrmXD}BITc?RS?CTV%>JKvN|Q_o(IqkY6Va%6w(fpKD=jHj+K;V0)QY3`$i zuD(+@^HeUauJVj!?aBn}%sjN0RxVA?r>%a>Q~it&Yv$&&HqvlzEPdmF*c|0+uTOo; zv*+fdpKwE-y6WMBx-f-r;^^Y|UwC2vm1&#jn__kF2L{D>%ige+vE^_HTh`$2D!g&e zJ>7rt*W3ldJzt-_$+OtJ`_GSvzw7K1oLRFnJ_Y}Sy^OCRmY;GyhR^Eob@(^NvS#wm z-e-U9n|%A9b5n3{f9-X!1H1M!*j5h5%3(8@lBX|YNo#{oFfHGh+S1?nBB*C?jAwjp zjia4%I$ycA>gb0pkS8q<4q;3nGgvjY_WB`D^}?g@+Pb8TsoWUqnv;3zUpa1MY~!k9 z?edJ7x-hN}WiV;%*a>yu)11g%J8609n=d}7m-R?nk8*8#KH&+h)4BXiekC6i?xo=+ z7=a1-!3KQ589xmVjUkW!sI9Yuvo}r|m;G^{#@_fo%((viHYi(xH=fhP{yBSDpLM&Z zb^quL1~+)dc3Ok^3+%0Y_J!TiC!G+R$_i!SFFZLyvNO?E_6ZTcU z`PkRs2rkuwLwl-RUjod@3(nOI55zEPUe2cUhuFQ3HCUh68l{y-e_E?{)@c6e3qHw$ z-taDn;5?+gdbnuKupt<$*U{u;4#tF6v2o<93-|EqGY;X6wHuc_^o;{#VXelLR-Zi7 zw;wnJqk=Z_$P@?dnR@yO4~P0&Rm?U*-2-1deENQOZHM)e)NfQ0socLuhROp4sv2s=}PZ*d2Z;gpRdX% zF&A8Pw%5)$Vq>^B@VW0_UdBp2J%Ix{K$*`1T_C8ZoNl#;`Y;|D(ywI4meWhh;fG9&&G*1JXFvUC9I}bt zp@;OTT$=n7)W;osBnz@3LtG&*^S~FfBp(=;CngX1%Hh*zJRp0#Qiq&yNL&5KR^d(h zz$fk5MqJN3%hm+@I6;31>;+um4SB^TNhjc%HMy5E4?J=YjgM>(TLVuxZQo$jy`TG? z9^2E&A-@f3f8FilG+dBJxIqr?+T2s(m%UI2@8hT7NzWDB5MV={a7UVK#pF*OvK_E(j`o)>vQA^-37aKP8}qV$_r&Z6Ug(n^!b{_lxpAF^ z&9CPx&f*Qf&$x8Gb<-ha0arKz)Ap2}p`+9ZH^k-zpX6qq>XHqvD6=o&i`ZxRxMK}? z7rVvo(iLQcGvr1#LO3KH9$A+V&WP31k92Gpo6X-POZD|{9s1{|!LNHu-zOW#AKu_R zzS4>I&Yt28onZdHd*ivMJtTXW!W-?Pd&SYuiHGGWg9}*T@8FUBvCpt(KkQxh-(K1$ zlB?Y#p<-{2NIqAz%H*3hT^(=V>*3%=ln4RBV2b88H@#nwvK z(}8%Tj=4*xoIbYKo{_L0Y&IOhhqmVKyYJ>`T>H+JSU25ECwWdrHtcY8j=dmbb&X56 zO5>I>!Y}oGX3z9NM%Eh}L58>h9XQ;QlQ#O*hxL-J zJbX(YInx<%WbJq^kX`(>*dX#!CmbSEToPL+Jz%Zmh%3(6Y${9|gD$o{?}a%}d4_A> z$MJ7`vT1%(7iRc}cxz9{%HHCPxw1o^7h4a#P1fe^ykp+-^#KEHv|z2cC13D4K^y*= zJr2gh7aW0QSd+HrI3O6?Uc0k$2Go|_p;MLnY(KS0U1`Cd<52jd4|Sbo=z6%br`8`n z&>ueATl$UuH)nfJ*Q-Yk8nz$Tv$u3^f$?Ui-LzK|7Jz$2St4tPOVJ0Dzh(M2uJb1A&g zRv+PuJV72G&EDxR++z34!#=}+z~{>6#PXD>pFC;jJ7*gDpyviY!V-C~v(|=d&OOc< z);kW~uxEG!&+hT?gO0O)^ODbh@qF2{Wox3V$%*XATs>H#4`InZT9-A)r+@`@>@}Q; z={P!(?86axg1*Us%!~zR=9E716Ia=BSb=LigtPel<_RNoVfchIu|HyZiynhJbB044 z=mQQYQ&%7#W5`zzUimKYOyBdt^k-doW1snv{U5uhAKX$-zI+hl>kntxos4CD-<~Ng#x%jOPcEX(akiJV5o_e=|?J$ra6u~VM3x!_H>Y|pfbJjvMF$vO7J-mwYfN`}q{_8D&30BQcCzS&Uq$PqWK zt>=q8_%;SzqFgY(eO0bZ9ekj_qy_Vc?x8Di4-eH7Ys-IeRtg-3PqrvEbs{3Ap2fOBo> z1!MK&;-h^qhP3|7MXat^uwQrvYxvH0kTyp60{6x?H}Z5YFgL$v;rR#MLw30O;0Hgr z>G+@i^rvm#J+GG^?t~Ba5l7%%-!NfZd&!5h_v%P1gB{N&-Q(~hJZJX)l0A2xGGCma zi*Otktc=m zu|{%$Z#D-u@@F5dA5X4j;(hdd!d`a)j#f){iW*@iFV1V7rb5B5N?zxvk3IOb%J z*+X|2-d})sb0jnO7O=zC^A+$*-vYiEQ~!dre%S^(!G4fEza`J5={DyTSi}kC(qj5W zT03}GS3C9b0k+_V4PqOevGeELYHs{4>n1zva2K6^^ri1Uwh#KZ7xD#sQ7?O>4}8G^ zI+}hUZ{v}tvB=ii`GasyUixva_WLK!9qg#zdZH`YV!RjA^W;f>u&r->+GlAPu#eU* zZU1mgxqSN)tiYLi$x9n^f*-+|!C3U8b(6Vs5Wfev^-GTAXa3eXF5dXQDw{&q_JxhK z7Ix5l?Fk#M4423p7p%)#$%9?NBXWWT^T!o3mc|k5&z@XfV!ycLky{0YS%x8UO4!DPh%DumA&gN-+b*x1i=EUZhbYHGdSRo7f z8At!x7@Ob3C-3hC_z~6?A4=cW2T#^-z3^ac>$Prkv?gWb4(sF)9U+fCp`-Z==3?J3N9} z?WFCmvXsN7e(euTTZes>CSS33`ek#(`okmX*cbiar2g?lU1Q)r{=lKn+R~AD!>;gs zo#pr++S28@7tn|A#f;<6zZqg&cTnbKeddni&OP)Gd*j^g{>C0;Kgdb2K6_3dS&Ot7 zZc<-f0_;g=|Lvvyh5>2$Vtq?zJbS5M7*S?C>2MT2ea12SYJ9vSd}Q_nf7p9-_PoGzfSiMUKgV4QxzZJ6WFN`X+Q=xfk|!NJ+YfSvKQeR9=Tq?y z+!N(K-x=N6lb?XEd^SfukNwWG5zoQsb>|s-BqUAOE9V>AL-~9q z?cFK3BPUD!lCSw$hq>W|&tmI0H#SGi4#5Ul`wU~Ss2v@SGjIwkcw-!8#^zJvjrzV9 zGmbxZ$j+F~ldx(%utPSv>tQ3E%it1k?1McJ3--}k!y{??BiL^k&=wD@-?^SYn%J4% zotWn^d_up|C1&Hq?snw)O$foiGbz^2Zw}}y_3_&?TK>4PVJFyw6>0LuC3;ple(1ya z#tDIZ6BYqmyx*ay$R{Wb%c zk|!DWztsSvf@h8Hi_~}b21EQ7wgIN-I9!BtbD&${1)tak>tj>MNm?HK(E;j*Q?QeB z1U-qb?hNc3t~zI!55D?d%sBr1+XrlldnNm0-sVrQ*mGDRS9oU|qo1wQ+VCej++Nv# zdvEW^i9HEd+#UN3A@a6PcOZ#zAbTX;2YZ$vKWY1^FYWAk_~zM;zG02sz;)P#8NY+) zTto+Y$IWlp!!Vv`hmQ}ezq{|f|J&dG_T_GOyIYIzbf-I&d*1V&?e{93OZjy;qaPS2 zH~P|ElApcjL%8qj?*-ha!7yIKuDaU54ms)zwqP4>$o^Khx>Z?erIp(Fx46YE+Haft z_ZydAe)%>ZcZ;6A(7|Nx`3U{MkMsP+op1Oewzu#dSz0sQM26(4KeCM;!==catkW+0 zC04GU_GC#9=@a+l!5G_X-LZ!_14q^gN8}*QR*^^Y*fw*^eVS)D?ya*r^ zw0HRIuQP1ys&$g5e#lUo-6C^+!N2~jHF^mC?HoF&rfr{FdjeKbMbNf{p2ShVTJt2nGJ_Q&jw(he*x#d!$p?%#9okz^NMF4 zfxdsYr@+vcop{+w^v zC~Mkr`|Zj%zE;lyyVUoYtIRi8uim9^{?#U1TxN^Np8cZ-%)y$1V|X`T`DCNt++{es z7#CmY3-h!dcGNnpQCs|gck9v*{a~-i(LT|q}~0zelm#u4U~nf2rwSZP5qK$C$P_CCr&!@Br9#`A@Vj4 z_d%X><0tMI69(*`@n8>k;EV6cRyu#>j)2`UzI{~Bdd;8RqzA}F8BWo~?m~TM4sW)t zvO0Ng{mqvH_HQ-@hmJqC{{Bu~)BaVKb<5+zIf1>Gp78_R1M$US zz&?;Od6RMWLaaRdqRg0rJnh*B&opp_yzB*;3V4b$?76w%srvR(dt8JiY1}uKJ1T8p z(Ejl~=oIDFM<#gV-2vYx8^@osF^qWE0-njq+UWsUv{&SeTb?yppFI(iRdgG@A3H)G zxI-p%BRx%DyJNOaGJ$(`CGsHy=_Ls`q`uf3^d&Yw^DsVK;0&(9jd}3r1bd3BY$whL z{7*iB^9=n?2f&SS=vs5X?QL({`g7OK2a*r#htHl>W*=IAXTI96BdT0ZoI9r+ab&$m zu4C{CfAOndm-6qrn>Ad0#Z|4|9((Ryjy<71n>x5YbFZ8|ppL`eTX*fR6t;-(Xnp(~ z_Y=<5Fa<~E<+Hm1*ylId2l~LikSpG?GuCZAYzln>yD%uNJ-*Q2uu6skE*OVi6WE!_ z0y(fh+C-O1v&&?S*T#bZykT>2m=8mr(gCjyL!< zF5dV~6@0Tdo|9NVF0+mF8ZKKW3`VEn7CoA~O?*?wevk|K(1mo0&+Gsl4F`N9`%bRm ziu6Q$(WWoUXKnjHzA$6o*hRc`_Qex?#(f;Je{>+7z~+QI?yuZ`t+?Wf&8MSF`0&<7 zE__+O3|{eJ@qvEfXC1I#^~-CRd)%UDEM#;1QT4ru%I7Vr@9>3s_Sj(K4a--z*sOf| zbDwEG#;l6Z<7+(_H;-9|)OUL~-K03WnLhQwckz4>huI#w z0B>-{I>b1{Z_vgb!x}w7C*qB}ZFN1r@tL2lu643Q)&sNS;*EFxaoN1sK)B;W#bAo zSSv5#-*Y^=+I+-0W1ANrRB-lU!`V!JfN{wN4&$?`qdnb+H*o6QlDnPwW8sgOjP2Vn z?%;~Da7K(n+Sp%v2lIk_{jneTPJUz$FJvutCuM$cX3h3NU()s!AJ~5wW%r$9=s5k; z@q7%r+4BM4!yLz-ds%a5Z`_%fFFne3;}IFN8=hmq3I759VU$jAw$Gh09b#|okC=Yc zSGYiig3ma}-x0_layR}UPx{aH1un=`A9R%VVt5vOrbp>MK06zl8-Z9|^k`bA${l)rD z)t77d{AbIi8?0aUKd9oXV(I83>i7RDXWZ?bws1k~Ys2-|D;rmTgPdU#=G{T#yRps1 zynJSB=qh8GKO2QRd^mO0$r+u!Wq0WkShIJ|PtMi$NLs$Mz;AU#UK- zGpl_iTlVdQ8cwNq&4*PTa8Z3uDeUs~uT{=$P`+I6rqr=sxF>&H@%+<#oU`EQE_b<0 z^HJPc)6v$!AMV$wt#z7r^rE?t7dZ)$p*Wx2so67gn2bB|mDP3rFfV5snAcW0uE7!= zYyZgsSK!7zX=6S9$hp8XdfaiofK}&cdeU0x zcF#9G>*S}MUTwyaHE-Ujr!?NopLa?*Vb1a8$m8no`R!l*_1*R;yY5nd`{~g7+oE+G z_X_%OuEL##Ek3ktvQhm#m%29kgIy(86jKGB{8`_c)pAmlTBz_vSokULz*hS_sxcDBUxAO4g&cnUu- zk1v9AvGax=_~bd7raCVE1DaH|bDhy{5$lkl@~)jr@PUmX_643E{77UDbL z5N@U)vCo2fVs*(Mf7u<_fj3x!If3o5cDOSpEYq9bXK@z5G5E7@-t)k9dL5S5Uw55$ zCSiAWs=8p_iS;+z>6I#@!;h&xQ(f1QN7ry%eMhf;KBmUAk36azaZG)W_=x&`T3x4k zlPQ^Px6Rhgez7FqAv-c>5A;b!&Rp`efpY=xhNZ(l z@`n@W9XgB816$@FKL(!Ye)GXGw$}b=Ydrb52v7J;K3i>3e{Z#(=Xb60aChd6GUt?& z%iL4vm6J}HS5BT+zc+JI{al}Kolws|{Hf!r|29|toVn%HdG+1@x(=8>u0Hqi-oOsq z)pK9fH*}|YkW08>T)J1_AMkr=zJNAw4r+?txI&vS7y%6^y`omsY zzq1xQj{|J7IoSu#wQ$v3aS;FYpMItLAm5(w0r)faH1C!KOZI!I%C0=zRce`*d03Xocet-xNx^d*J}fByH&pKP}j~LY*l?u_X2r8X8WzTDyLOl za$S87j14*Ev;~W}QMq$mwLds=%n5VKoRjMrs$%A(+AkY)>Vngn4O&p;xqrQb{=pSj zlnd(j`1Q9#9cSw;>+eq0dn4m*vDsG}pK$iTdZ%#G$#Wb2=mK-3%ji6|)7oNh=ma|5 znqctFZ&|gh_Rjh}@73PgVrk)>tG~U5`b@RPtH0|VEq>R#S1&Jn`Af_5o?rhBmp8t? zJmZ;9Z~JVo?3;H=z3Y0H6;~+FdUpLclRva(dH)*qJ0JfW)>yOt8w6|B_i@%-qkM3! z`kU7^to4CK{|?q#A6T<|`ZJ#@`|P{u87F)HK| zhE9W1=Ouc?@61g1pYPxJ&4uuW4q&JGzve)futjji_RtUZ$+IUIhhI8QIiApY^o#W> zbB5(l-0_ZgY_T-oTzrQ++~LNc+-I@iOp)@`6$^vqsh74s+s_1j@oiv?A3-lV^TL$- z3!H>EdV@}|K5KCPXm@^9_wQWS!=`w~zh8a-%(G3;EBD)buQKPv6Ut@vH++s}_p0p> zAI}EV__)fKqmHRI@%Z|kn93ErIqc|aUu!;p?S#s!Sx46IhE|^9+$Hs_Iq&3?+8Ey1 zIi${Y-)dvr7r3|M<7~Lm2JIa-yr#SH+V>LZXZyg$ur+)%dW4N(C-LX@ceq`-)19k) zm%r1bA$7#skUKr*jMvBZQr;czc>A)#U6wD)uW;wquXKVu=@nO4lxJV;$vakiW3%0d z9X`9Pv-Y|TXSfkO;SLVHqGPv|RGo$|Ne-lSq@Vl4Jo;YuO zxWW&-!EO0`Wb@)r!k;_z=xX?5W7$r+!9Mb**dV-drge|XPPnI%zWd$p-qP}X7FJkc zg&VQna{v$QkGSU$eTNST+6zA07eSr2ueGiD;RKt*4~>6Dze&>%Y`)*n;Jedj?t|Hy zLl3UsH?H`ed%SzF`VLrq7Y)8on}2G#@~SJ!MHTOOG5@ssZ>OC)zu6Lg+9{QL?8~Xu z|2w&!pXOD&z;8RH+M2o5{>-cOkFR%c^UpZF9A4Xdcjw1H{&6|0eqO*{Rom^^=&_Y+ z-bpyP%AcL{P5}<_pUf4u*j(#iZ|sfxKhHV%c=ptuIkQC`(O=O=i6d|IQfF9fkD{BT zQ(xVr6U$5BPu${`%avEW>UrhB{p$BlkEy?}w(ouoXE@J)!5_BA8OVO&jq?JWx>s;# z;p|K&@Ll-|>suvg>ZUl(Ww| zv&^b}Ih(Y5wE6Ylo2qt&Uv})A6U&K}H^-h>{j+-BIc84%z496#Re6Um?gj8`))7ZG zjvYMvu(Dv`>Ft>g?!bcgM%lTG>%Gk{etvBW=bU*~dw0~`H~V2Nd^CE1o_0@QpWFqK zzdfPr^p(3@cMN=2`cUA@#-B~BoIgfpumP|7Pa3X`CFWPCN3Zg=^{=g1o^%3iKkJ## zE>C&dD&<+vS*5(HmTj^5mSyfqi+-0&KjzQRv^VyhUceiD^NZrAIWt%vU6=3i@l~h8 z-VE9=_J)lo4}KQD!oKs1b3HDROYYj8tMMOi=mmjK;5zT|16Fa1b6x8kV1v^RWW+-4KA_jtqh zTL)fkTF?ESYaVgf>~hUjSGK$6OD_ISnKk>+a%$y(^*HCxt~Pc~ZF5AO*YR`fbCk*n z=Na+QC)8*7l`CTR(fl=brT5cj*ZY7uwcTNrLnqe$4zBZck6^v?tBvyR=Vg~(Qr~|& zv^^hU=lE^*$9~`~|A20@SM&hfv9Dxdj_eKIxXZ9V+Tmt9FI5>uR^%o4>`q5{>hmGo zdE%(pXU`XWmZtmrpl#otPoCG-jXMBiIGxj5tFd(QpzKTMOUvp(O= z+F%hj@xXaN9X<}MO5>Sw{nFv=g7pdP8$65I2qqA4;m)(xU4L(}uEqK1jD@F_-FICi3+wbwH#wU>ys^pdpYYCk(_T0O;0?Wy zd~1}3J(v!z$yr*y{Sc(_i5~OaQSWzq56r(^KqhpMIpmyfUebcJeXt+qGpjzo+HvP? z>pAU9^$vfh@`;asviX*L4E_Rp~c-K2Bq1l)%^_fghm5BL%|LoRrhGmY3eN8jEZ zAuIdhcd>Cge@W-=Q$Osr^ZWy=KjPg+@4pDnN&2IEve&SIZ*(r7R2;t%r(udO%BP?& z=n?yYYxZ>ydZ6;jdlmNZyy{1h!`T(%2USd;cKR8G&2V<%ui=q90k*^Q8n(pUfSAn@ zvpIO=PC&Z@>v>5(`&Vq9`K`0dKHuE0`Buih@ci@I_jG(WmHqSmxV`t>qdq%Yx2?tf zrFrp1`CTv%<796S$eu5!PR={lXWi;M6WN!%Ljkt}Oem+L=pwxH9pwIZWbKXL!N6VT zDtAS}y)%}(3H_5Te2|;@Y`a~(Gu&~}zi&c6thes^%~zy5?FG)*NBY@3;fp;LoWc2H z`m;s>PVG6J>~}P$`wwsE3-+C#W?XuKyrpxmORoG|957Ed)49`KE)2pOUx5x2=pN@* zx`tn+++8+Vl7};>GbP;9BhK%5>o?i^zi>t#`^*1h6X{m_%pWla&jE8zmB-fGYn);0 z*d(&IHoOrUFRBhOM|-7DxWXIjq(jKz*vbW*p%c!mK9OhrVt8dQoKa4kSAUzWKG!_q z_%l>#~!e?+7gFEhLa+l!Qu|D}=WN1%z*m3*js~vFQqIaeb*#E$G z=k6Ti`2rm(&;{0Q-qwek^fbSMF2pJ8!zE`ZcZ$>Pr;!2P%&)o#Z=93aIeLlQ`Dye7 z+wVN%EI{V=0@mqwPi>|u^%i-YEbkL(XQ zobBxgUB>UG&&iHIL1*F?z0TJ7zKP!^vp3<3J+U|Poullpw(Ny>lISz%NBuf0H;mMG zz_;7J{#z*9Y*G$Bq`pIP(4y}e;6A^ZzNV+)iw%J(=O|dwzcredGl8|jm@`CpGu`&a z+Wkg^^S8Ab+Z`ILkvqAv0rYpC)mpc?k}a&m8~>N@rtE*ZyYpa8tE*h#ZAdEl$6KW- zQ_);S;}mi&ryFmn6@wZjlf%^ti2(xSqBnyWP0S$k)Fg}vGYLXBbPIGhJpet?-82n! zfDi~%LjnY7LX&}@(W0WUG_YO2_wZQTx6Yvl`kX`gRqeCiaSv-f&suA*_x-*Dlkml^ zSU>PPI7F}XVBUBr1`y+^*${q5zhVG-=zpu!K0X;QpC;F1yzVhJ+uAWEoWUb~@J-4-Bs=-!jB}iz-J@YnsL7BXDDQ zCbPc&FSWJ*v%W@-fX|U*<8#Dmp4AL%|7A-DeqFw}{)b$xdFKD!rET*~H@6E*e%3g? zlk=r}w-nA!Z})AvXUOj@sOLw%>*HNf^4(PZnw#;9rTH7rJL!H=7&W=xDyWEQ_bfZmei=}$roPNe9haB{> zr4#?RO-y1wY@Bi79G#k*bL_0P@P;p?J6vP4x zu3JO1Nqnz$1wNQt^3d|S#%(?AxR{8J=!=aaC$<}J*b8xi7(jdEOD=T8|5(4!3!dO} z#)(VTdXB>axy47}F56~|X$KFj`*9_48eQNvP6s#U$KRNf9H(`qd06iaHoJK5`!JrJ z@HcF`cRykImYY5|#4Q^u_lzTaj=UM4lQoT;+3Mnochx)xl}q!EjojL>=Bc%h9Klt^ zDZa_OY#XY*rB~MPa8@2cE=>MGoVK~%K`?G>D*n#zet5QoBd&uj`589FIN3e265}X| zz469A9peJupzzh?hBI_z?Fj2~4A$J_<2QhC#(Vnoxy5u=J@*kSV{5A!g7K7bCy0rZ21^2K5TK9s+458p%=WP&HS zs!cT>S!4Kr4pV)^7vzYmd~)8+)F#a13jMQH{95mCzC&K;MuCGTO)gE#uthM3d( z2Cj}OuJJeGB;OBk|7~Sc*A_o+yY=&f-1r>NG5Lt()e@hn`{$j>t62-lyLsjOOGdcG7Vt%QgI5Z>!N$ARb1V3y2bk8^m^ap@+9Z4b zcgiRJ#{4ZUc?81P11z;5C)U#=ha2xgKOfEoMjt@urTA!{@1C2i7$xRqbB zzVXZxcjU3;v&3xHHgZ}x#6DQVh_kF)#A}}6h}Xnre33Yf4^b~GS@1oJmM$CkcG;3E z2A|{oG`zZaL9P9Zx5g(QKd<^17qUBY(B4<$YkY6vh{|=C4?9KPeVhh=^oJvG7tTZm zj?0yh9a#nMys_4XW$QLJ zSlq?7SnH4l8Nwo&lDBb+jre2v7CI#pyvITMW&`;wIMg0Jj(Nl9(zU*=N!8}hPsdld z-}f2#7&?T7$eYvMGvN?`*$gT))~B;$$q zYVIq}z~AQ2-8ige*>8SSOeg1j?RAxdem33`k9jsDPUDNz;xaLt+%(>Z&s>LV&QHX5 zs|NohUK0l@$EAzNd>o5X3x$^O6~eOc2PuQ|ge|H>!H z```@u;Z5&v!W(k4#vyxHg=euWp5(V1*-6)sKl?}iY><7tv9BN86MrnMcWX{Pt=^5T z^^JG?HeOrrz1EzK$GaW;jk$QffPeEV?leDqHde=si)}YoG7wAR)pYYFb^>q6RqO=& zFlwB9g`A$)Eo%s46T`6?VpiPeFRjh26&x1>v6Z+4xA8adNfzXXA2`Q=Ei9pwk>Wo2R_C- z{eGv$`i4z-_$v<%@1=>CHWmLo_moH4Ts~q=aYVc&K1)7rW3AZ}ui=LLviMB=HoTWs zcov_@r(LBZ*fTg4H?XJPU!rp|q-QqQI-Xwn2)w~P`mrx|gCB8~ z{Fyk-`o?eih}&>aEUhnn;F$Nga77#gV~J7NP5sj+e}jweGhWAM+TY0ilST4=Fe+DI z&T@+4Q|I8Atl1W^COxqcFy}m5BsSw)$%*ZzGxKsES-4kR1^@gG|L(Xk&^J8OuY2L# z8XvFqCr+c^etknvY+HB(58^as3}Kk==4AMU}5)$Sbn_MWHj=zQ|TxkGM^4`r*_C-Nm5b`L*1Pcct(!7X+f_Ho8> zyrEmNB1?9w=Z!Un=kj9lycbAT{I&M9n|PiL^z2$b0Z-U5y3lTT13$(oPCMhw)7vSh zeWH068gJ;D>~X=|V;AK)-2-26B6bsd;0e3xoVoBb?8bESCjQ2nj=y1R%!_?77I6~a z3+FHu|4T>aMJDDzp8P(}vw3u44a7$96}SZZ0P zIk^&i!WrkulAmIKj6<8`Y+Io-$HXLboApg{6v2`{*f!%f4*mw$6C=^pamO4zk$rKQJcDw{ zf{TaW_efuS-il@QyLH7A-)A_c?1*Pga^^6c*hU_Q9dnK^fXCP$wi%zypPu;dtZ(2O zF3FJ|_zHGizK0$ZJ^)7WjZJb++)Q6|Dz3sCvZsUOH*ITE>_P{4GVtc~xx>4De2p<1 zA6}}(44%P?1H#YXkgmkoFv=Ea6Ej;xw{{T{6L8a<;}GcQG%SkcHwoIxaXa zer1#7cX7uY*j;+mh8Wwm)&cYd>+ZuBJ{|7aDYbn*T_0qoxE^ommd$dEZM3ZoT*GJM zU@L7Wf69)UL;Q{05uLy$%orcvYV7Pp@&b579&9Ro+V`DK`2pBnTRHaY3*&NHa>IVZ zhA(1E@Q+{MZ#Nc~wVO=iI`K-?#BD9IkqY({FtE z{ZF>pcX8yOeTR-8<=3rU#Q)^QuFwVEGI>1#6H95?rfcHu?!e+U*%{BKyXI8GZo8|GeP zaE#rB4SIGAZ`ft};a{yOW|B9a-&hCZ2LER~#L)V|Mf>a`y;#$@U%@;3?52L$ zBiOd$%F5}f6t=K$Gqvz?>+nerT5hq6wcSwb^MLr)sP$Z z&i|HLi!3Nz55F-`xc0op`)i)-EG>UAY<*j~wyG zI)!e<6ZB#3?qzGl@8TlXVi4<7;dV`1K!C{KgI#y zc*M5AgMGZAYj%!)*+Kd@4?ao3vG^PFvX;ST#c?*mIOzpvv#joOyIk?yLj^U8} zfO+yS#={5PdP_aOS-Yk!obP`UEF5r+PuG>Nfou23Hz?WHkM?j5M|^km+%wM@)>Ow9 zR?VNh*&_GwEn-d>A|rC;NAld0F2Wn~V`t12&lK1vL%!B==h^PqGk$_T_y#)Ho}3&T z3h!`%L*&m+YD*h@5?dusWB;^CAGpGP(GR?fwY4+64_&-D{HTu%zrQ$t-o)<}iZyW& zCtWX|pcC_@JG|k8#0IcQzkC#(SyLE0jE;YcJ6PYHHGdP{@WW1zTk|!4GRHSfwMf!ez&CZaR6Bya3*?SH_4ZWX-Pd$#NFf z4!Gkyo9tSCg$-d__#AR`54`g|WI*3!O4jtnPO=T!hdagGlLIhcb9cX(3_pwk-fb&l zEjojD+z~H`>)1Onq;cT3efWSKW6{5{=pSa}QR54fL!}e>2DXiDr%QUlB^ZtF;R;XH zx$7+7oT68NW;VZStubMABiDTG!c9`FR2e`s+$p-ke;tiPJEwz$C7+Q+&Ms**P*11F~mq51ojq&5Qi$ zi!R{_Zu#xVmQ5jRg`5=En~Q76nty;xc9CCB5pNl@7?*zN%JqtNwK1-p!{y5^y}X@$ z&Kd3a6OU{s%sqb4iTICSG*+0xU)-@yFuwSH`Y=aarBi$|Hgk{7n6BqH@ipQ-?@W?8 z4)cj(0`tQk&r8@aYd!vkuOKI}iTTl``{2nu$coOz4D1B|!M=&L*%9{1{$$1c9j9vr z#`}`vskJ2@hJ)1Ewy)?{VQ1k+tivwj3_O^V@w0ERXzt!$!+(B9tiaCGmFr-Ujj-){ zaVc3SVnBK)AM*%C&D;JdHNO+ff1X<7$$4{jow*D#Wnp&xx{3dHZQak7>zfYP(%02^ zan><1Hx_Zf@ye+gzwsKk@wtyK;ZC3IfcOgD%?}6E3hd!R)-ipZ?OdDt)Y?+q-xv4v z=lW~r)q6GPoO@>b&`18fei!PHcG{_@4?1x_d(4Kj)8-6k<^WUX%)a52n9p3?gP;7* zO!=FhH}oOakz*krF^V;&vA`Ff!;i2%Y%x5r!OrpXuBCsxVYl#~Ph}glAqL|2Q`>fr zBA#Ve#C~igo+@G^@vJ$JH|$?}cjD z^UvYknrrJf2v*kbEUcS|2ffF+;X1$7v9`VgSN~J`n)O4T?yqVLudTK4@Gix#OvF3k zjkTOP@lkv$-mn|-P4s0Qjhk@CR)}li&Nbx5U$G^LaoNcfv4?YPBRTPPYHgAS3_At` z3JhqEy>zemSz%B0OIEhk`|o#P+viQc+g`u-|7k}ZedMs-fteGIpF8+bc8R>%1#=RE zurFi}2ga{2SjA8Aqkj1twt6am)BB5E%@L%HJ`YWP{3SW7VVRuZ-dx1h~;pLzwy0VGO;$5k5to>ZFOJpl0Kpb-v^b`Q7hV_54xf|ZHRdlYd|&G{+IHa zpJ_k#qkFa=_`(0terB&9Z-*aoSX;hq;(w&#oAI)BY?*EGnKhhsfOv=vVZZQ%e`OcM ziSX9*Civb}er)eP&poXx*%dkwi&@{WV{|}2>$x z<_~vxrP!v=?AwN6HM^yjpO3FlYoAQCuZAJAQ^(%rnB$JA`vOOJ4de2E@Srbkx|grv zJH$M22Agm}_i`7oY0iIKehm+epB)vSDc*x#xqf5Ydfb7ny?#!6;G{omm#^Ji-+^9H z{^Qzq>B@EO{v+Pr+8bWfzI@yvZQEbGvHkr4uWpZg_|5HK-}dtM^c!B%o~ir(<@aCS zHePUA+jQF(+x~@(*Zy>UNB`A7F>q9TBNpVNjh)>vNAebn$!CZI%$4tE>u^NufLF%r z7@rlnjb+6jDRi!Ai|rR1(Xqnrn?KB`U8C^b@ke};Z5(#ozVh1tRqu4XruKiX-Xs0> z*R{hA|C>R!@M2E%%Vxojal;$gi&fZOh{{sU@U$fWG zwzt0REw%st0ZVWX({#qJi)F-zv~d+wiKUGxFsV$lKb{arRfuAJ|sJ`4`W>q+Rg0m47|zu;JcQPCj+8%Q%CRiQlbJ z^<~WndpJt|_=i_wB6EiawoUv1lQZ#uaq-6Q7$iT8uVgB>#O~t-jHs>2jg{=46oZ%40@P@re{7pyNC4Z&grY{__=AeUM-gWNl?{y#f!-(zvT-r{p9deg<;nTGZ zZ}^?HlsUTIe6(qu;#x5ZzOa=zl-Qo`_+as)*g!7JnrV2K^QtxNONaeQ`(E+pp5yiW&?fuj#9@VO-E-FA?W*G0he{Ve@~VnOU$y68^MB#zCe{@Ef%u9o6GI!X@v{&3Loep& z8a4v|=?{i+-&!H^4{ySg)Zq}Fvo~bvT)2{LvU7~?`%2nUr#<@e{027UBmee- z`VPQ;2MqR^%@v!$6CU6?yM!CAHwT=7F?PW*IMcpZLM}o7{derQ7jNz8`N{m2brfuw z2Q2W7WB?<4t?}YHTV?IfX2X{`$yL!Eo5oIO*hdm{khgN2|gMYw55F|`+TOhJp&S7Iw#(oYie`hbKuFE0p7%> z;sHKa9MAW_pjbgXFW&Z>e{|(LYFDkjw%zkL`?glRx%-%d+miJ+R9;}!@cT5&iw9dj zc}VeQPJ8I&zi8k1=~A`*EGUwI;(ETnJ}y*gA)O=9kz9b`OUl2XkV};gSr= zPa&^59`IB|pl1I~zVp}^f5!(tU>=S*!nYDs_deaXq*p}0= z{$bBz2ebi8+I3F<;srV4nfN^UV=)~_TTMOe|)(GNo&wI2n{2s@~>)Qjz?mzgO zd*{}BerxN0bgZo$+M4>G(Q7ughmJpJ@HY>9;{UhDKlXd=dvAJC`{#GOvORkEJKKFn zysQ25+g~xnai2f$*mnJ`w+}I|-{?2iAO5i)9r6JFPXnHaT_OW|Gj6s_tcm~Z09o^s zSxd8N>>{1e0nE}J8S*KK$>glbkbK1DnRO}s$@lO}A=7%?I zld*|O#K>|{Y*?^vymTZk-~+77#A))uc!P6nh`a~+vdLM~WIci-3cZk#cES;LIAeQU z*jLw+uj|y=*1q<{UF2>|e2j64fz62y_!;9e4>*H=y5>jd7H+Ip@x~flUWk3b8|{#h zdwefoNqw(o>FR6RV{;E~?YF zTINrGt^LzGU)k1OR_{Ju&n|5QpvglRwq|p!A?` z`6|AHUuTQx0=^aYBF}u;G8`fUu?w!lq}WCtfsVE?zr^ee_;>s=eZkZ*VpZn!_k z)Z_i}v2eukv|-zEx>ndW_6$}MbHY1$;}krz&Bg_DbjA0vgZM(X)~eyve)Aryo`?dBvbJ{;1^7HNMAN%8W`>`Kr zH_kh!J#fr>+9Q9yPkZ#p{n{<(ozxzC|8KN^f9p%zBZvM@+giTn;g7$)JzQ;ky|&k1 zbWXiPy{?`3iMj0$OQr|x|L*pdx4yak)X)C(AY1Y^E;xx#6_=W`d6B`8=kPoK^&SiV z$!5H+o&k{q4!WOBiQVdXK=#4=m>d0m_|hK>XL7$<+tH1fg8bnGzW8i$3O%u9_#a)H z6JNvsDCWRt(kDB}kFg)_kqaRYG0;r##(F2b5i7%scou)6`i9>w2w&^$VSY!nIeQ`YJvOQHz&)U;24#0!)!-w@T?uv=!1o%HT zi9d%i+lpMgeSL_5%njH1UbVK3ec`2-wN-0Z5BqCZRXnueb8Yo!Kh?hT2QP0=zH_hk z;NkCRPrv15?ddn}(b})fX-^#Vx^~04C$(*d{Az2z{G#^E-gDZ$r+l#8cItmEAIL7~;x2Cs-mhb=OH@`WoDb2;ZVUCNz#ByR$c5HZet?u
uVXiV>Zo?lDIac|&iZ6~=-79+uN?RP+I{6i?yUUsvZeL?m-FVf zZAbjy_Tb0=sNJ%#ev9#%4eh4W{<=MM)H~XP^<3w{!}e{D9ItFGuF{yEWSfg!N*S>hi?QQ85%i1Fkf4zP6(I?t%U#R_M zR}B9%EplPg$VMyy!*topnSAMJ%#D5@7s9C=cg%h6SM0-!^@(^491zpC+cUe!&eK7pL*%-Y1cl;RpFeGB8K{ zFh{(>Gq|QdaW#3tC|d%%);hNFhOJ@yn{C~bwSxP-_rGY_(t$g0y?oWg z?>b#x&o!5Ay16Yazq{a?`ajW|ztAqPeA;E}t{?u7=Ve#d^OYNJtu@b0ZE>}+dd>QF z>FW9)B^&B@1#h^yU9z&?RoGPPoNMbI-}S6~f^qmCA$WUPVQEdh$3w>EZ7jHA48{lZ z>bvf|yM6VmUmf1Fd-Snw?a6=m_J4AV9e^$JV6XXO{s$K6$2yKrfP3xHV`2cuQXD7u zem|UZz4Ls4{6hF5ZWrsar+5Mf`m{#mL(P?b`KaV2*l3*LhxitGHhl5iS$i-_ukfcG zcAuS_iF{g~-{1{f4S#YW{L2s%7iX-A$<*4+TA5wP9kPRMvW~x}8}=OD;F(Rp8!}5? zl>fmU`f{9X^^cR{qUendw4a(j*e~%QJ0!OE?hAi{FP^oqp>&ei%-Y0y%y(+|lH|>B zf-Q$h$HfN*_bqV7YvN?~Vkw_~dtI#H)U{_3D++{;%bwONMyM z_i@}OcJlvp1{<@wa@2+U)s=64AJpc`hv2tyim}z?MJMFNUpbC5 zbO@K;6%dDu|IAr?e2{tb2XHRd#vw9w4Vk*0ZKOX%PS`O#z-iYSmy&guw#0)tX+1^W zVn^eFG58vA2-}5W_Ik*56^D!ym*C2^w(-SrCH`mSs)@FIN7MJ6S1hkQ+KS@CvmEkW z=+$fLw*cxqoL;@6VyHR~`->`8x^kuOtgUQUEGdpyztsI#mH%2(Yo_HDTfw~lQ{aC` zu|faI2lrQ-&WA5*^T2I=sr^qYIL^3j`yR6S;GOHpfz6|Dc3bSGus38V&kLJm3IE>3 zq+9WUd{FG9ZJ4mG5S!B-8zzqG^Yu9Dxbrw^?a3dR8|)YxTZl6XT(O}rC0@fB1#Ub~ zgc~~NgV<}>HAcMgI}P3)n~4wJkOiE=H*)a;2YS9=*fKfEWU^> zA`iHwU;1XV*dqQ_oQ4DRhLh|bdqQtGL5JkTFZYFSr%(5|*FOKvp5Yt+1`qgw1L1CX ztTq<-F+SK-j1j+Z$(Yry!z*pUntK=4Zy7IIaz*`rnoEY?v++OBF1+ZHc4_^#ncoyx zaM8ShGyZ=K8Njmtnd~>i7S{iPo_ERowyZca#5oJ=*?FD6=;Hc*X4MNWt7r1{-8KD? z6-;?gXWsma+M>mm5BIs=n8K&{M`JbqD~qSL#d6`gxtOo-i#g|B$Hb-dX{~PE$sTz= zLiS{Co8IX|p$~de$Q>V?Pkzg@d@+Ul=tdjtB%RPVjs+|H49?>Zyx=6?!VX&lh`qv5 zYksjZWgXW-Lsy*~Z))6-5He#iSf`0X7V95x5*EWGv}vKmhLAil^r z#hzq9|8#8r@MqrcX9LWMeAqsEvfhrpbFDn1!q(uTF(~@LL2<5FL4HhIu|s5vw_-Ii z*0=j$1unF04HKV&2e2=Ggc*2_?{N>#7^8b()qVDDI|i%zGgq;L`r^X>XD+DU$f!K8 za~DU;9%)m)6{!g&+%q+@v(Mz`T{w&#C)|6X__ThT;N0^+GyION zHqNhW_2vF^Yo2VB{>ju_GFGw`&l;;(&;ObAe`VMOxin*3UOsPe@zH$g!1d0{BjPDt zvhAMZku@8tu;*-{ZLu`FYTGe*=7-dd!;f`_bK;Ud-XizN(s;%C(YrQq$D9?IpliHw zPJ8gjHi}EUFNv4dNy#51HW~l_q}@fJK0eE~|HA<9kwxND_9yul=WrS);2E~zg)Zq& zjX#6#3Zro1TDG76f^X;P8;0o)p7{i8Iok@n!!bY6=ZsvB53Ysztnb-a_qbQzZ~zZ< z)7xU$rz^OLkIcAX2yX1F$pW`rr@$_KYBRQ49e&w{JzO(C#~rh;9el>ezK4h=hc3dB1Y>s4RjQS$S#I)q-INwG`#zQA+ z_t1xX)b23{*SbgBxkv3fGB$qWFfO(i&*a0*gK) zYa4ui;)y4wWnB~gg)?gZn}JSo*4iJ|t>MI?Y@6b@iu{hHb8L{Rd7tn zaogmSLe^vtm*FM7nG>7lK5erT`XRg6LbZM8ZL9SO@8%KztyDMp7ghwzveQ`V-(Vp@2{b|?r(SiBEykg972dB2( zn>l1V++#1?Yi`Dlf8?e%X7|H^v1<<=;Dmm~Sg=pe_Qh=K%#(h!L)YY^o%kZ0!Uz6H z5%;*4Eyp|04RFg^LLd1K8_f7$JTvhLj~;&b;ocFPvk?*c@^pPdc*CmeDP_!#HfS=deMqFhFKvYK2_b4n;rYO@`#=I(Cb%f(`q@ z1lh+Y;kPm9117>3V^HjCk8jnsq8~;7j%$OzGbV9>HEYhh9^cs*x)Q&T2fM@Oi5(Pe zsmTnUw8viZ>(1r8YqTv6)*kt2j}G*szqIK(a$%RvMQuNAXwxx}XnoVb92& zA2v@M&?hX%=is61or}E9f&3MG(3coO|HkQ~{3VAB|Bt@=)Ug(Fc*c!1@{|UYw>$m%Bc4eEddHnImhjjx#L+^O( z9U{39@6Y3p*itUuJjjZS*b1>5-jFF7lLuP|v#^a%b;L}(DK=hZMO|D`{2 zQ@hW&U8C5>eQ~zy$r%Sy!X3JDUT%y`VOak#Z@gl1cpwAE*>=atnS5|Ieh%kS$k%pw zg17eZgRP?%dc_-KU@M%XUwHBVAYs7V$<93FcI8^Fx8ButSVS@M;B=ga?`FkdpE6LN7*tOvt#`QF|4PP=yy z=!y=*4Kj*Ngl+c7F}_L-A9R6>xJ3u9(HEK1A6>&F8^k}#S9;!NUg8byxiH+Hk#V?8BdST*tPMo#zegsW@GY@A{z& z+R!VroZaHo~a=MgjaAVMspwR`OY`{ z?b!|9(6@H!i%#Hx&Ea##zGb}se7WU+W|9Se%7)N646?=EVKPtesNp#~DIdtD8LMKP ze2#hZ=j0$)!l(M~j_*bCS)QfgpWl)Y`*}x~e94vF!4Gn#Q`?Tw39Q@48@e}Ec%c`^ zVB0>wl9-JCa8sXrC4S+c>y-F7e!}?G@^rSXjns)N^ubSLp8k)b>-FbY{3EQp*Ku)% z_jj}@c4P;&XRgL!-|<|l9k#(Sb0!0I>;=Awhn?4szRZz4)Y^<~&)CVyG3Uvd4Aj~d zyRqZqZngtg$vbk1ts;BvXy19`*B(8k#&5^*EB)|6+EU{?U*Y#W6u+(Vl9#+>cvl8z zVIN0uhQEP*-`mGqoZxfwt`yvOM#L_9cH~~;7jN*ze7`vFsi&TLzO>lx{oYC7FZgM8 z44&Bsz5>trM&rZ*&p$ms7N6h@+hl%x4gW$;?qv(|Tee~fd^8{SjQ#K|+Ha(=i||h; zFhI9-2pi#!^V+3v7^O%0blmmuMPE6t9k|2~cACFrx8ifcoz&WbbH9J9jd0a@+iDna z9nM&H;)DKk+&SBdHt_0eU;EndzdeF&IO_|n;iLa;?j0ce?(Iut!2WvoR6I-$`c^C2 zSF=}sTgNj6wd1Y}mdQ$SjQxW@zR-DmGzZ&i`mk-h^kHn~rXMoVj`nTikbSlI+_tgc z0^5rx`~*8HhT-GHF5VIGo|)&QZ~;d!#n)*EAJ}ME^NxULsj%p~H+&A>Yfp}fU#4T& zBh%^p9zpN7yay=0vHnUdZ490vn-|`&8Qx)X4el6k62g7A3U>l!I^D(P8)1F|3}7RMeQ16_>$U~ zjfp*Xe~$Mx%s59U_uqg2;3r_(y{=O$u8Xafx7V)mO;^ zR$P(1o%?VF&s;A~WoyMM^v!R7qyE>H=PTYt7oS+;i$U<%+DV+l7s7-*1N_lF-vU#{ z?0W=kA+Eq0oM@l#Wb?J%V|%-fV<#>cx9j~;>lBz^t6|i5aGvilPWHl@!8@9GCU=KY(Y=n6P2^T`+Q(e;S-F7{bZA^t;M7Jj=VmVhLPxpIAv-V!Zx0pwj2=tjFBRK6}9DS+~iXz%`rA=NLO*NmkZ4a7gy> zhBMZ8<_YuUZte7~Z+&avPS2Zd+qMmT;Gyf2t7QM!DSllH%r1&y>4kr{R^i*pPh3dn z>>}=nb&`jP&4W|pmzNMf(}iQfu(8`$vfbCV`;z-`YBFA>E!U+?b}Za;O*qu^rRPz2 zgA3scjyN8^ggdZH7PwSe>(QpgL*m3>^ zPV_0C;lA1Ym>d596Um9n8L?0Nh&WSRiZ^^KOyWDAieqYd59e^hN4)*r?|ygiIsBSF z*aR`HIL+FSFMuKUlegpA6{q_yD%*sAbZjjAzwyv7`N~s^i|{6RavTQu8?qIj;6QA7 zu;%(;e5yLw&UyPi*ZSkxcHVY>ukF6zivHEv&c5;CiT$208Fzfjm?ObG%;Q7iC_Hel zSXW+COhHDlu8^hJ!MOPg*RnP2q*zNH)HPxV*ZF_F;$Z6z`ryCPAKl5(c?Vh_KI|s_ zi#_CUy-RGL?}q^~mbDE&$OquH^)IfTc6kiwQl`yVo3(Z?tdzuHg%;_r%(`MV@IFC*)7W zJAA*ju5~!Sk2C#;PUsTP@Jg}%F0gAU<<{mYs?c#~s+Ep{5;@L7zaHFqbIK{lOt>%0AX=`xnPBN4S*dId1z&;z_xbQy{EU9!fd0i`VhOex_tfHS_K&_j z3uDW1hP|HZy_#TV=x8_n*^xG_P3XWp|xnMnYj)f!kZL4!G+u08%`Z~N|2l`^XDR56l zu1%Zza=mkSU|nu~V19DzYIAhlz1D^K4kkJAL*fMTqZ`M_(=j#@{^^wLaYf-fU|-yT zlh(P`mvUq{qlO!{jr`$A-pGBPttiIDF5{)R%d=p%*fG3O#5UqIcyZh{Y$`j*_iWj+ zWxI^%vEFZQ_r@K(V6rx0m+gU5eh0?M#T@pmwLe>6TW->v@G9#Zb7gPX3CBI_5!1=d z$&rz#Tq6DOHP)+qF8$;~M~MfF&sxct_&B~wzwD*F1gx`})`)lrC;AmX&_8?yf3eTm zhdWs0SMUX%=NHD{5Uy}UJmP%t-D7^doognmdrtJ*8H?KZ@IbL2zSuSf<8jP9`3l>{ z;Jh`4xu>?Rz^>Z!c=ik)W2^AQJdMY7#tr*oB+uq?$r?3rGd-|pY-^7jxmYn8Zi=D# z1UXSQj%_tQeAl*oDnBANr%%{`rM)W$B@Txz{aarhRDMW%Fhb|>$QJbRdoVMbb!0(4 z@J1HmC-cG^ST`4Vv}Ti^!7Fxyd@@J($zQTr^dx4*7q-MX^20@bif+hTPLb`SCm;GD zAGIQW6ys@&Kf#r)^~^%vfG=X#JSWsPKf~|Q5v+v^aE23#V{mGoup|CAH?}W!j$XwE zu7g`O48WOMJ20GWID}irQ)}CPFdZKWr?77v!FR58EN$Qg%)vc-V0~%brg)Aa9wIk$ z(>8mjuq$fk_+mDSjiWdEa@@Mm_r1tbyh~QrjO54mv2T1oKauq+j41ZS-R?0DT$Fo& z5#zLWkx!y8@w>GZF5rc{oNLu&Ew^AzB%Wbk<(I@WFo!dIn0<4aDn6S{-lT8#1TMvC zVoPfUK0Y=Dme>ojP|VdeVa3F;}VcY15T;ycrRK#1xog6S7v48X}?{6I9?Qloj%tpbz zw%8Unk6t~;2!C+Snk2bv`h$O1V4tjQaG!0}k0O3gd_ynVV59jTI$%4*h_Ua%>kFmk zZ|F}vX)VAevk80#KVt6i4*xjfoH?@>?3w(5`SMld!^bM*z&?_vbrTy;{_>vWPM>@V zS;Iff(<6CXEAk)KxBL{j=6!4ObUd-2T)$_lo(-_WvF+@ldBx7dj{e}$?=Q>gc`kuB zd+f2t@Y~R8=jj**jVai+Hnyh51JA2*{mWne^6(6g4fh=l*z{bF-G21ZM~Cz7QP_K2 za;;nne&e9=;fsAZvKGkrjM12k({ESfkGRJ?=!B0kPBOt2>--ckvv`QU$jbHPO!m2l zKFGy-ou42}*WxwKn?If7m3D#w_sJ8nwfO0NKEgg;n}<9CAA~D%*q&{`lrf3d@D&z3 zm#~h}Kbr+>%AMhqI8DGZ+ixqK%ov~JvL!w)DTAr6(#}9=p z`9}pFonyoKB=|K(zKU#cR{!4nBR@DZM%ZIZ@WxsK9>vr6f+w)Ake9;FkeL|BvoQPQ zPIquhR_qa*MyC9iIFK!)EBJK{-OB%1Yq*~cWfR#pTwy2a%o>LsHC{H%deazj90oiC zq*I(#U8J&pN_-6NbZsR#L?&*UZ$=5R?^28Z_$@Sz)FYd<++)8YxAAF%-_6={1 z$Jp30?|SGP2FY82N%59KSFnfAVmfP5ybxF7FO1Nw7{Rj){1Fow2Oq{S&?{do=Ef7T zjyO%6>%+fTH}EZTitLfxyj(l~w6!?o8fy$6yn}iEQQPbe-{O5CTnS#u9ByIQ_{45m zQ_Dzd{%IV2-VtepFJI*^!2YA7j;*wZd+(cjEM`OTg*oJxe zF!8O}12%9^o8+opdcu+TCEtgj57)s4JE0%G1@`!AyyH{F?LLmbkUrKF>~hAK@v*P) z=otuI^S^AOIG+E7e;8EgSUeYbkq=qXA$^h&o!}WPh`;3D@J9}Yf6^Yg!-Mzxj0ZPe z&#u9>nl9*-?bEjP7`^ci`hi0@l7C=-?c?ID1p>WT2 z))es1Usx~cLp&iiv#!y%b&;5kJ+hX@t*p(&K91YhuKW2jw!{2!1}@o=%*R~Jl^ua) zwhZ3bC9x4Xn6J+oXE^Z!_!I8R1bcY9WGUP|bWKFNIO3(C>cn^;8 z%sDoV&c*Zi!XMF%*bmO=itU0Mc9uSs*g)-y4PeC@M+^}hx?a&gyP!Yg!g>AhH)22d zCI|ObMy}!mdZ9~tqI*6` z>;bn*FbsR*cVom0n4t^T$L_*_aao6ImpyvFB@Q}7@qd?NP0P(9>K&^=P+^@zd z_lc|73fJj7W5jVh=J(0VJ@`YWWW{dK2|lxXbeg<43@E*hZR3q=*&TDzt{6~TY^zv8 zoQfCxwzYtHTO*2ljYX~{K1SU?BZt}9{@^j)?NwPG&Xg-bfXqxdTJExh2f*)D#A zErV}*q6<9058L5L_(DhYf@8+ac8E{lp8aK8V8{DTIAOf{!WSQQ+L-jg_Q03->*Z9! zn_zM_d=6X(+rxmL{nK;Vd7MdZNc=$#*0j0Tn%Mfl+SYu?#@zGCb^X5Utf5^?UhFf> z@bT93^do*2oZ*aP za0^pxG@Rl=co+Yq*1mJ>cYK25Dg8aR72|MUU&0S5SkukZEA32Jp^K6K06*kNJQQ`qQ5PvD|v36yv_yP47GNTIdNCK-;xp_y$Hu}Gxn*r54`BV6_Skhe8sjTC+uikZ^iO*n6%z`5d9Ke+|jUo<*$>dRCUCEk39iIlb{8aW+=bG%} zMv7x8xlSD}>KiwV%NW$g?|9Bxr|}i$$li-}*dDofSjUO@3K$j7vFW&g7tZnR@h4^!{wO=jEQ^Y-Q|K!X@nSrEsWi{UqMR1svxC^3I&` z>D#^TbIoM)ne13(!FRzWyUx#xnaM5~@I02?G6ym@W^*uR+lq0E`@Hv%&yMIl*QSo{ zJojaPjY}TQSd5K6U88L^z4zFe47+K2I_iFo#%SH8_HmB?6QkKSHt&##MSb`cF?6?aZ~~d#Bn@n_1&!e|y*GyzBYXaXcOQ(Ivmbe&J2*0v*H#;6GjPQ;Czv zJZ;$CnGZgs9T@apP1Xlu8+gmddDrKoPjiXi%JJ#0^$UO2U$}$ce4(*rEXM7*1b^uG z)_OMXy^-nocn^kN*i*U*f5IDn2yetaWa~4TzW953X1n=`#QE%X;{B|Fw}-u8Zb$2J zd*l7*YG-GzeXe%cio~SmtXRuf!&sAyu@_x>pCx$&vX`e($Ui#Z=j3p#b9d&`>#5%! zx4|aoH!8$6u$Q<82E#Emd#>czxUHGk#}_$te#KhP+{l;T=0AO$w?ADmCHo>~&$=V} zithLjYYuCEIp6Uo`mpxFF?Kol5%a*0wSl$1br6hLCumc@))LlO-cgW~5R33}aAKV$ zZp26S7r({*@MWBAbNHUMxpRp%gS*5$;w|wG|LQ))cIK+>#7X*dpSI*UjK`XX9QX#~ zHSWDD_a??NC;cT4Mh4)$hJI)|y~ z%6@bQ7w{~nH5q@6MULA&>@KV*{EOTG%q0&jk0l2zf0bNT@?2Tpi$}7ix30IQ&$?c& zT0S`Id-($Ee6`%yR7D=ZI!(#8+P#js&vuIT^r5fhBy7tqq+~3{Zw(_?9Ilu@|D^UD zVX}|+L-Z@xhLhwM-l*+chv6eUpY~vYZO;3fp8eo6o9%-);-g?R_sv$F`KK12 zc|PO!8XS`oU>C4Pd9^^9@+(FR-PnTPjD*lPDDR%3hl z7SD{5|4kkKsQYIslkMYPe@*`^Chg>W?pKGa=~M0an6Jsfr4E19dB&v1o7AqA^CP>& zYU0x5I{2jEv6mYx(zWN1c*C!geR3aa{t<6*OKh^cKf#@LVSw$^4?FIenAn@0#4Dfv z`r*I};EyrMm3W^->}22CC-0|@$2{JDzEhw>F%Er)GqHKNL$|Qc2D3$SFFyS^;DdkX zAHB=qJt6O0dgoZ1au9Og{WD5j$a9lCrwR5`hZB7r?5l(Sa0Hff%z68YT=lrdi5zo2 zT;b;w`>C^?bMC_-v72{~d>_s;Hs7i9UKbl4IraLXQ+Z%>$2re|$UZTon(Wyf@3M)H zdpVEg-nYH0+hRujBq!ke>E;*w?P|Nzbsu@)v-r%~jBmtoc?|i%#B1q)EWaFozBT)2 z{VF#ro@Vc2^Thq$ukq|p%))QLsP8`Tjow`l|4#Lxlkid>c`hSPN-QJ}3ub#x1hYNn zae_`2;|TY9KH{Q%=M)@tpFYx-e)_(&mt*0O{*6tHrm+3uy39eyvS6pS{~!IVk;E^VrAzaV~JW#~7R-7z^nZ6pV1jK-@^#kjn`grnX? z5Ua|=kfEGnWUC#;KD*@}xQK3cr@o)7E$eBx>-&`}cdWPT&(+3EoZ}PuapMZ7@g48u zpZhsvJN5G&F+j3B1Cu8A*j1Atc&*kyt^UMLa#Z~OST)DQip?`CN zd1H4!KI>2awp}wGpJNJq8@IWbhdSIMFYWn$C0^qUj*IbpmqAY6HEc>`9BvvTUp*Ti z>zh6o1s~!e+zVpw9O;h_v|fdS*h9LdSB1XCK;j-)RI{CI zIy>$fc*UI*eCfBd?>hL3orTd97|b?|rWjYS%4gs$4&j-5*nf7O|H3uCP8`P%Xe0Nh zjlQ37L>*4Mk3Gn_%p+sVakW0l$Mt-VH9vohGh$iq!if!CgCD(I-OI=E`LUVN$xPL- zAl8(V@~nnUx4to+;3V}-jcKxe`Z0);jL~~(@ja8>GZV+y9dQ`D3lDHkuP_7S_TkMo zoQi*7Bph%Lo6LWt#7?J%TW!E~Fa%Fi6&TZ>0$;{}ch)M_0`SeZ$Orgdjcwy`&U07o z8duur>$IKPIeybUY=M2_&788GxunK5V`4k-21n$g6AzMM`pEcQkI(Lv2bhkW^Uh#K zUR1nejSZ798l0xynf9jh+I~E-ZGwB=0z+i1m!Y9Ia36Ie8D&9eH-ugZ7<)n5jCD-)V@o~n4M|dMQfH(XGj(9c_KY=&C@4`>8`No&L zf&R8va_wZ}$Qb)Na}Hnh7nzWeZME~>E9K{KW-|Hry4c;@JKEolUbnl)H&uHXPwJ_z zo6h6U)pySE*?#jwyy2ZIxCnQ89N6BK5=;eO+8ARlSj#oJhyCYYaEEWfoA?`e6gT0G z7)Y+bdJWI}c6Mbu^WKqr$8&Kn8-z3BP0zX`>*>_>WNr8TPPW}2o9zDCI%Ztsv5ohq zdu)Aw{kDFyF9+%Ua?fwXVbAqW{m!0)pPhN1-?e!cOsvGecy9o2PHoFecn&MK#}>-1 zdEdvo7kQ6Ct`rvYZe`XO>bwV&n!Qi4Mo;nXfi=B4?-r-_?m^yd>9-y8u20^9wvRX7 zpRpdtmEParjXqps4dFLsQrn)ac-E8RyVM8O_lf1?*bI5OsfzDhdyeGUrsDaQytDTj n6m8Mjy9;%9ccDtD0(JKmx8hD)T#A$676OEXAfzZE&(vK1^{;>3JT`Movz)1Y7}N6pJIsIt zrn28tX*)2D|EQ0VOXA5Er_SQSKmYm9LQf@@zA0g%cJfCNZpvJiWF3o>$6)zn^8Ihw z%|inA^sj&YYx(VOe_MX@o8OdQ|N7VE`s=T6LHd`!{AIcBy6ei%fBy6Gv!DH}{NyJ; zDL?-4kIRpK^rP~_AO5ghbImp7>Z`9VS6y{gx$?>@Tlm2beo%zVF1xIS?|=XME&ks3 zzE^}xF1e&!dg-MtzWCyc%Xhx>ofa;-=%RArg%_3!F1X;vaQ^w{7va3~&MW7hd+tbr zzVvCVemvuwPeMOW^X=D@HOZ5<-mIT2$c2mqG84$}+H0?E^8Cdwe$iwbdEaou4MngA z_Tu-y|9$!6AOBeX^rt_SKmYm9E&Sy#e`$MVzxwdEzx}NYhQI&)?$(LS|pk3NdR9}CCVWPUp zPrpkV@3`ZRWmwo@haJjI3EOYKeM#7EyX}hLbJCN=>SZkH!TDrugR;oyZ+zn$Mc8GR zUCM5|?N)Z*efP4*9($C%_S&oLv(G-|o8SCq*>Au7%KrQBe`7fCzyr&nhaOrEKm70( zjyU3oa`e$hm*bB=zRaCF_r`GY$tRZu3l@~qPd~k!dFGkrTi^Ot(?xW~cfb4HrpxFy zdIHb!%in)FvxqO`Ku6ib4}IuEZEyD6bI%+1XYalDZhK^(gzQznUk4m;K=EbP1QzGZPCYZ?~!>z1BsAk*{#_dYLaz?B5t!69MSU3YDq z3ctj3p1th#3+`^a?Y1p!v&}YT>#etLVaqMIEL&``McI7w&C6H6`qi@Orkl2~$tIhW zjW*h-Y`Ecu<;!3Ga{1J!K2;VjT-bcq+ya`DX8b|NEOxvtQZcU{W5= zz-XvKujh;M{&R0PK8t-G3_X7Pw0c?hAeQ^j(t|-i;Z@&f()#Yx>2I>QpHJ4HkEDmi%Jr!%Hp1t~+dA?qb}3op8bl z&HmyE-}SxkeQ&chWC#1f9L&OV@UF~RCFc_77wMd1`gHR8b58QokA9OD3(4z0hf~Uu z7Mou<)TalzqfXW&-Q!Pw{~6{|H~8zZn7mh)#PeK3~(Ge(~tTuXFD>ZIJ~tSM!Q zVMdL-GjLMJmio=%9p)YP;w(_!s^go(yOn& zdMoGWzWwcQFK>F&o60-i`Ofl&H@u;|^{sDhZC?A@*S31{^rhabUiGThhdkxD`pQ?n zvX#q|*8UZ*ctv^r>tEmUrHyHR+N`?js;!<_o8+r6&luv@z3z3b4{3E$U%qtuH}^hI zpDBOyo8R2Vke9SF^AVfBv|#;WG9e!^oh+@4T&2l&jWyON?|%2Y%UWx#Rn}Z{%~mGQ zXF5z89;M}d<};sZX?f1%pZLTlTHY7G_{H+cPkyp|gFDyPk=}Av&b>(UI+~+>Gtg^}~ zEq=;Vp3>^5C;hzVJ+D0NX-{i;&wlo^Tc6^mKmF1yTX zt**BERwg#Kw(4bW^uO`+!G36~u6o*Ar?hh15R_}r2C72_^2AxMHu{e3Q*IpftvO@r z2hNnksqwUdH)CcE@F}f-vLcgUQa#+(ufEhJ7yTK>x^YpNd1)^#RxXdMrRA9udCOCV zU&$j&GSZ*e7y`M7$)6nbZ!P9w&dSN-BOm!lvq8?H-ZjbJvdovv%{vuy=FDk689Pcg zYz_I+5!RPIA`9y$2Xevz^0l{cLq_nfjyC)Ua)MiZswXcPlO{vhRY$+_?71MVPvwI7 zq+GxJXXS9Ce{10iT@g zl!ph(jcfm2@q=|AQAR)?QyPRjWE(&{Q_Pt9MM=i0^;d-nm(_ztk8 z9hpdL!?(aw<<1s-bV1sALVxP0s|}gLgL3^?yYj5lnCc1E14rgyp3>@(5gzCp@55>R zS~FRwAAO;neKAjaWxd9Q@0`&iH*KspZR~@6CO`7g-hQfYTy>Sp^I5*M@yt_RbgjOX zY3J0Of3=hLeuy^Cuj;|QbFFi;&-zhUTleqoft-VtJ1;v!8=vfyX`?TB z%G|4%xAxljEFY)zt)6^o^WI>C4O%~BmAuS_tn^Pd+W8D)#aIr)*7I`Awe zM;s$pm?cAd0_Wjpbcy{{Zf|fwUpT71G4zSwaBolT9q!o+v34*JKEjf^>=EwZFg<4M z@EW$Poh;5e>#Q5^se7!>B!|Kmb8vTt-{eNuL`RT~v^A0eTWXDBdd@zP8(i22dG?Fk ztlR#QyM4zE!Cj6v+6wj_mQo+~^#xl3%(}CIak%x4ly-0k^ZHJ?IxtVa=N&0~pq{xH z!&u>(x#`QgrC}NV;6omKnKL}Vp!LB3T>(4x+*;IwHS2~YeQ6`#`p8b3)YW(NgE^5i zOh>Pfk+GCnlXmz*w({`FXY10AoWdvTx7O$c<&hKpploGU;vIcUI z7rDT?b!dlI)=Ca!n6=8YcI9LPKe&NI{5bfMFHc|EyoBd;LF~6-;aKTXZvLz?2%xP>1AcG3fs}ubhCW#Fu}L_o{`ym zd4e|K2(0LvOoMT{(mtA(IooSzQZnabySI`rmM_n}kaMj&D0cJ7PkwSs+e7zA>bWO+ z%wrzY%H1dBu1FqxtG_2c@rmuMt3UO%b04T5cT(E$Yt>Wc&Pre8sGf59k9yRjTA%L5 zlxv^6FJl>#@8aG{9s0_g=`rQjr(D1AZH+Jpr{qFb_zjQtL%w~s56bY5-cV-$l+j0I zPxs&${3_Rm4#6>c4IkByzENgBV8fW&Wv}F=OuoJ1=dowjEVdSVYL500_q3liYgYUI z!?MO5?*f>cIa&+ZTNhnoZ>&MEH*iZIxsNB)U>gT=r!Nif@nO`(2fVR2+Te(C{!BQc z91rOj_2HU5Cr`M+Vfcd^X*h#D_25??48x>#z^pmLl{-~>z}=E^{b?&tnKfH0Y-+0x zercQWl;;jv9A86U+UQ#yY4gyhxyhHO4K8V?|E$Not-A7*o3k-94{OE~>(y3$a~8Bw z7EUX}MfKFDAK=nGvwp3aTrx-F!Kym!15Crey~GcDL8sw|y}}(q8V;2Ej2HG3*L>Di zTDf|B0(ttUXZ07~4QI>)-^~l|aEA{UuK8Y4Z*ThaOqm_$n&^=DyX4NU(r@k>*=2zY z=qNJ64ejVB0oG%Ga7wwnJPX5@*cbKjNuJnedm(Kcc(B(Gd)UL8-ZUTkZhr7brUKnA z4_;ux9>BgbZS*5gxpm-)Hu_Sgo-)`}2CuLVN8t+&z&;Map?;Oi*It>=u&*z9IA=c6 zcm><)n7evn^GTm#pUn-QjH3^2;5;1Dmw75zpY1Y+v@$j(ZOv0#duWcvjJ<+W!5Y)v z9AQ~M#)WbC&bf`fxA!;_-6n0X;R0Xmcle@=ouWteCDxz1_MOkj&$WNnFZgT?&I-XF z-^X`?JX6fyO!LMan(rXtI-3Hs{84kKJJ}sFqz7;XFW3xx;e(NB_@bO#@r7K(_&~9RcFhl#@IXCygOP9uK42A|lv|fQ zf)99uN%&C**5#|GKXt=DxH1O;*6>rAATK(`e3XYnI4Z4AefzAA{=*^V<`mu1&)8D|9{GWI#1Fz*`h8jXb4N~3L{~e%kSAX`eu_M6 z!vS2t8*(HMJc4_eS0)cH@IyX-j6Tu^cfui`$=$oN;f?*VSH`uMo=e-mM?B&YO<%*C zV2{`2iTUDhll#cG5zV=T(pBv z@{|2Am7|Z;uFJ;=AoAI<&t{%SNta58K zU-h&Vi|+`z0?n2aa$i_6JAs17GYhUg3&*Y>hNMs||fk zCiWgztiid-8OPq)^Ak@z@y73s&NP2~r`;UM60g})`$*30B)Pc<2oK=iT5*7UTn(tzbH3_PNjVxew~4j&y>&KCN$`^#y0?1J2~9yl*3|Zt~R8 zPMh?fa&h|T^U^kX>Le}B`1q|%kj~iVn=)hKP1Yb^TAp^waWdudQm(G?| zMV>xzi@x%XxiWotcbzZDCv!JsKj|HIkAK475VPg-`=G23DNCNu(tMJ^Sebk}SX!Jq zWDsA5jFibsx{u`x^kV8L?}M^F(5*g;6WAMhu#-G#`GP!g^7xJ^W5cAyf-*KEpQV$R ze0$uNODhY<9{SLSwl&yOb_GZ1LiWSn@ws5Z-pA(1V_W3q9Hc(J$a60MYwF2^FFbOO z$6vG$WC(}O+Ri!bkGa$H?tf?UkB?>_aGX7aXZQSY<6ecXF<-U;=5dDnV4wV8A77NI z!{?I55#=}}t)9NMmG-?1Tu~o)*c{(4As_ngKKHp#(~&rWH{yhF$7kt$PFhUveR*G& z^1-~+&p3UouFu2z?em7U(Y9YhpH@G8_w&(b|2gT@&*zEav==9+YhT658;nyf=J&Bp z_yfcCk`9D_dxsbJV(;+9e&ZEiN*)`6BR=DXJa!0QP5}T<%_jqTVaYmC5n~2wVfj@K^`I@)$8tlV3Igy#bmV__(KrZSj3t!}^hcjdz zzTlWN4)M{H_@4K?XSv_~?$>myy|&MMF<577VspX;c{rkO?1?>= z=d%!-B*v5U7aPSVWb@nw&@t-y4jf!MgWFHPFE>+vzQ=j&vBx%i;xHZHdxi9b`O!1( z(LATe1^9-2a=-^RhaBk{Wn_k1((2%la``wCTNU3-9=_n1aoJzzD84vfo2?7($x0e$ z`n-IGtEuo|ux-YZukW6FgM3g2-Ujoh`nl&q(y*>yaq{|jSbp-vOA>HKpL`-`EBBf9 z0$1!SEWo>19^6Z_HTc5DNW+Slu2nBK2R~ptMR@UQt5c|P=A5WG}`*5W1+a3;UyCmF5yVQlr zq$i8jgL8F){hlL9FRncG(qH--#vzaSBhA%fkbC zY?5+ZfhBEm1;>0=p65F9@PzE$OTmM_oPD*Y-*NbqQ%?Cm?|P1tL(W!k?VieftP}p( zL$;EQ#C!5l&wB9&KjM#tFY&?ff!uIIj6>`So1+i>(Z+YtaS@lot%DCfxY@S{Jm3NC zPR-f0=L}f}%SlfZhXYF+>lc2~KI7(dVs%n4={{C3pW${`I(dCOtZtA0KHc*`em?hg zk{;wr>JQ6zU%=Mf>t6S2IEXIfYuQ7%zz2H^+xAl#+X4@8E-yAo9=j6GN#lv2FI-Z` z9RWRV|KU=7zmGtl=Us-QjykIS-tIX0lCk`5Fn!_t#~#ADv$=a{b_Q?g8Fz(#dw~qd zi2V3h_+y=7dCJ3q*cW}WDdgPq1($Hk_{LNpm)L0cXlxEX!|R}ZnTRWk%MaG4Gw!iJ zUFmROs&UViomuBMccfb2xv!mvLH|!1kV2ZAzaZXZjiHjWUmb!f`9s!#xMGXj&nC)UZdoVzNV8i>3h2P()T-6 z&ZK?MoupHSEBC$cecN+qWq80x7o_biEW?exg?IKx9{j^QT+xO2qD^cLzNn`SzTg_4 z&S&l1OBvJMu5!QYrLFTXJOJK+JC)S5MNY6d_)XsmfxHvm9mGWSHy5b(|qfQ6k zQ;oxy!8L%7xZ8Bt22swW6%EFCwr$E?qLR&!ZG}TL3SzU zA!i+Hf=irJm%cSNy^1${70>Kv;?M6MxHET#aZf=m*6-c|Z#;W5ck9IsIt4GR!S80l zzx%i&k36z*McQ`}4m<3ymX9m)_@eUtX2I;)vv1^;{_seDUg)=S1iFw+ZYw-3bd~=N^6N%X1L2Vqb7d8|MJ{z$aXD&X|cm z|K5=2jMnMh8vYdD$vY6%YJT`c56}~A4O!ujwc-NK_`N9n!56j%U)UODd^UVZ8rR4m z_au0uZ~971&yX?yfIXg!H!wMj15?cl)<+#r7iZFM@IKWz{Gm_X3wZB|&4Fk872gb2 z^8SnaFYmO$OwROt7Ww=ccMHnxEkA~?gbDU0oTIaGP=HD6f=_nJSadeOkN-}W&(!;! z-c^8KHrTxddBpd0-)EiP7oZEw8?Wdab-ZV1ooq9IEquWlzZ(}$`S*r!2w(6^J-oq7 z_YHK8zS(WEbpLIi+LzJ~?=M$WwK z4O^rxPLLfgdDqc7McSDa@6^L9=Vtc?u%RDmXMY^>S=v0*^?fxQp;KXxe#d8bSN-p+ zjnnSpX9=PIGi$;2ehUuq{n4-pj!mer{~Hbz7gltQC)ND14%0 z@RLsB1LKtXILT(Q>wE+DhTJCOjk4(uJ>Ex|o-WR$-yZ)lAU62V9R*Qa_)BT z;NN8&=U={G>faWi3#nl-Yc){b-5p5Q)_4d$P+ zz5F|TqKC-EJ&G~)&HnT0^hw6{%RM+=;Mh3MIFoU3l$`1N3eKk^URu6nE^y0+un(T4 z;fei&2Q~+eaRXNP25gQr-q5Sz4IJ4^{l))>3HPmh4LpP`Sn;gKIL=4*11@3Ac(CG* zP9N?Z{5vw^{=*&b#*qJKT(>xQCm!Mzu z1l%AKwuzl_E+Rv=j6dvNz**Ej;7fQTJ(K+D@jl9Qa5^3Fl5%IzPqRMfOYb}R4x8^L zunBmBFZLB)=zU|r3Y)~Xzy&+uj)1*kgYbr(fqDB1C+>`LR)z)qVOx}`XRn=S=wUda zvz;r9=iKdlJ`;cb%~JB9Bdpa~gFM&|YxPbazFQ9&;k&y5a`XNgoq{9o5%8Z4VMqCR zKGQpN4qMJ2^_iTNvDx$r&ghdbhd1_*&8O$cd0FC3Z;wXF8+}a&XY{!wydm>pb@}M_ zf#1yL*e~`07T{f)-psiL&w{1i-pC7Yj3tc=&bqNPY>hPhNt-u}@N0}=JiLJ&m~gM= z-`bstKmTUAxzQ19fID&=abAagXF2mHC$>fm=hEt%yLDQZdjYnuM`sB3#9FnX ze{e~jdq;N#`o$UCaUX#<_rCYN+xWwHBX2PDm>ySp)ZFR&BcD-*CE-tB$JqGr@P|LV zamO8)yJuYC%fo=Z&)t_hB=vjVus8H1eDULy;|;q6WA>hZj*sk&Kqu=H4(Lrh!6SZ} zv#>L@z4uILCV0b7JNMjko6pHNf@QuEU(#I7+dkqzo~@7)mcvc^%xqvTBASI>>f(%Qf+ zpV{3e8$qXfUVtzBCb-~t^G(<#dg_&f0BykwmGhUYkKPQJ6|*;c;8?ObjRI884&SC~Iv4A@XdHGyF4W zInQ5k1sAo&KODg==O%nJoOtvpQsOZj{aizC*uwLDjybxVSBpsM#Y)*)8l=V z>0x})zx>3~d_KuXEJw$=0$&)H~j+Ff;!g9N3#Z4 zXG7@?vS35lEd42Wzl~SUN$~CL#Ga8eS=k46&OJ3BY{#4qV}fw7umUx<7O8%HFs~fE~PHxBS~|yUdYI zCNI2!b2djCYw*lPIqc7!JGWeV>80h8OD<{8Lw)wH06V2U8L=;T<$16>6y?h39&+Iu zc-H1lLY*by#$VQ<14eX&!p#Mg5d!1sd(X8;`G+go?;p^XVY&Qo~f z+=^;wgwzwXJDV*!3TTKS7mpt1*X{zHb+b@xF$_MkRSVDedM5?a|>>| zZ^R4hreoMC{GhMg3FtfZ@g%{C)i^u}cf|ZOWAc;f zRnKp{GiV><8^q_f_prkM;-}?&L$A6sfD!nDv)CK{zrMW3$S-4G=v>_4@4%9N%mq(i z2)6h&#&ZY77A{z@VC=s!;I{?njPS-Y81{xOmbO-RTF&#hf@9_l{|`e)Ja)`EN_Zk%`(2Vt*8$ zbDw5Rw%>QwS6XSM#vQokbKpy2_r`oPIu>5&J!kp;d=o!Sx&EDBopI?*J_f&x?*~hC zIV{4Y^*G-cgO8&w-Z=ZfEuY^xeVl)OlY{LuKL6C**b;MxeQSj!@?#J9S9F1xuE7oG zpgikkL&(qlTOaTve8L-db@ThwfBSlawi z@I@cS7x(vR&L#Y2&!Opkdj;q0j`NN4z5TRT-p3t$e&Yxfft>$ck>T9vq-I z*bnl_GaLNyyo=t!FSbeAc}L*8;wnDkiuL0UeWJ`cl+F21djVY3FPj4+ z`lWx}G4YMmWpC(V=Nt1F_ix(VaKjCaAI@I5ZQgj}%z-y}z@FlQ=aJ@2zc_>77<*w& zerrP+?2GgKif+;mx$*n-2a9+kkN?GP`RxJg&-X&%ioNGov+MY)ZXbf_nTUh?>4>Mo znY0}Rcfuccy)e#KqsL&D-sD%of><7|xFcf&>{re=_F14uaZ0(q>0{XN9Y+1JC9nW{ z&H&QR0M^8A!ICo%d!r7Wj5m1O|GS0busfbdI=j0kfonWxFWEtJj!l49_K>aN)AC8J z4d?lD*6v(n4ekYfr^ojbJd--8UJ?2Bdx%-q})_8-f z)4>^i2K!TuZwhz#SA+G9Z$5OYdriI?oZ^V{P3{HgJ9k3fLBtE(a>gCBH$89kjf?#C zJTs?e1x1ju%4ZiS&%)`9d3+EfYmG#jh_<=9% zjB*@-cRrZ4lcV*=*Ya=v3cgEf4ByE+{q)nDEyEjkAfB_bW4Io)WXHIE%1Ju{V4c zKAJNQ9f>z|p|QM^k@_h3IAddVa$PVvAq}#_-U&+?l|=@Hqc`$CNKd zR?cwbVQ#pME4V~2;CAl1aEIN&d1oTJz`2m_um*P|xRiS{ca(y1a^a)m4td%;e9ZZV z?jb{G8-9VYacf!TOt|@@{Jq%B{fW8g?9d<~}2XepXK6u=}p?2MM*R{JZbHiVA zaxdWC!d&qNr|Akl6x%>n&LiFz(1uR2CVnp)ghSSqd&TGx<#pj*q-iqS?A6mFBbP1zVQau*$400us5(^|DESy+`i(4vp#zg z--<2{Z|GG1OV9V=osXv-o{^{f5%nY{AQx`R=jrClu>MEIA$v2*usE&^mh-*bKYK2KH|~S!H|G)W3(#}k zt#TH@3w(&Z32$%*Z|FmNOE&Il=}$UXKX`*H@WAJRGkxL>yTfNuhBtIFOyZ4qQ9Mr> z$6wwb{n3wp)Ybrl=Eg^2AK46c#QNwC_@-Ojqgf9hlO4f%GVz`P+3`c^ojku`k9^i1 z4?PPN_<`()GY+o0LnA+Wj4pu_=STa*-c7~USlcjMk0WnX+(|#9;?E#A@>%~$i;YWf z!8$v_{@Xjx3-}&z&VRS}o=G^1s2h8eXW{fD9E3Myk2h?E=bkXd)`UBFArA)A7k-62tl{fGa%#SL*soa78VQqSTOq4d~ z>_wgl*gJa$2e3|`I^XES{gN{btlMw<&lj`jbf-Ip@QPi6hxzm8Hyh$?!`IQLdjYnE zUUi0`kJ&kP2o9Cg*{}<@h-62Vk3xWE=QX)<~}I0mu#a zoQDLu#k%MVYsNu(ie1vTHsq*18<%s9-^*qHjp@A(cArkUDL&b-y5q1dlZ`Pd&ZM7V zJXo5%LB8liUSet3biVQ46YlWG-Rsb?IKw}Hd43aK@U6x6fnJ1**dk@@41Rgezz3l# zVas_b_ql8t-q5#rgMV~6&Z-B8@|3}tXC34G`|fwY+wLUdL$bU0V1DN8`9A#sv@GyD|zpo3vR zd+&w{xfh@}-O;i$YzYj(lQf;{jLq)g4SU1ZX#-EjQ#S73?7ZND3z}Ta&HC`(odw&9 zGjs*qkb|=gTSHFLc+dVuHf##+JB>Xx$M|XR&Q3TJnj3DgGwuwnM_?z&DtF5GLO-yd{8oM+A6FnxzMekWF}jKF z!AH8r*%EKuN0SRX?;I-Fx9R2$UQLGgQI_?%A4Pg;crvU_xPvp{k32YcW^pIrPK`dK z-|U++I{l9mun!ZSr+6-bOLQPVj9sEL;YFaE;l;f`+G%U=wP9~?gN-s5c%h5=i0l%) zz>#VaHesLN%@ZFlsk9^|WO5>FEJHL~ex^$28igkI0#s1JK>@uF< z4h~trby_>SieG$Q9I^+3zUR%G*Y?7={_StSKji(Waq#BbTBNy2|n`E@Cx?$ zf%F+)$#1`m>+fIx`d7QlaP~Gf-oP(g$Y(QGHqbf4{5`X=X1*G`D|r5o3q4%bXb1q>^_y(}fN8_)-h5ZX(U|Slma0GX7L7sH%3H*mA`pfx7tPf{k*rb2y za?j5Bb^3)f=Lli4-?|;O-{w2n-c^Q8bAxYd!+WxE_F#wjYSQik=oLDJ{s@1_Kyc^o zUJV!cr}C`5zdMvKkDk$<|4Z-im+{Abn1lT?FLy4ZxQAX^UQLGiQIz$VA4Pg;IWw#s z{>bO2IdAfr?T0f7-wU>J04DH3Y;Wb;Q#epA4;G~DdpN9U z*qr!n{WE{|gB;~)gCk@u#u0o`jwjl)?b-BQ3N z4Ax8iK2DpP%8_tjN!q3Euo!NKfx??{+$O@)PW-{lg7=2NUot z4~JkQ9H0;Fu{O9sFQ-ghX*P$wvG;g}Q)2eUKGEsULwq3|#4+aqzP`C$b=6f9!F=TT zcw;T@=G{Z{p`5qa4IFY_fnULAI)n^hpIpcQ&-5YIR$7@D&&U)v)WxyX#SitB$Brp; z_rfN*=jR`KS74Z**5f%imp90T)C*Vo&uQ1kgMAF^Pn`s9lNQ5S|2gT2^3z_q00T)6 z#`@~Zr8DMW-Pj6sCJO5GV-9}Sj=v`G<@wFHL#M((_yXV3a1SGNDn7vkI|2vipMQQk zyW$nx_k7Ww4a)gOTfESgPw#w#H~8v2&3}O%zQ5-ho&}BbH=_Lph&AC2Tj-2p?YZ~h zKhpDTvoj3*hZE#Rhmei5Af4}PlA|;^;tReh4_~ZXnjFyuoC9Ll?3bx-Xk3JyF<6Oz?%BTI?aTLW@CKi7 z#on_;@?eC$VN+ny{WadW7choz_K73J*TVlbuo+k_Jv@=$0jx;Riv-CtE{OZg5 zyd~+QZ`-GP9!->1f1axt6d{j@vZ`Oa+)aA41SJPhI|cn}9aiGv59Q!jbJNB_Cc zlO7h}ZnBVZQfIJ_lqX+3>BN0n-NAnPyuq@xwchk6P8)G#k-YTL*HZ^Bz3=2*8~3hk zi@mkia34J?-#)@Z@}2K-0j_c%Krgc?>gAqIIUA#n`uM00Zn&F*Mdt|ihA(H#*dp`u zJO1PP!yEX=8}HUhH*`H;iH^Y$oWKv57tBAO!xu5W$ftMsV`QvvoFH5L zz!!DH7j@VlWjIFHxEtUb#P+xkJM>~DEtHNu~ zZ}@3+x@U&Qb3egPGsm7cqrQ(G><@3OBfMb)t;1cP_b$!V^BcIuBl02}oPceCJn#WG zVw>fM54fN{+pI1=#Qw-rCWKEp^T<2xwA0#r=o)s~b5ns1awep2-1*5PU%sU0t^8i) z?l9#mm*=zhZ@v4VKW*K2=ubU)?mE*i{pSAN+6D8-yF}XRN1nd*p|1Yq=|jHp=pUbx z7Mm-*U~cNWQ}v9@9Oaq6`S6vkNgmxM-<}BS^I_ESSYq*D7xDH?7D0#}m7xmQ(U*f~DDeQ@Qu}L@wU%79C zAu_aX&)@kxp5JH(WA@B?-CIm2ZwBpHcta06ce%%~9zL4=$7N>;=W=_CH?WT%un*f} zpRI$>Wv#GJUdm%rhg$vtx z^~^KRZ0|uRKl|*nTfO=9J099ugL3ti`;8rUJE`Y4tduKLUpwbl_d~`shB2kpQ(w8d zVxQH?+{`)c#QHO~bG3Tfq})1{3)Y#nnX|fNWv<$gm9fZIU2XNLFS<&s4mnFl#`=I& zZQ$JANyDo>vqyBN7>?oG9xF?Kc%WZ4LObKhgAL>0NXm_+Ex#=sgE4u=F}^-CymOBAB)vxy=aca=s4B~v$pZ&(6^|CkS=6quv?#J0g?_#p!xI_1nCD~aI zIjF~`irrmXD}BITc?RS?CTV%>JKvN|Q_o(IqkY6Va%6w(fpKD=jHj+K;V0)QY3`$i zuD(+@^HeUauJVj!?aBn}%sjN0RxVA?r>%a>Q~it&Yv$&&HqvlzEPdmF*c|0+uTOo; zv*+fdpKwE-y6WMBx-f-r;^^Y|UwC2vm1&#jn__kF2L{D>%ige+vE^_HTh`$2D!g&e zJ>7rt*W3ldJzt-_$+OtJ`_GSvzw7K1oLRFnJ_Y}Sy^OCRmY;GyhR^Eob@(^NvS#wm z-e-U9n|%A9b5n3{f9-X!1H1M!*j5h5%3(8@lBX|YNo#{oFfHGh+S1?nBB*C?jAwjp zjia4%I$ycA>gb0pkS8q<4q;3nGgvjY_WB`D^}?g@+Pb8TsoWUqnv;3zUpa1MY~!k9 z?edJ7x-hN}WiV;%*a>yu)11g%J8609n=d}7m-R?nk8*8#KH&+h)4BXiekC6i?xo=+ z7=a1-!3KQ589xmVjUkW!sI9Yuvo}r|m;G^{#@_fo%((viHYi(xH=fhP{yBSDpLM&Z zb^quL1~+)dc3Ok^3+%0Y_J!TiC!G+R$_i!SFFZLyvNO?E_6ZTcU z`PkRs2rkuwLwl-RUjod@3(nOI55zEPUe2cUhuFQ3HCUh68l{y-e_E?{)@c6e3qHw$ z-taDn;5?+gdbnuKupt<$*U{u;4#tF6v2o<93-|EqGY;X6wHuc_^o;{#VXelLR-Zi7 zw;wnJqk=Z_$P@?dnR@yO4~P0&Rm?U*-2-1deENQOZHM)e)NfQ0socLuhROp4sv2s=}PZ*d2Z;gpRdX% zF&A8Pw%5)$Vq>^B@VW0_UdBp2J%Ix{K$*`1T_C8ZoNl#;`Y;|D(ywI4meWhh;fG9&&G*1JXFvUC9I}bt zp@;OTT$=n7)W;osBnz@3LtG&*^S~FfBp(=;CngX1%Hh*zJRp0#Qiq&yNL&5KR^d(h zz$fk5MqJN3%hm+@I6;31>;+um4SB^TNhjc%HMy5E4?J=YjgM>(TLVuxZQo$jy`TG? z9^2E&A-@f3f8FilG+dBJxIqr?+T2s(m%UI2@8hT7NzWDB5MV={a7UVK#pF*OvK_E(j`o)>vQA^-37aKP8}qV$_r&Z6Ug(n^!b{_lxpAF^ z&9CPx&f*Qf&$x8Gb<-ha0arKz)Ap2}p`+9ZH^k-zpX6qq>XHqvD6=o&i`ZxRxMK}? z7rVvo(iLQcGvr1#LO3KH9$A+V&WP31k92Gpo6X-POZD|{9s1{|!LNHu-zOW#AKu_R zzS4>I&Yt28onZdHd*ivMJtTXW!W-?Pd&SYuiHGGWg9}*T@8FUBvCpt(KkQxh-(K1$ zlB?Y#p<-{2NIqAz%H*3hT^(=V>*3%=ln4RBV2b88H@#nwvK z(}8%Tj=4*xoIbYKo{_L0Y&IOhhqmVKyYJ>`T>H+JSU25ECwWdrHtcY8j=dmbb&X56 zO5>I>!Y}oGX3z9NM%Eh}L58>h9XQ;QlQ#O*hxL-J zJbX(YInx<%WbJq^kX`(>*dX#!CmbSEToPL+Jz%Zmh%3(6Y${9|gD$o{?}a%}d4_A> z$MJ7`vT1%(7iRc}cxz9{%HHCPxw1o^7h4a#P1fe^ykp+-^#KEHv|z2cC13D4K^y*= zJr2gh7aW0QSd+HrI3O6?Uc0k$2Go|_p;MLnY(KS0U1`Cd<52jd4|Sbo=z6%br`8`n z&>ueATl$UuH)nfJ*Q-Yk8nz$Tv$u3^f$?Ui-LzK|7Jz$2St4tPOVJ0Dzh(M2uJb1A&g zRv+PuJV72G&EDxR++z34!#=}+z~{>6#PXD>pFC;jJ7*gDpyviY!V-C~v(|=d&OOc< z);kW~uxEG!&+hT?gO0O)^ODbh@qF2{Wox3V$%*XATs>H#4`InZT9-A)r+@`@>@}Q; z={P!(?86axg1*Us%!~zR=9E716Ia=BSb=LigtPel<_RNoVfchIu|HyZiynhJbB044 z=mQQYQ&%7#W5`zzUimKYOyBdt^k-doW1snv{U5uhAKX$-zI+hl>kntxos4CD-<~Ng#x%jOPcEX(akiJV5o_e=|?J$ra6u~VM3x!_H>Y|pfbJjvMF$vO7J-mwYfN`}q{_8D&30BQcCzS&Uq$PqWK zt>=q8_%;SzqFgY(eO0bZ9ekj_qy_Vc?x8Di4-eH7Ys-IeRtg-3PqrvEbs{3Ap2fOBo> z1!MK&;-h^qhP3|7MXat^uwQrvYxvH0kTyp60{6x?H}Z5YFgL$v;rR#MLw30O;0Hgr z>G+@i^rvm#J+GG^?t~Ba5l7%%-!NfZd&!5h_v%P1gB{N&-Q(~hJZJX)l0A2xGGCma zi*Otktc=m zu|{%$Z#D-u@@F5dA5X4j;(hdd!d`a)j#f){iW*@iFV1V7rb5B5N?zxvk3IOb%J z*+X|2-d})sb0jnO7O=zC^A+$*-vYiEQ~!dre%S^(!G4fEza`J5={DyTSi}kC(qj5W zT03}GS3C9b0k+_V4PqOevGeELYHs{4>n1zva2K6^^ri1Uwh#KZ7xD#sQ7?O>4}8G^ zI+}hUZ{v}tvB=ii`GasyUixva_WLK!9qg#zdZH`YV!RjA^W;f>u&r->+GlAPu#eU* zZU1mgxqSN)tiYLi$x9n^f*-+|!C3U8b(6Vs5Wfev^-GTAXa3eXF5dXQDw{&q_JxhK z7Ix5l?Fk#M4423p7p%)#$%9?NBXWWT^T!o3mc|k5&z@XfV!ycLky{0YS%x8UO4!DPh%DumA&gN-+b*x1i=EUZhbYHGdSRo7f z8At!x7@Ob3C-3hC_z~6?A4=cW2T#^-z3^ac>$Prkv?gWb4(sF)9U+fCp`-Z==3?J3N9} z?WFCmvXsN7e(euTTZes>CSS33`ek#(`okmX*cbiar2g?lU1Q)r{=lKn+R~AD!>;gs zo#pr++S28@7tn|A#f;<6zZqg&cTnbKeddni&OP)Gd*j^g{>C0;Kgdb2K6_3dS&Ot7 zZc<-f0_;g=|Lvvyh5>2$Vtq?zJbS5M7*S?C>2MT2ea12SYJ9vSd}Q_nf7p9-_PoGzfSiMUKgV4QxzZJ6WFN`X+Q=xfk|!NJ+YfSvKQeR9=Tq?y z+!N(K-x=N6lb?XEd^SfukNwWG5zoQsb>|s-BqUAOE9V>AL-~9q z?cFK3BPUD!lCSw$hq>W|&tmI0H#SGi4#5Ul`wU~Ss2v@SGjIwkcw-!8#^zJvjrzV9 zGmbxZ$j+F~ldx(%utPSv>tQ3E%it1k?1McJ3--}k!y{??BiL^k&=wD@-?^SYn%J4% zotWn^d_up|C1&Hq?snw)O$foiGbz^2Zw}}y_3_&?TK>4PVJFyw6>0LuC3;ple(1ya z#tDIZ6BYqmyx*ay$R{Wb%c zk|!DWztsSvf@h8Hi_~}b21EQ7wgIN-I9!BtbD&${1)tak>tj>MNm?HK(E;j*Q?QeB z1U-qb?hNc3t~zI!55D?d%sBr1+XrlldnNm0-sVrQ*mGDRS9oU|qo1wQ+VCej++Nv# zdvEW^i9HEd+#UN3A@a6PcOZ#zAbTX;2YZ$vKWY1^FYWAk_~zM;zG02sz;)P#8NY+) zTto+Y$IWlp!!Vv`hmQ}ezq{|f|J&dG_T_GOyIYIzbf-I&d*1V&?e{93OZjy;qaPS2 zH~P|ElApcjL%8qj?*-ha!7yIKuDaU54ms)zwqP4>$o^Khx>Z?erIp(Fx46YE+Haft z_ZydAe)%>ZcZ;6A(7|Nx`3U{MkMsP+op1Oewzu#dSz0sQM26(4KeCM;!==catkW+0 zC04GU_GC#9=@a+l!5G_X-LZ!_14q^gN8}*QR*^^Y*fw*^eVS)D?ya*r^ zw0HRIuQP1ys&$g5e#lUo-6C^+!N2~jHF^mC?HoF&rfr{FdjeKbMbNf{p2ShVTJt2nGJ_Q&jw(he*x#d!$p?%#9okz^NMF4 zfxdsYr@+vcop{+w^v zC~Mkr`|Zj%zE;lyyVUoYtIRi8uim9^{?#U1TxN^Np8cZ-%)y$1V|X`T`DCNt++{es z7#CmY3-h!dcGNnpQCs|gck9v*{a~-i(LT|q}~0zelm#u4U~nf2rwSZP5qK$C$P_CCr&!@Br9#`A@Vj4 z_d%X><0tMI69(*`@n8>k;EV6cRyu#>j)2`UzI{~Bdd;8RqzA}F8BWo~?m~TM4sW)t zvO0Ng{mqvH_HQ-@hmJqC{{Bu~)BaVKb<5+zIf1>Gp78_R1M$US zz&?;Od6RMWLaaRdqRg0rJnh*B&opp_yzB*;3V4b$?76w%srvR(dt8JiY1}uKJ1T8p z(Ejl~=oIDFM<#gV-2vYx8^@osF^qWE0-njq+UWsUv{&SeTb?yppFI(iRdgG@A3H)G zxI-p%BRx%DyJNOaGJ$(`CGsHy=_Ls`q`uf3^d&Yw^DsVK;0&(9jd}3r1bd3BY$whL z{7*iB^9=n?2f&SS=vs5X?QL({`g7OK2a*r#htHl>W*=IAXTI96BdT0ZoI9r+ab&$m zu4C{CfAOndm-6qrn>Ad0#Z|4|9((Ryjy<71n>x5YbFZ8|ppL`eTX*fR6t;-(Xnp(~ z_Y=<5Fa<~E<+Hm1*ylId2l~LikSpG?GuCZAYzln>yD%uNJ-*Q2uu6skE*OVi6WE!_ z0y(fh+C-O1v&&?S*T#bZykT>2m=8mr(gCjyL!< zF5dV~6@0Tdo|9NVF0+mF8ZKKW3`VEn7CoA~O?*?wevk|K(1mo0&+Gsl4F`N9`%bRm ziu6Q$(WWoUXKnjHzA$6o*hRc`_Qex?#(f;Je{>+7z~+QI?yuZ`t+?Wf&8MSF`0&<7 zE__+O3|{eJ@qvEfXC1I#^~-CRd)%UDEM#;1QT4ru%I7Vr@9>3s_Sj(K4a--z*sOf| zbDwEG#;l6Z<7+(_H;-9|)OUL~-K03WnLhQwckz4>huI#w z0B>-{I>b1{Z_vgb!x}w7C*qB}ZFN1r@tL2lu643Q)&sNS;*EFxaoN1sK)B;W#bAo zSSv5#-*Y^=+I+-0W1ANrRB-lU!`V!JfN{wN4&$?`qdnb+H*o6QlDnPwW8sgOjP2Vn z?%;~Da7K(n+Sp%v2lIk_{jneTPJUz$FJvutCuM$cX3h3NU()s!AJ~5wW%r$9=s5k; z@q7%r+4BM4!yLz-ds%a5Z`_%fFFne3;}IFN8=hmq3I759VU$jAw$Gh09b#|okC=Yc zSGYiig3ma}-x0_layR}UPx{aH1un=`A9R%VVt5vOrbp>MK06zl8-Z9|^k`bA${l)rD z)t77d{AbIi8?0aUKd9oXV(I83>i7RDXWZ?bws1k~Ys2-|D;rmTgPdU#=G{T#yRps1 zynJSB=qh8GKO2QRd^mO0$r+u!Wq0WkShIJ|PtMi$NLs$Mz;AU#UK- zGpl_iTlVdQ8cwNq&4*PTa8Z3uDeUs~uT{=$P`+I6rqr=sxF>&H@%+<#oU`EQE_b<0 z^HJPc)6v$!AMV$wt#z7r^rE?t7dZ)$p*Wx2so67gn2bB|mDP3rFfV5snAcW0uE7!= zYyZgsSK!7zX=6S9$hp8XdfaiofK}&cdeU0x zcF#9G>*S}MUTwyaHE-Ujr!?NopLa?*Vb1a8$m8no`R!l*_1*R;yY5nd`{~g7+oE+G z_X_%OuEL##Ek3ktvQhm#m%29kgIy(86jKGB{8`_c)pAmlTBz_vSokULz*hS_sxcDBUxAO4g&cnUu- zk1v9AvGax=_~bd7raCVE1DaH|bDhy{5$lkl@~)jr@PUmX_643E{77UDbL z5N@U)vCo2fVs*(Mf7u<_fj3x!If3o5cDOSpEYq9bXK@z5G5E7@-t)k9dL5S5Uw55$ zCSiAWs=8p_iS;+z>6I#@!;h&xQ(f1QN7ry%eMhf;KBmUAk36azaZG)W_=x&`T3x4k zlPQ^Px6Rhgez7FqAv-c>5A;b!&Rp`efpY=xhNZ(l z@`n@W9XgB816$@FKL(!Ye)GXGw$}b=Ydrb52v7J;K3i>3e{Z#(=Xb60aChd6GUt?& z%iL4vm6J}HS5BT+zc+JI{al}Kolws|{Hf!r|29|toVn%HdG+1@x(=8>u0Hqi-oOsq z)pK9fH*}|YkW08>T)J1_AMkr=zJNAw4r+?txI&vS7y%6^y`omsY zzq1xQj{|J7IoSu#wQ$v3aS;FYpMItLAm5(w0r)faH1C!KOZI!I%C0=zRce`*d03Xocet-xNx^d*J}fByH&pKP}j~LY*l?u_X2r8X8WzTDyLOl za$S87j14*Ev;~W}QMq$mwLds=%n5VKoRjMrs$%A(+AkY)>Vngn4O&p;xqrQb{=pSj zlnd(j`1Q9#9cSw;>+eq0dn4m*vDsG}pK$iTdZ%#G$#Wb2=mK-3%ji6|)7oNh=ma|5 znqctFZ&|gh_Rjh}@73PgVrk)>tG~U5`b@RPtH0|VEq>R#S1&Jn`Af_5o?rhBmp8t? zJmZ;9Z~JVo?3;H=z3Y0H6;~+FdUpLclRva(dH)*qJ0JfW)>yOt8w6|B_i@%-qkM3! z`kU7^to4CK{|?q#A6T<|`ZJ#@`|P{u87F)HK| zhE9W1=Ouc?@61g1pYPxJ&4uuW4q&JGzve)futjji_RtUZ$+IUIhhI8QIiApY^o#W> zbB5(l-0_ZgY_T-oTzrQ++~LNc+-I@iOp)@`6$^vqsh74s+s_1j@oiv?A3-lV^TL$- z3!H>EdV@}|K5KCPXm@^9_wQWS!=`w~zh8a-%(G3;EBD)buQKPv6Ut@vH++s}_p0p> zAI}EV__)fKqmHRI@%Z|kn93ErIqc|aUu!;p?S#s!Sx46IhE|^9+$Hs_Iq&3?+8Ey1 zIi${Y-)dvr7r3|M<7~Lm2JIa-yr#SH+V>LZXZyg$ur+)%dW4N(C-LX@ceq`-)19k) zm%r1bA$7#skUKr*jMvBZQr;czc>A)#U6wD)uW;wquXKVu=@nO4lxJV;$vakiW3%0d z9X`9Pv-Y|TXSfkO;SLVHqGPv|RGo$|Ne-lSq@Vl4Jo;YuO zxWW&-!EO0`Wb@)r!k;_z=xX?5W7$r+!9Mb**dV-drge|XPPnI%zWd$p-qP}X7FJkc zg&VQna{v$QkGSU$eTNST+6zA07eSr2ueGiD;RKt*4~>6Dze&>%Y`)*n;Jedj?t|Hy zLl3UsH?H`ed%SzF`VLrq7Y)8on}2G#@~SJ!MHTOOG5@ssZ>OC)zu6Lg+9{QL?8~Xu z|2w&!pXOD&z;8RH+M2o5{>-cOkFR%c^UpZF9A4Xdcjw1H{&6|0eqO*{Rom^^=&_Y+ z-bpyP%AcL{P5}<_pUf4u*j(#iZ|sfxKhHV%c=ptuIkQC`(O=O=i6d|IQfF9fkD{BT zQ(xVr6U$5BPu${`%avEW>UrhB{p$BlkEy?}w(ouoXE@J)!5_BA8OVO&jq?JWx>s;# z;p|K&@Ll-|>suvg>ZUl(Ww| zv&^b}Ih(Y5wE6Ylo2qt&Uv})A6U&K}H^-h>{j+-BIc84%z496#Re6Um?gj8`))7ZG zjvYMvu(Dv`>Ft>g?!bcgM%lTG>%Gk{etvBW=bU*~dw0~`H~V2Nd^CE1o_0@QpWFqK zzdfPr^p(3@cMN=2`cUA@#-B~BoIgfpumP|7Pa3X`CFWPCN3Zg=^{=g1o^%3iKkJ## zE>C&dD&<+vS*5(HmTj^5mSyfqi+-0&KjzQRv^VyhUceiD^NZrAIWt%vU6=3i@l~h8 z-VE9=_J)lo4}KQD!oKs1b3HDROYYj8tMMOi=mmjK;5zT|16Fa1b6x8kV1v^RWW+-4KA_jtqh zTL)fkTF?ESYaVgf>~hUjSGK$6OD_ISnKk>+a%$y(^*HCxt~Pc~ZF5AO*YR`fbCk*n z=Na+QC)8*7l`CTR(fl=brT5cj*ZY7uwcTNrLnqe$4zBZck6^v?tBvyR=Vg~(Qr~|& zv^^hU=lE^*$9~`~|A20@SM&hfv9Dxdj_eKIxXZ9V+Tmt9FI5>uR^%o4>`q5{>hmGo zdE%(pXU`XWmZtmrpl#otPoCG-jXMBiIGxj5tFd(QpzKTMOUvp(O= z+F%hj@xXaN9X<}MO5>Sw{nFv=g7pdP8$65I2qqA4;m)(xU4L(}uEqK1jD@F_-FICi3+wbwH#wU>ys^pdpYYCk(_T0O;0?Wy zd~1}3J(v!z$yr*y{Sc(_i5~OaQSWzq56r(^KqhpMIpmyfUebcJeXt+qGpjzo+HvP? z>pAU9^$vfh@`;asviX*L4E_Rp~c-K2Bq1l)%^_fghm5BL%|LoRrhGmY3eN8jEZ zAuIdhcd>Cge@W-=Q$Osr^ZWy=KjPg+@4pDnN&2IEve&SIZ*(r7R2;t%r(udO%BP?& z=n?yYYxZ>ydZ6;jdlmNZyy{1h!`T(%2USd;cKR8G&2V<%ui=q90k*^Q8n(pUfSAn@ zvpIO=PC&Z@>v>5(`&Vq9`K`0dKHuE0`Buih@ci@I_jG(WmHqSmxV`t>qdq%Yx2?tf zrFrp1`CTv%<796S$eu5!PR={lXWi;M6WN!%Ljkt}Oem+L=pwxH9pwIZWbKXL!N6VT zDtAS}y)%}(3H_5Te2|;@Y`a~(Gu&~}zi&c6thes^%~zy5?FG)*NBY@3;fp;LoWc2H z`m;s>PVG6J>~}P$`wwsE3-+C#W?XuKyrpxmORoG|957Ed)49`KE)2pOUx5x2=pN@* zx`tn+++8+Vl7};>GbP;9BhK%5>o?i^zi>t#`^*1h6X{m_%pWla&jE8zmB-fGYn);0 z*d(&IHoOrUFRBhOM|-7DxWXIjq(jKz*vbW*p%c!mK9OhrVt8dQoKa4kSAUzWKG!_q z_%l>#~!e?+7gFEhLa+l!Qu|D}=WN1%z*m3*js~vFQqIaeb*#E$G z=k6Ti`2rm(&;{0Q-qwek^fbSMF2pJ8!zE`ZcZ$>Pr;!2P%&)o#Z=93aIeLlQ`Dye7 z+wVN%EI{V=0@mqwPi>|u^%i-YEbkL(XQ zobBxgUB>UG&&iHIL1*F?z0TJ7zKP!^vp3<3J+U|Poullpw(Ny>lISz%NBuf0H;mMG zz_;7J{#z*9Y*G$Bq`pIP(4y}e;6A^ZzNV+)iw%J(=O|dwzcredGl8|jm@`CpGu`&a z+Wkg^^S8Ab+Z`ILkvqAv0rYpC)mpc?k}a&m8~>N@rtE*ZyYpa8tE*h#ZAdEl$6KW- zQ_);S;}mi&ryFmn6@wZjlf%^ti2(xSqBnyWP0S$k)Fg}vGYLXBbPIGhJpet?-82n! zfDi~%LjnY7LX&}@(W0WUG_YO2_wZQTx6Yvl`kX`gRqeCiaSv-f&suA*_x-*Dlkml^ zSU>PPI7F}XVBUBr1`y+^*${q5zhVG-=zpu!K0X;QpC;F1yzVhJ+uAWEoWUb~@J-4-Bs=-!jB}iz-J@YnsL7BXDDQ zCbPc&FSWJ*v%W@-fX|U*<8#Dmp4AL%|7A-DeqFw}{)b$xdFKD!rET*~H@6E*e%3g? zlk=r}w-nA!Z})AvXUOj@sOLw%>*HNf^4(PZnw#;9rTH7rJL!H=7&W=xDyWEQ_bfZmei=}$roPNe9haB{> zr4#?RO-y1wY@Bi79G#k*bL_0P@P;p?J6vP4x zu3JO1Nqnz$1wNQt^3d|S#%(?AxR{8J=!=aaC$<}J*b8xi7(jdEOD=T8|5(4!3!dO} z#)(VTdXB>axy47}F56~|X$KFj`*9_48eQNvP6s#U$KRNf9H(`qd06iaHoJK5`!JrJ z@HcF`cRykImYY5|#4Q^u_lzTaj=UM4lQoT;+3Mnochx)xl}q!EjojL>=Bc%h9Klt^ zDZa_OY#XY*rB~MPa8@2cE=>MGoVK~%K`?G>D*n#zet5QoBd&uj`589FIN3e265}X| zz469A9peJupzzh?hBI_z?Fj2~4A$J_<2QhC#(Vnoxy5u=J@*kSV{5A!g7K7bCy0rZ21^2K5TK9s+458p%=WP&HS zs!cT>S!4Kr4pV)^7vzYmd~)8+)F#a13jMQH{95mCzC&K;MuCGTO)gE#uthM3d( z2Cj}OuJJeGB;OBk|7~Sc*A_o+yY=&f-1r>NG5Lt()e@hn`{$j>t62-lyLsjOOGdcG7Vt%QgI5Z>!N$ARb1V3y2bk8^m^ap@+9Z4b zcgiRJ#{4ZUc?81P11z;5C)U#=ha2xgKOfEoMjt@urTA!{@1C2i7$xRqbB zzVXZxcjU3;v&3xHHgZ}x#6DQVh_kF)#A}}6h}Xnre33Yf4^b~GS@1oJmM$CkcG;3E z2A|{oG`zZaL9P9Zx5g(QKd<^17qUBY(B4<$YkY6vh{|=C4?9KPeVhh=^oJvG7tTZm zj?0yh9a#nMys_4XW$QLJ zSlq?7SnH4l8Nwo&lDBb+jre2v7CI#pyvITMW&`;wIMg0Jj(Nl9(zU*=N!8}hPsdld z-}f2#7&?T7$eYvMGvN?`*$gT))~B;$$q zYVIq}z~AQ2-8ige*>8SSOeg1j?RAxdem33`k9jsDPUDNz;xaLt+%(>Z&s>LV&QHX5 zs|NohUK0l@$EAzNd>o5X3x$^O6~eOc2PuQ|ge|H>!H z```@u;Z5&v!W(k4#vyxHg=euWp5(V1*-6)sKl?}iY><7tv9BN86MrnMcWX{Pt=^5T z^^JG?HeOrrz1EzK$GaW;jk$QffPeEV?leDqHde=si)}YoG7wAR)pYYFb^>q6RqO=& zFlwB9g`A$)Eo%s46T`6?VpiPeFRjh26&x1>v6Z+4xA8adNfzXXA2`Q=Ei9pwk>Wo2R_C- z{eGv$`i4z-_$v<%@1=>CHWmLo_moH4Ts~q=aYVc&K1)7rW3AZ}ui=LLviMB=HoTWs zcov_@r(LBZ*fTg4H?XJPU!rp|q-QqQI-Xwn2)w~P`mrx|gCB8~ z{Fyk-`o?eih}&>aEUhnn;F$Nga77#gV~J7NP5sj+e}jweGhWAM+TY0ilST4=Fe+DI z&T@+4Q|I8Atl1W^COxqcFy}m5BsSw)$%*ZzGxKsES-4kR1^@gG|L(Xk&^J8OuY2L# z8XvFqCr+c^etknvY+HB(58^as3}Kk==4AMU}5)$Sbn_MWHj=zQ|TxkGM^4`r*_C-Nm5b`L*1Pcct(!7X+f_Ho8> zyrEmNB1?9w=Z!Un=kj9lycbAT{I&M9n|PiL^z2$b0Z-U5y3lTT13$(oPCMhw)7vSh zeWH068gJ;D>~X=|V;AK)-2-26B6bsd;0e3xoVoBb?8bESCjQ2nj=y1R%!_?77I6~a z3+FHu|4T>aMJDDzp8P(}vw3u44a7$96}SZZ0P zIk^&i!WrkulAmIKj6<8`Y+Io-$HXLboApg{6v2`{*f!%f4*mw$6C=^pamO4zk$rKQJcDw{ zf{TaW_efuS-il@QyLH7A-)A_c?1*Pga^^6c*hU_Q9dnK^fXCP$wi%zypPu;dtZ(2O zF3FJ|_zHGizK0$ZJ^)7WjZJb++)Q6|Dz3sCvZsUOH*ITE>_P{4GVtc~xx>4De2p<1 zA6}}(44%P?1H#YXkgmkoFv=Ea6Ej;xw{{T{6L8a<;}GcQG%SkcHwoIxaXa zer1#7cX7uY*j;+mh8Wwm)&cYd>+ZuBJ{|7aDYbn*T_0qoxE^ommd$dEZM3ZoT*GJM zU@L7Wf69)UL;Q{05uLy$%orcvYV7Pp@&b579&9Ro+V`DK`2pBnTRHaY3*&NHa>IVZ zhA(1E@Q+{MZ#Nc~wVO=iI`K-?#BD9IkqY({FtE z{ZF>pcX8yOeTR-8<=3rU#Q)^QuFwVEGI>1#6H95?rfcHu?!e+U*%{BKyXI8GZo8|GeP zaE#rB4SIGAZ`ft};a{yOW|B9a-&hCZ2LER~#L)V|Mf>a`y;#$@U%@;3?52L$ zBiOd$%F5}f6t=K$Gqvz?>+nerT5hq6wcSwb^MLr)sP$Z z&i|HLi!3Nz55F-`xc0op`)i)-EG>UAY<*j~wyG zI)!e<6ZB#3?qzGl@8TlXVi4<7;dV`1K!C{KgI#y zc*M5AgMGZAYj%!)*+Kd@4?ao3vG^PFvX;ST#c?*mIOzpvv#joOyIk?yLj^U8} zfO+yS#={5PdP_aOS-Yk!obP`UEF5r+PuG>Nfou23Hz?WHkM?j5M|^km+%wM@)>Ow9 zR?VNh*&_GwEn-d>A|rC;NAld0F2Wn~V`t12&lK1vL%!B==h^PqGk$_T_y#)Ho}3&T z3h!`%L*&m+YD*h@5?dusWB;^CAGpGP(GR?fwY4+64_&-D{HTu%zrQ$t-o)<}iZyW& zCtWX|pcC_@JG|k8#0IcQzkC#(SyLE0jE;YcJ6PYHHGdP{@WW1zTk|!4GRHSfwMf!ez&CZaR6Bya3*?SH_4ZWX-Pd$#NFf z4!Gkyo9tSCg$-d__#AR`54`g|WI*3!O4jtnPO=T!hdagGlLIhcb9cX(3_pwk-fb&l zEjojD+z~H`>)1Onq;cT3efWSKW6{5{=pSa}QR54fL!}e>2DXiDr%QUlB^ZtF;R;XH zx$7+7oT68NW;VZStubMABiDTG!c9`FR2e`s+$p-ke;tiPJEwz$C7+Q+&Ms**P*11F~mq51ojq&5Qi$ zi!R{_Zu#xVmQ5jRg`5=En~Q76nty;xc9CCB5pNl@7?*zN%JqtNwK1-p!{y5^y}X@$ z&Kd3a6OU{s%sqb4iTICSG*+0xU)-@yFuwSH`Y=aarBi$|Hgk{7n6BqH@ipQ-?@W?8 z4)cj(0`tQk&r8@aYd!vkuOKI}iTTl``{2nu$coOz4D1B|!M=&L*%9{1{$$1c9j9vr z#`}`vskJ2@hJ)1Ewy)?{VQ1k+tivwj3_O^V@w0ERXzt!$!+(B9tiaCGmFr-Ujj-){ zaVc3SVnBK)AM*%C&D;JdHNO+ff1X<7$$4{jow*D#Wnp&xx{3dHZQak7>zfYP(%02^ zan><1Hx_Zf@ye+gzwsKk@wtyK;ZC3IfcOgD%?}6E3hd!R)-ipZ?OdDt)Y?+q-xv4v z=lW~r)q6GPoO@>b&`18fei!PHcG{_@4?1x_d(4Kj)8-6k<^WUX%)a52n9p3?gP;7* zO!=FhH}oOakz*krF^V;&vA`Ff!;i2%Y%x5r!OrpXuBCsxVYl#~Ph}glAqL|2Q`>fr zBA#Ve#C~igo+@G^@vJ$JH|$?}cjD z^UvYknrrJf2v*kbEUcS|2ffF+;X1$7v9`VgSN~J`n)O4T?yqVLudTK4@Gix#OvF3k zjkTOP@lkv$-mn|-P4s0Qjhk@CR)}li&Nbx5U$G^LaoNcfv4?YPBRTPPYHgAS3_At` z3JhqEy>zemSz%B0OIEhk`|o#P+viQc+g`u-|7k}ZedMs-fteGIpF8+bc8R>%1#=RE zurFi}2ga{2SjA8Aqkj1twt6am)BB5E%@L%HJ`YWP{3SW7VVRuZ-dx1h~;pLzwy0VGO;$5k5to>ZFOJpl0Kpb-v^b`Q7hV_54xf|ZHRdlYd|&G{+IHa zpJ_k#qkFa=_`(0terB&9Z-*aoSX;hq;(w&#oAI)BY?*EGnKhhsfOv=vVZZQ%e`OcM ziSX9*Civb}er)eP&poXx*%dkwi&@{WV{|}2>$x z<_~vxrP!v=?AwN6HM^yjpO3FlYoAQCuZAJAQ^(%rnB$JA`vOOJ4de2E@Srbkx|grv zJH$M22Agm}_i`7oY0iIKehm+epB)vSDc*x#xqf5Ydfb7ny?#!6;G{omm#^Ji-+^9H z{^Qzq>B@EO{v+Pr+8bWfzI@yvZQEbGvHkr4uWpZg_|5HK-}dtM^c!B%o~ir(<@aCS zHePUA+jQF(+x~@(*Zy>UNB`A7F>q9TBNpVNjh)>vNAebn$!CZI%$4tE>u^NufLF%r z7@rlnjb+6jDRi!Ai|rR1(Xqnrn?KB`U8C^b@ke};Z5(#ozVh1tRqu4XruKiX-Xs0> z*R{hA|C>R!@M2E%%Vxojal;$gi&fZOh{{sU@U$fWG zwzt0REw%st0ZVWX({#qJi)F-zv~d+wiKUGxFsV$lKb{arRfuAJ|sJ`4`W>q+Rg0m47|zu;JcQPCj+8%Q%CRiQlbJ z^<~WndpJt|_=i_wB6EiawoUv1lQZ#uaq-6Q7$iT8uVgB>#O~t-jHs>2jg{=46oZ%40@P@re{7pyNC4Z&grY{__=AeUM-gWNl?{y#f!-(zvT-r{p9deg<;nTGZ zZ}^?HlsUTIe6(qu;#x5ZzOa=zl-Qo`_+as)*g!7JnrV2K^QtxNONaeQ`(E+pp5yiW&?fuj#9@VO-E-FA?W*G0he{Ve@~VnOU$y68^MB#zCe{@Ef%u9o6GI!X@v{&3Loep& z8a4v|=?{i+-&!H^4{ySg)Zq}Fvo~bvT)2{LvU7~?`%2nUr#<@e{027UBmee- z`VPQ;2MqR^%@v!$6CU6?yM!CAHwT=7F?PW*IMcpZLM}o7{derQ7jNz8`N{m2brfuw z2Q2W7WB?<4t?}YHTV?IfX2X{`$yL!Eo5oIO*hdm{khgN2|gMYw55F|`+TOhJp&S7Iw#(oYie`hbKuFE0p7%> z;sHKa9MAW_pjbgXFW&Z>e{|(LYFDkjw%zkL`?glRx%-%d+miJ+R9;}!@cT5&iw9dj zc}VeQPJ8I&zi8k1=~A`*EGUwI;(ETnJ}y*gA)O=9kz9b`OUl2XkV};gSr= zPa&^59`IB|pl1I~zVp}^f5!(tU>=S*!nYDs_deaXq*p}0= z{$bBz2ebi8+I3F<;srV4nfN^UV=)~_TTMOe|)(GNo&wI2n{2s@~>)Qjz?mzgO zd*{}BerxN0bgZo$+M4>G(Q7ughmJpJ@HY>9;{UhDKlXd=dvAJC`{#GOvORkEJKKFn zysQ25+g~xnai2f$*mnJ`w+}I|-{?2iAO5i)9r6JFPXnHaT_OW|Gj6s_tcm~Z09o^s zSxd8N>>{1e0nE}J8S*KK$>glbkbK1DnRO}s$@lO}A=7%?I zld*|O#K>|{Y*?^vymTZk-~+77#A))uc!P6nh`a~+vdLM~WIci-3cZk#cES;LIAeQU z*jLw+uj|y=*1q<{UF2>|e2j64fz62y_!;9e4>*H=y5>jd7H+Ip@x~flUWk3b8|{#h zdwefoNqw(o>FR6RV{;E~?YF zTINrGt^LzGU)k1OR_{Ju&n|5QpvglRwq|p!A?` z`6|AHUuTQx0=^aYBF}u;G8`fUu?w!lq}WCtfsVE?zr^ee_;>s=eZkZ*VpZn!_k z)Z_i}v2eukv|-zEx>ndW_6$}MbHY1$;}krz&Bg_DbjA0vgZM(X)~eyve)Aryo`?dBvbJ{;1^7HNMAN%8W`>`Kr zH_kh!J#fr>+9Q9yPkZ#p{n{<(ozxzC|8KN^f9p%zBZvM@+giTn;g7$)JzQ;ky|&k1 zbWXiPy{?`3iMj0$OQr|x|L*pdx4yak)X)C(AY1Y^E;xx#6_=W`d6B`8=kPoK^&SiV z$!5H+o&k{q4!WOBiQVdXK=#4=m>d0m_|hK>XL7$<+tH1fg8bnGzW8i$3O%u9_#a)H z6JNvsDCWRt(kDB}kFg)_kqaRYG0;r##(F2b5i7%scou)6`i9>w2w&^$VSY!nIeQ`YJvOQHz&)U;24#0!)!-w@T?uv=!1o%HT zi9d%i+lpMgeSL_5%njH1UbVK3ec`2-wN-0Z5BqCZRXnueb8Yo!Kh?hT2QP0=zH_hk z;NkCRPrv15?ddn}(b})fX-^#Vx^~04C$(*d{Az2z{G#^E-gDZ$r+l#8cItmEAIL7~;x2Cs-mhb=OH@`WoDb2;ZVUCNz#ByR$c5HZet?uuVXiV>Zo?lDIac|&iZ6~=-79+uN?RP+I{6i?yUUsvZeL?m-FVf zZAbjy_Tb0=sNJ%#ev9#%4eh4W{<=MM)H~XP^<3w{!}e{D9ItFGuF{yEWSfg!N*S>hi?QQ85%i1Fkf4zP6(I?t%U#R_M zR}B9%EplPg$VMyy!*topnSAMJ%#D5@7s9C=cg%h6SM0-!^@(^491zpC+cUe!&eK7pL*%-Y1cl;RpFeGB8K{ zFh{(>Gq|QdaW#3tC|d%%);hNFhOJ@yn{C~bwSxP-_rGY_(t$g0y?oWg z?>b#x&o!5Ay16Yazq{a?`ajW|ztAqPeA;E}t{?u7=Ve#d^OYNJtu@b0ZE>}+dd>QF z>FW9)B^&B@1#h^yU9z&?RoGPPoNMbI-}S6~f^qmCA$WUPVQEdh$3w>EZ7jHA48{lZ z>bvf|yM6VmUmf1Fd-Snw?a6=m_J4AV9e^$JV6XXO{s$K6$2yKrfP3xHV`2cuQXD7u zem|UZz4Ls4{6hF5ZWrsar+5Mf`m{#mL(P?b`KaV2*l3*LhxitGHhl5iS$i-_ukfcG zcAuS_iF{g~-{1{f4S#YW{L2s%7iX-A$<*4+TA5wP9kPRMvW~x}8}=OD;F(Rp8!}5? zl>fmU`f{9X^^cR{qUendw4a(j*e~%QJ0!OE?hAi{FP^oqp>&ei%-Y0y%y(+|lH|>B zf-Q$h$HfN*_bqV7YvN?~Vkw_~dtI#H)U{_3D++{;%bwONMyM z_i@}OcJlvp1{<@wa@2+U)s=64AJpc`hv2tyim}z?MJMFNUpbC5 zbO@K;6%dDu|IAr?e2{tb2XHRd#vw9w4Vk*0ZKOX%PS`O#z-iYSmy&guw#0)tX+1^W zVn^eFG58vA2-}5W_Ik*56^D!ym*C2^w(-SrCH`mSs)@FIN7MJ6S1hkQ+KS@CvmEkW z=+$fLw*cxqoL;@6VyHR~`->`8x^kuOtgUQUEGdpyztsI#mH%2(Yo_HDTfw~lQ{aC` zu|faI2lrQ-&WA5*^T2I=sr^qYIL^3j`yR6S;GOHpfz6|Dc3bSGus38V&kLJm3IE>3 zq+9WUd{FG9ZJ4mG5S!B-8zzqG^Yu9Dxbrw^?a3dR8|)YxTZl6XT(O}rC0@fB1#Ub~ zgc~~NgV<}>HAcMgI}P3)n~4wJkOiE=H*)a;2YS9=*fKfEWU^> zA`iHwU;1XV*dqQ_oQ4DRhLh|bdqQtGL5JkTFZYFSr%(5|*FOKvp5Yt+1`qgw1L1CX ztTq<-F+SK-j1j+Z$(Yry!z*pUntK=4Zy7IIaz*`rnoEY?v++OBF1+ZHc4_^#ncoyx zaM8ShGyZ=K8Njmtnd~>i7S{iPo_ERowyZca#5oJ=*?FD6=;Hc*X4MNWt7r1{-8KD? z6-;?gXWsma+M>mm5BIs=n8K&{M`JbqD~qSL#d6`gxtOo-i#g|B$Hb-dX{~PE$sTz= zLiS{Co8IX|p$~de$Q>V?Pkzg@d@+Ul=tdjtB%RPVjs+|H49?>Zyx=6?!VX&lh`qv5 zYksjZWgXW-Lsy*~Z))6-5He#iSf`0X7V95x5*EWGv}vKmhLAil^r z#hzq9|8#8r@MqrcX9LWMeAqsEvfhrpbFDn1!q(uTF(~@LL2<5FL4HhIu|s5vw_-Ii z*0=j$1unF04HKV&2e2=Ggc*2_?{N>#7^8b()qVDDI|i%zGgq;L`r^X>XD+DU$f!K8 za~DU;9%)m)6{!g&+%q+@v(Mz`T{w&#C)|6X__ThT;N0^+GyION zHqNhW_2vF^Yo2VB{>ju_GFGw`&l;;(&;ObAe`VMOxin*3UOsPe@zH$g!1d0{BjPDt zvhAMZku@8tu;*-{ZLu`FYTGe*=7-dd!;f`_bK;Ud-XizN(s;%C(YrQq$D9?IpliHw zPJ8gjHi}EUFNv4dNy#51HW~l_q}@fJK0eE~|HA<9kwxND_9yul=WrS);2E~zg)Zq& zjX#6#3Zro1TDG76f^X;P8;0o)p7{i8Iok@n!!bY6=ZsvB53Ysztnb-a_qbQzZ~zZ< z)7xU$rz^OLkIcAX2yX1F$pW`rr@$_KYBRQ49e&w{JzO(C#~rh;9el>ezK4h=hc3dB1Y>s4RjQS$S#I)q-INwG`#zQA+ z_t1xX)b23{*SbgBxkv3fGB$qWFfO(i&*a0*gK) zYa4ui;)y4wWnB~gg)?gZn}JSo*4iJ|t>MI?Y@6b@iu{hHb8L{Rd7tn zaogmSLe^vtm*FM7nG>7lK5erT`XRg6LbZM8ZL9SO@8%KztyDMp7ghwzveQ`V-(Vp@2{b|?r(SiBEykg972dB2( zn>l1V++#1?Yi`Dlf8?e%X7|H^v1<<=;Dmm~Sg=pe_Qh=K%#(h!L)YY^o%kZ0!Uz6H z5%;*4Eyp|04RFg^LLd1K8_f7$JTvhLj~;&b;ocFPvk?*c@^pPdc*CmeDP_!#HfS=deMqFhFKvYK2_b4n;rYO@`#=I(Cb%f(`q@ z1lh+Y;kPm9117>3V^HjCk8jnsq8~;7j%$OzGbV9>HEYhh9^cs*x)Q&T2fM@Oi5(Pe zsmTnUw8viZ>(1r8YqTv6)*kt2j}G*szqIK(a$%RvMQuNAXwxx}XnoVb92& zA2v@M&?hX%=is61or}E9f&3MG(3coO|HkQ~{3VAB|Bt@=)Ug(Fc*c!1@{|UYw>$m%Bc4eEddHnImhjjx#L+^O( z9U{39@6Y3p*itUuJjjZS*b1>5-jFF7lLuP|v#^a%b;L}(DK=hZMO|D`{2 zQ@hW&U8C5>eQ~zy$r%Sy!X3JDUT%y`VOak#Z@gl1cpwAE*>=atnS5|Ieh%kS$k%pw zg17eZgRP?%dc_-KU@M%XUwHBVAYs7V$<93FcI8^Fx8ButSVS@M;B=ga?`FkdpE6LN7*tOvt#`QF|4PP=yy z=!y=*4Kj*Ngl+c7F}_L-A9R6>xJ3u9(HEK1A6>&F8^k}#S9;!NUg8byxiH+Hk#V?8BdST*tPMo#zegsW@GY@A{z& z+R!VroZaHo~a=MgjaAVMspwR`OY`{ z?b!|9(6@H!i%#Hx&Ea##zGb}se7WU+W|9Se%7)N646?=EVKPtesNp#~DIdtD8LMKP ze2#hZ=j0$)!l(M~j_*bCS)QfgpWl)Y`*}x~e94vF!4Gn#Q`?Tw39Q@48@e}Ec%c`^ zVB0>wl9-JCa8sXrC4S+c>y-F7e!}?G@^rSXjns)N^ubSLp8k)b>-FbY{3EQp*Ku)% z_jj}@c4P;&XRgL!-|<|l9k#(Sb0!0I>;=Awhn?4szRZz4)Y^<~&)CVyG3Uvd4Aj~d zyRqZqZngtg$vbk1ts;BvXy19`*B(8k#&5^*EB)|6+EU{?U*Y#W6u+(Vl9#+>cvl8z zVIN0uhQEP*-`mGqoZxfwt`yvOM#L_9cH~~;7jN*ze7`vFsi&TLzO>lx{oYC7FZgM8 z44&Bsz5>trM&rZ*&p$ms7N6h@+hl%x4gW$;?qv(|Tee~fd^8{SjQ#K|+Ha(=i||h; zFhI9-2pi#!^V+3v7^O%0blmmuMPE6t9k|2~cACFrx8ifcoz&WbbH9J9jd0a@+iDna z9nM&H;)DKk+&SBdHt_0eU;EndzdeF&IO_|n;iLa;?j0ce?(Iut!2WvoR6I-$`c^C2 zSF=}sTgNj6wd1Y}mdQ$SjQxW@zR-DmGzZ&i`mk-h^kHn~rXMoVj`nTikbSlI+_tgc z0^5rx`~*8HhT-GHF5VIGo|)&QZ~;d!#n)*EAJ}ME^NxULsj%p~H+&A>Yfp}fU#4T& zBh%^p9zpN7yay=0vHnUdZ490vn-|`&8Qx)X4el6k62g7A3U>l!I^D(P8)1F|3}7RMeQ16_>$U~ zjfp*Xe~$Mx%s59U_uqg2;3r_(y{=O$u8Xafx7V)mO;^ zR$P(1o%?VF&s;A~WoyMM^v!R7qyE>H=PTYt7oS+;i$U<%+DV+l7s7-*1N_lF-vU#{ z?0W=kA+Eq0oM@l#Wb?J%V|%-fV<#>cx9j~;>lBz^t6|i5aGvilPWHl@!8@9GCU=KY(Y=n6P2^T`+Q(e;S-F7{bZA^t;M7Jj=VmVhLPxpIAv-V!Zx0pwj2=tjFBRK6}9DS+~iXz%`rA=NLO*NmkZ4a7gy> zhBMZ8<_YuUZte7~Z+&avPS2Zd+qMmT;Gyf2t7QM!DSllH%r1&y>4kr{R^i*pPh3dn z>>}=nb&`jP&4W|pmzNMf(}iQfu(8`$vfbCV`;z-`YBFA>E!U+?b}Za;O*qu^rRPz2 zgA3scjyN8^ggdZH7PwSe>(QpgL*m3>^ zPV_0C;lA1Ym>d596Um9n8L?0Nh&WSRiZ^^KOyWDAieqYd59e^hN4)*r?|ygiIsBSF z*aR`HIL+FSFMuKUlegpA6{q_yD%*sAbZjjAzwyv7`N~s^i|{6RavTQu8?qIj;6QA7 zu;%(;e5yLw&UyPi*ZSkxcHVY>ukF6zivHEv&c5;CiT$208Fzfjm?ObG%;Q7iC_Hel zSXW+COhHDlu8^hJ!MOPg*RnP2q*zNH)HPxV*ZF_F;$Z6z`ryCPAKl5(c?Vh_KI|s_ zi#_CUy-RGL?}q^~mbDE&$OquH^)IfTc6kiwQl`yVo3(Z?tdzuHg%;_r%(`MV@IFC*)7W zJAA*ju5~!Sk2C#;PUsTP@Jg}%F0gAU<<{mYs?c#~s+Ep{5;@L7zaHFqbIK{lOt>%0AX=`xnPBN4S*dId1z&;z_xbQy{EU9!fd0i`VhOex_tfHS_K&_j z3uDW1hP|HZy_#TV=x8_n*^xG_P3XWp|xnMnYj)f!kZL4!G+u08%`Z~N|2l`^XDR56l zu1%Zza=mkSU|nu~V19DzYIAhlz1D^K4kkJAL*fMTqZ`M_(=j#@{^^wLaYf-fU|-yT zlh(P`mvUq{qlO!{jr`$A-pGBPttiIDF5{)R%d=p%*fG3O#5UqIcyZh{Y$`j*_iWj+ zWxI^%vEFZQ_r@K(V6rx0m+gU5eh0?M#T@pmwLe>6TW->v@G9#Zb7gPX3CBI_5!1=d z$&rz#Tq6DOHP)+qF8$;~M~MfF&sxct_&B~wzwD*F1gx`})`)lrC;AmX&_8?yf3eTm zhdWs0SMUX%=NHD{5Uy}UJmP%t-D7^doognmdrtJ*8H?KZ@IbL2zSuSf<8jP9`3l>{ z;Jh`4xu>?Rz^>Z!c=ik)W2^AQJdMY7#tr*oB+uq?$r?3rGd-|pY-^7jxmYn8Zi=D# z1UXSQj%_tQeAl*oDnBANr%%{`rM)W$B@Txz{aarhRDMW%Fhb|>$QJbRdoVMbb!0(4 z@J1HmC-cG^ST`4Vv}Ti^!7Fxyd@@J($zQTr^dx4*7q-MX^20@bif+hTPLb`SCm;GD zAGIQW6ys@&Kf#r)^~^%vfG=X#JSWsPKf~|Q5v+v^aE23#V{mGoup|CAH?}W!j$XwE zu7g`O48WOMJ20GWID}irQ)}CPFdZKWr?77v!FR58EN$Qg%)vc-V0~%brg)Aa9wIk$ z(>8mjuq$fk_+mDSjiWdEa@@Mm_r1tbyh~QrjO54mv2T1oKauq+j41ZS-R?0DT$Fo& z5#zLWkx!y8@w>GZF5rc{oNLu&Ew^AzB%Wbk<(I@WFo!dIn0<4aDn6S{-lT8#1TMvC zVoPfUK0Y=Dme>ojP|VdeVa3F;}VcY15T;ycrRK#1xog6S7v48X}?{6I9?Qloj%tpbz zw%8Unk6t~;2!C+Snk2bv`h$O1V4tjQaG!0}k0O3gd_ynVV59jTI$%4*h_Ua%>kFmk zZ|F}vX)VAevk80#KVt6i4*xjfoH?@>?3w(5`SMld!^bM*z&?_vbrTy;{_>vWPM>@V zS;Iff(<6CXEAk)KxBL{j=6!4ObUd-2T)$_lo(-_WvF+@ldBx7dj{e}$?=Q>gc`kuB zd+f2t@Y~R8=jj**jVai+Hnyh51JA2*{mWne^6(6g4fh=l*z{bF-G21ZM~Cz7QP_K2 za;;nne&e9=;fsAZvKGkrjM12k({ESfkGRJ?=!B0kPBOt2>--ckvv`QU$jbHPO!m2l zKFGy-ou42}*WxwKn?If7m3D#w_sJ8nwfO0NKEgg;n}<9CAA~D%*q&{`lrf3d@D&z3 zm#~h}Kbr+>%AMhqI8DGZ+ixqK%ov~JvL!w)DTAr6(#}9=p z`9}pFonyoKB=|K(zKU#cR{!4nBR@DZM%ZIZ@WxsK9>vr6f+w)Ake9;FkeL|BvoQPQ zPIquhR_qa*MyC9iIFK!)EBJK{-OB%1Yq*~cWfR#pTwy2a%o>LsHC{H%deazj90oiC zq*I(#U8J&pN_-6NbZsR#L?&*UZ$=5R?^28Z_$@Sz)FYd<++)8YxAAF%-_6={1 z$Jp30?|SGP2FY82N%59KSFnfAVmfP5ybxF7FO1Nw7{Rj){1Fow2Oq{S&?{do=Ef7T zjyO%6>%+fTH}EZTitLfxyj(l~w6!?o8fy$6yn}iEQQPbe-{O5CTnS#u9ByIQ_{45m zQ_Dzd{%IV2-VtepFJI*^!2YA7j;*wZd+(cjEM`OTg*oJxe zF!8O}12%9^o8+opdcu+TCEtgj57)s4JE0%G1@`!AyyH{F?LLmbkUrKF>~hAK@v*P) z=otuI^S^AOIG+E7e;8EgSUeYbkq=qXA$^h&o!}WPh`;3D@J9}Yf6^Yg!-Mzxj0ZPe z&#u9>nl9*-?bEjP7`^ci`hi0@l7C=-?c?ID1p>WT2 z))es1Usx~cLp&iiv#!y%b&;5kJ+hX@t*p(&K91YhuKW2jw!{2!1}@o=%*R~Jl^ua) zwhZ3bC9x4Xn6J+oXE^Z!_!I8R1bcY9WGUP|bWKFNIO3(C>cn^;8 z%sDoV&c*Zi!XMF%*bmO=itU0Mc9uSs*g)-y4PeC@M+^}hx?a&gyP!Yg!g>AhH)22d zCI|ObMy}!mdZ9~tqI*6` z>;bn*FbsR*cVom0n4t^T$L_*_aao6ImpyvFB@Q}7@qd?NP0P(9>K&^=P+^@zd z_lc|73fJj7W5jVh=J(0VJ@`YWWW{dK2|lxXbeg<43@E*hZR3q=*&TDzt{6~TY^zv8 zoQfCxwzYtHTO*2ljYX~{K1SU?BZt}9{@^j)?NwPG&Xg-bfXqxdTJExh2f*)D#A zErV}*q6<9058L5L_(DhYf@8+ac8E{lp8aK8V8{DTIAOf{!WSQQ+L-jg_Q03->*Z9! zn_zM_d=6X(+rxmL{nK;Vd7MdZNc=$#*0j0Tn%Mfl+SYu?#@zGCb^X5Utf5^?UhFf> z@bT93^do*2oZ*aP za0^pxG@Rl=co+Yq*1mJ>cYK25Dg8aR72|MUU&0S5SkukZEA32Jp^K6K06*kNJQQ`qQ5PvD|v36yv_yP47GNTIdNCK-;xp_y$Hu}Gxn*r54`BV6_Skhe8sjTC+uikZ^iO*n6%z`5d9Ke+|jUo<*$>dRCUCEk39iIlb{8aW+=bG%} zMv7x8xlSD}>KiwV%NW$g?|9Bxr|}i$$li-}*dDofSjUO@3K$j7vFW&g7tZnR@h4^!{wO=jEQ^Y-Q|K!X@nSrEsWi{UqMR1svxC^3I&` z>D#^TbIoM)ne13(!FRzWyUx#xnaM5~@I02?G6ym@W^*uR+lq0E`@Hv%&yMIl*QSo{ zJojaPjY}TQSd5K6U88L^z4zFe47+K2I_iFo#%SH8_HmB?6QkKSHt&##MSb`cF?6?aZ~~d#Bn@n_1&!e|y*GyzBYXaXcOQ(Ivmbe&J2*0v*H#;6GjPQ;Czv zJZ;$CnGZgs9T@apP1Xlu8+gmddDrKoPjiXi%JJ#0^$UO2U$}$ce4(*rEXM7*1b^uG z)_OMXy^-nocn^kN*i*U*f5IDn2yetaWa~4TzW953X1n=`#QE%X;{B|Fw}-u8Zb$2J zd*l7*YG-GzeXe%cio~SmtXRuf!&sAyu@_x>pCx$&vX`e($Ui#Z=j3p#b9d&`>#5%! zx4|aoH!8$6u$Q<82E#Emd#>czxUHGk#}_$te#KhP+{l;T=0AO$w?ADmCHo>~&$=V} zithLjYYuCEIp6Uo`mpxFF?Kol5%a*0wSl$1br6hLCumc@))LlO-cgW~5R33}aAKV$ zZp26S7r({*@MWBAbNHUMxpRp%gS*5$;w|wG|LQ))cIK+>#7X*dpSI*UjK`XX9QX#~ zHSWDD_a??NC;cT4Mh4)$hJI)|y~ z%6@bQ7w{~nH5q@6MULA&>@KV*{EOTG%q0&jk0l2zf0bNT@?2Tpi$}7ix30IQ&$?c& zT0S`Id-($Ee6`%yR7D=ZI!(#8+P#js&vuIT^r5fhBy7tqq+~3{Zw(_?9Ilu@|D^UD zVX}|+L-Z@xhLhwM-l*+chv6eUpY~vYZO;3fp8eo6o9%-);-g?R_sv$F`KK12 zc|PO!8XS`oU>C4Pd9^^9@+(FR-PnTPjD*lPDDR%3hl z7SD{5|4kkKsQYIslkMYPe@*`^Chg>W?pKGa=~M0an6Jsfr4E19dB&v1o7AqA^CP>& zYU0x5I{2jEv6mYx(zWN1c*C!geR3aa{t<6*OKh^cKf#@LVSw$^4?FIenAn@0#4Dfv z`r*I};EyrMm3W^->}22CC-0|@$2{JDzEhw>F%Er)GqHKNL$|Qc2D3$SFFyS^;DdkX zAHB=qJt6O0dgoZ1au9Og{WD5j$a9lCrwR5`hZB7r?5l(Sa0Hff%z68YT=lrdi5zo2 zT;b;w`>C^?bMC_-v72{~d>_s;Hs7i9UKbl4IraLXQ+Z%>$2re|$UZTon(Wyf@3M)H zdpVEg-nYH0+hRujBq!ke>E;*w?P|Nzbsu@)v-r%~jBmtoc?|i%#B1q)EWaFozBT)2 z{VF#ro@Vc2^Thq$ukq|p%))QLsP8`Tjow`l|4#Lxlkid>c`hSPN-QJ}3ub#x1hYNn zae_`2;|TY9KH{Q%=M)@tpFYx-e)_(&mt*0O{*6tHrm+3uy39eyvS6pS{~!IVk;E^VrAzaV~JW#~7R-7z^nZ6pV1jK-@^#kjn`grnX? z5Ua|=kfEGnWUC#;KD*@}xQK3cr@o)7E$eBx>-&`}cdWPT&(+3EoZ}PuapMZ7@g48u zpZhsvJN5G&F+j3B1Cu8A*j1Atc&*kyt^UMLa#Z~OST)DQip?`CN zd1H4!KI>2awp}wGpJNJq8@IWbhdSIMFYWn$C0^qUj*IbpmqAY6HEc>`9BvvTUp*Ti z>zh6o1s~!e+zVpw9O;h_v|fdS*h9LdSB1XCK;j-)RI{CI zIy>$fc*UI*eCfBd?>hL3orTd97|b?|rWjYS%4gs$4&j-5*nf7O|H3uCP8`P%Xe0Nh zjlQ37L>*4Mk3Gn_%p+sVakW0l$Mt-VH9vohGh$iq!if!CgCD(I-OI=E`LUVN$xPL- zAl8(V@~nnUx4to+;3V}-jcKxe`Z0);jL~~(@ja8>GZV+y9dQ`D3lDHkuP_7S_TkMo zoQi*7Bph%Lo6LWt#7?J%TW!E~Fa%Fi6&TZ>0$;{}ch)M_0`SeZ$Orgdjcwy`&U07o z8duur>$IKPIeybUY=M2_&788GxunK5V`4k-21n$g6AzMM`pEcQkI(Lv2bhkW^Uh#K zUR1nejSZ798l0xynf9jh+I~E-ZGwB=0z+i1m!Y9Ia36Ie8D&9eH-ugZ7<)n5jCD-)V@o~n4M|dMQfH(XGj(9c_KY=&C@4`>8`No&L zf&R8va_wZ}$Qb)Na}Hnh7nzWeZME~>E9K{KW-|Hry4c;@JKEolUbnl)H&uHXPwJ_z zo6h6U)pySE*?#jwyy2ZIxCnQ89N6BK5=;eO+8ARlSj#oJhyCYYaEEWfoA?`e6gT0G z7)Y+bdJWI}c6Mbu^WKqr$8&Kn8-z3BP0zX`>*>_>WNr8TPPW}2o9zDCI%Ztsv5ohq zdu)Aw{kDFyF9+%Ua?fwXVbAqW{m!0)pPhN1-?e!cOsvGecy9o2PHoFecn&MK#}>-1 zdEdvo7kQ6Ct`rvYZe`XO>bwV&n!Qi4Mo;nXfi=B4?-r-_?m^yd>9-y8u20^9wvRX7 zpRpdtmEParjXqps4dFLsQrn)ac-E8RyVM8O_lf1?*bI5OsfzDhdyeGUrsDaQytDTj n6m8 inline const display_t * getPixelPtr(coord_t x, coord_t y) const { -#if defined(PCBX10) && !defined(SIMU) +#if defined(LCD_VERTICAL_INVERT) x = width - x - 1; y = height - y - 1; #endif @@ -210,7 +210,7 @@ class BitmapBuffer: public BitmapBufferBase inline display_t * getPixelPtr(coord_t x, coord_t y) { -#if defined(PCBX10) && !defined(SIMU) +#if defined(LCD_VERTICAL_INVERT) x = width - x - 1; y = height - y - 1; #endif diff --git a/radio/src/gui/480x272/lcd.h b/radio/src/gui/480x272/lcd.h index dfb42e829..d6c8dfa11 100644 --- a/radio/src/gui/480x272/lcd.h +++ b/radio/src/gui/480x272/lcd.h @@ -156,7 +156,7 @@ void putsChnLetter(coord_t x, coord_t y, uint8_t idx, LcdFlags attr); #define DOTTED 0x55 #define STASHED 0x33 -#if defined(PCBX10) && !defined(SIMU) +#if defined(LCD_VERTICAL_INVERT) #define PIXEL_PTR(x, y) &displayBuf[(LCD_H*LCD_W-1) - (y)*LCD_W - (x)] #else #define PIXEL_PTR(x, y) &displayBuf[(y)*LCD_W + (x)] diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index ebda41874..4fc0a1e75 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -1686,7 +1686,10 @@ bool menuModelSetup(event_t event) if (multi_proto == MODULE_SUBTYPE_MULTI_FS_AFHDS2A) optionValue = 50 + 5 * optionValue; - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, optionValue, LEFT | attr); + if (multi_proto == MODULE_SUBTYPE_MULTI_FRSKY_R9) + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_POWER, optionValue, LEFT | attr); + else + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, optionValue, LEFT | attr); if (attr) { int8_t min, max; getMultiOptionValues(multi_proto, min, max); diff --git a/radio/src/gui/480x272/radio_diagkeys.cpp b/radio/src/gui/480x272/radio_diagkeys.cpp index 9e26ebe86..31a3941a4 100644 --- a/radio/src/gui/480x272/radio_diagkeys.cpp +++ b/radio/src/gui/480x272/radio_diagkeys.cpp @@ -73,7 +73,7 @@ bool menuRadioDiagKeys(event_t event) #if defined(ROTARY_ENCODER_NAVIGATION) coord_t y = MENU_HEADER_HEIGHT + FH * (8 - KEY_START); lcdDrawText(MENUS_MARGIN_LEFT, y, STR_ROTARY_ENCODER); - lcdDrawNumber(70, y, rotencValue, 0); + lcdDrawNumber(70, y, rotencValue / ROTARY_ENCODER_GRANULARITY, 0); #endif return true; diff --git a/radio/src/gui/480x272/radio_setup.cpp b/radio/src/gui/480x272/radio_setup.cpp index 0eb630928..f3cdb9a61 100644 --- a/radio/src/gui/480x272/radio_setup.cpp +++ b/radio/src/gui/480x272/radio_setup.cpp @@ -65,6 +65,9 @@ enum menuRadioSetupItems { ITEM_SETUP_BACKLIGHT_DELAY, ITEM_SETUP_BRIGHTNESS, ITEM_SETUP_DIM_LEVEL, +#if defined(KEYS_BACKLIGHT_GPIO) + ITEM_SETUP_KEYS_BACKLIGHT, +#endif ITEM_SETUP_FLASH_BEEP, CASE_PWR_BUTTON_PRESS(ITEM_SETUP_PWR_OFF_SPEED) #if defined(PXX2) @@ -110,6 +113,11 @@ bool menuRadioSetup(event_t event) #else #define FAI_CHOICE_ROW #endif +#if defined(KEYS_BACKLIGHT_GPIO) + #define BACKLIGHT_ROWS LABEL(BACKLIGHT), 0, 0, 0, 0, 0, 0, +#else + #define BACKLIGHT_ROWS LABEL(BACKLIGHT), 0, 0, 0, 0, 0, +#endif MENU(STR_MENURADIOSETUP, RADIO_ICONS, menuTabGeneral, MENU_RADIO_SETUP, ITEM_SETUP_MAX, { 2|NAVIGATION_LINE_BY_LINE, 2|NAVIGATION_LINE_BY_LINE, 1|NAVIGATION_LINE_BY_LINE, // Date Time Bat range @@ -117,7 +125,7 @@ bool menuRadioSetup(event_t event) CASE_VARIO(LABEL(VARIO)) CASE_VARIO(0) CASE_VARIO(0) CASE_VARIO(0) CASE_VARIO(0) CASE_HAPTIC(LABEL(HAPTIC)) CASE_HAPTIC(0) CASE_HAPTIC(0) CASE_HAPTIC(0) LABEL(ALARMS), 0, 0, 0, 0, - LABEL(BACKLIGHT), 0, 0, 0, 0, 0, + BACKLIGHT_ROWS CASE_PWR_BUTTON_PRESS(0) CASE_PXX2(0) // owner registration ID CASE_GPS(LABEL(GPS)) @@ -373,7 +381,7 @@ bool menuRadioSetup(event_t event) break; case ITEM_SETUP_BACKLIGHT_MODE: - lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MODE); + lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH , y, STR_MODE); g_eeGeneral.backlightMode = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_VBLMODE, g_eeGeneral.backlightMode, e_backlight_mode_off, e_backlight_mode_on, attr, event); break; @@ -388,7 +396,6 @@ bool menuRadioSetup(event_t event) editName(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID, event, attr); break; #endif - case ITEM_SETUP_BACKLIGHT_DELAY: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_BLDELAY); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.lightAutoOff*5, attr|LEFT, 0, NULL, "s"); @@ -405,6 +412,13 @@ bool menuRadioSetup(event_t event) g_eeGeneral.blOffBright = editSlider(RADIO_SETUP_2ND_COLUMN, y, event, g_eeGeneral.blOffBright, BACKLIGHT_LEVEL_MIN, BACKLIGHT_LEVEL_MAX, attr); break; +#if defined(KEYS_BACKLIGHT_GPIO) + case ITEM_SETUP_KEYS_BACKLIGHT: + lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH , y, STR_KEYS_BACKLIGHT); + g_eeGeneral.keysBacklight = editCheckBox(g_eeGeneral.keysBacklight, RADIO_SETUP_2ND_COLUMN, y, attr, event ) ; + break; +#endif + #if defined(PWR_BUTTON_PRESS) case ITEM_SETUP_PWR_OFF_SPEED: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_PWR_OFF_DELAY); diff --git a/radio/src/gui/480x272/themes/darkblue.cpp b/radio/src/gui/480x272/themes/darkblue.cpp index 05a8b2e1f..ec4b51fb2 100644 --- a/radio/src/gui/480x272/themes/darkblue.cpp +++ b/radio/src/gui/480x272/themes/darkblue.cpp @@ -139,6 +139,8 @@ class DarkblueTheme: public Theme delete calibHorus; #if defined(RADIO_T16) calibHorus = BitmapBuffer::load(getThemePath("t16.bmp")); +#elif defined(RADIO_T18) + calibHorus = BitmapBuffer::load(getThemePath("t18.bmp")); #elif defined(RADIO_TX16S) calibHorus = BitmapBuffer::load(getThemePath("tx16s.bmp")); #elif defined(PCBX10) diff --git a/radio/src/gui/480x272/themes/default.cpp b/radio/src/gui/480x272/themes/default.cpp index b90ccd1a2..740f30e39 100644 --- a/radio/src/gui/480x272/themes/default.cpp +++ b/radio/src/gui/480x272/themes/default.cpp @@ -176,6 +176,8 @@ class DefaultTheme: public Theme delete calibHorus; #if defined(RADIO_T16) calibHorus = BitmapBuffer::load(getThemePath("t16.bmp")); +#elif defined(RADIO_T18) + calibHorus = BitmapBuffer::load(getThemePath("t18.bmp")); #elif defined(RADIO_TX16S) calibHorus = BitmapBuffer::load(getThemePath("tx16s.bmp")); #elif defined(PCBX10) diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index 16929cc7e..59153faa7 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -921,7 +921,8 @@ const char* mm_options_strings::options[] = { STR_MULTI_TELEMETRY, STR_MULTI_SERVOFREQ, STR_MULTI_MAX_THROW, - STR_MULTI_RFCHAN + STR_MULTI_RFCHAN, + STR_MULTI_RFPOWER }; const mm_protocol_definition multi_protocols[] = { diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 3186e8975..77bb1b894 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -2073,6 +2073,10 @@ int main() inline uint32_t PWR_PRESS_SHUTDOWN_DELAY() { + // Instant off when both power button are pressed + if (pwrForcePressed()) + return 0; + return (2 - g_eeGeneral.pwrOffSpeed) * 100; } diff --git a/radio/src/opentx.h b/radio/src/opentx.h index ba7aefbdf..d73027a6e 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -536,7 +536,7 @@ bool setTrimValue(uint8_t phase, uint8_t idx, int trim); #if defined(PCBSKY9X) #define ROTARY_ENCODER_GRANULARITY (2 << g_eeGeneral.rotarySteps) -#elif defined(RADIO_FAMILY_T16) +#elif defined(RADIO_FAMILY_T16) && !defined(RADIO_T18) #define ROTARY_ENCODER_GRANULARITY (1) #else #define ROTARY_ENCODER_GRANULARITY (2) diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h index 5f2cca40f..e13eaf2fb 100644 --- a/radio/src/pulses/modules_helpers.h +++ b/radio/src/pulses/modules_helpers.h @@ -666,6 +666,10 @@ inline void getMultiOptionValues(int8_t multi_proto, int8_t & min, int8_t & max) min = -1; max = 84; break; + case MODULE_SUBTYPE_MULTI_FRSKY_R9: + min = 0; // 10mW + max = 5; // 300mW + break; default: min = -128; max = 127; diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h index 645e527d3..c54e185a1 100644 --- a/radio/src/sdcard.h +++ b/radio/src/sdcard.h @@ -128,6 +128,8 @@ const char * getBasename(const char * path); #define OTX_FOURCC 0x3478746F // otx for X12S #elif defined(RADIO_T16) #define OTX_FOURCC 0x3F78746F // otx for Jumper T16 +#elif defined(RADIO_T18) + #define OTX_FOURCC 0x4078746F // otx for Jumper T18 #elif defined(RADIO_TX16S) #define OTX_FOURCC 0x3878746F // otx for Radiomaster TX16S #elif defined(PCBX10) diff --git a/radio/src/targets/common/arm/stm32/adc_driver.cpp b/radio/src/targets/common/arm/stm32/adc_driver.cpp index 6360b9676..62eb5a7eb 100644 --- a/radio/src/targets/common/arm/stm32/adc_driver.cpp +++ b/radio/src/targets/common/arm/stm32/adc_driver.cpp @@ -24,6 +24,8 @@ // not needed #elif defined(RADIO_T16) const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1,1, -1,1, -1,1}; +#elif defined(RADIO_T18) + const int8_t adcDirection[NUM_ANALOGS] = { 1,-1,1,-1, -1,1,-1, -1,1, -1,1 }; #elif defined(RADIO_TX16S) const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1,1, -1,1, -1,1}; #elif defined(PCBX10) diff --git a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp index 59027be27..cd337fb7f 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/boot.cpp +++ b/radio/src/targets/common/arm/stm32/bootloader/boot.cpp @@ -197,7 +197,8 @@ int main() RCC_AHB1PeriphClockCmd(PWR_RCC_AHB1Periph | KEYS_RCC_AHB1Periph | LCD_RCC_AHB1Periph | BACKLIGHT_RCC_AHB1Periph | - AUX_SERIAL_RCC_AHB1Periph | AUX2_SERIAL_RCC_AHB1Periph | I2C_RCC_AHB1Periph | + AUX_SERIAL_RCC_AHB1Periph | AUX2_SERIAL_RCC_AHB1Periph | + I2C_RCC_AHB1Periph | KEYS_BACKLIGHT_RCC_AHB1Periph | SD_RCC_AHB1Periph, ENABLE); RCC_APB1PeriphClockCmd(ROTARY_ENCODER_RCC_APB1Periph | LCD_RCC_APB1Periph | BACKLIGHT_RCC_APB1Periph | diff --git a/radio/src/targets/common/arm/stm32/pwr_driver.cpp b/radio/src/targets/common/arm/stm32/pwr_driver.cpp index f488d19fa..220b5fdfd 100644 --- a/radio/src/targets/common/arm/stm32/pwr_driver.cpp +++ b/radio/src/targets/common/arm/stm32/pwr_driver.cpp @@ -51,6 +51,12 @@ void pwrInit() GPIO_InitStructure.GPIO_Pin = PWR_SWITCH_GPIO_PIN; GPIO_Init(PWR_SWITCH_GPIO, &GPIO_InitStructure); +#if defined(PWR_EXTRA_SWITCH_GPIO) + // PWR Extra switch + GPIO_InitStructure.GPIO_Pin = PWR_EXTRA_SWITCH_GPIO_PIN; + GPIO_Init(PWR_EXTRA_SWITCH_GPIO, &GPIO_InitStructure); +#endif + #if defined(PCBREV_HARDCODED) hardwareOptions.pcbrev = PCBREV_HARDCODED; #elif defined(PCBREV_GPIO_PIN) @@ -101,9 +107,20 @@ void pwrOff() GPIO_ResetBits(PWR_ON_GPIO, PWR_ON_GPIO_PIN); } +#if defined(PWR_EXTRA_SWITCH_GPIO) +bool pwrForcePressed() +{ + return (GPIO_ReadInputDataBit(PWR_SWITCH_GPIO, PWR_SWITCH_GPIO_PIN) == Bit_RESET && GPIO_ReadInputDataBit(PWR_EXTRA_SWITCH_GPIO, PWR_EXTRA_SWITCH_GPIO_PIN) == Bit_RESET); +} +#endif + bool pwrPressed() { +#if defined(PWR_EXTRA_SWITCH_GPIO) + return (GPIO_ReadInputDataBit(PWR_SWITCH_GPIO, PWR_SWITCH_GPIO_PIN) == Bit_RESET || GPIO_ReadInputDataBit(PWR_EXTRA_SWITCH_GPIO, PWR_EXTRA_SWITCH_GPIO_PIN) == Bit_RESET); +#else return GPIO_ReadInputDataBit(PWR_SWITCH_GPIO, PWR_SWITCH_GPIO_PIN) == Bit_RESET; +#endif } void pwrResetHandler() 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 debe8793d..00b3c76f8 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) +#if defined(RADIO_FAMILY_T16) && !defined(RADIO_T18) static uint8_t state = 0; uint8_t pins = ROTARY_ENCODER_POSITION(); diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index 4fa4238de..20348968f 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -71,6 +71,13 @@ if (PCB STREQUAL X10) set(AUX2_SERIAL ON) endif() set(INTERNAL_GPS_BAUDRATE "9600" CACHE STRING "Baud rate for internal GPS") + elseif (PCBREV STREQUAL T18) + set(FLAVOUR t18) + set(LUA_EXPORT lua_export_t16) + add_definitions(-DRADIO_T18) + add_definitions(-DRADIO_FAMILY_T16) + option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" ON) + option(BLUETOOTH "Support for bluetooth module" OFF) else() set(FLAVOUR x10) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON) diff --git a/radio/src/targets/horus/backlight_driver.cpp b/radio/src/targets/horus/backlight_driver.cpp index e141cf5dd..13f73f1ee 100644 --- a/radio/src/targets/horus/backlight_driver.cpp +++ b/radio/src/targets/horus/backlight_driver.cpp @@ -32,6 +32,15 @@ void backlightInit() GPIO_Init(BACKLIGHT_GPIO, &GPIO_InitStructure); GPIO_PinAFConfig(BACKLIGHT_GPIO, BACKLIGHT_GPIO_PinSource, BACKLIGHT_GPIO_AF); +#if defined(KEYS_BACKLIGHT_GPIO) + GPIO_InitStructure.GPIO_Pin = KEYS_BACKLIGHT_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(KEYS_BACKLIGHT_GPIO, &GPIO_InitStructure); +#endif + // TIMER init #if defined(PCBX12S) && PCBREV >= 13 BACKLIGHT_TIMER->ARR = 100; @@ -72,6 +81,15 @@ void backlightEnable(uint8_t dutyCycle) BACKLIGHT_TIMER->CCR3 = BACKLIGHT_LEVEL_MAX - dutyCycle; #endif +#if defined(KEYS_BACKLIGHT_GPIO) && !defined(BOOT) + if (dutyCycle == 0 || g_eeGeneral.keysBacklight == 0) { + GPIO_ResetBits(KEYS_BACKLIGHT_GPIO, KEYS_BACKLIGHT_GPIO_PIN); + } + else { + GPIO_SetBits(KEYS_BACKLIGHT_GPIO, KEYS_BACKLIGHT_GPIO_PIN); + } +#endif + if (dutyCycle == 0) { BACKLIGHT_TIMER->BDTR &= ~TIM_BDTR_MOE; } diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp index 49a0f13f7..cb379e6fe 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -103,6 +103,7 @@ void boardInit() LED_RCC_AHB1Periph | LCD_RCC_AHB1Periph | BACKLIGHT_RCC_AHB1Periph | + KEYS_BACKLIGHT_RCC_AHB1Periph | SD_RCC_AHB1Periph | AUDIO_RCC_AHB1Periph | KEYS_RCC_AHB1Periph | diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 44d8a5d10..41a8f96ee 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -492,6 +492,11 @@ void pwrOn(); void pwrOff(); void pwrResetHandler(); bool pwrPressed(); +#if defined(PWR_EXTRA_SWITCH_GPIO) + bool pwrForcePressed(); +#else + #define pwrForcePressed() false +#endif uint32_t pwrPressedDuration(); // USB Charger @@ -555,6 +560,10 @@ void usbJoystickUpdate(); #define USB_NAME "Jumper T16" #define USB_MANUFACTURER 'J', 'u', 'm', 'p', 'e', 'r', ' ', ' ' /* 8 bytes */ #define USB_PRODUCT 'T', '1', '6', ' ', ' ', ' ', ' ', ' ' /* 8 Bytes */ +#elif defined(RADIO_T18) + #define USB_NAME "Jumper T18" + #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 */ diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 5e7cd04c2..12b2a4630 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -322,7 +322,7 @@ #define ADC_TRANSFER_COMPLETE() (ADC_DMA->LISR & DMA_LISR_TCIF0) #if defined(RADIO_TX16S) #define ADC_VREF_PREC2 330 - #elif defined(RADIO_T16) + #elif defined(RADIO_T16) || defined(RADIO_T18) #define ADC_VREF_PREC2 300 #else #define ADC_VREF_PREC2 250 @@ -330,11 +330,21 @@ #endif // Power +#if defined(RADIO_T18) +#define PWR_RCC_AHB1Periph RCC_AHB1Periph_GPIOJ | RCC_AHB1Periph_GPIOB +#define PWR_ON_GPIO GPIOJ +#define PWR_ON_GPIO_PIN GPIO_Pin_1 // PJ.01 +#define PWR_SWITCH_GPIO GPIOJ +#define PWR_SWITCH_GPIO_PIN GPIO_Pin_0 // PJ.00 +#define PWR_EXTRA_SWITCH_GPIO GPIOB +#define PWR_EXTRA_SWITCH_GPIO_PIN GPIO_Pin_0 // PB.00 +#else #define PWR_RCC_AHB1Periph RCC_AHB1Periph_GPIOJ #define PWR_ON_GPIO GPIOJ #define PWR_ON_GPIO_PIN GPIO_Pin_1 // PJ.01 #define PWR_SWITCH_GPIO GPIOJ #define PWR_SWITCH_GPIO_PIN GPIO_Pin_0 // PJ.00 +#endif // USB Charger #if defined(USB_CHARGER) @@ -514,6 +524,9 @@ #define LCD_GPIO_NRST GPIOI #define LCD_GPIO_PIN_NRST GPIO_Pin_10 // PI.10 #endif +#if defined(PCBX10) && !defined(RADIO_T18) && !defined(SIMU) + #define LCD_VERTICAL_INVERT +#endif #define LTDC_IRQ_PRIO 4 #define DMA_SCREEN_IRQ_PRIO 6 @@ -549,6 +562,14 @@ #define BACKLIGHT_GPIO_AF GPIO_AF_TIM8 #define BACKLIGHT_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2) #endif +#if defined(RADIO_T18) + #define KEYS_BACKLIGHT_RCC_AHB1Periph RCC_AHB1Periph_GPIOC + #define KEYS_BACKLIGHT_GPIO GPIOC + #define KEYS_BACKLIGHT_GPIO_PIN GPIO_Pin_4 // PC.04 + #define KEYS_BACKLIGHT_GPIO_PinSource GPIO_PinSource4 +#else + #define KEYS_BACKLIGHT_RCC_AHB1Periph 0 +#endif // SD #define SD_RCC_AHB1Periph (RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) diff --git a/radio/src/targets/horus/lcd_driver.cpp b/radio/src/targets/horus/lcd_driver.cpp index 444994d02..42d2c3837 100644 --- a/radio/src/targets/horus/lcd_driver.cpp +++ b/radio/src/targets/horus/lcd_driver.cpp @@ -20,14 +20,25 @@ #include "opentx.h" -#define HBP 42 -#define VBP 12 +#if defined(RADIO_T18) + #define HBP 43 + #define VBP 12 -#define HSW 2 -#define VSW 10 + #define HSW 2 + #define VSW 4 -#define HFP 3 -#define VFP 2 + #define HFP 8 + #define VFP 8 +#else + #define HBP 42 + #define VBP 12 + + #define HSW 2 + #define VSW 10 + + #define HFP 3 + #define VFP 2 +#endif #define LCD_FIRST_LAYER 0 #define LCD_SECOND_LAYER 1 @@ -315,7 +326,11 @@ void LCD_Init(void) { /* Reset the LCD --------------------------------------------------------*/ LCD_NRSTConfig(); +#if defined(RADIO_T18) // T18 seems to have eractic display issue if NRST is ever driven low + NRST_HIGH(); +#else lcd_reset(); +#endif /* Configure the LCD Control pins */ LCD_AF_GPIOConfig(); @@ -383,7 +398,7 @@ void lcdInit(void) void DMAFillRect(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color) { -#if defined(PCBX10) +#if defined(LCD_VERTICAL_INVERT) x = destw - (x + w); y = desth - (y + h); #endif @@ -415,7 +430,7 @@ void DMAFillRect(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, ui void DMACopyBitmap(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, uint16_t y, const uint16_t * src, uint16_t srcw, uint16_t srch, uint16_t srcx, uint16_t srcy, uint16_t w, uint16_t h) { -#if defined(PCBX10) +#if defined(LCD_VERTICAL_INVERT) x = destw - (x + w); y = desth - (y + h); srcx = srcw - (srcx + w); @@ -458,7 +473,7 @@ void DMACopyBitmap(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, void DMACopyAlphaBitmap(uint16_t * dest, uint16_t destw, uint16_t desth, uint16_t x, uint16_t y, const uint16_t * src, uint16_t srcw, uint16_t srch, uint16_t srcx, uint16_t srcy, uint16_t w, uint16_t h) { -#if defined(PCBX10) +#if defined(LCD_VERTICAL_INVERT) x = destw - (x + w); y = desth - (y + h); srcx = srcw - (srcx + w); diff --git a/radio/src/targets/sky9x/board.h b/radio/src/targets/sky9x/board.h index 4a8587194..8b1c7275c 100644 --- a/radio/src/targets/sky9x/board.h +++ b/radio/src/targets/sky9x/board.h @@ -377,6 +377,7 @@ void pwrOn(); uint32_t pwrCheck(); bool pwrPressed(); #define UNEXPECTED_SHUTDOWN() (g_eeGeneral.unexpectedShutdown) +#define pwrForcePressed() (false) // EEPROM driver #define EEPROM_SIZE (4*1024*1024/8) diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 7dd0050a5..62ad32a5f 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -648,6 +648,7 @@ bool pwrPressed(); uint32_t pwrPressedDuration(); #endif void pwrResetHandler(); +#define pwrForcePressed() false #if defined(SIMU) #define UNEXPECTED_SHUTDOWN() false diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index cfe9830b7..65462c576 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -1639,6 +1639,7 @@ #define BACKLIGHT_GPIO_PinSource GPIO_PinSource8 #define BACKLIGHT_GPIO_AF GPIO_AF_TIM10 #endif +#define KEYS_BACKLIGHT_RCC_AHB1Periph 0 // LCD driver #if defined(PCBX9E) diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index ab57c5a33..43dccb554 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -96,6 +96,7 @@ ISTR(INPUTNAMES); #if defined(MULTIMODULE) ISTR(MULTI_PROTOCOLS); +ISTR(MULTI_POWER); #endif #if defined(BLUETOOTH) @@ -654,6 +655,7 @@ const char STR_GYRO_MAX[] = TR_GYRO_MAX; #if defined(PWM_BACKLIGHT) || defined(COLORLCD) const char STR_BLONBRIGHTNESS[] = TR_BLONBRIGHTNESS; const char STR_BLOFFBRIGHTNESS[] = TR_BLOFFBRIGHTNESS; +const char STR_KEYS_BACKLIGHT[] = TR_KEYS_BACKLIGHT; #endif const char STR_TIMEZONE[] = TR_TIMEZONE; @@ -694,6 +696,7 @@ const char STR_BIND_OK[] = TR_BIND_OK; const char STR_MULTI_CUSTOM[] = TR_MULTI_CUSTOM; const char STR_MULTI_RFTUNE[] = TR_MULTI_RFTUNE; +const char STR_MULTI_RFPOWER[] = TR_MULTI_RFPOWER; const char STR_MULTI_TELEMETRY[] = TR_MULTI_TELEMETRY; const char STR_MULTI_VIDFREQ[] = TR_MULTI_VIDFREQ; const char STR_MULTI_OPTION[] = TR_MULTI_OPTION; diff --git a/radio/src/translations.h b/radio/src/translations.h index a4b9fbb32..f428b3057 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -159,10 +159,8 @@ extern const char STR_XJT_ACCST_RF_PROTOCOLS[]; extern const char STR_ISRM_RF_PROTOCOLS[]; extern const char STR_R9M_PXX2_RF_PROTOCOLS[]; extern const char STR_DSM_PROTOCOLS[]; - -#if defined(MULTIMODULE) extern const char STR_MULTI_PROTOCOLS[]; -#endif +extern const char STR_MULTI_POWER[]; #if defined(AFHDS3) extern const char STR_AFHDS3_ONE_TO_ONE_TELEMETRY[]; @@ -305,6 +303,7 @@ extern const char STR_BLDELAY[]; #if defined(PWM_BACKLIGHT) || defined(COLORLCD) extern const char STR_BLONBRIGHTNESS[]; extern const char STR_BLOFFBRIGHTNESS[]; +extern const char STR_KEYS_BACKLIGHT[]; #endif extern const char STR_SPLASHSCREEN[]; @@ -399,6 +398,7 @@ extern const char STR_MULTI_FIXEDID[]; extern const char STR_MULTI_OPTION[]; extern const char STR_MULTI_VIDFREQ[]; extern const char STR_MULTI_RFTUNE[]; +extern const char STR_MULTI_RFPOWER[]; extern const char STR_MULTI_TELEMETRY[]; extern const char STR_MULTI_AUTOBIND[]; extern const char STR_DISABLE_CH_MAP[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 7ae453e04..d6563c16c 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -522,6 +522,7 @@ #define TR_BLDELAY INDENT"Zhasnout po" #define TR_BLONBRIGHTNESS TR3(INDENT"Jas Zap.", INDENT"Jas Zap.", INDENT"Jas zapnutého LCD") #define TR_BLOFFBRIGHTNESS TR3(INDENT"Jas Vyp.", INDENT"Jas Vyp.", INDENT"Jas vypnutého LCD") +#define TR_KEYS_BACKLIGHT "Keys backlight" #define TR_BLCOLOR INDENT "Barva" #define TR_SPLASHSCREEN TR("úvodní logo", "Zobrazit úvodní logo") #define TR_PWR_ON_DELAY "Pwr On delay" @@ -628,6 +629,7 @@ #define TR_RECEIVER_NUM TR("RX číslo", "Číslo přijímače") #define TR_RECEIVER "Přijímač" #define TR_MULTI_RFTUNE TR(INDENT "Ladění frek", INDENT "Jemné ladění frek. RF") +#define TR_MULTI_RFPOWER "RF power" #define TR_MULTI_TELEMETRY "Telemetrie" #define TR_MULTI_VIDFREQ TR(INDENT "Freq. videa", INDENT "Frekvence videa") #define TR_RFPOWER "Výkon RF" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index e0e4eb437..f816a7269 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -524,6 +524,7 @@ #define TR_BLDELAY INDENT "Dauer" #define TR_BLONBRIGHTNESS INDENT "An-Helligkeit" #define TR_BLOFFBRIGHTNESS INDENT "Aus-Helligkeit" +#define TR_KEYS_BACKLIGHT "Keys backlight" #define TR_BLCOLOR INDENT "Farbe" #define TR_SPLASHSCREEN TR("Startbild Ein", "Startbild Anzeigedauer") #define TR_PWR_ON_DELAY "Pwr On delay" @@ -630,6 +631,7 @@ #define TR_RECEIVER_NUM TR("Empf Nr.", "Empfänger Nummer") #define TR_RECEIVER "Empfänger" #define TR_MULTI_RFTUNE TR(INDENT "RF Freq.", INDENT "RF Freq. Feintuning") +#define TR_MULTI_RFPOWER "RF power" #define TR_MULTI_TELEMETRY "Telemetry" #define TR_MULTI_VIDFREQ TR(INDENT "Vid. Freq.", INDENT "Video Frequenz") #define TR_RFPOWER "RF Power" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index a270a1f34..f902dfa60 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -523,6 +523,7 @@ #define TR_BLDELAY INDENT "Duration" #define TR_BLONBRIGHTNESS INDENT "ON brightness" #define TR_BLOFFBRIGHTNESS INDENT "OFF brightness" +#define TR_KEYS_BACKLIGHT "Keys backlight" #define TR_BLCOLOR INDENT "Color" #define TR_SPLASHSCREEN "Splash screen" #define TR_PWR_ON_DELAY "Pwr On delay" @@ -629,6 +630,7 @@ #define TR_RECEIVER_NUM TR("RxNum", "Receiver No.") #define TR_RECEIVER "Receiver" #define TR_MULTI_RFTUNE TR("Freq tune", "RF Freq. fine tune") +#define TR_MULTI_RFPOWER "RF power" #define TR_MULTI_TELEMETRY "Telemetry" #define TR_MULTI_VIDFREQ TR("Vid. freq.", "Video frequency") #define TR_RFPOWER "RF Power" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 822ace072..d7dbd2b15 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -522,6 +522,7 @@ #define TR_BLDELAY INDENT"Duración" #define TR_BLONBRIGHTNESS INDENT"MAS brillo" #define TR_BLOFFBRIGHTNESS INDENT"MENOS brillo" +#define TR_KEYS_BACKLIGHT "Keys backlight" #define TR_BLCOLOR INDENT "Color" #define TR_SPLASHSCREEN "Pantalla inicio" #define TR_PWR_ON_DELAY TR("Atraso On", "Atraso encendido") @@ -631,6 +632,7 @@ #define TR_RECEIVER_NUM TR("Num Rx", "Receptor No.") #define TR_RECEIVER "Receptor" #define TR_MULTI_RFTUNE TR("Sint.freq.", "RF Freq. sint.fina") +#define TR_MULTI_RFPOWER "RF power" #define TR_MULTI_TELEMETRY "Telemetría" #define TR_MULTI_VIDFREQ TR("Freq.vídeo", "Frecuencia vídeo") #define TR_RFPOWER "RF Power" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index ec28eabcb..579eb25bf 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -536,6 +536,7 @@ #define TR_BLDELAY INDENT"Duration" #define TR_BLONBRIGHTNESS INDENT"ON Brightness" #define TR_BLOFFBRIGHTNESS INDENT"OFF Brightness" +#define TR_KEYS_BACKLIGHT "Keys backlight" #define TR_BLCOLOR INDENT "Color" #define TR_SPLASHSCREEN "Splash screen" #define TR_PWR_ON_DELAY "Pwr On delay" @@ -647,6 +648,7 @@ #define TR_RECEIVER_NUM TR("RxNum", "Receiver No.") #define TR_RECEIVER "Receiver" #define TR_MULTI_RFTUNE TR("Freq tune", "RF Freq. fine tune") +#define TR_MULTI_RFPOWER "RF power" #define TR_MULTI_TELEMETRY "Telemetry" #define TR_MULTI_VIDFREQ TR("Vid. freq.", "Video frequency") #define TR_RFPOWER "RF Power" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 466effb38..a914772d5 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -542,6 +542,7 @@ #define TR_BLDELAY INDENT "Durée" #define TR_BLONBRIGHTNESS INDENT "Luminosité ON" #define TR_BLOFFBRIGHTNESS INDENT "Luminosité OFF" +#define TR_KEYS_BACKLIGHT "Keys backlight" #define TR_BLCOLOR INDENT "Couleur" #define TR_SPLASHSCREEN "Logo d'accueil" #define TR_PWR_ON_DELAY "Délai btn ON" @@ -650,6 +651,7 @@ #define TR_RECEIVER_NUM TR("NumRx", "No. récepteur") #define TR_RECEIVER "Récept." #define TR_MULTI_RFTUNE TR(INDENT "Ajust.fréq", INDENT "Ajustement fréq.") +#define TR_MULTI_RFPOWER "RF power" #define TR_MULTI_TELEMETRY "Télémétrie" #define TR_MULTI_VIDFREQ TR(INDENT "Fréq. vidéo", INDENT "Fréquence vidéo") #define TR_RFPOWER TR("Puiss. RF", "Puissance RF") diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index cea9b2716..126955a6d 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -544,6 +544,7 @@ #define TR_BLDELAY INDENT "Durata" #define TR_BLONBRIGHTNESS TR(INDENT "Lumin. ON", INDENT "Luminosità ON") #define TR_BLOFFBRIGHTNESS TR(INDENT "Lumin. OFF", INDENT "Luminosità OFF") +#define TR_KEYS_BACKLIGHT "Keys backlight" #define TR_BLCOLOR INDENT "Colore" #define TR_SPLASHSCREEN TR("Sch. avvio", "Schermata d'avvio") #define TR_PWR_ON_DELAY "Rit. accens." @@ -649,6 +650,7 @@ #define TR_RECEIVER_NUM TR("RxNum", "Ricevente N.") #define TR_RECEIVER "Ricevente" #define TR_MULTI_RFTUNE TR("Tune RF", "Tune fine Freq. RF") +#define TR_MULTI_RFPOWER "RF power" #define TR_MULTI_TELEMETRY "Telemetria" #define TR_MULTI_VIDFREQ TR("Freq. video", "Frequenza video") #define TR_RFPOWER "Potenza RF" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 5c4310875..6c1138094 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -525,6 +525,7 @@ #define TR_BLDELAY INDENT "Duur" #define TR_BLONBRIGHTNESS INDENT "Aan-Helderheid" #define TR_BLOFFBRIGHTNESS INDENT "Uit-Helderheid" +#define TR_KEYS_BACKLIGHT "Keys backlight" #define TR_BLCOLOR INDENT "Kleur" #define TR_SPLASHSCREEN "Startscherm Aan" #define TR_PWR_ON_DELAY "Pwr On delay" @@ -635,6 +636,7 @@ #define TR_RECEIVER_NUM TR("RxNum", "Receiver Nr.") #define TR_RECEIVER "Receiver" #define TR_MULTI_RFTUNE TR("Freq tune", "RF Freq. fine tune") +#define TR_MULTI_RFPOWER "RF power" #define TR_MULTI_TELEMETRY "Telemetry" #define TR_MULTI_VIDFREQ TR("Vid. freq.", "Video frequency") #define TR_RFPOWER "RF Power" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 9f3efa84f..38b03063a 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -543,6 +543,7 @@ #define TR_BLDELAY INDENT"Czas trwania" #define TR_BLONBRIGHTNESS INDENT"Jasnośc wł." #define TR_BLOFFBRIGHTNESS INDENT"Jasność wył." +#define TR_KEYS_BACKLIGHT "Keys backlight" #define TR_BLCOLOR INDENT "Color" #define TR_SPLASHSCREEN "Logo ekranu" #define TR_PWR_ON_DELAY "Pwr On delay" @@ -648,6 +649,7 @@ #define TR_RECEIVER_NUM TR("Nr RX", "Nr odbiornika") #define TR_RECEIVER INDENT "Receiver" #define TR_MULTI_RFTUNE TR("Freq tune", "RF Freq. fine tune") +#define TR_MULTI_RFPOWER "RF power" #define TR_MULTI_TELEMETRY "Telemetry" #define TR_MULTI_VIDFREQ TR("Vid. freq.", "Video frequency") #define TR_RFPOWER "RF Power" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index e11cd03e6..e6a3ecfb1 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -529,6 +529,7 @@ #define TR_BLDELAY INDENT "Tempo Backlight" #define TR_BLONBRIGHTNESS INDENT "ON Brightness" #define TR_BLOFFBRIGHTNESS INDENT "OFF Brightness" +#define TR_KEYS_BACKLIGHT "Keys backlight" #define TR_BLCOLOR INDENT "Color" #define TR_SPLASHSCREEN "Splash screen" #define TR_PWR_ON_DELAY "Pwr On delay" @@ -639,6 +640,7 @@ #define TR_RECEIVER "Receiver" #define TR_SYNCMENU "Sync [MENU]" #define TR_MULTI_RFTUNE TR("Freq tune", "RF Freq. fine tune") +#define TR_MULTI_RFPOWER "RF power" #define TR_MULTI_TELEMETRY "Telemetry" #define TR_MULTI_VIDFREQ TR("Vid. freq.", "Video frequency") #define TR_RFPOWER "RF Power" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index ab1e44f3b..079127692 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -542,6 +542,7 @@ #define TR_BLDELAY INDENT "Av efter" #define TR_BLONBRIGHTNESS INDENT "På Ljusstyrka" #define TR_BLOFFBRIGHTNESS INDENT "Av Ljusstyrka" +#define TR_KEYS_BACKLIGHT "Keys backlight" #define TR_SPLASHSCREEN "Startbild" #define TR_PWR_ON_DELAY "Pwr On delay" #define TR_PWR_OFF_DELAY "Pwr Off delay" @@ -648,6 +649,7 @@ #define TR_RECEIVER "Receiver" #define TR_SYNCMENU "Synk [MENU]" #define TR_MULTI_RFTUNE TR("Freq tune", "RF Freq. fine tune") +#define TR_MULTI_RFPOWER "RF power" #define TR_MULTI_TELEMETRY "Telemetry" #define TR_MULTI_VIDFREQ TR("Vid. freq.", "Video frequency") #define TR_RFPOWER "RF Power" diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h index 97a431879..32acdcb84 100644 --- a/radio/src/translations/untranslated.h +++ b/radio/src/translations/untranslated.h @@ -125,8 +125,10 @@ #define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" #define LEN_MULTI_PROTOCOLS "\007" +#define TR_MULTI_PROTOCOLS "FlySky\0""Hubsan\0""FrSky\0 ""Hisky\0 ""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0 ""KN\0 ""SymaX\0 ""SLT\0 ""CX10\0 ""CG023\0 ""Bayang\0""ESky\0 ""MT99XX\0""MJXq\0 ""Shenqi\0""FY326\0 ""SFHSS\0 ""J6 Pro\0""FQ777\0 ""Assan\0 ""Hontai\0""OpenLrs""FlSky2A""Q2x2\0 ""Walkera""Q303\0 ""GW008\0 ""DM002\0 ""Cabell\0""Esky150""H8 3D\0 ""Corona\0""CFlie\0 ""Hitec\0 ""WFly\0 ""Bugs\0 ""BugMini""Traxxas""NCC1701""E01X\0 ""V911S\0 ""GD00X\0 ""V761\0 ""KF606\0 ""Redpine""Potensi""ZSX\0 ""FlyZone""Scanner""FrSkyRX""FS2A_RX""HoTT\0 ""FX816\0 ""BayanRX""Pelikan""Tiger\0 ""XK\0 ""XN297DU""FrSkyX2""FrSkyR9""Propel\0""FrSkyL\0""Skyarte""ESky-v2""DSM RX\0""JJRC345""Q90C\0 " -#define TR_MULTI_PROTOCOLS "FlySky\0""Hubsan\0""FrSky\0 ""Hisky\0 ""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0 ""KN\0 ""SymaX\0 ""SLT\0 ""CX10\0 ""CG023\0 ""Bayang\0""ESky\0 ""MT99XX\0""MJXq\0 ""Shenqi\0""FY326\0 ""SFHSS\0 ""J6 Pro\0""FQ777\0 ""Assan\0 ""Hontai\0""OpenLrs""FlSky2A""Q2x2\0 ""Walkera""Q303\0 ""GW008\0 ""DM002\0 ""Cabell\0""Esky150""H8 3D\0 ""Corona\0""CFlie\0 ""Hitec\0 ""WFly\0 ""Bugs\0 ""BugMini""Traxxas""NCC1701""E01X\0 ""V911S\0 ""GD00X\0 ""V761\0 ""KF606\0 ""Redpine""Potensi""ZSX\0 ""FlyZone""Scanner""FrSkyRX""FS2A_RX""HoTT\0 ""FX816\0 ""BayanRX""Pelikan""Tiger\0 ""XK\0 ""XN297DU""FrSkyX2""FrSkyR9""Propel\0""FrSkyL\0""Skyartc""ESky-v2""DSM RX\0""JJRC345""Q90C\0 " +#define LEN_MULTI_POWER "\005" +#define TR_MULTI_POWER "10mW\0""25mW\0""50mW\0""100mW""200mW""300mW""500mW""1W\0 ""2W\0 " #define LEN_AFHDS3_PROTOCOLS "\x008" #define TR_AFHDS3_PROTOCOLS "PWM/IBUS""PWM/SBUS""PPM/IBUS""PPM/SBUS" diff --git a/radio/util/build-firmware.py b/radio/util/build-firmware.py index 76bade5b6..487fe1f03 100755 --- a/radio/util/build-firmware.py +++ b/radio/util/build-firmware.py @@ -148,6 +148,11 @@ def main(): cmake_options["PCBREV"] = "T16" firmware_options = options_jumper_t16 maxsize = 2 * 1024 * 1024 + elif board_name == "t18": + cmake_options["PCB"] = "X10" + cmake_options["PCBREV"] = "T18" + firmware_options = options_jumper_t16 + maxsize = 2 * 1024 * 1024 elif board_name == "tx16s": cmake_options["PCB"] = "X10" cmake_options["PCBREV"] = "TX16S" diff --git a/tools/build-companion-nightly.sh b/tools/build-companion-nightly.sh index 98d6653e6..fbf8f7166 100755 --- a/tools/build-companion-nightly.sh +++ b/tools/build-companion-nightly.sh @@ -106,6 +106,10 @@ cmake ${COMMON_OPTIONS} -DPCB=X10 -DPCBREV=TX16S ${SRCDIR} make -j${JOBS} libsimulator rm CMakeCache.txt +cmake ${COMMON_OPTIONS} -DPCB=X10 -DPCBREV=T18 ${SRCDIR} +make -j${JOBS} libsimulator +rm CMakeCache.txt + cmake ${COMMON_OPTIONS} -DPCB=X10 -DPCBREV=EXPRESS ${SRCDIR} make -j${JOBS} libsimulator rm CMakeCache.txt diff --git a/tools/build-jumper.py b/tools/build-jumper.py index ab3fb9e45..6e7f3d733 100755 --- a/tools/build-jumper.py +++ b/tools/build-jumper.py @@ -25,6 +25,12 @@ boards = { "PCBREV": "T16", "INTERNAL_MODULE_MULTI": "YES", "DEFAULT_MODE": "2", + }, + "T18": { + "PCB": "X10", + "PCBREV": "T18", + "INTERNAL_MODULE_MULTI": "YES", + "DEFAULT_MODE": "2", } } From 10243f2436331145946401bf2591cea792050c79 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 22 Jun 2020 21:48:33 +0200 Subject: [PATCH 478/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 92fd0a455..039e0a70f 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1770,3 +1770,4 @@ Peter Sarcher Steve Schoonover Francisco Orcera Exposito Alan Powell +Martin Eriksson From 82869c8500db6d5259f9bc33cbb59618b82ef9fd Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 23 Jun 2020 07:28:37 +0200 Subject: [PATCH 479/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 039e0a70f..dcd43cb24 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1771,3 +1771,4 @@ Steve Schoonover Francisco Orcera Exposito Alan Powell Martin Eriksson +Wayne J Podaima From e1abf2c80be4d952e463ee02a893f9cf47a70a20 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 23 Jun 2020 21:26:40 +0200 Subject: [PATCH 480/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index dcd43cb24..af1172e2e 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1772,3 +1772,4 @@ Francisco Orcera Exposito Alan Powell Martin Eriksson Wayne J Podaima +Tom Wilkinson From 149627fd14dfbb20c85fea33b33ea3ee637cf604 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 24 Jun 2020 10:27:41 +0200 Subject: [PATCH 481/560] Update CREDITS.txt --- CREDITS.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index af1172e2e..3cf148f8b 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -8,6 +8,7 @@ Romolo Manfredini (romoloman) Martin Hotař (mhotar) Maxim (Max) Paperno (mpaperno) Arne Schwabe (schwabe) +Daniel Gorbea (dgatf) [Translators] [fr] Sebastien Charpentier (LapinFou) @@ -1773,3 +1774,4 @@ Alan Powell Martin Eriksson Wayne J Podaima Tom Wilkinson +Fred Ceratt From 77f4c18f4c55f007d91872c59a72f94a27b343fe Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 24 Jun 2020 12:14:46 +0200 Subject: [PATCH 482/560] Frsky production script updated --- tools/build-frsky.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tools/build-frsky.py b/tools/build-frsky.py index 5a5cb26ac..6e3b7de85 100755 --- a/tools/build-frsky.py +++ b/tools/build-frsky.py @@ -76,7 +76,7 @@ boards = { "SBUS": "NO", "DEFAULT_MODE": "2", }, - "X9D+": { + "X9D+2019": { "PCB": "X9D+", "PCBREV": "2019", "LUA": "NO_MODEL_SCRIPTS", @@ -87,6 +87,14 @@ boards = { "CROSSFIRE": "NO", "DEFAULT_MODE": "2", }, + "X9D+": { + "PCB": "X9D+", + "LUA": "NO_MODEL_SCRIPTS", + "GVARS": "YES", + "MULTIMODULE": "NO", + "CROSSFIRE": "NO", + "DEFAULT_MODE": "2", + }, "X9E": { "PCB": "X9E", "LUA": "NO_MODEL_SCRIPTS", From 0ff6c0e5aeb0d09b2fac4122ea019676b14f36bb Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 24 Jun 2020 12:35:28 +0200 Subject: [PATCH 483/560] Fix nightlies (#7765) --- radio/src/datastructs.h | 4 ---- radio/src/pulses/afhds3.cpp | 2 +- radio/src/pulses/afhds3.h | 6 +++--- radio/src/targets/horus/lcd_driver.cpp | 8 ++++---- 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 876ae9875..9f114c5f8 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -744,12 +744,8 @@ PACK(struct RadioData { uint8_t backlightMode:3; int8_t antennaMode:2; uint8_t disableRtcWarning:1; -#if defined(KEYS_BACKLIGHT_GPIO) uint8_t keysBacklight:1; int8_t spare1:1; -#else - int8_t spare1:2; -#endif NOBACKUP(TrainerData trainer); NOBACKUP(uint8_t view); // index of view in main screen NOBACKUP(BUZZER_FIELD); /* 2bits */ diff --git a/radio/src/pulses/afhds3.cpp b/radio/src/pulses/afhds3.cpp index bd3f577a3..bcfe8d3cf 100644 --- a/radio/src/pulses/afhds3.cpp +++ b/radio/src/pulses/afhds3.cpp @@ -341,7 +341,7 @@ void PulsesData::putFrame(COMMAND command, FRAME_TYPE frame, uint8_t* data, uint if (frameIndex == nullptr) { frameIndex = &this->frame_index; } - uint8_t buffer[] = { FrameAddress, *frameIndex, frame, command }; + uint8_t buffer[] = {FrameAddress, *frameIndex, frame, command}; putBytes(buffer, 4); //payload diff --git a/radio/src/pulses/afhds3.h b/radio/src/pulses/afhds3.h index 774293b65..fab057854 100644 --- a/radio/src/pulses/afhds3.h +++ b/radio/src/pulses/afhds3.h @@ -43,7 +43,7 @@ // 1s = 1 000 000 us // 1000000/115200 = 8,68 us // actual timer is ticking in 0,5 us = 8,68*2 = 17,36 because it must be integer take 17 -// difference 1000000 / x = 8.5 --> x = 117 647 = difference = 1.2 % +// difference 1000000 / x = 8.5 --> x = 117 647 = difference = 1.2 % // allowed half a bit difference on the last bit -- should be fine #define AFHDS3_BAUDRATE 115200 //Because timer is ticking with 0.5us @@ -176,7 +176,7 @@ enum DeviceAddress MODULE = 0x03, }; -enum FRAME_TYPE +enum FRAME_TYPE: uint8_t { REQUEST_GET_DATA = 0x01, //Get data response: ACK + DATA REQUEST_SET_EXPECT_DATA = 0x02, //Set data response: ACK + DATA @@ -187,7 +187,7 @@ enum FRAME_TYPE NOT_USED = 0xff }; -enum COMMAND +enum COMMAND: uint8_t { MODULE_READY = 0x01, MODULE_STATE = 0x02, diff --git a/radio/src/targets/horus/lcd_driver.cpp b/radio/src/targets/horus/lcd_driver.cpp index 42d2c3837..751aa88cd 100644 --- a/radio/src/targets/horus/lcd_driver.cpp +++ b/radio/src/targets/horus/lcd_driver.cpp @@ -153,6 +153,9 @@ static void delay3(uint32_t nCount) static void lcd_reset(void) { +#if defined(RADIO_T18) // T18 screen has issues if NRST is ever brought low + NRST_HIGH(); +#else NRST_HIGH(); delay3(1); @@ -161,6 +164,7 @@ static void lcd_reset(void) NRST_HIGH(); delay3(30); +#endif } void LCD_Init_LTDC(void) @@ -326,11 +330,7 @@ void LCD_Init(void) { /* Reset the LCD --------------------------------------------------------*/ LCD_NRSTConfig(); -#if defined(RADIO_T18) // T18 seems to have eractic display issue if NRST is ever driven low - NRST_HIGH(); -#else lcd_reset(); -#endif /* Configure the LCD Control pins */ LCD_AF_GPIOConfig(); From 8c7a3eabd0115481dc75ad2ebc7c29224f2862ee Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 24 Jun 2020 12:42:43 +0200 Subject: [PATCH 484/560] Frsky production script updated. Compilation fixes --- radio/src/gui/480x272/model_setup.cpp | 8 +++- tools/build-frsky.py | 66 ++++----------------------- 2 files changed, 15 insertions(+), 59 deletions(-) diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index 4fc0a1e75..264685b2d 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -1801,13 +1801,15 @@ bool menuModelSetup(event_t event) #endif #if defined(MULTIMODULE) || defined(AFHDS3) -#if defined(HARDWARE_INTERNAL_MODULE) +#if defined(MULTIMODULE) && defined(HARDWARE_INTERNAL_MODULE) case ITEM_MODEL_SETUP_INTERNAL_MODULE_STATUS: #endif #if defined(AFHDS3) case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_STATUS: #endif +#if defined(MULTIMODULE) case ITEM_MODEL_SETUP_EXTERNAL_MODULE_STATUS: +#endif { lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MODULE_STATUS); @@ -1817,13 +1819,15 @@ bool menuModelSetup(event_t event) break; } -#if defined(HARDWARE_INTERNAL_MODULE) +#if defined(MULTIMODULE) && defined(HARDWARE_INTERNAL_MODULE) case ITEM_MODEL_SETUP_INTERNAL_MODULE_SYNCSTATUS: #endif #if defined(AFHDS3) case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AFHDS3_POWER_STATUS: #endif +#if defined(MULTIMODULE) case ITEM_MODEL_SETUP_EXTERNAL_MODULE_SYNCSTATUS: +#endif { #if defined(AFHDS3) if (isModuleAFHDS3(moduleIdx)) { diff --git a/tools/build-frsky.py b/tools/build-frsky.py index 6e3b7de85..fc33d2b80 100755 --- a/tools/build-frsky.py +++ b/tools/build-frsky.py @@ -11,149 +11,93 @@ import tempfile boards = { "XLITE_FCC": { "PCB": "XLITE", - "LUA": "NO_MODEL_SCRIPTS", - "GVARS": "YES", "MODULE_SIZE_STD": "NO", "PPM": "NO", "DSM2": "NO", - "MULTIMODULE": "NO", - "CROSSFIRE": "NO", "SBUS": "NO", }, "XLITE_LBT": { "PCB": "XLITE", "MODULE_PROTOCOL_D8": "NO", - "LUA": "NO_MODEL_SCRIPTS", - "GVARS": "YES", "MODULE_SIZE_STD": "NO", "PPM": "NO", "DSM2": "NO", - "MULTIMODULE": "NO", - "CROSSFIRE": "NO", "SBUS": "NO", }, "XLITES": { "PCB": "XLITES", - "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", }, "X9LITE": { "PCB": "X9LITE", - "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", }, "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+2019": { "PCB": "X9D+", "PCBREV": "2019", - "LUA": "NO_MODEL_SCRIPTS", - "GVARS": "YES", "AUTOUPDATE": "YES", "PXX1": "YES", - "MULTIMODULE": "NO", - "CROSSFIRE": "NO", "DEFAULT_MODE": "2", }, "X9D+": { "PCB": "X9D+", - "LUA": "NO_MODEL_SCRIPTS", - "GVARS": "YES", - "MULTIMODULE": "NO", - "CROSSFIRE": "NO", "DEFAULT_MODE": "2", }, "X9E": { "PCB": "X9E", - "LUA": "NO_MODEL_SCRIPTS", - "GVARS": "YES", - "MULTIMODULE": "NO", - "CROSSFIRE": "NO", "DEFAULT_MODE": "2", }, "X7_FCC": { "PCB": "X7", - "LUA": "NO_MODEL_SCRIPTS", - "GVARS": "YES", - "MULTIMODULE": "NO", - "CROSSFIRE": "NO", "DEFAULT_MODE": "2", }, "X7_LBT": { "PCB": "X7", "MODULE_PROTOCOL_D8": "NO", - "LUA": "NO_MODEL_SCRIPTS", - "GVARS": "YES", - "MULTIMODULE": "NO", - "CROSSFIRE": "NO", "DEFAULT_MODE": "2", }, "X7ACCESS": { "PCB": "X7", "PCBREV": "ACCESS", - "LUA": "NO_MODEL_SCRIPTS", - "GVARS": "YES", "AUTOUPDATE": "YES", "PXX1": "YES", - "MULTIMODULE": "NO", - "CROSSFIRE": "NO", "DEFAULT_MODE": "2", }, "X10S": { "PCB": "X10", - "LUA": "NO_MODEL_SCRIPTS", - "GVARS": "YES", - "MULTIMODULE": "NO", - "CROSSFIRE": "NO", "DEFAULT_MODE": "2", }, "X10SExpress": { "PCB": "X10", "PCBREV": "EXPRESS", - "LUA": "NO_MODEL_SCRIPTS", - "GVARS": "YES", - "MULTIMODULE": "NO", - "CROSSFIRE": "NO", "DEFAULT_MODE": "2", }, "X12S": { "PCB": "X12S", - "LUA": "NO_MODEL_SCRIPTS", - "GVARS": "YES", - "MULTIMODULE": "NO", - "CROSSFIRE": "NO", "DEFAULT_MODE": "2", }, } @@ -163,13 +107,21 @@ translations = [ "CZ" ] +common_options = { + "MULTIMODULE": "NO", + "CROSSFIRE": "NO", + "AFHDS3": "NO", + "GVARS": "YES", + "LUA": "NO_MODEL_SCRIPTS", +} + def timestamp(): return datetime.datetime.now().strftime("%y%m%d") def build(board, translation, srcdir): - cmake_options = " ".join(["-D%s=%s" % (key, value) for key, value in boards[board].items()]) + cmake_options = " ".join(["-D%s=%s" % (key, value) for key, value in list(boards[board].items()) + list(common_options.items())]) cwd = os.getcwd() if not os.path.exists("output"): os.mkdir("output") From a2b6150934f1805590840ee7e966f4a50e21d9b1 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 24 Jun 2020 13:31:46 +0200 Subject: [PATCH 485/560] Increase travis coverage --- tools/commit-tests.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/commit-tests.sh b/tools/commit-tests.sh index 92b5542f0..c1c97237e 100755 --- a/tools/commit-tests.sh +++ b/tools/commit-tests.sh @@ -97,7 +97,7 @@ fi if [[ " X9LITES X9LITE ALL " =~ \ ${FLAVOR}\ ]] ; then # OpenTX on X9LITES rm -rf ./* - cmake "${COMMON_OPTIONS}" -DPCB=X9LITES -DHELI=YES -DGVARS=YES "${SRCDIR}" + cmake "${COMMON_OPTIONS}" -DPCB=X9LITES -DHELI=YES -DGVARS=YES -DMULTIMODULE=NO "${SRCDIR}" make -j"${CORES}" ${FIRMARE_TARGET} make -j"${CORES}" libsimulator make -j"${CORES}" tests-radio @@ -187,7 +187,7 @@ fi if [[ " T16 COLORLCD ALL " =~ \ ${FLAVOR}\ ]] ; then # OpenTX on T16 boards rm -rf ./* - cmake "${COMMON_OPTIONS}" -DPCB=X10 -DPCBREV=T16 -DHELI=YES -DLUA=YES -DGVARS=YES "${SRCDIR}" + cmake "${COMMON_OPTIONS}" -DPCB=X10 -DPCBREV=T16 -DHELI=YES -DLUA=YES -DGVARS=YES -DAFHDS3=NO "${SRCDIR}" make -j"${CORES}" ${FIRMARE_TARGET} make -j"${CORES}" libsimulator make -j"${CORES}" tests-radio @@ -205,7 +205,7 @@ fi if [[ " X12S COLORLCD ALL " =~ \ ${FLAVOR}\ ]] ; then # OpenTX on X12S rm -rf ./* - cmake "${COMMON_OPTIONS}" -DPCB=X12S -DHELI=YES -DLUA=YES -DGVARS=YES "${SRCDIR}" + cmake "${COMMON_OPTIONS}" -DPCB=X12S -DHELI=YES -DLUA=YES -DGVARS=YES -DMULTIMODULE=NO "${SRCDIR}" make -j"${CORES}" ${FIRMARE_TARGET} make -j"${CORES}" libsimulator make -j"${CORES}" tests-radio From 7b3a77e4cfa4a20ea45ff53890e68bb9e0e2c146 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 25 Jun 2020 00:19:04 +0200 Subject: [PATCH 486/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 3cf148f8b..1faa26219 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1775,3 +1775,4 @@ Martin Eriksson Wayne J Podaima Tom Wilkinson Fred Ceratt +Stefan Grunenberg From ed1c1f06964d479be8c88bd78a01422438aec4c2 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 25 Jun 2020 08:59:18 +0200 Subject: [PATCH 487/560] Fix AUX/AUX2 power handling. This fixes #7751 --- .../targets/common/arm/stm32/aux_serial_driver.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp index 8d24c00df..88fc32cb8 100644 --- a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp @@ -101,11 +101,12 @@ void auxSerialInit(unsigned int mode, unsigned int protocol) #if defined(CROSSFIRE) if (protocol == PROTOCOL_TELEMETRY_CROSSFIRE) { auxSerialSetup(CROSSFIRE_TELEM_MIRROR_BAUDRATE, false); - AUX_SERIAL_POWER_OFF(); + AUX_SERIAL_POWER_ON(); break; } #endif auxSerialSetup(FRSKY_TELEM_MIRROR_BAUDRATE, false); + AUX_SERIAL_POWER_ON(); break; #if defined(DEBUG) || defined(CLI) @@ -118,7 +119,7 @@ void auxSerialInit(unsigned int mode, unsigned int protocol) case UART_MODE_TELEMETRY: if (protocol == PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY) { auxSerialSetup(FRSKY_D_BAUDRATE, true); - AUX_SERIAL_POWER_OFF(); + AUX_SERIAL_POWER_ON(); } break; @@ -292,12 +293,12 @@ void aux2SerialInit(unsigned int mode, unsigned int protocol) #if defined(CROSSFIRE) if (protocol == PROTOCOL_TELEMETRY_CROSSFIRE) { aux2SerialSetup(CROSSFIRE_TELEM_MIRROR_BAUDRATE, false); - AUX2_SERIAL_POWER_OFF(); + AUX2_SERIAL_POWER_ON(); break; } #endif aux2SerialSetup(FRSKY_TELEM_MIRROR_BAUDRATE, false); - AUX2_SERIAL_POWER_OFF(); + AUX2_SERIAL_POWER_ON(); break; #if defined(DEBUG) || defined(CLI) @@ -310,7 +311,7 @@ void aux2SerialInit(unsigned int mode, unsigned int protocol) case UART_MODE_TELEMETRY: if (protocol == PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY) { aux2SerialSetup(FRSKY_D_BAUDRATE, true); - AUX2_SERIAL_POWER_OFF(); + AUX2_SERIAL_POWER_ON(); } break; From 55e642bc04bd0bf23c44826aead7021898483679 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 25 Jun 2020 09:26:08 +0200 Subject: [PATCH 488/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 1faa26219..016395ecd 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1776,3 +1776,4 @@ Wayne J Podaima Tom Wilkinson Fred Ceratt Stefan Grunenberg +Aram Parsamyan From e203211482b9f107bc8a36bc1de27f29bff05ab2 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 25 Jun 2020 21:23:49 +0200 Subject: [PATCH 489/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 016395ecd..b11780727 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1777,3 +1777,4 @@ Tom Wilkinson Fred Ceratt Stefan Grunenberg Aram Parsamyan +Wolfgang Rauser From feb5a072375ebed30d7cda64417c17653205f784 Mon Sep 17 00:00:00 2001 From: Kilrah Date: Fri, 26 Jun 2020 01:39:40 +0200 Subject: [PATCH 490/560] Fix T18 missing internal multi --- radio/util/build-firmware.py | 2 +- radio/util/fwoptions.py | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/radio/util/build-firmware.py b/radio/util/build-firmware.py index 487fe1f03..11b85be7d 100755 --- a/radio/util/build-firmware.py +++ b/radio/util/build-firmware.py @@ -151,7 +151,7 @@ def main(): elif board_name == "t18": cmake_options["PCB"] = "X10" cmake_options["PCBREV"] = "T18" - firmware_options = options_jumper_t16 + firmware_options = options_jumper_t18 maxsize = 2 * 1024 * 1024 elif board_name == "tx16s": cmake_options["PCB"] = "X10" diff --git a/radio/util/fwoptions.py b/radio/util/fwoptions.py index cae773561..7227b3cef 100755 --- a/radio/util/fwoptions.py +++ b/radio/util/fwoptions.py @@ -235,6 +235,19 @@ options_jumper_t16 = { "afhds3": ("AFHDS3", "YES", "NO") } +options_jumper_t18 = { + "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), + "bluetooth": ("BLUETOOTH", "YES", "NO"), + "afhds3": ("AFHDS3", "YES", "NO") +} + options_radiomaster_tx16s = { "noheli": ("HELI", "NO", "YES"), "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"), From 331ae68d293c788ac8edf4c834043fa42cfbfb55 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 26 Jun 2020 10:05:39 +0200 Subject: [PATCH 491/560] Offer AFHDS3 on T18 --- companion/src/firmwares/opentx/opentxinterface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index ea13bdb18..82c1b5728 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -1283,7 +1283,7 @@ void registerOpenTxFirmwares() addOpenTxFrskyOptions(firmware); firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module")); registerOpenTxFirmware(firmware); - addOpenTxRfOptions(firmware, FLEX); + addOpenTxRfOptions(firmware, FLEX + AFHDS3); /* 9XR-Pro */ firmware = new OpenTxFirmware("opentx-9xrpro", Firmware::tr("Turnigy 9XR-PRO"), BOARD_9XRPRO); From 9b674010a88fad963fb6c17f33abf5b7cc6024a8 Mon Sep 17 00:00:00 2001 From: Kilrah Date: Fri, 26 Jun 2020 10:23:05 +0200 Subject: [PATCH 492/560] Add AFHDS3 by default to radios with enough RAM for testing --- .../src/firmwares/opentx/opentxinterface.cpp | 16 +++++++------- radio/util/build-firmware.py | 7 +++++-- radio/util/fwoptions.py | 21 +++++++++++++------ 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 82c1b5728..4bbeb43b3 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -1174,7 +1174,7 @@ void registerOpenTxFirmwares() firmware = new OpenTxFirmware("opentx-x9d+2019", Firmware::tr("FrSky Taranis X9D+ 2019"), BOARD_TARANIS_X9DP_2019); addOpenTxTaranisOptions(firmware); registerOpenTxFirmware(firmware); - addOpenTxRfOptions(firmware, FLEX + AFHDS3); + addOpenTxRfOptions(firmware, FLEX); /* FrSky Taranis X9D board */ firmware = new OpenTxFirmware("opentx-x9d", Firmware::tr("FrSky Taranis X9D"), BOARD_TARANIS_X9D); @@ -1208,13 +1208,13 @@ void registerOpenTxFirmwares() firmware = new OpenTxFirmware("opentx-x7", Firmware::tr("FrSky Taranis X7 / X7S"), BOARD_TARANIS_X7); addOpenTxTaranisOptions(firmware); registerOpenTxFirmware(firmware); - addOpenTxRfOptions(firmware, EU + FLEX + AFHDS3); + addOpenTxRfOptions(firmware, EU + FLEX); /* FrSky X7 Access board */ firmware = new OpenTxFirmware("opentx-x7access", Firmware::tr("FrSky Taranis X7 / X7S Access"), BOARD_TARANIS_X7_ACCESS); addOpenTxTaranisOptions(firmware); registerOpenTxFirmware(firmware); - addOpenTxRfOptions(firmware, FLEX + AFHDS3); + addOpenTxRfOptions(firmware, FLEX); /* FrSky X-Lite S/PRO board */ firmware = new OpenTxFirmware("opentx-xlites", Firmware::tr("FrSky Taranis X-Lite S/PRO"), BOARD_TARANIS_XLITES); @@ -1234,13 +1234,13 @@ void registerOpenTxFirmwares() addOpenTxFrskyOptions(firmware); firmware->addOption("internalaccess", Firmware::tr("Support for ACCESS internal module replacement")); registerOpenTxFirmware(firmware); - addOpenTxRfOptions(firmware, EU + FLEX + AFHDS3); + addOpenTxRfOptions(firmware, EU + FLEX); /* FrSky X10 Express board */ firmware = new OpenTxFirmware("opentx-x10express", Firmware::tr("FrSky Horus X10 Express / X10S Express"), BOARD_X10_EXPRESS); addOpenTxFrskyOptions(firmware); registerOpenTxFirmware(firmware); - addOpenTxRfOptions(firmware, FLEX + AFHDS3); + addOpenTxRfOptions(firmware, FLEX); /* FrSky X12 (Horus) board */ firmware = new OpenTxFirmware("opentx-x12s", Firmware::tr("FrSky Horus X12S"), BOARD_HORUS_X12S); @@ -1248,7 +1248,7 @@ void registerOpenTxFirmwares() firmware->addOption("internalaccess", Firmware::tr("Support for ACCESS internal module replacement")); firmware->addOption("pcbdev", Firmware::tr("Use ONLY with first DEV pcb version")); registerOpenTxFirmware(firmware); - addOpenTxRfOptions(firmware, EU + FLEX + AFHDS3); + addOpenTxRfOptions(firmware, EU + FLEX); /* Jumper T12 board */ firmware = new OpenTxFirmware("opentx-t12", QCoreApplication::translate("Firmware", "Jumper T12 / T12 Pro"), BOARD_JUMPER_T12); @@ -1266,13 +1266,13 @@ void registerOpenTxFirmwares() addOpenTxFrskyOptions(firmware); firmware->addOption("internalmulti", Firmware::tr("Support for MULTI internal module")); firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module")); - addOpenTxRfOptions(firmware, FLEX + AFHDS3); + addOpenTxRfOptions(firmware, FLEX); registerOpenTxFirmware(firmware); /* Radiomaster TX16S board */ firmware = new OpenTxFirmware("opentx-tx16s", Firmware::tr("Radiomaster TX16s / TX16s Hall / TX16s Masterfire"), BOARD_RADIOMASTER_TX16S); addOpenTxFrskyOptions(firmware); - addOpenTxRfOptions(firmware, FLEX + AFHDS3); + addOpenTxRfOptions(firmware, FLEX); static const Firmware::Option opt_bt("bluetooth", Firmware::tr("Support for bluetooth module")); static const Firmware::Option opt_internal_gps("internalgps", Firmware::tr("Support internal GPS")); firmware->addOptionsGroup({opt_bt, opt_internal_gps}); diff --git a/radio/util/build-firmware.py b/radio/util/build-firmware.py index 11b85be7d..c27e6b58a 100755 --- a/radio/util/build-firmware.py +++ b/radio/util/build-firmware.py @@ -93,12 +93,14 @@ def main(): maxsize = 65536 * 8 elif options[optcount] == "x7": cmake_options["PCB"] = "X7" - firmware_options = options_taranis_x9dp + cmake_options["AFHDS3"] = "YES" + firmware_options = options_taranis_x7 maxsize = 65536 * 8 elif options[optcount] == "x7access": cmake_options["PCB"] = "X7" cmake_options["PCBREV"] = "ACCESS" - firmware_options = options_taranis_x9dp + cmake_options["AFHDS3"] = "YES" + firmware_options = options_taranis_x7 maxsize = 65536 * 8 elif board_name == "xlite": cmake_options["PCB"] = "XLITE" @@ -119,6 +121,7 @@ def main(): elif board_name == "x9d+2019": cmake_options["PCB"] = "X9D+" cmake_options["PCBREV"] = "2019" + cmake_options["AFHDS3"] = "YES" firmware_options = options_taranis_x9dp maxsize = 65536 * 8 elif board_name == "x9e": diff --git a/radio/util/fwoptions.py b/radio/util/fwoptions.py index 7227b3cef..fe5331cb0 100755 --- a/radio/util/fwoptions.py +++ b/radio/util/fwoptions.py @@ -97,6 +97,21 @@ options_taranis_x9dp = { "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), "afhds3": ("AFHDS3", "YES", "NO") } +options_taranis_x7 = { + "noheli": ("HELI", "NO", "YES"), + "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"), + "lua": ("LUA", "YES", "NO_MODEL_SCRIPTS"), + "nogvars": ("GVARS", "NO", "YES"), + "sqt5font": ("FONT", "SQT5", None), + "noras": ("RAS", "NO", "YES"), + "faimode": ("FAI", "YES", None), + "faichoice": ("FAI", "CHOICE", None), + "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), + "internalppm": ("INTERNAL_MODULE_PPM", "YES", "NO"), + "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), + "eu": ("MODULE_PROTOCOL_D8", "NO", "YES"), + "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), +} options_taranis_x9lite = { "noheli": ("HELI", "NO", "YES"), @@ -177,7 +192,6 @@ options_horus_x12s = { "pcbdev": ("PCBREV", "10", None), "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), "internalaccess": [("INTERNAL_MODULE_PXX1", "NO", None), ("INTERNAL_MODULE_PXX2", "YES", None)], - "afhds3": ("AFHDS3", "YES", "NO") } options_horus_x10 = { @@ -191,7 +205,6 @@ options_horus_x10 = { "eu": ("MODULE_PROTOCOL_D8", "NO", "YES"), "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), "internalaccess": [("INTERNAL_MODULE_PXX1", "NO", None), ("INTERNAL_MODULE_PXX2", "YES", None)], - "afhds3": ("AFHDS3", "YES", "NO") } options_horus_x10express = { @@ -205,7 +218,6 @@ options_horus_x10express = { "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), "eu": ("MODULE_PROTOCOL_D8", "NO", "YES"), "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), - "afhds3": ("AFHDS3", "YES", "NO") } options_jumper_t12 = { @@ -232,7 +244,6 @@ options_jumper_t16 = { "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), "internalmulti": ("INTERNAL_MODULE_MULTI", "YES", "NO"), "bluetooth": ("BLUETOOTH", "YES", "NO"), - "afhds3": ("AFHDS3", "YES", "NO") } options_jumper_t18 = { @@ -245,7 +256,6 @@ options_jumper_t18 = { "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), "bluetooth": ("BLUETOOTH", "YES", "NO"), - "afhds3": ("AFHDS3", "YES", "NO") } options_radiomaster_tx16s = { @@ -259,5 +269,4 @@ options_radiomaster_tx16s = { "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), "bluetooth": ("BLUETOOTH", "YES", "NO"), "internalgps": ("INTERNAL_GPS", "YES", "NO"), - "afhds3": ("AFHDS3", "YES", "NO") } \ No newline at end of file From e53e87a1edbfd94c102711f3951f328d0749172b Mon Sep 17 00:00:00 2001 From: Kilrah Date: Fri, 26 Jun 2020 10:27:06 +0200 Subject: [PATCH 493/560] Cleanup internalppm remains --- companion/src/firmwares/opentx/opentxinterface.cpp | 2 -- radio/util/fwoptions.py | 4 ---- 2 files changed, 6 deletions(-) diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 4bbeb43b3..1570c59b2 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -734,8 +734,6 @@ bool OpenTxFirmware::isAvailable(PulsesProtocol proto, int port) return !IS_ACCESS_RADIO(board, id) && !IS_FAMILY_T16(board); case PULSES_PXX_XJT_D8: return !(IS_ACCESS_RADIO(board, id) || id.contains("eu")) && !IS_FAMILY_T16(board); - case PULSES_PPM: - return id.contains("internalppm"); case PULSES_ACCESS_ISRM: case PULSES_ACCST_ISRM_D16: return IS_ACCESS_RADIO(board, id); diff --git a/radio/util/fwoptions.py b/radio/util/fwoptions.py index fe5331cb0..3bcdd25e8 100755 --- a/radio/util/fwoptions.py +++ b/radio/util/fwoptions.py @@ -74,7 +74,6 @@ options_taranis_x9d = { "faimode": ("FAI", "YES", None), "faichoice": ("FAI", "CHOICE", None), "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), - "internalppm": ("INTERNAL_MODULE_PPM", "YES", "NO"), "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), "eu": ("MODULE_PROTOCOL_D8", "NO", "YES"), "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), @@ -91,7 +90,6 @@ options_taranis_x9dp = { "faimode": ("FAI", "YES", None), "faichoice": ("FAI", "CHOICE", None), "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), - "internalppm": ("INTERNAL_MODULE_PPM", "YES", "NO"), "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), "eu": ("MODULE_PROTOCOL_D8", "NO", "YES"), "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), @@ -107,7 +105,6 @@ options_taranis_x7 = { "faimode": ("FAI", "YES", None), "faichoice": ("FAI", "CHOICE", None), "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), - "internalppm": ("INTERNAL_MODULE_PPM", "YES", "NO"), "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), "eu": ("MODULE_PROTOCOL_D8", "NO", "YES"), "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), @@ -172,7 +169,6 @@ options_taranis_x9e = { "faimode": ("FAI", "YES", None), "faichoice": ("FAI", "CHOICE", None), "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), - "internalppm": ("INTERNAL_MODULE_PPM", "YES", "NO"), "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), "eu": ("MODULE_PROTOCOL_D8", "NO", "YES"), "horussticks": ("STICKS", "HORUS", "STANDARD"), From a57f794c5a0e6ad20a74c459a0556addc623ad2f Mon Sep 17 00:00:00 2001 From: Kilrah Date: Fri, 26 Jun 2020 10:32:51 +0200 Subject: [PATCH 494/560] Sync options with companion --- radio/util/fwoptions.py | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/radio/util/fwoptions.py b/radio/util/fwoptions.py index 3bcdd25e8..140cf4b47 100755 --- a/radio/util/fwoptions.py +++ b/radio/util/fwoptions.py @@ -71,10 +71,10 @@ options_taranis_x9d = { "haptic": ("HAPTIC", "YES", "NO"), "nogvars": ("GVARS", "NO", "YES"), "sqt5font": ("FONT", "SQT5", None), + "noras": ("RAS", "NO", "YES"), "faimode": ("FAI", "YES", None), "faichoice": ("FAI", "CHOICE", None), "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), - "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), "eu": ("MODULE_PROTOCOL_D8", "NO", "YES"), "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), "afhds3": ("AFHDS3", "YES", "NO") @@ -90,7 +90,6 @@ options_taranis_x9dp = { "faimode": ("FAI", "YES", None), "faichoice": ("FAI", "CHOICE", None), "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), - "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), "eu": ("MODULE_PROTOCOL_D8", "NO", "YES"), "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), "afhds3": ("AFHDS3", "YES", "NO") @@ -101,11 +100,9 @@ options_taranis_x7 = { "lua": ("LUA", "YES", "NO_MODEL_SCRIPTS"), "nogvars": ("GVARS", "NO", "YES"), "sqt5font": ("FONT", "SQT5", None), - "noras": ("RAS", "NO", "YES"), "faimode": ("FAI", "YES", None), "faichoice": ("FAI", "CHOICE", None), "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), - "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), "eu": ("MODULE_PROTOCOL_D8", "NO", "YES"), "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), } @@ -115,15 +112,11 @@ options_taranis_x9lite = { "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"), "lua": ("LUA", "YES", "NO_MODEL_SCRIPTS"), "nogvars": ("GVARS", "NO", "YES"), - "autoupdate": ("AUTOUPDATE", "YES", None), "sqt5font": ("FONT", "SQT5", None), - "noras": ("RAS", "NO", "YES"), "faimode": ("FAI", "YES", None), "faichoice": ("FAI", "CHOICE", None), "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), - "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), "eu": ("MODULE_PROTOCOL_D8", "NO", "YES"), - "internalpxx1": ("INTERNAL_MODULE_PXX1", "YES", "NO"), "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), "afhds3": ("AFHDS3", "YES", "NO") } @@ -137,7 +130,6 @@ options_taranis_xlite = { "faimode": ("FAI", "YES", None), "faichoice": ("FAI", "CHOICE", None), "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), - "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), "eu": ("MODULE_PROTOCOL_D8", "NO", "YES"), "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), "afhds3": ("AFHDS3", "YES", "NO") @@ -148,14 +140,11 @@ options_taranis_xlites = { "ppmus": ("PPM_UNIT", "US", "PERCENT_PREC1"), "lua": ("LUA", "YES", "NO_MODEL_SCRIPTS"), "nogvars": ("GVARS", "NO", "YES"), - "autoupdate": ("AUTOUPDATE", "YES", None), "sqt5font": ("FONT", "SQT5", None), "faimode": ("FAI", "YES", None), "faichoice": ("FAI", "CHOICE", None), "nooverridech": ("OVERRIDE_CHANNEL_FUNCTION", "NO", "YES"), - "shutdownconfirm": ("SHUTDOWN_CONFIRMATION", "YES", "NO"), "eu": ("MODULE_PROTOCOL_D8", "NO", "YES"), - "internalpxx1": ("INTERNAL_MODULE_PXX1", "YES", "NO"), "flexr9m": ("MODULE_PROTOCOL_FLEX", "YES", None), "afhds3": ("AFHDS3", "YES", "NO") } From 112f507f4740c9a377f9390a03e83857f8bb9957 Mon Sep 17 00:00:00 2001 From: Kilrah Date: Fri, 26 Jun 2020 10:34:51 +0200 Subject: [PATCH 495/560] Revert "Offer AFHDS3 on T18" This reverts commit 331ae68d293c788ac8edf4c834043fa42cfbfb55. --- companion/src/firmwares/opentx/opentxinterface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 1570c59b2..72734a4d5 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -1281,7 +1281,7 @@ void registerOpenTxFirmwares() addOpenTxFrskyOptions(firmware); firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module")); registerOpenTxFirmware(firmware); - addOpenTxRfOptions(firmware, FLEX + AFHDS3); + addOpenTxRfOptions(firmware, FLEX); /* 9XR-Pro */ firmware = new OpenTxFirmware("opentx-9xrpro", Firmware::tr("Turnigy 9XR-PRO"), BOARD_9XRPRO); From 971156b6efb3879e985e0595365c4424331f347f Mon Sep 17 00:00:00 2001 From: Marco Robustini Date: Sat, 27 Jun 2020 09:40:52 +0200 Subject: [PATCH 496/560] Update it.h.txt (#7774) --- radio/src/translations/it.h.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 126955a6d..74acd82c9 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -958,12 +958,12 @@ #define TR_UNIT "Unita" #define TR_TELEMETRY_NEWSENSOR INDENT "Aggiungi nuovo sensore" #define TR_CHANNELRANGE INDENT "Numero Canali" -#define TR_AFHDS3_RX_FREQ TR("RX freq.", "RX frequency") -#define TR_AFHDS3_ONE_TO_ONE_TELEMETRY TR("Unicast/Tel.", "Unicast/Telemetry") +#define TR_AFHDS3_RX_FREQ TR("Freq. RX", "Frequenza RX") +#define TR_AFHDS3_ONE_TO_ONE_TELEMETRY TR("Unicast/Tel.", "Unicast/Telemetria") #define TR_AFHDS3_ONE_TO_MANY "Multicast" -#define TR_AFHDS3_ACTUAL_POWER TR("Act. pow", "Actual power") -#define TR_AFHDS3_POWER_SOURCE TR("Power src.", "Power source") -#define TR_RXFREQUENCY TR(INDENT "RX Freq.", INDENT "RX Frequency") +#define TR_AFHDS3_ACTUAL_POWER TR("Pot. att.", "Potenza attuale") +#define TR_AFHDS3_POWER_SOURCE TR("Sorg. al.", "Sorgente alimentazione") +#define TR_RXFREQUENCY TR(INDENT "Freq. RX", INDENT "Frequenza RX") #define TR_ANTENNACONFIRM1 "ANTENNA EST." #if defined(PCBX12S) #define LEN_ANTENNA_MODES "\023" From d019741625ebce33a47ea0273440097d2bbb6c89 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 27 Jun 2020 10:06:47 +0200 Subject: [PATCH 497/560] Remove unused string --- radio/src/translations.cpp | 1 - radio/src/translations.h | 1 - radio/src/translations/cz.h.txt | 1 - radio/src/translations/de.h.txt | 1 - radio/src/translations/en.h.txt | 1 - radio/src/translations/es.h.txt | 1 - radio/src/translations/fi.h.txt | 1 - radio/src/translations/fr.h.txt | 1 - radio/src/translations/it.h.txt | 3 ++- radio/src/translations/nl.h.txt | 1 - radio/src/translations/pl.h.txt | 1 - radio/src/translations/pt.h.txt | 1 - radio/src/translations/se.h.txt | 1 - 13 files changed, 2 insertions(+), 13 deletions(-) diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 43dccb554..3406a412c 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -471,7 +471,6 @@ const char STR_BINDING_1_8_TELEM_OFF[] = TR_BINDING_CH1_8_TELEM_OFF; const char STR_BINDING_9_16_TELEM_ON[] = TR_BINDING_CH9_16_TELEM_ON; const char STR_BINDING_9_16_TELEM_OFF[] = TR_BINDING_CH9_16_TELEM_OFF; const char STR_CHANNELRANGE[] = TR_CHANNELRANGE; -const char STR_RXFREQUENCY[] = TR_RXFREQUENCY; const char STR_ANTENNACONFIRM1[] = TR_ANTENNACONFIRM1; const char STR_ANTENNACONFIRM2[] = TR_ANTENNACONFIRM2; const char STR_USE_INTERNAL_ANTENNA[] = TR_USE_INTERNAL_ANTENNA; diff --git a/radio/src/translations.h b/radio/src/translations.h index f428b3057..0eceb54bb 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -774,7 +774,6 @@ extern const char STR_BINDING_1_8_TELEM_OFF[]; extern const char STR_BINDING_9_16_TELEM_ON[]; extern const char STR_BINDING_9_16_TELEM_OFF[]; extern const char STR_CHANNELRANGE[]; -extern const char STR_RXFREQUENCY[]; extern const char STR_ANTENNASELECTION[]; extern const char STR_ANTENNACONFIRM1[]; extern const char STR_ANTENNACONFIRM2[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index d6563c16c..fa59c7dfa 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -942,7 +942,6 @@ #define TR_AFHDS3_ONE_TO_MANY "Multicast" #define TR_AFHDS3_ACTUAL_POWER TR("Act. pow", "Actual power") #define TR_AFHDS3_POWER_SOURCE TR("Power src.", TR("Power src.", "Power source")) -#define TR_RXFREQUENCY TR(INDENT "RX Freq.", INDENT "RX Frequency") #define TR_ANTENNACONFIRM1 "Opravdu přepnout?" #if defined(PCBX12S) #define LEN_ANTENNA_MODES "\023" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index f816a7269..3489f1d68 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -948,7 +948,6 @@ #define TR_AFHDS3_ONE_TO_MANY "Multicast" #define TR_AFHDS3_ACTUAL_POWER TR("Act. pow", "Actual power") #define TR_AFHDS3_POWER_SOURCE TR("Power src.", "Power source") -#define TR_RXFREQUENCY TR(INDENT "RX Freq.", INDENT "RX Frequency") #define TR_ANTENNACONFIRM1 "Ant. umschalten" #if defined(PCBX12S) #define LEN_ANTENNA_MODES "\023" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index f902dfa60..d5a335f4d 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -947,7 +947,6 @@ #define TR_UNIT "Unit" #define TR_TELEMETRY_NEWSENSOR INDENT "Add a new sensor..." #define TR_CHANNELRANGE TR(INDENT "Ch. Range", INDENT "Channel Range") -#define TR_RXFREQUENCY TR(INDENT "RX Freq.", INDENT "RX Frequency") #define TR_ANTENNACONFIRM1 "EXT. ANTENNA" #if defined(PCBX12S) #define LEN_ANTENNA_MODES "\023" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index d7dbd2b15..26c7e0612 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -945,7 +945,6 @@ #define TR_AFHDS3_ONE_TO_MANY "Multicast" #define TR_AFHDS3_ACTUAL_POWER TR("Act. pow", "Actual power") #define TR_AFHDS3_POWER_SOURCE TR("Power src.", "Power source") -#define TR_RXFREQUENCY TR(INDENT "RX Freq.", INDENT "RX Frequency") #define TR_ANTENNACONFIRM1 "ANTENA EXT." #if defined(PCBX12S) #define LEN_ANTENNA_MODES "\020" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 579eb25bf..9087fe150 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -961,7 +961,6 @@ #define TR_AFHDS3_ONE_TO_MANY "Multicast" #define TR_AFHDS3_ACTUAL_POWER TR("Act. pow", "Actual power") #define TR_AFHDS3_POWER_SOURCE TR("Power src.", "Power source") -#define TR_RXFREQUENCY TR(INDENT "RX Freq.", INDENT "RX Frequency") #define TR_ANTENNACONFIRM1 "EXT. ANTENNA" #if defined(PCBX12S) #define LEN_ANTENNA_MODES "\023" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index a914772d5..a8a22127c 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -963,7 +963,6 @@ #define TR_AFHDS3_ONE_TO_MANY "Multicast" #define TR_AFHDS3_ACTUAL_POWER TR("Act. pow", "Actual power") #define TR_AFHDS3_POWER_SOURCE TR("Power src.", "Power source") -#define TR_RXFREQUENCY TR(INDENT "RX Freq.", INDENT "RX Frequency") #define TR_ANTENNACONFIRM1 "Vraiment changer?" #if defined(PCBX12S) #define LEN_ANTENNA_MODES "\021" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 74acd82c9..c0d7032e8 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -961,9 +961,10 @@ #define TR_AFHDS3_RX_FREQ TR("Freq. RX", "Frequenza RX") #define TR_AFHDS3_ONE_TO_ONE_TELEMETRY TR("Unicast/Tel.", "Unicast/Telemetria") #define TR_AFHDS3_ONE_TO_MANY "Multicast" +#define TR_AFHDS3_ACTUAL_POWER TR("Act. pow", "Actual power") +#define TR_AFHDS3_POWER_SOURCE TR("Power src.", "Power source") #define TR_AFHDS3_ACTUAL_POWER TR("Pot. att.", "Potenza attuale") #define TR_AFHDS3_POWER_SOURCE TR("Sorg. al.", "Sorgente alimentazione") -#define TR_RXFREQUENCY TR(INDENT "Freq. RX", INDENT "Frequenza RX") #define TR_ANTENNACONFIRM1 "ANTENNA EST." #if defined(PCBX12S) #define LEN_ANTENNA_MODES "\023" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 6c1138094..3c79e2d69 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -949,7 +949,6 @@ #define TR_AFHDS3_ONE_TO_MANY "Multicast" #define TR_AFHDS3_ACTUAL_POWER TR("Act. pow", "Actual power") #define TR_AFHDS3_POWER_SOURCE TR("Power src.", "Power source") -#define TR_RXFREQUENCY TR(INDENT "RX Freq.", INDENT "RX Frequency") #define TR_ANTENNACONFIRM1 "Antennes wisselen?" #if defined(PCBX12S) #define LEN_ANTENNA_MODES "\023" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 38b03063a..a7f7734d9 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -962,7 +962,6 @@ #define TR_AFHDS3_ONE_TO_MANY "Multicast" #define TR_AFHDS3_ACTUAL_POWER TR("Act. pow", "Actual power") #define TR_AFHDS3_POWER_SOURCE TR("Power src.", "Power source") -#define TR_RXFREQUENCY TR(INDENT "RX Freq.", INDENT "RX Frequency") #define TR_ANTENNACONFIRM1 "EXT. ANTENNA" #if defined(PCBX12S) #define LEN_ANTENNA_MODES "\023" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index e6a3ecfb1..72e7dd3ad 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -952,7 +952,6 @@ #define TR_AFHDS3_ONE_TO_MANY "Multicast" #define TR_AFHDS3_ACTUAL_POWER TR("Act. pow", "Actual power") #define TR_AFHDS3_POWER_SOURCE TR("Power src.", "Power source") -#define TR_RXFREQUENCY TR(INDENT "RX Freq.", INDENT "RX Frequency") #define TR_ANTENNACONFIRM1 "EXT. ANTENNA" #if defined(PCBX12S) #define LEN_ANTENNA_MODES "\023" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 079127692..be03b5f94 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -962,7 +962,6 @@ #define TR_AFHDS3_ONE_TO_MANY "Multicast" #define TR_AFHDS3_ACTUAL_POWER TR("Act. pow", "Actual power") #define TR_AFHDS3_POWER_SOURCE TR("Power src.", "Power source") -#define TR_RXFREQUENCY TR(INDENT "RX Freq.", INDENT "RX Frequency") #define TR_ANTENNACONFIRM1 "EXT. ANTENNA" #if defined(PCBX12S) #define LEN_ANTENNA_MODES "\023" From ab2ec8828393afd82183580aa24e3bcfbd6bca6d Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 27 Jun 2020 10:07:59 +0200 Subject: [PATCH 498/560] Fix IT --- radio/src/translations/it.h.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index c0d7032e8..e67a7c354 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -961,8 +961,6 @@ #define TR_AFHDS3_RX_FREQ TR("Freq. RX", "Frequenza RX") #define TR_AFHDS3_ONE_TO_ONE_TELEMETRY TR("Unicast/Tel.", "Unicast/Telemetria") #define TR_AFHDS3_ONE_TO_MANY "Multicast" -#define TR_AFHDS3_ACTUAL_POWER TR("Act. pow", "Actual power") -#define TR_AFHDS3_POWER_SOURCE TR("Power src.", "Power source") #define TR_AFHDS3_ACTUAL_POWER TR("Pot. att.", "Potenza attuale") #define TR_AFHDS3_POWER_SOURCE TR("Sorg. al.", "Sorgente alimentazione") #define TR_ANTENNACONFIRM1 "ANTENNA EST." From d903036dd882910ab8d2b0c2dcf81736f79f1463 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 27 Jun 2020 13:10:08 +0200 Subject: [PATCH 499/560] Update CREDITS.txt --- CREDITS.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index b11780727..727bbe185 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1778,3 +1778,6 @@ Fred Ceratt Stefan Grunenberg Aram Parsamyan Wolfgang Rauser +John Wall +Martin Haggas +Denis Kelly From adbfd63f2be4b75e988d6ec3cd2fba2c9f25ab03 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 27 Jun 2020 15:42:56 +0200 Subject: [PATCH 500/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 727bbe185..dfbcaf170 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1781,3 +1781,4 @@ Wolfgang Rauser John Wall Martin Haggas Denis Kelly +James Houck From 45f46d0b42beeda9d002babbaa74e8d651fb9b15 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 28 Jun 2020 00:33:17 +0200 Subject: [PATCH 501/560] Update CREDITS.txt --- CREDITS.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index dfbcaf170..9c0df159e 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1782,3 +1782,5 @@ John Wall Martin Haggas Denis Kelly James Houck +Brian Stephanik +William McNeice From 090a266463060d4ee401aa7e81bc936406acffe8 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 28 Jun 2020 10:04:20 +0200 Subject: [PATCH 502/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 9c0df159e..ffc211bae 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1784,3 +1784,4 @@ Denis Kelly James Houck Brian Stephanik William McNeice +Sven De Boeck From 7b01eb0722962e2fed0e3c5d5580fcd6e7acd38c Mon Sep 17 00:00:00 2001 From: MRC3742 Date: Mon, 29 Jun 2020 01:05:29 -0400 Subject: [PATCH 503/560] Updates for MPM version 1.3.1.24 (#7779) --- companion/src/firmwares/multiprotocols.cpp | 10 ++++++---- radio/src/gui/gui_common.cpp | 10 ++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/companion/src/firmwares/multiprotocols.cpp b/companion/src/firmwares/multiprotocols.cpp index f6ab2ac12..f370caeaf 100644 --- a/companion/src/firmwares/multiprotocols.cpp +++ b/companion/src/firmwares/multiprotocols.cpp @@ -41,7 +41,7 @@ static const QStringList STR_SUBTYPE_FLYSKY {"Standard", "V9x9", "V6x6", "V91 static const QStringList STR_SUBTYPE_HUBSAN {"H107", "H301", "H501"}; static const QStringList STR_SUBTYPE_FRSKY {"D16", "D8", "D16 8ch", "V8", "D16 EU-LBT", "D16 EU-LBT 8ch", "D8 Cloned", "D16 Cloned"}; static const QStringList STR_SUBTYPE_HISKY {"Standard", "HK310"}; -static const QStringList STR_SUBTYPE_V2X2 {"Standard", "JXD506"}; +static const QStringList STR_SUBTYPE_V2X2 {"Standard", "JXD506", "MR101"}; static const QStringList STR_SUBTYPE_DSM {"DSM2 22ms", "DSM2 11ms", "DSMX 22ms", "DSMX 11ms"}; static const QStringList STR_SUBTYPE_DEVO {"8 Channel", "10 Channel", "12 Channel", "6 Channel", "7 Channel"}; static const QStringList STR_SUBTYPE_YD717 {"Standard", "Skywalker", "Syma X4", "XINXUN", "NIHUI"}; @@ -71,6 +71,7 @@ static const QStringList STR_SUBTYPE_TRAXXAS {"6519 RX"}; static const QStringList STR_SUBTYPE_E01X {"E012", "E015", "E016H"}; static const QStringList STR_SUBTYPE_V911S {"Standard", "E119"}; static const QStringList STR_SUBTYPE_GD00X {"GD V1", "GD V2"}; +static const QStringList STR_SUBTYPE_V761 {"3 Channel", "4 Channel"}; static const QStringList STR_SUBTYPE_REDPINE {"Fast", "Slow"}; static const QStringList STR_SUBTYPE_POTENSIC {"A20 Firefly"}; static const QStringList STR_SUBTYPE_ZSX {"JJRC ZSX-280"}; @@ -80,7 +81,7 @@ static const QStringList STR_SUBTYPE_HOTT {"Sync", "No_Sync"}; static const QStringList STR_SUBTYPE_FX816 {"P38"}; static const QStringList STR_SUBTYPE_PELIKAN {"Pro", "Lite"}; static const QStringList STR_SUBTYPE_XK {"X450", "X420"}; -static const QStringList STR_SUBTYPE_XN297DUMP {"250K", "1M", "2M", "AUTO"}; +static const QStringList STR_SUBTYPE_XN297DUMP {"250K", "1M", "2M", "AUTO", "NRF"}; static const QStringList STR_SUBTYPE_FRSKYX2 {"D16", "D16 8ch", "D16 EU-LBT", "D16 EU-LBT 8ch", "D16 Cloned"}; static const QStringList STR_SUBTYPE_FRSKYR9 {"915 MHz", "868 MHz", "915 MHz 8-Channel", "868 MHz 8-Channel"}; static const QStringList STR_SUBTYPE_PROPEL {"74-Z"}; @@ -97,7 +98,7 @@ const Multiprotocols multiProtocols { {MODULE_SUBTYPE_MULTI_HUBSAN, 2, false, STR_SUBTYPE_HUBSAN, STR_MULTI_VIDFREQ}, {MODULE_SUBTYPE_MULTI_FRSKY, 7, false, STR_SUBTYPE_FRSKY, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_HISKY, 1, false, STR_SUBTYPE_HISKY, nullptr}, - {MODULE_SUBTYPE_MULTI_V2X2, 1, false, STR_SUBTYPE_V2X2, nullptr}, + {MODULE_SUBTYPE_MULTI_V2X2, 2, false, STR_SUBTYPE_V2X2, nullptr}, {MODULE_SUBTYPE_MULTI_DSM2, 3, false, STR_SUBTYPE_DSM, nullptr}, {MODULE_SUBTYPE_MULTI_DEVO, 4, false, STR_SUBTYPE_DEVO, STR_MULTI_FIXEDID}, {MODULE_SUBTYPE_MULTI_YD717, 4, false, STR_SUBTYPE_YD717, nullptr}, @@ -130,6 +131,7 @@ const Multiprotocols multiProtocols { {MODULE_SUBTYPE_MULTI_E01X, 2, false, STR_SUBTYPE_E01X, STR_MULTI_OPTION}, {MODULE_SUBTYPE_MULTI_V911S, 1, false, STR_SUBTYPE_V911S, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_GD00X, 1, false, STR_SUBTYPE_GD00X, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_V761, 1, false, STR_SUBTYPE_V761, nullptr}, {MODULE_SUBTYPE_MULTI_KF606, 0, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_REDPINE, 1, false, STR_SUBTYPE_REDPINE, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_POTENSIC, 0, false, STR_SUBTYPE_POTENSIC, nullptr}, @@ -140,7 +142,7 @@ const Multiprotocols multiProtocols { {MODULE_SUBTYPE_MULTI_FX816, 0, false, STR_SUBTYPE_FX816, nullptr}, {MODULE_SUBTYPE_MULTI_PELIKAN, 1, false, STR_SUBTYPE_PELIKAN, nullptr}, {MODULE_SUBTYPE_MULTI_XK, 1, false, STR_SUBTYPE_XK, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_XN297DUMP, 3, false, STR_SUBTYPE_XN297DUMP, nullptr}, + {MODULE_SUBTYPE_MULTI_XN297DUMP, 4, false, STR_SUBTYPE_XN297DUMP, nullptr}, {MODULE_SUBTYPE_MULTI_FRSKYX2, 4, true, STR_SUBTYPE_FRSKYX2, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_FRSKY_R9, 3, true, STR_SUBTYPE_FRSKYR9, nullptr}, {MODULE_SUBTYPE_MULTI_PROPEL, 0, false, STR_SUBTYPE_PROPEL, nullptr}, diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index 59153faa7..19b591f66 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -866,7 +866,7 @@ const char STR_SUBTYPE_FLYSKY[] = "\004""Std\0""V9x9""V6x6""V912""CX20"; const char STR_SUBTYPE_HUBSAN[] = "\004""H107""H301""H501"; const char STR_SUBTYPE_FRSKY[] = "\011""D16\0 ""D8\0 ""D16 8ch\0 ""V8\0 ""LBT(EU)\0 ""LBT 8ch\0 ""D8Cloned\0""D16Cloned"; const char STR_SUBTYPE_HISKY[] = "\005""Std\0 ""HK310"; -const char STR_SUBTYPE_V2X2[] = "\006""Std\0 ""JXD506"; +const char STR_SUBTYPE_V2X2[] = "\006""Std\0 ""JXD506""MR101\0"; const char STR_SUBTYPE_DSM[] = "\006""2 22ms""2 11ms""X 22ms""X 11ms"; const char STR_SUBTYPE_DEVO[] = "\004""8ch\0""10ch""12ch""6ch\0""7ch\0"; const char STR_SUBTYPE_YD717[] = "\007""Std\0 ""SkyWlkr""Syma X4""XINXUN\0""NIHUI\0 "; @@ -896,6 +896,7 @@ const char STR_SUBTYPE_TRAXXAS[] = "\004""6519"; const char STR_SUBTYPE_E01X[] = "\005""E012\0""E015\0""E016H"; const char STR_SUBTYPE_V911S[] = "\004""Std\0""E119"; const char STR_SUBTYPE_GD00X[] = "\005""GD_V1""GD_V2"; +const char STR_SUBTYPE_V761[] = "\003""3ch""4ch"; const char STR_SUBTYPE_REDPINE[] = "\004""Fast""Slow"; const char STR_SUBTYPE_POTENSIC[] = "\003""A20"; const char STR_SUBTYPE_ZSX[] = "\007""280JJRC"; @@ -905,7 +906,7 @@ const char STR_SUBTYPE_HOTT[] = "\007""Sync\0 ""No_Sync"; const char STR_SUBTYPE_FX816[] = "\003""P38"; const char STR_SUBTYPE_PELIKAN[] = "\004""Pro\0""Lite"; const char STR_SUBTYPE_XK[] = "\004""X450""X420"; -const char STR_SUBTYPE_XN297DUMP[] = "\004""250K""1M\0 ""2M\0 ""AUTO"; +const char STR_SUBTYPE_XN297DUMP[] = "\004""250K""1M\0 ""2M\0 ""AUTO""NRF\0"; const char STR_SUBTYPE_FRSKYX2[] = "\011""D16\0 ""D16 8ch\0 ""LBT(EU)\0 ""LBT 8ch\0 ""D16Cloned"; const char STR_SUBTYPE_FRSKYR9[] = "\007""915MHz\0""868MHz\0""915 8ch""868 8ch"; const char STR_SUBTYPE_PROPEL[] = "\004""74-Z"; @@ -931,7 +932,7 @@ const mm_protocol_definition multi_protocols[] = { {MODULE_SUBTYPE_MULTI_HUBSAN, 2, false, false, STR_SUBTYPE_HUBSAN, STR_MULTI_VIDFREQ}, {MODULE_SUBTYPE_MULTI_FRSKY, 7, false, false, STR_SUBTYPE_FRSKY, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_HISKY, 1, false, true, STR_SUBTYPE_HISKY, nullptr}, - {MODULE_SUBTYPE_MULTI_V2X2, 1, false, false, STR_SUBTYPE_V2X2, nullptr}, + {MODULE_SUBTYPE_MULTI_V2X2, 2, false, false, STR_SUBTYPE_V2X2, nullptr}, {MODULE_SUBTYPE_MULTI_DSM2, 3, false, true, STR_SUBTYPE_DSM, STR_MULTI_MAX_THROW}, {MODULE_SUBTYPE_MULTI_DEVO, 4, false, true, STR_SUBTYPE_DEVO, STR_MULTI_FIXEDID}, {MODULE_SUBTYPE_MULTI_YD717, 4, false, false, STR_SUBTYPE_YD717, nullptr}, @@ -964,6 +965,7 @@ const mm_protocol_definition multi_protocols[] = { {MODULE_SUBTYPE_MULTI_E01X, 2, false, false, STR_SUBTYPE_E01X, STR_MULTI_OPTION}, {MODULE_SUBTYPE_MULTI_V911S, 1, false, false, STR_SUBTYPE_V911S, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_GD00X, 1, false, false, STR_SUBTYPE_GD00X, STR_MULTI_RFTUNE}, + {MODULE_SUBTYPE_MULTI_V761, 1, false, false, STR_SUBTYPE_V761, nullptr}, {MODULE_SUBTYPE_MULTI_KF606, 0, false, false, NO_SUBTYPE, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_REDPINE, 1, false, false, STR_SUBTYPE_REDPINE, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_POTENSIC, 0, false, false, STR_SUBTYPE_POTENSIC, nullptr}, @@ -974,7 +976,7 @@ const mm_protocol_definition multi_protocols[] = { {MODULE_SUBTYPE_MULTI_FX816, 0, false, false, STR_SUBTYPE_FX816, nullptr}, {MODULE_SUBTYPE_MULTI_PELIKAN, 1, false, false, STR_SUBTYPE_PELIKAN, nullptr}, {MODULE_SUBTYPE_MULTI_XK, 1, false, false, STR_SUBTYPE_XK, STR_MULTI_RFTUNE}, - {MODULE_SUBTYPE_MULTI_XN297DUMP, 3, false, false, STR_SUBTYPE_XN297DUMP, STR_MULTI_RFCHAN}, + {MODULE_SUBTYPE_MULTI_XN297DUMP, 4, false, false, STR_SUBTYPE_XN297DUMP, STR_MULTI_RFCHAN}, {MODULE_SUBTYPE_MULTI_FRSKYX2, 4, true, false, STR_SUBTYPE_FRSKYX2, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_FRSKY_R9, 3, true, false, STR_SUBTYPE_FRSKYR9, nullptr}, {MODULE_SUBTYPE_MULTI_PROPEL, 0, false, false, STR_SUBTYPE_PROPEL, nullptr}, From 1b462058ad53776374e17c456a65816a81967d3f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 29 Jun 2020 13:08:22 +0200 Subject: [PATCH 504/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index ffc211bae..b6c560345 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1785,3 +1785,4 @@ James Houck Brian Stephanik William McNeice Sven De Boeck +SB Europe Ltd From e8fc959f188644d3b798bd67d3f0b292a5c4fc5b Mon Sep 17 00:00:00 2001 From: 3djc Date: Mon, 29 Jun 2020 13:39:00 +0200 Subject: [PATCH 505/560] Change SBUS voltage warning for TX16S --- radio/src/gui/480x272/model_setup.cpp | 4 ++++ radio/src/translations.cpp | 1 + radio/src/translations.h | 1 + radio/src/translations/cz.h.txt | 1 + radio/src/translations/de.h.txt | 1 + radio/src/translations/en.h.txt | 1 + radio/src/translations/es.h.txt | 1 + radio/src/translations/fi.h.txt | 1 + radio/src/translations/fr.h.txt | 1 + radio/src/translations/it.h.txt | 1 + radio/src/translations/nl.h.txt | 1 + radio/src/translations/pl.h.txt | 1 + radio/src/translations/pt.h.txt | 1 + radio/src/translations/se.h.txt | 1 + 14 files changed, 17 insertions(+) diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index 264685b2d..dee079d96 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -1705,8 +1705,12 @@ bool menuModelSetup(event_t event) lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_MODULE_TELEM_ON); } else if (isModuleSBUS(moduleIdx)) { +#if defined(RADIO_TX16S) // TX16S has 5v output on CPPM pin + lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_WARN_5VOLTS); +#else lcdDrawText(MENUS_MARGIN_LEFT, y, STR_WARN_BATTVOLTAGE); drawValueWithUnit(MODEL_SETUP_4TH_COLUMN, y, getBatteryVoltage(), UNIT_VOLTS, attr|PREC2|LEFT); +#endif } break; } diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 3406a412c..4d65e6840 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -357,6 +357,7 @@ const char STR_SPECTRUM_ANALYSER_EXT[] = TR_SPECTRUM_ANALYSER_EXT; const char STR_SPECTRUM_ANALYSER_INT[] = TR_SPECTRUM_ANALYSER_INT; const char STR_WAITING_FOR_RX[] = TR_WAITING_FOR_RX; const char STR_WAITING_FOR_TX[] = TR_WAITING_FOR_TX; +const char STR_WARN_5VOLTS[] = TR_WARN_5VOLTS; const char STR_CAT_NOT_EMPTY[] = TR_CAT_NOT_EMPTY; const char STR_WARNING[] = TR_WARNING; const char STR_THROTTLEWARN[] = TR_THROTTLEWARN; diff --git a/radio/src/translations.h b/radio/src/translations.h index 0eceb54bb..f99520cd7 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -541,6 +541,7 @@ extern const char STR_SPECTRUM_ANALYSER_EXT[]; extern const char STR_SPECTRUM_ANALYSER_INT[]; extern const char STR_WAITING_FOR_RX[]; extern const char STR_WAITING_FOR_TX[]; +extern const char STR_WARN_5VOLTS[]; #if defined(SDCARD) extern const char STR_BACKUP_MODEL[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index fa59c7dfa..adaa7d30e 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -441,6 +441,7 @@ #define TR_PPMFRAME INDENT "PPM modulace" #define TR_REFRESHRATE TR(INDENT "Obnovit", INDENT "Obn. frekv.") #define STR_WARN_BATTVOLTAGE TR(INDENT "Výstup VBAT: ", INDENT "Varování: výstupní hodnota VBAT: ") +#define TR_WARN_5VOLTS "Warning: output level is 5 volts" #define TR_MS "ms" #define TR_FREQUENCY INDENT "Frequence" #define TR_SWITCH "Spínač" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 3489f1d68..e6c6eb431 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -443,6 +443,7 @@ #define TR_PPMFRAME INDENT "PPM-Frame" #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") +#define TR_WARN_5VOLTS "Warning: output level is 5 volts" #define TR_MS "ms" #define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH TR("Schalt.", "Schalter") diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index d5a335f4d..706197f33 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -442,6 +442,7 @@ #define TR_PPMFRAME INDENT "PPM frame" #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") +#define TR_WARN_5VOLTS "Warning: output level is 5 volts" #define TR_MS "ms" #define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Switch" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 26c7e0612..714fcc217 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -441,6 +441,7 @@ #define TR_PPMFRAME "Trama PPM" #define TR_REFRESHRATE TR(INDENT "Refresco", INDENT "Velocidad refresco") #define STR_WARN_BATTVOLTAGE TR(INDENT "Salida es VBAT: ", INDENT "Aviso: señal salida es VBAT: ") +#define TR_WARN_5VOLTS "Warning: output level is 5 volts" #define TR_MS "ms" #define TR_FREQUENCY INDENT "Frequencia" #define TR_SWITCH TR("Interr.", "Interruptor") diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 9087fe150..90ce833cb 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -455,6 +455,7 @@ #define TR_PPMFRAME TR("PPM frame", INDENT "PPM frame") #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") +#define TR_WARN_5VOLTS "Warning: output level is 5 volts" #define TR_MS "ms" #define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Switch" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index a8a22127c..d4a1f5f29 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -461,6 +461,7 @@ #define TR_PPMFRAME INDENT "Trame PPM" #define TR_REFRESHRATE INDENT "Période" #define STR_WARN_BATTVOLTAGE TR(INDENT "Signal est VBAT: ", INDENT "ATTENTION: signal est à VBAT: ") +#define TR_WARN_5VOLTS "Warning: output level is 5 volts" #define TR_MS "ms" #define TR_FREQUENCY INDENT "Fréquence" #define TR_SWITCH TR("Inter", "Interrupteur") diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index e67a7c354..734789283 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -463,6 +463,7 @@ #define TR_PPMFRAME INDENT "Frame PPM" #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Uscita VBAT: ", INDENT "Att.: livel. uscita VBAT: ") +#define TR_WARN_5VOLTS "Warning: output level is 5 volts" #define TR_MS "ms" #define TR_FREQUENCY INDENT "Frequenza" #define TR_SWITCH "Inter." diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 3c79e2d69..64af03eea 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -442,6 +442,7 @@ #define TR_PPMFRAME INDENT "PPM frame" #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") +#define TR_WARN_5VOLTS "Warning: output level is 5 volts" #define TR_MS "ms" #define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH TR("Schak.", "Schakelaar") diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index a7f7734d9..5ba5bd258 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -462,6 +462,7 @@ #define TR_PPMFRAME INDENT "Ramka PPM" #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") +#define TR_WARN_5VOLTS "Warning: output level is 5 volts" #define TR_MS "ms" #define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Przełą" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 72e7dd3ad..e07e3ca78 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -448,6 +448,7 @@ #define TR_PPMFRAME "PPM frame" #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") +#define TR_WARN_5VOLTS "Warning: output level is 5 volts" #define TR_MS "ms" #define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Chave" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index be03b5f94..c55d64650 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -461,6 +461,7 @@ #define TR_PPMFRAME INDENT "PPM-paket" #define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") #define STR_WARN_BATTVOLTAGE TR(INDENT "Output is VBAT: ", INDENT "Warning: output level is VBAT: ") +#define TR_WARN_5VOLTS "Warning: output level is 5 volts" #define TR_MS "ms" #define TR_FREQUENCY INDENT "Frequency" #define TR_SWITCH "Brytare" From ee18c6bcc759d03dcd8df5bdcdfdd1a0c93982ff Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 29 Jun 2020 19:16:32 +0200 Subject: [PATCH 506/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index b6c560345..5e0e76735 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1786,3 +1786,4 @@ Brian Stephanik William McNeice Sven De Boeck SB Europe Ltd +Evening Shade Pottery From a325b2b612069f3985fb371c14ad4fd9491c018a Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 29 Jun 2020 19:17:04 +0200 Subject: [PATCH 507/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 5e0e76735..f2c4aa017 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1787,3 +1787,4 @@ William McNeice Sven De Boeck SB Europe Ltd Evening Shade Pottery +D van Oostveen From c95d662266d2500c3e8def3e4a2b5e924f91df2d Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 30 Jun 2020 08:04:27 +0200 Subject: [PATCH 508/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index f2c4aa017..6d5552c25 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1788,3 +1788,4 @@ Sven De Boeck SB Europe Ltd Evening Shade Pottery D van Oostveen +Michael Grosso From 423aa47e31d42dcdf3c0a725bfc875b979cb9344 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 30 Jun 2020 09:06:35 +0200 Subject: [PATCH 509/560] IT translation --- radio/src/translations/it.h.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 734789283..034bcd7db 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -461,11 +461,11 @@ #endif #define TR_PROTO TR(INDENT "Protoc.", INDENT "Protocollo") #define TR_PPMFRAME INDENT "Frame PPM" -#define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") -#define STR_WARN_BATTVOLTAGE TR(INDENT "Uscita VBAT: ", INDENT "Att.: livel. uscita VBAT: ") -#define TR_WARN_5VOLTS "Warning: output level is 5 volts" +#define TR_REFRESHRATE TR(INDENT "Refresh", INDENT "Refresh rate") +#define STR_WARN_BATTVOLTAGE TR(INDENT "Uscita VBAT: ", INDENT "Att.: livel. uscita VBAT: ") +#define TR_WARN_5VOLTS "Attenzione: il livello d'uscita è 5 Volts" #define TR_MS "ms" -#define TR_FREQUENCY INDENT "Frequenza" +#define TR_FREQUENCY INDENT "Frequenza" #define TR_SWITCH "Inter." #define TR_TRIMS "Trims" #define TR_FADEIN "Diss.In" From 34ba94818a045301578b433f1d02814910828ec1 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 30 Jun 2020 20:42:30 +0200 Subject: [PATCH 510/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 6d5552c25..200c09ac5 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1789,3 +1789,4 @@ SB Europe Ltd Evening Shade Pottery D van Oostveen Michael Grosso +Carlos Marcal From e43d5641a25a4f1af7477c1aa0c91a3c45d5c1d2 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 30 Jun 2020 21:16:39 +0200 Subject: [PATCH 511/560] Update CREDITS.txt --- CREDITS.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index 200c09ac5..b0ddf486e 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1790,3 +1790,5 @@ Evening Shade Pottery D van Oostveen Michael Grosso Carlos Marcal +d@taweb + From 5624cac22260d0f64e8ae049c19ffee8dbe9b1f7 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 1 Jul 2020 08:07:02 +0200 Subject: [PATCH 512/560] Update CREDITS.txt --- CREDITS.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CREDITS.txt b/CREDITS.txt index b0ddf486e..d5683fc90 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1791,4 +1791,4 @@ D van Oostveen Michael Grosso Carlos Marcal d@taweb - +Justin Digby From 3f4a80dd92ed8560b00bc9240f448a40f5aee775 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 1 Jul 2020 08:25:09 +0200 Subject: [PATCH 513/560] Fix TX16S defaut pots This fixes #7783 --- radio/src/targets/horus/board.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 41a8f96ee..0364e938f 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -386,7 +386,11 @@ enum Analogs { #define SLIDER2 SLIDER_FRONT_RIGHT #define DEFAULT_SWITCH_CONFIG (SWITCH_TOGGLE << 14) + (SWITCH_3POS << 12) + (SWITCH_2POS << 10) + (SWITCH_3POS << 8) + (SWITCH_3POS << 6) + (SWITCH_3POS << 4) + (SWITCH_3POS << 2) + (SWITCH_3POS << 0) -#define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 4) + (POT_MULTIPOS_SWITCH << 2) + (POT_WITHOUT_DETENT << 0) +#if defined(RADIO_FAMILY_T16) + #define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 4) + (POT_MULTIPOS_SWITCH << 2) + (POT_WITH_DETENT << 0) +#else + #define DEFAULT_POTS_CONFIG (POT_WITH_DETENT << 4) + (POT_MULTIPOS_SWITCH << 2) + (POT_WITHOUT_DETENT << 0) +#endif #if defined(PCBX12S) #define DEFAULT_SLIDERS_CONFIG (SLIDER_WITH_DETENT << 3) + (SLIDER_WITH_DETENT << 2) + (SLIDER_WITH_DETENT << 1) + (SLIDER_WITH_DETENT << 0) From b1382a992599e96e1610ddaa0d0796e0d4d08c8e Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 1 Jul 2020 14:58:53 +0200 Subject: [PATCH 514/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index d5683fc90..d8f4c408d 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1792,3 +1792,4 @@ Michael Grosso Carlos Marcal d@taweb Justin Digby +Hermann Vocat From 96892db80bbcaa801f70a84844d3fc403274c78f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 2 Jul 2020 00:02:34 +0200 Subject: [PATCH 515/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index d8f4c408d..31fba06a8 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1793,3 +1793,4 @@ Carlos Marcal d@taweb Justin Digby Hermann Vocat +Michael Francini From 2f1206f399ee7bd1714bddcf14b23f444d515cba Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 2 Jul 2020 08:08:48 +0200 Subject: [PATCH 516/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 31fba06a8..3908d8c2b 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1794,3 +1794,4 @@ d@taweb Justin Digby Hermann Vocat Michael Francini +Michael Chambers From 4e7f6e4f29754b1443dca351c8c5c79d098b15a7 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 2 Jul 2020 18:39:13 +0200 Subject: [PATCH 517/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 3908d8c2b..9a83e8102 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1795,3 +1795,4 @@ Justin Digby Hermann Vocat Michael Francini Michael Chambers +Harold H Youngren From ecee4638f67593445d077aba5e6c8f7c1863ed42 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 3 Jul 2020 08:06:43 +0200 Subject: [PATCH 518/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 9a83e8102..ba2751063 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1796,3 +1796,4 @@ Hermann Vocat Michael Francini Michael Chambers Harold H Youngren +Yann Orselli From 3ebf8096812652f04d6a5cc3360e7e933bd604ff Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 3 Jul 2020 19:07:39 +0200 Subject: [PATCH 519/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index ba2751063..957fd1916 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1797,3 +1797,4 @@ Michael Francini Michael Chambers Harold H Youngren Yann Orselli +Dieter Schaad From 0f13580f3d9cc8d017df5ccdc9ecef38eed6155c Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 3 Jul 2020 19:36:15 +0200 Subject: [PATCH 520/560] Add missing radios This fixes #7789 --- tools/build-companion-release.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tools/build-companion-release.sh b/tools/build-companion-release.sh index 34757a3e8..b73ce8ed2 100755 --- a/tools/build-companion-release.sh +++ b/tools/build-companion-release.sh @@ -62,6 +62,10 @@ cmake ${COMMON_OPTIONS} -DPCB=X7 ${SRCDIR} make -j${JOBS} libsimulator rm CMakeCache.txt +cmake ${COMMON_OPTIONS} -DPCB=X7 -DPCBREV=ACCESS ${SRCDIR} +make -j${JOBS} libsimulator +rm CMakeCache.txt + cmake ${COMMON_OPTIONS} -DPCB=X7 -DPCBREV=T12 ${SRCDIR} make -j${JOBS} libsimulator rm CMakeCache.txt @@ -102,6 +106,10 @@ cmake ${COMMON_OPTIONS} -DPCB=X10 -DPCBREV=TX16S ${SRCDIR} make -j${JOBS} libsimulator rm CMakeCache.txt +cmake ${COMMON_OPTIONS} -DPCB=X10 -DPCBREV=T18 ${SRCDIR} +make -j${JOBS} libsimulator +rm CMakeCache.txt + cmake ${COMMON_OPTIONS} -DPCB=X10 -DPCBREV=EXPRESS ${SRCDIR} make -j${JOBS} libsimulator rm CMakeCache.txt From 531784d43336dc2c92fadfeb9dd0c337dc63a720 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 3 Jul 2020 21:19:36 +0200 Subject: [PATCH 521/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 957fd1916..70c7667c0 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1798,3 +1798,4 @@ Michael Chambers Harold H Youngren Yann Orselli Dieter Schaad +Ernst Camenzind From b50ec5355adfa0f5913f6c067b20fb97329c3013 Mon Sep 17 00:00:00 2001 From: 3djc Date: Sat, 4 Jul 2020 10:41:16 +0200 Subject: [PATCH 522/560] Multi DSM string clarification --- companion/src/firmwares/multiprotocols.cpp | 2 +- radio/src/gui/gui_common.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/companion/src/firmwares/multiprotocols.cpp b/companion/src/firmwares/multiprotocols.cpp index f370caeaf..c8c18e6e5 100644 --- a/companion/src/firmwares/multiprotocols.cpp +++ b/companion/src/firmwares/multiprotocols.cpp @@ -42,7 +42,7 @@ static const QStringList STR_SUBTYPE_HUBSAN {"H107", "H301", "H501"}; static const QStringList STR_SUBTYPE_FRSKY {"D16", "D8", "D16 8ch", "V8", "D16 EU-LBT", "D16 EU-LBT 8ch", "D8 Cloned", "D16 Cloned"}; static const QStringList STR_SUBTYPE_HISKY {"Standard", "HK310"}; static const QStringList STR_SUBTYPE_V2X2 {"Standard", "JXD506", "MR101"}; -static const QStringList STR_SUBTYPE_DSM {"DSM2 22ms", "DSM2 11ms", "DSMX 22ms", "DSMX 11ms"}; +static const QStringList STR_SUBTYPE_DSM {"DSM2 1F", "DSM2 2F", "DSMX 1F", "DSMX 2F"}; static const QStringList STR_SUBTYPE_DEVO {"8 Channel", "10 Channel", "12 Channel", "6 Channel", "7 Channel"}; static const QStringList STR_SUBTYPE_YD717 {"Standard", "Skywalker", "Syma X4", "XINXUN", "NIHUI"}; static const QStringList STR_SUBTYPE_KN {"WLtoys", "FeiLun"}; diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index 19b591f66..6cbc287d2 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -867,7 +867,7 @@ const char STR_SUBTYPE_HUBSAN[] = "\004""H107""H301""H501"; const char STR_SUBTYPE_FRSKY[] = "\011""D16\0 ""D8\0 ""D16 8ch\0 ""V8\0 ""LBT(EU)\0 ""LBT 8ch\0 ""D8Cloned\0""D16Cloned"; const char STR_SUBTYPE_HISKY[] = "\005""Std\0 ""HK310"; const char STR_SUBTYPE_V2X2[] = "\006""Std\0 ""JXD506""MR101\0"; -const char STR_SUBTYPE_DSM[] = "\006""2 22ms""2 11ms""X 22ms""X 11ms"; +const char STR_SUBTYPE_DSM[] = "\004""2 1F""2 2F""X 1F""X 2F"; const char STR_SUBTYPE_DEVO[] = "\004""8ch\0""10ch""12ch""6ch\0""7ch\0"; const char STR_SUBTYPE_YD717[] = "\007""Std\0 ""SkyWlkr""Syma X4""XINXUN\0""NIHUI\0 "; const char STR_SUBTYPE_KN[] = "\006""WLtoys""FeiLun"; From 3da925602065f9731dea2f40ad6ca946fb6b0381 Mon Sep 17 00:00:00 2001 From: ignaciobfp Date: Sat, 4 Jul 2020 13:01:03 +0200 Subject: [PATCH 523/560] Add missing tts sounds in spanish, minor fixes (#7777) Add missing tts spanish sounds (fixes #7770), minor improvements to make some lines more accurate (most cases) or just more natural --- radio/util/tts_es.py | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/radio/util/tts_es.py b/radio/util/tts_es.py index 01d28d3dd..897b6b9e4 100755 --- a/radio/util/tts_es.py +++ b/radio/util/tts_es.py @@ -61,24 +61,27 @@ for s, f in [("me tienes abandonada", "inactiv"), ("trim centrado", "midtrim"), ("potenciómetro centrado", "midpot"), ("trim al máximo", "maxtrim"), - ("trim al mínima", "mintrim"), + ("trim al mínimo", "mintrim"), ("20 segundos", "timer20"), ("30 segundos", "timer30"), - ("assorbimiento elevado", "highmah"), - ("temperatura elevada", "hightemp"), + ("consumo alto", "highmah"), + ("temperatura alta", "hightemp"), ("Alarma A1", "a1_org"), ("A1 crítica", "a1_red"), ("Alarma A2", "a2_org"), ("A2 crítica", "a2_red"), ("Bienvenido a open t equis", "hello"), - ("recepcion de señal baja", "rssi_org"), - ("recepción de señal crítica", "rssi_red"), + ("señal baja", "rssi_org"), + ("señal crítica", "rssi_red"), ("Problemas con la antena del transmisor", "swr_red"), ("Sin telemetría", "telemko"), ("Telemetría disponible", "telemok"), - ("servo overload", "servoko"), - ("power overload", "rxko"), - ("El receptor esta conectado", "modelpwr"), + ("sobrecarga de servo", "servoko"), + ("sobrecarga de potencia", "rxko"), + ("El receptor aún está encendido", "modelpwr"), + ("cronómetro uno terminado", "timovr1"), + ("cronómetro dos terminado", "timovr2"), + ("cronómetro tres terminado", "timovr3"), ]: systemSounds.append((s, filename(f))) for i, s in enumerate(["cronómetro", "cronómetro", "transmisión", "recepción", "A1", "A2", "altitud", "motor", @@ -102,14 +105,14 @@ for i, (s, f) in enumerate([("tren arriba.", "gearup"), ("modo de velocidad", "spdmod"), ("modo de térmica", "thmmod"), ("modo de vuelo normal", "nrmmod"), - ("fase de vuelo 1", "fltmd1"), - ("fase de vuelo 2", "fltmd2"), - ("fase de vuelo 3", "fltmd3"), - ("fase de vuelo 4", "fltmd4"), - ("fase de vuelo 5", "fltmd5"), - ("fase de vuelo 6", "fltmd6"), - ("fase de vuelo 7", "fltmd7"), - ("fase de vuelo 8", "fltmd8"), - ("fase de vuelo 9", "fltmd9"), + ("modo de vuelo 1", "fltmd1"), + ("modo de vuelo 2", "fltmd2"), + ("modo de vuelo 3", "fltmd3"), + ("modo de vuelo 4", "fltmd4"), + ("modo de vuelo 5", "fltmd5"), + ("modo de vuelo 6", "fltmd6"), + ("modo de vuelo 7", "fltmd7"), + ("modo de vuelo 8", "fltmd8"), + ("modo de vuelo 9", "fltmd9"), ]): sounds.append((s, filename(f))) From 1f720c02e357acc367a59dc8199f2a9b13084a6f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 4 Jul 2020 15:15:03 +0200 Subject: [PATCH 524/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 70c7667c0..50fa70501 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1799,3 +1799,4 @@ Harold H Youngren Yann Orselli Dieter Schaad Ernst Camenzind +Ciobanu Rivelino Costel From fc8072812b968ffab97b55c46666f7333f84c6a4 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 5 Jul 2020 10:16:35 +0200 Subject: [PATCH 525/560] Update CREDITS.txt --- CREDITS.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index 50fa70501..9003f776a 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1800,3 +1800,5 @@ Yann Orselli Dieter Schaad Ernst Camenzind Ciobanu Rivelino Costel +David Jolly +Aram Parsamyan From 68a4e1a05c5a32bcd2ad4083d6cae39987ab8831 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sun, 5 Jul 2020 15:30:53 +0200 Subject: [PATCH 526/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 9003f776a..6f0583635 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1802,3 +1802,4 @@ Ernst Camenzind Ciobanu Rivelino Costel David Jolly Aram Parsamyan +Stewart Davies From 0f79f07187629ccf4eb8abd79cd993949084b55d Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 6 Jul 2020 08:48:36 +0200 Subject: [PATCH 527/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 6f0583635..60208a640 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1803,3 +1803,4 @@ Ciobanu Rivelino Costel David Jolly Aram Parsamyan Stewart Davies +Karsten Schwarz From 06a8e03eeba1abec4fa8a9ec7836613337f4f605 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 6 Jul 2020 14:11:23 +0200 Subject: [PATCH 528/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 60208a640..617db9b03 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1804,3 +1804,4 @@ David Jolly Aram Parsamyan Stewart Davies Karsten Schwarz +Robert Mckay From 6535b652bcad7a048b243a2bc14ce20a41f5db8b Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 6 Jul 2020 16:11:00 +0200 Subject: [PATCH 529/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 617db9b03..7a5dcbf9e 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1805,3 +1805,4 @@ Aram Parsamyan Stewart Davies Karsten Schwarz Robert Mckay +Michael Oeschger From 6d3996ab5442656eb991203672a942c71849b31f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Tue, 7 Jul 2020 08:59:12 +0200 Subject: [PATCH 530/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 7a5dcbf9e..1ae419b6b 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1806,3 +1806,4 @@ Stewart Davies Karsten Schwarz Robert Mckay Michael Oeschger +Randy Ling From 2af5881f3e19c81bc222448d57e3fa04f8fe8daf Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 7 Jul 2020 14:57:34 +0200 Subject: [PATCH 531/560] Improve checkbox visibility on darkblue theme --- radio/src/gui/480x272/themes/darkblue.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/gui/480x272/themes/darkblue.cpp b/radio/src/gui/480x272/themes/darkblue.cpp index ec4b51fb2..02fa5055b 100644 --- a/radio/src/gui/480x272/themes/darkblue.cpp +++ b/radio/src/gui/480x272/themes/darkblue.cpp @@ -35,7 +35,7 @@ class DarkblueTheme: public Theme lcdColorTable[TEXT_INVERTED_COLOR_INDEX] = WHITE; lcdColorTable[TEXT_INVERTED_BGCOLOR_INDEX] = RGB(32, 34, 42); lcdColorTable[TEXT_STATUSBAR_COLOR_INDEX] = WHITE; - lcdColorTable[LINE_COLOR_INDEX] = GREY; + lcdColorTable[LINE_COLOR_INDEX] = LIGHTGREY; lcdColorTable[SCROLLBOX_COLOR_INDEX] = WHITE; lcdColorTable[MENU_TITLE_BGCOLOR_INDEX] = DARKGREY; lcdColorTable[MENU_TITLE_COLOR_INDEX] = WHITE; From 94ba22a74d10d124e631837f49ff95e8240efc2e Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 7 Jul 2020 15:35:09 +0200 Subject: [PATCH 532/560] Improve FAI sensor handling (#7801) Display specific FAI message on forbiden sensors --- radio/src/gui/common/colorlcd/draw_functions.cpp | 5 +++++ radio/src/gui/common/stdlcd/draw_functions.cpp | 5 +++++ radio/src/options.h | 6 +++--- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/radio/src/gui/common/colorlcd/draw_functions.cpp b/radio/src/gui/common/colorlcd/draw_functions.cpp index c75ae824e..3fe07f0e6 100644 --- a/radio/src/gui/common/colorlcd/draw_functions.cpp +++ b/radio/src/gui/common/colorlcd/draw_functions.cpp @@ -202,6 +202,11 @@ void drawSensorCustomValue(coord_t x, coord_t y, uint8_t sensor, int32_t value, return; } + if (IS_FAI_FORBIDDEN(MIXSRC_FIRST_TELEM + 3 * sensor)) { + lcdDrawText(x, y, "FAI mode", flags); + return; + } + TelemetryItem & telemetryItem = telemetryItems[sensor]; TelemetrySensor & telemetrySensor = g_model.telemetrySensors[sensor]; diff --git a/radio/src/gui/common/stdlcd/draw_functions.cpp b/radio/src/gui/common/stdlcd/draw_functions.cpp index 1bcf7286c..524b06a7b 100644 --- a/radio/src/gui/common/stdlcd/draw_functions.cpp +++ b/radio/src/gui/common/stdlcd/draw_functions.cpp @@ -353,6 +353,11 @@ void drawSensorCustomValue(coord_t x, coord_t y, uint8_t sensor, int32_t value, return; } + if (IS_FAI_FORBIDDEN(MIXSRC_FIRST_TELEM + 3 * sensor)) { + lcdDrawText(x, y, "FAI mode", flags); + return; + } + TelemetryItem & telemetryItem = telemetryItems[sensor]; TelemetrySensor & telemetrySensor = g_model.telemetrySensors[sensor]; diff --git a/radio/src/options.h b/radio/src/options.h index e8bf634c1..b9d2a0075 100644 --- a/radio/src/options.h +++ b/radio/src/options.h @@ -22,7 +22,7 @@ #ifndef OPENTX_OPTIONS_H #define OPENTX_OPTIONS_H -static const char * options[] = { +static const char * const options[] = { #if defined(AUTOUPDATE) "autoupdate", #endif @@ -33,10 +33,10 @@ static const char * options[] = { "eu", #endif #if defined(FAI) - "faimode", + "FAImode", #endif #if defined(FAI_CHOICE) - "faichoice", + "FAIchoice", #endif #if defined(MODULE_PROTOCOL_FLEX) "flexr9m", From 0eb203e82774c965a2ebf6503eaedf09d726a220 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 7 Jul 2020 15:56:18 +0200 Subject: [PATCH 533/560] Tx16s sbus in (#7787) Enable SBUS trainer input --- radio/src/gui/480x272/radio_hardware.cpp | 4 +- radio/src/gui/gui_common.cpp | 18 +++++++ radio/src/gui/gui_common.h | 2 + .../common/arm/stm32/aux_serial_driver.cpp | 54 +++++++++++++------ radio/src/targets/horus/CMakeLists.txt | 9 ++++ radio/src/targets/horus/board.h | 3 ++ radio/src/targets/horus/trainer_driver.cpp | 16 ++++++ radio/src/tasks.cpp | 2 +- radio/src/trainer.cpp | 7 +++ 9 files changed, 96 insertions(+), 19 deletions(-) diff --git a/radio/src/gui/480x272/radio_hardware.cpp b/radio/src/gui/480x272/radio_hardware.cpp index 3ba908ad9..8020bf983 100644 --- a/radio/src/gui/480x272/radio_hardware.cpp +++ b/radio/src/gui/480x272/radio_hardware.cpp @@ -372,7 +372,7 @@ bool menuRadioHardware(event_t event) #if defined(RADIO_TX16S) lcdDrawText(lcdNextPos, y, " (TTL)"); #endif - g_eeGeneral.auxSerialMode = editChoice(HW_SETTINGS_COLUMN2, y, STR_AUX_SERIAL_MODES, g_eeGeneral.auxSerialMode, 0, UART_MODE_MAX, attr, event); + g_eeGeneral.auxSerialMode = editChoice(HW_SETTINGS_COLUMN2, y, STR_AUX_SERIAL_MODES, g_eeGeneral.auxSerialMode, 0, UART_MODE_MAX, attr, event, isAux1ModeAvailable); if (attr && checkIncDec_Ret) { auxSerialInit(g_eeGeneral.auxSerialMode, modelTelemetryProtocol()); } @@ -385,7 +385,7 @@ bool menuRadioHardware(event_t event) #if defined(RADIO_TX16S) lcdDrawText(lcdNextPos, y, " (TTL)"); #endif - g_eeGeneral.aux2SerialMode = editChoice(HW_SETTINGS_COLUMN2, y, STR_AUX_SERIAL_MODES, g_eeGeneral.aux2SerialMode, 0, UART_MODE_MAX, attr, event); + g_eeGeneral.aux2SerialMode = editChoice(HW_SETTINGS_COLUMN2, y, STR_AUX_SERIAL_MODES, g_eeGeneral.aux2SerialMode, 0, UART_MODE_MAX, attr, event, isAux2ModeAvailable); if (attr && checkIncDec_Ret) { aux2SerialInit(g_eeGeneral.aux2SerialMode, modelTelemetryProtocol()); } diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index 6cbc287d2..b491d84b4 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -385,6 +385,24 @@ bool isSwitchAvailable(int swtch, SwitchContext context) return true; } +bool isAux1ModeAvailable(int mode) +{ +#if defined(AUX2_SERIAL) + if (mode == UART_MODE_SBUS_TRAINER) + return g_eeGeneral.aux2SerialMode != UART_MODE_SBUS_TRAINER; +#endif + return true; +} + +bool isAux2ModeAvailable(int mode) +{ +#if defined(AUX_SERIAL) + if (mode == UART_MODE_SBUS_TRAINER) + return g_eeGeneral.auxSerialMode != UART_MODE_SBUS_TRAINER; +#endif + return true; +} + bool isSwitchAvailableInLogicalSwitches(int swtch) { return isSwitchAvailable(swtch, LogicalSwitchesContext); diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index c7229f5c7..d1fdb8fa1 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -70,6 +70,8 @@ bool isSourceAvailableInGlobalFunctions(int source); bool isSourceAvailableInCustomSwitches(int source); bool isSourceAvailableInResetSpecialFunction(int index); bool isSourceAvailableInGlobalResetSpecialFunction(int index); +bool isAux1ModeAvailable(int mode); +bool isAux2ModeAvailable(int mode); bool isSwitchAvailableInLogicalSwitches(int swtch); bool isSwitchAvailableInCustomFunctions(int swtch); bool isSwitchAvailableInMixes(int swtch); diff --git a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp index 88fc32cb8..e646c30d9 100644 --- a/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/aux_serial_driver.cpp @@ -21,12 +21,16 @@ #include "opentx.h" #include "targets/horus/board.h" +#if defined(SBUS) +extern Fifo trainerSbusFifo; +#endif + #if defined(AUX_SERIAL) uint8_t auxSerialMode = 0; Fifo auxSerialTxFifo; AuxSerialRxFifo auxSerialRxFifo __DMA (AUX_SERIAL_DMA_Stream_RX); -void auxSerialSetup(unsigned int baudrate, bool dma) +void auxSerialSetup(unsigned int baudrate, bool dma, uint16_t lenght = USART_WordLength_8b, uint16_t parity = USART_Parity_No, uint16_t stop = USART_StopBits_1) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; @@ -49,9 +53,9 @@ void auxSerialSetup(unsigned int baudrate, bool dma) #endif USART_InitStructure.USART_BaudRate = baudrate; - USART_InitStructure.USART_WordLength = USART_WordLength_8b; - USART_InitStructure.USART_StopBits = USART_StopBits_1; - USART_InitStructure.USART_Parity = USART_Parity_No; + USART_InitStructure.USART_WordLength = lenght; + USART_InitStructure.USART_StopBits = stop; + USART_InitStructure.USART_Parity = parity; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(AUX_SERIAL_USART, &USART_InitStructure); @@ -123,6 +127,11 @@ void auxSerialInit(unsigned int mode, unsigned int protocol) } break; + case UART_MODE_SBUS_TRAINER: + auxSerialSetup(SBUS_BAUDRATE, false, USART_WordLength_9b, USART_Parity_Even, USART_StopBits_2); // 2 stop bits requires USART_WordLength_9b + AUX_SERIAL_POWER_ON(); + break; + case UART_MODE_LUA: auxSerialSetup(DEBUG_BAUDRATE, false); AUX_SERIAL_POWER_ON(); @@ -144,9 +153,7 @@ void auxSerialPutc(char c) void auxSerialSbusInit() { - auxSerialSetup(SBUS_BAUDRATE, true); - AUX_SERIAL_USART->CR1 |= USART_CR1_M | USART_CR1_PCE ; - AUX_SERIAL_POWER_ON(); + auxSerialInit(UART_MODE_SBUS_TRAINER, 0); } void auxSerialStop() @@ -201,10 +208,15 @@ extern "C" void AUX_SERIAL_USART_IRQHandler(void) uint32_t status = AUX_SERIAL_USART->SR; while (status & (USART_FLAG_RXNE | USART_FLAG_ERRORS)) { uint8_t data = AUX_SERIAL_USART->DR; + UNUSED(data); if (!(status & USART_FLAG_ERRORS)) { #if defined(LUA) & !defined(CLI) if (luaRxFifo && auxSerialMode == UART_MODE_LUA) luaRxFifo->push(data); +#endif +#if !defined(BOOT) + if (auxSerialMode == UART_MODE_SBUS_TRAINER) + trainerSbusFifo.push(data); #endif } status = AUX_SERIAL_USART->SR; @@ -218,7 +230,7 @@ uint8_t aux2SerialMode = 0; Fifo aux2SerialTxFifo; AuxSerialRxFifo aux2SerialRxFifo __DMA (AUX2_SERIAL_DMA_Stream_RX); -void aux2SerialSetup(unsigned int baudrate, bool dma) +void aux2SerialSetup(unsigned int baudrate, bool dma, uint16_t lenght = USART_WordLength_8b, uint16_t parity = USART_Parity_No, uint16_t stop = USART_StopBits_1) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; @@ -241,9 +253,9 @@ void aux2SerialSetup(unsigned int baudrate, bool dma) #endif USART_InitStructure.USART_BaudRate = baudrate; - USART_InitStructure.USART_WordLength = USART_WordLength_8b; - USART_InitStructure.USART_StopBits = USART_StopBits_1; - USART_InitStructure.USART_Parity = USART_Parity_No; + USART_InitStructure.USART_WordLength = lenght; + USART_InitStructure.USART_StopBits = stop; + USART_InitStructure.USART_Parity = parity; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(AUX2_SERIAL_USART, &USART_InitStructure); @@ -315,6 +327,11 @@ void aux2SerialInit(unsigned int mode, unsigned int protocol) } break; + case UART_MODE_SBUS_TRAINER: + aux2SerialSetup(SBUS_BAUDRATE, false, USART_WordLength_9b, USART_Parity_Even, USART_StopBits_2); // 2 stop bits requires USART_WordLength_9b + AUX2_SERIAL_POWER_ON(); + break; + case UART_MODE_LUA: aux2SerialSetup(DEBUG_BAUDRATE, false); AUX2_SERIAL_POWER_ON(); @@ -336,9 +353,7 @@ void aux2SerialPutc(char c) void aux2SerialSbusInit() { - aux2SerialSetup(SBUS_BAUDRATE, true); - AUX2_SERIAL_USART->CR1 |= USART_CR1_M | USART_CR1_PCE ; - AUX2_SERIAL_POWER_ON(); + aux2SerialInit(UART_MODE_SBUS_TRAINER, 0); } void aux2SerialStop() @@ -394,10 +409,17 @@ extern "C" void AUX2_SERIAL_USART_IRQHandler(void) uint32_t status = AUX2_SERIAL_USART->SR; while (status & (USART_FLAG_RXNE | USART_FLAG_ERRORS)) { uint8_t data = AUX2_SERIAL_USART->DR; + UNUSED(data); if (!(status & USART_FLAG_ERRORS)) { -#if defined(LUA) - if (luaRxFifo && aux2SerialMode == UART_MODE_LUA) +#if defined(LUA) & !defined(CLI) + if (luaRxFifo && aux2SerialMode == UART_MODE_LUA) { luaRxFifo->push(data); + } +#endif +#if !defined(BOOT) + if (aux2SerialMode == UART_MODE_SBUS_TRAINER) { + trainerSbusFifo.push(data); + } #endif } status = AUX2_SERIAL_USART->SR; diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index 20348968f..220bb5b9e 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -66,6 +66,7 @@ if (PCB STREQUAL X10) set(HARDWARE_TOUCH YES) set(USB_CHARGER YES) set(DEFAULT_THEME "DARKBLUE") + set(SBUS ON) set(AUX_SERIAL ON) if (NOT BLUETOOTH AND NOT INTERNAL_GPS) set(AUX2_SERIAL ON) @@ -254,6 +255,14 @@ if (AUX2_SERIAL) set(AUX_SERIAL_DRIVER ../common/arm/stm32/aux_serial_driver.cpp) endif() +if (SBUS) + add_definitions(-DSBUS) + set(SRC + ${SRC} + sbus.cpp + ) +endif() + set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} ${LCD_DRIVER} diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 0364e938f..e4e99d40f 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -197,6 +197,9 @@ void stop_trainer_ppm(); void init_trainer_capture(); void stop_trainer_capture(); +// SBUS +int sbusGetByte(uint8_t * byte); + // Keys driver enum EnumKeys { diff --git a/radio/src/targets/horus/trainer_driver.cpp b/radio/src/targets/horus/trainer_driver.cpp index d5b34cc1e..f039536ff 100644 --- a/radio/src/targets/horus/trainer_driver.cpp +++ b/radio/src/targets/horus/trainer_driver.cpp @@ -20,6 +20,10 @@ #include "opentx.h" +#if defined(SBUS) +Fifo trainerSbusFifo; +#endif + void trainerSendNextFrame(); void init_trainer_ppm() @@ -152,3 +156,15 @@ extern "C" void TRAINER_TIMER_IRQHandler() trainerSendNextFrame(); } } + +int sbusGetByte(uint8_t * byte) +{ + switch (currentTrainerMode) { +#if defined(AUX_SERIAL) + case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT: + return trainerSbusFifo.pop(*byte); +#endif + default: + return false; + } +} \ No newline at end of file diff --git a/radio/src/tasks.cpp b/radio/src/tasks.cpp index 0e7bd7a09..533d1bb33 100644 --- a/radio/src/tasks.cpp +++ b/radio/src/tasks.cpp @@ -107,7 +107,7 @@ TASK_FUNCTION(mixerTask) s_pulses_paused = true; while (true) { -#if defined(PCBTARANIS) && defined(SBUS) +#if defined(SBUS) && !defined(PCBSKY9X) // SBUS trainer processSbusInput(); #endif diff --git a/radio/src/trainer.cpp b/radio/src/trainer.cpp index 0af1901b7..27a237b54 100644 --- a/radio/src/trainer.cpp +++ b/radio/src/trainer.cpp @@ -115,9 +115,16 @@ void checkTrainerSettings() #if defined(TRAINER_BATTERY_COMPARTMENT) case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT: +#if defined(AUX_SERIAL) if (g_eeGeneral.auxSerialMode == UART_MODE_SBUS_TRAINER) auxSerialSbusInit(); else +#endif +#if defined(AUX2_SERIAL) + if (g_eeGeneral.aux2SerialMode == UART_MODE_SBUS_TRAINER) + aux2SerialSbusInit(); + else +#endif init_trainer_capture(); break; #endif From 9a639b3fb12d24d311f00351ec76e7bc7bfd1782 Mon Sep 17 00:00:00 2001 From: DanielGeA Date: Tue, 7 Jul 2020 14:56:40 +0100 Subject: [PATCH 534/560] Fix model setup menu for 9x (#7775) --- radio/src/gui/128x64/model_setup.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index f6b1773fa..3dfca9645 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -416,6 +416,7 @@ void menuModelSetup(event_t event) LABEL(ExternalModule), MODULE_TYPE_ROWS(EXTERNAL_MODULE), + MULTIMODULE_TYPE_ROWS(EXTERNAL_MODULE) MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) MULTIMODULE_STATUS_ROWS(EXTERNAL_MODULE) From 4d6a8e063aeca989ba03469b1c5056ee69ceec45 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 7 Jul 2020 15:57:23 +0200 Subject: [PATCH 535/560] Bring back radio type on version screen (#7768) --- radio/src/gui/480x272/radio_version.cpp | 14 +++++++------- radio/src/gui/common/stdlcd/radio_version.cpp | 4 ++-- radio/src/opentx.h | 1 + radio/src/stamp.cpp | 1 + 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/radio/src/gui/480x272/radio_version.cpp b/radio/src/gui/480x272/radio_version.cpp index 33ab73607..63301619a 100644 --- a/radio/src/gui/480x272/radio_version.cpp +++ b/radio/src/gui/480x272/radio_version.cpp @@ -186,13 +186,13 @@ bool menuRadioVersion(event_t event) getCPUUniqueID(id); SIMPLE_MENU(STR_MENUVERSION, RADIO_ICONS, menuTabGeneral, MENU_RADIO_VERSION, 1); - - lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP, vers_stamp); - lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + FH, date_stamp); - lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 2*FH, time_stamp); - lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 3*FH, eeprom_stamp); - lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 4*FH, "UID:"); - lcdDrawText(MENUS_MARGIN_LEFT + 64, MENU_CONTENT_TOP + 4*FH, id); + lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP, fw_stamp); + lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + FH, vers_stamp); + lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 2*FH, date_stamp); + lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 3*FH, time_stamp); + lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 4*FH, eeprom_stamp); + lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 5*FH, "UID:"); + lcdDrawText(MENUS_MARGIN_LEFT + 64, MENU_CONTENT_TOP + 5*FH, id); coord_t y = MENU_CONTENT_TOP + 5*FH; lcdDrawText(MENUS_MARGIN_LEFT, y, "OPTS:"); diff --git a/radio/src/gui/common/stdlcd/radio_version.cpp b/radio/src/gui/common/stdlcd/radio_version.cpp index ce6e30e59..d6128ecb7 100644 --- a/radio/src/gui/common/stdlcd/radio_version.cpp +++ b/radio/src/gui/common/stdlcd/radio_version.cpp @@ -222,7 +222,7 @@ void menuRadioModulesVersion(event_t event) enum MenuRadioVersionItems { ITEM_RADIO_VERSION_FIRST = HEADER_LINE - 1, -#if defined(PCBTARANIS) || defined(PCBHORUS) +#if defined(PCBTARANIS) ITEM_RADIO_FIRMWARE_OPTIONS, #endif #if defined(PXX2) @@ -250,7 +250,7 @@ void menuRadioVersion(event_t event) y += 2; -#if defined(PCBTARANIS) || defined(PCBHORUS) +#if defined(PCBTARANIS) lcdDrawText(INDENT_WIDTH, y, BUTTON(TR_FIRMWARE_OPTIONS), menuVerticalPosition == ITEM_RADIO_FIRMWARE_OPTIONS ? INVERS : 0); y += FH; if (menuVerticalPosition == ITEM_RADIO_FIRMWARE_OPTIONS && event == EVT_KEY_BREAK(KEY_ENTER)) { diff --git a/radio/src/opentx.h b/radio/src/opentx.h index d73027a6e..0d21d5df5 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -678,6 +678,7 @@ inline int calcRESXto100(int x) #if defined(COLORLCD) +extern const char fw_stamp[]; extern const char vers_stamp[]; extern const char date_stamp[]; extern const char time_stamp[]; diff --git a/radio/src/stamp.cpp b/radio/src/stamp.cpp index e8b67bdff..ad28e4037 100644 --- a/radio/src/stamp.cpp +++ b/radio/src/stamp.cpp @@ -45,6 +45,7 @@ #endif #if defined(COLORLCD) + const char fw_stamp[] = "FW" TAB ": opentx-" FLAVOUR; const char vers_stamp[] = "VERS" TAB ": " VERSION DISPLAY_VERSION " (" GIT_STR ")"; const char date_stamp[] = "DATE" TAB ": " DATE; const char time_stamp[] = "TIME" TAB ": " TIME; From 2bca354029d312eb063a70e595c4bfddbc96c69c Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 7 Jul 2020 17:04:43 +0200 Subject: [PATCH 536/560] Please Travis (#7802) --- radio/src/targets/horus/CMakeLists.txt | 6 +++--- radio/src/targets/horus/trainer_driver.cpp | 2 +- radio/src/targets/taranis/CMakeLists.txt | 1 + radio/src/targets/taranis/trainer_driver.cpp | 2 +- radio/src/tasks.cpp | 2 +- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index 220bb5b9e..525c8a4ad 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -66,7 +66,7 @@ if (PCB STREQUAL X10) set(HARDWARE_TOUCH YES) set(USB_CHARGER YES) set(DEFAULT_THEME "DARKBLUE") - set(SBUS ON) + set(SBUS_TRAINER ON) set(AUX_SERIAL ON) if (NOT BLUETOOTH AND NOT INTERNAL_GPS) set(AUX2_SERIAL ON) @@ -255,8 +255,8 @@ if (AUX2_SERIAL) set(AUX_SERIAL_DRIVER ../common/arm/stm32/aux_serial_driver.cpp) endif() -if (SBUS) - add_definitions(-DSBUS) +if (SBUS_TRAINER) + add_definitions(-DSBUS_TRAINER) set(SRC ${SRC} sbus.cpp diff --git a/radio/src/targets/horus/trainer_driver.cpp b/radio/src/targets/horus/trainer_driver.cpp index f039536ff..83ec7a542 100644 --- a/radio/src/targets/horus/trainer_driver.cpp +++ b/radio/src/targets/horus/trainer_driver.cpp @@ -20,7 +20,7 @@ #include "opentx.h" -#if defined(SBUS) +#if defined(SBUS_TRAINER) Fifo trainerSbusFifo; #endif diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 82dbcef91..b00c7dfba 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -335,6 +335,7 @@ endif() add_definitions(-DPCBTARANIS) add_definitions(-DAUDIO -DVOICE -DRTCLOCK) +add_definitions(-DSBUS_TRAINER) set(SRC ${SRC} diff --git a/radio/src/targets/taranis/trainer_driver.cpp b/radio/src/targets/taranis/trainer_driver.cpp index 06a006899..01f6e47bf 100644 --- a/radio/src/targets/taranis/trainer_driver.cpp +++ b/radio/src/targets/taranis/trainer_driver.cpp @@ -329,7 +329,7 @@ void stop_trainer_module_sbus() } #endif -#if defined(SBUS) +#if defined(SBUS_TRAINER) int sbusGetByte(uint8_t * byte) { switch (currentTrainerMode) { diff --git a/radio/src/tasks.cpp b/radio/src/tasks.cpp index 533d1bb33..e9dcfac45 100644 --- a/radio/src/tasks.cpp +++ b/radio/src/tasks.cpp @@ -107,7 +107,7 @@ TASK_FUNCTION(mixerTask) s_pulses_paused = true; while (true) { -#if defined(SBUS) && !defined(PCBSKY9X) +#if defined(SBUS_TRAINER) // SBUS trainer processSbusInput(); #endif From 044c3bbf86a757afbb82ab3732ac48551851883a Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 8 Jul 2020 14:55:59 +0200 Subject: [PATCH 537/560] Multi R9/DSM (#7804) --- companion/src/modeledit/setup.cpp | 2 +- radio/src/gui/128x64/model_setup.cpp | 55 ++++++++++++++++++++------- radio/src/gui/212x64/model_setup.cpp | 51 +++++++++++++++++++------ radio/src/gui/480x272/model_setup.cpp | 54 +++++++++++++++++++------- radio/src/pulses/multi.cpp | 18 ++++----- radio/src/telemetry/spektrum.cpp | 53 +++++++++++++++----------- radio/src/telemetry/telemetry.h | 6 ++- 7 files changed, 167 insertions(+), 72 deletions(-) diff --git a/companion/src/modeledit/setup.cpp b/companion/src/modeledit/setup.cpp index 3fc74a3e7..90036bc57 100644 --- a/companion/src/modeledit/setup.cpp +++ b/companion/src/modeledit/setup.cpp @@ -570,7 +570,7 @@ void ModulePanel::update() ui->lowPower->setVisible(mask & MASK_MULTIMODULE); ui->autoBind->setVisible(mask & MASK_MULTIMODULE); if (module.multi.rfProtocol == MODULE_SUBTYPE_MULTI_DSM2) - ui->autoBind->setText(tr("Autodetect Format")); + ui->autoBind->setVisible(false); else ui->autoBind->setText(tr("Bind on channel")); diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 3dfca9645..c8eda1387 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1541,18 +1541,35 @@ void menuModelSetup(event_t event) } } + int8_t min, max; + getMultiOptionValues(multi_proto, min, max); - if (multi_proto == MODULE_SUBTYPE_MULTI_FS_AFHDS2A) - optionValue = 50 + 5 * optionValue; - - if (multi_proto == MODULE_SUBTYPE_MULTI_FRSKY_R9) + if (multi_proto == MODULE_SUBTYPE_MULTI_FS_AFHDS2A) { + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, 50 + 5 * optionValue, LEFT | attr); + } + else if (multi_proto == MODULE_SUBTYPE_MULTI_FRSKY_R9) { lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_POWER, optionValue, LEFT | attr); - else - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, optionValue, LEFT | attr); + } + if (multi_proto == MODULE_SUBTYPE_MULTI_DSM2) { + optionValue = optionValue & 0x01; + editCheckBox(optionValue, MODEL_SETUP_2ND_COLUMN, y, "", LEFT | attr, event); + } + else { + if (min == 0 && max == 1) + editCheckBox(optionValue, MODEL_SETUP_2ND_COLUMN, y, "", LEFT | attr, event); + else + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, optionValue, LEFT | attr); + } if (attr) { - int8_t min, max; - getMultiOptionValues(multi_proto, min, max); - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, min, max); + CHECK_INCDEC_MODELVAR(event, optionValue, min, max); + if (checkIncDec_Ret) { + if (multi_proto == MODULE_SUBTYPE_MULTI_DSM2) { + g_model.moduleData[moduleIdx].multi.optionValue = (g_model.moduleData[moduleIdx].multi.optionValue & 0xFE) + optionValue; + } + else { + g_model.moduleData[moduleIdx].multi.optionValue = optionValue; + } + } } } #endif @@ -1659,10 +1676,22 @@ void menuModelSetup(event_t event) case ITEM_MODEL_SETUP_INTERNAL_MODULE_AUTOBIND: #endif case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AUTOBIND: - if (g_model.moduleData[moduleIdx].getMultiProtocol() == MODULE_SUBTYPE_MULTI_DSM2) - g_model.moduleData[moduleIdx].multi.autoBindMode = editCheckBox(g_model.moduleData[moduleIdx].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_DSM_AUTODTECT, attr, event); - else - g_model.moduleData[moduleIdx].multi.autoBindMode = editCheckBox(g_model.moduleData[moduleIdx].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_AUTOBIND, attr, event); + if (g_model.moduleData[moduleIdx].getMultiProtocol() == MODULE_SUBTYPE_MULTI_DSM2) { + int8_t value = (g_model.moduleData[moduleIdx].multi.optionValue & 0x02) >> 1; + lcdDrawText(INDENT_WIDTH, y, STR_MULTI_SERVOFREQ); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, value ? 11 : 22, attr); + lcdDrawText(lcdNextPos, y, "ms", attr); + if (attr) { + CHECK_INCDEC_MODELVAR(event, value, 0, 1); + if (checkIncDec_Ret) { + g_model.moduleData[moduleIdx].multi.optionValue = (g_model.moduleData[moduleIdx].multi.optionValue & 0xFD) + (value << 1); + } + } + } + else { + g_model.moduleData[moduleIdx].multi.autoBindMode = editCheckBox(g_model.moduleData[moduleIdx].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, + STR_MULTI_AUTOBIND, attr, event); + } break; #if defined(HARDWARE_INTERNAL_MODULE) case ITEM_MODEL_SETUP_INTERNAL_MODULE_DISABLE_TELEM: diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 829a7eee9..2f67a3dcb 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -1306,17 +1306,35 @@ void menuModelSetup(event_t event) } } - if (multi_proto == MODULE_SUBTYPE_MULTI_FS_AFHDS2A) - optionValue = 50 + 5 * optionValue; + int8_t min, max; + getMultiOptionValues(multi_proto, min, max); - if (multi_proto == MODULE_SUBTYPE_MULTI_FRSKY_R9) + if (multi_proto == MODULE_SUBTYPE_MULTI_FS_AFHDS2A) { + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, 50 + 5 * optionValue, LEFT | attr); + } + else if (multi_proto == MODULE_SUBTYPE_MULTI_FRSKY_R9) { lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_POWER, optionValue, LEFT | attr); - else - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, optionValue, LEFT | attr); + } + if (multi_proto == MODULE_SUBTYPE_MULTI_DSM2) { + optionValue = optionValue & 0x01; + editCheckBox(optionValue, MODEL_SETUP_2ND_COLUMN, y, "", LEFT | attr, event); + } + else { + if (min == 0 && max == 1) + editCheckBox(optionValue, MODEL_SETUP_2ND_COLUMN, y, "", LEFT | attr, event); + else + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, optionValue, LEFT | attr); + } if (attr) { - int8_t min, max; - getMultiOptionValues(multi_proto, min, max); - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, min, max); + CHECK_INCDEC_MODELVAR(event, optionValue, min, max); + if (checkIncDec_Ret) { + if (multi_proto == MODULE_SUBTYPE_MULTI_DSM2) { + g_model.moduleData[moduleIdx].multi.optionValue = (g_model.moduleData[moduleIdx].multi.optionValue & 0xFE) + optionValue; + } + else { + g_model.moduleData[moduleIdx].multi.optionValue = optionValue; + } + } } } #endif @@ -1375,10 +1393,21 @@ void menuModelSetup(event_t event) #if defined (MULTIMODULE) case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AUTOBIND: - if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MODULE_SUBTYPE_MULTI_DSM2) - g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_DSM_AUTODTECT, attr, event); - else + if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MODULE_SUBTYPE_MULTI_DSM2) { + int8_t value = (g_model.moduleData[EXTERNAL_MODULE].multi.optionValue & 0x02) >> 1; + lcdDrawText(INDENT_WIDTH, y, STR_MULTI_SERVOFREQ); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, value ? 11 : 22, attr); + lcdDrawText(lcdNextPos, y, "ms", attr); + if (attr) { + CHECK_INCDEC_MODELVAR(event, value, 0, 1); + if (checkIncDec_Ret) { + g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = (g_model.moduleData[EXTERNAL_MODULE].multi.optionValue & 0xFD) + (value << 1); + } + } + } + else { g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_AUTOBIND, attr, event); + } break; case ITEM_MODEL_SETUP_EXTERNAL_MODULE_DISABLE_TELEM: diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index dee079d96..99bd1492c 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -1576,7 +1576,7 @@ bool menuModelSetup(event_t event) if (attr && l_posHorz>0) { if (s_editMode>0) { if (l_posHorz == 1) { - if (isModuleR9MNonAccess(moduleIdx) || isModuleD16(moduleIdx) || isModuleAFHDS3(moduleIdx)) { + if (isModuleR9MNonAccess(moduleIdx) || isModuleD16(moduleIdx) || isModuleAFHDS3(moduleIdx) || IS_R9_MULTI(moduleIdx)) { if (event == EVT_KEY_BREAK(KEY_ENTER)) { #if defined(AFHDS3) if (isModuleAFHDS3(moduleIdx)) { @@ -1683,17 +1683,35 @@ bool menuModelSetup(event_t event) } } - if (multi_proto == MODULE_SUBTYPE_MULTI_FS_AFHDS2A) - optionValue = 50 + 5 * optionValue; + int8_t min, max; + getMultiOptionValues(multi_proto, min, max); - if (multi_proto == MODULE_SUBTYPE_MULTI_FRSKY_R9) + if (multi_proto == MODULE_SUBTYPE_MULTI_FS_AFHDS2A) { + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, 50 + 5 * optionValue, LEFT | attr); + } + else if (multi_proto == MODULE_SUBTYPE_MULTI_FRSKY_R9) { lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_POWER, optionValue, LEFT | attr); - else - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, optionValue, LEFT | attr); + } + if (multi_proto == MODULE_SUBTYPE_MULTI_DSM2) { + optionValue = optionValue & 0x01; + editCheckBox(optionValue, MODEL_SETUP_2ND_COLUMN, y, LEFT | attr, event); + } + else { + if (min == 0 && max == 1) + editCheckBox(optionValue, MODEL_SETUP_2ND_COLUMN, y, LEFT | attr, event); + else + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, optionValue, LEFT | attr); + } if (attr) { - int8_t min, max; - getMultiOptionValues(multi_proto, min, max); - CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, min, max); + CHECK_INCDEC_MODELVAR(event, optionValue, min, max); + if (checkIncDec_Ret) { + if (multi_proto == MODULE_SUBTYPE_MULTI_DSM2) { + g_model.moduleData[moduleIdx].multi.optionValue = (g_model.moduleData[moduleIdx].multi.optionValue & 0xFE) + optionValue; + } + else { + g_model.moduleData[moduleIdx].multi.optionValue = optionValue; + } + } } } #endif @@ -1761,11 +1779,21 @@ bool menuModelSetup(event_t event) case ITEM_MODEL_SETUP_INTERNAL_MODULE_AUTOBIND: #endif case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AUTOBIND: - if (g_model.moduleData[moduleIdx].getMultiProtocol() == MODULE_SUBTYPE_MULTI_DSM2) - lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_DSM_AUTODTECT); - else + if (g_model.moduleData[moduleIdx].getMultiProtocol() == MODULE_SUBTYPE_MULTI_DSM2) { + int8_t value = (g_model.moduleData[moduleIdx].multi.optionValue & 0x02) >> 1; + lcdDrawText(MENUS_MARGIN_LEFT + INDENT_WIDTH, y, STR_MULTI_SERVOFREQ); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, value ? 11 : 22, attr, 0, "", "ms"); + if (attr) { + CHECK_INCDEC_MODELVAR(event, value, 0, 1); + if (checkIncDec_Ret) { + g_model.moduleData[moduleIdx].multi.optionValue = (g_model.moduleData[moduleIdx].multi.optionValue & 0xFD) + (value << 1); + } + } + } + else { lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_AUTOBIND); - g_model.moduleData[moduleIdx].multi.autoBindMode = editCheckBox(g_model.moduleData[moduleIdx].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, attr, event); + g_model.moduleData[moduleIdx].multi.autoBindMode = editCheckBox(g_model.moduleData[moduleIdx].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, attr, event); + } break; #if defined(HARDWARE_INTERNAL_MODULE) case ITEM_MODEL_SETUP_INTERNAL_MODULE_DISABLE_TELEM: diff --git a/radio/src/pulses/multi.cpp b/radio/src/pulses/multi.cpp index cfcff15d0..c8170f217 100644 --- a/radio/src/pulses/multi.cpp +++ b/radio/src/pulses/multi.cpp @@ -178,7 +178,7 @@ void setupPulsesMulti(uint8_t moduleIdx) if (getMultiModuleStatus(moduleIdx).isValid()) { MultiModuleStatus &status = getMultiModuleStatus(moduleIdx); if (status.minor >= 3 && !(status.flags & 0x80)) { //Version 1.3.x.x or more and Buffer not full - if (IS_D16_MULTI(moduleIdx) && moduleState[moduleIdx].mode == MODULE_MODE_BIND) { + if ((IS_D16_MULTI(moduleIdx) || IS_R9_MULTI(moduleIdx)) && moduleState[moduleIdx].mode == MODULE_MODE_BIND) { sendD16BindOption(moduleIdx);//1 byte of additional data } #if defined(LUA) @@ -313,15 +313,14 @@ void sendFrameProtocolHeader(uint8_t moduleIdx, bool failsafe) // rfProtocol if (type == MODULE_SUBTYPE_MULTI_DSM2 +1 ) { - // Autobinding should always be done in DSMX 11ms - if (g_model.moduleData[moduleIdx].multi.autoBindMode && moduleState[moduleIdx].mode == MODULE_MODE_BIND) - subtype = MM_RF_DSM2_SUBTYPE_AUTO; - - // Multi module in DSM mode wants the number of channels to be used as option value - if (optionValue) - optionValue = 0x80 | sentModuleChannels(moduleIdx); // Max throw + // Multi module in DSM mode wants the number of channels to be used as option value along with other flags + if (optionValue & 0x01) + optionValue = 0x80; // Max throw else - optionValue = sentModuleChannels(moduleIdx); + optionValue = 0x00; + if (g_model.moduleData[moduleIdx].multi.optionValue & 0x02) + optionValue |= 0x40; // 11ms servo refresh + optionValue |= sentModuleChannels(moduleIdx); //add number of channels } // Special treatment for the FrSky entry... @@ -336,7 +335,6 @@ void sendFrameProtocolHeader(uint8_t moduleIdx, bool failsafe) if (g_model.moduleData[moduleIdx].getMultiProtocol() == MM_RF_CUSTOM_SELECTED) type = g_model.moduleData[moduleIdx].getMultiProtocol(); - uint8_t headerByte = 0x55; // header, byte 0, 0x55 for proto 0-31, 0x54 for proto 32-63 if (type & 0x20) diff --git a/radio/src/telemetry/spektrum.cpp b/radio/src/telemetry/spektrum.cpp index 60c9f2329..285cd8ac2 100644 --- a/radio/src/telemetry/spektrum.cpp +++ b/radio/src/telemetry/spektrum.cpp @@ -468,17 +468,17 @@ void processSpektrumPacket(const uint8_t *packet) // "I" here means the multi module /* -0-3 4 bytes -> Cyrf ID of the TX xor 0xFF but you don't care as I've checked it already... -4 1 byte -> RX version but you don't care... +0-3 4 bytes -> Cyrf ID of the TX xor 0xFF but don't care... +4 1 byte -> RX version but don't care... 5 1 byte -> number of channels, example 0x06=6 channels 6 1 byte -> max DSM type allowed: - 0x01 => 22ms 1024 DSM2 1 packet => number of channels is <8 and no telemetry - 0x02 => 22ms 1024 DSM2 2 packets => either a number of channel >7 or telemetry enable RX - 0x12 => 11ms 2048 DSM2 2 packets => can be any number of channels with/without telemetry -> this mode might be supported following Mike's trials, note the channels should be duplicated between the packets which is not the case today - 0xa2 => 22ms 2048 DSMX 1 packet => number of channels is <8 and no telemetry - 0xb2 => 11ms 2048 DSMX => can be any number of channels with/without telemetry -> this mode is only half supported since the channels should be duplicated between the packets which is not the case but might be supported following Mike's trials + 0x01 => 1024 DSM2 1 packet => number of channels is <8 and no telemetry + 0x02 => 1024 DSM2 2 packets => either a number of channel >7 or telemetry enable RX + 0x12 => 2048 DSM2 2 packets => can be any number of channels with/without telemetry -> this mode might be supported following Mike's trials, note the channels should be duplicated between the packets which is not the case today + 0xa2 => 2048 DSMX 1 packet => number of channels is <8 and no telemetry + 0xb2 => 2048 DSMX 2 packets => can be any number of channels with/without telemetry -> this mode is only half supported since the channels should be duplicated between the packets which is not the case but might be supported following Mike's trials 7 0x00: not sure of the use of this byte since I've always seen it at 0... -8-9 2 bytes CRC but you don't care as I've checked it already... +8-9 2 bytes CRC but don't care... Examples: DSM #Chan RXver Inductrix 0xa2 07 1 @@ -488,23 +488,32 @@ void processSpektrumPacket(const uint8_t *packet) void processDSMBindPacket(uint8_t module, const uint8_t *packet) { uint32_t debugval; - if (g_model.moduleData[module].type == MODULE_TYPE_MULTIMODULE && g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_DSM2 - && g_model.moduleData[module].multi.autoBindMode) { - + if (g_model.moduleData[module].type == MODULE_TYPE_MULTIMODULE && g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_DSM2 && g_model.moduleData[module].subType == MM_RF_DSM2_SUBTYPE_AUTO) { + // Only sets channel etc when in DSM/AUTO mode int channels = packet[5]; - // Only sets channel etc when in DSM multi mode + if (channels > 12) { + channels = 12; + } + else if (channels < 3) { + channels = 3; + } g_model.moduleData[module].channelsCount = channels - 8; - // bool use11ms = (packet[8] & 0x10) ; - if (packet[6] >= 0xb2) - g_model.moduleData[module].subType = MM_RF_DSM2_SUBTYPE_DSMX_11; - else if (packet[6] >= 0xa2) - g_model.moduleData[module].subType = MM_RF_DSM2_SUBTYPE_DSMX_22; - else if (packet[6] >= 0x12) - g_model.moduleData[module].subType = MM_RF_DSM2_SUBTYPE_DSM2_11; - else - g_model.moduleData[module].subType = MM_RF_DSM2_SUBTYPE_DSM2_22; - + switch(packet[6]) { + case 0xa2: + g_model.moduleData[module].subType = MM_RF_DSM2_SUBTYPE_DSMX_22; + break; + case 0x12: + g_model.moduleData[module].subType = MM_RF_DSM2_SUBTYPE_DSM2_11; + break; + case 0x01: + case 0x02: + g_model.moduleData[module].subType = MM_RF_DSM2_SUBTYPE_DSM2_22; + break; + default: // 0xb2 or unknown + g_model.moduleData[module].subType = MM_RF_DSM2_SUBTYPE_DSMX_11; + break; + } storageDirty(EE_MODEL); } diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index 74671bbd4..d35198cdc 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -112,16 +112,18 @@ extern uint8_t telemetryProtocol; #if defined (MULTIMODULE) #define IS_D16_MULTI(module) (((g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKY) && (g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16 || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_8CH || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH || g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_CLONED)) \ || (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKYX2)) + #define IS_R9_MULTI(module) (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKY_R9) #define IS_HOTT_MULTI(module) (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_HOTT) #define IS_RX_MULTI(module) ((g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_AFHDS2A_RX) || (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FRSKYX_RX) \ || (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_BAYANG_RX) || (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_DSM_RX)) #if defined(HARDWARE_INTERNAL_MODULE) - #define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT || (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE && (IS_D16_MULTI(INTERNAL_MODULE)||IS_D16_MULTI(EXTERNAL_MODULE)))) + #define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT || (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE && (IS_D16_MULTI(INTERNAL_MODULE) || IS_D16_MULTI(EXTERNAL_MODULE) || IS_R9_MULTI(INTERNAL_MODULE) || IS_R9_MULTI(EXTERNAL_MODULE)))) #else - #define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT || (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE && IS_D16_MULTI(EXTERNAL_MODULE))) + #define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT || (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE && (IS_D16_MULTI(EXTERNAL_MODULE) || IS_R9_MULTI(EXTERNAL_MODULE)))) #endif #else #define IS_D16_MULTI(module) false + #define IS_R9_MULTI(module) false #define IS_HOTT_MULTI(module) false #define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) #define IS_RX_MULTI(module) false From 003c621694586a33840923398b100c52ad544d62 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 9 Jul 2020 14:09:14 +0200 Subject: [PATCH 538/560] Fix some multi option field --- radio/src/gui/128x64/model_setup.cpp | 2 +- radio/src/gui/212x64/model_setup.cpp | 2 +- radio/src/gui/480x272/model_setup.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index c8eda1387..4319ed8dc 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1550,7 +1550,7 @@ void menuModelSetup(event_t event) else if (multi_proto == MODULE_SUBTYPE_MULTI_FRSKY_R9) { lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_POWER, optionValue, LEFT | attr); } - if (multi_proto == MODULE_SUBTYPE_MULTI_DSM2) { + else if (multi_proto == MODULE_SUBTYPE_MULTI_DSM2) { optionValue = optionValue & 0x01; editCheckBox(optionValue, MODEL_SETUP_2ND_COLUMN, y, "", LEFT | attr, event); } diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 2f67a3dcb..36c7783bc 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -1315,7 +1315,7 @@ void menuModelSetup(event_t event) else if (multi_proto == MODULE_SUBTYPE_MULTI_FRSKY_R9) { lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_POWER, optionValue, LEFT | attr); } - if (multi_proto == MODULE_SUBTYPE_MULTI_DSM2) { + else if (multi_proto == MODULE_SUBTYPE_MULTI_DSM2) { optionValue = optionValue & 0x01; editCheckBox(optionValue, MODEL_SETUP_2ND_COLUMN, y, "", LEFT | attr, event); } diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index 99bd1492c..2d7ae7de1 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -1692,7 +1692,7 @@ bool menuModelSetup(event_t event) else if (multi_proto == MODULE_SUBTYPE_MULTI_FRSKY_R9) { lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_POWER, optionValue, LEFT | attr); } - if (multi_proto == MODULE_SUBTYPE_MULTI_DSM2) { + else if (multi_proto == MODULE_SUBTYPE_MULTI_DSM2) { optionValue = optionValue & 0x01; editCheckBox(optionValue, MODEL_SETUP_2ND_COLUMN, y, LEFT | attr, event); } From c8c6a52bfd144ad2cf426465217d060b9a52fc83 Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 9 Jul 2020 19:44:36 +0200 Subject: [PATCH 539/560] Fix companion not allowing internal multi edit for t12 --- companion/src/firmwares/opentx/opentxinterface.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 72734a4d5..75aab7b64 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -589,7 +589,7 @@ int OpenTxFirmware::getCapability(::Capability capability) case NumModules: return 2; case NumFirstUsableModule: - return (IS_JUMPER_T12(board) ? 1 : 0); + return (IS_JUMPER_T12(board) && !id.contains("internalmulti") ? 1 : 0); case HasModuleR9MFlex: return id.contains("flexr9m"); case HasModuleR9MMini: @@ -731,9 +731,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); + return !IS_ACCESS_RADIO(board, id) && !IS_FAMILY_T16(board) && !IS_JUMPER_T12(board); case PULSES_PXX_XJT_D8: - return !(IS_ACCESS_RADIO(board, id) || id.contains("eu")) && !IS_FAMILY_T16(board); + return !(IS_ACCESS_RADIO(board, id) || id.contains("eu")) && !IS_FAMILY_T16(board) && !IS_JUMPER_T12(board); case PULSES_ACCESS_ISRM: case PULSES_ACCST_ISRM_D16: return IS_ACCESS_RADIO(board, id); From 37f64e7d9df87e9e01ae27a88d5c52cfbf51e9aa Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 9 Jul 2020 22:10:33 +0200 Subject: [PATCH 540/560] Update CREDITS.txt --- CREDITS.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index 1ae419b6b..2d6eec3ba 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1807,3 +1807,13 @@ Karsten Schwarz Robert Mckay Michael Oeschger Randy Ling +Jonathan Wise +David Gardner +Christophe Judas +Lachlan Peters +Patrick C Kutschke +Thomas Halenbeck +Barry Wright +Nicolas Ducher +Giampiero Sintoni +Sidney B Harden From 15c9fa5afd471451551e2507b1edb05fdf53d31c Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 10 Jul 2020 11:40:38 +0200 Subject: [PATCH 541/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 2d6eec3ba..704a7bec5 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1817,3 +1817,4 @@ Barry Wright Nicolas Ducher Giampiero Sintoni Sidney B Harden +John Moody From a5aca74aa59dbcb7e95aaab88ab849e9ec5ff911 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 10 Jul 2020 15:58:56 +0200 Subject: [PATCH 542/560] Update CREDITS.txt --- CREDITS.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index 704a7bec5..0d2984b9a 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1818,3 +1818,5 @@ Nicolas Ducher Giampiero Sintoni Sidney B Harden John Moody +Sylvain Cubizolles + From e80e5ff4029af8abecab75949dc6b6db085c0ea4 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Sat, 11 Jul 2020 09:46:49 +0200 Subject: [PATCH 543/560] Update CREDITS.txt --- CREDITS.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CREDITS.txt b/CREDITS.txt index 0d2984b9a..3672053db 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1819,4 +1819,5 @@ Giampiero Sintoni Sidney B Harden John Moody Sylvain Cubizolles - +Adam Kouse +FCG Kas From fed0a0a8259008d23bc3a0760dd6e0d2421fffce Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 13 Jul 2020 10:36:10 +0200 Subject: [PATCH 544/560] Update CREDITS.txt --- CREDITS.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index 3672053db..0c0a21c7f 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1821,3 +1821,5 @@ John Moody Sylvain Cubizolles Adam Kouse FCG Kas +Dennis Marinus +James Donelson From cab661879c9acec9f7fde1e2344c15e1df08976f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 13 Jul 2020 10:49:14 +0200 Subject: [PATCH 545/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index 0c0a21c7f..d4a300738 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1823,3 +1823,4 @@ Adam Kouse FCG Kas Dennis Marinus James Donelson +Stefan Hassler From fd166ae252a10f037ed93ae022b785a806c00040 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 13 Jul 2020 17:36:55 +0200 Subject: [PATCH 546/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index d4a300738..cb19c3328 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1824,3 +1824,4 @@ FCG Kas Dennis Marinus James Donelson Stefan Hassler +Reinhard Prix From 387f938abde48d1baa4dea483c26338598c4aaea Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 15 Jul 2020 10:13:00 +0200 Subject: [PATCH 547/560] Update CREDITS.txt --- CREDITS.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index cb19c3328..0809943ea 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1825,3 +1825,7 @@ Dennis Marinus James Donelson Stefan Hassler Reinhard Prix +Jeffrey Johnson +Michael Conway +Ryan Buffington +Thomas Horns From d45475871d06b717a7ae682c48fc03dc9cae2d40 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 15 Jul 2020 17:09:54 +0200 Subject: [PATCH 548/560] Cosmetics --- radio/src/targets/horus/hal.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 12b2a4630..dd8f6ec70 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -855,7 +855,7 @@ #define INTMODULE_HEARTBEAT #define INTMODULE_HEARTBEAT_RCC_AHB1Periph RCC_AHB1Periph_GPIOD #define INTMODULE_HEARTBEAT_GPIO GPIOD -#define INTMODULE_HEARTBEAT_GPIO_PIN GPIO_Pin_12 +#define INTMODULE_HEARTBEAT_GPIO_PIN GPIO_Pin_12 // PD.12 #define INTMODULE_HEARTBEAT_EXTI_PortSource EXTI_PortSourceGPIOD #define INTMODULE_HEARTBEAT_EXTI_PinSource GPIO_PinSource12 #define INTMODULE_HEARTBEAT_EXTI_LINE EXTI_Line12 From 9ef510d8485ab68f5b53789d9c42d478d60e1df3 Mon Sep 17 00:00:00 2001 From: pascallanger Date: Thu, 16 Jul 2020 09:27:56 +0200 Subject: [PATCH 549/560] Update DSM autobind behavior (#7820) Authored-by: Pascal Langer --- radio/src/telemetry/spektrum.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/radio/src/telemetry/spektrum.cpp b/radio/src/telemetry/spektrum.cpp index 285cd8ac2..aab694db0 100644 --- a/radio/src/telemetry/spektrum.cpp +++ b/radio/src/telemetry/spektrum.cpp @@ -497,7 +497,6 @@ void processDSMBindPacket(uint8_t module, const uint8_t *packet) else if (channels < 3) { channels = 3; } - g_model.moduleData[module].channelsCount = channels - 8; switch(packet[6]) { case 0xa2: @@ -505,6 +504,9 @@ void processDSMBindPacket(uint8_t module, const uint8_t *packet) break; case 0x12: g_model.moduleData[module].subType = MM_RF_DSM2_SUBTYPE_DSM2_11; + if (channels == 7) { + channels = 12; // change the number of channels if 7 + } break; case 0x01: case 0x02: @@ -512,8 +514,15 @@ void processDSMBindPacket(uint8_t module, const uint8_t *packet) break; default: // 0xb2 or unknown g_model.moduleData[module].subType = MM_RF_DSM2_SUBTYPE_DSMX_11; + if (channels == 7) { + channels = 12; // change the number of channels if 7 + } break; } + + g_model.moduleData[module].channelsCount = channels - 8; + g_model.moduleData[module].multi.optionValue &= 0xFD; // clear the 11ms servo refresh rate flag + storageDirty(EE_MODEL); } From a561ce815ec0179a7d5b401e9074db2226eeb267 Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 17 Jul 2020 10:28:37 +0200 Subject: [PATCH 550/560] Fix slave PPM detail row missing when BT is not declared --- radio/src/gui/480x272/model_setup.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index 2d7ae7de1..556b1f2bf 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -535,7 +535,6 @@ inline uint8_t MODULE_TYPE_ROWS(int moduleIdx) #if defined(BLUETOOTH) #define TRAINER_CHANNELS_ROW (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)1 : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? (uint8_t)0 : HIDDEN_ROW)) -#define TRAINER_PPM_PARAMS_ROW (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW) #define IF_BT_TRAINER_ON(x) (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER ? (uint8_t)(x) : HIDDEN_ROW) #define TRAINER_BLUETOOTH_M_ROW ((bluetooth.distantAddr[0] == '\0' || bluetooth.state == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1) #define TRAINER_BLUETOOTH_S_ROW (bluetooth.distantAddr[0] == '\0' ? HIDDEN_ROW : LABEL()) @@ -543,9 +542,9 @@ inline uint8_t MODULE_TYPE_ROWS(int moduleIdx) #define TRAINER_ROWS LABEL(Trainer), 0, IF_BT_TRAINER_ON(TRAINER_BLUETOOTH_ROW), TRAINER_CHANNELS_ROW, TRAINER_PPM_PARAMS_ROW #else #define TRAINER_CHANNELS_ROW (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)1 : HIDDEN_ROW) -#define TRAINER_PPM_PARAMS_ROW (HIDDEN_ROW) #define TRAINER_ROWS LABEL(Trainer), 0, TRAINER_CHANNELS_ROW, TRAINER_PPM_PARAMS_ROW #endif +#define TRAINER_PPM_PARAMS_ROW (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW) #if defined(PXX2) #define REGISTRATION_ID_ROWS uint8_t((isDefaultModelRegistrationID() || (warningText && popupFunc == runPopupRegister)) ? HIDDEN_ROW : READONLY_ROW), From 5e4c301e78aaf7a0d028f06eed0faf1d4040f74f Mon Sep 17 00:00:00 2001 From: 3djc Date: Fri, 17 Jul 2020 10:48:07 +0200 Subject: [PATCH 551/560] Fix popup title not been cleaned --- radio/src/gui/480x272/menus.h | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/gui/480x272/menus.h b/radio/src/gui/480x272/menus.h index 0e13b09b9..290ff43ac 100644 --- a/radio/src/gui/480x272/menus.h +++ b/radio/src/gui/480x272/menus.h @@ -562,6 +562,7 @@ inline void CLEAR_POPUP() { warningText = nullptr; warningInfoText = nullptr; + popupMenuTitle = nullptr; popupMenuHandler = nullptr; popupMenuItemsCount = 0; // TODO ? popupFunc = nullptr; From 6d640339ae1e7f4400a52fc094477d420427bb35 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 17 Jul 2020 11:14:02 +0200 Subject: [PATCH 552/560] Update CREDITS.txt --- CREDITS.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index 0809943ea..4a2579db2 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1829,3 +1829,5 @@ Jeffrey Johnson Michael Conway Ryan Buffington Thomas Horns +Michael Carnes +William Hallman From e662eece8c967cd03ab6f534ba28502488c2f13f Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 20 Jul 2020 14:05:51 +0200 Subject: [PATCH 553/560] Update CREDITS.txt --- CREDITS.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index 4a2579db2..fe4d6b420 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1831,3 +1831,5 @@ Ryan Buffington Thomas Horns Michael Carnes William Hallman +James Snodgrass +Michal Mesaros From 7a1feb0d9a5a566c48afda1eabfd1c7d47715fe3 Mon Sep 17 00:00:00 2001 From: Kilrah Date: Mon, 20 Jul 2020 21:49:44 +0200 Subject: [PATCH 554/560] Fix some trainer/BT availability issues --- companion/src/firmwares/boards.h | 5 +++++ companion/src/generaledit/hardware.cpp | 2 +- companion/src/modeledit/setup.cpp | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/companion/src/firmwares/boards.h b/companion/src/firmwares/boards.h index ed5ab9e25..9a703e492 100644 --- a/companion/src/firmwares/boards.h +++ b/companion/src/firmwares/boards.h @@ -328,6 +328,11 @@ inline bool HAS_EXTERNAL_ANTENNA(Board::Type board) return (board == Board::BOARD_X10 || board == Board::BOARD_HORUS_X12S || (IS_TARANIS_XLITE(board) && !IS_TARANIS_XLITES(board))); } +inline bool IS_TARANIS_X9DP_2019(Board::Type board) +{ + return (board == Board::BOARD_TARANIS_X9DP_2019); +} + inline bool IS_ACCESS_RADIO(Board::Type board, QString &id) { return (IS_TARANIS_XLITES(board) || IS_TARANIS_X9LITE(board) || board == Board::BOARD_TARANIS_X9DP_2019 || board == Board::BOARD_X10_EXPRESS || IS_TARANIS_X7_ACCESS(board) || diff --git a/companion/src/generaledit/hardware.cpp b/companion/src/generaledit/hardware.cpp index 4f530aa78..78d0ec75d 100644 --- a/companion/src/generaledit/hardware.cpp +++ b/companion/src/generaledit/hardware.cpp @@ -172,7 +172,7 @@ HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings ui->txCurrentCalibrationLabel->hide(); } - if (IS_TARANIS_X7(board) || IS_TARANIS_XLITE(board)|| IS_TARANIS_X9E(board) || IS_FAMILY_HORUS_OR_T16(board)) { + if (IS_TARANIS_X7(board) || IS_TARANIS_XLITE(board)|| IS_TARANIS_X9E(board) || IS_TARANIS_X9DP_2019(board) || IS_FAMILY_HORUS_OR_T16(board)) { ui->bluetoothMode->addItem(tr("OFF"), 0); if (IS_TARANIS_X9E(board)) { ui->bluetoothMode->addItem(tr("Enabled"), 1); diff --git a/companion/src/modeledit/setup.cpp b/companion/src/modeledit/setup.cpp index 90036bc57..898596a6c 100644 --- a/companion/src/modeledit/setup.cpp +++ b/companion/src/modeledit/setup.cpp @@ -206,7 +206,7 @@ ModulePanel::ModulePanel(QWidget * parent, ModelData & model, ModuleData & modul ui->label_module->setText(ModuleData::indexToString(moduleIdx, firmware)); if (moduleIdx < 0) { - if (!IS_TARANIS(firmware->getBoard())) { + if (!IS_TARANIS(firmware->getBoard()) || IS_ACCESS_RADIO(firmware->getBoard(), Firmware::getCurrentVariant()->getId())) { ui->trainerMode->setItemData(TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, 0, Qt::UserRole - 1); ui->trainerMode->setItemData(TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE, 0, Qt::UserRole - 1); ui->trainerMode->setItemData(TRAINER_MODE_MASTER_BATTERY_COMPARTMENT, 0, Qt::UserRole - 1); From b896d7dab2915c4394042923cccf0ccc3e619969 Mon Sep 17 00:00:00 2001 From: 3djc Date: Tue, 21 Jul 2020 10:44:59 +0200 Subject: [PATCH 555/560] Add source --- radio/src/lua/api_general.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/radio/src/lua/api_general.cpp b/radio/src/lua/api_general.cpp index 99dd8aeab..3ee1bf1ae 100644 --- a/radio/src/lua/api_general.cpp +++ b/radio/src/lua/api_general.cpp @@ -1742,6 +1742,7 @@ const luaR_value_entry opentxConstants[] = { { "VALUE", INPUT_TYPE_VALUE }, { "SOURCE", INPUT_TYPE_SOURCE }, { "REPLACE", MLTPX_REP }, + { "MIXSRC_MAX", MIXSRC_MAX }, { "MIXSRC_FIRST_INPUT", MIXSRC_FIRST_INPUT }, { "MIXSRC_Rud", MIXSRC_Rud }, { "MIXSRC_Ele", MIXSRC_Ele }, From 0b4619090078a09a322d5a3458ba6ee0b28f4bd4 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 22 Jul 2020 11:56:33 +0200 Subject: [PATCH 556/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index fe4d6b420..c4998d2b4 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1833,3 +1833,4 @@ Michael Carnes William Hallman James Snodgrass Michal Mesaros +James Lindner From da45929216c2925760634ea40cd31d6e2418d1da Mon Sep 17 00:00:00 2001 From: 3djc Date: Thu, 23 Jul 2020 14:11:01 +0200 Subject: [PATCH 557/560] Fix companion compile issue --- companion/src/firmwares/boards.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/companion/src/firmwares/boards.h b/companion/src/firmwares/boards.h index 9a703e492..2ecf3c2fe 100644 --- a/companion/src/firmwares/boards.h +++ b/companion/src/firmwares/boards.h @@ -333,7 +333,7 @@ inline bool IS_TARANIS_X9DP_2019(Board::Type board) return (board == Board::BOARD_TARANIS_X9DP_2019); } -inline bool IS_ACCESS_RADIO(Board::Type board, QString &id) +inline bool IS_ACCESS_RADIO(Board::Type board, const QString & id) { return (IS_TARANIS_XLITES(board) || IS_TARANIS_X9LITE(board) || board == Board::BOARD_TARANIS_X9DP_2019 || board == Board::BOARD_X10_EXPRESS || IS_TARANIS_X7_ACCESS(board) || (IS_FAMILY_HORUS_OR_T16(board) && id.contains("internalaccess"))); From 9f203a70e424ce6e582224c742d023e1a03f3900 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 23 Jul 2020 19:31:59 +0200 Subject: [PATCH 558/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index c4998d2b4..81e5cb199 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1834,3 +1834,4 @@ William Hallman James Snodgrass Michal Mesaros James Lindner +Laurence Gerrard From c3e5ea530356a38dee775e735bb8f0fc1e0954f2 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Thu, 23 Jul 2020 23:28:09 +0200 Subject: [PATCH 559/560] Update CREDITS.txt --- CREDITS.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CREDITS.txt b/CREDITS.txt index 81e5cb199..c5316e763 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1835,3 +1835,5 @@ James Snodgrass Michal Mesaros James Lindner Laurence Gerrard +Nico Wagner +Christoph Rössner From 1e19277291d3c6157334db8cf9f80498b4d63b40 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 24 Jul 2020 08:34:37 +0200 Subject: [PATCH 560/560] Update CREDITS.txt --- CREDITS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CREDITS.txt b/CREDITS.txt index c5316e763..9a6bc797e 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1837,3 +1837,4 @@ James Lindner Laurence Gerrard Nico Wagner Christoph Rössner +Ruben Flores

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 N002ovPDHLkV1j+Mlt};p literal 0 HcmV?d00001 diff --git a/companion/src/images/simulator/JumperT18/right_ent.png b/companion/src/images/simulator/JumperT18/right_ent.png new file mode 100644 index 0000000000000000000000000000000000000000..eaf7c6acc8b44aeb378701012cb37645f81b764b GIT binary patch literal 36767 zcmXtA1yEL9w28s35RmTfkZ$SjmIi6*l5XkluDjpwpF55t19;fy zoVC|_Y7?p;_ZbC=5D5wj3Pn=llM?vX9|{VZ3;_;&q%DZW4gP^MkpBD$>IL#AtF15& zdJ1j;FEmu@Pkiu6cn3*YG5F0_#PCe7Pz)+|p`b{iBtHqOxGc1$??oBi zs6NZ9E-&2Z^s#5m^;H|1ewV=ZgQ3LOh4)K3g$wNn5(*OX;g*n)@co2=AtgfkrW&iC z{aDk@t-PY5!tbO@urowu2($mxD z*VnU0OxW4kzcAn?$`vvu4W*=LW-C-dz9WaGCN2)^gOE_eo`c2E)}%>oikKp{&KJ6b z!%lyA@ZCqf;dnC^^;Xpy0hSVlQ))EW!^3473=3`UH&$#Zb9;NmR}Y?PV>>1$zqFYc z!^r6qq!Q)w83s+tRp{nzdFo0_>CKj)Yi6OD7I|-@pw><;NZ!9?o@k`g-232RpgBS)|ML=g=U{W{j8|l{c)^ zaId&@kB*HU-QLbA6~`O15eylzsWISIo_yx}W@0j8GDU9v+peijhRRS88$2hl0=YuN zW$T;1$SrxQxN2=C(_)oDIXO9oxPduao`_|Zl@DP#rz`TAg7sT==5Yf(LEZX?+vj?@ zG&Oe~)?*n0wY>)VV4*ehRxXh#noLQxZf(|k4hwx7)sS}sZg$Usup)dFyp~@rwT31p z{_EpzZD6(RLngJjVv2{J()qERgedIn2Tm=W8g@l(XzvEs6f6z{gEPj%#bcW~vlzM^LvDAEaDYh?e1E#ndqa-66JQ&PDCO~6TE z<%mgb;?R~AxWf9n{_v^GuRRAoj}x%$slC7CWk16I)iL6}v8>lx|GPiXX=~T?6TCn0 z4xAhvjcezJL8b8^KI&kLfudl@99sk>I5Z>;zHVZ|l{vb>CQyXzXPtF} zWl~ZS7hxnrSWfciwKv#EucZs8AXi$po;9h}JSATG4ekj%Kk!yYcI;bPTanTHPkK;# z@f&^1)#!gJwMVTyf?@!7egD+%$d_)5)`%LB4XVsk@Pfeo;i#coVAO~W{N!(-aKHvw zUj7Oy5Bx-Me?7J3U9Y>>w)-BL@$5=E$kLZH-eATN6~; zlXb^x2N#@R&oH>HFZoK4LDraj!9X)xiisw$C_@~Pif-M2Ao|ZCi z#D<9GLo{r8Cm;vYQQB9Y;d{^*a_QjKJ<&0HFy-E?!QhA2?0k~3+~K|Ix#iND0yCzT#$u0fpHKq7pOQ*XAI%&Y8NdNhBuGVzy z@bq*X&R_Tx6F++e{Yms^-zid{$Z-0;=(_Otqt*s5IJCrBd)-SC&&YP>lj4&hZ+R-L zmgeS~sVQYhZ`m2kTr{YzYFKd_dR{|&{=MRHAq)2V^*W)#*@dHDo=*q5Xwz_Hym14sZgfkhMGORp zqeQ0zKhxlbbESt5?>cx7aPYFGqiay+pd0T(@@Zoy8(rbFf{Y0R2*0TCms_WPBw)Oq|wYQGo=?e;l z^gY3it+Vs&^KH~i&-KmC(dzTj>LInzT_|Ic^h3AMqiA>zjnNAja|KhyTNkdSYNd%% z`G@D{Y)(-K{VEhkPK$}9rqN$jRkhy!J#YlmgezT6^v@q7He3vHaPK(bVnnFH(DuJ6 z&@pXQuiTcwWk4$gy|lUvZ(|T_`C=83=kK8JfLSSczf1A3C+}@h+40=$d6DLAVAFQx z4jE2dX@Rkq4Q=a-FHNWvmCp}fJp49U9^LuUg96ThE#r;PUV++t@;5YyRS5xcD!Is zU@>LdOshqN95biU;k^bfqK*miq46WFu(fUZdRYJu%e%aln!S^>1NRa9UV?q=` zmnrF&w(A0D77t;}EVWZgbSe{pFjG z_tAlx4tdhhy!%O;DYH&%70JtO|Ml&ep(R(^dYy8ZbIY>EbHQ&#rO*~_rf*G1H@!F& z6MGJaHB;4>`!~X}&Q4AYbl6B-_{fkqzwL&7o&Oi|s^6j>)l4-hZYV7nu@TT?BLU0- zHfr$smU_p1LV9NAVnh2Cqx(*}GYm4(80^eSEhp35VM8^1oB7L^6=TEc>U+>`tCfn4 zbRYlW9ZlqZc5-ns%X~UC{RT>M|Ed{O57=)rdk$UeQ(=%f0??IH%e!OqTe;G=`Bfs0 zoj<^~;29@-ixb`(?dn%-8M+Hig^7kXd3x_5NOF$m)iAX;m-{)&%G-MtvIhVhs-_b= z9-7fvcRtI~;rwJpByw!W2&U)pa*L@=$J4K`U%$@J&uf+)Dx)1%W3aaf=F!(B?tE4S zRamZ8s@bN47Q(3i4hoEUjphk6je0EI!n zB&jK2oPkMa1!;8y)R_R|TFu~Q55H?=HVup$RrTXeyQH?W3T@jqp#Agc-3jy{os zNhp{yCqjn%Z+T#BvhF`VE`hgpbad1!rFJ~?;)wFy-Qc#RlK7VxEkI4GrPCVqYmq*2 zk<|FeaO)`wHFTrwDKcfV2b!sGZKq358)daNB1FcsR6*$vGyKl9;Bfm6&X7_(#4Lb z(><&-`2m`E&2vf*FbA`#5}nH672ZN!L)?I5@mzg?%>Y96{hF-lQwR3e@4_JsGl~4? zvF_)-;B={cuLEUb?)#%SLqXjEj{Dzr@1x}k0nm7DBTGZ3UZg_ztD(Vk%Z`^a_mK!e z*uGc7m!h|8FC44G6fD#9Y6qN4s#LoIzoKi8io)73?F*Eu6dcfd+Ww9s-ZoBWc=XQqM?dD~9eKyxTF zIRUr^S6c6!=-?h~Vo+Ovqs0M^AhCA0T~jO0V8fp2bEUu?<=#o6lH{(aE<<9)ll3p{ zGWf{98|IdtUzz_gd9$TNK(>?~%YSeKR7Z-YOSHlz7!45gQ?B+VD~_1oGtCC?N#HeDB^~7 z8y*`G7?^p?5>DMj4-x8GK$HP+f7s^kFn@U*d$C%5dAzYnQ zIMy45L^)F!9ibE%EB*`(?60}s9kfDQ&e&`T>~Q3~1vAl_usl##l7bU@!sp`gEiLcB z@bJ3rCRqR_D((LAbOWm5L5uV!O&)T~d{scX0fo(-pn(d- z_u@-$H{k>LodxBUyW}eRNet)|t0#+qL^qO!{n&eiIW*S>-J;fc)pPb4ta+*ZVfkdi zx&7iDWO|j`cn*OUq_<^v*QfV~YjYB)9jOKjAG;5|XY)pU*TLZ-7t>B$ ziFoX{ZZk;4AL(7K@ye?|n8eEr4-fA;klCZN{XC%(u=()F8DCl!-JFELQ70d=qW*Cf z*oTM#_WXCd&XIt$U%3eY07q7R&J;PE2H!K?Ds* z0X{t6blAYd!(UT-pHp8yKb(9iS3|+|xY%aGO8W@F;P99GyC6WsM@;OuxO5Xs^Oaax z0^%ZMg01W0!gpXDuf$7lWJ;?6OXyx72ZZAt3CZHbM2ut0S3sPvBW*moSG*pMSeAR9 zOm3Uzt%5WW)59j+`G}*A?k;x7Fs?J84}D|Ag0l4#V@|{dLkj*Xgz+;44Qr89{Hm^Z z4{h1Ma_ju2Z-)P=T&?!yzVfA}KZ;~g=y^kE;pyS#2m;O_5)WZyABy&JztIcScW22v z-$X59>eGSb#D2*PdELsB;uqW1TWxXl=H&_$IM~u@i|c;x$NuZ>G@Bqyv|<0L!O+=< z9W4FWOR#S+yLs7m+c-q8K|(bcSKE%r(DwUHFv z$zu=plcx=j3&v7z`{fz=Do>KV& z4^vw1u`tt%@Ii*trR0Mi^j0O^WKkn}X7|#Y^eu~e!pyE~EJc33*pF?9_-}L*Czz#( z5ZIr6_hbx!s!{3vbnxFEpC9uwi6R!L2@em4!aWOYtmeBc(TA4t(H0YUTc|FSWSxG) z@0KG8Q4oOcqab{%jTEI06c8JmF(60rXiF9`x_ub3;%WW*rE-+FR+%bV< zo03wmReqXs((%&nd0m@{60!}@UMd_=S_0TO;o5uwiULEY%serSGheBb27H{%G0W;k zVgRZgfWbg``|sZ|;$A6?2gRY4mC2ZJ8bnMhqi~v2qQS7uRP}a?GW!+(qI?P@lA$Ij z&`%B)WlND^IM2aIHBXd!4*)cD&lx*r>Ifj7nYdvH&{KLa2Q~J-Ms{ z_ClbJEI-V|BvH;+NPFMc7YQIlI}SGrGQ!3Sexp48sa9`L=e4^-NqE}w$&Dd}$pZb^ z$5g44)3(bC*N;SQ5wC7F(cXJZ&gbO(FViwqT|-SQpZW2GTomxG6~|*<*dLD zZh(?G=47wV@ELkak)fJxL#!2EP*h^wghwPxwFl)$Td&^SZO3^8FN z0Br;?FPrfr4i4y604D*>5nht+_6x$4GH*{JOc2x~6au}N>*v2xteR&4tT6d}KF}e< zndZ_UVIBOm5^@4^jGx`l%*vkbXpaIleq{ZJy>GYUW7S%7k>!)LR!s@?fay`{C=IK)TM9fK+7T|vkBEvV z6sJ`OBE_;b`~;H#PU^rU`Sn1m(*Vocg%zWR9zJFi3EtAG(n=kuu*Oco?E~1+or`s{ zz0JlXthKsNirAY@K*$?5<1Eao{%m%NHCaM7!1-#qtB<6uD`_=+E?HJ`o zC}~I&=pzu>JW~j$X?munrrf)(fSg@lUqe`16af}beoOabeO4l^5+>dI{@6iyyS?_AbhF!ACz~4)r(#fd;FGH)j<2tT3IFv6E6h?^ z@M=@#8g@V|Fm=q6`XhjN-x#kj>$)G+ z16=+pYQ^90Lk6)f4R)DQF|a6r^iISy7!^*xn=NA*SjFi|`C*0tMb=7np+cMK3soHA z?dM5J@_BNC>8VZ8(3IXyH`UHj>L2)X$Hx`MY$-lYC9L;TOIBRn{-~Msc{$olc(Hwy zT3)A9WNb!n^rR_`V@PL+_Dd|CVOJVg}>-M_rmM zTJR&9;L;6F{7M@r(9=^Eu9$=Xj%_>Mv=I{^Na1&5x6-7@(fE_z7vS`Ld}bw#G+^V= zTD5$VYn;fNe^Gpr&co(xqN-LgX*!W|gF^h(5G3Q7wdpbrk9WKh12_IlE|%j*$kfix z4(mEnU4$>*7Zl8U&WrLRN{1$t*9$6J;^uTQPw!6T5I5l0hU|5F1G97)ijAyhvmhD5j09#d(~q|46jVUHOPT@faNiZpE64{Z@(FXHC|D zJn(mr-ApHTXbV^mi$HJe+9A8`jaEj$il>*1civivyP|R=P%X>`-IdJF@mmQ8T$9)b zzk}^Je}wp-*Ho?cuyzBIW*OIBpmp5ZbVByr&>we{k6a>=h}VE2b8aynG#G&Eh?x?A ziDoNvV-hX@o1zKq-{L1r2{@xkSz#)jC~@*R|52-tr^1&&)YZ((!|4e3g+{GW$<(9W zmgO&ezMl4B;?B;@c4_~-9Pb~}mu*2r+YCoHNRw`@d)9_>9%WH)Vd7+18018Pu{=|3 z{EcIeuF#;^$i1cIm$o^Z8&%A?5J%J0crhBf|5-wGP!CO*$cL3N+ue4$*cD*UQZ>PB z@w-=&k2z3dA17*|}M|j)gfQU4I!mI~bWk}*mYS>2( z%k4(%VS_N2CT#jput_$SUxx5xqX3IIk^Wb8)Jdv_82YnAIjeTi-R|11EOfoCBKcMeqCWF2| zsl7AfWo?bgdzWRwZ2PcR-*Gkb1%jr}Hu{Cl{NaaD;KbDouk^5D-I_)1LB0UYAkTv@ zt4Lq$>R|VSqZ4o-j)_unz)ul-!lUVNN(1ZI5qp;|V5tL60Bq#l2AXE+qJW|Z=(usq z%+D>AD)Omtd9N)~Dz^mz0CY4j#+r+N%O|yS!>4FC^?hpA#Rq;C5M0p$S=r1w732cW zgaNR-ZdSclpSNwE`+!pS1Tm!|!r&6#X`~$lQ~I-3VHQnW1lFL0;C(%?@qSoL9NRfs z?+(76_)G#(fsorS;RqVet&`T0{;h;R-3M<$5r-g*?<;nEQe$17$xjAmQM1z4i$cu(RYnD&(@>6XLhw@o}*<<2AQ3lWZ z3=hKEh@$$huNQ5AfeajN2urFT^E|fi{B|Dgp;VSW21MM|$8BziwF~NDF7+m#*^@Tj z8A9~^*7;q}H~SuosUnY@J`C%+tPQibbqc}xcSgR`0qVcLaurwkW9tEsoVvS3A^t6B zej1s<`IUA5_C6l;@Ki#q7+r=g1be!KW-hpIb1vyry(5n8^1>8f+diZE5^ZJcYHPpx zSJG#{b+axh_;jfZq9^}Zr!NoQFU+>&wew}34~wh6DuEPteSc6H{1z%2e#wVt%*_Cu z=O1nU7DPjYto5hh)>Y;{ij>KTnN2j75wQG z;&Ju57A>WY7?Y;)%jHNL84pl;?A%c-I>n&knCSlqf+G;y9NZuJrxmojvF?O(0SrgzwKRx$3fk^03(P^aa@C*Bc}+ zJcogEtE*_T>~d9=H?(*lN5arv>H(e7u_Ir!9Vh4bfM|QPpTm$lc&-(z#2VwG^vb6~ zyfq7SS*c=5S!%89`h@YNI@pC@sb^qqhl&+60i>O9CA9ex(NS2UBgeCf40 zp@?Tg&+Qg#KDq%8r$gk^TpC+Cg!m1YUK{-pm?M#MxgiTON{t4s!rDyk^TH8D=tWn0 zGY0p2ZY|w|2@bx5=G=vYPbC4vknXZUv|9D_^wfh@(ozc;+}v*8f!P!cg=G$iPaIy& z>NWt^2INnAlzaL?R7)iD)0gHFXO&_VNIvR6?e?nD`(3i!ruP080vgE8{D_J&w9G^x zxx~>kC{~|16XWL+A<@b%x~9ncf-D~ADDnW(MIdt(p7RGli9bys{lu9zVu?ywRj5@- z(w>!3=w1|WFXUY;V@aH|O^U>8=m7j=R8-VMVCj)vV^ze9M`4cu(Z>SN9JQ_|;K;Uv zY=C=b(f87Tw9MzrLNe<0zilpOUC(=&&$RKWVL2s=e=Rs$ykER{G{e?hnfpXHpW=(l zSXaVrT>7}$Fg|^3>$J6rH~lBA%t<$>9x@hftnnTL2PyFP-pyZ^@6KuWGD!^04j7?s{2&ZcGgG4t^E|` zbxHBi%j~7UY|YKZg8ZMIzof8wv?*wISF%;$XB9CB%$Wcqc@n-GM26P|aa^k|@*#uZ z24#F*addIJ1iT)3HgV!Fkto5iIE|>EfHQOX{#_rVJL4X`POMCt!`BnXNQw4qs|fH% zIqY5=#v6aCPy*qGoAC?6Isqe zW*_1J00Sm1(E7BoDud(^!Yt~wNS$epE3I2W)CiQ<)x%Trr}D5byVrcS(DD!DLgU9o znc1~J_E(Ce5O7-iq}LUX1-+k_+Aq>i=4Lyd9U)2*$@6LOb=!&O80dF6YG<4+Zk1bh z1X;SWYuME-eY#3y^HchGD9~P;B$dgO)$G6|2OI+3v6Y1mg)xA~fztt#^2eW~Rny)l zWpjVZz|^WERJ+hw2PIBLqsJl+e!o9roe01v3Fmb2;6*eKavjZDVw&~&ez!%n5O`tf zw98Ifr&+AhB}?6d{$f5t^7idgR&`v0?!hMb$+lZ`i zt2nQ^)INip@aeGl(5K76-~V)8 zecn7<&Z;u6DO3?4UNNXfFfNr3a205Zk~;MjU^!p~Ssu_I)%K~sv%4_QD;bC?&iVwOLm4hyQf^RdeB5(1lARZa;@x6yV#+?!`Vfu;V)1? zl`8(x-Sd&S^PMT-O59eA*uHB^a=Wk3&WG#X@#X7A1>wBe4<)UvdV42-|@w8q{|%vw+3_-%q_Q(;ga5*X|=3jkeV3&&C#%y z=kNW|>MHjep=Av9c^C&FmE?8E$tEYENS$^MzJs`^st(8`9C~8^qDJ0zNVCwkoC;%k z1et=Ko*vFmw&Sj2+Dy)Eg9;mP12X`zs+HnUB;RAWvOR(OZBt$R`^L!*KxV1AxT8{J z0Wm&qAN{)teok@x39sUo%(%Rnf`aQdsK`a2Cz>e~HOs^{;=Lll*KTz5k%ejfr+9GI}q>Fm1;#LH}PlzWx$ z6@XKHrqc4$g1^UGWr<*6I#!{R=2x9tMUHM{k0|UOg}g#kE<4UH<*g=MehK{mu9uI^ z*uz#u`|!26|KPi=5+^rTg#dz{4+1R_Z&721x3==rGcx)vn;aFAV7ol8vG(!v#-hk; zw5_#3#Do+s2jzf;2Vd71%`%WpAPuS@ zU%04v_Q3bLz$IkV#14VCOg}`NQKcU3@dt$vO1xCQUso&BmRi1QI-H<@0E!19Evqm zmI}BPo!^9cxa!l_n`~WMhL*(oQzkb@iV+F4mx)jd-x!V4sq+ga4ZU_HFDP#tWMs9E zlZ)f>ksvg;bv^r@zgD`*b{DMnP3r5#`M`c)WALD5&zj5WIBZ*I@jlAUk4^1aQih}< zOM*UzF{S6Je1lZkgz#Tn88g#@G!2P9kFK!A38hO znwy)H66AExP`myAG*lxlu=z78ljsmKpeIX?%`bCO29p(U@)9dHzQ(hiQh4wdYc_3@ zNDZA&t$6&}=a^WVjFr@!-#D8C;2JaT=|TkrsceRNyDFHNk7}0Nt3zblh_|R7N;s=2 z(K;!j@iTy$c8rJfhMb6xZ+Ayf5{Y&|k{_p_uQZ!1|HQv=(-Zi`0`AugY9@UM)%*zf z%}7-)1X|6(@scIXYw)7_@}-aECwc}v;3oo5)#ZL$qek7HAC$nVx7^Mto#7KpONkxzp@?jJ)|7k^_Cxb^uqISO)5Ley8Ek-M zq78Qo2v1@l*<661hzfr~ucB|5SZ?KT|AhTb)e3;=Z&d}YmTe)B>@1nKShKUU;aoap zNw!x1qgf5_z(5N-kd2M{XUh&)>egTYtp^;yedLtey#>)F;4!0FLiWKb zGB9elnB*7M)N0g~tzjkBX3NikF+qw^Hn21p5%^u?dk39VcOuGG%GTMMq+Zi|I=FQ{ z#OO$G162r<#VS%dV2R;&jTssN!>2q!HG^ilIch0HhqT?$RQcuGa1X|vZwBV_{GSEG zF4&xNL(R5d61ANBPEo~o<;+r3UN2*WPF3Y zLz5`|0HANJBtc%!%YNDotY{>F`rtr_hKg!!CbmJQCw+2!ya3`9L(?4clg1l-&Lx(9 z4hz~}JB}}87NTT}i`*HW@_1@|n%QVW*L!@Y=_38hhD*UAjGjLHT|#@(yPvxNssplR zvnyn%86OP-50*CqrPr}P&TP79#d8%Inl8Gu^w9JOfsbF!pc^RV7-ZX|9Tc36Mvx>W zDmgvPX+C|hR!2dYla(N6L*@^wkNZ?i*@=mauifKK#s3P5leuJFn2!tn;p)dGoC2JR z`RAe00V7PBzzM!BHaE0kjv}Wlb=N=)6am@td0o-7TxkKl`hQe@3*y+haQ5bJ;=e*9I}PaKX?a7lvcUg zN7Fmv_$W$K5R3+SOal$c2;@2`oeBNZQUn#Q=;Vw#OKo)|T6(Q+_;4`}89Ew#kvXZ6 z-eH{zw##G~x51TZ>TlMaS0$5QCNnJdy>?A~xY4zXv~5j+Mm@Kg7@_f4zgg%NZWndj5a%JsvjaBtpgi}6U<;*Z_f6zu0UzY3U_ zdV;A-Az0%9(@nE()^jrNI|zrJomGR>X$uJW3wYeJ$dGk1%v7^(zq#zZJ9DXu(y7Gb zbL6Pf!0js{Q1z*4br@HrPM9;OJQoQQ`tAMce0<0B4~Bs@v5vY#I`kGKNRM_@uSWwq z0TA~L>}$dVia6|s@y#mGr!fAliM#w3cXjZ9mLFVGaRTQXn2gtmMRdCR(DLY;j4xiVyCbbMD1F*RRR3PbhfNBEye znW%AQPei+Id61iB+}+*5ISfC#Hg)lSdX_aQD-rSY2pE zs~0Hz#*|*U^VhsYys>X0PV1f|OOVx11kZrIY>?PA=s~=-t(aRC9lt z^Lub^i3k-g5wnIavs?gkOm(~fdq|e^)83e5^dbn+gR@1fC^B|5VjolsQxCR%i(~1j zZNb~z=#Mglt-VCnW2Rl%Xk#&UXjrTVz1Ham9WvDRKLX`@!T4*AU%$U9760Y@pryWV zaigG)TGGg~nYgjBp&^&O%=^yZ9cu9P=0My>2}Md-Nj!#Q6-(nX=Clzlea9)*AaF74 zy+=RRw$R*(KVX|MDBoleEOml9A+{~os&&gHR>O_xH-u!PJ32_rj!4S~56KI&{KhG@ z1mIm?&4uh}-Je0DCir@k)%McR+rl$R~aOxm&sR}B~nnL zl`bcCs$8uVesNPU0dhI0kZBuKc={%!=L|zWJRm z2DKuqIm*ihKBy#IUvV|}J^J3CHfQyP_x|bOa#-l)Zm*f_-s9rPkxFj*Y3on#1dD}QQDB8tN#VPp_QXF<%4i;H7X#5SfF z%F|Wap=IPfv*k({+IjJLt)Ld`y(`)0C|{`Te!3=%z-SBQk{n{Y|BP4yjkcj2GogHD zK|gQBb&Ad^XQSdFFVFn9jijWflN~j&@PA-6oYE%;{f4vxC5spZ=`UN^>c;_O!zEV{sB0s2i*Q{0D zxMh1hp{rSl6GnG%z0c7-Y@g8`VH)jk5jO~X3IB}?ng$`*T}5y{!~OBL8l3(3FFI(S z`JnyhYluG`A4qC}+&&QHy);{Dr1If9iUf_NnbSLMss1tf~j z!UnH4uSkpA*+X}_dCWJcJD2nmvQd9U&zA%y4$UHJ^QHf&w-YFgIco){y0R4H&6Udx zmPh3IWW542trt{##!5@f21;2tvF7LulZ}3Q<^EW$E#~BZ|2`GbYX~hf@bl?z#b}kn zwz5{~aO^SstR~8|hk}`|aax>Db@V|ra>>=b1%pkzB8h z%7_Vc2)R*}^IMtMGBkW(oKoU4=fi#r+hmhG`ecgMxr$>X72BcO)}04$n>Kq&Mln#j zbiHzb-0kh8l&s_d@cBzPRJJeW(=Z=TN(+iG0hMX!-Y>lcD*20em7hTx_ezjXWYL!kZyA z?~p%&9&g5vN1`HYzTowzyOI@dzPX*Hh4r1-O*HN~-Rrh#Pild=yx{n{uUy5cjf~io zo^|JdXBk@FMwey1D(zHxBr$4K<)a8w*H;N?R+pEg451cL;9~3ixZysim7Dh@NK$(!~%!oJpzC^M|(fSg^ z;Xsp3-VaN9+4248_uf@G@dC`4?(XjK+I5}%3@fd_byqQG6Gj=r)GKL{wy*cig4si) zt!uTJbO&#DiHbP)KSn5RI&fBz(9S|DTj>9J?-Jc>V2`|dIc~$A>PV))jIN-Rk{bV^ z$k|8+Rn|lRd4bc|1>ezS1@GAeTg;aRd1N$L?i_^V_5xm`jr=XYC8;X@@H2Nl!)jngjWjoTz9H^9v?G7r_xKkqjmi%fFl+I zp|z-%pX>w0$H6($F8o%%cg>gxVjNrSG*}u9oh1lV*`oSeEj^cu8NlD@UjCgilv(=!S%AxI&k`uKq0hnH`V9SZ*TSnawR68F z=cvp*a4LJ8jq3zyt%`ME-{|kDvGr#kL^x{npPc*flxocqhS6LM2 z9XOi2GEy=|avUl{9aH!g?N6gpDa%NiqMAs+#`sf;4(p16j$OiaFyhmsTOh)`z&6qJ z*SoKSAG4!nns}xyW?X$O%|2L`&xl$57N4kE)V?kl)F*PetN1$cjW20fkM42wW-6PA z&Fh@bSO6r1vRs9avkhMj5*mg{y$^Lz#o$4u)*0aQnt9FI(9`+lov}Jqq|}P}>;!Z3 zIZO^^?%ytT_4GMD<2v+KcUiU{-v;F}w``=)8%BhzOXZ+~KSCvJbP8vo`Cn%Gec#0R zeXA2F_dWuDMiDjdhL~?4pOXAtl`n684ZIE;>!1;v@0B!L5A!WCpIsg0C#^3Bzqsi_ zO~*2Nxu&dOoMR2H_(uJ_cN@0w(nPv#E~p1Uc&OXk-X`8aJo)J6fmKw2jP*B}%bSH- zg%ub+JV4UOm=y_0YnkXi1Tf{jFva{YyU{{(CX6%eATz=qI4x#JhrTf0hDzA|3lXcK zKG9RBDssJyJ>**>dMci)7-7NhqASTqhilBW(8pn$3Pl6Pp8-JQ{A>JV%T8lfIvs{G zw0koy6;Ok_hV)N*P5HONWI>4CxyBQ0pp;=A)Al$r!4Xt?fLfc`(buIup(R|e6%}i$ za=iBP%_SohDOcqRD4iIkFQ4yR83(K4lLv?X2H1gL1rZ#fKHm1FM0`V?m3~%*8)_f_ zABdY;aS`Fxq%bl9pj7=XTxvMa%AAAHcPDBqWrUXl5L{bJ6^B?Mrqd{+z3rtazp)-!SUJYmyFSij0Yh znDNHY^K{J@LYB)c!m5;3{l|%USS6`*C4Sb$lbegY6I0dZpq<2T4ppf^;i;oVlSmz# zOML5|_I>Xox+@HK>V)^xvlnBu8x1G+H_G>}y30%w_Ji)E?^i%F;{d)5$ykN-ty&%u zIQ%YVCTzJFPYKsZaP+>7R-;U0e!Qn;**d!8VkSz>J{IB6SC^0mU%5pX&Bbjx$%Jqw z3`426#R4R;b#X&x>6OVU$H}Pq2JCM8d-ipUN2E7Hf8L6V<&I;;-EsRF&suz+sK3m7 z>H6CUMbL=T5gmt??fTDhn@E(9-Yp3)rV)i~X_J%d3j5c(gjJd|B_ntLAI{5SrFIzm zO&BeGGh(rJpJ7t=WUoNBMqeg-by+D9){p?x{cT_Bc*{`URud zoP!X`Ydm_p8OE0A`}SMMN`m@ni9pEWZGt3R{3ZNJ%GeGFrS$!^4m}X$Ck^RBE}GoY z5btyNG8s|0@A7~mq(WiKAfe>QDa;pFou6WCRQp}VL}Q24VdG87sbtNsFsnT_^k(B{ zaS%X=@U75N;%(T=re@8GeSYEk(ZwaRFDqkS<0ZcSe>9y1P?lZSw&`vJDUt5(lIJwF8zfWCwKh- zyaTfbA4wQ$#0qVJmh1F`HzuqwMt@x$Bb;)DK?)9~ zVf^(e!qWzw%|_DK%)SDTphX%9y+?un1O=pq^S=LQtbg7(4O$w*_#yF{yhP|g7W1#_ z!awdY#yw%VZ{e|yGb=`NO(yQ*aA!q@+egv^Rqr`xg6c0+oJha`H#I~661T~}d8REO#b4;he5fFF#BPzPo2-(LES zsh1n5U=8xG8+xJIhf^z`dp#PR<{?N+NeHBvZn*vgQDgxq%=}A^(Crmph>YaI zKI$EXyr6f4RaEZg?@=ia^635L;l#>3rn~$h)rNU*lEhveMM=#Ib0mk;Kgr!^I$vye zA9?%K1=O{xUpRM2EI*(AbGDp@8yjYEqb2q^X!COeC@CUEoU#>x` zDazwedAz2qm@H00IX^N36TMYQp0>HT+xJC4q8-)eS4*xM0|TD%nN^S)Thg1NedFUh zpABH<34kGW#mP+1f~nVL%@!p@uA20C>NobZGyzKE59*+$Yvlr`3^g(CT&M+8yyF>1 zUC9!J!#V3P+YZ@K{;y=a-!X){Hp67|ms>zQLwt>)B=r*=Qt_WRfw;_}Z$-L~AC1_n zz!6aqDGPCo23jTjP#R76IXuu&i9ZMwvphT{W#5A}_8?SvOaD+MGbikS3v~oF=nVr+ zVt?@D(Sv9;w!LYJ;IENv+xe_Q5H-&#{j*;1`+dL4rH){leRfPtOjx8aH48o{nV1Fk zts0K6P^za=g$HMuA5Ue-*V%y)u0A8J^bq*@I)9=4*?kpPR&I}A)54YGE^5cdvc}H3 zMpbJ~cU@mbbrAgEwNW+HF{8!76!q>AN-A(`NsA>_qP_e)DTz)YEI;$%g~NTzD1UG! zqYUN)w6%{g;#OD4&-aLdT|dmlKYasCqId7!!J}&B6wuHO70JYrhGp&3L_F9UoxtbTk#Q7dV$l|Fa7h6bZ!s5PlOmhhK>jSgv?kqFOhuyUd-KAU@o2 zU60{w{FY{!Fnu4{8*P9^!`9BSW6rp=JPAG=T5X^bCx-UT-Crz2c9^5;g0~mEn;!#l zK9!i)6A%F}1*+zeTOT$NXGPBd;yDx4J?~EK$>R$8c#YeGoZJad+E7W&k&*l=)sM^* z+v^U{O;9EO2s3_eE0{=3=Mf|^6gAq-c&6Ps?Cmf^qVW>EMK1U9Elo93e%F3YhB{B8 zglMoyCpc{2X5~W|5iGmbM(?@PU!$NRD$F|Dzvh`Z%m4M()@cSSxkLaD{{Q?BSORV9 zzbT)z>brv>Qs$!scyaf5KMa}Ld`w7?8CH`Eaj13TD*`D7DG9^nmvS zVPYjS2D*Mq>jY{g%FS^?t?lcaLt>K?YSe)op?4TLdQHK|aLD{SQxb7gOVbk&nTWS? zR3r(MlI7Qs?Dl?VEV-*fOo5GKLp5d`kjGP|A?2hS^E0 zuog6%Ws3}K-32cHnYF&EgIL_~532*a0e3Z!Ud;yoI#e`9UHR5OLq$l^OQFVlN`qd# zoeb3}7t*i8>{YJ%;;OdOP9+C?zW-GD8zY7GkxjYKGy|y1mhzEGc7D|eizB=7~@=zeDw%r-rC5I+VMEs}{;Y88oCB^-! z4|@rOInif!37!2mqLe6u4>9foi$JF-o^J|lf!=bFTJbO}q;6lR2z$QJrB3jqE1Ks; zxIQ8Y>t`fvIoYu}+R@X-PWX&0@*p2OlFIJH@l}q99z?JyxKWJ8; z#n7iRw@=?p3Ai%dT{BUzbb-xeWQ^^Q@YKD(whu@*aKF0i;UiCihNt15qSr(!anNuC ztt|(avgM_9<^`$k*8Zv1oAf&f_Tn^eWVP!F(C(<$KS6$CGb_uwocd0 z--l2YzVZ3xO+f@Kpw$a!L$eBfOskq@m)_CBxuuUzKm-hW4BQKHTciQNV0L#c21y-M zShQ;naya|-TeV~?0qB7(i`CCY=zjBD96E+Ow5F%G#p<+|Q~FwndU*UNy zY(u%DN86~FaBkfIXbi$PT5swXU(7nu$B(6ZjvE5Xv2XLq4z+HR=d@(il7_9I)|>X92AxwCnL z`uP9^o*9#TfkADIm02gus4-Q(=>t18zX))rlcT~VAkIKxek^+I`2K6P?IK(u;QA7;Y#X2 z&P$2R$Sba(+-s!zEKF6Jt~dhnb{Kv+GnlCx_m!|zEDV8o0$5BwIeC*u5@25ps%2yo zmlf-hU$PFc4m2oly(l++E6-Ej>bTHsnA-V?Xb;=h)&wK5Hni5@mywEsAI= zl}yzh(V!%z_yeK8NTe98&>tmchDPv!=>a}dUlfeOA8Np6atL-fD|zD>ZyLqW*sGjv zwE)|#pwjPGN>$r{zHr8~k4{%;l3Da3eG5x4*C9`oMj+h;BU|w`xD2saaJGR5NiELG zdOp#SuWxdoOqp9tO?M>*DcSWGo*5N6;KZ3J2PMD_&N(u+@h_38MyE}ibfKI!eUl4V zDOstEH}r-A{Scr6h5hm48P)xZin8*+&!}(I9Mw|^8dqAgE%i&!0>`E9axCHjt>i z9Oaw^sXYwzd=0!7;u_0;m;WWDZsjR>Dc}kc-f}T zFjMTAnkFuttk`)}E>(a|CJd~gxS_aId2`1u*GKKDx5d0fE8+fR0*l5J&cq2ncq*9B zJEG4I19;@1oWF|xxQgfeR10+h6(3aA91yF|5?Q@1L0ZR)uql{FI%(fW`-dQK3)dJ> zMi5<57c@e|c4!jq+d9CPJAx53e^0(6=P*L zG54fntG=~Ny)_hf4Lc}LrRGZn%S<}`E5_AIFIB!+R9_f8ukPGh*DG6jXlGQ|21v+3 zA)@o3Kg$w|*4f+pIkx2Z?n(F8*;`lOn*|knOaXLFglM-)|4)T;k?2dl{i;P)Ji&q! zsVbJ|CG#zlwo`gesH`aKzjxG@TRo|tUwht>kc5UEbRlB8{$DH9g}@N_PV2)OsB%vo z?$#;}iUuxK5$`kFX}b6)X4!w#b+APF`HvO z*qlfJbV3?ss8P~O=64gFr<|L=K5SeTU6ao}DwvW{R$Oi@X2gVW!O$jh*`>=?8g!=q z4LYMSnKJVZMB4&9iZmQUG+sSsi+5-U_`xprwn#t1?0(M8sWE+@TMEE3m_Ku$4HN>G zWqj@-tOWEw0Y1fqyLBW*eye7v10zQng4#kaan(@rQKO*JOl{A{O2`k-P?=$h0xj4N z(I0@-U;>n7P@C+;wxI|%W(olYicyCFzuFs9-I(CA|4TOv5?C}uyJPBDHmN+z z&AMai)3u7fH|ke+L>HdLZiYId9r1*;F+O=@5~9YHt2)jJ^mKHf_&~RZTsB+EM<3_V zLi@yw()Q)$0*#h8d2e8cDxGfQ91{Q6>8T7O##Zmw(_!-)^;|J>#XjnxHuuuTf=>jh zzZP)U>a0_9Y%u;e&JQ-z?`P)=CuG(H$LewODK|rf5QfXyv7Xy~8U`_8|Oh zTw$j+*KWzb#duWZYKW|nWCFL?(_nJ7=u;i*U>e{2*6_{Zy^i!jddF?EnbXxTg4Uqb zgY>DzxGnV{g2~t2-LhKy9Dyg$03)8N?S^5)fhTs>afABE?>iSL`m_BlL8E$T(nRj~ zndPU!lFAI4pa5S7BunC<(ZN$EcWHc;J1M2Ea)26W+~sXnh_@i;hI~=v`%SutuhqKo z5IKn|DKA4T5VsCuJQrFiOK|&%j>K zYl)T=UE)VN_Osc!&zJ1i$LC8H@^augX@)WWOb!mgN{Y`Hs1&UV#%?Q>i>F)Z{@W{V z8M&oikTYRRR~+DQk84uP5G^9Wh!7hXx$+qyI@_-2G|Mhqp;0PTQkZon-r89DoCksOYqG78r*DeeSg(~tQAGT2$!MYjF! zKp+Zbz`w8?)?>!|nlg1%6B{g)59)&4-@y$K#kFGZPU@`Q4Loy8QpU939vKHEX~`+`!fUu32feMC+UXYmestQmCLcW@2TrIC6I0v zoo(v;hhgOLODDHy^dg3=IS!?6?7tYfeOJnnL{HNg5tiqW7mkV#*9;?#8xPRIh`LJ9 zW=IxAG|khYk1RXO%F2Q}INb5Z%t0(fNh%U#oWVP$As`B)E>xHlN_-3VJzBI;UFoAH zTw=OdY~{K6e;pX+cIZlhM!!C&f6btCa6XX)_B3tml=WSBWZB9Q zu*_>$gU`yauzEXalC3{v(;BPwf%#IraAy(kp~@D$RQ8$So$8~)0QGJi9gjqfDE|-sqKVmW zHSkDT5ty$*_W8sW9HJfZRNw)Hqa^wyxANm@++yTlHgS3U{e|~DGc5F7!=H^L=Z&_% zN}rdx3ytC9uATh&ND!P)#_7@Ufqz=`i&dL!eHOU8DG^U$C0&@JIr9jbtr`z+1+tan zVHZWX<`6=H-;t7T>uMIPybrcBBPW8@8bLHP8pkzGiCBe$ZQZ#-yjM@}-@q}yD!}SQ zr`e13&;0gr-d?jwGErEZr7%3wl|J`Pw9p^)K$B+m6D(s3IA!i^cbuFbDkg=EY{Ta4 zA6;&rqL3^BO%dqDhZd*tuwdANWuZC4KXj+2ntj*@>_i~AbB?#Zq-bgWR{Dt;(RJf^ z#b}KC@5qf&68Th=^-`lJid@DxbW?gUshG@*Z6I~PTk(F-wEdWRzQd@OqD(hZR@M-n zg@n4)Fw0r!@&w8%BL_F=1>qH4Ah=Tf-0R@OYUQGn726nv+Fh|+2of98yhfk==?Y{dp-rYL8GM!3w;k0b|4 zk-JZ+*zRNNMm+*{FL;wJB=s(YvCIh!Oz}brGJIwG@!da1*h#{8=f5v^!{-`p3c%{u zyS{aU7&CyV-(;yu6ymF1$HVj<;Yy)owpk3TwhLy{==`ta>AjbusiSXpY5Q3`Dl*5> z*3wckfR@C^*mKIJFZGZd8M{SySM=^&7E;ELG8a>2&zwN}^@T{dNuZ(}>+@uGA9J#a z6;~p#A&fEKtxbkkhSEkkkHX!627bX>PP9}&4Og`zZo7x*ydxuKV%xXC_m7TIWkg>Z zV%$41_@Kr~YlC^CWz53GHdfbX%`?doHH0M5rK%)C!%unNB>Jn9S45Mn2oc2sNX^Ld zTd5A+Ns029xnA#^{qTm&<<3ckyhw=tyH^VTHIQBviqubS4wkUR-`5#ip*a(W>AotO zbL}XYy|7JoM8E#v)>=`kVfC+aw0P-g{+CB% zEhiw`QgVY}NdWdHN1ED$%~!;!Y&_qo`i{~^AebAlO@QnR?Px6NOa=A1s-CB8^I6Y1Z83af^nA*AXq% z#lpI0j_XEv3XEd8CImo_g#m1jXSSjPH85IVYS32FN}I{*6zcD@?OBbVpzt1l%-6QRfkP$r>qpEFnNtW^Fk<$-r}r(=^E?Q9 z8;f#~+TN*e3Nzdwxr1g=rl@o6RgFC|ON=RW7>tQp`MhjTRtokuaup4V*dO8?d4-Rw zI?D2yDy0i6u?(hG`ZWM{3|>({Peins%_mB3l@XDZ`7JDkF$?;}VNxU+X|F7;E6)1P zO|hpk31qqn%J8Jv)Ly3kc#rdX-vJgw-icX_9C@yLh)(lZ)Jto=U((RfOM}f7)4Pn| z3kIugU|IOvu>6T+GV1j>z#4!yy2G6&vjt?LDyd%=#>pEtbzmKe$gIv<7wYr z%qUrQgyq|~CQMpDTF?t?@%O1gXG}>Pd^c>tune_W6+U_*8dpkPGbp=h)624!XsP*S zOr%y;OCnf4{p!Gy@i;aa5YEVSP7v*zHKhN32U>NmS;u@+4T%YjuB(PO0Y)-+EU5Co z1N(lP{#`FPDROm23<(ApTRKHm`hiGMqAtXv5Y>^vsxPO${{&axBmethMsT;HTC5)S zr-U_@nNe<7I;{zSSq+ zG0*v3XRdPTziKll?dJO>GgCE?>@et<0r@Muac_qxe?q$AxvyH!-aI zy#O%If}LU{M$*Q5&PBFV9Ur+>EDS3Ruv`;{ za(w|g>ETpAf2ZQ0cO)X~WdpM{Rg(auB_wHb_@sh%Z8ANu^fvO85^ry2n|E)?%N)&G*)Z&CZ z_kNT(03cZ_r=I0eEO6wVdxBVGx^y@u{YXTxOOTho5DA)WIO%UppoO_o z1IA~Tybk@)a&R8Nwg-;FoGj6pR*urqDH-<*Haa&e0ALRtCOI?F`y(g$0#t00-0L(I zI=1eI+JGl0^?J3JP9}mi&&mr&m;Y)sJ3aO!?&y`7Hsb*77+gYfe;j4^_Q;l`=2#_( zeF@I_PsVPJje2d%5`P1by>$>ZzOmGRu7+I?nD03v8&dX zu&n&ky8mV`S$7xRD#7>ft(8liN8I(x3;m_||5^aRr3R#U`W!zOWhT8?GmUd^T!D6F z^uH}U4?Jx{0;yZY`NGT`U&}bZ8h=lSay`dlT`o=7arqev|t&&_Kz+2+q?CKC~;B0#bm29bR8h#CzYiBL`sKb9NyX`{oHw@(?|+5kNpE z9AM+#Sg`HN0>Jjb8DIjO29;A(jZnwz{ttGRk>JZoKnCBvaA>>b8$^}bUA=kjyl~jz zIH0h?JQuUzV9dy#A*m?i6G*qP%2p}n$PR_h*sMSGkK>G}sb|#@(FLf-{s=vi08ToG zV!1DH`dxKT(*G2=02OIN`?!VZIKy3WSCf~UmbZo^5(o{8IGl_|Q^e3~I)UoVSoLq(~+S?JZ@;Cwn zXbv_uC+h@b&>2%Dz#mLzTl=4sWV5IByQ9!tltsEc|*~DC&k^# zT*i5$Xnip^C<2OH$_G90K9GwjY~{xgZppRVA^}Ow~yvCL{x)D{? z5kO-b*t_LqLJaE!iqD}`qqHG8s^j>E`t8P%fT0;?Jq9G*u%VTzzdDw0TN*xZG!z)) z*~scU)W|Xn;Vp$}m!sJ^YNLS zeN>ch$P|-^#yGq%Rabh5Rs88+RfEIAkobXvU9PpE972G_Z6Z53T@t=nvXHZAyv?QZ z#K4IoXE?TTEa0&jA3E!Xib3J!j2o>8EtUss5yMpEzvBx$sY=h7yA_lr2 zm73MR(GIXZ@ zCATndFK{4(kJxNHwtQW}vqxilekV_68u`Fo!9;IVPYdxFHTXYZdHMKz&4K6sgZqLJ zT^O)@03ypUm48!}STj2ICqoim33fL~wr8g!NEX=X{N7QX)l|l|p0PVHP+xJ_x7UbC z1s=wd&@`I!xb5Kp=owWw*fY?!bsWBwBrD65_t7qmf&7TcBfDs&KLe~oI7TAK5g+Z5 zaG6#YF&B=G`xb#{K1sc2avznF=@L(j3zzoLK_FmbTF;5`z8$?&z;@-h0mS-q7+Iqluz+v^KiPR#*+*Or?#D4OD|GfDq)?G9D*_ ztOtJ@uR9qYmhw(BW>b!v}Cr+ldnQ4qc z_(2OFot_O5X9)CM;)BljG^kUC&9O_W2tLkBCaGg5w-)uAGKi!ku~jMT_xARJDIfhH zu_;zBw}->we;Y8?kx~mBhTX<-Fi?q15IaOqfMT`Q6_QX2W*|}rNK$sneQq!=(-1Z1x zl2j2oeONf49+H(-)Zu?*dP-UuzRf`2;&Nn+d)(Vq(NGCGBJ{?3U?j+;;D6o zLw?JAsx@n8O2s{do(8)>=vLuFxz>0dKe~<%=-Ik$IC2U$T&GCBlZ$?XnWA#qVhY!e z^yN_MHr!2wmCc!5^im)kcB8>ck5;}xGMk$8So{xU$HcrOSo%u~)9ucG+s&2Q)y;Og z>3^nYOw}aLS6EH8OF4SeghV(`DF2JPbaKD?k65M8M(~H)AO6fy#DyMQG(N<3?k`B_ zTXZ#Z3W11BbPmv4Rj!W-_LiVaCsf5`YQ6|{c~gQal!^OSvL5I&dykb=f9Vn(>&aR6 z{7nrl2Z0sVH4~)xa9|)}*^8d~<1UES@Vq=`V(usWzvU<~Fqv_9a<)7P9^(pNGpUsB z|NZ+RYfksmPsfi_GRv=$9DAbI=1=~(hC+?=Fw~NADM#-~Ny8(geks>2y%$ozbzDPg zngG}ktXK{q$CSiTww1rQa^?X6-AU>YKm;K0tdqE#MV+abEXJ2RDjf8!ZeRpzhC#%E zG-+VX1Fso&ICI-V+k7}gLpKA0WG)Kx8Yqal z%4f#nq^YT?dC+-tIREvl<>lpx)0fro{Voqy*zYSU|LvdN66yRGi~~%iZC4N3ze#xL zbe=D8nWt5K!%rE1xPI6i&`;F=DZKlxnQ3hqm_V4a{D@k{YL`gExQjJw5tQS$7RV;O z-7&4-uObBhVP<7b75V$S(81Yx6uGUvJ!+W)HDaolI{`d>N$m{86VsJ!Uy(X5JUd^& zbO{FVoue>%N>Vlg71_G3r-$^NvBoxdxbzGR7(s=;t>jxwI&(M~!fW&%RKfj6E(Y+Z zyR=nRUL$bT5g<_sqUD7`XM(d%RxS)EsBSQK5!Q&3%2uSYa`b3+@7(&>590QeR_7gQ z8MlA{VF7P&Df8F&oAg%g^I6SYxrmatwzh1NTvd$C>N)yHjyR`^!L@Sz{MiIFJ|P1G z;yw>Qw0s^fjeMSNt!x1)IP&O7RA*wqd?x%$=#L&uZ1Q6%qM${WlBtIHoU9K(Xv)Youh_hkBG2xa=J{< zejiW>w#gOQ@V4wC@oDzjf}~QlaBx+M*Brn|E8IK0t=LIl`Lg@#3sLHeDImq4a2H^% z_7v2w!;hG6GSgRRTw`+H?xF`@QIU6iHqhUWYsLP}nR0M+OxCW{0xGPv?d_V$g?-NW zY-jMZ;^N|eVKsGf_9cBG;f}wTmyWi!wtVjnD={%~KMl{>J@6ex(v-|{CQVu9y%!0T zqyll0ShdY79kwG5{`~{(I*A6%*<;;es==U+B*|W*5M8DnR)@y4Yw1w`FwVBut|hD2zoi^Tob+gC_#$B4T_GZ7%Z1 z{UKoUMTt)1F4v{0(^KNx@8pDf1?*Z^Ap(cL{I~Rw7vSy*AKa_Wf$uy56UO|XZi@jw zBii;Ys^XZ%9G_Sg8vY0c2|mJQA>m-Cjy(CXalM>zx38AiMcdo--yoQTSPC#Fmf||~ zBV$Imy^|1?E{w3T_zpF=dI$>V4o*%fK=$#Uu!B?10J|ckNp4y;n^_CEfxu`RYPrpt z?wa+BCnBVBAe8dhrXgyr&ojZIiXvHEndkxz(I=N*C2zEXL{n+7_ z$mhRRyO^QO@(|-%9dNF?u<7JOy-7xfl>TZP@Icg^dbQI#`mIC-OhwTmwZuGhNKa^) z`){nN}U z^drs?$Q@`mEFSpU6%F_LqqsJc!BdEQ$1dOX-=fOcpHUg#Kh-!B70oqUDgdoIY`ZjD zYp}e_B8$9+L|4(46OUC_vyBB}>7#{G6}+$SeGwhl7?{SIG*vI%8(hdYEz@CE20wB| zA12P2NzQo-VMGVUzO%jvq*1FQTwY#=?3-7cvsuw387z!!GDA^sa+bsEktQ*-`QVVj z6#;gm6(7lmD5YA)uL-=cLP4WSfz*a(x0Cp5W3(+igfV6kyQ!k%N?e0QxSy#ZN;*iM z=Mg@K(n(MGS>A=;Wq~>@4wQ&c%zE@h}4#IZ4`Jf*Ma^lDuYCtqs`$f9$}%3PRM7d zRDhEisWcu=<=bIvv+grl5ZLg1knS*bULSJ#u!^06yL0sjD|8@ugX6;ru8x(TUnkC7 zfK*jY&B%KDxr5+)=f!nO2HkyV@{XWvSamkd(5(|pYj!A0peZ;Ys^<+#l%YVCOWl&& z428L9%6k3r<0k0@0e>9-&zH>1%(2}77%(RdES^V46RBo?-fnKVEc73OEpMC3vSGhl zHm0-v8G#i*^^J_=*&F*jz3a-CQqxvd{%Me*bF>ZT?7^3OD|h(!FM$?pTmlSnSi`9wp}8C zzSZ_8;&{zTea*$%2kWJ)tLtrApFC%0SA#l!?%y0tC9-%uen$=YONww!QDiUiAqAi) zh+~IfJTtLO0$8y?czdSwJaT2~j8q#W%6oI@F8F@UZ;lePYZolCX2~IM3qOxIakU-4 zfA>z_}j|UlAIz*9cE%CME+tM#t`*&!_Ly;0m&0=umy&Y59m3KmXtAu-F-+EOZWq2 zZ_H!gj#(ypb{cK>ets`8)!yMyE_45H2X(QTV@~#xwCv-jNY=yPm3G@2a*aB#Dbiaa zEbLnyyzU{KOZwq%;$zb#g8@g0F|K6Sn4xAl+f;YfVg(^~TmTD%R`8m_UmUKoHgN)n z1lpgj8~`L_IXrh; z#yC9OgNHB;-(;ZqTFC|k``W6E zOiWl`14ZF{peY5&PjMa!0&ejwcp-Ma`E8f9fHV*)ubl|r79(uQvADc_&BnEX(L%%Nu$A5SG@nf-G}XjUE`+)ST2dHVmf^~TRh*O-z80Z*-#sKfyq$aI2nzYjv?Ed5pu zB!8R(h>4&3E_MhmL}u^M5kh2rnUXC&tJ*`yW-4S9!hKL*IJ?KT`NY~+=yg{`b?M$iAR1eG)KPRF&m2mb zgK(ZI%*(3-AO=~18)uy^gEO82*;pmMxHwyFzrauP0)dwr&wWXUkd>5yn)~&#MJIPA!)3m- zGe=0K-W=(~So3K2)tFYgz<+I~?7Z`Ns+VWie$LL$6RE5w;&Re3GF-oJ4rKU+gkmJO zCg~DJnwy(l{rn674T(|hYZtQ2DoB^{!f}lQN7B?K@uzaj>c6fmFMkO*@EZ|a#x(R$0j^YGgxw%#sj&DNh+48NPP>0o0Rv~7D+qeU zv5$WF2l1;w;W{xHqB?OrLG<+XqrX`*{l+~V{tEm3@Hw+*bO``&iMlDNJesO(+r-Wg zWhdtSA(pTX?T|9)M|0yT81eZ}6l1mrIiA)IyW!co^7Q|9_s^euVazrNh!1gQ?NU;y z)ZIR>0GtZl``F;R-Ly{_5rb*3Sz(;ZfwSLQTITlOw2lB#s+3s{`f8Lb35()~Cx;;p zgzE+|zT5~}ggen}o%kSg(@T2pK-#)4fYj%k6nVI-M55hAfBgP{ExiuqOQ)3f%{*pf zx;)7bnB4()dUk3YP#pWCVIa*piO-A3-IZzuruL^Nj%-E9%YbgFrWXX%8KQ_nK zIywzci29u(PW6Ox4I3IAPL~(kdTU2eDYku?QejI7hu=E_fC zTO~w8m>ZetK`yJ0YBE%^4!PL`A;KP1Y5-+ql_5HbD)08DWRZN@QGM(>ddBYUtt;5D zq3H^0y@d$e;ustrNK7@@}^nGev!7a zVztf5q(g@@4R3S9)M2JNCSh=bju zBCuzbr$5a2*X+z?lYCK6r=r<-x>V zD=Vub7b-Q!`o*?hG`93*4CIvO*wpc@VW&GLg@TaItZk&9{vVAnQZG$i8OR6n>L)GI z%fUjWECuIqxR|K>FG;FhLDyJ76D8c;=VE1HLAcnGDAPZmi6o^Oc?8LBUa_Tt?|S_= zI2b(PWoR!6^_DmT_7aGj|c7uSxm{36hM<97NZM}rMK{7{M!@Y zc_zop$@8HHN+{B~gF=;eUS9)tpDyuKjrFmWtxPSjcU~)1mZ88k023gzvy2>%?8}8p zXXj=Szi6ypc;?PM{(P0~+_)Cff=xz_n4uLm8CN}){bsX_>4oi8ETAno z0)u*V@`}GPQT4tU<+@ka8^O2lSp&XG@undttHpIA>%cRG8`PGB8xYtr=XwOSUnsO< z>k5R3)^OD|0Ty-*U%KT=8rZ}d1cknFJkH72omr~)1U%ytA!E`}6Xj_JdV3?e#v-!> zvb-_-mzS^+XeKOA$_Ykq7Z*HSMvXAAol`0 z^_yqFMIh$Xyg*1hU+N8vZA1A8!e!OKT3W~q_MLaASrJKJx}d#*4O{B(UgtO0xO#!U zy0u)6^%a%Oy?>Q5e+~dPK3+>8^Iev;CX1emq-|VMYwThm{9(=lGXryzlCa>9c|z=O zBHPPD?Ba!Mj)TsO(MB2AyA#K_4nJtgLC@`nLg__ocECF6s)LBf^-+@W;1{nO#xB(F znd;cSSn5nCt2)S*5Smguh4pvUAFo~4P7k+622v5q# zkP~eff*kTmA+z^jb zupiqV&P=-%sm8WHe|aO+q3fte{|8ym65NmR!0!*cI{+8V)8VCOEc)Ep_2q!V(N}7KQZ}@w~5o{kKpm z%0b_`X!*z@gqVnwc*x4=_EK}H9lp5#>A8Pk6A^h&LB@c_S>wYlSp$4Oh+{|U8J+1V z0@k)Z5H!o2pX|f`(Y|d+j6Q+C({1yK-x(8ly=*Vfi5)UKe;MjbDKle2&s#|WY3 zRL@MoiK==xK|sK3`LZ~)3^P47l?*6y@@qEi(GeA3g840I7DKfw#U#sr>GH~s^os5_&j~zDQ-{bTk zY45g$Fw)WG)OLgI!1)wQd&L}vnm}wHw&cIa315_azi=?4iim5nR57xa-Sv+XW!}hA=6{1*G@G~9A~lK6)KA$;FWp5MoMNjH z`a=hz%eij%>D^=e(BytoRRE(d_(CyL|9J>3vq*ZoZl9*+L@8+5n=a%-r>|~qTmWSU z$vV|dXmH6#h$Stv| z%~#NJ4^OcFY;{|41LvL-GCM z*C_S@IGDx_B2akjfnOC}xLvpflPQ$khS+8Yvt>|U4-bnH=&bRvH$Ncw|5ko{K)fAY z)LDQu7-V#3gBBelmm6(SQfJ%9TH9B;6;Q$b@xx9s#Sr24^}3uCBcfl@ixR@+_bmRT zI%qx+_RZ_if9moPEQ`e>toMqrls@77?F(+Q`#qu9*~Hq7Jl{M*dU&UL@BN*g1$~*s zt$)qx>}o!vz-s7%8a+r#(XxXJWoQy>YHLTCoNaE~-^GX|(JmNR!L#gMCll~$u#+g)1Me9aiRjamt*>OB>Di&O;SZ=X`3-AV zC^vGrr>0wi6t&3TSXaXYV5jC-n;$Vo;3A|_gh=^lb4yIo=RXDbW8RXY$(l0g!HnAE z$xVe9IJ`+zAG2EhRMNE|kuC+@7f9$Bkvn(Pb@vYPH^biU%D>S*mU0zp0%GhbERtw- zL{n{UBT;jOEhu4wR(PFkp_zlo(VeZoCZv#5^Q& zVuZUL0UIOfg(yDc} zLyiV;=7RjW?r?I5d6v%+h2@FkwNhn9|smx zzdCrDdhYBTd8&gqrnl{}69bRWucj(46;E5*x|HJ57^Z=t0XgG-F+Uny`UPaK%f9^1 z)7ZnhMwm}5cOU`vNQdM-Zu@MI>&M_hM8c?e~q zYR1jS{utg%eLE$}TRD-&AmestS5E90CT9*A(rfs>(jU<(CD- zo%+4zp>X#;o0*Y&Bb31R9aEGy-A;Y;^VW7_%L>t>wR<-T4$j-YzoF*IxDb07$s|>E zz%?-=aN%x?n&BIc?v1BcaAtaIQ&bhP;kyjkn9Tm zgl7+Crl$+`v@BLA3%#y(a%6gxO$l!r^#+`ujWq{&ws_i;G}LQXCIIr7p+}~1Rh#US zH>4aCND0tP6;6zV9_$q0+szd9tkB z1Eo!ZuLZHT2za5TN*;&uOE|=S@n$Q(=Y_?hGY2uk=V=FWTu(FB_IwLo4IH)%wM)nA z{ogn*{KXhvP3RK=v3(kKC+aPP?zOpCW8%;2?2pj1NSz{gTn;~=1O5(1V9rIlstmKf z?Cp`G%_7Z6!szhNc^mt@6+x#V@(}m-mMNK^ z*@NP}J-oa?x}tpP0zH@`Y$6|PB(Lp|OOYs^l`MhTSPJugKj-h%loFDl&(pH#Z6j4) zyuCM8XSG@-C;YJ*zoDPDibgt?m_w@tRtzuzHZzbYx$##ONUthy(UgP)Qw=wW!UHlI7i{`j{NPdBV z#$aj9Ra+GzjUu6A#iuUn&IZYr?B=Jm(t69(HHQ*A{2UP0Qe zk42O@H}8qNDK6i|N*@h>eY=;aXJJVu4Aqw=#O!flyHA7y#ESe$>+9cqw^+Z#!VmyB zRe`WW-Dn!ZSBLdhiNb0h!~C|Vq*@`3EkfwD8%!P+N^BpR8Z}p(SrPBl_aFQtZ%KZ= zX&(n=xq^HdWQ8QS$&8~B@$I2mzR%9i-V1l2W>VmxECuUT1X^&Qx>mMtzF(cly|Jb0 zxlXYD$LH?&ElWdpw^90xsR$)b^7?={6I)x4o`CW0^Ye3>l~wpR6Qalez}y$KZ2ibv(is0#?tv#yXf!rX2m(=3v51wJR!2Bm%F=SLf>K{4mJ2;4S`X1Y8* zi}UmI(r&lQ=H_O_8MkH|e}_CzZ4Ju1?k0~!rp#dgIot#58SInXYPG@|&7RU`9FHH@Ix$P@{avCFD@=(Q}KL^cIMBvwzkUV=4PzT>FMdCB%d+|Ajnj9vQIy} zr`ye%qwPD`MiYo|&8{)jn;AQBA1M2>Co&t+QZ*=Jd1$Do!|v_vg)gG{m*#%bhyo$Z z3U5ka%+If{ugmxE-zyQ!JqmITdM=jrGj<8xh+$`P5wHioPo9oT2N~&u^&;eCM5I=$ zRet~d_sVRF{r&x4Dr~cy=p5SNjdG4nV_sh=r5qd_ge)&h-ubeyhjw>&qa*0?0Y(qO z6c`p}jv~1QrwW{cO~A7lAtg^B${CtNf_Vl*0+H*emQ*RNk!qQd_E{^K=~EpPb6Fp|xzadprvux?bzx!x1O135AvHWk8N;@pCy=y8Qd6=x7+QqwY3%1%gxPA z+27x<4j(b6k+v%0R^O9uEaVSolYl`wpqD{S=MM3_*{AsL@rOGMR!3s z_NgSwdE~O^XY$-uSxiQF01X z;VdA6ZDb0db0L~tU%!515Jzr;DumJ!O!hk7VGQll|03On`e95h?8a;90h=}4BMO1 z2hwQLvh9;-v>DR?FvNuy%;nv?ca^9x7!1n({(gD+@@4tk-~RUBHJ3OvHokoM5|uy( zjUd621@G+a1e2HO;!=+3v~KQXu0Ii`-EPMnmNgA|0IPF~969)T!ZFu}Gi>KGoOU{$ z*Sjg^7MkOH1YT>(`~%>%}t-27@vf p49crlugd%P@BioTfB*YG{||_wj2@Ejx?}(V002ovPDHLkV1jXbh%f*E literal 0 HcmV?d00001 diff --git a/companion/src/images/simulator/JumperT18/right_rtn.png b/companion/src/images/simulator/JumperT18/right_rtn.png new file mode 100644 index 0000000000000000000000000000000000000000..bf3d51d7da51548f4291ea334df99a4f38fcf1c6 GIT binary patch literal 36822 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 literal 0 HcmV?d00001 diff --git a/companion/src/images/simulator/JumperT18/top.png b/companion/src/images/simulator/JumperT18/top.png new file mode 100644 index 0000000000000000000000000000000000000000..3bc1784ee2860dd9ffa705850dad1f93983f6aa6 GIT binary patch literal 439 zcmV;o0Z9IdP)B#)F`Hw}IF6?V%{>&{k39kQfE~Hmm5|HPEyeXQZQJ&AA|-?e;5vE) zN_X@X^yUh9nx-H{Jps)H0C2?RN3{(nmGbbJ13-LD>;e#8Zhw0MfLyrT1Fn1*0{{TF hH~|9y5WxEO-yc}D#MSsetupUi(this); + + // add actions in order of appearance on the help menu + + act = new RadioUiAction(3, QList() << Qt::Key_Up, SIMU_STR_HLP_KEY_UP, SIMU_STR_HLP_ACT_MDL); + addRadioWidget(ui->leftbuttons->addArea(QRect(60, 90, 80, 35), "JumperT18/left_mdl.png", act)); + + act = new RadioUiAction(6, QList() << Qt::Key_Left, SIMU_STR_HLP_KEY_LFT, SIMU_STR_HLP_ACT_SYS); + addRadioWidget(ui->leftbuttons->addArea(QRect(25, 5, 100, 40), "JumperT18/left_sys.png", act)); + + act = new RadioUiAction(5, QList() << Qt::Key_Right, SIMU_STR_HLP_KEY_RGT, SIMU_STR_HLP_ACT_TELE); + addRadioWidget(ui->leftbuttons->addArea(QRect(60, 180, 80, 35), "JumperT18/left_tele.png", act)); + + act = new RadioUiAction(4, QList() << Qt::Key_Down << Qt::Key_Delete << Qt::Key_Escape << Qt::Key_Backspace, + SIMU_STR_HLP_KEY_DN % "
" % SIMU_STR_HLP_KEYS_EXIT, SIMU_STR_HLP_ACT_RTN); + addRadioWidget(ui->rightbuttons->addArea(QRect(20, 5, 100, 40), "JumperT18/right_rtn.png", act)); + + act = new RadioUiAction(1, QList() << Qt::Key_PageDown, SIMU_STR_HLP_KEY_PGDN, SIMU_STR_HLP_ACT_PGDN); + addRadioWidget(ui->leftbuttons->addArea(QRect(60, 140, 80, 35), "JumperT18/left.png", act)); + + m_scrollUpAction = new RadioUiAction(-1, QList() << Qt::Key_Minus, SIMU_STR_HLP_KEY_MIN % "|" % SIMU_STR_HLP_MOUSE_UP, SIMU_STR_HLP_ACT_ROT_LFT); + m_scrollDnAction = new RadioUiAction(-1, QList() << Qt::Key_Plus << Qt::Key_Equal, SIMU_STR_HLP_KEY_PLS % "|" % SIMU_STR_HLP_MOUSE_DN, SIMU_STR_HLP_ACT_ROT_RGT); + connectScrollActions(); + + m_mouseMidClickAction = new RadioUiAction(2, QList() << Qt::Key_Enter << Qt::Key_Return, SIMU_STR_HLP_KEYS_ACTIVATE, SIMU_STR_HLP_ACT_ROT_DN); + addRadioWidget(ui->rightbuttons->addArea(QRect(25, 90, 70, 130), "JumperT18/right_ent.png", m_mouseMidClickAction)); + + addRadioWidget(ui->leftbuttons->addArea(QRect(10, 245, 30, 30), "JumperT18/left_scrnsht.png", m_screenshotAction)); + + m_backlightColors << QColor(47, 123, 227); + + setLcd(ui->lcd); +} + +SimulatedUIWidgetJumperT18::~SimulatedUIWidgetJumperT18() +{ + delete ui; +} diff --git a/companion/src/simulation/simulateduiwidgetJumperT18.ui b/companion/src/simulation/simulateduiwidgetJumperT18.ui new file mode 100644 index 000000000..1c14df404 --- /dev/null +++ b/companion/src/simulation/simulateduiwidgetJumperT18.ui @@ -0,0 +1,197 @@ + + + SimulatedUIWidgetJumperT18 + + + + 0 + 0 + 825 + 292 + + + + + 0 + 0 + + + + + 825 + 292 + + + + + 825 + 292 + + + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 131 + 289 + + + + + 131 + 289 + + + + background:url(:/images/simulator/JumperT18/right.png) + + + + + + + + 0 + 0 + + + + + 480 + 272 + + + + + 480 + 272 + + + + + 5 + + + + + + + + + 0 + 0 + + + + + 131 + 289 + + + + + 131 + 289 + + + + true + + + background:url(:/images/simulator/JumperT18/left.png); + + + + + + + + 0 + 0 + + + + + 480 + 10 + + + + + 480 + 10 + + + + + 5 + + + + background:url(:/images/simulator/JumperT18/top.png) + + + + + + + + 0 + 0 + + + + + 480 + 10 + + + + + 480 + 10 + + + + + 5 + false + + + + background:url(:/images/simulator/JumperT18/bottom.png) + + + + + + + + LcdWidget + QWidget +

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 diff --git a/companion/src/images/simulator/TX16S/left_page2.png b/companion/src/images/simulator/TX16S/left_page2.png index c104c148bd8b16d10ae4c01e7456aa213b765b33..b5a3bfecd874c8020818e42d2d6ec1e09cac3e75 100755 GIT binary patch literal 32303 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 diff --git a/companion/src/images/simulator/TX16S/left_rtn.png b/companion/src/images/simulator/TX16S/left_rtn.png index 0080f271a83f5fae7adf709b2721c7553d8c4547..cee2e20615267d178cee88b765ecc7bcc7d81c53 100755 GIT binary patch literal 32217 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 literal 48242 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 diff --git a/companion/src/images/simulator/TX16S/left_sys.png b/companion/src/images/simulator/TX16S/left_sys.png index 31eeb409fd780032e2ec4765031d2d6315583945..f7a97caf4704cf6407c396fa7570ad42bcdecd43 100755 GIT binary patch literal 32243 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�MI}~d`j^J93P!VTp{XzLaPftF4EjM@FKTfSZG)l zQ+`CMpe4bq(Am!P=WL_W6H(?uMlVTdK-tv;L)1Mm=oRT&6Te<^IWGhC{%cT`hlYdw zOz7`gb>FXnB?TA?X}t+1!+ye(5(tD|ud3_29nU;+QfQycqiHGen2HOMA_|gW!V7)Y zRIr~dynxNNuj63%ijuF3s3Jtan3_-5@Z|!#ms)gkbXcsCrffiZ7^4O(yoAV#L%7rD zWYvD9Ljm+P2U=sB*a24-0Ro_NRs&7Ksy|pYFm-h$03S1gxq;aS(sQr}?L?hl)#mcf zhpSRE3MWQXi%}^_!C^xfcUsRN#-#BZqS8MX3E4P`1jG*)2yq%TVuk36_c%L*e(C+2 zXE)y=2)m~l&DKKDRNYU%R#(eFEW!Q8@~Py*gnesS*CU9R1c;sgc=_l9Iu%GI;ozcZ z;5K{~-rL)&E}J@SnDDC3EGDl;(^gTW5LWP(jg027{-MM|*3|YP{%;phQh@Ke`&)@+ zJ_a*i&E7J7tddV5&GYv2pT=`yaTOf$`%G82X6cBpuh+28dz+m)In&8DLRl6{zkOo*KQlOwyWNei!9Y6y&;YMxELbtk z=iu2SnE%U0p&>4OKxeNz)XV&hFa3%Px{c zu(hlE%U^#mspBS1j?JPKA%%iJ^@N%^9K3CQ@A|6!{mQ3c5M@YTbb%bH!}y^I(Ti$Y zijeQ$3?0>;HaMx_*&thimq?a)|DyG(1^zDWh+lh9-~EI=jJK}(gZw`-I6S|{Gv1~? z%;$=Dz*R$lvatJ;HDepNMRb)ZSHew1Y~xk%Q^lfa`b$%aCsb71g}!(@gwI_-Z^&W$ zlb6N%D)5(M%vqmGNGV46msCKiA=)(J$9X)T3(m0_o)Xf}_p!u4G8fk0?j8d<-hR1V zMos)L1KbD&!sn1Lm=+iwU?+!AuIlPTFAxWg@3-DRY!SmPg5kZ~w9epLfNLuMBmRO0 zu+D54b#3vhl_+6qh>6MOWSUhqv{EdTI_VE(@`^Sch9x%@tM6`x-ah7e&~`?8VgyLP zi*xxbFzk0DkD7Vp&bsjS(yM0&wi7<(N+tWK^YVBtHcGA0FvBh5!Hn literal 48264 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 apS*tlHG+{ZEEO#Idm;-{f|f}b`2G*DSpew( diff --git a/companion/src/simulation/simulateduiwidgetTX16S.cpp b/companion/src/simulation/simulateduiwidgetTX16S.cpp index 38cdde149..76bfd1f33 100644 --- a/companion/src/simulation/simulateduiwidgetTX16S.cpp +++ b/companion/src/simulation/simulateduiwidgetTX16S.cpp @@ -59,7 +59,7 @@ SimulatedUIWidgetTX16S::SimulatedUIWidgetTX16S(SimulatorInterface *simulator, QW m_scrollDnAction = new RadioUiAction(-1, QList() << Qt::Key_Plus << Qt::Key_Equal, SIMU_STR_HLP_KEY_PLS % "|" % SIMU_STR_HLP_MOUSE_DN, SIMU_STR_HLP_ACT_ROT_RGT); connectScrollActions(); - addRadioWidget(ui->leftbuttons->addArea(QRect(10, 252, 30, 30), "TX16S/left_scrnsht.png", m_screenshotAction)); + addRadioWidget(ui->leftbuttons->addArea(QRect(10, 245, 30, 30), "TX16S/left_scrnsht.png", m_screenshotAction)); m_backlightColors << QColor(47, 123, 227); From 89aad214359c51bde9f5c138e41ed6d444049ccd Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 6 May 2020 09:54:14 +0200 Subject: [PATCH 330/560] Fix screenshot button position --- .../src/images/simulator/TX16S/bottom.png | Bin companion/src/images/simulator/TX16S/left.png | Bin 32296 -> 32133 bytes .../src/images/simulator/TX16S/left_page.png | Bin 32274 -> 32071 bytes .../src/images/simulator/TX16S/left_page2.png | Bin 32303 -> 32107 bytes .../src/images/simulator/TX16S/left_rtn.png | Bin 32217 -> 32059 bytes .../src/images/simulator/TX16S/left_sys.png | Bin 32243 -> 32083 bytes .../src/images/simulator/TX16S/left_tele.png | Bin 32206 -> 32088 bytes .../src/images/simulator/TX16S/right.png | Bin .../src/images/simulator/TX16S/right_ent.png | Bin .../src/images/simulator/TX16S/right_mdl.png | Bin companion/src/images/simulator/TX16S/top.png | Bin 11 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 companion/src/images/simulator/TX16S/bottom.png mode change 100755 => 100644 companion/src/images/simulator/TX16S/left.png mode change 100755 => 100644 companion/src/images/simulator/TX16S/left_page.png mode change 100755 => 100644 companion/src/images/simulator/TX16S/left_page2.png mode change 100755 => 100644 companion/src/images/simulator/TX16S/left_rtn.png mode change 100755 => 100644 companion/src/images/simulator/TX16S/left_sys.png mode change 100755 => 100644 companion/src/images/simulator/TX16S/left_tele.png mode change 100755 => 100644 companion/src/images/simulator/TX16S/right.png mode change 100755 => 100644 companion/src/images/simulator/TX16S/right_ent.png mode change 100755 => 100644 companion/src/images/simulator/TX16S/right_mdl.png mode change 100755 => 100644 companion/src/images/simulator/TX16S/top.png diff --git a/companion/src/images/simulator/TX16S/bottom.png b/companion/src/images/simulator/TX16S/bottom.png old mode 100755 new mode 100644 diff --git a/companion/src/images/simulator/TX16S/left.png b/companion/src/images/simulator/TX16S/left.png old mode 100755 new mode 100644 index 83d12f301cb8995be656e602a46318fd8289f48e..602017e44863658adfea82d23918918a2f5549c2 GIT binary patch delta 26303 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