From 3e2cb83991d453c0ba0f76ee8318b6b5b5cac984 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Wed, 2 Oct 2019 11:02:50 +0200 Subject: [PATCH] Now uses the external libopenui --- .gitmodules | 3 + CMakeLists.txt | 3 +- cmake/Bitmaps.cmake | 10 +- companion/src/translations/companion_cs.ts | 7560 ++++++++++++++++- companion/src/translations/companion_de.ts | 7560 ++++++++++++++++- companion/src/translations/companion_en.ts | 7560 ++++++++++++++++- companion/src/translations/companion_es.ts | 7560 ++++++++++++++++- companion/src/translations/companion_fi.ts | 7560 ++++++++++++++++- companion/src/translations/companion_fr.ts | 7560 ++++++++++++++++- companion/src/translations/companion_it.ts | 7560 ++++++++++++++++- companion/src/translations/companion_ja.ts | 7560 ++++++++++++++++- companion/src/translations/companion_pl.ts | 7560 ++++++++++++++++- companion/src/translations/companion_sv.ts | 40 + companion/src/translations/companion_zh_CN.ts | 7560 ++++++++++++++++- radio/src/CMakeLists.txt | 4 +- radio/src/audio.cpp | 10 + radio/src/bitfield.h | 88 - radio/src/datastructs.h | 11 +- radio/src/fonts/truetype/CMakeLists.txt | 25 +- radio/src/fonts/truetype/font_13.png | Bin 12097 -> 53381 bytes radio/src/fonts/truetype/font_13.specs | 2 +- radio/src/fonts/truetype/font_15.png | Bin 15310 -> 66027 bytes radio/src/fonts/truetype/font_15.specs | 2 +- radio/src/fonts/truetype/font_16.png | Bin 21747 -> 76367 bytes radio/src/fonts/truetype/font_16.specs | 2 +- radio/src/fonts/truetype/font_16en.png | Bin 0 -> 16895 bytes radio/src/fonts/truetype/font_16en.specs | 1 + radio/src/fonts/truetype/font_17.png | Bin 21635 -> 79880 bytes radio/src/fonts/truetype/font_17.specs | 2 +- radio/src/fonts/truetype/font_17en.png | Bin 0 -> 16758 bytes radio/src/fonts/truetype/font_17en.specs | 1 + radio/src/fonts/truetype/font_24.png | Bin 24839 -> 116789 bytes radio/src/fonts/truetype/font_24.specs | 2 +- radio/src/fonts/truetype/font_32.png | Bin 34151 -> 148452 bytes radio/src/fonts/truetype/font_32.specs | 2 +- radio/src/fonts/truetype/font_64.png | Bin 77296 -> 287994 bytes radio/src/fonts/truetype/font_64.specs | 2 +- radio/src/fonts/truetype/font_9.png | Bin 8339 -> 36745 bytes radio/src/fonts/truetype/font_9.specs | 2 +- radio/src/fonts/truetype/font_bold16.png | Bin 20599 -> 73359 bytes radio/src/fonts/truetype/font_bold16.specs | 2 +- radio/src/fonts/truetype/font_bold17.png | Bin 21217 -> 75578 bytes radio/src/fonts/truetype/font_bold17.specs | 2 +- radio/src/gui/128x64/CMakeLists.txt | 1 - radio/src/gui/128x64/gui.h | 2 - radio/src/gui/128x64/lcd.cpp | 9 +- radio/src/gui/128x64/lcd.h | 24 +- radio/src/gui/128x64/model_flightmodes.cpp | 2 +- radio/src/gui/128x64/model_gvars.cpp | 2 +- radio/src/gui/128x64/model_select.cpp | 2 +- radio/src/gui/128x64/model_setup.cpp | 16 +- radio/src/gui/128x64/model_telemetry.cpp | 4 +- .../src/gui/128x64/model_telemetry_sensor.cpp | 13 +- radio/src/gui/128x64/radio_setup.cpp | 88 +- radio/src/gui/128x64/view_main.cpp | 2 +- radio/src/gui/128x64/widgets.cpp | 4 +- radio/src/gui/212x64/CMakeLists.txt | 1 - radio/src/gui/212x64/fonts.cpp | 140 - radio/src/gui/212x64/gui.h | 2 - radio/src/gui/212x64/lcd.cpp | 18 +- radio/src/gui/212x64/lcd.h | 24 +- radio/src/gui/212x64/model_gvars.cpp | 2 +- radio/src/gui/212x64/model_select.cpp | 2 +- radio/src/gui/212x64/model_setup.cpp | 16 +- radio/src/gui/212x64/model_telemetry.cpp | 2 +- .../src/gui/212x64/model_telemetry_sensor.cpp | 12 +- radio/src/gui/212x64/radio_calibration.cpp | 2 +- radio/src/gui/212x64/radio_setup.cpp | 81 +- radio/src/gui/212x64/view_main.cpp | 2 +- radio/src/gui/212x64/widgets.cpp | 4 +- radio/src/gui/colorlcd/CMakeLists.txt | 30 +- radio/src/gui/colorlcd/colors.h | 75 +- radio/src/gui/colorlcd/confirm_dialog.cpp | 44 + .../coloredit.h => colorlcd/confirm_dialog.h} | 22 +- .../src/gui/{libopenui => colorlcd}/curve.cpp | 3 +- radio/src/gui/{libopenui => colorlcd}/curve.h | 0 .../gui/{libopenui => colorlcd}/curveedit.cpp | 0 .../gui/{libopenui => colorlcd}/curveedit.h | 0 radio/src/gui/colorlcd/curves.cpp | 49 +- .../custom_curve_choice.cpp | 2 +- .../custom_curve_choice.h | 0 radio/src/gui/colorlcd/draw_functions.cpp | 213 +- radio/src/gui/colorlcd/draw_functions.h | 40 +- radio/src/gui/colorlcd/fonts.cpp | 41 +- radio/src/gui/colorlcd/fullscreen_dialog.cpp | 156 + .../dialog.h => colorlcd/fullscreen_dialog.h} | 50 +- .../{libopenui => colorlcd}/getset_helpers.h | 0 .../keyboard_curve.cpp | 0 .../{libopenui => colorlcd}/keyboard_curve.h | 0 radio/src/gui/colorlcd/layout.cpp | 12 +- radio/src/gui/colorlcd/layout.h | 21 +- radio/src/gui/colorlcd/layouts/layout1x1.cpp | 50 +- radio/src/gui/colorlcd/layouts/layout2+1.cpp | 72 +- radio/src/gui/colorlcd/layouts/layout2x1.cpp | 30 +- radio/src/gui/colorlcd/layouts/layout2x2.cpp | 32 +- radio/src/gui/colorlcd/layouts/layout2x4.cpp | 90 +- .../gui/colorlcd/layouts/mask_layout1x1.png | Bin 169 -> 1873 bytes .../gui/colorlcd/layouts/mask_layout2+1.png | Bin 233 -> 2685 bytes .../gui/colorlcd/layouts/mask_layout2x1.png | Bin 178 -> 2075 bytes .../gui/colorlcd/layouts/mask_layout2x2.png | Bin 208 -> 2976 bytes .../gui/colorlcd/layouts/mask_layout2x4.png | Bin 212 -> 4003 bytes radio/src/gui/colorlcd/lcd.cpp | 111 +- radio/src/gui/colorlcd/lcd.h | 118 +- .../gui/{libopenui => colorlcd}/libopenui.h | 6 + .../material-backup.cpp | 0 .../progress.h => colorlcd/menu_screen.cpp} | 48 +- .../progress.cpp => colorlcd/menu_screen.h} | 21 +- .../message_dialog.cpp} | 48 +- .../message_dialog.h} | 34 +- radio/src/gui/colorlcd/model_curves.cpp | 6 +- radio/src/gui/colorlcd/model_inputs.cpp | 4 +- .../gui/colorlcd/model_logical_switches.cpp | 48 +- radio/src/gui/colorlcd/model_mixes.cpp | 2 +- radio/src/gui/colorlcd/model_outputs.cpp | 14 +- radio/src/gui/colorlcd/model_setup.cpp | 26 +- radio/src/gui/colorlcd/model_telemetry.cpp | 14 +- radio/src/gui/colorlcd/radio_calibration.cpp | 6 +- radio/src/gui/colorlcd/radio_hardware.cpp | 4 +- radio/src/gui/colorlcd/radio_setup.cpp | 32 +- .../gui/colorlcd/radio_spectrum_analyser.cpp | 2 +- radio/src/gui/colorlcd/radio_trainer.cpp | 2 +- radio/src/gui/colorlcd/rle.cpp | 38 - radio/src/gui/colorlcd/rle.h | 7 - radio/src/gui/colorlcd/screen_setup.cpp | 207 + .../screen_setup.h} | 49 +- ...creens_setup.cpp => screens_setup_old.cpp} | 2 +- .../{libopenui => colorlcd}/sourcechoice.cpp | 0 .../{libopenui => colorlcd}/sourcechoice.h | 0 radio/src/gui/colorlcd/special_functions.cpp | 42 +- .../{libopenui => colorlcd}/switchchoice.cpp | 0 .../{libopenui => colorlcd}/switchchoice.h | 0 radio/src/gui/colorlcd/theme.cpp | 114 +- radio/src/gui/colorlcd/theme.h | 49 +- radio/src/gui/colorlcd/themes/flysky.cpp | 97 +- radio/src/gui/colorlcd/themes/frsky.cpp | 71 +- .../gui/{libopenui => colorlcd}/timeedit.cpp | 7 +- .../gui/{libopenui => colorlcd}/timeedit.h | 0 radio/src/gui/colorlcd/view_main.cpp | 14 +- radio/src/gui/colorlcd/widgets_container.h | 4 +- .../src/gui/common/colorlcd/draw_functions.h | 40 - radio/src/gui/common/stdlcd/CMakeLists.txt | 1 + .../gui/{128x64 => common/stdlcd}/fonts.cpp | 9 +- radio/src/{ => gui/common/stdlcd}/fonts.h | 37 +- radio/src/gui/common/stdlcd/popups.h | 1 + .../src/gui/common/stdlcd/radio_sdmanager.cpp | 1 + radio/src/gui/gui_common.cpp | 2 +- radio/src/gui/libopenui/CMakeLists.txt | 34 - radio/src/gui/libopenui/LICENSE | 165 - radio/src/gui/libopenui/basenumberedit.h | 105 - radio/src/gui/libopenui/bitmapbuffer.cpp | 878 -- radio/src/gui/libopenui/bitmapbuffer.h | 443 - radio/src/gui/libopenui/button.cpp | 139 - radio/src/gui/libopenui/button.h | 181 - radio/src/gui/libopenui/checkbox.cpp | 73 - radio/src/gui/libopenui/checkbox.h | 59 - radio/src/gui/libopenui/choice.cpp | 122 - radio/src/gui/libopenui/choice.h | 75 - radio/src/gui/libopenui/coloredit.cpp | 87 - radio/src/gui/libopenui/dialog.cpp | 232 - radio/src/gui/libopenui/draw_functions.cpp | 75 - radio/src/gui/libopenui/draw_functions.h | 34 - radio/src/gui/libopenui/filechoice.cpp | 160 - radio/src/gui/libopenui/filechoice.h | 58 - radio/src/gui/libopenui/form.cpp | 121 - radio/src/gui/libopenui/form.h | 193 - radio/src/gui/libopenui/gridlayout.h | 124 - radio/src/gui/libopenui/keyboard_base.h | 78 - radio/src/gui/libopenui/keyboard_number.cpp | 99 - radio/src/gui/libopenui/keyboard_text.cpp | 230 - radio/src/gui/libopenui/keyboard_text.h | 68 - radio/src/gui/libopenui/libopenui_defines.h | 91 - radio/src/gui/libopenui/mainwindow.cpp | 114 - radio/src/gui/libopenui/mainwindow.h | 66 - radio/src/gui/libopenui/menu.cpp | 137 - radio/src/gui/libopenui/menu.h | 184 - radio/src/gui/libopenui/menutoolbar.h | 191 - radio/src/gui/libopenui/numberedit.cpp | 119 - radio/src/gui/libopenui/numberedit.h | 90 - radio/src/gui/libopenui/page.cpp | 102 - radio/src/gui/libopenui/page.h | 85 - radio/src/gui/libopenui/slider.cpp | 102 - radio/src/gui/libopenui/slider.h | 73 - radio/src/gui/libopenui/static.h | 116 - radio/src/gui/libopenui/tabsgroup.cpp | 185 - radio/src/gui/libopenui/tabsgroup.h | 186 - radio/src/gui/libopenui/textedit.cpp | 171 - radio/src/gui/libopenui/textedit.h | 74 - radio/src/gui/libopenui/window.cpp | 396 - radio/src/gui/libopenui/window.h | 330 - radio/src/gui/screenshot.cpp | 4 +- radio/src/io/frsky_firmware_update.cpp | 1 + radio/src/keys.h | 38 +- radio/src/lua/interface.cpp | 1 + radio/src/lua/widgets.cpp | 2 +- radio/src/mixer.cpp | 19 +- radio/src/myeeprom.h | 2 +- radio/src/opentx.cpp | 32 +- radio/src/opentx.h | 33 +- radio/src/opentx_helpers.h | 2 +- radio/src/opentx_types.h | 9 +- radio/src/pulses/modules_helpers.h | 2 +- radio/src/pulses/pxx2.cpp | 1 + radio/src/sdcard.cpp | 58 +- radio/src/sdcard.h | 7 - radio/src/simu.cpp | 8 +- .../src/storage/conversions/datastructs_218.h | 2 +- radio/src/storage/sdcard_raw.cpp | 2 +- radio/src/strhelpers.h | 2 - radio/src/stubs.cpp | 8 - radio/src/switches.cpp | 8 +- radio/src/targets/common/arm/CMakeLists.txt | 2 +- .../arm/stm32/bootloader/CMakeLists.txt | 5 +- .../targets/horus/bootloader/boot_menu.cpp | 72 +- radio/src/targets/horus/lcd_driver.cpp | 6 +- radio/src/targets/horus/libopenui_config.h | 67 +- radio/src/targets/nv14/lcd_driver.cpp | 6 +- radio/src/targets/nv14/libopenui_config.h | 63 +- radio/src/targets/simu/simpgmspace.cpp | 8 +- radio/src/targets/simu/simulcd.h | 2 +- radio/src/telemetry/telemetry.h | 10 +- radio/src/thirdparty/libopenui | 1 + radio/src/translations.cpp | 39 +- radio/src/translations.h | 42 +- radio/src/translations/CMakeLists.txt | 9 +- radio/src/translations/cn.h.txt | 131 +- radio/src/translations/cz.h.txt | 80 +- radio/src/translations/de.h.txt | 83 +- radio/src/translations/en.h.txt | 145 +- radio/src/translations/es.h.txt | 81 +- radio/src/translations/fi.h.txt | 79 +- radio/src/translations/fr.h.txt | 82 +- radio/src/translations/it.h.txt | 81 +- radio/src/translations/nl.h.txt | 79 +- radio/src/translations/pl.h.txt | 81 +- radio/src/translations/pt.h.txt | 81 +- radio/src/translations/se.h.txt | 81 +- radio/util/font2png.py | 95 - radio/util/translate.py | 193 - tools/build-font-bitmap.py | 111 + tools/charset.py | 86 + tools/encode-translation.py | 55 + tools/nightly23/build-nightly.sh | 79 - tools/nightly23/build-sdcard.sh | 76 - tools/nightly23/build-sdcard.sh.winbox | 48 - tools/nightly23/tts.py | 154 - tools/nightly23/tts_common.py | 19 - tools/rc23/build-rc.sh | 71 - tools/rc23/build-sdcard.sh | 77 - tools/rc23/tts.py | 152 - tools/rc23/tts_common.py | 14 - 250 files changed, 76326 insertions(+), 11869 deletions(-) delete mode 100644 radio/src/bitfield.h create mode 100644 radio/src/fonts/truetype/font_16en.png create mode 100644 radio/src/fonts/truetype/font_16en.specs create mode 100644 radio/src/fonts/truetype/font_17en.png create mode 100644 radio/src/fonts/truetype/font_17en.specs delete mode 100644 radio/src/gui/212x64/fonts.cpp create mode 100644 radio/src/gui/colorlcd/confirm_dialog.cpp rename radio/src/gui/{libopenui/coloredit.h => colorlcd/confirm_dialog.h} (65%) rename radio/src/gui/{libopenui => colorlcd}/curve.cpp (97%) rename radio/src/gui/{libopenui => colorlcd}/curve.h (100%) rename radio/src/gui/{libopenui => colorlcd}/curveedit.cpp (100%) rename radio/src/gui/{libopenui => colorlcd}/curveedit.h (100%) rename radio/src/gui/{libopenui => colorlcd}/custom_curve_choice.cpp (97%) rename radio/src/gui/{libopenui => colorlcd}/custom_curve_choice.h (100%) create mode 100644 radio/src/gui/colorlcd/fullscreen_dialog.cpp rename radio/src/gui/{libopenui/dialog.h => colorlcd/fullscreen_dialog.h} (65%) rename radio/src/gui/{libopenui => colorlcd}/getset_helpers.h (100%) rename radio/src/gui/{libopenui => colorlcd}/keyboard_curve.cpp (100%) rename radio/src/gui/{libopenui => colorlcd}/keyboard_curve.h (100%) rename radio/src/gui/{libopenui => colorlcd}/libopenui.h (90%) rename radio/src/gui/{libopenui => colorlcd}/material-backup.cpp (100%) rename radio/src/gui/{libopenui/progress.h => colorlcd/menu_screen.cpp} (60%) rename radio/src/gui/{libopenui/progress.cpp => colorlcd/menu_screen.h} (74%) rename radio/src/gui/{libopenui/libopenui_types.h => colorlcd/message_dialog.cpp} (57%) rename radio/src/gui/{libopenui/libopenui_helpers.h => colorlcd/message_dialog.h} (65%) delete mode 100644 radio/src/gui/colorlcd/rle.cpp delete mode 100644 radio/src/gui/colorlcd/rle.h create mode 100644 radio/src/gui/colorlcd/screen_setup.cpp rename radio/src/gui/{libopenui/keyboard_number.h => colorlcd/screen_setup.h} (54%) rename radio/src/gui/colorlcd/{screens_setup.cpp => screens_setup_old.cpp} (99%) rename radio/src/gui/{libopenui => colorlcd}/sourcechoice.cpp (100%) rename radio/src/gui/{libopenui => colorlcd}/sourcechoice.h (100%) rename radio/src/gui/{libopenui => colorlcd}/switchchoice.cpp (100%) rename radio/src/gui/{libopenui => colorlcd}/switchchoice.h (100%) rename radio/src/gui/{libopenui => colorlcd}/timeedit.cpp (95%) rename radio/src/gui/{libopenui => colorlcd}/timeedit.h (100%) delete mode 100644 radio/src/gui/common/colorlcd/draw_functions.h rename radio/src/gui/{128x64 => common/stdlcd}/fonts.cpp (97%) rename radio/src/{ => gui/common/stdlcd}/fonts.h (58%) delete mode 100644 radio/src/gui/libopenui/CMakeLists.txt delete mode 100644 radio/src/gui/libopenui/LICENSE delete mode 100644 radio/src/gui/libopenui/basenumberedit.h delete mode 100644 radio/src/gui/libopenui/bitmapbuffer.cpp delete mode 100644 radio/src/gui/libopenui/bitmapbuffer.h delete mode 100644 radio/src/gui/libopenui/button.cpp delete mode 100644 radio/src/gui/libopenui/button.h delete mode 100644 radio/src/gui/libopenui/checkbox.cpp delete mode 100644 radio/src/gui/libopenui/checkbox.h delete mode 100644 radio/src/gui/libopenui/choice.cpp delete mode 100644 radio/src/gui/libopenui/choice.h delete mode 100644 radio/src/gui/libopenui/coloredit.cpp delete mode 100644 radio/src/gui/libopenui/dialog.cpp delete mode 100644 radio/src/gui/libopenui/draw_functions.cpp delete mode 100644 radio/src/gui/libopenui/draw_functions.h delete mode 100644 radio/src/gui/libopenui/filechoice.cpp delete mode 100644 radio/src/gui/libopenui/filechoice.h delete mode 100644 radio/src/gui/libopenui/form.cpp delete mode 100644 radio/src/gui/libopenui/form.h delete mode 100644 radio/src/gui/libopenui/gridlayout.h delete mode 100644 radio/src/gui/libopenui/keyboard_base.h delete mode 100644 radio/src/gui/libopenui/keyboard_number.cpp delete mode 100644 radio/src/gui/libopenui/keyboard_text.cpp delete mode 100644 radio/src/gui/libopenui/keyboard_text.h delete mode 100644 radio/src/gui/libopenui/libopenui_defines.h delete mode 100644 radio/src/gui/libopenui/mainwindow.cpp delete mode 100644 radio/src/gui/libopenui/mainwindow.h delete mode 100644 radio/src/gui/libopenui/menu.cpp delete mode 100644 radio/src/gui/libopenui/menu.h delete mode 100644 radio/src/gui/libopenui/menutoolbar.h delete mode 100644 radio/src/gui/libopenui/numberedit.cpp delete mode 100644 radio/src/gui/libopenui/numberedit.h delete mode 100644 radio/src/gui/libopenui/page.cpp delete mode 100644 radio/src/gui/libopenui/page.h delete mode 100644 radio/src/gui/libopenui/slider.cpp delete mode 100644 radio/src/gui/libopenui/slider.h delete mode 100644 radio/src/gui/libopenui/static.h delete mode 100644 radio/src/gui/libopenui/tabsgroup.cpp delete mode 100644 radio/src/gui/libopenui/tabsgroup.h delete mode 100644 radio/src/gui/libopenui/textedit.cpp delete mode 100644 radio/src/gui/libopenui/textedit.h delete mode 100644 radio/src/gui/libopenui/window.cpp delete mode 100644 radio/src/gui/libopenui/window.h create mode 160000 radio/src/thirdparty/libopenui delete mode 100755 radio/util/font2png.py delete mode 100755 radio/util/translate.py create mode 100755 tools/build-font-bitmap.py create mode 100644 tools/charset.py create mode 100755 tools/encode-translation.py delete mode 100755 tools/nightly23/build-nightly.sh delete mode 100755 tools/nightly23/build-sdcard.sh delete mode 100755 tools/nightly23/build-sdcard.sh.winbox delete mode 100755 tools/nightly23/tts.py delete mode 100644 tools/nightly23/tts_common.py delete mode 100755 tools/rc23/build-rc.sh delete mode 100755 tools/rc23/build-sdcard.sh delete mode 100755 tools/rc23/tts.py delete mode 100644 tools/rc23/tts_common.py diff --git a/.gitmodules b/.gitmodules index a761ef67a..284113d48 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "radio/src/thirdparty/GCS_MAVLink/include_v1.0"] path = radio/src/thirdparty/GCS_MAVLink/include_v1.0 url = https://github.com/mavlink/c_library_v1.git +[submodule "radio/src/thirdparty/libopenui"] + path = radio/src/thirdparty/libopenui + url = git@github.com:opentx/libopenui.git diff --git a/CMakeLists.txt b/CMakeLists.txt index b7a0a982f..75f96175e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,6 +34,7 @@ set(RADIO_DIRECTORY ${PROJECT_SOURCE_DIR}/radio) set(RADIO_SRC_DIRECTORY ${RADIO_DIRECTORY}/src) set(COMPANION_SRC_DIRECTORY ${PROJECT_SOURCE_DIR}/companion/src) set(SIMU_SRC_DIRECTORY ${COMPANION_SRC_DIRECTORY}/simulation) +set(TOOLS_DIRECTORY ${PROJECT_SOURCE_DIR}/tools) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) @@ -44,7 +45,7 @@ today(DATE) now(TIME) git_id(GIT_STR) -message(STATUS "OpenTX ${VERSION} @${GIT_STR}") +message(STATUS "OpenTX ${VERSION} @ ${GIT_STR}") # options shared by all targets diff --git a/cmake/Bitmaps.cmake b/cmake/Bitmaps.cmake index df61adde4..65387b6d1 100644 --- a/cmake/Bitmaps.cmake +++ b/cmake/Bitmaps.cmake @@ -14,12 +14,14 @@ macro(add_bitmaps_target targetname filter width format) add_custom_target(${targetname} DEPENDS ${bitmaps_files}) endmacro() -macro(add_truetype_font_target name font size offset) +macro(add_truetype_font_target name size subset font offset cn_font cn_offset) set(target ${RADIO_SRC_DIRECTORY}/fonts/truetype/font_${name}) - add_custom_target(truetype_font_${name} - COMMAND ${PYTHON_EXECUTABLE} ${RADIO_DIRECTORY}/util/font2png.py ${font} ${size} ${offset} ${target} + add_custom_command( + OUTPUT ${target}.png ${target}.specs + COMMAND ${PYTHON_EXECUTABLE} ${TOOLS_DIRECTORY}/build-font-bitmap.py --subset ${subset} --size ${size} --font ${font}:${offset} --cn-font ${cn_font}:${cn_offset} --output ${target} WORKING_DIRECTORY ${RADIO_SRC_DIRECTORY} - DEPENDS ${RADIO_DIRECTORY}/util/font2png.py + DEPENDS ${TOOLS_DIRECTORY}/build-font-bitmap.py ${TOOLS_DIRECTORY}/charset.py ${RADIO_SRC_DIRECTORY}/translations/cn.h.txt ) + add_custom_target(truetype_font_${name} DEPENDS ${target}.png ${target}.specs) set(truetype_fonts_targets ${truetype_fonts_targets} truetype_font_${name}) endmacro() diff --git a/companion/src/translations/companion_cs.ts b/companion/src/translations/companion_cs.ts index d309f5076..ed4e492d8 100644 --- a/companion/src/translations/companion_cs.ts +++ b/companion/src/translations/companion_cs.ts @@ -93,41 +93,97 @@ AppPreferencesDialog + + + + + + + Edit Settings Upravit nastavení předvoleb + + + + + + + Radio Profile Profil rádia + + + + + + + Default Channel Order Výchozí pořadí kanálů + + + + + + + Build Options Volby sestavení firmware + + + + + + + Menu Language Jazyk menu + + + + + + + Default Stick Mode Výchozí mód vysílačky + + + + + + + Select Image Vybrat obrázek + + + + + + + Mode selection: Mode 1: @@ -169,172 +225,417 @@ Mode 4: + + + + + + + Mode 1 (RUD ELE THR AIL) Mód1 (Směr.Výšk.Plyn.Křid) + + + + + + + Mode 2 (RUD THR ELE AIL) Mód2 (Směr.Plyn.Výšk.Křid) + + + + + + + Mode 3 (AIL ELE THR RUD) Mód3 (Křid.Výšk.Plyn.Směr) + + + + + + + Mode 4 (AIL THR ELE RUD) Mód4 (Křid.Plyn.Výšk.Směr) + + + + + + + Splash Screen Úvodní logo + + + + + + + + + + + + + + The profile specific folder, if set, will override general Backup folder Specifická složka profilu, pokud je nastavena, bude použita místo výchozí složky z nastavení aplikace + + + + + + + Backup folder Složka pro zálohy + + + + + + + If set it will override the application general setting Pokud je nastavena, bude použita místo výchozí složky z nastavení aplikace + + + + + + + if set, will override general backup enable Pokud je nastaveno, bude použito místo výchozí volby z nastavení aplikace + + + + + + + <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>Pořadí kanálů</p><p><br/></p><p>Definuje výchozí pořadí kanálů použité při vytvoření nového modelu.</p></body></html> + + + + + + + R E T A S V P K + + + + + + + R E A T S V K P + + + + + + + R T E A S P V K + + + + + + + R T A E S P K V + + + + + + + R A E T S K V P + + + + + + + R A T E S K P V + + + + + + + E R T A V S P K + + + + + + + E R A T V S K P + + + + + + + E T R A V P S K + + + + + + + E T A R V P K S + + + + + + + E A R T V K S P + + + + + + + E A T R V K P S + + + + + + + T R E A P S V K + + + + + + + T R A E P S K V + + + + + + + T E R A P V S K + + + + + + + T E A R P V K S + + + + + + + T A R E P K S V + + + + + + + T A E R P K V S + + + + + + + A R E T K S V P + + + + + + + A R T E K S P V + + + + + + + A E R T K V S P + + + + + + + A E T R K V P S + + + + + + + A T R E K P S V + + + + + + + A T E R K P V S @@ -345,272 +646,680 @@ Mode 4: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Select Folder Vybrat složku + + + + + + + Select Executable Vybrat + + + + Release channel + + + + Releases (stable) + + + + Release candidates (testing) + + + + Nightly builds (unstable) + + + + + + + Simulator Volume Gain Zisk hlasitosti simulátoru + + + + + + + Profile Name Název profilu + + + + + + + Clear Image Odstranit + + + + + + + Append version number to FW file name Přidat číslo verze do názvu souboru staženého firmwaru + + + + + + + Offer to write FW to Tx after download Po stažení firmwaru nabídnout okamžité zapsání do rádia + + + + + + + Radio Type Typ rádia + + + + + + + Other Settings Ostatní volby + + + + + + + General Settings Obecná nastavení + + + + + + + SD Structure path Cesta k obsahu SD karty + + + + + + + Application Settings Nastavení aplikace + + + + + + + Show splash screen when Companion starts Zobrazit úvodní logo Companion + + + + + + + Automatic check for Companion updates Automatická kontrola aktualizací Companion + + + + + + + + + + + + + + Enable automatic backup before writing firmware Automatická záloha před zápisem firmwaru + + + + + + + Automatic check for OpenTX firmware updates Automatická kontrola aktualizací OpenTX firmwaru + + + + + + + Splash Screen Library Knihovna s úvodními logy + + + + + + + Google Earth Executable Spustitelný soubor Google Earth + + + + + + + Only show user splash images Zobrazit jen vlastní loga + + + + + + + Show user and companion splash images Zobrazit vlastní loga i loga Companion + + + + + + + User Splash Screens Cesta k vlastním souborům + + + + + + + Automatic Backup Folder Složka pro automatické zálohy + + + + + + + Simulator Settings Nastavení simulátoru + + + + + + + Simulator BackLight Barva podsvětlení Simu + + + + + + + Enable Povolit + + + + + + + Action on New Model Vytvoření nového modelu + + + + + + + <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>Tato možnost zachovává chování ze starších verzí OpenTx, kde jsou prázdné pozice modelů zachovány při vymazání nebo přesunutí modelu.</p></body></html> + + + + + + + most recently used files + + + + + + + Startup Settings + + + + + + + Remember + + + + + + + Output Logs Folder + + + + + + + Remove empty model slots when deleting models (only applies for radios w/out categories) Odstranění prázdných pozic při mazání modelů (pouze pro rádia bez kategorií) + + + + + + + Use model wizard Použít průvodce + + + + + + + Open model editor Otevřít editor modelu + + + + + + + Just create the model Jen vytvořit model + + + + + + + Debug Output Logging + + + + + + + <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) + + + + + + + Blue Modrá + + + + + + + Green Zelená + + + + + + + Red Červená + + + + + + + Orange Oranžová + + + + + + + Yellow Žlutá + + + + + + + Screenshot capture folder + + + + + + + Joystick + + + + + + + Calibrate Kalibrovat + + + + + + + Only capture to clipboard Kopírovat pouze do schránky + + + + + + + Remember simulator switch values Pamatovat si polohy přepínačů v simulátoru @@ -691,6 +1400,31 @@ Mode 4: Images (%1) Obrázky (%1) + + + + + Use releases (stable) + + + + + Use release candidates (testing) + + + + + + + Use nightly builds (unstable) + + + + + + Use releases and release candidates (testing) + + BinEepromFormat @@ -910,36 +1644,85 @@ Mode 4: 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 @@ -1185,31 +1968,73 @@ If you have a settings backup file, you may import that instead. CompareDialog + + + + + + + Compare Models + + + + + + + To compare models, drag and drop them anywhere in this window. Chcete-li porovnat modely, přetáhněte je do tohoto okna. + + + + + + + Close Zavřít + + + + + + + Style + + + + + + + Print Tisk + + + + + + + Print to file Tisk do souboru @@ -1367,87 +2192,213 @@ Thomasi Hustererovi (th9x) a také Erazovi Ravivovi(er9x a eePe) Curves + + + + + + + Fixed X Rastr-X + + + + + + + Custom X Volná-XY + + + + + + + Lines Čáry + + + + + + + Smooth Hladká + + + + + + + + + + + + + + Curve type Typ křivky + + + + + + + Curve Creator Generátor křivek + + + + + + + Y at X=0 Y v X=0 + + + + + + + Point size + + + + + + + Y at X=100 Y v X=100 + + + + + + + Both Obě + + + + + + + x>0 + + + + + + + x<0 + + + + + + + Apply Vygenerovat + + + + + + + Side Strana + + + + + + + Y at X=-100 Y v X=-100 + + + + + + + Coefficient Koeficient + + + + + + + Curve name Název křivky @@ -1861,42 +2812,133 @@ Thomasi Hustererovi (th9x) a také Erazovi Ravivovi(er9x a eePe) CustomizeSplashDialog + + + + + + + Transmitter Splash Screen Editor Editor úvodního loga rádia + + + + + + + + + + + + + + Invert Invertovat + + + + + + + + + + + + + + Load FW Otevřít FW + + + + + + + + + + + + + + Load Pict Otevřít obrázek + + + + + + + + + + + + + + Load Profile Otevřít profil + + + + + + + + + + + + + + Save Uložit + + + + + + + + + + + + + + Open Splash Library Otevřít knihovnu s logy @@ -1905,6 +2947,34 @@ Thomasi Hustererovi (th9x) a také Erazovi Ravivovi(er9x a eePe) + + + + + + + + + + + + + + + + + + + + + + + + + + + + ... @@ -2020,48 +3090,48 @@ Thomasi Hustererovi (th9x) a také Erazovi Ravivovi(er9x a eePe) - + Switch Spínač - + Switch Spínač - + cannot be exported on this board! -na této desce nelze exportovat! - + Source Zdroj - + Source %1 cannot be exported on this board! Zdroj %1 nelze na této desce exportovat! - + OpenTX only accepts %1 points in all curves V OpenTX je možné zadat pouze %1 bodů dohromady ve všech křivkách - + OpenTx only accepts %1 points in all curves V OpenTX je možné zadat pouze %1 bodů dohromady ve všech křivkách - - + + OpenTX on this board doesn't accept this function OpenTX nepodporuje tuto funkci na této zákl. desce - + OpenTX doesn't accept this radio protocol OpenTX nepodporuje tento protokol @@ -2070,25 +3140,57 @@ Thomasi Hustererovi (th9x) a také Erazovi Ravivovi(er9x a eePe) DebugOutput - + + + + + + + + + Debug Output Výstup ladě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>Povolí nebo zakaže filtr. Pokud tlačítko nezůstane zapnuto, je pravděpodobné, že byla zadána chyba syntaxe v zadaném regulárním výrazu.</p></body></html> - + + + + + + + + + Filter: Filtr: - + + + + + + + + + <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>Zde vložte text filtru. Klikněte na tlačítko nápovědy / info pro podrobnosti o použití filtru.</p><p> @@ -2096,61 +3198,141 @@ Pro <b>odstranění uloženého záznamu</b> ze seznamu filtrů, zá - + + + + + + + + + Buffer: - + + + + + + + + + Number of lines to keep in display. Počet řádků, které mají být zobrazeny. - + + + + + + + + + Filter &Help &Nápověda Filtru - + + + + + + + + + Show information about using the filter. Zobrazí informace o použití filtru. - + + + + + + + + + Word &Wrap &Zalamování textu - + + + + + + + + + Toggle word wrapping on/off. Zapne / vypne zalamování textu. - + + + + + + + + + &Clear &Vymazat - + + + + + + + + + Clear the output window of all text. Vymaže veškerý text ve výstupním okně. - + + + + + + + + + Enable &Filter Povolit &Filtr - + + + + + + + + + Turn the filter on/off. Zapne / vypne filtr. @@ -2169,6 +3351,13 @@ Pro <b>odstranění uloženého záznamu</b> ze seznamu filtrů, zá DownloadDialog + + + + + + + Downloading: Stahuji: @@ -2312,26 +3501,61 @@ Pro <b>odstranění uloženého záznamu</b> ze seznamu filtrů, zá ExpoDialog + + + + + + + Weight Váha + + + + + + + Curve Křivka + + + + + + + Offset Ofset + + + + + + + The source for the mixer Zdroj pro mix + + + + + + + Input name Název @@ -2339,61 +3563,159 @@ Pro <b>odstranění uloženého záznamu</b> ze seznamu filtrů, zá + + + + + + + + + + + + + + + + + + + + + GV GP + + + + + + + Flight modes Letové režimy + + + + + + + Switch Spínač + + + + + + + Scale Měřítko + + + + + + + Include Trim Použít trim + + + + + + + No Ne + + + + + + + Yes Ano + + + + + + + Source Zdroj + + + + + + + Line name Popis + + + + + + + Stick Side Strana páky + + + + + + + Source for the mixer. Zdroj pro mixer. + + + + + + + Switch used to enable the line. If blank then the input is considered to be "ON" all the time. Spínač aktivující tento vstup. @@ -2401,21 +3723,49 @@ Pokud není použito, vstup je AKTIVNÍ stále. + + + + + + + NEG x<0(Negativní) + + + + + + + POS x>0(Pozitivní) + + + + + + + ALL Obě + + + + + + + Curve applied to the source. Křivka která se aplikuje na zdroj. @@ -3076,31 +4426,73 @@ zobrazeny normálním písmem FirmwarePreferencesDialog + + + + + + + Downloads + + + + + + + Check for updates Zkontrolovat aktualizace + + + + + + + Firmware + + + + + + + Download firmware Stáhnout firmware + + + + + + + Download SD contents Stáhnout obsah SD karty + + + + + + + Latest Download Naposledy staženo @@ -3142,67 +4534,158 @@ zobrazeny normálním písmem FlashEEpromDialog + + + + + + + Write Models and Settings to Radio Zapsat modely a nastavení do rádia + + + + + + + Load... Otevřít... + + + + + + + Current Profile Současný profil + + + + + + + Allows Companion to write to older version of the firmware Umožní Companion zapisovat do starší verze firmware + + + + + + + Check Firmware compatibility Zkontrolovat kompatibilitu 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>Uloží datovanou kopii vaší eeprom do složky pro zálohování, kterou jste zadali v nastavení Companion, před zapsáním aktuálního modelu do rádia.</p></body></html> + + + + + + + Backup before Write Zálohovat před zápisem + + + + + + + <html><head/><body><p>Modify calibration parameters using settings from current profile</p></body></html> <html><head/><body><p>Upraví hodnoty kalibrace použitím parametrů ze současného profilu</p></body></html> + + + + + + + Patch calibration setting from profile Zaměnit hodnoty kalibrace za hodnoty z profilu + + + + + + + <html><head/><body><p>Modify HW parameters using settings from current profile</p></body></html> <html><head/><body><p>Upraví HW parametery pomocí nastavení současného profilu</p></body></html> + + + + + + + Patch HW settings from profile Zaměnit hodnoty HW nastavení za hodnoty z profilu + + + + + + + Cancel Zrušit + + + + + + + Write to TX Zapsat do rádia @@ -3260,71 +4743,169 @@ zobrazeny normálním písmem FlashFirmwareDialog + + + + + + + Flash Firmware Zápis firmware + + + + + + + Load... Otevřít... + + + + + + + Date & Time Datum a čas + + + + + + + Variant Varianta + + + + + + + Version Verze + + + + + + + Use profile start screen Použít logo z nastavení profilu + + + + + + + Use firmware start screen Použít logo z firmwaru + + + + + + + Use library start screen Použít logo z knihovny + + + + + + + Use another start screen Použít jiné logo + + + + + + + Allows Companion to write to older version of the firmware Umožní Companion zapisovat do starší verze firmware + + + + + + + Check Hardware compatibility Zkontrolovat hardwarovou kompatibilitu rádia + + + + + + + Backup and restore Models and Settings Zálohovat a obnovit data modelů a nastavení + + + + + + + Cancel Zrušit + + + + + + + Write to TX Zapsat do rádia @@ -3524,21 +5105,49 @@ Nyní používáte: FlightMode + + + + + + + Fade In Přechod při aktivaci + + + + + + + Fade Out Přechod při deaktivaci + + + + + + + Name Název + + + + + + + Switch Spínač @@ -3728,11 +5337,25 @@ Nyní používáte: FusesDialog + + + + + + + Fuses Pojistky mikrokontroléru + + + + + + + <!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; } @@ -3750,11 +5373,25 @@ p, li { white-space: pre-wrap; } + + + + + + + Read Fuses Načíst konfiguraci pojistek + + + + + + + <!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; } @@ -3774,6 +5411,13 @@ p, li { white-space: pre-wrap; } + + + + + + + Reset Fuses EEPROM - PROTECT Nastavení pojistek @@ -3781,6 +5425,13 @@ EEPROM - CHRÁNIT + + + + + + + <!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; } @@ -3800,6 +5451,13 @@ p, li { white-space: pre-wrap; } + + + + + + + Reset Fuses EEPROM - DELETE Nastavení pojistek @@ -3807,6 +5465,13 @@ EEPROM - SMAZAT + + + + + + + <!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; } @@ -3883,21 +5548,49 @@ p, li { white-space: pre-wrap; } GeneralEdit + + + + + + + Store calib. and hw settings in selected profile Uložit kalibraci a HW nastavení do vybraného profilu + + + + + + + Retrieve calib. and hw settings from profile Získat kalibraci a HW nastavení z profilu + + + + + + + Radio settings Nastavení rádia + + + + + + + General settings used throught the transmitter. These will be relevant for all models in the same EEPROM. Obecná nastavení rádia. @@ -3966,127 +5659,309 @@ Tyto volby jsou platné pro všechny modely v jedné EEPROM. GeneralSetup + + + + + + + Form + + + + + + + Readonly Unlock + + + + + + + SC + + + + + + + SE + + + + + + + SA + + + + + + + SF + + + + + + + SH + + + + + + + SD + + + + + + + SB + + + + + + + SG + + + + + + + Timeshift from UTC Časový posun od UTC + + + + + + + Voice Language Jazyk hlasových zpráv + + + + + + + Country Code Kód země + + + + + + + Stick reverse Revers os kniplů + + + + + + + FAI Mode FAI mód + + + + + + + Adjust RTC Nastavit RTC + + + + + + + Vario pitch at max Tón varia na maximu + + + + + + + + + + + + + + Hz + + + + + + + Speaker Volume Hlasitost reproduktoru + + + + + + + Backlight Switch Spínač podsvětlení + + + + + + + Sound Mode Mód zvuku + + + + + + + Color 1 Barva 1 + + + + + + + Color 2 Barva 2 + + + + + + + Speaker Pitch (spkr only) Tón zvuku (pouze spkr) + + + + + + + If this value is not 0, any keypress will turn on the backlight and turn it off after the specified number of seconds. Pokud tato hodnota není nula, každé stisknutí klávesy zapne podsvétlení a vypne ho až po uplynutí nastaveného počtu sekund. @@ -4094,82 +5969,209 @@ Tyto volby jsou platné pro všechny modely v jedné EEPROM. + + + + + + + + + + + + + + + sec s + + + + + + + Backlight color Barva podsvětlení + + + + + + + Beeper Bzučák + + + + + + + Speaker Reproduktor + + + + + + + BeeperVoice Bzučák+Hlas + + + + + + + SpeakerVoice Repro+Hlas + + + + + + + Beep volume Upozornění + + + + + + + Wav volume Wav soubor + + + + + + + Vario volume Vario + + + + + + + Background volume Zvuk v pozadí + + + + + + + + + + + + + + ms + + + + + + + Backlight Auto OFF after Auto. vypnutí podsvětlení po + + + + + + + Backlight flash on alarm Blik. podsvětlením při alarmu + + + + + + + Vario pitch at zero Tón varia na nule + + + + + + + Vario repeat at zero Opakování varia na nule + + + + + + + This is the switch selectrion for turning on the backlight (if installed). @@ -4178,6 +6180,20 @@ Tyto volby jsou platné pro všechny modely v jedné EEPROM. + + + + + + + + + + + + + + <!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; } @@ -4193,41 +6209,97 @@ p, li { white-space: pre-wrap; } + + + + + + + Backlight Brightness Jas podsvětlení + + + + + + + RotEnc Navigation Navigace otočným enkodérem + + + + + + + Automatically adjust the radio's clock if a GPS is connected to telemetry. Automaticky nastaví hodiny rádia, pokud je k telemetrii připojen GPS. + + + + + + + America Amerika + + + + + + + Japan Japonsko + + + + + + + Europe Evropa + + + + + + + Backlight OFF Brightness Jas vypnutého podsvětlení + + + + + + + Mode selection: Mode 1: @@ -4269,346 +6341,845 @@ Mode 4: + + + + + + + Mode 1 (RUD ELE THR AIL) Mód1 (Směr.Výšk.Plyn.Křid) + + + + + + + Mode 2 (RUD THR ELE AIL) Mód2 (Směr.Plyn.Výšk.Křid) + + + + + + + Mode 3 (AIL ELE THR RUD) Mód3 (Křid.Výšk.Plyn.Směr) + + + + + + + Mode 4 (AIL THR ELE RUD) Mód4 (Křid.Plyn.Výšk.Směr) + + + + + + + <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>Pořadí kanálů</p><p><br/></p><p>Definuje výchozí pořadí kanálů použité při vytvoření nového modelu.</p></body></html> + + + + + + + If you enable FAI, only RSSI and RxBt sensors will keep working. This function cannot be disabled by the radio. + + + + + + + RSSI Poweroff Warning + + + + + + + Low EEPROM Warning + + + + Owner Registration ID + + + + aaaaaaAA + + + + + + + R E T A S V P K + + + + + + + R E A T S V K P + + + + + + + R T E A S P V K + + + + + + + R T A E S P K V + + + + + + + R A E T S K V P + + + + + + + R A T E S K P V + + + + + + + E R T A V S P K + + + + + + + E R A T V S K P + + + + + + + E T R A V P S K + + + + + + + E T A R V P K S + + + + + + + E A R T V K S P + + + + + + + E A T R V K P S + + + + + + + T R E A P S V K + + + + + + + T R A E P S K V + + + + + + + T E R A P V S K + + + + + + + T E A R P V K S + + + + + + + T A R E P K S V + + + + + + + T A E R P K V S + + + + + + + A R E T K S V P + + + + + + + A R T E K S P V + + + + + + + A E R T K V S P + + + + + + + A E T R K V P S + + + + + + + A T R E K P S V + + + + + + + A T E R K P V S + + + + Power On Delay + + + + + + + Jack Mode + + + + + + + Audio + + + + + + + Trainer Trenér + + + + + + + DMS + + + + + + + USB Mode + + + + Power Off Delay + + + + + + + + + + + + + + Ask on Connect + + + + + + + Joystick (HID) + + + + + + + USB Mass Storage + + + + + + + USB Serial (CDC) + + + + + + + Stick Mode Výchozí mód vysílačky + + + + + + + Metric Metrické + + + + + + + Imperial Imperiální + + + + + + + Default Channel Order Výchozí pořadí kanálů + + + + + + + GPS Coordinates Souřadnice GPS + + + + + + + Min + + + + + + + + + + + + + + v V + + + + + + + Max + + + + + + + Inactivity Timer Časovač nečinnosti + + + + + + + Show Splash Screen on Startup Zobrazit úvodní logo + + + + + + + Contrast Kontrast + + + + + + + Battery Meter Range Rozsah ukazatele baterie + + + + + + + Haptic Strength Síla vibrací + + + + + + + LCD Display Type Typ LCD zobrazovače + + + + + + + "No Sound" Warning Upozornění na vypnutý zvuk + + + + + + + Battery Warning Alarm baterie + + + + + + + Haptic Length Délka vibrací + + + + + + + MAVLink Baud Rate Přenosová rychlost MAVLink + + + + + + + + + + + + + + Quiet Tichý + + + + + + + Only Alarms Jen alarm + + + + + + + + + + + + + + No Keys Bez kláves + + + + + + + + + + + + + + All Vše + + + + + + + Battery warning voltage. This is the threashhold where the battery warning sounds. @@ -4618,107 +7189,261 @@ Použitelné hodnoty jsou 5v..10v + + + + + + + Standard + + + + + + + Optrex + + + + + + + If not zero will sound beeps if the transmitter has been left without inputs for the specified number of minutes. Pokud není nastaveno na nulu, bude zapnuto zvukové upozornění, že jste rádio nechali bez povšimnutí nastavený počet minut. + + + + + + + min + + + + + + + + + + + + + + Show splash screen on startup Zobrazit úvodní logo při zapnutí vysílčky + + + + + + + --- + + + + + + + 2s + + + + + + + 3s + + + + + + + 4s + + + + + + + 6s + + + + + + + 8s + + + + + + + 10s + + + + + + + 15s + + + + + + + 4800 Baud + + + + + + + 9600 Baud + + + + + + + 14400 Baud + + + + + + + 19200 Baud + + + + + + + 38400 Baud + + + + + + + 57600 Baud + + + + + + + 76800 Baud + + + + + + + 115200 Baud @@ -4726,6 +7451,27 @@ Použitelné hodnoty jsou 5v..10v + + + + + + + + + + + + + + + + + + + + + <!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; } @@ -4742,65 +7488,184 @@ p, li { white-space: pre-wrap; } + + + + + + + + + + + + + + X-Short Extra krátký + + + + + + + + + + + + + + Short Krátký + + + + + + + + + + + + + + Normal Normální + + + + + + + + + + + + + + Long Dlouhý + + + + + + + + + + + + + + X-Long Extra dlouhý + + + + + + + NMEA + + + + + + + Play Delay (switch mid position) Filtr poloh přepínače + + + + + + + Measurement Units Měrné jednotky + + + + + + + Haptic Mode Mód vibrací + + + + + + + Beeper Length Délka zvuku + + + + + + + Beeper Mode Mód zvuku + + + + + + + Beeper volume 0 - Quiet. No beeps at all. @@ -4818,9 +7683,26 @@ p, li { white-space: pre-wrap; } + + + + + + + Alarms Only Jen alarmy + + + Power On Speed + + + + + Power Off Speed + + GeneralSetupPanel @@ -4974,251 +7856,595 @@ Are you sure ? Hardware + + + + + + + Form + + + + + + + SQ + + + + + + + SR + + + + + + + LS2 + + + + + + + SP + + + + + + + SO + + + + + + + S4 S4 + + + + + + + RS + + + + + + + SB + + + + + + + PPM 2 + + + + + + + OFF Vypnuto + + + + + + + S-Port Mirror Zrcadlit S-Port + + + + + + + Telemetry Telemetrie + + + + + + + SBUS Trainer SBUS trenér + + + + + + + Debug + + + + + + + Rud Směrovka + + + + + + + PPM 3 + + + + + + + S1 S1 + + + + + + + S2 S2 + + + + + + + S3 S3 + + + + + + + PPM 1 + + + + + + + Serial Port Seriový port + + + + + + + v + + + + + + + PPM Multiplier PPM Násobič + + + + + + + Current Offset Ofset proudu + + + + + + + PPM 4 + + + + + + + SA + + + + + + + Ele Výškovka + + + Antenna Anténa + + + + + S5 S5 + + + + + + + Ail Křidélka + + + + + + + Thr Plyn + + + + + + + SC + + + + + + + LS + + + + + + + SD + + + + + + + Battery Offset Ofset baterie + + + + + + + SE + + + + + + + SF + + + + + + + SG + + + + + + + SH + + + + + + + SI + + + + + + + SJ + + + + + + + SK + + + + + + + SL + + + + + + + SM + + + + + + + SN + + + + + + + RS2 + + + + + + + Bluetooth + + + + + + + ADC Filter ADC filtr + + + + + + + Device Name: Název zařízení: @@ -5317,71 +8543,169 @@ Are you sure ? Heli + + + + + + + Invert Elevator Invertovat výškovku + + + + + + + Invert Aileron Invertovat křidélka + + + + + + + Invert Collective Invertovat kolektiv + + + + + + + Invert Invertovat + + + + + + + Off Vypnuto + + + + + + + 120 + + + + + + + 120X + + + + + + + 140 + + + + + + + 90 + + + + + + + Long. cyc + + + + + + + Lateral cyc + + + + + + + Collective Kolektiv + + + + + + + Swash Type Typ cykliky + + + + + + + Swash Ring Cyklika @@ -5774,46 +9098,109 @@ Are you sure ? LogsDialog + + + + + + + Companion Log Viewer Prohlížeč logu + + + + + + + Filename Soubor + + + + + + + Open LogFile Otevřít + + + + + + + Zoom + + + + + + + Save session CSV + + + + + + + X + + + + + + + Y + + + + + + + Reset + + + + + + + Fly sessions Lety @@ -7317,11 +10704,23 @@ Chcete změny uložit? MixerDialog + + + + + Dialog + + + + + + + Source Zdroj @@ -7330,21 +10729,70 @@ Chcete změny uložit? + + + + + + + + + + + + + + + + + + + + + + + + + + + + The source for the mixer Zdroj pro mix + + + + + + + Weight Váha + + + + + + + Offset Ofset + + + + + + + Include Trim Použít trim @@ -7352,31 +10800,87 @@ Chcete změny uložit? + + + + + + + + + + + + + + + + + + + + + GV GP + + + + + + + No Ne + + + + + + + Yes Ano + + + + + + + Curve Křivka + + + + + + + The curve used by the mix Křivka použitá pro mix + + + + + + + Switch used by the mix. If blank then the mix is considered to be "ON" all the time. Spínač aktivující mix. @@ -7384,16 +10888,37 @@ Pokud není uveden je mix aktivní pořád. + + + + + + + Switch Spínač + + + + + + + Warning Varování + + + + + + + Mixer warning. Setting this value will cause a beep to be emmitted when this value is active. Zvukové upozornění mixu. @@ -7401,31 +10926,73 @@ Pokud je tato volba aktivní bude na aktivaci mixu upozorněno zvukovým signál + + + + + + + OFF Vypnuto + + + + + + + 1 Beep 1x pípnutí + + + + + + + 2 Beep 2x pípnutí + + + + + + + 3 Beep 3x pípnutí + + + + + + + Multiplex Matematická operace + + + + + + + Multiplexer This determines how mixer values are added. @@ -7443,51 +11010,121 @@ Toto určuje, jak bude hodnota mixu přidána. + + + + + + + ADD Sečíst + + + + + + + MULTIPLY Násobit + + + + + + + REPLACE Zaměnit + + + + + + + Name Název + + + + + + + Flight modes Letové režimy + + + + + + + Include DR/Expo Použít DR/Expo + + + + + + + Delay Zpoždění + + + + + + + Slow Zpomalení + + + + + + + Up Při zapnutí mixu / (+) + + + + + + + Down Při vypnutí mixu / (-) @@ -7496,6 +11133,34 @@ Toto určuje, jak bude hodnota mixu přidána. + + + + + + + + + + + + + + + + + + + + + + + + + + + + <!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; } @@ -7544,6 +11209,12 @@ p, li { white-space: pre-wrap; } Invert All Invertovat vše + + + + FullScreenDialog + + MixersListWidget @@ -7717,11 +11388,23 @@ p, li { white-space: pre-wrap; } ModelEdit + + + + + Dialog + + + + + + + Simulate Simulace @@ -7775,6 +11458,12 @@ p, li { white-space: pre-wrap; } Telemetry Telemetrie + + + + FullScreenDialog + + ModelPrinter @@ -8593,138 +12282,324 @@ p, li { white-space: pre-wrap; } Module + + + + + + + Failsafe Mode Režim Failsafe + + + + + + + Start První kanál + + + + + + + PPM delay PPM zpoždění + + + + + + + Negative Negativní + + + + + + + Positive Pozitivní + + + + + + + Polarity Polarita + + + + + + + Trainer Mode Mód trenér + + + + + + + PPM Frame Length Délka PPM rámce + + + + + + + CH + + + + + + + Antenna Anténa + + + + + + + Option value Volitelná hodnota + + + + + + + Bind on startup Bind při spuštění + + + + + + + RF Output Power + + + + + + + Low Power Nízký výkon + + + + + + + us + + + + + + + Multi Radio Protocol Multi Rádio protokol + + + + + + + Sub Type + + + + + + + Master/Jack Učitel/Jack konektor + + + + + + + Slave/Jack Žák/Jack konektor + + + + + + + Master/SBUS Module Učitel/SBUS modul + + + + + + + Master/CPPM Module Učitel/CPPM modul + + + + + + + Master/SBUS in battery compartment Učitel/SBUS konektor v šachtě baterie + + + + + + + Show values in: Zobrazit hodnoty v: + + + + + + + % abbreviation for percent + + + + + + + μs abbreviation for microseconds + + + + + + + ms + + + + Receiver 1 @@ -8732,94 +12607,232 @@ p, li { white-space: pre-wrap; } + + + + + + + + + + + + X + + + + Receiver 2 + + + + Receiver 3 + + + + + + + WARNING: changing RF Output Power needs RE-BIND + + + + + + + Channels Počet kanálů + + + + Registration ID + + + + + + + WARNING: Requires non-certified firmware! + + + + + + + Not set Nenastaveno + + + + + + + Hold Držet hodnotu + + + + + + + Custom Vlastní + + + + + + + No Pulses Žádné pulzy + + + + + + + Receiver Dle nastavení přijímače + + + + + + + Failsafe Positions Pozice Failsafe + + + + + + + Protocol Protokol + + + + + + + Receiver No. Číslo přijímače + + + + + + + Output type Typ řízení výstupu + + + + + + + Open Drain + + + + + + + Push Pull + + + + + + Internal + Interní + + + + + + + Ext. + Int. + + ModuleData @@ -9558,21 +13571,49 @@ p, li { white-space: pre-wrap; } PrintDialog + + + + + + + Close Zavřít + + + + + + + Style + + + + + + + Print Tisk + + + + + + + Print to file Tisk do souboru @@ -9596,11 +13637,25 @@ p, li { white-space: pre-wrap; } ProgressDialog + + + + + + + Flash Firmware Zápis firmware + + + + + + + Close Zavřít @@ -9615,6 +13670,13 @@ p, li { white-space: pre-wrap; } ProgressWidget + + + + + + + Show Details Zobrazit podrobnosti @@ -9768,16 +13830,37 @@ p, li { white-space: pre-wrap; } RadioNotFoundDialog + + + + + + + No Radio Found Rádio nebylo nalezeno + + + + + + + <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>Rádio nebylo nalezeno!</p><p>Ujistěte se, že během zapínání rádia držíte spodní trimy proti sobě.</p><p>Až poté připojte USB kabel..</p><p><span style=" font-family:'arial,sans-serif'; font-size:13px; font-style:italic; color:#222222; background-color:#ffffff;">Pozor: pokud máte Taranis který ještě nebyl aktualizován na verzi alespoň 2.0, potom tato verze Companion nebude fungovat.</span></p></body></html> + + + + + + + OK @@ -9786,43 +13869,99 @@ p, li { white-space: pre-wrap; } RadioOutputsWidget - + + + + + + + + + Form - + + + + + + + + + View: Zobrazení: - + + + + + + + + + Logical Switches Logické spínače - + + + + + + + + + Global Variables Globální proměnné - + + + + + + + + + Channel Outputs Výstupy kanálů - + + + + + + + + + Mix Outputs - + + + + + + + + + L o g @@ -9832,7 +13971,15 @@ c - + + + + + + + + + G l o @@ -9843,7 +13990,15 @@ l - + + + + + + + + + C h a @@ -9856,7 +14011,15 @@ s - + + + + + + + + + M i x @@ -10695,161 +14858,385 @@ s Setup + + + + + + + Center beep Zvuk ve středové poloze + + + + + + + OFF Vypnuto + + + + + + + Model Image Obrázek modelu + + + + + + + Exponential Exponenciální + + + + + + + Throttle Trim Idle Only Trim volnoběhu plynu + + + + + + + Timer 3 Stopky3 + + + + + + + Extra Fine Extra jemný + + + + + + + Fine Jemný + + + + + + + Medium Střední + + + + + + + Coarse Hrubý + + + + + + + Display Checklist Zobrazit poznámky + + + + + + + Timer 2 Stopky2 + + + + + + + Timer 1 Stopky1 + + + + + + + Never Nikdy + + + + + + + On change Při změně + + + + + + + Always Vždy + + + + + + + Global Functions Globální funkce + + + + + + + Edit Checklist... + + + + + + + Throttle Source Stopa plynu + + + + + + + Trim Step Krok trimu + + + + + + + Trims Display Číselné zobrazení trimu + + + + + + + Warnings Předletová kontrola + + + + + + + Top LCD Timer Stopky na horním LCD + + + + + + + Switch Warnings Polohy spínačů + + + + + + + Pot Warnings Hodnoty potenciometrů + + + + + + + Manual + + + + + + + Auto + + + + + + + Model + + + + + + + Extended Limits Rozšířené limity (125%) + + + + + + + Extended Trims Rozšířený rozsah trimů + + + + + + + Throttle Warning Alarm plynu + + + + + + + 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. @@ -10862,6 +15249,13 @@ Funkce trimu bude opačná, stejně tak i varování polohy páky plynu. + + + + + + + Reverse Throttle Revers plynu @@ -11233,181 +15627,421 @@ Profil ID: [%1]; Rádio ID: [%2] 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. @@ -11488,76 +16122,172 @@ Profil ID: [%1]; Rádio ID: [%2] SimulatorStartupDialog - + + + + + + + + + OpenTX Simulator - Startup Options OpenTX Simulator - Možnosti spuštění - + + + + + + + + + Simulator Startup Options: Možnosti spuštění simulátoru: - + + + + + + + + + Radio Profile: Profil rádia: - + + + + + + + + + Existing radio profiles are shown here.<br /> Create or edit profiles using the Companion application. - + + + + + + + + + Radio Type: Typ rádia: - + + + + + + + + + Existing radio simulators are shown here.<br /> The radio type specified in the selected profile is used by default. - + + + + + + + + + Data Source: Zdroj dat: - + + + + + + + + + Data File: Datový soubor: - + + + + + + + + + Data Folder: Složka dat: - + + + + + + + + + SD Image Path: Cesta k obsahu 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! - + + + + + + + + + Select data file... @@ -11565,59 +16295,147 @@ The radio type specified in the selected profile is used by default. - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + ... - + + + + + + + + + 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 Soubor - + + + + + + + + + Folder - + + + + + + + + + SD Path @@ -11646,7 +16464,15 @@ The default is configured in the chosen Radio Profile. SimulatorWidget - + + + + + + + + + Companion Simulator Companion Simulátor @@ -11734,6 +16560,20 @@ The default is configured in the chosen Radio Profile. + + + + + + + + + + + + + + ... @@ -11773,6 +16613,13 @@ The default is configured in the chosen Radio Profile. StyleEditDialog + + + + + + + @@ -11781,21 +16628,49 @@ The default is configured in the chosen Radio Profile. + + + + + + + &Reset to default + + + + + + + &Cancel + + + + + + + &OK + + + + + + + This feature does not validate your changes and assumes you are familiar with CSS syntax for QT. @@ -12053,190 +16928,475 @@ Too many errors, giving up. Telemetry + + + + + + + A1 Telem. vstup A1 + + + + + + + A2 Telem. vstup A2 + + + + + + + RSSI + + + + + + + Alarm 1 + + + + + + + + + + + + + + ---- + + + + + + + + + + + + + + Yellow Žlutá + + + + + + + + + + + + + + Orange Oranžová + + + + + + + + + + + + + + Red Červená + + + + + + + Alarm 2 + + + + + + + Disable telemetry audio warnings + + + + + Source Zdroj + + + + + + + Center Silent Tichý střed + + + + + + + Altitude source Zdroj výšky + + + + + + + Volts source Zdroj napětí + + + + + + + Top Bar Hodnoty na horní liště + + + + + + + Serial Protocol Sériový protokol + + + + + + + Sensors Senzory + + + + + + + Disable multi sensor handling Ignoruj chyby ID senzorů (znemožní násobné užití týž senzorů) + + + + + + + Volt source Snímač napětí + + + + + + + Current source Snímač proudu + + + + + + + Protocol Protokol + + + + + + + None Žádný + + + + + + + FrSky Sensor Hub FrSky Senzor Hub + + + + + + + Blades Počet listů vrtule + + + + + + + Sink Max Klesání Max + + + + + + + Climb Max Stoupání Max + + + + + + + Sink Min Klesání Min + + + + + + + Climb Min Stoupání Min + + + + + + + Vario source Vario senzor + + + + + + + Vario limits Rozsah varia + + + + + + + Altimetry + + + + + + + mAh + + + + + + + A + + + + + + + Various Různé + + + + + + + mAh count Počet mAh + + + + + + + FAS Offset Ofset FAS + + + + + + + Persistent mAh Ukládat hodnoty @@ -12245,107 +17405,289 @@ Too many errors, giving up. TelemetryAnalog + + + + + + + Unit Jednotky + + + + + + + Max Value Maximim + + + + + + + Alarm 1 + + + + + + + + + + + + + + ---- + + + + + + + + + + + + + + Yellow Žlutá + + + + + + + + + + + + + + Orange Oranžová + + + + + + + + + + + + + + Red Červená + + + + + + + + + + + + + + < + + + + + + + + + + + + + + > + + + + + + + Alarm 2 + + + + + + + Offset Ofset + + + + + + + Volts (V) Volty (V) + + + + + + + Amps (A) Ampéry (A) + + + + + + + Speed (m/s or ft/s) Rychlost (m/s nebo ft/s) + + + + + + + Raw (-) Jednotky (-) + + + + + + + Speed (km/h or miles/h) Rychlost (km/h nebo míle/h) + + + + + + + Meters (m or ft) Vzdálenost (m nebo ft) + + + + + + + Temp (°) Teplota (°) + + + + + + + Fuel (%) Palivo (%) + + + + + + + mAmps (mA) MiliAmpéry (mA) @@ -12359,6 +17701,13 @@ Too many errors, giving up. TelemetryCustomScreen + + + + + + + Custom Screen Type Typ panelu @@ -12384,21 +17733,49 @@ Too many errors, giving up. + + + + + + + Min + + + + + + + Source Zdroj + + + + + + + Gauge Ukazatel + + + + + + + Max @@ -12512,86 +17889,199 @@ Too many errors, giving up. TelemetrySensor + + + + + + + Form + + + + + + + Custom Vlastní + + + + + + + Calculated Vypočtený + + + + + + + Id + + + + + + + Instance + + + + Rx + + + + Mod. + + + + + + + Add Součet + + + + + + + Average Průměr + + + + + + + Min + + + + + + + Max + + + + + + + Multiply Násobení + + + + + + + Totalize + + + + + + + Cell Článek + + + + + + + Consumption Spotřeba + + + + + + + Dist Vzdálenost + + + + + + + Cells Sensor : Senzor článků : @@ -12604,191 +18094,506 @@ Too many errors, giving up. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --- + + + + + + + GPS Sensor : GPS Senzor : + + + + + + + Alt. Sensor : Senzor výšky : + + + + + + + Sensor : Senzor : + + + + + + + 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 (-) Jednotky (-) + + + + + + + RPM Otáčky (ot/min) + + + + + + + Precision Přesnost + + + + + + + Ratio + + + + + + + Blades Listy vrtule + + + + + + + Offset Ofset + + + + + + + Multiplier Násobitel + + + + + + + Auto Offset Auto ofset + + + + + + + Filter Filtr + + + + + + + Persistent Trvalé + + + + + + + Positive Pozitivní + + + + + + + Logs Logovat @@ -12820,116 +18625,268 @@ Too many errors, giving up. TelemetrySimulator - + + + + + + + + + Telemetry Simulator - + + + + + + + + + VFAS - + + + + + + + + + RSSI - + + + + + + + + + A1 Telem. vstup A1 - + + + + + + + + + A2 Telem. vstup A2 - + + + + + + + + + Simulate Simulace - + + + + + + + + + Replay SD Log File - + + + + + + + + + Replay rate - + + + + + + + + + Load - + + + + + + + + + |> - + + + + + + + + + <| - + + + + + + + + + > - + + + + + + + + + <- - + + + + + + + + + X - + + + + + + + + + Row # Timestamp - + + + + + + + + + 1/5x - + + + + + + + + + 5x - + + + + + + + + + No Log File Currently Loaded - + + + + + + + + + RAS @@ -12937,21 +18894,61 @@ Timestamp - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + V / ratio - + + + + + + + + + Db - + + + + + + + + + RxBt @@ -12969,121 +18966,377 @@ Timestamp - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <html><head/><body><p><br/></p></body></html> - + + + + + + + + + Tmp1 - + + + + + + + + + A3 Telem. vstup A3 - + + + + + + + + + A4 Telem. vstup A4 - + + + + + + + + + Tmp2 - + + + + + + + + + Fuel Palivo - - + + + + + + + + + + + + + + + + + + °C - + + + + + + + + + ml - + + + + + + + + + % - - + + + + + + + + + + + + + + + + + + Meters - + + + + + + + + + Alt Výška - + + + + + + + + + VSpd - + + + + + + + + + m/s - + + + + + + + + + Fuel Qty - - + + + + + + + + + + + + + + + + + + km/h - + + + + + + + + + Hdg - + + + + + + + + + ASpd @@ -13091,135 +19344,335 @@ Timestamp - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + G - + + + + + + + + + GPS - + + + + + + + + + Lat,Lon (dec.deg.) - + + + + + + + + + AccX - + + + + + + + + + dd-MM-yyyy hh:mm:ss - + + + + + + + + + Date - + + + + + + + + + Amps - + + + + + + + + + AccZ - + + + + + + + + + GAlt - - + + + + + + + + + + + + + + + + + + Volts - + + + + + + + + + Cels - + + + + + + + + + Curr Proud - + + + + + + + + + AccY - + + + + + + + + + GSpd - + + + + + + + + + Degrees - + + + + + + + + + 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 Otáčky (ot/min) - + + + + + + + + + When enabled, sends any non-blank values as simulated telemetry data. @@ -13261,11 +19714,25 @@ hh:mm:ss Timer + + + + + + + Countdown Odečítat + + + + + + + Minute Call Oznamovat minuty @@ -13349,26 +19816,61 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. Trainer + + + + + + + Form + + + + + + + Mode Mód + + + + + + + Input Vstup + + + + + + + Weight Váha + + + + + + + Rud Směrovka @@ -13381,6 +19883,62 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Beeper volume 0 - Quiet. No beeps at all. @@ -13401,6 +19959,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + Off Vypnuto @@ -13409,6 +19995,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + += (Sum) += (Sečíst) @@ -13417,6 +20031,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + := (Replace) := (Nahradit) @@ -13425,6 +20067,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn1 Kanál 1 @@ -13433,6 +20103,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn2 Kanál 2 @@ -13441,6 +20139,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn3 Kanál 3 @@ -13449,21 +20175,70 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn4 Kanál 4 + + + + + + + Ele Výškovka + + + + + + + Thr Plyn + + + + + + + Ail Křidélka @@ -13472,7 +20247,15 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. TrainerSimulator - + + + + + + + + + Trainer simulator @@ -13897,12 +20680,26 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. burnConfigDialog + + + + + + + Programmer Configuration Configuration AVRDUDE / SAM-BA Konfigurace programátoru + + + + + + + Location of AVRDUDE executable Cesta k binárce AVRDUDE @@ -13911,11 +20708,46 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + The location of the AVRDUDE executable. Cesta k binárce AVRDUDE. + + + + + + + DFU-Util Location Cesta k DFU Util @@ -13923,6 +20755,27 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + Use this button to browse and look for the AVRDUDE executable file. Použijte toto tlačítko k vyhledání binárky AVRDUDE. @@ -13930,39 +20783,116 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + Browse... Procházet ... + + + + + + + Programmer Typ programátoru + + + + + + + Programmer used for communicating with the controller. Please consult the programmer's documentation and the AVRDUDE documentation to select the appropriate programmer. Programátor použitý pro komunikaci s mikrokontrolérem. + + + + + + + List all available programmers. Seznam použitelných programátorů. + + + + + + + List Available Vypsat vše + + + + + + + + + + + + + + Extra arguments that will be passed to AVRDUDE on every call Vlastní parametry které budou předány AVRDUDE při každém volání + + + + + + + + + + + + + + Extra arguments used in AVRDUDE. This can be used for providing extra information to AVRDUDE. @@ -13975,21 +20905,49 @@ Můžete poškodit váš mikrokontrolér. + + + + + + + Extra Arguments Vlastní parametry + + + + + + + Show AVRDUDE help Zobrazit nápovědu AVRDUDE + + + + + + + Show Help Nápověda + + + + + + + Communication port to the programmer. Komunikační port programátoru. @@ -13998,33 +20956,96 @@ Můžete poškodit váš mikrokontrolér. + + + + + + + + + + + + + + Port Port programátoru + + + + + + + AVRDUDE Location Cesta k AVRDUDE + + + + + + + at91sam3s8-9xr + + + + + + + Use advanced controls Rozšířené volby + + + + + + + + + + + + + + CPU of your TX Procesor/mikrokontrolér vašeho rádia + + + + + + + + + + + + + + CPU present on your 9x radio Should be m64 for stock radios m2560 for v4.1 boards @@ -14034,32 +21055,81 @@ m2560 pro V4 desky + + + + + + + SAM-BA Location Cesta k SAM-BA + + + + + + + Alternate device + + + + + + + + + + + + + + Location of sam-ba executable Cesta k binárce sam-ba + + + + + + + MCU Typ procesoru CPU/MCU + + + + + + + ARM MCU + + + + + + + sam-ba serial port sériový port sam-ba @@ -14105,85 +21175,197 @@ m2560 pro V4 desky joystickDialog - + + + + + + + + + Configure Joystick Nastavte joystick - + + + + + + + + + Ch2 - + + + + + + + + + Ch1 - + + + + + + + + + Ch4 - + + + + + + + + + Ch6 - + + + + + + + + + Ch3 - + + + + + + + + + Ch5 - + + + + + + + + + Ch7 - + + + + + + + + + Ch8 - + + + + + + + + + Instructions Instrukce - + + + + + + + + + Enable Povolit - + + + + + + + + + Cancel Zrušit - + + + + + + + + + Back - + + + + + + + + + Start První kanál @@ -14194,7 +21376,15 @@ m2560 pro V4 desky - + + + + + + + + + Ok OK diff --git a/companion/src/translations/companion_de.ts b/companion/src/translations/companion_de.ts index ebf605eff..e5485ebfb 100644 --- a/companion/src/translations/companion_de.ts +++ b/companion/src/translations/companion_de.ts @@ -93,41 +93,97 @@ AppPreferencesDialog + + + + + + + Edit Settings Editiere Einstellungen + + + + + + + Radio Profile Sender Profil + + + + + + + Default Channel Order Voreingest. Kanalordnung + + + + + + + Build Options Software zusammenstellen + + + + + + + Menu Language Menüsprache + + + + + + + Default Stick Mode Standard Knüppelmodus + + + + + + + Select Image Wähle Bild + + + + + + + Mode selection: Mode 1: @@ -169,172 +225,417 @@ Mode 4: + + + + + + + Mode 1 (RUD ELE THR AIL) Mode 1 (Seite Höhe Gas Quer) + + + + + + + Mode 2 (RUD THR ELE AIL) Mode 2 (Seite Gas Höhe Quer) + + + + + + + Mode 3 (AIL ELE THR RUD) Mode 3 (Quer Höhe Gas Seite) + + + + + + + Mode 4 (AIL THR ELE RUD) Mode 4 (Quer, Gas, Höhe, Seite) + + + + + + + Splash Screen Splash Screen + + + + + + + + + + + + + + The profile specific folder, if set, will override general Backup folder + + + + + + + Backup folder Backup Verzeichnis + + + + + + + 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>Kanalreihenfolge</p><p><br/></p><p>Definiert die Reihenfolge der Mischer wenn ein neues Modell erzeugt wird.</p></body></html> + + + + + + + R E T A S H G Q + + + + + + + R E A T S H Q G + + + + + + + R T E A S G H Q + + + + + + + R T A E S G Q H + + + + + + + R A E T S Q H G + + + + + + + R A T E S Q G H + + + + + + + E R T A H S G Q + + + + + + + E R A T H S Q G + + + + + + + E T R A H G S Q + + + + + + + E T A R H G Q S + + + + + + + E A R T H Q S G + + + + + + + E A T R H Q G S + + + + + + + T R E A G S H Q + + + + + + + T R A E G S Q H + + + + + + + T E R A G H S Q + + + + + + + T E A R G H Q S + + + + + + + T A R E G Q S H + + + + + + + T A E R G Q H S + + + + + + + A R E T Q S H G + + + + + + + A R T E Q S G H + + + + + + + A E R T Q H S G + + + + + + + A E T R Q H G S + + + + + + + A T R E Q G S H + + + + + + + A T E R Q G H S @@ -345,272 +646,680 @@ Mode 4: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Select Folder Wähle Verzeichnis + + + + + + + Select Executable Wähle ausführbare Datei (Programm) + + + + Release channel + + + + Releases (stable) + + + + Release candidates (testing) + + + + Nightly builds (unstable) + + + + + + + Simulator Volume Gain Simulator Lautstärke + + + + + + + Profile Name Profil Name + + + + + + + Clear Image Lösche Bild + + + + + + + Append version number to FW file name Versionsnummer an die Bezeichnung des Firmware-Files anhängen + + + + + + + Offer to write FW to Tx after download Firmware nach dem Download in den Sender schreiben + + + + + + + Radio Type Sender Typ + + + + + + + Other Settings Andere Einstellungen + + + + + + + General Settings Sender Grundeinstellungen + + + + + + + SD Structure path SD Verzeichnis Pfad + + + + + + + Application Settings Anwendungs-Einstellungen + + + + + + + Show splash screen when Companion starts Zeigt das Startbild wenn Companion startet + + + + + + + Automatic check for Companion updates Automatisches Prüfen auf Companion Updates + + + + + + + + + + + + + + Enable automatic backup before writing firmware Erstelle automatische Backups, bevor neue Firmware in den Sender geschrieben wird + + + + + + + Automatic check for OpenTX firmware updates Automatisches Prüfen auf OpenTX Firmware Updates + + + + + + + Splash Screen Library Splash Screen Verzeichnis + + + + + + + Google Earth Executable Ausführbare Datei Google Earth + + + + + + + Only show user splash images Nur das Benutzter-Bild zeigen + + + + + + + Show user and companion splash images Zeige Benutzer-und CompanionBild + + + + + + + User Splash Screens Verwende Startbild + + + + + + + Automatic Backup Folder Autom. Backup Verzeichnis + + + + + + + Simulator Settings Simulator Einstellungen + + + + + + + Simulator BackLight Simulator LCD-Beleuchtung + + + + + + + Enable Freigabe + + + + + + + most recently used files Zuletzt verwendete Dateien + + + + + + + Startup Settings Starteinstellungen + + + + + + + Remember Merke + + + + + + + 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> + + + + + + + Remove empty model slots when deleting models (only applies for radios w/out categories) Leere Speicherplätze beim Löschen eines Modells entfernen (gilt nur für Sender ohne Kategorien) + + + + + + + Use model wizard Benutze den Modellwizard + + + + + + + Open model editor Öffne den Modelleditor + + + + + + + Just create the model Leeres Modell erzeugen + + + + + + + Debug Output Logging + + + + + + + <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) Anwendung (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) Senderfirmware (im Simulator) + + + + + + + Action on New Model Aktion die beim Anlegen eines neuen Modells ausgeführt werden soll + + + + + + + Blue Blau + + + + + + + Green Grün + + + + + + + Red Rot + + + + + + + Orange Orange + + + + + + + Yellow Gelb + + + + + + + Screenshot capture folder Screenshot Verzeichnis + + + + + + + Joystick Joystick + + + + + + + Calibrate Kalibrieren + + + + + + + Only capture to clipboard Hardcopy nur in die Zwischenablage speichern + + + + + + + Remember simulator switch values Schalterstellungen im Simulator merken @@ -691,6 +1400,31 @@ Mode 4: Images (%1) Bilder (%1) + + + + + Use releases (stable) + + + + + Use release candidates (testing) + + + + + + + Use nightly builds (unstable) + + + + + + Use releases and release candidates (testing) + + BinEepromFormat @@ -911,36 +1645,85 @@ Mode 4: ChecklistDialog + + + + + + + Edit Checklist Editiere Checkliste + + + + + + + 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 Datei: unbekannt @@ -1188,31 +1971,73 @@ If you have a settings backup file, you may import that instead. CompareDialog + + + + + + + Compare Models Vergleiche Modelle + + + + + + + To compare models, drag and drop them anywhere in this window. Um Modelle zu vergleichen, Drag und Drop sie in dieses Fenster. + + + + + + + Close Schliessen + + + + + + + Style + + + + + + + Print Drucken + + + + + + + Print to file Druck in Datei @@ -1370,87 +2195,213 @@ If you have a settings backup file, you may import that instead. Curves + + + + + + + Fixed X Feste X-Werte + + + + + + + Custom X Var X und Y + + + + + + + Lines Linien + + + + + + + Smooth Verrunden + + + + + + + + + + + + + + Curve type Kurven Typ + + + + + + + Curve Creator Kurve erzeugen + + + + + + + Y at X=0 Y bei X=0 + + + + + + + Point size + + + + + + + Y at X=100 Y bei X=100 + + + + + + + Both Beide + + + + + + + x>0 x>0 + + + + + + + x<0 x<0 + + + + + + + Apply Anwenden + + + + + + + Side Seite + + + + + + + Y at X=-100 Y bei X=-100 + + + + + + + Coefficient Expo-Faktor + + + + + + + Curve name Kurven Name @@ -1863,42 +2814,133 @@ If you have a settings backup file, you may import that instead. CustomizeSplashDialog + + + + + + + Transmitter Splash Screen Editor Sender Startbild-Editor + + + + + + + + + + + + + + Invert Invertieren + + + + + + + + + + + + + + Load FW Lade FW + + + + + + + + + + + + + + Load Pict Lade Bild + + + + + + + + + + + + + + Load Profile Lade Profil + + + + + + + + + + + + + + Save speichern + + + + + + + + + + + + + + Open Splash Library Splash Bibliothek öffnen @@ -1907,6 +2949,34 @@ If you have a settings backup file, you may import that instead. + + + + + + + + + + + + + + + + + + + + + + + + + + + + ... ... @@ -2022,48 +3092,48 @@ If you have a settings backup file, you may import that instead. Übersetzungsfehler im Feld %1 - + Switch Schalter - + Switch Schalter - + cannot be exported on this board! Kann nicht in dieses Board übertagen werden! - + Source Quelle - + Source %1 cannot be exported on this board! - + OpenTX only accepts %1 points in all curves OpenTX unterstützt nur maximal %1 Stützstellen für alle Kurven - + OpenTx only accepts %1 points in all curves - - + + OpenTX on this board doesn't accept this function OpenTX unterstützt diese Funktion für dieses Board nicht - + OpenTX doesn't accept this radio protocol OpenTx kennt dieses Sendeprotokoll nicht @@ -2072,86 +3142,198 @@ If you have a settings backup file, you may import that instead. DebugOutput - + + + + + + + + + Debug Output Debug Ausgabe - + + + + + + + + + <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: 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: Buffer: - + + + + + + + + + Number of lines to keep in display. - + + + + + + + + + Filter &Help Filter &Hilfe - + + + + + + + + + Show information about using the filter. - + + + + + + + + + Word &Wrap - + + + + + + + + + Toggle word wrapping on/off. - + + + + + + + + + &Clear &Löschen - + + + + + + + + + Clear the output window of all text. - + + + + + + + + + Enable &Filter Freigabe &Filter - + + + + + + + + + Turn the filter on/off. Filter Ein/Aus. @@ -2170,6 +3352,13 @@ To <b>remove a remembered entry</b> from the filter list, first cho DownloadDialog + + + + + + + Downloading: Herunterladen: @@ -2313,6 +3502,13 @@ To <b>remove a remembered entry</b> from the filter list, first cho ExpoDialog + + + + + + + Weight Gewichtung @@ -2320,102 +3516,256 @@ To <b>remove a remembered entry</b> from the filter list, first cho + + + + + + + + + + + + + + + + + + + + + GV GV + + + + + + + Offset Offset + + + + + + + The source for the mixer Die Mischerquelle + + + + + + + Input name Input Name + + + + + + + Flight modes Flugphasen + + + + + + + Switch Schalter + + + + + + + Source Quelle + + + + + + + Line name Info Name + + + + + + + Stick Side Knüppel Seite + + + + + + + Scale Skalierung + + + + + + + Include Trim Trimmung einschliessen + + + + + + + No Nein + + + + + + + Yes Ja + + + + + + + Curve Kurve + + + + + + + Curve applied to the source. Kurve die auf die Quelle angewendet wird. + + + + + + + NEG NEG + + + + + + + Source for the mixer. Quelle für den Mischer. + + + + + + + Switch used to enable the line. If blank then the input is considered to be "ON" all the time. Schalter mit dem der Input freigegeben wird Steht nichts drinnen ist er immer "EIN". + + + + + + + POS POS + + + + + + + ALL BEIDE @@ -3058,31 +4408,73 @@ Blank means include all. ?, *, and [...] wildcards accepted. FirmwarePreferencesDialog + + + + + + + Downloads Downloads + + + + + + + Check for updates Prüfe auf Updates + + + + + + + Firmware Firmware + + + + + + + Download firmware Download Firmware + + + + + + + Download SD contents Download SD-Karteninhalt + + + + + + + Latest Download Letztes Download @@ -3124,67 +4516,158 @@ Blank means include all. ?, *, and [...] wildcards accepted. FlashEEpromDialog + + + + + + + Write Models and Settings to Radio Schreibe Modelle und Einstellungen in den Sender + + + + + + + Load... Laden... + + + + + + + Current Profile Aktuelles Profil + + + + + + + Allows Companion to write to older version of the firmware + + + + + + + Check Firmware compatibility Firmware Kompatibilität prüfen + + + + + + + <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 Sichern vor schreiben + + + + + + + <html><head/><body><p>Modify calibration parameters using settings from current profile</p></body></html> + + + + + + + Patch calibration setting from profile + + + + + + + <html><head/><body><p>Modify HW parameters using settings from current profile</p></body></html> + + + + + + + Patch HW settings from profile + + + + + + + Cancel Abbrechen + + + + + + + Write to TX Schreibe in Sender @@ -3242,71 +4725,169 @@ Blank means include all. ?, *, and [...] wildcards accepted. FlashFirmwareDialog + + + + + + + Flash Firmware Flashe Firmware + + + + + + + Load... Laden... + + + + + + + Date & Time Datum & Uhrzeit + + + + + + + Variant Variante + + + + + + + Version Version + + + + + + + Use profile start screen Verwende das Profil Startbild + + + + + + + Use firmware start screen Verwende den Firmware Startscrenn + + + + + + + Use library start screen Verwende den Bibliothek Startscreen + + + + + + + Use another start screen Verwende einen anderen Start Screen + + + + + + + Allows Companion to write to older version of the firmware + + + + + + + Check Hardware compatibility Prüfe die Hardware-kompatibilität + + + + + + + Backup and restore Models and Settings + + + + + + + Cancel Abbrechen + + + + + + + Write to TX Schreibe in Sender @@ -3505,21 +5086,49 @@ You are currently using: FlightMode + + + + + + + Fade In Fade In + + + + + + + Fade Out Fade Out + + + + + + + Name Name + + + + + + + Switch Schalter @@ -3709,11 +5318,25 @@ You are currently using: FusesDialog + + + + + + + Fuses Fuses + + + + + + + <!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; } @@ -3731,11 +5354,25 @@ p, li { white-space: pre-wrap; } + + + + + + + Read Fuses Lese Fuses + + + + + + + <!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; } @@ -3755,12 +5392,26 @@ p, li { white-space: pre-wrap; } + + + + + + + Reset Fuses EEPROM - PROTECT + + + + + + + <!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; } @@ -3780,12 +5431,26 @@ p, li { white-space: pre-wrap; } + + + + + + + Reset Fuses EEPROM - DELETE + + + + + + + <!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; } @@ -3855,11 +5520,25 @@ p, li { white-space: pre-wrap; } GeneralEdit + + + + + + + Radio settings Sender Grundeinstellungen + + + + + + + General settings used throught the transmitter. These will be relevant for all models in the same EEPROM. Sender Grundeinstellungen. @@ -3877,11 +5556,25 @@ Dieses sind für alle Modelle im gleichen EEPROM gültig. + + + + + + + Store calib. and hw settings in selected profile Sichere Kal.-und HW-Einstllungen im ausgew. Profil + + + + + + + Retrieve calib. and hw settings from profile Verwende Kal-und HW Einstellungen aus dem Profil @@ -3938,127 +5631,309 @@ Dieses sind für alle Modelle im gleichen EEPROM gültig. GeneralSetup + + + + + + + Form Form + + + + + + + Readonly Unlock Schreibschutz freigeben + + + + + + + SC SC + + + + + + + SE SE + + + + + + + SA SA + + + + + + + SF SF + + + + + + + SH SH + + + + + + + SD SD + + + + + + + SB SB + + + + + + + SG SG + + + + + + + Timeshift from UTC Zeitverschiebung von UTC + + + + + + + Voice Language Ansagesprache + + + + + + + Country Code Ländercode + + + + + + + Stick reverse Knüppel umkehren + + + + + + + FAI Mode FAI Modus + + + + + + + Adjust RTC Uhr einstellen + + + + + + + Vario pitch at max Vario Tonhöhe bei Max-Steig + + + + + + + + + + + + + + Hz Hz + + + + + + + Speaker Volume Gesamtlautstärke + + + + + + + Backlight Switch LCD-Beleuchtung EIN mit + + + + + + + Sound Mode Sound Modus + + + + + + + Color 1 Farbe 1 + + + + + + + Color 2 Farbe2 + + + + + + + Speaker Pitch (spkr only) Lautstärke (Spkr Mod) + + + + + + + If this value is not 0, any keypress will turn on the backlight and turn it off after the specified number of seconds. Wenn dieser Wert ungleich 0 ist, wird die Hintergrundbeleuchtung nach irgendeinem Tastendruck eingeschaltet und nach einer eingestellten Zeit in Sekunden ausgeschaltet. @@ -4067,82 +5942,209 @@ und nach einer eingestellten Zeit in Sekunden ausgeschaltet. + + + + + + + + + + + + + + + sec sek + + + + + + + Backlight color LCD-Beleuchtung Farbe + + + + + + + Beeper Piepser + + + + + + + Speaker Lautsprecher + + + + + + + BeeperVoice Beeper Sound + + + + + + + SpeakerVoice Sprecher Stimme + + + + + + + Beep volume Piepser Lautstärke + + + + + + + Wav volume Wav Lautstärke + + + + + + + Vario volume Vario Lautstärke + + + + + + + Background volume Hintergrundlautstärke + + + + + + + + + + + + + + ms ms + + + + + + + Backlight Auto OFF after LCD-Beleuchtung AUS nach + + + + + + + Backlight flash on alarm LCD-Beleuchtung an bei Alarm + + + + + + + Vario pitch at zero Vario Tonhöhe bei Min-Sink + + + + + + + Vario repeat at zero Vario Ton Wiederholrate + + + + + + + This is the switch selectrion for turning on the backlight (if installed). @@ -4153,6 +6155,20 @@ und nach einer eingestellten Zeit in Sekunden ausgeschaltet. + + + + + + + + + + + + + + <!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; } @@ -4164,41 +6180,97 @@ Die Werte können sein + + + + + + + Backlight Brightness LCD-Beleuchtung Helligkeit + + + + + + + RotEnc Navigation Drehgeber Navigation + + + + + + + Automatically adjust the radio's clock if a GPS is connected to telemetry. Automatisches Einstellen der Uhr im Sender wenn GPS mit der Telemetrie verbunden. + + + + + + + America Amerika + + + + + + + Japan Japan + + + + + + + Europe Europa + + + + + + + Backlight OFF Brightness Resthelligkeit wenn Beleuchtung AUS + + + + + + + Mode selection: Mode 1: @@ -4240,346 +6312,845 @@ Mode 4: + + + + + + + Mode 1 (RUD ELE THR AIL) Mode 1 (Sei Höh Gas Qur) + + + + + + + Mode 2 (RUD THR ELE AIL) Mode 2 (Sei Gas Höh Qur) + + + + + + + Mode 3 (AIL ELE THR RUD) Mode 3 (Qur Höh Gas Sei) + + + + + + + Mode 4 (AIL THR ELE RUD) Mode 4 (Qur Gas Höh Sei) + + + + + + + <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>Kanalreihenfolge</p><p><br/></p><p>Definiert die Reihenfolge der Mischer wenn ein neues Modell erzeugt wird.</p></body></html> + + + + + + + If you enable FAI, only RSSI and RxBt sensors will keep working. This function cannot be disabled by the radio. Wenn man FAI auswählt gibt es nur noch RSSI und RxBat Werte. Diese Funktion kann dann im Sendern nicht mehr deaktiviert werden. + + + + + + + RSSI Poweroff Warning RSSI Poweroff Warnung + + + + + + + Low EEPROM Warning Low EEPROM Warnung + + + + Owner Registration ID + + + + aaaaaaAA + + + + + + + R E T A S H G Q + + + + + + + R E A T S H Q G + + + + + + + R T E A S G H Q + + + + + + + R T A E S G Q H + + + + + + + R A E T S Q H G + + + + + + + R A T E S Q G H + + + + + + + E R T A H S G Q + + + + + + + E R A T H S Q G + + + + + + + E T R A H G S Q + + + + + + + E T A R H G Q S + + + + + + + E A R T H Q S G + + + + + + + E A T R H Q G S + + + + + + + T R E A G S H Q + + + + + + + T R A E G S Q H + + + + + + + T E R A G H S Q + + + + + + + T E A R G H Q S + + + + + + + T A R E G Q S H + + + + + + + T A E R G Q H S + + + + + + + A R E T Q S H G + + + + + + + A R T E Q S G H + + + + + + + A E R T Q H S G + + + + + + + A E T R Q H G S + + + + + + + A T R E Q G S H + + + + + + + A T E R Q G H S + + + + Power On Delay + + + + + + + Jack Mode + + + + + + + Audio + + + + + + + Trainer Schüler Signaleingang + + + + + + + DMS + + + + + + + USB Mode + + + + Power Off Delay + + + + + + + + + + + + + + Ask on Connect Nachfragen beim Verbinden + + + + + + + Joystick (HID) + + + + + + + USB Mass Storage + + + + + + + USB Serial (CDC) USB Serial (CDC) + + + + + + + Stick Mode Knüppelmodus + + + + + + + Metric Metrisch + + + + + + + Imperial Zöllig + + + + + + + Default Channel Order Voreingest. Kanalordnung + + + + + + + GPS Coordinates GPS Koordinaten + + + + + + + Min Min + + + + + + + + + + + + + + v V + + + + + + + Max Max + + + + + + + Inactivity Timer Inaktivitätstimer + + + + + + + Show Splash Screen on Startup Zeige Startbild an + + + + + + + Contrast LCD Kontrast + + + + + + + Battery Meter Range Akku Ladestand + + + + + + + Haptic Strength Haptik Stärke + + + + + + + LCD Display Type LCD Display Typ + + + + + + + "No Sound" Warning Keine Sound Warnung + + + + + + + Battery Warning Sender Akkuwarnung + + + + + + + Haptic Length Haptik Länge + + + + + + + MAVLink Baud Rate Mav Link Baudrate + + + + + + + + + + + + + + Quiet Stumm + + + + + + + Only Alarms Nur Alarme + + + + + + + + + + + + + + No Keys Kein Tastenpieps + + + + + + + + + + + + + + All Alles + + + + + + + Battery warning voltage. This is the threashhold where the battery warning sounds. @@ -4591,107 +7162,261 @@ Werte liegen zwischen 5-10V + + + + + + + Standard Standard + + + + + + + Optrex Optrex LCD + + + + + + + If not zero will sound beeps if the transmitter has been left without inputs for the specified number of minutes. Falls ungleich 0 ertönt ein Piepston wenn der Sender für eine bestimmte Anzahl Minuten nicht bedient wurde. + + + + + + + min Min + + + + + + + + + + + + + + Show splash screen on startup Zeige Startbild an + + + + + + + --- --- + + + + + + + 2s 2s + + + + + + + 3s 3s + + + + + + + 4s 4s + + + + + + + 6s 6s + + + + + + + 8s 8s + + + + + + + 10s 10s + + + + + + + 15s 15s + + + + + + + 4800 Baud 4800 Baud + + + + + + + 9600 Baud 115200 Baud {9600 ?} + + + + + + + 14400 Baud 14400 Baud + + + + + + + 19200 Baud 19200 Baud + + + + + + + 38400 Baud 38400 Baud + + + + + + + 57600 Baud 57600 Baud + + + + + + + 76800 Baud 76800 Baud + + + + + + + 115200 Baud 115200 Baud @@ -4699,6 +7424,27 @@ Werte liegen zwischen 5-10V + + + + + + + + + + + + + + + + + + + + + <!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; } @@ -4721,65 +7467,184 @@ Warnung stummer Betrieb - Wird angezeigt, wenn der Piepser komplett ausgeschalte + + + + + + + + + + + + + + X-Short X-kurz + + + + + + + + + + + + + + Short Kurz + + + + + + + + + + + + + + Normal Normal + + + + + + + + + + + + + + Long Lang + + + + + + + + + + + + + + X-Long X-lang + + + + + + + NMEA NMEA + + + + + + + Play Delay (switch mid position) Schalter Mittenpos. verzögern + + + + + + + Measurement Units Maßeinheiten + + + + + + + Haptic Mode Haptik Modus + + + + + + + Beeper Length Piepser Länge + + + + + + + Beeper Mode Modus Piepser + + + + + + + Beeper volume 0 - Quiet. No beeps at all. @@ -4797,9 +7662,26 @@ Warnung stummer Betrieb - Wird angezeigt, wenn der Piepser komplett ausgeschalte + + + + + + + Alarms Only Nur Alarme + + + Power On Speed + + + + + Power Off Speed + + GeneralSetupPanel @@ -4955,251 +7837,595 @@ Sind Sie sicher? Hardware + + + + + + + Form Tabelle + + + + + + + SQ SQ + + + + + + + SR SR + + + + + + + LS2 LS2 + + + + + + + SP SP + + + + + + + SO SO + + + + + + + S4 S4 + + + + + + + RS RS + + + + + + + SB SB + + + + + + + PPM 2 PPM 2 + + + + + + + OFF AUS + + + + + + + S-Port Mirror S_Port Ausgang + + + + + + + Telemetry Telemetrie + + + + + + + SBUS Trainer SBus Schüler + + + + + + + Debug Debugmode + + + + + + + Rud Sei + + + + + + + PPM 3 PPM 3 + + + + + + + S1 S1 + + + + + + + S2 S2 + + + + + + + S3 S3 + + + + + + + PPM 1 PPM 1 + + + + + + + Serial Port Serielle Schnittstelle + + + + + + + v V + + + + + + + PPM Multiplier PPM Multiplikator + + + + + + + Current Offset Strom Offset + + + + + + + PPM 4 PPM 4 + + + + + + + SA SA + + + + + + + Ele Höh + + + Antenna Antenne + + + + + S5 S5 + + + + + + + Ail Qur + + + + + + + Thr Gas + + + + + + + SC SC + + + + + + + LS LS + + + + + + + SD SD + + + + + + + Battery Offset Akku Offset + + + + + + + SE SE + + + + + + + SF SF + + + + + + + SG SG + + + + + + + SH SH + + + + + + + SI SI + + + + + + + SJ SJ + + + + + + + SK SK + + + + + + + SL SL + + + + + + + SM SM + + + + + + + SN SN + + + + + + + RS2 RS2 + + + + + + + Bluetooth Bluetooth + + + + + + + ADC Filter ADC-Filter + + + + + + + Device Name: Gerätename: @@ -5298,71 +8524,169 @@ Sind Sie sicher? Heli + + + + + + + Invert Elevator Nick invertieren + + + + + + + Invert Aileron Roll invertieren + + + + + + + Invert Collective Kollective Pitch invertieren + + + + + + + Invert Invertieren + + + + + + + Off Aus + + + + + + + 120 120 + + + + + + + 120X 120X + + + + + + + 140 140 + + + + + + + 90 90 + + + + + + + Long. cyc Nick cyc u Gew + + + + + + + Lateral cyc Roll cyc u. Gew + + + + + + + Collective Kollektiv Pitch-Quelle u. Gew + + + + + + + Swash Type Taumelscheiben Typ + + + + + + + Swash Ring Ringtaumelscheibe Grad @@ -5755,46 +9079,109 @@ Sind Sie sicher? LogsDialog + + + + + + + Companion Log Viewer Companion Log ansehen + + + + + + + Filename Dateiname + + + + + + + Open LogFile Öffne LogDatei + + + + + + + Zoom Zoom + + + + + + + Save session CSV Speichere Session als CSV + + + + + + + X X + + + + + + + Y Y + + + + + + + Reset Reset + + + + + + + Fly sessions Flugdaten @@ -7286,11 +10673,23 @@ Sollen die Änderungen gespeichert werden? MixerDialog + + + + + Dialog Dialog + + + + + + + Source Quelle @@ -7299,36 +10698,106 @@ Sollen die Änderungen gespeichert werden? + + + + + + + + + + + + + + + + + + + + + + + + + + + + The source for the mixer Die Mischerquelle + + + + + + + Weight Gewichtung + + + + + + + Offset Offset + + + + + + + Include Trim Trimmung einschliessen + + + + + + + Curve Kurve + + + + + + + The curve used by the mix Die Mischerkurve + + + + + + + Switch Schalter @@ -7336,51 +10805,135 @@ Sollen die Änderungen gespeichert werden? + + + + + + + + + + + + + + + + + + + + + GV GV + + + + + + + Yes Ja + + + + + + + No Nein + + + + + + + Warning Warnung + + + + + + + Name Name + + + + + + + OFF AUS + + + + + + + 1 Beep 1 Piepston + + + + + + + 2 Beep 2 Piepstöne + + + + + + + 3 Beep 3 Piepstöne + + + + + + + Multiplex Mixer verrechnen @@ -7389,6 +10942,34 @@ Sollen die Änderungen gespeichert werden? + + + + + + + + + + + + + + + + + + + + + + + + + + + + <!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; } @@ -7404,12 +10985,26 @@ p, li { white-space: pre-wrap; } + + + + + + + Mixer warning. Setting this value will cause a beep to be emmitted when this value is active. + + + + + + + Multiplexer This determines how mixer values are added. @@ -7427,52 +11022,122 @@ Diese Einstellung bestimmt wie die Mischerwerte behandelt werden. + + + + + + + ADD ADDIEREN + + + + + + + MULTIPLY MULTIPLIZIEREN + + + + + + + REPLACE ERSETZEN + + + + + + + Switch used by the mix. If blank then the mix is considered to be "ON" all the time. Mischerschalter. Wenn leer ist der Mischer immer aktiv. + + + + + + + Flight modes Flugphasen + + + + + + + Include DR/Expo DR/Expo einschliessen + + + + + + + Delay Verzögerung + + + + + + + Slow Langsam + + + + + + + Up Nach oben + + + + + + + Down Nach unten @@ -7501,6 +11166,12 @@ If blank then the mix is considered to be "ON" all the time. Invert All Alles invertieren + + + + FullScreenDialog + + MixersListWidget @@ -7674,6 +11345,11 @@ If blank then the mix is considered to be "ON" all the time. ModelEdit + + + + + Dialog Dialog @@ -7709,6 +11385,13 @@ If blank then the mix is considered to be "ON" all the time. + + + + + + + Simulate Simulation @@ -7732,6 +11415,12 @@ If blank then the mix is considered to be "ON" all the time. Curves Kurven + + + + FullScreenDialog + + ModelPrinter @@ -8550,138 +12239,324 @@ If blank then the mix is considered to be "ON" all the time. Module + + + + + + + Failsafe Mode Failsafe Mode + + + + + + + Start Start + + + + + + + PPM delay PPM Puls + + + + + + + Negative Negativ + + + + + + + Positive Positiv + + + + + + + Polarity Polarität + + + + + + + Trainer Mode Trainer Mode + + + + + + + PPM Frame Length PPM Frame Länge + + + + + + + CH CH + + + + + + + Antenna Antenne + + + + + + + Option value Optionswert + + + + + + + Bind on startup Binden beim Starten + + + + + + + RF Output Power HF Sendeleistung + + + + + + + Low Power Low Power + + + + + + + us us + + + + + + + Multi Radio Protocol MultiModul Sendeprotokoll + + + + + + + Sub Type Subtyp + + + + + + + Master/Jack Lehrer/Buchse + + + + + + + Slave/Jack Schüler/Buchse + + + + + + + Master/SBUS Module Lehrer/SBus Module + + + + + + + Master/CPPM Module Lehrer/CPPM Module + + + + + + + Master/SBUS in battery compartment Lehrer/SBus im Akkufach + + + + + + + Show values in: Zeig Werte in: + + + + + + + % abbreviation for percent % + + + + + + + μs abbreviation for microseconds + + + + + + + ms ms + + + + Receiver 1 @@ -8689,94 +12564,232 @@ If blank then the mix is considered to be "ON" all the time. + + + + + + + + + + + + X X + + + + Receiver 2 + + + + Receiver 3 + + + + + + + WARNING: changing RF Output Power needs RE-BIND + + + + + + + Channels Kanäle + + + + Registration ID + + + + + + + WARNING: Requires non-certified firmware! + + + + + + + Not set Nicht eingestellt + + + + + + + Hold Halte Servopos + + + + + + + Custom Frei einstellbar + + + + + + + No Pulses Keine PPM Pulse + + + + + + + Receiver Empfänger + + + + + + + Failsafe Positions Failsafe Positionen + + + + + + + Protocol Protokoll + + + + + + + Receiver No. Empfänger Nr. + + + + + + + Output type Ausgangstyp + + + + + + + Open Drain Open Drain + + + + + + + Push Pull Push Pull + + + + + + Internal + Interne + + + + + + + Ext. + Int. + + ModuleData @@ -9517,21 +13530,49 @@ If blank then the mix is considered to be "ON" all the time. PrintDialog + + + + + + + Close Schliessen + + + + + + + Style + + + + + + + Print Drucken + + + + + + + Print to file Druck in Datei @@ -9555,11 +13596,25 @@ If blank then the mix is considered to be "ON" all the time. ProgressDialog + + + + + + + Flash Firmware Flashe Firmware + + + + + + + Close Schliessen @@ -9574,6 +13629,13 @@ If blank then the mix is considered to be "ON" all the time. ProgressWidget + + + + + + + Show Details Zeige Details @@ -9727,16 +13789,37 @@ If blank then the mix is considered to be "ON" all the time. RadioNotFoundDialog + + + + + + + No Radio Found Keinen Sender gefunden + + + + + + + <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> + + + + + + + OK OK @@ -9745,43 +13828,99 @@ If blank then the mix is considered to be "ON" all the time. RadioOutputsWidget - + + + + + + + + + Form Werte - + + + + + + + + + View: Anzeige: - + + + + + + + + + Logical Switches Logische Schalter - + + + + + + + + + Global Variables Globale Variablen - + + + + + + + + + Channel Outputs Kanalwerte - + + + + + + + + + Mix Outputs Mischerwerte - + + + + + + + + + L o g @@ -9795,7 +13934,15 @@ k - + + + + + + + + + G l o @@ -9811,7 +13958,15 @@ l - + + + + + + + + + C h a @@ -9829,7 +13984,15 @@ e - + + + + + + + + + M i x @@ -10674,36 +14837,85 @@ r Setup + + + + + + + Center beep Zentrierpiepston + + + + + + + OFF AUS + + + + + + + Model Image Modellbild + + + + + + + Exponential Exponential + + + + + + + Throttle Trim Idle Only Gas Leerlauftrim + + + + + + + Timer 3 Timer 3 + + + + + + + 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. @@ -10715,131 +14927,313 @@ umgedreht und ist dann vorne. + + + + + + + Extra Fine Sehr fein + + + + + + + Fine Fein + + + + + + + Medium Mittel + + + + + + + Coarse Grob + + + + + + + Display Checklist Anzeige Checkliste + + + + + + + Timer 2 Timer 2 + + + + + + + Timer 1 Timer 1 + + + + + + + Never Nie + + + + + + + On change Kurz bei Änderung + + + + + + + Always Immer + + + + + + + Global Functions Globale Funktionen + + + + + + + Edit Checklist... Edit Checkliste... + + + + + + + Throttle Source GasTimer Quelle + + + + + + + Trim Step Trim Auflösung + + + + + + + Trims Display Trimmwerte anzeigen + + + + + + + Warnings Warnungen + + + + + + + Top LCD Timer Obere Zeile Timer + + + + + + + Switch Warnings Schalter Warnungen + + + + + + + Pot Warnings Poti Warnungen + + + + + + + Manual Manuell + + + + + + + Auto Automatisch + + + + + + + Model Model + + + + + + + Extended Limits Erw. Wege 100% --> 150% + + + + + + + Extended Trims Erw. Trim 25%--> 100% + + + + + + + Throttle Warning Gas Warnung + + + + + + + Reverse Throttle Vollgas hinten @@ -11207,181 +15601,421 @@ Profile ID: [%1]; Radio ID: [%2] SimulatorMainWindow - + + + + + + + + + OpenTx Simulator OpenTX Simulator - + + + + + + + + + View - + + + + + + + + + Radio Window - + + + + + + + + + Reload... - + + + + + + + + + Tools - + + + + + + + + + Toolbar - + + + + + + + + + Reload Lua Scripts - + + + + + + + + + Reload the Lua environment on the simulated radio. - + + + + + + + + + F7 F7 - + + + + + + + + + Reload Radio Data - + + + + + + + + + Reload all radio data without restarting the simulator. - + + + + + + + + + F9 F9 - + + + + + + + + + Key Mapping - + + + + + + + + + Show keyboard maping reference. - + + + + + + + + + F1 F1 - + + + + + + + + + Joystick Settings - + + + + + + + + + Open joystick configuration settings dialog. - + + + + + + + + + F3 F3 - + + + + + + + + + LCD Screenshot - + + + + + + + + + Save a screenshot of the current simulated LCD screen. - + + + + + + + + + F8 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. @@ -11462,76 +16096,172 @@ Profile ID: [%1]; Radio ID: [%2] 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... @@ -11539,59 +16269,147 @@ The radio type specified in the selected profile is used by default. - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + ... ... - + + + + + + + + + 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 Datei - + + + + + + + + + Folder - + + + + + + + + + SD Path @@ -11620,7 +16438,15 @@ The default is configured in the chosen Radio Profile. SimulatorWidget - + + + + + + + + + Companion Simulator Companion Simulator @@ -11708,6 +16534,20 @@ The default is configured in the chosen Radio Profile. + + + + + + + + + + + + + + ... ... @@ -11747,6 +16587,13 @@ The default is configured in the chosen Radio Profile. StyleEditDialog + + + + + + + @@ -11755,21 +16602,49 @@ The default is configured in the chosen Radio Profile. + + + + + + + &Reset to default + + + + + + + &Cancel + + + + + + + &OK + + + + + + + This feature does not validate your changes and assumes you are familiar with CSS syntax for QT. @@ -12027,190 +16902,475 @@ Too many errors, giving up. Telemetry + + + + + + + A1 A1 + + + + + + + A2 A2 + + + + + + + RSSI RSSI + + + + + + + Alarm 1 Alarm 1 + + + + + + + + + + + + + + ---- ---- + + + + + + + + + + + + + + Yellow Gelb + + + + + + + + + + + + + + Orange Orange + + + + + + + + + + + + + + Red Rot + + + + + + + Alarm 2 Alarm 2 + + + + + + + Serial Protocol Serielles Protokoll + + + + + + + Volt source Spg Quelle + + + + + + + Current source Strom Quelle + + + + + + + Protocol Protokoll + + + + + + + None Kein + + + + + + + FrSky Sensor Hub FrSky Sensor Hub + + + + + + + Blades Rotorblätter + + + + + + + Sink Max Sink Max + + + + + + + Climb Max Steig Max + + + + + + + Sink Min Sink Min + + + + + + + Climb Min Steig Min + + + + + + + Center Silent Mitte Ruhig + + + + + + + Vario source Vario Quelle + + + + + + + Vario limits Vario Grenzen + + + + + + + Disable telemetry audio warnings Keine Telemetrie Warnungsansage + + + + + Source Quelle + + + + + + + Altimetry Höhenanzeige + + + + + + + Altitude source Höhe Quelle + + + + + + + Volts source Spannung Quelle + + + + + + + Top Bar obere Infozeile am Sender + + + + + + + mAh mAh + + + + + + + A A + + + + + + + Various Verschiedenes + + + + + + + Sensors Sensor + + + + + + + Disable multi sensor handling Kein Multisensor Handling + + + + + + + mAh count mAh zählen + + + + + + + FAS Offset FAS Offset + + + + + + + Persistent mAh Speichern der mAh @@ -12219,107 +17379,289 @@ Too many errors, giving up. TelemetryAnalog + + + + + + + Unit Einheit + + + + + + + Max Value Max Wert + + + + + + + Alarm 1 Alarm 1 + + + + + + + + + + + + + + ---- ---- + + + + + + + + + + + + + + Yellow Gelb + + + + + + + + + + + + + + Orange Orange + + + + + + + + + + + + + + Red Rot + + + + + + + + + + + + + + < < + + + + + + + + + + + + + + > > + + + + + + + Alarm 2 Alarm 2 + + + + + + + Offset Offset + + + + + + + Volts (V) Volt(V) + + + + + + + Amps (A) Amp (A) + + + + + + + Speed (m/s or ft/s) Speed (m/s or ft/s) + + + + + + + Raw (-) Roh (-) + + + + + + + Speed (km/h or miles/h) Speed (km/h oder miles/h) + + + + + + + Meters (m or ft) Meter (m or ft) + + + + + + + Temp (°) Temp(°) + + + + + + + Fuel (%) Füllst(%) + + + + + + + mAmps (mA) mAmp (mA) @@ -12333,6 +17675,13 @@ Too many errors, giving up. TelemetryCustomScreen + + + + + + + Custom Screen Type Telemetrie Anzeige als @@ -12358,21 +17707,49 @@ Too many errors, giving up. + + + + + + + Min Min + + + + + + + Source Quelle + + + + + + + Gauge Balken + + + + + + + Max Max @@ -12486,86 +17863,199 @@ Too many errors, giving up. TelemetrySensor + + + + + + + Form Form + + + + + + + Custom Eigene + + + + + + + Calculated Berechnung + + + + + + + Id ID + + + + + + + Instance SubID + + + + Rx + + + + Mod. + + + + + + + Add Add + + + + + + + Average Mittelwert + + + + + + + Min Min + + + + + + + Max Max + + + + + + + Multiply Multiplizeren + + + + + + + Totalize Gesamt + + + + + + + Cell Zelle + + + + + + + Consumption Verbrauch + + + + + + + Dist Dist + + + + + + + Cells Sensor : Zellensensor: @@ -12578,191 +18068,506 @@ Too many errors, giving up. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --- --- + + + + + + + GPS Sensor : GPS-Sensor: + + + + + + + Alt. Sensor : Höhensensor: + + + + + + + Sensor : Sensor: + + + + + + + V V + + + + + + + A A + + + + + + + mA mA + + + + + + + kt + + + + + + + m/s m/s + + + + + + + ft/s + + + + + + + km/h km/h + + + + + + + mph mph + + + + + + + m m + + + + + + + ft ft + + + + + + + °C °C + + + + + + + °F + + + + + + + % % + + + + + + + mAh mAh + + + + + + + W W + + + + + + + mW + + + + + + + dBm + + + + + + + g g + + + + + + + ° ° + + + + + + + Rad + + + + + + + mL + + + + + + + US fl.Oz. + + + + + + + Raw (-) Roh (-) + + + + + + + RPM Drehz + + + + + + + Precision Precision + + + + + + + Ratio + + + + + + + Blades Rotorblätter + + + + + + + Offset Offset + + + + + + + Multiplier Muliplikator + + + + + + + Auto Offset Auto Offset + + + + + + + Filter Filter + + + + + + + Persistent Dauerhaft + + + + + + + Positive Positiv + + + + + + + Logs Log Daten @@ -12794,116 +18599,268 @@ Too many errors, giving up. TelemetrySimulator - + + + + + + + + + Telemetry Simulator Telemetrie Simulator - + + + + + + + + + VFAS VFAS - + + + + + + + + + RSSI RSSI - + + + + + + + + + A1 A1 - + + + + + + + + + A2 A2 - + + + + + + + + + Simulate Simulation - + + + + + + + + + Replay SD Log File - + + + + + + + + + Replay rate - + + + + + + + + + Load Lade - + + + + + + + + + |> - + + + + + + + + + <| - + + + + + + + + + > > - + + + + + + + + + <- - + + + + + + + + + X X - + + + + + + + + + Row # Timestamp - + + + + + + + + + 1/5x 1/5x - + + + + + + + + + 5x 5x - + + + + + + + + + No Log File Currently Loaded - + + + + + + + + + RAS @@ -12911,21 +18868,61 @@ Timestamp - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + V / ratio - + + + + + + + + + Db dB - + + + + + + + + + RxBt @@ -12943,121 +18940,377 @@ Timestamp - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <html><head/><body><p><br/></p></body></html> - + + + + + + + + + Tmp1 - + + + + + + + + + A3 A3 - + + + + + + + + + A4 A4 - + + + + + + + + + Tmp2 - + + + + + + + + + Fuel Fuel - - + + + + + + + + + + + + + + + + + + °C °C - + + + + + + + + + ml - + + + + + + + + + % % - - + + + + + + + + + + + + + + + + + + Meters Meter - + + + + + + + + + Alt Alt - + + + + + + + + + VSpd V-Speed - + + + + + + + + + m/s m/s - + + + + + + + + + Fuel Qty Füllstand - - + + + + + + + + + + + + + + + + + + km/h km/h - + + + + + + + + + Hdg - + + + + + + + + + ASpd @@ -13065,135 +19318,335 @@ Timestamp - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + G - + + + + + + + + + GPS GPS - + + + + + + + + + Lat,Lon (dec.deg.) - + + + + + + + + + AccX AccX - + + + + + + + + + dd-MM-yyyy hh:mm:ss - + + + + + + + + + Date Datum - + + + + + + + + + Amps Ampere - + + + + + + + + + AccZ AccZ - + + + + + + + + + GAlt - - + + + + + + + + + + + + + + + + + + Volts Volt - + + + + + + + + + Cels Zellen - + + + + + + + + + Curr Strom - + + + + + + + + + AccY AccY - + + + + + + + + + GSpd - + + + + + + + + + Degrees Grad - + + + + + + + + + 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 RPM - + + + + + + + + + When enabled, sends any non-blank values as simulated telemetry data. @@ -13235,11 +19688,25 @@ hh:mm:ss Timer + + + + + + + Countdown Count Down + + + + + + + Minute Call Jede Minute @@ -13323,26 +19790,61 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. Trainer + + + + + + + Form Form + + + + + + + Mode Modus + + + + + + + Input Eingang + + + + + + + Weight Gewichtung + + + + + + + Rud Sei @@ -13355,6 +19857,62 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Beeper volume 0 - Quiet. No beeps at all. @@ -13375,6 +19933,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + Off Aus @@ -13383,6 +19969,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + += (Sum) += (Add) @@ -13391,6 +20005,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + := (Replace) := (Ersetzen) @@ -13399,6 +20041,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn1 Kanal 1 @@ -13407,6 +20077,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn2 Kanal 2 @@ -13415,6 +20113,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn3 Kanal 3 @@ -13423,21 +20149,70 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn4 Kanal 4 + + + + + + + Ele Höh + + + + + + + Thr Gas + + + + + + + Ail Qur @@ -13446,7 +20221,15 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. TrainerSimulator - + + + + + + + + + Trainer simulator Trainer Simulator @@ -13876,6 +20659,13 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + Location of AVRDUDE executable Speicherplatz der AVRDUDE Anwendung @@ -13884,18 +20674,60 @@ 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. Speicherort der AVRDUDE Anwendung. + + + + + + + Programmer Configuration Configuration AVRDUDE / SAM-BA Programmer Konfiguration + + + + + + + DFU-Util Location DFU-Util Location @@ -13903,6 +20735,27 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + Use this button to browse and look for the AVRDUDE executable file. @@ -13910,16 +20763,51 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + Browse... Suchen... + + + + + + + Programmer Programmiergerät + + + + + + + Programmer used for communicating with the controller. Please consult the programmer's documentation and the AVRDUDE documentation to select the appropriate programmer. Programmiergerät für die Kommunikation mit dem Chip. @@ -13927,49 +20815,126 @@ Bitte konsultiere das Handbuch des Programmiergerätes und die Dokumentation von + + + + + + + List all available programmers. Auflistung aller möglichen Programmiergeräte. + + + + + + + List Available Auflistung möglicher + + + + + + + + + + + + + + Extra arguments that will be passed to AVRDUDE on every call Zusätzliche Argumente welche an AVRDUDE bei jedem Programmstart weitergeleitet werden + + + + + + + Extra Arguments Zusätzliche Argumente + + + + + + + Show AVRDUDE help Zeige AVRDUDE Hilfe + + + + + + + Show Help Zeige Hilfe + + + + + + + Communication port to the programmer. Schnittstelle zum Programmiergerät. + + + + + + + MCU MCU + + + + + + + + + + + + + + CPU present on your 9x radio Should be m64 for stock radios m2560 for v4.1 boards @@ -13977,28 +20942,77 @@ m2560 for v4.1 boards + + + + + + + at91sam3s8-9xr at91sam3s8-9xr + + + + + + + Alternate device Alternate device + + + + + + + Use advanced controls Use advanced controls + + + + + + + + + + + + + + Port Schnittstelle + + + + + + + + + + + + + + Extra arguments used in AVRDUDE. This can be used for providing extra information to AVRDUDE. @@ -14007,27 +21021,69 @@ Please only use this if you know what you are doing. There are no error checks + + + + + + + AVRDUDE Location AVRDUDE Speicherort + + + + + + + SAM-BA Location SAM-BA Location + + + + + + + + + + + + + + Location of sam-ba executable Location of sam-ba executable + + + + + + + ARM MCU ARM MCU + + + + + + + sam-ba serial port sam-ba serialer port @@ -14066,6 +21122,20 @@ Please only use this if you know what you are doing. There are no error checks + + + + + + + + + + + + + + CPU of your TX CPU des Senders @@ -14074,13 +21144,29 @@ Please only use this if you know what you are doing. There are no error checks joystickDialog - + + + + + + + + + Configure Joystick Joystick konfigurieren - + + + + + + + + + Ch2 Ch2 @@ -14150,73 +21236,169 @@ Cancel zum abbrechen der Joystickkalibrierung ohne speichern. - + + + + + + + + + Ch1 Ch1 - + + + + + + + + + Ch4 Ch4 - + + + + + + + + + Ch6 Ch6 - + + + + + + + + + Ch3 Ch3 - + + + + + + + + + Ch5 Ch5 - + + + + + + + + + Ch7 Ch7 - + + + + + + + + + Ch8 Ch8 - + + + + + + + + + Instructions Anweisungen - + + + + + + + + + Enable Freigabe - + + + + + + + + + Cancel abbrechen - + + + + + + + + + Back Zurück - + + + + + + + + + Start Start @@ -14227,7 +21409,15 @@ Cancel zum abbrechen der Joystickkalibrierung ohne speichern. - + + + + + + + + + Ok Ok diff --git a/companion/src/translations/companion_en.ts b/companion/src/translations/companion_en.ts index 582291683..da324f7b6 100644 --- a/companion/src/translations/companion_en.ts +++ b/companion/src/translations/companion_en.ts @@ -93,88 +93,221 @@ AppPreferencesDialog + + + + + + + Edit Settings + + + + + + + Radio Profile + + + + + + + Profile Name + + + + + + + Radio Type + + + + + + + Menu Language + + + + + + + Build Options + + + + + + + Splash Screen + + + + + + + Other Settings + + + + + + + SD Structure path + + + + + + + + + + + + + + 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 + + + + + + + + + + + + + + Enable automatic backup before writing firmware + + + + + + + General Settings + + + + + + + Default Stick Mode + + + + + + + Mode selection: Mode 1: @@ -198,181 +331,433 @@ 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) + + + + + + + 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> + + + + + + + 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 + + + + + + + Append version number to FW file name + + + + + + + Offer to write FW to Tx after download + + + + + + + Action on New Model + + + + + + + Screenshot capture folder + + + + + + + Clear Image + + + + + + + Select Image @@ -383,216 +768,540 @@ Mode 4: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Select Folder + + + + + + + Application Settings + + + + + + + Automatic check for Companion updates + + + + + + + most recently used files + + + + + + + Startup Settings + + + + + + + Remember + + + + + + + Show splash screen when Companion starts + + + + + + + Automatic check for OpenTX firmware updates + + + + + + + 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> + + + + + + + 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 + + + + + + + <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) + + + + + + + Splash Screen Library + + + + + + + Google Earth Executable + + + + + + + User Splash Screens + + + + + + + Automatic Backup Folder + + + + + + + Only show user splash images + + + + + + + Show user and companion splash images + + + + + + + Select Executable + + + + Release channel + + + + Releases (stable) + + + + Release candidates (testing) + + + + Nightly builds (unstable) + + + + + + + Simulator Settings + + + + + + + Calibrate + + + + + + + Blue + + + + + + + Green + + + + + + + Red + + + + + + + Orange + + + + + + + Yellow + + + + + + + Only capture to clipboard + + + + + + + Enable + + + + + + + Joystick + + + + + + + Simulator BackLight + + + + + + + Remember simulator switch values + + + + + + + Simulator Volume Gain @@ -673,6 +1382,31 @@ Mode 4: Images (%1) + + + + + Use releases (stable) + + + + + Use release candidates (testing) + + + + + + + Use nightly builds (unstable) + + + + + + Use releases and release candidates (testing) + + BinEepromFormat @@ -891,36 +1625,85 @@ Mode 4: 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 @@ -1165,31 +1948,73 @@ If you have a settings backup file, you may import that instead. CompareDialog + + + + + + + Compare Models + + + + + + + To compare models, drag and drop them anywhere in this window. + + + + + + + Close + + + + + + + Style + + + + + + + Print + + + + + + + Print to file @@ -1346,87 +2171,213 @@ If you have a settings backup file, you may import that instead. Curves + + + + + + + Curve name + + + + + + + Fixed X + + + + + + + Custom X + + + + + + + Lines + + + + + + + Smooth + + + + + + + + + + + + + + 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 @@ -1839,18 +2790,53 @@ If you have a settings backup file, you may import that instead. CustomizeSplashDialog + + + + + + + Transmitter Splash Screen Editor + + + + + + + + + + + + + + Invert + + + + + + + + + + + + + + Open Splash Library @@ -1859,30 +2845,114 @@ If you have a settings backup file, you may import that instead. + + + + + + + + + + + + + + + + + + + + + + + + + + + + ... + + + + + + + + + + + + + + Load Profile + + + + + + + + + + + + + + Load FW + + + + + + + + + + + + + + Load Pict + + + + + + + + + + + + + + Save @@ -1998,48 +3068,48 @@ If you have a settings backup file, you may import that instead. - + 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 @@ -2048,86 +3118,198 @@ If you have a settings backup file, you may import that instead. 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. @@ -2146,6 +3328,13 @@ To <b>remove a remembered entry</b> from the filter list, first cho DownloadDialog + + + + + + + Downloading: @@ -2289,11 +3478,25 @@ To <b>remove a remembered entry</b> from the filter list, first cho ExpoDialog + + + + + + + Flight modes + + + + + + + Input name @@ -2301,97 +3504,244 @@ To <b>remove a remembered entry</b> from the filter list, first cho + + + + + + + + + + + + + + + + + + + + + GV + + + + + + + Source for the mixer. + + + + + + + Weight + + + + + + + Switch + + + + + + + Switch used to enable the line. If blank then the input is considered to be "ON" all the time. + + + + + + + Stick Side + + + + + + + NEG + + + + + + + POS + + + + + + + ALL + + + + + + + Scale + + + + + + + Include Trim + + + + + + + No No + + + + + + + Yes + + + + + + + Curve + + + + + + + Curve applied to the source. + + + + + + + Source + + + + + + + Line name + + + + + + + Offset + + + + + + + The source for the mixer @@ -3034,31 +4384,73 @@ Blank means include all. ?, *, and [...] wildcards accepted. FirmwarePreferencesDialog + + + + + + + Downloads + + + + + + + Check for updates + + + + + + + Firmware + + + + + + + Download firmware + + + + + + + Download SD contents + + + + + + + Latest Download @@ -3100,67 +4492,158 @@ Blank means include all. ?, *, and [...] wildcards accepted. FlashEEpromDialog + + + + + + + Write Models and Settings to Radio + + + + + + + Load... + + + + + + + Current Profile + + + + + + + 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 + + + + + + + <html><head/><body><p>Modify calibration parameters using settings from current profile</p></body></html> + + + + + + + Patch calibration setting from profile + + + + + + + <html><head/><body><p>Modify HW parameters using settings from current profile</p></body></html> + + + + + + + Patch HW settings from profile + + + + + + + Cancel + + + + + + + Write to TX @@ -3216,71 +4699,169 @@ Blank means include all. ?, *, and [...] wildcards accepted. FlashFirmwareDialog + + + + + + + Flash Firmware + + + + + + + Load... + + + + + + + Date & Time + + + + + + + Variant + + + + + + + Version + + + + + + + Use profile start screen + + + + + + + Use firmware start screen + + + + + + + Use library start screen + + + + + + + Use another start screen + + + + + + + Allows Companion to write to older version of the firmware + + + + + + + Check Hardware compatibility + + + + + + + Backup and restore Models and Settings + + + + + + + Cancel + + + + + + + Write to TX @@ -3474,21 +5055,49 @@ You are currently using: FlightMode + + + + + + + Fade In + + + + + + + Fade Out + + + + + + + Name + + + + + + + Switch @@ -3678,11 +5287,25 @@ You are currently using: FusesDialog + + + + + + + Fuses + + + + + + + <!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; } @@ -3700,11 +5323,25 @@ p, li { white-space: pre-wrap; } + + + + + + + Read Fuses + + + + + + + <!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; } @@ -3724,12 +5361,26 @@ p, li { white-space: pre-wrap; } + + + + + + + Reset Fuses EEPROM - PROTECT + + + + + + + <!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,12 +5400,26 @@ p, li { white-space: pre-wrap; } + + + + + + + Reset Fuses EEPROM - DELETE + + + + + + + <!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; } @@ -3824,21 +5489,49 @@ p, li { white-space: pre-wrap; } GeneralEdit + + + + + + + Radio settings + + + + + + + Retrieve calib. and hw settings from profile + + + + + + + Store calib. and hw settings in selected profile + + + + + + + General settings used throught the transmitter. These will be relevant for all models in the same EEPROM. @@ -3906,117 +5599,285 @@ These will be relevant for all models in the same EEPROM. GeneralSetup + + + + + + + Form + + + + + + + Readonly Unlock + + + + + + + SC + + + + + + + SE + + + + + + + SA + + + + + + + SF + + + + + + + SH + + + + + + + SD + + + + + + + SB + + + + + + + SG + + + + + + + Stick reverse + + + + + + + Country Code + + + + + + + FAI Mode + + + + + + + Automatically adjust the radio's clock if a GPS is connected to telemetry. + + + + + + + Adjust RTC + + + + + + + Speaker Volume + + + + + + + + + + + + + + Hz + + + + + + + Vario pitch at max + + + + + + + Backlight Switch + + + + + + + Color 1 + + + + + + + Color 2 + + + + + + + Sound Mode + + + + + + + If this value is not 0, any keypress will turn on the backlight and turn it off after the specified number of seconds. @@ -4024,87 +5885,221 @@ These will be relevant for all models in the same EEPROM. + + + + + + + + + + + + + + + sec + + + + + + + Backlight color + + + + + + + Speaker Pitch (spkr only) + + + + + + + Beeper + + + + + + + Speaker + + + + + + + BeeperVoice + + + + + + + SpeakerVoice + + + + + + + Beep volume + + + + + + + Wav volume + + + + + + + Vario volume + + + + + + + Background volume + + + + + + + + + + + + + + ms + + + + + + + Backlight flash on alarm + + + + + + + Vario pitch at zero + + + + + + + Vario repeat at zero + + + + + + + Backlight Auto OFF after + + + + + + + This is the switch selectrion for turning on the backlight (if installed). @@ -4113,6 +6108,20 @@ These will be relevant for all models in the same EEPROM. + + + + + + + + + + + + + + <!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; } @@ -4123,56 +6132,133 @@ p, li { white-space: pre-wrap; } + + + + + + + RotEnc Navigation + + + + + + + Backlight Brightness + + + + + + + America + + + + + + + Japan + + + + + + + Europe + + + + + + + Voice Language + + + + + + + Timeshift from UTC + + + + + + + Backlight OFF Brightness + + + + + + + RSSI Poweroff Warning + + + + + + + Low EEPROM Warning + + + + + + + Mode selection: Mode 1: @@ -4196,336 +6282,821 @@ 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) + + + + + + + USB Mode + + + + + + + + + + + + + + Ask on Connect + + + + + + + Joystick (HID) + + + + + + + USB Mass Storage + + + + + + + USB Serial (CDC) + + + + + + + <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> + + + + + + + If you enable FAI, only RSSI and RxBt sensors will keep working. This function cannot be disabled by the radio. + + + + Owner Registration ID + + + + aaaaaaAA + + + + + + + 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 + + + + + + + Audio + + + + + + + Trainer + + + + + + + DMS + + + + + + + Stick Mode + + + + Power Off Delay + + + + + + + Metric + + + + + + + Imperial + + + + + + + Default Channel Order + + + + + + + GPS Coordinates + + + + + + + Min + + + + + + + + + + + + + + v + + + + + + + Max + + + + + + + Inactivity Timer + + + + + + + Show Splash Screen on Startup + + + + + + + Contrast + + + + + + + Battery Meter Range + + + + + + + Haptic Strength + + + + + + + LCD Display Type + + + + + + + "No Sound" Warning + + + + + + + Battery Warning + + + + + + + Haptic Length + + + + + + + MAVLink Baud Rate + + + + + + + + + + + + + + Quiet + + + + + + + Only Alarms + + + + + + + + + + + + + + No Keys + + + + + + + + + + + + + + All + + + + + + + Battery warning voltage. This is the threashhold where the battery warning sounds. @@ -4534,107 +7105,261 @@ Acceptable values are 5v..10v + + + + + + + Standard + + + + + + + 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 + + + + + + + 3s + + + + + + + 4s + + + + + + + 6s + + + + + + + 8s + + + + + + + 10s + + + + + + + 15s + + + + + + + 4800 Baud + + + + + + + 9600 Baud + + + + + + + 14400 Baud + + + + + + + 19200 Baud + + + + + + + 38400 Baud + + + + + + + 57600 Baud + + + + + + + 76800 Baud + + + + + + + 115200 Baud @@ -4642,6 +7367,27 @@ Acceptable values are 5v..10v + + + + + + + + + + + + + + + + + + + + + <!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; } @@ -4658,65 +7404,184 @@ p, li { white-space: pre-wrap; } + + + + + + + + + + + + + + X-Short + + + + + + + + + + + + + + Short + + + + + + + + + + + + + + Normal + + + + + + + + + + + + + + Long + + + + + + + + + + + + + + X-Long + + + + + + + NMEA + + + + + + + Play Delay (switch mid position) + + + + + + + Measurement Units + + + + + + + Haptic Mode + + + + + + + Beeper Length + + + + + + + Beeper Mode + + + + + + + Beeper volume 0 - Quiet. No beeps at all. @@ -4728,9 +7593,26 @@ p, li { white-space: pre-wrap; } + + + + + + + Alarms Only + + + Power On Speed + + + + + Power Off Speed + + GeneralSetupPanel @@ -4884,251 +7766,595 @@ Are you sure ? Hardware + + + + + + + Form + + + + + + + SQ + + + + + + + SR + + + + + + + LS2 + + + + + + + SP + + + + + + + SO + + + + + + + S4 + + + + + + + RS + + + + + + + SB + + + + + + + PPM 2 + + + + + + + OFF + + + + + + + S-Port Mirror + + + + + + + Telemetry + + + + + + + SBUS Trainer + + + + + + + Debug + + + + + + + Rud + + + + + + + PPM 3 + + + + + + + S1 + + + + + + + S2 + + + + + + + S3 + + + + + + + PPM 1 + + + + + + + Serial Port + + + + + + + v + + + + + + + PPM Multiplier + + + + + + + Current Offset + + + + + + + PPM 4 + + + + + + + SA + + + + + + + Ele + + + Antenna + + + + + S5 + + + + + + + Ail + + + + + + + Thr + + + + + + + SC + + + + + + + LS + + + + + + + SD + + + + + + + Battery Offset + + + + + + + SE + + + + + + + SF + + + + + + + SG + + + + + + + SH + + + + + + + SI + + + + + + + SJ + + + + + + + SK + + + + + + + SL + + + + + + + SM + + + + + + + SN + + + + + + + RS2 + + + + + + + Bluetooth + + + + + + + ADC Filter + + + + + + + Device Name: @@ -5227,71 +8453,169 @@ Are you sure ? Heli + + + + + + + Off + + + + + + + 120 + + + + + + + 120X + + + + + + + 140 + + + + + + + 90 + + + + + + + Invert Elevator + + + + + + + Invert Aileron + + + + + + + Invert Collective + + + + + + + Long. cyc + + + + + + + Invert + + + + + + + Swash Ring + + + + + + + Swash Type + + + + + + + Lateral cyc + + + + + + + Collective @@ -5682,46 +9006,109 @@ Are you sure ? LogsDialog + + + + + + + Companion Log Viewer + + + + + + + Fly sessions + + + + + + + Save session CSV + + + + + + + Zoom + + + + + + + X + + + + + + + Y + + + + + + + Reset + + + + + + + Filename + + + + + + + Open LogFile @@ -7206,26 +10593,59 @@ Do you want to save your changes? MixerDialog + + + + + Dialog + + + + + + + Delay + + + + + + + Slow + + + + + + + Up + + + + + + + Down @@ -7234,6 +10654,34 @@ Do you want to save your changes? + + + + + + + + + + + + + + + + + + + + + + + + + + + + <!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; } @@ -7249,92 +10697,218 @@ p, li { white-space: pre-wrap; } + + + + + + + Include Trim + + + + + + + Offset + + + + + + + Weight + + + + + + + Name + + + + + + + Source + + + + + + + Multiplex + + + + + + + Warning + + + + + + + The curve used by the mix + + + + + + + Include DR/Expo + + + + + + + Flight modes + + + + + + + Switch + + + + + + + Mixer warning. Setting this value will cause a beep to be emmitted when this value is active. + + + + + + + OFF + + + + + + + 1 Beep + + + + + + + 2 Beep + + + + + + + 3 Beep + + + + + + + No No + + + + + + + Yes @@ -7342,6 +10916,27 @@ Setting this value will cause a beep to be emmitted when this value is active. + + + + + + + + + + + + + + + + + + + + + GV @@ -7350,11 +10945,46 @@ Setting this value will cause a beep to be emmitted when this value is active. + + + + + + + + + + + + + + + + + + + + + + + + + + + + The source for the mixer + + + + + + + Multiplexer This determines how mixer values are added. @@ -7366,26 +10996,61 @@ This determines how mixer values are added. + + + + + + + ADD + + + + + + + MULTIPLY + + + + + + + REPLACE + + + + + + + Curve + + + + + + + Switch used by the mix. If blank then the mix is considered to be "ON" all the time. @@ -7415,6 +11080,12 @@ If blank then the mix is considered to be "ON" all the time. Invert All + + + + FullScreenDialog + + MixersListWidget @@ -7588,11 +11259,23 @@ If blank then the mix is considered to be "ON" all the time. ModelEdit + + + + + Dialog + + + + + + + Simulate @@ -7646,6 +11329,12 @@ If blank then the mix is considered to be "ON" all the time. Telemetry + + + + FullScreenDialog + + ModelPrinter @@ -8464,31 +12153,70 @@ If blank then the mix is considered to be "ON" all the time. Module + + + + + + + Start + + + + + + + CH + + + + + + + Polarity + + + + + + + Negative + + + + + + + Positive + + + + Receiver 1 @@ -8496,201 +12224,486 @@ If blank then the mix is considered to be "ON" all the time. + + + + + + + + + + + + X + + + + Receiver 2 + + + + Receiver 3 + + + + + + + WARNING: changing RF Output Power needs RE-BIND + + + + + + + Antenna + + + + + + + Output type + + + + + + + Open Drain + + + + + + + Push Pull + + + + + + + Option value + + + + + + + Channels + + + + + + + Receiver No. + + + + + + + RF Output Power + + + + + + + Bind on startup + + + + + + + Low Power + + + + + + + PPM delay + + + + + + + us + + + + + + + PPM Frame Length + + + + + + + ms + + + + + + + Protocol + + + + Registration ID + + + + + + + Multi Radio Protocol + + + + + + + Sub Type + + + + + + + WARNING: Requires non-certified firmware! + + + + + + + Failsafe Mode + + + + + + + Not set + + + + + + + Hold + + + + + + + Custom + + + + + + + No Pulses + + + + + + + Receiver + + + + + + + Trainer Mode + + + + + + + Master/Jack + + + + + + + Slave/Jack + + + + + + + Master/SBUS Module + + + + + + + Master/CPPM Module + + + + + + + Master/SBUS in battery compartment + + + + + + + Failsafe Positions + + + + + + + Show values in: + + + + + + + % abbreviation for percent + + + + + + + μs abbreviation for microseconds + + + + + + Internal + + + + + + + + Ext. + Int. + + ModuleData @@ -9427,21 +13440,49 @@ If blank then the mix is considered to be "ON" all the time. PrintDialog + + + + + + + Close + + + + + + + Style + + + + + + + Print + + + + + + + Print to file @@ -9465,11 +13506,25 @@ If blank then the mix is considered to be "ON" all the time. ProgressDialog + + + + + + + Flash Firmware + + + + + + + Close @@ -9484,6 +13539,13 @@ If blank then the mix is considered to be "ON" all the time. ProgressWidget + + + + + + + Show Details @@ -9636,16 +13698,37 @@ If blank then the mix is considered to be "ON" all the time. RadioNotFoundDialog + + + + + + + No Radio Found + + + + + + + <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> + + + + + + + OK @@ -9654,43 +13737,99 @@ If blank then the mix is considered to be "ON" all the time. RadioOutputsWidget - + + + + + + + + + Form - + + + + + + + + + View: - + + + + + + + + + Logical Switches - + + + + + + + + + Global Variables - + + + + + + + + + Channel Outputs - + + + + + + + + + Mix Outputs - + + + + + + + + + L o g @@ -9700,7 +13839,15 @@ c - + + + + + + + + + G l o @@ -9711,7 +13858,15 @@ l - + + + + + + + + + C h a @@ -9724,7 +13879,15 @@ s - + + + + + + + + + M i x @@ -10562,81 +14725,193 @@ s Setup + + + + + + + Timer 1 + + + + + + + Top LCD Timer + + + + + + + Model Image + + + + + + + Warnings + + + + + + + Switch Warnings + + + + + + + Pot Warnings + + + + + + + OFF + + + + + + + Manual + + + + + + + Auto + + + + + + + Model + + + + + + + Center beep + + + + + + + Edit Checklist... + + + + + + + Extended Trims + + + + + + + Display Checklist + + + + + + + Extended Limits + + + + + + + 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. @@ -10645,86 +14920,205 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi + + + + + + + Reverse Throttle + + + + + + + Throttle Trim Idle Only + + + + + + + Throttle Warning + + + + + + + Exponential + + + + + + + Extra Fine + + + + + + + Fine + + + + + + + Medium + + + + + + + Coarse + + + + + + + Never + + + + + + + On change + + + + + + + Always + + + + + + + Global Functions + + + + + + + Throttle Source + + + + + + + Trim Step + + + + + + + Trims Display + + + + + + + Timer 2 + + + + + + + Timer 3 @@ -11092,181 +15486,421 @@ Profile ID: [%1]; Radio ID: [%2] 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. @@ -11347,76 +15981,172 @@ Profile ID: [%1]; Radio ID: [%2] 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... @@ -11424,59 +16154,147 @@ The radio type specified in the selected profile is used by default. - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + ... - + + + + + + + + + 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 @@ -11505,7 +16323,15 @@ The default is configured in the chosen Radio Profile. SimulatorWidget - + + + + + + + + + Companion Simulator @@ -11593,6 +16419,20 @@ The default is configured in the chosen Radio Profile. + + + + + + + + + + + + + + ... @@ -11632,6 +16472,13 @@ The default is configured in the chosen Radio Profile. StyleEditDialog + + + + + + + @@ -11640,21 +16487,49 @@ The default is configured in the chosen Radio Profile. + + + + + + + &Reset to default + + + + + + + &Cancel + + + + + + + &OK + + + + + + + This feature does not validate your changes and assumes you are familiar with CSS syntax for QT. @@ -11912,190 +16787,475 @@ Too many errors, giving up. Telemetry + + + + + + + Protocol + + + + + + + Alarm 1 + + + + + + + + + + + + + + ---- + + + + + + + + + + + + + + Yellow + + + + + + + + + + + + + + Orange + + + + + + + + + + + + + + Red + + + + + + + Alarm 2 + + + + + + + RSSI + + + + + + + Disable telemetry audio warnings + + + + + Source + + + + + + + A1 + + + + + + + A2 + + + + + + + Sink Max + + + + + + + Climb Max + + + + + + + Sink Min + + + + + + + Climb Min + + + + + + + Center Silent + + + + + + + Vario limits + + + + + + + Vario source + + + + + + + Altimetry + + + + + + + Altitude source + + + + + + + Volts source + + + + + + + Top Bar + + + + + + + Volt source + + + + + + + Current source + + + + + + + Blades + + + + + + + mAh count + + + + + + + mAh + + + + + + + A + + + + + + + FAS Offset + + + + + + + Persistent mAh + + + + + + + Various + + + + + + + Serial Protocol + + + + + + + None + + + + + + + FrSky Sensor Hub + + + + + + + Sensors + + + + + + + Disable multi sensor handling @@ -12104,107 +17264,289 @@ Too many errors, giving up. TelemetryAnalog + + + + + + + Unit + + + + + + + Max Value + + + + + + + Alarm 1 + + + + + + + + + + + + + + ---- + + + + + + + + + + + + + + Yellow + + + + + + + + + + + + + + Orange + + + + + + + + + + + + + + Red + + + + + + + + + + + + + + < + + + + + + + + + + + + + + > + + + + + + + Alarm 2 + + + + + + + Offset + + + + + + + Volts (V) + + + + + + + Amps (A) + + + + + + + Speed (m/s or ft/s) + + + + + + + Raw (-) + + + + + + + Speed (km/h or miles/h) + + + + + + + Meters (m or ft) + + + + + + + Temp (°) + + + + + + + Fuel (%) + + + + + + + mAmps (mA) @@ -12218,26 +17560,61 @@ Too many errors, giving up. TelemetryCustomScreen + + + + + + + Custom Screen Type + + + + + + + Min + + + + + + + Source + + + + + + + Gauge + + + + + + + Max @@ -12371,86 +17748,199 @@ Too many errors, giving up. TelemetrySensor + + + + + + + Form + + + + + + + Custom + + + + + + + Calculated + + + + + + + Id + + + + + + + Instance + + + + Rx + + + + Mod. + + + + + + + Add + + + + + + + Average + + + + + + + Min + + + + + + + Max + + + + + + + Multiply + + + + + + + Totalize + + + + + + + Cell + + + + + + + Consumption + + + + + + + Dist + + + + + + + Cells Sensor : @@ -12463,191 +17953,506 @@ Too many errors, giving up. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --- + + + + + + + GPS Sensor : + + + + + + + Alt. Sensor : + + + + + + + Sensor : + + + + + + + Raw (-) + + + + + + + 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. + + + + + + + Precision + + + + + + + Ratio + + + + + + + Blades + + + + + + + Offset + + + + + + + Multiplier + + + + + + + Auto Offset + + + + + + + Filter + + + + + + + Persistent + + + + + + + Positive + + + + + + + Logs @@ -12679,104 +18484,240 @@ Too many errors, giving up. TelemetrySimulator - + + + + + + + + + Telemetry Simulator - + + + + + + + + + When enabled, sends any non-blank values as simulated telemetry data. - + + + + + + + + + Simulate - + + + + + + + + + Replay SD Log File - + + + + + + + + + Replay rate - + + + + + + + + + Load - + + + + + + + + + |> - + + + + + + + + + <| - + + + + + + + + + > - + + + + + + + + + <- - + + + + + + + + + X - + + + + + + + + + Row # Timestamp - + + + + + + + + + 1/5x - + + + + + + + + + 5x - + + + + + + + + + No Log File Currently Loaded - + + + + + + + + + RAS - + + + + + + + + + A2 @@ -12784,27 +18725,75 @@ Timestamp - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + V / ratio - + + + + + + + + + Db - + + + + + + + + + RxBt - + + + + + + + + + A1 @@ -12822,141 +18811,429 @@ Timestamp - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <html><head/><body><p><br/></p></body></html> - + + + + + + + + + Tmp1 - + + + + + + + + + A3 - + + + + + + + + + A4 - + + + + + + + + + RSSI - + + + + + + + + + Tmp2 - - + + + + + + + + + + + + + + + + + + RPM - + + + + + + + + + Fuel - - + + + + + + + + + + + + + + + + + + °C - + + + + + + + + + ml - + + + + + + + + + % - - + + + + + + + + + + + + + + + + + + Meters - + + + + + + + + + Alt - + + + + + + + + + VSpd - + + + + + + + + + m/s - + + + + + + + + + Fuel Qty - - + + + + + + + + + + + + + + + + + + km/h - + + + + + + + + + VFAS - + + + + + + + + + Hdg - + + + + + + + + + ASpd @@ -12964,121 +19241,297 @@ Timestamp - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + G - + + + + + + + + + GPS - + + + + + + + + + Lat,Lon (dec.deg.) - + + + + + + + + + AccX - + + + + + + + + + dd-MM-yyyy hh:mm:ss - + + + + + + + + + Date - + + + + + + + + + Amps - + + + + + + + + + AccZ - + + + + + + + + + GAlt - - + + + + + + + + + + + + + + + + + + Volts - + + + + + + + + + Cels - + + + + + + + + + Curr - + + + + + + + + + AccY - + + + + + + + + + GSpd - + + + + + + + + + Degrees - + + + + + + + + + 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. @@ -13120,11 +19573,25 @@ hh:mm:ss Timer + + + + + + + Countdown + + + + + + + Minute Call @@ -13208,26 +19675,61 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. Trainer + + + + + + + Form + + + + + + + Mode + + + + + + + Input + + + + + + + Weight + + + + + + + Rud @@ -13240,6 +19742,62 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Beeper volume 0 - Quiet. No beeps at all. @@ -13254,6 +19812,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + Off @@ -13262,6 +19848,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + += (Sum) @@ -13270,6 +19884,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + := (Replace) @@ -13278,6 +19920,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn1 @@ -13286,6 +19956,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn2 @@ -13294,6 +19992,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn3 @@ -13302,21 +20028,70 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn4 + + + + + + + Ele + + + + + + + Thr + + + + + + + Ail @@ -13325,7 +20100,15 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. TrainerSimulator - + + + + + + + + + Trainer simulator @@ -13750,12 +20533,33 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. burnConfigDialog + + + + + + + Programmer Configuration + + + + + + + + + + + + + + Location of sam-ba executable @@ -13764,16 +20568,58 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + The location of the AVRDUDE executable. + + + + + + + DFU-Util Location + + + + + + + Location of AVRDUDE executable @@ -13781,6 +20627,27 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + Use this button to browse and look for the AVRDUDE executable file. @@ -13788,39 +20655,116 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + Browse... + + + + + + + Programmer + + + + + + + Programmer used for communicating with the controller. Please consult the programmer's documentation and the AVRDUDE documentation to select the appropriate programmer. + + + + + + + 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. @@ -13829,21 +20773,49 @@ Please only use this if you know what you are doing. There are no error checks + + + + + + + Extra Arguments + + + + + + + Show AVRDUDE help + + + + + + + Show Help + + + + + + + Communication port to the programmer. @@ -13851,28 +20823,84 @@ Please only use this if you know what you are doing. There are no error checks + + + + + + + + + + + + + + Port + + + + + + + AVRDUDE Location + + + + + + + MCU + + + + + + + + + + + + + + CPU of your TX + + + + + + + + + + + + + + CPU present on your 9x radio Should be m64 for stock radios m2560 for v4.1 boards @@ -13880,31 +20908,73 @@ m2560 for v4.1 boards + + + + + + + at91sam3s8-9xr + + + + + + + SAM-BA Location + + + + + + + ARM MCU + + + + + + + sam-ba serial port + + + + + + + Alternate device + + + + + + + Use advanced controls @@ -13950,91 +21020,211 @@ m2560 for v4.1 boards joystickDialog - + + + + + + + + + Configure Joystick - + + + + + + + + + Ch2 - + + + + + + + + + Ch1 - + + + + + + + + + Ch4 - + + + + + + + + + Ch6 - + + + + + + + + + Ch3 - + + + + + + + + + Ch5 - + + + + + + + + + Ch7 - + + + + + + + + + Ch8 - + + + + + + + + + Instructions - + + + + + + + + + Enable - + + + + + + + + + Cancel - + + + + + + + + + Back - + + + + + + + + + Start - + + + + + + + + + Ok diff --git a/companion/src/translations/companion_es.ts b/companion/src/translations/companion_es.ts index 7e1cf51d6..61d6368a0 100644 --- a/companion/src/translations/companion_es.ts +++ b/companion/src/translations/companion_es.ts @@ -93,41 +93,97 @@ AppPreferencesDialog + + + + + + + Edit Settings Editar Ajustes + + + + + + + Radio Profile Perfil de Radio + + + + + + + Default Channel Order Orden Prederterminado Canales + + + + + + + Build Options Opciones Firmware + + + + + + + Menu Language Lenguaje Menú + + + + + + + Default Stick Mode Modo Prederterminado Sticks + + + + + + + Select Image Seleccionar Imagen + + + + + + + Mode selection: Mode 1: @@ -169,172 +225,417 @@ Modo 4: + + + + + + + Mode 1 (RUD ELE THR AIL) Modo 1 (RUD ELE THR AIL) + + + + + + + Mode 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 + + + + + + + + + + + + + + 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>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 @@ -345,272 +646,680 @@ Modo 4: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Select Folder + + + + + + + Select Executable + + + + Release channel + + + + Releases (stable) + + + + Release candidates (testing) + + + + Nightly builds (unstable) + + + + + + + Simulator Volume Gain + + + + + + + Profile Name Nombre de Perfil + + + + + + + Clear Image Limpiar Imagen + + + + + + + Append version number to FW file name Agregar el número de version 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 + + + + + + + Other Settings Otros Ajustes + + + + + + + General Settings Ajustes Generales + + + + + + + SD Structure path Estructura de archivos SD + + + + + + + Application Settings Ajustes Aplicación + + + + + + + Show splash screen when Companion starts Mostrar pantalla de inicion 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 + + + + + + + Splash Screen Library Libreria de pantallas de inicio + + + + + + + Google Earth Executable Ejecutable Google Earth + + + + + + + Only show user splash images Mostrar solo pantallas de inicio del usuario + + + + + + + Show user and companion splash images Mostrar pantallas de inicio del usuario y companion + + + + + + + User Splash Screens Pantallas de Inicio del Usuario + + + + + + + Automatic Backup Folder Carpeta copia de seguridad Automática + + + + + + + Simulator Settings Ajustes Simulador + + + + + + + Simulator BackLight Luz de fondo del simulador + + + + + + + Enable Activado + + + + + + + most recently used files + + + + + + + Startup Settings + + + + + + + Remember + + + + + + + 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> + + + + + + + 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 + + + + + + + <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) + + + + + + + Action on New Model + + + + + + + Blue Azul + + + + + + + Green Verde + + + + + + + Red Rojo + + + + + + + Orange Naranja + + + + + + + Yellow Amarillo + + + + + + + Screenshot capture folder + + + + + + + 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 @@ -691,6 +1400,31 @@ Modo 4: Images (%1) Imagenes (%1) + + + + + Use releases (stable) + + + + + Use release candidates (testing) + + + + + + + Use nightly builds (unstable) + + + + + + Use releases and release candidates (testing) + + BinEepromFormat @@ -910,36 +1644,85 @@ Modo 4: 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 @@ -1185,31 +1968,73 @@ If you have a settings backup file, you may import that instead. CompareDialog + + + + + + + Compare Models + + + + + + + To compare models, drag and drop them anywhere in this window. + + + + + + + Close Cerrar + + + + + + + Style + + + + + + + Print Imprimir + + + + + + + Print to file Imprimir a archivo @@ -1366,87 +2191,213 @@ If you have a settings backup file, you may import that instead. Curves + + + + + + + Fixed X X Fija + + + + + + + Custom X X A medida + + + + + + + Lines Lineas + + + + + + + Smooth Suave + + + + + + + + + + + + + + Curve type Tipo de Curva + + + + + + + Curve Creator Creador de curva + + + + + + + Y at X=0 Y a X=0 + + + + + + + Point size + + + + + + + Y at X=100 Y a X=100 + + + + + + + Both Ambos + + + + + + + x>0 x>0 + + + + + + + x<0 x<0 + + + + + + + Apply Aplicar + + + + + + + Side Cara + + + + + + + Y at X=-100 Y a X=-100 + + + + + + + Coefficient Coeficiente + + + + + + + Curve name Nombre de la curva @@ -1859,42 +2810,133 @@ If you have a settings backup file, you may import that instead. CustomizeSplashDialog + + + + + + + Transmitter Splash Screen Editor Editor de la pantalla de inicio del transmisor + + + + + + + + + + + + + + Invert Invertir + + + + + + + + + + + + + + Load FW Cargar FW + + + + + + + + + + + + + + Load Pict Cargar Imag + + + + + + + + + + + + + + Load Profile Cargar Perfil + + + + + + + + + + + + + + Save Guardar + + + + + + + + + + + + + + Open Splash Library Abrir libreria de pantallas de inicio @@ -1903,6 +2945,34 @@ If you have a settings backup file, you may import that instead. + + + + + + + + + + + + + + + + + + + + + + + + + + + + ... @@ -2018,48 +3088,48 @@ If you have a settings backup file, you may import that instead. - + 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 solo aceta %1 puntos en todas las curvas - + OpenTx only accepts %1 points in all curves OpenTx solo aceta %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 doesn't accept this radio protocol OpenTX en esta placa no acepta este protocolo de radio @@ -2068,86 +3138,198 @@ If you have a settings backup file, you may import that instead. 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. @@ -2166,6 +3348,13 @@ To <b>remove a remembered entry</b> from the filter list, first cho DownloadDialog + + + + + + + Downloading: Descargando: @@ -2309,6 +3498,13 @@ To <b>remove a remembered entry</b> from the filter list, first cho ExpoDialog + + + + + + + Weight Peso @@ -2316,91 +3512,231 @@ 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 + + + + + + + Source Origen + + + + + + + Line name Nombre de linea + + + + + + + Stick Side Lado Stick + + + + + + + Scale Escala + + + + + + + Include Trim Incluir Trim + + + + + + + No No + + + + + + + Yes Si + + + + + + + Curve Curva + + + + + + + Curve applied to the source. Curva aplicada al origen. + + + + + + + Offset Offset + + + + + + + The source for the mixer El origen de la mezcla + + + + + + + NEG NEG + + + + + + + Source for the mixer. Origen 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. @@ -2408,11 +3744,25 @@ Si está en blanco entonces las entradas son consideradas como ON todo el tiempo + + + + + + + POS POS + + + + + + + ALL TODO @@ -3055,31 +4405,73 @@ Blank means include all. ?, *, and [...] wildcards accepted. FirmwarePreferencesDialog + + + + + + + Downloads Descargas + + + + + + + Check for updates Comprobar Actualizaciones + + + + + + + Firmware Firmware + + + + + + + Download firmware + + + + + + + Download SD contents + + + + + + + Latest Download Última Descarga @@ -3121,67 +4513,158 @@ Blank means include all. ?, *, and [...] wildcards accepted. FlashEEpromDialog + + + + + + + Write Models and Settings to Radio Escribir Modelos y Ajustes a la Radio + + + + + + + Load... + + + + + + + Current Profile Perfil Actual + + + + + + + Allows Companion to write to older version of the firmware Permitir a Companion escribir a las versiones viejas de firmware + + + + + + + Check Firmware compatibility 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> + + + + + + + Backup before Write + + + + + + + <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> + + + + + + + Patch calibration setting from profile 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> + + + + + + + Patch HW settings from profile + + + + + + + Cancel Cancelar + + + + + + + Write to TX Escribir al TX @@ -3239,71 +4722,169 @@ Blank means include all. ?, *, and [...] wildcards accepted. FlashFirmwareDialog + + + + + + + Flash Firmware + + + + + + + Load... + + + + + + + Date & Time Fecha & Hora + + + + + + + Variant Variante + + + + + + + Version + + + + + + + Use profile start screen Usar la pantala de inicio del perfil + + + + + + + Use firmware start screen Usar la pantalla de inicio del firmware + + + + + + + Use library start screen Usar la libreria de pantalla de inicio + + + + + + + Use another start screen 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 + + + + + + + Check Hardware compatibility + + + + + + + Backup and restore Models and Settings Copia de seguridad y restauración de Modelos y Ajustes + + + + + + + Cancel Cancelar + + + + + + + Write to TX Escribir al TX @@ -3503,21 +5084,49 @@ Actualmente estás usando: FlightMode + + + + + + + Fade In + + + + + + + Fade Out + + + + + + + Name Nombre + + + + + + + Switch Switch @@ -3707,11 +5316,25 @@ Actualmente estás usando: FusesDialog + + + + + + + Fuses + + + + + + + <!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; } @@ -3729,11 +5352,25 @@ p, li { white-space: pre-wrap; } + + + + + + + Read Fuses Leer Fuses + + + + + + + <!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; } @@ -3753,6 +5390,13 @@ p, li { white-space: pre-wrap; } + + + + + + + Reset Fuses EEPROM - PROTECT Resetear Fuses @@ -3760,6 +5404,13 @@ 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; } @@ -3779,12 +5430,26 @@ p, li { white-space: pre-wrap; } + + + + + + + Reset Fuses EEPROM - DELETE + + + + + + + <!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; } @@ -3854,11 +5519,25 @@ p, li { white-space: pre-wrap; } GeneralEdit + + + + + + + Radio settings + + + + + + + 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. @@ -3876,11 +5555,25 @@ Estos puede ser relevantes para todos los modelos en el mismo EEPROM. + + + + + + + Store calib. and hw settings in selected profile Guardar calib. y los ajustes de hw en el perfil seleccionado + + + + + + + Retrieve calib. and hw settings from profile Recuperar calib. y los ajustes de hw de un perfil @@ -3937,127 +5630,309 @@ Estos puede ser relevantes para todos los modelos en el mismo EEPROM.GeneralSetup + + + + + + + Form + + + + + + + Readonly Unlock Desactivar solo lectura + + + + + + + SC + + + + + + + SE + + + + + + + SA + + + + + + + SF SF + + + + + + + SH + + + + + + + SD + + + + + + + SB + + + + + + + SG + + + + + + + Timeshift from UTC Zona horaria UTC + + + + + + + Voice Language Lenguaje de las Voces + + + + + + + Country Code Codigo País + + + + + + + Stick reverse + + + + + + + FAI Mode Modo FAI + + + + + + + Adjust RTC + + + + + + + Vario pitch at max Tono de vario al max + + + + + + + + + + + + + + Hz + + + + + + + Speaker Volume Volumen Altavoz + + + + + + + Backlight Switch Switch de pantalla + + + + + + + Sound Mode Modo sonido + + + + + + + Color 1 + + + + + + + Color 2 + + + + + + + Speaker Pitch (spkr only) Tono del altavoz (solo altavoz) + + + + + + + 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. @@ -4065,82 +5940,209 @@ Estos puede ser relevantes para todos los modelos en el mismo EEPROM. + + + + + + + + + + + + + + + sec seg + + + + + + + Backlight color Color de pantalla + + + + + + + Beeper + + + + + + + Speaker Altavoz + + + + + + + BeeperVoice BeeperVoz + + + + + + + SpeakerVoice VozAltavoz + + + + + + + Beep volume Volumen Beep + + + + + + + Wav volume Volumen Wav + + + + + + + Vario volume Volumen Vario + + + + + + + Background volume Volumen de Fondo + + + + + + + + + + + + + + ms + + + + + + + Backlight Auto OFF after Apagado automático de pantalla después + + + + + + + Backlight flash on alarm Pantalla parpadea con una alarma + + + + + + + Vario pitch at zero Tono de vario a cero + + + + + + + Vario repeat at zero Vario repite a cero + + + + + + + This is the switch selectrion for turning on the backlight (if installed). @@ -4151,6 +6153,20 @@ Estos puede ser relevantes para todos los modelos en el mismo EEPROM. + + + + + + + + + + + + + + <!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; } @@ -4166,41 +6182,97 @@ p, li { white-space: pre-wrap; } + + + + + + + Backlight Brightness Brillo pantalla + + + + + + + RotEnc Navigation Navegación RotEnc + + + + + + + Automatically adjust the radio's clock if a GPS is connected to telemetry. + + + + + + + America + + + + + + + Japan Japón + + + + + + + Europe Europa + + + + + + + Backlight OFF Brightness + + + + + + + Mode selection: Mode 1: @@ -4242,346 +6314,845 @@ Modo 4: + + + + + + + Mode 1 (RUD ELE THR AIL) Modo 1 (RUD ELE THR AIL) + + + + + + + Mode 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) + + + + + + + <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> + + + + + + + If you enable FAI, only RSSI and RxBt sensors will keep working. This function cannot be disabled by the radio. + + + + + + + RSSI Poweroff Warning + + + + + + + Low EEPROM Warning + + + + Owner Registration ID + + + + aaaaaaAA + + + + + + + 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 + + + + + + + Jack Mode + + + + + + + Audio + + + + + + + Trainer Trainer + + + + + + + DMS + + + + + + + USB Mode + + + + Power Off Delay + + + + + + + + + + + + + + Ask on Connect + + + + + + + Joystick (HID) + + + + + + + USB Mass Storage + + + + + + + USB Serial (CDC) + + + + + + + Stick Mode Modo Stick + + + + + + + Metric Métrico + + + + + + + Imperial + + + + + + + Default Channel Order Orden Prederterminado Canales + + + + + + + GPS Coordinates Coordenadas GPS + + + + + + + Min + + + + + + + + + + + + + + v + + + + + + + Max + + + + + + + Inactivity Timer Tiempo de inactividad + + + + + + + Show Splash Screen on Startup Mostrar Pantalla de Inicio al Enceder + + + + + + + Contrast Contraste + + + + + + + Battery Meter Range + + + + + + + Haptic Strength Fuerza de Haptic + + + + + + + LCD Display Type Tipo de Pantalla LCD + + + + + + + "No Sound" Warning Aviso "Sin Sonido" + + + + + + + Battery Warning Aviso de Bateria + + + + + + + Haptic Length Longitud Haptic + + + + + + + MAVLink Baud Rate Transferencia Baud MAVLink + + + + + + + + + + + + + + Quiet Silencio + + + + + + + Only Alarms Solo Alarmas + + + + + + + + + + + + + + No Keys Sin teclas + + + + + + + + + + + + + + All Todo + + + + + + + Battery warning voltage. This is the threashhold where the battery warning sounds. @@ -4593,107 +7164,261 @@ Los valores aceptables son 5v..10v + + + + + + + Standard Estandar + + + + + + + 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. + + + + + + + min min + + + + + + + + + + + + + + Show splash screen on startup 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 @@ -4701,6 +7426,27 @@ Los valores aceptables son 5v..10v + + + + + + + + + + + + + + + + + + + + + <!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; } @@ -4727,65 +7473,184 @@ p, li { white-space: pre-wrap; } + + + + + + + + + + + + + + X-Short X-Corto + + + + + + + + + + + + + + Short Corto + + + + + + + + + + + + + + Normal + + + + + + + + + + + + + + Long Largo + + + + + + + + + + + + + + X-Long X-Largo + + + + + + + NMEA + + + + + + + Play Delay (switch mid position) Retardo de Play (switch en posición media) + + + + + + + Measurement Units Unidades de Medida + + + + + + + Haptic Mode Modo Haptic + + + + + + + Beeper Length Longitud del beeper + + + + + + + Beeper Mode Modo Beeper + + + + + + + Beeper volume 0 - Quiet. No beeps at all. @@ -4803,9 +7668,26 @@ p, li { white-space: pre-wrap; } + + + + + + + Alarms Only Solo Alarmas + + + Power On Speed + + + + + Power Off Speed + + GeneralSetupPanel @@ -4959,251 +7841,595 @@ Are you sure ? 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 + + + + + + + SL + + + + + + + SM + + + + + + + SN + + + + + + + RS2 + + + + + + + Bluetooth + + + + + + + ADC Filter + + + + + + + Device Name: @@ -5302,71 +8528,169 @@ Are you sure ? Heli + + + + + + + Invert Elevator Invertir Elevador + + + + + + + Invert Aileron Invertir Aleron + + + + + + + Invert Collective Invertir Colectivo + + + + + + + Invert Invertir + + + + + + + Off + + + + + + + 120 + + + + + + + 120X + + + + + + + 140 + + + + + + + 90 + + + + + + + Long. cyc + + + + + + + Lateral cyc + + + + + + + Collective Colectivo + + + + + + + Swash Type Tipo de Plato + + + + + + + Swash Ring @@ -5758,46 +9082,109 @@ Are you sure ? LogsDialog + + + + + + + Companion Log Viewer Visor de registros de Companion + + + + + + + Filename Nombre Archivo + + + + + + + Open LogFile Abrir archivo Registros + + + + + + + Zoom + + + + + + + Save session CSV + + + + + + + X + + + + + + + Y + + + + + + + Reset Resetear + + + + + + + Fly sessions Sesiones de vuelo @@ -7287,11 +10674,23 @@ Do you want to save your changes? MixerDialog + + + + + Dialog Mezclas + + + + + + + Source Fuente @@ -7300,11 +10699,46 @@ Do you want to save your changes? + + + + + + + + + + + + + + + + + + + + + + + + + + + + The source for the mixer LA fuente de la mezcla + + + + + + + Weight Carga @@ -7312,11 +10746,39 @@ Do you want to save your changes? + + + + + + + + + + + + + + + + + + + + + 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. @@ -7325,46 +10787,109 @@ Si está en blanco entonces la mezcla se considera que está activa todo el tiem + + + + + + + Offset + + + + + + + Include Trim Incluir Trim + + + + + + + Curve Curva + + + + + + + The curve used by the mix La curva usada por la mezcla + + + + + + + Switch + + + + + + + Yes Si + + + + + + + No No + + + + + + + Warning Aviso + + + + + + + Name Nombre @@ -7373,6 +10898,34 @@ 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; } @@ -7388,6 +10941,13 @@ p, li { white-space: pre-wrap; } + + + + + + + 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. @@ -7396,32 +10956,74 @@ Setting this value will cause a beep to be emmitted when this value is active. + + + + + + + OFF APAGADO + + + + + + + 1 Beep + + + + + + + 2 Beep 2 Beeo + + + + + + + 3 Beep + + + + + + + Multiplex Opciones + + + + + + + Multiplexer This determines how mixer values are added. @@ -7439,46 +11041,109 @@ 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 + + + + + + + Delay Retardo + + + + + + + Slow Lento + + + + + + + Up Arriba + + + + + + + Down Abajo @@ -7507,6 +11172,12 @@ Esto determina como los valores de mezcla son añadidos. Invert All + + + + FullScreenDialog + + MixersListWidget @@ -7680,6 +11351,11 @@ Esto determina como los valores de mezcla son añadidos. ModelEdit + + + + + Dialog Mensaje @@ -7735,9 +11411,22 @@ Esto determina como los valores de mezcla son añadidos. + + + + + + + Simulate Simular + + + + FullScreenDialog + + ModelPrinter @@ -8556,138 +12245,324 @@ Esto determina como los valores de mezcla son añadidos. Module + + + + + + + Failsafe Mode Modo Failsafe + + + + + + + Start Comenzar + + + + + + + PPM delay Retardo PPM + + + + + + + Negative Negativo + + + + + + + Positive Positivo + + + + + + + Polarity Polaridad + + + + + + + Trainer Mode Modo Entrenador + + + + + + + PPM Frame Length Longitud Trama PPM + + + + + + + CH + + + + + + + Antenna + + + + + + + Option value + + + + + + + Bind on startup + + + + + + + RF Output Power + + + + + + + Low Power + + + + + + + us + + + + + + + Multi Radio Protocol + + + + + + + Sub Type + + + + + + + Master/Jack + + + + + + + Slave/Jack + + + + + + + Master/SBUS Module + + + + + + + Master/CPPM Module + + + + + + + Master/SBUS in battery compartment + + + + + + + Show values in: + + + + + + + % abbreviation for percent + + + + + + + μs abbreviation for microseconds + + + + + + + ms + + + + Receiver 1 @@ -8695,94 +12570,232 @@ Esto determina como los valores de mezcla son añadidos. + + + + + + + + + + + + X + + + + Receiver 2 + + + + Receiver 3 + + + + + + + WARNING: changing RF Output Power needs RE-BIND + + + + + + + Channels Canales + + + + Registration ID + + + + + + + WARNING: Requires non-certified firmware! + + + + + + + Not set + + + + + + + Hold Esperar + + + + + + + Custom A medida + + + + + + + No Pulses Sin Pulsos + + + + + + + Receiver Receptor + + + + + + + Failsafe Positions Posiciones Failsafe + + + + + + + Protocol Protocolo + + + + + + + Receiver No. Receptor Nº. + + + + + + + Output type + + + + + + + Open Drain + + + + + + + Push Pull + + + + + + Internal + + + + + + + + Ext. + Int. + + ModuleData @@ -9521,21 +13534,49 @@ Esto determina como los valores de mezcla son añadidos. PrintDialog + + + + + + + Close Cerrar + + + + + + + Style + + + + + + + Print Imprimir + + + + + + + Print to file Imprimir a archivo @@ -9559,11 +13600,25 @@ Esto determina como los valores de mezcla son añadidos. ProgressDialog + + + + + + + Flash Firmware + + + + + + + Close Cerrar @@ -9578,6 +13633,13 @@ Esto determina como los valores de mezcla son añadidos. ProgressWidget + + + + + + + Show Details Mostrar detalles @@ -9731,16 +13793,37 @@ Esto determina como los valores de mezcla son añadidos. RadioNotFoundDialog + + + + + + + No Radio Found No se ha encontrado la 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> + + + + + + + OK @@ -9749,43 +13832,99 @@ Esto determina como los valores de mezcla son añadidos. RadioOutputsWidget - + + + + + + + + + Form - + + + + + + + + + View: - + + + + + + + + + Logical Switches Switches lógicos - + + + + + + + + + Global Variables Variables globales - + + + + + + + + + Channel Outputs - + + + + + + + + + Mix Outputs - + + + + + + + + + L o g @@ -9795,7 +13934,15 @@ c - + + + + + + + + + G l o @@ -9806,7 +13953,15 @@ l - + + + + + + + + + C h a @@ -9819,7 +13974,15 @@ s - + + + + + + + + + M i x @@ -10658,161 +14821,385 @@ s Setup + + + + + + + Center beep Centro beep + + + + + + + OFF OFF + + + + + + + Model Image Imagen del modelo + + + + + + + Exponential Exponencial + + + + + + + Throttle Trim Idle Only Trim de acelerador ajuste de ralentí + + + + + + + Extra Fine Extra Fino + + + + + + + Fine Fino + + + + + + + Medium Medio + + + + + + + Coarse Duro + + + + + + + Display Checklist Lista verificación pantalla + + + + + + + Timer 2 Temporizador 2 + + + + + + + Timer 1 Temporizador1 + + + + + + + Timer 3 Temporizador3 + + + + + + + Never + + + + + + + Top LCD Timer + + + + + + + On change + + + + + + + Always + + + + + + + Global Functions + + + + + + + Edit Checklist... + + + + + + + Throttle Source Fuente del acelerador + + + + + + + Trim Step Pasos de Trim + + + + + + + Trims Display + + + + + + + Warnings Avisos + + + + + + + Switch Warnings Avisos palancas (Switch) + + + + + + + Pot Warnings Avisos Potenciómetros + + + + + + + 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,6 +15211,13 @@ Si está marcado el acelerador será invertido. El ralentí será delante, el t + + + + + + + Reverse Throttle Invertir acelerador (Throttle) @@ -11191,181 +15585,421 @@ Profile ID: [%1]; Radio ID: [%2] 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. @@ -11446,76 +16080,172 @@ Profile ID: [%1]; Radio ID: [%2] 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... @@ -11523,59 +16253,147 @@ The radio type specified in the selected profile is used by default. - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + ... - + + + + + + + + + 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 Archivo - + + + + + + + + + Folder - + + + + + + + + + SD Path @@ -11604,7 +16422,15 @@ The default is configured in the chosen Radio Profile. SimulatorWidget - + + + + + + + + + Companion Simulator Simulador Companion @@ -11692,6 +16518,20 @@ The default is configured in the chosen Radio Profile. + + + + + + + + + + + + + + ... @@ -11731,6 +16571,13 @@ The default is configured in the chosen Radio Profile. StyleEditDialog + + + + + + + @@ -11739,21 +16586,49 @@ The default is configured in the chosen Radio Profile. + + + + + + + &Reset to default + + + + + + + &Cancel + + + + + + + &OK + + + + + + + This feature does not validate your changes and assumes you are familiar with CSS syntax for QT. @@ -12011,190 +16886,475 @@ 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 + + + + + Source + + + + + + + Center Silent + + + + + + + Altitude source + + + + + + + Volts source + + + + + + + Top Bar + + + + + + + Serial Protocol Protocolo Serie + + + + + + + Sensors + + + + + + + Disable multi sensor handling + + + + + + + Volt source Fuente Voltaje + + + + + + + Current source Fuente Actual + + + + + + + Protocol Protocolo + + + + + + + None Ninguno + + + + + + + FrSky Sensor Hub + + + + + + + Blades Palas + + + + + + + Sink Max Descenso Máximo + + + + + + + Climb Max Máximo Ascenso + + + + + + + Sink Min Descenso Mínimo + + + + + + + Climb Min Mínimo Ascenso + + + + + + + Vario source Fuente Variómetro + + + + + + + Vario limits Límites Variómetro + + + + + + + Altimetry Altímetro + + + + + + + mAh + + + + + + + A + + + + + + + Various Varios + + + + + + + mAh count Valor mAh + + + + + + + FAS Offset + + + + + + + Persistent mAh mAh Constantes @@ -12203,107 +17363,289 @@ Too many errors, giving up. TelemetryAnalog + + + + + + + Unit Unidad + + + + + + + Max Value Valor Máximo + + + + + + + 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,6 +17659,13 @@ Too many errors, giving up. TelemetryCustomScreen + + + + + + + Custom Screen Type Personalizar tipo pantalla @@ -12342,21 +17691,49 @@ Too many errors, giving up. + + + + + + + Min Mínimo + + + + + + + Source Fuente + + + + + + + Gauge Medida + + + + + + + Max Máximo @@ -12470,86 +17847,199 @@ Too many errors, giving up. TelemetrySensor + + + + + + + Form + + + + + + + Custom A medida + + + + + + + Calculated + + + + + + + Id + + + + + + + Instance + + + + Rx + + + + Mod. + + + + + + + Add + + + + + + + Average + + + + + + + Min + + + + + + + Max + + + + + + + Multiply + + + + + + + Totalize + + + + + + + Cell + + + + + + + Consumption + + + + + + + Dist + + + + + + + Cells Sensor : @@ -12562,191 +18052,506 @@ Too many errors, giving up. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --- --- + + + + + + + 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 + + + + + + + ° + + + + + + + Rad + + + + + + + mL + + + + + + + US fl.Oz. + + + + + + + Raw (-) + + + + + + + RPM + + + + + + + Precision + + + + + + + Ratio + + + + + + + Blades Palas + + + + + + + Offset Offset + + + + + + + Multiplier + + + + + + + Auto Offset + + + + + + + Filter + + + + + + + Persistent + + + + + + + Positive Positivo + + + + + + + Logs @@ -12778,116 +18583,268 @@ Too many errors, giving up. TelemetrySimulator - + + + + + + + + + Telemetry Simulator - + + + + + + + + + VFAS - + + + + + + + + + RSSI - + + + + + + + + + A1 - + + + + + + + + + A2 - + + + + + + + + + Simulate Simular - + + + + + + + + + Replay SD Log File - + + + + + + + + + Replay rate - + + + + + + + + + Load - + + + + + + + + + |> - + + + + + + + + + <| - + + + + + + + + + > - + + + + + + + + + <- - + + + + + + + + + X - + + + + + + + + + Row # Timestamp - + + + + + + + + + 1/5x 1/5x - + + + + + + + + + 5x 5x - + + + + + + + + + No Log File Currently Loaded - + + + + + + + + + RAS @@ -12895,21 +18852,61 @@ Timestamp - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + V / ratio - + + + + + + + + + Db - + + + + + + + + + RxBt @@ -12927,121 +18924,377 @@ Timestamp - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <html><head/><body><p><br/></p></body></html> - + + + + + + + + + Tmp1 - + + + + + + + + + A3 - + + + + + + + + + A4 - + + + + + + + + + Tmp2 - + + + + + + + + + Fuel Combustible - - + + + + + + + + + + + + + + + + + + °C - + + + + + + + + + ml - + + + + + + + + + % - - + + + + + + + + + + + + + + + + + + Meters - + + + + + + + + + Alt - + + + + + + + + + VSpd - + + + + + + + + + m/s - + + + + + + + + + Fuel Qty - - + + + + + + + + + + + + + + + + + + km/h - + + + + + + + + + Hdg - + + + + + + + + + ASpd @@ -13049,135 +19302,335 @@ Timestamp - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + G - + + + + + + + + + GPS - + + + + + + + + + Lat,Lon (dec.deg.) - + + + + + + + + + AccX - + + + + + + + + + dd-MM-yyyy hh:mm:ss - + + + + + + + + + Date - + + + + + + + + + Amps - + + + + + + + + + AccZ - + + + + + + + + + GAlt - - + + + + + + + + + + + + + + + + + + Volts - + + + + + + + + + Cels - + + + + + + + + + Curr - + + + + + + + + + AccY - + + + + + + + + + GSpd - + + + + + + + + + Degrees - + + + + + + + + + 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 - + + + + + + + + + When enabled, sends any non-blank values as simulated telemetry data. @@ -13219,11 +19672,25 @@ hh:mm:ss Timer + + + + + + + Countdown Cuenta Atrás + + + + + + + Minute Call Cada Minuto @@ -13307,26 +19774,61 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. Trainer + + + + + + + Form + + + + + + + Mode Modo + + + + + + + Input Entrada + + + + + + + Weight + + + + + + + Rud Rud @@ -13339,6 +19841,62 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Beeper volume 0 - Quiet. No beeps at all. @@ -13359,6 +19917,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + Off Apagado @@ -13367,6 +19953,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + += (Sum) @@ -13375,6 +19989,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + := (Replace) := (Reemplazar) @@ -13383,6 +20025,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn1 @@ -13391,6 +20061,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn2 @@ -13399,6 +20097,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn3 @@ -13407,21 +20133,70 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn4 + + + + + + + Ele Ele + + + + + + + Thr Thr + + + + + + + Ail Ail @@ -13430,7 +20205,15 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. TrainerSimulator - + + + + + + + + + Trainer simulator @@ -13855,17 +20638,38 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. burnConfigDialog + + + + + + + AVRDUDE Location Localización AVRDUDE + + + + + + + Location of AVRDUDE executable Locatioon of AVRDUDE executable Localización del ejecutable AVRDUDE + + + + + + + Programmer Configuration Configuration AVRDUDE / SAM-BA Configuración del programador @@ -13875,12 +20679,47 @@ 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. + + + + + + + DFU-Util Location Localización de la utilidad DFU @@ -13888,6 +20727,27 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + 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. @@ -13895,16 +20755,51 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + 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 +20807,65 @@ 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 + + + + + + + + + + + + + + Extra arguments that will be passed to AVRDUDE on every call Argumentos extras 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 +20877,174 @@ 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 + + + + + + + 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 + + + + + + + + + + + + + + Location of sam-ba executable Localización del ejecutable sam-ba + + + + + + + ARM MCU + + + + + + + sam-ba serial port Puerto serie sam-ba @@ -14046,12 +21088,40 @@ Por favor solamente usa esto si sabes lo que estás haciendo. No hay control de + + + + + + + + + + + + + + CPU of your TX CPU a tu TX + + + + + + + + + + + + + + CPU present on your 9x radio Should be m64 for stock radios m2560 for v4.1 boards @@ -14064,85 +21134,197 @@ m2560 para las placas v4.1 joystickDialog - + + + + + + + + + Configure Joystick Configurar Joystick - + + + + + + + + + Ch2 - + + + + + + + + + Ch1 - + + + + + + + + + Ch4 - + + + + + + + + + Ch6 - + + + + + + + + + Ch3 - + + + + + + + + + Ch5 - + + + + + + + + + Ch7 - + + + + + + + + + Ch8 - + + + + + + + + + Instructions Instrucciones - + + + + + + + + + Enable - + + + + + + + + + Cancel Cancelar - + + + + + + + + + Back - + + + + + + + + + Start Comenzar @@ -14153,7 +21335,15 @@ m2560 para las placas v4.1 - + + + + + + + + + Ok diff --git a/companion/src/translations/companion_fi.ts b/companion/src/translations/companion_fi.ts index 96b43df85..bce42e3a5 100644 --- a/companion/src/translations/companion_fi.ts +++ b/companion/src/translations/companion_fi.ts @@ -93,41 +93,97 @@ AppPreferencesDialog + + + + + + + Edit Settings Muuta asetuksia + + + + + + + Radio Profile Radio profiili + + + + + + + Default Channel Order Kanavien järjestys + + + + + + + Build Options Käännöksen valinnat + + + + + + + Menu Language Valikon kieli + + + + + + + Default Stick Mode Perus tikkujen tila + + + + + + + Select Image Valitse kuva + + + + + + + Mode selection: Mode 1: @@ -172,177 +228,429 @@ Tila 4: + + + + + + + Mode 1 (RUD ELE THR AIL) Mode 1 (PER KOR KAA SII) + + + + + + + Mode 2 (RUD THR ELE AIL) Mode 2 (PER KAA KOR SII) + + + + + + + Mode 3 (AIL ELE THR RUD) Mode 3 (SII KOR KAA PER) + + + + + + + Mode 4 (AIL THR ELE RUD) Mode 4 (SII KAA KOR PER) + + + + + + + Splash Screen Alkuruutu + + + + + + + Radio Type Radio tyyppi + + + + + + + + + + + + + + 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>Kanava järjestys</p><p><br/></p><p>Määrittelee miksereiden perusasetukset uuteen malliin.</p></body></html> + + + + + + + R E T A P Ko Ka S + + + + + + + R E A T P Ko S Ka + + + + + + + R T E A P Ka Ko S + + + + + + + R T A E P Ka S Ko + + + + + + + R A E T P S Ko Ka + + + + + + + R A T E P S Ka Ko + + + + + + + E R T A Ko P Ka S + + + + + + + E R A T Ko P S Ka + + + + + + + E T R A Ko Ka P S + + + + + + + E T A R Ko Ka S P + + + + + + + E A R T Ko S P Ka + + + + + + + E A T R Ko S Ka P + + + + + + + T R E A Ka P Ko S + + + + + + + T R A E Ka P S Ko + + + + + + + T E R A Ka Ko P S + + + + + + + T E A R Ka Ko S P + + + + + + + T A R E Ka S P Ko + + + + + + + T A E R Ka S Ko P + + + + + + + A R E T S P Ko Ka + + + + + + + A R T E S P Ka Ko + + + + + + + A E R T S Ko P Ka + + + + + + + A E T R S Ko Ka P + + + + + + + A T R E S Ka P Ko + + + + + + + A T E R S Ka Ko P @@ -353,267 +661,668 @@ Tila 4: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Select Folder + + + + + + + Select Executable + + + + Release channel + + + + Releases (stable) + + + + Release candidates (testing) + + + + Nightly builds (unstable) + + + + + + + Simulator Volume Gain + + + + + + + Profile Name Profiilin nimi + + + + + + + Clear Image Tyhjennä kuva + + + + + + + Append version number to FW file name Liitä version numero FW tiedoston nimeen + + + + + + + Offer to write FW to Tx after download Tarjoa että FW ladataan lähettimeen kun se on ladattu + + + + + + + Other Settings + + + + + + + General Settings Yleiset asetukset + + + + + + + SD Structure path SD muistikortin kansio + + + + + + + Application Settings Ohjelman asetukset + + + + + + + Show splash screen when Companion starts Näytä alkuruutu kun Companion käynnistetään + + + + + + + Automatic check for Companion updates Tutki automaattisesti Companionin päivitykset + + + + + + + + + + + + + + Enable automatic backup before writing firmware Laita automaatiinen varmuuskopionti päälle ennen firmwaren kirjoitusta + + + + + + + Automatic check for OpenTX firmware updates Tutki automaattisesti OpenTX firmware päivitykset + + + + + + + Splash Screen Library Alkuruutu kirjasto + + + + + + + Google Earth Executable Google Earth tiedosto + + + + + + + Only show user splash images Näytä vain käyttäjän oma alkuruutu kuvat + + + + + + + Show user and companion splash images Näytä käyttäjän ja Companionin alkuruutu kuvat + + + + + + + User Splash Screens Käyttäjän oma alkuruudut + + + + + + + Automatic Backup Folder Automaattisen varmuuskopion kansio + + + + + + + Simulator Settings Simulaattorin asetukset + + + + + + + Simulator BackLight Simulaattorin taustavalo + + + + + + + Enable Päälle + + + + + + + most recently used files + + + + + + + Startup Settings + + + + + + + Remember + + + + + + + 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> + + + + + + + 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 + + + + + + + <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) + + + + + + + Action on New Model + + + + + + + Blue Sininen + + + + + + + Green Vihreä + + + + + + + Red + + + + + + + Orange + + + + + + + Yellow + + + + + + + Screenshot capture folder + + + + + + + Joystick Joystick + + + + + + + Calibrate Kalibroi + + + + + + + Only capture to clipboard Kaappaa leikepöydälle + + + + + + + Remember simulator switch values Muista simulaattorin kytkimien asennot @@ -694,6 +1403,31 @@ Tila 4: Images (%1) Kuvia (%1) + + + + + Use releases (stable) + + + + + Use release candidates (testing) + + + + + + + Use nightly builds (unstable) + + + + + + Use releases and release candidates (testing) + + BinEepromFormat @@ -913,36 +1647,85 @@ Tila 4: 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 @@ -1188,31 +1971,73 @@ If you have a settings backup file, you may import that instead. CompareDialog + + + + + + + Compare Models Vertaa malleja + + + + + + + To compare models, drag and drop them anywhere in this window. + + + + + + + Close Sulje + + + + + + + Style + + + + + + + Print Tulosta + + + + + + + Print to file Tulosta tiedostoon @@ -1369,87 +2194,213 @@ If you have a settings backup file, you may import that instead. Curves + + + + + + + Fixed X + + + + + + + Custom X Oma X + + + + + + + Lines Viivat + + + + + + + Smooth Pehmeä + + + + + + + + + + + + + + Curve type Käyrän tyyppi + + + + + + + Curve Creator Käyrän luonti + + + + + + + Y at X=0 Y suhde X =0 + + + + + + + Point size + + + + + + + Y at X=100 Y suhde X =100 + + + + + + + Both Molemmat + + + + + + + x>0 x>0 + + + + + + + x<0 x<0 + + + + + + + Apply Käytä + + + + + + + Side Sivu + + + + + + + Y at X=-100 Y suhde X =-100 + + + + + + + Coefficient Vaikutus + + + + + + + Curve name Käyrän nimi @@ -1862,18 +2813,53 @@ If you have a settings backup file, you may import that instead. CustomizeSplashDialog + + + + + + + Transmitter Splash Screen Editor Lähettimen alkuruutu editori + + + + + + + + + + + + + + Invert Käänteinen + + + + + + + + + + + + + + Open Splash Library Avaa kuvakirjasto @@ -1882,30 +2868,114 @@ If you have a settings backup file, you may import that instead. + + + + + + + + + + + + + + + + + + + + + + + + + + + + ... ... + + + + + + + + + + + + + + Load Profile Lataa profiili + + + + + + + + + + + + + + Load FW Lataa FW + + + + + + + + + + + + + + Load Pict Lataa kuva + + + + + + + + + + + + + + Save Tallenna @@ -2021,48 +3091,48 @@ If you have a settings backup file, you may import that instead. - + Switch Kytkin - + Switch - + cannot be exported on this board! - + Source Lähde - + Source %1 cannot be exported on this board! - + OpenTX only accepts %1 points in all curves OpenTX vastaanottaa vain %1 pistettä kaikkiin käyriin - + OpenTx only accepts %1 points in all curves OpenTX vastaanottaa vain %1 pistettä kaikkiin käyriin - - + + OpenTX on this board doesn't accept this function OpenTX ja tämä funktio ei onnistu tässä radiossa - + OpenTX doesn't accept this radio protocol OpenTX ei hyväksy tätä radio protokollaa @@ -2071,86 +3141,198 @@ If you have a settings backup file, you may import that instead. 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. @@ -2169,6 +3351,13 @@ To <b>remove a remembered entry</b> from the filter list, first cho DownloadDialog + + + + + + + Downloading: Ladataan: @@ -2312,16 +3501,37 @@ To <b>remove a remembered entry</b> from the filter list, first cho ExpoDialog + + + + + + + The source for the mixer Lähde miksereille + + + + + + + Input name Tulon nimi + + + + + + + Weight Paino @@ -2329,46 +3539,123 @@ To <b>remove a remembered entry</b> from the filter list, first cho + + + + + + + + + + + + + + + + + + + + + GV GV + + + + + + + Flight modes Lento tilat + + + + + + + Switch Kytkin + + + + + + + Stick Side Tikun puoli + + + + + + + NEG NEG + + + + + + + POS POS + + + + + + + ALL Kaikki + + + + + + + Source for the mixer. Lähde miksereille. + + + + + + + Switch used to enable the line. If blank then the input is considered to be "ON" all the time. Käyttökytkin. @@ -2376,46 +3663,109 @@ Jos on tyhjä, katsotaan tulon olen ON tilassa kokoajan. + + + + + + + Scale Skaala + + + + + + + Include Trim Myös trimmi + + + + + + + No Ei + + + + + + + Yes Kyllä + + + + + + + Curve Käyrä + + + + + + + Curve applied to the source. Käyrä lähteen mukaan. + + + + + + + Offset Tasoitus + + + + + + + Source Lähde + + + + + + + Line name Nimi @@ -3058,31 +4408,73 @@ Blank means include all. ?, *, and [...] wildcards accepted. FirmwarePreferencesDialog + + + + + + + Downloads Ladatut + + + + + + + Check for updates Tarkista päivitykset + + + + + + + Firmware Firmware + + + + + + + Download firmware + + + + + + + Download SD contents + + + + + + + Latest Download Viimeisin lataus @@ -3124,67 +4516,158 @@ Blank means include all. ?, *, and [...] wildcards accepted. FlashEEpromDialog + + + + + + + Write Models and Settings to Radio Kirjoita mallit ja asetukset lähettimeen + + + + + + + Load... + + + + + + + Current Profile Nykyinen profiili + + + + + + + Allows Companion to write to older version of the firmware Anna Companionin kirjoittaa myös vanhaan firmwareen + + + + + + + Check Firmware compatibility Tarkista firmwaren yhteensopivuus + + + + + + + <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 + + + + + + + <html><head/><body><p>Modify calibration parameters using settings from current profile</p></body></html> <html><head/><body><p>Muuta kalibraation parametrit käyttäen nykyisen profiilin parametreja</p></body></html> + + + + + + + Patch calibration setting from profile Korjaa kalibraatio asetukset profiilista + + + + + + + <html><head/><body><p>Modify HW parameters using settings from current profile</p></body></html> <html><head/><body><p>Muuta HW parametrit käyttäen nykyisen profiilin parametreja</p></body></html> + + + + + + + Patch HW settings from profile + + + + + + + Cancel Peruuta + + + + + + + Write to TX Kirjoita lähettimeen @@ -3242,71 +4725,169 @@ Blank means include all. ?, *, and [...] wildcards accepted. FlashFirmwareDialog + + + + + + + Flash Firmware + + + + + + + Load... + + + + + + + Date & Time Päivä & Aika + + + + + + + Variant Muunnos + + + + + + + Version Versio + + + + + + + Use profile start screen Käytä profiilin aloitus ruutua + + + + + + + Use firmware start screen Käytä firmwaren aloitus ruutua + + + + + + + Use library start screen Käytä kirjaston aloitus ruutua + + + + + + + Use another start screen Käytä muuta aloitus ruutua + + + + + + + Allows Companion to write to older version of the firmware Anna Companionin kirjoittaa myös vanhaan firmwareen + + + + + + + Check Hardware compatibility + + + + + + + Backup and restore Models and Settings Varmuuskopioi ja palauta mallit ja asetukset + + + + + + + Cancel Peruuta + + + + + + + Write to TX Kirjoita lähettimeen @@ -3506,21 +5087,49 @@ Käytät nyt: FlightMode + + + + + + + Fade In Fade In + + + + + + + Fade Out Fade Out + + + + + + + Name Nimi + + + + + + + Switch Kytkin @@ -3710,11 +5319,25 @@ Käytät nyt: FusesDialog + + + + + + + Fuses Sulakkeet + + + + + + + <!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; } @@ -3744,11 +5367,25 @@ p, li { white-space: pre-wrap; } + + + + + + + Read Fuses Lue sulakkeet + + + + + + + <!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; } @@ -3782,6 +5419,13 @@ p, li { white-space: pre-wrap; } + + + + + + + Reset Fuses EEPROM - PROTECT Nollaa sulakkeet @@ -3789,6 +5433,13 @@ EEPROM - SUOJATTU + + + + + + + <!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; } @@ -3822,6 +5473,13 @@ p, li { white-space: pre-wrap; } + + + + + + + Reset Fuses EEPROM - DELETE Nollaa sulakkeet @@ -3829,6 +5487,13 @@ EEPRON - POISTO + + + + + + + <!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; } @@ -3905,21 +5570,49 @@ p, li { white-space: pre-wrap; } GeneralEdit + + + + + + + Radio settings + + + + + + + Retrieve calib. and hw settings from profile Nouda calib. ja hw asetukset profiilista + + + + + + + Store calib. and hw settings in selected profile Tallenna calib. ja hw asetukset valittuun profiiliin + + + + + + + General settings used throught the transmitter. These will be relevant for all models in the same EEPROM. Yleiset asetukset lähettimelle. @@ -3988,127 +5681,309 @@ Nämä vaikuttaa kaikkiin malleihin jotka on EEPROMilla. GeneralSetup + + + + + + + Form + + + + + + + Readonly Unlock Vainlue tilan avaus + + + + + + + SC SC + + + + + + + SE SE + + + + + + + SA SA + + + + + + + SF SF + + + + + + + SH SH + + + + + + + SD SD + + + + + + + SB SB + + + + + + + SG SG + + + + + + + Timeshift from UTC Ajansiirto UTC:stä + + + + + + + Voice Language Äänen kieli + + + + + + + Country Code Maa koodi + + + + + + + Stick reverse + + + + + + + FAI Mode FAI tila + + + + + + + Adjust RTC + + + + + + + Vario pitch at max Vario ääni kun max + + + + + + + + + + + + + + Hz Hz + + + + + + + Speaker Volume Äänen voimakkuus + + + + + + + Backlight Switch Taustavalon kytkin + + + + + + + Sound Mode Ääni tila + + + + + + + Color 1 Väri 1 + + + + + + + Color 2 Väri 2 + + + + + + + Speaker Pitch (spkr only) Äänen korkeus (vain kaj.) + + + + + + + If this value is not 0, any keypress will turn on the backlight and turn it off after the specified number of seconds. Jos tämä arvo ei ole 0, jokainen painallus sytyttää taustavalon, sammuu valitun ajan jälkeen ( SEK). @@ -4116,82 +5991,209 @@ Nämä vaikuttaa kaikkiin malleihin jotka on EEPROMilla. + + + + + + + + + + + + + + + sec sec + + + + + + + Backlight color Taustavalon väri + + + + + + + Beeper Piipperi + + + + + + + Speaker Kaiutin + + + + + + + BeeperVoice Piippausääni + + + + + + + SpeakerVoice Kaiutinääni + + + + + + + Beep volume Piippaus voluumi + + + + + + + Wav volume Wav voluumi + + + + + + + Vario volume Vario voluumi + + + + + + + Background volume Taustan voluumi + + + + + + + + + + + + + + ms ms + + + + + + + Backlight Auto OFF after Taustavalo pois automaattisesti + + + + + + + Backlight flash on alarm Taustavalo vilkkuu hälytyksenä + + + + + + + Vario pitch at zero Vario ääni kun nolla + + + + + + + Vario repeat at zero Varion toisto nollassa + + + + + + + This is the switch selectrion for turning on the backlight (if installed). @@ -4202,6 +6204,20 @@ Nämä vaikuttaa kaikkiin malleihin jotka on EEPROMilla. + + + + + + + + + + + + + + <!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; } @@ -4217,41 +6233,97 @@ p, li { white-space: pre-wrap; } + + + + + + + Backlight Brightness Taustavalon kirkkaus + + + + + + + RotEnc Navigation RotEnc navigaatio + + + + + + + Automatically adjust the radio's clock if a GPS is connected to telemetry. + + + + + + + America Amerikka + + + + + + + Japan Japani + + + + + + + Europe Eurooppa + + + + + + + Backlight OFF Brightness + + + + + + + Mode selection: Mode 1: @@ -4296,346 +6368,845 @@ Tila 4: + + + + + + + Mode 1 (RUD ELE THR AIL) Mode 1 (PER KOR KAA SII) + + + + + + + Mode 2 (RUD THR ELE AIL) Mode 2 (PER KAA KOR SII) + + + + + + + Mode 3 (AIL ELE THR RUD) Mode 3 (SII KOR KAA PER) + + + + + + + Mode 4 (AIL THR ELE RUD) Mode 4 (SII KAA KOR PER) + + + + + + + <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>Kanava järjestys</p><p><br/></p><p>Määrittelee miksereiden perusasetukset uuteen malliin.</p></body></html> + + + + + + + If you enable FAI, only RSSI and RxBt sensors will keep working. This function cannot be disabled by the radio. + + + + + + + RSSI Poweroff Warning + + + + + + + Low EEPROM Warning + + + + Owner Registration ID + + + + aaaaaaAA + + + + + + + R E T A P Ko Ka S + + + + + + + R E A T P Ko S Ka + + + + + + + R T E A P Ka Ko S + + + + + + + R T A E P Ka S Ko + + + + + + + R A E T P S Ko Ka + + + + + + + R A T E P S Ka Ko + + + + + + + E R T A Ko P Ka S + + + + + + + E R A T Ko P S Ka + + + + + + + E T R A Ko Ka P S + + + + + + + E T A R Ko Ka S P + + + + + + + E A R T Ko S P Ka + + + + + + + E A T R Ko S Ka P + + + + + + + T R E A Ka P Ko S + + + + + + + T R A E Ka P S Ko + + + + + + + T E R A Ka Ko P S + + + + + + + T E A R Ka Ko S P + + + + + + + T A R E Ka S P Ko + + + + + + + T A E R Ka S Ko P + + + + + + + A R E T S P Ko Ka + + + + + + + A R T E S P Ka Ko + + + + + + + A E R T S Ko P Ka + + + + + + + A E T R S Ko Ka P + + + + + + + A T R E S Ka P Ko + + + + + + + A T E R S Ka Ko P + + + + Power On Delay + + + + + + + Jack Mode + + + + + + + Audio + + + + + + + Trainer Traineri + + + + + + + DMS + + + + + + + USB Mode + + + + Power Off Delay + + + + + + + + + + + + + + Ask on Connect + + + + + + + Joystick (HID) + + + + + + + USB Mass Storage + + + + + + + USB Serial (CDC) + + + + + + + Stick Mode Tikku tila + + + + + + + Metric Metrit + + + + + + + Imperial Imperiaali + + + + + + + Default Channel Order Kanavien järjestys + + + + + + + GPS Coordinates GPS koordinaatit + + + + + + + Min Min + + + + + + + + + + + + + + v v + + + + + + + Max Max + + + + + + + Inactivity Timer Käyttämättömyys ajastin + + + + + + + Show Splash Screen on Startup Näytä alkuruutu käynnistyksessä + + + + + + + Contrast Kontrasti + + + + + + + Battery Meter Range + + + + + + + Haptic Strength Värinän voimakkuus + + + + + + + LCD Display Type LCD näytön tyyppi + + + + + + + "No Sound" Warning "Ei ääniä" hälytys + + + + + + + Battery Warning Akun varoitin + + + + + + + Haptic Length Värinän pituus + + + + + + + MAVLink Baud Rate MAV linkki baudit + + + + + + + + + + + + + + Quiet Äänetön + + + + + + + Only Alarms Vain hälyt + + + + + + + + + + + + + + No Keys Ei nap + + + + + + + + + + + + + + All Kaikki + + + + + + + Battery warning voltage. This is the threashhold where the battery warning sounds. @@ -4647,107 +7218,261 @@ Hyväksytty arvo: 5v - 10v + + + + + + + Standard Vakio + + + + + + + Optrex Optrex + + + + + + + If not zero will sound beeps if the transmitter has been left without inputs for the specified number of minutes. Jos tämä arvo ei ole 0, piipataan valitun ajan jos mitään käskyjä ei tule ( MIN ). + + + + + + + min Min + + + + + + + + + + + + + + Show splash screen on startup Näytä alkuruutu käynnistyksessä + + + + + + + --- --- + + + + + + + 2s 2s + + + + + + + 3s 3s + + + + + + + 4s 4s + + + + + + + 6s 6s + + + + + + + 8s 8s + + + + + + + 10s 10s + + + + + + + 15s 15s + + + + + + + 4800 Baud 4800 Baudia + + + + + + + 9600 Baud 9600 Baudia + + + + + + + 14400 Baud 14400 Baudia + + + + + + + 19200 Baud 19200 Baudia + + + + + + + 38400 Baud 38400 Baudia + + + + + + + 57600 Baud 57600 Baudia + + + + + + + 76800 Baud 76800 Baudia + + + + + + + 115200 Baud 115200 Baudia @@ -4755,6 +7480,27 @@ Hyväksytty arvo: 5v - 10v + + + + + + + + + + + + + + + + + + + + + <!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; } @@ -4781,65 +7527,184 @@ p, li { white-space: pre-wrap; } + + + + + + + + + + + + + + X-Short X-lyhyt + + + + + + + + + + + + + + Short Lyhyt + + + + + + + + + + + + + + Normal Normaali + + + + + + + + + + + + + + Long Pitkä + + + + + + + + + + + + + + X-Long X-Pitkä + + + + + + + NMEA NMEA + + + + + + + Play Delay (switch mid position) Toista viive (kytkin keskiasennossa) + + + + + + + Measurement Units Mittayksiköt + + + + + + + Haptic Mode Värinä tila + + + + + + + Beeper Length Piippaus pituus + + + + + + + Beeper Mode Piipperin moodi + + + + + + + Beeper volume 0 - Quiet. No beeps at all. @@ -4857,9 +7722,26 @@ p, li { white-space: pre-wrap; } + + + + + + + Alarms Only Vain hälyt + + + Power On Speed + + + + + Power Off Speed + + GeneralSetupPanel @@ -5013,251 +7895,595 @@ Are you sure ? Hardware + + + + + + + Form + + + + + + + SQ + + + + + + + SR + + + + + + + LS2 LS2 + + + + + + + SP + + + + + + + SO + + + + + + + S4 S4 + + + + + + + RS RS + + + + + + + SB SB + + + + + + + PPM 2 PPM 2 + + + + + + + OFF Pois + + + + + + + S-Port Mirror S-Portti peilik + + + + + + + Telemetry Telemetria + + + + + + + SBUS Trainer + + + + + + + Debug Korjaus + + + + + + + Rud PER + + + + + + + PPM 3 PPM 3 + + + + + + + S1 S1 + + + + + + + S2 S2 + + + + + + + S3 S3 + + + + + + + PPM 1 PPM 1 + + + + + + + Serial Port Sarja portti + + + + + + + v v + + + + + + + PPM Multiplier PPM Kerroin + + + + + + + Current Offset + + + + + + + PPM 4 PPM 4 + + + + + + + SA SA + + + + + + + Ele KOR + + + Antenna + + + + + S5 + + + + + + + Ail SII + + + + + + + Thr KAA + + + + + + + SC SC + + + + + + + LS LS + + + + + + + SD SD + + + + + + + Battery Offset + + + + + + + SE SE + + + + + + + SF SF + + + + + + + SG SG + + + + + + + SH SH + + + + + + + SI + + + + + + + SJ + + + + + + + SK + + + + + + + SL + + + + + + + SM + + + + + + + SN + + + + + + + RS2 + + + + + + + Bluetooth + + + + + + + ADC Filter + + + + + + + Device Name: @@ -5356,71 +8582,169 @@ Are you sure ? Heli + + + + + + + Invert Elevator Käänt kork + + + + + + + Invert Aileron Käänt siiv + + + + + + + Invert Collective Käänt koll + + + + + + + Invert Käänteinen + + + + + + + Off Pois + + + + + + + 120 120 + + + + + + + 120X 120X + + + + + + + 140 140 + + + + + + + 90 90 + + + + + + + Long. cyc + + + + + + + Lateral cyc + + + + + + + Collective Kopt Collective + + + + + + + Swash Type Kopt swash type + + + + + + + Swash Ring Kopt swash ring @@ -5812,46 +9136,109 @@ Are you sure ? LogsDialog + + + + + + + Companion Log Viewer Companion logit + + + + + + + Filename Tiedoston nimi + + + + + + + Open LogFile Avaa logi + + + + + + + Zoom Zuumaa + + + + + + + Save session CSV + + + + + + + X X + + + + + + + Y Y + + + + + + + Reset Resetti + + + + + + + Fly sessions Lento jakso @@ -7341,41 +10728,95 @@ Haluatko tallentaa muutokset ? MixerDialog + + + + + Dialog Mikserit + + + + + + + Delay Viive + + + + + + + Slow Hidas + + + + + + + Up Ylös + + + + + + + Down Alas + + + + + + + Include Trim Myös trimmi + + + + + + + Offset Tasoitus + + + + + + + Weight Paino @@ -7384,6 +10825,34 @@ Haluatko tallentaa muutokset ? + + + + + + + + + + + + + + + + + + + + + + + + + + + + <!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; } @@ -7399,46 +10868,109 @@ p, li { white-space: pre-wrap; } + + + + + + + Name Nimi + + + + + + + Source Lähde + + + + + + + Multiplex Multiplexi + + + + + + + Warning Varoitus + + + + + + + The curve used by the mix Mikserissä käytettävä käyrä + + + + + + + Include DR/Expo Myös DR/Expo + + + + + + + Flight modes Lento tilat + + + + + + + Switch Kytkin + + + + + + + Mixer warning. Setting this value will cause a beep to be emmitted when this value is active. Mikserin varoitus. @@ -7446,31 +10978,73 @@ Tämän arvon asettaminen aiheuttaa piippauksen aina kun arvo on aktiivinen. + + + + + + + OFF Pois + + + + + + + 1 Beep 1 Piip + + + + + + + 2 Beep 2 Piip + + + + + + + 3 Beep 3 Piip + + + + + + + No Ei + + + + + + + Yes Kyllä @@ -7478,6 +11052,27 @@ Tämän arvon asettaminen aiheuttaa piippauksen aina kun arvo on aktiivinen. + + + + + + + + + + + + + + + + + + + + + GV GV @@ -7486,11 +11081,46 @@ Tämän arvon asettaminen aiheuttaa piippauksen aina kun arvo on aktiivinen. + + + + + + + + + + + + + + + + + + + + + + + + + + + + The source for the mixer Lähde miksereille + + + + + + + Multiplexer This determines how mixer values are added. @@ -7508,26 +11138,61 @@ Tämä määrittää kuinka mikserin arvot lisätään. + + + + + + + ADD Lisää + + + + + + + MULTIPLY Kerro + + + + + + + REPLACE Korvaa + + + + + + + Curve Käyrä + + + + + + + Switch used by the mix. If blank then the mix is considered to be "ON" all the time. Mikserissä käytetty kytkin. @@ -7558,6 +11223,12 @@ Jos tyhjä mikserin katsotaan olevan "ON" kokoajan. Invert All + + + + FullScreenDialog + + MixersListWidget @@ -7731,11 +11402,23 @@ Jos tyhjä mikserin katsotaan olevan "ON" kokoajan. ModelEdit + + + + + Dialog Mallin editori + + + + + + + Simulate Simuloi @@ -7789,6 +11472,12 @@ Jos tyhjä mikserin katsotaan olevan "ON" kokoajan. Telemetry Telemetria + + + + FullScreenDialog + + ModelPrinter @@ -8607,138 +12296,324 @@ Jos tyhjä mikserin katsotaan olevan "ON" kokoajan. Module + + + + + + + Failsafe Mode Turvatila + + + + + + + Start Aloitus + + + + + + + PPM delay PPM viive + + + + + + + Negative Negatiivinen + + + + + + + Positive Positiivinen + + + + + + + Polarity Napaisuus + + + + + + + Trainer Mode Harjoitus tila + + + + + + + PPM Frame Length PPM läh pituus + + + + + + + CH CH + + + + + + + Antenna + + + + + + + Option value + + + + + + + Bind on startup + + + + + + + RF Output Power + + + + + + + Low Power + + + + + + + us us + + + + + + + Multi Radio Protocol + + + + + + + Sub Type + + + + + + + Master/Jack + + + + + + + Slave/Jack + + + + + + + Master/SBUS Module + + + + + + + Master/CPPM Module + + + + + + + Master/SBUS in battery compartment + + + + + + + Show values in: + + + + + + + % abbreviation for percent % + + + + + + + μs abbreviation for microseconds + + + + + + + ms ms + + + + Receiver 1 @@ -8746,94 +12621,232 @@ Jos tyhjä mikserin katsotaan olevan "ON" kokoajan. + + + + + + + + + + + + X X + + + + Receiver 2 + + + + Receiver 3 + + + + + + + WARNING: changing RF Output Power needs RE-BIND + + + + + + + Channels Kanavat + + + + Registration ID + + + + + + + WARNING: Requires non-certified firmware! + + + + + + + Not set + + + + + + + Hold Pidä + + + + + + + Custom Omat + + + + + + + No Pulses Ei pulsseja + + + + + + + Receiver Vastaanotin + + + + + + + Failsafe Positions Turvatila asennot + + + + + + + Protocol Protokolla + + + + + + + Receiver No. Vastaanotin No. + + + + + + + Output type + + + + + + + Open Drain + + + + + + + Push Pull + + + + + + Internal + + + + + + + + Ext. + Int. + + ModuleData @@ -9572,21 +13585,49 @@ Jos tyhjä mikserin katsotaan olevan "ON" kokoajan. PrintDialog + + + + + + + Close Sulje + + + + + + + Style + + + + + + + Print Tulosta + + + + + + + Print to file Tulosta tiedostoon @@ -9610,11 +13651,25 @@ Jos tyhjä mikserin katsotaan olevan "ON" kokoajan. ProgressDialog + + + + + + + Flash Firmware + + + + + + + Close Sulje @@ -9629,6 +13684,13 @@ Jos tyhjä mikserin katsotaan olevan "ON" kokoajan. ProgressWidget + + + + + + + Show Details Näytä detailit @@ -9782,16 +13844,37 @@ Jos tyhjä mikserin katsotaan olevan "ON" kokoajan. RadioNotFoundDialog + + + + + + + No Radio Found Lähetintä ei löydy + + + + + + + <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> + + + + + + + OK Ok @@ -9800,43 +13883,99 @@ Jos tyhjä mikserin katsotaan olevan "ON" kokoajan. RadioOutputsWidget - + + + + + + + + + Form - + + + + + + + + + View: - + + + + + + + + + Logical Switches Loogiset kytkimet - + + + + + + + + + Global Variables Globaalit muuttujat - + + + + + + + + + Channel Outputs - + + + + + + + + + Mix Outputs - + + + + + + + + + L o g @@ -9846,7 +13985,15 @@ c - + + + + + + + + + G l o @@ -9857,7 +14004,15 @@ l - + + + + + + + + + C h a @@ -9870,7 +14025,15 @@ s - + + + + + + + + + M i x @@ -10709,81 +14872,193 @@ s Setup + + + + + + + Model Image Mallin kuva + + + + + + + Throttle Source Kaasun lähde + + + + + + + Switch Warnings Kytkin varoitukset + + + + + + + Center beep Keski piippaus + + + + + + + Exponential Expo + + + + + + + Extra Fine Eri hieno + + + + + + + Fine Hieno + + + + + + + Medium Keski + + + + + + + Coarse Karkea + + + + + + + Edit Checklist... + + + + + + + Extended Limits Laajemman rajat + + + + + + + Timer 3 Ajastin 3 + + + + + + + Extended Trims Laajemmat trimmit + + + + + + + Display Checklist Näytä teht.lista + + + + + + + Throttle Warning Kaasu varoitus + + + + + + + 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. @@ -10794,86 +15069,205 @@ Jos tämä valittuna, kaasu toimii käänteisesti. Tyhjäkäynti on ylhäällä, + + + + + + + Reverse Throttle Käänteinen kaasu + + + + + + + Throttle Trim Idle Only Kaasun trimmi vain tyhjäkäinnille + + + + + + + Timer 2 Ajastin 2 + + + + + + + Timer 1 Ajastin 1 + + + + + + + Never + + + + + + + On change + + + + + + + Always + + + + + + + Global Functions + + + + + + + Trim Step Trimmin pykälä + + + + + + + Trims Display + + + + + + + Warnings Varoituksia + + + + + + + Top LCD Timer + + + + + + + Pot Warnings Potikka varoitus + + + + + + + OFF Pois + + + + + + + Manual Käsin + + + + + + + Auto Autom + + + + + + + Model Malli @@ -11241,181 +15635,421 @@ Profile ID: [%1]; Radio ID: [%2] 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. @@ -11496,76 +16130,172 @@ Profile ID: [%1]; Radio ID: [%2] 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... @@ -11573,59 +16303,147 @@ The radio type specified in the selected profile is used by default. - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + ... ... - + + + + + + + + + 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 Tiedosto - + + + + + + + + + Folder - + + + + + + + + + SD Path @@ -11654,7 +16472,15 @@ The default is configured in the chosen Radio Profile. SimulatorWidget - + + + + + + + + + Companion Simulator Companion simulaattori @@ -11742,6 +16568,20 @@ The default is configured in the chosen Radio Profile. + + + + + + + + + + + + + + ... ... @@ -11781,6 +16621,13 @@ The default is configured in the chosen Radio Profile. StyleEditDialog + + + + + + + @@ -11789,21 +16636,49 @@ The default is configured in the chosen Radio Profile. + + + + + + + &Reset to default + + + + + + + &Cancel + + + + + + + &OK + + + + + + + This feature does not validate your changes and assumes you are familiar with CSS syntax for QT. @@ -12061,190 +16936,475 @@ Too many errors, giving up. Telemetry + + + + + + + A1 A1 + + + + + + + A2 A2 + + + + + + + RSSI RSSI + + + + + + + Alarm 1 Varoitus 1 + + + + + + + + + + + + + + ---- ---- + + + + + + + + + + + + + + Yellow Kelt + + + + + + + + + + + + + + Orange Orans + + + + + + + + + + + + + + Red Puna + + + + + + + Alarm 2 Varoitus 2 + + + + + + + Serial Protocol Sarja protokolla + + + + + + + Volt source Voltti lähde + + + + + + + Current source Virran lähde + + + + + + + Protocol Protokolla + + + + + + + None Ei mitään + + + + + + + FrSky Sensor Hub FrSky:n hubi + + + + + + + Blades Prop lavat + + + + + + + Sink Max Maksimi vajoama + + + + + + + Climb Max Maksimi nousu + + + + + + + Sink Min Minimi vajoama + + + + + + + Climb Min Minimi nousu + + + + + + + Center Silent + + + + + + + Vario source Variom lähde + + + + + + + Vario limits Varionm asetukset + + + + + + + Disable telemetry audio warnings + + + + + Source Lähde + + + + + + + Altimetry Korkeusmittaus + + + + + + + Altitude source + + + + + + + Volts source + + + + + + + Top Bar + + + + + + + mAh mAh + + + + + + + A A + + + + + + + Various Useat + + + + + + + Sensors + + + + + + + Disable multi sensor handling + + + + + + + mAh count mAh laskuri + + + + + + + FAS Offset FAS asetus + + + + + + + Persistent mAh Yhtm. mAh @@ -12253,107 +17413,289 @@ Too many errors, giving up. TelemetryAnalog + + + + + + + Unit Yksikkö + + + + + + + Max Value Maks arvo + + + + + + + Alarm 1 Hälytys 1 + + + + + + + + + + + + + + ---- ---- + + + + + + + + + + + + + + Yellow Kelt + + + + + + + + + + + + + + Orange Orans + + + + + + + + + + + + + + Red Pun + + + + + + + + + + + + + + < < + + + + + + + + + + + + + + > > + + + + + + + Alarm 2 Hälytys 2 + + + + + + + Offset Tasoitus + + + + + + + Volts (V) Voltit ( V ) + + + + + + + Amps (A) Amp ( A ) + + + + + + + Speed (m/s or ft/s) Nopeus ( m/s tai jalk/s ) + + + + + + + Raw (-) Raaka ( - ) + + + + + + + Speed (km/h or miles/h) Nopeus ( km/h tai mailia/h ) + + + + + + + Meters (m or ft) Metrit (m tai jalkaa ) + + + + + + + Temp (°) Lämpöt (c) + + + + + + + Fuel (%) Bensa (%) + + + + + + + mAmps (mA) mAmp (mA) @@ -12367,6 +17709,13 @@ Too many errors, giving up. TelemetryCustomScreen + + + + + + + Custom Screen Type Oman ruudun tyyppi @@ -12392,21 +17741,49 @@ Too many errors, giving up. + + + + + + + Min Min + + + + + + + Source Lähde + + + + + + + Gauge Mittari + + + + + + + Max Max @@ -12520,86 +17897,199 @@ Too many errors, giving up. TelemetrySensor + + + + + + + Form + + + + + + + Custom Omat + + + + + + + Calculated + + + + + + + Id + + + + + + + Instance + + + + Rx + + + + Mod. + + + + + + + Add + + + + + + + Average + + + + + + + Min Min + + + + + + + Max Max + + + + + + + Multiply + + + + + + + Totalize + + + + + + + Cell Kenno + + + + + + + Consumption + + + + + + + Dist Etäisyys + + + + + + + Cells Sensor : @@ -12612,191 +18102,506 @@ Too many errors, giving up. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --- --- + + + + + + + GPS Sensor : + + + + + + + Alt. Sensor : + + + + + + + Sensor : + + + + + + + V V + + + + + + + A A + + + + + + + mA + + + + + + + kt + + + + + + + m/s m/s + + + + + + + ft/s + + + + + + + km/h km/h + + + + + + + mph mph + + + + + + + m metri + + + + + + + ft jalka + + + + + + + °C °C + + + + + + + °F + + + + + + + % % + + + + + + + mAh mAh + + + + + + + W W + + + + + + + mW + + + + + + + dBm + + + + + + + g g + + + + + + + ° ° + + + + + + + Rad + + + + + + + mL + + + + + + + US fl.Oz. + + + + + + + Raw (-) Raaka ( - ) + + + + + + + RPM + + + + + + + Precision + + + + + + + Ratio + + + + + + + Blades Prop lavat + + + + + + + Offset Tasoitus + + + + + + + Multiplier + + + + + + + Auto Offset + + + + + + + Filter Filtteri + + + + + + + Persistent Yhtämittainen + + + + + + + Positive Positiivinen + + + + + + + Logs Logit @@ -12828,116 +18633,268 @@ Too many errors, giving up. TelemetrySimulator - + + + + + + + + + Telemetry Simulator - + + + + + + + + + VFAS - + + + + + + + + + RSSI RSSI - + + + + + + + + + A1 A1 - + + + + + + + + + A2 A2 - + + + + + + + + + Simulate Simuloi - + + + + + + + + + Replay SD Log File - + + + + + + + + + Replay rate - + + + + + + + + + Load - + + + + + + + + + |> - + + + + + + + + + <| - + + + + + + + + + > > - + + + + + + + + + <- - + + + + + + + + + X X - + + + + + + + + + Row # Timestamp - + + + + + + + + + 1/5x 1/5x - + + + + + + + + + 5x 5x - + + + + + + + + + No Log File Currently Loaded - + + + + + + + + + RAS @@ -12945,21 +18902,61 @@ Timestamp - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + V / ratio - + + + + + + + + + Db - + + + + + + + + + RxBt @@ -12977,121 +18974,377 @@ Timestamp - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <html><head/><body><p><br/></p></body></html> - + + + + + + + + + Tmp1 - + + + + + + + + + A3 A3 - + + + + + + + + + A4 A4 - + + + + + + + + + Tmp2 - + + + + + + + + + Fuel Bensa - - + + + + + + + + + + + + + + + + + + °C °C - + + + + + + + + + ml - + + + + + + + + + % % - - + + + + + + + + + + + + + + + + + + Meters - + + + + + + + + + Alt Kork - + + + + + + + + + VSpd Vspd - + + + + + + + + + m/s m/s - + + + + + + + + + Fuel Qty - - + + + + + + + + + + + + + + + + + + km/h km/h - + + + + + + + + + Hdg - + + + + + + + + + ASpd @@ -13099,135 +19352,335 @@ Timestamp - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + G - + + + + + + + + + GPS - + + + + + + + + + Lat,Lon (dec.deg.) - + + + + + + + + + AccX AccX - + + + + + + + + + dd-MM-yyyy hh:mm:ss - + + + + + + + + + Date - + + + + + + + + + Amps - + + + + + + + + + AccZ AccZ - + + + + + + + + + GAlt - - + + + + + + + + + + + + + + + + + + Volts - + + + + + + + + + Cels - + + + + + + + + + Curr Virta - + + + + + + + + + AccY AccY - + + + + + + + + + GSpd - + + + + + + + + + Degrees - + + + + + + + + + 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 - + + + + + + + + + When enabled, sends any non-blank values as simulated telemetry data. @@ -13269,11 +19722,25 @@ hh:mm:ss Timer + + + + + + + Countdown Laskuri + + + + + + + Minute Call Minuutti merkki @@ -13357,26 +19824,61 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. Trainer + + + + + + + Form + + + + + + + Mode Moodi + + + + + + + Input Tulo + + + + + + + Weight Paino + + + + + + + Rud PER @@ -13389,6 +19891,62 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Beeper volume 0 - Quiet. No beeps at all. @@ -13409,6 +19967,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + Off Pois @@ -13417,6 +20003,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + += (Sum) += (Sum) @@ -13425,6 +20039,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + := (Replace) := (Korvaa) @@ -13433,6 +20075,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn1 chn1 @@ -13441,6 +20111,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn2 chn2 @@ -13449,6 +20147,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn3 chn3 @@ -13457,21 +20183,70 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn4 chn4 + + + + + + + Ele KOR + + + + + + + Thr KAA + + + + + + + Ail SII @@ -13480,7 +20255,15 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. TrainerSimulator - + + + + + + + + + Trainer simulator @@ -13905,12 +20688,33 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. burnConfigDialog + + + + + + + Programmer Configuration Ohjelmointilaitteen määrittely + + + + + + + + + + + + + + Location of sam-ba executable sam-ba ohjelman sijanti @@ -13919,16 +20723,58 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + The location of the AVRDUDE executable. AVRDUDE ohjelman sijainti. + + + + + + + DFU-Util Location DFU-Util ohjelman sijainti + + + + + + + Location of AVRDUDE executable Sijainti AVRDUDE ohjelmalle @@ -13936,6 +20782,27 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + Use this button to browse and look for the AVRDUDE executable file. Selaa AVRDUDE ohjelmaa koneeltasi. @@ -13943,16 +20810,51 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + Browse... Selaa... + + + + + + + Programmer Ohjelmointilaite + + + + + + + Programmer used for communicating with the controller. Please consult the programmer's documentation and the AVRDUDE documentation to select the appropriate programmer. Ohjelmointilaite joka kommunikoi lähettimen kanssa. @@ -13960,23 +20862,65 @@ Tarkasta ohjelmointi dokumentointi sekä AVRDUDE dokumentit ja valitse oikea lai + + + + + + + List all available programmers. Käytettävissä olevat ohjelmointilaitteet. + + + + + + + List Available Lista + + + + + + + + + + + + + + Extra arguments that will be passed to AVRDUDE on every call Lista lisä komennoista jotka ohitetaan AVRDUDE:ssa joka kerta + + + + + + + + + + + + + + Extra arguments used in AVRDUDE. This can be used for providing extra information to AVRDUDE. @@ -13988,21 +20932,49 @@ Käytä tätä vain jos tiedät mitä teet !.Tähän toimintoon ei sisälly mit + + + + + + + Extra Arguments Lisä komennot + + + + + + + Show AVRDUDE help Näytä AVRDUDE ohje + + + + + + + Show Help Näytä ohje + + + + + + + Communication port to the programmer. Ohjelmointi laitteen portti. @@ -14011,28 +20983,84 @@ Käytä tätä vain jos tiedät mitä teet !.Tähän toimintoon ei sisälly mit + + + + + + + + + + + + + + Port Portti + + + + + + + AVRDUDE Location AVRDUDE kohde + + + + + + + MCU MCU + + + + + + + + + + + + + + CPU of your TX Lähettimen CPU + + + + + + + + + + + + + + CPU present on your 9x radio Should be m64 for stock radios m2560 for v4.1 boards @@ -14042,31 +21070,73 @@ m2560 joka on v4.1 lähettimessä + + + + + + + at91sam3s8-9xr at91sam3s8-9xr + + + + + + + SAM-BA Location SAM-BA kohde + + + + + + + ARM MCU ARM MCU + + + + + + + sam-ba serial port sam-ba sarjaportti + + + + + + + Alternate device Vaihtoehtoinen laite + + + + + + + Use advanced controls Käytä lisä toimintoja @@ -14112,85 +21182,197 @@ m2560 joka on v4.1 lähettimessä joystickDialog - + + + + + + + + + Configure Joystick Määrittele joystick - + + + + + + + + + Ch2 CH2 - + + + + + + + + + Ch1 CH1 - + + + + + + + + + Ch4 CH4 - + + + + + + + + + Ch6 CH6 - + + + + + + + + + Ch3 CH3 - + + + + + + + + + Ch5 CH5 - + + + + + + + + + Ch7 CH7 - + + + + + + + + + Ch8 CH8 - + + + + + + + + + Instructions Ohjeita - + + + + + + + + + Enable Päälle - + + + + + + + + + Cancel Peruuta - + + + + + + + + + Back - + + + + + + + + + Start Aloitus @@ -14201,7 +21383,15 @@ m2560 joka on v4.1 lähettimessä - + + + + + + + + + Ok Ok diff --git a/companion/src/translations/companion_fr.ts b/companion/src/translations/companion_fr.ts index dad20a00a..ec238e663 100644 --- a/companion/src/translations/companion_fr.ts +++ b/companion/src/translations/companion_fr.ts @@ -94,41 +94,97 @@ AppPreferencesDialog + + + + + + + Edit Settings Éditer les réglages + + + + + + + Radio Profile 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: @@ -170,172 +226,417 @@ 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 réglage de l'application + + + + + + + Backup folder Dossier de sauvegarde + + + + + + + If set it will override the application general setting Si défini, remplace le réglage de l'application pour ce profil + + + + + + + if set, will override general backup enable Si défini, remplace le réglage 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 @@ -346,272 +647,680 @@ Manche Droit: Profondeur, Direction + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Select Folder Sélectionner dossier + + + + + + + Select Executable Sélectionner exécutable + + + + Release channel Canal de version + + + + Releases (stable) Officielle (stable) + + + + Release candidates (testing) Candidate (test) + + + + Nightly builds (unstable) Nighlty (instable) + + + + + + + Simulator Volume Gain Gain de volume du simulateur + + + + + + + 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 réglages + + + + + + + General Settings Paramètres généraux + + + + + + + SD Structure path Chemin de la structure de la carte SD + + + + + + + Application Settings Réglages 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 réglages 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 @@ -692,6 +1401,31 @@ Manche Droit: Profondeur, Direction Images (%1) Images (%1) + + + + + Use releases (stable) + + + + + Use release candidates (testing) + + + + + + + Use nightly builds (unstable) + + + + + + Use releases and release candidates (testing) + + BinEepromFormat @@ -912,36 +1646,85 @@ Manche Droit: Profondeur, Direction ChecklistDialog + + + + + + + Edit Checklist Éditer Checklist + + + + + + + Line nn, Col nn Ligne nn, Col nn + + + + + + + &Import... &Importer... + + + + + + + &Cancel &Annuler + + + + + + + &OK + + + + + + + Please note, the maximum width displayable is radio model limited. Also, renaming the model will break the link to this checklist file. Veuillez noter que la largeur maximale affichable est limitée suivant le modèle de radio. Notez aussi que renommer le modèle va casser le lien vers ce fichier "Checklist". + + + + + + + File: unknown Fichier: inconnu @@ -1195,31 +1978,73 @@ Si vous avez un fichier de sauvegarde des paramètres, vous pouvez l'import CompareDialog + + + + + + + Compare Models Comparer les modèles + + + + + + + To compare models, drag and drop them anywhere in this window. Pour comparer les modèles, faites un glisser/déposer n'importe où dans cette fenêtre. + + + + + + + Close Fermer + + + + + + + Style + + + + + + + Print Imprimer + + + + + + + Print to file Imprimer vers un fichier @@ -1376,87 +2201,213 @@ Si vous avez un fichier de sauvegarde des paramètres, vous pouvez l'import Curves + + + + + + + Fixed X X fixe + + + + + + + Custom X X configurable + + + + + + + Lines Linéaire + + + + + + + Smooth Adoucie + + + + + + + + + + + + + + Curve type Type de courbe + + + + + + + Curve Creator Créateur de courbe + + + + + + + Y at X=0 Y pour X=0 + + + + + + + Point size Taille point + + + + + + + Y at X=100 Y pour X=100 + + + + + + + Both Les 2 + + + + + + + x>0 + + + + + + + x<0 + + + + + + + Apply Appliquer + + + + + + + Side Côté + + + + + + + Y at X=-100 Y pour X=-100 + + + + + + + Coefficient + + + + + + + Curve name Nom de la courbe @@ -1870,42 +2821,133 @@ Si vous avez un fichier de sauvegarde des paramètres, vous pouvez l'import CustomizeSplashDialog + + + + + + + Transmitter Splash Screen Editor Éditeur d'écran d'accueil + + + + + + + + + + + + + + Invert Inverser + + + + + + + + + + + + + + Load FW Ouvrir le firmware + + + + + + + + + + + + + + Load Pict Ouvrir l'image + + + + + + + + + + + + + + Load Profile Charger le profil + + + + + + + + + + + + + + Save Sauvegarder + + + + + + + + + + + + + + Open Splash Library Ouvrir la bibliothèque des écrans d'accueil @@ -1914,6 +2956,34 @@ Si vous avez un fichier de sauvegarde des paramètres, vous pouvez l'import + + + + + + + + + + + + + + + + + + + + + + + + + + + + ... @@ -2029,48 +3099,48 @@ Si vous avez un fichier de sauvegarde des paramètres, vous pouvez l'import Erreur de conversion du champ %1 - + Switch Interrupteur - + Switch L'interrupteur - + cannot be exported on this board! n'est pas supporté sur cette carte ! - + Source - + Source %1 cannot be exported on this board! 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 @@ -2079,25 +3149,57 @@ Si vous avez un fichier de sauvegarde des paramètres, vous pouvez l'import DebugOutput - + + + + + + + + + Debug Output Sortie débogage - + + + + + + + + + <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>Activer ou désactiver le filtre. Si le bouton ne reste pas actif, c'est qu'il y a probablement une erreur dans la <i>Regular Expression</i>.</p></body></html> - + + + + + + + + + Filter: Filtre: - + + + + + + + + + <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>Entrer le filtre ici. Cliquer sur le bouton d'aide/info pour plus de détails sur l'utilisation du filtre. </p><p> @@ -2105,61 +3207,141 @@ Pour <b>retirer un filtre de l'historique</b>, sélectionnez-le - + + + + + + + + + Buffer: Tampon: - + + + + + + + + + Number of lines to keep in display. Nombre de lignes du tampon. - + + + + + + + + + Filter &Help Filtre &Aide - + + + + + + + + + Show information about using the filter. Affiche les informations concernant l'usage du filtre. - + + + + + + + + + Word &Wrap Renvoi &Ligne - + + + + + + + + + Toggle word wrapping on/off. Retour automatique à la ligne on/off. - + + + + + + + + + &Clear &Effacer - + + + + + + + + + Clear the output window of all text. Effacer tout le texte dans la fenêtre de sortie. - + + + + + + + + + Enable &Filter Activer &Filtre - + + + + + + + + + Turn the filter on/off. Basculer le filtre on/off. @@ -2178,6 +3360,13 @@ Pour <b>retirer un filtre de l'historique</b>, sélectionnez-le DownloadDialog + + + + + + + Downloading: Téléchargement: @@ -2324,16 +3513,37 @@ Vérifier la sélection (M64/M128) ExpoDialog + + + + + + + Weight Ratio + + + + + + + Flight modes Phases de vol + + + + + + + Input name Nom de l'entrée @@ -2341,41 +3551,111 @@ Vérifier la sélection (M64/M128) + + + + + + + + + + + + + + + + + + + + + GV VG + + + + + + + Switch Interrupteur + + + + + + + Curve applied to the source. Courbe appliquée à la source. + + + + + + + Source + + + + + + + Line name Nom de la ligne + + + + + + + Stick Side Direction + + + + + + + Source for the mixer. La voie maître du mixage. + + + + + + + Switch used to enable the line. If blank then the input is considered to be "ON" all the time. Interrupteur utilisé pour activer la ligne. @@ -2383,51 +3663,121 @@ Si vide, la ligne est toujours active. + + + + + + + Scale Echelle + + + + + + + Include Trim Inclure Trim + + + + + + + No Non + + + + + + + Yes Oui + + + + + + + Curve Courbe + + + + + + + Offset Décalage + + + + + + + The source for the mixer La voie maître du mixage + + + + + + + NEG Négative + + + + + + + POS Positive + + + + + + + ALL Les 2 @@ -3075,31 +4425,73 @@ Blanc signifie "inclure tous".Les métacaractères ?, * et [...] sont FirmwarePreferencesDialog + + + + + + + Downloads Téléchargements + + + + + + + Check for updates Vérifier les mises à jour + + + + + + + Firmware + + + + + + + Download firmware Télécharger firmware + + + + + + + Download SD contents Télécharger carte SD + + + + + + + Latest Download Dernière version téléchargée @@ -3141,67 +4533,158 @@ Blanc signifie "inclure tous".Les métacaractères ?, * et [...] sont FlashEEpromDialog + + + + + + + Write Models and Settings to Radio Transférer les réglages et modèles vers la radio + + + + + + + Load... Parcourir... + + + + + + + Current Profile Profil courant + + + + + + + Allows Companion to write to older version of the firmware Permet à Companion de transférer des réglages à une ancienne version de firmware + + + + + + + Check Firmware compatibility Vérifier la compatibilité du 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>Enregistre une copie datée de votre eeprom actuelle dans le dossier de sauvegarde avant de transférer les modèles à la radio.</p></body></html> + + + + + + + Backup before Write Sauvegarder les réglages actuels avant d'écrire + + + + + + + <html><head/><body><p>Modify calibration parameters using settings from current profile</p></body></html> <html><head/><body><p>Charger l'étalonnage du profil courant</p></body></html> + + + + + + + Patch calibration setting from profile Patcher l'étalonnage du profil courant + + + + + + + <html><head/><body><p>Modify HW parameters using settings from current profile</p></body></html> <html><head/><body><p>Charger les paramètres hardware du profil courant</p></body></html> + + + + + + + Patch HW settings from profile Patcher les paramètres hardware du profil courant + + + + + + + Cancel Annuler + + + + + + + Write to TX Transférer @@ -3259,71 +4742,169 @@ Blanc signifie "inclure tous".Les métacaractères ?, * et [...] sont FlashFirmwareDialog + + + + + + + Flash Firmware Programmer le firmware + + + + + + + Load... Parcourir... + + + + + + + Date & Time Date et heure + + + + + + + Variant Variante + + + + + + + Version + + + + + + + Use profile start screen Utiliser l'écran d'accueil du profil + + + + + + + Use firmware start screen Utiliser l'écran d'accueil du firmware + + + + + + + Use library start screen Utiliser un écran d'accueil de la bibliothèque + + + + + + + Use another start screen Utiliser un autre écran d'accueil + + + + + + + Allows Companion to write to older version of the firmware Permet à Companion de transférer des réglages à une ancienne version de firmware + + + + + + + Check Hardware compatibility Vérifier la compatibilité du hardware + + + + + + + Backup and restore Models and Settings Sauvegarder et restaurer les réglages et modèles + + + + + + + Cancel Annuler + + + + + + + Write to TX Transférer @@ -3523,21 +5104,49 @@ Vous utilisez actuellement: FlightMode + + + + + + + Fade In Fondu en entrée + + + + + + + Fade Out Fondu en sortie + + + + + + + Name Nom + + + + + + + Switch Interrupteur @@ -3727,11 +5336,25 @@ Vous utilisez actuellement: 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; } @@ -3761,11 +5384,25 @@ p, li { white-space: pre-wrap; } + + + + + + + Read Fuses Lire 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; } @@ -3800,6 +5437,13 @@ p, li { white-space: pre-wrap; } + + + + + + + Reset Fuses EEPROM - PROTECT Réinitialiser Fusibles @@ -3807,6 +5451,13 @@ PROTECTION EEPROM + + + + + + + <!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; } @@ -3839,6 +5490,13 @@ p, li { white-space: pre-wrap; } + + + + + + + Reset Fuses EEPROM - DELETE Réinitialiser Fusibles @@ -3846,6 +5504,13 @@ EFFACEMENT EEPROM + + + + + + + <!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; } @@ -3927,11 +5592,25 @@ p, li { white-space: pre-wrap; } + + + + + + + Radio settings Réglages Radio + + + + + + + General settings used throught the transmitter. These will be relevant for all models in the same EEPROM. Paramètres généraux de l'émetteur. @@ -3944,11 +5623,25 @@ Communs à tous les modèles d'une même EEPROM. + + + + + + + Store calib. and hw settings in selected profile Sauver étalonnage et réglages hw dans profil + + + + + + + Retrieve calib. and hw settings from profile Lire étalonnage et réglages hw du profil @@ -4005,127 +5698,309 @@ Communs à tous les modèles d'une même EEPROM. GeneralSetup + + + + + + + Form Formulaire + + + + + + + Readonly Unlock Débloquage lecture seule + + + + + + + SC + + + + + + + SE + + + + + + + SA + + + + + + + SF + + + + + + + SH + + + + + + + SD + + + + + + + SB + + + + + + + SG + + + + + + + Timeshift from UTC Décalage horaire (UTC) + + + + + + + Voice Language Langue des voix + + + + + + + Country Code Zone géographique RF + + + + + + + Stick reverse Inversion des manches + + + + + + + FAI Mode Mode FAI + + + + + + + Adjust RTC Ajuster l'heure par GPS + + + + + + + Vario pitch at max Tonalité du vario au max + + + + + + + + + + + + + + Hz + + + + + + + Speaker Volume Volume haut-parleur + + + + + + + Backlight Switch Inter de rétroéclairage + + + + + + + Sound Mode Mode Son + + + + + + + Color 1 Couleur 1 + + + + + + + Color 2 Couleur 2 + + + + + + + Speaker Pitch (spkr only) Tonalité (HP uniquement) + + + + + + + If this value is not 0, any keypress will turn on the backlight and turn it off after the specified number of seconds. Si cette valeur est différente de 0, l'appui sur une touche de navigation déclenche le rétroéclairage qui s'éteint après la durée spécifiée (en secondes). @@ -4133,82 +6008,209 @@ Communs à tous les modèles d'une même EEPROM. + + + + + + + + + + + + + + + sec + + + + + + + Backlight color Couleur du rétroéclairage + + + + + + + Beeper Bipeur + + + + + + + Speaker Haut-parleur + + + + + + + BeeperVoice Bipeur/Voix + + + + + + + SpeakerVoice Haut-parleur/Voix + + + + + + + Beep volume Volume des bips + + + + + + + Wav volume Volume des fichiers audio + + + + + + + Vario volume Volume du variomètre + + + + + + + Background volume Volume de la musique d'ambiance + + + + + + + + + + + + + + ms + + + + + + + Backlight Auto OFF after Arrêt rétroéclairage après + + + + + + + Backlight flash on alarm Clignotement rétroécl. alarmes + + + + + + + Vario pitch at zero Tonalité du vario à 0 + + + + + + + Vario repeat at zero Répétition du vario à 0 + + + + + + + This is the switch selectrion for turning on the backlight (if installed). @@ -4217,6 +6219,20 @@ Communs à tous les modèles d'une même EEPROM. + + + + + + + + + + + + + + <!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; } @@ -4232,41 +6248,97 @@ p, li { white-space: pre-wrap; } + + + + + + + Backlight Brightness Luminosité du rétroéclairage + + + + + + + RotEnc Navigation Navigation sélecteur rotatif + + + + + + + Automatically adjust the radio's clock if a GPS is connected to telemetry. Régle automatique l'heure de la radio si un GPS est présent. + + + + + + + America Amérique + + + + + + + Japan Japon + + + + + + + Europe + + + + + + + Backlight OFF Brightness Luminosité écran éteint + + + + + + + Mode selection: Mode 1: @@ -4308,336 +6380,824 @@ Mode 4: + + + + + + + Mode 1 (RUD ELE THR AIL) Mode 1 (DIR PRF GAZ AIL) + + + + + + + Mode 2 (RUD THR ELE AIL) Mode 2 (DIR GAZ PRF AIL) + + + + + + + Mode 3 (AIL ELE THR RUD) Mode 3 (AIL PRF GAZ DIR) + + + + + + + Mode 4 (AIL THR ELE RUD) Mode 4 (AIL GAZ PRF DIR) + + + + + + + <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> + + + + + + + If you enable FAI, only RSSI and RxBt sensors will keep working. This function cannot be disabled by the radio. Si vous activez l'option FAI, seuls les capteurs RSSI et BtRx vont fonctionner. Cette fonction ne peut pas être désactivée sur la radio. + + + + Owner Registration ID Enregistrement ID du propriétaire + + + + aaaaaaAA + + + + + + + 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 + + + + Power Off Delay Délai mise hors tension + + + + + + + USB Mode Mode USB + + + + + + + Jack Mode Mode Jack + + + + + + + Audio + + + + + + + Trainer Écolage + + + + + + + + + + + + + + Ask on Connect Demander à la connexion + + + + + + + Joystick (HID) + + + + + + + USB Mass Storage Stockage USB (SD) + + + + + + + USB Serial (CDC) Port série USB (Debug) + + + + + + + Stick Mode Mode + + + + + + + Metric Métrique + + + + + + + Imperial Impérial + + + + + + + Default Channel Order Ordre des voies par défaut + + + + + + + GPS Coordinates Coordonnées GPS + + + + + + + Min + + + + + + + + + + + + + + v + + + + + + + Max + + + + + + + RSSI Poweroff Warning Vérifier RSSI à l'extinction + + + + + + + DMS + + + + + + + Inactivity Timer Alerte d'inactivité + + + + + + + Show Splash Screen on Startup Afficher l'écran de démarrage + + + + + + + Contrast Contraste + + + + + + + Battery Meter Range Plage de l'indicateur de batterie + + + + + + + Haptic Strength Puissance vibreur + + + + + + + LCD Display Type Type de LCD + + + + + + + "No Sound" Warning Alerte "son coupé" + + + + + + + Battery Warning Alerte batterie + + + + + + + Haptic Length Durée vibreur + + + + + + + MAVLink Baud Rate Baudrate Mavlink + + + + + + + + + + + + + + Quiet Mode silencieux + + + + + + + Only Alarms Seulement les alarmes + + + + + + + + + + + + + + No Keys Touches silencieuses + + + + + + + + + + + + + + All Tous + + + + + + + Battery warning voltage. This is the threashhold where the battery warning sounds. @@ -4649,113 +7209,271 @@ Plage de valeurs: 5v...10v + + + + + + + Standard + + + + + + + Optrex + + + + + + + If not zero will sound beeps if the transmitter has been left without inputs for the specified number of minutes. 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. + + + + + + + min + + + + Power On Delay Délai mise sous tension + + + + + + + + + + + + + + Show splash screen on startup Affiche l'écran d'accueil au démarrage + + + + + + + --- + + + + + + + 2s + + + + + + + 3s + + + + + + + 4s + + + + + + + 6s + + + + + + + 8s + + + + + + + 10s + + + + + + + 15s + + + + + + + 4800 Baud + + + + + + + 9600 Baud + + + + + + + 14400 Baud + + + + + + + 19200 Baud + + + + + + + 38400 Baud + + + + + + + 57600 Baud + + + + + + + 76800 Baud + + + + + + + 115200 Baud @@ -4763,6 +7481,27 @@ Réinitialisation en agissant sur n'importe lequel des manches / touches de + + + + + + + + + + + + + + + + + + + + + <!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; } @@ -4789,70 +7528,196 @@ p, li { white-space: pre-wrap; } + + + + + + + + + + + + + + X-Short Très court + + + + + + + + + + + + + + Short Court + + + + + + + + + + + + + + Normal + + + + + + + + + + + + + + Long + + + + + + + + + + + + + + X-Long Très long + + + + + + + Low EEPROM Warning Avertissement EEPROM faible + + + + + + + NMEA + + + + + + + Play Delay (switch mid position) Délai position centrale inters + + + + + + + Measurement Units Unités de mesure + + + + + + + Haptic Mode Mode du vibreur + + + + + + + Beeper Length Durée des bips + + + + + + + Beeper Mode Réglage des bips + + + + + + + Beeper volume 0 - Quiet. No beeps at all. @@ -4870,9 +7735,26 @@ Extra long : bips extra longs. + + + + + + + Alarms Only Seulement les Alarmes + + + Power On Speed + + + + + Power Off Speed + + GeneralSetupPanel @@ -5028,251 +7910,595 @@ Cette fonction ne peut pas être désactivée sur la radio. Hardware + + + + + + + Form Formulaire + + + + + + + SQ + + + + + + + SR + + + + + + + LS2 + + + + + + + SP + + + + + + + SO + + + + + + + S4 + + + + + + + RS + + + + + + + SB + + + + + + + PPM 2 + + + Antenna Antenne + + + + + + + OFF Eteint + + + + + + + S-Port Mirror Recopie S. Port + + + + + + + Telemetry Télémetrie + + + + + + + SBUS Trainer Écolage SBUS + + + + + + + Debug Débogage + + + + + S5 + + + + + + + Rud Dir + + + + + + + PPM 3 + + + + + + + S1 + + + + + + + S2 + + + + + + + S3 + + + + + + + PPM 1 + + + + + + + Serial Port Port série + + + + + + + v + + + + + + + PPM Multiplier Coeff. multiplicateur PPM + + + + + + + Current Offset Correction courant + + + + + + + PPM 4 + + + + + + + SA + + + + + + + Ele Prf + + + + + + + Ail Ail + + + + + + + Thr Gaz + + + + + + + SC + + + + + + + LS + + + + + + + SD + + + + + + + Battery Offset Correction tension + + + + + + + SE + + + + + + + SF + + + + + + + SG + + + + + + + SH + + + + + + + SI + + + + + + + SJ + + + + + + + SK + + + + + + + SL + + + + + + + SM + + + + + + + SN + + + + + + + RS2 + + + + + + + Bluetooth + + + + + + + ADC Filter Filtre ADC + + + + + + + Device Name: Nom de l'appareil: @@ -5371,71 +8597,169 @@ Cette fonction ne peut pas être désactivée sur la radio. Heli + + + + + + + Invert Elevator Profondeur + + + + + + + Invert Aileron Aileron + + + + + + + Invert Collective Pas collectif + + + + + + + Invert Inversion + + + + + + + Off Aucun + + + + + + + 120 + + + + + + + 120X + + + + + + + 140 + + + + + + + 90 + + + + + + + Long. cyc Cyc. longitudinal + + + + + + + Lateral cyc Cyc. latéral + + + + + + + Collective Source du pas collectif + + + + + + + Swash Type Type de plateau cyclique + + + + + + + Swash Ring Limite cyclique @@ -5828,46 +9152,109 @@ Cette fonction ne peut pas être désactivée sur la radio. LogsDialog + + + + + + + Companion Log Viewer Visualiseur de Log + + + + + + + Filename Nom de fichier + + + + + + + Open LogFile Ouvrir fichier de Log + + + + + + + Zoom + + + + + + + Save session CSV Sauvegarder la session CSV + + + + + + + X + + + + + + + Y + + + + + + + Reset Remise à zéro + + + + + + + Fly sessions Sessions de vol @@ -7373,41 +10760,97 @@ Enregistrer les changements ? MixerDialog + + + + + + + Up Haut + + + + + + + ADD += Ajouter + + + + + + + OFF + + + + + + + Down Bas + + + + + + + Slow Ralenti + + + + + + + Delay Délai + + + + + + + Curve Courbe + + + + + + + Multiplexer This determines how mixer values are added. @@ -7425,6 +10868,13 @@ Spécifie comment les valeurs de mixage sont interprétées. + + + + + + + The curve used by the mix Courbe utilisée par le mixage @@ -7432,21 +10882,63 @@ Spécifie comment les valeurs de mixage sont interprétées. + + + + + + + + + + + + + + + + + + + + + GV VG + + + + + + + Yes Oui + + + + + + + No Non + + + + + + + Mixer warning. Setting this value will cause a beep to be emmitted when this value is active. Alerte de mixage. @@ -7454,26 +10946,59 @@ Si activée, signale par des bips que le mixage est actif. + + + + + + + 1 Beep 1 Bip + + + + + + + 2 Beep 2 Bips + + + + + + + 3 Beep 3 Bips + + + + + + + Multiplex Multiplexage + + + + + Dialog Dialogue @@ -7482,6 +11007,34 @@ Si activée, signale par des bips que le mixage est actif. + + + + + + + + + + + + + + + + + + + + + + + + + + + + <!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; } @@ -7507,26 +11060,61 @@ p, li { white-space: pre-wrap; } + + + + + + + Offset Décalage + + + + + + + Source Source + + + + + + + Switch Interrupteur + + + + + + + Weight Ratio + + + + + + + REPLACE := Remplacer @@ -7535,16 +11123,58 @@ p, li { white-space: pre-wrap; } + + + + + + + + + + + + + + + + + + + + + + + + + + + + The source for the mixer La source du mixage + + + + + + + MULTIPLY *= Multiplier + + + + + + + Switch used by the mix. If blank then the mix is considered to be "ON" all the time. Interrupteur utilisé par le mixage. @@ -7552,11 +11182,25 @@ Mixage actif par défaut si non-renseigné. + + + + + + + Warning Avertissement + + + + + + + Name Nom @@ -7587,19 +11231,46 @@ Mixage actif par défaut si non-renseigné. + + + + + + + Include Trim Inclure Trim + + + + + + + Flight modes Phases de vol + + + + + + + Include DR/Expo Inclure DR/Expo + + + + FullScreenDialog + + MixersListWidget @@ -7773,6 +11444,13 @@ Mixage actif par défaut si non-renseigné. ModelEdit + + + + + + + Simulate Simulation @@ -7808,6 +11486,11 @@ Mixage actif par défaut si non-renseigné. + + + + + Dialog Dialogue @@ -7831,6 +11514,12 @@ Mixage actif par défaut si non-renseigné. Telemetry Télémesure + + + + FullScreenDialog + + ModelPrinter @@ -8649,123 +12338,288 @@ Mixage actif par défaut si non-renseigné. Module + + + + + + + Failsafe Mode Mode Failsafe + + + + + + + Start 1ère voie + + + + + + + PPM delay Impulsion + + + + + + + Negative Négative + + + + + + + Positive + + + + + + + Polarity Polarité + + + + + + + Trainer Mode Mode écolage + + + + + + + PPM Frame Length Longueur de trame PPM + + + + + + + CH VOIE + + + + + + + Antenna Antenne + + + + + + + Option value + + + + + + + us µs + + + + + + + Master/Jack Maître/Jack + + + + + + + Slave/Jack Elève/Jack + + + + + + + Master/SBUS Module Maître/SBUS module + + + + + + + Master/CPPM Module Maître/CPPM Module + + + + + + + Master/SBUS in battery compartment Maître/SBUS dans compartiment batterie + + + + + + + RF Output Power Puissance RF + + + + + + + Sub Type Sous-Type + + + + + + + Show values in: Afficher les valeurs en: + + + + + + + % abbreviation for percent + + + + + + + μs abbreviation for microseconds + + + + + + + ms + + + + Receiver 1 Récepteur 1 @@ -8773,109 +12627,268 @@ Mixage actif par défaut si non-renseigné. + + + + + + + + + + + + X + + + + Receiver 2 Récepteur 2 + + + + Receiver 3 Récepteur 3 + + + + + + + WARNING: changing RF Output Power needs RE-BIND ATTENTION: RE-BIND nécessaire pour tout changement de puissance RF + + + + + + + Channels Nb de voies + + + + + + + Not set Non défini + + + + + + + Hold Maintien + + + + + + + Custom Prédéfini + + + + + + + No Pulses Pas d'impulsions + + + + + + + Receiver Récepteur + + + + + + + WARNING: Requires non-certified firmware! ATTENTION: Nécessite un firmware non certifié! + + + + Registration ID ID d'enregistrement + + + + + + + Failsafe Positions Positions Failsafe + + + + + + + Protocol Protocole + + + + + + + Multi Radio Protocol Protocole Multi + + + + + + + Receiver No. Récepteur No. + + + + + + + Output type Type de sortie + + + + + + + Open Drain + + + + + + + Push Pull + + + + + + + Bind on startup Bind au démarage + + + + + + + Low Power Puissance Réduite + + + + + + Internal + Interne + + + + + + + Ext. + Int. + + ModuleData @@ -9615,21 +13628,49 @@ Mixage actif par défaut si non-renseigné. PrintDialog + + + + + + + Close Fermer + + + + + + + Style + + + + + + + Print Imprimer + + + + + + + Print to file Imprimer vers un fichier @@ -9653,11 +13694,25 @@ Mixage actif par défaut si non-renseigné. ProgressDialog + + + + + + + Flash Firmware Flasher le firmware + + + + + + + Close Fermer @@ -9672,6 +13727,13 @@ Mixage actif par défaut si non-renseigné. ProgressWidget + + + + + + + Show Details Voir les détails @@ -9825,16 +13887,37 @@ Mixage actif par défaut si non-renseigné. RadioNotFoundDialog + + + + + + + No Radio Found Radio non détectée + + + + + + + <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>Aucune radio détectée !</p><p>Veuillez vous assurer de maintenir les 2 trims horizontaux vers l'intérieur lors de la mise sous tension de la radio.</p><p>Ensuite connecter le câble USB.</p><p><span style=" font-family:'arial,sans-serif'; font-size:13px; font-style:italic; color:#222222; background-color:#ffffff;">Note: Cette version de Companion ne doit être utilisée pour éditer des réglages que si la version du firmware de la radio est au moins 2.0.</span></p></body></html> + + + + + + + OK @@ -9843,43 +13926,99 @@ Mixage actif par défaut si non-renseigné. RadioOutputsWidget - + + + + + + + + + Form Formulaire - + + + + + + + + + View: Vue: - + + + + + + + + + Logical Switches Inters Logiques - + + + + + + + + + Global Variables Variables Globales - + + + + + + + + + Channel Outputs Sorties Voies - + + + + + + + + + Mix Outputs Sorties Mixages - + + + + + + + + + L o g @@ -9890,7 +14029,15 @@ L - + + + + + + + + + G l o @@ -9902,7 +14049,15 @@ G - + + + + + + + + + C h a @@ -9918,7 +14073,15 @@ E - + + + + + + + + + M i x @@ -10763,161 +14926,385 @@ E Setup + + + + + + + Center beep Bip de centrage + + + + + + + OFF + + + + + + + Model Image Image du modèle + + + + + + + Exponential Exponentiel + + + + + + + Throttle Trim Idle Only Trim ralenti uniquement + + + + + + + Timer 3 Chrono 3 + + + + + + + Extra Fine Extra fin + + + + + + + Fine Fin + + + + + + + Medium Moyen + + + + + + + Coarse Grossier + + + + + + + Display Checklist Afficher la checklist + + + + + + + Timer 2 Chrono 2 + + + + + + + Timer 1 Chrono 1 + + + + + + + Never Jamais + + + + + + + On change Au changement + + + + + + + Always Toujours + + + + + + + Global Functions Fonctions globales + + + + + + + Edit Checklist... Éditer Checklist... + + + + + + + Throttle Source Source des gaz + + + + + + + Trim Step Pas des trims + + + + + + + Trims Display Affichage des trims + + + + + + + Warnings Avertissements + + + + + + + Top LCD Timer Chrono LCD supérieur + + + + + + + Switch Warnings Positions des interrupteurs + + + + + + + Pot Warnings Positions des potentiomètres + + + + + + + Manual Manuel + + + + + + + Auto + + + + + + + Model Modèle + + + + + + + Extended Limits Débattements étendus + + + + + + + Extended Trims Trims étendus + + + + + + + Throttle Warning Alerte gaz + + + + + + + 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. @@ -10929,6 +15316,13 @@ Si cette option est cochée, la voie des gaz est inversée: le ralenti est &apo + + + + + + + Reverse Throttle Gaz inversés @@ -11301,181 +15695,421 @@ Profil ID: [%1]; Radio ID: [%2] SimulatorMainWindow - + + + + + + + + + OpenTx Simulator Simulateur OpenTX - + + + + + + + + + View Vue - + + + + + + + + + Radio Window Fenêtre radio - + + + + + + + + + Reload... Recharger... - + + + + + + + + + Tools Outils - + + + + + + + + + Toolbar Barre d'outils - + + + + + + + + + Reload Lua Scripts Recharger le script Lua - + + + + + + + + + Reload the Lua environment on the simulated radio. Recharger l'environnement Lua dans le simulateur. - + + + + + + + + + F7 - + + + + + + + + + Reload Radio Data Recharger les données radio - + + + + + + + + + Reload all radio data without restarting the simulator. Recharger les données radio sans redémarrer le simulateur. - + + + + + + + + + F9 - + + + + + + + + + Key Mapping Raccourcis clavier - + + + + + + + + + Show keyboard maping reference. Afficher les raccourcis clavier. - + + + + + + + + + F1 - + + + + + + + + + Joystick Settings Paramètres Joystick - + + + + + + + + + Open joystick configuration settings dialog. Ouvrir la boite de dialogue de la configuration du Joystick. - + + + + + + + + + F3 - + + + + + + + + + LCD Screenshot Capture LCD - + + + + + + + + + Save a screenshot of the current simulated LCD screen. Enregistrez une capture de l'écran LCD actuellement simulé. - + + + + + + + + + F8 - + + + + + + + + + Dock In Main Window Ancrer dans la fenêtre principale - + + + + + + + + + Show the radio in the main window or as a separate "floating" window. Afficher la radio dans la fenêtre principale ou comme une fenêtre "flottante" séparée. - + + + + + + + + + Menu Bar Barre de menus - + + + + + + + + + Show or hide the top menu bar. Afficher ou masquer la barre de menus. - + + + + + + + + + Alt+M - + + + + + + + + + Constrain Width Contraindre la largeur - + + + + + + + + + Set radio widget width to be a fixed size. Défini la largeur du widget radio comme étant une taille fixe. - + + + + + + + + + Constrain Height Contraindre la hauteur - + + + + + + + + + Set radio widget height to be a fixed size. Défini la hauteur du widget radio comme étant une taille fixe. @@ -11556,25 +16190,57 @@ Profil ID: [%1]; Radio ID: [%2] SimulatorStartupDialog - + + + + + + + + + OpenTX Simulator - Startup Options Simulateur OpenTX - Options de démarrage - + + + + + + + + + Simulator Startup Options: Options de démarrage: - + + + + + + + + + Radio Profile: Profil Radio: - + + + + + + + + + Existing radio profiles are shown here.<br /> Create or edit profiles using the Companion application. Les profils existants sont affichés ici.<br /> @@ -11582,13 +16248,29 @@ Créer ou éditer les profils avec l'application Companion. - + + + + + + + + + Radio Type: Type de Radio: - + + + + + + + + + Existing radio simulators are shown here.<br /> The radio type specified in the selected profile is used by default. Les simulateurs radios existants sont affichés ici.<br /> @@ -11596,31 +16278,71 @@ Le type de radio choisi par défaut est celui défini dans le profil selectionn - + + + + + + + + + Data Source: Source Données: - + + + + + + + + + Data File: Fichier Données: - + + + + + + + + + Data Folder: Dossier Données: - + + + + + + + + + SD Image Path: Dossier Image 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! Fichier de données utilisé (.bin/.eeprom/.otx).Un nouveau fichier avec une nouvelle image sera créé si nécessaire.<br /> @@ -11628,7 +16350,15 @@ Le type de radio choisi par défaut est celui défini dans le profil selectionn - + + + + + + + + + Select data file... Choisir le fichier de données... @@ -11636,15 +16366,47 @@ Le type de radio choisi par défaut est celui défini dans le profil selectionn - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + ... - + + + + + + + + + Directory containing RADIO and MODELS folders to use.<br /> New folder(s) with default radio/model will be created here if necessary. Chemin contenant les dossiers RADIO et MODELS à utiliser.<br /> @@ -11652,13 +16414,29 @@ Un (ou plusieurs) dossier peut être créé ici si nécessaire. - + + + + + + + + + Select data folder... Sélectionner le dossier de données... - + + + + + + + + + Directory containing the SD card image to use.<br/> The default is configured in the chosen Radio Profile. Dossier contenant l'image de la carte SD.<br/> @@ -11666,31 +16444,71 @@ La valeur par défaut est configurée dans le profil radio sélectionné. - + + + + + + + + + Select SD card image folder... Choisir le dossier contenant l'image de la carte SD... - + + + + + + + + + Select which of the data sources (File/Folder/SD Card) you would like to start the simulator with. Choisir la source (Fichier/Dossier/Image SD) du type de donnée utilisé par le simulateur. - + + + + + + + + + File Fichier - + + + + + + + + + Folder Dossier - + + + + + + + + + SD Path Image SD @@ -11719,7 +16537,15 @@ La valeur par défaut est configurée dans le profil radio sélectionné.SimulatorWidget - + + + + + + + + + Companion Simulator Simulateur Companion @@ -11807,6 +16633,20 @@ La valeur par défaut est configurée dans le profil radio sélectionné. + + + + + + + + + + + + + + ... @@ -11846,6 +16686,13 @@ La valeur par défaut est configurée dans le profil radio sélectionné.StyleEditDialog + + + + + + + @@ -11854,21 +16701,49 @@ La valeur par défaut est configurée dans le profil radio sélectionné. + + + + + + + &Reset to default &Réglages par défaut + + + + + + + &Cancel &Annuler + + + + + + + &OK + + + + + + + This feature does not validate your changes and assumes you are familiar with CSS syntax for QT. Cet éditeur ne vérifie/valide pas vos modifications. Vous devez connaitre la syntaxe CSS pour QT. @@ -12134,190 +17009,475 @@ Trop d'erreurs, abandon. Telemetry + + + + + + + A1 + + + + + + + A2 + + + + + + + RSSI + + + + + + + Alarm 1 Alarme 1 + + + + + + + + + + + + + + ---- ---- + + + + + + + + + + + + + + Yellow Jaune + + + + + + + + + + + + + + Orange Orange + + + + + + + + + + + + + + Red Rouge + + + + + + + Alarm 2 Alarme 2 + + + + + + + Serial Protocol Protocole Série + + + + + + + Volt source Source de mesure de tension + + + + + + + Current source Source de mesure de courant + + + + + + + Protocol Protocole + + + + + + + None Aucun + + + + + + + FrSky Sensor Hub Sensor Hub FrSky + + + + + + + Blades Pales + + + + + + + Sink Max Chute max + + + + + + + Climb Max Montée max + + + + + + + Sink Min Chute min + + + + + + + Climb Min Montée min + + + + + + + Center Silent Neutre silencieux + + + + + + + Vario source Source vario + + + + + + + Vario limits Limites vario + + + + + + + Disable telemetry audio warnings Désactiver les avertissements audio de la télémétrie + + + + + Source + + + + + + + Altimetry Altitude + + + + + + + Altitude source Source de l'altitude + + + + + + + Volts source Source de la tension + + + + + + + Top Bar Barre de titre de l'écran d'accueil + + + + + + + mAh + + + + + + + A + + + + + + + Various Divers + + + + + + + Sensors Capteurs + + + + + + + Disable multi sensor handling Désactiver la gestion des capteurs multiples + + + + + + + mAh count Valeur enregistrée + + + + + + + FAS Offset Décalage FAS + + + + + + + Persistent mAh Mémorisation des mAh @@ -12326,107 +17486,289 @@ Trop d'erreurs, abandon. TelemetryAnalog + + + + + + + Unit Unité + + + + + + + Max Value Valeur Max + + + + + + + Alarm 1 Alarme 1 + + + + + + + + + + + + + + ---- + + + + + + + + + + + + + + Yellow Jaune + + + + + + + + + + + + + + Orange + + + + + + + + + + + + + + Red Rouge + + + + + + + + + + + + + + < + + + + + + + + + + + + + + > + + + + + + + Alarm 2 Alarme 2 + + + + + + + Offset Décalage + + + + + + + Volts (V) Tension (V) + + + + + + + Amps (A) Courant (A) + + + + + + + Speed (m/s or ft/s) Vitesse (m/s ou ft/s) + + + + + + + Raw (-) Chiffres bruts (-) + + + + + + + Speed (km/h or miles/h) Vitesse (km/h ou miles/h) + + + + + + + Meters (m or ft) Distance (m ou ft) + + + + + + + Temp (°) Température (°) + + + + + + + Fuel (%) Carburant (%) + + + + + + + mAmps (mA) Courant (mA) @@ -12440,6 +17782,13 @@ Trop d'erreurs, abandon. TelemetryCustomScreen + + + + + + + Custom Screen Type Type d'écran personnalisé @@ -12465,21 +17814,49 @@ Trop d'erreurs, abandon. + + + + + + + Min + + + + + + + Source + + + + + + + Gauge Jauge + + + + + + + Max @@ -12593,86 +17970,199 @@ Trop d'erreurs, abandon. TelemetrySensor + + + + + + + Form Formulaire + + + + + + + Custom Prédéfini + + + + + + + Calculated Calculé + + + + + + + Id + + + + + + + Instance + + + + Rx + + + + Mod. + + + + + + + Add Addition + + + + + + + Average Moyenne + + + + + + + Min + + + + + + + Max + + + + + + + Multiply Multiplication + + + + + + + Totalize Totalisation + + + + + + + Cell Element LiPo + + + + + + + Consumption Consommation + + + + + + + Dist Distance + + + + + + + Cells Sensor : Capteur d'éléments: @@ -12685,191 +18175,506 @@ Trop d'erreurs, abandon. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --- + + + + + + + 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 + + + + + + + Precision Précision + + + + + + + Ratio + + + + + + + Blades Pales + + + + + + + Offset Décalage + + + + + + + Multiplier Multiplicateur + + + + + + + Auto Offset Offset auto + + + + + + + Filter Filtre + + + + + + + Persistent Persistant + + + + + + + Positive + + + + + + + Logs @@ -12901,121 +18706,281 @@ Trop d'erreurs, abandon. TelemetrySimulator - + + + + + + + + + Telemetry Simulator Simulateur de télémesure - + + + + + + + + + VFAS - + + + + + + + + + RSSI - + + + + + + + + + Simulate Simuler - + + + + + + + + + Replay SD Log File Rejouer le fichier de Log SD - + + + + + + + + + Replay rate Vitesse - + + + + + + + + + |> - + + + + + + + + + <| - + + + + + + + + + > - + + + + + + + + + <- - + + + + + + + + + X - + + + + + + + + + 1/5x - + + + + + + + + + 5x - + + + + + + + + + No Log File Currently Loaded Pas de fichier de Log chargé - + + + + + + + + + Setting RSSI to zero simulates telemetry and radio link loss. Régler le RSSI à zéro simule la perte de liaison radio et de télémétrie. - + + + + + + + + + Set RSSI to zero when paused. Régler le RSSI à zéro lors d'une pause. - + + + + + + + + + Stop sending telemetry data when the Telemetry Simulator window is hidden. Arrêtez d'envoyer des données de télémétrie lorsque la case est cochée. - + + + + + + + + + Pause simulation when hidden. Pause la simulation. - + + + + + + + + + Load Charger - + + + + + + + + + Row # Timestamp Ligne # @@ -13023,7 +18988,15 @@ Horodatage - + + + + + + + + + RxBt @@ -13031,9 +19004,33 @@ Horodatage - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + V / ratio @@ -13051,140 +19048,420 @@ Horodatage - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <html><head/><body><p><br/></p></body></html> - - + + + + + + + + + + + + + + + + + + Volts - + + + + + + + + + Db dB - + + + + + + + + + Curr Courant - + + + + + + + + + Amps - + + + + + + + + + Cels Elément - + + + + + + + + + A1 - + + + + + + + + + A2 - + + + + + + + + + ASpd - - + + + + + + + + + + + + + + + + + + km/h - + + + + + + + + + A3 - + + + + + + + + + GAlt - - + + + + + + + + + + + + + + + + + + Meters Mètres - + + + + + + + + + A4 - + + + + + + + + + GSpd - + + + + + + + + + Tmp1 - + + + + + + + + + RAS - + + + + + + + + + Hdg - + + + + + + + + + Lat,Lon (dec.deg.) - + + + + + + + + + dd-MM-yyyy hh:mm:ss jj-MM-aaaa @@ -13192,51 +19469,123 @@ hh:mm:ss - + + + + + + + + + Degrees - + + + + + + + + + Tmp2 - - + + + + + + + + + + + + + + + + + + °C - + + + + + + + + + Date - + + + + + + + + + GPS - + + + + + + + + + Fuel Carburant - + + + + + + + + + % - + + + + + + + + + AccX @@ -13244,65 +19593,169 @@ hh:mm:ss - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + G - + + + + + + + + + Fuel Qty Qté Carburant - + + + + + + + + + ml - + + + + + + + + + AccY - + + + + + + + + + VSpd Vitesse Verticale - + + + + + + + + + m/s - + + + + + + + + + AccZ - + + + + + + + + + Alt Altitude - - + + + + + + + + + + + + + + + + + + RPM - + + + + + + + + + When enabled, sends any non-blank values as simulated telemetry data. Transmet les valeurs non vides au simulateur. @@ -13344,11 +19797,25 @@ hh:mm:ss Timer + + + + + + + Countdown Compte à rebours + + + + + + + Minute Call Annonces minutes @@ -13433,26 +19900,61 @@ Utilisez CTRL + le défilement de la souris ou les touches PAGE HAUT/PAGE BAS po Trainer + + + + + + + Form Formulaire + + + + + + + Mode + + + + + + + Input Entrée + + + + + + + Weight Ratio + + + + + + + Rud Dir @@ -13465,6 +19967,62 @@ Utilisez CTRL + le défilement de la souris ou les touches PAGE HAUT/PAGE BAS po + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Beeper volume 0 - Quiet. No beeps at all. @@ -13485,6 +20043,34 @@ Extra long : bips extra longs. + + + + + + + + + + + + + + + + + + + + + + + + + + + + Off @@ -13493,6 +20079,34 @@ Extra long : bips extra longs. + + + + + + + + + + + + + + + + + + + + + + + + + + + + += (Sum) += (Additionner) @@ -13501,6 +20115,34 @@ Extra long : bips extra longs. + + + + + + + + + + + + + + + + + + + + + + + + + + + + := (Replace) := (Remplacer) @@ -13509,6 +20151,34 @@ Extra long : bips extra longs. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn1 VOIE1 @@ -13517,6 +20187,34 @@ Extra long : bips extra longs. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn2 VOIE2 @@ -13525,6 +20223,34 @@ Extra long : bips extra longs. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn3 VOIE3 @@ -13533,21 +20259,70 @@ Extra long : bips extra longs. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn4 VOIE4 + + + + + + + Ele Prf + + + + + + + Thr Gaz + + + + + + + Ail @@ -13556,7 +20331,15 @@ Extra long : bips extra longs. TrainerSimulator - + + + + + + + + + Trainer simulator Simulateur d'écolage @@ -13982,11 +20765,32 @@ Extra long : bips extra longs. + + + + + + + + + + + + + + Port + + + + + + + List all available programmers. Lister tous les programmateurs supportés. @@ -13995,12 +20799,47 @@ Extra long : bips extra longs. + + + + + + + + + + + + + + + + + + + + + + + + + + + + The location of the AVRDUDE executable. The location of the AVRDUDE.EXE executable. Chemin d'accès de l'exécutable AVRDUDE. + + + + + + + DFU-Util Location Chemin de DFU-UTIL @@ -14008,11 +20847,39 @@ Extra long : bips extra longs. + + + + + + + + + + + + + + + + + + + + + Use this button to browse and look for the AVRDUDE executable file. Utiliser ce bouton pour parcourir à la recherche du fichier exécutable AVRDUDE.EXE. + + + + + + + Programmer used for communicating with the controller. Please consult the programmer's documentation and the AVRDUDE documentation to select the appropriate programmer. Programmateur utilisé pour la communication avec le contrôleur. @@ -14020,6 +20887,13 @@ Consulter la documentation du programmateur utilisé et celle d'AVRDUDE pou + + + + + + + Communication port to the programmer. Port de communication pour le programmateur. @@ -14027,31 +20901,73 @@ Consulter la documentation du programmateur utilisé et celle d'AVRDUDE pou + + + + + + + MCU Processeur + + + + + + + at91sam3s8-9xr + + + + + + + Alternate device Dispositif alternatif + + + + + + + Use advanced controls Utiliser les contrôles avancés + + + + + + + Extra Arguments Paramètres supplémentaires + + + + + + + Show Help Aide @@ -14059,6 +20975,27 @@ Consulter la documentation du programmateur utilisé et celle d'AVRDUDE pou + + + + + + + + + + + + + + + + + + + + + Browse... Parcourir... @@ -14096,12 +21033,33 @@ Consulter la documentation du programmateur utilisé et celle d'AVRDUDE pou + + + + + + + List Available Affiche Liste + + + + + + + + + + + + + + Extra arguments used in AVRDUDE. This can be used for providing extra information to AVRDUDE. @@ -14113,16 +21071,37 @@ A n'utiliser qu'en connaissance de cause: il n'y a pas de contrô + + + + + + + AVRDUDE Location Emplacement d'AVRDUDE + + + + + + + Show AVRDUDE help Affiche l'aide d'AVRDUDE + + + + + + + Programmer Configuration Configuration AVRDUDE / SAM-BA Configuration du programmateur @@ -14130,6 +21109,20 @@ A n'utiliser qu'en connaissance de cause: il n'y a pas de contrô + + + + + + + + + + + + + + Extra arguments that will be passed to AVRDUDE on every call Paramètres complémentaires passés à chaque appel d'AVRDUDE @@ -14140,23 +21133,65 @@ A n'utiliser qu'en connaissance de cause: il n'y a pas de contrô + + + + + + + Location of AVRDUDE executable Chemin d'accès de l'exécutable AVRDUDE + + + + + + + Programmer Programmateur + + + + + + + + + + + + + + CPU of your TX CPU de l'émetteur + + + + + + + + + + + + + + CPU present on your 9x radio Should be m64 for stock radios m2560 for v4.1 boards @@ -14164,22 +21199,57 @@ m2560 for v4.1 boards + + + + + + + SAM-BA Location Emplacement de SAM-BA + + + + + + + + + + + + + + Location of sam-ba executable Emplacement de l'exécutable SAM-BA + + + + + + + ARM MCU Processeur ARM + + + + + + + sam-ba serial port Port série de SAM-BA @@ -14188,85 +21258,197 @@ m2560 for v4.1 boards joystickDialog - + + + + + + + + + Configure Joystick Configuration du Joystick - + + + + + + + + + Ch2 VOIE2 - + + + + + + + + + Ch1 VOIE1 - + + + + + + + + + Ch4 VOIE4 - + + + + + + + + + Ch6 VOIE6 - + + + + + + + + + Ch3 VOIE3 - + + + + + + + + + Ch5 VOIE5 - + + + + + + + + + Ch7 VOIE7 - + + + + + + + + + Ch8 VOIE8 - + + + + + + + + + Instructions - + + + + + + + + + Enable Actif - + + + + + + + + + Cancel Annuler - + + + + + + + + + Back Précédent - + + + + + + + + + Start Démarrer @@ -14277,7 +21459,15 @@ m2560 for v4.1 boards - + + + + + + + + + Ok OK diff --git a/companion/src/translations/companion_it.ts b/companion/src/translations/companion_it.ts index 21b3e87db..cb4847378 100644 --- a/companion/src/translations/companion_it.ts +++ b/companion/src/translations/companion_it.ts @@ -93,41 +93,97 @@ AppPreferencesDialog + + + + + + + Edit Settings Modifica Impostazioni + + + + + + + Radio Profile Profilo Radio + + + + + + + Default Channel Order Ordine canali predefinito + + + + + + + Build Options Opzioni per compilazione + + + + + + + Menu Language Lingua per i menu + + + + + + + Default Stick Mode Modalità Stick + + + + + + + Select Image Seleziona immagine + + + + + + + Mode selection: Mode 1: @@ -169,172 +225,417 @@ Mode 4: + + + + + + + Mode 1 (RUD ELE THR AIL) Modo 1 (DIR ELE MOT ALE) + + + + + + + Mode 2 (RUD THR ELE AIL) Modo 2 (DIR MOTO ELE ALE) + + + + + + + Mode 3 (AIL ELE THR RUD) Modo 3 (ALE ELE MOT DIR) + + + + + + + Mode 4 (AIL THR ELE RUD) Modo 4 (ALE MOT ELE DIR) + + + + + + + Splash Screen Schermata di avvio + + + + + + + + + + + + + + The profile specific folder, if set, will override general Backup folder La cartella qui specificata, prevarrà su quella delle impostazioni generali + + + + + + + Backup folder Cartella per backup + + + + + + + If set it will override the application general setting Se impostato, prevarrà sulle impostazioni generali + + + + + + + if set, will override general backup enable Se impostato, prevarrà sulle impostazioni generali + + + + + + + <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>Ordine dei canali</p><p><br/></p><p>Definisce l'ordine delle miscelazioni predefinite durante la creazione di un modello.</p></body></html> + + + + + + + R E T A D E M A + + + + + + + R E A T D E A M + + + + + + + R T E A D M E A + + + + + + + R T A E D M A E + + + + + + + R A E T D A E M + + + + + + + R A T E D A M E + + + + + + + E R T A E D M A + + + + + + + E R A T E D A M + + + + + + + E T R A E M D A + + + + + + + E T A R E M A D + + + + + + + E A R T E A D M + + + + + + + E A T R E A M D + + + + + + + T R E A M D E A + + + + + + + T R A E M D A E + + + + + + + T E R A M E D A + + + + + + + T E A R M E A D + + + + + + + T A R E M A D E + + + + + + + T A E R M A E D + + + + + + + A R E T A D E M + + + + + + + A R T E A D M E + + + + + + + A E R T A E D M + + + + + + + A E T R A E M D + + + + + + + A T R E A M D E + + + + + + + A T E R A M E D @@ -345,272 +646,680 @@ Mode 4: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Select Folder + + + + + + + Select Executable + + + + Release channel + + + + Releases (stable) + + + + Release candidates (testing) + + + + Nightly builds (unstable) + + + + + + + Simulator Volume Gain Guadagno Volume Simulatore + + + + + + + Profile Name Descrizione + + + + + + + Clear Image Cancella immagine + + + + + + + Append version number to FW file name Aggiungi il numero di versione al nome del file + + + + + + + Offer to write FW to Tx after download Scrivere dopo aggiornamento + + + + + + + Radio Type Tipo di radio + + + + + + + Other Settings Altre impostazioni + + + + + + + General Settings Impostazioni generali radio + + + + + + + SD Structure path Cartella Struttura Scheda SD + + + + + + + Application Settings Impostazioni applicazione + + + + + + + Show splash screen when Companion starts Mostra schermata all'avvio + + + + + + + Automatic check for Companion updates Verifica automaticamente aggiornamenti di Companion + + + + + + + + + + + + + + Enable automatic backup before writing firmware Abilita il backup automatico prima degli aggiornamenti + + + + + + + Automatic check for OpenTX firmware updates Verifica automaticamente aggiornamenti di OpenTX + + + + + + + Splash Screen Library Libreria sfondi + + + + + + + Google Earth Executable Eseguibile Google Earth + + + + + + + Only show user splash images Solamente sfondi utente + + + + + + + Show user and companion splash images Mostra anche sfondi di Companion + + + + + + + User Splash Screens Cartella sfondi utente + + + + + + + Automatic Backup Folder Cartella per backup + + + + + + + Simulator Settings Impostazioni simulatore + + + + + + + Simulator BackLight Colore Retroilluminazione + + + + + + + Enable Abilita + + + + + + + most recently used files + + + + + + + Startup Settings + + + + + + + Remember + + + + + + + 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> + + + + + + + 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 + + + + + + + <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) + + + + + + + Action on New Model + + + + + + + Blue Blu + + + + + + + Green Verde + + + + + + + Red Rosso + + + + + + + Orange Arancione + + + + + + + Yellow Giallo + + + + + + + Screenshot capture folder + + + + + + + Joystick Joystick + + + + + + + Calibrate Calibrazione + + + + + + + Only capture to clipboard Usa solo gli appunti per la cattura degli schermi + + + + + + + Remember simulator switch values Ricorda la posizione degli switches nel simulatore @@ -691,6 +1400,31 @@ Mode 4: Images (%1) Immagini (%1) + + + + + Use releases (stable) + + + + + Use release candidates (testing) + + + + + + + Use nightly builds (unstable) + + + + + + Use releases and release candidates (testing) + + BinEepromFormat @@ -910,36 +1644,85 @@ Mode 4: 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 @@ -1185,31 +1968,73 @@ If you have a settings backup file, you may import that instead. CompareDialog + + + + + + + Compare Models Confronta modelli + + + + + + + To compare models, drag and drop them anywhere in this window. + + + + + + + Close Chiudi + + + + + + + Style + + + + + + + Print Stampa + + + + + + + Print to file Stampa su file @@ -1366,87 +2191,213 @@ If you have a settings backup file, you may import that instead. Curves + + + + + + + Fixed X X fisso + + + + + + + Custom X X modificabile + + + + + + + Lines Linee + + + + + + + Smooth Arrotondata + + + + + + + + + + + + + + Curve type Tipo curva + + + + + + + Curve Creator Generatore di curve + + + + + + + Y at X=0 Y a X=0 + + + + + + + Point size + + + + + + + Y at X=100 Y a X=100 + + + + + + + Both Entrambi + + + + + + + x>0 x>0 + + + + + + + x<0 x<0 + + + + + + + Apply Applica + + + + + + + Side Lato + + + + + + + Y at X=-100 Y a X=-100 + + + + + + + Coefficient Coefficiente + + + + + + + Curve name Nome curva @@ -1859,42 +2810,133 @@ If you have a settings backup file, you may import that instead. CustomizeSplashDialog + + + + + + + Transmitter Splash Screen Editor Editor per schermata di avvio della Radio + + + + + + + + + + + + + + Invert Inverti + + + + + + + + + + + + + + Load FW Carica FW + + + + + + + + + + + + + + Load Pict Carica Imm. + + + + + + + + + + + + + + Load Profile Carica profilo + + + + + + + + + + + + + + Save Salva + + + + + + + + + + + + + + Open Splash Library Apri libreria sfondi @@ -1903,6 +2945,34 @@ If you have a settings backup file, you may import that instead. + + + + + + + + + + + + + + + + + + + + + + + + + + + + ... ... @@ -2018,48 +3088,48 @@ If you have a settings backup file, you may import that instead. - + Switch Interruttore - + Switch - + cannot be exported on this board! - + Source Sorgente - + Source %1 cannot be exported on this board! La sorgente %1 non può essere esportata su questa radio! - + OpenTX only accepts %1 points in all curves OpenTX accetta solamente %1 punti in tutte le curve - + OpenTx only accepts %1 points in all curves OpenTx accetta solamente %1 punti in tutte le curve - - + + OpenTX on this board doesn't accept this function OpenTX in questa piattaforma non accetta la funzione - + OpenTX doesn't accept this radio protocol OpenTX non accetta questo protocollo di trasmissione @@ -2068,86 +3138,198 @@ If you have a settings backup file, you may import that instead. DebugOutput - + + + + + + + + + Debug Output Uscita diagnostica - + + + + + + + + + <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. @@ -2166,6 +3348,13 @@ To <b>remove a remembered entry</b> from the filter list, first cho DownloadDialog + + + + + + + Downloading: Scaricamento in corso: @@ -2309,26 +3498,61 @@ To <b>remove a remembered entry</b> from the filter list, first cho ExpoDialog + + + + + + + Weight Peso + + + + + + + Flight modes Fasi di volo + + + + + + + Offset Spostamento + + + + + + + The source for the mixer Sorgente da miscelare + + + + + + + Input name Nome Ingresso @@ -2336,36 +3560,99 @@ To <b>remove a remembered entry</b> from the filter list, first cho + + + + + + + + + + + + + + + + + + + + + GV VG + + + + + + + Switch Interruttore + + + + + + + Source Sorgente + + + + + + + Line name Nome linea + + + + + + + Stick Side Lato dello stick + + + + + + + Source for the mixer. Sorgente per la miscelazione. + + + + + + + Switch used to enable the line. If blank then the input is considered to be "ON" all the time. Interruttore usato per abilitare la linea. @@ -2373,46 +3660,109 @@ Se vuoto verrà sempre considerata "Attiva". + + + + + + + Scale Campo di misura + + + + + + + Include Trim Include i Trim + + + + + + + No No + + + + + + + Yes Si + + + + + + + Curve Curva + + + + + + + Curve applied to the source. Curva applicata alla sorgente. + + + + + + + NEG NEG + + + + + + + POS POS + + + + + + + ALL TUTTI @@ -3058,31 +4408,73 @@ Blank means include all. ?, *, and [...] wildcards accepted. FirmwarePreferencesDialog + + + + + + + Downloads File scaricabili + + + + + + + Check for updates Verifica aggiornamenti + + + + + + + Firmware Firmware + + + + + + + Download firmware + + + + + + + Download SD contents + + + + + + + Latest Download Ultimi download @@ -3124,67 +4516,158 @@ Blank means include all. ?, *, and [...] wildcards accepted. FlashEEpromDialog + + + + + + + Write Models and Settings to Radio Scrivi Modelli e Impostazioni sulla Radio + + + + + + + Load... Carica... + + + + + + + Current Profile Profilo corrente + + + + + + + Allows Companion to write to older version of the firmware Consenti a Companion di scrivere a versioni precedenti del firmware + + + + + + + Check Firmware compatibility Verifica compatibilità 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> + + + + + + + Backup before Write Esegui backup prima della scrittura + + + + + + + <html><head/><body><p>Modify calibration parameters using settings from current profile</p></body></html> <html><head/><body><p>Modifica i dati di calibrazione della radio usando le impostazioni del profilo corrente</p></body></html> + + + + + + + Patch calibration setting from profile Importa dati di calibrazione dal profilo + + + + + + + <html><head/><body><p>Modify HW parameters using settings from current profile</p></body></html> <html><head/><body><p>Modifica le impostazioni HW della radio usando le impostazioni del profilo corrente</p></body></html> + + + + + + + Patch HW settings from profile Importa settaggi HW dal profilo + + + + + + + Cancel Annulla + + + + + + + Write to TX Scrivi sulla radio @@ -3242,71 +4725,169 @@ Blank means include all. ?, *, and [...] wildcards accepted. FlashFirmwareDialog + + + + + + + Flash Firmware Scrittura firmware + + + + + + + Load... Carica... + + + + + + + Date & Time Data e ora + + + + + + + Variant Variante + + + + + + + Version Versione + + + + + + + Use profile start screen Usa schermata di avvio del profilo + + + + + + + Use firmware start screen Usa schermata di avvio del firmware + + + + + + + Use library start screen Usa schermata di avvio della libreria + + + + + + + Use another start screen Usa schermata di avvio alternativa + + + + + + + Allows Companion to write to older version of the firmware Consenti a Companion di scrivere a versioni precedenti del firmware + + + + + + + Check Hardware compatibility Controlla compatibilità Hardware + + + + + + + Backup and restore Models and Settings Salva e ripristina le impostazioni della radio + + + + + + + Cancel Annulla + + + + + + + Write to TX Scrivi sulla radio @@ -3506,21 +5087,49 @@ state attualmente utilizzando: FlightMode + + + + + + + Fade In Tempo transizione in ingresso + + + + + + + Fade Out Tempo transizione in uscita + + + + + + + Name Nome + + + + + + + Switch Interruttore @@ -3710,11 +5319,25 @@ state attualmente utilizzando: FusesDialog + + + + + + + Fuses Fuses + + + + + + + <!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; } @@ -3744,11 +5367,25 @@ p, li { white-space: pre-wrap; } + + + + + + + Read Fuses Leggi Fuses + + + + + + + <!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; } @@ -3782,6 +5419,13 @@ p, li { white-space: pre-wrap; } + + + + + + + Reset Fuses EEPROM - PROTECT Reimposta Fuses @@ -3789,6 +5433,13 @@ EEPROM - PROTECT + + + + + + + <!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; } @@ -3822,6 +5473,13 @@ p, li { white-space: pre-wrap; } + + + + + + + Reset Fuses EEPROM - DELETE Reimposta Fuses @@ -3829,6 +5487,13 @@ EEPROM - DELETE + + + + + + + <!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; } @@ -3905,11 +5570,25 @@ p, li { white-space: pre-wrap; } GeneralEdit + + + + + + + Radio settings + + + + + + + General settings used throught the transmitter. These will be relevant for all models in the same EEPROM. Impostazioni generali utilizzate nella radio. @@ -3927,11 +5606,25 @@ Queste impostazioni sono comuni a tutti i modelli nella stessa EEPROM. + + + + + + + Store calib. and hw settings in selected profile Memorizza calib. e settaggi HW nel profilo scelto + + + + + + + Retrieve calib. and hw settings from profile Recupera calib. e settaggi HW dal profilo scelto @@ -3988,127 +5681,309 @@ Queste impostazioni sono comuni a tutti i modelli nella stessa EEPROM.GeneralSetup + + + + + + + Form + + + + + + + Readonly Unlock Sblocco modalità sola lettura + + + + + + + SC SC + + + + + + + SE SE + + + + + + + SA SA + + + + + + + SF SF + + + + + + + SH SH + + + + + + + SD SD + + + + + + + SB SB + + + + + + + SG SG + + + + + + + Timeshift from UTC Differenza in ore da GMT + + + + + + + Voice Language Lingua per le voci + + + + + + + Country Code Codice paese + + + + + + + Stick reverse Inverti Stick + + + + + + + FAI Mode Modalità FAI + + + + + + + Adjust RTC Aggiusta Orologio + + + + + + + Vario pitch at max Tono del vario al massimo + + + + + + + + + + + + + + Hz Hz + + + + + + + Speaker Volume Volume altoparlante + + + + + + + Backlight Switch Interruttore retroilluminazione + + + + + + + Sound Mode Modalità audio + + + + + + + Color 1 Colore 1 + + + + + + + Color 2 Colore 2 + + + + + + + Speaker Pitch (spkr only) Tonalità suono (modifica HW) + + + + + + + If this value is not 0, any keypress will turn on the backlight and turn it off after the specified number of seconds. Se questo valore non è 0, ogni pressione di tasto provocherà l'accensione della luce e questa verrà spenta dopo il numero di secondi specificato. @@ -4116,82 +5991,209 @@ Queste impostazioni sono comuni a tutti i modelli nella stessa EEPROM. + + + + + + + + + + + + + + + sec sec + + + + + + + Backlight color Colore retroilluminazione + + + + + + + Beeper Cicalino + + + + + + + Speaker Altoparlante + + + + + + + BeeperVoice Cicalino e voce + + + + + + + SpeakerVoice Altoparlante e Voce + + + + + + + Beep volume Volume cicalino + + + + + + + Wav volume Volume file Wav + + + + + + + Vario volume Volume per vario + + + + + + + Background volume Volume sottofondo + + + + + + + + + + + + + + ms ms + + + + + + + Backlight Auto OFF after Auto spegnimento luce dopo + + + + + + + Backlight flash on alarm Retroilluminazione su allarme + + + + + + + Vario pitch at zero Tono del vario a zero + + + + + + + Vario repeat at zero Ripetizione vario a zero + + + + + + + This is the switch selectrion for turning on the backlight (if installed). @@ -4200,6 +6202,20 @@ Queste impostazioni sono comuni a tutti i modelli nella stessa EEPROM. + + + + + + + + + + + + + + <!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; } @@ -4215,186 +6231,436 @@ p, li { white-space: pre-wrap; } + + + + + + + Backlight Brightness Luminosità retroilluminazione + + + + + + + RotEnc Navigation Navigazione con Encoder + + + + + + + If you enable FAI, only RSSI and RxBt sensors will keep working. This function cannot be disabled by the radio. + + + + + + + America America + + + + + + + Japan Giappone + + + + + + + Europe Europa + + + + + + + RSSI Poweroff Warning + + + + + + + Low EEPROM Warning + + + + Owner Registration ID + + + + aaaaaaAA + + + + + + + <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>Ordine dei canali</p><p><br/></p><p>Definisce l'ordine delle miscelazioni predefinite durante la creazione di un modello.</p></body></html> + + + + + + + R E T A D E M A + + + + + + + R E A T D E A M + + + + + + + R T E A D M E A + + + + + + + R T A E D M A E + + + + + + + R A E T D A E M + + + + + + + R A T E D A M E + + + + + + + E R T A E D M A + + + + + + + E R A T E D A M + + + + + + + E T R A E M D A + + + + + + + E T A R E M A D + + + + + + + E A R T E A D M + + + + + + + E A T R E A M D + + + + + + + T R E A M D E A + + + + + + + T R A E M D A E + + + + + + + T E R A M E D A + + + + + + + T E A R M E A D + + + + + + + T A R E M A D E + + + + + + + T A E R M A E D + + + + + + + A R E T A D E M + + + + + + + A R T E A D M E + + + + + + + A E R T A E D M + + + + + + + A E T R A E M D + + + + + + + A T R E A M D E + + + + + + + A T E R A M E D + + + + Power Off Delay + + + + + + + Mode selection: Mode 1: @@ -4436,163 +6702,401 @@ Mode 4: + + + + + + + Mode 1 (RUD ELE THR AIL) Modo 1 (DIR ELE MOT ALE) + + + + + + + Mode 2 (RUD THR ELE AIL) Modo 2 (DIR MOTO ELE ALE) + + + + + + + Mode 3 (AIL ELE THR RUD) Modo 3 (ALE ELE MOT DIR) + + + + + + + Mode 4 (AIL THR ELE RUD) Modo 4 (ALE MOT ELE DIR) + + + + + + + DMS + + + + + + + USB Mode + + + + + + + + + + + + + + Ask on Connect + + + + + + + Joystick (HID) + + + + + + + USB Mass Storage + + + + + + + USB Serial (CDC) + + + + + + + Stick Mode Modo Stick + + + + + + + Metric Sistema Metrico + + + + + + + Imperial Imperiale + + + + + + + Default Channel Order Ordine canali predefinito + + + + + + + GPS Coordinates Coordinate GPS + + + + + + + Min Min + + + + + + + + + + + + + + v v + + + + + + + Max Max + + + + + + + Beeper Mode Modalità suono beeper + + + + + + + Inactivity Timer Temporizzatore di inattività + + + + + + + Beeper Length Lunghezza suono + + + + + + + Show Splash Screen on Startup Mostra schermata all'avvio + + + + + + + Contrast Contrasto + + + + + + + Battery Meter Range Campo misuratore batteria + + + + + + + Haptic Strength Intensità vibrazione (mod. HW) + + + + + + + LCD Display Type Tipo display LCD + + + + + + + "No Sound" Warning Avviso "nessun suono" + + + + + + + Battery Warning Allarme batteria scarica + + + + + + + Haptic Length Lunghezza vibrazione + + + + + + + MAVLink Baud Rate Baud rate MAVLink + + + + + + + Haptic Mode Modalità vibrazione + + + + + + + Beeper volume 0 - Quiet. No beeps at all. @@ -4611,43 +7115,120 @@ Mode 4: + + + + + + + + + + + + + + Quiet Silenzioso + + + + + + + Alarms Only Solo allarmi + + + + + + + + + + + + + + No Keys No Tasti + + + + + + + + + + + + + + All Tutti + + + + + + + Only Alarms Solo allarmi + + + + + + + Automatically adjust the radio's clock if a GPS is connected to telemetry. + + + + + + + Backlight OFF Brightness + + + + + + + Battery warning voltage. This is the threashhold where the battery warning sounds. @@ -4659,127 +7240,306 @@ Valori accettabili da 5v a 10v + + + + + + + Standard Standard + + + + + + + Optrex Optrex + + + + + + + If not zero will sound beeps if the transmitter has been left without inputs for the specified number of minutes. Se non è zero, verrà fatto suonare l'allarme se la radio non è utilizzata per il numero di minuti specificato. + + + + + + + min min + + + + Power On Delay + + + + + + + Jack Mode + + + + + + + + + + + + + + Show splash screen on startup Mostra schermata all'avvio + + + + + + + --- --- + + + + + + + 2s 2s + + + + + + + 3s 3s + + + + + + + 4s 4s + + + + + + + 6s 6s + + + + + + + 8s 8s + + + + + + + 10s 10s + + + + + + + 15s 15s + + + + + + + Audio + + + + + + + Trainer Maestro/Allievo + + + + + + + 4800 Baud 4800 Baud + + + + + + + 9600 Baud 9600 Baud + + + + + + + 14400 Baud 14400 Baud + + + + + + + 19200 Baud 19200 Baud + + + + + + + 38400 Baud 38400 Baud + + + + + + + 57600 Baud 57600 Baud + + + + + + + 76800 Baud 76800 Baud + + + + + + + 115200 Baud 115200 Baud @@ -4787,6 +7547,27 @@ Valori accettabili da 5v a 10v + + + + + + + + + + + + + + + + + + + + + <!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; } @@ -4813,48 +7594,149 @@ p, li { white-space: pre-wrap; } + + + + + + + + + + + + + + X-Short Extra Corto + + + + + + + + + + + + + + Short Corto + + + + + + + + + + + + + + Normal Normale + + + + + + + + + + + + + + Long Lungo + + + + + + + + + + + + + + X-Long Extra Lungo + + + + + + + NMEA NMEA + + + + + + + Play Delay (switch mid position) Ritardo esecuzione(posizione intermedia) + + + + + + + Measurement Units Unità di misura + + + Power On Speed + + + + + Power Off Speed + + GeneralSetupPanel @@ -5008,251 +7890,595 @@ Are you sure ? Hardware + + + + + + + Form + + + + + + + SQ + + + + + + + SR + + + + + + + LS2 + + + + + + + SP + + + + + + + SO + + + + + + + S4 S4 + + + + + + + RS RS + + + + + + + SB SB + + + + + + + PPM 2 PPM 2 + + + + + + + OFF Spento + + + + + + + S-Port Mirror Replica dati S-Port + + + + + + + Telemetry Telemetria + + + + + + + SBUS Trainer Maestro/Allievo SBUS + + + + + + + Debug Debug + + + + + + + Rud Dir + + + + + + + PPM 3 PPM 3 + + + + + + + S1 S1 + + + + + + + S2 S2 + + + + + + + S3 S3 + + + + + + + PPM 1 PPM 1 + + + + + + + Serial Port Porta Seriale + + + + + + + v v + + + + + + + PPM Multiplier Moltiplicatore PPM + + + + + + + Current Offset + + + + + + + PPM 4 PPM 4 + + + + + + + SA SA + + + + + + + Ele Ele + + + Antenna + + + + + S5 + + + + + + + Ail Ale + + + + + + + Thr Mot + + + + + + + SC SC + + + + + + + LS LS + + + + + + + SD SD + + + + + + + Battery Offset + + + + + + + SE SE + + + + + + + SF SF + + + + + + + SG SG + + + + + + + SH SH + + + + + + + SI SI + + + + + + + SJ SJ + + + + + + + SK SK + + + + + + + SL SL + + + + + + + SM SM + + + + + + + SN SN + + + + + + + RS2 RS2 + + + + + + + Bluetooth + + + + + + + ADC Filter + + + + + + + Device Name: @@ -5351,71 +8577,169 @@ Are you sure ? Heli + + + + + + + Invert Elevator Elevatore + + + + + + + Invert Aileron Alettoni + + + + + + + Invert Collective Collettivo + + + + + + + Invert Inversioni + + + + + + + Off NO + + + + + + + 120 120 + + + + + + + 120X 120X + + + + + + + 140 140 + + + + + + + 90 90 + + + + + + + Long. cyc + + + + + + + Lateral cyc + + + + + + + Collective Collettivo + + + + + + + Swash Type Tipo ciclico + + + + + + + Swash Ring Anello del ciclico @@ -5807,46 +9131,109 @@ Are you sure ? LogsDialog + + + + + + + Companion Log Viewer Visualizzatore di Log di Companion + + + + + + + Filename Nome file + + + + + + + Open LogFile Apri file di log + + + + + + + Zoom Ingrandimento + + + + + + + Save session CSV + + + + + + + X X + + + + + + + Y Y + + + + + + + Reset Ripristina + + + + + + + Fly sessions Sessioni di volo @@ -7342,11 +10729,23 @@ Salvare le modifiche ? MixerDialog + + + + + Dialog Dialogo + + + + + + + Source Sorgente @@ -7355,36 +10754,106 @@ Salvare le modifiche ? + + + + + + + + + + + + + + + + + + + + + + + + + + + + The source for the mixer Sorgente da miscelare + + + + + + + Weight Peso + + + + + + + Offset Spostamento + + + + + + + Include Trim Include i Trim + + + + + + + Curve Curva + + + + + + + The curve used by the mix Curva utilizzata dalla miscelazione + + + + + + + Switch Interruttore @@ -7392,11 +10861,39 @@ Salvare le modifiche ? + + + + + + + + + + + + + + + + + + + + + GV VG + + + + + + + Switch used by the mix. If blank then the mix is considered to be "ON" all the time. Interruttore che controlla la miscelazione. @@ -7404,16 +10901,37 @@ Se vuoto la miscelazione è sempre attiva. + + + + + + + Yes Si + + + + + + + No No + + + + + + + Warning Avviso @@ -7422,6 +10940,34 @@ Se vuoto la miscelazione è sempre attiva. + + + + + + + + + + + + + + + + + + + + + + + + + + + + <!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; } @@ -7447,6 +10993,13 @@ p, li { white-space: pre-wrap; } + + + + + + + Mixer warning. Setting this value will cause a beep to be emmitted when this value is active. Allarme miscelazione. @@ -7454,36 +11007,85 @@ Impostare questo valore causa un'allarme in corrispondenza del valore. + + + + + + + OFF Spento + + + + + + + 1 Beep 1 Beep + + + + + + + 2 Beep 2 Beep + + + + + + + 3 Beep 3 Beep + + + + + + + Multiplex Miscelatore + + + + + + + Flight modes Fasi di volo + + + + + + + Multiplexer This determines how mixer values are added. @@ -7501,46 +11103,109 @@ Determina come il valore viene aggiunto alla miscelazione. + + + + + + + ADD AGGIUNGI + + + + + + + MULTIPLY MOLTIPLICA + + + + + + + REPLACE SOSTITUISCI + + + + + + + Include DR/Expo Include DR/Espo + + + + + + + Name Nome + + + + + + + Delay Ritardo + + + + + + + Slow Rallentamento + + + + + + + Up Su + + + + + + + Down Giù @@ -7569,6 +11234,12 @@ Determina come il valore viene aggiunto alla miscelazione. Invert All + + + + FullScreenDialog + + MixersListWidget @@ -7742,11 +11413,23 @@ Determina come il valore viene aggiunto alla miscelazione. ModelEdit + + + + + Dialog Dialogo + + + + + + + Simulate Simula Modello @@ -7800,6 +11483,12 @@ Determina come il valore viene aggiunto alla miscelazione. Telemetry Telemetria + + + + FullScreenDialog + + ModelPrinter @@ -8618,138 +12307,324 @@ Determina come il valore viene aggiunto alla miscelazione. Module + + + + + + + Failsafe Mode Modalità FailSafe + + + + + + + Start Inizio + + + + + + + PPM delay Pausa PPM + + + + + + + Negative Negativo + + + + + + + Positive Positivo + + + + + + + Polarity Polarità + + + + + + + Trainer Mode Modalità maestro allievo + + + + + + + PPM Frame Length Durata segnale PPM + + + + + + + CH CH + + + + + + + Antenna + + + + + + + Option value + + + + + + + Bind on startup + + + + + + + RF Output Power + + + + + + + Low Power + + + + + + + us us + + + + + + + Multi Radio Protocol + + + + + + + Sub Type + + + + + + + Master/Jack Maestro/(presa) + + + + + + + Slave/Jack Allievo/(Presa) + + + + + + + Master/SBUS Module Maestro/Modulo SBUS + + + + + + + Master/CPPM Module Maestro/Modulo CPPM + + + + + + + Master/SBUS in battery compartment Maestro/SBUS nel compartimento batteria + + + + + + + Show values in: + + + + + + + % abbreviation for percent + + + + + + + μs abbreviation for microseconds + + + + + + + ms ms + + + + Receiver 1 @@ -8757,94 +12632,232 @@ Determina come il valore viene aggiunto alla miscelazione. + + + + + + + + + + + + X X + + + + Receiver 2 + + + + Receiver 3 + + + + + + + WARNING: changing RF Output Power needs RE-BIND + + + + + + + Channels Canali + + + + Registration ID + + + + + + + WARNING: Requires non-certified firmware! + + + + + + + Not set Non impostato + + + + + + + Hold Mantieni + + + + + + + Custom Personalizzato + + + + + + + No Pulses No impulsi + + + + + + + Receiver Ricevitore + + + + + + + Failsafe Positions Posizioni Failsafe + + + + + + + Protocol Protocollo + + + + + + + Receiver No. Numero Ricev. + + + + + + + Output type Tipo uscita + + + + + + + Open Drain + + + + + + + Push Pull + + + + + + Internal + + + + + + + + Ext. + Int. + + ModuleData @@ -9583,21 +13596,49 @@ Determina come il valore viene aggiunto alla miscelazione. PrintDialog + + + + + + + Close Chiudi + + + + + + + Style + + + + + + + Print Stampa + + + + + + + Print to file Stampa su file @@ -9621,11 +13662,25 @@ Determina come il valore viene aggiunto alla miscelazione. ProgressDialog + + + + + + + Flash Firmware Scrittura firmware + + + + + + + Close Chiudi @@ -9640,6 +13695,13 @@ Determina come il valore viene aggiunto alla miscelazione. ProgressWidget + + + + + + + Show Details Mostra dettagli @@ -9793,16 +13855,37 @@ Determina come il valore viene aggiunto alla miscelazione. RadioNotFoundDialog + + + + + + + No Radio Found Radio non trovata + + + + + + + <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>Nessuna radio è stata trovata!</p><p>Siate sicuri di tenere entrambi i trim inferiori verso il centro durante l'accensione della radio..</p><p>Solo dopo connettete il cavo USB.</p><p><span style=" font-family:'arial,sans-serif'; font-size:13px; font-style:italic; color:#222222; background-color:#ffffff;">Nota: se avete una radio Taranis che non ha ancora ricevuto l'aggiornamento alla versione 2.0 del firmware allora questa versione di companion non funzionerà correttamente.</span></p></body></html> + + + + + + + OK OK @@ -9811,43 +13894,99 @@ Determina come il valore viene aggiunto alla miscelazione. RadioOutputsWidget - + + + + + + + + + Form - + + + + + + + + + View: - + + + + + + + + + Logical Switches Interruttori logici - + + + + + + + + + Global Variables Variabili Globali - + + + + + + + + + Channel Outputs - + + + + + + + + + Mix Outputs - + + + + + + + + + L o g @@ -9857,7 +13996,15 @@ c - + + + + + + + + + G l o @@ -9868,7 +14015,15 @@ l - + + + + + + + + + C h a @@ -9881,7 +14036,15 @@ s - + + + + + + + + + M i x @@ -10720,161 +14883,385 @@ s Setup + + + + + + + Center beep Avviso centraggio + + + + + + + OFF Spento + + + + + + + Model Image Immagine modello + + + + + + + Exponential Esponenziale + + + + + + + Throttle Trim Idle Only Trim Motore solo Idle + + + + + + + Timer 3 Temporizzatore 3 + + + + + + + Extra Fine Extra Fine + + + + + + + Fine Fine + + + + + + + Medium Medio + + + + + + + Coarse Ampio + + + + + + + Display Checklist Mostra Note + + + + + + + Timer 2 Temporizzatore 2 + + + + + + + Timer 1 Temporizzatore 1 + + + + + + + Top LCD Timer + + + + + + + Never Mai + + + + + + + On change Al cambiamento + + + + + + + Always Sempre + + + + + + + Global Functions Funzioni Globali + + + + + + + Edit Checklist... + + + + + + + Throttle Source Sorgente motore + + + + + + + Trim Step Passo trim + + + + + + + Trims Display Mostra trims + + + + + + + Warnings Avvisi + + + + + + + Switch Warnings Avviso interruttore + + + + + + + Pot Warnings Avviso Pot + + + + + + + Manual Manuale + + + + + + + Auto Auto + + + + + + + Model Modello + + + + + + + Extended Limits Limiti estesi + + + + + + + Extended Trims Trim estesi + + + + + + + Throttle Warning Avviso Motore + + + + + + + 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. @@ -10886,6 +15273,13 @@ Se l'opzione selezionata lo stick motore verrà rovesciato. Il minimo sarà + + + + + + + Reverse Throttle Stick Motore invertito @@ -11253,181 +15647,421 @@ Profile ID: [%1]; Radio ID: [%2] 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. @@ -11508,76 +16142,172 @@ Profile ID: [%1]; Radio ID: [%2] 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... @@ -11585,59 +16315,147 @@ The radio type specified in the selected profile is used by default. - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + ... ... - + + + + + + + + + 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 Documento - + + + + + + + + + Folder - + + + + + + + + + SD Path @@ -11666,7 +16484,15 @@ The default is configured in the chosen Radio Profile. SimulatorWidget - + + + + + + + + + Companion Simulator Simulatore di Companion @@ -11754,6 +16580,20 @@ The default is configured in the chosen Radio Profile. + + + + + + + + + + + + + + ... @@ -11793,6 +16633,13 @@ The default is configured in the chosen Radio Profile. StyleEditDialog + + + + + + + @@ -11801,21 +16648,49 @@ The default is configured in the chosen Radio Profile. + + + + + + + &Reset to default + + + + + + + &Cancel + + + + + + + &OK + + + + + + + This feature does not validate your changes and assumes you are familiar with CSS syntax for QT. @@ -12073,190 +16948,475 @@ Too many errors, giving up. Telemetry + + + + + + + A1 A1 + + + + + + + A2 A2 + + + + + + + RSSI RSSI + + + + + + + Alarm 1 Allarme 1 + + + + + + + + + + + + + + ---- ---- + + + + + + + + + + + + + + Yellow Giallo + + + + + + + + + + + + + + Orange Arancione + + + + + + + + + + + + + + Red Rosso + + + + + + + Alarm 2 Allarme 2 + + + + + + + Disable telemetry audio warnings + + + + + Source Sorgente + + + + + + + Center Silent + + + + + + + Altitude source Misura dell'altitudine + + + + + + + Volts source Misura della tensione + + + + + + + Top Bar Barra superiore + + + + + + + Serial Protocol Protocollo seriale + + + + + + + Sensors Sensori + + + + + + + Disable multi sensor handling + + + + + + + Volt source Misura della tensione + + + + + + + Current source Misura della corrente + + + + + + + Protocol Protocollo + + + + + + + None Nessuno + + + + + + + FrSky Sensor Hub FrSky Sensor Hub + + + + + + + Blades Pale dell'elica + + + + + + + Sink Max Max Discesa + + + + + + + Climb Max Max Salita + + + + + + + Sink Min Min Discesa + + + + + + + Climb Min Min Salita + + + + + + + Vario source Sorgente per il Vario + + + + + + + Vario limits Limiti per il Vario + + + + + + + Altimetry Altimetro + + + + + + + mAh mAh + + + + + + + A A + + + + + + + Various Varie + + + + + + + mAh count Conteggio mAh + + + + + + + FAS Offset Offset FAS + + + + + + + Persistent mAh mAh persistenti @@ -12265,107 +17425,289 @@ Too many errors, giving up. TelemetryAnalog + + + + + + + Unit Unità + + + + + + + Max Value Valore MAX + + + + + + + Alarm 1 Allarme 1 + + + + + + + + + + + + + + ---- ---- + + + + + + + + + + + + + + Yellow Giallo + + + + + + + + + + + + + + Orange Arancione + + + + + + + + + + + + + + Red Rosso + + + + + + + + + + + + + + < < + + + + + + + + + + + + + + > > + + + + + + + Alarm 2 Allarme 2 + + + + + + + Offset Spostamento + + + + + + + Volts (V) Voltaggio (V) + + + + + + + Amps (A) Corrente (A) + + + + + + + Speed (m/s or ft/s) Velocità (m/s o ft/s) + + + + + + + Raw (-) Grezza (-) + + + + + + + Speed (km/h or miles/h) Velocità (km/h o mph) + + + + + + + Meters (m or ft) Metri (m o ft) + + + + + + + Temp (°) Temperatura (°) + + + + + + + Fuel (%) Carburante (%) + + + + + + + mAmps (mA) Corrente (mA) @@ -12379,6 +17721,13 @@ Too many errors, giving up. TelemetryCustomScreen + + + + + + + Custom Screen Type Tipo schermo personalizzato @@ -12404,21 +17753,49 @@ Too many errors, giving up. + + + + + + + Min Min + + + + + + + Source Sorgente + + + + + + + Gauge Barra + + + + + + + Max Max @@ -12532,86 +17909,199 @@ Too many errors, giving up. TelemetrySensor + + + + + + + Form + + + + + + + Custom Personalizzato + + + + + + + Calculated Calcolato + + + + + + + Id + + + + + + + Instance Istanza + + + + Rx + + + + Mod. + + + + + + + Add Somma + + + + + + + Average Media + + + + + + + Min Min + + + + + + + Max Max + + + + + + + Multiply Moltiplica + + + + + + + Totalize Totalizza + + + + + + + Cell Cella + + + + + + + Consumption Consumo + + + + + + + Dist + + + + + + + Cells Sensor : Sensore celle : @@ -12624,191 +18114,506 @@ Too many errors, giving up. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --- --- + + + + + + + GPS Sensor : Sensore GPS : + + + + + + + Alt. Sensor : Altimetro : + + + + + + + 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 (-) Grezza (-) + + + + + + + RPM + + + + + + + Precision Precisione + + + + + + + Ratio + + + + + + + Blades Pale dell'elica + + + + + + + Offset Spostamento + + + + + + + Multiplier Moltiplicatore + + + + + + + Auto Offset + + + + + + + Filter Filtra + + + + + + + Positive Positivo + + + + + + + Logs Registra + + + + + + + Persistent Persistente @@ -12840,116 +18645,268 @@ Too many errors, giving up. TelemetrySimulator - + + + + + + + + + Telemetry Simulator Simulatore Telemetria - + + + + + + + + + VFAS - + + + + + + + + + RSSI RSSI - + + + + + + + + + A1 A1 - + + + + + + + + + A2 A2 - + + + + + + + + + Simulate Simula Modello - + + + + + + + + + Replay SD Log File - + + + + + + + + + Replay rate - + + + + + + + + + Load - + + + + + + + + + |> - + + + + + + + + + <| - + + + + + + + + + > > - + + + + + + + + + <- - + + + + + + + + + X X - + + + + + + + + + Row # Timestamp - + + + + + + + + + 1/5x 9X {1/5x?} - + + + + + + + + + 5x 9X {5x?} - + + + + + + + + + No Log File Currently Loaded - + + + + + + + + + RAS @@ -12957,21 +18914,61 @@ Timestamp - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + V / ratio - + + + + + + + + + Db - + + + + + + + + + RxBt @@ -12989,121 +18986,377 @@ Timestamp - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <html><head/><body><p><br/></p></body></html> - + + + + + + + + + Tmp1 - + + + + + + + + + A3 A3 - + + + + + + + + + A4 A4 - + + + + + + + + + Tmp2 - + + + + + + + + + Fuel - - + + + + + + + + + + + + + + + + + + °C - + + + + + + + + + ml - + + + + + + + + + % - - + + + + + + + + + + + + + + + + + + Meters - + + + + + + + + + Alt Alt - + + + + + + + + + VSpd - + + + + + + + + + m/s - + + + + + + + + + Fuel Qty - - + + + + + + + + + + + + + + + + + + km/h - + + + + + + + + + Hdg - + + + + + + + + + ASpd @@ -13111,135 +19364,335 @@ Timestamp - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + G - + + + + + + + + + GPS - + + + + + + + + + Lat,Lon (dec.deg.) - + + + + + + + + + AccX - + + + + + + + + + dd-MM-yyyy hh:mm:ss - + + + + + + + + + Date - + + + + + + + + + Amps - + + + + + + + + + AccZ - + + + + + + + + + GAlt - - + + + + + + + + + + + + + + + + + + Volts - + + + + + + + + + Cels - + + + + + + + + + Curr - + + + + + + + + + AccY - + + + + + + + + + GSpd - + + + + + + + + + Degrees - + + + + + + + + + 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 - + + + + + + + + + When enabled, sends any non-blank values as simulated telemetry data. Quando abilitato invia i valori non nulli come dati telemetrici simulati. @@ -13281,11 +19734,25 @@ hh:mm:ss Timer + + + + + + + Countdown Conto alla rovescia + + + + + + + Minute Call Avviso Minuto @@ -13369,26 +19836,61 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. Trainer + + + + + + + Form + + + + + + + Mode Modo + + + + + + + Input Ingresso + + + + + + + Weight Peso + + + + + + + Rud Dir @@ -13401,6 +19903,62 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Beeper volume 0 - Quiet. No beeps at all. @@ -13421,6 +19979,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + Off NO @@ -13429,6 +20015,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + += (Sum) += (Somma) @@ -13437,6 +20051,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + := (Replace) := (Sostituisci) @@ -13445,6 +20087,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn1 chn1 @@ -13453,6 +20123,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn2 chn2 @@ -13461,6 +20159,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn3 chn3 @@ -13469,21 +20195,70 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn4 chn4 + + + + + + + Ele Ele + + + + + + + Thr Mot + + + + + + + Ail Ale @@ -13492,7 +20267,15 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. TrainerSimulator - + + + + + + + + + Trainer simulator Simulatore allievo @@ -13917,6 +20700,13 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. burnConfigDialog + + + + + + + Location of AVRDUDE executable Eseguibile di AVRDUDE @@ -13925,17 +20715,59 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + The location of the AVRDUDE executable. Il percorso completo dell'eseguibile di AVRDUDE. + + + + + + + Programmer Configuration Configuration AVRDUDE / SAM-BA Configurazione del programmatore + + + + + + + DFU-Util Location Eseguibile di DFU-Util @@ -13943,6 +20775,27 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + Use this button to browse and look for the AVRDUDE executable file. Usa questo pulsante per cercare il file eseguibile di AVRDUDE. @@ -13950,16 +20803,51 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + Browse... Sfoglia... + + + + + + + Programmer Programmatore + + + + + + + Programmer used for communicating with the controller. Please consult the programmer's documentation and the AVRDUDE documentation to select the appropriate programmer. Il programmatore utilizzato per la comunicazione con la radio. @@ -13967,23 +20855,65 @@ Consultare la documentazione del programmatore e quella di AVRDUDE per seleziona + + + + + + + List all available programmers. Lista dei programmatori supportati. + + + + + + + List Available Elenco programmatori + + + + + + + + + + + + + + Extra arguments that will be passed to AVRDUDE on every call Parametri opzionali da passare a AVRDUDE ad ogni chiamata + + + + + + + + + + + + + + Extra arguments used in AVRDUDE. This can be used for providing extra information to AVRDUDE. @@ -13995,74 +20925,186 @@ utilizzatelo solo se sapete cosa state facendo. Non viene fatto alcun controllo + + + + + + + Extra Arguments Parametri opzionali + + + + + + + Show AVRDUDE help Mostra l'aiuto di AVRDUDE + + + + + + + Show Help Mostra aiuto + + + + + + + Communication port to the programmer. Porta di comunicazione per il programmatore. + + + + + + + MCU Processore + + + + + + + at91sam3s8-9xr at91sam3s8-9xr + + + + + + + Alternate device Dispositivo alternativo + + + + + + + Use advanced controls Usa controlli avanzati + + + + + + + + + + + + + + Port Porta + + + + + + + AVRDUDE Location Eseguibile di AVRDUDE + + + + + + + SAM-BA Location Eseguibile di SAM-BA + + + + + + + + + + + + + + Location of sam-ba executable Il percorso completo dell'eseguibile di sam-ba + + + + + + + ARM MCU + + + + + + + sam-ba serial port Porta seriale per sam-ba @@ -14109,12 +21151,40 @@ utilizzatelo solo se sapete cosa state facendo. Non viene fatto alcun controllo + + + + + + + + + + + + + + CPU of your TX CPU della vostra radio + + + + + + + + + + + + + + CPU present on your 9x radio Should be m64 for stock radios m2560 for v4.1 boards @@ -14127,85 +21197,197 @@ m2560 per le schede v4.1 joystickDialog - + + + + + + + + + Configure Joystick Configurazione Joystick - + + + + + + + + + Ch2 Ch2 - + + + + + + + + + Ch1 Ch1 - + + + + + + + + + Ch4 Ch4 - + + + + + + + + + Ch6 Ch6 - + + + + + + + + + Ch3 Ch3 - + + + + + + + + + Ch5 Ch5 - + + + + + + + + + Ch7 Ch7 - + + + + + + + + + Ch8 Ch8 - + + + + + + + + + Instructions Istruzioni - + + + + + + + + + Enable Abilita - + + + + + + + + + Cancel Annulla - + + + + + + + + + Back - + + + + + + + + + Start Inizio @@ -14216,7 +21398,15 @@ m2560 per le schede v4.1 - + + + + + + + + + Ok Ok diff --git a/companion/src/translations/companion_ja.ts b/companion/src/translations/companion_ja.ts index b09ea0080..0db7a42a8 100644 --- a/companion/src/translations/companion_ja.ts +++ b/companion/src/translations/companion_ja.ts @@ -97,12 +97,26 @@ AppPreferencesDialog + + + + + + + Edit Settings このダイアログはメインメニュー->設定 設定 + + + + + + + Radio Profile 様々な操作に対応する複数のうろファイルが存在する場合があります。 送信機プロファイル @@ -114,88 +128,256 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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: @@ -219,386 +401,913 @@ 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 ファームウェア ファイル名にバージョン番号を追加 + + + + + + + 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標準イメージを表示 + + + + + + + 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) + + + + + + + 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 シミュレータ 音量幅 @@ -679,6 +1388,31 @@ Mode 4: Images (%1) イメージ (%1) + + + + + Use releases (stable) + + + + + Use release candidates (testing) + + + + + + + Use nightly builds (unstable) + + + + + + Use releases and release candidates (testing) + + BinEepromFormat @@ -899,36 +1633,85 @@ Mode 4: ChecklistDialog + + + + + + + Edit Checklist チェックリスト編集 + + + + + + + Line nn, Col nn 行 nn, カラー nn + + + + + + + &Import... &インポート... + + + + + + + &Cancel &キャンセル + + + + + + + &OK &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 ファイル: 不明 @@ -1184,31 +1967,73 @@ If you have a settings backup file, you may import that instead. CompareDialog + + + + + + + Compare Models 機体モデルの比較 + + + + + + + To compare models, drag and drop them anywhere in this window. 機体モデルを比較するには、モデルをこのウィンドウ内の任意の場所にドラッグ&ドロップしてください。 + + + + + + + Close 閉じる + + + + + + + Style スタイル + + + + + + + Print 出力 + + + + + + + Print to file ファイルへ出力 @@ -1365,87 +2190,213 @@ If you have a settings backup file, you may import that instead. Curves + + + + + + + Curve name カーブ名 + + + + + + + Fixed X 等間隔 + + + + + + + Custom X カスタム + + + + + + + Lines 直線 + + + + + + + Smooth なめらか + + + + + + + + + + + + + + Curve type カーブタイプ + + + + + + + Curve Creator カーブ クリエイター + + + + + + + Coefficient カーブ係数 + + + + + + + Side 片側カーブ + + + + + + + Y at X=-100 カーブ左端の高さ + + + + + + + Both 両カーブ + + + + + + + x>0 右カーブ + + + + + + + x<0 左カーブ + + + + + + + Y at X=100 カーブ右端の高さ + + + + + + + Apply 適用 + + + + + + + Y at X=0 カーブ中心の高さ + + + + + + + Point size 点のサイズ @@ -1859,18 +2810,53 @@ If you have a settings backup file, you may import that instead. CustomizeSplashDialog + + + + + + + Transmitter Splash Screen Editor 送信機 起動イメージ エディタ + + + + + + + + + + + + + + Invert 反転 + + + + + + + + + + + + + + Open Splash Library イメージライブラリを開く @@ -1879,30 +2865,114 @@ If you have a settings backup file, you may import that instead. + + + + + + + + + + + + + + + + + + + + + + + + + + + + ... ... + + + + + + + + + + + + + + Load Profile プロファイル ロード + + + + + + + + + + + + + + Load FW FW ロード + + + + + + + + + + + + + + Load Pict 画像 ロード + + + + + + + + + + + + + + Save 保存 @@ -2018,48 +3088,48 @@ If you have a settings backup file, you may import that instead. フィールド %1 変換エラー - + Switch スイッチ - + Switch スイッチ - + cannot be exported on this board! このボードにエクスポートできません! - + Source 選択元 - + Source %1 cannot be exported on this board! このボードでは選択元 %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はこの送信機プロトコルを受け付けません @@ -2068,25 +3138,57 @@ If you have a settings backup file, you may import that instead. 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> <html><head/><body><p>フィルタを有効または無効にします。ボタンが有効にならない場合は、入力した正規表現に構文エラーがある可能性があります。</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> <html><head/><body><p>ここにフィルタテキストを入力してください。フィルタの使用方法の詳細は、help / info ボタンをクリックしてください。</p><p> @@ -2094,61 +3196,141 @@ To <b>remove a remembered entry</b> from the filter list, first cho - + + + + + + + + + Buffer: バッファ: - + + + + + + + + + Number of lines to keep in display. 画面へ表示し続ける行数を示します。 - + + + + + + + + + Filter &Help フィルタ &ヘルプ - + + + + + + + + + Show information about using the filter. フィルタの使用に関する情報を表示します。 - + + + + + + + + + Word &Wrap 単語 &重複 - + + + + + + + + + Toggle word wrapping on/off. 単語の重複チェックのON / OFFを切り替えます。 - + + + + + + + + + &Clear &消去 - + + + + + + + + + Clear the output window of all text. すべてのテキストの出力ウィンドウを消去します。 - + + + + + + + + + Enable &Filter 有効 &フィルタ - + + + + + + + + + Turn the filter on/off. フィルタをON / OFFします。 @@ -2167,6 +3349,13 @@ To <b>remove a remembered entry</b> from the filter list, first cho DownloadDialog + + + + + + + Downloading: ダウンロード中: @@ -2312,11 +3501,25 @@ To <b>remove a remembered entry</b> from the filter list, first cho ExpoDialog + + + + + + + Flight modes フライトモード + + + + + + + Input name 入力名 @@ -2324,26 +3527,75 @@ To <b>remove a remembered entry</b> from the filter list, first cho + + + + + + + + + + + + + + + + + + + + + GV GV + + + + + + + Source for the mixer. ミキサー選択元. + + + + + + + Weight ウェイト + + + + + + + Switch スイッチ + + + + + + + Switch used to enable the line. If blank then the input is considered to be "ON" all the time. この設定を有効にするために使用されるスイッチです。 @@ -2351,71 +3603,169 @@ If blank then the input is considered to be "ON" all the time. + + + + + + + Stick Side スティック端 + + + + + + + NEG リバース + + + + + + + POS ノーマル + + + + + + + ALL すべて + + + + + + + Scale スケール + + + + + + + Include Trim トリム含 + + + + + + + No いいえ + + + + + + + Yes はい + + + + + + + Curve カーブ + + + + + + + Curve applied to the source. 選択元に適用されたカーブ. + + + + + + + Source 選択元 + + + + + + + Line name Expoライン名 + + + + + + + Offset オフセット + + + + + + + The source for the mixer ミキサー選択元 @@ -3063,31 +4413,73 @@ Blank means include all. ?, *, and [...] wildcards accepted. FirmwarePreferencesDialog + + + + + + + Downloads ダウンロード + + + + + + + Check for updates アップデートのチェック + + + + + + + Firmware ファームウェア + + + + + + + Download firmware ダウンロード ファームウェア + + + + + + + Download SD contents ダウンロード SDカード + + + + + + + Latest Download 最新版のダウンロード @@ -3129,67 +4521,158 @@ Blank means include all. ?, *, and [...] wildcards accepted. FlashEEpromDialog + + + + + + + Write Models and Settings to Radio モデル・設定を書き込み + + + + + + + Load... ロード... + + + + + + + Current Profile 現在のプロファイル + + + + + + + Allows Companion to write to older version of the firmware Companionが古いバージョンのファームウェアでの書き込みを許可します + + + + + + + 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> <html><head/><body><p>現在のモデルを送信機に書き込む前に、EEPROM情報のコピー(日付)をCompanion設定指定したバックアップフォルダに保存します<p></body></html> + + + + + + + Backup before Write 書き込み前にバックアップを取る + + + + + + + <html><head/><body><p>Modify calibration parameters using settings from current profile</p></body></html> 現在のプロファイルの設定を使用して校正情報を修正します + + + + + + + Patch calibration setting from profile プロファイルからパッチ適用の有無を設定 + + + + + + + <html><head/><body><p>Modify HW parameters using settings from current profile</p></body></html> <html><head/><body><p>現在のプロファイルの設定を使用してハードウェアパラメータを変更します</p></body></html> + + + + + + + Patch HW settings from profile プロファイルからHWパラメータを変更 + + + + + + + Cancel キャンセル + + + + + + + Write to TX 書き込み @@ -3247,71 +4730,169 @@ Blank means include all. ?, *, and [...] wildcards accepted. FlashFirmwareDialog + + + + + + + Flash Firmware ファームウェアの書き込み + + + + + + + Load... ロード... + + + + + + + Date & Time 日付・時間 + + + + + + + Variant リビジョン + + + + + + + Version バージョン + + + + + + + Use profile start screen profile起動画面を使用 + + + + + + + Use firmware start screen firmware起動画面を使用 + + + + + + + Use library start screen library起動画面を使用 + + + + + + + Use another start screen 別の起動画面を使用 + + + + + + + Allows Companion to write to older version of the firmware Companionが古いバージョンのファームウェアを適用することを許可します + + + + + + + Check Hardware compatibility ハードウェア互換性を確認する + + + + + + + Backup and restore Models and Settings バックアップとモデル復元と設定 + + + + + + + Cancel キャンセル + + + + + + + Write to TX 書き込み @@ -3511,21 +5092,49 @@ You are currently using: FlightMode + + + + + + + Fade In フェードイン + + + + + + + Fade Out フェードアウト + + + + + + + Name 名称 + + + + + + + Switch スイッチ @@ -3715,11 +5324,25 @@ You are currently using: FusesDialog + + + + + + + Fuses フューズ + + + + + + + <!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,11 +5372,25 @@ p, li { white-space: pre-wrap; } + + + + + + + Read Fuses ヒューズの読み込み + + + + + + + <!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; } @@ -3787,6 +5424,13 @@ p, li { white-space: pre-wrap; } + + + + + + + Reset Fuses EEPROM - PROTECT リセット フューズ @@ -3794,6 +5438,13 @@ EEPROM - 保護 + + + + + + + <!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; } @@ -3827,6 +5478,13 @@ p, li { white-space: pre-wrap; } + + + + + + + Reset Fuses EEPROM - DELETE リセット フューズ @@ -3834,6 +5492,13 @@ EEPROM - 削除 + + + + + + + <!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; } @@ -3910,21 +5575,49 @@ p, li { white-space: pre-wrap; } GeneralEdit + + + + + + + Radio settings 送信機設定 + + + + + + + Retrieve calib. and hw settings from profile 校正情報を取得し、ProfileからHWを設定 + + + + + + + Store calib. and hw settings in selected profile 校正情報を保存し、選択したProfileのHWを設定 + + + + + + + General settings used throught the transmitter. These will be relevant for all models in the same EEPROM. 送信機全体で使用される一般設定。 @@ -3993,122 +5686,297 @@ These will be relevant for all models in the same EEPROM. GeneralSetup + + + + + + + Form フォーム + + + + + + + Readonly Unlock 読取専用 解除 + + + + + + + SC SC + + + + + + + SE SE + + + + + + + SA SA + + + + + + + SF SF + + + + + + + SH SH + + + + + + + SD SD + + + + + + + SB SB + + + + + + + SG SG + + + + + + + Stick reverse スティック リバース + + + + + + + Country Code 地域 + + + + + + + If you enable FAI, only RSSI and RxBt sensors will keep working. This function cannot be disabled by the radio. FAIを有効にすると、RSSIとRxBtセンサーのみが機能し続けます。この機能を送信機側で無効にすることはできません。 + + + + + + + FAI Mode FAIモード + + + + + + + Automatically adjust the radio's clock if a GPS is connected to telemetry. GPSがテレメトリーに接続されている場合、自動的に送信機側の内蔵時計を調整します。 + + + + + + + Adjust RTC 時計調整 + + + + + + + Speaker Volume スピーカー音量 + + + + + + + + + + + + + + Hz Hz + + + + + + + Vario pitch at max バリオピッチ 最大 + + + + + + + Backlight Switch バックライトスイッチ + + + + + + + Color 1 カラー 1 + + + + + + + Color 2 カラー 2 + + + + + + + Sound Mode サウンドモード + + + + + + + If this value is not 0, any keypress will turn on the backlight and turn it off after the specified number of seconds. この値が0以外の場合、キーを押すとバックライトが点灯し、指定秒数を経過すると消灯します。 @@ -4116,87 +5984,221 @@ These will be relevant for all models in the same EEPROM. + + + + + + + + + + + + + + + sec 秒 + + + + + + + Backlight color バックライトカラー + + + + + + + Speaker Pitch (spkr only) 再生ピッチ (対応機のみ) + + + + + + + Beeper ビープ + + + + + + + Speaker スピーカー + + + + + + + BeeperVoice ビープ音声 + + + + + + + SpeakerVoice スピーカー音声 + + + + + + + Beep volume ビープ音量 + + + + + + + Wav volume WAV音量 + + + + + + + Vario volume バリオVOL + + + + + + + Background volume バックグランドVOL + + + + + + + + + + + + + + ms ms + + + + + + + Backlight flash on alarm アラーム時ライト点滅 + + + + + + + Vario pitch at zero バリオピッチ ゼロ + + + + + + + Vario repeat at zero バリオリピート ゼロ + + + + + + + Backlight Auto OFF after バックライト 自動消灯 + + + + + + + This is the switch selectrion for turning on the backlight (if installed). @@ -4207,6 +6209,20 @@ These will be relevant for all models in the same EEPROM. + + + + + + + + + + + + + + <!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; } @@ -4222,41 +6238,97 @@ p, li { white-space: pre-wrap; } + + + + + + + RotEnc Navigation Rot Enc ナビゲーション + + + + + + + Backlight Brightness バックライト 明るさ + + + + + + + America アメリカ + + + + + + + Japan 日本 + + + + + + + Europe ヨーロッパ + + + + + + + Voice Language 音声言語 + + + + + + + Timeshift from UTC UTC 時差 + + + + + + + Backlight OFF Brightness バックライトOFF 明るさ @@ -4264,6 +6336,27 @@ p, li { white-space: pre-wrap; } + + + + + + + + + + + + + + + + + + + + + <!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; } @@ -4289,11 +6382,25 @@ p, li { white-space: pre-wrap; } + + + + + + + RSSI Poweroff Warning RSSI 信号切断 警告 + + + + + + + Beeper volume 0 - Quiet. No beeps at all. @@ -4312,214 +6419,561 @@ p, li { white-space: pre-wrap; } + + + + + + + + + + + + + + Quiet 消音 + + + + + + + Alarms Only アラームのみ + + + + + + + + + + + + + + No Keys キーなし + + + + + + + + + + + + + + All すべて + + + + + + + Beeper Mode ビープ モード + + + + + + + Jack Mode Jackモード + + + + + + + Audio 音声 + + + + + + + Trainer トレーナー + + + + + + + + + + + + + + X-Short より短い + + + + + + + + + + + + + + Short 短い + + + + + + + + + + + + + + Normal 通常 + + + + + + + + + + + + + + Long 長い + + + + + + + + + + + + + + X-Long より長い + + + + + + + Beeper Length ビープ音の長さ + + + + + + + Haptic Mode タッチパネルモード + + + + + + + Measurement Units 計量単位 + + + + + + + Play Delay (switch mid position) 遅延動作 (スイッチ中央) + + + + + + + NMEA + + + + + + + 4800 Baud + + + + + + + 9600 Baud + + + + + + + 14400 Baud + + + + + + + 19200 Baud + + + + + + + 38400 Baud + + + + + + + 57600 Baud + + + + + + + 76800 Baud + + + + + + + 115200 Baud + + + + + + + + + + + + + + Show splash screen on startup 起動時、起動イメージ表示 + + + + Power On Delay 起動時間 + + + + + + + --- --- + + + + + + + 2s 2秒 + + + + + + + 3s 3秒 + + + + + + + 4s 4秒 + + + + + + + 6s 6秒 + + + + + + + 8s 8秒 + + + + + + + 10s 10秒 + + + + + + + 15s 15秒 + + + + + + + If not zero will sound beeps if the transmitter has been left without inputs for the specified number of minutes. 指定された時間(分)入力がないまま送信機が放置されると、ゼロでない場合はビープ音が鳴ります。 + + + + + + + min 分 + + + + + + + Standard 標準 + + + + + + + Optrex オプトレックス(京セラ) + + + + + + + Battery warning voltage. This is the threashhold where the battery warning sounds. @@ -4530,247 +6984,588 @@ Acceptable values are 5v..10v + + + + + + + Only Alarms アラームのみ + + + + + + + MAVLink Baud Rate MAVLink ボーレート + + + + + + + Haptic Length タッチパネル長押し + + + + + + + Battery Warning バッテリー警告 + + + + + + + "No Sound" Warning 【無音】警告 + + + + + + + LCD Display Type 液晶ディスプレイタイプ + + + + + + + Haptic Strength タッチパネル感度 + + + + + + + Battery Meter Range バッテリーメーター範囲 + + + + + + + Contrast コントラスト + + + + + + + Show Splash Screen on Startup 起動時、起動イメージ表示 + + + + + + + Low EEPROM Warning EEPROM残量警告 + + + + + + + Inactivity Timer 非アクティブタイマー + + + + + + + Min 最小 + + + + + + + + + + + + + + v v + + + + + + + Max 最大 + + + + + + + GPS Coordinates GPS座標 + + + + + + + Default Channel Order 初期チャンネルマップ + + + + + + + Metric メートル法 + + + + + + + Imperial ヤード・ポンド法 + + + + + + + Stick Mode スティックモード + + + + + + + <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> + + + + Owner Registration ID オーナー登録ID + + + + aaaaaaAA + + + + + + + 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] + + + + Power Off Delay 終了時間 + + + + + + + Mode selection: Mode 1: @@ -4812,55 +7607,142 @@ 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 (左:スロットル・エルロン 右:エレベーター・ラダー) + + + + + + + DMS + + + + + + + USB Mode USBモード + + + + + + + + + + + + + + Ask on Connect 接続毎に確認 + + + + + + + Joystick (HID) ジョイスティック (HID) + + + + + + + USB Mass Storage USBストレージ + + + + + + + USB Serial (CDC) USBシリアル (CDC) + + + Power On Speed + + + + + Power Off Speed + + GeneralSetupPanel @@ -5016,251 +7898,595 @@ Are you sure ? Hardware + + + + + + + Form フォーム + + + + + + + SQ SQ + + + + + + + SR SR + + + + + + + LS2 LS2 + + + + + + + SP SP + + + + + + + SO SO + + + + + + + S4 S4 + + + + + + + RS RS + + + + + + + SB SB + + + + + + + PPM 2 PPM 2 + + + Antenna アンテナ + + + + + S5 S5 + + + + + + + OFF OFF + + + + + + + S-Port Mirror S-Port ミラー + + + + + + + Telemetry テレメトリー + + + + + + + SBUS Trainer SBUS トレーナー + + + + + + + Debug デバッグ + + + + + + + Rud ラダー + + + + + + + PPM 3 PPM 3 + + + + + + + S1 S1 + + + + + + + S2 S2 + + + + + + + S3 S3 + + + + + + + PPM 1 PPM 1 + + + + + + + Serial Port シリアルポート + + + + + + + v v + + + + + + + PPM Multiplier PPM 乗算 + + + + + + + Current Offset 現在のオフセット + + + + + + + PPM 4 PPM 4 + + + + + + + SA SA + + + + + + + Ele エレベーター + + + + + + + Ail エルロン + + + + + + + Thr スロットル + + + + + + + SC SC + + + + + + + LS LS + + + + + + + SD SD + + + + + + + Battery Offset バッテリーオフセット + + + + + + + SE SE + + + + + + + SF SF + + + + + + + SG SG + + + + + + + SH SH + + + + + + + SI SI + + + + + + + SJ SJ + + + + + + + SK SK + + + + + + + SL SL + + + + + + + SM SM + + + + + + + SN SN + + + + + + + RS2 RS2 + + + + + + + Bluetooth Bluetooth + + + + + + + ADC Filter ADCフィルタ + + + + + + + Device Name: デバイス名: @@ -5359,71 +8585,169 @@ Are you sure ? Heli + + + + + + + Off OFF + + + + + + + 120 120 + + + + + + + 120X 120X + + + + + + + 140 140 + + + + + + + 90 90 + + + + + + + Invert Elevator ELE リバース + + + + + + + Invert Aileron AIL リバース + + + + + + + Invert Collective COL リバース + + + + + + + Long. cyc 長周期 + + + + + + + Invert リバース + + + + + + + Swash Ring Swashリング + + + + + + + Swash Type Swashタイプ + + + + + + + Lateral cyc 側面周期 + + + + + + + Collective コレクティブ @@ -5816,46 +9140,109 @@ Are you sure ? LogsDialog + + + + + + + Companion Log Viewer Companion ログビューワ + + + + + + + Fly sessions 飛行時間 + + + + + + + Save session CSV CSVで保存 + + + + + + + Zoom 拡大 + + + + + + + X X軸 + + + + + + + Y Y軸 + + + + + + + Reset リセット + + + + + + + Filename ファイル名 + + + + + + + Open LogFile ログファイルを開く @@ -7354,26 +10741,59 @@ Do you want to save your changes? MixerDialog + + + + + Dialog ダイアログ + + + + + + + Delay Delay: 遅延 + + + + + + + Slow Slow: ゆっくり + + + + + + + Up 上 + + + + + + + Down 下 @@ -7382,6 +10802,34 @@ Do you want to save your changes? + + + + + + + + + + + + + + + + + + + + + + + + + + + + <!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; } @@ -7407,61 +10855,145 @@ p, li { white-space: pre-wrap; } + + + + + + + Include Trim トリム含 + + + + + + + Offset オフセット + + + + + + + Weight ウェイト + + + + + + + Name 名称 + + + + + + + Source 選択元 + + + + + + + Multiplex 複数ミキサー + + + + + + + Warning 警告 + + + + + + + The curve used by the mix ミックスで使用するカーブ + + + + + + + Include DR/Expo DR/Expo含 + + + + + + + Flight modes フライトモード + + + + + + + Switch スイッチ + + + + + + + Mixer warning. Setting this value will cause a beep to be emmitted when this value is active. ミキサー警告 @@ -7469,31 +11001,73 @@ Setting this value will cause a beep to be emmitted when this value is active. + + + + + + + OFF + + + + + + + 1 Beep 1 ビープ + + + + + + + 2 Beep 2 ビープ + + + + + + + 3 Beep 3 ビープ + + + + + + + No いいえ + + + + + + + Yes はい @@ -7501,6 +11075,27 @@ Setting this value will cause a beep to be emmitted when this value is active. + + + + + + + + + + + + + + + + + + + + + GV @@ -7509,11 +11104,46 @@ Setting this value will cause a beep to be emmitted when this value is active. + + + + + + + + + + + + + + + + + + + + + + + + + + + + The source for the mixer ミキサー選択元 + + + + + + + Multiplexer This determines how mixer values are added. @@ -7531,26 +11161,61 @@ This determines how mixer values are added. + + + + + + + ADD 加算 + + + + + + + MULTIPLY 乗算 + + + + + + + REPLACE 置換 + + + + + + + Curve カーブ + + + + + + + Switch used by the mix. If blank then the mix is considered to be "ON" all the time. ミックスで使用されるスイッチ @@ -7581,6 +11246,12 @@ If blank then the mix is considered to be "ON" all the time. Invert All すべてリバース + + + + FullScreenDialog + + MixersListWidget @@ -7754,11 +11425,23 @@ If blank then the mix is considered to be "ON" all the time. ModelEdit + + + + + Dialog ダイアログ + + + + + + + Simulate シミュレート @@ -7812,6 +11495,12 @@ If blank then the mix is considered to be "ON" all the time. Telemetry テレメトリー + + + + FullScreenDialog + + ModelPrinter @@ -8630,41 +12319,94 @@ If blank then the mix is considered to be "ON" all the time. Module + + + + + + + Start スタート + + + + + + + CH + + + + + + + Receiver No. 受信機 No. + + + + + + + Polarity 極性 + + + + + + + Negative リバース + + + + + + + Positive ノーマル + + + + + + + RF Output Power 送信出力 + + + + Receiver 1 受信機 1 @@ -8672,191 +12414,462 @@ If blank then the mix is considered to be "ON" all the time. + + + + + + + + + + + + X X + + + + Receiver 2 受信機 2 + + + + Receiver 3 受信機 3 + + + + + + + Bind on startup 起動時バインド + + + + + + + Low Power 低パワー + + + + + + + WARNING: changing RF Output Power needs RE-BIND 警告: 送信出力を変更するには再バインドが必要です + + + + + + + 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ファームウェアが必要です! + + + + + + + Failsafe Positions フェイルセーフポジション + + + + + + + Show values in: 値の表示: + + + + + + + % abbreviation for percent + + + + + + + μs abbreviation for microseconds + + + + + + Internal + 内部 + + + + + + + Ext. + Int. + + ModuleData @@ -9596,21 +13609,49 @@ If blank then the mix is considered to be "ON" all the time. PrintDialog + + + + + + + Close 閉じる + + + + + + + Style スタイル + + + + + + + Print 出力 + + + + + + + Print to file ファイルへ出力 @@ -9634,11 +13675,25 @@ If blank then the mix is considered to be "ON" all the time. ProgressDialog + + + + + + + Flash Firmware ファームウェアの書き込み + + + + + + + Close 閉じる @@ -9653,6 +13708,13 @@ If blank then the mix is considered to be "ON" all the time. ProgressWidget + + + + + + + Show Details 詳細を表示 @@ -9806,17 +13868,38 @@ If blank then the mix is considered to be "ON" all the time. RadioNotFoundDialog + + + + + + + No Radio Found 送信機が見つかりません + + + + + + + <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>送信機が見つかりませんでした!</p><p>電源を入れるときは、下部トリムボタンを中央に押し上げてください。</p><p>次に、USBケーブルを接続します。</p><p><span style=" font-family:'arial,sans-serif'; font-size:13px; font-style:italic; color:#222222; background-color:#ffffff;">注: ファームウェアが2.0にアップグレードされていないTaranisを使用している場合、このバージョンのCompanionは動作しません。</span></p></body></html> + + + + + + + OK OK @@ -9825,43 +13908,99 @@ If blank then the mix is considered to be "ON" all the time. RadioOutputsWidget - + + + + + + + + + Form フォーム - + + + + + + + + + View: ビュー: - + + + + + + + + + Logical Switches 論理スイッチ - + + + + + + + + + Global Variables グローバル変数 - + + + + + + + + + Channel Outputs チャンネルオプション - + + + + + + + + + Mix Outputs ミキサー出力 - + + + + + + + + + L o g @@ -9874,7 +14013,15 @@ W - + + + + + + + + + G l o @@ -9887,7 +14034,15 @@ l - + + + + + + + + + C h a @@ -9903,7 +14058,15 @@ H - + + + + + + + + + M i x @@ -10747,121 +14910,289 @@ X Setup + + + + + + + Timer 1 タイマー 1 + + + + + + + Top LCD Timer 液晶タイマー + + + + + + + Model Image モデルイメージ + + + + + + + Warnings 警告 + + + + + + + Switch Warnings スイッチ警告 + + + + + + + Pot Warnings ダイヤル警告 + + + + + + + OFF OFF + + + + + + + Manual 手動 + + + + + + + Auto 自動 + + + + + + + Model 機体モデル + + + + + + + Center beep センター ビープ + + + + + + + Display Checklist チェックリスト表示 + + + + + + + Never なし + + + + + + + On change 変更 + + + + + + + Always 常に + + + + + + + Throttle Trim Idle Only THRトリムアイドル + + + + + + + Global Functions グローバルファンクション + + + + + + + Throttle Warning スロットル警告 + + + + + + + Exponential エクスポ + + + + + + + Extra Fine 極細 + + + + + + + Fine 細かめ + + + + + + + Medium 中間 + + + + + + + Coarse 粗め + + + + + + + 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. @@ -10871,46 +15202,109 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi + + + + + + + Reverse Throttle スロットル リバース + + + + + + + Edit Checklist... チェックリストの編集... + + + + + + + Extended Trims 拡張トリム + + + + + + + Extended Limits 拡張制限 + + + + + + + Throttle Source スロットル値 + + + + + + + Trim Step トリム間隔 + + + + + + + Trims Display トリム表示 + + + + + + + Timer 2 タイマー 2 + + + + + + + Timer 3 タイマー 3 @@ -11283,181 +15677,421 @@ Profile ID: [%1]; Radio ID: [%2] SimulatorMainWindow - + + + + + + + + + OpenTx Simulator OpenTX シミュレータ - + + + + + + + + + View ビュー - + + + + + + + + + Radio Window 送信機ウィンドウ - + + + + + + + + + Reload... 再読み込み... - + + + + + + + + + Tools ツール - + + + + + + + + + Toolbar ツールバー - + + + + + + + + + Reload Lua Scripts Luaスクリプトを再読み込み - + + + + + + + + + Reload the Lua environment on the simulated radio. 送信機シミュレータでLua環境を再読み込みします。 - + + + + + + + + + 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. 送信機ウィジェットの高さを固定サイズに設定します。 @@ -11540,25 +16174,57 @@ Profile ID: [%1]; Radio ID: [%2] SimulatorStartupDialog - + + + + + + + + + OpenTX Simulator - Startup Options OpenTX シミュレータ - スタートアップオプション - + + + + + + + + + Simulator Startup Options: シミュレータ スタートアップオプション: - + + + + + + + + + Radio Profile: 送信機プロファイル: - + + + + + + + + + Existing radio profiles are shown here.<br /> Create or edit profiles using the Companion application. 既存の送信機プロファイルはこちらに表示されます。<br /> @@ -11566,13 +16232,29 @@ Companionアプリケーションを使用してプロファイルを作成ま - + + + + + + + + + Radio Type: 送信機タイプ: - + + + + + + + + + Existing radio simulators are shown here.<br /> The radio type specified in the selected profile is used by default. 既存の送信機シミュレータをここに示します。<br /> @@ -11580,31 +16262,71 @@ The radio type specified in the selected profile is used by default. - + + + + + + + + + Data Source: データ元: - + + + + + + + + + Data File: データファイル: - + + + + + + + + + Data Folder: データフォルダ: - + + + + + + + + + SD Image Path: 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! 使用する送信機データ(.bin / .eeprom / .otx)画像ファイルです。必要に応じて、デフォルト画像を含む新しいファイルが作成されます。<br /> @@ -11612,7 +16334,15 @@ The radio type specified in the selected profile is used by default. - + + + + + + + + + Select data file... データファイル選択... @@ -11620,15 +16350,47 @@ The radio type specified in the selected profile is used by default. - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + ... ... - + + + + + + + + + Directory containing RADIO and MODELS folders to use.<br /> New folder(s) with default radio/model will be created here if necessary. 使用する送信機および機体モデルフォルダを含むディレクトリです。<br /> @@ -11636,13 +16398,29 @@ 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. 使用するSDカードイメージを含むディレクトリです。<br/> @@ -11650,31 +16428,71 @@ The default is configured in the chosen Radio Profile. - + + + + + + + + + Select SD card image folder... SDカードイメージフォルダ選択... - + + + + + + + + + Select which of the data sources (File/Folder/SD Card) you would like to start the simulator with. シミュレータを起動するデータ元 (ファイル/フォルダ/ SDカード) を選択します。 - + + + + + + + + + File ファイル - + + + + + + + + + Folder フォルダ - + + + + + + + + + SD Path SDパス @@ -11703,7 +16521,15 @@ The default is configured in the chosen Radio Profile. SimulatorWidget - + + + + + + + + + Companion Simulator Companion シミュレータ @@ -11791,6 +16617,20 @@ The default is configured in the chosen Radio Profile. + + + + + + + + + + + + + + ... ... @@ -11830,6 +16670,13 @@ The default is configured in the chosen Radio Profile. StyleEditDialog + + + + + + + @@ -11838,21 +16685,49 @@ The default is configured in the chosen Radio Profile. + + + + + + + &Reset to default &初期値へリセット + + + + + + + &Cancel &キャンセル + + + + + + + &OK &OK + + + + + + + This feature does not validate your changes and assumes you are familiar with CSS syntax for QT. この機能は変更を検証するものではなく、QTのCSS構文に精通していることを前提としています。 @@ -12116,190 +16991,475 @@ Too many errors, giving up. Telemetry + + + + + + + Protocol プロトコル + + + + + + + + + + + + + + ---- + + + + + + + + + + + + + + Yellow 黄色 + + + + + + + + + + + + + + Orange オレンジ + + + + + + + + + + + + + + Red 赤色 + + + + + + + Alarm 1 アラーム 1 + + + + + + + Alarm 2 アラーム 2 + + + + + + + RSSI RSSI + + + + + + + Disable telemetry audio warnings テレメトリー音声警告を無効 + + + + + Source 信号元 + + + + + + + A1 + + + + + + + A2 + + + + + + + Sink Max Sink 最大 + + + + + + + Climb Max クライム 最大 + + + + + + + Sink Min Sink 最小 + + + + + + + Climb Min クライム 最小 + + + + + + + Center Silent センター サイレント + + + + + + + Vario limits バリオ リミット値 + + + + + + + Vario source バリオ 元値 + + + + + + + Altimetry 高度計 + + + + + + + Altitude source 高度 元値 + + + + + + + Volts source ボルト 元値 + + + + + + + Top Bar トップバー + + + + + + + Volt source ボルト 元値 + + + + + + + Current source 現在の元値 + + + + + + + Blades ブレード + + + + + + + mAh count mAh カウント + + + + + + + mAh + + + + + + + A + + + + + + + FAS Offset FAS オフセット + + + + + + + Persistent mAh 持続 mAh + + + + + + + Various その他の設定 + + + + + + + Serial Protocol シリアルプロトコル + + + + + + + None なし + + + + + + + FrSky Sensor Hub FrSky センサーハブ + + + + + + + Sensors センサー + + + + + + + Disable multi sensor handling マルチセンサーハンドリング無効 @@ -12308,107 +17468,289 @@ Too many errors, giving up. TelemetryAnalog + + + + + + + Unit ユニット + + + + + + + Max Value 最大値 + + + + + + + Alarm 1 アラーム 1 + + + + + + + + + + + + + + ---- + + + + + + + + + + + + + + Yellow 黄色 + + + + + + + + + + + + + + Orange オレンジ + + + + + + + + + + + + + + Red 赤色 + + + + + + + + + + + + + + < + + + + + + + + + + + + + + > + + + + + + + Alarm 2 アラーム 2 + + + + + + + Offset オフセット + + + + + + + Volts (V) ボルト (V) + + + + + + + Amps (A) アンペア (A) + + + + + + + Speed (m/s or ft/s) 速度 (m/s or ft/s) + + + + + + + Raw (-) + + + + + + + Speed (km/h or miles/h) 速度 (km/h or miles/h) + + + + + + + Meters (m or ft) メートル (m or ft) + + + + + + + Temp (°) 温度 (°) + + + + + + + Fuel (%) 燃料 (%) + + + + + + + mAmps (mA) ミリアンペア (mA) @@ -12422,26 +17764,61 @@ Too many errors, giving up. TelemetryCustomScreen + + + + + + + Custom Screen Type カスタム画面タイプ + + + + + + + Min 最小 + + + + + + + Source 選択元 + + + + + + + Gauge ゲージ + + + + + + + Max 最大 @@ -12575,86 +17952,199 @@ Too many errors, giving up. TelemetrySensor + + + + + + + Form フォーム + + + + + + + Custom カスタム + + + + + + + Calculated 計算値 + + + + + + + Id ID + + + + + + + Instance インスタンス + + + + Rx 受信 + + + + Mod. モジュール. + + + + + + + Add 追加 + + + + + + + Average 平均 + + + + + + + Min 最小 + + + + + + + Max 最大 + + + + + + + Multiply 乗算 + + + + + + + Totalize 合計 + + + + + + + Cell セル + + + + + + + Consumption 消費 + + + + + + + Dist 距離 + + + + + + + Cells Sensor : セル センサー : @@ -12667,191 +18157,506 @@ Too many errors, giving up. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --- --- + + + + + + + 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. + + + + + + + Precision 精度 + + + + + + + Ratio レシオ + + + + + + + Blades ブレード + + + + + + + Offset オフセット + + + + + + + Multiplier 乗算 + + + + + + + Auto Offset 自動オフセット + + + + + + + Filter フィルタ + + + + + + + Persistent 持続 + + + + + + + Positive ノーマル + + + + + + + Logs ログ @@ -12883,73 +18688,169 @@ Too many errors, giving up. TelemetrySimulator - + + + + + + + + + Telemetry Simulator テレメトリー シミュレータ - + + + + + + + + + When enabled, sends any non-blank values as simulated telemetry data. 有効にすると、空白以外の値をテレメトリーデータとしてシミュレートします。 - + + + + + + + + + Simulate シミュレート - + + + + + + + + + Replay SD Log File SDログファイルを再生 - + + + + + + + + + Replay rate 再生レート - + + + + + + + + + Load ロード - + + + + + + + + + |> - + + + + + + + + + <| - + + + + + + + + + > - + + + + + + + + + <- - + + + + + + + + + X - + + + + + + + + + Row # Timestamp Row # @@ -12957,31 +18858,71 @@ Timestamp - + + + + + + + + + 1/5x 1/5x - + + + + + + + + + 5x 5x - + + + + + + + + + No Log File Currently Loaded 現在ロードされているログファイルなし - + + + + + + + + + RAS 相対アンテナ - + + + + + + + + + A2 @@ -12989,27 +18930,75 @@ Timestamp - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + V / ratio V/レシオ - + + + + + + + + + Db - + + + + + + + + + RxBt 受信機Batt - + + + + + + + + + A1 @@ -13027,141 +19016,429 @@ Timestamp - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <html><head/><body><p><br/></p></body></html> - + + + + + + + + + Tmp1 温度1 - + + + + + + + + + A3 - + + + + + + + + + A4 - + + + + + + + + + RSSI RSSI - + + + + + + + + + Tmp2 温度2 - - + + + + + + + + + + + + + + + + + + RPM RPM - + + + + + + + + + Fuel 燃料 - - + + + + + + + + + + + + + + + + + + °C - + + + + + + + + + ml - + + + + + + + + + % - - + + + + + + + + + + + + + + + + + + Meters メートル - + + + + + + + + + Alt 高度 - + + + + + + + + + VSpd 昇降計 - + + + + + + + + + m/s - + + + + + + + + + Fuel Qty 燃料油量 - - + + + + + + + + + + + + + + + + + + km/h - + + + + + + + + + VFAS - + + + + + + + + + Hdg ヘッディング - + + + + + + + + + ASpd 対気速度 @@ -13169,121 +19446,297 @@ Timestamp - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + G - + + + + + + + + + GPS GPS - + + + + + + + + + Lat,Lon (dec.deg.) - + + + + + + + + + AccX 加速度X - + + + + + + + + + dd-MM-yyyy hh:mm:ss - + + + + + + + + + Date 日時 - + + + + + + + + + Amps アンペア - + + + + + + + + + AccZ 加速度Z - + + + + + + + + + GAlt GPS高度 - - + + + + + + + + + + + + + + + + + + Volts ボルト - + + + + + + + + + Cels セル - + + + + + + + + + Curr 電流計 - + + + + + + + + + AccY 加速度Y - + + + + + + + + + GSpd GPS速度 - + + + + + + + + + Degrees 角度(°) - + + + + + + + + + Setting RSSI to zero simulates telemetry and radio link loss. RSSIをゼロに設定すると、テレメトリーと送信機リンク損失がシミュレートされます。 - + + + + + + + + + Set RSSI to zero when paused. 一時停止したらRSSIをゼロに設定します。 - + + + + + + + + + Stop sending telemetry data when the Telemetry Simulator window is hidden. テレメトリーシミュレータ ウィンドウが非表示になったらテレメトリーデータの送信を停止します。 - + + + + + + + + + Pause simulation when hidden. 非表示になったらシミュレーションを一時停止します。 @@ -13325,11 +19778,25 @@ hh:mm:ss Timer + + + + + + + Countdown カウントダウン + + + + + + + Minute Call 音声時報 @@ -13414,26 +19881,61 @@ CTRL+スクロールまたはPAGE UP/DOWNキーを押すと、大きなステ Trainer + + + + + + + Form フォーム + + + + + + + Mode モード + + + + + + + Input 入力 + + + + + + + Weight ウェイト + + + + + + + Rud ラダー @@ -13446,6 +19948,62 @@ CTRL+スクロールまたはPAGE UP/DOWNキーを押すと、大きなステ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Beeper volume 0 - Quiet. No beeps at all. @@ -13466,6 +20024,34 @@ CTRL+スクロールまたはPAGE UP/DOWNキーを押すと、大きなステ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Off OFF @@ -13474,6 +20060,34 @@ CTRL+スクロールまたはPAGE UP/DOWNキーを押すと、大きなステ + + + + + + + + + + + + + + + + + + + + + + + + + + + + += (Sum) += (合計) @@ -13482,6 +20096,34 @@ CTRL+スクロールまたはPAGE UP/DOWNキーを押すと、大きなステ + + + + + + + + + + + + + + + + + + + + + + + + + + + + := (Replace) := (置換) @@ -13490,6 +20132,34 @@ CTRL+スクロールまたはPAGE UP/DOWNキーを押すと、大きなステ + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn1 @@ -13498,6 +20168,34 @@ CTRL+スクロールまたはPAGE UP/DOWNキーを押すと、大きなステ + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn2 @@ -13506,6 +20204,34 @@ CTRL+スクロールまたはPAGE UP/DOWNキーを押すと、大きなステ + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn3 @@ -13514,21 +20240,70 @@ CTRL+スクロールまたはPAGE UP/DOWNキーを押すと、大きなステ + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn4 + + + + + + + Ele エレベーター + + + + + + + Thr スロットル + + + + + + + Ail エルロン @@ -13537,7 +20312,15 @@ CTRL+スクロールまたはPAGE UP/DOWNキーを押すと、大きなステ TrainerSimulator - + + + + + + + + + Trainer simulator トレーナー シミュレータ @@ -13964,12 +20747,33 @@ CTRL+スクロールまたはPAGE UP/DOWNキーを押すと、大きなステ burnConfigDialog + + + + + + + Programmer Configuration プログラムの設定 + + + + + + + + + + + + + + Location of sam-ba executable sam-ba実行ファイル場所 @@ -13978,16 +20782,58 @@ CTRL+スクロールまたはPAGE UP/DOWNキーを押すと、大きなステ + + + + + + + + + + + + + + + + + + + + + + + + + + + + The location of the AVRDUDE executable. AVRDUDE実行ファイル場所. + + + + + + + DFU-Util Location DFU-Utiltyの場所 + + + + + + + Location of AVRDUDE executable AVRDUDE実行ファイル場所 @@ -13995,6 +20841,27 @@ CTRL+スクロールまたはPAGE UP/DOWNキーを押すと、大きなステ + + + + + + + + + + + + + + + + + + + + + Use this button to browse and look for the AVRDUDE executable file. AVRDUDE実行ファイルを参照・検索するには、このボタンを押してください。 @@ -14002,16 +20869,51 @@ CTRL+スクロールまたはPAGE UP/DOWNキーを押すと、大きなステ + + + + + + + + + + + + + + + + + + + + + Browse... 参照... + + + + + + + Programmer プログラム + + + + + + + Programmer used for communicating with the controller. Please consult the programmer's documentation and the AVRDUDE documentation to select the appropriate programmer. コントローラとの通信に使用されるプログラムです。 @@ -14019,23 +20921,65 @@ Please consult the programmer's documentation and the AVRDUDE documentation + + + + + + + List all available programmers. 利用可能なプログラムを一覧表示します。 + + + + + + + List Available 一覧表示 + + + + + + + + + + + + + + Extra arguments that will be passed to AVRDUDE on every call すべての呼び出しでAVRDUDEに渡される追加引数 + + + + + + + + + + + + + + Extra arguments used in AVRDUDE. This can be used for providing extra information to AVRDUDE. @@ -14047,21 +20991,49 @@ Please only use this if you know what you are doing. There are no error checks + + + + + + + Extra Arguments 追加引数 + + + + + + + Show AVRDUDE help AVRDUDEのヘルプを表示します + + + + + + + Show Help ヘルプを表示 + + + + + + + Communication port to the programmer. プログラムへの通信ポートです。 @@ -14069,28 +21041,84 @@ Please only use this if you know what you are doing. There are no error checks + + + + + + + + + + + + + + Port ポート + + + + + + + AVRDUDE Location AVRDUDEの場所 + + + + + + + MCU MCU + + + + + + + + + + + + + + CPU of your TX 送信機のCPU + + + + + + + + + + + + + + CPU present on your 9x radio Should be m64 for stock radios m2560 for v4.1 boards @@ -14100,31 +21128,73 @@ v4.1ボード用m2560 + + + + + + + at91sam3s8-9xr at91sam3s8-9xr + + + + + + + SAM-BA Location SAM-BAの場所 + + + + + + + ARM MCU ARM MCU + + + + + + + sam-ba serial port sam-ba シリアルポート + + + + + + + Alternate device 代替デバイス + + + + + + + Use advanced controls 詳細設定を使用 @@ -14170,91 +21240,211 @@ v4.1ボード用m2560 joystickDialog - + + + + + + + + + Configure Joystick スティックの設定 - + + + + + + + + + Ch2 - + + + + + + + + + Ch1 - + + + + + + + + + Ch4 - + + + + + + + + + Ch6 - + + + + + + + + + Ch3 - + + + + + + + + + Ch5 - + + + + + + + + + Ch7 - + + + + + + + + + Ch8 - + + + + + + + + + Instructions インストラクション - + + + + + + + + + Enable 有効 - + + + + + + + + + Cancel キャンセル - + + + + + + + + + Back 戻る - + + + + + + + + + Start スタート - + + + + + + + + + Ok OK diff --git a/companion/src/translations/companion_pl.ts b/companion/src/translations/companion_pl.ts index 06a4401c9..28476bb5c 100644 --- a/companion/src/translations/companion_pl.ts +++ b/companion/src/translations/companion_pl.ts @@ -93,41 +93,97 @@ AppPreferencesDialog + + + + + + + Edit Settings Edycja Ustawień + + + + + + + Radio Profile Profil radia + + + + + + + Default Channel Order Bazowa kolejność kanałów + + + + + + + Build Options Opcje kompilacji + + + + + + + Menu Language Język Menu + + + + + + + Default Stick Mode Bazowy mod drążków + + + + + + + Select Image Wybierz obrazek + + + + + + + Mode selection: Mode 1: @@ -151,172 +207,417 @@ Mode 4: + + + + + + + Mode 1 (RUD ELE THR AIL) Mod 1 (SK.SW.Gaz.Lot) + + + + + + + Mode 2 (RUD THR ELE AIL) Mod 2 (SK.Gaz.SW.Lot) + + + + + + + Mode 3 (AIL ELE THR RUD) Mod 2 (Lot.SW.Gaz.SK) + + + + + + + Mode 4 (AIL THR ELE RUD) Mod 4 (Lot.Gaz.SW.SK) + + + + + + + Splash Screen Ekran startowy + + + + + + + + + + + + + + The profile specific folder, if set, will override general Backup folder Katalog profili, jeśli ustawiony zmieni główny katalog backupów + + + + + + + Backup folder Katalog Backupów + + + + + + + If set it will override the application general setting Jeśli ustawione, nadpisze główne ustawienia aplikacji + + + + + + + if set, will override general backup enable Jeśli ustawione, nadpisze główne ustawienia backupów + + + + + + + <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>Kolejność kanałów</p><p><br/></p><p>Definiuje kolejność standardowych mikserów dla nowego modelu.</p></body></html> + + + + + + + R E T A K W G L + + + + + + + R E A T K W L G + + + + + + + R T E A K G W L + + + + + + + R T A E K G L W + + + + + + + R A E T K L W G + + + + + + + R A T E + + + + + + + E R T A W K G L + + + + + + + E R A T W K L G + + + + + + + E T R A W G K L + + + + + + + E T A R W G L K + + + + + + + E A R T W L K G + + + + + + + E A T R W L G K + + + + + + + T R E A G K W L + + + + + + + T R A E G K L W + + + + + + + T E R A G W K L + + + + + + + T E A R G W L K + + + + + + + T A R E G L K W + + + + + + + T A E R G L W K + + + + + + + A R E T L K W G + + + + + + + A R T E L R G W + + + + + + + A E R T L W K G + + + + + + + A E T R L W G K + + + + + + + A T R E L G K W + + + + + + + A T E R L G W K @@ -327,272 +628,680 @@ Mode 4: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Select Folder Wybierz Folder + + + + + + + Select Executable Wybierz EXE + + + + Release channel + + + + Releases (stable) + + + + Release candidates (testing) + + + + Nightly builds (unstable) + + + + + + + Simulator Volume Gain Głośność symulatora + + + + + + + Profile Name Nazwa profilu + + + + + + + Clear Image Wyczyść obrazek + + + + + + + Append version number to FW file name Dodaj numer Firmware do nazwy pliku + + + + + + + Offer to write FW to Tx after download Zaproponuj zapisanie Firmware do radia po pobraniu + + + + + + + Radio Type Typ Radia + + + + + + + Other Settings Inne ustawienia + + + + + + + General Settings Główne ustawienia + + + + + + + SD Structure path Struktura karty SD + + + + + + + Application Settings Ustawienia Aplikacji + + + + + + + Show splash screen when Companion starts Pokaż ekran startowy przy uruchamianiu Companion + + + + + + + Automatic check for Companion updates Automatycznie sprawdź aktualizacje Companion + + + + + + + + + + + + + + Enable automatic backup before writing firmware Uaktywnij automatyczny backup przed zapisem firmware + + + + + + + Automatic check for OpenTX firmware updates Automatycznie sprawdź aktualizacje firmware OpenTX + + + + + + + Splash Screen Library Biblioteka ekranów startowych + + + + + + + Google Earth Executable Plik wykonywalny Google Earth + + + + + + + Only show user splash images Pokaż tylko ekrany startowe użytkownika + + + + + + + Show user and companion splash images Pokaż ekrany startowe użytkownika i Companion + + + + + + + User Splash Screens Użyj ekranu startowego + + + + + + + Automatic Backup Folder Automatyczny Katalog Backupów + + + + + + + Simulator Settings Ustawienia Symulatora + + + + + + + Simulator BackLight Podświetlenie symulatora + + + + + + + Enable Aktywuj + + + + + + + Action on New Model Akcje na nowym modelu + + + + + + + <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>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> + + + + + + + most recently used files + + + + + + + Startup Settings + + + + + + + Remember + + + + + + + Output Logs Folder + + + + + + + Remove empty model slots when deleting models (only applies for radios w/out categories) Usuń puste sloty modeli gry kasujesz modele (dziala tylko z radiem bez kategori) + + + + + + + Use model wizard Użyj kreatora modelu + + + + + + + Open model editor Otwórz edytor modelu + + + + + + + Just create the model TYlko utwórz model + + + + + + + Debug Output Logging + + + + + + + <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) + + + + + + + Blue Niebieskie + + + + + + + Green Zielone + + + + + + + Red Czerwone + + + + + + + Orange Pomarańczowe + + + + + + + Yellow Żółte + + + + + + + Screenshot capture folder + + + + + + + Joystick Joystick + + + + + + + Calibrate Kalibracja + + + + + + + Only capture to clipboard Zapisz tylko do schowka + + + + + + + Remember simulator switch values Zapamiętaj ustawienia przełączników w symulatorze @@ -673,6 +1382,31 @@ Mode 4: Images (%1) Obrazki (%1) + + + + + Use releases (stable) + + + + + Use release candidates (testing) + + + + + + + Use nightly builds (unstable) + + + + + + Use releases and release candidates (testing) + + BinEepromFormat @@ -893,36 +1627,85 @@ Mode 4: 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 @@ -1169,31 +1952,73 @@ If you have a settings backup file, you may import that instead. CompareDialog + + + + + + + Compare Models Porównaj modele + + + + + + + To compare models, drag and drop them anywhere in this window. Aby porównaćmodele przeciąnij i upuść je gdziekowiek do tego okna. + + + + + + + Close Zamknij + + + + + + + Style + + + + + + + Print Drukuj + + + + + + + Print to file Drukuj do pliku @@ -1350,87 +2175,213 @@ If you have a settings backup file, you may import that instead. Curves + + + + + + + Fixed X Stałe X + + + + + + + Custom X Własny X + + + + + + + Lines Łamana + + + + + + + Smooth Gładka + + + + + + + + + + + + + + Curve type Typy Krzywej + + + + + + + Curve Creator Kreator Krzywych + + + + + + + Y at X=0 Y dla X=0 + + + + + + + Point size + + + + + + + Y at X=100 Y dla X=100 + + + + + + + Both Obie + + + + + + + x>0 x>0 + + + + + + + x<0 x<0 + + + + + + + Apply Zatwierdź + + + + + + + Side Strona + + + + + + + Y at X=-100 Y dla X=-100 + + + + + + + Coefficient Współczynnik + + + + + + + Curve name Nazwa krzywej @@ -1843,42 +2794,133 @@ If you have a settings backup file, you may import that instead. CustomizeSplashDialog + + + + + + + Transmitter Splash Screen Editor Edytor ekrany startowego radia + + + + + + + + + + + + + + Invert Odwróć + + + + + + + + + + + + + + Load FW Otwórz firmware + + + + + + + + + + + + + + Load Pict Załaduj obrazek + + + + + + + + + + + + + + Load Profile Załaduj profil + + + + + + + + + + + + + + Save Zapisz + + + + + + + + + + + + + + Open Splash Library Otwórz bibliotekę obrazków @@ -1887,6 +2929,34 @@ If you have a settings backup file, you may import that instead. + + + + + + + + + + + + + + + + + + + + + + + + + + + + ... ... @@ -2002,48 +3072,48 @@ If you have a settings backup file, you may import that instead. Błąd konwersji pola %1 - + Switch Przełącznik - + Switch Przełącznik - + cannot be exported on this board! nie może być wyeksportowana na tę platformę! - + Source Źródło - + Source %1 cannot be exported on this board! Źródło %1 nie może być wyeksportowane na tę płytę! - + OpenTX only accepts %1 points in all curves OpenTX zezwala tylko na %1 punktów we wszystkich krzywych - + OpenTx only accepts %1 points in all curves OpenTX zezwala tylko na %1 punktów we wszystkich krzywych - - + + OpenTX on this board doesn't accept this function OpenTX na tej platformie nie dopuszcza tej funkcji - + OpenTX doesn't accept this radio protocol OpenTX nie obsługuje tego protokołu radiowego @@ -2052,25 +3122,57 @@ If you have a settings backup file, you may import that instead. DebugOutput - + + + + + + + + + Debug Output Wyjście debugera - + + + + + + + + + <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><hrad/><body><p>Włącz lub wyłącz filtr. Jeśli przycisk nie będzie aktywny to znaczy że jest błąd składni we wprowadzonym wyrażeniu regularnym.</p></body></html> - + + + + + + + + + Filter: Filtr: - + + + + + + + + + <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>Wpisz teks filtru tutaj. Kliknij przycisk. pomoc/info w celu uzyskania szczegółów użycia filtra.</p><p> @@ -2078,61 +3180,141 @@ W celu <b>usunięcia filtru</b> z listy, najpierw wybierz go, a nast - + + + + + + + + + Buffer: Bufor: - + + + + + + + + + Number of lines to keep in display. Ilość linii trzymanej na wyświetlaczu. - + + + + + + + + + Filter &Help &Pomoc Filtra - + + + + + + + + + Show information about using the filter. Pokaż informacje jak uzywać filtra. - + + + + + + + + + Word &Wrap Podział &Słowa - + + + + + + + + + Toggle word wrapping on/off. Przełącz dzielenie słowa on/off. - + + + + + + + + + &Clear &Wyczyść - + + + + + + + + + Clear the output window of all text. Wyczyść tekst z okna. - + + + + + + + + + Enable &Filter Włącz &Filtr - + + + + + + + + + Turn the filter on/off. Przełącz filtr on/off. @@ -2151,6 +3333,13 @@ W celu <b>usunięcia filtru</b> z listy, najpierw wybierz go, a nast DownloadDialog + + + + + + + Downloading: Pobierz: @@ -2295,46 +3484,109 @@ wielkość eepromu to 4096 ale tylko pierwsze 2048 jest użyte ExpoDialog + + + + + + + Weight Waga + + + + + + + Scale Skala + + + + + + + Include Trim Uwzględnij trymer + + + + + + + No Nie + + + + + + + Yes Tak + + + + + + + Curve Krzywa + + + + + + + Offset Wyrównanie + + + + + + + The source for the mixer Źródło miksera + + + + + + + Input name Wprowadź Nazwę @@ -2342,41 +3594,111 @@ wielkość eepromu to 4096 ale tylko pierwsze 2048 jest użyte + + + + + + + + + + + + + + + + + + + + + GV ZG + + + + + + + Flight modes Fazy lotu + + + + + + + Switch Przełącznik + + + + + + + Source Źródło + + + + + + + Line name Nazwa linii + + + + + + + Stick Side Strona drążka + + + + + + + Source for the mixer. Źródło miksera. + + + + + + + Switch used to enable the line. If blank then the input is considered to be "ON" all the time. Przełącznik używany do aktywacji linii. @@ -2384,21 +3706,49 @@ Jeśli puste linia jest uznawana za aktywną cały czas. + + + + + + + NEG x<0(Ujemna) + + + + + + + POS x>0(Dodatnia) + + + + + + + ALL Wszystkie + + + + + + + Curve applied to the source. Krzywa załączona do źródła. @@ -3045,31 +4395,73 @@ Blank means include all. ?, *, and [...] wildcards accepted. FirmwarePreferencesDialog + + + + + + + Downloads Pobrania + + + + + + + Check for updates Sprawdź aktualizacje + + + + + + + Firmware Firmware + + + + + + + Download firmware + + + + + + + Download SD contents + + + + + + + Latest Download Ostatnie pobranie @@ -3111,67 +4503,158 @@ Blank means include all. ?, *, and [...] wildcards accepted. FlashEEpromDialog + + + + + + + Write Models and Settings to Radio Zapisz Modele i Ustawienia do radia + + + + + + + Load... Załaduj... + + + + + + + Current Profile Aktualny profil + + + + + + + Allows Companion to write to older version of the firmware Pozwól Companion na zapis do starszej wersji firmware + + + + + + + Check Firmware compatibility Sprawdź kompatybilność 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>Zapisuje datowaną kopię Twojego eepromu do folderu backupowego zdefiniowanego w Companion przed zapisem aktualnego modelu do radia.</p></body></html> + + + + + + + Backup before Write Zbackupuj przed zapisem + + + + + + + <html><head/><body><p>Modify calibration parameters using settings from current profile</p></body></html> <html><head/><body><p>Zmiana parametrów kalibracji przy użyciu aktualnego profilu</p></body></html> + + + + + + + Patch calibration setting from profile Zamień ustawienia kalibracji wartościami z profilu + + + + + + + <html><head/><body><p>Modify HW parameters using settings from current profile</p></body></html> <html><head/><body><p>Zmień ustawiania parametrów HW przy pomocy wartości z aktualnego profilu</p></body></html> + + + + + + + Patch HW settings from profile Wgraj ustawienia hardware z profilu + + + + + + + Cancel Przerwij + + + + + + + Write to TX Zapisz do radia @@ -3229,71 +4712,169 @@ Blank means include all. ?, *, and [...] wildcards accepted. FlashFirmwareDialog + + + + + + + Flash Firmware Sflashuj Firmware + + + + + + + Load... Załaduj... + + + + + + + Date & Time Data i Czas + + + + + + + Variant Wariant + + + + + + + Version Wersja + + + + + + + Use profile start screen Użyj ekranu startowego z profilu + + + + + + + Use firmware start screen Użyj ekranu startowego z firmware + + + + + + + Use library start screen Użyj ekranu startowego z biblioteki + + + + + + + Use another start screen Użyj innego ekranu startowego + + + + + + + Allows Companion to write to older version of the firmware Pozwól Companion na zapis do starszej wersji firmware + + + + + + + Check Hardware compatibility Sprawdź kompatybilność firmware + + + + + + + Backup and restore Models and Settings Zbakupuj i odtwórz Modele i Ustawienia + + + + + + + Cancel Przerwij + + + + + + + Write to TX Zapisz do radia @@ -3493,21 +5074,49 @@ Aktualnie używasz: FlightMode + + + + + + + Fade In Spowolnienie aktywacji + + + + + + + Fade Out Spowolnienie wyłączania + + + + + + + Name Nazwa + + + + + + + Switch Przełącznik @@ -3697,11 +5306,25 @@ Aktualnie używasz: FusesDialog + + + + + + + Fuses Bezpieczniki + + + + + + + <!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; } @@ -3731,11 +5354,25 @@ p, li { white-space: pre-wrap; } + + + + + + + Read Fuses Odczytaj bezpieczniki + + + + + + + <!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; } @@ -3769,6 +5406,13 @@ p, li { white-space: pre-wrap; } + + + + + + + Reset Fuses EEPROM - PROTECT Zresetuj bezpieczniki @@ -3776,6 +5420,13 @@ EEPROM jest chroniony + + + + + + + <!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; } @@ -3809,6 +5460,13 @@ p, li { white-space: pre-wrap; } + + + + + + + Reset Fuses EEPROM - DELETE Zresetuj bezpieczniki @@ -3816,6 +5474,13 @@ EEPROM będzie skasowany + + + + + + + <!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; } @@ -3892,21 +5557,49 @@ p, li { white-space: pre-wrap; } GeneralEdit + + + + + + + Store calib. and hw settings in selected profile Zapamiętanie kalibracji i ustawień HW w wybranym profilu + + + + + + + Retrieve calib. and hw settings from profile Odtworzenie kalibracji i ustawień HW z profilu + + + + + + + Radio settings Ustawinia radia + + + + + + + General settings used throught the transmitter. These will be relevant for all models in the same EEPROM. Główne ustawienia radia. @@ -3975,151 +5668,389 @@ Będą one obowiązywać dla wszystkich modeli w tym samym EEPROM-ie.GeneralSetup + + + + + + + Form Formularz + + + + + + + GPS Coordinates Koordynaty GPS + + + + + + + Speaker Pitch (spkr only) Wysokość tonów (tylko dźwięki) + + + + + + + Measurement Units Jednostki miar + + + + + + + NMEA NMEA + + + + + + + Voice Language Język komunikatów + + + + + + + Timeshift from UTC Strefa czasowa względem UTC + + + + + + + Metric Metryczne + + + + + + + Imperial Imperialne + + + + + + + Country Code Kod kraju + + + + + + + America Ameryka + + + + + + + Japan Japonia + + + + + + + Europe Europa + + + + + + + + + + + + + + X-Short Bardzo krótka + + + + + + + + + + + + + + Short Krótka + + + + + + + + + + + + + + Normal Normalna + + + + + + + + + + + + + + Long Długa + + + + + + + + + + + + + + X-Long Bardzo długa + + + + + + + Color 1 Kolor 1 + + + + + + + Color 2 Kolor 2 + + + + + + + Beeper Length Długość piknięcia + + + + + + + RotEnc Navigation Nawigacja pokrętłem + + + + + + + Beeper Mode Tryb pikania + + + + + + + Vario pitch at zero Ton Wario dla zera + + + + + + + Standard Standard + + + + + + + Optrex Optrex + + + + + + + Readonly Unlock Odblokuj "Tylko do odczytu" + + + + + + + Sound Mode Tryb dźwiękowy + + + + + + + Beeper volume 0 - Quiet. No beeps at all. @@ -4138,59 +6069,164 @@ Będą one obowiązywać dla wszystkich modeli w tym samym EEPROM-ie. + + + + + + + + + + + + + + Quiet Cichy + + + + + + + Alarms Only Tylko alarmy + + + + + + + + + + + + + + No Keys Bez przycisków + + + + + + + + + + + + + + All Wszystkie + + + + + + + Only Alarms Tylko Alarmy + + + + + + + Haptic Mode Tryb wibracji + + + + + + + Beeper Pikanie + + + + + + + Speaker Głośnik + + + + + + + BeeperVoice Pikanie i głosy + + + + + + + SpeakerVoice Głośnik i głosy + + + + + + + + + + + + + + <!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; } @@ -4206,57 +6242,141 @@ p, li { white-space: pre-wrap; } + + + + + + + SC SC + + + + + + + SE SE + + + + + + + SA SA + + + + + + + SF SF + + + + + + + SH SH + + + + + + + SD SD + + + + + + + SB SB + + + + + + + SG SG + + + + + + + + + + + + + + Hz Hz + + + + + + + Battery Warning Ostrzeżenie o zasilaniu + + + + + + + Battery warning voltage. This is the threashhold where the battery warning sounds. @@ -4268,11 +6388,25 @@ Dopuszczalne wartości 5v-10v + + + + + + + Vario pitch at max Ton Wario dla Maks + + + + + + + If this value is not 0, any keypress will turn on the backlight and turn it off after the specified number of seconds. Jeśli ta wartość jest różna od 0, każde naciśnięcie klawisza włączy podświetlenie, które zgaśnie po ustalonej liczbie sekund. @@ -4280,123 +6414,313 @@ Dopuszczalne wartości 5v-10v + + + + + + + + + + + + + + + sec s + + + + + + + + + + + + + + ms ms + + + + + + + Backlight Brightness Jasność Podświetlenia + + + + + + + Vario repeat at zero Powtarzanie dla Wario zero + + + + + + + Backlight Auto OFF after Wyłącz podświetlenie po + + + + + + + Backlight color Kolor Podświetlenia + + + + + + + Min Min + + + + + + + + + + + + + + v V + + + + + + + Max Maks + + + + + + + Contrast Kontrast + + + + + + + Battery Meter Range Zakres Pomiaru Baterii + + + + + + + If not zero will sound beeps if the transmitter has been left without inputs for the specified number of minutes. Radio zasygnalizuje dźwiękiem brak aktywności po określonej liczbie minut. 0- wyłącza tę funkcję. + + + + + + + min Min + + + + + + + 4800 Baud 4800 bps + + + + + + + 9600 Baud 9600 bps + + + + + + + 14400 Baud 14400 bps + + + + + + + 19200 Baud 19200 bps + + + + + + + 38400 Baud 38400 bps + + + + + + + 57600 Baud 57600 bps + + + + + + + 76800 Baud 76800 bps + + + + + + + 115200 Baud 115200 bps + + + + + + + Backlight Switch Przełącznik Podświetlenia + + + + + + + Show Splash Screen on Startup Pokazuj ekran startowy z logo + + + + + + + This is the switch selectrion for turning on the backlight (if installed). @@ -4404,11 +6728,25 @@ Dopuszczalne wartości 5v-10v + + + + + + + LCD Display Type Typ ekranu LCD + + + + + + + Adjust RTC Dostosuj Zegar @@ -4416,6 +6754,27 @@ Dopuszczalne wartości 5v-10v + + + + + + + + + + + + + + + + + + + + + <!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; } @@ -4441,127 +6800,309 @@ p, li { white-space: pre-wrap; } + + + + + + + MAVLink Baud Rate Prędkość przesyłu MAVLink + + + + + + + Speaker Volume Głośność dźwięków + + + + + + + Haptic Length Długość wibracji + + + + + + + Inactivity Timer Timer bezczynności + + + + + + + + + + + + + + Show splash screen on startup Pokazuj ekran startowy z logo + + + + + + + --- --- + + + + + + + 2s 2s + + + + + + + 3s 3s + + + + + + + 4s 4s + + + + + + + 6s 6s + + + + + + + 8s 8s + + + + + + + 10s 10s + + + + + + + 15s 15s + + + + + + + "No Sound" Warning Ostrzeżenie "Brak Dźwięku" + + + + + + + Haptic Strength Siła wibracji + + + + + + + Beep volume Głośność sygnałów + + + + + + + Wav volume Głośność WAV + + + + + + + Vario volume Głośność wariometru + + + + + + + Background volume Głośność tła + + + + + + + Stick Mode Mod drążków + + + + + + + Default Channel Order Bazowa kolejność kanałów + + + + + + + FAI Mode Tryb FAI + + + + + + + Automatically adjust the radio's clock if a GPS is connected to telemetry. Dostrój automatycznie zegar radia jesli GPS jest podłączony do telemetri. + + + + + + + Backlight OFF Brightness Jacność wyłączonego podświetlenia + + + + + + + Mode selection: Mode 1: @@ -4603,245 +7144,586 @@ Mode 4: + + + + + + + Mode 1 (RUD ELE THR AIL) Mod 1 (SK.SW.Gaz.Lot) + + + + + + + Mode 2 (RUD THR ELE AIL) Mod 2 (SK.Gaz.SW.Lot) + + + + + + + Mode 3 (AIL ELE THR RUD) + + + + + + + Mode 4 (AIL THR ELE RUD) Mod 4 (Lot.Gaz.SW.SK) + + + + + + + <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>Kolejność kanałów</p><p><br/></p><p>Definiuje kolejność standardowych mikserów dla nowego modelu.</p></body></html> + + + + + + + If you enable FAI, only RSSI and RxBt sensors will keep working. This function cannot be disabled by the radio. + + + + + + + RSSI Poweroff Warning + + + + + + + Low EEPROM Warning + + + + Owner Registration ID + + + + aaaaaaAA + + + + + + + R E T A K W G L + + + + + + + R E A T K W L G + + + + + + + R T E A K G W L + + + + + + + R T A E K G L W + + + + + + + R A E T K L W G + + + + + + + R A T E K L G W + + + + + + + E R T A W K G L + + + + + + + E R A T W K L G + + + + + + + E T R A W G K L + + + + + + + E T A R W G L K + + + + + + + E A R T W L K G + + + + + + + E A T R W L G K + + + + + + + T R E A G K W L + + + + + + + T R A E G K L W + + + + + + + T E R A G W K L + + + + + + + T E A R G W L K + + + + + + + T A R E G L K W + + + + + + + T A E R G L W K + + + + + + + A R E T L K W G + + + + + + + A R T E L R G W + + + + + + + A E R T L W K G + + + + + + + A E T R L W G K + + + + + + + A T R E L G K W + + + + + + + A T E R L G W K + + + + Power On Delay + + + + + + + Jack Mode + + + + + + + Audio + + + + + + + Trainer Trener + + + + + + + DMS + + + + + + + USB Mode + + + + Power Off Delay + + + + + + + + + + + + + + Ask on Connect + + + + + + + Joystick (HID) + + + + + + + USB Mass Storage + + + + + + + USB Serial (CDC) + + + + + + + Stick reverse Rewers drążków + + + + + + + Play Delay (switch mid position) Opóźnienie odtwarzania (pozycja środkowa przełącznika) + + + + + + + Backlight flash on alarm Błyskanie podświetleniem przy alarmie + + + Power On Speed + + + + + Power Off Speed + + GeneralSetupPanel @@ -4995,251 +7877,595 @@ Are you sure ? Hardware + + + + + + + Form Formularz + + + + + + + SQ SQ + + + + + + + SR SR + + + + + + + LS2 LS2 + + + + + + + SP SP + + + + + + + SO SO + + + + + + + S4 S4 + + + + + + + RS Prawy suwak + + + + + + + SB SB + + + + + + + PPM 2 PPM 2 + + + + + + + OFF Wyłącz + + + + + + + S-Port Mirror Kopia S-Port + + + + + + + Telemetry Telemetria + + + + + + + SBUS Trainer Trener SBUS + + + + + + + Debug Debugowanie + + + + + + + Rud SK + + + + + + + PPM 3 PPM 3 + + + + + + + S1 Potencjometr 1 + + + + + + + S2 Potencjometr 2 + + + + + + + S3 S3 + + + + + + + PPM 1 PPM 1 + + + + + + + Serial Port Port szeregowy + + + + + + + v V + + + + + + + PPM Multiplier Mnożnik PPM + + + + + + + Current Offset Aktuany ofset + + + + + + + PPM 4 PPM 4 + + + + + + + SA SA + + + + + + + Ele SW + + + Antenna Antena + + + + + S5 S5 + + + + + + + Ail Lotki + + + + + + + Thr Gaz + + + + + + + SC SC + + + + + + + LS Lewy suwak + + + + + + + SD SD + + + + + + + Battery Offset Ofset baterii + + + + + + + SE SE + + + + + + + SF SF + + + + + + + SG SG + + + + + + + SH SH + + + + + + + SI SI + + + + + + + SJ SJ + + + + + + + SK SK + + + + + + + SL SL + + + + + + + SM SM + + + + + + + SN SN + + + + + + + RS2 RS2 + + + + + + + Bluetooth Bluetooth + + + + + + + ADC Filter Filtr ADC + + + + + + + Device Name: @@ -5338,71 +8564,169 @@ Are you sure ? Heli + + + + + + + Invert Elevator Odwróć SW + + + + + + + Invert Aileron Odwróć lotki + + + + + + + Invert Collective Odwróć Pochylenie (Collective) + + + + + + + Invert Odwróć + + + + + + + Off Wyłącz + + + + + + + 120 120 + + + + + + + 120X 120X + + + + + + + 140 140 + + + + + + + 90 90 + + + + + + + Long. cyc Długi cykl + + + + + + + Lateral cyc Boczny cykl + + + + + + + Collective Pochylenie (Collective) + + + + + + + Swash Type Typ tarczy + + + + + + + Swash Ring Pierścień tarczy @@ -5795,46 +9119,109 @@ Are you sure ? LogsDialog + + + + + + + Companion Log Viewer Companion przegląd logów + + + + + + + Filename Nazwa pliku + + + + + + + Open LogFile Otwórz plik logów + + + + + + + Zoom Przybliżenie + + + + + + + Save session CSV + + + + + + + X X + + + + + + + Y Y + + + + + + + Reset Reset + + + + + + + Fly sessions Sesja lotów @@ -7336,11 +10723,23 @@ Zapisać? MixerDialog + + + + + Dialog Dialog + + + + + + + Source Źródło @@ -7349,21 +10748,70 @@ Zapisać? + + + + + + + + + + + + + + + + + + + + + + + + + + + + The source for the mixer Źródło miksera + + + + + + + Weight Waga + + + + + + + Offset Wyrównanie + + + + + + + Include Trim Uwzględnij trymer @@ -7371,31 +10819,87 @@ Zapisać? + + + + + + + + + + + + + + + + + + + + + GV Zm-Gl + + + + + + + No Nie + + + + + + + Yes Tak + + + + + + + Curve Krzywa + + + + + + + The curve used by the mix Krzywa użyta do miksera + + + + + + + Switch used by the mix. If blank then the mix is considered to be "ON" all the time. Przełącznik użyty do miksera @@ -7403,16 +10907,37 @@ Jeśli pusty - mikser będzie stale aktywny. + + + + + + + Switch Przełącznik + + + + + + + Warning Ostrzeżenie + + + + + + + Mixer warning. Setting this value will cause a beep to be emmitted when this value is active. Ostrzeżenie miksera. @@ -7420,31 +10945,73 @@ Ustawienie tej wartości spowoduje emitowanie dźwięku kiedy wartość będzie + + + + + + + OFF Wyłącz + + + + + + + 1 Beep 1 piknięcie + + + + + + + 2 Beep 2 piknięcia + + + + + + + 3 Beep 3 piknięcia + + + + + + + Multiplex Połączenie + + + + + + + Multiplexer This determines how mixer values are added. @@ -7462,51 +11029,121 @@ Ustala w jaki sposób miksery są łączone. + + + + + + + ADD Dodawaj + + + + + + + MULTIPLY Pomnóż + + + + + + + REPLACE Zastąp + + + + + + + Name Nazwa + + + + + + + Flight modes Fazy lotu + + + + + + + Include DR/Expo Dołącz DR/Expo + + + + + + + Delay Opóźnienie + + + + + + + Slow Spowolnienie + + + + + + + Up Do góry / (+) + + + + + + + Down Do dołu / (-) @@ -7515,6 +11152,34 @@ Ustala w jaki sposób miksery są łączone. + + + + + + + + + + + + + + + + + + + + + + + + + + + + <!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; } @@ -7563,6 +11228,12 @@ p, li { white-space: pre-wrap; } Invert All Odwróć wszytko + + + + FullScreenDialog + + MixersListWidget @@ -7736,11 +11407,23 @@ p, li { white-space: pre-wrap; } ModelEdit + + + + + Dialog Dialog + + + + + + + Simulate Symulacja @@ -7794,6 +11477,12 @@ p, li { white-space: pre-wrap; } Telemetry Telemetria + + + + FullScreenDialog + + ModelPrinter @@ -8612,138 +12301,324 @@ p, li { white-space: pre-wrap; } Module + + + + + + + Failsafe Mode Tryb Failsafe + + + + + + + Start Start + + + + + + + PPM delay Opóźnienie PPM + + + + + + + Negative Ujemna + + + + + + + Positive Dodatnia + + + + + + + Polarity Polaryzacja + + + + + + + Trainer Mode Tryb trenera + + + + + + + PPM Frame Length Długość ramki PPM + + + + + + + CH Kan + + + + + + + Antenna Antena + + + + + + + Option value Wartość opcjonalna + + + + + + + Bind on startup Binduj na starcie + + + + + + + RF Output Power + + + + + + + Low Power Słabe zasilanie + + + + + + + us us + + + + + + + Multi Radio Protocol Wieloradiowy Protokół + + + + + + + Sub Type + + + + + + + Master/Jack Trener/Jack + + + + + + + Slave/Jack Uczeń/Jack + + + + + + + Master/SBUS Module Trener/SBUS Moduł + + + + + + + Master/CPPM Module Trener/CPPM Moduł + + + + + + + Master/SBUS in battery compartment Trener/SBUS w kieszeni baterii + + + + + + + Show values in: Pokaż wartości w: + + + + + + + % abbreviation for percent % + + + + + + + μs abbreviation for microseconds µs + + + + + + + ms ms + + + + Receiver 1 @@ -8751,94 +12626,232 @@ p, li { white-space: pre-wrap; } + + + + + + + + + + + + X X + + + + Receiver 2 + + + + Receiver 3 + + + + + + + WARNING: changing RF Output Power needs RE-BIND + + + + + + + Channels Kanały + + + + Registration ID + + + + + + + WARNING: Requires non-certified firmware! + + + + + + + Not set BRAK + + + + + + + Hold Utrzymuj + + + + + + + Custom Ustawienia Własne + + + + + + + No Pulses Brak sygnałów + + + + + + + Receiver Odbiornik + + + + + + + Failsafe Positions Pozycja Failsave + + + + + + + Protocol Protokół + + + + + + + Receiver No. Nr odbiornika. + + + + + + + Output type Typ wyjścia + + + + + + + Open Drain Otwarty dren + + + + + + + Push Pull Push Pull + + + + + + Internal + Wewnętrzny + + + + + + + Ext. + Int. + + ModuleData @@ -9578,21 +13591,49 @@ p, li { white-space: pre-wrap; } PrintDialog + + + + + + + Close Zamknij + + + + + + + Style + + + + + + + Print Drukuj + + + + + + + Print to file Drukuj do pliku @@ -9616,11 +13657,25 @@ p, li { white-space: pre-wrap; } ProgressDialog + + + + + + + Flash Firmware Sflashuj Firmware + + + + + + + Close Zamknij @@ -9635,6 +13690,13 @@ p, li { white-space: pre-wrap; } ProgressWidget + + + + + + + Show Details Pokaż szczegóły @@ -9788,16 +13850,37 @@ p, li { white-space: pre-wrap; } RadioNotFoundDialog + + + + + + + No Radio Found Nie odnaleziono Radia + + + + + + + <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>Radio nieodnalezione!</p><p>Upewnij się ze dokonałeś uruchomienia radia w trakcie trzymania obu dolnych trymerów "do środka radia".</p><p>Potem podłącz kabel USB.</p><p><span style=" font-family:'arial,sans-serif'; font-size:13px; font-style:italic; color:#222222; background-color:#ffffff;">Uwaga: Jeśli Twoje radio Taranis nie ma oprogramowania nowszego niż 2.0 ta wersja Comanion nie będzie z nim działała.</span></p></body></html> + + + + + + + OK OK @@ -9806,43 +13889,99 @@ p, li { white-space: pre-wrap; } RadioOutputsWidget - + + + + + + + + + Form Formularz - + + + + + + + + + View: Widok: - + + + + + + + + + Logical Switches Przełączniki logiczne - + + + + + + + + + Global Variables Zmienne globalne - + + + + + + + + + Channel Outputs - + + + + + + + + + Mix Outputs - + + + + + + + + + L o g @@ -9857,7 +13996,15 @@ a - + + + + + + + + + G l o @@ -9873,7 +14020,15 @@ l - + + + + + + + + + C h a @@ -9891,7 +14046,15 @@ y - + + + + + + + + + M i x @@ -10731,86 +14894,205 @@ s Setup + + + + + + + Throttle Source Źródło gazu + + + + + + + Center beep Pikanie przy centrowaniu + + + + + + + OFF Wyłącz + + + + + + + Model Image Obrazek modelu + + + + + + + Top LCD Timer Timer górnego LCD + + + + + + + Switch Warnings Ostrzeżenie o przełącznikach + + + + + + + Exponential Wykładnicze + + + + + + + Extra Fine Bardzo dokładne + + + + + + + Fine Dokładne + + + + + + + Medium Średnie + + + + + + + Coarse Zgrubne + + + + + + + Edit Checklist... + + + + + + + Extended Limits Rozszerzone limity (125%) + + + + + + + Extended Trims Poszerzone trymery + + + + + + + Display Checklist Wyświetl Czeklistę + + + + + + + Throttle Warning Ostrzeżenie o gazie + + + + + + + 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. @@ -10821,81 +15103,193 @@ Wolne obroty będą na górze, trymer i ostrzeżenie o otwartym gazie również + + + + + + + Reverse Throttle Odwrotna praca gazu + + + + + + + Throttle Trim Idle Only Trymer gazu tylko dla wolnych obrotów + + + + + + + Timer 2 Timer 2 + + + + + + + Timer 3 Timer 3 + + + + + + + Timer 1 Timer 1 + + + + + + + Never Nigdy + + + + + + + On change Przy zmianie + + + + + + + Always Zawsze + + + + + + + Global Functions Funkcje Globalne + + + + + + + Trim Step Krok Trymera + + + + + + + Trims Display Wyświetl Trymery + + + + + + + Warnings Ostrzeżenia + + + + + + + Pot Warnings Ostrzeżenie o potencjometrach + + + + + + + Manual + + + + + + + Auto Automatyczne + + + + + + + Model Model @@ -11266,181 +15660,421 @@ Profile ID: [%1]; Radio ID: [%2] SimulatorMainWindow - + + + + + + + + + OpenTx Simulator Symulator OpenTX - + + + + + + + + + View Widok - + + + + + + + + + Radio Window Okno Radia - + + + + + + + + + Reload... Przeładuj... - + + + + + + + + + Tools Narzędzia - + + + + + + + + + Toolbar Pasek narzędzi - + + + + + + + + + Reload Lua Scripts Przeładuj skrypty LUA - + + + + + + + + + Reload the Lua environment on the simulated radio. Przeładuj środowisko LUA na symulowanym radiu. - + + + + + + + + + F7 F7 - + + + + + + + + + Reload Radio Data Przeładuj Dane Radia - + + + + + + + + + Reload all radio data without restarting the simulator. Przeładuj dane radia bez restartowania symulatora. - + + + + + + + + + F9 F9 - + + + + + + + + + Key Mapping Mapowanie Klawiszy - + + + + + + + + + Show keyboard maping reference. Pokaż mapowanie klawiatury. - + + + + + + + + + F1 F1 - + + + + + + + + + Joystick Settings Ustawienia Joystika - + + + + + + + + + Open joystick configuration settings dialog. Otwórz dialog ustawień joystika. - + + + + + + + + + F3 F3 - + + + + + + + + + LCD Screenshot Zrzut ekrany LCD - + + + + + + + + + Save a screenshot of the current simulated LCD screen. Zapisz zrzut ekranu aktualnnie symulowanego monitora LCD. - + + + + + + + + + F8 F8 - + + + + + + + + + Dock In Main Window Zadokuj w głównym oknie - + + + + + + + + + Show the radio in the main window or as a separate "floating" window. Pokaż radio w głównym oknie lub w pływającym oddzielnym oknie. - + + + + + + + + + Menu Bar Pasek Menu - + + + + + + + + + Show or hide the top menu bar. Pokaż lub ukryj górny pasek menu. - + + + + + + + + + Alt+M Alt+M - + + + + + + + + + Constrain Width Wymuś szerokość - + + + + + + + + + Set radio widget width to be a fixed size. Ustaw stałą wielkość widgetu radia. - + + + + + + + + + Constrain Height Wymuś wysokość - + + + + + + + + + Set radio widget height to be a fixed size. Ustaw stałą wysokość widgetu radia. @@ -11521,25 +16155,57 @@ Profile ID: [%1]; Radio ID: [%2] SimulatorStartupDialog - + + + + + + + + + OpenTX Simulator - Startup Options Symulator OpenTX - Opcje Startowe - + + + + + + + + + Simulator Startup Options: Opcje Startowe Symulatora: - + + + + + + + + + Radio Profile: Profil radia: - + + + + + + + + + Existing radio profiles are shown here.<br /> Create or edit profiles using the Companion application. Tu są pokazane istniejące profile radia.<br /> @@ -11547,13 +16213,29 @@ Stwórz lub edytuj profile używając aplikacji Companion. - + + + + + + + + + Radio Type: Typ Radia: - + + + + + + + + + Existing radio simulators are shown here.<br /> The radio type specified in the selected profile is used by default. Tu są pokazane istniejące profile radia.<br /> @@ -11561,31 +16243,71 @@ Typ radia określony w wybranym profilu zostanie użyty jako domyślny. - + + + + + + + + + Data Source: Źródło Danych: - + + + + + + + + + Data File: Źródło Pliku: - + + + + + + + + + Data Folder: Folder Danych: - + + + + + + + + + SD Image Path: Ścieżka Obrazu 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! Plik obrazu danych radia (.bin/.eeprom/.otx) do użytku. W razie potrzeby zostanie stworzony nowy plik z domyślnym obrazem.<br /> @@ -11593,7 +16315,15 @@ Typ radia określony w wybranym profilu zostanie użyty jako domyślny. - + + + + + + + + + Select data file... Wybierz plik danych... @@ -11601,28 +16331,76 @@ Typ radia określony w wybranym profilu zostanie użyty jako domyślny. - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + ... ... - + + + + + + + + + Directory containing RADIO and MODELS folders to use.<br /> New folder(s) with default radio/model will be created here if necessary. Katalog zawierajacy foldery RADIA i MODELI do użycia.<br />W razie potrzeby zostanią stworzone nowe foldery z domyślnym Radiem/Modelami. - + + + + + + + + + Select data folder... Wybierz folder danych... - + + + + + + + + + Directory containing the SD card image to use.<br/> The default is configured in the chosen Radio Profile. Katalog zawierajacy obraz karty SD do użycia.<br/> @@ -11630,31 +16408,71 @@ Domyślny jest skonfigurowany w wybranym Profilu Radia. - + + + + + + + + + Select SD card image folder... Wybierz folder obrazu karty SD... - + + + + + + + + + Select which of the data sources (File/Folder/SD Card) you would like to start the simulator with. Wybierz jakie źródło danych (Plik/Folder/Karta SD) chcesz użyć do uruchomienia symulatora. - + + + + + + + + + File Plik - + + + + + + + + + Folder Katalog - + + + + + + + + + SD Path Scieżka SD @@ -11683,7 +16501,15 @@ Domyślny jest skonfigurowany w wybranym Profilu Radia. SimulatorWidget - + + + + + + + + + Companion Simulator Symulator Companion @@ -11771,6 +16597,20 @@ Domyślny jest skonfigurowany w wybranym Profilu Radia. + + + + + + + + + + + + + + ... ... @@ -11810,6 +16650,13 @@ Domyślny jest skonfigurowany w wybranym Profilu Radia. StyleEditDialog + + + + + + + @@ -11818,21 +16665,49 @@ Domyślny jest skonfigurowany w wybranym Profilu Radia. + + + + + + + &Reset to default + + + + + + + &Cancel + + + + + + + &OK + + + + + + + This feature does not validate your changes and assumes you are familiar with CSS syntax for QT. @@ -12090,190 +16965,475 @@ Too many errors, giving up. Telemetry + + + + + + + A1 A1 + + + + + + + A2 A2 + + + + + + + RSSI RSSI + + + + + + + Alarm 1 Alarm 1 + + + + + + + + + + + + + + ---- ---- + + + + + + + + + + + + + + Yellow Żółty + + + + + + + + + + + + + + Orange Pomarańczowy + + + + + + + + + + + + + + Red Czerwony + + + + + + + Alarm 2 Alarm 2 + + + + + + + Disable telemetry audio warnings + + + + + Source Źródło + + + + + + + Center Silent Środek cichy + + + + + + + Altitude source Źródło wysokości + + + + + + + Volts source Źródło napięcia + + + + + + + Top Bar Górny pasek + + + + + + + Serial Protocol Protokół szeregowy + + + + + + + Sensors Czujniki + + + + + + + Disable multi sensor handling Wyłącz obsługę wielu czujników + + + + + + + Volt source Źródło napięcia + + + + + + + Current source Źródło prądu(natężenia) + + + + + + + Protocol Protokół + + + + + + + None Żadne + + + + + + + FrSky Sensor Hub Hub Czujników FrSky + + + + + + + Blades Łopaty śmigła + + + + + + + Sink Max Maks. Opadanie + + + + + + + Climb Max Maks. Wznoszenie + + + + + + + Sink Min Min. Opadanie + + + + + + + Climb Min Min. Wznoszenie + + + + + + + Vario source Źródło wario + + + + + + + Vario limits Limity wario + + + + + + + Altimetry Wysokościomierz + + + + + + + mAh mAh + + + + + + + A A + + + + + + + Various Różne + + + + + + + mAh count Licznik mAh + + + + + + + FAS Offset Wyrównanie FAS + + + + + + + Persistent mAh Stałe mAh @@ -12282,107 +17442,289 @@ Too many errors, giving up. TelemetryAnalog + + + + + + + Unit Jednostka + + + + + + + Max Value Maks. wartość + + + + + + + Alarm 1 Alarm 1 + + + + + + + + + + + + + + ---- ---- + + + + + + + + + + + + + + Yellow Żółty + + + + + + + + + + + + + + Orange Pomarańczowy + + + + + + + + + + + + + + Red Czerwony + + + + + + + + + + + + + + < < + + + + + + + + + + + + + + > > + + + + + + + Alarm 2 Alarm 2 + + + + + + + Offset Wyrównanie + + + + + + + Volts (V) Wolty (V) + + + + + + + Amps (A) Ampery (A) + + + + + + + Speed (m/s or ft/s) Prędkość (m/s albo ft/s) + + + + + + + Raw (-) Bezwymiarowe (-) + + + + + + + Speed (km/h or miles/h) Prędkość (km/h albo mile/h) + + + + + + + Meters (m or ft) Wysokość (m albo ft) + + + + + + + Temp (°) Temp (°) + + + + + + + Fuel (%) Paliwo (%) + + + + + + + mAmps (mA) miliAmpery (mA) @@ -12396,6 +17738,13 @@ Too many errors, giving up. TelemetryCustomScreen + + + + + + + Custom Screen Type Typ panelu @@ -12421,21 +17770,49 @@ Too many errors, giving up. + + + + + + + Min Min + + + + + + + Source Źródło + + + + + + + Gauge Pomiar + + + + + + + Max Maks @@ -12549,86 +17926,199 @@ Too many errors, giving up. TelemetrySensor + + + + + + + Form Formularz + + + + + + + Custom Własne + + + + + + + Calculated Obliczone + + + + + + + Id Id + + + + + + + Instance Wystąpienie + + + + Rx + + + + Mod. + + + + + + + Add Dodaj + + + + + + + Average Średnio + + + + + + + Min Min + + + + + + + Max Maks + + + + + + + Multiply Mnożenie + + + + + + + Totalize Całkowite + + + + + + + Cell Cela + + + + + + + Consumption Zużycie + + + + + + + Dist Zasięg + + + + + + + Cells Sensor : Czujniki Cel : @@ -12641,191 +18131,506 @@ Too many errors, giving up. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --- --- + + + + + + + GPS Sensor : Czujnik GPS : + + + + + + + Alt. Sensor : Czujnik wys. : + + + + + + + Sensor : + + + + + + + V V + + + + + + + A A + + + + + + + mA mA + + + + + + + kt kt + + + + + + + m/s m/s + + + + + + + ft/s ft/s + + + + + + + km/h km/h + + + + + + + mph mph + + + + + + + m m + + + + + + + ft ft + + + + + + + °C °C + + + + + + + °F °F + + + + + + + % % + + + + + + + mAh mAh + + + + + + + W W + + + + + + + mW mW + + + + + + + dBm dBm + + + + + + + g g + + + + + + + ° ° + + + + + + + Rad Rad + + + + + + + mL ml + + + + + + + US fl.Oz. US fl.Oz. + + + + + + + Raw (-) Bezwymiarowe (-) + + + + + + + Ratio Współczynnik + + + + + + + Positive Dodatni + + + + + + + RPM RPM + + + + + + + Precision Precyzja + + + + + + + Blades Łopaty + + + + + + + Offset Wyrównanie + + + + + + + Multiplier Mnożnik + + + + + + + Auto Offset Wyrównanie automatyczne + + + + + + + Filter Filtr + + + + + + + Logs Logi + + + + + + + Persistent Stały @@ -12857,91 +18662,211 @@ Too many errors, giving up. TelemetrySimulator - + + + + + + + + + Telemetry Simulator Symulator telemetrii - + + + + + + + + + VFAS Napięcie - + + + + + + + + + RSSI RSSI - + + + + + + + + + A1 A1 - + + + + + + + + + A2 A2 - + + + + + + + + + Simulate Symulacja - + + + + + + + + + Replay SD Log File Odtwórz plig logów z SD - + + + + + + + + + Replay rate Współczynnik odtwarzania - + + + + + + + + + Load Załaduj - + + + + + + + + + |> |> - + + + + + + + + + <| <| - + + + + + + + + + > > - + + + + + + + + + <- <- - + + + + + + + + + X X - + + + + + + + + + Row # Timestamp Czysty # @@ -12949,25 +18874,57 @@ Timestamp - + + + + + + + + + 1/5x 1/5x - + + + + + + + + + 5x 5x - + + + + + + + + + No Log File Currently Loaded Nie jest załadowany żaden plik logu - + + + + + + + + + RAS @@ -12975,21 +18932,61 @@ Timestamp - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + V / ratio V / współczynnik - + + + + + + + + + Db - + + + + + + + + + RxBt RxBt @@ -13007,121 +19004,377 @@ Timestamp - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <html><head/><body><p><br/></p></body></html> <html><head/><body><p><br/></p></body></html> - + + + + + + + + + Tmp1 Tmp1 - + + + + + + + + + A3 A3 - + + + + + + + + + A4 A4 - + + + + + + + + + Tmp2 Tmp2 - + + + + + + + + + Fuel Paliwo - - + + + + + + + + + + + + + + + + + + °C °C - + + + + + + + + + ml ml - + + + + + + + + + % % - - + + + + + + + + + + + + + + + + + + Meters Metry - + + + + + + + + + Alt Wysokość - + + + + + + + + + VSpd Pr.Wznoszenia - + + + + + + + + + m/s m/s - + + + + + + + + + Fuel Qty Ilość Paliwa - - + + + + + + + + + + + + + + + + + + km/h km/h - + + + + + + + + + Hdg Kurs - + + + + + + + + + ASpd Prędk. Pow @@ -13129,21 +19382,61 @@ Timestamp - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + G G - + + + + + + + + + GPS GPS - + + + + + + + + + Lat,Lon (dec.deg.) Szer. Dł. @@ -13151,13 +19444,29 @@ Timestamp - + + + + + + + + + AccX AccX - + + + + + + + + + dd-MM-yyyy hh:mm:ss dd-MM-yyyy @@ -13165,101 +19474,245 @@ hh:mm:ss - + + + + + + + + + Date Data - + + + + + + + + + Amps Ampery - + + + + + + + + + AccZ AccZ - + + + + + + + + + GAlt Wys - - + + + + + + + + + + + + + + + + + + Volts Wolty - + + + + + + + + + Cels Cele - + + + + + + + + + Curr Natężenie - + + + + + + + + + AccY AccY - + + + + + + + + + GSpd Pr.w.Ziemi - + + + + + + + + + Degrees Stopnie - + + + + + + + + + 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 RPM - + + + + + + + + + When enabled, sends any non-blank values as simulated telemetry data. Kiedy aktywne, wysyła jakiekolwiek dane jako symulację danych telemetrii. @@ -13301,11 +19754,25 @@ hh:mm:ss Timer + + + + + + + Countdown Odliczanie + + + + + + + Minute Call Pikanie minutowe @@ -13389,26 +19856,61 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. Trainer + + + + + + + Form Formularz + + + + + + + Mode Tryb + + + + + + + Input Wejście + + + + + + + Weight Waga + + + + + + + Rud SK @@ -13421,6 +19923,62 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Beeper volume 0 - Quiet. No beeps at all. @@ -13441,6 +19999,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + Off Wyłącz @@ -13449,6 +20035,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + += (Sum) += (Suma) @@ -13457,6 +20071,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + := (Replace) := (Zastąpienie) @@ -13465,6 +20107,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn1 Kanał 01 @@ -13473,6 +20143,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn2 Kanał 02 @@ -13481,6 +20179,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn3 Kanał 03 @@ -13489,21 +20215,70 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn4 Kanał 04 + + + + + + + Ele SW + + + + + + + Thr Gaz + + + + + + + Ail Lotki @@ -13512,7 +20287,15 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. TrainerSimulator - + + + + + + + + + Trainer simulator Symulator trenera @@ -13937,12 +20720,26 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. burnConfigDialog + + + + + + + Programmer Configuration Configuration AVRDUDE / SAM-BA Konfiguracja programatora + + + + + + + Location of AVRDUDE executable Położenie wykonywalnego AVRDUDE @@ -13951,11 +20748,46 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + The location of the AVRDUDE executable. Położenie wykonywalnego AVRDUDE. + + + + + + + DFU-Util Location Położenie narzędzia DFU @@ -13963,6 +20795,27 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + Use this button to browse and look for the AVRDUDE executable file. Użyj tego przycisku w celu znalezienia pliku wykonywalnego AVRDUDE. @@ -13970,39 +20823,116 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + Browse... Przeglądaj ... + + + + + + + Programmer Typ programatora + + + + + + + Programmer used for communicating with the controller. Please consult the programmer's documentation and the AVRDUDE documentation to select the appropriate programmer. Programator użyty do komunikacji z mikrokontrolerem. + + + + + + + List all available programmers. Lista wszystkich dostępnych programów. + + + + + + + List Available Lista dostępnych + + + + + + + + + + + + + + Extra arguments that will be passed to AVRDUDE on every call Dodatkowe argumenty przekazywane do AVRDUDE przy każdorazowym wywołaniu + + + + + + + + + + + + + + Extra arguments used in AVRDUDE. This can be used for providing extra information to AVRDUDE. @@ -14016,48 +20946,125 @@ Nie ma to spradzania błędów i możesz uszkodzić mikrokontroler. + + + + + + + Extra Arguments Dodatkowe argumenty + + + + + + + Show AVRDUDE help Pokaż pomoc AVRDUDE + + + + + + + Show Help Pokaż pomoc + + + + + + + + + + + + + + Port Port + + + + + + + AVRDUDE Location Położenie AVRDUDE + + + + + + + at91sam3s8-9xr at91sam3s8-9xr + + + + + + + Use advanced controls Użyj zaawansowanych ustawień + + + + + + + + + + + + + + CPU of your TX Procesor/mikrokontroler twojego radia + + + + + + + Communication port to the programmer. Port komunikacyjny do programatora. @@ -14065,6 +21072,20 @@ Nie ma to spradzania błędów i możesz uszkodzić mikrokontroler. + + + + + + + + + + + + + + CPU present on your 9x radio Should be m64 for stock radios m2560 for v4.1 boards @@ -14074,32 +21095,81 @@ m2560 dla platformy V4 + + + + + + + SAM-BA Location Położenie SAM-BA + + + + + + + Alternate device Alternatywne urządzenie + + + + + + + + + + + + + + Location of sam-ba executable Położenie plików wykonywalnych sam-ba + + + + + + + MCU Typ procesora CPU/MCU + + + + + + + ARM MCU Procesor ARM + + + + + + + sam-ba serial port Port szeregowy sam-ba @@ -14145,85 +21215,197 @@ m2560 dla platformy V4 joystickDialog - + + + + + + + + + Configure Joystick Ustaw joystick - + + + + + + + + + Ch2 Kanał 02 - + + + + + + + + + Ch1 Kanał 01 - + + + + + + + + + Ch4 Kanał 04 - + + + + + + + + + Ch6 Kanał 06 - + + + + + + + + + Ch3 Kanał 03 - + + + + + + + + + Ch5 Kanał 05 - + + + + + + + + + Ch7 Kanał 07 - + + + + + + + + + Ch8 Kanał 08 - + + + + + + + + + Instructions Instrukcje - + + + + + + + + + Enable Aktywuj - + + + + + + + + + Cancel Przerwij - + + + + + + + + + Back Cofnij - + + + + + + + + + Start Start @@ -14234,7 +21416,15 @@ m2560 dla platformy V4 - + + + + + + + + + Ok OK diff --git a/companion/src/translations/companion_sv.ts b/companion/src/translations/companion_sv.ts index 8985ae180..73b0f57fd 100644 --- a/companion/src/translations/companion_sv.ts +++ b/companion/src/translations/companion_sv.ts @@ -556,6 +556,22 @@ Mode 4: Note: Nightly builds are not available in this version, Release/RC update channel will be used. + + Use releases (stable) + + + + Use release candidates (testing) + + + + Use nightly builds (unstable) + + + + Use releases and release candidates (testing) + + BinEepromFormat @@ -3909,6 +3925,14 @@ brytare Power Off Delay + + Power On Speed + + + + Power Off Speed + + GeneralSetupPanel @@ -6085,6 +6109,10 @@ p, li { white-space: pre-wrap; } DEST -> %1 + + FullScreenDialog + + MixersListWidget @@ -6269,6 +6297,10 @@ p, li { white-space: pre-wrap; } Outputs Utgångar + + FullScreenDialog + + ModelPrinter @@ -7072,6 +7104,14 @@ p, li { white-space: pre-wrap; } WARNING: Requires non-certified firmware! + + Internal + + + + Ext. + Int. + + ModuleData diff --git a/companion/src/translations/companion_zh_CN.ts b/companion/src/translations/companion_zh_CN.ts index 9e5838f9d..013b5fabe 100644 --- a/companion/src/translations/companion_zh_CN.ts +++ b/companion/src/translations/companion_zh_CN.ts @@ -96,92 +96,225 @@ AppPreferencesDialog + + + + + + + Edit Settings 此对话框位置在主菜单中的settings-->settings 首选项 + + + + + + + Radio Profile 遥控器档案可以有多个,对应不同的遥控器 遥控器档案 + + + + + + + Profile Name 档案名称 + + + + + + + Radio Type 遥控器型号 + + + + + + + Menu Language 遥控器档案中 菜单语言 + + + + + + + Build Options 编译选项 + + + + + + + Splash Screen 遥控器档案中 开机画面 + + + + + + + Other Settings 其他设置 + + + + + + + SD Structure path SD卡目录 + + + + + + + + + + + + + + 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 如果设定将会覆盖一般备份允许选项 + + + + + + + + + + + + + + Enable automatic backup before writing firmware 写入固件前允许自动备份 + + + + + + + General Settings 一般设定 + + + + + + + Default Stick Mode 默认摇杆模式 + + + + + + + Mode selection: Mode 1: @@ -213,183 +346,435 @@ Mode 4: + + + + + + + Mode 1 (RUD ELE THR AIL) 遥控器档案中 MODE1 日本手 ↕升降↔方向 ↕油门↔副翼 + + + + + + + Mode 2 (RUD THR ELE AIL) MODE2 美国手 ↕油门↔方向 ↕升降↔副翼 + + + + + + + Mode 3 (AIL ELE THR RUD) MODE3 中国手 ↕升降↔副翼 ↕油门↔方向 + + + + + + + Mode 4 (AIL THR ELE RUD) MODE4 模式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 方向 升降 油门 副翼 [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] + + + + + + + Append version number to FW file name 将版本号添加到固件文件的文件名中 + + + + + + + Offer to write FW to Tx after download 下载完成后提示将固件写入到遥控器 + + + + + + + Action on New Model + + + + + + + Screenshot capture folder + + + + + + + Clear Image 清除图片 + + + + + + + Select Image 遥控器档案中 选择图片 @@ -401,216 +786,540 @@ Mode 4: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Select Folder 选择目录 + + + + + + + Application Settings 程序首选项 + + + + + + + Automatic check for Companion updates 自动检查 Companion 版本更新 + + + + + + + most recently used files + + + + + + + Startup Settings + + + + + + + Remember + + + + + + + Show splash screen when Companion starts Companion 启动时显示启动画面 + + + + + + + Automatic check for OpenTX firmware updates 自动检查 OpenTX 固件版本更新 + + + + + + + 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> + + + + + + + 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 + + + + + + + <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) + + + + + + + Splash Screen Library 开机画面图片库 + + + + + + + Google Earth Executable Google Earch 可执行文件 + + + + + + + User Splash Screens 自定义开机画面 + + + + + + + Automatic Backup Folder 自动备份目录 + + + + + + + Only show user splash images 只显示自定义开机画面 + + + + + + + Show user and companion splash images 显示自定义和系统开机画面 + + + + + + + Select Executable 选择可执行文件 + + + + Release channel + + + + Releases (stable) + + + + Release candidates (testing) + + + + Nightly builds (unstable) + + + + + + + Simulator Settings 模拟器设置 + + + + + + + Calibrate 校准 + + + + + + + Blue 蓝色 + + + + + + + Green 绿色 + + + + + + + Red 红色 + + + + + + + Orange 橙色 + + + + + + + Yellow 黄色 + + + + + + + Only capture to clipboard 只截图到剪贴板中 + + + + + + + Enable 使用游戏杆 + + + + + + + Joystick 游戏杆 + + + + + + + Simulator BackLight 模拟器背光颜色 + + + + + + + Remember simulator switch values 关闭模拟器后记忆开关位置 + + + + + + + Simulator Volume Gain 模拟器音量调节 @@ -695,6 +1404,31 @@ Mode 4: Images (%1) 图片 (%1) + + + + + Use releases (stable) + + + + + Use release candidates (testing) + + + + + + + Use nightly builds (unstable) + + + + + + Use releases and release candidates (testing) + + BinEepromFormat @@ -925,36 +1659,85 @@ Mode 4: 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 @@ -1200,34 +1983,76 @@ If you have a settings backup file, you may import that instead. CompareDialog + + + + + + + Compare Models Compare 模型对比对话框 比较模型参数 + + + + + + + To compare models, drag and drop them anywhere in this window. + + + + + + + Close Compare 模型对比对话框 关闭 + + + + + + + Style + + + + + + + Print Compare 模型对比对话框 打印 + + + + + + + Print to file Compare 模型对比对话框 打印到文件 @@ -1395,87 +2220,213 @@ If you have a settings backup file, you may import that instead. Curves + + + + + + + Curve name 曲线名称 [Name] + + + + + + + Fixed X 均匀间距 [Standard] + + + + + + + Custom X 自定间距 [Custom] + + + + + + + Lines 折线 + + + + + + + Smooth 平滑 [Smooth] + + + + + + + + + + + + + + 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 弯曲系数 @@ -1900,18 +2851,53 @@ If you have a settings backup file, you may import that instead. CustomizeSplashDialog + + + + + + + Transmitter Splash Screen Editor 遥控器开机画面编辑器 + + + + + + + + + + + + + + Invert 负片效果 + + + + + + + + + + + + + + Open Splash Library 打开开机图片库 @@ -1920,30 +2906,114 @@ If you have a settings backup file, you may import that instead. + + + + + + + + + + + + + + + + + + + + + + + + + + + + ... + + + + + + + + + + + + + + Load Profile 载入遥控文档 + + + + + + + + + + + + + + Load FW 载入固件 + + + + + + + + + + + + + + Load Pict 载入图片文件 + + + + + + + + + + + + + + Save 保存 @@ -2059,48 +3129,48 @@ If you have a settings backup file, you may import that instead. - + Switch - + Switch 启动开关 - + cannot be exported on this board! 无法输出到这个主板! - + Source - + Source %1 cannot be exported on this board! 源 %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 不接受此遥控器协议 @@ -2109,86 +3179,198 @@ If you have a settings backup file, you may import that instead. DebugOutput - + + + + + + + + + Debug Output Debug 输出 - + + + + + + + + + <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 (&C)清除 - + + + + + + + + + Clear the output window of all text. - + + + + + + + + + Enable &Filter - + + + + + + + + + Turn the filter on/off. @@ -2207,6 +3389,13 @@ To <b>remove a remembered entry</b> from the filter list, first cho DownloadDialog + + + + + + + Downloading: 下载中: @@ -2352,12 +3541,26 @@ To <b>remove a remembered entry</b> from the filter list, first cho ExpoDialog + + + + + + + Flight modes Inputs对话框 飞行模式 [Modes] + + + + + + + Input name Inputs对话框 输入名称 [Input] @@ -2366,30 +3569,79 @@ To <b>remove a remembered entry</b> from the filter list, first cho + + + + + + + + + + + + + + + + + + + + + GV Inputs对话框 GV + + + + + + + Source for the mixer. Inputs对话框 混控的输入源. + + + + + + + Weight Inputs对话框 比例 [Weight] + + + + + + + Switch Inputs对话框 启用开关 [Switch] + + + + + + + Switch used to enable the line. If blank then the input is considered to be "ON" all the time. Inputs对话框 @@ -2398,84 +3650,182 @@ If blank then the input is considered to be "ON" all the time. + + + + + + + Stick Side Inputs对话框 摇杆作用于 [Side] + + + + + + + NEG Inputs对话框 负侧 [NEG] + + + + + + + POS Inputs对话框 正侧 [POS] + + + + + + + ALL Inputs对话框 两侧 [ALL] + + + + + + + Scale Inputs对话框 缩放 [Scale] + + + + + + + Include Trim Inputs对话框 微调 [Trim] + + + + + + + No Inputs对话框 不使用 [OFF] + + + + + + + Yes Inputs对话框 使用 [On] + + + + + + + Curve Inputs对话框 曲线 [Curve] + + + + + + + Curve applied to the source. Inputs对话框 作用于输入源的曲线. + + + + + + + Source Inputs对话框 输入来源 [Source] + + + + + + + Line name Inputs对话框 此条名称 [Line] + + + + + + + Offset Inputs对话框 偏移 [Offset] + + + + + + + The source for the mixer Inputs对话框 混控的输入源 @@ -3120,34 +4470,76 @@ Blank means include all. ?, *, and [...] wildcards accepted. FirmwarePreferencesDialog + + + + + + + Downloads FirmwarePref 下载 + + + + + + + Check for updates FirmwarePref 检查更新 + + + + + + + Firmware FirmwarePref 固件类型 + + + + + + + Download firmware + + + + + + + Download SD contents + + + + + + + Latest Download FirmwarePref 最后下载的固件版本 @@ -3191,67 +4583,158 @@ Blank means include all. ?, *, and [...] wildcards accepted. FlashEEpromDialog + + + + + + + Write Models and Settings to Radio 将模型和设置写入到遥控器 + + + + + + + Load... 加载... + + + + + + + Current Profile 当前文档 + + + + + + + Allows Companion to write to older version of the firmware 允许 Companion 写入旧版本的固件 + + + + + + + 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 写入前备份 + + + + + + + <html><head/><body><p>Modify calibration parameters using settings from current profile</p></body></html> <html><head/><body><p>用当前档案的设置修改校准参数</p></body></html> + + + + + + + Patch calibration setting from profile 依照当前档案修改校准参数 + + + + + + + <html><head/><body><p>Modify HW parameters using settings from current profile</p></body></html> <html><head/><body><p>用当前档案的设置修改硬件参数</p></body></html> + + + + + + + Patch HW settings from profile 依照当前档案修改硬件参数 + + + + + + + Cancel 取消 + + + + + + + Write to TX 写入到遥控器 @@ -3309,71 +4792,169 @@ Blank means include all. ?, *, and [...] wildcards accepted. FlashFirmwareDialog + + + + + + + Flash Firmware 烧录固件 + + + + + + + Load... 加载... + + + + + + + Date & Time 日期 & 时间 + + + + + + + Variant 变体 + + + + + + + Version 版本 + + + + + + + Use profile start screen 使用文档中的开始画面 + + + + + + + Use firmware start screen 使用固件中的开始画面 + + + + + + + Use library start screen 使用图片库中的开始画面 + + + + + + + Use another start screen 使用其他开始画面 + + + + + + + Allows Companion to write to older version of the firmware 允许 Companion 写入旧版本的固件 + + + + + + + Check Hardware compatibility 检查硬件兼容性 + + + + + + + Backup and restore Models and Settings 备份和恢复模型和设置 + + + + + + + Cancel 取消 + + + + + + + Write to TX 写入到遥控器 @@ -3578,24 +5159,52 @@ You are currently using: FlightMode + + + + + + + Fade In FlightMode 切入秒数 [Fade In] + + + + + + + Fade Out FlightMode 切出秒数 [Fade In] + + + + + + + Name FlightMode 名称 [Name] + + + + + + + Switch FlightMode 启用开关 [Switch] @@ -3789,11 +5398,25 @@ You are currently using: FusesDialog + + + + + + + Fuses 熔丝位 + + + + + + + <!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; } @@ -3823,11 +5446,25 @@ p, li { white-space: pre-wrap; } + + + + + + + Read Fuses 读取熔丝位 + + + + + + + <!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; } @@ -3861,6 +5498,13 @@ p, li { white-space: pre-wrap; } + + + + + + + Reset Fuses EEPROM - PROTECT 重设熔丝位 @@ -3868,6 +5512,13 @@ EEPROM - PROTECT + + + + + + + <!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; } @@ -3901,6 +5552,13 @@ p, li { white-space: pre-wrap; } + + + + + + + Reset Fuses EEPROM - DELETE 重设熔丝位 @@ -3908,6 +5566,13 @@ EEPROM - DELETE + + + + + + + <!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; } @@ -3984,21 +5649,49 @@ p, li { white-space: pre-wrap; } GeneralEdit + + + + + + + Radio settings + + + + + + + Retrieve calib. and hw settings from profile 从遥控器档案中读取校准和硬件设定 + + + + + + + Store calib. and hw settings in selected profile 存储校准和硬件设定到选择的遥控器档案 + + + + + + + General settings used throught the transmitter. These will be relevant for all models in the same EEPROM. 遥控器一般设定, 用在整个遥控器上 @@ -4072,133 +5765,322 @@ These will be relevant for all models in the same EEPROM. GeneralSetup + + + + + + + Form GeneralSetup???? 表单 + + + + + + + Readonly Unlock 只读解锁 [Readonly Unlock] + + + + + + + SC + + + + + + + SE + + + + + + + SA + + + + + + + SF + + + + + + + SH + + + + + + + SD + + + + + + + SB + + + + + + + SG + + + + + + + Timeshift from UTC 依照UTC调整时间 [From UTC] + + + + + + + Voice Language 语音语言 [Voice Language] + + + + + + + Country Code 国家代码 [Country Code] + + + + + + + Stick reverse 反向摇杆 [Stick Reverse] + + + + + + + FAI Mode FAI 模式 [FAI Mode] + + + + + + + Automatically adjust the radio's clock if a GPS is connected to telemetry. 如果安装有GPS回传则自动调整遥控器时钟. + + + + + + + Adjust RTC 自动调整时钟 + + + + + + + Vario pitch at max 最大上升率时Vario音调 [Max] + + + + + + + + + + + + + + Hz + + + + + + + Speaker Volume 喇叭音量 [Volume] + + + + + + + Backlight Switch 背光开关 [Switch] + + + + + + + Sound Mode 声音模式 [Sound Mode] + + + + + + + Color 1 颜色 1 + + + + + + + Color 2 颜色 2 + + + + + + + Speaker Pitch (spkr only) 喇叭音调 (仅喇叭) [Pitch] + + + + + + + If this value is not 0, any keypress will turn on the backlight and turn it off after the specified number of seconds. 如果值非0, 任何按键将会开启背光, 并在所设定秒数后关闭. @@ -4206,82 +6088,209 @@ These will be relevant for all models in the same EEPROM. + + + + + + + + + + + + + + + sec 秒 + + + + + + + Backlight color 背光颜色 [Color] + + + + + + + Beeper 蜂鸣器 + + + + + + + Speaker 喇叭 + + + + + + + BeeperVoice 蜂鸣器和语音 + + + + + + + SpeakerVoice 喇叭和语音 + + + + + + + Beep volume 蜂鸣器音量 + + + + + + + Wav volume WAV播放音量 + + + + + + + Vario volume Vario音量 + + + + + + + Background volume 背景音乐音量 + + + + + + + + + + + + + + ms 毫秒 + + + + + + + Backlight Auto OFF after 背光自动关闭时间 [Duration] + + + + + + + Backlight flash on alarm 告警时背光闪烁 [Alarm] + + + + + + + Vario pitch at zero 升降率为0时Vario音调 [Zero] + + + + + + + Vario repeat at zero 升降率0时Vario重复率 [Repeat] + + + + + + + This is the switch selectrion for turning on the backlight (if installed). @@ -4293,6 +6302,20 @@ These will be relevant for all models in the same EEPROM. + + + + + + + + + + + + + + <!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; } @@ -4308,36 +6331,85 @@ p, li { white-space: pre-wrap; } + + + + + + + Backlight Brightness 背光亮度 [Brightness] + + + + + + + RotEnc Navigation 旋转编码器导航 [RotEnc] + + + + + + + America 美国 + + + + + + + Japan 日本 + + + + + + + Europe 欧洲 + + + + + + + Backlight OFF Brightness + + + + + + + Mode selection: Mode 1: @@ -4379,257 +6451,609 @@ MODE4 模式4: + + + + + + + Mode 1 (RUD ELE THR AIL) MODE1 日本手↕升降↔方向 ↕油门↔副翼 + + + + + + + Mode 2 (RUD THR ELE AIL) MODE2 美国手↕油门↔方向 ↕升降↔副翼 + + + + + + + Mode 3 (AIL ELE THR RUD) MODE3 中国手↕升降↔副翼 ↕油门↔方向 + + + + + + + Mode 4 (AIL THR ELE RUD) MODE4 模式4 ↕油门↔副翼 ↕升降↔方向 + + + + + + + <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> + + + + + + + If you enable FAI, only RSSI and RxBt sensors will keep working. This function cannot be disabled by the radio. + + + + + + + RSSI Poweroff Warning + + + + + + + Low EEPROM Warning + + + + Owner Registration ID + + + + aaaaaaAA + + + + + + + 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 + + + + + + + Jack Mode + + + + + + + Audio + + + + + + + Trainer 教练功能 + + + + + + + DMS + + + + + + + USB Mode + + + + Power Off Delay + + + + + + + + + + + + + + Ask on Connect + + + + + + + Joystick (HID) + + + + + + + USB Mass Storage + + + + + + + USB Serial (CDC) + + + + + + + Stick Mode 摇杆模式 [MODE] + + + + + + + Metric 公制 [Metric] + + + + + + + Imperial 英制 [Imperial] + + + + + + + Default Channel Order 默认通道顺序[Default Ch Order] + + + + + + + GPS Coordinates GPS坐标格式 [GPS Coordinates] + + + + + + + Min GeneralEdit 最小 @@ -4637,75 +7061,187 @@ MODE4 模式4: + + + + + + + + + + + + + + v GeneralEdit v + + + + + + + Max GeneralEdit 最大 + + + + + + + Inactivity Timer 忘记关机定时器 [Inactivity] + + + + + + + Show Splash Screen on Startup 显示开机画面 [Splash Screen] + + + + + + + Contrast 显示屏对比度 [Contrast] + + + + + + + Battery Meter Range 遥控器电池图标范围 [Range] + + + + + + + Haptic Strength 振动强度 [Haptic Strength] + + + + + + + LCD Display Type LCD显示屏类型 [LCD Disp Type] + + + + + + + "No Sound" Warning 当静音时 开机告警 [Sound Off] + + + + + + + Battery Warning 遥控器电量警告 [Battery Low] + + + + + + + Haptic Length 振动时长 [Haptic Length] + + + + + + + MAVLink Baud Rate MAVLink 波特率 [Baud Rate] + + + + + + + + + + + + + + Quiet GeneralEdit 禁用 [Quiet] + + + + + + + Only Alarms GeneralEdit 只有告警 [Alarm] @@ -4713,6 +7249,20 @@ MODE4 模式4: + + + + + + + + + + + + + + No Keys GeneralEdit 忽略按键 [NoKey] @@ -4720,12 +7270,33 @@ MODE4 模式4: + + + + + + + + + + + + + + All GeneralEdit 开启 [All] + + + + + + + Battery warning voltage. This is the threashhold where the battery warning sounds. @@ -4737,114 +7308,268 @@ Acceptable values are 5v..10v + + + + + + + Standard 标准LCD [Standard] + + + + + + + Optrex GeneralEdit 光王LCD [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 + + + + + + + --- GeneralEdit + + + + + + + 2s GeneralEdit + + + + + + + 3s GeneralEdit + + + + + + + 4s GeneralEdit + + + + + + + 6s GeneralEdit + + + + + + + 8s + + + + + + + 10s + + + + + + + 15s + + + + + + + 4800 Baud GeneralEdit + + + + + + + 9600 Baud + + + + + + + 14400 Baud + + + + + + + 19200 Baud + + + + + + + 38400 Baud + + + + + + + 57600 Baud + + + + + + + 76800 Baud + + + + + + + 115200 Baud @@ -4852,6 +7577,27 @@ Acceptable values are 5v..10v + + + + + + + + + + + + + + + + + + + + + <!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; } @@ -4868,6 +7614,20 @@ p, li { white-space: pre-wrap; } + + + + + + + + + + + + + + X-Short GeneralEdit 极短 @@ -4875,6 +7635,20 @@ p, li { white-space: pre-wrap; } + + + + + + + + + + + + + + Short GeneralEdit 较短 @@ -4882,12 +7656,40 @@ p, li { white-space: pre-wrap; } + + + + + + + + + + + + + + Normal 正常 + + + + + + + + + + + + + + Long GeneralEdit 较长 @@ -4895,43 +7697,106 @@ p, li { white-space: pre-wrap; } + + + + + + + + + + + + + + X-Long 极长 + + + + + + + NMEA GeneralEdit + + + + + + + Play Delay (switch mid position) 开关拨过中档时播音延迟 [Delay] + + + + + + + Measurement Units 单位制 [Units] + + + + + + + Haptic Mode GeneralEdit 振动 [Haptic Mode] + + + + + + + Beeper Length 蜂鸣时长 [Beep Length] + + + + + + + Beeper Mode 蜂鸣音 [Beep Mode] + + + + + + + Beeper volume 0 - Quiet. No beeps at all. @@ -4943,10 +7808,27 @@ p, li { white-space: pre-wrap; } + + + + + + + Alarms Only GeneralEdit 只有告警 [Alarm] + + + Power On Speed + + + + + Power Off Speed + + GeneralSetupPanel @@ -5101,252 +7983,596 @@ Are you sure ? Hardware + + + + + + + Form Hardware 表单 + + + + + + + SQ + + + + + + + SR + + + + + + + LS2 LS2 滑杆 + + + + + + + SP + + + + + + + SO + + + + + + + S4 S4 旋钮 + + + + + + + RS RS 滑杆 + + + + + + + SB + + + + + + + PPM 2 教练口信号2 [PPM 2] + + + + + + + OFF 关闭 [OFF] + + + + + + + S-Port Mirror S-Port 镜像 [S-Port Mirror] + + + + + + + Telemetry 回传 [Telemetry] + + + + + + + SBUS Trainer SBUS 教练功能 [SBUS Trainer] + + + + + + + Debug 除错 [Debug] + + + + + + + Rud Rud 摇杆 + + + + + + + PPM 3 教练口信号3 [PPM 3] + + + + + + + S1 S1 旋钮 + + + + + + + S2 S2 旋钮 + + + + + + + S3 S3 旋钮 + + + + + + + PPM 1 教练口信号1 [PPM 1] + + + + + + + Serial Port 串口 [Serial Port] + + + + + + + v + + + + + + + PPM Multiplier 教练口信号系数 [PPM Multiplier] + + + + + + + Current Offset 当前修正 [Offset] + + + + + + + PPM 4 教练口信号4 [PPM 4] + + + + + + + SA + + + + + + + Ele Ele 摇杆 + + + Antenna + + + + + S5 S5 旋钮 + + + + + + + Ail Ail 摇杆 + + + + + + + Thr Thr 摇杆 + + + + + + + SC + + + + + + + LS LS 滑杆 + + + + + + + SD + + + + + + + Battery Offset 控电电压修正 [Battery Offset] + + + + + + + SE + + + + + + + SF + + + + + + + SG + + + + + + + SH + + + + + + + SI + + + + + + + SJ + + + + + + + SK + + + + + + + SL + + + + + + + SM + + + + + + + SN + + + + + + + RS2 RS2 滑杆 + + + + + + + Bluetooth 蓝牙 [Bluetooth] + + + + + + + ADC Filter + + + + + + + Device Name: @@ -5445,71 +8671,169 @@ Are you sure ? Heli + + + + + + + Off 禁用 + + + + + + + 120 + + + + + + + 120X + + + + + + + 140 + + + + + + + 90 + + + + + + + Invert Elevator 升降反向 [Ele] + + + + + + + Invert Aileron 副翼反向 [Ail] + + + + + + + Invert Collective 总距反向 {Col] + + + + + + + Long. cyc 纵向循环螺距 [Long] + + + + + + + Invert 反向 [Invert] + + + + + + + Swash Ring 斜盘限位 [Swach RIng] + + + + + + + Swash Type 斜盘类型 [Swach Type] + + + + + + + Lateral cyc 横向循环螺距 [Lateral] + + + + + + + Collective 总距 [Collective] @@ -5911,47 +9235,110 @@ Are you sure ? LogsDialog + + + + + + + Companion Log Viewer Companion Log 查看器 + + + + + + + Fly sessions LogsDialog 飞行起落 + + + + + + + Save session CSV + + + + + + + Zoom 缩放 + + + + + + + X + + + + + + + Y + + + + + + + Reset 重设 + + + + + + + Filename 文件名 + + + + + + + Open LogFile 打开 Log 文件 @@ -7448,26 +10835,59 @@ Do you want to save your changes? MixerDialog + + + + + Dialog 对话框 + + + + + + + Delay 延迟 [Delay] + + + + + + + Slow 慢动作 [Slow] + + + + + + + Up 正向 [Up] + + + + + + + Down 负向 [Dn] @@ -7476,6 +10896,34 @@ Do you want to save your changes? + + + + + + + + + + + + + + + + + + + + + + + + + + + + <!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; } @@ -7501,62 +10949,146 @@ p, li { white-space: pre-wrap; } + + + + + + + Include Trim 微调 [Trim] + + + + + + + Offset 偏移 [Offset] + + + + + + + Weight 比例 [Weight] + + + + + + + Name 名称 [Name] + + + + + + + Source 第一次出现 Mixer的主页条目概览中 输入源 [Source] + + + + + + + Multiplex 混控方式 [Multiplex] + + + + + + + Warning 启用时蜂鸣 [Warning] + + + + + + + The curve used by the mix 此混控使用的曲线 + + + + + + + Include DR/Expo 使用 DR/Expo + + + + + + + Flight modes 飞行模式 [Modes] + + + + + + + Switch 开启开关 [Switch] + + + + + + + Mixer warning. Setting this value will cause a beep to be emmitted when this value is active. 混控警告 @@ -7564,33 +11096,75 @@ Setting this value will cause a beep to be emmitted when this value is active. + + + + + + + OFF 1声蜂鸣 [1] 关闭 [OFF] + + + + + + + 1 Beep 1声蜂鸣 [1] + + + + + + + 2 Beep 2声蜂鸣 [2] + + + + + + + 3 Beep 3声蜂鸣 [3] + + + + + + + No 禁用微调 用在FM设定中 不使用 [OFF] + + + + + + + Yes 不使用 [OFF] 使用 [On] @@ -7599,6 +11173,27 @@ Setting this value will cause a beep to be emmitted when this value is active. + + + + + + + + + + + + + + + + + + + + + GV @@ -7607,11 +11202,46 @@ Setting this value will cause a beep to be emmitted when this value is active. + + + + + + + + + + + + + + + + + + + + + + + + + + + + The source for the mixer 混控的输入源 + + + + + + + Multiplexer This determines how mixer values are added. @@ -7632,27 +11262,62 @@ This determines how mixer values are added. + + + + + + + ADD 与前一行的输出值相加后输出 [Add] + + + + + + + MULTIPLY 与前一行的输出值相乘后输出 [Multiply] + + + + + + + REPLACE 与前一行的输出值相乘后输出 [Multiply] 取代前一行的输出值 [Replace] + + + + + + + Curve 曲线 [Curve] + + + + + + + Switch used by the mix. If blank then the mix is considered to be "ON" all the time. 用来开启此条混控的开关 @@ -7683,6 +11348,12 @@ If blank then the mix is considered to be "ON" all the time. Invert All + + + + FullScreenDialog + + MixersListWidget @@ -7856,11 +11527,23 @@ If blank then the mix is considered to be "ON" all the time. ModelEdit + + + + + Dialog 对话框 + + + + + + + Simulate 遥控器模拟器 @@ -7916,6 +11599,12 @@ If blank then the mix is considered to be "ON" all the time. Telemetry 回传设置 Tele + + + + FullScreenDialog + + ModelPrinter @@ -8739,128 +12428,300 @@ If blank then the mix is considered to be "ON" all the time. Module + + + + + + + CH 通道 + + + + + + + Failsafe Mode 失控保护方式 [Failsafe Mode] + + + + + + + Start 开始通道 [CH] + + + + + + + PPM delay PPM 延迟 [Delay] + + + + + + + us 微秒 + + + + + + + Negative 负 [Negative] + + + + + + + Positive 正 [Positive] + + + + + + + RF Output Power + + + + + + + Antenna + + + + + + + Option value + + + + + + + Sub Type + + + + + + + Master/Jack 教练主机/教练线插口 [Master/Jack] + + + + + + + Slave/Jack 教练从机/教练线插口 [Slave/Jack] + + + + + + + Master/SBUS Module 教练主机/SBUS 模块 [Master/SBUS] + + + + + + + Master/CPPM Module 教练主机/CPPM 模块 [Master/CPPM] + + + + + + + Master/SBUS in battery compartment 教练主机/SBUS 电池盒中插座 + + + + + + + Show values in: + + + + + + + % abbreviation for percent + + + + + + + μs abbreviation for microseconds + + + + + + + Polarity 极性 [Polarity] + + + + + + + Trainer Mode 教练功能模式 [Trainer Mode] + + + + + + + ms 毫秒 + + + + + + + PPM Frame Length PPM帧长 [Frame Length] + + + + + + + Channels 通道数 [Channels] + + + + Receiver 1 @@ -8868,108 +12729,260 @@ If blank then the mix is considered to be "ON" all the time. + + + + + + + + + + + + X + + + + Receiver 2 + + + + Receiver 3 + + + + + + + WARNING: changing RF Output Power needs RE-BIND + + + + Registration ID + + + + + + + WARNING: Requires non-certified firmware! + + + + + + + Not set 未设置 + + + + + + + Hold 自定义 [Custom]]]]] 保持 [Hold] + + + + + + + Custom 自定义 [Custom]]]]] 自定义 [Custom] + + + + + + + No Pulses 自定义 [Custom]]]]] 不输出脉冲 [No Puls] + + + + + + + Receiver 自定义 [Custom]]]]] 接收机设置[Reciever] + + + + + + + Failsafe Positions 失控保护位置 [F.s. Positons] + + + + + + + Protocol 遥控器射频协议 [Protocol] + + + + + + + Multi Radio Protocol 多遥控协议 [Multi Protocal] + + + + + + + Receiver No. 接收机编号 [Receiver No.]. + + + + + + + Output type 输出类型 [Output type] + + + + + + + Open Drain 开漏输出 [Open Drain] + + + + + + + Push Pull 推挽输出 [Push Pull] + + + + + + + Bind on startup 开机时对频[Bind] + + + + + + + Low Power 低功率[Range] + + + + + + Internal + + + + + + + + Ext. + Int. + + ModuleData @@ -9710,21 +13723,49 @@ If blank then the mix is considered to be "ON" all the time. PrintDialog + + + + + + + Close 关闭 + + + + + + + Style + + + + + + + Print 打印 + + + + + + + Print to file 打印到文件 @@ -9748,11 +13789,25 @@ If blank then the mix is considered to be "ON" all the time. ProgressDialog + + + + + + + Flash Firmware 烧录固件 + + + + + + + Close 关闭 @@ -9767,6 +13822,13 @@ If blank then the mix is considered to be "ON" all the time. ProgressWidget + + + + + + + Show Details 显示详情 @@ -9920,16 +13982,37 @@ If blank then the mix is considered to be "ON" all the time. RadioNotFoundDialog + + + + + + + No Radio Found 未找到遥控器 + + + + + + + <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>未找到遥控器!</p><p>先将这两个微调按钮同时保持拨向内侧, 然后再打开遥控器.</p><p>开机后再插上USB线.</p><p><span style=" font-family:'arial,sans-serif'; font-size:13px; font-style:italic; color:#222222; background-color:#ffffff;">提示:如果你的X9D遥控器尚未升级到2.0版本, 则不能使用这个版本的 Compaion 程序.</span></p></body></html> + + + + + + + OK @@ -9938,43 +14021,99 @@ If blank then the mix is considered to be "ON" all the time. RadioOutputsWidget - + + + + + + + + + Form 表单 - + + + + + + + + + View: - + + + + + + + + + Logical Switches - + + + + + + + + + Global Variables 全局变量 [Global Variables] - + + + + + + + + + Channel Outputs - + + + + + + + + + Mix Outputs - + + + + + + + + + L o g @@ -9984,7 +14123,15 @@ c - + + + + + + + + + G l o @@ -9995,7 +14142,15 @@ l - + + + + + + + + + C h a @@ -10008,7 +14163,15 @@ s - + + + + + + + + + M i x @@ -10849,84 +15012,196 @@ s Setup + + + + + + + Timer 1 计时器 1 [Timer 1] + + + + + + + Top LCD Timer 顶部 LCD 计时器 + + + + + + + Model Image 模型图片 [Medel Image] + + + + + + + Warnings 告警 [Warnings] + + + + + + + Switch Warnings 开关位置告警 [Switch Positions] + + + + + + + Pot Warnings 旋钮位置告警 [Pot Positions] + + + + + + + OFF 关闭 [OFF] + + + + + + + Manual 手动 [Manual] + + + + + + + Auto 用关机位置 [Auto] + + + + + + + Model 模型名称 [Model Name] + + + + + + + Center beep 回中蜂鸣 [Center Beep] + + + + + + + Edit Checklist... + + + + + + + Extended Trims 微调范围扩展 [Extended Trims] + + + + + + + Display Checklist 显示检查单 [Checklist] + + + + + + + Extended Limits 舵机上下限扩展 [Extended Limits] + + + + + + + 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. @@ -10938,93 +15213,212 @@ If this is checked the throttle will be reversed. Idle will be forward, trim wi + + + + + + + Reverse Throttle 油门杆反向 {Reverse] + + + + + + + Throttle Trim Idle Only 油门微调只改变怠速 [Trim Idle] + + + + + + + Throttle Warning 油门杆位置告警 [Throttle State] + + + + + + + Exponential 先小后大 [Exp] + + + + + + + Extra Fine 很小 [Extra Fine] + + + + + + + Fine 较小 [Fine] + + + + + + + Medium 中等 [Medium] + + + + + + + Coarse 较大 [Coarse] + + + + + + + Never 微调从不显示在LCD显示屏上 从不 [Never] + + + + + + + On change ????意思是说微调在拨动微调开关时才在LCD显示屏上显示 调整时 [On change] + + + + + + + Always 微调一直显示在LCD显示屏上 一直 [Always] + + + + + + + Global Functions 全局功能 [Global Functions] + + + + + + + Throttle Source 设为油门杆 [Thr Source] + + + + + + + Trim Step 微调步幅 [Trim Step] + + + + + + + Trims Display 微调显示 [Trims Display] + + + + + + + Timer 2 计时器 2 [Timer 2] + + + + + + + Timer 3 计时器 3 [Timer 3] @@ -11394,181 +15788,421 @@ Profile ID: [%1]; Radio ID: [%2] SimulatorMainWindow - + + + + + + + + + OpenTx Simulator - + + + + + + + + + View - + + + + + + + + + Radio Window - + + + + + + + + + Reload... - + + + + + + + + + Tools - + + + + + + + + + Toolbar - + + + + + + + + + Reload Lua Scripts 载入 Lua 脚本 - + + + + + + + + + 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. @@ -11649,76 +16283,172 @@ Profile ID: [%1]; Radio ID: [%2] 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... @@ -11726,59 +16456,147 @@ The radio type specified in the selected profile is used by default. - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + ... - + + + + + + + + + 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 @@ -11807,7 +16625,15 @@ The default is configured in the chosen Radio Profile. SimulatorWidget - + + + + + + + + + Companion Simulator Companion 模拟器 @@ -11895,6 +16721,20 @@ The default is configured in the chosen Radio Profile. + + + + + + + + + + + + + + ... @@ -11934,6 +16774,13 @@ The default is configured in the chosen Radio Profile. StyleEditDialog + + + + + + + @@ -11942,21 +16789,49 @@ The default is configured in the chosen Radio Profile. + + + + + + + &Reset to default + + + + + + + &Cancel + + + + + + + &OK + + + + + + + This feature does not validate your changes and assumes you are familiar with CSS syntax for QT. @@ -12214,191 +17089,476 @@ Too many errors, giving up. Telemetry + + + + + + + Protocol 协议 + + + + + + + Alarm 1 警告 1 + + + + + + + + + + + + + + ---- + + + + + + + + + + + + + + Yellow 黄色警告 + + + + + + + + + + + + + + Orange 橙色警告 + + + + + + + + + + + + + + Red 红色警告 + + + + + + + Alarm 2 警告 2 + + + + + + + RSSI + + + + + + + Disable telemetry audio warnings + + + + + Source + + + + + + + A1 A1 模拟值1 + + + + + + + A2 A2 模拟值2 + + + + + + + Sink Max 最大下降率 + + + + + + + Climb Max 最大爬升 + + + + + + + Sink Min 最小下降率 + + + + + + + Climb Min 最小爬升 + + + + + + + Center Silent 中间静音 + + + + + + + Vario limits Vario 限值 + + + + + + + Vario source Vario 传感器 + + + + + + + Altimetry 高度计 + + + + + + + Altitude source 高度传感器 + + + + + + + Volts source 电压传感器 + + + + + + + Top Bar 顶部横条 + + + + + + + Volt source 电压传感器 + + + + + + + Current source 当前源 + + + + + + + Blades 旋翼数 + + + + + + + mAh count + + + + + + + mAh + + + + + + + A + + + + + + + FAS Offset FAS偏移 + + + + + + + Persistent mAh 保持mAh + + + + + + + Various ???? 不同的 + + + + + + + Serial Protocol 串口协议 + + + + + + + None + + + + + + + FrSky Sensor Hub FrSky Sensor Hub + + + + + + + Sensors 传感器 + + + + + + + Disable multi sensor handling 禁止多传感器处理 @@ -12407,107 +17567,289 @@ Too many errors, giving up. TelemetryAnalog + + + + + + + Unit 单位 + + + + + + + Max Value 最大值 + + + + + + + Alarm 1 警告 1 + + + + + + + + + + + + + + ---- + + + + + + + + + + + + + + Yellow 黄色警告 + + + + + + + + + + + + + + Orange + + + + + + + + + + + + + + Red 红色警告 + + + + + + + + + + + + + + < + + + + + + + + + + + + + + > + + + + + + + Alarm 2 警告 2 + + + + + + + Offset + + + + + + + Volts (V) 电压 (V) + + + + + + + Amps (A) 电流 (A) + + + + + + + Speed (m/s or ft/s) 速度 (m/s or ft/s) + + + + + + + Raw (-) 原始值 (-) + + + + + + + Speed (km/h or miles/h) 速度 ( km/h 或 miles/h) + + + + + + + Meters (m or ft) 高度 (米或英尺) + + + + + + + Temp (°) 温度 (°) + + + + + + + Fuel (%) 油量 (%) + + + + + + + mAmps (mA) 电流 (mA) @@ -12521,26 +17863,61 @@ Too many errors, giving up. TelemetryCustomScreen + + + + + + + Custom Screen Type 自定义屏幕类型 + + + + + + + Min 最小 + + + + + + + Source 来源 + + + + + + + Gauge 仪表盘 + + + + + + + Max 最大 @@ -12675,86 +18052,199 @@ Too many errors, giving up. TelemetrySensor + + + + + + + Form 表单 + + + + + + + Custom 自定义 + + + + + + + Calculated 运算 + + + + + + + Id + + + + + + + Instance 对象 + + + + Rx + + + + Mod. + + + + + + + Add 加 + + + + + + + Average 平均值 + + + + + + + Min 最小 + + + + + + + Max 最大 + + + + + + + Multiply 乘以 + + + + + + + Totalize 总计 + + + + + + + Cell 锂电单片电压 + + + + + + + Consumption 消耗 + + + + + + + Dist 距离 + + + + + + + Cells Sensor : 锂电电压传感器 : @@ -12767,191 +18257,506 @@ Too many errors, giving up. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --- + + + + + + + GPS Sensor : GPS 传感器 : + + + + + + + Alt. Sensor : 高度传感器 : + + + + + + + Sensor : 传感器 : + + + + + + + Raw (-) 原始值 (-) + + + + + + + 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. + + + + + + + Precision 精确度 + + + + + + + Ratio 比例 + + + + + + + Blades 旋翼数 + + + + + + + Offset 偏移 + + + + + + + Multiplier 系数 + + + + + + + Auto Offset 自动偏移 + + + + + + + Filter 过滤器 + + + + + + + Persistent 保持 + + + + + + + Positive 正向 + + + + + + + Logs LOG记录 @@ -12983,115 +18788,267 @@ Too many errors, giving up. TelemetrySimulator - + + + + + + + + + Telemetry Simulator 回传模拟器 - + + + + + + + + + When enabled, sends any non-blank values as simulated telemetry data. 如果允许 =, 发送任何非空值作为回传模拟数据. - + + + + + + + + + Simulate 模拟 - + + + + + + + + + Replay SD Log File 重播 SD Log 文件 - + + + + + + + + + Replay rate - + + + + + + + + + |> - + + + + + + + + + <| - + + + + + + + + + > - + + + + + + + + + <- - + + + + + + + + + X - + + + + + + + + + 1/5x 1/5x - + + + + + + + + + 5x 5x - + + + + + + + + + No Log File Currently Loaded 现在没有载入任何 log 文件 - + + + + + + + + + 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. - + + + + + + + + + Load 载入 - + + + + + + + + + Row # Timestamp 行数 @@ -13099,7 +19056,15 @@ Timestamp - + + + + + + + + + RxBt RxBt 接收机电压 @@ -13107,15 +19072,47 @@ Timestamp - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + V / ratio 伏 / 比值 - + + + + + + + + + RAS @@ -13133,38 +19130,166 @@ Timestamp - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <html><head/><body><p><br/></p></body></html> - + + + + + + + + + VFAS VFAS FAS传感器电压 - + + + + + + + + + Lat,Lon (dec.deg.) - + + + + + + + + + dd-MM-yyyy hh:mm:ss @@ -13172,166 +19297,414 @@ hh:mm:ss - - + + + + + + + + + + + + + + + + + + Volts V - + + + + + + + + + RSSI RSSI 信号强度 - + + + + + + + + + Db - + + + + + + + + + Curr Curr 电流 - + + + + + + + + + Amps A - + + + + + + + + + Cels Cells 锂电电压 - + + + + + + + + + A1 A1 模拟值1 - + + + + + + + + + A2 A2 模拟值2 - + + + + + + + + + ASpd ASpd 空速 - - + + + + + + + + + + + + + + + + + + km/h - + + + + + + + + + A3 A3 模拟值3 - + + + + + + + + + GAlt GALT GPS高度 - - + + + + + + + + + + + + + + + + + + Meters m - + + + + + + + + + A4 A4 模拟值4 - + + + + + + + + + GSpd GSpd GPS速度 - + + + + + + + + + Tmp1 Tmp1 温度1 - + + + + + + + + + Hdg Hdg 航向角 - + + + + + + + + + Degrees ° - + + + + + + + + + Tmp2 Tmp2 温度2 - - + + + + + + + + + + + + + + + + + + °C - + + + + + + + + + Date Date 日期 - - + + + + + + + + + + + + + + + + + + RPM Rpm - + + + + + + + + + GPS - + + + + + + + + + Fuel Fule 燃油 - + + + + + + + + + % - + + + + + + + + + AccX AccX X轴加速度 @@ -13339,51 +19712,131 @@ hh:mm:ss - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + G G - + + + + + + + + + Fuel Qty Fule Qty 油量 - + + + + + + + + + ml - + + + + + + + + + AccY AccY Y轴加速度 - + + + + + + + + + VSpd VSpd 垂直速度 - + + + + + + + + + m/s - + + + + + + + + + AccZ AccZ Z轴加速度 - + + + + + + + + + Alt Alt 高度 @@ -13425,11 +19878,25 @@ hh:mm:ss Timer + + + + + + + Countdown 倒数报数 + + + + + + + Minute Call 分钟提示 @@ -13513,26 +19980,61 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. Trainer + + + + + + + Form 表单 + + + + + + + Mode 模式 + + + + + + + Input 输入 + + + + + + + Weight 比例 + + + + + + + Rud 方向通道 @@ -13545,6 +20047,62 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Beeper volume 0 - Quiet. No beeps at all. @@ -13565,6 +20123,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + Off 关闭 @@ -13573,6 +20159,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + += (Sum) += (相加) @@ -13581,6 +20195,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + := (Replace) := (取代) @@ -13589,6 +20231,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn1 通道1 @@ -13597,6 +20267,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn2 通道2 @@ -13605,6 +20303,34 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn3 通道3 @@ -13613,21 +20339,70 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + chn4 通道4 + + + + + + + Ele 升降通道 + + + + + + + Thr 油门通道 + + + + + + + Ail 副翼通道 @@ -13636,7 +20411,15 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. TrainerSimulator - + + + + + + + + + Trainer simulator 教练功能模拟 @@ -14061,12 +20844,33 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. burnConfigDialog + + + + + + + Programmer Configuration 编程器配置 + + + + + + + + + + + + + + Location of sam-ba executable 定位 sam-ba 可执行文件 @@ -14075,16 +20879,58 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + + + + + + + + The location of the AVRDUDE executable. AVRDUDE可执行文件位置. + + + + + + + DFU-Util Location DFU-Util 程序位置 + + + + + + + Location of AVRDUDE executable AVRDUDE可执行文件位置 @@ -14092,6 +20938,27 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + Use this button to browse and look for the AVRDUDE executable file. 使用这个按钮定位AVRDUDE可执行文件. @@ -14099,16 +20966,51 @@ CTRL + scroll or PAGE UP/DOWN keys to change time in larger steps. + + + + + + + + + + + + + + + + + + + + + Browse... 浏览... + + + + + + + Programmer 编程器 + + + + + + + Programmer used for communicating with the controller. Please consult the programmer's documentation and the AVRDUDE documentation to select the appropriate programmer. 与遥控器通讯用的编程器. @@ -14116,23 +21018,65 @@ Please consult the programmer's documentation and the AVRDUDE documentation + + + + + + + List all available programmers. 列出所有可用的编程器. + + + + + + + List Available 列出可用 + + + + + + + + + + + + + + Extra arguments that will be passed to AVRDUDE on every call 每次调用时将会把更多的参数将会传到给AVRDUDE + + + + + + + + + + + + + + Extra arguments used in AVRDUDE. This can be used for providing extra information to AVRDUDE. @@ -14144,21 +21088,49 @@ Please only use this if you know what you are doing. There are no error checks + + + + + + + Extra Arguments 更多参数 + + + + + + + Show AVRDUDE help 显示AVRDUDE帮助 + + + + + + + Show Help 显示帮助 + + + + + + + Communication port to the programmer. 编程器通讯端口. @@ -14167,28 +21139,84 @@ Please only use this if you know what you are doing. There are no error checks + + + + + + + + + + + + + + Port 端口 + + + + + + + AVRDUDE Location AVRDUDE 位置 + + + + + + + MCU MCU + + + + + + + + + + + + + + CPU of your TX 你的遥控器所用CPU + + + + + + + + + + + + + + CPU present on your 9x radio Should be m64 for stock radios m2560 for v4.1 boards @@ -14198,31 +21226,73 @@ v4.1版电路板应为m2560 + + + + + + + at91sam3s8-9xr at91sam3s8-9xr + + + + + + + SAM-BA Location SAM-BA 位置 + + + + + + + ARM MCU ARM MCU + + + + + + + sam-ba serial port sam-ba 串口 + + + + + + + Alternate device 其他设备 + + + + + + + Use advanced controls 使用高级控制项 @@ -14268,85 +21338,197 @@ v4.1版电路板应为m2560 joystickDialog - + + + + + + + + + Configure Joystick 配置游戏杆 - + + + + + + + + + Ch2 游戏杆通道2 - + + + + + + + + + Ch1 游戏杆通道1 - + + + + + + + + + Ch4 游戏杆通道4 - + + + + + + + + + Ch6 游戏杆通道6 - + + + + + + + + + Ch3 游戏杆通道3 - + + + + + + + + + Ch5 游戏杆通道5 - + + + + + + + + + Ch7 游戏杆通道7 - + + + + + + + + + Ch8 游戏杆通道8 - + + + + + + + + + Instructions 指令 - + + + + + + + + + Enable - + + + + + + + + + Cancel 取消 - + + + + + + + + + Back - + + + + + + + + + Start 开始通道 [CH] @@ -14357,7 +21539,15 @@ v4.1版电路板应为m2560 - + + + + + + + + + Ok 确定 diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 84591767f..d7a5397c4 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -2,7 +2,7 @@ include(CMakeForceCompiler) include(Bitmaps) set(PCB_TYPES X9LITE X7 XLITE XLITES X9D X9D+ X9E X10 X12S SKY9X 9XRPRO AR9X NV14) -set(GUI_LANGUAGES CZ DE EN ES FR IT PT SK SE PL HU NL) +set(GUI_LANGUAGES CZ DE EN ES FR IT PT SK SE PL HU NL CN) set(TTS_LANGUAGES CZ DE EN ES FR IT PT SK SE PL HU NL RU) set(PCB "X9D+" CACHE STRING "Radio type, one of: ${PCB_TYPES}") @@ -247,7 +247,7 @@ endif() if(SDCARD) add_definitions(-DSDCARD) include_directories(${FATFS_DIR} ${FATFS_DIR}/option) - set(SRC ${SRC} sdcard.cpp rtc.cpp logs.cpp) + set(SRC ${SRC} sdcard.cpp rtc.cpp logs.cpp thirdparty/libopenui/src/libopenui_file.cpp) set(FIRMWARE_SRC ${FIRMWARE_SRC} ${FATFS_SRC}) endif() diff --git a/radio/src/audio.cpp b/radio/src/audio.cpp index caa15119d..7403d52b9 100644 --- a/radio/src/audio.cpp +++ b/radio/src/audio.cpp @@ -1261,3 +1261,13 @@ void pushPrompt(uint16_t prompt, uint8_t id) audioQueue.playFile(filename, 0, id); #endif } + +void onKeyPress() +{ + audioKeyPress(); +} + +void onKeyError() +{ + audioKeyError(); +} \ No newline at end of file diff --git a/radio/src/bitfield.h b/radio/src/bitfield.h deleted file mode 100644 index a0c753e0f..000000000 --- a/radio/src/bitfield.h +++ /dev/null @@ -1,88 +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 - * - * This file is based on work published at http://www.coranac.com/documents/working-with-bits-and-bitfields - * - * 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 BITFIELD_H -#define BITFIELD_H - -#include - -// A set of bitfield handling macros - -template -inline T bfBit(uint8_t n) -{ - return T(1) << n; -} - -#define BFBIT_SET(y, mask) ( y |= (mask) ) -#define BFBIT_CLEAR(y, mask) ( y &= ~(mask) ) -#define BFBIT_FLIP(y, mask) ( y ^= (mask) ) -#define BF_SINGLE_BIT_SET(y, i) BFBIT_SET(y, bfBit(i)) - -//! Create a bitmask of length 'len'. -template -inline T bfBitmask(uint8_t len) -{ - return bfBit(len) - 1; -} - -//! Create a bitfield mask of length 'len' starting at bit 'start'. -template -inline T bfMask(uint8_t start, uint8_t len) -{ - return bfBitmask(len) << start; -} - -//! Prepare a bitmask for insertion or combining. -template -inline T bfPrep(T x, uint8_t start, uint8_t len) -{ - return (x & bfBitmask(len)) << start; -} - -//! Extract a bitfield of length 'len' starting at bit 'start' from 'y'. -template -inline T bfGet(T y, uint8_t start, uint8_t len) -{ - return ((y)>>(start)) & bfBitmask(len); -} - -//! Insert 'len' bits of 'x 'into 'y', starting at bit 'start' from 'y'. -template -inline T bfSet(T to, T from, uint8_t start, uint8_t len) -{ - return (to & ~bfMask(start, len)) | bfPrep(from, start, len); -} - -template -inline T bfBitGet(T y, T mask) -{ - return (y & mask); -} - -template -inline T bfSingleBitGet(T y, uint8_t i) -{ - return bfBitGet(y, bfBit(i)); -} - -#endif //BITFIELD_H diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index cf4c5dcab..c5c3458b5 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -25,7 +25,6 @@ #include "board.h" #include "dataconstants.h" #include "definitions.h" -#include "bitfield.h" #if defined(PCBTARANIS) #define N_TARANIS_FIELD(x) @@ -55,12 +54,6 @@ #define NOBACKUP(...) __VA_ARGS__ #endif -#if defined(PCBFRSKY) -typedef uint16_t source_t; -#else -typedef uint8_t source_t; -#endif - /* * Mixer structure */ @@ -183,8 +176,6 @@ PACK(struct trim_t { uint16_t mode:5; }); -typedef int16_t gvar_t; - PACK(struct FlightModeData { trim_t trim[NUM_TRIMS]; NOBACKUP(char name[LEN_FLIGHT_MODE_NAME]); @@ -725,7 +716,7 @@ PACK(struct TrainerData { #define THEME_NAME_LEN 8 #define THEME_DATA \ NOBACKUP(char themeName[THEME_NAME_LEN]); \ - NOBACKUP(Theme::PersistentData themeData); + NOBACKUP(ThemeBase::PersistentData themeData); #else #define THEME_DATA #endif diff --git a/radio/src/fonts/truetype/CMakeLists.txt b/radio/src/fonts/truetype/CMakeLists.txt index ee4809c66..fbe50a3dc 100644 --- a/radio/src/fonts/truetype/CMakeLists.txt +++ b/radio/src/fonts/truetype/CMakeLists.txt @@ -1,6 +1,9 @@ set(FONT "Roboto/Roboto-Regular") set(FONT_BOLD "Roboto/Roboto-Bold") set(FONT_OFFSET 1) +set(CN_FONT "Noto/NotoSansCJKsc-Regular") +set(CN_FONT_BOLD "Noto/NotoSansCJKsc-Bold") +set(CN_FONT_OFFSET -3) #set(FONT "Kanit/Kanit-Regular") #set(FONT_BOLD "Kanit/Kanit-Bold") @@ -10,15 +13,17 @@ set(FONT_OFFSET 1) #set(FONT_BOLD "Ubuntu/Ubuntu-Bold") #set(FONT_OFFSET 1) -add_truetype_font_target(9 ${FONT} 9 ${FONT_OFFSET}) -add_truetype_font_target(13 ${FONT} 13 ${FONT_OFFSET}) -add_truetype_font_target(15 ${FONT} 15 ${FONT_OFFSET}) -add_truetype_font_target(16 ${FONT} 16 ${FONT_OFFSET}) -add_truetype_font_target(bold16 ${FONT_BOLD} 16 ${FONT_OFFSET}) -add_truetype_font_target(17 ${FONT} 17 ${FONT_OFFSET}) -add_truetype_font_target(bold17 ${FONT_BOLD} 17 ${FONT_OFFSET}) -add_truetype_font_target(24 ${FONT} 24 ${FONT_OFFSET}) -add_truetype_font_target(32 ${FONT_BOLD} 32 ${FONT_OFFSET}) -add_truetype_font_target(64 ${FONT_BOLD} 64 ${FONT_OFFSET}) +add_truetype_font_target(9 9 "all" ${FONT} ${FONT_OFFSET} ${CN_FONT} ${CN_FONT_OFFSET}) +add_truetype_font_target(13 13 "all" ${FONT} ${FONT_OFFSET} ${CN_FONT} ${CN_FONT_OFFSET}) +add_truetype_font_target(15 15 "all" ${FONT} ${FONT_OFFSET} ${CN_FONT} ${CN_FONT_OFFSET}) +add_truetype_font_target(16 16 "all" ${FONT} ${FONT_OFFSET} ${CN_FONT} ${CN_FONT_OFFSET}) +add_truetype_font_target(16en 16 "en" ${FONT} ${FONT_OFFSET} ${CN_FONT} ${CN_FONT_OFFSET}) +add_truetype_font_target(bold16 16 "all" ${FONT_BOLD} ${FONT_OFFSET} ${CN_FONT_BOLD} ${CN_FONT_OFFSET}) +add_truetype_font_target(17 17 "all" ${FONT} ${FONT_OFFSET} ${CN_FONT} ${CN_FONT_OFFSET}) +add_truetype_font_target(17en 17 "en" ${FONT} ${FONT_OFFSET} ${CN_FONT} ${CN_FONT_OFFSET}) +add_truetype_font_target(bold17 17 "all" ${FONT_BOLD} ${FONT_OFFSET} ${CN_FONT_BOLD} ${CN_FONT_OFFSET}) +add_truetype_font_target(24 24 "all" ${FONT} ${FONT_OFFSET} ${CN_FONT} ${CN_FONT_OFFSET}) +add_truetype_font_target(32 32 "all" ${FONT_BOLD} ${FONT_OFFSET} ${CN_FONT_BOLD} ${CN_FONT_OFFSET}) +add_truetype_font_target(64 64 "all" ${FONT_BOLD} ${FONT_OFFSET} ${CN_FONT_BOLD} ${CN_FONT_OFFSET}) add_custom_target(truetype_fonts DEPENDS ${truetype_fonts_targets}) diff --git a/radio/src/fonts/truetype/font_13.png b/radio/src/fonts/truetype/font_13.png index 13a7d301548e60f5b7762b57098c99d270fb63b4..220e1b160ad200354959cf0f8a7a8e315a132b63 100644 GIT binary patch literal 53381 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

GNGX{=Xg0hvmM( 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 Msl8pUjc4@#03c><=l}o! literal 12097 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 A8M$#iHL~kw6)aE5E1RUgzxuJ662pX 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≫g`pnhE3Fjf#9#iNFRJkZYxQ@| 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 literal 15310 zcmYj&2RPP!-@cV>vXi1Rvm+@ZD-y{n%2p(s%pyCZLI@>0Ldu9p*{P7svR6iS2qEKt zdfw;wzpvxCJGv{E>-vuKbFN>QmZmB-1seqc0RgqzIb|IJ0#f`(z(7WXU$5`%RUsgd zeypafpy&B)&e+3xwzr^&F#sSnTu6V1_rr3Jt~Lp?mV5Eo|>A<$$gzO zm1`BnrFQOcFr&`@{iWVC;=zLlCAM8f26 z_BM8Qv+d*Fa=w2inlD|tM54gO%`JOpHSgs?&ws0PKVBJ<2UuHMcNgE(wY9a?H;nq( zR~yE_J3BYm)YNqF;K7*aXui%{zrInkNo0Tc;Jvmm(pT#ELhFpr#`POFJSM(A!D~rL zOP@S>Qui2M`CWN=Tzq_AZ*Q`cbHLrd8LE+|rKDox<7p3`cHPslXzrStnwFF^ zCr_McZf<6B(~ahOaWTcg!eVKA>yEaYjg3uSULMbdr_19_ET>PLI(3SlpI=I9tu~m_ zb^5jO`~Lp^!7AS~PQ%q5FD`ZngdXf$9Q`c7&(F=nGx)))qp3+d}DTVy#>Y{uV6%|!Ix=3?KhHrX4 zEG$gskmIj!Ns2kIUcIWjM=k9%OpvvM6SB0ry1ltBUhzv)Q`61OEp`bDEq&?~H!tsf z8_{FO&KnzVO*AJaBwATn(XfgRHz%GF?TksP##WY$JMM=B^NG&VN+Zm;uZrTEG^43v+LjEK36ePIzX zY0a_tZq~w-#5hnlKk#1l0c%@l=kf_Q-<9ddnVFUj4#HUx2JdVg9X*_#d*0lL)H*ht ztr~fVJo9aFG1dO#V+$j7#?$UCiz^@f74DXBe!kI?jC1&-v(r0smA}m6_uyc~9gn%* zvvkTvM$g{7c@r7gVtUJ#|9O-m1^?|m$BrGNrl$V!<3}XNnR&IO9m40CnOifaJI4eB z-rxBDV@5qrOlU%yG9az`3wYB_#z5LJDOcmADn*#Pw?(V(S8)70N zN&DW97KPjMnm*UEU%#fIre-1|IkUYsI@y*{^+|}7hF!|Ow|KlM-uL0B%(b@!>73H1 zPqVSHNk~X&>ENY`Z+6J}ZnHBpGqbaAdaNw?5?5AM8VUc!N$~YheLl%ksqIWhKQ=iw zCUNZ(m1m=w=+mc9S*b`fuPP}8Mn~)578@HMl=9<}OX1+)IAifKw72)Fp<&-lSAGV| zd~b=muCA`BDM!ovzrVkKcjc#~r~eEhXOO$Q85->{RB3NzbuaFN=c2{Wk70y_gu@at zGBWtoyu2ZUv%!=s?Ck8Kf9Hghm6bQKLIE$5l9DKy1zTHNhh5&ie*JoVecgJzyu4ie z#y4eE)xW=ocGeb0W3zBQ@fyo3E01GiRU+8cuFM$d>M|TU^cn{-H}~}2&9(M+owTin zmX`QOkJ7x`7uLO*@7K%Iv9N?(29Dua9XjorjW-&&m)6WnQIRN+l$Ms(AT1-~T75Xv zy?gg?u1ri!a4*j$zRJ(1rKFtcco7*L-M&24A@)*WhwXV*R&P(wqNfbj_uA)(wC4=G zn%OU3(jJhc%8OGzOh<paWfc__ zy?ilQ5+#ai48 z3euwJv2(}UmZ7GiQZ_xk2PgizD68Y(hkf5C@ZpL}O4{i4^}DL8<+Z5;Ldt#qNoH+0tAy{#=LKVOydosn>_ZvZDgsiKlnNpUeF6VpI{Kd_BwIg21XJbZO^HH4NU ztJ7kCN z5$K#dM`rv3$0*iv_?5h2;&Dp~ZxL)`XIIyY%|R)bF|xoKzGKIZkXbav2~ki`c*}9D zDk~_M50twVEJdE#wzjY!ir|p(thOkWbR4A0!KA@kEf6<1H^ahEA=amBXo?%gXiQWtXL#tq#GX^qhY%|mkDtVtg3bG_U)MNvO}SqBFP zjelPEm#3qnGcz~$|K^w4`t|DrIU#zI!s`w6)YK1u{)jo`VK_Q{G$;a5k?X7=9WzM6Rjo8ik$w`9om6a9zmiJ<^hNh;wtE-)j4bk|; zWEnAWae-sUo{Hbl^z@YSA-I44{s{?*IAP=Sy!%KBad|N>8vF8cbB~LQ1K-)6NfC(l z7vU{Gd&Vv<{w7|;l%hggPcOEzQqGt^Gc)r-(&-hv-8-wZ`);SnbCOX|;2Z1yFtt{U zjEuzaUQ}t4mX;o>^r4*F`@u5!Ne&@b@l4QFqO}I?+5T{vP(H7;K06Dc29v^!kByJI zDLi8g@}6)t1Qx%2+uPR%JbHl@k-Z(ey_b)d_w%=J!Y58#n&gVmR`%p3_Um%75D4|z z6J*^?#YRg*BPk{}mFsdZ`_-$G!onw*FxcY1SN%dCJech(71@~cQ;bdLBnxQyb@9pZ z`o_lG^75yO=g*&~-xwxQ_~5;+gMs9rL;v%Wk&8LYu`A0Wg0Z~(zaiP z6Z+93FaUO8jl=a&$>*=|=yPH&c_te)1b2R`cb(6Dma&pqs1LQad zeWDdJ5kR3{5${&(2KPwT8eA=^}f6u zM618j=Y4jz_2$|lF5QU}Ckg^^G%_+q2i|)C&b)nmfcZl`J!(@IZ`|Nr<9v3)mia0T zV?WNF_;w&LxVZMge(~$quUlNZCN3`Cw$gs#!Uan*oY))I);O3d28V@(H7{J41Fyo3 z0g}#v4BomW{(NI?&EV?Q!7}Hg;^G~(wY5V-RRS4(O<0w<$B&K6oXp+bSBos03;|* zq7GXJ;~HML(2RR;`oUA|fujj`aVuA;WeqzN~k8N1t zAExEy&5n#XFaE5@hu>N5xTwK%3rsY2H83!czh#fnp#=#}&gy{yD#ZhZ9Uk@ew_I)#6xmo8=E zSpEDNjjtz9_8&ahY*7eCpn7v}#2BVlwE;IbcMSzz{j$D3#|axf8=L8e2TocwKjl7p z^wwPO3GIhQRd;=sC)<2BmK83w&i1^)_Tiu<#K(JVt~p=3HVT$UtaJA4o-#VA>mX>f zngRj>BTCv9Vmudm8oVJi2PuXqQ(8_+O3JxTMg{qZi-}z+v3WcuyUtu_)y&4g5L5M@ z#q{8{PY2`}XbHj>MCWE>h3#-6Jj5 z#BhjP=H)W2^d)eAE2Q%(EO(4#Qs_9VI5El2afSfa2c@#)jX(M2uwrrKJf zUglwriIthI;N-z~w?Z1OQ*0G&*+xBi61L&>{rmTwwNY9ps(usD#vb6TthTY%?pIV; z7Zer#A;Uct;PwXjfZnlbsL zV{&0(VK?*brn&lGe|R+#%p4p{3=P%a@ej^f+SnWu5sA$DYVGLQ)!Hh0^5l#66?&I0 z?WZEOd9RiA5E5)=YAVf?=8aWzdsmlg74_sO9V4TJ>!g9s*QWxRWLDx{9EuDz#+AMcB25BvcT^(5RLHGu6C5{21;_be56G&CMy z3MSA@&&=S4?b4y}Y7XB`Y%gdUnYvafi&`|cLGhq4V`*2`g+xfPwL01}8c!wEIxB7m zR1MC#&G(;jz5KXfG1*mTdNsPdV*5$8Mv3RS^pQone7N4Aw+}Q#Qf%(a1BWrKOXeJ%fwT+0!#MJRB7l_oJsLCpDGenA1C>vf8MoaULF? z+A>8<4gGu*@a^LwBKc`)3hL@$jW&I6?I8-RIs95Cm&Tj+?AfEHrWTv&2TCy+UZNC2 z^N{_Nj+z?zD;#)n^I8&D-DnK3?~JTR~Q$#Z#6j|KFBE0IhAd!&Ka7Tp24y?QLK({ zfrIrbs;M>fme~HCAHYoFd#HculCu>1@_70=P0iKC#l_WC=6@f+WS`3UoG$kR+E5Qh zd>&1!AeuRZp-!s_pXwAl&B8okcTdmO=AV|~HTXQZ{fZ~;*O#Ysy}dU-Jv>nF9?3~2 zm-2glJ~=K-+C#Bp=8K$a$AyIKHQ(%Z}3-5rNq4RA@R{wNm2C4*P9(#guK#x*!Zd0St<&O z01ppW*Pz2A09|cuZJ9%~Br)JOcxA}QT2iQXXgcquv4;CBBHw_gc)9G?N6C&zO1`bA zI5_J=T6;KN$dISl5n2L#&GfC^ejX`jOg&Cnp^5!_h-zS+Fbf)p`fhLHt$y(Nclm27 znG*Plyu5shoKNiI$Dbb__`9)Udp;P}&F=YAP^kI%F(~~JoDdl-jJ>_RrKKeYM+%g) zypE5LkGwoVWbi#(k`Dah3r9I|TAHOr2-&mPByOR6n zjW~F+scA~nI9Ncy35UrNNWH}O@81Um1b{wRUQFrj?d8|aTJV&C1V3T>!}{jUw2?bT z!X6{F!MHWVduf7#adVeeRxVw>{G+`+JT%mAaRp8l^riR8G*e)WpY#0WBK883{efvj zcz8gEumT-cH|Wp5pY``~A!?j0ExBVFG}P1xUxxg)3PM}5~B(<7f+x0z3-2pY#YJa zNWJb;w>D@;zbjGC%Hdi&@2*GNMjgYt!xVsE=&|1$`xvH|=72P!)5=BT*awh-5wrZ3>1Af_lxYHL>5h1s+VY@zM=d zf(uz?TGOQhG(QJSz_^WsOM!}UqE9p=6OE0GWSoZOneVTFT>BI6E$Xo|F#nNvr7Pbw z<n;cY)Zzr#xR2%_J4|&y9^KS3NH( zif*=oFWb=6WO(I@w$9zLi3uBPYfn#4K7RfyhK7OP_qsANGed-phH%`Kr>v{31p|j} z1X+(0F?F!ECL1b>h@erR6K&jp)nX@k;DWIjJj8@nRc&oC8JYf1pGfULynQPvEd1@u z7i-K36%~~NBb?*(`qWMFCmJwy&YU>|FA>TwOh@C)=0YGw(zFseIXOIKpM_yU(Z`&c z$uj)ByuW~7@MtzSy*uqg0AV2J`BzIC>+0${I~iB2($WZ%iOR~$9eRrP#Qgrz+sihp z_J|$p0UEruv7$r?23S#1q0PU2Tgr1`7{hv3OzkIBlaIb`ZOylllM)*%;Wn)&94}D3 zjlTl%`Ztqb)vku`!`J1@m#x#l8WiYaHwEcHPJtWPe1c~Ohk%~ze{M|Hojs7|{XqfA zL`$-4VvU(bf+%4ukP#LR{2m+y7~G5N-oPk*eSN)a%OvoLu#-JKJ;Tc%!x)aLJOBd; zW->B1_V1gi3!%k~fT5F|oXmN#25K8Kkk6}Qb88D9;)TYOrOov}Nzxw2x26ANl$USd zf}V8fH@JK`E-I?PuIG3ftzz_bPtUT#!o|kN0%A$DR8)D{*{Qs)O3pCmF@?Z=;o6Fb zh%8)cz2tf44)oJtxtjnl?~6BYZuJ)5jHN)7b3Z)1+}ftzv9UOt|}QldWlRK*xUl(q&h}NjT#+-3fV#;V#6>i+3hfF!A^Akni5a z4h&-dOQi)Rz&G~Ou9MIy(4_J)goJjz#r#}cT+-5gZEemVoy$H+^*@3Ax-T>>-}E45 z$k^fc$JUt{85se=pr&D4?#@^6+Z$F^xB~4liLXs6uIlAi;!okUzr@#=T@ophS5Kk%GVfEnR|2#RJ(vmO9+rO1;+Z?Eg5EY5C>Yp&Y8-;2ArAS#^RkYJ z{Cr2SYFAf@b2OK(Tp?#Tv%8KWBD8!_NC;l)=PTZ-?dbTk;!B`&kbEFOes`JzDTNK+ z=3)7O&Lr<7IhDnDlesQOOjd`|9(KsB@7GkM7KtOivj=3%&B;krR8*c)td1{So7}nX z?1&dtomuyT$&EW7WhmRksax%b-5mALCexkN_4xie!;pwBokvw|;xhS#4&gM9x$Hs3 zlNuIZ0}0GnnMC$^<{I#@{QDuw#O1wbp!F-g$^Eu-o+S$lBT5v1JPfr%brM+j@VOta zkMuez_mj_ab@qyx*>E_Mfbyluw0^ZUOaGJgXSJ)$om2DK{~!bcn^|aTK~k2Vm!}au zhUo&UwQ#d-G;tL4n_a0E#V@<6t3?1f*5l8#6$vR{G(e3ZKn^o^Vq$ zjQAwJ>^o~>k_@I;L9|&7v&46GcK`X_B1?5lZTUlD9v&X&qej7kFyU|(?yO9I2Q6hd zckXC+v+|WI>##8)d2n#x#wq@#K@_0$<^TaWX!V)FT`Qc5p}M}l9(WTkvOkRU!r0nJwQZz^g&F$ ztDi6niNdnzmo_i~sD1#=zqDl8mPTYlXmke!f}ik09e`^?M?SQWolfA!BEWM8n*%S@~8a;fofbNBT2 zMsw|_r$2so(=(d1z^T2jFH!S|T2W4pny&5}{3{T{<-LU60HMU@y8!;oXY^y|qQ^k6 zrcOEYDMZKy$#cT}bFi}`c>zvmDavZya*F-i>ReyVA{ZhB0vIEyW=)F(-#3_y&?_GE z{fE_xa&yCL%-GM|WjBHKM0w*SEr(ozfnY+{5;!otzN1HpSN+$1bAE1YJWm=(xZ(>R zvzKjh>>l-jYOw@Ht$KBGJ-y49vkIumT#&0nzQYSWdOqE#$)eD#Um!{~>Z3oG+OSY? zhj67n_ECd}!9+cJtiZgk)uVaD$&5tH&@l1sTX#D?j-fDv^3iAF+oaYlv`rYbjgFqax| z1_+MPCYNHWua6YJP1GNQ6J92_dK@1gU+V9|H*a*6l&;P7mT;*-YN=o}MCX#rRAy!I z)awZd3AwquPb_*OOcC|UhT&tw)EdaX?!En3Kp&?oHa0d(;|Y<*ajIJu=PbrU4+-7h z$3gH_?|xMh7n=z^%|}~(nHc%x{=#b^xL0h(0URpY55hTwPq!$w?kBCYGWLn|y!3;C z+Kpg%Njyy#=Jl1InQ2rQ>d^a`hHv=u$E zSpfSYt)j*L|3VROeZ>jyJ!&TY24SB<>9?;wP^rxhhVRG|1G7AGqIBwQdUeYzf#MAf z8FKN70Xp~PgS$a%^y9~S46|$eGmZKLTvX35So*g~re_ZoONE-woh3Bb%FfRpYHh7H z6UB~BPfvsKTGsr*C`ys>g8b*FBZE;JLAtB}t|n+)zT6PQi{pd|gApG5{CDNQ*B?H7 zC@3f>EZiMbBnn6-DF;07xBP;)$1fnzp~g8$fBXJ^s!vGsK=zT6fivwomG7V8>ccSF zx3BHRMGhxH*DC`E)T-HzH1_VLK&T$-5UjSzyGl3U9>mq~`gNYy&UOXH2Qn_7m(tMQ zz#B}bJ0NKAq1>)RoP|AnctKN>H0_b=8sfOIv9Hfg-GVkjF5vF$tfrws^8DL3O@H|U zgyXPN`?|aHOsfXl+oLOq_1xT6Qhc|`qZcz0PCA-^4XCJm!pK9e3jY`IL7s!-Dk>qt zE^eg(S!HdVjYb4+DOX_BvuB(CepiVY6r>^>0AfuZQ3>Eg5@ol2AeMrZloadav%UH5 z-8(Nmy-r~K;hg8s$GS{?!DB?O|Hor{Q&f~ndXVVQSR{e_Eveo z>aVg*PjcARQkoP#6(g@KxA76Glzr!eUw-#9>iquQUl(a@nG}ujEmg;~va+&YiTV0^ zdWgyFdWtMz=B58oGH(Svsq*#Z<>f6Hw*5U=fvy3kNM*J%VMx zz)J1=CdS9l_Pl??OGZOO>KuXld#%tQHbD#Z4#`9y?!fZ0D_!U8`1mC)tp!-=*qHQv z5d>UnudlpO!EKh6HMZtNyFt;;&JM4cd+8Z1^@vN2LRUek(V`Ijn!|q)x+idwm3_LbpfCbPW9BCG#f)MP zgIyx!0c_9MpY`e^=Ax|74ExAPmWR)Wg2hI0k$25Ox{%t3Sh5z&U z@nw{`p2+Ym))%z%>OBJ*digLXNr(uKQG&0^$Hy`3gwgSm1=Nj5Nl8`P5A$Uxa8LyB z1X7V+gXit+>K&kNiHV7h{bhv?1E-nqyJ7i| zlijqjLAGAQ+}YXr78L02)@`ij@)_~OW*RCgk~^nUWbe4ob{AR`5&k@5*fljXMe z{s+huPD+TA{1?aY(-4k*`tl`|-lJXi>|u8+mJ`=3&izMy>T(H4NVvA9Dj=-gZB49% zDYlH$>{$AD{ST0lIp3L@oHWxg!E}%2g5sn#se_GPoy$GBYIE}@p+GKKfRl$u)$NsB z7}W#!UB??AgDm>&Z2d(F0rD+)>{xHbos&^1aNe;Q#_!#Gy1Q|Mj1aBuQlOq5#iR>@ z%=eqdDYlLfais96D_mq?qyJv&XbOdiFXa887*4bE^O}we-G$f8MirwXmH6g|s!X-D z6?$|TvaKeqImyzqvhG=Y`Pl~7*L~Ii`r<;OWLu6Pv%0CNFCsV$w{6T*10H$0k8sp* z8qn1tjQxg6P)tnBeyV$|7e12*6qJ^V2nY~=2L1tst^12IGr4_i`|SJP?q_AKuBP?_ z*#O6|?=GmRtIL3!ReizFVc^xvmoUS@hF}l&)dcQ^Bh`&detg$uzFKs>Ar5?j_Rt3$ zF(}m7aB>$CPbfuH54u6{k-8yjNNr06`)X@%U;6VW=J^569y<1JCV|U(`ud2HGTc06 zk`dV9D=Ep?!r~_iWSY;U2+tuZHFJ=k83Ni#N-~d5q2`cI(t!fml_RNAC;9c(p5y{b zb8>c_M5o(hUmoEaR?k``FfR<61aPt)IG}Az+$mA7ODeheOzhgd_;`J|?ActD=>+M! zp#j{)ULcg?kX*r?lUDuRcB|l*5IYyVR8T{JW0l&sNKc}TxFDL#a_TtyUSeY6;o5tX zh`ZyPgtmYCJgPZ=m4SgF?cwIXp`CBd&1c_bmY1{57N4UF!VNMq>c_wXK$}$x$#mOE z)_dQywapM!a&mHlTu1DRHVThMg8UO}FPUV79sqTONu>QI0DgFUFEo>GuP<>A%soy> zNQjBKg?8TFy&*X3WF@)&{|vGj5acf`I2}Ejap~n{wIx5m^wQFj)+--sGLisj#y{(u zz<`p{(!k(wR=>`KVO9omGP&XfU#UYfo__P;GYIE$dFV2e-zSSfS9QZrO+R~o@}I9S zwO^W23fbmo`b!*kJ9{H)y4~G&D-6544@M7r#TzP>-X&El=-xe`eCdY|n@H_r%f6v5 zxNG~#$`17Qmg6`u@MuVZJmL((WmR8aC6$hap{xCK9-J4N_|TcV&z?RFzn4syXHv0& zU=DLqp4U2>3s(XhbYg1CYxEN})(ZdJ*LMdpJ$&Ogs$!a&-(VEMOgITM#`Z@ZlJkr= zRQFB=N0%Q{CAsWP=Bz8U?H+CIS;)>8=Kh!jF$;QV(7#Di&PQx0!r9FKL$b8#8byPw zC1*bE>N`^7?*!3G^aBDE>4E~AyZkDokc6y(NA+v}v9O!R*8ikWrtQXc<%g|ZV+`m+ zZ_~*v(EGm#w{$6Vq&8KE)^C*!i`$$MrORc;1mb%uameB`-I+J{b^KVPyTyJ-7wB>| zeft(M$dEP})*rT2RBd~JY9*0*?_s<6gapGW34b*C5hL7>C0V_8&$sxxrKSIU zmRB8vgRojR@!^-&H^Hr8HDH0!`dHXu_f82^C@d+FMZAM?f8hc(ccCna!HlvN z1o-%3!M?X(VNy*8%dHePT0`ZhHzK58Yf-AGsVt8P`p0_~T)C-64 zch%0Jm7nj+%FK#F?yfKGIY`HRfBe@kIO}rDy1a)E9|k?>)PVY~L$ud;tk&TuC#M;P z^YDH3ix*qqdvO`f97f1UE15y?0`BB)3PZ!s2$CTzB4S!}UG1a;Bf183Wa;VYsGb3z zgx^*M1}eF_E=O~#Ywe{DtVxjZa?#PD&vgQq!H5))*q5w@%*WJp2qPhloDvh*0qNcO zY9!IeZ!b@#+}$9LV`OB6R%PEBAdH(haq^^k`(9+GofUn9gUKl=XUwVziX#wRBqsI& zm{2HVW@9_=`0@Mq6|_8X{6+T;C5T-EZLAx2;otF+^In5xRRl~pd9oDeMb2x9WbDUd zc4_xnM9HggaJZkXT@kzt{K>!miz#?FfV#b6)0Tb~q})z2vB-d&fEkAj8HfM=C{8l8 z7$D?ojmZNhXJ>(*q@Ia@CFnA%OT@PcB)dThNdr+Ni9$TPH zCPuVm!@qxX?AtdoJWNMV-#+uO!yE;L08X<800MuNyxB>lWo_ms#l^3QvSt(VuDXku zdV&Nzi#+qF(&j{dfVYS`nWYF}9yWyQjR<;V_shE?k>Y6!2s3VX%b zAV4S3#;RRw3KMDIGNtSAF0@=@Oy!Gi6@%k_@7mzQ$TEkFJ{R8ACZc?M(N0H0_H%4V zAxW++ovj%dI5=kG1{HJRLZ%ir*WSV5E;={6{#wh`^MP;`L&L%dKjVlXk94uL%=GtH zKo>|Y8qIVt3*?T?jg7|y1s~kMf9*{VIB0W3(2?WEb*xvPeEISPHuW$ENj(~<)%22# zFmyo*(z(7W7T#z%#H!poIQTj%D=sERDW92z#g2k9%vaDlwl)jLWqB!=XC!)_$oWQyS0^b*#!I#a3Cx!Y=R6dvAGh>)vF`m z&7jH$#H}9SgasEvk4Th!MtH!_L;xV%-umrZr{yG5iI~=V&FOT$;s;P7@EQUdX&FC( zsOSkhSk&w^FVH1^R$f+C{rwe~+}*o(QG3Jm3tmAuf$4?%Y6`5~#6+B?rt8N$Iy%hv zbSs*e3?h4jQO9>@E4|cDJ}05s83hx#u;|t8hD}%{^>|@aT&`+s?^`w1qeR>s(>DYD zCCF@xZak*m8TZ))xD~-eeD+8^l55PK0UuutkB$b)XEfqm>)c*FH%887;d8>cbAU!kluKJEsl3+3V`bX>%= z^1)4#O{OxJaSEyNKkHaTh(MgAX4Lc5)lsc8fXmN+Oi`~r9Ln=J>jPx_i;xZ2Qmh8D zG59&LHk^WbN=g~Hg4>LoMok?Z3~?y`(vyr#OsM4SXJo|xT-Mbk*2Ex!(8own$|1e2 zKE(g7xH$In=$^fMbq!du9G?GLh1r#w>ep~R{cG#{cNJH!UPVd?CqFtd5oxOV@Jqb? zdrVU75m{Li5Q@7=@}Wb*M~~`Wy-JaTtYBhd0>0;+r7^X0=R(o5{Mx{T(#eY#9sp7} z(EgWttncDrpTo`-{5&ourme5fV&iz*K_r?>Nm0?vwmM0nVQx={q<^Z5M2&yYyNc=( zc#E7(!A7@qyCxuYt+F>>bwm=erTx_IP9pqs?)t2MTGMgnD1lx0xG!-Ut? z{PXwkNm0=<+&pJzu`d_Y8s^TbSzIzT#Rz9(Wi`MQkB|R_-9j3i1DuO{^r)e+F~F-C zZS7O&IpYzB2M?$U2-uqil%ucj7O-m)&=6K5?!K3aRpM$utOP3&J8}N54qE3>fd2AP zv9TY=U2166$O@7c(d28Zou0Nq?+;GA{566J#uz$l2N8dHCrrqq9n$`7_PS^3yY^Lb z-+e}*UF<8|ReGcU#lEOm1QqDguEYC9nQC~^Q_CxyO+_ZdqL@1ASN-t^TL0l#PU;sW z2=00=>V25!4i1wEE6Mx#tuwmYja6NKc8rYE#^Lct38ts0V*LMN6rC-7MqpsWT(B1% zRmM+l#k>z@2}ZMqF=Hj+K6@@3!GmL*ZSF ziwlu`aE+OPp&@0nF}3q}Bh$5O*AUMj4X&=m*6kO!0(c?X!wtf4Zw9?WL(_V`6t?`5 zr%d=Cj6V@P8v>`Q_DraO_vRWpMYFSZ+DvGXF$-NKi9nGLC@frj72EMY-I$O%43M-I zgXd(WEZhV11W%oJFeSIQx1oV>fnZ(id+K(`Zyu-L1&I<4F@hsB8lXTDLP5fBt-s?A765HEpENzv$k+pM#c#Bs?Vd;2TwDuWD%CVdk4i!vS*L1&ql0b z(c8D%(@aPWi; zBX`ajwP+ajFbOa`^|ZAKH6nD(DIr17qJZ!SHa)s*C@&v*&)`Ng7$smo1FQ&YB_o4@ zj&5OX@!I)+#%^~WaXpESws3T88C|5JqJpQ?-QWMf@fOlwTq>=B4i1WegG3d(tvwQj z>QgFtefPN) z`yPs?OYjC{uIqo}RArEgTdBG-hf?oG#}X_+KU_Z-TaNvjP=E@gaCM?)4-jlIkzRdS1wE@+ zJd`4B*~kbsL`)or%0`E7udWfiwuxWAB2fV`F{#7>Mog)knfLnjw}u8aO--7t1`%Ol zc%_fx<4X$)@R(cb`-U#XvNgfx!p|Jf0d)!nFP&$W-0oS- zwq53egoQCj{j%R(qW5~ll_|S86n8zpTl+c5Ws1rGgBaF>?1c^@X|w@1^gbvL=dkXE zd0bwvo|EJg3@Lr!OX~_S9@aXha@5V$HP7f>J1Q|XX4W<~>1W=(N3Trae<~1STxr*K zA0CrTd>HXAh{HLZ>%L;T_v~_bzxgtgNnhyqvqP_?;6SY~<5a2V4)k-Fz;( zztk}WPgnsUXbme-+yv0K?z!Ol0BO*clJMD<#mTm#cofl8{YWt5js^~`!IdjO`84Uy zbB9l1B0^B148}JOOhU7rXFleMD=C72jq)$}C(~>)P2-;eWx4sGS z^Y1HHp6IKE>6)dPw1F|;V3ZgeJ2pG3(ZgvNUbSaH?JwV9^vv}03>H^vk^9@TiCnuy_;h`-rxa(*^G?utd>EHrXy+4ZQDffMC zZiY(2&CAs2v;X+{Gr|V?Stp`>(2ooZ#1Rm#$Ry0{?H@Ys^*q!@?V$(x#^>$kv<*rkpfmPEqq&s{lO}8LeMy!Dw zxHU8ozr(V&(_n?Sa<&vg#TjrsHa51p>fTV=bxvI!<2`yodLtzag9Ud7=2bp!_yMai z&?#{3?wOla&nIcN9jXlTM{p5Pzuog0-fn`R=6@d+U2Gn~_ra;YtfNDu#vP>cCcGYm z>M$N`a{j5Dc4cr|du``k?+nx|W&oPZfB;_))9uqhc6_;=xb%c^;M2}U$rwCDSN;&y ze5?!DjKqb<256y7V|GnVwdr2<6(H!V`qI>ta@sBTKzvJ*G+IFCGitWU&7$aMeYyVk ixyb+fyCLRn+HYrkDMxz=PUAUU0=2W6%C8m80{$OU!rw*! diff --git a/radio/src/fonts/truetype/font_15.specs b/radio/src/fonts/truetype/font_15.specs index 662f43195..a6063ad69 100644 --- a/radio/src/fonts/truetype/font_15.specs +++ b/radio/src/fonts/truetype/font_15.specs @@ -1 +1 @@ -19,0,4,9,15,26,36,48,59,63,70,77,85,95,99,105,110,118,128,138,148,158,168,178,188,198,208,218,223,228,237,247,256,265,272,283,294,305,316,326,336,348,360,366,376,387,397,412,424,436,447,459,470,480,490,501,512,527,538,549,559,564,572,577,585,593,599,609,619,628,638,647,654,664,674,679,685,694,699,714,724,734,744,754,761,770,776,786,795,808,817,826,835,847,852,861,861,861,861,861,861,861,861,861,861,861,861,861,861,861,861,861,861,861,861,861,861,870,879,889,896,905,916,926,938,948,959,969,979,988,997,1006,1013,1022,1031,1041,1047,1056,1066,1076,1086,1096,1107,1114,1124,1134,1145,1156,1166,1177,1188,1194,1204,1216,1228,1239,1250,1261,1271,1283,1293,1303,1313,1323,1334,1345,1357,1367,1377,1387,1396,1405,1411,1421,1431,1440,1449,1458,1469,1480,1490,1500,1512,1524,1534,1544,1554,1564,1574,1584,1595,1606,1618 \ No newline at end of file +19,0,5,16,26,38,49,53,60,67,75,85,89,95,100,108,118,128,138,148,158,168,178,188,198,208,213,218,227,237,246,255,262,273,284,295,306,316,326,338,350,356,366,377,387,402,414,426,437,449,460,470,480,491,502,517,528,539,549,554,562,567,575,583,589,599,609,618,628,637,644,654,664,669,675,684,689,704,714,724,734,744,751,760,766,776,785,798,807,816,825,837,842,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,860,869,879,886,895,906,916,928,938,949,959,969,978,987,996,1003,1012,1021,1031,1037,1047,1057,1067,1077,1088,1095,1105,1115,1126,1137,1147,1158,1169,1175,1185,1197,1209,1220,1231,1242,1252,1264,1274,1284,1295,1305,1315,1324,1333,1339,1349,1358,1367,1376,1387,1398,1408,1418,1430,1440,1450,1460,1471,1481,1492,1502,1513,1524,1534,1543,1555,1565,1577,1587,1603,1619,1635,1651,1667,1683,1699,1715,1731,1747,1763,1779,1795,1811,1827,1843,1859,1875,1891,1907,1923,1939,1955,1971,1987,2003,2019,2035,2051,2067,2083,2099,2115,2131,2147,2163,2179,2195,2211,2227,2243,2259,2275,2291,2307,2323,2339,2355,2371,2387,2403,2419,2435,2451,2467,2483,2499,2515,2531,2547,2563,2579,2595,2611,2627,2643,2659,2675,2691,2707,2723,2739,2755,2771,2787,2803,2819,2835,2851,2867,2883,2899,2915,2931,2947,2963,2979,2995,3011,3027,3043,3059,3075,3091,3107,3123,3139,3155,3171,3187,3203,3219,3235,3251,3267,3283,3299,3315,3331,3347,3363,3379,3395,3411,3427,3443,3459,3475,3491,3507,3523,3539,3555,3571,3587,3603,3619,3635,3651,3667,3683,3699,3715,3731,3747,3763,3779,3795,3811,3827,3843,3859,3875,3891,3907,3923,3939,3955,3971,3987,4003,4019,4035,4051,4067,4083,4099,4115,4131,4147,4163,4179,4195,4211,4227,4243,4259,4275,4291,4307,4323,4339,4355,4371,4387,4403,4419,4435,4451 \ No newline at end of file diff --git a/radio/src/fonts/truetype/font_16.png b/radio/src/fonts/truetype/font_16.png index a867e6bb952ee4e570880b6e7eb4ef1c20b7afaf..004f1d3a2c7204656b6b9f402a62eb171f293a92 100644 GIT binary patch literal 76367 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�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 diff --git a/radio/src/fonts/truetype/font_16.specs b/radio/src/fonts/truetype/font_16.specs index 15dd71f47..3545b87f2 100644 --- a/radio/src/fonts/truetype/font_16.specs +++ b/radio/src/fonts/truetype/font_16.specs @@ -1 +1 @@ -20,0,4,10,17,28,38,51,62,66,73,80,88,99,104,110,116,124,134,144,154,164,174,184,194,204,214,224,229,234,244,254,264,273,280,292,303,315,327,338,348,360,373,379,389,401,411,426,439,451,463,475,486,497,508,520,532,548,560,571,582,588,596,602,610,619,625,635,645,655,666,676,683,693,703,708,714,724,729,745,755,766,776,787,794,804,811,821,830,844,853,862,871,883,888,898,911,924,937,950,963,976,989,1002,1015,1030,1045,1060,1075,1090,1105,1120,1135,1150,1165,1180,1195,1205,1215,1225,1232,1242,1254,1264,1276,1287,1299,1309,1320,1330,1340,1350,1357,1366,1375,1385,1391,1401,1411,1422,1432,1442,1454,1461,1472,1483,1495,1506,1517,1528,1540,1546,1557,1570,1582,1594,1606,1618,1629,1642,1652,1662,1672,1683,1695,1707,1719,1729,1739,1749,1759,1769,1775,1785,1796,1806,1815,1824,1836,1848,1859,1869,1882,1894,1905,1916,1927,1937,1947,1958,1970,1982,1994 \ No newline at end of file +20,0,6,17,27,40,51,55,62,69,77,88,93,99,105,113,123,133,143,153,163,173,183,193,203,213,218,223,233,243,253,262,269,281,292,304,316,327,337,349,362,368,378,390,400,415,428,440,452,464,475,486,497,509,521,537,549,560,571,577,585,591,599,608,614,624,634,644,655,665,672,682,692,697,703,713,718,734,744,755,765,776,783,793,800,810,819,833,842,851,860,872,877,887,900,913,926,939,952,965,978,991,1004,1019,1034,1049,1064,1079,1094,1109,1124,1139,1154,1169,1184,1194,1204,1214,1221,1231,1243,1253,1265,1276,1288,1298,1309,1319,1329,1339,1346,1355,1364,1374,1380,1390,1401,1411,1421,1433,1440,1451,1462,1474,1485,1496,1507,1519,1525,1536,1549,1561,1573,1585,1597,1608,1621,1631,1641,1653,1663,1673,1683,1693,1699,1709,1719,1728,1737,1749,1761,1772,1782,1795,1806,1817,1828,1840,1850,1862,1872,1884,1896,1907,1917,1929,1940,1952,1963,1980,1997,2014,2031,2048,2065,2082,2099,2116,2133,2150,2167,2184,2201,2218,2235,2252,2269,2286,2303,2320,2337,2354,2371,2388,2405,2422,2439,2456,2473,2490,2507,2524,2541,2558,2575,2592,2609,2626,2643,2660,2677,2694,2711,2728,2745,2762,2779,2796,2813,2830,2847,2864,2881,2898,2915,2932,2949,2966,2983,3000,3017,3034,3051,3068,3085,3102,3119,3136,3153,3170,3187,3204,3221,3238,3255,3272,3289,3306,3323,3340,3357,3374,3391,3408,3425,3442,3459,3476,3493,3510,3527,3544,3561,3578,3595,3612,3629,3646,3663,3680,3697,3714,3731,3748,3765,3782,3799,3816,3833,3850,3867,3884,3901,3918,3935,3952,3969,3986,4003,4020,4037,4054,4071,4088,4105,4122,4139,4156,4173,4190,4207,4224,4241,4258,4275,4292,4309,4326,4343,4360,4377,4394,4411,4428,4445,4462,4479,4496,4513,4530,4547,4564,4581,4598,4615,4632,4649,4666,4683,4700,4717,4734,4751,4768,4785,4802,4819,4836,4853,4870,4887,4904,4921,4938,4955,4972,4989,5006 \ No newline at end of file diff --git a/radio/src/fonts/truetype/font_16en.png b/radio/src/fonts/truetype/font_16en.png new file mode 100644 index 0000000000000000000000000000000000000000..53f533f46f5b7b7fe2795d54398c8d01ecdbe3c2 GIT binary patch literal 16895 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 literal 0 HcmV?d00001 diff --git a/radio/src/fonts/truetype/font_16en.specs b/radio/src/fonts/truetype/font_16en.specs new file mode 100644 index 000000000..c4434ae6e --- /dev/null +++ b/radio/src/fonts/truetype/font_16en.specs @@ -0,0 +1 @@ +20,0,6,17,27,40,51,55,62,69,77,88,93,99,105,113,123,133,143,153,163,173,183,193,203,213,218,223,233,243,253,262,269,281,292,304,316,327,337,349,362,368,378,390,400,415,428,440,452,464,475,486,497,509,521,537,549,560,571,577,585,591,599,608,614,624,634,644,655,665,672,682,692,697,703,713,718,734,744,755,765,776,783,793,800,810,819,833,842,851,860,872,877,887,900,913,926,939,952,965,978,991,1004,1019,1034,1049,1064,1079,1094,1109,1124,1139,1154,1169,1184 \ No newline at end of file diff --git a/radio/src/fonts/truetype/font_17.png b/radio/src/fonts/truetype/font_17.png index f04d109d3ca704468e3740a012b5a0f44412b6b2..0b5571da57aca1cd740222b9beba09f2937614a5 100644 GIT binary patch literal 79880 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¨t@qM`7U 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 literal 21635 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 literal 0 HcmV?d00001 diff --git a/radio/src/fonts/truetype/font_17en.specs b/radio/src/fonts/truetype/font_17en.specs new file mode 100644 index 000000000..5e339e5f3 --- /dev/null +++ b/radio/src/fonts/truetype/font_17en.specs @@ -0,0 +1 @@ +21,0,6,18,29,43,55,59,66,73,82,93,98,104,110,118,129,140,151,162,173,184,195,206,217,228,234,239,249,260,270,280,288,301,313,326,339,350,361,374,388,394,405,417,428,444,458,471,483,496,508,520,532,545,557,574,586,598,610,616,624,630,639,648,655,666,677,687,698,708,715,726,737,743,750,760,766,782,793,804,815,826,833,843,850,861,871,885,895,905,915,928,934,944,957,970,983,996,1009,1022,1035,1048,1061,1076,1091,1106,1121,1136,1151,1166,1181,1196,1211,1226,1241 \ No newline at end of file diff --git a/radio/src/fonts/truetype/font_24.png b/radio/src/fonts/truetype/font_24.png index 2682878d06a191dbaae85fbc8fb65dd201373d64..6edfa6a290367a6ccaba94de1612c6a483f9e549 100644 GIT binary patch literal 116789 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�p&HBR@dC(#^Abk+;7iiZiHJePlLr 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 SjxWUcV?W8!_L#^k^8W*X&GttC literal 24839 zcmZ_0bzGEd6fR0LlnmV*# zDIuWT#XjfU`#bmCJAb%g@9liwyx;q-_0*b3jeANIq|Br^I5-p-Wd$u99Fj2jnH7Nt ze`*vzeT0K!`URsPr{kISv+=PkZTGLEncl6o_ykK7G1aAv%MmFwDL9?1B0kUb?|t1& z9a6vP^1@W|7hjh7g%pjxtU%{y$}b!0e+6j9{Oa=<{31Z+?eWWt@PqU<>1#8(BgP{m zT;%Psf&c$6+5L?D>?;@lzg`(U&UL=0N4t+6J=)sZ%D?yK_}j=Ipi&K7>eX~uJSI>0ag$1A7^$-?5ZHkfNz^HkdVcY(uPQ`y7j>WYd# z-x7})tB`)sP z9!7EV=FOe$*EbxlKb=l_^X6UQMsiZp)7geU$NL*Q4pvqxU*6m*GifX;+_;2gm-2+W zFx1e%IlJw1@MI|Ou9ue=b3%q!p2RD6xW1kK`K4caHuf-}+w%SA&&r`_O#_3;k8XAr7E5p|qKWEv z?^ab-KAEhvk(0v>GrOetJXRTXa=87N|7~2{!s4P9tfl(f+nm@(U(?}Aqou~ZD-#I` z2^16*@b|7e%=YCN~fMQQh3Ri5sd-y3>U(G ziBHDM@}7;qqNSx3vmI7OQSYw}DG4UK$Y@ef9dAxtb8&HrQ?B&=n^s4!{0RYx-tZ z?%~$VEy2eV6B7&heJLW@uQo29?-~skxH%3^xbEenvAH?;$+QLMt}zGCu9c|%ojZhK zX0R>qATYUuZEfhgGg+|Y3j51zYmrE18UKd7QlX0)zhq7N>8~2Zz6dxy`ZhE)G&3X3 z!$ZVbX*BuBO@cdCo`3mVk|5yun*oD*4)n}*U;3YqNmTx&#!^SGd7;t*>OaAvwEHV zYkc?aoiYmcAkEcRzkKvNq`g&ABq>IDl|Sl# z1xwR17a19utrSyQP;gYCOZ`8eeMZ*1cR#n!UuD_Z?YRvxF)_`}0q+c|it5er&R^nc zrluL`>FjD;7qRfGtDDUGc_H^ z!O$Erq$AEA$jWj$#-I4z_B%$@XCYI)BUlBy0bMFT`$gy>94Oc+jGrtQ&Pq&ZL|;e z;8-_0uc&x?AH$|!T3Yfs-0C-(ZEanEngexsr6&tv=ENrd(>}(nah8vFa zvVtqk{(rp}J0imG|?yw!!NcoOxaUvIJgrW)_xa-#>eB6%i4Uuj$h8 zDP~^sX%kVhm+YBL|M9y1jrIByy|Geb_%OG9k9MM2Zj2UchyOnt=lS5^U zMsGSPHJMl}7W?(BObk>dI8g=$Qqx+t5gOxHoS-xriN)y&TtFa%uS5N>73td8o~eJp zlfZV{xAtMP|0Xvf)16D%wI`Z2PbPwqAK|{L?8cC2c&BB5!KsUa*1-{t5!*#~(opkX-}`Uhz73lvDJkj4mp8>* zuP)O*W4q4V$o-M=vfC5d0&2nVei>GepEW zoOky%bWTmOzI168PD?AR{qOxO2dZq6uF3-Rc6N3T8$9D0Q%XxqBO|;2{Q6O><5pE0 zaP|*&#on)93v=_6C){j@@MdcWF%J(9yh*;G zx+Z@jJi8=ilu`_Pr|>3hWcbXjt*uAeOO}rwL5KQSU*FDuS#PV_ypvQ*L|MDqv=xuM z9X7)J;`u8+J^ckkt@nOWP>>v~Q*UqY6@GrSyu6#6n~+g$%btMUXo(zRq)2xIt}4(e zOwJYxz`xVfMst;1=axWR;UCa- zc=OCPH8o-Jeb4^=Z3`u1V`Z%^=_@EH*&HsUK^NSKqK}=3CsVMJc3M=x4#3{FR&Apl zD$)NSVWKZP-z*R3#ntt91l6VZ`1twHP|Jxam^*a*e@<4Jn3xEeG)TCv#x^zi-@i|< zjWHoD{iv%O-TLhS=X?L_a3mCU&;4~>@sS^}KcKPsJ|Newc>f-a;6|a!Uus^aH8V3q zaLUNYxUal$x_?>L#>NJ)2oeo( zC2$ca-R{oLgWtYEX|Ne7q9d=-Q&v?qtaG-Km2IiC8Pa>k&C7fEa|&vV34bC~5;(T; z+}-Un^&UR^>sI#mSL2lX`unG990Ha_3ULqghDzh&z$kI96Vl#~Ge0icP=)q-YTZ9kQM(Lw9R6m_Y(*%8XD8dusrLl<`Hz=kWbp9up(|HaRsH<= z6Ds3fyUQ95@W>Z7HcqA-nnft)b+=@wsHxi;h2LrP^!C1%321uz_HAKdp$>mlMa3G_ z?LzJR@eP-slj4(jM=!?BT11)dYlu`i6!ZYilEg+K-QR7Gl_? z&C7(Tj)DQJn;zN%W`m{sG&eWb*4Eb2(lRv#xM3HdLe5nq0|S+hWV7N>Cwqonp$$no z%t}3c_)uP6o{fzSP_tYJ(M+vVhz|LC{z8rUXMLPIUeGqLQ5ph9E<(mrkU^7OojHK?-fbk+tG zG@X|wW@T^_1cxdI+jDO*b509ySL3lsAxL~I7;J9g*!}H_o+wfb|y1Z(SH`dpC zR-DbvTDkdl$`l?xoEsafSs#Pr+UUKHM!2mFhT4<|nvFX&{|!SrJ2{zE@CLzEBNfc8 zty9v{)c)!g>I7Txz+20QUjQr%r9#(_h`hZvwFhTTps?Wy3wirX6>jn~r?S^|bvLtq zP483@2To5LeWpPq1VWpdoSZ~(P8NRc=ulARHMO+VDKn8ini?8PSh>oV*i&KArGkow zEuZrG_4$b@EJtTDLI>30H?Dq?8X1YHcmJ86dv3B`IF)oiSXS1LObz6?;_2Rz{6({&6SLmHCc9NYU>MN93sqt9vI&n=aRrx9rH*D&PZ<OUy%(XOg#HtsqFHL}r|3o0cg+~-nV2H&kg(&L z{~bpaqC5z@jCJGYOYKK)g_eCG9Ji;WF6VxikU*2{+Ul!$N%b0ykx_hk)(ZIWy50|dDL=QM{UQh`fd zT^;s2Hdc+N-fe@v$})lHZow=MdAqZV3&3S~Z{g!bM3S>wTj8k0tEp!<%b zKO2^lt{P^P$Hi#^Rd94!PJZaG`N!zzR84rB+5xGm0i}VD2efF<>vW$P6!>@cHy#8$ zGJPZ3eVFj_B>`EIm1t^B&5cz}tOl%Wp~DjN$pLZLUmL@P_;v5D3J7RvYwI>ezfDRO zdbp@gv7otg2$Vgt^I23BG-Rj{`FCG`hf2P=*+=b5;LeY>1_r2R<>+P&IAs05*XHJP zA@&Q|k2RCM&!A2K0}CSOywg{(5U((2(U%(NBx>%Cd8WWMdD#9` zGdDMPVL<|V|G=9CTOd4^g~GcoG>4}wfScdh{eU(0%wn(5d!E1bQW;hG%c=Hm)=!oQrn)D@FJ8pC#rzEnNhZ13Pe5z+bS)1p$TQ5{~*Y=s4Jp>XYWDs;IN z9$+AGaq&Bd{5puD_%>AE`5Iyd)lh4i|hqex;$+u1sfGN}}^>ir=e_pyOkjufbF@}ew`5Kp@#e(or_(4-8 zcW`EgjZ+K=(oxge+L|zdNzGF>?Uf)vu@|wE)%LwxWm^1+!W@%@+Pw4+SP%S&<>Hh( z(qnAls$6lOdwZj7_O{@oz-J5#3)`d#oon&~t>ZP6P#KivPX-Q6`1V)XS> zdu)-M{C1xsRai6U2b&rie1ETg>+q5{kw-s|;d{|;r_<}<+R|&H+s@9@s+sZa!o3j| zzp=j6vM}R#)_j3s#(v$EMmA}09oX)_*M>qvL*W=e4LLqO2FB_c!ArOG+ImmRkyV$D zWNY$%wD#~&9Zu9wIV&Kg_wL<$Mf!|O6dsa~kIxIcd*hmG@xFV@7*NMqKRdCurslUAhllWZ6HBe0tJ@VWs_{gb>a=s~LtR`d z{D0NOme;+o!6Un1a}nGnFp7umQ+X)J$M$MfiDDl|~ei|lEVZv5!a zU0vax$OE-c@^0Sy>)iBFPBjVuvSnp)-bGQhmk$r?c+wvwk%r=FJ+8DHdtosC_3PJ} znK$07S}zCgwX_Zq5)j0`07SNc>xVQXPO32ye86^mIC%pG9(yP0^)OtJ{$ zI_J=p%oe8$!gn`h1Ljk_5$)WgGL@z@{~y#Un;NlHS}n*4QZ z;sbHKb;7J7Py`8ue6>`(_RQ(&Y1kuN*!8ipv#rYG%Fy|Ni*td*5l6cobs?dC12$*sTW!7kbe;p@27)ydwYmvRfoAI9W8AODj8&@)N7Ar86R0%c64+E z`WjY0VbTu8I9w7EI>#6n#R}ra0R3lJz814_{ySqJ!hlLpo)|; z2V~}cB78G7Amv8G=Y)cSoE(X6KKplTS3-O7e);?HUm+rOs6-X+rhZwVGrFT7es$HM zfP~__Sq&e8R9X_lSwChBkx?!oE-JJ z{|JTn*nRt~#zSLUi?UP1-ginT4ac|?8k@vw4y!9VG|Agty!iu8B8oba|H_qC?#KWG z>SRGj0U*7mgQNcb{==Gf0L`GprKU1zJEoPD31#(#Y){u|bH!o9!aj9%Q8EhS+}Bc6 zQi8GvdRO#;B;YN&s7{cgE1PZ8U|+1SuEsVr&$o_z`^ITi5mI~4cGevLH*l@yfHM$6 z;b2{Ql)RiF7lK3&cfR*K{w;@yn&dt(p) zrxhyx>dEC@huR-v^A|YV0x_r(oLYNdWzIS%KYjX?wO#x`?uW>`FR8aY1btl*r<{-W zQEgdP>S+?VbD@>P+8;VtDfUI z^b;sZ5rUy>>Z|cmj`KJQ*X<|XhkCP#8^yz#BF?3|A^H#}wh~cGCkz+1V4_H0fIlU~ z(ZeG@OhNW{NNK5{4I#@(&CyEoLnIocCe$2%4$@|_lCSC;T2cTc_V`n?3O*UXV*(R< z^OjBM@Kk7MZNo@3;)V!tF#RDTHbIP|BsAZF|71!XT(XI;uWmTplR~)TF}{Bz>BjYs zp!7Dp)8MJHzyIx*ypjsp+1XTRScqZQ8=#-f@1r^kZhP+FOy2Z)C5|)d3z{oFJ|^y; znqW6Ty|(NM><8gG6expHNZYw4X@ZyK4r;nHr%QmwL!`BRO1obPbJn5)B!X4nOCpWp z75>-Jy5m-l;w--DRE>Mmq!P0vNsWt3UHkq^U*8ib2YfFdY71h-)ts8L4Vtp?4fHlg zipJZg312-jju#g`J_!=U1lsfj69^@v<_-^H6e;X`|Gr!wtvi$W7Xl~t-JOtYsXD_h zn9)GQyG1FwmaIB4t$$s6zdm2~{`JP4ss)G!fQpLk7xII&ENTZ8^5m7cbNDuyiY6wr z&*-k)FVT}b#oA9*yE!?vo)IRamQCy2f4)*ifsRZyRF5;Wxv&t#antum7+nB(Y`6_H zWKi#U*iM_zPGmY7*74fQ0bg;cAgzpy(qdvL)0wHdMn{uuN^$wW1NU^j)Q|W2Yl3rI z;7Rx~wdpOcgF-R)WR$?W44$eG0mq{+CM`hFCEYibXIh;1mb(#|An%Hfz#kWOG}^-{ zmB_7&GjaVyK6 z`PPmQ&>lcVfu`FL8U}T8Y;24}*fg+*^s$xIx!99^EiwtjsplLr|3IbL>;%!G%ozCQ zr1)T^grx$il%^51WwiCd<^-}gN-Ym!7?(QH7 zxyhBfJ9qAsuO`(BrW?n}AJ`23D7c-xoUi`&B5kNUi%TdPmpN1{<#fU*9vm-ZO#4e} zV~XTuKs{7wxNPoKqK(dgzxxk5Hsi63colkTze_Co=ygHn#7YQT(c6!fFrlr%q^YdQ z{!4%KG(zF^#cS7SDk<&F`+9m*7*7*!OV;0=$h*t(yZIO400#)gYFE<|67ZAFyKPO_ z1iQ1cxN4vH`bri00^fDD91N=}k2N+ld~F>S;-4nv^&VCW4&g5EIPde1>r^MVy_FDe zWCEaUEiYTHdRN*wi;x4VLROYOe@=dS5#hV8C|B7MHVR50=(^m0JC@@+gasrd82>sf z6Q8$Q>+x%kzogyvV?LLk83YrTdqMp>KHPSA{FpaU1&E(K8g1<{)53cK!bR8xHd_me zY=GE{i+dYo&7v#Ie~xySh6}Z&rKA8uzz(i=U2A*kx&Y!StX62*_R`V^uV3G#eGV=X zDVYLZ05b>VFMt8(Zw&>Nj_5Ipq{uHmEsd3#+1A`VtGIZo)@kYP>+7HlAvhJD>9lh+ zl$Sexdd?&$C=h7KhoyUM{K5yW7f45qa^H0Mu7-^TNgCMfxDXkxAeayU2Y`_U zzALjED+Qg1;ueEZopY|sk1xPIB_$X$|@ID0nDj$Q7u{-7$^(ezO5~P zLN@@c=12X^jQ?U!4INj2;@Y?d_c-0h-JUcIipbK`ksS3U$^uH>I9VOAInT zONn9`7#r&f04eLz@mzl@P6Pw0nmeK*BZ)vRzqpue4sU&Pds|%~;q6<%l9r-Og~Z}d z#*u#N*F((oyuBqm&f_ zr(jVeO|p`+;&_maQj#O)d>%0|@yWQv%va6IBvI#UHLmCWLz4rXLz57{n8#ezG<8NM zAO{(^;Dw+3xX*{{SnI3dp4y%(@3fsBsQBti@|dn4f8Yb3d0oc&r`O9>eV+fg98<4ta?t`a6!(d>mYQFvMP zikphAt6*3DeR-li@3+%;8D4lNjdJVzkrK{lP27A{>wDDLk0)VZ%GnA{$$lXu4%kgXh|%4SHhQ0ILuiqngE1P=x+S z(ckZXM4ek>aCy_3n_5|I;6RJ4DPspZB55K+&8A!`^rrLGIhuTCmseJTmO1xnt&?zu zN*PTb%Wt+prKLjOzkk27H&Cxq;D{3h>WD>_*$=t7+}c%L(JW&X7D|h=A2*+!f^~@C z^z-vu6tmv1L&dP(3`UBIh?w=QwJl99yZ_Bq!7{90Y6y@0p|WSKeC8Gn}H16 z-l>b4Mn>e#)Q5_}PxbQevE?P>;8NtQ61%^q_O0w_G?AVBY$-Y^+y`zHuX=j*$j~zrzj1 zAWXa3il#mnBQSTufPZEPk~@l;n3#BV36VKJKM%ziY@*1{#q)A9vRYEtIM@ zT5cwvq7dfu?IY^Vn>V{gb2*qaFn?Q|l$4Yl92|}Ys%%HNo)X`7Uj7VWgMoA~92XWA zIxwhLJGT#kdV5nsw!6;vgRos zoyDU^VM@(2u)l)!ooqlSBYzO0#xEh)Wls!Ch5*W=}|%Ccq7qES4(<|XlX8>_$xQbV$}FO@M?(O#PNN3bMoUm z7cR~Vj+e&Y9oICb>v{7szxV9A>Aoc`xSxy?`VeG1X<_>=e);LMVv(YiTap=VPs{LZ z$J-kSUJ(I=ymoxTWE5Zdf7ivP!NB^QMZ=W(wAO_Yi9hLC)n8Wr4f|SMEIaI;aa|~V ztPj*MQ$zU6t2fz^y<^nhXAQ(|Ct%PN$(H>Q1N>jK&8Ec|%Jzbvw{iN39?M-5@RPgLXiwX>u5(RB^9Fe-HO z=^j~_85z9*GE!k!dL7duG5zHWIN?rQamqXinvJ*Abnf48D>f}+!Pyhx<_>jjsI9F9 z{tSjK^jMIZhbxHVUb$j|-zXVBMbN~7F_*IhNry_jU_`xYJU!s8*0If7W%LXTbFlfR z-9Q|uZvc_l+0k)ebhNsrCg#~QuIQff?Yfh`zCH** z+=RFd*wf%4gFL^wYQ4y;zymG|zzlH0Ff{VAYHH+Y(A%zvi0lH!1g&nq5wc;NiQzl) z>-?CVcajnkNJ@|i1&nGPVSzeAfGDQl_LCHt&fGiwO8Ya`TZNVqwHfX)*Urn!3uagtudq03g@8#)o`bxrH2CMQRMCxMBP5yArPIjGyxyve<-x4u+1@Lah< zcFGF9FEpt=odCb7R)H&M`B%Ar+^8iN#MVed#PW1@1OzeTyt=BYQH;^|u%p~0W|l11 zp9BV&-Fx_fiRZ197oJHmfW$zKn)mOi!+fFFqDCnD@z0N9O#YUP&w+sNMXh{6etx`- z^F(0zNP|`(C=+y%3Luzwtfrox`U)Qdo^0KLc-r(ww=3l07?&td?<8D&B3YmI8{J9W zmZyNldO3@mQU+ zU@k5$QzhM8t;iGqd5Q6RiHV8j%Ekip3FPc1>R>dHyf_1^dcN&CA0Nr18_Fzsiw`c4 zkOWPkQgoR%J!rcR!+}rKPEUHBcXZ?Kj4AJj>V= z4JWk^UmTYfA2h0KE?w8g9r+QzY;}F!+EEB&l2^<8A2D8E+dSaU2$SwJ&M}cN+(dFNp5639L?HIRimyAj);nyg8uRPx_!#^J4I$x2Ay8~FJ49Y zc*!YJL9O#nMqxb)`950@dna~WjFyL?Jy|;aRtF?+d$N}VL$V6 zA7C_WJU|8cMCMDwIjYqB?!Ug@9dsI>h?{hbdiHFd@Vyubs4B?7?H@n7mSuSFJ>tZE zdcmeTxlBpCN3`T+4fT6K9w%ar2=WG)scbZT6L`+8v>&3QDVp+T!B==RtrvLepF_gT znyXa@P;uIgn1F~#%i~UHr41-yIZGhu1RGR52nhwB0J1$~Cc!%VfM122?5%V^_w}9r zteG<{yN%UY`V>vcD$$az!4iLtSDp3Q6}W_iDAB}@WikX@14RT{>@Hkz;&iwrAN4VI zT+?}&%XLFUL~btmX>kc%72U2VEyRMtBz^=f>v3?6tj9}v|GsQ=7qS_(3L&{|)5h@t zg@YGT-@IX~aDo~tOFjdN0B3AkCwHXTH~^bW;ss4UHF~;|Lo0pS3uZ_}COGHoKdohM zcyd63FH&{4Wu)i*&n<{GQgym!-;=zY*h9&2`&@cG82-Jx%h|mSYSv8&i57hbL4o7| z!5M5%!>KG3D-ck1Y`|MSY6Zf}=#NZLUlcI@NK2)41Q7}%zlV?ifI*B!vRe`I1VQzT z5(_!N5zs3SEM&X~83ZI6Fx+2YvPd*|8I|{uB*+v{wbXXCpk8hIXj`g;sJUUl!P8Y& z2XCA}F$NT4I=a-96h=lyNvhGdnz> z10z&?=)#kw`&2W`ij3loOx!49{`nInqZDsg$pt5?QZN0Q^~B(t#6NprX5vgVKXneZ zOrjR|hZ`&}mR)ffbDgF;kFRlBYVaq*=cGB)8p+r2oHzj0uy(W4^FO!Vnd&)Ytvdta zl~EA9fIuzNi4`c~=DM%*7fb6Tk{B#$sRnsZ&WuGBT991~_ndgSxz9=6;0-MD2{z5J`>mz?e zJpn0)tEf47gqOFssBTyioB=Fy+)$vU1UQ7`?)-VqZhIDDSH%nM;U_02>M6ntppppd z6D=<BOf#G6nLBZv%sug89xmNf;L7_2Ak3fW(F*mc(FbJ8XiCBcac=6>0 z+pUOFIWAC&gMxy9p%66hN7C>LK5SCE3NW}D_Vam&a2R##{IYIt=XDZ@WN%LoDJdyL z?@W0J-N`#uq0(?+!Q%r?2{HQA#6-v#zJ?MuIW+}bm{}@Vjh2ByK3#VFEMCRk{QyFd zw4|Zc)$Rbb%${z+0vxGve1RICqh;glya(xt73Z7iRX}whWMKuekpxl5CtZ_z#3TjMYn5q)*pOHz<^Lx?8i!h0>nTt;K%pxiuJkl|A}{ih9RYU z0`XbS7Ayn&JqTRbjhAzlsG$)-A*XQ7x3~SwC42k(-z|86QTYy(1Ly@1kb%e~Rg|ud zPR2Hurnamy-_{!MA}}aS>!(j)2aVnSo+!AJv0CF=d#n(h!=)&eDqmQm6*GFcn?O8g$|FZfojRn2zN}`J3ikZ?f z^b09EUWrSsB87^C);1IGSD+(Z48?f?Q1kKW@&1*4TA+>t=@LNJp)Z3C*2;jqgq7VV zXO)Qky`cDl^(I8~Blhr3d-5Q*Yx;XhmgqY5?(VKe%JA65T_K+@E?ni6H$+9_a|Sqx z$*uz7ggwl|9waV(bik;)0PP-pAc$iD5em#}V*~!oSTP@X5Bzr?_GD$$j*88dzTLI? zzm&{k2rhf4i@YZK`b=te)P=gm^o8ESVSQh|`2Rb->5ptu2A>Dhj}!lAXc2bY3@14! z0Ws_*Qe28a2$e%_345I(FRr28QVPepeFT>umt&d0pP_lW%bAKPGDf-eT}*CYy1jH@Il0zq_nYE0_S?h$ zc2TQL_USp67ER`zc%25)V$R3I)@cp*G|TST^c-ZgZS+iwvnh3oKwKm+5XU+T65D|7 z8P`;G!_k^ws~_KRs$*ChF(~5trAzt=y0)+Fc_snIH$Z^{erhCWg3qP%(~H09+Et?- zGSO#H4C(SpO1@ft*3#I&xj9u+ z225;4H7`_R!?oUdXhHg^;? zMo&))iC;c{u617N$-yK*R1MlE*a)Lwi$I(zk5uPM`R8r$ zQI1UUlLA_u_`&J}@Cs#(kj)!rl;V`J>aFb@v3s~i@v#g+k)T6{*v9s*fcK%RZ%9cQ z1F2y%#sld3pqTic+3>(d2`6U?Hq+D5(E%i_Yx0&p0t5KsG{~h%Elt|zIu}>lw{KLU zHc<*(5r>P6qE?oc1QR~MT*EoA&4s&ypbyT#5D?0i=ps?D#pWd3KN1Z>56X$O)$*-O zz;|aVEb=$439gHdSZ)#M>k#sVL5Fn+>XEG#AyzLA8eLt~H=Ar5FyqvurixQ02;&xU zO(uc+a}=XyA@`;770{-G-VzcL0^AB<5e(VD&h_|v?AC8Ui+cY2Is8X>?xlHWr@z#( z$n<17>&eQ()YJ(`vzS?uB`BQhG;aKkPa#eO+yp!U88yRT{;kY*{ZR?wCzb3_D#5i)>0!N6m~NjP_s`G|jDZVTkCdJ>${CBa z{B?0j#_^T8%%CSpTehX&`Q5W<<8{_K78(Kjl;oU6Jw1w>*@{ccV4xW2jM!81NSK`S=>iFZ>L-vw zVq-jx3%-zA@bUkwii*+93nv3LPiL6tiV`k~Uqp|j(HRVU3}s54{l48h@gosuH)s4qo3{~jPSu&ytNJ^`ux zoRZ|^U{~r|?2GrLTZ(fery#-_-sKHJcqp&i3Ud0z_up~h?QDWO*b!1b_yUB)k!aZL+<$U>ey?UifFrrrj7pfU&gcR^ z)+TZpsuTcD7*wnCJ8_@>yzwo&3nmyLdOPAEZPtbbdzw2LTp;d&}bj9*y38 z&2n%P3BMeHUj;Yp(fN!{phC08VUAuzelHZscjXF%6Fp#z2plSKvKN<^3B0J4TZ)?C z{J}#rh<*%H7~o0-DWkZevljl&*Bcggz+4JglA!VdMmX<>{;V&rM4hAxfqgLl^FGr? z2DO1aCl^<+9?=%w)bZjt3>F3`Nte0z&wu}(1P=n*sabm%CpIf93$}i4VN{49fVBeP z0AN57O8x^50oN847l-i%1=pHlapWuyaNpA zeEasTySw}7U~JlfKt?3giE4^2hf4zPt-cfnec*q9$xwf&$55_8#vK|QEVwo-9s+tb z1e<{l#a&WDqQM*j%nDgKE3F$^g|ze$b5IijYeF;K-`#Dsz-i?sS)k=NK4+MLjU1*c zD;xo*xcTMRJhqJV8fj^0LWJZk&n-W2hhe{zYna%#Fg1g6S!ATJM9y(r3WZt*QS`!v z3lJlG3#uNJh@*Rat`J6p;#MJ$%c-fUAs@H2u;2t4PdGHhgoHOGB})x! zUMw+NiQ}9QOHlwYfw7{>>S~@;J@blMXjqJ45CJ6QbX^~Yop2=};0&(ZZ7I5=FLV97w9QG~mF9K1|GEue%`vPmkud2qb5&<+BC z-AGa5t5*g(IjCl9v7pL2Nk$ggl*mRY^k^r|Vn*`$FK82^@LA z6)^1Oe)i9A+=F<2w#y5HAB~U%?Xb{_-=!?ayE;1W*g^aoWJQ1tzD`XABJ&PD1(e5* zhjjr@x2OZhh*$7@!qI8d zg8BXznbY21Y};+z4TUmil2VqYneDVEedi~AF4a^B{nmr;rE3!WFQCOQ7=}C`G~qCy zm@>&#{I2)h!S36U8c!Sqv65EO`3ps;dhF7lm3?0{frOewj=JLZlcm?Sbo5U$xA9HK zKNn?XnZua@+9ez?mUV}$;S{2c7uY0e+1TzLJA?ng6^Cdqhfbldr#CQb2U;RzkziFI zas(0A7tzt7{gtq=V-O;P20!0#2T&A|DPr*{a0o)9+b{+R`Zmmx#Df7x-o`0HMpJ$o z=f_X)_YjkuVrrpxBu+ufv(XeCbj<3|x%jha*3F@AIPz0Nm!R^g+L5k@j|lL<880e9Pqk9&$SL zL3+D`Xnj=eDYg4&pUfB-p2`K}t7y}UOZU*Kvm z(o53q08w^GCRD-`nG79^Enu44Nfbi95AvH!jO~EwE|3G5kjR!5EyzQIywKphLb~~$ zgt&FlEV42>G7`dd#-I?uhW@l782irW4Kki=n}40HFfG z!8U_OVBnqy7Zy%30smE)fCO|2!2U%<1RSmFT{~p%7u!BhPfKxenM36PN^Mx{$SDxV zDrSwuK6H#>VwLgt_4Pf4nMT<3L`C7G%OqY;_l?vJz1E>FmIOSpR9PRARBejqUID^A^J~OHH znExWXjdt&1S8B;iXe2O0umOAK{Je3;b8>R3IZY!n0R;m2f+|bX76jC9=Pd-^Af!%1 zP5lpgA+%)}u=?}o&o>i-#U;o|fy0s#8#@5(128_Mo}_(`Vx^_C;bfPVK830DrUhIY z;J~17oX>$DZoM-Xc7r1TaXZ-Ne-FXrRHHMz#(LZLd`2HsJy3#BdFn8Ih%Ae|lOoG` z!2>Q1v$$>MOf;%o_gP*clp|rrL9P!w*@6?Ybk{Br@_#kf-^^h|9HKeksb}5wIK2kr zMZaN~!{8D{$?YVmVub<FpM!V2TAj4bMz|;{!w~buQE56OjkL zl!Kf*hyoBSQhLD}v5S{p>>!x20i8xmYY-l?S(QkO>XFM!oQB&4Dmw0$JKmk^nzkwr z;s;)m7H|Pi?#~M2D=pN#I<$(TB<+)!EnU)D5kObi^zAJ(T7Aj+{c)Z^ZNm+d|0wdW z#A~)<_nPtx#_j@s$w+Hzn%-E{%DQ3VEoC4y5QF_IEZmT+EJ$ zz0LHOAM+X2Ev@qyqIqy0rr_%y(3v}jhjZrwpZ%0+q#m5W`GJ_p?U6eeq7dKcjKRFxfr`CSfd z)2&<`9{2Dy@+Q^907N+|*v93e@?W*-AdrysX&7|? zuQljv3ZjxCD?wI(o_G-VXV<4sJi@}UwN~Gu5`a2A{Nb^BQ9dpYPlP?YfsKIyv$)qK zv8#ER7nW1cr}+}H2@PoXtrnGZ42YmJmB*Ly$ML~9iKOq5qpj^aB!8Ek|3G%)@9F6) zaXUpL{%1(r>DpbNN2V5rY4BwOpfPxRdX^Ye@!z-s(_z)H5TK%)!OEmi%W>RvJ}=(u zR@Cq%0)cFPKQ}jx_yUR9EH5j`a#1Cxo?|vu)eR`(Fd?0h1Oecw^H{~=Vv75>jQ2J} zJXj6b9O8=)v@x*afUkflwTS$Z2dI<+gFfON5HSfp#_medH7I?yd=GQdj7&^$T(Hc( z8h1Iy(@~K0>&~q0FLjd8s>_-EG%3O6RJ9L(a62S!*GXu#S7A`I|){g z9}g)K$}KYF)y}|SOjUD-rwawPEiYb8-w+p(2Jg(Y$*JUufl(RQJ|Ilcd22vNNEKaz zXLb%@1n3>6s_*hALhaY*Nq}#7U>&`C|4m7WfU<%JbeJObD!|il!YEPAJhu6`rYf$W zKnko)>uTxf5WIUK5rjAE@wrqHb>qhQbXSKHGh>%fZEmZFo7)`()ghH8W$hY3`eIME zXj2CV4h9C|Ze>_dz|#2s$8V92cQrlc6%noUdq!D;Kuj-MkyW&|w8&k02=3=!(3&rH zq@|^WQF8c$Z>yICN<0r@N{ghA(|KZw5uymtNiGWsLEKsF2?|rM$eJW`F3^3QB<5OBYmy88A&W=KuVAutf7q; z>iQvFAYp3-dyQ#U;a<8_9jF5Uhg~;Df0i}>1FSc)+?`-U z>@a>y0Y*YGbFcIY`&S~;92>g&oA&)fMX~%{Ol5AXYtVd0_Gj}TjbPN8gI%WJzJO)J$ zJ;A*`ON2t0&SGJqbN;Eb^uHUr#XOy@1Z9-{z12So;_7I%v#YFqd9*+1Bp`Gh{sUvW z0LBzPza<}H%~=2Ms}RsUgRrMHRGT1-KPXDhEVc^c)Q;zzZC=CvTNdHZeMt5g8yj<4 zT@5o6J_ZgR^e_|CpL&g0h!TGc8hk=&Nd7B=F

V1faxCL{-83CTFGF#{C2H%|Kcg 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 D$c3;# diff --git a/radio/src/fonts/truetype/font_24.specs b/radio/src/fonts/truetype/font_24.specs index 7d660a983..d6e8977f8 100644 --- a/radio/src/fonts/truetype/font_24.specs +++ b/radio/src/fonts/truetype/font_24.specs @@ -1 +1 @@ -28,0,4,12,21,37,52,71,87,93,103,113,125,140,146,154,162,173,188,203,218,233,248,263,278,293,308,323,330,337,351,366,380,393,403,420,436,453,470,485,500,518,537,545,560,577,591,613,632,650,667,685,701,717,733,750,767,790,807,823,839,847,858,866,878,890,899,914,929,943,958,972,982,997,1012,1019,1027,1041,1048,1071,1086,1101,1116,1131,1141,1155,1164,1179,1192,1212,1225,1238,1251,1269,1276,1290,1290,1290,1290,1290,1290,1290,1290,1290,1290,1290,1290,1290,1290,1290,1290,1290,1290,1290,1290,1290,1290,1304,1318,1333,1342,1356,1373,1388,1406,1421,1438,1453,1469,1483,1497,1511,1521,1534,1547,1562,1570,1584,1599,1614,1629,1644,1661,1671,1686,1702,1719,1735,1751,1767,1784,1792,1807,1826,1844,1861,1878,1895,1911,1930,1945,1960,1975,1990,2007,2024,2042,2057,2072,2087,2101,2115,2123,2138,2153,2167,2180,2193,2210,2227,2242,2256,2275,2293,2309,2325,2341,2356,2371,2386,2403,2420,2438 \ No newline at end of file +28,0,8,24,39,58,74,80,90,100,112,127,133,141,149,160,175,190,205,220,235,250,265,280,295,310,317,324,338,353,367,380,390,407,423,440,457,472,487,505,524,532,547,564,578,600,619,637,654,672,688,704,720,737,754,777,794,810,826,834,845,853,865,877,886,901,916,930,945,959,969,984,999,1006,1014,1028,1035,1058,1073,1088,1103,1118,1128,1142,1151,1166,1179,1199,1212,1225,1238,1256,1263,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1291,1305,1320,1329,1343,1360,1375,1393,1408,1425,1440,1456,1470,1484,1498,1508,1521,1534,1549,1557,1572,1587,1602,1617,1634,1644,1659,1675,1692,1708,1724,1740,1757,1765,1780,1799,1817,1834,1851,1868,1884,1903,1918,1933,1950,1965,1980,1994,2008,2016,2031,2045,2058,2071,2088,2105,2120,2134,2153,2169,2185,2201,2218,2233,2250,2265,2282,2299,2314,2328,2346,2361,2379,2394,2419,2444,2469,2494,2519,2544,2569,2594,2619,2644,2669,2694,2719,2744,2769,2794,2819,2844,2869,2894,2919,2944,2969,2994,3019,3044,3069,3094,3119,3144,3169,3194,3219,3244,3269,3294,3319,3344,3369,3394,3419,3444,3469,3494,3519,3544,3569,3594,3619,3644,3669,3694,3719,3744,3769,3794,3819,3844,3869,3894,3919,3944,3969,3994,4019,4044,4069,4094,4119,4144,4169,4194,4219,4244,4269,4294,4319,4344,4369,4394,4419,4444,4469,4494,4519,4544,4569,4594,4619,4644,4669,4694,4719,4744,4769,4794,4819,4844,4869,4894,4919,4944,4969,4994,5019,5044,5069,5094,5119,5144,5169,5194,5219,5244,5269,5294,5319,5344,5369,5394,5419,5444,5469,5494,5519,5544,5569,5594,5619,5644,5669,5694,5719,5744,5769,5794,5819,5844,5869,5894,5919,5944,5969,5994,6019,6044,6069,6094,6119,6144,6169,6194,6219,6244,6269,6294,6319,6344,6369,6394,6419,6444,6469,6494,6519,6544,6569,6594,6619,6644,6669,6694,6719,6744,6769,6794,6819,6844,6869 \ No newline at end of file diff --git a/radio/src/fonts/truetype/font_32.png b/radio/src/fonts/truetype/font_32.png index 4001c36dc5610c8eaf3907b03d7648a7bfc10700..05e2cac8d2382a848919969c6b8ad39449b3614f 100644 GIT binary patch literal 148452 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 literal 34151 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 PCj6(VrmI>&vIzWti3x!4 diff --git a/radio/src/fonts/truetype/font_32.specs b/radio/src/fonts/truetype/font_32.specs index 7eb57e984..cc561b311 100644 --- a/radio/src/fonts/truetype/font_32.specs +++ b/radio/src/fonts/truetype/font_32.specs @@ -1 +1 @@ -36,0,4,14,26,47,67,92,114,121,134,147,163,182,191,205,216,230,250,270,290,310,330,350,370,390,410,430,441,451,469,489,507,524,538,561,583,605,627,646,665,688,712,723,742,764,783,813,837,861,883,907,929,950,971,994,1016,1045,1067,1088,1109,1119,1135,1145,1160,1176,1188,1207,1227,1245,1265,1284,1297,1317,1336,1346,1358,1377,1387,1416,1435,1455,1475,1495,1508,1526,1538,1557,1575,1600,1618,1636,1654,1676,1686,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1704,1723,1742,1761,1775,1793,1816,1835,1859,1879,1902,1921,1943,1962,1980,1998,2012,2030,2048,2067,2079,2098,2117,2137,2156,2175,2198,2213,2232,2253,2275,2297,2318,2339,2362,2374,2393,2417,2441,2464,2487,2509,2530,2554,2573,2592,2611,2631,2654,2677,2701,2720,2739,2758,2776,2795,2806,2825,2845,2863,2881,2899,2922,2944,2963,2982,3006,3030,3051,3072,3093,3112,3131,3151,3174,3197,3221 \ No newline at end of file +36,0,10,31,51,76,98,105,118,131,147,166,175,189,200,214,234,254,274,294,314,334,354,374,394,414,425,435,453,473,491,508,522,545,567,589,611,630,649,672,696,707,726,748,767,797,821,845,867,891,913,934,955,978,1000,1029,1051,1072,1093,1103,1119,1129,1144,1160,1172,1191,1211,1229,1249,1268,1281,1301,1320,1330,1342,1361,1371,1400,1419,1439,1459,1479,1492,1510,1522,1541,1559,1584,1602,1620,1638,1660,1670,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1707,1726,1745,1759,1777,1800,1819,1843,1863,1886,1905,1927,1946,1964,1982,1996,2014,2032,2051,2063,2082,2102,2121,2140,2163,2178,2197,2218,2240,2262,2283,2304,2327,2339,2358,2382,2406,2429,2452,2474,2495,2519,2538,2557,2580,2599,2618,2636,2655,2666,2685,2703,2721,2739,2762,2784,2803,2822,2846,2867,2888,2909,2932,2951,2974,2993,3016,3038,3057,3076,3100,3120,3144,3164,3197,3230,3263,3296,3329,3362,3395,3428,3461,3494,3527,3560,3593,3626,3659,3692,3725,3758,3791,3824,3857,3890,3923,3956,3989,4022,4055,4088,4121,4154,4187,4220,4253,4286,4319,4352,4385,4418,4451,4484,4517,4550,4583,4616,4649,4682,4715,4748,4781,4814,4847,4880,4913,4946,4979,5012,5045,5078,5111,5144,5177,5210,5243,5276,5309,5342,5375,5408,5441,5474,5507,5540,5573,5606,5639,5672,5705,5738,5771,5804,5837,5870,5903,5936,5969,6002,6035,6068,6101,6134,6167,6200,6233,6266,6299,6332,6365,6398,6431,6464,6497,6530,6563,6596,6629,6662,6695,6728,6761,6794,6827,6860,6893,6926,6959,6992,7025,7058,7091,7124,7157,7190,7223,7256,7289,7322,7355,7388,7421,7454,7487,7520,7553,7586,7619,7652,7685,7718,7751,7784,7817,7850,7883,7916,7949,7982,8015,8048,8081,8114,8147,8180,8213,8246,8279,8312,8345,8378,8411,8444,8477,8510,8543,8576,8609,8642,8675,8708,8741,8774,8807,8840,8873,8906,8939,8972,9005,9038,9071 \ No newline at end of file diff --git a/radio/src/fonts/truetype/font_64.png b/radio/src/fonts/truetype/font_64.png index 6e4e12a75f618f9861c036109bbc7ea53311e1fd..8055127f3fee4da75c899e4d8e62b485d47780a3 100644 GIT binary patch literal 287994 zcmb?@bySt_wl209sGx#@ihzWaARwV2N;gPIN=pbxqm+uGg3=`j3P?(KD}ppihoqDs zxdZ{J`>fyI=j?OG+53#U$36bxz$I&~?|a|*&iTZg-!la{@%?*_?;#-}*)J(^U5SK5 z^c;S^zI!YFu5vNjL9*p=nB?`VH=H7;`i!&=4{QppX^SX{99B5A?}oxY8Q~1k%8J29 zF}L2HWxnM|$$X9{uS@dj!#xs@y88A%JlmJq`J&Wqbzru#=tA+{Kll3QXiS=-enoZn zb%%2?be$yg+JW!+7k|!VI?nb__m{4Aq-yGxx#(qg%SP}}U$TCapP&Ei*|U;s+itbI zIKlh!)a6$}K?}de)&IjAbEC@3 zHv{OUna`gmov@#5>n?L$Z3yQYB|k!vO&}0@`}(elh}1;9;<}gTh{Y7|zwoc$B|M$yFx{h)qDoqmapzlJq3w7b%PA65MpoA8&U9UU{j=InitK-W z{`}cts!Q?7)&ISfTMK_!vh818*R4$T_nw~Hu~|INN=seu-o3!L`N`|RiHo;|o2)D? zb=1|Dt0%Fd(^FG5?42DQauO0}#@X4~PxIN(@s(#~*;rd=P^}g_&FkBk?%A_v%a$!c zEBTgvQcYisvng5B&nT59$VaQ*xIq`nb*Cq1a?;FZBO`-DMMcGCW6QRkPcu7Nj{f}7 z9E-P(Y&H23)i`8bvy!e=sFWZ_ZL{(An%8s652s&H3xp69vb(4LEdDINza%HMXcHV7 z8WA4eyyGjDF(&3LX^PX_;Ddkwa_uADl|vLm*ld1%uGg8SZ6_`)DapjbBEzGH zXz*g&w}1bO)umZ3_0ILxCAD;&#`W?C4?b3TQ|{ff2Vo-jn*Uu&O1-RZ&h6&ub#6-FO!rlF+1gRL#ld7nx zIZm`Zp4lA{5ive8QggVt9i`r2Ap>dde4FT2Q2su$Xf=H2RUMiZm;p(l7P7v_k6y0T5ae2EsCuzB?g zho&b-IYAEhOT54OYGDif+Tl6Z!uv~UCEJ1`hO2!kdUWt>f4*1kb*`=o8yPWlb#>jK zZfk49iU&JtwJ52pJN;QO)z#H?bXVljUi(jcE>7R| zuVVH8{dJG>BN3m5Y6N!vlea8C3JN;x?!LL}z$t7Xw!1M}2vId-7w*2cJTyM;xcYm# zqM{;%RkJDVg270QKj*%XV~-y{*37ruzkmPw;!m|$u@_>#r>2L8W8c4*2^C^w{88gi zd-{sY*XHKC*4FAdw-vFChQ~ORv$C?**48Zhih`q~2M`Fny!lMZ@fqC~bqzQH_#Oer znO+?J#l^+fk&$DK5ef0}=Z3>@^r?a(Bd31+2n!6nCXt_=U5u#fE3$WHN=i!Fwu`Kx zv5|gc3R&67sURvUilaR^D9Gp3Wqv`yNWZkVZx5Y3*_*B_q$6c&I+3UtTf>Jh!#)aG zbaCh<(`sfLH%_*v)J|Z{HALW*vI5UN^>z)#Dun-m9K{Jk9{u0R-i^FHuu7xumb?L6Ykr6$OD`BMe!Gi}l zFC{^UpQ7U8K--tcxW-0m1GlCfsB-w(!FvDx{W@7@W@g;{M04z};b21S{q&nGA(@$X zZES2lJ=sssR9;lnQ&%_HUwS`Cb8~gJ+;+UFS=)V&eF*Efg1fYQAcF#zPb267)mNNnZ0zCbLLPDCNh1@qc*4I=R&!3l% z5_GP5egsu=>`Oyw{n+Nq$SbZr?d>WRR2zq|rhoqY>8(FtU@(lOO-@Pqm4|p-oE!So zyD2UvMn=UU%yxAv$(&3$=O~h7Py`DrtAT+5H#fJ@$rjynXU=^1_ASCDu&m4t>xONO zqrT?s?2NlWwU#Vw|MZELgTwFRWJj8Iv1K3s#)*sK;?+nB^@Qvk`=1?;_fjfZn&I$C zNl68slMPEwDJXF2Ex3!ENo&Q)#kKdqfzXedEZY$KSmP^hYnR+(l9MMFCR#(;w3E}* zzeI1W{2Gs!jUXgwmAmydH!J?pCu`0h4Lt@^Dj%b#~HOWt-E*cCcS?@@{W<2If~DAtbB8W z*2L}CnCzFR%UoPsD-@Kh8YAQ542#0y$_fg%OiY%R=M6S0-PZr~72Lgc^JaLYJB|W2 zV_4p_D>xD$-6W$v4nckU1q$;NeLgg^%Q04}u~H})Olq~qia5XwY2Ha9mT z=eF!WOhO|3DoV)R(#k42DoRdbwj=dhV+60gz5PuVRTr0%*jR(BSGUl7@z}C0O{X;Z z?OPfbdt`VD20203KNo4VRa6#R-bp{&b-*}Ny{f7TN2}O&oQ%ddFVErj?ZnrwU(dDs zPxlo&{+{X{nWsLl`d%HIw6yv613|MbqOm{Iz{}Uy*J-i8$lkp2=^;^3QO^Y+yw{iS zhum+rA8R;1?#{)Zo%nQVDXHBP2GuVwI}_qioV}~~9j3y( zyu?v*XuiC^ne8y!-)NjoPwJs`^XAQBhw1(@SLyyr<7}+(&+p$WoZhWnaasO~;?>fk zL^#LFnhK<{ckf=(l&*ZM0UUZJ-tMlh-a=b(B)9;=JI8&a8*h*FyKk;L&VLuJlSR_# z%exb?Pk+$*Qb$Jz6BARArsH(a==5}>#S1Ypv4L`TlT3B|55TNv>e$#=x=yKnraHix z>+h*>Py0IqWv&}*DqpgtYX}p4{_Gn-RQLItA7=n;j?>NPBlT%PqRI zu)_8HS4c>%kdl%*I5-4tt9{|)gCcLH{moQ1(BEIr*f=CQTE0InKK>{*bzkXy$77zE zcZbFL7Y{rrEk*Qo7A~p!T)O+cvho>4?F8z#kp1Lg<=oxB5tz2NwglNN-c>DMzdrT$ z&d$j(Oisgr1|I7#cJyU?gp8xEPBq)}CIo3bD?gt>_k*qJ?b{7em%nv(c7FKaQKf(6 z=ur>@{26T_7%GlgR4Ng){XqmQ}?Jre(uil(*r8^T%$)-icWxUUQY@#*c z^d)QIqYsFT>HqVOMwT0DL1n52Y^wDh+e)4-hX0PKFx5c%im=)zvTB5zSvR$g70_=W79n8>(m*DgY? zpSQQPx_a1?Cr>2W5!$c$?agqEJr`P9T97NX%3KQHy!r6);}9UH=RW)v5MFL}HboMD zRydbQ)D>3^q$s~KfD5ykn0W8>7Bp8?i5?FoMDW=fo0>B5X-i5@AYC0jdXzjQIy}74 zqMNf$HahlpprD~#i`5pg4UwgP#OWtPm)#F*PCNoJX66G`5b2=6A}_e zw#@lZT{tT!Sb|mYT)>g=J;9p>jss}VW!!));<*o?iLkU}GIApiP=ioPBM*#41ognj zY1#t!@2?s+zS1sp2^V_wj~$2EwmjwG)6(SFc`0W)8i&4+sqP_3~&u=%aRtlcJ>LvyYQC zooZSpO_8-tO~x5#w-|qk(!O!yx*W;~$Vkb%cl63ffI;hedj0@HZ6z2Q87{`zdmR3wX>6#i!0DAOy+yPZvLHb zAvQme0EJwZ&kXyG(DU*lwLQRrCHG4xDFLf?1v2IIets3l0vO~Kuhps1182X0U!Vdo zX&RWl#_oL8Cb6!ntX%ln`K6{N(Q2S9BqW55jm@(GR~g_I_Ro&ozxmo3c?&Wx+F7c9 z@-`1u85x=AE3S;ZeI?GexcD_D6hjo)px4{fQZ;h#Et;8LXWUOM;NY^he1WeIhvxH( z6Q0-Q<-eeG25_01n~#r;Nzn>Upf1Lx-+5^&&Hh`<{}d z6~x!ytZQhnv$j67nV5UK`8&?RyLazA?bzAVJv>Nu?AVcMu9a=Pf90N}qGF~|eF$pK z**IRS{x!gPly=Hu{)b>zK=VZf1z~>uNCD$tqAAD$G}(1Ze*E~s=v;~)GV=2QF$HK! zp~$f7meFacXLV1Za5aW=i4*QQ19=Hr4}NH9kP+b@eR-adar^e|fK(T#NXk(;^UOQb z-oN)LF`aBn0;vs9DiuUFwZ41zZLi((+z=>=gwErXl%L(%Cbbjy?%hL4V%5wG%5XV$ z@>-$$?H%V?S#vWooHjQuJ1Z~E^u@-;wzstz9u!km4G9mwDJMtf92gkbinKw`r`dAh z;>8iS(EE#%M<^(+b@gDO804csyl}gL^2y&x$;eJ2jjvEXAZ(9GN^)MDY~NU4A0igFj%6c~8JQEYp>>-WdtNS2Qpl~Jh=KNiYIp_27 z(Jn79ufWz5+-6{3y>XHh#wp5*icIY63B5rK%aJY6RMmbk9}QPI|Z{n78A9E*SV zr8n`4evTwrei0G%W7u=r*{A>I6E;LIT)1E{R9RUm!A%ZWq*uXl@nVqKe;h}VrYKh?Vgw&C}(G7rKd~NDzw3h@7Y8CB0xRYOhs6jB%*Ol{(W*X?)3Ie2C_Z_MZi&;?f{YtVO8kIA zNWWA`pg%_}GsWyN25N?`T~o7NKNUsNS3`}XYl3lz$I zdBuJH%9SgOj1nkXLZu+})zzq4d;wa)we?Y#@6$OKLcd5)XTO$N^Xl0%NsyAFB7SG( z>(?v6P7O~7u;2>6KnVEjRG^eqS67RRi}T+8>X9)4$c^1xSy{a(D`x|)1dT3Ce+yk1jEk3#zEY8}^t02K({{SYD9zoW z8myMl)ZASB`gO3u>%ymaBB&1@%rI^|E@l?VZLX@I;0F%jAqcz=G{=4MqG6nv+vR%; z%LcVCj&nbM@gg@fQ!hh@f+BEv*-2VjdW$pEH;{i&o6omO1pz>w`ugT)WE}JpS61d? zVQC=ZuPxT#a=&pjMu=$##{mFC@}7zT0jm zXsibqq^P(!U?+Y?xhp6tvf*W7WCZ>R{3r#5g_?q*_0837TbzAfya1-d0jaxHYG`b1 zjNQZETM4&KO;OBSYiplzgTR>5;ErBLmmyX98;RSoN3OU$UHuM@Hbkbg70_ie!1bG3s)0V&c=t zGHBZe4jkyN{jX zw5`Uf@fA1ZpmPbnC;0*hXSD=>cBVVp+MZ`;XNXHz&pdnPj7Ot!aZ!;@u>&Od7k+wx zjL@;zn3(jK$-AHW_>6331B?P~)z#OpuC4q6kmYxrVHwOtNfdv1@&W`N8y}@M9C=WZ z^Nb1&g+o7oMnp%mulgC%($U2sPQt^(Jr_VcAxp&KvyjrBdwZL=#F5f`LW;O^=MFS& z<`jvlg|!vi^XF3lSSVVEB*f3}mYErJp3~IScT7ygYvwlA@0*+d1P8w)BPm7dA-hp_8f zT3EZcmS@?Q92y4xrn%z zr-h?0#qr*5u%ne&3FClRoymGVy zVTp>auCC6ZlMd<)G>dG@lt207M=w;FxxtSqSs|7m{bXvlDO>mNt%!bzLEhBJA|@`XO%udiz_^6hgzMASc(zw`{a{7xe0)DLEx&=R0Z2y42nScTnPw zz0ZW!2$f=u3CQggzkM=ty}y6+(?hi1hlkm<3WQg(p++93qWVEhZh|(TGPC33CU@?n zrlh1KC!6W(bAoUe6kM8UF90||YO~!u4PhJ%07?1IooN6vH8r(tbruzsc2GTdF4FAq z3$}<{yGHa0CqPe-nSxve-J^k-LGZ&PElo|GH`biNdb>R{ZAR-5Oa853wsDTfN|5D1 z8Ysx25TJU#d2^=k=3XdwWd_w`Hur#%A3c0Xl~fuNqYqIKLfe@*_*p=PsoKRMp`389 zo<7}eQ~#koMGZ7RFgTdrnIp>|>i_Mdnn-@j^TWA0Imm_DT3RzGiQg+pX=!N*<|qMj z(N`|JEL-0MDwmU!`<8cyHUXj%i)Nn8@A;Y!_+@b)Dn%_V83{*6$8zYc(CU`HAlobV zOI~*U(}voLn#j3ZMG#gLv6R4fqA3MI$jrVhJ70>Y3ulvf~H}_Jq)tpt0 zFLj!KxcLQ9xpT)3Zu1U^7AYuf_kT}ebyl!LjJg6AT^WOew@jlO{x?#FJ-TCIfpXZ^-i{w0K6(V8 zCL3Oe>qfc5%JK8_1MQ%;;FbM*_5|E*Am`-Z0B)I|n*)>uK;-1%i4t(M)Y6KCOT(A_ z@S(`<+dtqC$jHiK(-#*OfWefMl^Yux3{Mw&LKeb5uwM%c3qirbnt2w5;P3E05j{4> z@F2Uox}dpGoj3tfa_so=drnSt3=BVi{;a=ZL*jA#<)@+d8o9}c5D*`i)!%n;l~=ER zgjftm3Ezkm$TUl`sS)H_Zf|FIo%uSn6Id)@9iDdh@ULILUNHFll=>7kB!AqI|8OLv zzTop}D1pb){dFNqqO5+)H5ZqdZA(&yI1SnA-Hr5+5LIBWuWzrBPQVF5z)d&DdIe36 zHn+C}LjC^mU>oU#?5m5&dl3c!Sni@I(hGq+qXmDdx*d|MQ)N0r;kulD(9V8`q4ZL6}DvHwx4Hc zsM^h&$7nJo1J5C2cYgiqC%X?TjC{?@=L+r%A<9pu6bp?@!!=)4Uv;FWeoaboZXY#&4ipQ-J1i*t zAA?-vnS6<^?ry*`lzvR1+0_C+d9^-jUnJS|RFd$yt+-^z>N>|1}dpWdNvw zu7dFER2EUmalbF9F2ul)hyDjNi`N(D=lR^$3g8^LkDZf!RasSKKht|tTDl%Av!x|V zx7-aLD;Ueh;yQnz+UXoq`C5CnuBB(ku-P ziT}Wj;(PVsdmT6>cqZD`>Z$Tzh zLC|g3>rRj?k?G>)68>A_`S)K?_>{?a@@0vEUr}$bmbSKbe{@ezPhnvpVehWQX&}s@ zipMxey+ZP@`MKTJoccSk_E;H1LqqFLAenWX7?=fYUc&##y24r@=Fk=noihO-M`e9S z`79w}9Ad|2SmTEegD@Ui_HG-DR?^XN!%9Kh*v7T-gX+wwQ_ zgyzhrp-)~3GT~>loi?bE*6$VWP%kAUo zy&Uv|CKH>BeL!^Hircemmlq1B$afs%icgrq6tJu-XΤ+ij5t4;uG@Bijc=7hXlO`LLj%0O5`l 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

$37Vtst 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 diff --git a/radio/src/fonts/truetype/font_64.specs b/radio/src/fonts/truetype/font_64.specs index fb72ff6da..b03b35475 100644 --- a/radio/src/fonts/truetype/font_64.specs +++ b/radio/src/fonts/truetype/font_64.specs @@ -1 +1 @@ -68,0,4,23,45,85,123,172,215,227,251,275,305,341,358,384,404,430,468,506,544,582,620,658,696,734,772,810,830,848,882,920,955,988,1014,1059,1101,1144,1187,1224,1261,1306,1353,1373,1410,1453,1489,1547,1594,1640,1683,1729,1771,1812,1853,1897,1940,1997,2039,2080,2120,2139,2169,2188,2217,2247,2270,2306,2344,2379,2417,2453,2477,2515,2552,2570,2591,2627,2645,2702,2739,2777,2815,2853,2878,2912,2935,2972,3006,3055,3089,3123,3157,3200,3218,3253,3253,3253,3253,3253,3253,3253,3253,3253,3253,3253,3253,3253,3253,3253,3253,3253,3253,3253,3253,3253,3253,3289,3325,3361,3387,3422,3467,3503,3549,3587,3631,3668,3710,3746,3780,3815,3842,3876,3910,3946,3968,4004,4041,4079,4116,4153,4198,4226,4263,4304,4347,4389,4429,4470,4515,4537,4574,4621,4667,4711,4755,4798,4839,4886,4923,4959,4995,5033,5078,5123,5169,5205,5242,5278,5313,5349,5370,5407,5445,5479,5513,5547,5592,5635,5672,5709,5756,5802,5843,5883,5923,5959,5995,6033,6078,6123,6169 \ No newline at end of file +68,0,19,59,97,146,189,201,225,249,279,315,332,358,378,404,442,480,518,556,594,632,670,708,746,784,804,822,856,894,929,962,988,1033,1075,1118,1161,1198,1235,1280,1327,1347,1384,1427,1463,1521,1568,1614,1657,1703,1745,1786,1827,1871,1914,1971,2013,2054,2094,2113,2143,2162,2191,2221,2244,2280,2318,2353,2391,2427,2451,2489,2526,2544,2565,2601,2619,2676,2713,2751,2789,2827,2852,2886,2909,2946,2980,3029,3063,3097,3131,3174,3192,3227,3227,3227,3227,3227,3227,3227,3227,3227,3227,3227,3227,3227,3227,3227,3227,3227,3227,3227,3227,3227,3227,3263,3299,3335,3361,3396,3441,3477,3523,3561,3605,3642,3684,3720,3754,3789,3816,3850,3884,3920,3942,3979,4017,4054,4091,4136,4164,4201,4242,4285,4327,4367,4408,4453,4475,4512,4559,4605,4649,4693,4736,4777,4824,4861,4897,4942,4979,5015,5050,5086,5107,5144,5178,5212,5246,5291,5334,5371,5408,5455,5496,5536,5576,5621,5657,5702,5738,5783,5826,5863,5899,5945,5983,6029,6067,6132,6197,6262,6327,6392,6457,6522,6587,6652,6717,6782,6847,6912,6977,7042,7107,7172,7237,7302,7367,7432,7497,7562,7627,7692,7757,7822,7887,7952,8017,8082,8147,8212,8277,8342,8407,8472,8537,8602,8667,8732,8797,8862,8927,8992,9057,9122,9187,9252,9317,9382,9447,9512,9577,9642,9707,9772,9837,9902,9967,10032,10097,10162,10227,10292,10357,10422,10487,10552,10617,10682,10747,10812,10877,10942,11007,11072,11137,11202,11267,11332,11397,11462,11527,11592,11657,11722,11787,11852,11917,11982,12047,12112,12177,12242,12307,12372,12437,12502,12567,12632,12697,12762,12827,12892,12957,13022,13087,13152,13217,13282,13347,13412,13477,13542,13607,13672,13737,13802,13867,13932,13997,14062,14127,14192,14257,14322,14387,14452,14517,14582,14647,14712,14777,14842,14907,14972,15037,15102,15167,15232,15297,15362,15427,15492,15557,15622,15687,15752,15817,15882,15947,16012,16077,16142,16207,16272,16337,16402,16467,16532,16597,16662,16727,16792,16857,16922,16987,17052,17117,17182,17247,17312,17377,17442,17507,17572,17637,17702 \ No newline at end of file diff --git a/radio/src/fonts/truetype/font_9.png b/radio/src/fonts/truetype/font_9.png index add3b9eb6e536e03b0ceb6550b7a829d22e4c488..487ddd95881788a9d37162ac32ae7d903fd8d81c 100644 GIT binary patch literal 36745 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 diff --git a/radio/src/fonts/truetype/font_9.specs b/radio/src/fonts/truetype/font_9.specs index e8dfa6851..9272333e9 100644 --- a/radio/src/fonts/truetype/font_9.specs +++ b/radio/src/fonts/truetype/font_9.specs @@ -1 +1 @@ -13,0,4,8,12,19,26,34,41,44,49,54,59,66,69,73,77,82,89,96,103,110,117,124,131,138,145,152,156,159,165,171,177,183,188,195,202,209,216,223,229,237,245,249,255,262,268,277,285,293,300,308,315,322,329,336,343,352,359,366,373,377,382,386,391,397,401,407,414,420,427,433,438,445,451,455,460,466,470,479,485,492,499,506,511,517,521,527,533,541,547,553,559,567,571,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,583,589,595,600,606,613,619,627,634,641,647,654,660,666,672,677,683,689,695,699,705,711,718,724,730,737,742,749,756,763,770,777,784,791,795,802,810,818,825,832,839,846,854,860,866,872,879,886,893,901,907,913,919,925,931,935,941,948,954,960,966,973,980,987,993,1001,1009,1016,1023,1030,1036,1042,1049,1056,1063,1071 \ No newline at end of file +13,0,4,11,18,26,33,36,41,46,51,58,61,65,69,74,81,88,95,102,109,116,123,130,137,144,148,151,157,163,169,175,180,187,194,201,208,215,221,229,237,241,247,254,260,269,277,285,292,300,307,314,321,328,335,344,351,358,365,369,374,378,383,389,393,399,406,412,419,425,430,437,443,447,452,458,462,471,477,484,491,498,503,509,513,519,525,533,539,545,551,559,563,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,575,581,587,592,598,605,611,619,626,633,639,646,652,658,664,669,675,681,687,691,697,704,710,716,723,728,735,742,749,756,763,770,777,781,788,796,804,811,818,825,832,840,846,852,859,865,871,877,883,887,893,899,905,911,918,925,932,938,946,953,960,967,974,980,987,993,1000,1007,1014,1020,1028,1035,1043,1050,1060,1070,1080,1090,1100,1110,1120,1130,1140,1150,1160,1170,1180,1190,1200,1210,1220,1230,1240,1250,1260,1270,1280,1290,1300,1310,1320,1330,1340,1350,1360,1370,1380,1390,1400,1410,1420,1430,1440,1450,1460,1470,1480,1490,1500,1510,1520,1530,1540,1550,1560,1570,1580,1590,1600,1610,1620,1630,1640,1650,1660,1670,1680,1690,1700,1710,1720,1730,1740,1750,1760,1770,1780,1790,1800,1810,1820,1830,1840,1850,1860,1870,1880,1890,1900,1910,1920,1930,1940,1950,1960,1970,1980,1990,2000,2010,2020,2030,2040,2050,2060,2070,2080,2090,2100,2110,2120,2130,2140,2150,2160,2170,2180,2190,2200,2210,2220,2230,2240,2250,2260,2270,2280,2290,2300,2310,2320,2330,2340,2350,2360,2370,2380,2390,2400,2410,2420,2430,2440,2450,2460,2470,2480,2490,2500,2510,2520,2530,2540,2550,2560,2570,2580,2590,2600,2610,2620,2630,2640,2650,2660,2670,2680,2690,2700,2710,2720,2730,2740,2750,2760,2770,2780,2790,2800,2810,2820,2830,2840 \ No newline at end of file diff --git a/radio/src/fonts/truetype/font_bold16.png b/radio/src/fonts/truetype/font_bold16.png index a71570098057331e4e9dfb57d029a0541c978e6b..3e7df2babcfbe43de7a4776edcdbdbc22af8015b 100644 GIT binary patch literal 73359 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

1*ZPb_#{*1F)^DI~C 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

wYiIl9 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 Xu{6hdd#pc0py0mrRAI_+lBnq~N->;k diff --git a/radio/src/fonts/truetype/font_bold16.specs b/radio/src/fonts/truetype/font_bold16.specs index 9e51207e0..0ada56731 100644 --- a/radio/src/fonts/truetype/font_bold16.specs +++ b/radio/src/fonts/truetype/font_bold16.specs @@ -1 +1 @@ -20,0,4,10,17,28,39,52,64,68,75,82,91,101,106,114,120,128,139,150,161,172,183,194,205,216,227,238,244,250,260,271,281,290,298,310,322,334,346,356,366,378,391,397,407,419,429,445,458,471,483,496,508,519,530,542,554,569,581,592,603,609,618,624,632,641,648,658,669,679,690,700,707,718,728,734,741,751,757,772,782,793,804,815,822,832,839,849,859,872,882,892,902,914,920,930,943,956,969,982,995,1008,1021,1034,1047,1062,1077,1092,1107,1122,1137,1152,1167,1182,1197,1212,1227,1237,1247,1257,1265,1275,1287,1297,1310,1321,1333,1343,1355,1365,1375,1385,1393,1403,1413,1423,1430,1440,1450,1461,1471,1481,1493,1501,1511,1522,1534,1546,1557,1568,1580,1587,1597,1610,1623,1635,1647,1659,1670,1683,1693,1703,1713,1724,1736,1748,1761,1771,1781,1791,1801,1811,1817,1827,1838,1848,1858,1868,1880,1892,1902,1912,1925,1938,1949,1960,1971,1981,1991,2002,2014,2026,2039 \ No newline at end of file +20,0,6,17,28,41,53,57,64,71,80,90,95,103,109,117,128,139,150,161,172,183,194,205,216,227,233,239,249,260,270,279,287,299,311,323,335,345,355,367,380,386,396,408,418,434,447,460,472,485,497,508,519,531,543,558,570,581,592,598,607,613,621,630,637,647,658,668,679,689,696,707,717,723,730,740,746,761,771,782,793,804,811,821,828,838,848,861,871,881,891,903,909,919,932,945,958,971,984,997,1010,1023,1036,1051,1066,1081,1096,1111,1126,1141,1156,1171,1186,1201,1216,1226,1236,1246,1254,1264,1276,1286,1299,1310,1322,1332,1344,1354,1364,1374,1382,1392,1402,1412,1419,1429,1440,1450,1460,1472,1480,1490,1501,1513,1525,1536,1547,1559,1566,1576,1589,1602,1614,1626,1638,1649,1662,1672,1682,1694,1704,1714,1724,1734,1740,1750,1760,1770,1780,1792,1804,1814,1824,1837,1848,1859,1870,1882,1892,1904,1914,1926,1938,1948,1958,1971,1982,1995,2006,2023,2040,2057,2074,2091,2108,2125,2142,2159,2176,2193,2210,2227,2244,2261,2278,2295,2312,2329,2346,2363,2380,2397,2414,2431,2448,2465,2482,2499,2516,2533,2550,2567,2584,2601,2618,2635,2652,2669,2686,2703,2720,2737,2754,2771,2788,2805,2822,2839,2856,2873,2890,2907,2924,2941,2958,2975,2992,3009,3026,3043,3060,3077,3094,3111,3128,3145,3162,3179,3196,3213,3230,3247,3264,3281,3298,3315,3332,3349,3366,3383,3400,3417,3434,3451,3468,3485,3502,3519,3536,3553,3570,3587,3604,3621,3638,3655,3672,3689,3706,3723,3740,3757,3774,3791,3808,3825,3842,3859,3876,3893,3910,3927,3944,3961,3978,3995,4012,4029,4046,4063,4080,4097,4114,4131,4148,4165,4182,4199,4216,4233,4250,4267,4284,4301,4318,4335,4352,4369,4386,4403,4420,4437,4454,4471,4488,4505,4522,4539,4556,4573,4590,4607,4624,4641,4658,4675,4692,4709,4726,4743,4760,4777,4794,4811,4828,4845,4862,4879,4896,4913,4930,4947,4964,4981,4998,5015,5032,5049 \ No newline at end of file diff --git a/radio/src/fonts/truetype/font_bold17.png b/radio/src/fonts/truetype/font_bold17.png index bcdc2bb0cf4598f428383c053c1ff893a9cddd18..a3c831b5bf1d60447727442de2505018b83b9789 100644 GIT binary patch literal 75578 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 E0JfvE=>Px# literal 21217 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 && !name[len-1]) --len; diff --git a/radio/src/gui/128x64/lcd.h b/radio/src/gui/128x64/lcd.h index 38b648e00..9d0993676 100644 --- a/radio/src/gui/128x64/lcd.h +++ b/radio/src/gui/128x64/lcd.h @@ -23,14 +23,8 @@ #include -typedef int coord_t; -struct point_t -{ - coord_t x; - coord_t y; -}; typedef uint32_t LcdFlags; -typedef uint8_t display_t; +typedef uint8_t pixel_t; #define BOX_WIDTH 23 #define CENTER @@ -48,11 +42,7 @@ typedef uint8_t display_t; /* lcdDrawText flags */ #define BLINK 0x01 #define INVERS 0x02 -#if defined(BOLD_FONT) - #define BOLD 0x40 -#else - #define BOLD 0x00 -#endif +#define BOLD 0x40 #define LEFT 0x00 /* fake */ #define RIGHT 0x04 /* align right */ #define CENTERED 0x20 @@ -95,7 +85,7 @@ typedef uint8_t display_t; #define DISPLAY_BUFFER_SIZE (LCD_W*((LCD_H+7)/8)) -extern display_t displayBuf[DISPLAY_BUFFER_SIZE]; +extern pixel_t displayBuf[DISPLAY_BUFFER_SIZE]; extern coord_t lcdLastRightPos; extern coord_t lcdLastLeftPos; extern coord_t lcdNextPos; @@ -127,7 +117,7 @@ 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 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); +void drawModelName(coord_t x, coord_t y, char * name, uint8_t id, LcdFlags att); #if !defined(BOOT) // TODO not here ... void drawSwitch(coord_t x, coord_t y, swsrc_t swtch, LcdFlags att=0); void drawSource(coord_t x, coord_t y, mixsrc_t idx, LcdFlags att=0); @@ -190,14 +180,14 @@ uint8_t * lcdLoadBitmap(uint8_t * dest, const char * filename, uint8_t width, ui #define BLINK_ON_PHASE (g_blinkTmr10ms & (1<<6)) #endif -inline display_t getPixel(uint8_t x, uint8_t y) +inline pixel_t getPixel(uint8_t x, uint8_t y) { if (x>=LCD_W || y>=LCD_H) { return 0; } - display_t pixel = displayBuf[(y / 8) * LCD_W + x]; - display_t mask = 1 << (y & 7); + pixel_t pixel = displayBuf[(y / 8) * LCD_W + x]; + pixel_t mask = 1 << (y & 7); return ((pixel & mask) ? 0xf : 0); } diff --git a/radio/src/gui/128x64/model_flightmodes.cpp b/radio/src/gui/128x64/model_flightmodes.cpp index c803d9dfc..c0d5f63b3 100644 --- a/radio/src/gui/128x64/model_flightmodes.cpp +++ b/radio/src/gui/128x64/model_flightmodes.cpp @@ -247,7 +247,7 @@ void menuModelFlightModesAll(event_t event) if (menuVerticalOffset != MAX_FLIGHT_MODES-(LCD_LINES-2)) return; - lcdDrawTextAlignedLeft((LCD_LINES-1)*FH+1, STR_CHECKTRIMS); + lcdDrawText(LCD_W/2, (LCD_LINES-1)*FH+1, STR_CHECKTRIMS, CENTERED); drawFlightMode(OFS_CHECKTRIMS, (LCD_LINES-1)*FH+1, mixerCurrentFlightMode+1); if (sub==MAX_FLIGHT_MODES && !trimsCheckTimer) { lcdInvertLastLine(); diff --git a/radio/src/gui/128x64/model_gvars.cpp b/radio/src/gui/128x64/model_gvars.cpp index 4299469fe..0631b3a20 100644 --- a/radio/src/gui/128x64/model_gvars.cpp +++ b/radio/src/gui/128x64/model_gvars.cpp @@ -103,7 +103,7 @@ void menuModelGVarOne(event_t event) break; case GVAR_FIELD_POPUP: - ON_OFF_MENU_ITEM(gvar->popup, GVAR_2ND_COLUMN, y, STR_POPUP, attr, event); + gvar->popup = editCheckBox(gvar->popup, GVAR_2ND_COLUMN, y, STR_POPUP, attr, event); break; default: diff --git a/radio/src/gui/128x64/model_select.cpp b/radio/src/gui/128x64/model_select.cpp index d0184e5ea..19ee6a702 100644 --- a/radio/src/gui/128x64/model_select.cpp +++ b/radio/src/gui/128x64/model_select.cpp @@ -307,7 +307,7 @@ void menuModelSelect(event_t event) k %= MAX_MODELS; if (eeModelExists(k)) { - putsModelName(4*FW, y, modelHeaders[k].name, k, 0); + drawModelName(4*FW, y, modelHeaders[k].name, k, 0); if (k==g_eeGeneral.currModel && (s_copyMode!=COPY_MODE || s_copySrcRow<0 || i+menuVerticalOffset!=(vertpos_t)sub)) { lcdDrawChar(1, y, '*'); } diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 4cc85a678..1f7f212d5 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -372,7 +372,7 @@ void menuModelSetup(event_t event) #endif MENU_CHECK(menuTabModel, MENU_MODEL_SETUP, HEADER_LINE + ITEM_MODEL_SETUP_LINES_COUNT); - title(STR_MENUSETUP); + title(STR_MENU_MODEL_SETUP); if (event == EVT_ENTRY || event == EVT_ENTRY_UP) { memclear(&reusableBuffer.moduleSetup, sizeof(reusableBuffer.moduleSetup)); @@ -499,11 +499,11 @@ void menuModelSetup(event_t event) } case ITEM_MODEL_SETUP_EXTENDED_LIMITS: - ON_OFF_MENU_ITEM(g_model.extendedLimits, MODEL_SETUP_2ND_COLUMN, y, STR_ELIMITS, attr, event); + g_model.extendedLimits = editCheckBox(g_model.extendedLimits, MODEL_SETUP_2ND_COLUMN, y, STR_ELIMITS, attr, event); break; case ITEM_MODEL_SETUP_EXTENDED_TRIMS: - ON_OFF_MENU_ITEM(g_model.extendedTrims, MODEL_SETUP_2ND_COLUMN, y, STR_ETRIMS, menuHorizontalPosition<=0 ? attr : 0, event==EVT_KEY_BREAK(KEY_ENTER) ? event : 0); + g_model.extendedTrims = editCheckBox(g_model.extendedTrims, MODEL_SETUP_2ND_COLUMN, y, STR_ETRIMS, menuHorizontalPosition<=0 ? attr : 0, event==EVT_KEY_BREAK(KEY_ENTER) ? event : 0); lcdDrawText(MODEL_SETUP_2ND_COLUMN+4*FW, y, STR_RESET_BTN, (menuHorizontalPosition>0 && !NO_HIGHLIGHT()) ? attr : 0); if (attr && menuHorizontalPosition>0) { s_editMode = 0; @@ -527,7 +527,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 ) ; + g_model.throttleReversed = editCheckBox(g_model.throttleReversed, MODEL_SETUP_2ND_COLUMN, y, STR_THROTTLEREVERSE, attr, event ) ; break; case ITEM_MODEL_SETUP_THROTTLE_TRACE: @@ -544,7 +544,7 @@ void menuModelSetup(event_t event) } case ITEM_MODEL_SETUP_THROTTLE_TRIM: - ON_OFF_MENU_ITEM(g_model.thrTrim, MODEL_SETUP_2ND_COLUMN, y, STR_TTRIM, attr, event); + g_model.thrTrim = editCheckBox(g_model.thrTrim, MODEL_SETUP_2ND_COLUMN, y, STR_TTRIM, attr, event); break; case ITEM_MODEL_SETUP_PREFLIGHT_LABEL: @@ -552,11 +552,11 @@ void menuModelSetup(event_t event) break; case ITEM_MODEL_SETUP_CHECKLIST_DISPLAY: - ON_OFF_MENU_ITEM(g_model.displayChecklist, MODEL_SETUP_2ND_COLUMN, y, STR_CHECKLIST, attr, event); + g_model.displayChecklist = editCheckBox(g_model.displayChecklist, MODEL_SETUP_2ND_COLUMN, y, STR_CHECKLIST, attr, event); break; case ITEM_MODEL_SETUP_THROTTLE_WARNING: - g_model.disableThrottleWarning = !editCheckBox(!g_model.disableThrottleWarning, MODEL_SETUP_2ND_COLUMN, y, STR_THROTTLEWARNING, attr, event); + g_model.disableThrottleWarning = !editCheckBox(!g_model.disableThrottleWarning, MODEL_SETUP_2ND_COLUMN, y, STR_THROTTLE_WARNING, attr, event); break; #if defined(PCBTARANIS) @@ -1455,7 +1455,7 @@ void menuModelSetup(event_t event) auto & module = g_model.moduleData[moduleIdx]; // Lite FCC / Lite FLEX / Lite Pro Flex if (isModuleTypeR9MNonAccess(module.type)) { - lcdDrawTextAlignedLeft(y, STR_RFPOWER); + lcdDrawTextAlignedLeft(y, STR_RF_POWER); if (isModuleR9M_FCC_VARIANT(moduleIdx)) { // FCC and FLEX modes ... if (isModuleTypeR9MLiteNonPro(module.type)) { // R9M lite FCC has only one power value, so displayed for info only diff --git a/radio/src/gui/128x64/model_telemetry.cpp b/radio/src/gui/128x64/model_telemetry.cpp index 289c73bba..016972a80 100644 --- a/radio/src/gui/128x64/model_telemetry.cpp +++ b/radio/src/gui/128x64/model_telemetry.cpp @@ -188,7 +188,7 @@ void menuModelTelemetry(event_t event) #if defined(REVX) case ITEM_TELEMETRY_INVERTED_SERIAL: - ON_OFF_MENU_ITEM(g_model.moduleData[EXTERNAL_MODULE].invertedSerial, TELEM_COL2, y, STR_INVERTED_SERIAL, attr, event); + g_model.moduleData[EXTERNAL_MODULE].invertedSerial = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].invertedSerial, TELEM_COL2, y, STR_INVERTED_SERIAL, attr, event); break; #endif @@ -231,7 +231,7 @@ void menuModelTelemetry(event_t event) break; case ITEM_TELEMETRY_IGNORE_SENSOR_INSTANCE: - ON_OFF_MENU_ITEM(g_model.ignoreSensorIds, TELEM_COL2, y, STR_IGNORE_INSTANCE, attr, event); + g_model.ignoreSensorIds = editCheckBox(g_model.ignoreSensorIds, TELEM_COL2, y, STR_IGNORE_INSTANCE, attr, event); break; case ITEM_TELEMETRY_RSSI_LABEL: diff --git a/radio/src/gui/128x64/model_telemetry_sensor.cpp b/radio/src/gui/128x64/model_telemetry_sensor.cpp index f5870f230..d80cd0080 100644 --- a/radio/src/gui/128x64/model_telemetry_sensor.cpp +++ b/radio/src/gui/128x64/model_telemetry_sensor.cpp @@ -205,7 +205,7 @@ void menuModelSensor(event_t event) } else { if (sensor->unit == UNIT_RPMS) { - lcdDrawTextAlignedLeft(y, NO_INDENT(STR_BLADES)); + lcdDrawTextAlignedLeft(y, STR_BLADES); if (attr) CHECK_INCDEC_MODELVAR(event, sensor->custom.ratio, 1, 30000); lcdDrawNumber(SENSOR_2ND_COLUMN, y, sensor->custom.ratio, LEFT|attr); break; @@ -273,31 +273,30 @@ void menuModelSensor(event_t event) } case SENSOR_FIELD_AUTOOFFSET: - ON_OFF_MENU_ITEM(sensor->autoOffset, SENSOR_2ND_COLUMN, y, STR_AUTOOFFSET, attr, event); + sensor->autoOffset = editCheckBox(sensor->autoOffset, SENSOR_2ND_COLUMN, y, STR_AUTOOFFSET, attr, event); break; case SENSOR_FIELD_ONLYPOSITIVE: - ON_OFF_MENU_ITEM(sensor->onlyPositive, SENSOR_2ND_COLUMN, y, STR_ONLYPOSITIVE, attr, event); + sensor->onlyPositive = editCheckBox(sensor->onlyPositive, SENSOR_2ND_COLUMN, y, STR_ONLYPOSITIVE, attr, event); break; case SENSOR_FIELD_FILTER: - ON_OFF_MENU_ITEM(sensor->filter, SENSOR_2ND_COLUMN, y, STR_FILTER, attr, event); + sensor->filter = editCheckBox(sensor->filter, SENSOR_2ND_COLUMN, y, STR_FILTER, attr, event); break; case SENSOR_FIELD_PERSISTENT: - ON_OFF_MENU_ITEM(sensor->persistent, SENSOR_2ND_COLUMN, y, NO_INDENT(STR_PERSISTENT), attr, event); + sensor->persistent = editCheckBox(sensor->persistent, SENSOR_2ND_COLUMN, y, NO_INDENT(STR_PERSISTENT), attr, event); if (checkIncDec_Ret && !sensor->persistent) { sensor->persistentValue = 0; } break; case SENSOR_FIELD_LOGS: - ON_OFF_MENU_ITEM(sensor->logs, SENSOR_2ND_COLUMN, y, STR_LOGS, attr, event); + sensor->logs = editCheckBox(sensor->logs, SENSOR_2ND_COLUMN, y, STR_LOGS, attr, event); if (attr && checkIncDec_Ret) { logsClose(); } break; - } } } diff --git a/radio/src/gui/128x64/radio_setup.cpp b/radio/src/gui/128x64/radio_setup.cpp index c083922be..9d4c10c9e 100644 --- a/radio/src/gui/128x64/radio_setup.cpp +++ b/radio/src/gui/128x64/radio_setup.cpp @@ -28,10 +28,10 @@ const unsigned char sticks[] = { #define RADIO_SETUP_2ND_COLUMN 79 -#define SLIDER_5POS(y, value, label, event, attr) { \ +#define SLIDER_5POS(y, value, event, attr) { \ int8_t tmp = value; \ drawSlider(RADIO_SETUP_2ND_COLUMN, y, LCD_W - 2 - RADIO_SETUP_2ND_COLUMN, 2+tmp, 4, attr); \ - value = editChoice(RADIO_SETUP_2ND_COLUMN, y, label, nullptr, tmp, -2, +2, attr, event); \ + value = editChoice(RADIO_SETUP_2ND_COLUMN, y, nullptr, nullptr, tmp, -2, +2, attr, event); \ } #if defined(SPLASH) @@ -134,7 +134,7 @@ void menuRadioSetup(event_t event) } #endif - MENU(STR_MENURADIOSETUP, menuTabGeneral, MENU_RADIO_SETUP, HEADER_LINE+ITEM_RADIO_SETUP_MAX, { + MENU(STR_RADIO_SETUP, menuTabGeneral, MENU_RADIO_SETUP, HEADER_LINE+ITEM_RADIO_SETUP_MAX, { HEADER_LINE_COLUMNS CASE_RTCLOCK(2) CASE_RTCLOCK(2) CASE_BATTGRAPH(1) LABEL(SOUND), CASE_AUDIO(0) CASE_BUZZER(0) @@ -281,7 +281,7 @@ void menuRadioSetup(event_t event) #if defined(VOICE) case ITEM_RADIO_SETUP_SPEAKER_VOLUME: { - lcdDrawTextAlignedLeft(y, STR_SPEAKER_VOLUME); + lcdDrawText(INDENT_WIDTH, y, STR_VOLUME); uint8_t b = g_eeGeneral.speakerVolume+VOLUME_LEVEL_DEF; drawSlider(RADIO_SETUP_2ND_COLUMN, y, LCD_W - 2 - RADIO_SETUP_2ND_COLUMN, b, VOLUME_LEVEL_MAX, attr); if (attr) { @@ -295,22 +295,28 @@ void menuRadioSetup(event_t event) #endif case ITEM_RADIO_SETUP_BEEP_VOLUME: - SLIDER_5POS(y, g_eeGeneral.beepVolume, STR_BEEP_VOLUME, event, attr); + lcdDrawTextAlignedLeft(y, STR_BEEP_VOLUME); + SLIDER_5POS(y, g_eeGeneral.beepVolume, event, attr); break; + case ITEM_RADIO_SETUP_WAV_VOLUME: - SLIDER_5POS(y, g_eeGeneral.wavVolume, STR_WAV_VOLUME, event, attr); + lcdDrawTextAlignedLeft(y, STR_WAV_VOLUME); + SLIDER_5POS(y, g_eeGeneral.wavVolume, event, attr); break; + case ITEM_RADIO_SETUP_BACKGROUND_VOLUME: - SLIDER_5POS(y, g_eeGeneral.backgroundVolume, STR_BG_VOLUME, event, attr); + lcdDrawTextAlignedLeft(y, STR_BG_VOLUME); + SLIDER_5POS(y, g_eeGeneral.backgroundVolume, event, attr); break; case ITEM_RADIO_SETUP_BEEP_LENGTH: - SLIDER_5POS(y, g_eeGeneral.beepLength, STR_BEEP_LENGTH, event, attr); + lcdDrawText(INDENT_WIDTH, y, STR_BEEP_LENGTH); + SLIDER_5POS(y, g_eeGeneral.beepLength, event, attr); break; #if defined(AUDIO) case ITEM_RADIO_SETUP_SPEAKER_PITCH: - lcdDrawTextAlignedLeft( y, STR_SPKRPITCH); + lcdDrawText(INDENT_WIDTH, y, STR_BEEP_PITCH); lcdDrawChar(RADIO_SETUP_2ND_COLUMN, y, '+', attr); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN+FW, y, g_eeGeneral.speakerPitch*15, attr|LEFT); lcdDrawText(lcdLastRightPos, y, "Hz", attr); @@ -324,23 +330,28 @@ void menuRadioSetup(event_t event) case ITEM_RADIO_SETUP_VARIO_LABEL: lcdDrawTextAlignedLeft(y, STR_VARIO); break; + case ITEM_RADIO_SETUP_VARIO_VOLUME: - SLIDER_5POS(y, g_eeGeneral.varioVolume, TR_SPEAKER_VOLUME, event, attr); + lcdDrawText(INDENT_WIDTH, y, STR_VOLUME); + SLIDER_5POS(y, g_eeGeneral.varioVolume, event, attr); break; + case ITEM_RADIO_SETUP_VARIO_PITCH: - lcdDrawTextAlignedLeft(y, STR_PITCH_AT_ZERO); + lcdDrawText(INDENT_WIDTH, y, STR_PITCH_AT_ZERO); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, VARIO_FREQUENCY_ZERO+(g_eeGeneral.varioPitch*10), attr|LEFT); lcdDrawText(lcdLastRightPos, y, "Hz", attr); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.varioPitch, -40, 40); break; + case ITEM_RADIO_SETUP_VARIO_RANGE: - lcdDrawTextAlignedLeft(y, STR_PITCH_AT_MAX); + lcdDrawText(INDENT_WIDTH, y, STR_PITCH_AT_MAX); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, VARIO_FREQUENCY_ZERO+(g_eeGeneral.varioPitch*10)+VARIO_FREQUENCY_RANGE+(g_eeGeneral.varioRange*10), attr|LEFT); lcdDrawText(lcdLastRightPos, y, "Hz", attr); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.varioRange, -80, 80); break; + case ITEM_RADIO_SETUP_VARIO_REPEAT: - lcdDrawTextAlignedLeft(y, STR_REPEAT_AT_ZERO); + lcdDrawText(INDENT_WIDTH, y, STR_REPEAT_AT_ZERO); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, VARIO_REPEAT_ZERO+(g_eeGeneral.varioRepeat*10), attr|LEFT); lcdDrawText(lcdLastRightPos, y, STR_MS, attr); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.varioRepeat, -30, 50); @@ -357,11 +368,13 @@ void menuRadioSetup(event_t event) break; case ITEM_RADIO_SETUP_HAPTIC_LENGTH: - SLIDER_5POS(y, g_eeGeneral.hapticLength, STR_LENGTH, event, attr); + lcdDrawText(INDENT_WIDTH, y, STR_LENGTH); + SLIDER_5POS(y, g_eeGeneral.hapticLength, event, attr); break; case ITEM_RADIO_SETUP_HAPTIC_STRENGTH: - SLIDER_5POS(y, g_eeGeneral.hapticStrength, STR_HAPTICSTRENGTH, event, attr); + lcdDrawText(INDENT_WIDTH, y, STR_STRENGTH); + SLIDER_5POS(y, g_eeGeneral.hapticStrength, event, attr); break; #endif @@ -409,29 +422,32 @@ void menuRadioSetup(event_t event) break; case ITEM_RADIO_SETUP_BATTERY_WARNING: - lcdDrawTextAlignedLeft(y, STR_BATTERYWARNING); + lcdDrawText(INDENT_WIDTH, y, STR_BATTERYWARNING); putsVolts(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.vBatWarn, attr|LEFT); - if(attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatWarn, 40, 120); //4-12V + if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatWarn, 40, 120); //4-12V break; case ITEM_RADIO_SETUP_MEMORY_WARNING: { - uint8_t b = 1-g_eeGeneral.disableMemoryWarning; - g_eeGeneral.disableMemoryWarning = 1 - editCheckBox(b, RADIO_SETUP_2ND_COLUMN, y, STR_MEMORYWARNING, attr, event); + lcdDrawText(INDENT_WIDTH, y, STR_MEMORYWARNING); + uint8_t b = 1 - g_eeGeneral.disableMemoryWarning; + g_eeGeneral.disableMemoryWarning = 1 - editCheckBox(b, RADIO_SETUP_2ND_COLUMN, y, nullptr, attr, event); break; } case ITEM_RADIO_SETUP_ALARM_WARNING: { + lcdDrawText(INDENT_WIDTH, y, STR_ALARMWARNING); uint8_t b = 1 - g_eeGeneral.disableAlarmWarning; - g_eeGeneral.disableAlarmWarning = 1 - editCheckBox(b, RADIO_SETUP_2ND_COLUMN, y, STR_ALARMWARNING, attr, event); + g_eeGeneral.disableAlarmWarning = 1 - editCheckBox(b, RADIO_SETUP_2ND_COLUMN, y, nullptr, attr, event); break; } case ITEM_RADIO_SETUP_RSSI_POWEROFF_ALARM: { + lcdDrawText(INDENT_WIDTH, y, STR_RSSI_SHUTDOWN_ALARM); uint8_t b = 1 - g_eeGeneral.disableRssiPoweroffAlarm; - g_eeGeneral.disableRssiPoweroffAlarm = 1 - editCheckBox(b, RADIO_SETUP_2ND_COLUMN, y, STR_RSSISHUTDOWNALARM, attr, event); + g_eeGeneral.disableRssiPoweroffAlarm = 1 - editCheckBox(b, RADIO_SETUP_2ND_COLUMN, y, nullptr, attr, event); break; } @@ -444,7 +460,7 @@ void menuRadioSetup(event_t event) #endif case ITEM_RADIO_SETUP_INACTIVITY_ALARM: - lcdDrawTextAlignedLeft(y, STR_INACTIVITYALARM); + lcdDrawText(INDENT_WIDTH, y, STR_INACTIVITYALARM); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.inactivityTimer, attr|LEFT); lcdDrawChar(lcdLastRightPos, y, 'm'); if(attr) g_eeGeneral.inactivityTimer = checkIncDec(event, g_eeGeneral.inactivityTimer, 0, 250, EE_GENERAL); //0..250minutes @@ -455,22 +471,24 @@ void menuRadioSetup(event_t event) break; case ITEM_RADIO_SETUP_BACKLIGHT_MODE: - g_eeGeneral.backlightMode = editChoice(RADIO_SETUP_2ND_COLUMN, y, INDENT TR_MODE, STR_VBLMODE, g_eeGeneral.backlightMode, e_backlight_mode_off, e_backlight_mode_on, attr, event); + lcdDrawText(INDENT_WIDTH, y, STR_MODE); + g_eeGeneral.backlightMode = editChoice(RADIO_SETUP_2ND_COLUMN, y, nullptr, STR_VBLMODE, g_eeGeneral.backlightMode, e_backlight_mode_off, e_backlight_mode_on, attr, event); break; case ITEM_RADIO_SETUP_FLASH_BEEP: - g_eeGeneral.alarmsFlash = editCheckBox(g_eeGeneral.alarmsFlash, RADIO_SETUP_2ND_COLUMN, y, STR_ALARM, attr, event ) ; + lcdDrawText(INDENT_WIDTH, y, STR_ALARM); + g_eeGeneral.alarmsFlash = editCheckBox(g_eeGeneral.alarmsFlash, RADIO_SETUP_2ND_COLUMN, y, nullptr, attr, event ) ; break; case ITEM_RADIO_SETUP_BACKLIGHT_DELAY: - lcdDrawTextAlignedLeft(y, STR_BLDELAY); + lcdDrawText(INDENT_WIDTH, y, STR_DURATION); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.lightAutoOff*5, attr|LEFT); lcdDrawChar(lcdLastRightPos, y, 's'); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.lightAutoOff, 0, 600/5); break; case ITEM_RADIO_SETUP_BRIGHTNESS: - lcdDrawTextAlignedLeft(y, STR_BRIGHTNESS); + lcdDrawText(INDENT_WIDTH, y, STR_BRIGHTNESS); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, 100-g_eeGeneral.backlightBright, attr|LEFT) ; if (attr) { uint8_t b = 100 - g_eeGeneral.backlightBright; @@ -481,13 +499,13 @@ void menuRadioSetup(event_t event) #if defined(PWM_BACKLIGHT) case ITEM_RADIO_SETUP_BACKLIGHT_BRIGHTNESS_OFF: - lcdDrawTextAlignedLeft(y, STR_BLOFFBRIGHTNESS); + lcdDrawText(INDENT_WIDTH, y, STR_BLOFFBRIGHTNESS); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.blOffBright, attr|LEFT); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.blOffBright, 0, 15); break; case ITEM_RADIO_SETUP_BACKLIGHT_BRIGHTNESS_ON: - lcdDrawTextAlignedLeft(y, STR_BLONBRIGHTNESS); + lcdDrawText(INDENT_WIDTH, y, STR_BLONBRIGHTNESS); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, 15-g_eeGeneral.blOnBright, attr|LEFT); if (attr) g_eeGeneral.blOnBright = 15 - checkIncDecGen(event, 15-g_eeGeneral.blOnBright, 0, 15); break; @@ -539,22 +557,24 @@ void menuRadioSetup(event_t event) break; case ITEM_RADIO_SETUP_ADJUST_RTC: - g_eeGeneral.adjustRTC = editCheckBox(g_eeGeneral.adjustRTC, RADIO_SETUP_2ND_COLUMN, y, STR_ADJUST_RTC, attr, event); + lcdDrawTextAlignedLeft(y, STR_ADJUST_RTC); + g_eeGeneral.adjustRTC = editCheckBox(g_eeGeneral.adjustRTC, RADIO_SETUP_2ND_COLUMN, y, nullptr, attr, event); break; case ITEM_RADIO_SETUP_GPSFORMAT: - g_eeGeneral.gpsFormat = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_GPSCOORD, STR_GPSFORMAT, g_eeGeneral.gpsFormat, 0, 1, attr, event); + lcdDrawTextAlignedLeft(y, STR_GPS_COORDS_FORMAT); + g_eeGeneral.gpsFormat = editChoice(RADIO_SETUP_2ND_COLUMN, y, nullptr, STR_GPSFORMAT, g_eeGeneral.gpsFormat, 0, 1, attr, event); break; #endif #if defined(PXX1) case ITEM_RADIO_SETUP_COUNTRYCODE: - g_eeGeneral.countryCode = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_COUNTRYCODE, STR_COUNTRYCODES, g_eeGeneral.countryCode, 0, 2, attr, event); + g_eeGeneral.countryCode = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_COUNTRY_CODE, STR_COUNTRY_CODES, g_eeGeneral.countryCode, 0, 2, attr, event); break; #endif case ITEM_RADIO_SETUP_LANGUAGE: - lcdDrawTextAlignedLeft(y, STR_VOICELANG); + lcdDrawTextAlignedLeft(y, STR_VOICE_LANGUAGE); lcdDrawText(RADIO_SETUP_2ND_COLUMN, y, currentLanguagePack->name, attr); if (attr) { currentLanguagePackIdx = checkIncDec(event, currentLanguagePackIdx, 0, DIM(languagePacks)-2, EE_GENERAL); @@ -566,7 +586,7 @@ void menuRadioSetup(event_t event) break; case ITEM_RADIO_SETUP_IMPERIAL: - g_eeGeneral.imperial = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_UNITSSYSTEM, STR_VUNITSSYSTEM, g_eeGeneral.imperial, 0, 1, attr, event); + g_eeGeneral.imperial = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_UNITS_SYSTEM, STR_VUNITSSYSTEM, g_eeGeneral.imperial, 0, 1, attr, event); break; #if defined(FAI_CHOICE) @@ -597,7 +617,7 @@ void menuRadioSetup(event_t event) #if defined(JACK_DETECT_GPIO) case ITEM_RADIO_SETUP_JACK_MODE: - g_eeGeneral.jackMode = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_JACKMODE, STR_JACKMODES, g_eeGeneral.jackMode, JACK_UNSELECTED_MODE, JACK_MAX_MODE, attr, event); + g_eeGeneral.jackMode = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_JACK_MODE, STR_JACK_MODES, g_eeGeneral.jackMode, JACK_UNSELECTED_MODE, JACK_MAX_MODE, attr, event); break; #endif diff --git a/radio/src/gui/128x64/view_main.cpp b/radio/src/gui/128x64/view_main.cpp index 34c1989d3..5e37e3691 100644 --- a/radio/src/gui/128x64/view_main.cpp +++ b/radio/src/gui/128x64/view_main.cpp @@ -403,7 +403,7 @@ void menuMainView(event_t event) lcdDrawSizedText(PHASE_X, PHASE_Y, g_model.flightModeData[mode].name, sizeof(g_model.flightModeData[mode].name), ZCHAR|PHASE_FLAGS); // Model Name - putsModelName(MODELNAME_X, MODELNAME_Y, g_model.header.name, g_eeGeneral.currModel, BIGSIZE); + drawModelName(MODELNAME_X, MODELNAME_Y, g_model.header.name, g_eeGeneral.currModel, BIGSIZE); // Main Voltage (or alarm if any) displayVoltageOrAlarm(); diff --git a/radio/src/gui/128x64/widgets.cpp b/radio/src/gui/128x64/widgets.cpp index ef7de1a10..6b4090208 100644 --- a/radio/src/gui/128x64/widgets.cpp +++ b/radio/src/gui/128x64/widgets.cpp @@ -72,7 +72,9 @@ void title(const char * s) choice_t editChoice(coord_t x, coord_t y, const char * label, const char *values, choice_t value, choice_t min, choice_t max, LcdFlags attr, event_t event, IsValueAvailable isValueAvailable) { - drawFieldLabel(x, y, label); + if (label) { + drawFieldLabel(x, y, label); + } if (values) lcdDrawTextAtIndex(x, y, values, value-min, attr); if (attr & (~RIGHT)) value = checkIncDec(event, value, min, max, (isModelMenuDisplayed()) ? EE_MODEL : EE_GENERAL, isValueAvailable); return value; diff --git a/radio/src/gui/212x64/CMakeLists.txt b/radio/src/gui/212x64/CMakeLists.txt index 841e17986..eabf0fd51 100644 --- a/radio/src/gui/212x64/CMakeLists.txt +++ b/radio/src/gui/212x64/CMakeLists.txt @@ -2,7 +2,6 @@ set(GUI_SRC ${GUI_SRC} lcd.cpp splash.cpp - fonts.cpp popups.cpp widgets.cpp startup_shutdown.cpp diff --git a/radio/src/gui/212x64/fonts.cpp b/radio/src/gui/212x64/fonts.cpp deleted file mode 100644 index a83d04ae6..000000000 --- a/radio/src/gui/212x64/fonts.cpp +++ /dev/null @@ -1,140 +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" - -const unsigned char font_5x7[] = { -#include "font_05x07.lbm" -#if defined(TRANSLATIONS_DE) -#include "font_de_05x07.lbm" -#elif defined(TRANSLATIONS_CZ) -#include "font_cz_05x07.lbm" -#elif defined(TRANSLATIONS_ES) -#include "font_es_05x07.lbm" -#elif defined(TRANSLATIONS_FI) -#include "font_fi_05x07.lbm" -#elif defined(TRANSLATIONS_FR) -#include "font_fr_05x07.lbm" -#elif defined(TRANSLATIONS_IT) -#include "font_it_05x07.lbm" -#elif defined(TRANSLATIONS_PL) -#include "font_pl_05x07.lbm" -#elif defined(TRANSLATIONS_PT) -#include "font_pt_05x07.lbm" -#elif defined(TRANSLATIONS_SE) -#include "font_se_05x07.lbm" -#endif -}; - -const unsigned char font_5x7_B[] = { -#include "font_05x07_B_compressed.lbm" -}; - -#if !defined(BOOT) -const unsigned char font_10x14[] = { -#include "font_10x14_compressed.lbm" -#if defined(TRANSLATIONS_DE) -#include "font_de_10x14.lbm" -#elif defined(TRANSLATIONS_CZ) -#include "font_cz_10x14.lbm" -#elif defined(TRANSLATIONS_ES) -#include "font_es_10x14.lbm" -#elif defined(TRANSLATIONS_FI) -#include "font_fi_10x14.lbm" -#elif defined(TRANSLATIONS_FR) -#include "font_fr_10x14.lbm" -#elif defined(TRANSLATIONS_IT) -#include "font_it_10x14.lbm" -#elif defined(TRANSLATIONS_PL) -#include "font_pl_10x14.lbm" -#elif defined(TRANSLATIONS_PT) -#include "font_pt_10x14.lbm" -#elif defined(TRANSLATIONS_SE) -#include "font_se_10x14.lbm" -#endif -}; - -const unsigned char font_3x5[] = { -#include "font_03x05.lbm" -}; - -const unsigned char font_4x6[] = { -#include "font_04x06.lbm" -#if defined(TRANSLATIONS_DE) -#include "font_de_04x06.lbm" -#elif defined(TRANSLATIONS_CZ) -#include "font_cz_04x06.lbm" -#elif defined(TRANSLATIONS_ES) -#include "font_es_04x06.lbm" -#elif defined(TRANSLATIONS_FI) -#include "font_fi_04x06.lbm" -#elif defined(TRANSLATIONS_FR) -#include "font_fr_04x06.lbm" -#elif defined(TRANSLATIONS_IT) -#include "font_it_04x06.lbm" -#elif defined(TRANSLATIONS_PL) -#include "font_pl_04x06.lbm" -#elif defined(TRANSLATIONS_PT) -#include "font_pt_04x06.lbm" -#elif defined(TRANSLATIONS_SE) -#include "font_se_04x06.lbm" -#endif -}; - -const unsigned char font_8x10[] = { -#include "font_08x10.lbm" -#if defined(TRANSLATIONS_DE) -#include "font_de_08x10.lbm" -#elif defined(TRANSLATIONS_CZ) -#include "font_cz_08x10.lbm" -#elif defined(TRANSLATIONS_ES) -#include "font_es_08x10.lbm" -#elif defined(TRANSLATIONS_FI) -#include "font_fi_08x10.lbm" -#elif defined(TRANSLATIONS_FR) -#include "font_fr_08x10.lbm" -#elif defined(TRANSLATIONS_IT) -#include "font_it_08x10.lbm" -#elif defined(TRANSLATIONS_PL) -#include "font_pl_08x10.lbm" -#elif defined(TRANSLATIONS_PT) -#include "font_pt_08x10.lbm" -#elif defined(TRANSLATIONS_SE) -#include "font_se_08x10.lbm" -#endif -}; - -const unsigned char font_22x38_num[] = { -#include "font_22x38_num.lbm" -}; - -const unsigned char font_4x6_extra[] = { -#include "font_04x06_extra.lbm" -}; - -const unsigned char font_5x7_extra[] = { -#include "font_05x07_extra.lbm" -}; - -const unsigned char font_10x14_extra[] = { -#include "font_10x14_extra.lbm" -}; - -#endif // !defined(BOOT) diff --git a/radio/src/gui/212x64/gui.h b/radio/src/gui/212x64/gui.h index 7013ede4b..bf519bf3c 100644 --- a/radio/src/gui/212x64/gui.h +++ b/radio/src/gui/212x64/gui.h @@ -213,8 +213,6 @@ choice_t editChoice(coord_t x, coord_t y, const char *label, const char *values, uint8_t editCheckBox(uint8_t value, coord_t x, coord_t y, const char *label, LcdFlags attr, event_t event); swsrc_t editSwitch(coord_t x, coord_t y, swsrc_t value, LcdFlags attr, event_t event); -#define ON_OFF_MENU_ITEM(value, x, y, label, attr, event) value = editCheckBox(value, x, y, label, attr, event) - #if defined(GVARS) void drawGVarValue(coord_t x, coord_t y, uint8_t gvar, gvar_t value, LcdFlags flags=0); int16_t editGVarFieldValue(coord_t x, coord_t y, int16_t value, int16_t min, int16_t max, LcdFlags attr, uint8_t editflags, event_t event); diff --git a/radio/src/gui/212x64/lcd.cpp b/radio/src/gui/212x64/lcd.cpp index 19bb40098..5ec6170bf 100644 --- a/radio/src/gui/212x64/lcd.cpp +++ b/radio/src/gui/212x64/lcd.cpp @@ -19,14 +19,14 @@ */ #include "opentx.h" -#include "timers.h" +#include "common/stdlcd/fonts.h" #if (defined(PCBX9E) || defined(PCBX9DP)) && defined(LCD_DUAL_BUFFER) - display_t displayBuf1[DISPLAY_BUFFER_SIZE] __DMA; - display_t displayBuf2[DISPLAY_BUFFER_SIZE] __DMA; - display_t * displayBuf = displayBuf1; + pixel_t displayBuf1[DISPLAY_BUFFER_SIZE] __DMA; + pixel_t displayBuf2[DISPLAY_BUFFER_SIZE] __DMA; + pixel_t * displayBuf = displayBuf1; #else - display_t displayBuf[DISPLAY_BUFFER_SIZE] __DMA; + pixel_t displayBuf[DISPLAY_BUFFER_SIZE] __DMA; #endif inline bool lcdIsPointOutside(coord_t x, coord_t y) @@ -36,7 +36,7 @@ inline bool lcdIsPointOutside(coord_t x, coord_t y) void lcdClear() { - memset(displayBuf, 0, DISPLAY_BUFFER_SIZE * sizeof(display_t)); + memset(displayBuf, 0, DISPLAY_BUFFER_SIZE * sizeof(pixel_t)); } coord_t lcdLastRightPos; @@ -505,7 +505,7 @@ void lcdDrawFilledRect(coord_t x, coord_t y, coord_t w, coord_t h, uint8_t pat, void drawTelemetryTopBar() { - putsModelName(0, 0, g_model.header.name, g_eeGeneral.currModel, 0); + drawModelName(0, 0, g_model.header.name, g_eeGeneral.currModel, 0); uint8_t att = (IS_TXBATT_WARNING() ? BLINK : 0); putsVBat(12*FW, 0, att); if (g_model.timers[0].mode) { @@ -581,7 +581,7 @@ void putsVBat(coord_t x, coord_t y, LcdFlags att) putsVolts(x, y, g_vbat100mV, att); } -void putsStickName(coord_t x, coord_t y, uint8_t idx, LcdFlags att) +void drawStickName(coord_t x, coord_t y, uint8_t idx, LcdFlags att) { uint8_t length = STR_VSRCRAW[0]; lcdDrawSizedText(x, y, STR_VSRCRAW+2+length*(idx+1), length-1, att); @@ -681,7 +681,7 @@ void putsChnLetter(coord_t x, coord_t y, uint8_t idx, LcdFlags att) lcdDrawTextAtIndex(x, y, STR_RETA123, idx-1, att); } -void putsModelName(coord_t x, coord_t y, char *name, uint8_t id, LcdFlags att) +void drawModelName(coord_t x, coord_t y, char *name, uint8_t id, LcdFlags att) { uint8_t len = sizeof(g_model.header.name); while (len>0 && !name[len-1]) --len; diff --git a/radio/src/gui/212x64/lcd.h b/radio/src/gui/212x64/lcd.h index 7b92acc7e..dc6fc22c4 100644 --- a/radio/src/gui/212x64/lcd.h +++ b/radio/src/gui/212x64/lcd.h @@ -21,14 +21,8 @@ #ifndef _LCD_H_ #define _LCD_H_ -typedef int coord_t; -struct point_t -{ - coord_t x; - coord_t y; -}; typedef uint32_t LcdFlags; -typedef uint8_t display_t; +typedef uint8_t pixel_t; #define BOX_WIDTH 31 #define CENTER "\015" @@ -92,11 +86,11 @@ typedef uint8_t display_t; #define DISPLAY_BUFFER_SIZE (LCD_W*LCD_H*4/8) #if (defined(PCBX9E) || defined(PCBX9DP)) && defined(LCD_DUAL_BUFFER) - extern display_t displayBuf1[DISPLAY_BUFFER_SIZE]; - extern display_t displayBuf2[DISPLAY_BUFFER_SIZE]; - extern display_t * displayBuf; + extern pixel_t displayBuf1[DISPLAY_BUFFER_SIZE]; + extern pixel_t displayBuf2[DISPLAY_BUFFER_SIZE]; + extern pixel_t * displayBuf; #else - extern display_t displayBuf[DISPLAY_BUFFER_SIZE]; + extern pixel_t displayBuf[DISPLAY_BUFFER_SIZE]; #endif extern coord_t lcdLastRightPos; @@ -122,9 +116,9 @@ 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); -void putsModelName(coord_t x, coord_t y, char *name, uint8_t id, LcdFlags att); +void drawModelName(coord_t x, coord_t y, char *name, uint8_t id, LcdFlags att); void drawSwitch(coord_t x, coord_t y, int32_t swtch, LcdFlags att=0); -void putsStickName(coord_t x, coord_t y, uint8_t idx, LcdFlags att=0); +void drawStickName(coord_t x, coord_t y, uint8_t idx, LcdFlags att=0); void drawSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att=0); void drawCurveName(coord_t x, coord_t y, int8_t idx, LcdFlags att=0); void drawTimerMode(coord_t x, coord_t y, swsrc_t mode, LcdFlags att=0); @@ -181,13 +175,13 @@ uint8_t * lcdLoadBitmap(uint8_t * dest, const char * filename, uint16_t width, u #define BLINK_ON_PHASE (g_blinkTmr10ms & (1<<6)) #endif -inline display_t getPixel(unsigned int x, unsigned int y) +inline pixel_t getPixel(unsigned int x, unsigned int y) { if (x>=LCD_W || y>=LCD_H) { return 0; } - display_t * p = &displayBuf[y / 2 * LCD_W + x]; + pixel_t * p = &displayBuf[y / 2 * LCD_W + x]; return (y & 1) ? (*p >> 4) : (*p & 0x0F); } diff --git a/radio/src/gui/212x64/model_gvars.cpp b/radio/src/gui/212x64/model_gvars.cpp index b3b83fcff..7c286a05e 100644 --- a/radio/src/gui/212x64/model_gvars.cpp +++ b/radio/src/gui/212x64/model_gvars.cpp @@ -103,7 +103,7 @@ void menuModelGVarOne(event_t event) break; case GVAR_FIELD_POPUP: - ON_OFF_MENU_ITEM(gvar->popup, GVAR_2ND_COLUMN, y, STR_POPUP, attr, event); + gvar->popup = editCheckBox(gvar->popup, GVAR_2ND_COLUMN, y, STR_POPUP, attr, event); break; default: diff --git a/radio/src/gui/212x64/model_select.cpp b/radio/src/gui/212x64/model_select.cpp index 8b396e1b4..2ddc1628f 100644 --- a/radio/src/gui/212x64/model_select.cpp +++ b/radio/src/gui/212x64/model_select.cpp @@ -264,7 +264,7 @@ void menuModelSelect(event_t event) k %= MAX_MODELS; if (eeModelExists(k)) { - putsModelName(4*FW, y, modelHeaders[k].name, k, 0); + drawModelName(4*FW, y, modelHeaders[k].name, k, 0); lcdDrawNumber(20*FW, y, eeModelSize(k), RIGHT); if (k==g_eeGeneral.currModel && (s_copyMode!=COPY_MODE || s_copySrcRow<0 || i+menuVerticalOffset!=(vertpos_t)sub)) lcdDrawChar(1, y, '*'); diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 9c65731bf..b5b148bf6 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -382,7 +382,7 @@ void menuModelSetup(event_t event) }); MENU_CHECK(menuTabModel, MENU_MODEL_SETUP, ITEM_MODEL_SETUP_LINES_COUNT); - title(STR_MENUSETUP); + title(STR_MENU_MODEL_SETUP); if (event == EVT_ENTRY || event == EVT_ENTRY_UP) { memclear(&reusableBuffer.moduleSetup, sizeof(reusableBuffer.moduleSetup)); @@ -507,11 +507,11 @@ void menuModelSetup(event_t event) #endif case ITEM_MODEL_SETUP_EXTENDED_LIMITS: - ON_OFF_MENU_ITEM(g_model.extendedLimits, MODEL_SETUP_2ND_COLUMN, y, STR_ELIMITS, attr, event); + g_model.extendedLimits = editCheckBox(g_model.extendedLimits, MODEL_SETUP_2ND_COLUMN, y, STR_ELIMITS, attr, event); break; case ITEM_MODEL_SETUP_EXTENDED_TRIMS: - ON_OFF_MENU_ITEM(g_model.extendedTrims, MODEL_SETUP_2ND_COLUMN, y, STR_ETRIMS, menuHorizontalPosition<=0 ? attr : 0, event==EVT_KEY_BREAK(KEY_ENTER) ? event : 0); + g_model.extendedTrims = editCheckBox(g_model.extendedTrims, MODEL_SETUP_2ND_COLUMN, y, STR_ETRIMS, menuHorizontalPosition<=0 ? attr : 0, event==EVT_KEY_BREAK(KEY_ENTER) ? event : 0); lcdDrawText(MODEL_SETUP_2ND_COLUMN+3*FW, y, STR_RESET_BTN, (menuHorizontalPosition>0 && !NO_HIGHLIGHT()) ? attr : 0); if (attr && menuHorizontalPosition>0) { s_editMode = 0; @@ -539,7 +539,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 ) ; + g_model.throttleReversed = editCheckBox(g_model.throttleReversed, MODEL_SETUP_2ND_COLUMN, y, STR_THROTTLEREVERSE, attr, event ) ; break; case ITEM_MODEL_SETUP_THROTTLE_TRACE: @@ -556,7 +556,7 @@ void menuModelSetup(event_t event) } case ITEM_MODEL_SETUP_THROTTLE_TRIM: - ON_OFF_MENU_ITEM(g_model.thrTrim, MODEL_SETUP_2ND_COLUMN, y, STR_TTRIM, attr, event); + g_model.thrTrim = editCheckBox(g_model.thrTrim, MODEL_SETUP_2ND_COLUMN, y, STR_TTRIM, attr, event); break; case ITEM_MODEL_SETUP_PREFLIGHT_LABEL: @@ -564,11 +564,11 @@ void menuModelSetup(event_t event) break; case ITEM_MODEL_SETUP_CHECKLIST_DISPLAY: - ON_OFF_MENU_ITEM(g_model.displayChecklist, MODEL_SETUP_2ND_COLUMN, y, STR_CHECKLIST, attr, event); + g_model.displayChecklist = editCheckBox(g_model.displayChecklist, MODEL_SETUP_2ND_COLUMN, y, STR_CHECKLIST, attr, event); break; case ITEM_MODEL_SETUP_THROTTLE_WARNING: - g_model.disableThrottleWarning = !editCheckBox(!g_model.disableThrottleWarning, MODEL_SETUP_2ND_COLUMN, y, STR_THROTTLEWARNING, attr, event); + g_model.disableThrottleWarning = !editCheckBox(!g_model.disableThrottleWarning, MODEL_SETUP_2ND_COLUMN, y, STR_THROTTLE_WARNING, attr, event); break; #if defined(PCBX9E) @@ -1277,7 +1277,7 @@ void menuModelSetup(event_t event) { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); if (isModuleR9MNonAccess(moduleIdx)) { - lcdDrawTextAlignedLeft(y, TR_RFPOWER); + lcdDrawTextAlignedLeft(y, TR_RF_POWER); if (isModuleR9M_FCC_VARIANT(moduleIdx)) { lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_R9M_FCC_POWER_VALUES, g_model.moduleData[moduleIdx].pxx.power, LEFT | attr); if (attr) diff --git a/radio/src/gui/212x64/model_telemetry.cpp b/radio/src/gui/212x64/model_telemetry.cpp index ab170895f..019107a52 100644 --- a/radio/src/gui/212x64/model_telemetry.cpp +++ b/radio/src/gui/212x64/model_telemetry.cpp @@ -222,7 +222,7 @@ void menuModelTelemetry(event_t event) break; case ITEM_TELEMETRY_IGNORE_SENSOR_INSTANCE: - ON_OFF_MENU_ITEM(g_model.ignoreSensorIds, TELEM_COL2, y, STR_IGNORE_INSTANCE, attr, event); + g_model.ignoreSensorIds = editCheckBox(g_model.ignoreSensorIds, TELEM_COL2, y, STR_IGNORE_INSTANCE, attr, event); break; case ITEM_TELEMETRY_RSSI_LABEL: diff --git a/radio/src/gui/212x64/model_telemetry_sensor.cpp b/radio/src/gui/212x64/model_telemetry_sensor.cpp index 4321f87c3..ac490c6d0 100644 --- a/radio/src/gui/212x64/model_telemetry_sensor.cpp +++ b/radio/src/gui/212x64/model_telemetry_sensor.cpp @@ -219,7 +219,7 @@ void menuModelSensor(event_t event) } else { if (sensor->unit == UNIT_RPMS) { - lcdDrawTextAlignedLeft(y, NO_INDENT(STR_BLADES)); + lcdDrawTextAlignedLeft(y, STR_BLADES); if (attr) sensor->custom.ratio = checkIncDec(event, sensor->custom.ratio, 1, 30000, EE_MODEL|NO_INCDEC_MARKS|INCDEC_REP10); lcdDrawNumber(SENSOR_2ND_COLUMN, y, sensor->custom.ratio, LEFT|attr); break; @@ -287,26 +287,26 @@ void menuModelSensor(event_t event) } case SENSOR_FIELD_AUTOOFFSET: - ON_OFF_MENU_ITEM(sensor->autoOffset, SENSOR_2ND_COLUMN, y, STR_AUTOOFFSET, attr, event); + sensor->autoOffset = editCheckBox(sensor->autoOffset, SENSOR_2ND_COLUMN, y, STR_AUTOOFFSET, attr, event); break; case SENSOR_FIELD_ONLYPOSITIVE: - ON_OFF_MENU_ITEM(sensor->onlyPositive, SENSOR_2ND_COLUMN, y, STR_ONLYPOSITIVE, attr, event); + sensor->onlyPositive = editCheckBox(sensor->onlyPositive, SENSOR_2ND_COLUMN, y, STR_ONLYPOSITIVE, attr, event); break; case SENSOR_FIELD_FILTER: - ON_OFF_MENU_ITEM(sensor->filter, SENSOR_2ND_COLUMN, y, STR_FILTER, attr, event); + sensor->filter = editCheckBox(sensor->filter, SENSOR_2ND_COLUMN, y, STR_FILTER, attr, event); break; case SENSOR_FIELD_PERSISTENT: - ON_OFF_MENU_ITEM(sensor->persistent, SENSOR_2ND_COLUMN, y, NO_INDENT(STR_PERSISTENT), attr, event); + sensor->persistent = editCheckBox(sensor->persistent, SENSOR_2ND_COLUMN, y, NO_INDENT(STR_PERSISTENT), attr, event); if (checkIncDec_Ret && !sensor->persistent) { sensor->persistentValue = 0; } break; case SENSOR_FIELD_LOGS: - ON_OFF_MENU_ITEM(sensor->logs, SENSOR_2ND_COLUMN, y, STR_LOGS, attr, event); + sensor->logs = editCheckBox(sensor->logs, SENSOR_2ND_COLUMN, y, STR_LOGS, attr, event); if (attr && checkIncDec_Ret) { logsClose(); } diff --git a/radio/src/gui/212x64/radio_calibration.cpp b/radio/src/gui/212x64/radio_calibration.cpp index bf4c829c3..622be6e4e 100644 --- a/radio/src/gui/212x64/radio_calibration.cpp +++ b/radio/src/gui/212x64/radio_calibration.cpp @@ -32,7 +32,7 @@ void drawPotsBars() if (IS_POT_SLIDER_AVAILABLE(i)) { uint8_t len = ((calibratedAnalogs[i]+RESX)*BAR_HEIGHT/(RESX*2))+1l; // calculate once per loop V_BAR(x, LCD_H-8, len); - putsStickName(x-2, LCD_H-6, i, TINSIZE); + drawStickName(x-2, LCD_H-6, i, TINSIZE); } } } diff --git a/radio/src/gui/212x64/radio_setup.cpp b/radio/src/gui/212x64/radio_setup.cpp index 77ae4768f..efe5e8ea0 100644 --- a/radio/src/gui/212x64/radio_setup.cpp +++ b/radio/src/gui/212x64/radio_setup.cpp @@ -30,10 +30,10 @@ const unsigned char sticks[] = { #define RADIO_SETUP_DATE_COLUMN RADIO_SETUP_2ND_COLUMN + 4*FWNUM #define RADIO_SETUP_TIME_COLUMN RADIO_SETUP_2ND_COLUMN + 2*FWNUM -#define SLIDER_5POS(y, value, label, event, attr) { \ +#define SLIDER_5POS(y, value, event, attr) { \ int8_t tmp = value; \ drawSlider(RADIO_SETUP_2ND_COLUMN, y, 2+tmp, 4, attr); \ - value = editChoice(RADIO_SETUP_2ND_COLUMN, y, label, nullptr, tmp, -2, +2, attr, event); \ + value = editChoice(RADIO_SETUP_2ND_COLUMN, y, nullptr, nullptr, tmp, -2, +2, attr, event); \ } #if defined(SPLASH) @@ -121,7 +121,7 @@ void menuRadioSetup(event_t event) } #endif - MENU(STR_MENURADIOSETUP, menuTabGeneral, MENU_RADIO_SETUP, ITEM_RADIO_SETUP_MAX, { + MENU(STR_RADIO_SETUP, menuTabGeneral, MENU_RADIO_SETUP, ITEM_RADIO_SETUP_MAX, { 2, // date 2, // time 0, // battery calibration @@ -279,7 +279,7 @@ void menuRadioSetup(event_t event) case ITEM_RADIO_SETUP_GENERAL_VOLUME: { - lcdDrawTextAlignedLeft(y, STR_SPEAKER_VOLUME); + lcdDrawText(INDENT_WIDTH, y, STR_VOLUME); uint8_t b = g_eeGeneral.speakerVolume+VOLUME_LEVEL_DEF; drawSlider(RADIO_SETUP_2ND_COLUMN, y, b, VOLUME_LEVEL_MAX, attr); if (attr) { @@ -292,23 +292,27 @@ void menuRadioSetup(event_t event) } case ITEM_RADIO_SETUP_BEEP_VOLUME: - SLIDER_5POS(y, g_eeGeneral.beepVolume, STR_BEEP_VOLUME, event, attr); + lcdDrawTextAlignedLeft(y, STR_BEEP_VOLUME); + SLIDER_5POS(y, g_eeGeneral.beepVolume, event, attr); break; case ITEM_RADIO_SETUP_WAV_VOLUME: - SLIDER_5POS(y, g_eeGeneral.wavVolume, STR_WAV_VOLUME, event, attr); + lcdDrawTextAlignedLeft(y, STR_WAV_VOLUME); + SLIDER_5POS(y, g_eeGeneral.wavVolume, event, attr); break; case ITEM_RADIO_SETUP_BACKGROUND_VOLUME: - SLIDER_5POS(y, g_eeGeneral.backgroundVolume, STR_BG_VOLUME, event, attr); + lcdDrawTextAlignedLeft(y, STR_BG_VOLUME); + SLIDER_5POS(y, g_eeGeneral.backgroundVolume, event, attr); break; case ITEM_RADIO_SETUP_BEEP_LENGTH: - SLIDER_5POS(y, g_eeGeneral.beepLength, STR_BEEP_LENGTH, event, attr); + lcdDrawText(INDENT_WIDTH, y, STR_BEEP_LENGTH); + SLIDER_5POS(y, g_eeGeneral.beepLength, event, attr); break; case ITEM_RADIO_SETUP_SPEAKER_PITCH: - lcdDrawTextAlignedLeft( y, STR_SPKRPITCH); + lcdDrawText(INDENT_WIDTH, y, STR_BEEP_PITCH); lcdDrawChar(RADIO_SETUP_2ND_COLUMN, y, '+', attr); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN+FW, y, g_eeGeneral.speakerPitch*15, attr|LEFT); lcdDrawText(lcdLastRightPos, y, "Hz", attr); @@ -323,25 +327,26 @@ void menuRadioSetup(event_t event) break; case ITEM_RADIO_SETUP_VARIO_VOLUME: - SLIDER_5POS(y, g_eeGeneral.varioVolume, TR_SPEAKER_VOLUME, event, attr); + lcdDrawText(INDENT_WIDTH, y, STR_VOLUME); + SLIDER_5POS(y, g_eeGeneral.varioVolume, event, attr); break; case ITEM_RADIO_SETUP_VARIO_PITCH: - lcdDrawTextAlignedLeft(y, STR_PITCH_AT_ZERO); + lcdDrawText(INDENT_WIDTH, y, STR_PITCH_AT_ZERO); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, VARIO_FREQUENCY_ZERO+(g_eeGeneral.varioPitch*10), attr|LEFT); lcdDrawText(lcdLastRightPos, y, "Hz", attr); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.varioPitch, -40, 40); break; case ITEM_RADIO_SETUP_VARIO_RANGE: - lcdDrawTextAlignedLeft(y, STR_PITCH_AT_MAX); + lcdDrawText(INDENT_WIDTH, y, STR_PITCH_AT_MAX); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, VARIO_FREQUENCY_ZERO+(g_eeGeneral.varioPitch*10)+VARIO_FREQUENCY_RANGE+(g_eeGeneral.varioRange*10), attr|LEFT); lcdDrawText(lcdLastRightPos, y, "Hz", attr); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.varioRange, -80, 80); break; case ITEM_RADIO_SETUP_VARIO_REPEAT: - lcdDrawTextAlignedLeft(y, STR_REPEAT_AT_ZERO); + lcdDrawText(INDENT_WIDTH, y, STR_REPEAT_AT_ZERO); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, VARIO_REPEAT_ZERO+(g_eeGeneral.varioRepeat*10), attr|LEFT); lcdDrawText(lcdLastRightPos, y, STR_MS, attr); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.varioRepeat, -30, 50); @@ -354,15 +359,18 @@ void menuRadioSetup(event_t event) break; case ITEM_RADIO_SETUP_HAPTIC_MODE: - g_eeGeneral.hapticMode = editChoice(RADIO_SETUP_2ND_COLUMN, y, INDENT TR_MODE, STR_VBEEPMODE, g_eeGeneral.hapticMode, -2, 1, attr, event); + lcdDrawText(INDENT_WIDTH, y, STR_MODE); + g_eeGeneral.hapticMode = editChoice(RADIO_SETUP_2ND_COLUMN, y, nullptr, STR_VBEEPMODE, g_eeGeneral.hapticMode, -2, 1, attr, event); break; case ITEM_RADIO_SETUP_HAPTIC_LENGTH: - SLIDER_5POS(y, g_eeGeneral.hapticLength, STR_LENGTH, event, attr); + lcdDrawText(INDENT_WIDTH, y, STR_LENGTH); + SLIDER_5POS(y, g_eeGeneral.hapticLength, event, attr); break; case ITEM_RADIO_SETUP_HAPTIC_STRENGTH: - SLIDER_5POS(y, g_eeGeneral.hapticStrength, STR_HAPTICSTRENGTH, event, attr); + lcdDrawText(INDENT_WIDTH, y, STR_STRENGTH); + SLIDER_5POS(y, g_eeGeneral.hapticStrength, event, attr); break; #endif @@ -380,34 +388,37 @@ void menuRadioSetup(event_t event) break; case ITEM_RADIO_SETUP_BATTERY_WARNING: - lcdDrawTextAlignedLeft(y, STR_BATTERYWARNING); + lcdDrawText(INDENT_WIDTH, y, STR_BATTERYWARNING); putsVolts(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.vBatWarn, attr|LEFT); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatWarn, 40, 120); // 4-12V break; case ITEM_RADIO_SETUP_MEMORY_WARNING: { + lcdDrawText(INDENT_WIDTH, y, STR_MEMORYWARNING); uint8_t b = 1 - g_eeGeneral.disableMemoryWarning; - g_eeGeneral.disableMemoryWarning = 1 - editCheckBox(b, RADIO_SETUP_2ND_COLUMN, y, STR_MEMORYWARNING, attr, event); + g_eeGeneral.disableMemoryWarning = 1 - editCheckBox(b, RADIO_SETUP_2ND_COLUMN, y, nullptr, attr, event); break; } case ITEM_RADIO_SETUP_ALARM_WARNING: { + lcdDrawText(INDENT_WIDTH, y, STR_ALARMWARNING); uint8_t b = 1 - g_eeGeneral.disableAlarmWarning; - g_eeGeneral.disableAlarmWarning = 1 - editCheckBox(b, RADIO_SETUP_2ND_COLUMN, y, STR_ALARMWARNING, attr, event); + g_eeGeneral.disableAlarmWarning = 1 - editCheckBox(b, RADIO_SETUP_2ND_COLUMN, y, nullptr, attr, event); break; } case ITEM_RADIO_SETUP_RSSI_POWEROFF_ALARM: { + lcdDrawText(INDENT_WIDTH, y, STR_RSSI_SHUTDOWN_ALARM); uint8_t b = 1 - g_eeGeneral.disableRssiPoweroffAlarm; - g_eeGeneral.disableRssiPoweroffAlarm = 1 - editCheckBox(b, RADIO_SETUP_2ND_COLUMN, y, STR_RSSISHUTDOWNALARM, attr, event); + g_eeGeneral.disableRssiPoweroffAlarm = 1 - editCheckBox(b, RADIO_SETUP_2ND_COLUMN, y, nullptr, attr, event); break; } case ITEM_RADIO_SETUP_INACTIVITY_ALARM: - lcdDrawTextAlignedLeft(y, STR_INACTIVITYALARM); + lcdDrawText(INDENT_WIDTH, y, STR_INACTIVITYALARM); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.inactivityTimer, attr|LEFT); lcdDrawChar(lcdLastRightPos, y, 'm'); if(attr) g_eeGeneral.inactivityTimer = checkIncDec(event, g_eeGeneral.inactivityTimer, 0, 250, EE_GENERAL); //0..250minutes @@ -418,11 +429,13 @@ void menuRadioSetup(event_t event) break; case ITEM_RADIO_SETUP_BACKLIGHT_MODE: - g_eeGeneral.backlightMode = editChoice(RADIO_SETUP_2ND_COLUMN, y, INDENT TR_MODE, STR_VBLMODE, g_eeGeneral.backlightMode, e_backlight_mode_off, e_backlight_mode_on, attr, event); + lcdDrawText(INDENT_WIDTH, y, STR_MODE); + g_eeGeneral.backlightMode = editChoice(RADIO_SETUP_2ND_COLUMN, y, nullptr, STR_VBLMODE, g_eeGeneral.backlightMode, e_backlight_mode_off, e_backlight_mode_on, attr, event); break; case ITEM_RADIO_SETUP_FLASH_BEEP: - g_eeGeneral.alarmsFlash = editCheckBox(g_eeGeneral.alarmsFlash, RADIO_SETUP_2ND_COLUMN, y, STR_ALARM, attr, event ) ; + lcdDrawText(INDENT_WIDTH, y, STR_ALARM); + g_eeGeneral.alarmsFlash = editCheckBox(g_eeGeneral.alarmsFlash, RADIO_SETUP_2ND_COLUMN, y, nullptr, attr, event ) ; break; #if defined(PXX2) @@ -432,14 +445,14 @@ void menuRadioSetup(event_t event) #endif case ITEM_RADIO_SETUP_BACKLIGHT_DELAY: - lcdDrawTextAlignedLeft(y, STR_BLDELAY); + lcdDrawText(INDENT_WIDTH, y, STR_DURATION); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.lightAutoOff*5, attr|LEFT); lcdDrawChar(lcdLastRightPos, y, 's'); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.lightAutoOff, 0, 600/5); break; case ITEM_RADIO_SETUP_BRIGHTNESS: - lcdDrawTextAlignedLeft(y, STR_BRIGHTNESS); + lcdDrawText(INDENT_WIDTH, y, STR_BRIGHTNESS); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, 100-g_eeGeneral.backlightBright, attr|LEFT) ; if (attr) { uint8_t b = 100 - g_eeGeneral.backlightBright; @@ -450,7 +463,7 @@ void menuRadioSetup(event_t event) #if defined(PCBX9DP) || defined(PCBX9E) case ITEM_RADIO_SETUP_BACKLIGHT_COLOR: - lcdDrawTextAlignedLeft(y, STR_BLCOLOR); + lcdDrawText(INDENT_WIDTH, y, STR_BLCOLOR); drawSlider(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.backlightColor, 20, attr); if (attr) g_eeGeneral.backlightColor = checkIncDec(event, g_eeGeneral.backlightColor, 0, 20, EE_GENERAL | NO_INCDEC_MARKS); break; @@ -492,28 +505,30 @@ void menuRadioSetup(event_t event) break; case ITEM_RADIO_SETUP_TIMEZONE: - lcdDrawTextAlignedLeft(y, STR_TIMEZONE); + lcdDrawText(INDENT_WIDTH, y, STR_TIMEZONE); lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.timezone, attr|LEFT); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.timezone, -12, 12); break; case ITEM_RADIO_SETUP_ADJUST_RTC: - g_eeGeneral.adjustRTC = editCheckBox(g_eeGeneral.adjustRTC, RADIO_SETUP_2ND_COLUMN, y, STR_ADJUST_RTC, attr, event); + lcdDrawText(INDENT_WIDTH, y, STR_ADJUST_RTC); + g_eeGeneral.adjustRTC = editCheckBox(g_eeGeneral.adjustRTC, RADIO_SETUP_2ND_COLUMN, y, nullptr, attr, event); break; case ITEM_RADIO_SETUP_GPSFORMAT: - g_eeGeneral.gpsFormat = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_GPSCOORD, STR_GPSFORMAT, g_eeGeneral.gpsFormat, 0, 1, attr, event); + lcdDrawText(INDENT_WIDTH, y, STR_GPS_COORDS_FORMAT); + g_eeGeneral.gpsFormat = editChoice(RADIO_SETUP_2ND_COLUMN, y, nullptr, STR_GPSFORMAT, g_eeGeneral.gpsFormat, 0, 1, attr, event); break; #endif #if defined(PXX1) case ITEM_RADIO_SETUP_COUNTRYCODE: - g_eeGeneral.countryCode = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_COUNTRYCODE, STR_COUNTRYCODES, g_eeGeneral.countryCode, 0, 2, attr, event); + g_eeGeneral.countryCode = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_COUNTRY_CODE, STR_COUNTRY_CODES, g_eeGeneral.countryCode, 0, 2, attr, event); break; #endif case ITEM_RADIO_SETUP_LANGUAGE: - lcdDrawTextAlignedLeft(y, STR_VOICELANG); + lcdDrawTextAlignedLeft(y, STR_VOICE_LANGUAGE); lcdDrawText(RADIO_SETUP_2ND_COLUMN, y, currentLanguagePack->name, attr); if (attr) { currentLanguagePackIdx = checkIncDec(event, currentLanguagePackIdx, 0, DIM(languagePacks)-2, EE_GENERAL); @@ -525,7 +540,7 @@ void menuRadioSetup(event_t event) break; case ITEM_RADIO_SETUP_IMPERIAL: - g_eeGeneral.imperial = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_UNITSSYSTEM, STR_VUNITSSYSTEM, g_eeGeneral.imperial, 0, 1, attr, event); + g_eeGeneral.imperial = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_UNITS_SYSTEM, STR_VUNITSSYSTEM, g_eeGeneral.imperial, 0, 1, attr, event); break; #if defined(FAI_CHOICE) @@ -570,7 +585,7 @@ void menuRadioSetup(event_t event) case ITEM_RADIO_SETUP_STICK_MODE: lcdDrawChar(2*FW, y, '1'+reusableBuffer.generalSettings.stickMode, attr); for (uint8_t i=0; i<4; i++) { - putsStickName((6+4*i)*FW, y, *(modn12x3 + 4*reusableBuffer.generalSettings.stickMode + i), 0); + drawStickName((6+4*i)*FW, y, *(modn12x3 + 4*reusableBuffer.generalSettings.stickMode + i), 0); } if (attr && s_editMode>0) { CHECK_INCDEC_GENVAR(event, reusableBuffer.generalSettings.stickMode, 0, 3); diff --git a/radio/src/gui/212x64/view_main.cpp b/radio/src/gui/212x64/view_main.cpp index 0de1bf2cd..8119f0dcf 100644 --- a/radio/src/gui/212x64/view_main.cpp +++ b/radio/src/gui/212x64/view_main.cpp @@ -495,7 +495,7 @@ void menuMainView(event_t event) lcdDrawSizedText(PHASE_X, PHASE_Y, g_model.flightModeData[mode].name, sizeof(g_model.flightModeData[mode].name), ZCHAR|PHASE_FLAGS); // Model Name - putsModelName(MODELNAME_X, MODELNAME_Y, g_model.header.name, g_eeGeneral.currModel, BIGSIZE); + drawModelName(MODELNAME_X, MODELNAME_Y, g_model.header.name, g_eeGeneral.currModel, BIGSIZE); // Trims sliders displayTrims(mode); diff --git a/radio/src/gui/212x64/widgets.cpp b/radio/src/gui/212x64/widgets.cpp index 1d18b9e39..c2bc5c9b5 100644 --- a/radio/src/gui/212x64/widgets.cpp +++ b/radio/src/gui/212x64/widgets.cpp @@ -83,7 +83,9 @@ void title(const char * s) choice_t editChoice(coord_t x, coord_t y, const char * label, const char *values, choice_t value, choice_t min, choice_t max, LcdFlags attr, event_t event, IsValueAvailable isValueAvailable) { - drawFieldLabel(x, y, label); + if (label) { + drawFieldLabel(x, y, label); + } if (values) lcdDrawTextAtIndex(x, y, values, value-min, attr); if (attr & (~RIGHT)) value = checkIncDec(event, value, min, max, (isModelMenuDisplayed()) ? EE_MODEL : EE_GENERAL, isValueAvailable); return value; diff --git a/radio/src/gui/colorlcd/CMakeLists.txt b/radio/src/gui/colorlcd/CMakeLists.txt index 8b7668b50..99c5de4cb 100644 --- a/radio/src/gui/colorlcd/CMakeLists.txt +++ b/radio/src/gui/colorlcd/CMakeLists.txt @@ -2,6 +2,7 @@ include_directories( ${RADIO_SRC_DIRECTORY}/gui/colorlcd ${RADIO_SRC_DIRECTORY}/gui/colorlcd/layouts ${RADIO_SRC_DIRECTORY}/fonts/truetype + ${RADIO_SRC_DIRECTORY}/thirdparty/libopenui/src ) file(GLOB THEMES_SRC RELATIVE ${RADIO_SRC_DIRECTORY}/gui/colorlcd ${RADIO_SRC_DIRECTORY}/gui/colorlcd/themes/*.cpp) @@ -18,12 +19,11 @@ set(GUI_SRC theme.cpp # topbar.cpp - # layout.cpp + layout.cpp # widget.cpp ${THEMES_SRC} - # ${LAYOUTS_SRC} + ${LAYOUTS_SRC} # ${WIDGETS_SRC} - rle.cpp # popups.cpp draw_functions.cpp # menus.cpp @@ -48,6 +48,9 @@ set(GUI_SRC radio_hardware.cpp radio_calibration.cpp view_main.cpp + menu_screen.cpp + screen_setup.cpp + # view_statistics.cpp ) @@ -75,17 +78,30 @@ if(LUA STREQUAL YES) # TODO set(GUI_SRC ${GUI_SRC} model_custom_scripts.cpp) endif() -# gui/${GUI_DIR}/modelslist.cpp - set(SRC ${SRC} stubs.cpp ) # includes libopenui -include(gui/libopenui/CMakeLists.txt) +include(${RADIO_SRC_DIRECTORY}/thirdparty/libopenui/src/CMakeLists.txt) include_directories(gui/libopenui) add_definitions(-DLIBOPENUI) foreach(LIBOPENUI_FILE ${LIBOPENUI_SRC}) - set(SRC ${SRC} gui/libopenui/${LIBOPENUI_FILE}) + set(SRC ${SRC} thirdparty/libopenui/src/${LIBOPENUI_FILE}) endforeach() + +add_gui_src(fullscreen_dialog.cpp) +add_gui_src(confirm_dialog.cpp) +add_gui_src(message_dialog.cpp) +add_gui_src(timeedit.cpp) +add_gui_src(curve.cpp) +add_gui_src(sourcechoice.cpp) +add_gui_src(switchchoice.cpp) +add_gui_src(curveedit.cpp) + +if(HARDWARE_TOUCH) + add_gui_src(keyboard_curve.cpp) +endif() + +# gui/${GUI_DIR}/modelslist.cpp diff --git a/radio/src/gui/colorlcd/colors.h b/radio/src/gui/colorlcd/colors.h index ca2493117..c844d0695 100644 --- a/radio/src/gui/colorlcd/colors.h +++ b/radio/src/gui/colorlcd/colors.h @@ -21,12 +21,7 @@ #ifndef _COLORS_H_ #define _COLORS_H_ -// remove windows default definitions -#undef OPAQUE -#undef RGB - -#define RGB(r, g, b) (uint16_t)((((r) & 0xF8) << 8) + (((g) & 0xFC) << 3) + (((b) & 0xF8) >> 3)) -#define ARGB(a, r, g, b) (uint16_t)((((a) & 0xF0) << 8) + (((r) & 0xF0) << 4) + (((g) & 0xF0) << 0) + (((b) & 0xF0) >> 4)) +#include "libopenui_config.h" #define WHITE RGB(0xFF, 0xFF, 0xFF) #define BLACK RGB(0, 0, 0) @@ -40,49 +35,6 @@ #define DARKRED RGB(160, 0, 6) #define GREEN RGB(25, 150, 50) -#define OPACITY_MAX 0x0F -#define OPACITY(x) ((x)<<24) - -enum LcdColorIndex -{ - TEXT_COLOR_INDEX, - TEXT_BGCOLOR_INDEX, - TEXT_INVERTED_COLOR_INDEX, - TEXT_INVERTED_BGCOLOR_INDEX, - TEXT_STATUSBAR_COLOR_INDEX, - LINE_COLOR_INDEX, - SCROLLBOX_COLOR_INDEX, - MENU_TITLE_BGCOLOR_INDEX, - MENU_TITLE_COLOR_INDEX, - MENU_TITLE_DISABLE_COLOR_INDEX, - HEADER_COLOR_INDEX, - ALARM_COLOR_INDEX, - WARNING_COLOR_INDEX, - TEXT_DISABLE_COLOR_INDEX, - CURVE_AXIS_COLOR_INDEX, - CURVE_COLOR_INDEX, - CURVE_CURSOR_COLOR_INDEX, - HEADER_BGCOLOR_INDEX, - HEADER_ICON_BGCOLOR_INDEX, - HEADER_CURRENT_BGCOLOR_INDEX, - TITLE_BGCOLOR_INDEX, - TRIM_BGCOLOR_INDEX, - TRIM_SHADOW_COLOR_INDEX, - MAINVIEW_PANES_COLOR_INDEX, - MAINVIEW_GRAPHICS_COLOR_INDEX, - OVERLAY_COLOR_INDEX, - CUSTOM_COLOR_INDEX, - BARGRAPH1_COLOR_INDEX, - BARGRAPH2_COLOR_INDEX, - BARGRAPH_BGCOLOR_INDEX, - LCD_COLOR_COUNT -}; - -extern uint16_t lcdColorTable[LCD_COLOR_COUNT]; - -#define COLOR(index) LcdFlags((index) << 16) -#define COLOR_IDX(att) uint8_t((att) >> 16) - #define TEXT_COLOR COLOR(TEXT_COLOR_INDEX) #define TEXT_BGCOLOR COLOR(TEXT_BGCOLOR_INDEX) #define TEXT_INVERTED_COLOR COLOR(TEXT_INVERTED_COLOR_INDEX) @@ -106,7 +58,7 @@ extern uint16_t lcdColorTable[LCD_COLOR_COUNT]; #define TRIM_SHADOW_COLOR COLOR(TRIM_SHADOW_COLOR_INDEX) #define HEADER_BGCOLOR COLOR(HEADER_BGCOLOR_INDEX) #define HEADER_ICON_BGCOLOR COLOR(HEADER_ICON_BGCOLOR_INDEX) -constexpr LcdFlags HEADER_CURRENT_BGCOLOR = COLOR(HEADER_CURRENT_BGCOLOR_INDEX); +#define HEADER_CURRENT_BGCOLOR COLOR(HEADER_CURRENT_BGCOLOR_INDEX) #define MAINVIEW_PANES_COLOR COLOR(MAINVIEW_PANES_COLOR_INDEX) #define MAINVIEW_GRAPHICS_COLOR COLOR(MAINVIEW_GRAPHICS_COLOR_INDEX) #define OVERLAY_COLOR COLOR(OVERLAY_COLOR_INDEX) @@ -115,27 +67,4 @@ constexpr LcdFlags HEADER_CURRENT_BGCOLOR = COLOR(HEADER_CURRENT_BGCOLOR_INDEX) #define BARGRAPH_BGCOLOR COLOR(BARGRAPH_BGCOLOR_INDEX) #define CUSTOM_COLOR COLOR(CUSTOM_COLOR_INDEX) -#define ARGB_SPLIT(color, a, r, g, b) \ - uint16_t a = ((color) & 0xF000) >> 12; \ - uint16_t r = ((color) & 0x0F00) >> 8; \ - uint16_t g = ((color) & 0x00F0) >> 4; \ - uint16_t b = ((color) & 0x000F) - -#define RGB_SPLIT(color, r, g, b) \ - uint16_t r = ((color) & 0xF800) >> 11; \ - uint16_t g = ((color) & 0x07E0) >> 5; \ - uint16_t b = ((color) & 0x001F) - -#define RGB_JOIN(r, g, b) \ - (((r) << 11) + ((g) << 5) + (b)) - -#define GET_RED(color) \ - (((color) & 0xF800) >> 8) - -#define GET_GREEN(color) \ - (((color) & 0x07E0) >> 3) - -#define GET_BLUE(color) \ - (((color) & 0x001F) << 3) - #endif // _COLORS_H_ diff --git a/radio/src/gui/colorlcd/confirm_dialog.cpp b/radio/src/gui/colorlcd/confirm_dialog.cpp new file mode 100644 index 000000000..9abe37492 --- /dev/null +++ b/radio/src/gui/colorlcd/confirm_dialog.cpp @@ -0,0 +1,44 @@ +/* + * 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 "confirm_dialog.h" +#include "static.h" + +ConfirmDialog::ConfirmDialog(const char *title, const char *message, std::function confirmHandler) : + Dialog(title, {50, 73, LCD_W - 100, LCD_H - 146}), + confirmHandler(std::move(confirmHandler)) +{ + new StaticText(this, {0, height() / 2, width(), PAGE_LINE_HEIGHT}, message, CENTERED); +} + +#if defined(HARDWARE_KEYS) +void ConfirmDialog::onKeyEvent(event_t event) +{ + TRACE_WINDOWS("%s received event 0x%X", getWindowDebugString().c_str(), event); + + if (event == EVT_KEY_BREAK(KEY_ENTER)) { + confirmHandler(); + deleteLater(); + } + else if (event == EVT_KEY_BREAK(KEY_EXIT)) { + deleteLater(); + } +} +#endif diff --git a/radio/src/gui/libopenui/coloredit.h b/radio/src/gui/colorlcd/confirm_dialog.h similarity index 65% rename from radio/src/gui/libopenui/coloredit.h rename to radio/src/gui/colorlcd/confirm_dialog.h index 4fe2d4d38..ea0e75689 100644 --- a/radio/src/gui/libopenui/coloredit.h +++ b/radio/src/gui/colorlcd/confirm_dialog.h @@ -18,23 +18,21 @@ * GNU General Public License for more details. */ -#ifndef _COLOREDIT_H_ -#define _COLOREDIT_H_ +#ifndef _CONFIRM_DIALOG_H_ +#define _CONFIRM_DIALOG_H_ -#include "window.h" +#include "dialog.h" -class ColorEdit : public Window { +class ConfirmDialog: public Dialog { public: - ColorEdit(Window * parent, const rect_t & rect, std::function getValue, std::function setValue = nullptr); + ConfirmDialog(const char * title, const char * message, std::function confirmHandler); -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "ColorEdit"; - } +#if defined(HARDWARE_KEYS) + void onKeyEvent(event_t event) override; #endif - ~ColorEdit() override; + protected: + std::function confirmHandler; }; -#endif // _COLOREDIT_H_ +#endif // _CONFIRM_DIALOG_H_ diff --git a/radio/src/gui/libopenui/curve.cpp b/radio/src/gui/colorlcd/curve.cpp similarity index 97% rename from radio/src/gui/libopenui/curve.cpp rename to radio/src/gui/colorlcd/curve.cpp index ac0bcbb0b..b3d7fdabf 100644 --- a/radio/src/gui/libopenui/curve.cpp +++ b/radio/src/gui/colorlcd/curve.cpp @@ -23,6 +23,7 @@ #include "lcd.h" #include "bitmaps.h" #include "strhelpers.h" +#include "font.h" void Curve::drawBackground(BitmapBuffer * dc) { @@ -40,7 +41,7 @@ void Curve::drawBackground(BitmapBuffer * dc) dc->drawHorizontalLine(0, height()*3/4, width(), STASHED, CURVE_AXIS_COLOR); // Outside border - // drawSolidRect(dc, 0, 0, width(), height(), 1, TEXT_COLOR); + // dc->drawSolidRect(0, 0, width(), height(), 1, TEXT_COLOR); } coord_t Curve::getPointX(int x) diff --git a/radio/src/gui/libopenui/curve.h b/radio/src/gui/colorlcd/curve.h similarity index 100% rename from radio/src/gui/libopenui/curve.h rename to radio/src/gui/colorlcd/curve.h diff --git a/radio/src/gui/libopenui/curveedit.cpp b/radio/src/gui/colorlcd/curveedit.cpp similarity index 100% rename from radio/src/gui/libopenui/curveedit.cpp rename to radio/src/gui/colorlcd/curveedit.cpp diff --git a/radio/src/gui/libopenui/curveedit.h b/radio/src/gui/colorlcd/curveedit.h similarity index 100% rename from radio/src/gui/libopenui/curveedit.h rename to radio/src/gui/colorlcd/curveedit.h diff --git a/radio/src/gui/colorlcd/curves.cpp b/radio/src/gui/colorlcd/curves.cpp index b18d15d4a..c5bda06c7 100644 --- a/radio/src/gui/colorlcd/curves.cpp +++ b/radio/src/gui/colorlcd/curves.cpp @@ -19,32 +19,33 @@ */ #include "opentx.h" +#include "font.h" coord_t getCurveYCoord(FnFuncP fn, int x, int width) { return limit(-width, -divRoundClosest(fn(divRoundClosest(x * RESX, width)) * width, RESX), +width); } -void drawFunction(FnFuncP fn, int x, int y, int width) +void drawFunction(BitmapBuffer * dc, FnFuncP fn, int x, int y, int width) { int left = x - width; int right = x + width; // Axis - lcdDrawSolidHorizontalLine(left, y, width*2+1, CURVE_AXIS_COLOR); - lcdDrawSolidVerticalLine(x, y-width, width*2, CURVE_AXIS_COLOR); + dc->drawSolidHorizontalLine(left, y, width*2+1, CURVE_AXIS_COLOR); + dc->drawSolidVerticalLine(x, y-width, width*2, CURVE_AXIS_COLOR); // Extra lines - lcdDrawVerticalLine(left+width/2, y-width, width*2, STASHED, CURVE_AXIS_COLOR); - lcdDrawVerticalLine(right-width/2, y-width, width*2, STASHED, CURVE_AXIS_COLOR); - lcdDrawHorizontalLine(left, y-width/2, width*2+1, STASHED, CURVE_AXIS_COLOR); - lcdDrawHorizontalLine(left, y+width/2, width*2+1, STASHED, CURVE_AXIS_COLOR); + dc->drawVerticalLine(left+width/2, y-width, width*2, STASHED, CURVE_AXIS_COLOR); + dc->drawVerticalLine(right-width/2, y-width, width*2, STASHED, CURVE_AXIS_COLOR); + dc->drawHorizontalLine(left, y-width/2, width*2+1, STASHED, CURVE_AXIS_COLOR); + dc->drawHorizontalLine(left, y+width/2, width*2+1, STASHED, CURVE_AXIS_COLOR); // Outside border - lcdDrawSolidVerticalLine(left, y-width, width*2, TEXT_COLOR); - lcdDrawSolidVerticalLine(right, y-width, width*2, TEXT_COLOR); - lcdDrawSolidHorizontalLine(left, y-width, width*2+1, TEXT_COLOR); - lcdDrawSolidHorizontalLine(left, y+width, width*2+1, TEXT_COLOR); + dc->drawSolidVerticalLine(left, y-width, width*2, TEXT_COLOR); + dc->drawSolidVerticalLine(right, y-width, width*2, TEXT_COLOR); + dc->drawSolidHorizontalLine(left, y-width, width*2+1, TEXT_COLOR); + dc->drawSolidHorizontalLine(left, y+width, width*2+1, TEXT_COLOR); coord_t prev_yv = (coord_t)-1; @@ -53,12 +54,12 @@ void drawFunction(FnFuncP fn, int x, int y, int width) if (prev_yv != (coord_t)-1) { if (prev_yv < yv) { for (int y=prev_yv; y<=yv; y+=1) { - lcdDrawBitmapPattern(x+xv-2, y-2, LBM_POINT, TEXT_COLOR); + dc->drawBitmapPattern(x+xv-2, y-2, LBM_POINT, TEXT_COLOR); } } else { for (int y=yv; y<=prev_yv; y+=1) { - lcdDrawBitmapPattern(x+xv-2, y-2, LBM_POINT, TEXT_COLOR); + dc->drawBitmapPattern(x+xv-2, y-2, LBM_POINT, TEXT_COLOR); } } } @@ -66,31 +67,31 @@ void drawFunction(FnFuncP fn, int x, int y, int width) } } -void drawCurveVerticalScale(int x) +void drawCurveVerticalScale(BitmapBuffer * dc, int x) { for (int i=0; i<=20; i++) { - lcdDrawSolidHorizontalLine(x, CURVE_CENTER_Y-CURVE_SIDE_WIDTH+i*CURVE_SIDE_WIDTH/10, 10, TEXT_COLOR); + dc->drawSolidHorizontalLine(x, CURVE_CENTER_Y-CURVE_SIDE_WIDTH+i*CURVE_SIDE_WIDTH/10, 10, TEXT_COLOR); } } -void drawCurveHorizontalScale() +void drawCurveHorizontalScale(BitmapBuffer * dc) { for (int i=0; i<=20; i++) { - lcdDrawSolidVerticalLine(CURVE_CENTER_X-CURVE_SIDE_WIDTH+i*CURVE_SIDE_WIDTH/10, CURVE_CENTER_Y+CURVE_SIDE_WIDTH+5, 10, TEXT_COLOR); + dc->drawSolidVerticalLine(CURVE_CENTER_X-CURVE_SIDE_WIDTH+i*CURVE_SIDE_WIDTH/10, CURVE_CENTER_Y+CURVE_SIDE_WIDTH+5, 10, TEXT_COLOR); } } -void drawCurveCoord(int x, int y, const char * text, bool active) +void drawCurveCoord(BitmapBuffer * dc, int x, int y, const char * text, bool active) { - lcd->drawSolidFilledRect(x, y, CURVE_COORD_WIDTH, CURVE_COORD_HEIGHT, CURVE_CURSOR_COLOR); - lcdDrawText(x+3+(CURVE_COORD_WIDTH-1-getTextWidth(text, SMLSIZE))/2, y+1, text, LEFT|SMLSIZE|TEXT_BGCOLOR); + dc->drawSolidFilledRect(x, y, CURVE_COORD_WIDTH, CURVE_COORD_HEIGHT, CURVE_CURSOR_COLOR); + dc->drawText(x+3+(CURVE_COORD_WIDTH-1-getTextWidth(text, SMLSIZE))/2, y+1, text, LEFT|SMLSIZE|TEXT_BGCOLOR); if (active) { - lcdDrawBitmapPattern(x, y, LBM_CURVE_COORD_SHADOW, TEXT_COLOR); + dc->drawBitmapPattern(x, y, LBM_CURVE_COORD_SHADOW, TEXT_COLOR); } } -void drawCurvePoint(int x, int y, LcdFlags color) +void drawCurvePoint(BitmapBuffer * dc, int x, int y, LcdFlags color) { - lcdDrawBitmapPattern(x, y, LBM_CURVE_POINT, color); - lcdDrawBitmapPattern(x, y, LBM_CURVE_POINT_CENTER, TEXT_BGCOLOR); + dc->drawBitmapPattern(x, y, LBM_CURVE_POINT, color); + dc->drawBitmapPattern(x, y, LBM_CURVE_POINT_CENTER, TEXT_BGCOLOR); } diff --git a/radio/src/gui/libopenui/custom_curve_choice.cpp b/radio/src/gui/colorlcd/custom_curve_choice.cpp similarity index 97% rename from radio/src/gui/libopenui/custom_curve_choice.cpp rename to radio/src/gui/colorlcd/custom_curve_choice.cpp index 5bb3f32f2..613a4545a 100644 --- a/radio/src/gui/libopenui/custom_curve_choice.cpp +++ b/radio/src/gui/colorlcd/custom_curve_choice.cpp @@ -49,7 +49,7 @@ void CustomCurveChoice::paint(BitmapBuffer * dc) lineColor = TEXT_INVERTED_BGCOLOR; } dc->drawText(3, 2, getCurveString(s, value), flags | textColor); - drawSolidRect(dc, 0, 0, rect.w, rect.h, 1, lineColor); + dc->drawSolidRect(0, 0, rect.w, rect.h, 1, lineColor); dc->drawBitmapPattern(rect.w - 14, (rect.h - 5) / 2, LBM_DROPDOWN, lineColor); } diff --git a/radio/src/gui/libopenui/custom_curve_choice.h b/radio/src/gui/colorlcd/custom_curve_choice.h similarity index 100% rename from radio/src/gui/libopenui/custom_curve_choice.h rename to radio/src/gui/colorlcd/custom_curve_choice.h diff --git a/radio/src/gui/colorlcd/draw_functions.cpp b/radio/src/gui/colorlcd/draw_functions.cpp index 6aa055b37..deb9731a9 100644 --- a/radio/src/gui/colorlcd/draw_functions.cpp +++ b/radio/src/gui/colorlcd/draw_functions.cpp @@ -20,99 +20,99 @@ #include "opentx.h" -void drawStatusText(const char * text) +void drawStatusText(BitmapBuffer * dc, const char * text) { - lcdDrawText(MENUS_MARGIN_LEFT, MENU_FOOTER_TOP, text, TEXT_STATUSBAR_COLOR); + dc->drawText(MENUS_MARGIN_LEFT, MENU_FOOTER_TOP, text, TEXT_STATUSBAR_COLOR); } -void drawColumnHeader(const char * const * headers, const char * const * descriptions, uint8_t index) +void drawColumnHeader(BitmapBuffer * dc, const char * const * headers, const char * const * descriptions, uint8_t index) { - lcdDrawText(LCD_W-MENUS_MARGIN_LEFT, MENU_TITLE_TOP + 2, headers[index], RIGHT | SMLSIZE | MENU_TITLE_COLOR); + dc->drawText(LCD_W-MENUS_MARGIN_LEFT, MENU_TITLE_TOP + 2, headers[index], RIGHT | SMLSIZE | MENU_TITLE_COLOR); if (descriptions) { - drawStatusText(descriptions[index]); + drawStatusText(dc, descriptions[index]); } } -void drawCheckBox(coord_t x, coord_t y, uint8_t value, LcdFlags attr) +void drawCheckBox(BitmapBuffer * dc, coord_t x, coord_t y, uint8_t value, LcdFlags attr) { if (attr) { - lcdDrawSolidFilledRect(x-1, y+3, 14, 14, TEXT_INVERTED_BGCOLOR); - lcdDrawSolidFilledRect(x+1, y+5, 10, 10, TEXT_BGCOLOR); + dc->drawSolidFilledRect(x-1, y+3, 14, 14, TEXT_INVERTED_BGCOLOR); + dc->drawSolidFilledRect(x+1, y+5, 10, 10, TEXT_BGCOLOR); if (value) { - lcdDrawSolidFilledRect(x+2, y+6, 8, 8, TEXT_INVERTED_BGCOLOR); + dc->drawSolidFilledRect(x+2, y+6, 8, 8, TEXT_INVERTED_BGCOLOR); } } else { if (value) { - lcdDrawSolidFilledRect(x+2, y+6, 8, 8, SCROLLBOX_COLOR); - lcdDrawSolidRect(x, y+4, 12, 12, 1, LINE_COLOR); + dc->drawSolidFilledRect(x+2, y+6, 8, 8, SCROLLBOX_COLOR); + dc->drawSolidRect(x, y+4, 12, 12, 1, LINE_COLOR); } else { - lcdDrawSolidRect(x, y+4, 12, 12, 1, LINE_COLOR); + dc->drawSolidRect(x, y+4, 12, 12, 1, LINE_COLOR); } } } -void drawVerticalScrollbar(coord_t x, coord_t y, coord_t h, uint16_t offset, uint16_t count, uint8_t visible) +void drawVerticalScrollbar(BitmapBuffer * dc, coord_t x, coord_t y, coord_t h, uint16_t offset, uint16_t count, uint8_t visible) { if (visible < count) { - lcdDrawSolidVerticalLine(x, y, h, LINE_COLOR); + dc->drawSolidVerticalLine(x, y, h, LINE_COLOR); coord_t yofs = (h*offset + count/2) / count; coord_t yhgt = (h*visible + count/2) / count; if (yhgt + yofs > h) yhgt = h - yofs; - lcdDrawSolidFilledRect(x-1, y + yofs, 3, yhgt, SCROLLBOX_COLOR); + dc->drawSolidFilledRect(x-1, y + yofs, 3, yhgt, SCROLLBOX_COLOR); } } -void drawTrimSquare(coord_t x, coord_t y) +void drawTrimSquare(BitmapBuffer * dc, coord_t x, coord_t y) { - lcdDrawSolidFilledRect(x-2, y, 15, 15, TRIM_BGCOLOR); - lcdDrawBitmapPattern(x-2, y, LBM_TRIM_SHADOW, TRIM_SHADOW_COLOR); + dc->drawSolidFilledRect(x-2, y, 15, 15, TRIM_BGCOLOR); + dc->drawBitmapPattern(x-2, y, LBM_TRIM_SHADOW, TRIM_SHADOW_COLOR); } -void drawHorizontalTrimPosition(coord_t x, coord_t y, int16_t dir) +void drawHorizontalTrimPosition(BitmapBuffer * dc, coord_t x, coord_t y, int16_t dir) { - drawTrimSquare(x, y); + drawTrimSquare(dc, x, y); if (dir >= 0) { - lcdDrawSolidVerticalLine(x+8, y+3, 9, TEXT_INVERTED_COLOR); + dc->drawSolidVerticalLine(x+8, y+3, 9, TEXT_INVERTED_COLOR); } if (dir <= 0) { - lcdDrawSolidVerticalLine(x+2, y+3, 9, TEXT_INVERTED_COLOR); + dc->drawSolidVerticalLine(x+2, y+3, 9, TEXT_INVERTED_COLOR); } // if (exttrim) { // lcdDrawSolidVerticalLine(xm, ym, 9, TEXT_INVERTED_COLOR); // } } -void drawVerticalTrimPosition(coord_t x, coord_t y, int16_t dir) +void drawVerticalTrimPosition(BitmapBuffer * dc, coord_t x, coord_t y, int16_t dir) { - drawTrimSquare(x, y); + drawTrimSquare(dc, x, y); if (dir >= 0) { - lcdDrawSolidHorizontalLine(x+1, y+4, 9, TEXT_INVERTED_COLOR); + dc->drawSolidHorizontalLine(x+1, y+4, 9, TEXT_INVERTED_COLOR); } if (dir <= 0) { - lcdDrawSolidHorizontalLine(x+1, y+10, 9, TEXT_INVERTED_COLOR); + dc->drawSolidHorizontalLine(x+1, y+10, 9, TEXT_INVERTED_COLOR); } // if (exttrim) { // lcdDrawSolidHorizontalLine(xm-1, ym, 3, TEXT_INVERTED_COLOR); // } } -void drawVerticalSlider(coord_t x, coord_t y, int len, int val, int min, int max, uint8_t steps, uint32_t options) +void drawVerticalSlider(BitmapBuffer * dc, coord_t x, coord_t y, int len, int val, int min, int max, uint8_t steps, uint32_t options) { val = limit(min, val, max); if (steps) { int delta = len / steps; for (int i = 0; i <= len; i += delta) { if ((options & OPTION_SLIDER_BIG_TICKS) && (i == 0 || i == len / 2 || i == len)) - lcdDrawSolidHorizontalLine(x, y + i, 13, TEXT_COLOR); + dc->drawSolidHorizontalLine(x, y + i, 13, TEXT_COLOR); else - lcdDrawSolidHorizontalLine(x + 2, y + i, 9, TEXT_COLOR); + dc->drawSolidHorizontalLine(x + 2, y + i, 9, TEXT_COLOR); } } else { - lcdDrawBitmapPattern(x + 1, y, LBM_VTRIM_FRAME, TEXT_COLOR); + dc->drawBitmapPattern(x + 1, y, LBM_VTRIM_FRAME, TEXT_COLOR); /* if (g_model.displayTrims != DISPLAY_TRIMS_NEVER && trim != 0) { if (g_model.displayTrims == DISPLAY_TRIMS_ALWAYS || (trimsDisplayTimer > 0 && (trimsDisplayMask & (1<0 ? -20 : 50), ym+1, trim, TINSIZE); @@ -121,18 +121,18 @@ void drawVerticalSlider(coord_t x, coord_t y, int len, int val, int min, int max } y += len - divRoundClosest(len * (val - min), max - min) - 5; if (options & OPTION_SLIDER_TRIM_BUTTON) { - drawVerticalTrimPosition(x, y - 2, val); + drawVerticalTrimPosition(dc, x, y - 2, val); } else if (options & OPTION_SLIDER_NUMBER_BUTTON) { - drawTrimSquare(x, y - 2); - lcdDrawChar(x + 2, y - 1, '0' + val, SMLSIZE | TEXT_INVERTED_COLOR); + drawTrimSquare(dc, x, y - 2); + // TODO lcdDrawChar(x + 2, y - 1, '0' + val, SMLSIZE | TEXT_INVERTED_COLOR); } else { - drawTrimSquare(x, y - 2); + drawTrimSquare(dc, x, y - 2); } } -void drawHorizontalSlider(coord_t x, coord_t y, int len, int val, int min, int max, uint8_t steps, uint32_t options) +void drawHorizontalSlider(BitmapBuffer * dc, coord_t x, coord_t y, int len, int val, int min, int max, uint8_t steps, uint32_t options) { val = limit(min, val, max); int w = divRoundClosest(len * (val - min), max - min); @@ -141,27 +141,27 @@ void drawHorizontalSlider(coord_t x, coord_t y, int len, int val, int min, int m int delta = len / steps; for (int i = 0; i <= len; i += delta) { if ((options & OPTION_SLIDER_BIG_TICKS) && (i == 0 || i == len / 2 || i == len)) - lcdDrawSolidVerticalLine(x + i, y, 13, TEXT_COLOR); + dc->drawSolidVerticalLine(x + i, y, 13, TEXT_COLOR); else - lcdDrawSolidVerticalLine(x + i, y + 2, 9, TEXT_COLOR); + dc->drawSolidVerticalLine(x + i, y + 2, 9, TEXT_COLOR); } } } else if (options & OPTION_SLIDER_EMPTY_BAR) { - lcdDrawBitmapPattern(x, y + 1, LBM_HTRIM_FRAME, TEXT_COLOR); + dc->drawBitmapPattern(x, y + 1, LBM_HTRIM_FRAME, TEXT_COLOR); } else if (options & OPTION_SLIDER_DBL_COLOR) { - lcdDrawBitmapPattern(x, y + 8, LBM_SLIDER_BAR_LEFT, w <= 0 ? LINE_COLOR : TEXT_INVERTED_BGCOLOR); + dc->drawBitmapPattern(x, y + 8, LBM_SLIDER_BAR_LEFT, w <= 0 ? LINE_COLOR : TEXT_INVERTED_BGCOLOR); if (w > 4) - lcdDrawSolidFilledRect(x + 4, y + 8, w - 4, 4, TEXT_INVERTED_BGCOLOR); + dc->drawSolidFilledRect(x + 4, y + 8, w - 4, 4, TEXT_INVERTED_BGCOLOR); if (w < len - 4) - lcdDrawSolidFilledRect(x + w, y + 8, len - w - 4, 4, LINE_COLOR); - lcdDrawBitmapPattern(x + len - 4, y + 8, LBM_SLIDER_BAR_RIGHT, w >= len ? TEXT_INVERTED_BGCOLOR : LINE_COLOR); + dc->drawSolidFilledRect(x + w, y + 8, len - w - 4, 4, LINE_COLOR); + dc->drawBitmapPattern(x + len - 4, y + 8, LBM_SLIDER_BAR_RIGHT, w >= len ? TEXT_INVERTED_BGCOLOR : LINE_COLOR); } else { - lcdDrawBitmapPattern(x, y + 8, LBM_SLIDER_BAR_LEFT, LINE_COLOR); - lcdDrawSolidFilledRect(x + 4, y + 8, len - 8, 4, LINE_COLOR); - lcdDrawBitmapPattern(x + len - 4, y + 8, LBM_SLIDER_BAR_RIGHT, LINE_COLOR); + dc->drawBitmapPattern(x, y + 8, LBM_SLIDER_BAR_LEFT, LINE_COLOR); + dc->drawSolidFilledRect(x + 4, y + 8, len - 8, 4, LINE_COLOR); + dc->drawBitmapPattern(x + len - 4, y + 8, LBM_SLIDER_BAR_RIGHT, LINE_COLOR); // /* if (g_model.displayTrims != DISPLAY_TRIMS_NEVER && trim != 0) { if (g_model.displayTrims == DISPLAY_TRIMS_ALWAYS || (trimsDisplayTimer > 0 && (trimsDisplayMask & (1<drawText(x + 7, y - 1, text, SMLSIZE | CENTERED | TEXT_INVERTED_COLOR); } else if (options & OPTION_SLIDER_SQUARE_BUTTON) { - drawTrimSquare(x, y - 1); + drawTrimSquare(dc, x, y - 1); } else { - lcdDrawBitmapPattern(x, y + 2, LBM_SLIDER_POINT_OUT, TEXT_COLOR); - lcdDrawBitmapPattern(x, y + 2, LBM_SLIDER_POINT_MID, TEXT_BGCOLOR); + dc->drawBitmapPattern(x, y + 2, LBM_SLIDER_POINT_OUT, TEXT_COLOR); + dc->drawBitmapPattern(x, y + 2, LBM_SLIDER_POINT_MID, TEXT_BGCOLOR); if ((options & INVERS) && (!(options & BLINK) || !BLINK_ON_PHASE)) - lcdDrawBitmapPattern(x, y + 2, LBM_SLIDER_POINT_IN, TEXT_INVERTED_BGCOLOR); + dc->drawBitmapPattern(x, y + 2, LBM_SLIDER_POINT_IN, TEXT_INVERTED_BGCOLOR); } } @@ -248,7 +248,7 @@ int16_t editGVarFieldValue(coord_t x, coord_t y, int16_t value, int16_t min, int #else void drawValueOrGVar(BitmapBuffer * dc, coord_t x, coord_t y, gvar_t value, LcdFlags flags) { - drawNumber(dc, x, y, value, flags, 0, nullptr, "%"); + dc->drawNumber(x, y, value, flags, 0, nullptr, "%"); } #endif @@ -258,7 +258,7 @@ void drawSleepBitmap() lcd->clearClippingRect(); lcd->clear(); - const BitmapBuffer * bitmap = BitmapBuffer::load(getThemePath("sleep.bmp")); + const BitmapBuffer * bitmap = BitmapBuffer::load(static_cast(theme)->getFilePath("sleep.bmp")); if (bitmap) { lcd->drawBitmap((LCD_W-bitmap->getWidth())/2, (LCD_H-bitmap->getHeight())/2, bitmap); delete bitmap; @@ -274,21 +274,21 @@ void drawShutdownAnimation(uint32_t duration, uint32_t totalDuration, const char return; static uint32_t lastDuration = 0xffffffff; - static const BitmapBuffer * shutdown = BitmapBuffer::load(getThemePath("shutdown.bmp")); + static const BitmapBuffer * shutdown = BitmapBuffer::load(static_cast(theme)->getFilePath("shutdown.bmp")); if (shutdown) { if (duration < lastDuration) { - theme->drawBackground(lcd); + static_cast(theme)->drawBackground(lcd); lcd->drawBitmap((LCD_W-shutdown->getWidth())/2, (LCD_H-shutdown->getHeight())/2, shutdown); lcdStoreBackupBuffer(); } else { lcdRestoreBackupBuffer(); int quarter = duration / (totalDuration / 5); - if (quarter >= 1) lcdDrawBitmapPattern(LCD_W/2, (LCD_H-SHUTDOWN_CIRCLE_DIAMETER)/2, LBM_SHUTDOWN_CIRCLE, TEXT_COLOR, 0, SHUTDOWN_CIRCLE_DIAMETER/2); - if (quarter >= 2) lcdDrawBitmapPattern(LCD_W/2, LCD_H/2, LBM_SHUTDOWN_CIRCLE, TEXT_COLOR, SHUTDOWN_CIRCLE_DIAMETER/2, SHUTDOWN_CIRCLE_DIAMETER/2); - if (quarter >= 3) lcdDrawBitmapPattern((LCD_W-SHUTDOWN_CIRCLE_DIAMETER)/2, LCD_H/2, LBM_SHUTDOWN_CIRCLE, TEXT_COLOR, SHUTDOWN_CIRCLE_DIAMETER, SHUTDOWN_CIRCLE_DIAMETER/2); - if (quarter >= 4) lcdDrawBitmapPattern((LCD_W-SHUTDOWN_CIRCLE_DIAMETER)/2, (LCD_H-SHUTDOWN_CIRCLE_DIAMETER)/2, LBM_SHUTDOWN_CIRCLE, TEXT_COLOR, SHUTDOWN_CIRCLE_DIAMETER*3/2, SHUTDOWN_CIRCLE_DIAMETER/2); + if (quarter >= 1) lcd->drawBitmapPattern(LCD_W/2, (LCD_H-SHUTDOWN_CIRCLE_DIAMETER)/2, LBM_SHUTDOWN_CIRCLE, TEXT_COLOR, 0, SHUTDOWN_CIRCLE_DIAMETER/2); + if (quarter >= 2) lcd->drawBitmapPattern(LCD_W/2, LCD_H/2, LBM_SHUTDOWN_CIRCLE, TEXT_COLOR, SHUTDOWN_CIRCLE_DIAMETER/2, SHUTDOWN_CIRCLE_DIAMETER/2); + if (quarter >= 3) lcd->drawBitmapPattern((LCD_W-SHUTDOWN_CIRCLE_DIAMETER)/2, LCD_H/2, LBM_SHUTDOWN_CIRCLE, TEXT_COLOR, SHUTDOWN_CIRCLE_DIAMETER, SHUTDOWN_CIRCLE_DIAMETER/2); + if (quarter >= 4) lcd->drawBitmapPattern((LCD_W-SHUTDOWN_CIRCLE_DIAMETER)/2, (LCD_H-SHUTDOWN_CIRCLE_DIAMETER)/2, LBM_SHUTDOWN_CIRCLE, TEXT_COLOR, SHUTDOWN_CIRCLE_DIAMETER*3/2, SHUTDOWN_CIRCLE_DIAMETER/2); } } else { @@ -320,7 +320,7 @@ void drawCurveRef(BitmapBuffer * dc, coord_t x, coord_t y, const CurveRef & curv break; case CURVE_REF_FUNC: - drawTextAtIndex(dc, x, y, STR_VCURVEFUNC, curve.value, flags); + dc->drawTextAtIndex(x, y, STR_VCURVEFUNC, curve.value, flags); break; case CURVE_REF_CUSTOM: @@ -330,13 +330,13 @@ void drawCurveRef(BitmapBuffer * dc, coord_t x, coord_t y, const CurveRef & curv } } -void putsStickName(coord_t x, coord_t y, uint8_t idx, LcdFlags att) +void drawStickName(BitmapBuffer * dc, coord_t x, coord_t y, uint8_t idx, LcdFlags att) { uint8_t length = STR_VSRCRAW[0]; - lcdDrawSizedText(x, y, STR_VSRCRAW+2+length*(idx+1), length-1, att); + dc->drawSizedText(x, y, STR_VSRCRAW+2+length*(idx+1), length-1, att); } -void putsModelName(coord_t x, coord_t y, char * name, uint8_t id, LcdFlags att) +void drawModelName(BitmapBuffer * dc, coord_t x, coord_t y, char * name, uint8_t id, LcdFlags att) { uint8_t len = sizeof(g_model.header.name); while (len>0 && !name[len-1]) --len; @@ -344,15 +344,15 @@ void putsModelName(coord_t x, coord_t y, char * name, uint8_t id, LcdFlags att) drawStringWithIndex(x, y, STR_MODEL, id+1, att|LEADING0); } else { - lcdDrawSizedText(x, y, name, sizeof(g_model.header.name), ZCHAR|att); + dc->drawSizedText(x, y, name, sizeof(g_model.header.name), att); } } -void drawCurveName(coord_t x, coord_t y, int8_t idx, LcdFlags flags) +void drawCurveName(BitmapBuffer * dc, coord_t x, coord_t y, int8_t idx, LcdFlags flags) { char s[8]; getCurveString(s, idx); - lcdDrawText(x, y, s, flags); + dc->drawText(x, y, s, flags); } void drawSource(BitmapBuffer * dc, coord_t x, coord_t y, mixsrc_t idx, LcdFlags flags) @@ -390,33 +390,33 @@ void drawDate(BitmapBuffer * dc, coord_t x, coord_t y, TelemetryItem & telemetry if (att & DBLSIZE) { x -= 42; 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); - lcdDrawChar(lcdNextPos-1, y, '-', att); - lcdDrawNumber(lcdNextPos-1, y, telemetryItem.datetime.year-2000, att|LEFT); + dc->drawNumber(x, y, telemetryItem.datetime.day, att|LEADING0|LEFT, 2); + dc->drawText(lcdNextPos-1, y, "-", att); + dc->drawNumber(lcdNextPos-1, y, telemetryItem.datetime.month, att|LEFT, 2); + dc->drawText(lcdNextPos-1, y, "-", att); + dc->drawNumber(lcdNextPos-1, y, telemetryItem.datetime.year-2000, att|LEFT); y += FH; - lcdDrawNumber(x, y, telemetryItem.datetime.hour, att|LEADING0|LEFT, 2); - lcdDrawChar(lcdNextPos, y, ':', att); - lcdDrawNumber(lcdNextPos, y, telemetryItem.datetime.min, att|LEADING0|LEFT, 2); - lcdDrawChar(lcdNextPos, y, ':', att); - lcdDrawNumber(lcdNextPos, y, telemetryItem.datetime.sec, att|LEADING0|LEFT, 2); + dc->drawNumber(x, y, telemetryItem.datetime.hour, att|LEADING0|LEFT, 2); + dc->drawText(lcdNextPos, y, ":", att); + dc->drawNumber(lcdNextPos, y, telemetryItem.datetime.min, att|LEADING0|LEFT, 2); + dc->drawText(lcdNextPos, y, ":", att); + dc->drawNumber(lcdNextPos, y, telemetryItem.datetime.sec, att|LEADING0|LEFT, 2); } 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); - lcdDrawChar(lcdNextPos-1, y, '-', att); - lcdDrawNumber(lcdNextPos, y, telemetryItem.datetime.year-2000, att|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); - lcdDrawChar(lcdNextPos, y, ':', att); - lcdDrawNumber(lcdNextPos, y, telemetryItem.datetime.sec, att|LEADING0|LEFT, 2); + dc->drawNumber(x, y, telemetryItem.datetime.day, att|LEADING0|LEFT, 2); + dc->drawText(lcdNextPos-1, y, "-", att); + dc->drawNumber(lcdNextPos, y, telemetryItem.datetime.month, att|LEFT, 2); + dc->drawText(lcdNextPos-1, y, "-", att); + dc->drawNumber(lcdNextPos, y, telemetryItem.datetime.year-2000, att|LEFT); + dc->drawNumber(lcdNextPos+11, y, telemetryItem.datetime.hour, att|LEADING0|LEFT, 2); + dc->drawText(lcdNextPos, y, ":", att); + dc->drawNumber(lcdNextPos, y, telemetryItem.datetime.min, att|LEADING0|LEFT, 2); + dc->drawText(lcdNextPos, y, ":", att); + dc->drawNumber(lcdNextPos, y, telemetryItem.datetime.sec, att|LEADING0|LEFT, 2); } } -void drawGPSCoord(coord_t x, coord_t y, int32_t value, const char * direction, LcdFlags flags, bool seconds=true) +void drawGPSCoord(BitmapBuffer * dc, coord_t x, coord_t y, int32_t value, const char * direction, LcdFlags flags, bool seconds=true) { char s[32]; uint32_t absvalue = abs(value); @@ -445,27 +445,26 @@ void drawGPSCoord(coord_t x, coord_t y, int32_t value, const char * direction, L } *tmp++ = direction[value>=0 ? 0 : 1]; *tmp = '\0'; - lcdDrawText(x, y, s, flags); + dc->drawText(x, y, s, flags); } -void drawGPSPosition(coord_t x, coord_t y, int32_t longitude, int32_t latitude, LcdFlags flags) +void drawGPSPosition(BitmapBuffer * dc, coord_t x, coord_t y, int32_t longitude, int32_t latitude, LcdFlags flags) { if (flags & EXPANDED) { - drawGPSCoord(x, y, latitude, "NS", flags, true); - drawGPSCoord(x, y + FH, longitude, "EW", flags, true); + drawGPSCoord(dc, x, y, latitude, "NS", flags, true); + drawGPSCoord(dc, x, y + FH, longitude, "EW", flags, true); } else { - drawGPSCoord(x, y, latitude, "NS", flags, false); - drawGPSCoord(lcdNextPos+5, y, longitude, "EW", flags, false); + drawGPSCoord(dc, x, y, latitude, "NS", flags, false); + drawGPSCoord(dc, lcdNextPos+5, y, longitude, "EW", flags, false); } } -void drawGPSSensorValue(coord_t x, coord_t y, TelemetryItem & telemetryItem, LcdFlags flags) +void drawGPSSensorValue(BitmapBuffer * dc, coord_t x, coord_t y, TelemetryItem & telemetryItem, LcdFlags flags) { - drawGPSPosition(x, y, telemetryItem.gps.longitude, telemetryItem.gps.latitude, flags); + drawGPSPosition(dc, x, y, telemetryItem.gps.longitude, telemetryItem.gps.latitude, flags); } - void drawSensorCustomValue(BitmapBuffer * dc, coord_t x, coord_t y, uint8_t sensor, int32_t value, LcdFlags flags) { if (sensor >= MAX_TELEMETRY_SENSORS) { @@ -480,14 +479,14 @@ void drawSensorCustomValue(BitmapBuffer * dc, coord_t x, coord_t y, uint8_t sens drawDate(dc, x, y, telemetryItem, flags); } else if (telemetrySensor.unit == UNIT_GPS) { - drawGPSSensorValue(x, y, telemetryItem, flags); + drawGPSSensorValue(dc, x, y, telemetryItem, flags); } else if (telemetrySensor.unit == UNIT_BITFIELD) { if (IS_FRSKY_SPORT_PROTOCOL()) { if (telemetrySensor.id >= RBOX_STATE_FIRST_ID && telemetrySensor.id <= RBOX_STATE_LAST_ID) { if (telemetrySensor.subId == 0) { if (value == 0) { - lcdDrawText(x, y, "OK", flags); + dc->drawText(x, y, "OK", flags); } else { for (uint8_t i=0; i<16; i++) { @@ -551,7 +550,7 @@ void drawSourceCustomValue(BitmapBuffer * dc, coord_t x, coord_t y, source_t sou // TODO drawTimer(dc, x, y, value, flags); } else if (source == MIXSRC_TX_VOLTAGE) { - lcdDrawNumber(x, y, value, flags|PREC1); + dc->drawNumber(x, y, value, flags|PREC1); } #if defined(INTERNAL_GPS) else if (source == MIXSRC_TX_GPS) { @@ -560,7 +559,7 @@ void drawSourceCustomValue(BitmapBuffer * dc, coord_t x, coord_t y, source_t sou } else { lcdDrawText(x, y, "sats: ", flags); - lcdDrawNumber(lcdNextPos, y, gpsData.numSat, flags); + dc->drawNumber(lcdNextPos, y, gpsData.numSat, flags); } } #endif @@ -570,26 +569,26 @@ void drawSourceCustomValue(BitmapBuffer * dc, coord_t x, coord_t y, source_t sou } #endif else if (source < MIXSRC_FIRST_CH) { - lcdDrawNumber(x, y, calcRESXto100(value), flags); + dc->drawNumber(x, y, calcRESXto100(value), flags); } else if (source <= MIXSRC_LAST_CH) { #if defined(PPM_UNIT_PERCENT_PREC1) - lcdDrawNumber(x, y, calcRESXto1000(value), flags|PREC1); + dc->drawNumber(x, y, calcRESXto1000(value), flags|PREC1); #else - lcdDrawNumber(x, y, calcRESXto100(value), flags); + dc->drawNumber(x, y, calcRESXto100(value), flags); #endif } else { - lcdDrawNumber(x, y, value, flags); + dc->drawNumber(x, y, value, flags); } } void drawValueWithUnit(BitmapBuffer * dc, coord_t x, coord_t y, int val, uint8_t unit, LcdFlags flags) { // convertUnit(val, unit); - drawNumber(dc, x, y, val, flags & (~NO_UNIT)); + dc->drawNumber(x, y, val, flags & (~NO_UNIT)); if (!(flags & NO_UNIT) && unit != UNIT_RAW) { - drawTextAtIndex(dc, lcdNextPos/*+1*/, y, STR_VTELEMUNIT, unit, 0); + dc->drawTextAtIndex(lcdNextPos/*+1*/, y, STR_VTELEMUNIT, unit, 0); } } diff --git a/radio/src/gui/colorlcd/draw_functions.h b/radio/src/gui/colorlcd/draw_functions.h index 8fe6c4972..0066b6287 100644 --- a/radio/src/gui/colorlcd/draw_functions.h +++ b/radio/src/gui/colorlcd/draw_functions.h @@ -21,7 +21,8 @@ #ifndef _DRAW_FUNCTIONS_H_ #define _DRAW_FUNCTIONS_H_ -#include "opentx.h" +#include "dataconstants.h" +#include "telemetry/telemetry_sensors.h" #include #define OPTION_MENU_NO_FOOTER 0x01 @@ -39,16 +40,33 @@ #define OPTION_SLIDER_NUMBER_BUTTON 0x100 #define OPTION_SLIDER_SQUARE_BUTTON 0x200 -void drawStatusText(const char * text); -void drawColumnHeader(const char * const * headers, const char * const * descriptions, uint8_t index); -void drawCheckBox(coord_t x, coord_t y, uint8_t value, LcdFlags attr); -void drawVerticalScrollbar(coord_t x, coord_t y, coord_t h, uint16_t offset, uint16_t count, uint8_t visible); -void drawProgressScreen(const char * title, const char * message, int num, int den); -void drawTrimSquare(coord_t x, coord_t y); -void drawHorizontalTrimPosition(coord_t x, coord_t y, int16_t dir); -void drawVerticalTrimPosition(coord_t x, coord_t y, int16_t dir); -void drawVerticalSlider(coord_t x, coord_t y, int len, int val, int min, int max, uint8_t steps, uint32_t options); -void drawHorizontalSlider(coord_t x, coord_t y, int len, int val, int min, int max, uint8_t steps, uint32_t options); +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); +//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); +void drawFatalErrorScreen(const char * message); +void runFatalErrorScreen(const char * message); +void drawPower(coord_t x, coord_t y, int8_t dBm, LcdFlags att); +//void lcdDrawMMM(coord_t x, coord_t y, LcdFlags flags); +void drawSource(BitmapBuffer * dc, coord_t x, coord_t y, mixsrc_t idx, LcdFlags flags=0); +void drawSwitch(BitmapBuffer * dc, coord_t x, coord_t y, int32_t idx, LcdFlags flags=0); +void drawTrimMode(BitmapBuffer * dc, coord_t x, coord_t y, uint8_t phase, uint8_t idx, LcdFlags flags = 0); + +#if defined(FLIGHT_MODES) +void drawFlightMode(coord_t x, coord_t y, int8_t idx, LcdFlags att); +#endif + +void drawStatusText(BitmapBuffer * dc, const char * text); +void drawColumnHeader(BitmapBuffer * dc, const char * const * headers, const char * const * descriptions, uint8_t index); +void drawCheckBox(BitmapBuffer * dc, coord_t x, coord_t y, uint8_t value, LcdFlags attr); +void drawVerticalScrollbar(BitmapBuffer * dc, coord_t x, coord_t y, coord_t h, uint16_t offset, uint16_t count, uint8_t visible); +void drawProgressScreen(BitmapBuffer * dc, const char * title, const char * message, int num, int den); +void drawTrimSquare(BitmapBuffer * dc, coord_t x, coord_t y); +void drawHorizontalTrimPosition(BitmapBuffer * dc, coord_t x, coord_t y, int16_t dir); +void drawVerticalTrimPosition(BitmapBuffer * dc, coord_t x, coord_t y, int16_t dir); +void drawVerticalSlider(BitmapBuffer * dc, coord_t x, coord_t y, int len, int val, int min, int max, uint8_t steps, uint32_t options); +void drawHorizontalSlider(BitmapBuffer * dc, coord_t x, coord_t y, int len, int val, int min, int max, uint8_t steps, uint32_t options); void drawSlider(coord_t x, coord_t y, int len, int val, int min, int max, uint8_t steps, uint32_t options); void drawValueOrGVar(BitmapBuffer * dc, coord_t x, coord_t y, gvar_t gvar, LcdFlags flags = 0); void drawGVarValue(BitmapBuffer * dc, coord_t x, coord_t y, uint8_t gvar, gvar_t value, LcdFlags flags = 0); diff --git a/radio/src/gui/colorlcd/fonts.cpp b/radio/src/gui/colorlcd/fonts.cpp index ac5315d65..e5be0aa2c 100644 --- a/radio/src/gui/colorlcd/fonts.cpp +++ b/radio/src/gui/colorlcd/fonts.cpp @@ -19,7 +19,6 @@ */ #include "opentx.h" -#include "rle.h" const uint16_t font_tinsize_specs[] = { #include "font_9.specs" @@ -30,6 +29,14 @@ const unsigned char font_tinsize[] = { }; #if defined(HARDWARE_TOUCH) +const uint16_t font_stdsize_en_specs[] = { +#include "font_17en.specs" +}; + +const unsigned char font_stdsize_en[] = { +#include "font_17en.lbm" +}; + const uint16_t font_smlsize_specs[] = { #include "font_15.specs" }; @@ -54,6 +61,14 @@ const unsigned char font_stdsizebold[] = { #include "font_bold17.lbm" }; #else +const uint16_t font_stdsize_en_specs[] = { +#include "font_16en.specs" +}; + +const unsigned char font_stdsize_en[] = { +#include "font_16en.lbm" +}; + const uint16_t font_smlsize_specs[] = { #include "font_13.specs" }; @@ -103,7 +118,10 @@ const unsigned char font_xxlsize[] = { #include "font_64.lbm" }; -#if !defined(BOOT) +#if defined(BOOT) +const uint16_t * const fontspecsTable[1] = { font_stdsize_en_specs }; +const uint8_t * fontsTable[1] = { font_stdsize_en }; +#else const uint16_t * const fontspecsTable[16] = { font_stdsize_specs, font_tinsize_specs, font_smlsize_specs, font_midsize_specs, font_dblsize_specs, font_xxlsize_specs, font_stdsize_specs, font_stdsize_specs, font_stdsizebold_specs, font_tinsize_specs, font_smlsize_specs, font_midsize_specs, font_dblsize_specs, font_xxlsize_specs, font_stdsize_specs, font_stdsize_specs @@ -113,9 +131,6 @@ const uint8_t * fontsTable[16] = { font_stdsize, font_tinsize, font_smlsize, font_midsize, font_dblsize, font_xxlsize, font_stdsize, font_stdsize, font_stdsizebold, font_tinsize, font_smlsize, font_midsize, font_dblsize, font_xxlsize, font_stdsize, font_stdsize }; -#else -const uint16_t * const fontspecsTable[1] = { font_stdsize_specs }; -const uint8_t * fontsTable[1] = { font_stdsize }; #endif uint8_t * decompressFont(const uint8_t * font) @@ -127,9 +142,9 @@ uint8_t * decompressFont(const uint8_t * font) uint8_t* dec_buf = (uint8_t*)malloc(font_size + 4); // copy width / height - memcpy(dec_buf,font,4); + memcpy(dec_buf, font,4); - rle_decode_8bit(dec_buf+4, font_size, font+4); + RLEBitmap::decode(dec_buf+4, font_size, font+4); return dec_buf; } @@ -139,12 +154,14 @@ void loadFonts() if (fonts_loaded) return; #if !defined(BOOT) - int i=0; - for (; i<9; i++) + int i = 0; + for (; i < 9; i++) { fontsTable[i] = decompressFont(fontsTable[i]); - - for (; i<16; i++) - fontsTable[i] = fontsTable[i-9]; + } + for (; i < 16; i++) { + // the next fonts don't exist in BOLD today + fontsTable[i] = fontsTable[i - 9]; + } #else fontsTable[0] = decompressFont(fontsTable[0]); #endif diff --git a/radio/src/gui/colorlcd/fullscreen_dialog.cpp b/radio/src/gui/colorlcd/fullscreen_dialog.cpp new file mode 100644 index 000000000..9bbdbc42d --- /dev/null +++ b/radio/src/gui/colorlcd/fullscreen_dialog.cpp @@ -0,0 +1,156 @@ +/* + * 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 "fullscreen_dialog.h" +#include "mainwindow.h" +#include "opentx.h" + +FullScreenDialog::FullScreenDialog(uint8_t type, std::string title, std::string message, std::string action, std::function confirmHandler): + Dialog(title, {0, 0, LCD_W, LCD_H}), + type(type), + message(std::move(message)), + action(std::move(action)), + confirmHandler(confirmHandler) +{ +#if defined(HARDWARE_TOUCH) + new FabIconButton(this, LCD_W - 50, ALERT_BUTTON_TOP, ICON_NEXT, + [=]() -> uint8_t { + if (confirmHandler) + confirmHandler(); + return 0; + }); +#endif +} + +FullScreenDialog::~FullScreenDialog() +{ +} + +void FullScreenDialog::paint(BitmapBuffer * dc) +{ + static_cast(theme)->drawBackground(dc); + + dc->drawFilledRect(0, ALERT_FRAME_TOP, LCD_W, ALERT_FRAME_HEIGHT, SOLID, TEXT_INVERTED_COLOR | OPACITY(8)); + + if (type == WARNING_TYPE_ALERT || type == WARNING_TYPE_ASTERISK) + dc->drawBitmap(ALERT_BITMAP_LEFT, ALERT_BITMAP_TOP, static_cast(theme)->asterisk); + else if (type == WARNING_TYPE_INFO) + dc->drawBitmap(ALERT_BITMAP_LEFT, ALERT_BITMAP_TOP, static_cast(theme)->busy); + else // confirmation + dc->drawBitmap(ALERT_BITMAP_LEFT, ALERT_BITMAP_TOP, static_cast(theme)->question); + + if (type == WARNING_TYPE_ALERT) { +#if defined(TRANSLATIONS_FR) || defined(TRANSLATIONS_IT) || defined(TRANSLATIONS_CZ) + dc->drawText(ALERT_TITLE_LEFT, ALERT_TITLE_TOP, STR_WARNING, ALARM_COLOR|DBLSIZE); + dc->drawText(ALERT_TITLE_LEFT, ALERT_TITLE_TOP + ALERT_TITLE_LINE_HEIGHT, title, ALARM_COLOR|DBLSIZE); +#else + dc->drawText(ALERT_TITLE_LEFT, ALERT_TITLE_TOP, title.c_str(), ALARM_COLOR|DBLSIZE); + dc->drawText(ALERT_TITLE_LEFT, ALERT_TITLE_TOP + ALERT_TITLE_LINE_HEIGHT, STR_WARNING, ALARM_COLOR|DBLSIZE); +#endif + } + else if (!title.empty()) { + dc->drawText(ALERT_TITLE_LEFT, ALERT_TITLE_TOP, title.c_str(), ALARM_COLOR|DBLSIZE); + } + + if (!message.empty()) { + dc->drawText(ALERT_MESSAGE_LEFT, ALERT_MESSAGE_TOP, message.c_str(), BOLD); + } + + if (!action.empty()) { + dc->drawText(LCD_W / 2, ALERT_ACTION_TOP, action.c_str(), CENTERED | BOLD); + } +} + +#if defined(HARDWARE_KEYS) +void FullScreenDialog::onKeyEvent(event_t event) +{ + TRACE_WINDOWS("%s received event 0x%X", getWindowDebugString().c_str(), event); + + if (event == EVT_KEY_BREAK(KEY_ENTER)) { + deleteLater(); + if (confirmHandler) + confirmHandler(); + } + else if (event == EVT_KEY_BREAK(KEY_EXIT)) { + deleteLater(); + } +} +#endif + +#if defined(HARDWARE_TOUCH) +bool FullScreenDialog::onTouchEnd(coord_t x, coord_t y) +{ + Window::onTouchEnd(x, y); + deleteLater(); + return true; +} +#endif + +void FullScreenDialog::checkEvents() +{ + Window::checkEvents(); + if (closeCondition && closeCondition()) { + deleteLater(); + } +} + +void FullScreenDialog::deleteLater() +{ + if (previousFocus) { + previousFocus->setFocus(); + } + if (running) { + running = false; + } + else { + Window::deleteLater(); + } +} + +void FullScreenDialog::runForever() +{ + running = true; + + while (running) { + auto check = pwrCheck(); + if (check == e_power_off) { + boardOff(); + } + else if (check == e_power_press) { + RTOS_WAIT_MS(20); + continue; + } + + checkBacklight(); + wdt_reset(); + + RTOS_WAIT_MS(20); + mainWindow.run(false); + } + + Window::deleteLater(); +} + +void raiseAlert(const char * title, const char * msg, const char * action, uint8_t sound) +{ + AUDIO_ERROR_MESSAGE(sound); + auto dialog = new FullScreenDialog(WARNING_TYPE_ALERT, title ? title : "", msg ? msg : "", action ? action : ""); + dialog->runForever(); +} diff --git a/radio/src/gui/libopenui/dialog.h b/radio/src/gui/colorlcd/fullscreen_dialog.h similarity index 65% rename from radio/src/gui/libopenui/dialog.h rename to radio/src/gui/colorlcd/fullscreen_dialog.h index d8745aa54..127176c45 100644 --- a/radio/src/gui/libopenui/dialog.h +++ b/radio/src/gui/colorlcd/fullscreen_dialog.h @@ -18,10 +18,10 @@ * GNU General Public License for more details. */ -#ifndef _DIALOG_H_ -#define _DIALOG_H_ +#ifndef _FULLSCREEN_DIALOG_H_ +#define _FULLSCREEN_DIALOG_H_ -#include "button.h" +#include "dialog.h" enum DialogType { WARNING_TYPE_ALERT, @@ -31,43 +31,9 @@ enum DialogType { WARNING_TYPE_INFO }; -class Dialog: public Window { - public: - Dialog(std::string title, const rect_t rect); - - void paint(BitmapBuffer * dc) override; - - void deleteLater(); - - protected: - std::string title; - Window * previousFocus; -}; - -class MessageDialog: public Dialog { - public: - MessageDialog(const char * title, const char * message); - -#if defined(HARDWARE_KEYS) - void onKeyEvent(event_t event) override; -#endif -}; - -class ConfirmDialog: public Dialog { - public: - ConfirmDialog(const char * title, const char * message, std::function confirmHandler); - -#if defined(HARDWARE_KEYS) - void onKeyEvent(event_t event) override; -#endif - - protected: - std::function confirmHandler; -}; - class FullScreenDialog : public Dialog { public: - FullScreenDialog(uint8_t type, std::string title, std::string message="", std::function confirmHandler=nullptr); + FullScreenDialog(uint8_t type, std::string title, std::string message = "", std::string action = "", std::function confirmHandler = nullptr); ~FullScreenDialog() override; @@ -108,14 +74,10 @@ class FullScreenDialog : public Dialog { protected: uint8_t type; std::string message; + std::string action; bool running = false; std::function closeCondition; std::function confirmHandler; }; -inline void POPUP_INFORMATION(const char * str) -{ - new MessageDialog("Message", str); -} - -#endif // _CONFIRMATION_H_ +#endif // _FULLSCREEN_DIALOG_H_ diff --git a/radio/src/gui/libopenui/getset_helpers.h b/radio/src/gui/colorlcd/getset_helpers.h similarity index 100% rename from radio/src/gui/libopenui/getset_helpers.h rename to radio/src/gui/colorlcd/getset_helpers.h diff --git a/radio/src/gui/libopenui/keyboard_curve.cpp b/radio/src/gui/colorlcd/keyboard_curve.cpp similarity index 100% rename from radio/src/gui/libopenui/keyboard_curve.cpp rename to radio/src/gui/colorlcd/keyboard_curve.cpp diff --git a/radio/src/gui/libopenui/keyboard_curve.h b/radio/src/gui/colorlcd/keyboard_curve.h similarity index 100% rename from radio/src/gui/libopenui/keyboard_curve.h rename to radio/src/gui/colorlcd/keyboard_curve.h diff --git a/radio/src/gui/colorlcd/layout.cpp b/radio/src/gui/colorlcd/layout.cpp index fff5cf6a6..aa9935569 100644 --- a/radio/src/gui/colorlcd/layout.cpp +++ b/radio/src/gui/colorlcd/layout.cpp @@ -28,7 +28,7 @@ std::list & getRegisteredLayouts() void registerLayout(const LayoutFactory * factory) { - TRACE("register layout %s", factory->getName()); + TRACE("register layout %s", factory->getId()); getRegisteredLayouts().push_back(factory); } @@ -36,7 +36,7 @@ const LayoutFactory * getLayoutFactory(const char * name) { std::list::const_iterator it = getRegisteredLayouts().cbegin(); for (; it != getRegisteredLayouts().cend(); ++it) { - if (!strcmp(name, (*it)->getName())) { + if (!strcmp(name, (*it)->getId())) { return (*it); } } @@ -54,7 +54,7 @@ Layout * loadLayout(const char * name, Layout::PersistentData * persistentData) void loadCustomScreens() { - for (unsigned int i=0; icreate(&g_model.screenData[0].layoutData); } - if (topbar) { - topbar->load(); - } +// if (topbar) { +// topbar->load(); +// } } diff --git a/radio/src/gui/colorlcd/layout.h b/radio/src/gui/colorlcd/layout.h index bd5d562aa..0c7239107 100644 --- a/radio/src/gui/colorlcd/layout.h +++ b/radio/src/gui/colorlcd/layout.h @@ -59,18 +59,21 @@ void registerLayout(const LayoutFactory * factory); class LayoutFactory { public: - LayoutFactory(const char * name): + LayoutFactory(const char * id, const char * name): + id(id), name(name) { registerLayout(this); } + const char * getId() const { return id; } const char * getName() const { return name; } - virtual void drawThumb(uint16_t x, uint16_t y, uint32_t flags) const = 0; + virtual void drawThumb(BitmapBuffer * dc, uint16_t x, uint16_t y, LcdFlags flags) const = 0; virtual const ZoneOption * getOptions() const = 0; virtual Layout * create(Layout::PersistentData * persistentData) const = 0; virtual Layout * load(Layout::PersistentData * persistentData) const = 0; protected: + const char * id; const char * name; }; @@ -78,24 +81,24 @@ template class BaseLayoutFactory: public LayoutFactory { public: - BaseLayoutFactory(const char * name, const uint8_t * bitmap, const ZoneOption * options): - LayoutFactory(name), + BaseLayoutFactory(const char * id, const char * name, const uint8_t * bitmap, const ZoneOption * options): + LayoutFactory(id, name), bitmap(bitmap), options(options) { } - virtual void drawThumb(uint16_t x, uint16_t y, uint32_t flags) const + void drawThumb(BitmapBuffer * dc, uint16_t x, uint16_t y, uint32_t flags) const override { - lcdDrawBitmapPattern(x, y, bitmap, flags); + dc->drawBitmapPattern(x, y, bitmap, flags); } - virtual const ZoneOption * getOptions() const + const ZoneOption * getOptions() const override { return options; } - virtual Layout * create(Layout::PersistentData * persistentData) const + Layout * create(Layout::PersistentData * persistentData) const override { Layout * layout = new T(this, persistentData); if (layout) { @@ -104,7 +107,7 @@ class BaseLayoutFactory: public LayoutFactory return layout; } - virtual Layout * load(Layout::PersistentData * persistentData) const + Layout * load(Layout::PersistentData * persistentData) const override { Layout * layout = new T(this, persistentData); if (layout) { diff --git a/radio/src/gui/colorlcd/layouts/layout1x1.cpp b/radio/src/gui/colorlcd/layouts/layout1x1.cpp index 0feeb1436..5c10d7fec 100644 --- a/radio/src/gui/colorlcd/layouts/layout1x1.cpp +++ b/radio/src/gui/colorlcd/layouts/layout1x1.cpp @@ -38,19 +38,19 @@ class Layout1x1: public Layout { } - virtual void create() + void create() override { Layout::create(); persistentData->options[0].boolValue = true; persistentData->options[1].boolValue = true; } - virtual unsigned int getZonesCount() const + unsigned int getZonesCount() const override { return 1; } - virtual Zone getZone(unsigned int index) const + Zone getZone(unsigned int index) const override { Zone zone = { 10, 10, LCD_W - 2*10, LCD_H - 2*10 }; if (persistentData->options[0].boolValue) { @@ -65,28 +65,28 @@ class Layout1x1: public Layout return zone; } - virtual void refresh(); +// virtual void refresh(); }; -void Layout1x1::refresh() -{ - theme->drawBackground(); +//void Layout1x1::refresh() +//{ +// theme->drawBackground(); +// +// if (persistentData->options[0].boolValue) { +// drawTopBar(); +// } +// +// if (persistentData->options[1].boolValue) { +// // Sliders + Trims + Flight mode +// lcdDrawSizedText(LCD_W / 2 - getTextWidth(g_model.flightModeData[mixerCurrentFlightMode].name, sizeof(g_model.flightModeData[mixerCurrentFlightMode].name), ZCHAR | SMLSIZE) / 2, +// 232, +// g_model.flightModeData[mixerCurrentFlightMode].name, +// sizeof(g_model.flightModeData[mixerCurrentFlightMode].name), ZCHAR | SMLSIZE); +// drawMainPots(); +// drawTrims(mixerCurrentFlightMode); +// } +// +// Layout::refresh(); +//} - if (persistentData->options[0].boolValue) { - drawTopBar(); - } - - if (persistentData->options[1].boolValue) { - // Sliders + Trims + Flight mode - lcdDrawSizedText(LCD_W / 2 - getTextWidth(g_model.flightModeData[mixerCurrentFlightMode].name, sizeof(g_model.flightModeData[mixerCurrentFlightMode].name), ZCHAR | SMLSIZE) / 2, - 232, - g_model.flightModeData[mixerCurrentFlightMode].name, - sizeof(g_model.flightModeData[mixerCurrentFlightMode].name), ZCHAR | SMLSIZE); - drawMainPots(); - drawTrims(mixerCurrentFlightMode); - } - - Layout::refresh(); -} - -BaseLayoutFactory layout1x1("Layout1x1", LBM_LAYOUT_1x1, OPTIONS_LAYOUT_1x1); +BaseLayoutFactory layout1x1("Layout1x1", "Fullscreen", LBM_LAYOUT_1x1, OPTIONS_LAYOUT_1x1); diff --git a/radio/src/gui/colorlcd/layouts/layout2+1.cpp b/radio/src/gui/colorlcd/layouts/layout2+1.cpp index 39abb1a9e..7b58c631d 100644 --- a/radio/src/gui/colorlcd/layouts/layout2+1.cpp +++ b/radio/src/gui/colorlcd/layouts/layout2+1.cpp @@ -29,7 +29,7 @@ const ZoneOption OPTIONS_LAYOUT_2P1[] = { { "Flight mode", ZoneOption::Bool }, { "Sliders", ZoneOption::Bool }, { "Trims", ZoneOption::Bool }, - { NULL, ZoneOption::Bool } + { nullptr, ZoneOption::Bool } }; const Zone ZONES_LAYOUT_2P1[3] = { @@ -46,7 +46,7 @@ class Layout2P1: public Layout { } - virtual void create() + void create() override { Layout::create(); persistentData->options[0].boolValue = true; @@ -55,49 +55,49 @@ class Layout2P1: public Layout persistentData->options[3].boolValue = true; } - virtual unsigned int getZonesCount() const + unsigned int getZonesCount() const override { return DIM(ZONES_LAYOUT_2P1); } - virtual Zone getZone(unsigned int index) const + Zone getZone(unsigned int index) const override { return ZONES_LAYOUT_2P1[index]; } - virtual void refresh(); +// virtual void refresh(); }; -void Layout2P1::refresh() -{ - theme->drawBackground(); +//void Layout2P1::refresh() +//{ +// theme->drawBackground(); +// +// if (persistentData->options[0].boolValue) { +// drawTopBar(); +// } +// +// if (persistentData->options[1].boolValue) { +// // Flight mode +// lcdDrawSizedText(LCD_W / 2 - getTextWidth(g_model.flightModeData[mixerCurrentFlightMode].name, +// sizeof(g_model.flightModeData[mixerCurrentFlightMode].name), +// ZCHAR | SMLSIZE) / 2, +// 232, +// g_model.flightModeData[mixerCurrentFlightMode].name, +// sizeof(g_model.flightModeData[mixerCurrentFlightMode].name), ZCHAR | SMLSIZE); +// } +// +// if (persistentData->options[2].boolValue) { +// // Pots and rear sliders positions +// drawMainPots(); +// } +// +// if (persistentData->options[3].boolValue) { +// // Trims +// drawTrims(mixerCurrentFlightMode); +// } +// +// Layout::refresh(); +//} - if (persistentData->options[0].boolValue) { - drawTopBar(); - } - - if (persistentData->options[1].boolValue) { - // Flight mode - lcdDrawSizedText(LCD_W / 2 - getTextWidth(g_model.flightModeData[mixerCurrentFlightMode].name, - sizeof(g_model.flightModeData[mixerCurrentFlightMode].name), - ZCHAR | SMLSIZE) / 2, - 232, - g_model.flightModeData[mixerCurrentFlightMode].name, - sizeof(g_model.flightModeData[mixerCurrentFlightMode].name), ZCHAR | SMLSIZE); - } - - if (persistentData->options[2].boolValue) { - // Pots and rear sliders positions - drawMainPots(); - } - - if (persistentData->options[3].boolValue) { - // Trims - drawTrims(mixerCurrentFlightMode); - } - - Layout::refresh(); -} - -BaseLayoutFactory layout2P1("Layout2P1", LBM_LAYOUT_2P1, OPTIONS_LAYOUT_2P1); +BaseLayoutFactory layout2P1("Layout2P1", "2 + 1", LBM_LAYOUT_2P1, OPTIONS_LAYOUT_2P1); const LayoutFactory * defaultLayout = &layout2P1; diff --git a/radio/src/gui/colorlcd/layouts/layout2x1.cpp b/radio/src/gui/colorlcd/layouts/layout2x1.cpp index a96fc7006..73252c25e 100644 --- a/radio/src/gui/colorlcd/layouts/layout2x1.cpp +++ b/radio/src/gui/colorlcd/layouts/layout2x1.cpp @@ -37,18 +37,18 @@ class Layout2x1: public Layout { } - virtual void create() + void create() override { Layout::create(); persistentData->options[0].boolValue = true; } - virtual unsigned int getZonesCount() const + unsigned int getZonesCount() const override { return 4; } - virtual Zone getZone(unsigned int index) const + Zone getZone(unsigned int index) const override { Zone zone; zone.w = (LCD_W-3*10) / 2; @@ -64,18 +64,18 @@ class Layout2x1: public Layout return zone; } - virtual void refresh(); +// virtual void refresh(); }; -void Layout2x1::refresh() -{ - theme->drawBackground(); +//void Layout2x1::refresh() +//{ +// theme->drawBackground(); +// +// if (persistentData->options[0].boolValue) { +// drawTopBar(); +// } +// +// Layout::refresh(); +//} - if (persistentData->options[0].boolValue) { - drawTopBar(); - } - - Layout::refresh(); -} - -BaseLayoutFactory Layout2x1("Layout2x1", LBM_LAYOUT_2x1, OPTIONS_LAYOUT_2x1); +BaseLayoutFactory Layout2x1("Layout2x1", "2 x 1", LBM_LAYOUT_2x1, OPTIONS_LAYOUT_2x1); diff --git a/radio/src/gui/colorlcd/layouts/layout2x2.cpp b/radio/src/gui/colorlcd/layouts/layout2x2.cpp index 0efa2df62..54036176d 100644 --- a/radio/src/gui/colorlcd/layouts/layout2x2.cpp +++ b/radio/src/gui/colorlcd/layouts/layout2x2.cpp @@ -26,7 +26,7 @@ const uint8_t LBM_LAYOUT_2x2[] = { const ZoneOption OPTIONS_LAYOUT_2x2[] = { { "Top bar", ZoneOption::Bool }, - { NULL, ZoneOption::Bool } + { nullptr, ZoneOption::Bool } }; class Layout2x2: public Layout @@ -37,18 +37,18 @@ class Layout2x2: public Layout { } - virtual void create() + void create() override { Layout::create(); persistentData->options[0].boolValue = true; } - virtual unsigned int getZonesCount() const + unsigned int getZonesCount() const override { return 4; } - virtual Zone getZone(unsigned int index) const + Zone getZone(unsigned int index) const override { Zone zone; zone.w = (LCD_W-3*10) / 2; @@ -67,18 +67,18 @@ class Layout2x2: public Layout return zone; } - virtual void refresh(); +// virtual void refresh(); }; -void Layout2x2::refresh() -{ - theme->drawBackground(); +//void Layout2x2::refresh() +//{ +// theme->drawBackground(); +// +// if (persistentData->options[0].boolValue) { +// drawTopBar(); +// } +// +// Layout::refresh(); +//} - if (persistentData->options[0].boolValue) { - drawTopBar(); - } - - Layout::refresh(); -} - -BaseLayoutFactory layout2x2("Layout2x2", LBM_LAYOUT_2x2, OPTIONS_LAYOUT_2x2); +BaseLayoutFactory layout2x2("Layout2x2", "2 x 2", LBM_LAYOUT_2x2, OPTIONS_LAYOUT_2x2); diff --git a/radio/src/gui/colorlcd/layouts/layout2x4.cpp b/radio/src/gui/colorlcd/layouts/layout2x4.cpp index b6e009acc..b5ee359cc 100644 --- a/radio/src/gui/colorlcd/layouts/layout2x4.cpp +++ b/radio/src/gui/colorlcd/layouts/layout2x4.cpp @@ -44,7 +44,7 @@ class Layout2x4: public Layout { } - virtual void create() + void create() override { Layout::create(); persistentData->options[0].boolValue = true; @@ -57,12 +57,12 @@ class Layout2x4: public Layout persistentData->options[7].unsignedValue = RGB(77, 112, 203); } - virtual unsigned int getZonesCount() const + unsigned int getZonesCount() const override { return 8; } - virtual Zone getZone(unsigned int index) const + Zone getZone(unsigned int index) const override { Zone zone; zone.x = (index >= 4) ? 260 : 60; @@ -72,48 +72,48 @@ class Layout2x4: public Layout return zone; } - virtual void refresh(); +// virtual void refresh(); }; -void Layout2x4::refresh() -{ - theme->drawBackground(); +//void Layout2x4::refresh() +//{ +// theme->drawBackground(); +// +// if (persistentData->options[0].boolValue) { +// drawTopBar(); +// } +// +// if (persistentData->options[1].boolValue) { +// // Flight mode +// lcdDrawSizedText(LCD_W / 2 - getTextWidth(g_model.flightModeData[mixerCurrentFlightMode].name, +// sizeof(g_model.flightModeData[mixerCurrentFlightMode].name), +// ZCHAR | SMLSIZE) / 2, +// 232, +// g_model.flightModeData[mixerCurrentFlightMode].name, +// sizeof(g_model.flightModeData[mixerCurrentFlightMode].name), ZCHAR | SMLSIZE); +// } +// +// if (persistentData->options[2].boolValue) { +// // Pots and rear sliders positions +// drawMainPots(); +// } +// +// if (persistentData->options[3].boolValue) { +// // Trims +// drawTrims(mixerCurrentFlightMode); +// } +// +// if (persistentData->options[4].boolValue) { +// lcdSetColor(persistentData->options[5].unsignedValue); +// lcdDrawSolidFilledRect(50, 50, 180, 170, CUSTOM_COLOR); +// } +// +// if (persistentData->options[6].boolValue) { +// lcdSetColor(persistentData->options[7].unsignedValue); +// lcdDrawSolidFilledRect(250, 50, 180, 170, CUSTOM_COLOR); +// } +// +// Layout::refresh(); +//} - if (persistentData->options[0].boolValue) { - drawTopBar(); - } - - if (persistentData->options[1].boolValue) { - // Flight mode - lcdDrawSizedText(LCD_W / 2 - getTextWidth(g_model.flightModeData[mixerCurrentFlightMode].name, - sizeof(g_model.flightModeData[mixerCurrentFlightMode].name), - ZCHAR | SMLSIZE) / 2, - 232, - g_model.flightModeData[mixerCurrentFlightMode].name, - sizeof(g_model.flightModeData[mixerCurrentFlightMode].name), ZCHAR | SMLSIZE); - } - - if (persistentData->options[2].boolValue) { - // Pots and rear sliders positions - drawMainPots(); - } - - if (persistentData->options[3].boolValue) { - // Trims - drawTrims(mixerCurrentFlightMode); - } - - if (persistentData->options[4].boolValue) { - lcdSetColor(persistentData->options[5].unsignedValue); - lcdDrawSolidFilledRect(50, 50, 180, 170, CUSTOM_COLOR); - } - - if (persistentData->options[6].boolValue) { - lcdSetColor(persistentData->options[7].unsignedValue); - lcdDrawSolidFilledRect(250, 50, 180, 170, CUSTOM_COLOR); - } - - Layout::refresh(); -} - -BaseLayoutFactory layout2x4("Layout2x4", LBM_LAYOUT_2x4, OPTIONS_LAYOUT_2x4); +BaseLayoutFactory layout2x4("Layout2x4", "2 x 4", LBM_LAYOUT_2x4, OPTIONS_LAYOUT_2x4); diff --git a/radio/src/gui/colorlcd/layouts/mask_layout1x1.png b/radio/src/gui/colorlcd/layouts/mask_layout1x1.png index ba76e857b48e73f463c9299cb7c2a2d91e748ab2..c575226dddc475378ed39f2c7f767b5f76039ee6 100644 GIT binary patch delta 1826 zcmV+-2i^Fo0nrYS7k?QD1^@s6oR$`P000F2dQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)I zW&i+q+O1bxmg^`C{MRaG2}S}0%i*PSW(TwUDX`Od-gLKb?8J_-EQ%^oI5htI*XSQ? z9C#xiG{qd_hRtW6x!_0I_H94A&9CFyM2>szzMWh?ZZMi=(0>sa#}Qx99+CV;^1dkw8~G26Y+Y`h~y>I%Pc;u`9j-zjf^yd)ms@pjyXJ zD{U1Q*)bS5=UsQjnH%feTmwYUgB54y#Bxuv1oS>P%u(;K4 zp8cV-gr2)YBs(O7#`iltHk{q>5}D01cW#mi>D?|c&wu&?jH%o_A_{^yJ2(xCUq}0C zd)%h50tLgOIbnbWBCZrQxNB|6(pk1Z2=&`OU)(~$t4cij4gli>3T)9yaM5kbtj>YQ z1bqsSvv{shzy%82fs#@D5#l7Ced8H*D;7?(H^W{aM35*7X)s+NmiNI&%(sLRDikF6 z5JC(ZQh&&yM2S9z7^BANQ$LyX4dv5(3oSNnspVEWcj>SI>alB2J@+!)Kq(DB!iYmh8hI2$ zt(lm&VA0f)Wh-B*9je}|_Nd%@)!d;PFQI0fUVl|Xv+5;Ad1gW@_BKtc1= zY)j62p2|(lw#-5T-vY`o#p!M;1_k|a9L#-bcUA6>x)Ip@t#15EIhxXaLOGh!-6;30 z+Y8ltS#~Q+pg9Y{DI8KT{fwI>RZs(ITn1#;4kRO&UN{%2A?8*?6X7!YHc~}W?}oyq zYJV3o8lYcO5gTge@vYWj12&hy(xUa;)P^r^!0~L_c*%mu*g^nOEDzd%*`{X~xLQDz z%)qja-9|>z)cbt;5-`!*3^;DXg*!;ux(_h_J>mP{)&9OiIuc&;oyJG^0MFy2`yS8Z zqjv=U1|Pla@i+MB=K{aSM?V+%Jw7^HfPatp=xhN#;-k+@5LoSJCWvHx_OE#5HqUY-}nJN z8^Sq1AVUr0RVNNF_lD)hM&ud`2pl~YAi)bee|tqg4}E_{pGm{u=;rc0SAQ*)h9$ik z=E4Zp#OB{h%m>sDRQn&xJ2S>O+TRTT00D(*LqkwWLqi~Na&Km7Y-Iodc$|HaJxIeq z9K~N##jlEp9aJ1LR9!5Hia2T&iclfc3avVrT>1q~8j=(jN5Qq=;KyRs!Nplu2UkH5 z`~Y!rby9SZ691PJTEu#A+<%XE_a1le0HIP~n$TyLGZCLB4ibym238uFU1 zE6ZG`IfN({u>=Vs6qJxh0XD+4>ZDkR(|)9hf6(4ax{BQZ2Zz8&ma^BIyt}=zw|~#n z`uhQ7S#qILzMVmlAuwj+2^kS9JEods;s5{uL`g(JR9M69&jAepFbKe~@!Smf_ktX* zgJ*Tn046ipuDc0fW@ddRA~<}+j2Sa#%$PA_#*7&=X3Ur|V`iNTP*q=K9ul+&ucV=n Q(*OVf07*qoM6N<$f|#Ra_5c6? delta 110 zcmcb}w~}#!IF~#J8v_G_*ZHsMlXtTjL_A>P;*ewSzWwtNP}I!R#W5t}@Z0l-f(!~g v3>(@1&pX}K7WYVD`K)O>bd{8`g3pzg)EI52)m%vgn!w=c>gTe~DWM4f#PuTk diff --git a/radio/src/gui/colorlcd/layouts/mask_layout2+1.png b/radio/src/gui/colorlcd/layouts/mask_layout2+1.png index 6924d82c6424e632f25674de1f75b7b48f5edad1..9c9c7a1fe47490860854dfc99b6f07f2a483c94d 100644 GIT binary patch delta 2645 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 Nm7cDCF6*2UngFKxKmh;% diff --git a/radio/src/gui/colorlcd/layouts/mask_layout2x1.png b/radio/src/gui/colorlcd/layouts/mask_layout2x1.png index eac35c92a28faa85a6d606523f86bc7c58eb99f6..9bb74c18e30c31b068fcee9b9a84cfee2f8ca719 100644 GIT binary patch delta 2041 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 Xk4q0N9!&io00000NkvXXu0mjfRyEm} delta 119 zcmbO&u!(VkIF~#J8v_G_*ZHsMlWW)w5+5+}b4khVZ`)7>6t(wsaSVw#{Pz4tUIqi6 z!v@R$|9`WtR>9lRR-s^$$?2_U&*bD6eF`+d4*bPs3s`I?G>A_G8pYu0>gTe~DWM4f Db+IP$ diff --git a/radio/src/gui/colorlcd/layouts/mask_layout2x2.png b/radio/src/gui/colorlcd/layouts/mask_layout2x2.png index af1f383989e53f26071898ae30d5ca1ff6af907e..bb958745b875a27e10f2cffda84ad63fa6b049d0 100644 GIT binary patch delta 2956 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 E0G-D-00000 diff --git a/radio/src/gui/colorlcd/layouts/mask_layout2x4.png b/radio/src/gui/colorlcd/layouts/mask_layout2x4.png index 25cecf3cc51d0b49e7e563a9c8033a69f6fcb02b..9203dcd64d7559f59f0d9af18adc752af44aebad 100644 GIT binary patch delta 3993 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 diff --git a/radio/src/gui/colorlcd/lcd.cpp b/radio/src/gui/colorlcd/lcd.cpp index 4395ffa8b..fd72e916f 100644 --- a/radio/src/gui/colorlcd/lcd.cpp +++ b/radio/src/gui/colorlcd/lcd.cpp @@ -18,17 +18,13 @@ * GNU General Public License for more details. */ -#include -#include #include "opentx.h" #include "strhelpers.h" #if defined(SIMU) -display_t displayBuf[DISPLAY_BUFFER_SIZE]; +pixel_t displayBuf[DISPLAY_BUFFER_SIZE]; #endif -uint16_t lcdColorTable[LCD_COLOR_COUNT]; - coord_t lcdNextPos; uint8_t getMappedChar(uint8_t c) @@ -73,15 +69,19 @@ uint8_t getMappedChar(uint8_t c) result = 207 + c - 0x80; } #endif + else if (c == 0x21) // ! + result = 0; else if (c < 0xC0) - result = c - 0x20; + result = c - 0x20 - 2; else - result = c - 0xC0 + 96; - // TRACE("getMappedChar '%c' (%d) = %d", c, c, result); + result = c - 0xC0 + 96 - 2; + +// TRACE("getMappedChar '%c' (%x) = %d", c, c, result); + return result; } -int getFontPatternWidth(const uint16_t * spec, uint8_t index) +int getFontPatternWidth(const uint16_t * spec, int index) { return spec[index + 2] - spec[index + 1]; } @@ -91,23 +91,6 @@ int getCharWidth(uint8_t c, const uint16_t * spec) return getFontPatternWidth(spec, getMappedChar(c)); } -void lcdPutFontPattern(coord_t x, coord_t y, const uint8_t * font, const uint16_t * spec, int index, LcdFlags flags) -{ - coord_t offset = spec[index + 1]; - coord_t width = spec[index + 2] - offset; - if (width > 0) - lcdDrawBitmapPattern(x, y, font, flags, offset, width); - lcdNextPos = x + width; -} - -void lcdDrawChar(coord_t x, coord_t y, char c, LcdFlags flags) -{ - uint32_t fontindex = FONTINDEX(flags); - const unsigned char * font = fontsTable[fontindex]; - const uint16_t * fontspecs = fontspecsTable[fontindex]; - lcdPutFontPattern(x, y, font, fontspecs, getMappedChar(c), flags); -} - uint8_t getFontHeight(LcdFlags flags) { uint32_t fontindex = FONTINDEX(flags); @@ -119,68 +102,32 @@ int getTextWidth(const char * s, int len, LcdFlags flags) const uint16_t * specs = fontspecsTable[FONTINDEX(flags)]; int result = 0; - for (int i=0; len==0 || i= 0xFE) { + s++; + c = uint8_t(*s) + ((c & 0x01) << 8) - 1; + if (c >= 0x101) + c -= 1; + c += 187; + result += getFontPatternWidth(specs, c); + } + else if (c >= 0x20) { + result += getCharWidth(c, specs); + } + ++s; } + return result; } -void lcdDrawTextAtIndex(coord_t x, coord_t y, const char * s, uint8_t idx, LcdFlags flags) -{ - uint8_t length; - length = *(s++); - lcdDrawSizedText(x, y, s+length*idx, length, flags & ~ZCHAR); -} - -void lcdDrawNumber(coord_t x, coord_t y, int32_t val, LcdFlags flags, uint8_t len, const char * prefix, const char * suffix) -{ - char str[48+1]; // max=16 for the prefix, 16 chars for the number, 16 chars for the suffix - char *s = str+32; - *s = '\0'; - int idx = 0; - int mode = MODE(flags); - bool neg = false; - if (val < 0) { - val = -val; - neg = true; - } - do { - *--s = '0' + (val % 10); - ++idx; - val /= 10; - if (mode!=0 && idx==mode) { - mode = 0; - *--s = '.'; - if (val==0) - *--s = '0'; - } - } while (val!=0 || mode>0 || (mode==MODE(LEADING0) && idx= 480 #define LCD_COLS 40 @@ -48,8 +49,6 @@ #define PREC2 0x30 #define MODE(flags) ((((int8_t)(flags) & 0x30) - 0x10) >> 4) -#define ZCHAR 0x10 - /* rect, square flags */ #define ROUND 0x04 @@ -67,7 +66,7 @@ #define DISPLAY_BUFFER_SIZE (DISPLAY_PIXELS_COUNT) #if defined(SIMU) -extern display_t displayBuf[DISPLAY_BUFFER_SIZE]; +extern pixel_t displayBuf[DISPLAY_BUFFER_SIZE]; #else #define displayBuf lcd->getData() #endif @@ -78,136 +77,23 @@ extern display_t displayBuf[DISPLAY_BUFFER_SIZE]; extern coord_t lcdNextPos; void lcdNextLayer(); - -void lcdDrawChar(coord_t x, coord_t y, char c, LcdFlags flags=0); - -void lcdDrawTextAtIndex(coord_t x, coord_t y, const char * s, uint8_t idx, LcdFlags flags=0); - inline void lcdClear() { lcd->clear(); } -inline void lcdDrawText(coord_t x, coord_t y, const char * s, LcdFlags attr=0) -{ - lcd->drawText(x, y, s, attr); -} - -inline void lcdDrawCenteredText(coord_t y, const char * s, LcdFlags attr=0) -{ - lcd->drawText(LCD_W/2, y, s, attr | CENTERED); -} - -inline void lcdDrawSizedText(coord_t x, coord_t y, const char * s, uint8_t len, LcdFlags attr=0) -{ - lcd->drawSizedText(x, y, s, len, attr); -} - -void lcdDrawNumber(coord_t x, coord_t y, int32_t val, LcdFlags flags=0, uint8_t len=0, const char * prefix=NULL, const char * suffix=NULL); - -#define SOLID 0xff -#define DOTTED 0x55 -#define STASHED 0x33 - #if defined(PCBX10) && !defined(SIMU) #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)] #endif -void lcdDrawAlphaPixel(display_t * p, uint8_t opacity, uint16_t color); -void lcdDrawPoint(coord_t x, coord_t y, LcdFlags att=0); - -inline void lcdDrawSolidHorizontalLine(coord_t x, coord_t y, coord_t w, LcdFlags att) -{ - lcd->drawSolidHorizontalLine(x, y, w, att); -} - -inline void lcdDrawSolidVerticalLine(coord_t x, coord_t y, coord_t h, LcdFlags att) -{ - lcd->drawSolidVerticalLine(x, y, h, att); -} - -inline void lcdDrawSolidFilledRect(coord_t x, coord_t y, coord_t w, coord_t h, LcdFlags flags) -{ - lcd->drawSolidFilledRect(x, y, w, h, flags); -} - -inline void lcdDrawHorizontalLine(coord_t x, coord_t y, coord_t w, uint8_t pat, LcdFlags att=0) -{ - lcd->drawHorizontalLine(x, y, w, pat, att); -} - -inline void lcdDrawVerticalLine(coord_t x, coord_t y, coord_t h, uint8_t pat, LcdFlags att=0) -{ - lcd->drawVerticalLine(x, y, h, pat, att); -} - -void lcdDrawLine(coord_t x1, coord_t y1, coord_t x2, coord_t y2, uint8_t pat=SOLID, LcdFlags att=0); - -inline void lcdDrawAlphaPixel(coord_t x, coord_t y, uint8_t opacity, uint16_t color) -{ - display_t * p = PIXEL_PTR(x, y); - lcdDrawAlphaPixel(p, opacity, color); -} - inline void lcdSetColor(uint16_t color) { lcdColorTable[CUSTOM_COLOR_INDEX] = color; } -inline void lcdDrawSolidRect(coord_t x, coord_t y, coord_t w, coord_t h, uint8_t thickness=1, LcdFlags att=0) -{ - lcd->drawSolidFilledRect(x, y, thickness, h, att); - lcd->drawSolidFilledRect(x+w-thickness, y, thickness, h, att); - lcd->drawSolidFilledRect(x, y, w, thickness, att); - lcd->drawSolidFilledRect(x, y+h-thickness, w, thickness, att); -} - -inline void lcdDrawFilledRect(coord_t x, coord_t y, coord_t w, coord_t h, uint8_t pat, LcdFlags att=0) -{ - lcd->drawFilledRect(x, y, w, h, pat, att); -} - void lcdDrawBlackOverlay(); -inline void lcdDrawRect(coord_t x, coord_t y, coord_t w, coord_t h, uint8_t thickness=1, uint8_t pat=SOLID, LcdFlags att=0) -{ - lcd->drawRect(x, y, w, h, thickness, pat, att); -} - -void lcdDrawCircle(int x0, int y0, int radius); -void lcdDrawPie(int x0, int y0, int radius, int angle1=0, int angle2=360); -void lcdDrawBitmapPie(int x0, int y0, const uint16_t * img, int startAngle, int endAngle); - -inline void lcdDrawBitmapPatternPie(coord_t x0, coord_t y0, const uint8_t * bmp, LcdFlags flags=0, int startAngle=0, int endAngle=360) -{ - lcd->drawBitmapPatternPie(x0, y0, bmp, flags, startAngle, endAngle); -} - -inline void lcdDrawSquare(coord_t x, coord_t y, coord_t w, LcdFlags att=0) -{ - lcdDrawSolidRect(x, y, w, w, att); -} - -inline int getBitmapWidth(const uint8_t * bmp) -{ - return *((const uint16_t *)bmp); -} - -inline int getBitmapHeight(const uint8_t * bmp) -{ - return *(((const uint16_t *)bmp)+1); -} - -uint8_t getMappedChar(uint8_t c); -int getCharWidth(uint8_t c, const uint16_t * spec); -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) -{ - lcd->drawBitmapPattern(x, y, img, flags, offset, width); -} #if defined(BOOT) #define BLINK_ON_PHASE (0) diff --git a/radio/src/gui/libopenui/libopenui.h b/radio/src/gui/colorlcd/libopenui.h similarity index 90% rename from radio/src/gui/libopenui/libopenui.h rename to radio/src/gui/colorlcd/libopenui.h index 7251976a9..fcc7843c1 100644 --- a/radio/src/gui/libopenui/libopenui.h +++ b/radio/src/gui/colorlcd/libopenui.h @@ -22,6 +22,8 @@ #define _LIBOPENUI_H_ #include "libopenui_config.h" +#include "libopenui_file.h" +#include "font.h" #include "window.h" #include "mainwindow.h" #include "static.h" @@ -43,6 +45,10 @@ #include "page.h" #include "menu.h" #include "dialog.h" +#include "fullscreen_dialog.h" +#include "message_dialog.h" +#include "confirm_dialog.h" +#include "dialog.h" #include "gridlayout.h" #include "getset_helpers.h" #include "curveedit.h" diff --git a/radio/src/gui/libopenui/material-backup.cpp b/radio/src/gui/colorlcd/material-backup.cpp similarity index 100% rename from radio/src/gui/libopenui/material-backup.cpp rename to radio/src/gui/colorlcd/material-backup.cpp diff --git a/radio/src/gui/libopenui/progress.h b/radio/src/gui/colorlcd/menu_screen.cpp similarity index 60% rename from radio/src/gui/libopenui/progress.h rename to radio/src/gui/colorlcd/menu_screen.cpp index 1500e95ef..cf63db023 100644 --- a/radio/src/gui/libopenui/progress.h +++ b/radio/src/gui/colorlcd/menu_screen.cpp @@ -18,35 +18,27 @@ * GNU General Public License for more details. */ -#ifndef _PROGRESS_H_ -#define _PROGRESS_H_ +#include "opentx.h" +#include "menu_screen.h" +#include "screen_setup.h" -#include "window.h" +ScreenMenu::ScreenMenu(): + TabsGroup(ICON_THEME) +{ + updateTabs(); +} -class Progress : public Window { - public: - Progress(Window * parent, const rect_t & rect): - Window(parent, rect) - { +void ScreenMenu::updateTabs() +{ + removeAllTabs(); + + for (int index = 0; index < MAX_CUSTOM_SCREENS; index++) { + if (customScreens[index]) { + addTab(new ScreenSetupPage(this, index)); } - -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "Progress"; + else { + addTab(new ScreenAddPage(this, index)); + break; } -#endif - - void setValue(int value) - { - this->value = value; - invalidate(); - } - - void paint(BitmapBuffer * dc) override; - - protected: - int value; -}; - -#endif + } +} diff --git a/radio/src/gui/libopenui/progress.cpp b/radio/src/gui/colorlcd/menu_screen.h similarity index 74% rename from radio/src/gui/libopenui/progress.cpp rename to radio/src/gui/colorlcd/menu_screen.h index 8f9f5540d..81328acf0 100644 --- a/radio/src/gui/libopenui/progress.cpp +++ b/radio/src/gui/colorlcd/menu_screen.h @@ -18,10 +18,19 @@ * GNU General Public License for more details. */ -#include "progress.h" -#include "theme.h" +#ifndef _MENU_SCREEN_H_ +#define _MENU_SCREEN_H_ -void Progress::paint(BitmapBuffer * dc) -{ - theme->drawProgressBar(dc, 0, 0, width(), height(), value); -} +#include "tabsgroup.h" + +class ScreenMenu: public TabsGroup { + friend class ScreenSetupPage; + + public: + ScreenMenu(); + + protected: + void updateTabs(); +}; + +#endif // _MENU_SCREEN_H_ diff --git a/radio/src/gui/libopenui/libopenui_types.h b/radio/src/gui/colorlcd/message_dialog.cpp similarity index 57% rename from radio/src/gui/libopenui/libopenui_types.h rename to radio/src/gui/colorlcd/message_dialog.cpp index cc839fe52..685bf57cd 100644 --- a/radio/src/gui/libopenui/libopenui_types.h +++ b/radio/src/gui/colorlcd/message_dialog.cpp @@ -18,44 +18,22 @@ * GNU General Public License for more details. */ -#ifndef _LIBOPEUI_TYPES_H_ -#define _LIBOPEUI_TYPES_H_ +#include "message_dialog.h" +#include "static.h" -#include - -typedef int coord_t; - -struct point_t +MessageDialog::MessageDialog(const char * title, const char * message): + Dialog(title, {50, 73, LCD_W - 100, LCD_H - 146}) { - coord_t x; - coord_t y; -}; + new StaticText(this, {0, height() / 2, width(), PAGE_LINE_HEIGHT}, message, CENTERED); +} -struct rect_t +#if defined(HARDWARE_KEYS) +void MessageDialog::onKeyEvent(event_t event) { - coord_t x, y, w, h; + TRACE_WINDOWS("%s received event 0x%X", getWindowDebugString().c_str(), event); - constexpr coord_t left() const - { - return x; + if (event == EVT_KEY_BREAK(KEY_EXIT) || event == EVT_KEY_BREAK(KEY_ENTER)) { + deleteLater(); } - - constexpr coord_t right() const - { - return x + w; - } - - constexpr coord_t top() const - { - return y; - } - - constexpr coord_t bottom() const - { - return y + h; - } -}; - -typedef uint32_t LcdFlags; - -#endif // _LIBOPEUI_TYPES_H_ +} +#endif diff --git a/radio/src/gui/libopenui/libopenui_helpers.h b/radio/src/gui/colorlcd/message_dialog.h similarity index 65% rename from radio/src/gui/libopenui/libopenui_helpers.h rename to radio/src/gui/colorlcd/message_dialog.h index 2c72d2330..904bbfe48 100644 --- a/radio/src/gui/libopenui/libopenui_helpers.h +++ b/radio/src/gui/colorlcd/message_dialog.h @@ -18,25 +18,23 @@ * GNU General Public License for more details. */ -#ifndef _LIBOPEUI_HELPERS_H_ -#define _LIBOPEUI_HELPERS_H_ +#ifndef _MESSAGE_DIALOG_H_ +#define _MESSAGE_DIALOG_H_ -template -inline T min(T a, T b) -{ - return a < b ? a : b; -} +#include "dialog.h" -template -inline T max(T a, T b) -{ - return a > b ? a : b; -} - -template -inline T limit(T vmin, T x, T vmax) -{ - return min(max(vmin, x), vmax); -} +class MessageDialog: public Dialog { + public: + MessageDialog(const char * title, const char * message); +#if defined(HARDWARE_KEYS) + void onKeyEvent(event_t event) override; #endif +}; + +inline void POPUP_INFORMATION(const char * str) +{ + new MessageDialog("Message", str); +} + +#endif // _MESSAGE_DIALOG_H_ diff --git a/radio/src/gui/colorlcd/model_curves.cpp b/radio/src/gui/colorlcd/model_curves.cpp index 501f5648c..d2e2a472a 100644 --- a/radio/src/gui/colorlcd/model_curves.cpp +++ b/radio/src/gui/colorlcd/model_curves.cpp @@ -153,13 +153,13 @@ class CurveButton : public Button { void paint(BitmapBuffer * dc) override { // bounding rect - drawSolidRect(dc, 0, 0, rect.w, rect.h, 2, hasFocus() ? SCROLLBOX_COLOR : CURVE_AXIS_COLOR); + dc->drawSolidRect(0, 0, rect.w, rect.h, 2, hasFocus() ? SCROLLBOX_COLOR : CURVE_AXIS_COLOR); // curve characteristics if (isCurveFilled(index)) { CurveInfo &curve = g_model.curves[index]; - drawNumber(dc, 130, 5, 5 + curve.points, LEFT, 0, nullptr, STR_PTS); - drawTextAtIndex(dc, 130, 25, STR_CURVE_TYPES, curve.type); + dc->drawNumber(130, 5, 5 + curve.points, LEFT, 0, nullptr, STR_PTS); + dc->drawTextAtIndex(130, 25, STR_CURVE_TYPES, curve.type); if (curve.smooth) dc->drawText(130, 45, "Smooth"); } diff --git a/radio/src/gui/colorlcd/model_inputs.cpp b/radio/src/gui/colorlcd/model_inputs.cpp index d83b91014..b79d487d5 100644 --- a/radio/src/gui/colorlcd/model_inputs.cpp +++ b/radio/src/gui/colorlcd/model_inputs.cpp @@ -310,7 +310,7 @@ void CommonInputOrMixButton::paint(BitmapBuffer * dc) if (active) dc->drawSolidFilledRect(2, 2, rect.w - 4, rect.h - 4, WARNING_COLOR); paintBody(dc); - drawSolidRect(dc, 0, 0, rect.w, rect.h, 2, hasFocus() ? SCROLLBOX_COLOR : CURVE_AXIS_COLOR); + dc->drawSolidRect(0, 0, rect.w, rect.h, 2, hasFocus() ? SCROLLBOX_COLOR : CURVE_AXIS_COLOR); } class InputLineButton : public CommonInputOrMixButton { @@ -339,7 +339,7 @@ class InputLineButton : public CommonInputOrMixButton { if (line.name[0]) { dc->drawBitmap(146, 2 + FIELD_PADDING_TOP, mixerSetupLabelBitmap); - dc->drawSizedText(166, FIELD_PADDING_TOP, line.name, sizeof(line.name), ZCHAR); + dc->drawSizedText(166, FIELD_PADDING_TOP, line.name, sizeof(line.name)); } // second line ... diff --git a/radio/src/gui/colorlcd/model_logical_switches.cpp b/radio/src/gui/colorlcd/model_logical_switches.cpp index a1161b0d5..afbbf4893 100644 --- a/radio/src/gui/colorlcd/model_logical_switches.cpp +++ b/radio/src/gui/colorlcd/model_logical_switches.cpp @@ -24,19 +24,19 @@ #define SET_DIRTY() storageDirty(EE_MODEL) -void putsEdgeDelayParam(coord_t x, coord_t y, LogicalSwitchData * ls) -{ - lcdDrawChar(x, y, '['); - lcdDrawNumber(lcdNextPos+2, y, lswTimerValue(ls->v2), LEFT|PREC1); - lcdDrawChar(lcdNextPos, y, ':'); - if (ls->v3 < 0) - lcdDrawText(lcdNextPos+3, y, "<<"); - else if (ls->v3 == 0) - lcdDrawText(lcdNextPos+3, y, "--"); - else - lcdDrawNumber(lcdNextPos+3, y, lswTimerValue(ls->v2+ls->v3), LEFT|PREC1); - lcdDrawChar(lcdNextPos, y, ']'); -} +//void putsEdgeDelayParam(coord_t x, coord_t y, LogicalSwitchData * ls) +//{ +// lcdDrawChar(x, y, '['); +// lcdDrawNumber(lcdNextPos+2, y, lswTimerValue(ls->v2), LEFT|PREC1); +// lcdDrawChar(lcdNextPos, y, ':'); +// if (ls->v3 < 0) +// lcdDrawText(lcdNextPos+3, y, "<<"); +// else if (ls->v3 == 0) +// lcdDrawText(lcdNextPos+3, y, "--"); +// else +// lcdDrawNumber(lcdNextPos+3, y, lswTimerValue(ls->v2+ls->v3), LEFT|PREC1); +// lcdDrawChar(lcdNextPos, y, ']'); +//} class LogicalSwitchEditWindow: public Page { public: @@ -102,7 +102,7 @@ class LogicalSwitchEditWindow: public Page { edit2->invalidate(); }); edit1->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - drawNumber(dc, 2, 2, lswTimerValue(value), flags | PREC1); + dc->drawNumber(2, 2, lswTimerValue(value), flags | PREC1); }); edit2->setDisplayHandler([=](BitmapBuffer * dc, LcdFlags flags, int32_t value) { if (value < 0) @@ -110,7 +110,7 @@ class LogicalSwitchEditWindow: public Page { else if (value == 0) dc->drawText(2, 2, "--", flags); else - drawNumber(dc, 2, 2, lswTimerValue(cs->v2 + value), flags | PREC1); + dc->drawNumber(2, 2, lswTimerValue(cs->v2 + value), flags | PREC1); }); grid.nextLine(); } @@ -127,14 +127,14 @@ class LogicalSwitchEditWindow: public Page { new StaticText(logicalSwitchOneWindow, grid.getLabelSlot(), STR_V1); auto timer = new NumberEdit(logicalSwitchOneWindow, grid.getFieldSlot(), -128, 122, GET_SET_DEFAULT(cs->v1)); timer->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - drawNumber(dc, 2, 2, lswTimerValue(value), flags | PREC1); + dc->drawNumber(2, 2, lswTimerValue(value), flags | PREC1); }); grid.nextLine(); new StaticText(logicalSwitchOneWindow, grid.getLabelSlot(), STR_V2); timer = new NumberEdit(logicalSwitchOneWindow, grid.getFieldSlot(), -128, 122, GET_SET_DEFAULT(cs->v2)); timer->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - drawNumber(dc, 2, 2, lswTimerValue(value), flags | PREC1); + dc->drawNumber(2, 2, lswTimerValue(value), flags | PREC1); }); grid.nextLine(); } @@ -265,10 +265,10 @@ class LogicalSwitchButton : public Button { dc->drawSolidFilledRect(2, 2, rect.w-4, rect.h-4, WARNING_COLOR); // The bounding rect - drawSolidRect(dc, 0, 0, rect.w, rect.h, 2, hasFocus() ? SCROLLBOX_COLOR : CURVE_AXIS_COLOR); + dc->drawSolidRect(0, 0, rect.w, rect.h, 2, hasFocus() ? SCROLLBOX_COLOR : CURVE_AXIS_COLOR); // CSW func - lcdDrawTextAtIndex(col1, line1, STR_VCSWFUNC, ls->func); + dc->drawTextAtIndex(col1, line1, STR_VCSWFUNC, ls->func); // CSW params if (lsFamily == LS_FAMILY_BOOL || lsFamily == LS_FAMILY_STICKY) { @@ -277,15 +277,15 @@ class LogicalSwitchButton : public Button { } else if (lsFamily == LS_FAMILY_EDGE) { drawSwitch(dc, col1, line2, ls->v1); - putsEdgeDelayParam(col2, line2, ls); + // TODO putsEdgeDelayParam(col2, line2, ls); } else if (lsFamily == LS_FAMILY_COMP) { drawSource(dc, col2, line1, ls->v1, 0); drawSource(dc, col3, line1, ls->v2, 0); } else if (lsFamily == LS_FAMILY_TIMER) { - lcdDrawNumber(col2, line1, lswTimerValue(ls->v1), LEFT|PREC1); - lcdDrawNumber(col3, line1, lswTimerValue(ls->v2), LEFT|PREC1); + dc->drawNumber(col2, line1, lswTimerValue(ls->v1), LEFT|PREC1); + dc->drawNumber(col3, line1, lswTimerValue(ls->v2), LEFT|PREC1); } else { drawSource(dc, col2, line1, ls->v1, 0); @@ -297,12 +297,12 @@ class LogicalSwitchButton : public Button { // CSW duration if (ls->duration > 0) { - drawNumber(dc, col2, (lsFamily == LS_FAMILY_EDGE) ? line3 : line2, ls->duration, PREC1 | LEFT); + dc->drawNumber(col2, (lsFamily == LS_FAMILY_EDGE) ? line3 : line2, ls->duration, PREC1 | LEFT); } // CSW delay if (lsFamily != LS_FAMILY_EDGE && ls->delay > 0) { - drawNumber(dc, col3, (lsFamily == LS_FAMILY_EDGE) ? line3 : line2, ls->delay, PREC1 | LEFT); + dc->drawNumber(col3, (lsFamily == LS_FAMILY_EDGE) ? line3 : line2, ls->delay, PREC1 | LEFT); } } diff --git a/radio/src/gui/colorlcd/model_mixes.cpp b/radio/src/gui/colorlcd/model_mixes.cpp index 9c22c9e0a..481b6e3ae 100644 --- a/radio/src/gui/colorlcd/model_mixes.cpp +++ b/radio/src/gui/colorlcd/model_mixes.cpp @@ -252,7 +252,7 @@ class MixLineButton : public CommonInputOrMixButton { if (line.name[0]) { dc->drawBitmap(146, FIELD_PADDING_TOP, mixerSetupLabelBitmap); - dc->drawSizedText(166, FIELD_PADDING_TOP, line.name, sizeof(line.name), ZCHAR); + dc->drawSizedText(166, FIELD_PADDING_TOP, line.name, sizeof(line.name)); } // second line ... diff --git a/radio/src/gui/colorlcd/model_outputs.cpp b/radio/src/gui/colorlcd/model_outputs.cpp index bfb399747..554c37157 100644 --- a/radio/src/gui/colorlcd/model_outputs.cpp +++ b/radio/src/gui/colorlcd/model_outputs.cpp @@ -121,15 +121,15 @@ class OutputLineButton : public Button { void paint(BitmapBuffer * dc) override { // first line - drawNumber(dc, FIELD_PADDING_LEFT, FIELD_PADDING_TOP, output->min - 1000, PREC1); - drawNumber(dc, 68, FIELD_PADDING_TOP, output->max + 1000, PREC1); - drawNumber(dc, 132, FIELD_PADDING_TOP, output->offset, PREC1); - drawNumber(dc, 226, FIELD_PADDING_TOP, PPM_CENTER + output->ppmCenter, RIGHT); + dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, output->min - 1000, PREC1); + dc->drawNumber(68, FIELD_PADDING_TOP, output->max + 1000, PREC1); + dc->drawNumber(132, FIELD_PADDING_TOP, output->offset, PREC1); + dc->drawNumber(226, FIELD_PADDING_TOP, PPM_CENTER + output->ppmCenter, RIGHT); dc->drawText(228, FIELD_PADDING_TOP - 3, output->symetrical ? "=" : "\306"); // second line if (output->revert) { - drawTextAtIndex(dc, 4, PAGE_LINE_HEIGHT + FIELD_PADDING_TOP, STR_MMMINV, output->revert); + dc->drawTextAtIndex(4, PAGE_LINE_HEIGHT + FIELD_PADDING_TOP, STR_MMMINV, output->revert); } if (output->curve) { dc->drawBitmap(68, PAGE_LINE_HEIGHT + FIELD_PADDING_TOP, mixerSetupCurveBitmap); @@ -137,11 +137,11 @@ class OutputLineButton : public Button { } if (output->name[0]) { dc->drawBitmap(146, PAGE_LINE_HEIGHT + FIELD_PADDING_TOP, mixerSetupLabelBitmap); - dc->drawSizedText(166, PAGE_LINE_HEIGHT + FIELD_PADDING_TOP, output->name, sizeof(output->name), ZCHAR); + dc->drawSizedText(166, PAGE_LINE_HEIGHT + FIELD_PADDING_TOP, output->name, sizeof(output->name)); } // bounding rect - drawSolidRect(dc, 0, 0, rect.w, rect.h, 2, hasFocus() ? SCROLLBOX_COLOR : CURVE_AXIS_COLOR); + dc->drawSolidRect(0, 0, rect.w, rect.h, 2, hasFocus() ? SCROLLBOX_COLOR : CURVE_AXIS_COLOR); } protected: diff --git a/radio/src/gui/colorlcd/model_setup.cpp b/radio/src/gui/colorlcd/model_setup.cpp index 0166cee76..b4db7b4fa 100644 --- a/radio/src/gui/colorlcd/model_setup.cpp +++ b/radio/src/gui/colorlcd/model_setup.cpp @@ -46,7 +46,7 @@ class ChannelFailsafeBargraph: public Window { const int lim = (g_model.extendedLimits ? (512 * LIMIT_EXT_PERCENT / 100) : 512) * 2; coord_t x = 0; - lcdDrawRect(x, 0, width(), height()); + dc->drawRect(x, 0, width(), height()); const coord_t lenChannel = limit((uint8_t) 1, uint8_t((abs(channelValue) * width() / 2 + lim / 2) / lim), uint8_t(width() / 2)); const coord_t lenFailsafe = limit((uint8_t) 1, uint8_t((abs(failsafeValue) * width() / 2 + lim / 2) / lim), @@ -54,8 +54,8 @@ class ChannelFailsafeBargraph: public Window { x += width() / 2; const coord_t xChannel = (channelValue > 0) ? x : x + 1 - lenChannel; const coord_t xFailsafe = (failsafeValue > 0) ? x : x + 1 - lenFailsafe; - lcdDrawSolidFilledRect(xChannel, + 2, lenChannel, (height() / 2) - 3, TEXT_COLOR); - lcdDrawSolidFilledRect(xFailsafe, (height() / 2) + 1, lenFailsafe, (height() / 2) - 3, ALARM_COLOR); + dc->drawSolidFilledRect(xChannel, + 2, lenChannel, (height() / 2) - 3, TEXT_COLOR); + dc->drawSolidFilledRect(xFailsafe, (height() / 2) + 1, lenFailsafe, (height() / 2) - 3, ALARM_COLOR); } protected: @@ -130,7 +130,7 @@ class FailSafeFooter : public Window { class FailSafePage : public PageTab { public: - FailSafePage(uint8_t moduleIdx) : + explicit FailSafePage(uint8_t moduleIdx) : PageTab("FAILSAFE", ICON_STATS_ANALOGS), moduleIdx(moduleIdx) { @@ -155,7 +155,7 @@ FailSafeMenu::FailSafeMenu(uint8_t moduleIdx) : class RegisterDialog: public Dialog { public: - RegisterDialog(uint8_t moduleIdx): + explicit RegisterDialog(uint8_t moduleIdx): Dialog(STR_REGISTER, {50, 73, LCD_W - 100, LCD_H - 146}), moduleIdx(moduleIdx) { @@ -272,7 +272,7 @@ class BindRxChoiceMenu: public Menu { moduleIdx(moduleIdx), receiverIdx(receiverIdx) { - uint8_t receiversCount = min(reusableBuffer.moduleSetup.bindInformation.candidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE); + auto receiversCount = min(reusableBuffer.moduleSetup.bindInformation.candidateReceiversCount, PXX2_MAX_RECEIVERS_PER_MODULE); for (uint8_t i = 0; i < receiversCount; i++) { const char * receiverName = reusableBuffer.moduleSetup.bindInformation.candidateReceiversNames[i]; addLine(receiverName, [=]() { @@ -437,7 +437,7 @@ class ModuleWindow : public Window { update(); } - ~ModuleWindow() + ~ModuleWindow() override { deleteChildren(); } @@ -452,7 +452,7 @@ class ModuleWindow : public Window { TextButton * registerButton = nullptr; Choice * failSafeChoice = nullptr; - void addChannelRange(FormGridLayout &grid, uint8_t moduleIdx) + void addChannelRange(FormGridLayout &grid) { new StaticText(this, grid.getLabelSlot(true), STR_CHANNELRANGE); auto channelStart = new NumberEdit(this, grid.getFieldSlot(2, 0), 1, @@ -658,7 +658,7 @@ class ModuleWindow : public Window { // Channel Range if (g_model.moduleData[moduleIdx].type != MODULE_TYPE_NONE) { - addChannelRange(grid, moduleIdx); //TODO XJT2 should only set channel count of 8/16/24 + addChannelRange(grid); //TODO XJT2 should only set channel count of 8/16/24 grid.nextLine(); } @@ -787,13 +787,13 @@ class ModuleWindow : public Window { // R9M Power if (isModuleR9M_FCC(moduleIdx)) { - new StaticText(this, grid.getLabelSlot(true), STR_RFPOWER); + new StaticText(this, grid.getLabelSlot(true), STR_RF_POWER); new Choice(this, grid.getFieldSlot(), STR_R9M_FCC_POWER_VALUES, 0, R9M_FCC_POWER_MAX, GET_SET_DEFAULT(g_model.moduleData[moduleIdx].pxx.power)); } if (isModuleR9M_LBT(moduleIdx)) { - new StaticText(this, grid.getLabelSlot(true), STR_RFPOWER); + new StaticText(this, grid.getLabelSlot(true), STR_RF_POWER); new Choice(this, grid.getFieldSlot(), STR_R9M_LBT_POWER_VALUES, 0, R9M_LBT_POWER_MAX, GET_DEFAULT(min(g_model.moduleData[moduleIdx].pxx.power, R9M_LBT_POWER_MAX)), SET_DEFAULT(g_model.moduleData[moduleIdx].pxx.power)); @@ -820,7 +820,7 @@ class ModuleWindow : public Window { }; ModelSetupPage::ModelSetupPage() : - PageTab(STR_MENUSETUP, ICON_MODEL_SETUP) + PageTab(STR_MENU_MODEL_SETUP, ICON_MODEL_SETUP) { } @@ -994,7 +994,7 @@ void ModelSetupPage::build(FormWindow * window) grid.nextLine(); // Throttle warning - new StaticText(window, grid.getLabelSlot(true), STR_THROTTLEWARNING); + new StaticText(window, grid.getLabelSlot(true), STR_THROTTLE_WARNING); new CheckBox(window, grid.getFieldSlot(), GET_SET_INVERTED(g_model.disableThrottleWarning)); grid.nextLine(); diff --git a/radio/src/gui/colorlcd/model_telemetry.cpp b/radio/src/gui/colorlcd/model_telemetry.cpp index 7e72fc0bc..761798269 100644 --- a/radio/src/gui/colorlcd/model_telemetry.cpp +++ b/radio/src/gui/colorlcd/model_telemetry.cpp @@ -77,9 +77,9 @@ class SensorButton : public Button { dc->drawSolidFilledRect(2, 2, rect.w - 4, rect.h - 4, WARNING_COLOR); } - drawNumber(dc, 2, 1, number, LEFT, 0, NULL, ":"); + dc->drawNumber(2, 1, number, LEFT, 0, NULL, ":"); - lcdDrawSizedText(SENSOR_COL1, line1, g_model.telemetrySensors[index].label, TELEM_LABEL_LEN, ZCHAR); + dc->drawSizedText(SENSOR_COL1, line1, g_model.telemetrySensors[index].label, TELEM_LABEL_LEN); if (telemetryItem.isAvailable()) { LcdFlags color = telemetryItem.isOld() ? ALARM_COLOR : TEXT_COLOR; @@ -94,9 +94,9 @@ class SensorButton : public Button { drawHexNumber(dc, SENSOR_COL3, line1, sensor->id, LEFT); } else if (sensor->type == TELEM_TYPE_CUSTOM && !g_model.ignoreSensorIds) { - drawNumber(dc, SENSOR_COL3, line1, sensor->instance, LEFT); + dc->drawNumber(SENSOR_COL3, line1, sensor->instance, LEFT); } - drawSolidRect(dc, 0, 0, rect.w, rect.h, 2, hasFocus() ? SCROLLBOX_COLOR : CURVE_AXIS_COLOR); + dc->drawSolidRect(0, 0, rect.w, rect.h, 2, hasFocus() ? SCROLLBOX_COLOR : CURVE_AXIS_COLOR); } protected: @@ -409,7 +409,7 @@ void ModelTelemetryPage::build(FormWindow * window, int8_t focusSensorIndex) new StaticText(window, grid.getLabelSlot(true), STR_LOWALARM); auto edit = new NumberEdit(window, grid.getFieldSlot(), -30, 30, GET_SET_DEFAULT(g_model.rssiAlarms.warning)); edit->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - drawNumber(dc, FIELD_PADDING_LEFT, FIELD_PADDING_TOP, g_model.rssiAlarms.getWarningRssi(), flags); + dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, g_model.rssiAlarms.getWarningRssi(), flags); }); window->setFirstField(edit); grid.nextLine(); @@ -417,7 +417,7 @@ void ModelTelemetryPage::build(FormWindow * window, int8_t focusSensorIndex) new StaticText(window, grid.getLabelSlot(true), STR_CRITICALALARM); edit = new NumberEdit(window, grid.getFieldSlot(), -30, 30, GET_SET_DEFAULT(g_model.rssiAlarms.critical)); edit->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - drawNumber(dc, FIELD_PADDING_LEFT, FIELD_PADDING_TOP, g_model.rssiAlarms.getCriticalRssi(), flags); + dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, g_model.rssiAlarms.getCriticalRssi(), flags); }); grid.nextLine(); @@ -514,7 +514,7 @@ void ModelTelemetryPage::build(FormWindow * window, int8_t focusSensorIndex) // Delete all sensors button new TextButton(window, grid.getFieldSlot(), STR_DELETE_ALL_SENSORS, []() -> uint8_t { - new FullScreenDialog(WARNING_TYPE_CONFIRM, STR_CONFIRMDELETE, "", [=]() { + new FullScreenDialog(WARNING_TYPE_CONFIRM, STR_CONFIRMDELETE, "", "", [=]() { for (int i = 0; i < MAX_TELEMETRY_SENSORS; i++) { delTelemetryIndex(i); } diff --git a/radio/src/gui/colorlcd/radio_calibration.cpp b/radio/src/gui/colorlcd/radio_calibration.cpp index 842d90d80..b01d57b64 100644 --- a/radio/src/gui/colorlcd/radio_calibration.cpp +++ b/radio/src/gui/colorlcd/radio_calibration.cpp @@ -64,7 +64,7 @@ class MultiPosCalibrationWindow: public Window { virtual void paint(BitmapBuffer * dc) { - drawHorizontalSlider(5, 8, rect.w - 18, 1 + (potsPos[potIndex] & 0x0f), 1, XPOTS_MULTIPOS_COUNT+1, XPOTS_MULTIPOS_COUNT, OPTION_SLIDER_TICKS | OPTION_SLIDER_BIG_TICKS | OPTION_SLIDER_NUMBER_BUTTON); + drawHorizontalSlider(dc, 5, 8, rect.w - 18, 1 + (potsPos[potIndex] & 0x0f), 1, XPOTS_MULTIPOS_COUNT+1, XPOTS_MULTIPOS_COUNT, OPTION_SLIDER_TICKS | OPTION_SLIDER_BIG_TICKS | OPTION_SLIDER_NUMBER_BUTTON); } protected: @@ -89,9 +89,9 @@ class PotCalibrationWindow: public Window { virtual void paint(BitmapBuffer * dc) { if(rect.h > rect.w) - drawVerticalSlider(5, 8, rect.h - 18, calibratedAnalogs[potIndex], -RESX, RESX, 40, OPTION_SLIDER_TICKS | OPTION_SLIDER_BIG_TICKS | OPTION_SLIDER_SQUARE_BUTTON); + drawVerticalSlider(dc, 5, 8, rect.h - 18, calibratedAnalogs[potIndex], -RESX, RESX, 40, OPTION_SLIDER_TICKS | OPTION_SLIDER_BIG_TICKS | OPTION_SLIDER_SQUARE_BUTTON); else - drawHorizontalSlider(5, 8, rect.w - 18, calibratedAnalogs[potIndex], -RESX, RESX, 40, OPTION_SLIDER_TICKS | OPTION_SLIDER_BIG_TICKS | OPTION_SLIDER_SQUARE_BUTTON); + drawHorizontalSlider(dc, 5, 8, rect.w - 18, calibratedAnalogs[potIndex], -RESX, RESX, 40, OPTION_SLIDER_TICKS | OPTION_SLIDER_BIG_TICKS | OPTION_SLIDER_SQUARE_BUTTON); } protected: diff --git a/radio/src/gui/colorlcd/radio_hardware.cpp b/radio/src/gui/colorlcd/radio_hardware.cpp index 65bb69d29..694e07a83 100644 --- a/radio/src/gui/colorlcd/radio_hardware.cpp +++ b/radio/src/gui/colorlcd/radio_hardware.cpp @@ -152,7 +152,7 @@ void RadioHardwarePage::build(FormWindow * window) new StaticText(window, grid.getLabelSlot(), STR_BATT_CALIB); auto batCal = new NumberEdit(window, grid.getFieldSlot(), -127, 127, GET_SET_DEFAULT(g_eeGeneral.txVoltageCalibration)); batCal->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - drawNumber(dc, 2, 0, getBatteryVoltage(), flags | PREC2, 0, nullptr, "V"); + dc->drawNumber(2, 0, getBatteryVoltage(), flags | PREC2, 0, nullptr, "V"); }); batCal->setWindowFlags(REFRESH_ALWAYS); grid.nextLine(); @@ -160,7 +160,7 @@ void RadioHardwarePage::build(FormWindow * window) // Factory reset new TextButton(window, grid.getFieldSlot(), STR_FACTORYRESET, [=]() -> int8_t { - new FullScreenDialog(WARNING_TYPE_CONFIRM, STR_CONFIRMRESET, STR_POPUPS_ENTER_EXIT, [=]() { + new FullScreenDialog(WARNING_TYPE_CONFIRM, STR_CONFIRMRESET, STR_POPUPS_ENTER_EXIT, "", [=]() { storageEraseAll(false); NVIC_SystemReset(); return 0; diff --git a/radio/src/gui/colorlcd/radio_setup.cpp b/radio/src/gui/colorlcd/radio_setup.cpp index bb6181e55..227ef1c3e 100644 --- a/radio/src/gui/colorlcd/radio_setup.cpp +++ b/radio/src/gui/colorlcd/radio_setup.cpp @@ -88,7 +88,7 @@ class DateTimeWindow : public Window { SET_LOAD_DATETIME(&t); }); month->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - drawNumber(dc, FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, flags | LEADING0, 2); + dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, flags | LEADING0, 2); }); /* TODO dynamic max instead of 31 ... @@ -110,7 +110,7 @@ class DateTimeWindow : public Window { SET_LOAD_DATETIME(&t); }); day->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - drawNumber(dc, FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, flags | LEADING0, 2); + dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, flags | LEADING0, 2); }); grid.nextLine(); @@ -130,7 +130,7 @@ class DateTimeWindow : public Window { SET_LOAD_DATETIME(&t); }); hour->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - drawNumber(dc, FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, flags | LEADING0, 2); + dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, flags | LEADING0, 2); }); auto minutes = new NumberEdit(this, grid.getFieldSlot(3, 1), 0, 59, @@ -146,7 +146,7 @@ class DateTimeWindow : public Window { SET_LOAD_DATETIME(&t); }); minutes->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - drawNumber(dc, FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, flags | LEADING0, 2); + dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, flags | LEADING0, 2); }); auto seconds = new NumberEdit(this, grid.getFieldSlot(3, 2), 0, 59, @@ -162,7 +162,7 @@ class DateTimeWindow : public Window { SET_LOAD_DATETIME(&t); }); seconds->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - drawNumber(dc, FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, flags | LEADING0, 2); + dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, flags | LEADING0, 2); }); grid.nextLine(); getParent()->moveWindowsTop(top(), adjustHeight()); @@ -170,7 +170,7 @@ class DateTimeWindow : public Window { }; RadioSetupPage::RadioSetupPage(): - PageTab(STR_MENURADIOSETUP, ICON_RADIO_SETUP) + PageTab(STR_RADIO_SETUP, ICON_RADIO_SETUP) { } @@ -213,7 +213,7 @@ void RadioSetupPage::build(FormWindow * window) grid.nextLine(); // Main volume - new StaticText(window, grid.getLabelSlot(true), STR_SPEAKER_VOLUME); + new StaticText(window, grid.getLabelSlot(true), STR_VOLUME); new Slider(window, grid.getFieldSlot(), -VOLUME_LEVEL_DEF, VOLUME_LEVEL_MAX-VOLUME_LEVEL_DEF, GET_SET_DEFAULT(g_eeGeneral.speakerVolume)); grid.nextLine(); @@ -238,7 +238,7 @@ void RadioSetupPage::build(FormWindow * window) grid.nextLine(); // Beeps pitch - new StaticText(window, grid.getLabelSlot(true), STR_SPKRPITCH); + new StaticText(window, grid.getLabelSlot(true), STR_BEEP_PITCH); auto edit = new NumberEdit(window, grid.getFieldSlot(), 0, 300, GET_DEFAULT(15 * g_eeGeneral.speakerPitch), [=](int32_t newValue) { @@ -255,7 +255,7 @@ void RadioSetupPage::build(FormWindow * window) grid.nextLine(); // Vario volume - new StaticText(window, grid.getLabelSlot(true), TR_SPEAKER_VOLUME); + new StaticText(window, grid.getLabelSlot(true), TR_VOLUME); new Slider(window, grid.getFieldSlot(), -2, +2, GET_SET_DEFAULT(g_eeGeneral.varioVolume)); grid.nextLine(); @@ -285,7 +285,7 @@ void RadioSetupPage::build(FormWindow * window) grid.nextLine(); // Haptic strength - new StaticText(window, grid.getLabelSlot(true), STR_HAPTICSTRENGTH); + new StaticText(window, grid.getLabelSlot(true), STR_STRENGTH); new Slider(window, grid.getFieldSlot(), -2, +2, GET_SET_DEFAULT(g_eeGeneral.hapticStrength)); grid.nextLine(); } @@ -308,7 +308,7 @@ void RadioSetupPage::build(FormWindow * window) grid.nextLine(); // RSSI shutdown alarm - new StaticText(window, grid.getLabelSlot(true), STR_RSSISHUTDOWNALARM); + new StaticText(window, grid.getLabelSlot(true), STR_RSSI_SHUTDOWN_ALARM); new CheckBox(window, grid.getFieldSlot(), GET_SET_INVERTED(g_eeGeneral.disableRssiPoweroffAlarm)); grid.nextLine(); @@ -375,7 +375,7 @@ void RadioSetupPage::build(FormWindow * window) grid.nextLine(); // GPS format - new StaticText(window, grid.getLabelSlot(true), STR_GPSCOORD); + new StaticText(window, grid.getLabelSlot(true), STR_GPS_COORDS_FORMAT); new Choice(window, grid.getFieldSlot(), STR_GPSFORMAT, 0, 1, GET_SET_DEFAULT(g_eeGeneral.gpsFormat)); grid.nextLine(); } @@ -388,12 +388,12 @@ void RadioSetupPage::build(FormWindow * window) #endif // Country code - new StaticText(window, grid.getLabelSlot(), STR_COUNTRYCODE); - new Choice(window, grid.getFieldSlot(), STR_COUNTRYCODES, 0, 2, GET_SET_DEFAULT(g_eeGeneral.countryCode)); + new StaticText(window, grid.getLabelSlot(), STR_COUNTRY_CODE); + new Choice(window, grid.getFieldSlot(), STR_COUNTRY_CODES, 0, 2, GET_SET_DEFAULT(g_eeGeneral.countryCode)); grid.nextLine(); // Audio language - new StaticText(window, grid.getLabelSlot(), STR_VOICELANG); + new StaticText(window, grid.getLabelSlot(), STR_VOICE_LANGUAGE); auto choice = new Choice(window, grid.getFieldSlot(), nullptr, 0, DIM(languagePacks) - 2, GET_VALUE(currentLanguagePackIdx), [](uint8_t newValue) { currentLanguagePackIdx = newValue; @@ -406,7 +406,7 @@ void RadioSetupPage::build(FormWindow * window) grid.nextLine(); // Imperial units - new StaticText(window, grid.getLabelSlot(), STR_UNITSSYSTEM); + new StaticText(window, grid.getLabelSlot(), STR_UNITS_SYSTEM); new Choice(window, grid.getFieldSlot(), STR_VUNITSSYSTEM, 0, 1, GET_SET_DEFAULT(g_eeGeneral.imperial)); grid.nextLine(); diff --git a/radio/src/gui/colorlcd/radio_spectrum_analyser.cpp b/radio/src/gui/colorlcd/radio_spectrum_analyser.cpp index b3c8e71a5..2656767e6 100644 --- a/radio/src/gui/colorlcd/radio_spectrum_analyser.cpp +++ b/radio/src/gui/colorlcd/radio_spectrum_analyser.cpp @@ -50,7 +50,7 @@ class SpectrumWindow : public Window } coord_t y = max(FH, SPECTRUM_HEIGHT - peak_y - FH); - drawNumber(dc, min(100, peak_x), y, ((reusableBuffer.spectrumAnalyser.freq - reusableBuffer.spectrumAnalyser.span / 2) + peak_x * (reusableBuffer.spectrumAnalyser.span / 128)) / 1000000, TINSIZE); + dc->drawNumber(min(100, peak_x), y, ((reusableBuffer.spectrumAnalyser.freq - reusableBuffer.spectrumAnalyser.span / 2) + peak_x * (reusableBuffer.spectrumAnalyser.span / 128)) / 1000000, TINSIZE); dc->drawText(lcdNextPos, y, "M", TINSIZE); } diff --git a/radio/src/gui/colorlcd/radio_trainer.cpp b/radio/src/gui/colorlcd/radio_trainer.cpp index 20258fb6d..3d2a12f20 100644 --- a/radio/src/gui/colorlcd/radio_trainer.cpp +++ b/radio/src/gui/colorlcd/radio_trainer.cpp @@ -59,7 +59,7 @@ void RadioTrainerPage::build(FormWindow * window) new StaticText(window, grid.getLabelSlot(), STR_MULTIPLIER); auto multiplier = new NumberEdit(window, grid.getFieldSlot(3, 0), -10, 40, GET_SET_DEFAULT(g_eeGeneral.PPM_Multiplier)); multiplier->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - drawNumber(dc, FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value+10, flags | PREC1, 0); + dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value+10, flags | PREC1, 0); }); grid.nextLine(); grid.nextLine(); diff --git a/radio/src/gui/colorlcd/rle.cpp b/radio/src/gui/colorlcd/rle.cpp deleted file mode 100644 index e4be583a5..000000000 --- a/radio/src/gui/colorlcd/rle.cpp +++ /dev/null @@ -1,38 +0,0 @@ -#include "rle.h" -#include "debug.h" - -#include - -int rle_decode_8bit(unsigned char* dest, unsigned int dest_size, const unsigned char* src) -{ - //unsigned char count = 0; - unsigned char prev_byte = 0; - bool prev_byte_valid = false; - - const unsigned char* dest_end = dest + dest_size; - unsigned char* d = dest; - - while(d < dest_end) { - - *d++ = *src; - if (prev_byte_valid && (*src == prev_byte)) { - - src++; - - if (d + *src > dest + dest_size) { - TRACE("rle_decode_8bit: destination overflow!\n"); - return -1; - } - - memset(d, prev_byte, *src); - d += *src++; - prev_byte_valid = false; - } - else { - prev_byte = *src++; - prev_byte_valid = true; - } - } - - return d - dest; -} diff --git a/radio/src/gui/colorlcd/rle.h b/radio/src/gui/colorlcd/rle.h deleted file mode 100644 index 4781216f0..000000000 --- a/radio/src/gui/colorlcd/rle.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef _rle_h_ -#define _rle_h_ - -int rle_decode_8bit(unsigned char* dest, unsigned int dest_size, const unsigned char* src); - - -#endif diff --git a/radio/src/gui/colorlcd/screen_setup.cpp b/radio/src/gui/colorlcd/screen_setup.cpp new file mode 100644 index 000000000..09d1631f3 --- /dev/null +++ b/radio/src/gui/colorlcd/screen_setup.cpp @@ -0,0 +1,207 @@ +/* + * 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 +#include "screen_setup.h" +#include "opentx.h" + +#define SET_DIRTY() storageDirty(EE_MODEL) + +ScreenAddPage::ScreenAddPage(ScreenMenu * menu, uint8_t pageIndex): + PageTab("", ICON_THEME_ADD_VIEW), + menu(menu), + pageIndex(pageIndex) +{ + setTitle(STR_ADD_MAIN_VIEW); +} + +void ScreenAddPage::build(FormWindow * window) +{ + auto button = new TextButton(window, {LCD_W / 2 - 100, (window->height() - 24) / 2, 200, 24}, STR_ADD_MAIN_VIEW); + button->setPressHandler([=]() { + const LayoutFactory * factory = getRegisteredLayouts().front(); + customScreens[pageIndex] = factory->create(&g_model.screenData[pageIndex].layoutData); + strncpy(g_model.screenData[pageIndex].layoutName, factory->getId(), sizeof(g_model.screenData[pageIndex].layoutName)); + menu->removeTab(pageIndex); + menu->addTab(new ScreenSetupPage(menu, pageIndex)); + menu->setCurrentTab(pageIndex); + if (pageIndex < MAX_CUSTOM_SCREENS - 1) { + menu->addTab(new ScreenAddPage(menu, pageIndex + 1)); + } + storageDirty(EE_MODEL); + return 0; + }); +} + +class LayoutChoice: public FormField { + public: + LayoutChoice(Window * parent, const rect_t & rect, std::function getValue, std::function setValue): + FormField(parent, {rect.x, rect.y, 59, 33}), + getValue(std::move(getValue)), + setValue(std::move(setValue)) + { + } + + void paint(BitmapBuffer * dc) override + { + FormField::paint(dc); + auto layout = getValue(); + layout->drawThumb(dc, 4, 4, editMode ? TEXT_INVERTED_COLOR : LINE_COLOR); + } + +#if defined(HARDWARE_KEYS) + void onKeyEvent(event_t event) override + { + TRACE_WINDOWS("%s received event 0x%X", getWindowDebugString().c_str(), event); + + if (event == EVT_KEY_BREAK(KEY_ENTER)) { + editMode = true; + invalidate(); + openMenu(); + } + else { + FormField::onKeyEvent(event); + } + } +#endif + + void openMenu() + { + auto menu = new Menu(); + + for (auto layout: getRegisteredLayouts()) { + menu->addLine([=](BitmapBuffer *dc, coord_t x, coord_t y, LcdFlags flags) { + layout->drawThumb(dc, x + 2, y + 2, flags); + dc->drawText(65, y + 5, layout->getName(), flags); + }, [=]() { + setValue(layout); + }); + } + + auto it = std::find(getRegisteredLayouts().begin(), getRegisteredLayouts().end(), getValue()); + menu->select(std::distance(getRegisteredLayouts().begin(), it)); + + menu->setCloseHandler([=]() { + editMode = false; + setFocus(); + }); + } + + protected: + std::function getValue; + std::function setValue; +}; + +ScreenSetupPage::ScreenSetupPage(ScreenMenu * menu, uint8_t pageIndex): + PageTab("", ICON_THEME_VIEW1 + pageIndex), + menu(menu), + pageIndex(pageIndex) +{ + char title[] = "Main view X"; + title[sizeof(title) - 2] = '1' + pageIndex; + setTitle(title); +} + +void ScreenSetupPage::build(FormWindow * window) +{ + FormGridLayout grid; + grid.spacer(PAGE_PADDING); + + // Layout choice... + new StaticText(window, grid.getLabelSlot(false), STR_LAYOUT); + auto layoutSlot = grid.getFieldSlot(); + layoutSlot.h = 2 * PAGE_LINE_HEIGHT - 1; + layoutChoice = new LayoutChoice(window, layoutSlot, GET_VALUE(customScreens[pageIndex]->getFactory()), [=](const LayoutFactory *factory) { + delete customScreens[pageIndex]; + customScreens[pageIndex] = factory->create(&g_model.screenData[pageIndex].layoutData); + strncpy(g_model.screenData[pageIndex].layoutName, factory->getId(), sizeof(g_model.screenData[pageIndex].layoutName)); + SET_DIRTY(); + updateLayoutOptions(); + }); + grid.nextLine(layoutChoice->height()); + + // Setup widgets button... + setupWidgetsButton = new TextButton(window, grid.getFieldSlot(), STR_SETUP_WIDGETS); + setupWidgetsButton->setPressHandler([=]() { +// auto setupWidgetsPage = new SetupWidgetsPage(); +// setupWidgetsPage->setCloseHandler([=]() { +// setupWidgetsButton->setFocus(); +// }); + return 0; + }); + grid.nextLine(); + + // Dynamic options window... + optionsWindow = new Window(window, {0, grid.getWindowHeight(), LCD_W, 0}, FORWARD_SCROLL); + grid.addWindow(optionsWindow); + updateLayoutOptions(); +} + +void ScreenSetupPage::updateLayoutOptions() +{ + FormGridLayout grid; + optionsWindow->clear(); + FormField::setCurrentField(setupWidgetsButton); // next field will be linked to this button + + auto screen = customScreens[pageIndex]; + + // Layout options... + int index = 0; + for (auto * option = screen->getFactory()->getOptions(); option->name; option++, index++) { + ZoneOptionValue * value = screen->getOptionValue(index); + + // Option label + new StaticText(optionsWindow, grid.getLabelSlot(false), option->name); + + // Option value + switch (option->type) { + case ZoneOption::Bool: + new CheckBox(optionsWindow, grid.getFieldSlot(), GET_SET_DEFAULT(value->boolValue)); + break; + + case ZoneOption::Color: + new ColorEdit(optionsWindow, grid.getFieldSlot(), GET_SET_DEFAULT(value->unsignedValue)); + break; + + default: + break; + } + grid.nextLine(); + } + + if (pageIndex > 0 || customScreens[1]) { + auto button = new TextButton(optionsWindow, grid.getFieldSlot(), STR_REMOVE_SCREEN); + button->setPressHandler([=]() { + if (pageIndex < MAX_CUSTOM_SCREENS - 1) { + memmove(&g_model.screenData[pageIndex], &g_model.screenData[pageIndex + 1], sizeof(CustomScreenData) * (MAX_CUSTOM_SCREENS - pageIndex - 1)); + } + memset(&g_model.screenData[MAX_CUSTOM_SCREENS - 1], 0, sizeof(CustomScreenData)); + loadCustomScreens(); + menu->updateTabs(); + storageDirty(EE_MODEL); + return 0; + }); + } + + optionsWindow->adjustHeight(); + optionsWindow->getParent()->adjustInnerHeight(); + + FormField::link(FormField::getCurrentField(), layoutChoice); +} diff --git a/radio/src/gui/libopenui/keyboard_number.h b/radio/src/gui/colorlcd/screen_setup.h similarity index 54% rename from radio/src/gui/libopenui/keyboard_number.h rename to radio/src/gui/colorlcd/screen_setup.h index 7fb5bde29..f37757391 100644 --- a/radio/src/gui/libopenui/keyboard_number.h +++ b/radio/src/gui/colorlcd/screen_setup.h @@ -18,38 +18,31 @@ * GNU General Public License for more details. */ -#ifndef _KEYBOARD_NUMBER_H_ -#define _KEYBOARD_NUMBER_H_ - -#include "keyboard_base.h" -#include "basenumberedit.h" - -class NumberKeyboard : public Keyboard { - friend class BaseNumberEdit; +#include "menu_screen.h" +class ScreenAddPage: public PageTab { public: - NumberKeyboard(); + ScreenAddPage(ScreenMenu * menu, uint8_t pageIndex); - ~NumberKeyboard() override; - -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "NumberKeyboard"; - } -#endif - - static NumberKeyboard * instance() - { - if (!_instance) - _instance = new NumberKeyboard(); - return _instance; - } - - void paint(BitmapBuffer * dc) override; + void build(FormWindow * window) override; protected: - static NumberKeyboard * _instance; + ScreenMenu * menu; + uint8_t pageIndex; }; -#endif // _KEYBOARD_NUMBER_H_ \ No newline at end of file +class ScreenSetupPage: public PageTab { + public: + ScreenSetupPage(ScreenMenu * menu, uint8_t pageIndex); + + void build(FormWindow * window) override; + + protected: + ScreenMenu * menu; + uint8_t pageIndex; + Window * optionsWindow = nullptr; + TextButton * setupWidgetsButton = nullptr; + FormField * layoutChoice = nullptr; + + void updateLayoutOptions(); +}; diff --git a/radio/src/gui/colorlcd/screens_setup.cpp b/radio/src/gui/colorlcd/screens_setup_old.cpp similarity index 99% rename from radio/src/gui/colorlcd/screens_setup.cpp rename to radio/src/gui/colorlcd/screens_setup_old.cpp index 749bd50c2..cded00d1b 100644 --- a/radio/src/gui/colorlcd/screens_setup.cpp +++ b/radio/src/gui/colorlcd/screens_setup_old.cpp @@ -684,6 +684,6 @@ bool menuScreenAdd(event_t event) return false; } - SIMPLE_MENU_WITH_OPTIONS(STR_ADDMAINVIEW, THEME_ICONS, menuTabScreensSetup, menuPageCount, menuPageCount-1, 0); + SIMPLE_MENU_WITH_OPTIONS(STR_ADD_MAIN_VIEW, THEME_ICONS, menuTabScreensSetup, menuPageCount, menuPageCount-1, 0); return true; } diff --git a/radio/src/gui/libopenui/sourcechoice.cpp b/radio/src/gui/colorlcd/sourcechoice.cpp similarity index 100% rename from radio/src/gui/libopenui/sourcechoice.cpp rename to radio/src/gui/colorlcd/sourcechoice.cpp diff --git a/radio/src/gui/libopenui/sourcechoice.h b/radio/src/gui/colorlcd/sourcechoice.h similarity index 100% rename from radio/src/gui/libopenui/sourcechoice.h rename to radio/src/gui/colorlcd/sourcechoice.h diff --git a/radio/src/gui/colorlcd/special_functions.cpp b/radio/src/gui/colorlcd/special_functions.cpp index 5c836f8aa..9c6349ba2 100644 --- a/radio/src/gui/colorlcd/special_functions.cpp +++ b/radio/src/gui/colorlcd/special_functions.cpp @@ -109,7 +109,7 @@ class SpecialFunctionEditPage : public Page { break; case FUNC_VOLUME: - new StaticText(specialFunctionOneWindow, grid.getLabelSlot(), STR_SPEAKER_VOLUME); + new StaticText(specialFunctionOneWindow, grid.getLabelSlot(), STR_VOLUME); new SourceChoice(specialFunctionOneWindow, grid.getFieldSlot(), 0, MIXSRC_LAST_CH, GET_SET_DEFAULT(CFN_PARAM(cfn))); grid.nextLine(); break; @@ -176,7 +176,7 @@ class SpecialFunctionEditPage : public Page { new StaticText(specialFunctionOneWindow, grid.getLabelSlot(), STR_VALUE); auto edit = new NumberEdit(specialFunctionOneWindow, grid.getFieldSlot(), 0, 255, GET_SET_DEFAULT(CFN_PARAM(cfn))); edit->setDisplayHandler([=](BitmapBuffer * dc, LcdFlags flags, int32_t value) { - lcdDrawNumber(2, 2, CFN_PARAM(cfn), PREC1, sizeof(CFN_PARAM(cfn)), nullptr, "s"); + dc->drawNumber(2, 2, CFN_PARAM(cfn), PREC1, sizeof(CFN_PARAM(cfn)), nullptr, "s"); }); break; } @@ -192,11 +192,11 @@ class SpecialFunctionEditPage : public Page { auto repeat = new NumberEdit(specialFunctionOneWindow, grid.getFieldSlot(2, 1), -1, 60/CFN_PLAY_REPEAT_MUL, GET_SET_DEFAULT(CFN_PLAY_REPEAT(cfn))); repeat->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) { if (value == 0) - lcdDrawText(3, 0, "1x", flags); + dc->drawText(3, 0, "1x", flags); else if (value == CFN_PLAY_REPEAT_NOSTART) - lcdDrawText(3, 0, "!1x", flags); + dc->drawText(3, 0, "!1x", flags); else - drawNumber(dc, 3, 0, value * CFN_PLAY_REPEAT_MUL, flags, 0, nullptr, "s"); + dc->drawNumber(3, 0, value * CFN_PLAY_REPEAT_MUL, flags, 0, nullptr, "s"); }); } @@ -297,7 +297,7 @@ class SpecialFunctionButton : public Button { if (CFN_EMPTY(cfn)) return; - lcdDrawTextAtIndex(col2, line1, STR_VFSWFUNC, func, 0); + dc->drawTextAtIndex(col2, line1, STR_VFSWFUNC, func, 0); int16_t val_min = 0; int16_t val_max = 255; @@ -305,7 +305,7 @@ class SpecialFunctionButton : public Button { case FUNC_OVERRIDE_CHANNEL: drawChn(dc, col1, line2, CFN_CH_INDEX(cfn) + 1, 0); getMixSrcRange(MIXSRC_FIRST_CH, val_min, val_max); - lcdDrawNumber(col2, line2, CFN_PARAM(cfn)); + dc->drawNumber(col2, line2, CFN_PARAM(cfn)); break; case FUNC_TRAINER: @@ -314,11 +314,11 @@ class SpecialFunctionButton : public Button { case FUNC_RESET: if (CFN_PARAM(cfn) < FUNC_RESET_PARAM_FIRST_TELEM) { - lcdDrawTextAtIndex(col1, line2, STR_VFSWRESET, CFN_PARAM(cfn)); + dc->drawTextAtIndex(col1, line2, STR_VFSWRESET, CFN_PARAM(cfn)); } else { TelemetrySensor * sensor = &g_model.telemetrySensors[CFN_PARAM(cfn) - FUNC_RESET_PARAM_FIRST_TELEM]; - lcdDrawSizedText(col1, line2, sensor->label, TELEM_LABEL_LEN, ZCHAR); + dc->drawSizedText(col1, line2, sensor->label, TELEM_LABEL_LEN); } break; @@ -327,16 +327,16 @@ class SpecialFunctionButton : public Button { break; case FUNC_PLAY_SOUND: - lcdDrawTextAtIndex(col1, line2, STR_FUNCSOUNDS, CFN_PARAM(cfn)); + dc->drawTextAtIndex(col1, line2, STR_FUNCSOUNDS, CFN_PARAM(cfn)); break; case FUNC_PLAY_TRACK: case FUNC_BACKGND_MUSIC: case FUNC_PLAY_SCRIPT: if (ZEXIST(cfn->play.name)) - lcdDrawSizedText(col1, line2, cfn->play.name, sizeof(cfn->play.name), 0); + dc->drawSizedText(col1, line2, cfn->play.name, sizeof(cfn->play.name), 0); else - lcdDrawTextAtIndex(col1, line2, STR_VCSWFUNC, 0, 0); + dc->drawTextAtIndex(col1, line2, STR_VCSWFUNC, 0, 0); break; case FUNC_SET_TIMER: @@ -344,7 +344,7 @@ class SpecialFunctionButton : public Button { break; case FUNC_SET_FAILSAFE: - lcdDrawTextAtIndex(col1, line2, "\004Int.Ext.", CFN_PARAM(cfn), 0); + dc->drawTextAtIndex(col1, line2, "\004Int.Ext.", CFN_PARAM(cfn), 0); break; case FUNC_PLAY_VALUE: @@ -352,35 +352,35 @@ class SpecialFunctionButton : public Button { break; case FUNC_HAPTIC: - lcdDrawNumber(col1, line2, CFN_PARAM(cfn), 0); + dc->drawNumber(col1, line2, CFN_PARAM(cfn), 0); break; case FUNC_LOGS: - lcdDrawNumber(col3, line1, CFN_PARAM(cfn), PREC1, sizeof(CFN_PARAM(cfn)), nullptr, "s"); + dc->drawNumber(col3, line1, CFN_PARAM(cfn), PREC1, sizeof(CFN_PARAM(cfn)), nullptr, "s"); break; } if (HAS_ENABLE_PARAM(func)) { - drawCheckBox(col3, line2, CFN_ACTIVE(cfn), 0); + drawCheckBox(dc, col3, line2, CFN_ACTIVE(cfn), 0); } else if (HAS_REPEAT_PARAM(func)) { if (CFN_PLAY_REPEAT(cfn) == 0) { - lcdDrawText(col3, line2, "1x", 0); + dc->drawText(col3, line2, "1x", 0); } else if (CFN_PLAY_REPEAT(cfn) == CFN_PLAY_REPEAT_NOSTART) { - lcdDrawText(col3, line2, "!1x", 0); + dc->drawText(col3, line2, "!1x", 0); } else { - lcdDrawNumber(col3 + 12, line2, CFN_PLAY_REPEAT(cfn) * CFN_PLAY_REPEAT_MUL, 0 | RIGHT, 0, nullptr, "s"); + dc->drawNumber(col3 + 12, line2, CFN_PLAY_REPEAT(cfn) * CFN_PLAY_REPEAT_MUL, 0 | RIGHT, 0, nullptr, "s"); } } } - virtual void paint(BitmapBuffer * dc) override + void paint(BitmapBuffer * dc) override { if (active) dc->drawSolidFilledRect(2, 2, rect.w - 4, rect.h - 4, WARNING_COLOR); paintSpecialFunctionLine(dc); - drawSolidRect(dc, 0, 0, rect.w, rect.h, 2, hasFocus() ? SCROLLBOX_COLOR : CURVE_AXIS_COLOR); + dc->drawSolidRect(0, 0, rect.w, rect.h, 2, hasFocus() ? SCROLLBOX_COLOR : CURVE_AXIS_COLOR); } protected: diff --git a/radio/src/gui/libopenui/switchchoice.cpp b/radio/src/gui/colorlcd/switchchoice.cpp similarity index 100% rename from radio/src/gui/libopenui/switchchoice.cpp rename to radio/src/gui/colorlcd/switchchoice.cpp diff --git a/radio/src/gui/libopenui/switchchoice.h b/radio/src/gui/colorlcd/switchchoice.h similarity index 100% rename from radio/src/gui/libopenui/switchchoice.h rename to radio/src/gui/colorlcd/switchchoice.h diff --git a/radio/src/gui/colorlcd/theme.cpp b/radio/src/gui/colorlcd/theme.cpp index 8d7abff3e..49d09a5a7 100644 --- a/radio/src/gui/colorlcd/theme.cpp +++ b/radio/src/gui/colorlcd/theme.cpp @@ -20,25 +20,26 @@ #include "opentx.h" -const BitmapBuffer * Theme::asterisk = NULL; -const BitmapBuffer * Theme::question = NULL; -const BitmapBuffer * Theme::busy = NULL; +extern ThemeBase * defaultTheme; +const BitmapBuffer * ThemeBase::asterisk = NULL; +const BitmapBuffer * ThemeBase::question = NULL; +const BitmapBuffer * ThemeBase::busy = NULL; -std::list & getRegisteredThemes() +std::list & getRegisteredThemes() { - static std::list themes; + static std::list themes; return themes; } -void registerTheme(Theme * theme) +void registerTheme(ThemeBase * theme) { TRACE("register theme %s", theme->getName()); getRegisteredThemes().push_back(theme); } -void Theme::init() const +void ThemeBase::init() const { - memset(&g_eeGeneral.themeData, 0, sizeof(Theme::PersistentData)); + memset(&g_eeGeneral.themeData, 0, sizeof(ThemeBase::PersistentData)); if (options) { int i = 0; for (const ZoneOption * option = options; option->name; option++, i++) { @@ -48,19 +49,22 @@ void Theme::init() const } } -void Theme::load() const +void ThemeBase::load() const { - if (!asterisk) asterisk = BitmapBuffer::load(getThemePath("asterisk.bmp")); - if (!question) question = BitmapBuffer::load(getThemePath("question.bmp")); - if (!busy) busy = BitmapBuffer::load(getThemePath("busy.bmp")); + if (!asterisk) + asterisk = BitmapBuffer::load(getFilePath("asterisk.bmp")); + if (!question) + question = BitmapBuffer::load(getFilePath("question.bmp")); + if (!busy) + busy = BitmapBuffer::load(getFilePath("busy.bmp")); } -ZoneOptionValue * Theme::getOptionValue(unsigned int index) const +ZoneOptionValue * ThemeBase::getOptionValue(unsigned int index) const { return &g_eeGeneral.themeData.options[index]; } -const char * Theme::getFilePath(const char * filename) const +const char * ThemeBase::getFilePath(const char * filename) const { static char path[_MAX_LFN+1] = THEMES_PATH "/"; strcpy(path + sizeof(THEMES_PATH), getName()); @@ -70,7 +74,7 @@ const char * Theme::getFilePath(const char * filename) const return path; } -void Theme::drawThumb(coord_t x, coord_t y, uint32_t flags) +void ThemeBase::drawThumb(BitmapBuffer * dc, coord_t x, coord_t y, uint32_t flags) { #define THUMB_WIDTH 51 #define THUMB_HEIGHT 31 @@ -79,16 +83,16 @@ void Theme::drawThumb(coord_t x, coord_t y, uint32_t flags) } lcd->drawBitmap(x, y, thumb); if (flags == LINE_COLOR) { - lcdDrawFilledRect(x, y, THUMB_WIDTH, THUMB_HEIGHT, SOLID, OVERLAY_COLOR | OPACITY(10)); + dc->drawFilledRect(x, y, THUMB_WIDTH, THUMB_HEIGHT, SOLID, OVERLAY_COLOR | OPACITY(10)); } } -void Theme::drawBackground(BitmapBuffer * dc) const +void ThemeBase::drawBackground(BitmapBuffer * dc) const { dc->drawSolidFilledRect(0, 0, LCD_W, LCD_H, TEXT_BGCOLOR); } -void Theme::drawMessageBox(const char * title, const char * text, const char * action, uint32_t type) const +void ThemeBase::drawMessageBox(const char * title, const char * text, const char * action, uint32_t type) const { } @@ -127,9 +131,62 @@ void Theme::drawMessageBox(const char * title, const char * text, const char * a // } //} -Theme * getTheme(const char * name) +void ThemeBase::drawCheckBox(BitmapBuffer * dc, bool value, bool focus) const { - std::list::const_iterator it = getRegisteredThemes().cbegin(); + if (focus) { + dc->drawSolidFilledRect(0, 2, 16, 16, TEXT_INVERTED_BGCOLOR); + if (value) { + dc->drawSolidFilledRect(2, 4, 12, 12, TEXT_BGCOLOR); + dc->drawSolidFilledRect(3, 5, 10, 10, SCROLLBOX_COLOR); + } + else { + dc->drawSolidFilledRect(2, 4, 12, 12, TEXT_BGCOLOR); + } + } + else { + if (value) { + dc->drawSolidFilledRect(2, 4, 12, 12, SCROLLBOX_COLOR); + dc->drawSolidRect(0, 2, 16, 16, 1, CURVE_AXIS_COLOR); + } + else { + dc->drawSolidRect(0, 2, 16, 16, 1, CURVE_AXIS_COLOR); + } + } +} + +void ThemeBase::drawSlider(BitmapBuffer * dc, int vmin, int vmax, int value, const rect_t & rect, bool edit, bool focus) const +{ + int val = limit(vmin, value, vmax); + int w = divRoundClosest((rect.w - 16) * (val - vmin), vmax - vmin); + + if (edit) { + dc->drawBitmapPattern(0, 11, LBM_SLIDER_BAR_LEFT, TEXT_INVERTED_BGCOLOR); + dc->drawSolidFilledRect(4, 11, rect.w - 8, 4, TEXT_INVERTED_BGCOLOR); + dc->drawBitmapPattern(rect.w - 4, 11, LBM_SLIDER_BAR_RIGHT, TEXT_INVERTED_BGCOLOR); + } + else { + dc->drawBitmapPattern(0, 11, LBM_SLIDER_BAR_LEFT, LINE_COLOR); + dc->drawSolidFilledRect(4, 11, rect.w - 8, 4, LINE_COLOR); + dc->drawBitmapPattern(rect.w - 4, 11, LBM_SLIDER_BAR_RIGHT, LINE_COLOR); + } + + dc->drawBitmapPattern(w, 5, LBM_SLIDER_POINT_OUT, TEXT_COLOR); + dc->drawBitmapPattern(w, 5, LBM_SLIDER_POINT_MID, TEXT_BGCOLOR); + // if ((options & INVERS) && (!(options & BLINK) || !BLINK_ON_PHASE)) + if (focus) { + dc->drawBitmapPattern(w, 5, LBM_SLIDER_POINT_IN, TEXT_INVERTED_BGCOLOR); + } +} + +void ThemeBase::drawPageHeader(BitmapBuffer * dc, const PageHeader * header) const +{ + drawMenuBackground(dc, header->getIcon(), ""); + dc->drawSolidFilledRect(MENU_HEADER_HEIGHT, 0, LCD_W - MENU_HEADER_HEIGHT, MENU_HEADER_HEIGHT, HEADER_BGCOLOR); +} + +ThemeBase * getTheme(const char * name) +{ + std::list::const_iterator it = getRegisteredThemes().cbegin(); for (; it != getRegisteredThemes().cend(); ++it) { if (!strcmp(name, (*it)->getName())) { return (*it); @@ -138,11 +195,11 @@ Theme * getTheme(const char * name) return nullptr; } -void loadTheme(Theme * newTheme) +void loadTheme(ThemeBase * newTheme) { TRACE("load theme %s", newTheme->getName()); theme = newTheme; - theme->load(); + newTheme->load(); } void loadTheme() @@ -150,11 +207,12 @@ void loadTheme() char name[THEME_NAME_LEN + 1]; memset(name, 0, sizeof(name)); strncpy(name, g_eeGeneral.themeName, THEME_NAME_LEN); - Theme * newTheme = getTheme(name); - if (newTheme) { + ThemeBase * newTheme = getTheme(name); + if (newTheme) loadTheme(newTheme); - } - else { - theme->load(); - } + else + loadTheme(defaultTheme); +// else { +// loadTheme(theme); +// } } diff --git a/radio/src/gui/colorlcd/theme.h b/radio/src/gui/colorlcd/theme.h index 76da75558..2215b87ed 100644 --- a/radio/src/gui/colorlcd/theme.h +++ b/radio/src/gui/colorlcd/theme.h @@ -18,29 +18,30 @@ * GNU General Public License for more details. */ -#ifndef _THEME_H_ -#define _THEME_H_ +#ifndef _COLORLCD_THEME_H_ +#define _COLORLCD_THEME_H_ #include #include #include "zone.h" +#include "thirdparty/libopenui/src/theme.h" class BitmapBuffer; class PageTab; #define MAX_THEME_OPTIONS 5 -class Theme; -void registerTheme(Theme * theme); +class ThemeBase; +void registerTheme(ThemeBase * theme); -class Theme +class ThemeBase: public Theme { public: struct PersistentData { ZoneOptionValue options[MAX_THEME_OPTIONS]; }; - Theme(const char * name, const ZoneOption * options = nullptr): + ThemeBase(const char * name, const ZoneOption * options = nullptr): name(name), options(options), thumb(nullptr) @@ -55,7 +56,7 @@ class Theme const char * getFilePath(const char * filename) const; - void drawThumb(coord_t x, coord_t y, uint32_t flags); + void drawThumb(BitmapBuffer * dc, coord_t x, coord_t y, uint32_t flags); inline const ZoneOption * getOptions() const { @@ -74,25 +75,18 @@ class Theme virtual void drawBackground(BitmapBuffer * dc) const; - virtual const BitmapBuffer * getIconButtonBitmap(uint8_t index, bool selected) const - { - TRACE("No bitmap for icon %d in this theme", index); - return nullptr; - } - - virtual const BitmapBuffer * getIconMask(uint8_t index) const - { - TRACE("No mask for icon %d in this theme", index); - return nullptr; - } - virtual void drawMenuBackground(BitmapBuffer * dc, uint8_t icon, const char *title) const = 0; virtual void drawMenuHeader(BitmapBuffer * dc, std::vector & tabs, uint8_t currentIndex) const = 0; virtual void drawMessageBox(const char * title, const char * text, const char * action, uint32_t flags) const; + // virtual void drawProgressBar(BitmapBuffer * dc, coord_t x, coord_t y, coord_t w, coord_t h, int value) const = 0; - virtual void drawProgressBar(BitmapBuffer * dc, coord_t x, coord_t y, coord_t w, coord_t h, int value) const = 0; + void drawCheckBox(BitmapBuffer * dc, bool value, bool focus) const override; + + void drawSlider(BitmapBuffer * dc, int vmin, int vmax, int value, const rect_t & rect, bool edit, bool focus) const override; + + void drawPageHeader(BitmapBuffer * dc, const PageHeader * page) const override; protected: const char * name; @@ -105,17 +99,10 @@ class Theme static const BitmapBuffer * busy; }; -extern Theme * theme; - -inline const char * getThemePath(const char * filename) -{ - return theme->getFilePath(filename); -} - -Theme * getTheme(const char * name); -void loadTheme(Theme * theme); +ThemeBase * getTheme(const char * name); +void loadTheme(ThemeBase * theme); void loadTheme(); -std::list & getRegisteredThemes(); +std::list & getRegisteredThemes(); -#endif // _THEME_H_ +#endif // _COLORLCD_THEME_H_ diff --git a/radio/src/gui/colorlcd/themes/flysky.cpp b/radio/src/gui/colorlcd/themes/flysky.cpp index 18d6d41e3..2c76b787b 100644 --- a/radio/src/gui/colorlcd/themes/flysky.cpp +++ b/radio/src/gui/colorlcd/themes/flysky.cpp @@ -27,11 +27,11 @@ const ZoneOption OPTIONS_THEME_DEFAULT[] = { { nullptr, ZoneOption::Bool } }; -class FlyskyTheme: public Theme +class FlyskyTheme: public ThemeBase { public: FlyskyTheme(): - Theme("FlySky", OPTIONS_THEME_DEFAULT) + ThemeBase("FlySky", OPTIONS_THEME_DEFAULT) { loadColors(); } @@ -78,9 +78,9 @@ class FlyskyTheme: public Theme void loadMenuIcon(uint8_t index, const char * filename, uint32_t color=MENU_TITLE_COLOR) const { - TRACE("loadMenuIcon %s", getThemePath(filename)); + TRACE("loadMenuIcon %s", getFilePath(filename)); - BitmapBuffer * mask = BitmapBuffer::loadMask(getThemePath(filename)); + BitmapBuffer * mask = BitmapBuffer::loadMask(getFilePath(filename)); if (mask) { delete iconMask[index]; iconMask[index] = mask; @@ -177,9 +177,9 @@ class FlyskyTheme: public Theme loadMenuIcon(ICON_MONITOR_CHANNELS4, "mask_monitor_channels4.png"); loadMenuIcon(ICON_MONITOR_LOGICAL_SWITCHES, "mask_monitor_logsw.png"); - BitmapBuffer * background = BitmapBuffer::loadMask(getThemePath("mask_currentmenu_bg.png")); - BitmapBuffer * shadow = BitmapBuffer::loadMask(getThemePath("mask_currentmenu_shadow.png")); - BitmapBuffer * dot = BitmapBuffer::loadMask(getThemePath("mask_currentmenu_dot.png")); + BitmapBuffer * background = BitmapBuffer::loadMask(getFilePath("mask_currentmenu_bg.png")); + BitmapBuffer * shadow = BitmapBuffer::loadMask(getFilePath("mask_currentmenu_shadow.png")); + BitmapBuffer * dot = BitmapBuffer::loadMask(getFilePath("mask_currentmenu_dot.png")); if (!currentMenuBackground) { currentMenuBackground = new BitmapBuffer(BMP_RGB565, 36, 53); @@ -205,22 +205,22 @@ class FlyskyTheme: public Theme { // Calibration screen delete calibStick; - calibStick = BitmapBuffer::load(getThemePath("stick_pointer.png")); + calibStick = BitmapBuffer::load(getFilePath("stick_pointer.png")); delete calibStickBackground; - calibStickBackground = BitmapBuffer::load(getThemePath("stick_background.png")); + calibStickBackground = BitmapBuffer::load(getFilePath("stick_background.png")); delete calibTrackpBackground; - calibTrackpBackground = BitmapBuffer::load(getThemePath("trackp_background.png")); + calibTrackpBackground = BitmapBuffer::load(getFilePath("trackp_background.png")); delete calibRadioPict; - calibRadioPict = BitmapBuffer::load(getThemePath("NV14.bmp")); + calibRadioPict = BitmapBuffer::load(getFilePath("NV14.bmp")); // Model Selection screen delete modelselIconBitmap; modelselIconBitmap = BitmapBuffer::loadMaskOnBackground("modelsel/mask_iconback.png", TITLE_BGCOLOR, TEXT_BGCOLOR); if (modelselIconBitmap) { - BitmapBuffer * bitmap = BitmapBuffer::load(getThemePath("modelsel/icon_default.png")); + BitmapBuffer * bitmap = BitmapBuffer::load(getFilePath("modelsel/icon_default.png")); modelselIconBitmap->drawBitmap(20, 8, bitmap); delete bitmap; } @@ -235,13 +235,13 @@ class FlyskyTheme: public Theme modelselModelNameBitmap = BitmapBuffer::loadMaskOnBackground("modelsel/mask_modelname.png", TEXT_COLOR, TEXT_BGCOLOR); delete modelselModelMoveBackground; - modelselModelMoveBackground = BitmapBuffer::loadMask(getThemePath("modelsel/mask_moveback.png")); + modelselModelMoveBackground = BitmapBuffer::loadMask(getFilePath("modelsel/mask_moveback.png")); delete modelselModelMoveIcon; - modelselModelMoveIcon = BitmapBuffer::loadMask(getThemePath("modelsel/mask_moveico.png")); + modelselModelMoveIcon = BitmapBuffer::loadMask(getFilePath("modelsel/mask_moveico.png")); delete modelselWizardBackground; - modelselWizardBackground = BitmapBuffer::load(getThemePath("wizard/background.png")); + modelselWizardBackground = BitmapBuffer::load(getFilePath("wizard/background.png")); // Channels monitor screen delete chanMonLockedBitmap; @@ -276,10 +276,10 @@ class FlyskyTheme: public Theme mixerSetupCurveBitmap = BitmapBuffer::loadMaskOnBackground("mask_textline_curve.png", TEXT_COLOR, TEXT_BGCOLOR); delete mixerSetupSwitchIcon; - mixerSetupSwitchIcon = BitmapBuffer::loadMask(getThemePath("mask_textline_switch.png")); + mixerSetupSwitchIcon = BitmapBuffer::loadMask(getFilePath("mask_textline_switch.png")); delete mixerSetupFlightmodeIcon; - mixerSetupFlightmodeIcon = BitmapBuffer::loadMask(getThemePath("mask_textline_fm.png")); + mixerSetupFlightmodeIcon = BitmapBuffer::loadMask(getFilePath("mask_textline_fm.png")); delete mixerSetupSlowBitmap; mixerSetupSlowBitmap = BitmapBuffer::loadMaskOnBackground("mask_textline_slow.png", TEXT_COLOR, TEXT_BGCOLOR); @@ -291,12 +291,12 @@ class FlyskyTheme: public Theme mixerSetupDelaySlowBitmap = BitmapBuffer::loadMaskOnBackground("mask_textline_delayslow.png", TEXT_COLOR, TEXT_BGCOLOR); } - virtual void load() const override + void load() const override { loadColors(); - Theme::load(); + ThemeBase::load(); if (!backgroundBitmap) { - backgroundBitmap = BitmapBuffer::load(getThemePath("background.png")); + backgroundBitmap = BitmapBuffer::load(getFilePath("background.png")); } update(); } @@ -341,26 +341,25 @@ class FlyskyTheme: public Theme void drawMenuBackground(BitmapBuffer * dc, uint8_t icon, const char * title) const override { - dc->drawSolidFilledRect(0, 0, LCD_W, MENU_HEADER_HEIGHT, HEADER_BGCOLOR); - - if (topleftBitmap) { - dc->drawBitmap(0, 0, topleftBitmap); - uint16_t width = topleftBitmap->getWidth(); - dc->drawSolidFilledRect(width, 0, LCD_W-width, MENU_HEADER_HEIGHT, HEADER_BGCOLOR); - } - else { +// if (topleftBitmap) { +// dc->drawBitmap(0, 0, topleftBitmap); +// uint16_t width = topleftBitmap->getWidth(); +// dc->drawSolidFilledRect(width, 0, LCD_W-width, MENU_HEADER_HEIGHT, HEADER_BGCOLOR); +// } +// else { dc->drawSolidFilledRect(0, 0, LCD_W, MENU_HEADER_HEIGHT, HEADER_BGCOLOR); - } - - if (icon == ICON_OPENTX) - dc->drawBitmap(4, 10, menuIconSelected[ICON_OPENTX]); - else - dc->drawBitmap(5, 7, menuIconSelected[icon]); - +// } +// +// if (icon == ICON_OPENTX) +// dc->drawBitmap(4, 10, menuIconSelected[ICON_OPENTX]); +// else +// dc->drawBitmap(5, 7, menuIconSelected[icon]); +// dc->drawSolidFilledRect(0, MENU_HEADER_HEIGHT, LCD_W, MENU_TITLE_TOP - MENU_HEADER_HEIGHT, TEXT_BGCOLOR); // the white separation line dc->drawSolidFilledRect(0, MENU_TITLE_TOP, LCD_W, MENU_TITLE_HEIGHT, TITLE_BGCOLOR); // the title line background +// if (title) { - lcdDrawText(MENUS_MARGIN_LEFT, MENU_TITLE_TOP, title, MENU_TITLE_COLOR); + dc->drawText(MENUS_MARGIN_LEFT, MENU_TITLE_TOP, title, MENU_TITLE_COLOR); } } @@ -369,20 +368,20 @@ class FlyskyTheme: public Theme return iconMask[index]; } - const BitmapBuffer * getIconButtonBitmap(uint8_t index, bool selected) const override + const BitmapBuffer * getIcon(uint8_t index, IconState state) const override { - return selected ? menuIconSelected[index] : menuIconNormal[index]; + return state == STATE_DEFAULT ? menuIconNormal[index] : menuIconSelected[index]; } void drawMenuHeader(BitmapBuffer * dc, std::vector & tabs, uint8_t currentIndex) const override { - uint8_t padding_left = 0; + uint8_t padding_left = 4; - dc->drawSolidFilledRect(0, 0, padding_left, MENU_HEADER_BUTTON_WIDTH, HEADER_BGCOLOR); - for (unsigned i=0; idrawBitmap(padding_left + i*MENU_HEADER_BUTTON_WIDTH, 0, theme->getIconButtonBitmap(tabs[i]->getIcon(), currentIndex == i)); + dc->drawSolidFilledRect(0, 0, 4, MENU_HEADER_BUTTON_WIDTH, HEADER_BGCOLOR); + for (unsigned i = 0; i < tabs.size(); i++) { + dc->drawBitmap(padding_left + i*MENU_HEADER_BUTTON_WIDTH, 0, theme->getIcon(tabs[i]->getIcon(), currentIndex == i ? STATE_PRESSED : STATE_DEFAULT)); } - coord_t x = padding_left + MENU_HEADER_BUTTON_WIDTH * tabs.size(); +// coord_t x = padding_left + MENU_HEADER_BUTTON_WIDTH * tabs.size(); // coord_t w = width() - x; // if (w > 0) { // dc->drawSolidFilledRect(x, 0, w, MENU_HEADER_BUTTON_WIDTH, HEADER_BGCOLOR); @@ -396,17 +395,22 @@ class FlyskyTheme: public Theme struct gtm t; gettime(&t); char str[10]; + +#if defined(TRANSLATIONS_CN) + sprintf(str, "%d" TR_MONTH "%d", t.tm_mon + 1, t.tm_mday); +#else const char * const STR_MONTHS[] = TR_MONTHS; sprintf(str, "%d %s", t.tm_mday, STR_MONTHS[t.tm_mon]); - lcdDrawText(DATETIME_MIDDLE, DATETIME_LINE1, str, SMLSIZE|TEXT_INVERTED_COLOR|CENTERED); +#endif + dc->drawText(DATETIME_MIDDLE, DATETIME_LINE1, str, SMLSIZE|TEXT_INVERTED_COLOR|CENTERED); getTimerString(str, getValue(MIXSRC_TX_TIME)); - lcdDrawText(DATETIME_MIDDLE, DATETIME_LINE2, str, SMLSIZE|TEXT_INVERTED_COLOR|CENTERED); + dc->drawText(DATETIME_MIDDLE, DATETIME_LINE2, str, SMLSIZE|TEXT_INVERTED_COLOR|CENTERED); } void drawProgressBar(BitmapBuffer * dc, coord_t x, coord_t y, coord_t w, coord_t h, int value) const override { - drawSolidRect(dc, x, y, w, h, 1, TEXT_COLOR); + dc->drawSolidRect(x, y, w, h, 1, TEXT_COLOR); if (value > 0) { int width = (w * value) / 100; dc->drawSolidFilledRect(x + 2, y + 2, width - 4, h - 4, SCROLLBOX_COLOR); @@ -432,5 +436,6 @@ BitmapBuffer * FlyskyTheme::currentMenuBackground = nullptr; FlyskyTheme flyskyTheme; #if defined(PCBFLYSKY) +ThemeBase * defaultTheme = &flyskyTheme; Theme * theme = &flyskyTheme; #endif \ No newline at end of file diff --git a/radio/src/gui/colorlcd/themes/frsky.cpp b/radio/src/gui/colorlcd/themes/frsky.cpp index 26d1c0a65..5db8d5e07 100644 --- a/radio/src/gui/colorlcd/themes/frsky.cpp +++ b/radio/src/gui/colorlcd/themes/frsky.cpp @@ -27,11 +27,11 @@ const ZoneOption OPTIONS_THEME_DEFAULT[] = { { nullptr, ZoneOption::Bool } }; -class FrskyTheme: public Theme +class FrskyTheme: public ThemeBase { public: FrskyTheme(): - Theme("FrSky", OPTIONS_THEME_DEFAULT) + ThemeBase("FrSky", OPTIONS_THEME_DEFAULT) { loadColors(); } @@ -72,8 +72,8 @@ class FrskyTheme: public Theme void loadMenuIcon(uint8_t index, const char * filename, uint32_t color=MENU_TITLE_COLOR) const { - TRACE("loadMenuIcon %s", getThemePath(filename)); - BitmapBuffer * mask = BitmapBuffer::loadMask(getThemePath(filename)); + TRACE("loadMenuIcon %s", getFilePath(filename)); + BitmapBuffer * mask = BitmapBuffer::loadMask(getFilePath(filename)); if (mask) { delete iconMask[index]; iconMask[index] = mask; @@ -148,13 +148,14 @@ class FrskyTheme: public Theme loadMenuIcon(ICON_MONITOR_CHANNELS4, "mask_monitor_channels4.png"); loadMenuIcon(ICON_MONITOR_LOGICAL_SWITCHES, "mask_monitor_logsw.png"); - BitmapBuffer * background = BitmapBuffer::loadMask(getThemePath("mask_currentmenu_bg.png")); - BitmapBuffer * shadow = BitmapBuffer::loadMask(getThemePath("mask_currentmenu_shadow.png")); - BitmapBuffer * dot = BitmapBuffer::loadMask(getThemePath("mask_currentmenu_dot.png")); + BitmapBuffer * background = BitmapBuffer::loadMask(getFilePath("mask_currentmenu_bg.png")); + BitmapBuffer * shadow = BitmapBuffer::loadMask(getFilePath("mask_currentmenu_shadow.png")); + BitmapBuffer * dot = BitmapBuffer::loadMask(getFilePath("mask_currentmenu_dot.png")); if (!currentMenuBackground) { currentMenuBackground = new BitmapBuffer(BMP_RGB565, 36, 53); } + if (currentMenuBackground) { currentMenuBackground->drawSolidFilledRect(0, 0, currentMenuBackground->getWidth(), MENU_HEADER_HEIGHT, HEADER_BGCOLOR); currentMenuBackground->drawSolidFilledRect(0, MENU_HEADER_HEIGHT, currentMenuBackground->getWidth(), MENU_TITLE_TOP - MENU_HEADER_HEIGHT, TEXT_BGCOLOR); @@ -165,7 +166,7 @@ class FrskyTheme: public Theme } delete topleftBitmap; - topleftBitmap = BitmapBuffer::loadMaskOnBackground("topleft.png", TITLE_BGCOLOR, HEADER_BGCOLOR); + topleftBitmap = BitmapBuffer::loadMaskOnBackground(getFilePath("topleft.png"), TITLE_BGCOLOR, HEADER_BGCOLOR); delete background; delete shadow; @@ -176,31 +177,31 @@ class FrskyTheme: public Theme { // Calibration screen delete calibStick; - calibStick = BitmapBuffer::load(getThemePath("stick_pointer.png")); + calibStick = BitmapBuffer::load(getFilePath("stick_pointer.png")); delete calibStickBackground; - calibStickBackground = BitmapBuffer::load(getThemePath("stick_background.png")); + calibStickBackground = BitmapBuffer::load(getFilePath("stick_background.png")); delete calibTrackpBackground; - calibTrackpBackground = BitmapBuffer::load(getThemePath("trackp_background.png")); + calibTrackpBackground = BitmapBuffer::load(getFilePath("trackp_background.png")); delete calibRadioPict; #if defined(PCBX10) if(STICKS_PWM_ENABLED()) { - calibRadioPict = BitmapBuffer::load(getThemePath("X10S.bmp")); + calibRadioPict = BitmapBuffer::load(getFilePath("X10S.bmp")); } else { - calibRadioPict = BitmapBuffer::load(getThemePath("X10.bmp")); + calibRadioPict = BitmapBuffer::load(getFilePath("X10.bmp")); } #else - calibRadioPict = BitmapBuffer::load(getThemePath("horus.bmp")); + calibRadioPict = BitmapBuffer::load(getFilePath("horus.bmp")); #endif // Model Selection screen delete modelselIconBitmap; modelselIconBitmap = BitmapBuffer::loadMaskOnBackground("modelsel/mask_iconback.png", TITLE_BGCOLOR, TEXT_BGCOLOR); if (modelselIconBitmap) { - BitmapBuffer * bitmap = BitmapBuffer::load(getThemePath("modelsel/icon_default.png")); + BitmapBuffer * bitmap = BitmapBuffer::load(getFilePath("modelsel/icon_default.png")); modelselIconBitmap->drawBitmap(20, 8, bitmap); delete bitmap; } @@ -215,13 +216,13 @@ class FrskyTheme: public Theme modelselModelNameBitmap = BitmapBuffer::loadMaskOnBackground("modelsel/mask_modelname.png", TEXT_COLOR, TEXT_BGCOLOR); delete modelselModelMoveBackground; - modelselModelMoveBackground = BitmapBuffer::loadMask(getThemePath("modelsel/mask_moveback.png")); + modelselModelMoveBackground = BitmapBuffer::loadMask(getFilePath("modelsel/mask_moveback.png")); delete modelselModelMoveIcon; - modelselModelMoveIcon = BitmapBuffer::loadMask(getThemePath("modelsel/mask_moveico.png")); + modelselModelMoveIcon = BitmapBuffer::loadMask(getFilePath("modelsel/mask_moveico.png")); delete modelselWizardBackground; - modelselWizardBackground = BitmapBuffer::load(getThemePath("wizard/background.png")); + modelselWizardBackground = BitmapBuffer::load(getFilePath("wizard/background.png")); // Channels monitor screen delete chanMonLockedBitmap; @@ -256,10 +257,10 @@ class FrskyTheme: public Theme mixerSetupCurveBitmap = BitmapBuffer::loadMaskOnBackground("mask_textline_curve.png", TEXT_COLOR, TEXT_BGCOLOR); delete mixerSetupSwitchIcon; - mixerSetupSwitchIcon = BitmapBuffer::loadMask(getThemePath("mask_textline_switch.png")); + mixerSetupSwitchIcon = BitmapBuffer::loadMask(getFilePath("mask_textline_switch.png")); delete mixerSetupFlightmodeIcon; - mixerSetupFlightmodeIcon = BitmapBuffer::loadMask(getThemePath("mask_textline_fm.png")); + mixerSetupFlightmodeIcon = BitmapBuffer::loadMask(getFilePath("mask_textline_fm.png")); delete mixerSetupSlowBitmap; mixerSetupSlowBitmap = BitmapBuffer::loadMaskOnBackground("mask_textline_slow.png", TEXT_COLOR, TEXT_BGCOLOR); @@ -271,17 +272,17 @@ class FrskyTheme: public Theme mixerSetupDelaySlowBitmap = BitmapBuffer::loadMaskOnBackground("mask_textline_delayslow.png", TEXT_COLOR, TEXT_BGCOLOR); } - virtual void load() const override + void load() const override { loadColors(); - Theme::load(); + ThemeBase::load(); if (!backgroundBitmap) { - backgroundBitmap = BitmapBuffer::load(getThemePath("background.png")); + backgroundBitmap = BitmapBuffer::load(getFilePath("background.png")); } update(); } - virtual void update() const override + void update() const override { TRACE("TODO THEME::UPDATE()"); #if 0 @@ -320,12 +321,10 @@ class FrskyTheme: public Theme void drawMenuBackground(BitmapBuffer * dc, uint8_t icon, const char * title) const override { - dc->drawSolidFilledRect(0, 0, LCD_W, MENU_HEADER_HEIGHT, HEADER_BGCOLOR); - if (topleftBitmap) { dc->drawBitmap(0, 0, topleftBitmap); uint16_t width = topleftBitmap->getWidth(); - dc->drawSolidFilledRect(width, 0, LCD_W-width, MENU_HEADER_HEIGHT, HEADER_BGCOLOR); + dc->drawSolidFilledRect(width, 0, LCD_W - width, MENU_HEADER_HEIGHT, HEADER_BGCOLOR); } else { dc->drawSolidFilledRect(0, 0, LCD_W, MENU_HEADER_HEIGHT, HEADER_BGCOLOR); @@ -339,7 +338,7 @@ class FrskyTheme: public Theme dc->drawSolidFilledRect(0, MENU_HEADER_HEIGHT, LCD_W, MENU_TITLE_TOP - MENU_HEADER_HEIGHT, TEXT_BGCOLOR); // the white separation line dc->drawSolidFilledRect(0, MENU_TITLE_TOP, LCD_W, MENU_TITLE_HEIGHT, TITLE_BGCOLOR); // the title line background if (title) { - lcdDrawText(MENUS_MARGIN_LEFT, MENU_TITLE_TOP + 1, title, MENU_TITLE_COLOR); + dc->drawText(MENUS_MARGIN_LEFT, MENU_TITLE_TOP + 1, title, MENU_TITLE_COLOR); } drawMenuDatetime(dc); @@ -350,9 +349,9 @@ class FrskyTheme: public Theme return iconMask[index]; } - const BitmapBuffer * getIconButtonBitmap(uint8_t index, bool selected) const override + const BitmapBuffer * getIcon(uint8_t index, IconState state) const override { - return selected ? menuIconSelected[index] : menuIconNormal[index]; + return state == STATE_DEFAULT ? menuIconNormal[index] : menuIconSelected[index]; } void drawMenuHeader(BitmapBuffer * dc, std::vector & tabs, uint8_t currentIndex) const override @@ -373,17 +372,20 @@ class FrskyTheme: public Theme struct gtm t; gettime(&t); char str[10]; +#if defined(TRANSLATIONS_CN) + sprintf(str, "%d" TR_MONTH "%d", t.tm_mon + 1, t.tm_mday); +#else const char * const STR_MONTHS[] = TR_MONTHS; sprintf(str, "%d %s", t.tm_mday, STR_MONTHS[t.tm_mon]); - lcdDrawText(DATETIME_MIDDLE, DATETIME_LINE1, str, SMLSIZE|TEXT_INVERTED_COLOR|CENTERED); - +#endif + dc->drawText(DATETIME_MIDDLE, DATETIME_LINE1, str, SMLSIZE|TEXT_INVERTED_COLOR|CENTERED); getTimerString(str, getValue(MIXSRC_TX_TIME)); - lcdDrawText(DATETIME_MIDDLE, DATETIME_LINE2, str, SMLSIZE|TEXT_INVERTED_COLOR|CENTERED); + dc->drawText(DATETIME_MIDDLE, DATETIME_LINE2, str, SMLSIZE|TEXT_INVERTED_COLOR|CENTERED); } void drawProgressBar(BitmapBuffer * dc, coord_t x, coord_t y, coord_t w, coord_t h, int value) const override { - drawSolidRect(dc, x, y, w, h, 1, TEXT_COLOR); + dc->drawSolidRect(x, y, w, h, 1, TEXT_COLOR); if (value > 0) { int width = (w * value) / 100; dc->drawSolidFilledRect(x + 2, y + 2, width - 4, h - 4, SCROLLBOX_COLOR); @@ -409,5 +411,6 @@ BitmapBuffer * FrskyTheme::currentMenuBackground = nullptr; FrskyTheme frskyTheme; #if defined(PCBFRSKY) +ThemeBase * defaultTheme = &frskyTheme; Theme * theme = &frskyTheme; #endif diff --git a/radio/src/gui/libopenui/timeedit.cpp b/radio/src/gui/colorlcd/timeedit.cpp similarity index 95% rename from radio/src/gui/libopenui/timeedit.cpp rename to radio/src/gui/colorlcd/timeedit.cpp index a23e95f67..bf53cb269 100644 --- a/radio/src/gui/libopenui/timeedit.cpp +++ b/radio/src/gui/colorlcd/timeedit.cpp @@ -21,10 +21,7 @@ #include "libopenui_config.h" #include "timeedit.h" #include "keyboard_number.h" -#include "draw_functions.h" #include "strhelpers.h" -#include -#include TimeEdit::TimeEdit(Window * parent, const rect_t & rect, int32_t vmin, int32_t vmax, std::function getValue, std::function setValue, LcdFlags flags): BaseNumberEdit(parent, rect, vmin, vmax, getValue, setValue, flags) @@ -59,7 +56,7 @@ void TimeEdit::onKeyEvent(event_t event) if (value <= vmax) setValue(value); else - AUDIO_KEY_ERROR(); + onKeyError(); return; } else if (event == EVT_ROTARY_LEFT) { @@ -68,7 +65,7 @@ void TimeEdit::onKeyEvent(event_t event) if (value >= vmin) setValue(value); else - AUDIO_KEY_ERROR(); + onKeyError(); return; } } diff --git a/radio/src/gui/libopenui/timeedit.h b/radio/src/gui/colorlcd/timeedit.h similarity index 100% rename from radio/src/gui/libopenui/timeedit.h rename to radio/src/gui/colorlcd/timeedit.h diff --git a/radio/src/gui/colorlcd/view_main.cpp b/radio/src/gui/colorlcd/view_main.cpp index d649b14d0..af628d858 100644 --- a/radio/src/gui/colorlcd/view_main.cpp +++ b/radio/src/gui/colorlcd/view_main.cpp @@ -21,6 +21,7 @@ #include "view_main.h" #include "menu_model.h" #include "menu_radio.h" +#include "menu_screen.h" // #include "menu_screens.h" // #include "model_select.h" // #include "view_channels.h" @@ -177,12 +178,18 @@ void ViewMain::onKeyEvent(event_t event) new RadioMenu(); break; + case EVT_KEY_LONG(KEY_TELEM): + killEvents(event); + new ScreenMenu(); + break; + case EVT_KEY_LONG(KEY_ENTER): + killEvents(event); Menu * menu = new Menu(); menu->addLine(STR_MODEL_SELECT, [=]() { // new ModelselectMenu(); }); - if (1/*modelHasNotes()*/) { + if (modelHasNotes()) { menu->addLine(STR_VIEW_NOTES, [=]() { // TODO }); @@ -221,14 +228,11 @@ void ViewMain::onKeyEvent(event_t event) void ViewMain::checkEvents() { Window::checkEvents(); - - // TODO temporary for refreshing the trims - invalidate(); } void ViewMain::paint(BitmapBuffer * dc) { - theme->drawBackground(dc); + static_cast(theme)->drawBackground(dc); // drawMainPots(); diff --git a/radio/src/gui/colorlcd/widgets_container.h b/radio/src/gui/colorlcd/widgets_container.h index c2fbd9cdd..29d0f427e 100644 --- a/radio/src/gui/colorlcd/widgets_container.h +++ b/radio/src/gui/colorlcd/widgets_container.h @@ -109,10 +109,10 @@ class WidgetsContainer: public WidgetsContainerInterface char name[WIDGET_NAME_LEN + 1]; memset(name, 0, sizeof(name)); strncpy(name, persistentData->zones[i].widgetName, WIDGET_NAME_LEN); - widgets[i] = loadWidget(name, getZone(i), &persistentData->zones[i].widgetData); + // widgets[i] = loadWidget(name, getZone(i), &persistentData->zones[i].widgetData); } else { - widgets[i] = NULL; + widgets[i] = nullptr; } } } diff --git a/radio/src/gui/common/colorlcd/draw_functions.h b/radio/src/gui/common/colorlcd/draw_functions.h deleted file mode 100644 index 8f8ab6b3b..000000000 --- a/radio/src/gui/common/colorlcd/draw_functions.h +++ /dev/null @@ -1,40 +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 __COLORLCD_DRAW_FUNCTIONS__ -#define __COLORLCD_DRAW_FUNCTIONS__ - -#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); -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); -void drawFatalErrorScreen(const char * message); -void runFatalErrorScreen(const char * message); -void drawPower(coord_t x, coord_t y, int8_t dBm, LcdFlags att); -void lcdDrawMMM(coord_t x, coord_t y, LcdFlags flags); - -#if defined(FLIGHT_MODES) -void drawFlightMode(coord_t x, coord_t y, int8_t idx, LcdFlags att); -#endif - -#endif // __COLORLCD_DRAW_FUNCTIONS__ diff --git a/radio/src/gui/common/stdlcd/CMakeLists.txt b/radio/src/gui/common/stdlcd/CMakeLists.txt index 2da32d37a..a1c60a1e3 100644 --- a/radio/src/gui/common/stdlcd/CMakeLists.txt +++ b/radio/src/gui/common/stdlcd/CMakeLists.txt @@ -4,6 +4,7 @@ set(GUI_SRC ${GUI_SRC} ../common/stdlcd/menus.cpp ../common/stdlcd/draw_functions.cpp + ../common/stdlcd/fonts.cpp ../common/stdlcd/popups.cpp ../common/stdlcd/model_inputs.cpp ../common/stdlcd/model_mixes.cpp diff --git a/radio/src/gui/128x64/fonts.cpp b/radio/src/gui/common/stdlcd/fonts.cpp similarity index 97% rename from radio/src/gui/128x64/fonts.cpp rename to radio/src/gui/common/stdlcd/fonts.cpp index 5d1c02382..18f376bf2 100644 --- a/radio/src/gui/128x64/fonts.cpp +++ b/radio/src/gui/common/stdlcd/fonts.cpp @@ -18,7 +18,7 @@ * GNU General Public License for more details. */ -#include "opentx.h" +#include "fonts.h" const unsigned char font_5x7[] = { #include "font_05x07.lbm" @@ -43,13 +43,11 @@ const unsigned char font_5x7[] = { #endif }; -#if defined(BOLD_SPECIFIC_FONT) +#if !defined(BOOT) const unsigned char font_5x7_B[] = { #include "font_05x07_B_compressed.lbm" }; -#endif -#if !defined(BOOT) const unsigned char font_10x14[] = { #include "font_10x14_compressed.lbm" #if defined(TRANSLATIONS_DE) @@ -72,12 +70,11 @@ const unsigned char font_10x14[] = { #include "font_se_10x14.lbm" #endif }; -#endif -#if !defined(BOOT) const unsigned char font_3x5[] = { #include "font_03x05.lbm" }; + const unsigned char font_4x6[] = { #include "font_04x06.lbm" #if defined(TRANSLATIONS_DE) diff --git a/radio/src/fonts.h b/radio/src/gui/common/stdlcd/fonts.h similarity index 58% rename from radio/src/fonts.h rename to radio/src/gui/common/stdlcd/fonts.h index 466615691..ee880bb05 100644 --- a/radio/src/fonts.h +++ b/radio/src/gui/common/stdlcd/fonts.h @@ -21,39 +21,18 @@ #ifndef _FONTS_H_ #define _FONTS_H_ -#include "opentx.h" - -#if defined(COLORLCD) - -#if !defined(BOOT) -#define FONT_TABLE_SIZE 16 -#else -#define FONT_TABLE_SIZE 1 -#endif - -extern const uint16_t * const fontspecsTable[FONT_TABLE_SIZE]; -extern const uint8_t * fontsTable[FONT_TABLE_SIZE]; - -void loadFonts(); - -#else - extern const unsigned char font_5x7[]; extern const unsigned char font_10x14[]; -#if defined(BOLD_FONT) && !defined(BOOT) - #define BOLD_SPECIFIC_FONT +#if !defined(BOOT) extern const unsigned char font_5x7_B[]; -#endif - -extern const unsigned char font_3x5[]; -extern const unsigned char font_4x6[]; -extern const unsigned char font_8x10[]; -extern const unsigned char font_22x38_num[]; -extern const unsigned char font_5x7_extra[]; -extern const unsigned char font_10x14_extra[]; -extern const unsigned char font_4x6_extra[]; - + extern const unsigned char font_3x5[]; + extern const unsigned char font_4x6[]; + extern const unsigned char font_8x10[]; + extern const unsigned char font_22x38_num[]; + extern const unsigned char font_5x7_extra[]; + extern const unsigned char font_10x14_extra[]; + extern const unsigned char font_4x6_extra[]; #endif #endif // _FONTS_H_ diff --git a/radio/src/gui/common/stdlcd/popups.h b/radio/src/gui/common/stdlcd/popups.h index d094588dc..81fe81466 100644 --- a/radio/src/gui/common/stdlcd/popups.h +++ b/radio/src/gui/common/stdlcd/popups.h @@ -24,6 +24,7 @@ #include #include "audio.h" #include "lcd.h" +#include "keys.h" extern const char * warningText; extern const char * warningInfoText; diff --git a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp index 929a74792..ac59e220a 100644 --- a/radio/src/gui/common/stdlcd/radio_sdmanager.cpp +++ b/radio/src/gui/common/stdlcd/radio_sdmanager.cpp @@ -20,6 +20,7 @@ #include "opentx.h" #include "io/frsky_firmware_update.h" +#include "libopenui/src/libopenui_file.h" #define NODE_TYPE(fname) fname[SD_SCREEN_FILE_LENGTH+1] #define IS_DIRECTORY(fname) ((bool)(!NODE_TYPE(fname))) diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index 709de9fdf..aaeb23dec 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -837,7 +837,7 @@ const mm_protocol_definition multi_protocols[] = { {MODULE_SUBTYPE_MULTI_FY326, 1, false, STR_SUBTYPE_FY326, nullptr}, {MODULE_SUBTYPE_MULTI_SFHSS, 0, true, NO_SUBTYPE, STR_MULTI_RFTUNE}, {MODULE_SUBTYPE_MULTI_HONTAI, 3, false, STR_SUBTYPE_HONTAI, nullptr}, - {MODULE_SUBTYPE_MULTI_OLRS, 0, false, NO_SUBTYPE, STR_RFPOWER}, + {MODULE_SUBTYPE_MULTI_OLRS, 0, false, NO_SUBTYPE, STR_RF_POWER}, {MODULE_SUBTYPE_MULTI_FS_AFHDS2A, 3, true, STR_SUBTYPE_AFHDS2A, STR_MULTI_SERVOFREQ}, {MODULE_SUBTYPE_MULTI_Q2X2, 2, false, STR_SUBTYPE_Q2X2, nullptr}, {MODULE_SUBTYPE_MULTI_WK_2X01, 5, false, STR_SUBTYPE_WK2x01, nullptr}, diff --git a/radio/src/gui/libopenui/CMakeLists.txt b/radio/src/gui/libopenui/CMakeLists.txt deleted file mode 100644 index ffd7461cd..000000000 --- a/radio/src/gui/libopenui/CMakeLists.txt +++ /dev/null @@ -1,34 +0,0 @@ -set(LIBOPENUI_SRC - mainwindow.cpp - window.cpp - bitmapbuffer.cpp - button.cpp - draw_functions.cpp - checkbox.cpp - form.cpp - textedit.cpp - numberedit.cpp - timeedit.cpp - choice.cpp - tabsgroup.cpp - page.cpp - sourcechoice.cpp - switchchoice.cpp - filechoice.cpp - slider.cpp - progress.cpp - menu.cpp - dialog.cpp - curve.cpp - curveedit.cpp - # coloredit.cpp - ) - -if(HARDWARE_TOUCH) - set(LIBOPENUI_SRC - ${LIBOPENUI_SRC} - keyboard_text.cpp - keyboard_number.cpp - keyboard_curve.cpp - ) -endif() diff --git a/radio/src/gui/libopenui/LICENSE b/radio/src/gui/libopenui/LICENSE deleted file mode 100644 index 0a041280b..000000000 --- a/radio/src/gui/libopenui/LICENSE +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/radio/src/gui/libopenui/basenumberedit.h b/radio/src/gui/libopenui/basenumberedit.h deleted file mode 100644 index 9d11a809f..000000000 --- a/radio/src/gui/libopenui/basenumberedit.h +++ /dev/null @@ -1,105 +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 _BASENUMBEREDIT_H_ -#define _BASENUMBEREDIT_H_ - -#include "form.h" - -class BaseNumberEdit : public FormField { - public: - BaseNumberEdit(Window * parent, const rect_t &rect, int32_t vmin, int32_t vmax, - std::function getValue, std::function setValue = nullptr, LcdFlags flags = 0): - FormField(parent, rect), - vmin(vmin), - vmax(vmax), - _getValue(std::move(getValue)), - _setValue(std::move(setValue)), - flags(flags) - { - } - - void setMin(int32_t value) - { - vmin = value; - } - - void setMax(int32_t value) - { - vmax = value; - } - - void setDefault(int32_t value) - { - vdefault = value; - } - - int32_t getMin() const - { - return vmin; - } - - int32_t getMax() const - { - return vmax; - } - - int32_t getDefault() const - { - return vdefault; - } - - void setStep(int32_t value) - { - step = value; - } - - int32_t getStep() const - { - return step; - } - - void setValue(int32_t value) - { - _setValue(limit(vmin, value, vmax)); - invalidate(); - } - - void setSetValueHandler(std::function handler) - { - _setValue = handler; - } - - int32_t getValue() - { - return _getValue(); - } - - protected: - int32_t vdefault = 0; - int32_t vmin; - int32_t vmax; - int32_t step = 1; - std::function _getValue; - std::function _setValue; - LcdFlags flags; -}; - -#endif // _BASENUMBEREDIT_H_ diff --git a/radio/src/gui/libopenui/bitmapbuffer.cpp b/radio/src/gui/libopenui/bitmapbuffer.cpp deleted file mode 100644 index ff1f8b647..000000000 --- a/radio/src/gui/libopenui/bitmapbuffer.cpp +++ /dev/null @@ -1,878 +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 -#include "opentx.h" - -void BitmapBuffer::drawAlphaPixel(display_t * p, uint8_t opacity, uint16_t color) -{ - if (opacity == OPACITY_MAX) { - drawPixel(p, color); - } - else if (opacity != 0) { - uint8_t bgWeight = OPACITY_MAX - opacity; - RGB_SPLIT(color, red, green, blue); - RGB_SPLIT(*p, bgRed, bgGreen, bgBlue); - uint16_t r = (bgRed * bgWeight + red * opacity) / OPACITY_MAX; - uint16_t g = (bgGreen * bgWeight + green * opacity) / OPACITY_MAX; - uint16_t b = (bgBlue * bgWeight + blue * opacity) / OPACITY_MAX; - drawPixel(p, RGB_JOIN(r, g, b)); - } -} - -void BitmapBuffer::drawHorizontalLine(coord_t x, coord_t y, coord_t w, uint8_t pat, LcdFlags att) -{ - APPLY_OFFSET(); - - if (y >= height || y >= ymax || y < ymin) - return; - - if (x+w > width) { - w = width - x; - } - - display_t * p = getPixelPtr(x, y); - display_t color = lcdColorTable[COLOR_IDX(att)]; - uint8_t opacity = 0x0F - (att >> 24); - - if (pat == SOLID) { - while (w--) { - drawAlphaPixel(p, opacity, color); - MOVE_TO_NEXT_RIGHT_PIXEL(p); - } - } - else { - while (w--) { - if (pat & 1) { - drawAlphaPixel(p, opacity, color); - pat = (pat >> 1) | 0x80; - } - else { - pat = pat >> 1; - } - MOVE_TO_NEXT_RIGHT_PIXEL(p); - } - } -} - -void BitmapBuffer::drawVerticalLine(coord_t x, coord_t y, coord_t h, uint8_t pat, LcdFlags att) -{ - APPLY_OFFSET(); - - if (x < xmin || x >= xmax) - return; - - if (h < 0) { - y += h; - h = -h; - } - - if (y < ymin) { - h += y-ymin; - y = ymin; - } - - if (y + h > ymax) { - h = ymax - y; - } - - if (h <= 0) - return; - - display_t color = lcdColorTable[COLOR_IDX(att)]; - uint8_t opacity = 0x0F - (att >> 24); - - if (pat == SOLID) { - while (h--) { - drawAlphaPixel(x, y, opacity, color); - y++; - } - } - else { - if (pat==DOTTED && !(y%2)) { - pat = ~pat; - } - while (h--) { - if (pat & 1) { - drawAlphaPixel(x, y, opacity, color); - pat = (pat >> 1) | 0x80; - } - else { - pat = pat >> 1; - } - y++; - } - } -} - -void BitmapBuffer::drawRect(coord_t x, coord_t y, coord_t w, coord_t h, uint8_t thickness, uint8_t pat, LcdFlags att) -{ - for (int i=0; i= xmax || y >= ymax) - return; - - if (h < 0) { - y += h; - h = -h; - } - if (y < ymin) { - h += y-ymin; - y = ymin; - } - if (x < xmin) { - w += x - xmin; - x = xmin; - } - if (y + h > ymax) - h = ymax - y; - if (x + w > xmax) - w = xmax - x; - - if (!data || h<=0 || w<=0) - return; - - DMAFillRect(data, width, height, x, y, w, h, lcdColorTable[COLOR_IDX(flags)]); -} - -void BitmapBuffer::drawFilledRect(coord_t x, coord_t y, coord_t w, coord_t h, uint8_t pat, LcdFlags att) -{ - APPLY_OFFSET(); - - if (x >= xmax || y >= ymax) - return; - - if (h < 0) { - y += h; - h = -h; - } - if (y < ymin) { - h += y-ymin; - y = ymin; - } - if (x < xmin) { - w += x - xmin; - x = xmin; - } - if (y + h > ymax) - h = ymax - y; - if (x + w > xmax) - w = xmax - x; - - for (coord_t i=y; i= 360 || endAngle <= 0) - return false; - - if (startAngle == 0) { - slopes[1] = 100000; - slopes[2] = -100000; - } - else { - float angle1 = float(startAngle) * (M_PI / 180.0f); - if (startAngle >= 180) { - slopes[1] = -100000; - slopes[2] = cosf(angle1) * 100 / sinf(angle1); - } - else { - slopes[1] = cosf(angle1) * 100 / sinf(angle1); - slopes[2] = -100000; - } - } - - if (endAngle == 360) { - slopes[0] = -100000; - slopes[3] = 100000; - } - else { - float angle2 = float(endAngle) * (M_PI / 180.0f); - if (endAngle >= 180) { - slopes[0] = -100000; - slopes[3] = -cosf(angle2) * 100 / sinf(angle2); - } - else { - slopes[0] = cosf(angle2) * 100 / sinf(angle2); - slopes[3] = -100000; - } - } - - return true; -} - -void BitmapBuffer::drawPie(int x0, int y0, int radius, int startAngle, int endAngle) -{ - int slopes[4]; - if (!evalSlopes(slopes, startAngle, endAngle)) - return; - - for (int y=0; y<=radius; y++) { - for (int x=0; x<=radius; x++) { - if (x*x+y*y <= radius*radius) { - int slope = (x==0 ? (y<0 ? -99000 : 99000) : y*100/x); - if (slope >= slopes[0] && slope < slopes[1]) { - drawPixel(x0+x, y0-y, WHITE); - } - if (-slope >= slopes[0] && -slope < slopes[1]) { - drawPixel(x0+x, y0+y, WHITE); - } - if (slope >= slopes[2] && slope < slopes[3]) { - drawPixel(x0-x, y0-y, WHITE); - } - if (-slope >= slopes[2] && -slope < slopes[3]) { - drawPixel(x0-x, y0+y, WHITE); - } - } - } - } -} - -void BitmapBuffer::drawMask(coord_t x, coord_t y, const BitmapBuffer * mask, LcdFlags flags, coord_t offset, coord_t width) -{ - if (mask == nullptr) { - return; - } - - APPLY_OFFSET(); - - coord_t w = mask->getWidth(); - coord_t height = mask->getHeight(); - - if (!width || width > w) { - width = w; - } - - if (x + width > xmax) { - width = xmax - x; - } - - if (y >= ymax || x >= xmax || width <= 0 || x + width < xmin || y + height < ymin) { - return; - } - - display_t color = lcdColorTable[COLOR_IDX(flags)]; - - for (coord_t row=0; row= ymax) - continue; - display_t * p = getPixelPtr(x, y+row); - const display_t * q = mask->getPixelPtr(offset, row); - for (coord_t col=0; col w) { - width = w; - } - - if (x + width > xmax) { - width = xmax - x; - } - - if (y >= ymax || x >= xmax || width <= 0 || x + width < xmin || y + height < ymin) { - return; - } - - display_t color = lcdColorTable[COLOR_IDX(flags)]; - - for (coord_t row=0; row= ymax) - continue; - const uint8_t * q = bmp + 4 + row*w + offset; - for (coord_t col=0; col= xmin && xpixel < xmax) { - display_t * p = getPixelPtr(xpixel, ypixel); - if (p) - drawAlphaPixel(p, *q, color); - } - q++; - } - } -} - -uint8_t BitmapBuffer::drawChar(coord_t x, coord_t y, const uint8_t * font, const uint16_t * spec, int index, LcdFlags flags) -{ - coord_t offset = spec[index + 1]; - coord_t width = spec[index + 2] - offset; - if (width > 0) { - drawBitmapPattern(x, y, font, flags, offset, width); - } - return width; -} - -void BitmapBuffer::drawSizedText(coord_t x, coord_t y, const char * s, uint8_t len, LcdFlags flags) -{ - MOVE_OFFSET(); - -#define INCREMENT_POS(delta) \ - do { if (flags & VERTICAL) y -= delta; else x += delta; } while(0) - - int width = getTextWidth(s, len, flags); - int height = getFontHeight(flags); - - if (y + height <= ymin || y >= ymax) { - RESTORE_OFFSET(); - return; - } - - uint32_t fontindex = FONTINDEX(flags); - const unsigned char * font = fontsTable[fontindex]; - const uint16_t * fontspecs = fontspecsTable[fontindex]; - - if (flags & RIGHT) { - INCREMENT_POS(-width); - } - else if (flags & CENTERED) { - INCREMENT_POS(-width/2); - } - - coord_t & pos = (flags & VERTICAL) ? y : x; - - bool setpos = false; - const coord_t orig_pos = pos; - while (len--) { -#if defined(BOOT) - unsigned char c = *s; -#else - unsigned char c = (flags & ZCHAR) ? zchar2char(*s) : *s; -#endif - if (setpos) { - pos = c; - setpos = false; - } - else if (!c) { - break; - } - else if (c >= 0x20) { - uint8_t width; - width = drawChar(x-1, y, font, fontspecs, getMappedChar(c), flags); - INCREMENT_POS(width); - } - else if (c == 0x1F) { // X-coord prefix - setpos = true; - } - else if (c == 0x1E) { - pos = orig_pos; - if (flags & VERTICAL) - x += height; - else - y += height; - } - else if (c == 1) { - INCREMENT_POS(1); - } - else { - INCREMENT_POS(2*(c-1)); - } - s++; - } - lcdNextPos = pos - offsetX; - - RESTORE_OFFSET(); -} - -void BitmapBuffer::drawBitmapPie(int x0, int y0, const uint16_t * img, int startAngle, int endAngle) -{ - const uint16_t * q = img; - coord_t width = *q++; - coord_t height = *q++; - - int slopes[4]; - if (!evalSlopes(slopes, startAngle, endAngle)) - return; - - int w2 = width/2; - int h2 = height/2; - - for (int y=h2-1; y>=0; y--) { - for (int x=w2-1; x>=0; x--) { - int slope = (x==0 ? 99000 : y*100/x); - if (slope >= slopes[0] && slope < slopes[1]) { - *getPixelPtr(x0+w2+x, y0+h2-y) = q[(h2-y)*width + w2+x]; - } - if (-slope >= slopes[0] && -slope < slopes[1]) { - *getPixelPtr(x0+w2+x, y0+h2+y) = q[(h2+y)*width + w2+x]; - } - if (slope >= slopes[2] && slope < slopes[3]) { - *getPixelPtr(x0+w2-x, y0+h2-y) = q[(h2-y)*width + w2-x]; - } - if (-slope >= slopes[2] && -slope < slopes[3]) { - *getPixelPtr(x0+w2-x, y0+h2+y) = q[(h2+y)*width + w2-x]; - } - } - } -} - -void BitmapBuffer::drawBitmapPatternPie(coord_t x0, coord_t y0, const uint8_t * img, LcdFlags flags, int startAngle, int endAngle) -{ - coord_t width = *((uint16_t *)img); - coord_t height = *(((uint16_t *)img)+1); - const uint8_t * q = img+4; - - int slopes[4]; - if (!evalSlopes(slopes, startAngle, endAngle)) - return; - - display_t color = lcdColorTable[COLOR_IDX(flags)]; - - int w2 = width/2; - int h2 = height/2; - - for (int y=h2-1; y>=0; y--) { - for (int x=w2-1; x>=0; x--) { - int slope = (x==0 ? (y<0 ? -99000 : 99000) : y*100/x); - if (slope >= slopes[0] && slope < slopes[1]) { - drawAlphaPixel(x0+w2+x, y0+h2-y, q[(h2-y)*width + w2+x], color); - } - if (-slope >= slopes[0] && -slope < slopes[1]) { - drawAlphaPixel(x0+w2+x, y0+h2+y, q[(h2+y)*width + w2+x], color); - } - if (slope >= slopes[2] && slope < slopes[3]) { - drawAlphaPixel(x0+w2-x, y0+h2-y, q[(h2-y)*width + w2-x], color); - } - if (-slope >= slopes[2] && -slope < slopes[3]) { - drawAlphaPixel(x0+w2-x, y0+h2+y, q[(h2+y)*width + w2-x], color); - } - } - } -} - -BitmapBuffer * BitmapBuffer::load(const char * filename) -{ - const char * ext = getFileExtension(filename); - if (ext && !strcmp(ext, ".bmp")) - return load_bmp(filename); - else - return load_stb(filename); -} - -BitmapBuffer * BitmapBuffer::loadMask(const char * filename) -{ - BitmapBuffer * bitmap = BitmapBuffer::load(filename); - if (bitmap) { - display_t * p = bitmap->getPixelPtr(0, 0); - for (int i = bitmap->getWidth() * bitmap->getHeight(); i > 0; i--) { - *((uint8_t *)p) = OPACITY_MAX - ((*p) >> 12); - MOVE_TO_NEXT_RIGHT_PIXEL(p); - } - } - return bitmap; -} - -BitmapBuffer * BitmapBuffer::loadMaskOnBackground(const char * filename, LcdFlags foreground, LcdFlags background) -{ - BitmapBuffer * result = nullptr; - BitmapBuffer * mask = BitmapBuffer::loadMask(getThemePath(filename)); - if (mask) { - result = new BitmapBuffer(BMP_RGB565, mask->getWidth(), mask->getHeight()); - if (result) { - result->clear(background); - result->drawMask(0, 0, mask, foreground); - } - delete mask; - } - return result; -} - -FIL imgFile __DMA; - -BitmapBuffer * BitmapBuffer::load_bmp(const char * filename) -{ - UINT read; - uint8_t palette[16]; - uint8_t bmpBuf[LCD_W]; /* maximum with LCD_W */ - uint8_t * buf = &bmpBuf[0]; - - FRESULT result = f_open(&imgFile, filename, FA_OPEN_EXISTING | FA_READ); - if (result != FR_OK) { - return nullptr; - } - - if (f_size(&imgFile) < 14) { - f_close(&imgFile); - return nullptr; - } - - result = f_read(&imgFile, buf, 14, &read); - if (result != FR_OK || read != 14) { - f_close(&imgFile); - return nullptr; - } - - if (buf[0] != 'B' || buf[1] != 'M') { - f_close(&imgFile); - return nullptr; - } - - uint32_t fsize = *((uint32_t *)&buf[2]); - uint32_t hsize = *((uint32_t *)&buf[10]); /* header size */ - - uint32_t len = limit((uint32_t)4, (uint32_t)(hsize-14), (uint32_t)32); - result = f_read(&imgFile, buf, len, &read); - if (result != FR_OK || read != len) { - f_close(&imgFile); - return nullptr; - } - - uint32_t ihsize = *((uint32_t *)&buf[0]); /* more header size */ - - /* invalid header size */ - if (ihsize + 14 > hsize) { - f_close(&imgFile); - return nullptr; - } - - /* sometimes file size is set to some headers size, set a real size in that case */ - if (fsize == 14 || fsize == ihsize + 14) - fsize = f_size(&imgFile) - 2; - - /* declared file size less than header size */ - if (fsize <= hsize) { - f_close(&imgFile); - return nullptr; - } - - uint32_t w, h; - - switch (ihsize){ - case 40: // windib - case 56: // windib v3 - case 64: // OS/2 v2 - case 108: // windib v4 - case 124: // windib v5 - w = *((uint32_t *)&buf[4]); - h = *((uint32_t *)&buf[8]); - buf += 12; - break; - case 12: // OS/2 v1 - w = *((uint16_t *)&buf[4]); - h = *((uint16_t *)&buf[6]); - buf += 8; - break; - default: - f_close(&imgFile); - return nullptr; - } - - if (*((uint16_t *)&buf[0]) != 1) { /* planes */ - f_close(&imgFile); - return nullptr; - } - - uint16_t depth = *((uint16_t *)&buf[2]); - - buf = &bmpBuf[0]; - - if (depth == 4) { - if (f_lseek(&imgFile, hsize-64) != FR_OK || f_read(&imgFile, buf, 64, &read) != FR_OK || read != 64) { - f_close(&imgFile); - return nullptr; - } - for (uint8_t i=0; i<16; i++) { - palette[i] = buf[4*i]; - } - } - else { - if (f_lseek(&imgFile, hsize) != FR_OK) { - f_close(&imgFile); - return nullptr; - } - } - - BitmapBuffer * bmp = new BitmapBuffer(BMP_RGB565, w, h); - if (bmp == nullptr || bmp->getData() == nullptr) { - f_close(&imgFile); - return nullptr; - } - - uint32_t rowSize; - bool hasAlpha = false; - - switch (depth) { - case 32: - for (int i=h-1; i>=0; i--) { - display_t * dst = bmp->getPixelPtr(0, i); - for (unsigned int j=0; j> 24) & 0xff, (pixel >> 16) & 0xff, (pixel >> 8) & 0xff); - } - else { - if ((pixel & 0xff) == 0xff) { - *dst = RGB(pixel >> 24, (pixel >> 16) & 0xff, (pixel >> 8) & 0xff); - } - else { - hasAlpha = true; - bmp->setFormat(BMP_ARGB4444); - for (display_t * p = bmp->getPixelPtr(j, i); p != bmp->getPixelPtr(0, h); MOVE_TO_NEXT_RIGHT_PIXEL(p)) { - display_t tmp = *p; - *p = ((tmp >> 1) & 0x0f) + (((tmp >> 7) & 0x0f) << 4) + (((tmp >> 12) & 0x0f) << 8); - } - *dst = ARGB(pixel & 0xff, (pixel >> 24) & 0xff, (pixel >> 16) & 0xff, (pixel >> 8) & 0xff); - } - } - MOVE_TO_NEXT_RIGHT_PIXEL(dst); - } - } - break; - - case 1: - break; - - case 4: - rowSize = ((4*w+31)/32)*4; - for (int32_t i=h-1; i>=0; i--) { - result = f_read(&imgFile, buf, rowSize, &read); - if (result != FR_OK || read != rowSize) { - f_close(&imgFile); - delete bmp; - return nullptr; - } - display_t * dst = bmp->getPixelPtr(0, i); - for (uint32_t j=0; j> ((j & 1) ? 0 : 4)) & 0x0F; - uint8_t val = palette[index]; - *dst = RGB(val, val, val); - MOVE_TO_NEXT_RIGHT_PIXEL(dst); - } - } - break; - - default: - f_close(&imgFile); - delete bmp; - return nullptr; - } - - f_close(&imgFile); - return bmp; -} - -#define STB_IMAGE_IMPLEMENTATION -#define STBI_ONLY_PNG -#define STBI_ONLY_JPEG -#define STBI_ONLY_BMP -#define STBI_ONLY_GIF -#define STBI_NO_STDIO -#define STBI_NO_HDR -#define STBI_NO_LINEAR - -// #define TRACE_STB_MALLOC - -#if defined(TRACE_STB_MALLOC) -#define STBI_MALLOC(sz) stb_malloc(sz) -#define STBI_REALLOC_SIZED(p,oldsz,newsz) stb_realloc(p,oldsz,newsz) -#define STBI_FREE(p) stb_free(p) - -void * stb_malloc(unsigned int size) -{ - void * res = malloc(size); - TRACE("malloc %d = %p", size, res); - return res; -} - -void stb_free(void *ptr) -{ - TRACE("free %p", ptr); - free(ptr); -} - -void *stb_realloc(void *ptr, unsigned int oldsz, unsigned int newsz) -{ - void * res = realloc(ptr, newsz); - TRACE("realloc %p, %d -> %d = %p", ptr, oldsz, newsz, res); - return res; -} -#endif // #if defined(TRACE_STB_MALLOC) - -#include "thirdparty/Stb/stb_image.h" - -// fill 'data' with 'size' bytes. return number of bytes actually read -int stbc_read(void *user, char *data, int size) -{ - FIL * fp = (FIL *)user; - UINT br = 0; - FRESULT res = f_read(fp, data, size, &br); - if (res == FR_OK) { - return (int)br; - } - return 0; -} - -// skip the next 'n' bytes, or 'unget' the last -n bytes if negative -void stbc_skip(void *user, int n) -{ - FIL * fp = (FIL *)user; - f_lseek(fp, f_tell(fp) + n); -} - -// returns nonzero if we are at end of file/data -int stbc_eof(void *user) -{ - FIL * fp = (FIL *)user; - int res = f_eof(fp); - return res; -} - -// callbacks for stb-image -const stbi_io_callbacks stbCallbacks = { - stbc_read, - stbc_skip, - stbc_eof -}; - -BitmapBuffer * BitmapBuffer::load_stb(const char * filename) -{ - FRESULT result = f_open(&imgFile, filename, FA_OPEN_EXISTING | FA_READ); - if (result != FR_OK) { - return nullptr; - } - - int w, h, n; - unsigned char * img = stbi_load_from_callbacks(&stbCallbacks, &imgFile, &w, &h, &n, 4); - f_close(&imgFile); - - if (!img) { - return nullptr; - } - - // convert to RGB565 or ARGB4444 format - BitmapBuffer * bmp = new BitmapBuffer(n == 4 ? BMP_ARGB4444 : BMP_RGB565, w, h); - if (bmp == NULL) { - TRACE("load_stb() malloc failed"); - stbi_image_free(img); - return nullptr; - } - -#if 0 - DMABitmapConvert(bmp->data, img, w, h, n == 4 ? DMA2D_ARGB4444 : DMA2D_RGB565); -#else - display_t * dest = bmp->getPixelPtr(0, 0); - const uint8_t * p = img; - if (n == 4) { - for (int row = 0; row < h; ++row) { - for (int col = 0; col < w; ++col) { - *dest = ARGB(p[3], p[0], p[1], p[2]); - MOVE_TO_NEXT_RIGHT_PIXEL(dest); - p += 4; - } - } - } - else { - for (int row = 0; row < h; ++row) { - for (int col = 0; col < w; ++col) { - *dest = RGB(p[0], p[1], p[2]); - MOVE_TO_NEXT_RIGHT_PIXEL(dest); - p += 4; - } - } - } -#endif - - stbi_image_free(img); - return bmp; -} diff --git a/radio/src/gui/libopenui/bitmapbuffer.h b/radio/src/gui/libopenui/bitmapbuffer.h deleted file mode 100644 index adf460051..000000000 --- a/radio/src/gui/libopenui/bitmapbuffer.h +++ /dev/null @@ -1,443 +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 _BITMAP_BUFFER_H_ -#define _BITMAP_BUFFER_H_ - -#include -#include -#include "libopenui_types.h" -#include "colors.h" -#include "board.h" -#include "debug.h" -#include "opentx_types.h" -#include "rle.h" - -#define MOVE_OFFSET() coord_t offsetX = this->offsetX; x += offsetX; this->offsetX = 0; coord_t offsetY = this->offsetY; y += offsetY; this->offsetY = 0 -#define APPLY_OFFSET() x += offsetX; y += offsetY -#define RESTORE_OFFSET() this->offsetX = offsetX, this->offsetY = offsetY - -#if defined(PCBX10) && !defined(SIMU) - #define MOVE_PIXEL_RIGHT(p, count) p -= count -#else - #define MOVE_PIXEL_RIGHT(p, count) p += count -#endif - -#define MOVE_TO_NEXT_RIGHT_PIXEL(p) MOVE_PIXEL_RIGHT(p, 1) - - -#define USE_STB - -typedef uint16_t display_t; - -enum BitmapFormats -{ - BMP_RGB565, - BMP_ARGB4444 -}; - -template -class BitmapBufferBase -{ - public: - BitmapBufferBase(uint8_t format, uint16_t width, uint16_t height, T * data): - format(format), - width(width), - height(height), - xmax(width), - ymax(height), - data(data), - data_end(data + (width * height)) - { - } - - BitmapBufferBase(uint8_t format, T * data): - format(format), - width(*((uint16_t*)data)), - height(*(((uint16_t*)data) + 1)), - xmax(width), - ymax(height), - data(data + 2), - data_end(data + 2 + (width * height)) - { - } - - inline void clearClippingRect() - { - xmin = 0; - xmax = width; - ymin = 0; - ymax = height; - } - - inline void setClippingRect(coord_t xmin, coord_t xmax, coord_t ymin, coord_t ymax) - { - this->xmin = xmin; - this->xmax = xmax; - this->ymin = ymin; - this->ymax = ymax; - } - - inline void getClippingRect(coord_t & xmin, coord_t & xmax, coord_t & ymin, coord_t & ymax) - { - xmin = this->xmin; - xmax = this->xmax; - ymin = this->ymin; - ymax = this->ymax; - } - - inline void setOffset(coord_t offsetX, coord_t offsetY) - { - this->offsetX = offsetX; - this->offsetY = offsetY; - } - - coord_t getOffsetX() const - { - return offsetX; - } - - coord_t getOffsetY() const - { - return offsetY; - } - - inline uint8_t getFormat() const - { - return format; - } - - inline uint16_t getWidth() const - { - return width; - } - - inline uint16_t getHeight() const - { - return height; - } - - inline T * getData() const - { - return data; - } - - uint32_t getDataSize() const - { - return width * height * sizeof(T); - } - - inline const display_t * getPixelPtr(coord_t x, coord_t y) const - { -#if defined(PCBX10) && !defined(SIMU) - x = width - x - 1; - y = height - y - 1; -#endif - return &data[y*width + x]; - } - - protected: - uint8_t format; - coord_t width; - coord_t height; - coord_t xmin = 0; - coord_t xmax; - coord_t ymin = 0; - coord_t ymax; - coord_t offsetX = 0; - coord_t offsetY = 0; - T * data; - T * data_end; -}; - -typedef BitmapBufferBase Bitmap; - -class RLEBitmap: - public BitmapBufferBase -{ - public: - RLEBitmap(uint8_t format, const uint8_t* rle_data) - : BitmapBufferBase(format, 0, 0, nullptr) - { - width = *((uint16_t *)rle_data); - height = *(((uint16_t *)rle_data)+1); - uint32_t pixels = width * height; - data = (uint16_t*)malloc(pixels * sizeof(uint16_t)); - rle_decode_8bit((uint8_t*)data, pixels * sizeof(uint16_t), rle_data+4); - data_end = data + pixels; - } - - ~RLEBitmap() - { - free(data); - } -}; - -class BitmapBuffer: public BitmapBufferBase -{ - private: - bool dataAllocated; -#if defined(DEBUG) - bool leakReported; -#endif - - public: - - BitmapBuffer(uint8_t format, uint16_t width, uint16_t height): - BitmapBufferBase(format, width, height, nullptr), - dataAllocated(true) -#if defined(DEBUG) - , leakReported(false) -#endif - { - data = (uint16_t *)malloc(width*height*sizeof(uint16_t)); - data_end = data + (width * height); - } - - BitmapBuffer(uint8_t format, uint16_t width, uint16_t height, uint16_t * data): - BitmapBufferBase(format, width, height, data), - dataAllocated(false) -#if defined(DEBUG) - , leakReported(false) -#endif - { - } - - ~BitmapBuffer() - { - if (dataAllocated) { - free(data); - } - } - - inline void setFormat(uint8_t format) - { - this->format = format; - } - - inline void clear(LcdFlags flags=0) - { - drawSolidFilledRect(0, 0, width - offsetX, height - offsetY, flags); - } - - inline void drawPixel(display_t * p, display_t value) - { - if (data && (data <= p || p < data_end)) { - *p = value; - } -#if defined(DEBUG) - else if (!leakReported) { - leakReported = true; - TRACE("BitmapBuffer(%p).drawPixel(): buffer overrun, data: %p, written at: %p", this, data, p); - } -#endif - } - - inline const display_t * getPixelPtr(coord_t x, coord_t y) const - { -#if defined(PCBX10) && !defined(SIMU) - x = width - x - 1; - y = height - y - 1; -#endif - return &data[y*width + x]; - } - - inline display_t * getPixelPtr(coord_t x, coord_t y) - { -#if defined(PCBX10) && !defined(SIMU) - x = width - x - 1; - y = height - y - 1; -#endif - return &data[y*width + x]; - } - - inline void drawPixel(coord_t x, coord_t y, display_t value) - { - display_t * p = getPixelPtr(x, y); - drawPixel(p, value); - } - - void drawAlphaPixel(display_t * p, uint8_t opacity, uint16_t color); - - inline void drawAlphaPixel(coord_t x, coord_t y, uint8_t opacity, uint16_t color) - { - display_t * p = getPixelPtr(x, y); - drawAlphaPixel(p, opacity, color); - } - - void drawHorizontalLine(coord_t x, coord_t y, coord_t w, uint8_t pat, LcdFlags att); - - void drawVerticalLine(coord_t x, coord_t y, coord_t h, uint8_t pat, LcdFlags att); - - inline void drawSolidHorizontalLine(coord_t x, coord_t y, coord_t w, LcdFlags att) - { - drawSolidFilledRect(x, y, w, 1, att); - } - - inline void drawSolidVerticalLine(coord_t x, coord_t y, coord_t h, LcdFlags att) - { - drawSolidFilledRect(x, y, 1, h, att); - } - - void drawRect(coord_t x, coord_t y, coord_t w, coord_t h, uint8_t thickness, uint8_t pat, LcdFlags att); - - void drawSolidFilledRect(coord_t x, coord_t y, coord_t w, coord_t h, LcdFlags flags); - - void drawFilledRect(coord_t x, coord_t y, coord_t w, coord_t h, uint8_t pat, LcdFlags att); - - void invertRect(coord_t x, coord_t y, coord_t w, coord_t h, LcdFlags att); - - void drawCircle(int x0, int y0, int radius); - - void drawPie(int x0, int y0, int radius, int startAngle, int endAngle); - - void drawBitmapPie(int x0, int y0, const uint16_t * img, int startAngle, int endAngle); - - void drawBitmapPatternPie(coord_t x0, coord_t y0, const uint8_t * img, LcdFlags flags, int startAngle, int endAngle); - - static BitmapBuffer * load(const char * filename); - - static BitmapBuffer * loadMask(const char * filename); - - static BitmapBuffer * loadMaskOnBackground(const char * filename, LcdFlags foreground, LcdFlags background); - - void drawMask(coord_t x, coord_t y, const BitmapBuffer * mask, LcdFlags flags, coord_t offset=0, coord_t width=0); - - void drawBitmapPattern(coord_t x, coord_t y, const uint8_t * bmp, LcdFlags flags, coord_t offset=0, coord_t width=0); - - uint8_t drawChar(coord_t x, coord_t y, const uint8_t * font, const uint16_t * spec, int index, LcdFlags flags); - - void drawSizedText(coord_t x, coord_t y, const char * s, uint8_t len, LcdFlags flags=0); - - void drawText(coord_t x, coord_t y, const char * s, LcdFlags flags=0) - { - drawSizedText(x, y, s, 255, flags); - } - - template - void drawBitmap(coord_t x, coord_t y, const T * bmp, coord_t srcx=0, coord_t srcy=0, coord_t w=0, coord_t h=0, float scale=0) - { - APPLY_OFFSET(); - - if (x >= xmax) return; - if (y >= ymax) return; - - if (!data || !bmp) - return; - - coord_t srcw = bmp->getWidth(); - coord_t srch = bmp->getHeight(); - - if (w == 0) - w = srcw; - if (h == 0) - h = srch; - if (srcx + w > srcw) - w = srcw - srcx; - if (srcy + h > srch) - h = srch - srcy; - - if (x < xmin) { - w += x-xmin; - srcx -= x-xmin; - x = xmin; - } - - if (y < ymin) { - h += y-ymin; - srcy -= y-ymin; - y = ymin; - } - - if (x + w > xmax) { - w = xmax - x; - } - - if (y + h > ymax) { - h = ymax - y; - } - - if (w <= 0 || h <= 0) - return; - - // TRACE("x=%d xmin=%d xmax=%d w=%d", x, xmin, xmax, w); - - if (scale == 0) { - /*if (x + w > width) { - w = width - x; - } - if (y + h > height) { - h = height - y; - }*/ - if (bmp->getFormat() == BMP_ARGB4444) { - DMACopyAlphaBitmap(data, width, height, x, y, bmp->getData(), srcw, srch, srcx, srcy, w, h); - } - else { - DMACopyBitmap(data, width, height, x, y, bmp->getData(), srcw, srch, srcx, srcy, w, h); - } - } - else { - int scaledw = w * scale; - int scaledh = h * scale; - - if (x + scaledw > width) - scaledw = width - x; - if (y + scaledh > height) - scaledh = height - y; - - for (int i = 0; i < scaledh; i++) { - display_t * p = getPixelPtr(x, y + i); - const display_t * qstart = bmp->getPixelPtr(srcx, srcy + int(i / scale)); - for (int j = 0; j < scaledw; j++) { - const display_t * q = qstart; - MOVE_PIXEL_RIGHT(q, int(j / scale)); - if (bmp->getFormat() == BMP_ARGB4444) { - ARGB_SPLIT(*q, a, r, g, b); - drawAlphaPixel(p, a, RGB_JOIN(r<<1, g<<2, b<<1)); - } - else { - drawPixel(p, *q); - } - MOVE_TO_NEXT_RIGHT_PIXEL(p); - } - } - } - } - - template - void drawScaledBitmap(const T * bitmap, coord_t x, coord_t y, coord_t w, coord_t h) - { - float vscale = float(h) / bitmap->getHeight(); - float hscale = float(w) / bitmap->getWidth(); - float scale = vscale < hscale ? vscale : hscale; - - int xshift = (w - (bitmap->getWidth() * scale)) / 2; - int yshift = (h - (bitmap->getHeight() * scale)) / 2; - drawBitmap(x + xshift, y + yshift, bitmap, 0, 0, 0, 0, scale); - } - - protected: - static BitmapBuffer * load_bmp(const char * filename); - static BitmapBuffer * load_stb(const char * filename); -}; - -extern BitmapBuffer * lcd; - -#endif // _BITMAP_BUFFER_H_ diff --git a/radio/src/gui/libopenui/button.cpp b/radio/src/gui/libopenui/button.cpp deleted file mode 100644 index 927e4041f..000000000 --- a/radio/src/gui/libopenui/button.cpp +++ /dev/null @@ -1,139 +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 -#include "button.h" -#include "draw_functions.h" -#include "lcd.h" -#include "theme.h" - -void Button::onPress() -{ - bool check = (pressHandler && pressHandler()); - if (check != bool(flags & BUTTON_CHECKED)) { - flags ^= BUTTON_CHECKED; - invalidate(); - } -} - -#if defined(HARDWARE_KEYS) -void Button::onKeyEvent(event_t event) -{ - TRACE_WINDOWS("%s received event 0x%X", getWindowDebugString().c_str(), event); - - if (event == EVT_KEY_BREAK(KEY_ENTER)) { - onPress(); - } - else { - FormField::onKeyEvent(event); - } -} -#endif - -#if defined(HARDWARE_TOUCH) -bool Button::onTouchEnd(coord_t x, coord_t y) -{ - if (enabled()) { - onPress(); - if (!(flags & BUTTON_NOFOCUS)) { - setFocus(); - } - } - return true; -} -#endif - -void Button::checkEvents() -{ - Window::checkEvents(); - if (checkHandler) - checkHandler(); -} - -void TextButton::paint(BitmapBuffer * dc) -{ - FormField::paint(dc); - - LcdFlags textColor = TEXT_COLOR; - - if (checked()) { - if (hasFocus()) { - drawSolidRect(dc, 0, 0, rect.w, rect.h, 2, TEXT_INVERTED_BGCOLOR); - dc->drawSolidFilledRect(3, 3, rect.w - 6, rect.h - 6, TEXT_INVERTED_BGCOLOR); - } - else { - drawSolidRect(dc, 0, 0, rect.w, rect.h, 1, CURVE_AXIS_COLOR); - dc->drawSolidFilledRect(2, 2, rect.w - 4, rect.h - 4, TEXT_INVERTED_BGCOLOR); - } - textColor = TEXT_INVERTED_COLOR; - } - else { - if (flags & BUTTON_BACKGROUND) { - if (hasFocus()) { - drawSolidRect(dc, 0, 0, rect.w, rect.h, 2, TEXT_INVERTED_BGCOLOR); - dc->drawSolidFilledRect(2, 2, rect.w - 4, rect.h - 4, CURVE_AXIS_COLOR); - } - else { - dc->drawSolidFilledRect(0, 0, rect.w, rect.h, CURVE_AXIS_COLOR); - } - } - else { - if (hasFocus()) { - drawSolidRect(dc, 0, 0, rect.w, rect.h, 2, TEXT_INVERTED_BGCOLOR); - } - else { - drawSolidRect(dc, 0, 0, rect.w, rect.h, 1, CURVE_AXIS_COLOR); - } - } - } - - dc->drawText(rect.w / 2, (rect.h - getFontHeight(flags)) / 2, text.c_str(), CENTERED | textColor); -} - -const uint8_t __alpha_button_on[] { -#include "alpha_button_on.lbm" -}; -Bitmap ALPHA_BUTTON_ON(BMP_ARGB4444, (const uint16_t*)__alpha_button_on); - -const uint8_t __alpha_button_off[] { -#include "alpha_button_off.lbm" -}; -Bitmap ALPHA_BUTTON_OFF(BMP_ARGB4444, (const uint16_t*)__alpha_button_off); - -void IconButton::paint(BitmapBuffer * dc) -{ - dc->drawBitmap(0, 0, theme->getIconButtonBitmap(icon, checked())); -} - -FabIconButton::FabIconButton(Window * parent, coord_t x, coord_t y, uint8_t icon, std::function pressHandler, uint8_t flags): - Button(parent, { x - 34, y - 34, 68, 68 }, pressHandler, flags), - icon(icon) -{ -} - -void FabIconButton::paint(BitmapBuffer * dc) -{ - // TODO ? dc->drawBitmap(0, 0, theme->getIconButtonBitmap(icon, checked())); - dc->drawBitmap(0, 0, checked() ? &ALPHA_BUTTON_ON : &ALPHA_BUTTON_OFF); - const BitmapBuffer * mask = theme->getIconMask(icon); - if (mask) { - dc->drawMask((68 - mask->getWidth()) / 2, (68 - mask->getHeight()) / 2, mask, TEXT_BGCOLOR); - } -} diff --git a/radio/src/gui/libopenui/button.h b/radio/src/gui/libopenui/button.h deleted file mode 100644 index e193474e3..000000000 --- a/radio/src/gui/libopenui/button.h +++ /dev/null @@ -1,181 +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 _BUTTON_H_ -#define _BUTTON_H_ - -#include "form.h" -#include - -enum ButtonFlags { - BUTTON_BACKGROUND = 1, - BUTTON_CHECKED = 2, - BUTTON_NOFOCUS = 4, - BUTTON_CHECKED_ON_FOCUS = 8, - BUTTON_DISABLED = 16, -}; - -class Button : public FormField { - public: - Button(Window * parent, const rect_t & rect, std::function pressHandler=nullptr, uint8_t flags=0): - FormField(parent, rect), - pressHandler(pressHandler), - flags(flags) - { - } - -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "Button"; - } -#endif - - void enable(bool enabled=true) - { - if (!enabled != bool(flags & BUTTON_DISABLED)) { - flags ^= BUTTON_DISABLED; - invalidate(); - } - } - - void disable() - { - enable(false); - } - - void check(bool checked=true) - { - if (checked != bool(flags & BUTTON_CHECKED)) { - flags ^= BUTTON_CHECKED; - invalidate(); - } - } - - bool enabled() - { - return !(flags & BUTTON_DISABLED); - } - - bool checked() - { - if (flags & BUTTON_CHECKED_ON_FOCUS) - return hasFocus(); - else - return flags & BUTTON_CHECKED; - } - - void setPressHandler(std::function handler) - { - pressHandler = std::move(handler); - } - - void setCheckHandler(std::function handler) - { - checkHandler = std::move(handler); - } - -#if defined(HARDWARE_KEYS) - void onKeyEvent(event_t event); -#endif - -#if defined(HARDWARE_TOUCH) - bool onTouchEnd(coord_t x, coord_t y) override; -#endif - - void checkEvents() override; - - protected: - std::function pressHandler; - std::function checkHandler; - uint8_t flags; - - void onPress(); -}; - -class TextButton : public Button { - public: - TextButton(Window * parent, const rect_t & rect, std::string text, std::function pressHandler=nullptr, uint8_t flags=BUTTON_BACKGROUND): - Button(parent, rect, pressHandler, flags), - text(std::move(text)) - { - windowFlags = OPAQUE; - } - -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "TextButton \"" + text + "\""; - } -#endif - - void setText(std::string value) - { - if (value != text) { - text = std::move(value); - invalidate(); - } - } - - void paint(BitmapBuffer * dc) override; - - protected: - std::string text; -}; - -class IconButton: public Button { - public: - IconButton(Window * parent, const rect_t & rect, uint8_t icon, std::function pressHandler, uint8_t flags=0): - Button(parent, rect, pressHandler, flags), - icon(icon) - { - } - -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "IconButton(" + std::to_string(icon) + ")"; - } -#endif - - void paint(BitmapBuffer * dc) override; - - protected: - uint8_t icon; -}; - -class FabIconButton: public Button { - public: - FabIconButton(Window * parent, coord_t x, coord_t y, uint8_t icon, std::function pressHandler, uint8_t flags=0); - -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "FabIconButton(" + std::to_string(icon) + ")"; - } -#endif - - void paint(BitmapBuffer * dc) override; - - protected: - uint8_t icon; -}; - -#endif diff --git a/radio/src/gui/libopenui/checkbox.cpp b/radio/src/gui/libopenui/checkbox.cpp deleted file mode 100644 index 1d11e0839..000000000 --- a/radio/src/gui/libopenui/checkbox.cpp +++ /dev/null @@ -1,73 +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 -#include "checkbox.h" -#include "draw_functions.h" - -void CheckBox::paint(BitmapBuffer * dc) -{ - bool hasFocus = this->hasFocus(); - uint8_t value = getValue(); - if (hasFocus) { - dc->drawSolidFilledRect(0, 2, 16, 16, TEXT_INVERTED_BGCOLOR); - if (value) { - dc->drawSolidFilledRect(2, 4, 12, 12, TEXT_BGCOLOR); - dc->drawSolidFilledRect(3, 5, 10, 10, SCROLLBOX_COLOR); - } - else { - dc->drawSolidFilledRect(2, 4, 12, 12, TEXT_BGCOLOR); - } - } - else { - if (value) { - dc->drawSolidFilledRect(2, 4, 12, 12, SCROLLBOX_COLOR); - drawSolidRect(dc, 0, 2, 16, 16, 1, CURVE_AXIS_COLOR); - } - else { - drawSolidRect(dc, 0, 2, 16, 16, 1, CURVE_AXIS_COLOR); - } - } -} - -#if defined(HARDWARE_KEYS) -void CheckBox::onKeyEvent(event_t event) -{ - TRACE_WINDOWS("%s received event 0x%X", getWindowDebugString().c_str(), event); - - if (event == EVT_KEY_BREAK(KEY_ENTER)) { - setValue(!getValue()); - invalidate({0, 0, 20, 20}); - } - else { - FormField::onKeyEvent(event); - } -} -#endif - -#if defined(HARDWARE_TOUCH) -bool CheckBox::onTouchEnd(coord_t x, coord_t y) -{ - setValue(!getValue()); - setFocus(); - invalidate({0, 0, 20, 20}); - return true; -} -#endif diff --git a/radio/src/gui/libopenui/checkbox.h b/radio/src/gui/libopenui/checkbox.h deleted file mode 100644 index 5d33fa5c0..000000000 --- a/radio/src/gui/libopenui/checkbox.h +++ /dev/null @@ -1,59 +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 _CHECKBOX_H_ -#define _CHECKBOX_H_ - -#include "form.h" - -class CheckBox : public FormField { - public: - CheckBox(Window * parent, const rect_t & rect, std::function getValue, std::function setValue, - LcdFlags flags = 0) : - FormField(parent, rect), - getValue(getValue), - setValue(setValue) - { - } - -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "CheckBox"; - } -#endif - - void paint(BitmapBuffer * dc) override; - -#if defined(HARDWARE_KEYS) - void onKeyEvent(event_t event) override; -#endif - -#if defined(HARDWARE_TOUCH) - bool onTouchEnd(coord_t x, coord_t y) override; -#endif - - protected: - const char * label; - std::function getValue; - std::function setValue; -}; - -#endif // _CHECKBOX_H_ diff --git a/radio/src/gui/libopenui/choice.cpp b/radio/src/gui/libopenui/choice.cpp deleted file mode 100644 index 04addf03b..000000000 --- a/radio/src/gui/libopenui/choice.cpp +++ /dev/null @@ -1,122 +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 "choice.h" -#include "menu.h" -#include "draw_functions.h" -#include "strhelpers.h" -#include "opentx.h" - -const uint8_t LBM_DROPDOWN[] = { -#include "mask_dropdown.lbm" -}; - -Choice::Choice(Window * parent, const rect_t &rect, const char * values, int16_t vmin, int16_t vmax, - std::function getValue, std::function setValue, LcdFlags flags) : - FormField(parent, rect), - values(values), - vmin(vmin), - vmax(vmax), - getValue(std::move(getValue)), - setValue(std::move(setValue)), - flags(flags) -{ -} - -void Choice::paint(BitmapBuffer * dc) -{ - FormField::paint(dc); - - LcdFlags textColor; - if (editMode) - textColor = TEXT_INVERTED_COLOR; - else if (hasFocus()) - textColor = TEXT_INVERTED_BGCOLOR; - else - textColor = 0; - - if (textHandler) - dc->drawText(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, textHandler(getValue()).c_str(), textColor); - else - drawTextAtIndex(dc, FIELD_PADDING_LEFT, FIELD_PADDING_TOP, values, getValue() - vmin, flags | textColor); - - dc->drawBitmapPattern(rect.w - 14, (rect.h - 5) / 2, LBM_DROPDOWN, textColor); -} - -#if defined(HARDWARE_KEYS) -void Choice::onKeyEvent(event_t event) -{ - TRACE_WINDOWS("%s received event 0x%X", getWindowDebugString().c_str(), event); - - if (event == EVT_KEY_BREAK(KEY_ENTER)) { - editMode = true; - invalidate(); - openMenu(); - } - else { - FormField::onKeyEvent(event); - } -} -#endif - -void Choice::openMenu() -{ - auto menu = new Menu(); - auto value = getValue(); - int count = 0; - int current = -1; - - for (int i = vmin; i <= vmax; ++i) { - if (isValueAvailable && !isValueAvailable(i)) - continue; - if (textHandler) { - menu->addLine(textHandler(i), [=]() { - setValue(i); - }); - } - else { - menu->addLine(TEXT_AT_INDEX(values, i - vmin), [=]() { - setValue(i); - }); - } - if (value == i) { - current = count; - } - ++count; - } - - if (current >= 0) { - menu->select(current); - } - - menu->setCloseHandler([=]() { - editMode = false; - setFocus(); - }); -} - -#if defined(HARDWARE_TOUCH) -bool Choice::onTouchEnd(coord_t, coord_t) -{ - openMenu(); - setFocus(); - return true; -} -#endif diff --git a/radio/src/gui/libopenui/choice.h b/radio/src/gui/libopenui/choice.h deleted file mode 100644 index afc99044e..000000000 --- a/radio/src/gui/libopenui/choice.h +++ /dev/null @@ -1,75 +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 _CHOICE_H_ -#define _CHOICE_H_ - -#include "form.h" -#include - -class Choice : public FormField { - public: - Choice(Window * parent, const rect_t & rect, const char * values, int16_t vmin, int16_t vmax, std::function getValue, std::function setValue = nullptr, LcdFlags flags = 0); - -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "Choice"; - } -#endif - - void paint(BitmapBuffer * dc) override; - -#if defined(HARDWARE_KEYS) - void onKeyEvent(event_t event) override; -#endif - -#if defined(HARDWARE_TOUCH) - bool onTouchEnd(coord_t x, coord_t y) override; -#endif - - void setSetValueHandler(std::function handler) - { - setValue = std::move(handler); - } - - void setAvailableHandler(std::function handler) - { - isValueAvailable = std::move(handler); - } - - void setTextHandler(std::function handler) - { - textHandler = std::move(handler); - } - - protected: - const char * values; - int16_t vmin; - int16_t vmax; - std::function getValue; - std::function setValue; - std::function isValueAvailable; - std::function textHandler; - LcdFlags flags; - void openMenu(); -}; - -#endif // _CHOICE_H_ diff --git a/radio/src/gui/libopenui/coloredit.cpp b/radio/src/gui/libopenui/coloredit.cpp deleted file mode 100644 index 180335ada..000000000 --- a/radio/src/gui/libopenui/coloredit.cpp +++ /dev/null @@ -1,87 +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 "coloredit.h" -#include "numberedit.h" -#include "bitfield.h" -#include "lcd.h" - -constexpr uint8_t PART_BITS[3][2] = { {0, 5}, {5, 6}, {11, 5} }; - -class ColorBox: public Window { - public: - ColorBox(Window * parent, const rect_t & rect, LcdFlags color): - Window(parent, rect), - color(color) - { - } - -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "ColorBox"; - } -#endif - - void paint(BitmapBuffer * dc) override - { - lcdSetColor(color); - dc->drawSolidFilledRect(0, 0, width(), height(), TEXT_COLOR); - dc->drawSolidFilledRect(1, 1, width() - 2, height() - 2, CUSTOM_COLOR); - } - - void setColor(LcdFlags value) - { - color = value; - invalidate(); - } - - protected: - LcdFlags color; -}; - -ColorEdit::ColorEdit(Window * parent, const rect_t & rect, std::function getValue, std::function setValue): - Window(parent, rect) -{ - auto width = rect.w / 4 - 5; - - // The color box - auto box = new ColorBox(this, {0, 0, rect.w - 3 * width, rect.h}, getValue()); - - // The 3 parts of RGB - for (uint8_t part = 0; part < 3; part++) { - new NumberEdit(this, {rect.w - (3 - part) * width + 5, 0, width - 5, rect.h}, 0, (1 << PART_BITS[part][1]) - 1, - [=]() { - return BF_GET(getValue(), PART_BITS[part][0], PART_BITS[part][1]); - }, - [=](uint8_t newValue) { - uint16_t value = getValue(); - BF_SET(value, newValue, PART_BITS[part][0], PART_BITS[part][1]); - setValue(value); - box->setColor(value); - }); - } - -} - -ColorEdit::~ColorEdit() -{ - deleteChildren(); -} diff --git a/radio/src/gui/libopenui/dialog.cpp b/radio/src/gui/libopenui/dialog.cpp deleted file mode 100644 index 20322e8f1..000000000 --- a/radio/src/gui/libopenui/dialog.cpp +++ /dev/null @@ -1,232 +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 "dialog.h" -#include "mainwindow.h" -#include "opentx.h" - -Dialog::Dialog(std::string title, const rect_t rect): - Window(&mainWindow, rect, OPAQUE), - title(std::move(title)), - previousFocus(focusWindow) -{ - bringToTop(); - FormField::clearCurrentField(); - setFocus(); -} - -void Dialog::paint(BitmapBuffer * dc) -{ - dc->drawRect(0, 0, width() - 1, height() - 1, 1, SOLID, TEXT_COLOR); - dc->drawSolidFilledRect(1, 1, width() - 3, PAGE_LINE_HEIGHT, TITLE_BGCOLOR); - dc->drawText(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, title.c_str(), MENU_TITLE_COLOR); - - lcdSetColor(g_eeGeneral.themeData.options[0].unsignedValue); - dc->drawSolidFilledRect(1, PAGE_LINE_HEIGHT + 1, width() - 3, height() - PAGE_LINE_HEIGHT - 3, CUSTOM_COLOR); -} - -void Dialog::deleteLater() -{ - if (previousFocus) { - previousFocus->setFocus(); - } - - Window::deleteLater(); -} - -#define ALERT_FRAME_TOP 70 -#define ALERT_FRAME_PADDING 10 -#define ALERT_BITMAP_PADDING 15 -#define ALERT_TITLE_LEFT 135 -#define ALERT_TITLE_LINE_HEIGHT 30 -#define ALERT_MESSAGE_TOP 210 -#define ALERT_ACTION_TOP 230 -#define ALERT_BUTTON_TOP 300 - -FullScreenDialog::FullScreenDialog(uint8_t type, std::string title, std::string message, std::function confirmHandler): - Dialog(title, {0, 0, LCD_W, LCD_H}), - type(type), - message(std::move(message)), - confirmHandler(confirmHandler) -{ -#if defined(HARDWARE_TOUCH) - new FabIconButton(this, LCD_W - 50, ALERT_BUTTON_TOP, ICON_NEXT, - [=]() -> uint8_t { - if (confirmHandler) - confirmHandler(); - return 0; - }); -#endif -} - -FullScreenDialog::~FullScreenDialog() -{ -} - -void FullScreenDialog::paint(BitmapBuffer * dc) -{ - theme->drawBackground(dc); - - if (type == WARNING_TYPE_ALERT || type == WARNING_TYPE_ASTERISK) - dc->drawBitmap(ALERT_BITMAP_PADDING, ALERT_FRAME_TOP + ALERT_BITMAP_PADDING, theme->asterisk); - else if (type == WARNING_TYPE_INFO) - dc->drawBitmap(ALERT_BITMAP_PADDING, ALERT_FRAME_TOP + ALERT_BITMAP_PADDING, theme->busy); - else // confirmation - dc->drawBitmap(ALERT_BITMAP_PADDING, ALERT_FRAME_TOP + ALERT_BITMAP_PADDING, theme->question); - - if (type == WARNING_TYPE_ALERT) { -#if defined(TRANSLATIONS_FR) || defined(TRANSLATIONS_IT) || defined(TRANSLATIONS_CZ) - dc->drawText(ALERT_TITLE_LEFT, ALERT_FRAME_TOP + ALERT_FRAME_PADDING, STR_WARNING, ALARM_COLOR|DBLSIZE); - dc->drawText(ALERT_TITLE_LEFT, ALERT_FRAME_TOP + ALERT_FRAME_PADDING + ALERT_TITLE_LINE_HEIGHT, title, ALARM_COLOR|DBLSIZE); -#else - dc->drawText(ALERT_TITLE_LEFT, ALERT_FRAME_TOP + ALERT_FRAME_PADDING, title.c_str(), ALARM_COLOR|DBLSIZE); - dc->drawText(ALERT_TITLE_LEFT, ALERT_FRAME_TOP + ALERT_FRAME_PADDING + ALERT_TITLE_LINE_HEIGHT, STR_WARNING, ALARM_COLOR|DBLSIZE); -#endif - } - else if (!title.empty()) { - dc->drawText(ALERT_TITLE_LEFT, ALERT_FRAME_TOP + ALERT_FRAME_PADDING, title.c_str(), ALARM_COLOR|DBLSIZE); - } - - if (!message.empty()) { - dc->drawText(ALERT_FRAME_PADDING+5, ALERT_MESSAGE_TOP, message.c_str(), MIDSIZE); - } - -#if 0 - if (action) { - // dc->drawText(ALERT_FRAME_PADDING+5, ALERT_ACTION_TOP, action); - } -#endif -} - -#if defined(HARDWARE_KEYS) -void FullScreenDialog::onKeyEvent(event_t event) -{ - TRACE_WINDOWS("%s received event 0x%X", getWindowDebugString().c_str(), event); - - if (event == EVT_KEY_BREAK(KEY_ENTER)) { - deleteLater(); - if (confirmHandler) - confirmHandler(); - } - else if (event == EVT_KEY_BREAK(KEY_EXIT)) { - deleteLater(); - } -} -#endif - -#if defined(HARDWARE_TOUCH) -bool FullScreenDialog::onTouchEnd(coord_t x, coord_t y) -{ - Window::onTouchEnd(x, y); - deleteLater(); - return true; -} -#endif - -void FullScreenDialog::checkEvents() -{ - Window::checkEvents(); - if (closeCondition && closeCondition()) { - deleteLater(); - } -} - -void FullScreenDialog::deleteLater() -{ - if (previousFocus) { - previousFocus->setFocus(); - } - if (running) { - running = false; - } - else { - Window::deleteLater(); - } -} - -void FullScreenDialog::runForever() -{ - running = true; - - while (running) { - auto check = pwrCheck(); - if (check == e_power_off) { - boardOff(); - } - else if (check == e_power_press) { - RTOS_WAIT_MS(20); - continue; - } - - checkBacklight(); - wdt_reset(); - - RTOS_WAIT_MS(20); - mainWindow.run(false); - } - - Window::deleteLater(); -} - -void raiseAlert(const char * title, const char * msg, const char * info, uint8_t sound) -{ - AUDIO_ERROR_MESSAGE(sound); - auto dialog = new FullScreenDialog(WARNING_TYPE_ALERT, title, msg); - dialog->runForever(); -} - -MessageDialog::MessageDialog(const char * title, const char * message): - Dialog(title, {50, 73, LCD_W - 100, LCD_H - 146}) -{ - new StaticText(this, {0, height() / 2, width(), PAGE_LINE_HEIGHT}, message, CENTERED); -} - -#if defined(HARDWARE_KEYS) -void MessageDialog::onKeyEvent(event_t event) -{ - TRACE_WINDOWS("%s received event 0x%X", getWindowDebugString().c_str(), event); - - if (event == EVT_KEY_BREAK(KEY_EXIT) || event == EVT_KEY_BREAK(KEY_ENTER)) { - deleteLater(); - } -} -#endif - -ConfirmDialog::ConfirmDialog(const char *title, const char *message, std::function confirmHandler) : - Dialog(title, {50, 73, LCD_W - 100, LCD_H - 146}), - confirmHandler(std::move(confirmHandler)) -{ - new StaticText(this, {0, height() / 2, width(), PAGE_LINE_HEIGHT}, message, CENTERED); -} - -#if defined(HARDWARE_KEYS) -void ConfirmDialog::onKeyEvent(event_t event) -{ - TRACE_WINDOWS("%s received event 0x%X", getWindowDebugString().c_str(), event); - - if (event == EVT_KEY_BREAK(KEY_ENTER)) { - confirmHandler(); - deleteLater(); - } - else if (event == EVT_KEY_BREAK(KEY_EXIT)) { - deleteLater(); - } -} -#endif diff --git a/radio/src/gui/libopenui/draw_functions.cpp b/radio/src/gui/libopenui/draw_functions.cpp deleted file mode 100644 index ee7c6d9ba..000000000 --- a/radio/src/gui/libopenui/draw_functions.cpp +++ /dev/null @@ -1,75 +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" - -void drawTextAtIndex(BitmapBuffer * dc, coord_t x, coord_t y, const char * s, uint8_t idx, LcdFlags flags) -{ - char length = *s++; - dc->drawSizedText(x, y, s+length*idx, length, flags & ~ZCHAR); -} - -void drawNumber(BitmapBuffer * dc, coord_t x, coord_t y, int32_t val, LcdFlags flags, uint8_t len, const char * prefix, const char * suffix) -{ - char str[48+1]; // max=16 for the prefix, 16 chars for the number, 16 chars for the suffix - char *s = str+32; - *s = '\0'; - int idx = 0; - int mode = MODE(flags); - bool neg = false; - if (val < 0) { - val = -val; - neg = true; - } - do { - *--s = '0' + (val % 10); - ++idx; - val /= 10; - if (mode!=0 && idx==mode) { - mode = 0; - *--s = '.'; - if (val==0) - *--s = '0'; - } - } while (val!=0 || mode>0 || (mode==MODE(LEADING0) && idxdrawText(x, y, s, flags); -} - -void drawSolidRect(BitmapBuffer * dc, coord_t x, coord_t y, coord_t w, coord_t h, uint8_t thickness, LcdFlags att) -{ - dc->drawSolidFilledRect(x, y, thickness, h, att); - dc->drawSolidFilledRect(x+w-thickness, y, thickness, h, att); - dc->drawSolidFilledRect(x, y, w, thickness, att); - dc->drawSolidFilledRect(x, y+h-thickness, w, thickness, att); -} diff --git a/radio/src/gui/libopenui/draw_functions.h b/radio/src/gui/libopenui/draw_functions.h deleted file mode 100644 index ab63b727b..000000000 --- a/radio/src/gui/libopenui/draw_functions.h +++ /dev/null @@ -1,34 +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 _LIBOPENUI_DRAW_FUNCTIONS_H_ -#define _LIBOPENUI_DRAW_FUNCTIONS_H_ - -#include -#include "libopenui_types.h" - -void drawTextAtIndex(BitmapBuffer * dc, coord_t x, coord_t y, const char * s, uint8_t idx, LcdFlags flags=0); -void drawNumber(BitmapBuffer * dc, coord_t x, coord_t y, int32_t val, LcdFlags flags=0, uint8_t len=0, const char * prefix=nullptr, const char * suffix=nullptr); -void drawSolidRect(BitmapBuffer * dc, coord_t x, coord_t y, coord_t w, coord_t h, uint8_t thickness=1, LcdFlags flags=0); -void drawSource(BitmapBuffer * dc, coord_t x, coord_t y, mixsrc_t idx, LcdFlags flags=0); -void drawSwitch(BitmapBuffer * dc, coord_t x, coord_t y, int32_t idx, LcdFlags flags=0); -void drawTrimMode(BitmapBuffer * dc, coord_t x, coord_t y, uint8_t phase, uint8_t idx, LcdFlags flags = 0); - -#endif // _LIBOPENUI_DRAW_FUNCTIONS_H_ diff --git a/radio/src/gui/libopenui/filechoice.cpp b/radio/src/gui/libopenui/filechoice.cpp deleted file mode 100644 index b36cdd9b6..000000000 --- a/radio/src/gui/libopenui/filechoice.cpp +++ /dev/null @@ -1,160 +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 "filechoice.h" -#include "menu.h" -#include "draw_functions.h" -#include "sdcard.h" - -const uint8_t LBM_FOLDER[] = { -#include "mask_folder.lbm" -}; - -// comparison, not case sensitive. -bool compare_nocase(const std::string &first, const std::string &second) -{ - return strcasecmp(first.c_str(), second.c_str()) < 0; -} - -FileChoice::FileChoice(Window * parent, const rect_t & rect, std::string folder, const char * extension, int maxlen, std::function getValue, std::function setValue): - FormField(parent, rect), - folder(std::move(folder)), - extension(extension), - maxlen(maxlen), - getValue(std::move(getValue)), - setValue(std::move(setValue)) -{ -} - -void FileChoice::paint(BitmapBuffer * dc) -{ - FormField::paint(dc); - - const char * displayedValue = getValue().c_str(); - - LcdFlags textColor; - if (editMode) - textColor = TEXT_INVERTED_COLOR; - else if (hasFocus()) - textColor = TEXT_INVERTED_BGCOLOR; - else if (displayedValue[0] == '\0') - textColor = CURVE_AXIS_COLOR; - else - textColor = TEXT_COLOR; - - dc->drawText(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, displayedValue[0] == '\0' ? "---" : displayedValue, textColor); - dc->drawBitmapPattern(rect.w - 20, (rect.h - 11) / 2, LBM_FOLDER, textColor); -} - -void FileChoice::openMenu() -{ - FILINFO fno; - DIR dir; - std::list files; - const char * fnExt; - uint8_t fnLen, extLen; - - FRESULT res = f_opendir(&dir, folder.c_str()); // Open the directory - if (res == FR_OK) { - bool firstTime = true; - for (;;) { - res = sdReadDir(&dir, &fno, firstTime); - if (res != FR_OK || fno.fname[0] == 0) - break; // break on error or end of dir - if (fno.fattrib & AM_DIR) - continue; // skip subfolders - if (fno.fattrib & AM_HID) - continue; // skip hidden files - if (fno.fattrib & AM_SYS) - continue; // skip system files - - fnExt = getFileExtension(fno.fname, 0, 0, &fnLen, &extLen); - fnLen -= extLen; - - if (!fnLen || fnLen > maxlen) - continue; // wrong size - if (extension && !isExtensionMatching(fnExt, extension)) - continue; // wrong extension - - files.emplace_back(fno.fname, fnLen); - } - - if (files.size() > 0) { - // sort files - files.sort(compare_nocase); - - files.push_front(""); - - auto menu = new Menu(); - int count = 0; - int current = -1; - std::string value = getValue(); - for (const auto &file: files) { - menu->addLine(file, [=]() { - setValue(file); - }); - // TRACE("%s %d %s %d", value.c_str(), value.size(), file.c_str(), file.size()); - if (value.compare(file) == 0) { - // TRACE("OK"); - current = count; - } - ++count; - } - - if (current >= 0) { - menu->select(current); - } - - menu->setCloseHandler([=]() { - editMode = false; - setFocus(); - }); - } - else { - TRACE("NO FILES !!!!!"); - // TODO popup "NO FILES" - } - } -} - -#if defined(HARDWARE_KEYS) -void FileChoice::onKeyEvent(event_t event) -{ - TRACE_WINDOWS("%s received event 0x%X", getWindowDebugString().c_str(), event); - - if (event == EVT_KEY_BREAK(KEY_ENTER)) { - editMode = true; - invalidate(); - openMenu(); - } - else { - FormField::onKeyEvent(event); - } -} -#endif - -#if defined(HARDWARE_TOUCH) -bool FileChoice::onTouchEnd(coord_t, coord_t) -{ - openMenu(); - setFocus(); - return true; -} -#endif diff --git a/radio/src/gui/libopenui/filechoice.h b/radio/src/gui/libopenui/filechoice.h deleted file mode 100644 index 284e3dcf6..000000000 --- a/radio/src/gui/libopenui/filechoice.h +++ /dev/null @@ -1,58 +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 _FILECHOICE_H_ -#define _FILECHOICE_H_ - -#include "form.h" -#include - -class FileChoice: public FormField { - public: - FileChoice(Window * parent, const rect_t & rect, std::string folder, const char * extension, int maxlen, std::function getValue, std::function setValue); - -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "FileChoice"; - } -#endif - - void paint(BitmapBuffer * dc) override; - -#if defined(HARDWARE_KEYS) - void onKeyEvent(event_t event) override; -#endif - -#if defined(HARDWARE_TOUCH) - bool onTouchEnd(coord_t x, coord_t y) override; -#endif - - protected: - std::string folder; - const char * extension; - int maxlen; - std::function getValue; - std::function setValue; - - void openMenu(); -}; - -#endif // _FILECHOICE_H_ diff --git a/radio/src/gui/libopenui/form.cpp b/radio/src/gui/libopenui/form.cpp deleted file mode 100644 index 758c42d3c..000000000 --- a/radio/src/gui/libopenui/form.cpp +++ /dev/null @@ -1,121 +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 "form.h" -#include "opentx.h" -#include "draw_functions.h" - -FormField * FormField::current = nullptr; - -FormField::FormField(Window *parent, const rect_t &rect, uint8_t flags) : - Window(parent, rect, flags) -{ - if (current) { - setPreviousField(current); - current->setNextField(this); - } - - FormWindow * form = dynamic_cast(parent); - if (form && !form->getFirstField()) - form->setFirstField(this); - - current = this; -} - -#if defined(HARDWARE_KEYS) -void FormWindow::onKeyEvent(event_t event) -{ - TRACE_WINDOWS("%s received event 0x%X", getWindowDebugString().c_str(), event); - - if (event == EVT_KEY_BREAK(KEY_EXIT) && first && getFocus() != first) { - first->setFocus(); - } - else { - Window::onKeyEvent(event); - } -} - -void FormField::onKeyEvent(event_t event) -{ - TRACE_WINDOWS("%s received event 0x%X", FormField::getWindowDebugString().c_str(), event); - - if (event == EVT_ROTARY_RIGHT/*EVT_KEY_BREAK(KEY_DOWN)*/) { - if (next) { - next->setFocus(); - } - } - else if (event == EVT_ROTARY_LEFT/*EVT_KEY_BREAK(KEY_UP)*/) { - if (previous) { - previous->setFocus(); - } - } - else if (event == EVT_KEY_BREAK(KEY_ENTER)) { - editMode = !editMode; - invalidate(); - } - else if (event == EVT_KEY_BREAK(KEY_EXIT) && editMode) { - editMode = false; - invalidate(); - } - else { - Window::onKeyEvent(event); - } -} - -void FormGroup::onKeyEvent(event_t event) -{ - TRACE_WINDOWS("%s received event 0x%X", getWindowDebugString().c_str(), event); - - if (event == EVT_KEY_BREAK(KEY_ENTER)) { - editMode = true; - first->setFocus(); - } - else if (event == EVT_KEY_BREAK(KEY_EXIT) && editMode) { - editMode = false; - setFocus(); - } - else { - FormField::onKeyEvent(event); - } -} -#endif - -void FormField::paint(BitmapBuffer * dc) -{ - if (editMode) { - dc->drawSolidFilledRect(0, 0, rect.w, rect.h, TEXT_INVERTED_BGCOLOR); - } - else if (hasFocus()) { - drawSolidRect(dc, 0, 0, rect.w, rect.h, 2, TEXT_INVERTED_BGCOLOR); - } - else if (!(windowFlags & BORDER_FOCUS_ONLY)) { - drawSolidRect(dc, 0, 0, rect.w, rect.h, 1, CURVE_AXIS_COLOR); - } -} - -void FormGroup::paint(BitmapBuffer * dc) -{ - if (!editMode && hasFocus()) { - drawSolidRect(dc, 0, 0, rect.w, rect.h, 2, TEXT_INVERTED_BGCOLOR); - } - else if (!(windowFlags & BORDER_FOCUS_ONLY)) { - drawSolidRect(dc, 0, 0, rect.w, rect.h, 1, CURVE_AXIS_COLOR); - } -} diff --git a/radio/src/gui/libopenui/form.h b/radio/src/gui/libopenui/form.h deleted file mode 100644 index 33ede76a7..000000000 --- a/radio/src/gui/libopenui/form.h +++ /dev/null @@ -1,193 +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 _FORM_H_ -#define _FORM_H_ - -#include "window.h" - -class FormField: public Window { - friend class FormWindow; - - public: - FormField(Window * parent, const rect_t & rect, uint8_t flags=0); - - inline void setNextField(FormField *field) - { - next = field; - } - - inline void setPreviousField(FormField * field) - { - previous = field; - } - - inline static void setCurrentField(FormField * field) - { - current = field; - } - - inline static void clearCurrentField() - { - setCurrentField(nullptr); - }; - - inline static FormField * getCurrentField() - { - return current; - }; - - inline FormField * getPreviousField() - { - return previous; - }; - - inline FormField * getNextField() - { - return next; - }; - - inline static void link(FormField * previous, FormField * next) - { - previous->setNextField(next); - next->setPreviousField(previous); - } - - void paint(BitmapBuffer * dc) override; - -#if defined(HARDWARE_KEYS) - void onKeyEvent(event_t event) override; -#endif - - protected: - static FormField * current; - FormField * next = nullptr; - FormField * previous = nullptr; - bool editMode = false; -}; - -class FormGroup: public FormField { - public: - FormGroup(Window * parent, const rect_t & rect, uint8_t flags=0) : - FormField(parent, rect, flags) - { - FormField::current = nullptr; - } - -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "FormGroup"; - } -#endif - - void clear() - { - Window::clear(); - first = nullptr; - FormField::current = nullptr; - } - - inline void setFirstField(FormField * field) - { - first = field; - } - - inline void setLastField(FormField * field = nullptr) - { - // by default the current field is the last one - if (!field) - field = getCurrentField(); - - FormField::link(field, first); - - // now the current field is the group, it will be linked to the next one - FormField::setCurrentField(this); - } - - FormField * getFirstField() - { - return first; - } - - protected: - FormField * first = nullptr; - -#if defined(HARDWARE_KEYS) - void onKeyEvent(event_t event) override; -#endif - - void paint(BitmapBuffer * dc) override; -}; - -class FormWindow: public Window { - public: - FormWindow(Window * parent, const rect_t & rect) : - Window(parent, rect) - { - FormField::current = nullptr; - } - -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "FormWindow"; - } -#endif - - void clear() - { - first = nullptr; - Window::clear(); - } - - FormField * getFirstField() - { - return first; - } - - inline void setFirstField(FormField * field) - { - first = field; - field->setFocus(); - } - - inline void setLastField(FormField * field = nullptr) - { - if (!field) - field = FormField::getCurrentField(); - FormField::link(field, first); - } - - protected: - -#if defined(HARDWARE_KEYS) - void onKeyEvent(event_t event) override; -#endif - - void paint(BitmapBuffer * dc) override - { - } - - protected: - FormField * first = nullptr; -}; - -#endif diff --git a/radio/src/gui/libopenui/gridlayout.h b/radio/src/gui/libopenui/gridlayout.h deleted file mode 100644 index 25687ac1c..000000000 --- a/radio/src/gui/libopenui/gridlayout.h +++ /dev/null @@ -1,124 +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 _GRIDLAYOUT_H_ -#define _GRIDLAYOUT_H_ - -#include "window.h" - -class GridLayout { - public: - GridLayout(coord_t width): - width(width) - { - } - - GridLayout(Window * window): - width(window->width()) - { - } - - rect_t getSlot(uint8_t count = 1, uint8_t index = 0) const - { - coord_t width = (this->width - (count - 1) * PAGE_LINE_SPACING) / count; - coord_t left = (width + PAGE_LINE_SPACING) * index; - return {left, currentY, width, PAGE_LINE_HEIGHT}; - } - - void spacer(coord_t height=PAGE_LINE_SPACING) - { - currentY += height; - } - - void nextLine(coord_t height=PAGE_LINE_HEIGHT) - { - spacer(height + PAGE_LINE_SPACING); - } - - void addWindow(Window * window) - { - window->adjustHeight(); - currentY += window->rect.h + PAGE_LINE_SPACING; - } - - coord_t getWindowHeight() const - { - return currentY; - } - - protected: - coord_t width; - coord_t currentY = 0; -}; - -class FormGridLayout: public GridLayout { - public: - FormGridLayout(coord_t width = LCD_W): - GridLayout(width) - { - } - - void setLabelWidth(coord_t value) - { - labelWidth = value; - } - - void setMarginLeft(coord_t value) - { - lineMarginLeft = value; - } - - void setMarginRight(coord_t value) - { - lineMarginRight = value; - } - - rect_t getLineSlot() - { - return { lineMarginLeft, currentY, this->width - lineMarginRight - lineMarginLeft, PAGE_LINE_HEIGHT }; - } - - rect_t getCenteredSlot(coord_t width = 0 ) const - { - if (width == 0) - width = this->width; - return { lineMarginLeft + (this->width - width)/2, currentY, min(width, this->width - lineMarginRight - lineMarginLeft), PAGE_LINE_HEIGHT }; - } - - rect_t getLabelSlot(bool indent = false) const - { - coord_t left = indent ? lineMarginLeft + PAGE_INDENT_WIDTH : lineMarginLeft; - return { left, currentY, labelWidth - left, PAGE_LINE_HEIGHT }; - } - - rect_t getFieldSlot(uint8_t count = 1, uint8_t index = 0) const - { - coord_t width = (this->width - labelWidth - lineMarginRight - (count - 1) * PAGE_LINE_SPACING) / count; - coord_t left = labelWidth + (width + PAGE_LINE_SPACING) * index; - return {left, currentY, width, PAGE_LINE_HEIGHT}; - } - - protected: - coord_t labelWidth = PAGE_LABEL_WIDTH; - coord_t lineMarginLeft = PAGE_PADDING; - coord_t lineMarginRight = 10; -}; - -#endif diff --git a/radio/src/gui/libopenui/keyboard_base.h b/radio/src/gui/libopenui/keyboard_base.h deleted file mode 100644 index 006b8ab0c..000000000 --- a/radio/src/gui/libopenui/keyboard_base.h +++ /dev/null @@ -1,78 +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 _KEYBOARD_BASE_H_ -#define _KEYBOARD_BASE_H_ - -#include "mainwindow.h" -#include "libopenui_types.h" - -class Page; -class TabsGroup; - -template -class Keyboard: public Window { - public: - Keyboard(coord_t height): - Window(nullptr, {0, LCD_H - height, LCD_W, height}, OPAQUE) - { - } - - void setField(T * field) - { - this->field = field; - attach(&mainWindow); - Window * w = getPageBody(); - w->setHeight(LCD_H - height() - w->top()); - w->scrollTo(field); - invalidate(); - } - - void disable(bool resizePage) - { - detach(); - if (field) { - Window * w = getPageBody(); - w->setHeight(LCD_H - 0 - w->top()); - field = nullptr; - } - } - - T * getField() const - { - return field; - } - - protected: - T * field = nullptr; - Window * getPageBody() - { - Window * parent = field; - while (1) { - Window * tmp = parent->getParent(); - if ((tmp->getWindowFlags() & OPAQUE) && tmp->width() == LCD_W && tmp->height() == LCD_H) { - return parent; - } - parent = tmp; - } - } -}; - -#endif // _KEYBOARD_BASE_H_ \ No newline at end of file diff --git a/radio/src/gui/libopenui/keyboard_number.cpp b/radio/src/gui/libopenui/keyboard_number.cpp deleted file mode 100644 index a27b36157..000000000 --- a/radio/src/gui/libopenui/keyboard_number.cpp +++ /dev/null @@ -1,99 +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 "keyboard_number.h" -#include "button.h" -#include "basenumberedit.h" -#include "lcd.h" - -constexpr coord_t KEYBOARD_HEIGHT = 90; - -NumberKeyboard * NumberKeyboard::_instance = nullptr; - -NumberKeyboard::NumberKeyboard(): - Keyboard(KEYBOARD_HEIGHT) -{ - new TextButton(this, { LCD_W/2 - 115, 10, 50, 30 }, "<<", - [=]() -> uint8_t { - if (field) { - field->setValue(field->getValue() - 10 * field->getStep()); - } - return 0; - }, BUTTON_BACKGROUND | BUTTON_NOFOCUS); - - new TextButton(this, { LCD_W/2 - 55, 10, 50, 30 }, "-", - [=]() -> uint8_t { - if (field) { - field->setValue(field->getValue() - field->getStep()); - } - return 0; - }, BUTTON_BACKGROUND | BUTTON_NOFOCUS); - - new TextButton(this, { LCD_W/2 + 5, 10, 50, 30 }, "+", - [=]() -> uint8_t { - if (field) { - field->setValue(field->getValue() + field->getStep()); - } - return 0; - }, BUTTON_BACKGROUND | BUTTON_NOFOCUS); - - new TextButton(this, { LCD_W/2 + 65, 10, 50, 30 }, ">>", - [=]() -> uint8_t { - if (field) { - field->setValue(field->getValue() + 10 * field->getStep()); - } - return 0; - }, BUTTON_BACKGROUND | BUTTON_NOFOCUS); - - new TextButton(this, { LCD_W/2 - 115, 50, 50, 30 }, "MIN", - [=]() -> uint8_t { - if (field) { - field->setValue(field->getMin()); - } - return 0; - }, BUTTON_BACKGROUND | BUTTON_NOFOCUS); - - new TextButton(this, { LCD_W/2 + 65, 50, 50, 30 }, "MAX", - [=]() -> uint8_t { - if (field) { - field->setValue(field->getMax()); - } - return 0; - }, BUTTON_BACKGROUND | BUTTON_NOFOCUS); - - new TextButton(this, { LCD_W/2 - 55, 50, 110, 30 }, "DEFAULT", - [=]() -> uint8_t { - if (field) { - field->setValue(field->getDefault()); - } - return 0; - }, BUTTON_BACKGROUND | BUTTON_NOFOCUS); -} - -NumberKeyboard::~NumberKeyboard() -{ - _instance = nullptr; -} - -void NumberKeyboard::paint(BitmapBuffer * dc) -{ - lcdSetColor(RGB(0xE0, 0xE0, 0xE0)); - dc->clear(CUSTOM_COLOR); -} diff --git a/radio/src/gui/libopenui/keyboard_text.cpp b/radio/src/gui/libopenui/keyboard_text.cpp deleted file mode 100644 index 9c406a370..000000000 --- a/radio/src/gui/libopenui/keyboard_text.cpp +++ /dev/null @@ -1,230 +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 "keyboard_text.h" -#include "textedit.h" -#include "fonts.h" -#include "lcd.h" - -constexpr coord_t KEYBOARD_HEIGHT = 160; - -TextKeyboard * TextKeyboard::_instance = nullptr; - -const uint8_t LBM_KEY_UPPERCASE[] = { -#include "mask_key_uppercase.lbm" -}; - -const uint8_t LBM_KEY_LOWERCASE[] = { -#include "mask_key_lowercase.lbm" -}; - -const uint8_t LBM_KEY_BACKSPACE[] = { -#include "mask_key_backspace.lbm" -}; - -const uint8_t LBM_KEY_LETTERS[] = { -#include "mask_key_letters.lbm" -}; - -const uint8_t LBM_KEY_NUMBERS[] = { -#include "mask_key_numbers.lbm" -}; - -const uint8_t LBM_KEY_SPACEBAR[] = { -#include "mask_key_spacebar.lbm" -}; - -const uint8_t * const LBM_SPECIAL_KEYS[] = { - LBM_KEY_BACKSPACE, - LBM_KEY_UPPERCASE, - LBM_KEY_LOWERCASE, - LBM_KEY_LETTERS, - LBM_KEY_NUMBERS, -}; - -const char * const KEYBOARD_LOWERCASE[] = { - "qwertyuiop", - " asdfghjkl", - "\201zxcvbnm\200", - "\204\t\n" -}; - -const char * const KEYBOARD_UPPERCASE[] = { - "QWERTYUIOP", - " ASDFGHJKL", - "\202ZXCVBNM\200", - "\204\t\n" -}; - -const char * const KEYBOARD_NUMBERS[] = { - "1234567890", - "_-", - " \200", - "\203\t\n" -}; - -const char * const * const KEYBOARD_LAYOUTS[] = { - KEYBOARD_UPPERCASE, - KEYBOARD_LOWERCASE, - KEYBOARD_LOWERCASE, - KEYBOARD_NUMBERS, -}; - -TextKeyboard::TextKeyboard(): - Keyboard(KEYBOARD_HEIGHT), - layout(KEYBOARD_LOWERCASE) -{ -} - -TextKeyboard::~TextKeyboard() -{ - _instance = nullptr; -} - -void TextKeyboard::setCursorPos(coord_t x) -{ - if (!field) - return; - - uint8_t size = field->getMaxLength(); - char * data = field->getData(); - coord_t rest = x; - for (cursorIndex = 0; cursorIndex < size; cursorIndex++) { - if (data[cursorIndex] == '\0') - break; - char c = data[cursorIndex]; - c = zchar2char(c); - uint8_t w = getCharWidth(c, fontspecsTable[0]); - if (rest < w) - break; - rest -= w; - } - cursorPos = x - rest; - field->invalidate(); -} - -void TextKeyboard::paint(BitmapBuffer * dc) -{ - lcdSetColor(RGB(0xE0, 0xE0, 0xE0)); - dc->clear(CUSTOM_COLOR); - - for (uint8_t i=0; i<4; i++) { - coord_t y = 15 + i * 40; - coord_t x = 15; - const char * c = layout[i]; - while(*c) { - if (*c == ' ') { - x += 15; - } - else if (*c == '\t') { - // spacebar - dc->drawBitmapPattern(x, y, LBM_KEY_SPACEBAR, TEXT_COLOR); - x += 135; - } - else if (*c == '\n') { - // enter - dc->drawSolidFilledRect(x, y-2, 80, 25, TEXT_DISABLE_COLOR); - dc->drawText(x+40, y, "ENTER", CENTERED); - x += 80; - } - else if (int8_t(*c) < 0) { - dc->drawBitmapPattern(x, y, LBM_SPECIAL_KEYS[uint8_t(*c - 128)], TEXT_COLOR); - x += 45; - } - else { - dc->drawSizedText(x, y, c, 1); - x += 30; - } - c++; - } - } -} - -bool TextKeyboard::onTouchEnd(coord_t x, coord_t y) -{ - if (!field) - return false; - - uint8_t size = field->getMaxLength(); - char * data = field->getData(); - - char c = 0; - - uint8_t row = max(0, y - 5) / 40; - const char * key = layout[row]; - while(*key) { - if (*key == ' ') { - x -= 15; - } - else if (*key == '\t') { - if (x <= 135) { - c = ' '; - break; - } - x -= 135; - } - else if (*key == '\n') { - if (x <= 80) { - // enter - disable(true); - return true; - } - x -= 80; - } - else if (int8_t(*key) < 0) { - if (x <= 45) { - uint8_t specialKey = *key; - if (specialKey == 128) { - // backspace - if (cursorIndex > 0) { - char c = zchar2char(data[cursorIndex - 1]); - memmove(data + cursorIndex - 1, data + cursorIndex, size - cursorIndex); - data[size - 1] = '\0'; - cursorPos -= getCharWidth(c, fontspecsTable[0]); - --cursorIndex; - } - } - else { - layout = KEYBOARD_LAYOUTS[specialKey - 129]; - invalidate(); - } - break; - } - x -= 45; - } - else { - if (x <= 30) { - c = *key; - break; - } - x -= 30; - } - key++; - } - - if (c && zlen(data, size) < size) { - memmove(data + cursorIndex + 1, data + cursorIndex, size - cursorIndex - 1); - data[cursorIndex++] = char2zchar(c); - cursorPos += getCharWidth(c, fontspecsTable[0]); - } - - field->invalidate(); - return true; -} diff --git a/radio/src/gui/libopenui/keyboard_text.h b/radio/src/gui/libopenui/keyboard_text.h deleted file mode 100644 index 183ce0706..000000000 --- a/radio/src/gui/libopenui/keyboard_text.h +++ /dev/null @@ -1,68 +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 _KEYBOARD_TEXT_H_ -#define _KEYBOARD_TEXT_H_ - -#include "keyboard_base.h" -#include "textedit.h" - -class TextKeyboard : public Keyboard { - friend class TextEdit; - - public: - TextKeyboard(); - - ~TextKeyboard() override; - -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "TextKeyboard"; - } -#endif - - static TextKeyboard * instance() { - if (!_instance) - _instance = new TextKeyboard(); - return _instance; - } - - coord_t getCursorPos() const - { - return cursorPos; - } - - void setCursorPos(coord_t x); - - void paint(BitmapBuffer * dc) override; - -#if defined(HARDWARE_TOUCH) - bool onTouchEnd(coord_t x, coord_t y) override; -#endif - - protected: - static TextKeyboard * _instance; - coord_t cursorPos = 0; - uint8_t cursorIndex = 0; - const char * const * layout; -}; - -#endif // _KEYBOARD_TEXT_H_ \ No newline at end of file diff --git a/radio/src/gui/libopenui/libopenui_defines.h b/radio/src/gui/libopenui/libopenui_defines.h deleted file mode 100644 index 24b19e3e8..000000000 --- a/radio/src/gui/libopenui/libopenui_defines.h +++ /dev/null @@ -1,91 +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 _LIBOPEUI_DEFINES_H_ -#define _LIBOPEUI_DEFINES_H_ - -#define CENTER - -/* lcd common flags */ -#define BLINK 0x01 - -/* drawText flags */ -#define INVERS 0x02 -#define LEFT 0x00 /* align left */ -#define CENTERED 0x04 /* align center */ -#define RIGHT 0x08 /* align right */ -#define SHADOWED 0x80 /* black copy at +1 +1 */ - -/* drawNumber flags */ -#define LEADING0 0x10 -#define PREC1 0x20 -#define PREC2 0x30 -#define MODE(flags) ((((int8_t)(flags) & 0x30) - 0x10) >> 4) - -#define ZCHAR 0x10 - -/* rect, square flags */ -#define ROUND 0x04 - -/* telemetry flags */ -#define NO_UNIT 0x40 - -enum FontSizeIndex { - STDSIZE_INDEX, - TINSIZE_INDEX, - SMLSIZE_INDEX, - MIDSIZE_INDEX, - DBLSIZE_INDEX, - XXLSIZE_INDEX, - SPARE6_INDEX, - SPARE7_INDEX, - STDSIZE_BOLD_INDEX, - SPARE9_INDEX, - SPAREa_INDEX, - SPAREb_INDEX, - SPAREc_INDEX, - SPAREd_INDEX, - SPAREe_INDEX, - SPAREf_INDEX, -}; - -#define STDSIZE (STDSIZE_INDEX << 8) -#define TINSIZE (TINSIZE_INDEX << 8) -#define SMLSIZE (SMLSIZE_INDEX << 8) -#define MIDSIZE (MIDSIZE_INDEX << 8) -#define DBLSIZE (DBLSIZE_INDEX << 8) -#define XXLSIZE (XXLSIZE_INDEX << 8) -#define BOLD (STDSIZE_BOLD_INDEX << 8) -#define FONTSIZE_MASK 0x0f00 - -#if !defined(BOOT) -#define FONTSIZE(flags) ((flags) & FONTSIZE_MASK) -#define FONTINDEX(flags) (FONTSIZE(flags) >> 8) -#else -#define FONTSIZE(flags) STDSIZE -#define FONTINDEX(flags) STDSIZE_INDEX -#endif - -#define TIMEBLINK 0x1000 -#define TIMEHOUR 0x2000 -#define EXPANDED 0x2000 -#define VERTICAL 0x4000 - -#endif diff --git a/radio/src/gui/libopenui/mainwindow.cpp b/radio/src/gui/libopenui/mainwindow.cpp deleted file mode 100644 index 228c4e666..000000000 --- a/radio/src/gui/libopenui/mainwindow.cpp +++ /dev/null @@ -1,114 +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 "lcd.h" -#include "mainwindow.h" -#include "colorlcd/draw_functions.h" - -#if defined(HARDWARE_TOUCH) -#include "touch_driver.h" -#endif - -MainWindow mainWindow; - -#if defined(HARDWARE_TOUCH) -STRUCT_TOUCH touchState; -#endif - -void MainWindow::emptyTrash() -{ - for (auto window: trash) { - delete window; - } - trash.clear(); -} - -void MainWindow::checkEvents(bool trash) -{ -#if defined(HARDWARE_TOUCH) - if (touchState.Event == TE_DOWN) { - onTouchStart(touchState.X + scrollPositionX, touchState.Y + scrollPositionY); - // touchState.Event = TE_NONE; - } - else if (touchState.Event == TE_UP) { - touchState.Event = TE_NONE; - onTouchEnd(touchState.startX + scrollPositionX, touchState.startY + scrollPositionY); - } - else if (touchState.Event == TE_SLIDE) { - coord_t x = touchState.X - touchState.lastX; - coord_t y = touchState.Y - touchState.lastY; - onTouchSlide(touchState.X, touchState.Y, touchState.startX, touchState.startY, x, y); - touchState.lastX = touchState.X; - touchState.lastY = touchState.Y; - } -#endif - - Window::checkEvents(); - - if (trash) { - emptyTrash(); - } -} - -void MainWindow::invalidate(const rect_t & rect) -{ - if (invalidatedRect.w) { - coord_t left = min(invalidatedRect.left(), rect.left()); - coord_t right = max(invalidatedRect.right(), rect.right()); - coord_t top = min(invalidatedRect.top(), rect.top()); - coord_t bottom = max(invalidatedRect.bottom(), rect.bottom()); - invalidatedRect = {left, top, right - left, bottom - top}; - } - else { - invalidatedRect = rect; - } -} - -bool MainWindow::refresh() -{ - if (invalidatedRect.w) { - if (invalidatedRect.x > 0 || invalidatedRect.y > 0 || invalidatedRect.w < LCD_W || invalidatedRect.h < LCD_H) { - TRACE_WINDOWS("Refresh rect: left=%d top=%d width=%d height=%d", invalidatedRect.left(), invalidatedRect.top(), invalidatedRect.w, invalidatedRect.h); - BitmapBuffer * previous = lcd; - lcdNextLayer(); - lcdCopy(lcd->getData(), previous->getData()); - } - else { - TRACE_WINDOWS("Refresh full screen"); - lcdNextLayer(); - } - lcd->setOffset(0, 0); - lcd->setClippingRect(invalidatedRect.left(), invalidatedRect.right(), invalidatedRect.top(), invalidatedRect.bottom()); - fullPaint(lcd); - invalidatedRect.w = 0; - return true; - } - else { - return false; - } -} - -void MainWindow::run(bool trash) -{ - checkEvents(trash); - if (refresh()) { - lcdRefresh(); - } -} diff --git a/radio/src/gui/libopenui/mainwindow.h b/radio/src/gui/libopenui/mainwindow.h deleted file mode 100644 index 396f08b12..000000000 --- a/radio/src/gui/libopenui/mainwindow.h +++ /dev/null @@ -1,66 +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 _MAINWINDOW_H_ -#define _MAINWINDOW_H_ - -#include -#include "window.h" -#include "bitmapbuffer.h" - -class MainWindow: public Window { - public: - MainWindow(): - Window(nullptr, {0, 0, LCD_W, LCD_H}), - invalidatedRect(rect) - { - } - -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "MainWindow"; - } -#endif - - void checkEvents(bool trash=true); - - void invalidate() - { - invalidate({0, 0, rect.w, rect.h}); - } - - void invalidate(const rect_t & rect) override; - - bool refresh(); - - void run(bool trash=true); - - protected: - void emptyTrash(); - rect_t invalidatedRect; - const char * shutdown = nullptr; -}; - -extern MainWindow mainWindow; - -#endif // _MAINWINDOW_H_ \ No newline at end of file diff --git a/radio/src/gui/libopenui/menu.cpp b/radio/src/gui/libopenui/menu.cpp deleted file mode 100644 index a06a24aca..000000000 --- a/radio/src/gui/libopenui/menu.cpp +++ /dev/null @@ -1,137 +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 "menu.h" - -MenuWindow::MenuWindow(Menu * parent): - Window(parent, {LCD_W / 2 - 100, LCD_H / 2, 200, 0}, OPAQUE) -{ - setScrollbarColor(WARNING_COLOR); - setFocus(); -} - -void MenuWindow::select(int index) -{ - selectedIndex = index; - if (innerHeight > height()) { - setScrollPositionY(lineHeight * index - 3 * lineHeight); - } - invalidate(); -} - -#if defined(HARDWARE_KEYS) -void MenuWindow::onKeyEvent(event_t event) -{ - TRACE_WINDOWS("%s received event 0x%X", getWindowDebugString().c_str(), event); - - if (event == EVT_ROTARY_RIGHT) { - select((selectedIndex + 1) % lines.size()); - } - else if (event == EVT_ROTARY_LEFT) { - select(selectedIndex == 0 ? lines.size() - 1 : selectedIndex - 1); - } - else if (event == EVT_KEY_BREAK(KEY_ENTER)) { - Window::onKeyEvent(event); // the window above will be closed on event - lines[selectedIndex].onPress(); - } - else if (event == EVT_KEY_BREAK(KEY_EXIT)) { - if (onCancel) - onCancel(); - Window::onKeyEvent(event); - } - else { - Window::onKeyEvent(event); - } -} -#endif - -#if defined(HARDWARE_TOUCH) -bool MenuWindow::onTouchEnd(coord_t x, coord_t y) -{ - int index = y / lineHeight; - lines[index].onPress(); - return false; // = close the menu (inverted so that click outside the menu closes it) -} -#endif - -void MenuWindow::paint(BitmapBuffer * dc) -{ - int width = (innerHeight > height() ? 195 : 200); - dc->clear(HEADER_BGCOLOR); - for (unsigned i=0; idrawText(10, i * lineHeight + (lineHeight - 20) / 2, text[0] == '\0' ? "---" : text, selectedIndex == (int)i ? WARNING_COLOR : MENU_TITLE_COLOR); - if (i > 0) { - dc->drawSolidHorizontalLine(0, i * lineHeight - 1, width, CURVE_AXIS_COLOR); - } - } -} - -void Menu::updatePosition() -{ - if (!toolbar) { - // there is no navigation bar at the left, we may center the window on screen - int count = min(MenuWindow::maxLines, menuWindow.lines.size()); - coord_t h = count * MenuWindow::lineHeight - 1; - menuWindow.setTop((LCD_H - h) / 2 + 20); - menuWindow.setHeight(h); - } - menuWindow.setInnerHeight(menuWindow.lines.size() * MenuWindow::lineHeight - 1); -} - -void Menu::addLine(const std::string & text, std::function onPress) -{ - menuWindow.addLine(text, std::move(onPress)); - updatePosition(); -} - -void Menu::removeLines() -{ - menuWindow.removeLines(); - updatePosition(); -} - -#if defined(HARDWARE_KEYS) -void Menu::onKeyEvent(event_t event) -{ - if (toolbar && (event == EVT_KEY_BREAK(KEY_PGDN) || event == EVT_KEY_LONG(KEY_PGDN))) { - toolbar->onKeyEvent(event); - } - else if (event == EVT_KEY_BREAK(KEY_EXIT) || event == EVT_KEY_BREAK(KEY_ENTER)) { - deleteLater(); - } -} -#endif - -#if defined(HARDWARE_TOUCH) -bool Menu::onTouchEnd(coord_t x, coord_t y) -{ - if (!Window::onTouchEnd(x, y)) { - deleteLater(); - } - return true; -} - -bool Menu::onTouchSlide(coord_t x, coord_t y, coord_t startX, coord_t startY, coord_t slideX, coord_t slideY) -{ - Window::onTouchSlide(x, y, startX, startY, slideX, slideY); - return true; -} -#endif diff --git a/radio/src/gui/libopenui/menu.h b/radio/src/gui/libopenui/menu.h deleted file mode 100644 index 202f4d2b5..000000000 --- a/radio/src/gui/libopenui/menu.h +++ /dev/null @@ -1,184 +0,0 @@ -#include - -/* - * 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 _MENU_H_ -#define _MENU_H_ - -#include -#include -#include "mainwindow.h" -#include -#include - -class Menu; - -class MenuWindow: public Window { - friend class Menu; - - class MenuLine { - friend class MenuWindow; - - public: - MenuLine(std::string text, std::function onPress): - text(std::move(text)), - onPress(std::move(onPress)) - { - } - - MenuLine(MenuLine &) = delete; - - MenuLine(MenuLine &&) = default; - - protected: - std::string text; - std::function onPress; - }; - - public: - MenuWindow(Menu * parent); - -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "MenuWindow"; - } -#endif - - void setCancelHandler(std::function handler) - { - onCancel = handler; - } - - void addLine(const std::string & text, std::function onPress) - { - lines.emplace_back(text, onPress); - invalidate(); - } - - void removeLines() - { - lines.clear(); - invalidate(); - } - - void select(int index); - - void paint(BitmapBuffer * dc) override; - -#if defined(HARDWARE_KEYS) - void onKeyEvent(event_t event) override; -#endif - -#if defined(HARDWARE_TOUCH) - bool onTouchEnd(coord_t x, coord_t y) override; -#endif - - protected: - std::vector lines; -#if defined(HARDWARE_TOUCH) - int selectedIndex = -1; -#else - int selectedIndex = 0; -#endif - std::function onCancel; - static constexpr uint8_t maxLines = 7; // TODO NV14 was 8 - static constexpr uint8_t lineHeight = 30; // TODO NV14 was 40 -}; - -class Menu : public Window { - public: - Menu() : - Window(&mainWindow, {0, 0, LCD_W, LCD_H}, TRANSPARENT), -#if !defined(HARDWARE_TOUCH) - previousFocus(focusWindow), -#endif - menuWindow(this) - { - } - - ~Menu() - { - delete toolbar; - } - - void setCancelHandler(std::function handler) - { - menuWindow.setCancelHandler(handler); - } - - void deleteLater() - { -#if !defined(HARDWARE_TOUCH) - if (previousFocus) { - previousFocus->setFocus(); - } -#endif - Window::deleteLater(); - } - -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "Menu"; - } -#endif - - void setToolbar(Window * window) - { - toolbar = window; - menuWindow.setLeft(toolbar->right()); - menuWindow.setTop(toolbar->top()); - menuWindow.setHeight(toolbar->height()); - } - - void addLine(const std::string & text, std::function onPress); - - void removeLines(); - - void select(int index) - { - menuWindow.select(index); - } - -#if defined(HARDWARE_KEYS) - void onKeyEvent(event_t event) override; -#endif - -#if defined(HARDWARE_TOUCH) - bool onTouchStart(coord_t x, coord_t y) override - { - return true; - } - - bool onTouchEnd(coord_t x, coord_t y) override; - - bool onTouchSlide(coord_t x, coord_t y, coord_t startX, coord_t startY, coord_t slideX, coord_t slideY) override; -#endif - - protected: - Window * previousFocus; - MenuWindow menuWindow; - Window * toolbar = nullptr; - void updatePosition(); -}; - -#endif diff --git a/radio/src/gui/libopenui/menutoolbar.h b/radio/src/gui/libopenui/menutoolbar.h deleted file mode 100644 index 27a42cd83..000000000 --- a/radio/src/gui/libopenui/menutoolbar.h +++ /dev/null @@ -1,191 +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 _MENUTOOLBAR_H_ -#define _MENUTOOLBAR_H_ - -#include "button.h" -#include "menu.h" - -int getFirstAvailable(int min, int max, std::functionisValueAvailable); -uint8_t getFontHeight(LcdFlags flags); - -class MenuToolbarButton: public Button { - public: - MenuToolbarButton(Window * window, const rect_t & rect, char picto): -#if defined(HARDWARE_TOUCH) - Button(window, rect, nullptr, BUTTON_CHECKED_ON_FOCUS), -#else - Button(window, rect, nullptr), -#endif - picto(picto) - { - } - - void paint(BitmapBuffer * dc) override - { - if (checked()) { - dc->drawSolidFilledRect(MENUS_TOOLBAR_BUTTON_PADDING, MENUS_TOOLBAR_BUTTON_PADDING, MENUS_TOOLBAR_BUTTON_WIDTH - 2 * MENUS_TOOLBAR_BUTTON_PADDING, MENUS_TOOLBAR_BUTTON_WIDTH - 2 * MENUS_TOOLBAR_BUTTON_PADDING, HEADER_BGCOLOR); - dc->drawSizedText(rect.w / 2, (rect.h - getFontHeight(flags)) / 2 + 1, &picto, 1, CENTERED | MENU_TITLE_COLOR); - } - else { - dc->drawSizedText(rect.w / 2, (rect.h - getFontHeight(flags)) / 2 + 1, &picto, 1, CENTERED | TEXT_COLOR); - } - } - -#if defined(HARDWARE_TOUCH) - bool onTouchEnd(coord_t x, coord_t y) override - { - if (hasFocus()) { - check(false); - clearFocus(); - } - else { - setFocus(); - } - onPress(); - return true; - } -#endif - - void check(bool checked=true) - { - Button::check(checked); - onPress(); - Button::check(checked); - } - - protected: - char picto; -}; - -template -class MenuToolbar: public Window { - friend T; - - public: - MenuToolbar(T * choice, Menu * menu): - Window(menu, MENUS_TOOLBAR_RECT, NO_SCROLLBAR), - choice(choice), - menu(menu) - { - FormField::clearCurrentField(); - } - - ~MenuToolbar() override - { - deleteChildren(); - } - - void paint(BitmapBuffer * dc) override - { - dc->clear(CURVE_AXIS_COLOR); - } - -#if defined(HARDWARE_KEYS) - void onKeyEvent(event_t event) override - { - if (event == EVT_KEY_BREAK(KEY_PGDN)) { - if (current == children.end()) { - current = children.begin(); - } - else { - static_cast(*current)->check(false); - ++current; - } - if (current != children.end()) { - auto button = static_cast(*current); - button->check(true); - scrollTo(button); - } - else { - setScrollPositionY(0); - } - } - else if (event == EVT_KEY_LONG(KEY_PGDN)) { - killEvents(event); - if (current == children.end()) { - --current; - } - else { - static_cast(*current)->check(false); - if (current == children.begin()) - current = children.end(); - else - --current; - } - if (current != children.end()) { - auto button = static_cast(*current); - button->check(true); - scrollTo(button); - } - else { - setScrollPositionY(0); - } - } - } -#endif - -#if defined(HARDWARE_TOUCH) - bool onTouchEnd(coord_t x, coord_t y) override - { - Window::onTouchEnd(x, y); - return true; // = don't close the menu (inverted so that click outside the menu closes it) - } -#endif - - protected: - std::list::iterator current = children.end(); - T * choice; - Menu * menu; - coord_t y = 0; // TODO NV14 was 5; - - void addButton(char picto, int16_t filtermin, int16_t filtermax) - { - int vmin = choice->vmin; - int vmax = choice->vmax; - - if (vmin > filtermin || vmax < filtermin) - return; - - if (choice->isValueAvailable && getFirstAvailable(filtermin, filtermax, choice->isValueAvailable) == 0) - return; - - auto button = new MenuToolbarButton(this, {0, y, MENUS_TOOLBAR_BUTTON_WIDTH, MENUS_TOOLBAR_BUTTON_WIDTH}, picto); - button->setPressHandler([=]() { - if (button->checked()) { - choice->fillMenu(menu, [=](int16_t index) { - return index >= filtermin && index <= filtermax; - }); - } - else { - choice->fillMenu(menu); - } - return 1; - }); - - y += 30; - - setInnerHeight(y); - } -}; - -#endif // _MENUTOOLBAR_H_ - diff --git a/radio/src/gui/libopenui/numberedit.cpp b/radio/src/gui/libopenui/numberedit.cpp deleted file mode 100644 index 5a019740f..000000000 --- a/radio/src/gui/libopenui/numberedit.cpp +++ /dev/null @@ -1,119 +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 -#include -#include "numberedit.h" -#include "draw_functions.h" - -#if defined(HARDWARE_TOUCH) -#include "keyboard_number.h" -#endif - -NumberEdit::NumberEdit(Window * parent, const rect_t & rect, int32_t vmin, int32_t vmax, std::function getValue, std::function setValue, LcdFlags flags): - BaseNumberEdit(parent, rect, vmin, vmax, std::move(getValue), std::move(setValue), flags) -{ -} - -void NumberEdit::paint(BitmapBuffer * dc) -{ - FormField::paint(dc); - - LcdFlags textColor; - if (editMode) - textColor = TEXT_INVERTED_COLOR; - else if (hasFocus()) - textColor = TEXT_INVERTED_BGCOLOR; - else if (enabled) - textColor = TEXT_COLOR; - else - textColor = CURVE_AXIS_COLOR; - - int32_t value = getValue(); - if (displayFunction) - displayFunction(dc, textColor, value); - else if (value == 0 && !zeroText.empty()) - dc->drawText(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, zeroText.c_str(), textColor | flags); - else - drawNumber(dc, FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, textColor | flags, 0, prefix.c_str(), suffix.c_str()); -} - -#if defined(HARDWARE_KEYS) -void NumberEdit::onKeyEvent(event_t event) -{ - TRACE_WINDOWS("%s received event 0x%X", getWindowDebugString().c_str(), event); - - if (editMode) { - if (event == EVT_ROTARY_RIGHT) { - int value = getValue(); - do { - value += rotencSpeed * step; - } while (isValueAvailable && !isValueAvailable(value) && value <= vmax); - if (value <= vmax) - setValue(value); - else - AUDIO_KEY_ERROR(); - return; - } - else if (event == EVT_ROTARY_LEFT) { - int value = getValue(); - do { - value -= rotencSpeed * step; - } while (isValueAvailable && !isValueAvailable(value) && value >= vmin); - if (value >= vmin) - setValue(value); - else - AUDIO_KEY_ERROR(); - return; - } - } - - FormField::onKeyEvent(event); -} -#endif - -#if defined(HARDWARE_TOUCH) -bool NumberEdit::onTouchEnd(coord_t, coord_t) -{ - if (!enabled) { - return true; - } - - if (!hasFocus()) { - setFocus(); - } - - NumberKeyboard * keyboard = NumberKeyboard::instance(); - if (keyboard->getField() != this) { - keyboard->setField(this); - } - - return true; -} -#endif - -void NumberEdit::onFocusLost() -{ -#if defined(HARDWARE_TOUCH) - NumberKeyboard::instance()->disable(true); -#endif - - FormField::onFocusLost(); -} diff --git a/radio/src/gui/libopenui/numberedit.h b/radio/src/gui/libopenui/numberedit.h deleted file mode 100644 index f4d37e138..000000000 --- a/radio/src/gui/libopenui/numberedit.h +++ /dev/null @@ -1,90 +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 _NUMBEREDIT_H_ -#define _NUMBEREDIT_H_ - -#include "basenumberedit.h" -#include - -class NumberEdit : public BaseNumberEdit { - public: - NumberEdit(Window * parent, const rect_t & rect, int32_t vmin, int32_t vmax, - std::function getValue, std::function setValue = nullptr, LcdFlags flags = 0); - -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "NumberEdit(" + std::to_string(getValue()) + ")"; - } -#endif - - void paint(BitmapBuffer * dc) override; - - void enable(bool enabled) - { - this->enabled = enabled; - } - - void setAvailableHandler(std::function handler) - { - isValueAvailable = std::move(handler); - } - - void setPrefix(std::string value) - { - prefix = std::move(value); - } - - void setSuffix(std::string value) - { - suffix = std::move(value); - } - - void setZeroText(std::string value) - { - zeroText = std::move(value); - } - - void setDisplayHandler(std::function function) - { - displayFunction = std::move(function); - } - -#if defined(HARDWARE_KEYS) - void onKeyEvent(event_t event) override; -#endif - -#if defined(HARDWARE_TOUCH) - bool onTouchEnd(coord_t x, coord_t y) override; -#endif - - void onFocusLost() override; - - protected: - std::function displayFunction; - std::string prefix; - std::string suffix; - std::string zeroText; - bool enabled = true; - std::function isValueAvailable; -}; - -#endif // _NUMBEREDIT_H_ diff --git a/radio/src/gui/libopenui/page.cpp b/radio/src/gui/libopenui/page.cpp deleted file mode 100644 index 14c20b2ff..000000000 --- a/radio/src/gui/libopenui/page.cpp +++ /dev/null @@ -1,102 +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 "page.h" -#include "mainwindow.h" -#include "keyboard_number.h" -#include "keyboard_text.h" -#include "keyboard_curve.h" -#include "opentx.h" // TODO for constants - -PageHeader::PageHeader(Page * parent, uint8_t icon): - Window(parent, { 0, 0, LCD_W, MENU_HEADER_HEIGHT }, OPAQUE), - icon(icon) -#if defined(HARDWARE_TOUCH) - , back(this, { 0, 0, MENU_HEADER_BUTTON_WIDTH, MENU_HEADER_BUTTON_WIDTH }, ICON_BACK, - [=]() -> uint8_t { - parent->deleteLater(); - return 0; - }, BUTTON_NOFOCUS) -#endif -{ -} - -void PageHeader::paint(BitmapBuffer * dc) -{ - theme->drawMenuBackground(dc, icon, ""); - dc->drawSolidFilledRect(MENU_HEADER_HEIGHT, 0, LCD_W - MENU_HEADER_HEIGHT, MENU_HEADER_HEIGHT, HEADER_BGCOLOR); -} - -Page::Page(unsigned icon): - Window(&mainWindow, {0, 0, LCD_W, LCD_H}, OPAQUE), - header(this, icon), - body(this, { 0, MENU_HEADER_HEIGHT, LCD_W, LCD_H - MENU_HEADER_HEIGHT }), - previousFocus(focusWindow) -{ - setFocus(); -} - -Page::~Page() -{ -#if defined(HARDWARE_TOUCH) - TextKeyboard::instance()->disable(false); - NumberKeyboard::instance()->disable(false); - CurveKeyboard::instance()->disable(false); -#endif -} - -void Page::deleteLater() -{ - if (previousFocus) { - previousFocus->setFocus(); - } - - Window::deleteLater(); -} - -void Page::paint(BitmapBuffer * dc) -{ - dc->clear(TEXT_BGCOLOR); -} - -#if defined(HARDWARE_KEYS) -void Page::onKeyEvent(event_t event) -{ - TRACE_WINDOWS("%s received event 0x%X", getWindowDebugString().c_str(), event); - - if (event == EVT_KEY_LONG(KEY_EXIT) || event == EVT_KEY_BREAK(KEY_EXIT)) { - killEvents(event); - deleteLater(); - } -} -#endif - -#if defined(HARDWARE_TOUCH) -bool Page::onTouchEnd(coord_t x, coord_t y) -{ - if (Window::onTouchEnd(x, y)) - return true; - - TextKeyboard::instance()->disable(true); - NumberKeyboard::instance()->disable(true); - CurveKeyboard::instance()->disable(true); - return true; -} -#endif diff --git a/radio/src/gui/libopenui/page.h b/radio/src/gui/libopenui/page.h deleted file mode 100644 index 60598c9bb..000000000 --- a/radio/src/gui/libopenui/page.h +++ /dev/null @@ -1,85 +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 _PAGE_H_ -#define _PAGE_H_ - -#include "window.h" -#include "button.h" - -class Page; - -class PageHeader: public Window { - public: - PageHeader(Page * parent, uint8_t icon); - - void paint(BitmapBuffer * dc) override; - - protected: - uint8_t icon; -#if defined(HARDWARE_TOUCH) - IconButton back; -#endif -}; - -class Page: public Window { - public: - Page(unsigned icon); - - ~Page() override; - -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "Page"; - } -#endif - -#if defined(HARDWARE_KEYS) - void onKeyEvent(event_t event) override; -#endif - -#if defined(HARDWARE_TOUCH) - bool onTouchStart(coord_t x, coord_t y) override - { - Window::onTouchStart(x, y); - return true; - } - - bool onTouchEnd(coord_t x, coord_t y) override; - - bool onTouchSlide(coord_t x, coord_t y, coord_t startX, coord_t startY, coord_t slideX, coord_t slideY) override - { - Window::onTouchSlide(x, y, startX, startY, slideX, slideY); - return true; - } -#endif - - void deleteLater(); - - void paint(BitmapBuffer * dc) override; - - protected: - PageHeader header; - FormWindow body; - Window * previousFocus; -}; - -#endif // _PAGE_H_ diff --git a/radio/src/gui/libopenui/slider.cpp b/radio/src/gui/libopenui/slider.cpp deleted file mode 100644 index a0b84099d..000000000 --- a/radio/src/gui/libopenui/slider.cpp +++ /dev/null @@ -1,102 +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 "slider.h" -#include "bitmaps.h" -#include "opentx.h" // TODO remove this - -void Slider::paint(BitmapBuffer * dc) -{ - int val = limit(vmin, getValue(), vmax); - int w = divRoundClosest((rect.w - 16) * (val - vmin), vmax - vmin); - - if (editMode) { - dc->drawBitmapPattern(0, 11, LBM_SLIDER_BAR_LEFT, TEXT_INVERTED_BGCOLOR); - dc->drawSolidFilledRect(4, 11, rect.w - 8, 4, TEXT_INVERTED_BGCOLOR); - dc->drawBitmapPattern(rect.w - 4, 11, LBM_SLIDER_BAR_RIGHT, TEXT_INVERTED_BGCOLOR); - } - else { - dc->drawBitmapPattern(0, 11, LBM_SLIDER_BAR_LEFT, LINE_COLOR); - dc->drawSolidFilledRect(4, 11, rect.w - 8, 4, LINE_COLOR); - dc->drawBitmapPattern(rect.w - 4, 11, LBM_SLIDER_BAR_RIGHT, LINE_COLOR); - } - - dc->drawBitmapPattern(w, 5, LBM_SLIDER_POINT_OUT, TEXT_COLOR); - dc->drawBitmapPattern(w, 5, LBM_SLIDER_POINT_MID, TEXT_BGCOLOR); - // if ((options & INVERS) && (!(options & BLINK) || !BLINK_ON_PHASE)) - if (hasFocus()) { - dc->drawBitmapPattern(w, 5, LBM_SLIDER_POINT_IN, TEXT_INVERTED_BGCOLOR); - } -} - -int Slider::value(coord_t x) const -{ - return vmin + ((vmax - vmin) * x + (rect.w / 2)) / rect.w; -} - -#if defined(HARDWARE_KEYS) -void Slider::onKeyEvent(event_t event) -{ - TRACE_WINDOWS("%s received event 0x%X", getWindowDebugString().c_str(), event); - - if (editMode) { - if (event == EVT_ROTARY_RIGHT) { - setValue(getValue() + rotencSpeed); - return; - } - else if (event == EVT_ROTARY_LEFT) { - setValue(getValue() - rotencSpeed); - return; - } - } - - FormField::onKeyEvent(event); -} -#endif - -#if defined(HARDWARE_TOUCH) -bool Slider::onTouchStart(coord_t x, coord_t y) -{ - if (!hasFocus()) { - setFocus(); - } - sliding = (value(x) == getValue()); - return true; -} - -bool Slider::onTouchEnd(coord_t x, coord_t y) -{ - setValue(value(x)); - invalidate(); - return true; -} - -bool Slider::onTouchSlide(coord_t x, coord_t y, coord_t startX, coord_t startY, coord_t slideX, coord_t slideY) -{ - if (hasFocus() && sliding) { - int newValue = value(x); - if (getValue() != newValue) { - setValue(newValue); - invalidate(); - } - } - return true; -} -#endif diff --git a/radio/src/gui/libopenui/slider.h b/radio/src/gui/libopenui/slider.h deleted file mode 100644 index 84d8c5667..000000000 --- a/radio/src/gui/libopenui/slider.h +++ /dev/null @@ -1,73 +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 _SLIDER_H_ -#define _SLIDER_H_ - -#include "form.h" - -class Slider : public FormField { - public: - Slider(Window * parent, const rect_t & rect, int32_t vmin, int32_t vmax, std::function getValue, std::function setValue): - FormField(parent, rect), - vmin(vmin), - vmax(vmax), - getValue(std::move(getValue)), - _setValue(std::move(setValue)) - { - } - -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "Slider"; - } -#endif - - void setValue(int32_t value) - { - _setValue(limit(vmin, value, vmax)); - invalidate(); - } - - void paint(BitmapBuffer * dc) override; - -#if defined(HARDWARE_KEYS) - void onKeyEvent(event_t event) override; -#endif - -#if defined(HARDWARE_TOUCH) - bool onTouchStart(coord_t x, coord_t y) override; - - bool onTouchEnd(coord_t x, coord_t y) override; - - bool onTouchSlide(coord_t x, coord_t y, coord_t startX, coord_t startY, coord_t slideX, coord_t slideY) override; -#endif - - protected: - int value(coord_t x) const; - int32_t vmin; - int32_t vmax; - bool sliding = false; - std::function getValue; - std::function _setValue; -}; - -#endif diff --git a/radio/src/gui/libopenui/static.h b/radio/src/gui/libopenui/static.h deleted file mode 100644 index 53893e944..000000000 --- a/radio/src/gui/libopenui/static.h +++ /dev/null @@ -1,116 +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 _STATIC_H_ -#define _STATIC_H_ - -#include -#include "window.h" -#include "button.h" // TODO just for BUTTON_BACKGROUND - -class StaticText : public Window { - public: - StaticText(Window * parent, const rect_t & rect, std::string text = "", LcdFlags flags = 0) : - Window(parent, rect), - text(std::move(text)), - flags(flags) - { - } - -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "StaticText \"" + text + "\""; - } -#endif - - void setFlags(LcdFlags flags) - { - this->flags = flags; - invalidate(); - } - - void paint(BitmapBuffer * dc) - { - if (flags & BUTTON_BACKGROUND) - dc->drawSolidFilledRect(0, 0, rect.w, rect.h, CURVE_AXIS_COLOR); - if (flags & CENTERED) - dc->drawText(rect.w / 2, (rect.h - getFontHeight(flags)) / 2, text.c_str(), CENTERED | flags); - else - dc->drawText(0, 0, text.c_str(), flags); - } - - void setText(std::string value) - { - text = std::move(value); - invalidate(); - } - - protected: - std::string text; - LcdFlags flags; -}; - -class Subtitle: public StaticText { - public: - Subtitle(Window * parent, const rect_t & rect, const char * text): - StaticText(parent, rect, text, BOLD) - { - } - -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "Subtitle \"" + text + "\""; - } -#endif -}; - -class StaticBitmap: public Window { - public: - StaticBitmap(Window * parent, const rect_t & rect, const char * filename): - Window(parent, rect), - bitmap(BitmapBuffer::load(filename)) - { - } - - StaticBitmap(Window * parent, const rect_t & rect, const BitmapBuffer * bitmap): - Window(parent, rect), - bitmap(bitmap) - { - } - -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "StaticBitmap"; - } -#endif - - void paint(BitmapBuffer * dc) override - { - dc->drawBitmap(0, 0, bitmap); - } - - protected: - const BitmapBuffer * bitmap; -}; - -#endif diff --git a/radio/src/gui/libopenui/tabsgroup.cpp b/radio/src/gui/libopenui/tabsgroup.cpp deleted file mode 100644 index 248a096ca..000000000 --- a/radio/src/gui/libopenui/tabsgroup.cpp +++ /dev/null @@ -1,185 +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 "tabsgroup.h" -#include "mainwindow.h" - -#if defined(HARDWARE_TOUCH) -#include "keyboard_number.h" -#include "keyboard_text.h" -#include "keyboard_curve.h" -#endif - -#include "opentx.h" // TODO for constants... -#include "view_main.h" - -TabsGroupHeader::TabsGroupHeader(TabsGroup * parent, uint8_t icon): - Window(parent, { 0, 0, LCD_W, MENU_BODY_TOP }, OPAQUE), -#if defined(HARDWARE_TOUCH) - back(this, { 0, 0, MENU_HEADER_BUTTON_WIDTH, MENU_HEADER_BUTTON_WIDTH }, ICON_BACK, - [=]() -> uint8_t { - parent->deleteLater(); - return 1; - }, BUTTON_NOFOCUS), -#endif - icon(icon), - carousel(this, parent) -{ -} - -void TabsGroupHeader::paint(BitmapBuffer * dc) -{ - theme->drawMenuBackground(dc, icon, title); -} - -TabsCarousel::TabsCarousel(Window * parent, TabsGroup * menu): - Window(parent, { MENU_HEADER_BUTTONS_LEFT, 0, LCD_W - MENU_HEADER_BUTTONS_LEFT, MENU_HEADER_HEIGHT + 10 }, TRANSPARENT), - menu(menu) -{ -} - -void TabsCarousel::updateInnerWidth() -{ - setInnerWidth(padding_left + MENU_HEADER_BUTTON_WIDTH * menu->tabs.size()); -} - -void TabsCarousel::paint(BitmapBuffer * dc) -{ - theme->drawMenuHeader(dc, menu->tabs, currentIndex); -} - -#if defined(HARDWARE_TOUCH) -bool TabsCarousel::onTouchEnd(coord_t x, coord_t y) -{ - unsigned index = (x - padding_left) / MENU_HEADER_BUTTON_WIDTH; - menu->setCurrentTab(index); - setCurrentIndex(index); - return true; -} -#endif - -TabsGroup::TabsGroup(uint8_t icon): - Window(&mainWindow, { 0, 0, LCD_W, LCD_H }, OPAQUE), - header(this, icon), - body(this, { 0, MENU_BODY_TOP, LCD_W, MENU_BODY_HEIGHT }) -{ -} - -TabsGroup::~TabsGroup() -{ - for (auto tab: tabs) { - delete tab; - } - - body.deleteChildren(); - -#if defined(HARDWARE_TOUCH) - TextKeyboard::instance()->disable(false); - NumberKeyboard::instance()->disable(false); - CurveKeyboard::instance()->disable(false); -#endif -} - -void TabsGroup::addTab(PageTab * page) -{ - tabs.push_back(page); - if (!currentTab) { - setCurrentTab(page); - } - header.carousel.updateInnerWidth(); -} - -void TabsGroup::removeTab(unsigned index) -{ - if (currentTab == tabs[index]) { - setCurrentTab(max(0, index - 1)); - } - - tabs.erase(tabs.begin() + index); -} - -void TabsGroup::setCurrentTab(PageTab * tab) -{ - if (tab != currentTab) { - setFocus(); - FormField::clearCurrentField(); - body.clear(); -#if defined(HARDWARE_TOUCH) - TextKeyboard::instance()->disable(false); - NumberKeyboard::instance()->disable(false); - CurveKeyboard::instance()->disable(false); -#endif - currentTab = tab; - tab->build(&body); - header.setTitle(tab->title.c_str()); - invalidate(); - } -} - -void TabsGroup::checkEvents() -{ - Window::checkEvents(); - if (currentTab) { - currentTab->checkEvents(); - } -} - -#if defined(HARDWARE_KEYS) -void TabsGroup::onKeyEvent(event_t event) -{ - TRACE_WINDOWS("%s received event 0x%X", getWindowDebugString().c_str(), event); - - if (event == EVT_KEY_BREAK(KEY_PGDN)) { - uint8_t current = header.carousel.getCurrentIndex() + 1; - setCurrentTab(current >= tabs.size() ? 0 : current); - } - else if (event == EVT_KEY_LONG(KEY_PGDN)) { - killEvents(event); - uint8_t current = header.carousel.getCurrentIndex(); - setCurrentTab(current == 0 ? tabs.size() - 1 : current - 1); - } - else if (event == EVT_KEY_LONG(KEY_EXIT) || event == EVT_KEY_BREAK(KEY_EXIT)) { - killEvents(event); - ViewMain::instance->setFocus(); - deleteLater(); - } - else if (parent) { - parent->onKeyEvent(event); - } -} -#endif - -void TabsGroup::paint(BitmapBuffer * dc) -{ - dc->clear(TEXT_BGCOLOR); -} - -#if defined(HARDWARE_TOUCH) -bool TabsGroup::onTouchEnd(coord_t x, coord_t y) -{ - if (Window::onTouchEnd(x, y)) - return true; - - TextKeyboard::instance()->disable(true); - NumberKeyboard::instance()->disable(true); - CurveKeyboard::instance()->disable(true); - return true; -} -#endif diff --git a/radio/src/gui/libopenui/tabsgroup.h b/radio/src/gui/libopenui/tabsgroup.h deleted file mode 100644 index b81a1ab06..000000000 --- a/radio/src/gui/libopenui/tabsgroup.h +++ /dev/null @@ -1,186 +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 _TABSGROUP_H_ -#define _TABSGROUP_H_ - -#include -#include "button.h" -#include "form.h" - -class TabsGroup; - -class PageTab { - friend class TabsCarousel; - friend class TabsGroup; - - public: - PageTab(std::string title, unsigned icon): - title(std::move(title)), - icon(icon) - { - } - - virtual ~PageTab() - { - } - - virtual void build(FormWindow * window) = 0; - - virtual void checkEvents() - { - } - - void destroy() - { - if (onPageDestroyed) { - onPageDestroyed(); - } - delete this; - } - - void setOnPageDestroyedHandler(std::function handler) - { - onPageDestroyed = std::move(handler); - } - - unsigned getIcon() const - { - return icon; - } - - protected: - std::string title; - unsigned icon; - std::function onPageDestroyed; -}; - -class TabsCarousel: public Window { - public: - TabsCarousel(Window * parent, TabsGroup * menu); - -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "TabsCarousel"; - } -#endif - - inline void setCurrentIndex(uint8_t index) - { - currentIndex = index; - } - - inline uint8_t getCurrentIndex() - { - return currentIndex; - } - - void updateInnerWidth(); - - void paint(BitmapBuffer * dc) override; - -#if defined(HARDWARE_TOUCH) - bool onTouchEnd(coord_t x, coord_t y) override; -#endif - - protected: - constexpr static uint8_t padding_left = 3; - TabsGroup * menu; - uint8_t currentIndex = 0; -}; - -class TabsGroupHeader: public Window { - friend class TabsGroup; - - public: - TabsGroupHeader(TabsGroup * menu, uint8_t icon); - -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "TabsGroupHeader"; - } -#endif - - void paint(BitmapBuffer * dc) override; - - void setTitle(const char * value) - { - title = value; - } - - protected: -#if defined(HARDWARE_TOUCH) - IconButton back; -#endif - uint8_t icon; - TabsCarousel carousel; - const char * title = nullptr; -}; - -class TabsGroup: public Window { - friend class TabsCarousel; - - public: - TabsGroup(uint8_t icon); - - ~TabsGroup(); - -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "TabsGroup"; - } -#endif - - void addTab(PageTab * page); - - void removeTab(unsigned index); - - void setCurrentTab(unsigned index) - { - if (index < tabs.size()) { - header.carousel.setCurrentIndex(index); - setCurrentTab(tabs[index]); - } - } - - void checkEvents() override; - -#if defined(HARDWARE_KEYS) - void onKeyEvent(event_t event) override; -#endif - - void paint(BitmapBuffer * dc) override; - -#if defined(HARDWARE_TOUCH) - bool onTouchEnd(coord_t x, coord_t y) override; -#endif - - protected: - TabsGroupHeader header; - FormWindow body; - std::vector tabs; - PageTab * currentTab = nullptr; - void setCurrentTab(PageTab * tab); -}; - -#endif diff --git a/radio/src/gui/libopenui/textedit.cpp b/radio/src/gui/libopenui/textedit.cpp deleted file mode 100644 index b56d302a2..000000000 --- a/radio/src/gui/libopenui/textedit.cpp +++ /dev/null @@ -1,171 +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 "textedit.h" -// #include "keyboard_text.h" -#include "draw_functions.h" -#include "opentx.h" - -void TextEdit::paint(BitmapBuffer * dc) -{ - LcdFlags flags = ZCHAR; - - FormField::paint(dc); - - if (editMode) { - dc->drawSizedText(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, length, TEXT_INVERTED_COLOR | flags); - coord_t left = (cursorPos == 0 ? 0 : getTextWidth(value, cursorPos, flags)); - char s[] = { (flags & ZCHAR) ? zchar2char(value[cursorPos]) : value[cursorPos], '\0' }; - dc->drawSolidFilledRect(FIELD_PADDING_LEFT + left - 1, FIELD_PADDING_TOP + 1, getTextWidth(s, 1) + 1, height() - 2, TEXT_INVERTED_COLOR); - dc->drawText(FIELD_PADDING_LEFT + left, FIELD_PADDING_TOP, s, TEXT_COLOR); - } - else { - const char * displayedValue = value; - LcdFlags textColor; - if (zlen(value, length) == 0) { - displayedValue = "---"; - textColor = hasFocus() ? TEXT_INVERTED_BGCOLOR : CURVE_AXIS_COLOR; - } - else if (hasFocus()) { - textColor = TEXT_INVERTED_BGCOLOR | ZCHAR; - } - else { - textColor = TEXT_COLOR | ZCHAR; - } - dc->drawSizedText(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, displayedValue, length, textColor); - } - -#if defined(HARDWARE_TOUCH) - auto keyboard = TextKeyboard::instance(); - if (hasFocus() && keyboard->getField() == this) { - coord_t cursorPos = keyboard->getCursorPos(); - dc->drawSolidFilledRect(cursorPos + 2, FIELD_PADDING_TOP, 2, 21, 0); // TEXT_INVERTED_BGCOLOR); - } -#endif -} - -#if defined(HARDWARE_KEYS) -void TextEdit::onKeyEvent(event_t event) -{ - TRACE_WINDOWS("%s received event 0x%X", getWindowDebugString().c_str(), event); - - LcdFlags flags = ZCHAR; - - if (editMode) { - int8_t c = value[cursorPos]; - if (!(flags & ZCHAR)) { - c = char2zchar(c); - } - int8_t v = c; - - switch (event) { - case EVT_ROTARY_RIGHT: - case EVT_ROTARY_LEFT: - v = limit(0, abs(v) + (event == EVT_ROTARY_RIGHT ? +rotencSpeed : -rotencSpeed), ZCHAR_MAX); - if (c <= 0) v = -v; - break; - - case EVT_KEY_BREAK(KEY_LEFT): - if (cursorPos > 0) { - cursorPos--; - invalidate(); - } - break; - - case EVT_KEY_BREAK(KEY_RIGHT): - if (cursorPos < length - 1) { - cursorPos++; - invalidate(); - } - break; - - case EVT_KEY_BREAK(KEY_ENTER): - if (cursorPos < length - 1) { - cursorPos++; - invalidate(); - } - else { - FormField::onKeyEvent(event); - } - break; - - case EVT_KEY_BREAK(KEY_EXIT): - cursorPos = 0; - FormField::onKeyEvent(event); - break; - - case EVT_KEY_LONG(KEY_ENTER): - if (v == 0) { - killEvents(event); - FormField::onKeyEvent(EVT_KEY_BREAK(KEY_ENTER)); - break; - } - // no break - - case EVT_KEY_LONG(KEY_LEFT): - case EVT_KEY_LONG(KEY_RIGHT): - if (v >= -26 && v <= 26) { - v = -v; // toggle case - if (event == EVT_KEY_LONG(KEY_LEFT)) { - killEvents(KEY_LEFT); - } - } - break; - } - - if (c != v) { - if (!(flags & ZCHAR)) { - if (v != '\0' || value[cursorPos+1] != '\0') - v = zchar2char(v); - } - value[cursorPos] = v; - invalidate(); - // TODO storageDirty(...); - } - } - else { - FormField::onKeyEvent(event); - } -} -#endif - -#if defined(HARDWARE_TOUCH) -bool TextEdit::onTouchEnd(coord_t x, coord_t y) -{ - if (!hasFocus()) { - setFocus(); - } - - auto keyboard = TextKeyboard::instance(); - if (keyboard->getField() != this) { - keyboard->setField(this); - } - - keyboard->setCursorPos(x); - - return true; -} - -void TextEdit::onFocusLost() -{ - TextKeyboard::instance()->disable(true); - // TODO storageDirty(...); -} -#endif diff --git a/radio/src/gui/libopenui/textedit.h b/radio/src/gui/libopenui/textedit.h deleted file mode 100644 index 914d68061..000000000 --- a/radio/src/gui/libopenui/textedit.h +++ /dev/null @@ -1,74 +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 _TEXTEDIT_H_ -#define _TEXTEDIT_H_ - -#include "form.h" - -uint8_t zlen(const char *str, uint8_t size); - -class TextEdit : public FormField { - friend class TextKeyboard; - - public: - TextEdit(Window * parent, const rect_t &rect, char * value, uint8_t length, LcdFlags flags = 0) : - FormField(parent, rect), - value(value), - length(length) - { - } - -#if defined(DEBUG_WINDOWS) - std::string getName() override - { - return "TextEdit"; - } -#endif - - uint8_t getMaxLength() - { - return length; - } - - char * getData() - { - return value; - } - - void paint(BitmapBuffer * dc) override; - -#if defined(HARDWARE_KEYS) - void onKeyEvent(event_t event) override; -#endif - -#if defined(HARDWARE_TOUCH) - bool onTouchEnd(coord_t x, coord_t y) override; - - void onFocusLost() override; -#endif - - protected: - char * value; - uint8_t length; - uint8_t cursorPos = 0; -}; - -#endif // _TEXTEDIT_H_ diff --git a/radio/src/gui/libopenui/window.cpp b/radio/src/gui/libopenui/window.cpp deleted file mode 100644 index 49025d5d7..000000000 --- a/radio/src/gui/libopenui/window.cpp +++ /dev/null @@ -1,396 +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 "window.h" -#include "keys.h" - -Window * Window::focusWindow = nullptr; -std::list Window::trash; - -Window::Window(Window * parent, const rect_t & rect, uint8_t flags): - parent(parent), - rect(rect), - innerWidth(rect.w), - innerHeight(rect.h), - windowFlags(flags) -{ - if (parent) { - parent->addChild(this); - if (!(flags & TRANSPARENT)) { - invalidate(); - } - } -} - -Window::~Window() -{ - TRACE_WINDOWS("Destroy %p %s", this, getWindowDebugString().c_str()); - if (focusWindow == this) { - focusWindow = nullptr; - } -} - -void Window::attach(Window * window) -{ - if (parent) - detach(); - parent = window; - parent->addChild(this); -} - -void Window::detach() -{ - if (parent) { - parent->removeChild(this); - parent = nullptr; - } -} - -void Window::deleteLater(bool detach) -{ - TRACE_WINDOWS("Delete %p %s", this, getWindowDebugString().c_str()); - - if (focusWindow == this) { - focusWindow = nullptr; - } - - if (detach) - this->detach(); - else - parent = nullptr; - - if (closeHandler) { - closeHandler(); - } - - trash.push_back(this); -} - -void Window::clear() -{ - scrollPositionX = 0; - scrollPositionY = 0; - innerWidth = rect.w; - innerHeight = rect.h; - deleteChildren(); - invalidate(); -} - -void Window::deleteChildren() -{ - for (auto window: children) { - window->deleteLater(false); - } - children.clear(); -} - -void Window::clearFocus() -{ - if (focusWindow) { - focusWindow->onFocusLost(); - focusWindow = nullptr; - } -} - -void Window::setFocus() -{ - TRACE_WINDOWS("%s setFocus()", getWindowDebugString().c_str()); - - if (focusWindow != this) { - clearFocus(); - focusWindow = this; - if (focusHandler) { - focusHandler(); - } - } - - Window * parent = this->parent; - while (parent && parent->getWindowFlags() & FORWARD_SCROLL) { - parent = parent->parent; - } - - if (parent) { - parent->scrollTo(this); - invalidate(); - } -} - -void Window::setScrollPositionX(coord_t value) -{ - coord_t newScrollPosition = max(0, min(innerWidth - width(), value)); - if (newScrollPosition != scrollPositionX) { - scrollPositionX = newScrollPosition; - invalidate(); - } -} - -void Window::setScrollPositionY(coord_t value) -{ - coord_t newScrollPosition = max(0, min(innerHeight - height(), value)); - if (newScrollPosition != scrollPositionY) { - scrollPositionY = newScrollPosition; - invalidate(); - } -} - -void Window::scrollTo(Window * child) -{ - coord_t offsetY = 0; - Window * parent = child->getParent(); - while (parent && parent != this) { - offsetY += parent->top(); - parent = parent->getParent(); - } - - coord_t top = offsetY + child->top(); - coord_t bottom = offsetY + child->bottom(); - - if (top < scrollPositionY) { - setScrollPositionY(top - 5); - } - else if (bottom > scrollPositionY + height() - 5) { - setScrollPositionY(bottom - height() + 5); - } -} - -void Window::fullPaint(BitmapBuffer * dc) -{ - TRACE_WINDOWS("%s", getWindowDebugString().c_str()); - - if (windowFlags & PAINT_CHILDREN_FIRST) { - coord_t xmin, xmax, ymin, ymax; - coord_t x = dc->getOffsetX(); - coord_t y = dc->getOffsetY(); - dc->getClippingRect(xmin, xmax, ymin, ymax); - paintChildren(dc); - dc->setOffset(x, y); - dc->setClippingRect(xmin, xmax, ymin, ymax); - } - - paint(dc); - - if (!(windowFlags & NO_SCROLLBAR)) { - drawVerticalScrollbar(dc); - } - - if (!(windowFlags & PAINT_CHILDREN_FIRST)) { - paintChildren(dc); - } -} - -bool Window::isChildFullSize(Window * child) -{ - return child->top() == 0 && child->height() == height() && child->left() == 0 && child->width() == width(); -} - -bool Window::isChildVisible(Window * window) -{ - for (auto rit = children.rbegin(); rit != children.rend(); rit++) { - auto child = *rit; - if (child == window) { - return true; - } - if ((child->getWindowFlags() & OPAQUE) & isChildFullSize(child)) { - return false; - } - } - return false; -} - -void Window::paintChildren(BitmapBuffer * dc) -{ - coord_t x = dc->getOffsetX(); - coord_t y = dc->getOffsetY(); - coord_t xmin, xmax, ymin, ymax; - dc->getClippingRect(xmin, xmax, ymin, ymax); - - auto it = children.end(); - - while(it != children.begin()) { - auto child = *(--it); - if ((child->windowFlags & OPAQUE) && isChildFullSize(child)) { - break; - } - } - - for (; it != children.end(); it++) { - auto child = *it; - - coord_t child_xmin = x + child->rect.x; - if (child_xmin >= xmax) - continue; - coord_t child_ymin = y + child->rect.y; - if (child_ymin >= ymax) - continue; - coord_t child_xmax = child_xmin + child->rect.w; - if (child_xmax <= xmin) - continue; - coord_t child_ymax = child_ymin + child->rect.h; - if (child_ymax <= ymin) - continue; - - dc->setOffset(x + child->rect.x - child->scrollPositionX, y + child->rect.y - child->scrollPositionY); - dc->setClippingRect(max(xmin, x + child->rect.left()), - min(xmax, x + child->rect.right()), - max(ymin, y + child->rect.top()), - min(ymax, y + child->rect.bottom())); - child->fullPaint(dc); - } -} - -void Window::checkEvents() -{ - auto copy = children; - for (auto child: copy) { - child->checkEvents(); - } - -#if defined(HARDWARE_KEYS) - if (this == focusWindow) { - event_t event = getEvent(false); - if (event) { - TRACE_WINDOWS("Event 0x%x received ...", event); - this->onKeyEvent(event); - } - } -#endif - - if (windowFlags & REFRESH_ALWAYS) { - invalidate(); - } -} - -#if defined(HARDWARE_KEYS) -void Window::onKeyEvent(event_t event) -{ - TRACE_WINDOWS("%s received event 0x%X", Window::getWindowDebugString().c_str(), event); - if (parent) { - parent->onKeyEvent(event); - } -} -#endif - -#if defined(HARDWARE_TOUCH) -bool Window::onTouchStart(coord_t x, coord_t y) -{ - for (auto it = children.rbegin(); it != children.rend(); ++it) { - auto child = *it; - if (pointInRect(x, y, child->rect)) { - if (child->onTouchStart(x - child->rect.x + child->scrollPositionX, y - child->rect.y + child->scrollPositionY)) { - return true; - } - } - } - - return false; -} - -bool Window::onTouchEnd(coord_t x, coord_t y) -{ - for (auto it = children.rbegin(); it != children.rend(); ++it) { - auto child = *it; - if (pointInRect(x, y, child->rect)) { - if (child->onTouchEnd(x - child->rect.x + child->scrollPositionX, y - child->rect.y + child->scrollPositionY)) { - return true; - } - } - } - - return false; -} - -bool Window::onTouchSlide(coord_t x, coord_t y, coord_t startX, coord_t startY, coord_t slideX, coord_t slideY) -{ - for (auto it = children.rbegin(); it != children.rend(); ++it) { - auto child = *it; - if (pointInRect(startX, startY, child->rect)) { - if (child->onTouchSlide(x - child->rect.x, y - child->rect.y, startX - child->rect.x, startY - child->rect.y, slideX, slideY)) { - return true; - } - } - } - - if (slideY && innerHeight > rect.h) { - setScrollPositionY(scrollPositionY - slideY); - return true; - } - - if (slideX && innerWidth > rect.w) { - setScrollPositionX(scrollPositionX - slideX); - return true; - } - - return false; -} -#endif - -void Window::adjustInnerHeight() -{ - innerHeight = 0; - for (auto child: children) { - innerHeight = max(innerHeight, child->rect.y + child->rect.h); - } -} - -coord_t Window::adjustHeight() -{ - adjustInnerHeight(); - coord_t old = rect.h; - rect.h = innerHeight; - return rect.h - old; -} - -void Window::moveWindowsTop(coord_t y, coord_t delta) -{ - for (auto child: children) { - if (child->rect.y > y) { - child->rect.y += delta; - } - } - innerHeight += delta; -} - -void Window::invalidate(const rect_t & rect) -{ - if (isVisible()) { - parent->invalidate({this->rect.x + rect.x - parent->scrollPositionX, this->rect.y + rect.y - parent->scrollPositionY, rect.w, rect.h}); - } -} - -void Window::drawVerticalScrollbar(BitmapBuffer * dc) -{ - if (innerHeight > rect.h) { - coord_t x = rect.w - 3; - coord_t y = scrollPositionY + 3; - coord_t h = rect.h - 6; - // lcd->drawSolidFilledRect(x, y, 1, h, LINE_COLOR); - coord_t yofs = (h*scrollPositionY + innerHeight/2) / innerHeight; - coord_t yhgt = (h*rect.h + innerHeight/2) / innerHeight; - if (yhgt + yofs > h) - yhgt = h - yofs; - if (yhgt < 15) { - yhgt = 15; - if (y + yofs + yhgt > innerHeight) { - yofs = innerHeight - y - yhgt; - } - } - dc->drawSolidFilledRect(x-1, y + yofs, 3, yhgt, scrollbarColor); - } -} diff --git a/radio/src/gui/libopenui/window.h b/radio/src/gui/libopenui/window.h deleted file mode 100644 index f80afab0e..000000000 --- a/radio/src/gui/libopenui/window.h +++ /dev/null @@ -1,330 +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 _WINDOW_H_ -#define _WINDOW_H_ - -#include -#include -#include -#include -#include -#include -#include "bitmapbuffer.h" -#include "libopenui_defines.h" -#include "libopenui_helpers.h" - -// OPAQUE/TRANSPARENT defined in WinGDI -#ifndef OPAQUE - #define OPAQUE 1 - #define TRANSPARENT 2 -#endif - -#define NO_SCROLLBAR 4 -#define FORWARD_SCROLL 8 -#define REFRESH_ALWAYS 16 -#define BORDER_FOCUS_ONLY 32 -#define PAINT_CHILDREN_FIRST 64 - -class Window { - friend class GridLayout; - - public: - Window(Window * parent, const rect_t & rect, uint8_t flags=0); - - virtual ~Window(); - -#if defined(DEBUG_WINDOWS) - virtual std::string getName() - { - return "Window"; - } - - std::string getRectString() - { - char result[32]; - sprintf(result, "[%d, %d, %d, %d]", left(), top(), width(), height()); - return result; - } - - std::string getIndentString() - { - std::string result; - auto tmp = parent; - while (tmp) { - result += " "; - tmp = tmp->getParent(); - } - return result; - } - - std::string getWindowDebugString() - { - return getIndentString() + getName() + " " + getRectString(); - } -#endif - - Window * getParent() const - { - return parent; - } - - uint8_t getWindowFlags() const - { - return windowFlags; - } - - void setWindowFlags(uint8_t flags) - { - windowFlags = flags; - } - - void setCloseHandler(std::function handler) - { - closeHandler = std::move(handler); - } - - void setFocusHandler(std::function handler) - { - focusHandler = std::move(handler); - } - - void deleteLater(bool detach=true); - - void clear(); - - void deleteChildren(); - - bool hasFocus() const - { - return focusWindow == this; - } - - static Window * getFocus() - { - return focusWindow; - } - - void scrollTo(Window * child); - - static void clearFocus(); - - void setFocus(); - - void setRect(rect_t rect) - { - this->rect = rect; - invalidate(); - } - - void setWidth(coord_t value) - { - rect.w = value; - invalidate(); - } - - void setHeight(coord_t value) - { - rect.h = value; - if (innerHeight <= value) { - setScrollPositionY(0); - } - invalidate(); - } - - coord_t getHeight() - { - return rect.h; - } - - void setLeft(coord_t x) - { - rect.x = x; - invalidate(); - } - - void setTop(coord_t y) - { - rect.y = y; - invalidate(); - } - - coord_t left() const - { - return rect.x; - } - - coord_t right() const - { - return rect.x + rect.w; - } - - coord_t top() const - { - return rect.y; - } - - coord_t bottom() const - { - return rect.y + rect.h; - } - - coord_t width() const - { - return rect.w; - } - - coord_t height() const - { - return rect.h; - } - - rect_t getRect() const - { - return rect; - } - - void setInnerWidth(coord_t w) - { - innerWidth = w; - if (width() >= w) { - scrollPositionX = 0; - } - } - - void setInnerHeight(coord_t h) - { - innerHeight = h; - if (height() >= h) { - scrollPositionY = 0; - } - } - - void setScrollbarColor(LcdFlags color) - { - scrollbarColor = color; - } - - coord_t getScrollPositionY() const - { - return scrollPositionY; - } - - void setScrollPositionX(coord_t value); - - void setScrollPositionY(coord_t value); - - bool isChildVisible(Window * window); - - bool isChildFullSize(Window * window); - - bool isVisible() - { - return parent && parent->isChildVisible(this); - } - - virtual void paint(BitmapBuffer * dc) - { - } - - void drawVerticalScrollbar(BitmapBuffer * dc); - - void paintChildren(BitmapBuffer * dc); - - void fullPaint(BitmapBuffer * dc); - - bool pointInRect(coord_t x, coord_t y, rect_t & rect) - { - return (x >= rect.x && x < rect.x + rect.w && y >= rect.y && y < rect.y + rect.h); - } - - virtual void onFocusLost() - { - TRACE_WINDOWS("%s onFocusLost()", getWindowDebugString().c_str()); - invalidate(); - }; - -#if defined(HARDWARE_KEYS) - virtual void onKeyEvent(event_t event); -#endif - -#if defined(HARDWARE_TOUCH) - virtual bool onTouchStart(coord_t x, coord_t y); - - virtual bool onTouchEnd(coord_t x, coord_t y); - - virtual bool onTouchSlide(coord_t x, coord_t y, coord_t startX, coord_t startY, coord_t slideX, coord_t slideY); -#endif - - void adjustInnerHeight(); - - coord_t adjustHeight(); - - void moveWindowsTop(coord_t y, coord_t delta); - - void invalidate() - { - invalidate({0, 0, rect.w, rect.h}); - } - - void bringToTop() - { - attach(parent); // does a detach + attach - } - - virtual void checkEvents(); - - protected: - Window * parent; - std::list children; - rect_t rect; - coord_t innerWidth; - coord_t innerHeight; - coord_t scrollPositionX = 0; - coord_t scrollPositionY = 0; - uint8_t windowFlags; - LcdFlags scrollbarColor = SCROLLBOX_COLOR; - - static Window * focusWindow; - static std::list trash; - - std::function closeHandler; - std::function focusHandler; - - void attach(Window * window); - - void detach(); - - void addChild(Window * window) - { - children.push_back(window); - } - - void removeChild(Window * window) - { - children.remove(window); - invalidate(); - } - - virtual void invalidate(const rect_t & rect); -}; - -#endif // _WINDOW_H_ diff --git a/radio/src/gui/screenshot.cpp b/radio/src/gui/screenshot.cpp index 0a0e166bf..32312dab5 100644 --- a/radio/src/gui/screenshot.cpp +++ b/radio/src/gui/screenshot.cpp @@ -80,7 +80,7 @@ const char * writeScreenshot() #if defined(COLORLCD) for (int y = LCD_H - 1; y >= 0; y--) { for (int x = 0; x < LCD_W; x++) { - display_t pixel = *lcd->getPixelPtr(x, y); + pixel_t pixel = *lcd->getPixelPtr(x, y); uint32_t dst = (0xFF << 24) + (GET_RED(pixel) << 16) + (GET_GREEN(pixel) << 8) + (GET_BLUE(pixel) << 0); if (f_write(&bmpFile, &dst, sizeof(dst), &written) != FR_OK || written != sizeof(dst)) { f_close(&bmpFile); @@ -91,7 +91,7 @@ const char * writeScreenshot() #else for (int y=LCD_H-1; y>=0; y-=1) { for (int x=0; x<8*((LCD_W+7)/8); x+=2) { - display_t byte = getPixel(x+1, y) + (getPixel(x, y) << 4); + pixel_t byte = getPixel(x+1, y) + (getPixel(x, y) << 4); if (f_write(&bmpFile, &byte, 1, &written) != FR_OK || written != 1) { f_close(&bmpFile); return SDCARD_ERROR(result); diff --git a/radio/src/io/frsky_firmware_update.cpp b/radio/src/io/frsky_firmware_update.cpp index 026571b57..94166e34a 100644 --- a/radio/src/io/frsky_firmware_update.cpp +++ b/radio/src/io/frsky_firmware_update.cpp @@ -20,6 +20,7 @@ #include "opentx.h" #include "frsky_firmware_update.h" +#include "libopenui/src/libopenui_file.h" #define PRIM_REQ_POWERUP 0 #define PRIM_REQ_VERSION 1 diff --git a/radio/src/keys.h b/radio/src/keys.h index f2492570a..d2cb37d99 100644 --- a/radio/src/keys.h +++ b/radio/src/keys.h @@ -24,32 +24,36 @@ #include #include "board.h" #include "opentx_types.h" +#include "libopenui/src/libopenui_types.h" #define EVT_KEY_MASK(e) ((e) & 0x1f) #if defined(PCBHORUS) -#define _MSK_KEY_BREAK 0x0200 -#define _MSK_KEY_REPT 0x0400 -#define _MSK_KEY_FIRST 0x0600 -#define _MSK_KEY_LONG 0x0800 -#define _MSK_KEY_FLAGS 0x0e00 -#define EVT_ENTRY 0x1000 -#define EVT_ENTRY_UP 0x2000 +constexpr event_t _MSK_KEY_BREAK = 0x0200; +constexpr event_t _MSK_KEY_REPT = 0x0400; +constexpr event_t _MSK_KEY_FIRST = 0x0600; +constexpr event_t _MSK_KEY_LONG = 0x0800; +constexpr event_t _MSK_KEY_FLAGS = 0x0E00; +constexpr event_t EVT_ENTRY = 0x1000; +constexpr event_t EVT_ENTRY_UP = 0x2000; #else -#define _MSK_KEY_BREAK 0x20 -#define _MSK_KEY_REPT 0x40 -#define _MSK_KEY_FIRST 0x60 -#define _MSK_KEY_LONG 0x80 -#define _MSK_KEY_FLAGS 0xe0 -#define EVT_ENTRY 0xbf -#define EVT_ENTRY_UP 0xbe +constexpr event_t _MSK_KEY_BREAK = 0x20; +constexpr event_t _MSK_KEY_REPT = 0x40; +constexpr event_t _MSK_KEY_FIRST = 0x60; +constexpr event_t _MSK_KEY_LONG = 0x80; +constexpr event_t _MSK_KEY_FLAGS = 0xE0; +constexpr event_t EVT_ENTRY = 0xBF; +constexpr event_t EVT_ENTRY_UP = 0xBE; #endif // normal order of events is: FIRST, LONG, REPEAT, REPEAT, ..., BREAK #define EVT_KEY_FIRST(key) ((key)|_MSK_KEY_FIRST) // fired when key is pressed #define EVT_KEY_LONG(key) ((key)|_MSK_KEY_LONG) // fired when key is held pressed for a while #define EVT_KEY_REPT(key) ((key)|_MSK_KEY_REPT) // fired when key is held pressed long enough, fires multiple times with increasing speed -#define EVT_KEY_BREAK(key) ((key)|_MSK_KEY_BREAK) // fired when key is released (short or long), but only if the event was not killed +constexpr event_t EVT_KEY_BREAK(event_t key) +{ + return (key | _MSK_KEY_BREAK); // fired when key is released (short or long), but only if the event was not killed +} #define IS_KEY_FIRST(evt) (((evt) & _MSK_KEY_FLAGS) == _MSK_KEY_FIRST) #define IS_KEY_LONG(evt) (((evt) & _MSK_KEY_FLAGS) == _MSK_KEY_LONG) @@ -115,4 +119,8 @@ bool waitKeysReleased(); event_t getEvent(bool trim=false); bool keyDown(); +#if defined(ROTARY_ENCODER_NAVIGATION) +extern uint8_t rotencSpeed; +#endif + #endif // _KEYS_H_ diff --git a/radio/src/lua/interface.cpp b/radio/src/lua/interface.cpp index f1bdbe0f6..bad80f1a1 100644 --- a/radio/src/lua/interface.cpp +++ b/radio/src/lua/interface.cpp @@ -27,6 +27,7 @@ #include "bin_allocator.h" #include "lua_api.h" #include "sdcard.h" +#include "libopenui/src/libopenui_file.h" extern "C" { #include diff --git a/radio/src/lua/widgets.cpp b/radio/src/lua/widgets.cpp index 165d95eff..98eb1dd26 100644 --- a/radio/src/lua/widgets.cpp +++ b/radio/src/lua/widgets.cpp @@ -182,7 +182,7 @@ class LuaTheme: public Theme exec(drawBackgroundFunction); } - virtual void drawTopbarBackground(uint8_t icon) const + void drawTopbarBackground(uint8_t icon) const override { exec(drawTopbarBackgroundFunction); } diff --git a/radio/src/mixer.cpp b/radio/src/mixer.cpp index 467578a2d..e5b4d25b6 100644 --- a/radio/src/mixer.cpp +++ b/radio/src/mixer.cpp @@ -148,9 +148,7 @@ void applyExpos(int16_t * anas, uint8_t mode, uint8_t ovwrIdx, int16_t ovwrValue int8_t cur_chn = -1; for (uint8_t i=0; ichn == cur_chn) @@ -170,9 +168,7 @@ void applyExpos(int16_t * anas, uint8_t mode, uint8_t ovwrIdx, int16_t ovwrValue v = limit(-1024, v, 1024); } if (EXPO_MODE_ENABLE(ed, v)) { -#if defined(BOLD_FONT) - if (mode==e_perout_mode_normal) swOn[i].activeExpo = true; -#endif + if (mode == e_perout_mode_normal) swOn[i].activeExpo = true; cur_chn = ed->chn; //========== CURVE================= @@ -627,10 +623,8 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms) bitfield_channels_t passDirtyChannels = 0; for (uint8_t i=0; imixWarn) lv_mixWarning |= 1 << (md->mixWarn - 1); -#if defined(BOLD_FONT) + if (md->mixWarn) + lv_mixWarning |= 1 << (md->mixWarn - 1); swOn[i].activeMix = true; -#endif } if (applyOffsetAndCurve) { @@ -811,12 +804,10 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms) switch (md->mltpx) { case MLTPX_REP: *ptr = dv; -#if defined(BOLD_FONT) - if (mode==e_perout_mode_normal) { + if (mode == e_perout_mode_normal) { for (uint8_t m=i-1; mdestCh==md->destCh; m--) swOn[m].activeMix = false; } -#endif break; case MLTPX_MUL: // @@@2 we have to remove the weight factor of 256 in case of 100%; now we use the new base of 256 diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index e5a387171..2dd4c7f6e 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -22,7 +22,7 @@ #define _MYEEPROM_H_ #include "datastructs.h" -#include "bitfield.h" +#include "libopenui/src/bitfield.h" #define EEPROM_VER 219 #define FIRST_CONV_EEPROM_VER 216 diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 0ef5a3a1f..0c6513444 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -332,8 +332,8 @@ void generalDefault() #endif #if defined(COLORLCD) - strcpy(g_eeGeneral.themeName, theme->getName()); - theme->init(); + strcpy(g_eeGeneral.themeName, static_cast(theme)->getName()); + static_cast(theme)->init(); #endif #if defined(PXX2) @@ -524,23 +524,22 @@ void modelDefault(uint8_t id) #endif #if !defined(EEPROM) - strcpy(g_model.header.name, "\015\361\374\373\364"); - g_model.header.name[5] = '\033' + id/10; - g_model.header.name[6] = '\033' + id%10; + strcpy(g_model.header.name, "Model"); + g_model.header.name[5] = '0' + id / 10; + g_model.header.name[6] = '0' + id % 10; #endif #if defined(COLORLCD) - #warning "Initialization missing" extern const LayoutFactory * defaultLayout; -// delete customScreens[0]; -// customScreens[0] = defaultLayout->create(&g_model.screenData[0].layoutData); -// strcpy(g_model.screenData[0].layoutName, "Layout2P1"); + delete customScreens[0]; + customScreens[0] = defaultLayout->create(&g_model.screenData[0].layoutData); + strcpy(g_model.screenData[0].layoutName, "Layout2P1"); // extern const WidgetFactory * defaultWidget; // customScreens[0]->createWidget(0, defaultWidget); -// // enable switch warnings -// for (int i=0; isetCloseCondition([]() { return !isThrottleWarningAlertNeeded(); }); @@ -988,7 +987,7 @@ void checkThrottleStick() // first - display warning; also deletes inputs if any have been before LED_ERROR_BEGIN(); - RAISE_ALERT(STR_THROTTLEWARN, STR_THROTTLENOTIDLE, STR_PRESSANYKEYTOSKIP, AU_THROTTLE_ALERT); + RAISE_ALERT(TR_THROTTLE_UPPERCASE, STR_THROTTLE_NOT_IDLE, STR_PRESS_ANY_KEY_TO_SKIP, AU_THROTTLE_ALERT); #if defined(PWR_BUTTON_PRESS) bool refresh = false; @@ -1008,7 +1007,7 @@ void checkThrottleStick() refresh = true; } else if (power == e_power_on && refresh) { - RAISE_ALERT(STR_THROTTLEWARN, STR_THROTTLENOTIDLE, STR_PRESSANYKEYTOSKIP, AU_NONE); + RAISE_ALERT(TR_THROTTLE_UPPERCASE, STR_THROTTLE_NOT_IDLE, STR_PRESS_ANY_KEY_TO_SKIP, AU_NONE); refresh = false; } #else @@ -2036,6 +2035,7 @@ int main() boardInit(); #if defined(COLORLCD) + extern void loadFonts(); loadFonts(); #endif diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 8673c7bb4..bd5b32c5d 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -31,7 +31,6 @@ #include "debounce.h" #include "opentx_helpers.h" #include "touch.h" -#include "bitfield.h" #if defined(LIBOPENUI) #include "libopenui.h" @@ -394,7 +393,6 @@ inline bool SPLASH_NEEDED() #define IS_ROTARY_ENCODER_NAVIGATION_ENABLE() true extern volatile rotenc_t rotencValue; #define ROTARY_ENCODER_NAVIGATION_VALUE rotencValue - extern uint8_t rotencSpeed; #define ROTENC_LOWSPEED 1 #define ROTENC_MIDSPEED 5 #define ROTENC_HIGHSPEED 50 @@ -470,7 +468,7 @@ void alert(const char * title, const char * msg, uint8_t sound); } inline void ALERT(const char * title, const char * msg, uint8_t sound) { - raiseAlert(title, msg, nullptr, sound); + raiseAlert(title, msg, "", sound); } #else inline void RAISE_ALERT(const char * title, const char * msg, const char * info, uint8_t sound) @@ -687,13 +685,6 @@ uint8_t findNextUnusedModelId(uint8_t index, uint8_t module); #endif uint32_t hash(const void * ptr, uint32_t size); -inline int divRoundClosest(const int n, const int d) -{ - if (d == 0) - return 0; - else - return ((n < 0) ^ (d < 0)) ? ((n - d/2)/d) : ((n + d/2)/d); -} #define calc100to256_16Bits(x) calc100to256(x) #define calc100toRESX_16Bits(x) calc100toRESX(x) @@ -893,20 +884,15 @@ PACK(struct SwOn { extern SwOn swOn[MAX_MIXERS]; extern int32_t act[MAX_MIXERS]; -#if defined(BOLD_FONT) - inline bool isExpoActive(uint8_t expo) - { - return swOn[expo].activeExpo; - } +inline bool isExpoActive(uint8_t expo) +{ + return swOn[expo].activeExpo; +} - inline bool isMixActive(uint8_t mix) - { - return swOn[mix].activeMix; - } -#else - #define isExpoActive(x) false - #define isMixActive(x) false -#endif +inline bool isMixActive(uint8_t mix) +{ + return swOn[mix].activeMix; +} enum LogicalSwitchFamilies { LS_FAMILY_OFS, @@ -1046,7 +1032,6 @@ enum AUDIO_SOUNDS { #include "buzzer.h" #include "translations.h" -#include "fonts.h" #if defined(HAPTIC) #include "haptic.h" diff --git a/radio/src/opentx_helpers.h b/radio/src/opentx_helpers.h index 534dcaf3d..5e6b34395 100644 --- a/radio/src/opentx_helpers.h +++ b/radio/src/opentx_helpers.h @@ -21,7 +21,7 @@ #ifndef _OPENTX_HELPERS_H_ #define _OPENTX_HELPERS_H_ -#include "libopenui/libopenui_helpers.h" +#include "thirdparty/libopenui/src/libopenui_helpers.h" template inline T sgn(T a) diff --git a/radio/src/opentx_types.h b/radio/src/opentx_types.h index 9851f5a5e..e6afe5b3a 100644 --- a/radio/src/opentx_types.h +++ b/radio/src/opentx_types.h @@ -21,7 +21,7 @@ #ifndef _OPENTX_TYPES_H_ #define _OPENTX_TYPES_H_ -#include +#include "libopenui/src/libopenui_types.h" typedef uint32_t tmr10ms_t; typedef int32_t rotenc_t; @@ -29,8 +29,13 @@ typedef int32_t getvalue_t; typedef uint32_t mixsrc_t; typedef int32_t swsrc_t; typedef int16_t safetych_t; +typedef int16_t gvar_t; typedef uint32_t bitfield_channels_t; -typedef uint16_t event_t; typedef uint16_t FlightModesType; +#if defined(PCBFRSKY) +typedef uint16_t source_t; +#else +typedef uint8_t source_t; +#endif #endif // _OPENTX_TYPES_H_ diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h index 8f0748a37..098de5984 100644 --- a/radio/src/pulses/modules_helpers.h +++ b/radio/src/pulses/modules_helpers.h @@ -21,7 +21,7 @@ #ifndef _MODULES_HELPERS_H_ #define _MODULES_HELPERS_H_ -#include "bitfield.h" +#include "libopenui/src/bitfield.h" #include "definitions.h" #include "opentx_helpers.h" #include "telemetry/telemetry.h" diff --git a/radio/src/pulses/pxx2.cpp b/radio/src/pulses/pxx2.cpp index f118f0328..07b32f21f 100644 --- a/radio/src/pulses/pxx2.cpp +++ b/radio/src/pulses/pxx2.cpp @@ -21,6 +21,7 @@ #include "opentx.h" #include "pulses/pxx2.h" #include "io/frsky_firmware_update.h" +#include "libopenui/src/libopenui_file.h" uint8_t Pxx2Pulses::addFlag0(uint8_t module) { diff --git a/radio/src/sdcard.cpp b/radio/src/sdcard.cpp index 3a16fde9f..b09ea555c 100644 --- a/radio/src/sdcard.cpp +++ b/radio/src/sdcard.cpp @@ -21,6 +21,7 @@ #include #include "opentx.h" #include "diskio.h" +#include "libopenui/src/libopenui_file.h" bool sdCardFormat() { @@ -204,32 +205,6 @@ const char * getBasename(const char * path) return path; } -const char * getFileExtension(const char * filename, uint8_t size, uint8_t extMaxLen, uint8_t *fnlen, uint8_t *extlen) -{ - int len = size; - if (!size) { - len = strlen(filename); - } - if (!extMaxLen) { - extMaxLen = LEN_FILE_EXTENSION_MAX; - } - if (fnlen != nullptr) { - *fnlen = (uint8_t)len; - } - for (int i=len-1; i >= 0 && len-i <= extMaxLen; --i) { - if (filename[i] == '.') { - if (extlen) { - *extlen = len-i; - } - return &filename[i]; - } - } - if (extlen != nullptr) { - *extlen = 0; - } - return nullptr; -} - /** Check if given extension exists in a list of extensions. @param extension The extension to search for, including leading period. @@ -478,37 +453,6 @@ void sdReadTextFile(const char * filename, char lines[NUM_BODY_LINES][LCD_COLS + } } -// returns true if current working dir is at the root level -bool isCwdAtRoot() -{ - char path[10]; - if (f_getcwd(path, sizeof(path)-1) == FR_OK) { - return (strcasecmp("/", path) == 0); - } - return false; -} - -/* - Wrapper around the f_readdir() function which - also returns ".." entry for sub-dirs. (FatFS 0.12 does - not return ".", ".." dirs anymore) -*/ -FRESULT sdReadDir(DIR * dir, FILINFO * fno, bool & firstTime) -{ - FRESULT res; - if (firstTime && !isCwdAtRoot()) { - // fake parent directory entry - strcpy(fno->fname, ".."); - fno->fattrib = AM_DIR; - res = FR_OK; - } - else { - res = f_readdir(dir, fno); /* Read a directory item */ - } - firstTime = false; - return res; -} - #if defined(SDCARD) const char * sdCopyFile(const char * srcPath, const char * destPath) { diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h index 843a28c17..2f33534b3 100644 --- a/radio/src/sdcard.h +++ b/radio/src/sdcard.h @@ -72,8 +72,6 @@ const char RADIO_SETTINGS_PATH[] = RADIO_PATH "/radio.bin"; #define SPORT_FIRMWARE_EXT ".frk" #define UPDATE_FIRMWARE_EXT ".frsk" -#define LEN_FILE_EXTENSION_MAX 5 // longest used, including the dot, excluding null term. - #if defined(COLORLCD) #define BITMAPS_EXT BMP_EXT JPG_EXT PNG_EXT #define LEN_BITMAPS_EXT 4 @@ -120,7 +118,6 @@ inline const char * SDCARD_ERROR(FRESULT result) #endif // NOTE: 'size' must = 0 or be a valid character position within 'filename' array -- it is NOT validated -const char * getFileExtension(const char * filename, uint8_t size=0, uint8_t extMaxLen=0, uint8_t * fnlen=nullptr, uint8_t * extlen=nullptr); const char * getBasename(const char * path); #if defined(PCBX12S) @@ -149,7 +146,6 @@ const char * getBasename(const char * path); bool isFileAvailable(const char * filename, bool exclDir = false); int findNextFileIndex(char * filename, uint8_t size, const char * directory); -bool isExtensionMatching(const char * extension, const char * pattern, char * match = nullptr); const char * sdCopyFile(const char * src, const char * dest); const char * sdCopyFile(const char * srcFilename, const char * srcDir, const char * destFilename, const char * destDir); @@ -160,7 +156,4 @@ bool sdListFiles(const char * path, const char * extension, const uint8_t maxlen void sdReadTextFile(const char * filename, char lines[NUM_BODY_LINES][LCD_COLS + 1], int & lines_count); -bool isCwdAtRoot(); -FRESULT sdReadDir(DIR * dir, FILINFO * fno, bool & firstTime); - #endif // _SDCARD_H_ diff --git a/radio/src/simu.cpp b/radio/src/simu.cpp index f472b3b23..9200a73ff 100644 --- a/radio/src/simu.cpp +++ b/radio/src/simu.cpp @@ -88,7 +88,7 @@ FXIMPLEMENT(OpenTxSim, FXMainWindow, OpenTxSimMap, ARRAYNUMBER(OpenTxSimMap)) OpenTxSim::OpenTxSim(FXApp* a): FXMainWindow(a, "OpenTX Simu", nullptr, nullptr, DECOR_ALL, 20, 90, 0, 0) { - memset(displayBuf, 0, DISPLAY_BUFFER_SIZE * sizeof(display_t)); + memset(displayBuf, 0, DISPLAY_BUFFER_SIZE * sizeof(pixel_t)); bmp = new FXPPMImage(getApp(), nullptr, IMAGE_OWNED|IMAGE_KEEP|IMAGE_SHMI|IMAGE_SHMP, W2, H2); #if defined(SIMU_AUDIO) @@ -179,7 +179,7 @@ void OpenTxSim::createBitmap(int index, uint16_t *data, int x, int y, int w, int for (int i=0; i>8)/0x0f, 255*((z&0x0F0)>>4)/0x0f, 255*(z&0x00F)/0x0f); snapshot.setPixel(i, j, color); } @@ -487,7 +487,7 @@ void OpenTxSim::refreshDisplay() for (int x=0; x> 4) : (*p & 0x0F); if (z) { FXColor color; diff --git a/radio/src/storage/conversions/datastructs_218.h b/radio/src/storage/conversions/datastructs_218.h index c32078886..19f682917 100644 --- a/radio/src/storage/conversions/datastructs_218.h +++ b/radio/src/storage/conversions/datastructs_218.h @@ -527,7 +527,7 @@ PACK(struct ModelData_v218 { #define THEME_NAME_LEN 8 #define THEME_DATA \ char themeName[THEME_NAME_LEN]; \ - Theme::PersistentData themeData; + ThemeBase::PersistentData themeData; #else #define THEME_DATA #endif diff --git a/radio/src/storage/sdcard_raw.cpp b/radio/src/storage/sdcard_raw.cpp index 9a1b40095..428620a5b 100644 --- a/radio/src/storage/sdcard_raw.cpp +++ b/radio/src/storage/sdcard_raw.cpp @@ -283,7 +283,7 @@ void storageEraseAll(bool warn) #if defined(LIBOPENUI) // the theme has not been loaded before - theme->load(); + static_cast(theme)->load(); #endif generalDefault(); diff --git a/radio/src/strhelpers.h b/radio/src/strhelpers.h index 2c00acfaf..f453720b8 100644 --- a/radio/src/strhelpers.h +++ b/radio/src/strhelpers.h @@ -23,8 +23,6 @@ #include -#define TEXT_AT_INDEX(val, idx) std::string(val+1+val[0]*(idx), min(val[0], strlen(val+1+val[0]*(idx)))) - char * strAppend(char * dest, const char * source, int len=0); char * strAppendUnsigned(char * dest, uint32_t value, uint8_t digits=0, uint8_t radix=10); char * strAppendSigned(char * dest, int32_t value, uint8_t digits=0, uint8_t radix=10); diff --git a/radio/src/stubs.cpp b/radio/src/stubs.cpp index 6c33e2536..49c094090 100644 --- a/radio/src/stubs.cpp +++ b/radio/src/stubs.cpp @@ -26,14 +26,6 @@ void drawFatalErrorScreen(const char * message) { } -void loadCustomScreens() -{ -} - -void showAlertBox(const char * title, const char * text, const char * action, uint8_t sound) -{ -} - void showMessageBox(const char * title) { diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index 38064f03b..0e99ccc93 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -636,7 +636,7 @@ void checkSwitches() // first - display warning #if defined(PCBFRSKY) || defined(PCBFLYSKY) if (last_bad_switches != switches_states || last_bad_pots != bad_pots) { - drawAlertBox(STR_SWITCHWARN, nullptr, STR_PRESSANYKEYTOSKIP); + drawAlertBox(STR_SWITCHWARN, nullptr, STR_PRESS_ANY_KEY_TO_SKIP); if (last_bad_switches == 0xff || last_bad_pots == 0xff) { AUDIO_ERROR_MESSAGE(AU_SWITCH_ALERT); } @@ -685,7 +685,7 @@ void checkSwitches() // TODO add an helper strncpy(s, &STR_VSRCRAW[1+(NUM_STICKS+1+i)*STR_VSRCRAW[0]], STR_VSRCRAW[0]); s[int(STR_VSRCRAW[0])] = '\0'; - lcdDrawText(x, y, s, ALARM_COLOR); + lcd->drawText(x, y, s, ALARM_COLOR); x += 40; #else lcdDrawTextAtIndex(x, y, STR_VSRCRAW, NUM_STICKS + 1 + i, INVERS); @@ -703,7 +703,7 @@ void checkSwitches() if (numWarnings >= 6) { #if defined(COLORLCD) - lcdDrawText(x, y, "...", ALARM_COLOR); + lcd->drawText(x, y, "...", ALARM_COLOR); #else lcdDrawText(x, y, "...", 0); #endif @@ -712,7 +712,7 @@ void checkSwitches() last_bad_pots = bad_pots; #else if (last_bad_switches != switches_states) { - RAISE_ALERT(STR_SWITCHWARN, NULL, STR_PRESSANYKEYTOSKIP, last_bad_switches == 0xff ? AU_SWITCH_ALERT : AU_NONE); + RAISE_ALERT(STR_SWITCHWARN, NULL, STR_PRESS_ANY_KEY_TO_SKIP, last_bad_switches == 0xff ? AU_SWITCH_ALERT : AU_NONE); uint8_t x = 2; for (uint8_t i=0; idrawText(x, 28, text); + lcd->drawSolidFilledRect(28, 56, 422, 2, TEXT_COLOR); } static void bootloaderDrawFooter() { - lcdDrawSolidFilledRect(28, 234, 422, 2, TEXT_COLOR); + lcd->drawSolidFilledRect(28, 234, 422, 2, TEXT_COLOR); } void bootloaderDrawScreen(BootloaderState st, int opt, const char* str) @@ -74,32 +74,32 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char* str) if (st == ST_START) { bootloaderDrawTitle(88, "HORUS BOOTLOADER"); - lcdDrawBitmapPattern(90, 72, LBM_FLASH, TEXT_COLOR); - lcdDrawText(124, 75, "Write Firmware"); + lcd->drawBitmapPattern(90, 72, LBM_FLASH, TEXT_COLOR); + lcd->drawText(124, 75, "Write Firmware"); - lcdDrawBitmapPattern(90, 107, LBM_EXIT, TEXT_COLOR); - lcdDrawText(124, 110, "Exit"); + lcd->drawBitmapPattern(90, 107, LBM_EXIT, TEXT_COLOR); + lcd->drawText(124, 110, "Exit"); - lcdDrawSolidRect(119, (opt == 0) ? 72 : 107, 270, 26, 2, LINE_COLOR); + lcd->drawSolidRect(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"); + lcd->drawText(195, 175, "Or plug in a USB cable"); + lcd->drawText(195, 200, "for mass storage"); bootloaderDrawFooter(); - lcdDrawText( 36, 242, "Current Firmware:"); - lcdDrawText(200, 242, getOtherVersion(nullptr)); + lcd->drawText( 36, 242, "Current Firmware:"); + lcd->drawText(200, 242, getOtherVersion(nullptr)); } else if (st == ST_USB) { lcd->drawBitmap(136, 98, &BMP_USB_PLUGGED); - lcdDrawText(195, 128, "USB Connected"); + lcd->drawText(195, 128, "USB Connected"); } else if (st == ST_FILE_LIST || st == ST_DIR_CHECK || st == ST_FLASH_CHECK || st == ST_FLASHING || st == ST_FLASH_DONE) { bootloaderDrawTitle(126, "SD>FIRMWARE"); - lcdDrawBitmapPattern(87, 16, LBM_SD, TEXT_COLOR); + lcd->drawBitmapPattern(87, 16, LBM_SD, TEXT_COLOR); if (st == ST_FLASHING || st == ST_FLASH_DONE) { @@ -110,39 +110,39 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char* str) opt = 100; // Completed > 100% } - lcdDrawRect(70, 120, 340, 31, 2); - lcdDrawSolidFilledRect(74, 124, (332 * opt) / 100, 23, color); + lcd->drawRect(70, 120, 340, 31, 2); + lcd->drawSolidFilledRect(74, 124, (332 * opt) / 100, 23, color); } else if (st == ST_DIR_CHECK) { if (opt == FR_NO_PATH) { - lcdDrawText(90, 168, "Directory is missing"); + lcd->drawText(90, 168, "Directory is missing"); } else { - lcdDrawText(90, 168, "Directory is empty"); + lcd->drawText(90, 168, "Directory is empty"); } - lcdDrawBitmapPattern(356, 158, LBM_ERROR, BARGRAPH1_COLOR); + lcd->drawBitmapPattern(356, 158, LBM_ERROR, BARGRAPH1_COLOR); } else if (st == ST_FLASH_CHECK) { bootloaderDrawFilename(str, 0, true); if (opt == FC_ERROR) { - lcdDrawText(94, 168, STR_INVALID_FIRMWARE); - lcdDrawBitmapPattern(356, 158, LBM_ERROR, BARGRAPH1_COLOR); + lcd->drawText(94, 168, STR_INVALID_FIRMWARE); + lcd->drawBitmapPattern(356, 158, LBM_ERROR, BARGRAPH1_COLOR); } else if (opt == FC_OK) { VersionTag tag; extractFirmwareVersion(&tag); - lcdDrawText(168, 158, "Version:", RIGHT); - lcdDrawText(174, 158, tag.version); + lcd->drawText(168, 158, "Version:", RIGHT); + lcd->drawText(174, 158, tag.version); - lcdDrawText(168, 178, "Radio:", RIGHT); - lcdDrawText(174, 178, tag.flavour); + lcd->drawText(168, 178, "Radio:", RIGHT); + lcd->drawText(174, 178, tag.flavour); - lcdDrawBitmapPattern(356, 158, LBM_OK, BARGRAPH2_COLOR); + lcd->drawBitmapPattern(356, 158, LBM_OK, BARGRAPH2_COLOR); } } @@ -150,35 +150,35 @@ void bootloaderDrawScreen(BootloaderState st, int opt, const char* str) if ( st != ST_DIR_CHECK && (st != ST_FLASH_CHECK || opt == FC_OK)) { - lcdDrawBitmapPattern(28, 242, LBM_FLASH, TEXT_COLOR); + lcd->drawBitmapPattern(28, 242, LBM_FLASH, TEXT_COLOR); if (st == ST_FILE_LIST) { - lcdDrawText(56, 244, "[ENT] to select file"); + lcd->drawText(56, 244, "[ENT] to select file"); } else if (st == ST_FLASH_CHECK && opt == FC_OK) { - lcdDrawText(56, 244, "Hold [ENT] long to flash"); + lcd->drawText(56, 244, "Hold [ENT] long to flash"); } else if (st == ST_FLASHING) { - lcdDrawText(56, 244, "Writing Firmware ..."); + lcd->drawText(56, 244, "Writing Firmware ..."); } else if (st == ST_FLASH_DONE) { - lcdDrawText(56, 244, "Writing Completed"); + lcd->drawText(56, 244, "Writing Completed"); } } if (st != ST_FLASHING) { - lcdDrawBitmapPattern(305, 242, LBM_EXIT, TEXT_COLOR); - lcdDrawText(335, 244, "[RTN] to exit"); + lcd->drawBitmapPattern(305, 242, LBM_EXIT, TEXT_COLOR); + lcd->drawText(335, 244, "[RTN] to exit"); } } } void bootloaderDrawFilename(const char* str, uint8_t line, bool selected) { - lcdDrawBitmapPattern(94, 76 + (line * 25), LBM_FILE, TEXT_COLOR); - lcdDrawText(124, 75 + (line * 25), str); + lcd->drawBitmapPattern(94, 76 + (line * 25), LBM_FILE, TEXT_COLOR); + lcd->drawText(124, 75 + (line * 25), str); if (selected) { - lcdDrawSolidRect(119, 72 + (line * 25), 278, 26, 2, LINE_COLOR); + lcd->drawSolidRect(119, 72 + (line * 25), 278, 26, 2, LINE_COLOR); } } diff --git a/radio/src/targets/horus/lcd_driver.cpp b/radio/src/targets/horus/lcd_driver.cpp index 1601e9f78..a6695e99b 100644 --- a/radio/src/targets/horus/lcd_driver.cpp +++ b/radio/src/targets/horus/lcd_driver.cpp @@ -32,9 +32,9 @@ #define LCD_FIRST_LAYER 0 #define LCD_SECOND_LAYER 1 -uint8_t LCD_FIRST_FRAME_BUFFER[DISPLAY_BUFFER_SIZE * sizeof(display_t)] __SDRAM; -uint8_t LCD_SECOND_FRAME_BUFFER[DISPLAY_BUFFER_SIZE * sizeof(display_t)] __SDRAM; -uint8_t LCD_BACKUP_FRAME_BUFFER[DISPLAY_BUFFER_SIZE * sizeof(display_t)] __SDRAM; +uint8_t LCD_FIRST_FRAME_BUFFER[DISPLAY_BUFFER_SIZE * sizeof(pixel_t)] __SDRAM; +uint8_t LCD_SECOND_FRAME_BUFFER[DISPLAY_BUFFER_SIZE * sizeof(pixel_t)] __SDRAM; +uint8_t LCD_BACKUP_FRAME_BUFFER[DISPLAY_BUFFER_SIZE * sizeof(pixel_t)] __SDRAM; uint8_t currentLayer = LCD_FIRST_LAYER; BitmapBuffer lcdBuffer1(BMP_RGB565, LCD_W, LCD_H, (uint16_t *)LCD_FIRST_FRAME_BUFFER); diff --git a/radio/src/targets/horus/libopenui_config.h b/radio/src/targets/horus/libopenui_config.h index bf374466c..9d753eafb 100644 --- a/radio/src/targets/horus/libopenui_config.h +++ b/radio/src/targets/horus/libopenui_config.h @@ -21,7 +21,13 @@ #ifndef _LIBOPENUI_CONFIG_H_ #define _LIBOPENUI_CONFIG_H_ -#include "lcd.h" +#include "debug.h" +#include "libopenui_types.h" +#include "colors.h" +#include "board.h" +#include "keys.h" + +typedef uint16_t pixel_t; constexpr uint32_t MENU_HEADER_BUTTON_WIDTH = 33; constexpr uint32_t MENU_HEADER_BUTTONS_LEFT = 47; @@ -63,12 +69,65 @@ constexpr uint32_t CURVE_COORD_WIDTH = 36; constexpr uint32_t CURVE_COORD_HEIGHT = 17; constexpr uint32_t DATETIME_SEPARATOR_X = LCD_W - 53; -constexpr uint32_t DATETIME_LINE1 = 9; -constexpr uint32_t DATETIME_LINE2 = 23; -constexpr uint32_t DATETIME_MIDDLE = (LCD_W + DATETIME_SEPARATOR_X + 4) / 2; +constexpr uint32_t DATETIME_LINE1 = 7; +constexpr uint32_t DATETIME_LINE2 = 22; +constexpr uint32_t DATETIME_MIDDLE = (LCD_W + DATETIME_SEPARATOR_X + 1) / 2; constexpr uint32_t MENUS_TOOLBAR_BUTTON_WIDTH = 30; constexpr uint32_t MENUS_TOOLBAR_BUTTON_PADDING = 3; constexpr rect_t MENUS_TOOLBAR_RECT = { 100, 51, 30, 209 }; +constexpr uint32_t ALERT_FRAME_TOP = 70; +constexpr uint32_t ALERT_FRAME_HEIGHT = (LCD_H - 2 * ALERT_FRAME_TOP); +constexpr uint32_t ALERT_BITMAP_TOP = ALERT_FRAME_TOP + 15; +constexpr uint32_t ALERT_BITMAP_LEFT = 40; +constexpr uint32_t ALERT_TITLE_TOP = ALERT_FRAME_TOP + 10; +constexpr uint32_t ALERT_TITLE_LEFT = 186; +constexpr uint32_t ALERT_TITLE_LINE_HEIGHT = 30; +constexpr uint32_t ALERT_MESSAGE_TOP = ALERT_TITLE_TOP + 90; +constexpr uint32_t ALERT_MESSAGE_LEFT = ALERT_TITLE_LEFT; +constexpr uint32_t ALERT_ACTION_TOP = 240; + +// TODO common code, not in target +enum LcdColorIndex +{ + TEXT_COLOR_INDEX, + TEXT_BGCOLOR_INDEX, + TEXT_INVERTED_COLOR_INDEX, + TEXT_INVERTED_BGCOLOR_INDEX, + TEXT_STATUSBAR_COLOR_INDEX, + LINE_COLOR_INDEX, + SCROLLBOX_COLOR_INDEX, + MENU_TITLE_BGCOLOR_INDEX, + MENU_TITLE_COLOR_INDEX, + MENU_TITLE_DISABLE_COLOR_INDEX, + HEADER_COLOR_INDEX, + ALARM_COLOR_INDEX, + WARNING_COLOR_INDEX, + TEXT_DISABLE_COLOR_INDEX, + CURVE_AXIS_COLOR_INDEX, + CURVE_COLOR_INDEX, + CURVE_CURSOR_COLOR_INDEX, + HEADER_BGCOLOR_INDEX, + HEADER_ICON_BGCOLOR_INDEX, + HEADER_CURRENT_BGCOLOR_INDEX, + TITLE_BGCOLOR_INDEX, + TRIM_BGCOLOR_INDEX, + TRIM_SHADOW_COLOR_INDEX, + MAINVIEW_PANES_COLOR_INDEX, + MAINVIEW_GRAPHICS_COLOR_INDEX, + OVERLAY_COLOR_INDEX, + CUSTOM_COLOR_INDEX, + BARGRAPH1_COLOR_INDEX, + BARGRAPH2_COLOR_INDEX, + BARGRAPH_BGCOLOR_INDEX, + LCD_COLOR_COUNT +}; + +#if !defined(BOOT) +#define FONT_TABLE_SIZE 16 +#else +#define FONT_TABLE_SIZE 1 +#endif + #endif // _LIBOPENUI_CONFIG_H_ diff --git a/radio/src/targets/nv14/lcd_driver.cpp b/radio/src/targets/nv14/lcd_driver.cpp index 4f1f1292b..70b8e48e3 100644 --- a/radio/src/targets/nv14/lcd_driver.cpp +++ b/radio/src/targets/nv14/lcd_driver.cpp @@ -22,9 +22,9 @@ -uint8_t LCD_FIRST_FRAME_BUFFER[DISPLAY_BUFFER_SIZE * sizeof(display_t)] __SDRAM; -uint8_t LCD_SECOND_FRAME_BUFFER[DISPLAY_BUFFER_SIZE * sizeof(display_t)] __SDRAM; -uint8_t LCD_BACKUP_FRAME_BUFFER[DISPLAY_BUFFER_SIZE * sizeof(display_t)] __SDRAM; +uint8_t LCD_FIRST_FRAME_BUFFER[DISPLAY_BUFFER_SIZE * sizeof(pixel_t)] __SDRAM; +uint8_t LCD_SECOND_FRAME_BUFFER[DISPLAY_BUFFER_SIZE * sizeof(pixel_t)] __SDRAM; +uint8_t LCD_BACKUP_FRAME_BUFFER[DISPLAY_BUFFER_SIZE * sizeof(pixel_t)] __SDRAM; uint8_t currentLayer = LCD_FIRST_LAYER; lcdSpiInitFucPtr lcdSpiInitFuc; diff --git a/radio/src/targets/nv14/libopenui_config.h b/radio/src/targets/nv14/libopenui_config.h index 9db98fd2a..6d860e297 100644 --- a/radio/src/targets/nv14/libopenui_config.h +++ b/radio/src/targets/nv14/libopenui_config.h @@ -21,7 +21,13 @@ #ifndef _LIBOPENUI_CONFIG_H_ #define _LIBOPENUI_CONFIG_H_ -#include "lcd.h" +#include "debug.h" +#include "libopenui_types.h" +#include "colors.h" +#include "board.h" +#include "keys.h" + +typedef uint16_t pixel_t; constexpr uint32_t MENU_HEADER_BUTTON_WIDTH = 60; constexpr uint32_t MENU_HEADER_BUTTONS_LEFT = MENU_HEADER_BUTTON_WIDTH; @@ -67,6 +73,59 @@ constexpr uint32_t MENUS_TOOLBAR_BUTTON_WIDTH = 50; constexpr uint32_t MENUS_TOOLBAR_BUTTON_PADDING = 11; constexpr rect_t MENUS_TOOLBAR_RECT = { 35, 95, 50, 370 }; -constexpr uint32_t SUBMENU_LINE_WIDTH = 230; +//constexpr uint32_t SUBMENU_LINE_WIDTH = 230; + +constexpr uint32_t ALERT_FRAME_TOP = 70; +constexpr uint32_t ALERT_FRAME_HEIGHT = (LCD_H - 2 * ALERT_FRAME_TOP); +constexpr uint32_t ALERT_BITMAP_TOP = ALERT_FRAME_TOP + 15; +constexpr uint32_t ALERT_BITMAP_LEFT = 40; +constexpr uint32_t ALERT_TITLE_TOP = ALERT_FRAME_TOP + 10; +constexpr uint32_t ALERT_TITLE_LEFT = 186; +constexpr uint32_t ALERT_TITLE_LINE_HEIGHT = 30; +constexpr uint32_t ALERT_MESSAGE_TOP = ALERT_TITLE_TOP + 90; +constexpr uint32_t ALERT_MESSAGE_LEFT = ALERT_TITLE_LEFT; +constexpr uint32_t ALERT_ACTION_TOP = 240; +constexpr uint32_t ALERT_BUTTON_TOP = 300; + +enum LcdColorIndex +{ + TEXT_COLOR_INDEX, + TEXT_BGCOLOR_INDEX, + TEXT_INVERTED_COLOR_INDEX, + TEXT_INVERTED_BGCOLOR_INDEX, + TEXT_STATUSBAR_COLOR_INDEX, + LINE_COLOR_INDEX, + SCROLLBOX_COLOR_INDEX, + MENU_TITLE_BGCOLOR_INDEX, + MENU_TITLE_COLOR_INDEX, + MENU_TITLE_DISABLE_COLOR_INDEX, + HEADER_COLOR_INDEX, + ALARM_COLOR_INDEX, + WARNING_COLOR_INDEX, + TEXT_DISABLE_COLOR_INDEX, + CURVE_AXIS_COLOR_INDEX, + CURVE_COLOR_INDEX, + CURVE_CURSOR_COLOR_INDEX, + HEADER_BGCOLOR_INDEX, + HEADER_ICON_BGCOLOR_INDEX, + HEADER_CURRENT_BGCOLOR_INDEX, + TITLE_BGCOLOR_INDEX, + TRIM_BGCOLOR_INDEX, + TRIM_SHADOW_COLOR_INDEX, + MAINVIEW_PANES_COLOR_INDEX, + MAINVIEW_GRAPHICS_COLOR_INDEX, + OVERLAY_COLOR_INDEX, + CUSTOM_COLOR_INDEX, + BARGRAPH1_COLOR_INDEX, + BARGRAPH2_COLOR_INDEX, + BARGRAPH_BGCOLOR_INDEX, + LCD_COLOR_COUNT +}; + +#if !defined(BOOT) +#define FONT_TABLE_SIZE 16 +#else +#define FONT_TABLE_SIZE 1 +#endif #endif // _LIBOPENUI_CONFIG_H_ diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index 86b593361..c7d7412d0 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -405,7 +405,7 @@ void StopAudioThread() #endif // #if defined(SIMU_AUDIO) bool simuLcdRefresh = true; -display_t simuLcdBuf[DISPLAY_BUFFER_SIZE]; +pixel_t simuLcdBuf[DISPLAY_BUFFER_SIZE]; #if !defined(COLORLCD) void lcdSetRefVolt(uint8_t val) @@ -423,8 +423,8 @@ void lcdRefresh() { static bool lightEnabled = (bool)isBacklightEnabled(); - if (bool(isBacklightEnabled()) != lightEnabled || memcmp(simuLcdBuf, displayBuf, DISPLAY_BUFFER_SIZE * sizeof(display_t))) { - memcpy(simuLcdBuf, displayBuf, DISPLAY_BUFFER_SIZE * sizeof(display_t)); + if (bool(isBacklightEnabled()) != lightEnabled || memcmp(simuLcdBuf, displayBuf, DISPLAY_BUFFER_SIZE * sizeof(pixel_t))) { + memcpy(simuLcdBuf, displayBuf, DISPLAY_BUFFER_SIZE * sizeof(pixel_t)); lightEnabled = (bool)isBacklightEnabled(); simuLcdRefresh = true; } @@ -450,7 +450,7 @@ void boardInit() { } -display_t simuLcdBackupBuf[DISPLAY_BUFFER_SIZE]; +pixel_t simuLcdBackupBuf[DISPLAY_BUFFER_SIZE]; void lcdStoreBackupBuffer() { memcpy(simuLcdBackupBuf, displayBuf, sizeof(simuLcdBackupBuf)); diff --git a/radio/src/targets/simu/simulcd.h b/radio/src/targets/simu/simulcd.h index c968efc26..f9ed5c5c8 100644 --- a/radio/src/targets/simu/simulcd.h +++ b/radio/src/targets/simu/simulcd.h @@ -25,6 +25,6 @@ extern int g_snapshot_idx; extern bool simuLcdRefresh; -extern display_t simuLcdBuf[DISPLAY_BUFFER_SIZE]; +extern pixel_t simuLcdBuf[DISPLAY_BUFFER_SIZE]; #endif // _SIMULCD_H_ diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index e238ad646..41d26f495 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -22,12 +22,14 @@ #define _TELEMETRY_H_ #include "frsky.h" +#include "io/frsky_sport.h" #include "crossfire.h" #if defined(MULTIMODULE) #include "spektrum.h" #include "flysky_ibus.h" #include "multi.h" #endif +#include "myeeprom.h" extern uint8_t telemetryStreaming; // >0 (true) == data is streaming in. 0 = no data detected for some time @@ -78,11 +80,11 @@ PACK(struct CellValue uint16_t value:15; uint16_t state:1; - void set(uint16_t value) + void set(uint16_t newValue) { - if (value > 50) { - this->value = value; - this->state = 1; + if (newValue > 50) { + value = value; + state = 1; } } }); diff --git a/radio/src/thirdparty/libopenui b/radio/src/thirdparty/libopenui new file mode 160000 index 000000000..1d494b502 --- /dev/null +++ b/radio/src/thirdparty/libopenui @@ -0,0 +1 @@ +Subproject commit 1d494b5023a284fc7538224a005820c3269feac4 diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 8de4cb725..af26a58a8 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -52,9 +52,9 @@ ISTR(VUNITSSYSTEM); ISTR(VBEEPCOUNTDOWN); ISTR(COUNTDOWNVALUES); ISTR(VVARIOCENTER); -ISTR(COUNTRYCODES); +ISTR(COUNTRY_CODES); ISTR(USBMODES); -ISTR(JACKMODES); +ISTR(JACK_MODES); ISTR(VFAILSAFE); ISTR(VTRAINERMODES); ISTR(FLYSKY_PROTOCOLS); @@ -167,7 +167,7 @@ const char STR_BATTERYWARNING[] = TR_BATTERYWARNING; const char STR_INACTIVITYALARM[] = TR_INACTIVITYALARM; const char STR_MEMORYWARNING[] = TR_MEMORYWARNING; const char STR_ALARMWARNING[] = TR_ALARMWARNING; -const char STR_RSSISHUTDOWNALARM[] = TR_RSSISHUTDOWNALARM; +const char STR_RSSI_SHUTDOWN_ALARM[] = TR_RSSI_SHUTDOWN_ALARM; const char STR_MODEL_STILL_POWERED[] = TR_MODEL_STILL_POWERED; const char STR_MODEL_SHUTDOWN[] = TR_MODEL_SHUTDOWN; const char STR_PRESS_ENTER_TO_CONFIRM[] = TR_PRESS_ENTER_TO_CONFIRM; @@ -176,7 +176,6 @@ const char STR_MINUTEBEEP[] = TR_MINUTEBEEP; const char STR_BEEPCOUNTDOWN[] = TR_BEEPCOUNTDOWN; const char STR_PERSISTENT[] = TR_PERSISTENT; const char STR_BACKLIGHT_LABEL[] = TR_BACKLIGHT_LABEL; -const char STR_BLDELAY[] = TR_BLDELAY; const char STR_RXCHANNELORD[] = TR_RXCHANNELORD; const char STR_STICKS[] = TR_STICKS; const char STR_POTS[] = TR_POTS; @@ -201,14 +200,14 @@ const char STR_PPM_TRAINER[] = TR_PPM_TRAINER; const char STR_CH[] = TR_CH; const char STR_MODEL[] = TR_MODEL; const char STR_FM[] = TR_FM; -const char STR_PRESSANYKEYTOSKIP[] = TR_PRESSANYKEYTOSKIP; -const char STR_THROTTLENOTIDLE[] = TR_THROTTLENOTIDLE; +const char STR_PRESS_ANY_KEY_TO_SKIP[] = TR_PRESS_ANY_KEY_TO_SKIP; +const char STR_THROTTLE_NOT_IDLE[] = TR_THROTTLE_NOT_IDLE; const char STR_ALARMSDISABLED[] = TR_ALARMSDISABLED; const char STR_PRESSANYKEY[] = TR_PRESSANYKEY; const char STR_TRIMS2OFFSETS[] = TR_TRIMS2OFFSETS; const char STR_CHANNELS2FAILSAFE[] = TR_CHANNELS2FAILSAFE; const char STR_CHANNEL2FAILSAFE[] = TR_CHANNEL2FAILSAFE; -const char STR_MENURADIOSETUP[] = TR_MENURADIOSETUP; +const char STR_RADIO_SETUP[] = TR_RADIO_SETUP; const char STR_MENUTRAINER[] = TR_MENUTRAINER; const char STR_MENUSPECIALFUNCS[] = TR_MENUSPECIALFUNCS; const char STR_MENUVERSION[] = TR_MENUVERSION; @@ -216,7 +215,7 @@ const char STR_MENU_RADIO_SWITCHES[] = TR_MENU_RADIO_SWITCHES; const char STR_MENU_RADIO_ANALOGS[] = TR_MENU_RADIO_ANALOGS; const char STR_MENUCALIBRATION[] = TR_MENUCALIBRATION; const char STR_MENUMODELSEL[] = TR_MENUMODELSEL; -const char STR_MENUSETUP[] = TR_MENUSETUP; +const char STR_MENU_MODEL_SETUP[] = TR_MENU_MODEL_SETUP; const char STR_MENUFLIGHTMODE[] = TR_MENUFLIGHTMODE; const char STR_MENUFLIGHTMODES[] = TR_MENUFLIGHTMODES; const char STR_MENUINPUTS[] = TR_MENUINPUTS; @@ -229,7 +228,7 @@ const char STR_MENUCUSTOMFUNC[] = TR_MENUCUSTOMFUNC; const char STR_SPLASHSCREEN[] = TR_SPLASHSCREEN; const char STR_PWR_ON_DELAY[] = TR_PWR_ON_DELAY; const char STR_PWR_OFF_DELAY[] = TR_PWR_OFF_DELAY; -const char STR_THROTTLEWARNING[] = TR_THROTTLEWARNING; +const char STR_THROTTLE_UPPERCASE[] = TR_THROTTLE_UPPERCASE; const char STR_SWITCHWARNING[] = TR_SWITCHWARNING; const char STR_POTWARNINGSTATE[] = TR_POTWARNINGSTATE; const char STR_POTWARNING[] = TR_POTWARNING; @@ -251,9 +250,9 @@ const char STR_NO_MODULE_INFORMATION[] = TR_NO_MODULE_INFORMATION; const char STR_EXTERNALRF[] = TR_EXTERNALRF; const char STR_MODULE_TELEMETRY[] = TR_MODULE_TELEMETRY; const char STR_MODULE_TELEM_ON[] = TR_MODULE_TELEM_ON; -const char STR_COUNTRYCODE[] = TR_COUNTRYCODE; +const char STR_COUNTRY_CODE[] = TR_COUNTRY_CODE; const char STR_USBMODE[] = TR_USBMODE; -const char STR_JACKMODE[] = TR_JACKMODE; +const char STR_JACK_MODE[] = TR_JACK_MODE; const char STR_FAILSAFE[] = TR_FAILSAFE; const char STR_FAILSAFESET[] = TR_FAILSAFESET; const char STR_REG_ID[] = TR_REG_ID; @@ -280,8 +279,8 @@ const char STR_GF[] = TR_GF; const char STR_BATT_CALIB[] = TR_BATT_CALIB; const char STR_VOLTAGE[] = TR_VOLTAGE; const char STR_CURRENT_CALIB[] = TR_CURRENT_CALIB; -const char STR_UNITSSYSTEM[] = TR_UNITSSYSTEM; -const char STR_VOICELANG[] = TR_VOICELANG; +const char STR_UNITS_SYSTEM[] = TR_UNITS_SYSTEM; +const char STR_VOICE_LANGUAGE[] = TR_VOICE_LANGUAGE; const char STR_MODELIDUSED[] = TR_MODELIDUSED; const char STR_BEEP_VOLUME[] = INDENT TR_BEEP_VOLUME; const char STR_WAV_VOLUME[] = INDENT TR_WAV_VOLUME; @@ -354,7 +353,7 @@ const char STR_WAITING_FOR_RX[] = TR_WAITING_FOR_RX; const char STR_WAITING_FOR_TX[] = TR_WAITING_FOR_TX; const char STR_CAT_NOT_EMPTY[] = TR_CAT_NOT_EMPTY; const char STR_WARNING[] = TR_WARNING; -const char STR_THROTTLEWARN[] = TR_THROTTLEWARN; +const char STR_THROTTLE_WARNING[] = TR_THROTTLE_WARNING; const char STR_ALARMSWARN[] = TR_ALARMSWARN; const char STR_SWITCHWARN[] = TR_SWITCHWARN; const char STR_FAILSAFEWARN[] = TR_FAILSAFEWARN; @@ -365,7 +364,7 @@ const char STR_WRONG_PCBREV[] = TR_WRONG_PCBREV; const char STR_EMERGENCY_MODE[] = TR_EMERGENCY_MODE; const char STR_NO_FAILSAFE[] = TR_NO_FAILSAFE; const char STR_KEYSTUCK[] = TR_KEYSTUCK; -const char STR_SPEAKER_VOLUME[] = TR_SPEAKER_VOLUME; +const char STR_VOLUME[] = TR_VOLUME; const char STR_LCD[] = TR_LCD; const char STR_BRIGHTNESS[] = TR_BRIGHTNESS; const char STR_CPU_TEMP[] = TR_CPU_TEMP; @@ -518,11 +517,11 @@ const char STR_USER_INTERFACE[] = TR_USER_INTERFACE; const char STR_THEME[] = TR_THEME; const char STR_SETUP[] = TR_SETUP; const char STR_LAYOUT[] = TR_LAYOUT; -const char STR_ADDMAINVIEW[] = TR_ADDMAINVIEW; +const char STR_ADD_MAIN_VIEW[] = TR_ADD_MAIN_VIEW; const char STR_BACKGROUND_COLOR[] = TR_BACKGROUND_COLOR; const char STR_MAIN_COLOR[] = TR_MAIN_COLOR; const char STR_TEXT_VIEWER[] = TR_TEXT_VIEWER; -const char STR_RFPOWER[] = TR_RFPOWER; +const char STR_RF_POWER[] = TR_RF_POWER; const char STR_BYTES[] = TR_BYTES; const char STR_ANTENNAPROBLEM[] = TR_ANTENNAPROBLEM; const char STR_MODULE[] = TR_MODULE; @@ -610,12 +609,12 @@ const char STR_BUZZER[] = TR_BUZZER; #endif #if defined(AUDIO) -const char STR_SPKRPITCH[] = TR_SPKRPITCH; +const char STR_BEEP_PITCH[] = TR_BEEP_PITCH; #endif #if defined(HAPTIC) const char STR_HAPTIC_LABEL[] = TR_HAPTIC_LABEL; -const char STR_HAPTICSTRENGTH[] = TR_HAPTICSTRENGTH; +const char STR_STRENGTH[] = TR_STRENGTH; const char STR_GYRO_LABEL[] = TR_GYRO_LABEL; const char STR_GYRO_OFFSET[] = TR_GYRO_OFFSET; const char STR_GYRO_MAX[] = TR_GYRO_MAX; @@ -629,7 +628,7 @@ const char STR_BLOFFBRIGHTNESS[] = TR_BLOFFBRIGHTNESS; const char STR_TIMEZONE[] = TR_TIMEZONE; const char STR_ADJUST_RTC[] = TR_ADJUST_RTC; const char STR_GPS[] = TR_GPS; -const char STR_GPSCOORD[] = TR_GPSCOORD; +const char STR_GPS_COORDS_FORMAT[] = TR_GPS_COORDS_FORMAT; const char STR_VARIO[] = TR_VARIO; const char STR_FLYSKY_TELEMETRY[] = TR_FLYSKY_TELEMETRY; const char STR_PITCH_AT_ZERO[] = TR_PITCH_AT_ZERO; diff --git a/radio/src/translations.h b/radio/src/translations.h index a6d803f9c..86e6c45bb 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -53,6 +53,9 @@ #elif defined(TRANSLATIONS_NL) #include "translations/nl.h" #define LEN_SPECIAL_CHARS 0 +#elif defined(TRANSLATIONS_CN) +#include "translations/cn.h" +#define LEN_SPECIAL_CHARS 0 #else #include "translations/en.h" #define LEN_SPECIAL_CHARS 0 @@ -145,9 +148,9 @@ extern const char STR_VBEEPCOUNTDOWN[]; extern const char STR_COUNTDOWNVALUES[]; extern const char STR_VVARIOCENTER[]; -extern const char STR_COUNTRYCODES[]; +extern const char STR_COUNTRY_CODES[]; extern const char STR_USBMODES[]; -extern const char STR_JACKMODES[]; +extern const char STR_JACK_MODES[]; extern const char STR_VFAILSAFE[]; extern const char STR_VTRAINERMODES[]; @@ -272,9 +275,9 @@ extern const char STR_SCREEN[]; extern const char STR_SOUND_LABEL[]; extern const char STR_LENGTH[]; extern const char STR_BEEP_LENGTH[]; -extern const char STR_SPKRPITCH[]; +extern const char STR_BEEP_PITCH[]; extern const char STR_HAPTIC_LABEL[]; -extern const char STR_HAPTICSTRENGTH[]; +extern const char STR_STRENGTH[]; extern const char STR_GYRO_LABEL[]; extern const char STR_GYRO_OFFSET[]; extern const char STR_GYRO_MAX[]; @@ -285,7 +288,7 @@ extern const char STR_BATTERYWARNING[]; extern const char STR_INACTIVITYALARM[]; extern const char STR_MEMORYWARNING[]; extern const char STR_ALARMWARNING[]; -extern const char STR_RSSISHUTDOWNALARM[]; +extern const char STR_RSSI_SHUTDOWN_ALARM[]; extern const char STR_MODEL_STILL_POWERED[]; extern const char STR_MODEL_SHUTDOWN[]; extern const char STR_PRESS_ENTER_TO_CONFIRM[]; @@ -294,7 +297,6 @@ extern const char STR_MINUTEBEEP[]; extern const char STR_BEEPCOUNTDOWN[]; extern const char STR_PERSISTENT[]; extern const char STR_BACKLIGHT_LABEL[]; -extern const char STR_BLDELAY[]; #if defined(PWM_BACKLIGHT) || defined(COLORLCD) extern const char STR_BLONBRIGHTNESS[]; @@ -306,7 +308,7 @@ extern const char STR_SPLASHSCREEN[]; extern const char STR_PWR_ON_DELAY[]; extern const char STR_PWR_OFF_DELAY[]; #endif -extern const char STR_THROTTLEWARNING[]; +extern const char STR_THROTTLE_WARNING[]; extern const char STR_SWITCHWARNING[]; extern const char STR_POTWARNINGSTATE[]; extern const char STR_POTWARNING[]; @@ -314,7 +316,7 @@ extern const char STR_SLIDERWARNING[]; extern const char STR_TIMEZONE[]; extern const char STR_ADJUST_RTC[]; extern const char STR_GPS[]; -extern const char STR_GPSCOORD[]; +extern const char STR_GPS_COORDS_FORMAT[]; extern const char STR_VARIO[]; extern const char STR_FLYSKY_TELEMETRY[]; extern const char STR_PITCH_AT_ZERO[]; @@ -348,8 +350,8 @@ extern const char STR_CH[]; extern const char STR_MODEL[]; extern const char STR_FM[]; extern const char STR_EEPROMLOWMEM[]; -extern const char STR_PRESSANYKEYTOSKIP[]; -extern const char STR_THROTTLENOTIDLE[]; +extern const char STR_PRESS_ANY_KEY_TO_SKIP[]; +extern const char STR_THROTTLE_NOT_IDLE[]; extern const char STR_ALARMSDISABLED[]; extern const char STR_PRESSANYKEY[]; extern const char STR_BAD_RADIO_DATA[]; @@ -358,7 +360,7 @@ extern const char STR_EEPROMOVERFLOW[]; extern const char STR_TRIMS2OFFSETS[]; extern const char STR_CHANNELS2FAILSAFE[]; extern const char STR_CHANNEL2FAILSAFE[]; -extern const char STR_MENURADIOSETUP[]; +extern const char STR_RADIO_SETUP[]; extern const char STR_MENUTRAINER[]; extern const char STR_MENUSPECIALFUNCS[]; extern const char STR_MENUVERSION[]; @@ -366,7 +368,7 @@ extern const char STR_MENU_RADIO_SWITCHES[]; extern const char STR_MENU_RADIO_ANALOGS[]; extern const char STR_MENUCALIBRATION[]; extern const char STR_MENUMODELSEL[]; -extern const char STR_MENUSETUP[]; +extern const char STR_MENU_MODEL_SETUP[]; extern const char STR_MENUFLIGHTMODE[]; extern const char STR_MENUFLIGHTMODES[]; extern const char STR_MENUHELISETUP[]; @@ -453,15 +455,15 @@ extern const char STR_STOPPING []; extern const char STR_MENU_SPECTRUM_ANALYSER[]; extern const char STR_MENU_POWER_METER[]; extern const char STR_SENSOR[]; -extern const char STR_COUNTRYCODE[]; +extern const char STR_COUNTRY_CODE[]; extern const char STR_USBMODE[]; -extern const char STR_JACKMODE[]; +extern const char STR_JACK_MODE[]; extern const char STR_DISABLE_INTERNAL[]; extern const char STR_BATT_CALIB[]; extern const char STR_VOLTAGE[]; extern const char STR_CURRENT_CALIB[]; -extern const char STR_UNITSSYSTEM[]; -extern const char STR_VOICELANG[]; +extern const char STR_UNITS_SYSTEM[]; +extern const char STR_VOICE_LANGUAGE[]; extern const char STR_MODELIDUSED[]; extern const char STR_BEEP_VOLUME[]; extern const char STR_WAV_VOLUME[]; @@ -552,7 +554,7 @@ extern const char STR_CAT_NOT_EMPTY[]; extern const char STR_WARNING[]; extern const char STR_STORAGE_WARNING[]; extern const char STR_EEPROM_CONVERTING[]; -extern const char STR_THROTTLEWARN[]; +extern const char STR_THROTTLE_UPPERCASE[]; extern const char STR_ALARMSWARN[]; extern const char STR_SWITCHWARN[]; extern const char STR_FAILSAFEWARN[]; @@ -566,7 +568,7 @@ extern const char STR_EMERGENCY_MODE[]; extern const char STR_NO_FAILSAFE[]; extern const char STR_KEYSTUCK[]; -extern const char STR_SPEAKER_VOLUME[]; +extern const char STR_VOLUME[]; extern const char STR_LCD[]; extern const char STR_BRIGHTNESS[]; extern const char STR_CPU_TEMP[]; @@ -801,11 +803,11 @@ extern const char STR_USER_INTERFACE[]; extern const char STR_THEME[]; extern const char STR_SETUP[]; extern const char STR_LAYOUT[]; -extern const char STR_ADDMAINVIEW[]; +extern const char STR_ADD_MAIN_VIEW[]; extern const char STR_BACKGROUND_COLOR[]; extern const char STR_MAIN_COLOR[]; extern const char STR_TEXT_VIEWER[]; -extern const char STR_RFPOWER[]; +extern const char STR_RF_POWER[]; extern const char STR_BYTES[]; extern const char STR_ANTENNAPROBLEM[]; diff --git a/radio/src/translations/CMakeLists.txt b/radio/src/translations/CMakeLists.txt index 5861862e3..14dcb772a 100644 --- a/radio/src/translations/CMakeLists.txt +++ b/radio/src/translations/CMakeLists.txt @@ -1,16 +1,17 @@ file(GLOB translations *.h.txt) + foreach(translation ${translations}) get_filename_component(language ${translation} NAME_WE) get_filename_component(path ${translation} DIRECTORY) set(target ${language}.h) - if(NOT(PCB STREQUAL X12S OR PCB STREQUAL X10) AND language STREQUAL "cz") - set(language cz_reduced) + if(PCB STREQUAL X12S OR PCB STREQUAL X10 OR PCB STREQUAL NV14) + set(language all) endif() if(PYTHONINTERP_FOUND) add_custom_command( OUTPUT ${target} - COMMAND ${PYTHON_EXECUTABLE} ${RADIO_DIRECTORY}/util/translate.py ${translation} ${target} ${language} - DEPENDS ${translation} + COMMAND ${PYTHON_EXECUTABLE} ${TOOLS_DIRECTORY}/encode-translation.py ${translation} ${target} ${language} + DEPENDS ${translation} ${TOOLS_DIRECTORY}/encode-translation.py ${TOOLS_DIRECTORY}/charset.py ) endif() list(APPEND translations_files ${target}) diff --git a/radio/src/translations/cn.h.txt b/radio/src/translations/cn.h.txt index 233064536..c5251a554 100644 --- a/radio/src/translations/cn.h.txt +++ b/radio/src/translations/cn.h.txt @@ -180,15 +180,15 @@ #endif #if defined(AUDIO) - #define TR_SOUND "Play Sound" + #define TR_SOUND "播放声音\0 " #else #define TR_SOUND "Beep\0 " #endif #if defined(HAPTIC) - #define TR_HAPTIC "Haptic\0 " + #define TR_HAPTIC "振动\0 " #else - #define TR_HAPTIC "[Haptic]\0 " + #define TR_HAPTIC "[振动]\0 " #endif #if defined(VOICE) @@ -220,13 +220,13 @@ #endif #if defined(LUA) - #define TR_SF_PLAY_SCRIPT "Lua Script" + #define TR_SF_PLAY_SCRIPT "Lua 脚本\0 " #else #define TR_SF_PLAY_SCRIPT "[Lua]\0 " #endif #if defined(DEBUG) - #define TR_SF_TEST "Test\0" + #define TR_SF_TEST "测试\0 " #else #define TR_SF_TEST #endif @@ -239,8 +239,8 @@ #define TR_SF_SAFETY "---\0 " #endif -#define TR_SF_SCREENSHOT "Screenshot" -#define TR_SF_RESERVE "[reserve]\0" +#define TR_SF_SCREENSHOT "截屏\0 " +#define TR_SF_RESERVE "[reserve]\0" #define TR_VFSWFUNC TR_SF_SAFETY "Trainer\0 ""Inst. Trim""Reset\0 ""Set \0 " TR_ADJUST_GVAR "Volume\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 "Backlight\0" TR_SF_SCREENSHOT TR_SF_TEST @@ -295,8 +295,8 @@ #define TR_VSWASHTYPE "---\0""120\0""120X""140\0""90\0" #if defined(PCBHORUS) - #define LEN_VKEYS "\005" - #define TR_VKEYS "Menu\0""Exit\0""Enter""Up\0 ""Down\0""Right""Left\0" + #define LEN_VKEYS "\004" + #define TR_VKEYS "菜单""退出""确认""向上""向下""向右""向左" #elif defined(PCBXLITE) #define LEN_VKEYS "\005" #define TR_VKEYS "Shift""Exit\0""Enter""Down\0""Up\0 ""Right""Left\0" @@ -503,10 +503,10 @@ #define TR_BEEP_PITCH "报警声音高" #define TR_HAPTIC_LABEL "振动" #define TR_STRENGTH "强度" -#define TR_GYRO_LABEL "Gyro" -#define TR_GYRO_OFFSET "Offset" -#define TR_GYRO_MAX "Max" -#define TR_CONTRAST "Contrast" +#define TR_GYRO_LABEL "陀螺仪" +#define TR_GYRO_OFFSET "补偿" +#define TR_GYRO_MAX "最大值" +#define TR_CONTRAST "对比度" #define TR_ALARMS_LABEL "警告" #define TR_BATTERY_RANGE TR("Batt. range", "电压测量范围") #define TR_BATTERYWARNING "低电压报警值" @@ -514,46 +514,46 @@ #define TR_MEMORYWARNING "内存不足" #define TR_ALARMWARNING "静音" #define TR_RSSI_SHUTDOWN_ALARM TR("Rssi Shutdown", "关机时检查RSSI") -#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_MODEL_STILL_POWERED "模型未断电" +#define TR_MODEL_SHUTDOWN "关机 ?" +#define TR_PRESS_ENTER_TO_CONFIRM "按ENTER键确认" #define TR_RENAVIG "RotEnc Navig" -#define TR_THROTTLE_LABEL "Throttle" +#define TR_THROTTLE_LABEL "油门" #define TR_THROTTLEREVERSE TR("T-Reverse", INDENT "Reverse") -#define TR_MINUTEBEEP TR("Minute", "Minute call") -#define TR_BEEPCOUNTDOWN INDENT "Countdown" -#define TR_PERSISTENT TR(INDENT "Persist.", INDENT "Persistent") +#define TR_MINUTEBEEP TR("分", "分钟播报") +#define TR_BEEPCOUNTDOWN INDENT "倒数" +#define TR_PERSISTENT TR(INDENT "Persist.", INDENT "持续") #define TR_BACKLIGHT_LABEL "背光" #define TR_BLONBRIGHTNESS "背光开" #define TR_BLOFFBRIGHTNESS "背光关" -#define TR_BLCOLOR "Color" -#define TR_SPLASHSCREEN "Splash screen" -#define TR_PWR_ON_DELAY "Pwr On delay" -#define TR_PWR_OFF_DELAY "Pwr Off delay" -#define TR_THROTTLE_WARNING TR(INDENT "T-Warning", INDENT "Throttle state") -#define TR_SWITCHWARNING TR(INDENT "S-Warning", INDENT "Switch positions") -#define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") -#define TR_SLIDERWARNING TR(INDENT "Slid. pos.", INDENT "Slider positions") -#define TR_POTWARNING TR(INDENT "Pot warn.", INDENT "Pot positions") +#define TR_BLCOLOR "颜色" +#define TR_SPLASHSCREEN "开机图片" +#define TR_PWR_ON_DELAY "开机延迟" +#define TR_PWR_OFF_DELAY "关机延迟" +#define TR_THROTTLE_WARNING TR(INDENT "T-Warning", INDENT "油门状态") +#define TR_SWITCHWARNING TR(INDENT "S-Warning", INDENT "开关位置") +#define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "电位器和侧滑块") +#define TR_SLIDERWARNING TR(INDENT "Slid. pos.", INDENT "测滑块位置") +#define TR_POTWARNING TR(INDENT "Pot warn.", INDENT "电位器位置") #define TR_TIMEZONE "时区" #define TR_ADJUST_RTC "时钟设置" #define TR_GPS "GPS" -#define TR_RXCHANNELORD TR("Rx channel ord", "Default channel order") -#define TR_STICKS "Sticks" -#define TR_POTS "Pots" -#define TR_SWITCHES "Switches" +#define TR_RXCHANNELORD TR("Rx channel ord", "默认通道顺序") +#define TR_STICKS "摇杆" +#define TR_POTS "电位器" +#define TR_SWITCHES "开关" #define TR_SWITCHES_DELAY TR("Play delay", "Play delay (sw. mid pos)") -#define TR_SLAVE CENTER "Slave" +#define TR_SLAVE CENTER "从机" #define TR_MODESRC "Mode\006% Source" -#define TR_MULTIPLIER "Multiplier" +#define TR_MULTIPLIER "乘数" #define TR_CAL "Cal" -#define TR_CALIBRATION "Calibration" +#define TR_CALIBRATION "校准" #define TR_VTRIM "Trim- +" #define TR_BG "BG:" -#define TR_CALIB_DONE "Calibration completed" +#define TR_CALIB_DONE "校准完成" #if defined(PCBHORUS) - #define TR_MENUTOSTART "Press [Enter] to start" - #define TR_SETMIDPOINT "Center sticks/pots/sliders and press [Enter]" + #define TR_MENUTOSTART "按 [Enter] 键开始" + #define TR_SETMIDPOINT "将摇杆、电位器和侧滑块居中后按[Enter]开始" #define TR_MOVESTICKSPOTS "Move sticks/pots/sliders and press [Enter]" #elif defined(COLORLCD) #define TR_MENUTOSTART TR_ENTER " TO START" @@ -729,7 +729,7 @@ #define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "STORAGE" #define TR_EEPROM_CONVERTING "Converting EEPROM" -#define TR_THROTTLE_WARNING "油门" +#define TR_THROTTLE_UPPERCASE "油门" #define TR_ALARMSWARN "ALARMS" #define TR_SWITCHWARN TR("SWITCH", "CONTROL") #define TR_FAILSAFEWARN "FAILSAFE" @@ -912,7 +912,6 @@ #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("Keys", "Switches")) #define TR_ANALOGS_BTN BUTTON(TR("Anas", "Analogs")) -#define TR_CALIBRATION "Calibration" #define TR_SET BUTTON("Set") #define TR_TRAINER "Trainer" #define TR_ANTENNAPROBLEM CENTER "TX antenna problem!" @@ -934,30 +933,28 @@ #define TR_CHANNELRANGE TR(INDENT "Ch. Range", INDENT "Channel Range") #define TR_RXFREQUENCY TR("Rx Freqency", "Rx Servo Frequency") #define TR_ANTENNACONFIRM1 "EXT. ANTENNA" - #if defined(PCBX12S) -#define LEN_ANTENNA_MODES "\012" -#define TR_ANTENNA_MODES "内置\0 ""询问\0 ""视模型而定""内置+外置" +#define LEN_ANTENNA_MODES "\010" +#define TR_ANTENNA_MODES "内置天线""询问\0 ""基于模型""外置天线" #else #define LEN_ANTENNA_MODES "\011" #define TR_ANTENNA_MODES "Internal\0""Ask\0 ""Per model""External" #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 FLEX non" -#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "Requires FCC" -#define TR_MODULE_PROTOCOL_EU_WARN_LINE1 "Requires EU" +#define TR_USE_INTERNAL_ANTENNA TR("Use int. antenna", "请使用内置天线") +#define TR_USE_EXTERNAL_ANTENNA TR("Use ext. antenna", "请使用外置天线") +#define TR_ANTENNACONFIRM2 TR("Check antenna", "请确认天线安装完好!") +#define TR_MODULE_PROTOCOL_FLEX_WARN_LINE1 "请使用FLEX版本" +#define TR_MODULE_PROTOCOL_FCC_WARN_LINE1 "请使用FCC版本" +#define TR_MODULE_PROTOCOL_EU_WARN_LINE1 "请使用EU版本" #define TR_MODULE_PROTOCOL_WARN_LINE2 "certified firmware" #define TR_LOWALARM INDENT "Low alarm" #define TR_CRITICALALARM INDENT "Critical alarm" #define TR_RSSIALARM_WARN "RSSI" -#define TR_NO_RSSIALARM TR(INDENT "Alarms disabled", "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_POPUP "Popup" +#define TR_NO_RSSIALARM TR(INDENT "Alarms disabled", "遥测报警已禁止") +#define TR_DISABLE_ALARM TR(INDENT "Disable alarms", INDENT "请禁止遥测报警") +#define TR_ENABLE_POPUP "允许弹窗" +#define TR_DISABLE_POPUP "禁止弹窗" +#define TR_POPUP "弹窗提示" #define TR_MIN "Min" #define TR_MAX "Max" #define TR_CURVE_PRESET "Preset..." @@ -980,18 +977,18 @@ #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_SCRIPT "Script" -#define TR_INPUTS "Inputs" -#define TR_OUTPUTS "Outputs" -#define STR_EEBACKUP "EEPROM backup" -#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_AUX_SERIAL_MODE "串口" +#define TR_SCRIPT "脚本" +#define TR_INPUTS "输入" +#define TR_OUTPUTS "输出" +#define STR_EEBACKUP "EEPROM 数据备份" +#define STR_FACTORYRESET "恢复出厂设置" +#define TR_CONFIRMRESET TR("Erase ALL", "擦除所有模型和设置数据?") +#define TR_TOO_MANY_LUA_SCRIPTS "Lua脚本数量超出!" // Horus and Taranis column headers -#define TR_PHASES_HEADERS_NAME "Name" -#define TR_PHASES_HEADERS_SW "Switch" +#define TR_PHASES_HEADERS_NAME "名称" +#define TR_PHASES_HEADERS_SW "开关" #define TR_PHASES_HEADERS_RUD_TRIM "Rudder Trim" #define TR_PHASES_HEADERS_ELE_TRIM "Elevator Trim" #define TR_PHASES_HEADERS_THT_TRIM "Throttle Trim" @@ -1144,7 +1141,7 @@ #define TR_SETUP "Setup" #define TR_MAINVIEWX "Main view X" #define TR_LAYOUT "Layout" -#define TR_ADDMAINVIEW "Add main view" +#define TR_ADD_MAIN_VIEW "Add main view" #define TR_BACKGROUND_COLOR "Background color" #define TR_MAIN_COLOR "Main color" #define TR_TEXT_VIEWER "Text Viewer" diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index be8e767e3..364b162bd 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -85,14 +85,14 @@ #define LEN_VPERSISTENT "\014" #define TR_VPERSISTENT "Ne\0 ""V rámci letu""Reset ručně\0" -#define LEN_COUNTRYCODES TR("\002", "\010") -#define TR_COUNTRYCODES TR("US""JP""EU", "Amerika\0""Japonsko""Evropa\0 ") +#define LEN_COUNTRY_CODES TR("\002", "\010") +#define TR_COUNTRY_CODES TR("US""JP""EU", "Amerika\0""Japonsko""Evropa\0 ") #define LEN_USBMODES TR("\007", "\011") #define TR_USBMODES TR("Zeptat\0""Joyst\0 ""SDkarta""Serial\0", "Zeptat se""Joystick\0""Úložiště\0""Serial\0 ") -#define LEN_JACKMODES "\007" -#define TR_JACKMODES "Zeptat\0""Audio\0 ""Trenér" +#define LEN_JACK_MODES "\007" +#define TR_JACK_MODES "Zeptat\0""Audio\0 ""Trenér" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 FrSky D\0 FrSky D (kabel)Spektrum\0 " @@ -489,27 +489,27 @@ #define TR_RANGE INDENT"Rozsah" #define TR_CENTER INDENT "Střed" #define TR_BAR "Ukazatel" -#define TR_ALARM INDENT"Alarm" +#define TR_ALARM "Alarm" #define TR_USRDATA TR("UživData", "Uživ. data") -#define TR_BLADES TR(INDENT"ListyVrt", INDENT"Listy vrtule") +#define TR_BLADES TR("ListyVrt", "Listy vrtule") #define TR_SCREEN "Panel " #define TR_SOUND_LABEL "Zvuk" -#define TR_LENGTH INDENT"Délka" -#define TR_BEEP_LENGTH TR3(INDENT"Délka", INDENT"Délka", INDENT"Délka zvuku") -#define TR_SPKRPITCH INDENT"Tón" +#define TR_LENGTH "Délka" +#define TR_BEEP_LENGTH TR3("Délka", "Délka", "Délka zvuku") +#define TR_BEEP_PITCH "Tón" #define TR_HAPTIC_LABEL "Vibrace" -#define TR_HAPTICSTRENGTH INDENT"Síla" +#define TR_STRENGTH "Síla" #define TR_GYRO_LABEL "Gyro" #define TR_GYRO_OFFSET "Offset" #define TR_GYRO_MAX "Max" #define TR_CONTRAST "Kontrast LCD" #define TR_ALARMS_LABEL "Alarmy" #define TR_BATTERY_RANGE TR("Ukazatel bat.", "Ukazatel baterie") -#define TR_BATTERYWARNING INDENT "Vybitá bat." -#define TR_INACTIVITYALARM TR(INDENT "Nečinnost", INDENT "Nečinnost rádia") -#define TR_MEMORYWARNING INDENT"Plná pamět'" -#define TR_ALARMWARNING TR3(INDENT "Vypnutý zvuk", INDENT "Upozornit na vypnutý zvuk", INDENT "Upozornit na vyp. zvuk") -#define TR_RSSISHUTDOWNALARM TR(INDENT "Rssi při vyp.", INDENT "Hlídat Rssi při vypnutí") +#define TR_BATTERYWARNING "Vybitá bat." +#define TR_INACTIVITYALARM TR("Nečinnost", "Nečinnost rádia") +#define TR_MEMORYWARNING "Plná pamět'" +#define TR_ALARMWARNING TR3("Vypnutý zvuk", "Upozornit na vypnutý zvuk", "Upozornit na vyp. zvuk") +#define TR_RSSI_SHUTDOWN_ALARM TR("Rssi při vyp.", "Hlídat Rssi při vypnutí") #define TR_MODEL_STILL_POWERED "Model stále spuštěn" #define TR_MODEL_SHUTDOWN "Vypnout ?" #define TR_PRESS_ENTER_TO_CONFIRM "Zmáčkni enter pro potvrzení" @@ -520,20 +520,19 @@ #define TR_BEEPCOUNTDOWN INDENT"Odpočet" #define TR_PERSISTENT INDENT"Trvalé" #define TR_BACKLIGHT_LABEL "Podsvětlení" -#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_BLCOLOR INDENT "Barva" +#define TR_BLONBRIGHTNESS TR3("Jas Zap.", "Jas Zap.", "Jas zapnutého LCD") +#define TR_BLOFFBRIGHTNESS TR3("Jas Vyp.", "Jas Vyp.", "Jas vypnutého LCD") +#define TR_BLCOLOR "Barva" #define TR_SPLASHSCREEN TR("úvodní logo", "Zobrazit úvodní logo") #define TR_PWR_ON_DELAY "Pwr On delay" #define TR_PWR_OFF_DELAY "Pwr Off delay" -#define TR_THROTTLEWARNING TR("* Plyn", INDENT "Kontrola plynu") +#define TR_THROTTLE_WARNING TR("* Plyn", INDENT "Kontrola plynu") #define TR_SWITCHWARNING TR("* Spínače", INDENT "Polohy spínačů") #define TR_POTWARNINGSTATE TR("* Pot&Slid.", INDENT "Kontrola Pot&Slid.") #define TR_SLIDERWARNING TR("* Slidery", INDENT "Pozice sliderů") #define TR_POTWARNING TR("* Potenc.", INDENT "Potenciometry") #define TR_TIMEZONE "Časové pásmo" -#define TR_ADJUST_RTC TR3("Čas z GPS", INDENT "Použít čas z GPS", INDENT "Použít čas z GPS") +#define TR_ADJUST_RTC TR3("Čas z GPS", "Použít čas z GPS", "Použít čas z GPS") #define TR_GPS "GPS" #define TR_RXCHANNELORD TR("Pořadí kanálů", "Výchozí pořadí kanálů") #define TR_STICKS "Páky" @@ -564,7 +563,6 @@ #define OFS_RX 4 #define TR_ACCEL "Acc:" #define TR_NODATA CENTER "NO DATA" -#define TR_TOTTM1TM2THRTHP "\037\146SES\036TM1\037\146TM2\036THR\037\146TH%" #define TR_US "us" #define TR_TMR1JITTERUS "Tmr1 Jitter\037\124us" #define TR_TMIXMAXMS "Tmix max" @@ -576,9 +574,8 @@ #define TR_FM "LR" #define TR_MIX "MIX" #define TR_EEPROMLOWMEM "Dochází EEPROM" -#define TR_ALERT "\006 POZOR" -#define TR_PRESSANYKEYTOSKIP TR("\003Klávesa >>> přeskočit", "Klávesa >>> přeskočit") -#define TR_THROTTLENOTIDLE TR("\003Páka plynu je pohnutá", "Páka plynu není na nule") +#define TR_PRESS_ANY_KEY_TO_SKIP TR("\003Klávesa >>> přeskočit", "Klávesa >>> přeskočit") +#define TR_THROTTLE_NOT_IDLE TR("\003Páka plynu je pohnutá", "Páka plynu není na nule") #define TR_ALARMSDISABLED "Alarmy jsou zakázány" #define TR_PRESSANYKEY TR("\006Stiskni klávesu", "Stiskni klávesu") #define TR_BADEEPROMDATA TR("\006Chyba dat EEPROM", "Chyba dat EEPROM") @@ -586,7 +583,7 @@ #define TR_EEPROMFORMATTING TR("\004Formatování EEPROM", "Formatování EEPROM") #define TR_STORAGE_FORMAT "Storage Preparation" #define TR_EEPROMOVERFLOW "Přetekla EEPROM" -#define TR_MENURADIOSETUP "NASTAVENÍ RÁDIA" +#define TR_RADIO_SETUP "NASTAVENÍ RÁDIA" #define TR_MENUDATEANDTIME "DATUM A ČAS" #define TR_MENUTRAINER "TRENÉR" #define TR_MENUSPECIALFUNCS "GLOBÁLNÍ FUNKCE" @@ -602,7 +599,7 @@ #define TR_CHANNELS2FAILSAFE "Kanály=>Failsafe" #define TR_CHANNEL2FAILSAFE "Kanál=>Failsafe" #define TR_MENUMODELSEL "MODEL" -#define TR_MENUSETUP "NASTAVENÍ" +#define TR_MENU_MODEL_SETUP "NASTAVENÍ" #define TR_MENUFLIGHTMODE "LETOVÝ REŽIM" #define TR_MENUFLIGHTMODES "LETOVÉ REŽIMY" #define TR_MENUHELISETUP "HELI" @@ -633,7 +630,7 @@ #define TR_MULTI_RFTUNE TR(INDENT "Ladění frek", INDENT "Jemné ladění frek. RF") #define TR_MULTI_TELEMETRY "Telemetrie" #define TR_MULTI_VIDFREQ TR(INDENT "Freq. videa", INDENT "Frekvence videa") -#define TR_RFPOWER INDENT "Výkon RF" +#define TR_RF_POWER INDENT "Výkon RF" #define TR_MULTI_FIXEDID TR("FixedID", "Fixed ID") #define TR_MULTI_OPTION TR(INDENT "Možnosti", INDENT "Hodnota") #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind při zapnutí") @@ -664,14 +661,13 @@ #define TR_FLYSKY_TELEMETRY TR("FlySky RSSI #", "Use FlySky RSSI value without rescalling") #define TR_LATITUDE "Zem. šířka" #define TR_LONGITUDE "Zem. délka" -#define TR_GPSCOORD "GPS souřadnice" +#define TR_GPS_COORDS_FORMAT "GPS souřadnice" #define TR_VARIO "Vario" -#define TR_PITCH_AT_ZERO INDENT "Tón na nule" -#define TR_PITCH_AT_MAX INDENT "Tón na maximu" -#define TR_REPEAT_AT_ZERO TR(INDENT "Opak. na nule", INDENT "Opakování na nule") -#define TR_POWEROFF "\027Vypínám..." +#define TR_PITCH_AT_ZERO "Tón na nule" +#define TR_PITCH_AT_MAX "Tón na maximu" +#define TR_REPEAT_AT_ZERO TR("Opak. na nule", "Opakování na nule") #define TR_SHUTDOWN "Vypínání.." -#define TR_SAVEMODEL "Ukládám nastavení modelu" +#define TR_SAVE_MODEL "Ukládám nastavení modelu" #define TR_BATT_CALIB "Kalib. bat." #define TR_CURRENT_CALIB " +=\006Proud" #define TR_VOLTAGE INDENT"Napětí" @@ -728,7 +724,7 @@ #define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "ÚLOŽIŠTĚ" #define TR_EEPROM_CONVERTING "Aktualizuji EEPROM" -#define TR_THROTTLEWARN "PLYNU" +#define TR_THROTTLE_UPPERCASE "PLYNU" #define TR_ALARMSWARN "ALARMU" #define TR_SWITCHWARN "POZICE" #define TR_FAILSAFEWARN "FAILSAFE" @@ -743,9 +739,9 @@ #define TR_NO_FAILSAFE "Failsafe není nastaveno" #define TR_KEYSTUCK "Zaseklá klávesa" #define TR_INVERT_THR "Invertovat plyn?" -#define TR_SPEAKER_VOLUME INDENT "Hlasitost" +#define TR_VOLUME "Hlasitost" #define TR_LCD "LCD" -#define TR_BRIGHTNESS INDENT "Jas" +#define TR_BRIGHTNESS "Jas" #define TR_CPU_TEMP "Tepl. CPU\016>" #define TR_CPU_CURRENT "Proud\030>" #define TR_CPU_MAH "Spotřeba" @@ -856,11 +852,11 @@ #define TR_MENU_SPECTRUM_ANALYSER "SPEKTRÁLNÍ ANALYZER" #define TR_MENU_POWER_METER "MĚŘIČ VÝKONU" #define TR_SENSOR "SENZOR" -#define TR_COUNTRYCODE "Kód regionu" +#define TR_COUNTRY_CODE "Kód regionu" #define TR_USBMODE "Režim USB" -#define TR_JACKMODE "Režim Jack" -#define TR_VOICELANG "Jazyk hlasu" -#define TR_UNITSSYSTEM "Jednotky" +#define TR_JACK_MODE "Režim Jack" +#define TR_VOICE_LANGUAGE "Jazyk hlasu" +#define TR_UNITS_SYSTEM "Jednotky" #define TR_EDIT "Upravit" #define TR_INSERT_BEFORE "Vložit před" #define TR_INSERT_AFTER "Vložit za" @@ -1131,7 +1127,7 @@ #define TR_SETUP "Nastavení" #define TR_MAINVIEWX "Hlavní panel X" #define TR_LAYOUT "Rozložení" -#define TR_ADDMAINVIEW "Přidat hlavní panel" +#define TR_ADD_MAIN_VIEW "Přidat hlavní panel" #define TR_BACKGROUND_COLOR "Barva pozadí" #define TR_MAIN_COLOR "Hlavní barva" #define TR_TEXT_VIEWER "Prohlížeč textu" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 5dae3c278..3d54a5a1a 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -86,14 +86,14 @@ #define LEN_VPERSISTENT "\014" #define TR_VPERSISTENT "AUS\0 ""Flugzeit\0 ""Manuell Ruck" -#define LEN_COUNTRYCODES TR("\002", "\007") -#define TR_COUNTRYCODES TR("US""JP""EU", "Amerika""Japan\0 ""Europa\0") +#define LEN_COUNTRY_CODES TR("\002", "\007") +#define TR_COUNTRY_CODES TR("US""JP""EU", "Amerika""Japan\0 ""Europa\0") #define LEN_USBMODES TR("\006", "\010") #define TR_USBMODES TR("Fragen""Joyst\0""SDCard""Serial", "Fragen\0 ""Joystick""Speicher""Seriell\0") -#define LEN_JACKMODES "\007" -#define TR_JACKMODES "Popup\0 ""Audio\0 ""Trainer" +#define LEN_JACK_MODES "\007" +#define TR_JACK_MODES "Popup\0 ""Audio\0 ""Trainer" #define LEN_TELEMETRY_PROTOCOLS "\017" #define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 ""FrSky D\0 ""FrSky D (Kabel)""TBS Crossfire\0 ""Spektrum\0 ""AFHDS2A IBUS\0 ""Multi Telemetry" @@ -490,31 +490,31 @@ #define TR_MIXER "MISCHER" #define TR_CV "KV" #define TR_GV TR("G", "GV") -#define TR_ACHANNEL TR("A\004gemessen", "A\004Kanal gemessen =>") //9XR-Pro +#define TR_ACHANNEL TR("A\004gemessen", "A\004Kanal gemessen =>") // 9XR-Pro #define TR_RANGE TR(INDENT "Bereich", INDENT "Variobereich m/s") // 9XR-Pro #define TR_CENTER TR(INDENT "Mitte", INDENT "Variomitte m/s") #define TR_BAR "Balken" -#define TR_ALARM TR(INDENT "Alarme ", INDENT "Aufleuchten bei Alarm") //9XR-Pro +#define TR_ALARM TR("Alarme ", "Aufleuchten bei Alarm") // 9XR-Pro #define TR_USRDATA "Daten berechnen aus" -#define TR_BLADES TR(INDENT "Prop", INDENT "Prop-Blätter") //9XR-Pro +#define TR_BLADES TR("Prop", "Prop-Blätter") // 9XR-Pro #define TR_SCREEN "TelmBild " #define TR_SOUND_LABEL "Töne" -#define TR_LENGTH INDENT "Dauer" -#define TR_BEEP_LENGTH INDENT "Beep-Länge" -#define TR_SPKRPITCH INDENT "Beep-Freq +/-" +#define TR_LENGTH "Dauer" +#define TR_BEEP_LENGTH "Beep-Länge" +#define TR_BEEP_PITCH "Beep-Freq +/-" #define TR_HAPTIC_LABEL "Haptik" -#define TR_HAPTICSTRENGTH INDENT "Stärke" +#define TR_STRENGTH "Stärke" #define TR_GYRO_LABEL "Gyro" #define TR_GYRO_OFFSET "Offset" #define TR_GYRO_MAX "Max" #define TR_CONTRAST "LCD-Kontrast" #define TR_ALARMS_LABEL "Alarme" #define TR_BATTERY_RANGE TR("Akku Bereich", "Akku Spannungsbereich") // Symbol Akku Ladezustand -#define TR_BATTERYWARNING TR(INDENT "Akku Warnung", "Akkuspannungswarnung") -#define TR_INACTIVITYALARM TR(INDENT "Inaktivität", INDENT "Inaktivität nach") //9XR-Pro -#define TR_MEMORYWARNING INDENT "Speicher voll" -#define TR_ALARMWARNING TR(INDENT "Alle Töne aus?", INDENT "Alle Töne ganz aus?") -#define TR_RSSISHUTDOWNALARM TR(INDENT "RSSI-Chk aus?", INDENT "Prüfe RSSI bei Ausschalten") +#define TR_BATTERYWARNING TR("Akku Warnung", "Akkuspannungswarnung") +#define TR_INACTIVITYALARM TR("Inaktivität", "Inaktivität nach") +#define TR_MEMORYWARNING "Speicher voll" +#define TR_ALARMWARNING TR("Alle Töne aus?", "Alle Töne ganz aus?") +#define TR_RSSI_SHUTDOWN_ALARM TR(INDENT "RSSI-Chk aus?", INDENT "Prüfe RSSI bei Ausschalten") #define TR_FLYSKY_TELEMETRY TR("FlySky RSSI #", "Use FlySky RSSI value without rescalling") #define TR_MODEL_STILL_POWERED "Model still powered" #define TR_MODEL_SHUTDOWN "Shutdown ?" @@ -526,21 +526,19 @@ #define TR_BEEPCOUNTDOWN INDENT "Countdown" #define TR_PERSISTENT TR(INDENT "Permanent", INDENT "Permanent") #define TR_BACKLIGHT_LABEL "LCD-Beleuchtung" -#define TR_BLDELAY INDENT "Dauer" -#define TR_BL_MODE_DUR INDENT "Mode-Duration" -#define TR_BLONBRIGHTNESS INDENT "An-Helligkeit" -#define TR_BLOFFBRIGHTNESS INDENT "Aus-Helligkeit" -#define TR_BLCOLOR INDENT "Farbe" +#define TR_BLONBRIGHTNESS "An-Helligkeit" +#define TR_BLOFFBRIGHTNESS "Aus-Helligkeit" +#define TR_BLCOLOR "Farbe" #define TR_SPLASHSCREEN TR("Startbild Ein", "Startbild Anzeigedauer") #define TR_PWR_ON_DELAY "Pwr On delay" #define TR_PWR_OFF_DELAY "Pwr Off delay" -#define TR_THROTTLEWARNING TR("Gasalarm", INDENT "Gas Alarm") +#define TR_THROTTLE_WARNING TR("Gasalarm", INDENT "Gas Alarm") #define TR_SWITCHWARNING TR("Sch. Alarm", INDENT "Schalter-Alarm") #define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") #define TR_SLIDERWARNING TR(INDENT "Slid. pos.", INDENT "Slider positions") #define TR_POTWARNING TR("Potiwarnung", INDENT "Poti-Warnung") #define TR_TIMEZONE TR("Zeitzone", "GPS-Zeitzone +/-Std") -#define TR_ADJUST_RTC TR("GPSzeit setzen", INDENT "Uhrzeit per GPS setzen") +#define TR_ADJUST_RTC TR("GPSzeit setzen", "Uhrzeit per GPS setzen") #define TR_GPS "GPS" #define TR_RXCHANNELORD TR("Kanal CH1-4", "Kanalvoreinstellung") #define TR_STICKS "Knüppel" @@ -575,7 +573,6 @@ #define OFS_RX 4 #define TR_ACCEL "Acc:" #define TR_NODATA CENTER"Keine Daten" -#define TR_TOTTM1TM2THRTHP "\037\146SES\036TM1\037\146TM2\036GAS\037\146GS%" #define TR_US "us" #define TR_TMR1JITTERUS "Tmr1 Jitter\037\124us" #define TR_TMIXMAXMS "Tmix max" @@ -587,9 +584,8 @@ #define TR_FM "FP" #define TR_MIX "MIX" #define TR_EEPROMLOWMEM "EEPROM voll" -#define TR_ALERT "WARNUNG" -#define TR_PRESSANYKEYTOSKIP TR("Taste drücken",CENTER"Taste drücken") -#define TR_THROTTLENOTIDLE "Gas nicht Null!" +#define TR_PRESS_ANY_KEY_TO_SKIP TR("Taste drücken",CENTER"Taste drücken") +#define TR_THROTTLE_NOT_IDLE "Gas nicht Null!" #define TR_ALARMSDISABLED "Alarme ausgeschaltet" #define TR_PRESSANYKEY TR("Taste drücken",CENTER"Taste drücken") #define TR_BADEEPROMDATA "EEPROM ungültig" @@ -597,7 +593,7 @@ #define TR_EEPROMFORMATTING "EEPROM Initialisieren" #define TR_STORAGE_FORMAT "Speicher Vorbereiten" // #define TR_EEPROMOVERFLOW "EEPROM Überlauf" -#define TR_MENURADIOSETUP TR("SENDER-EINSTELLEN", "SENDER-GRUNDEINSTELLUNGEN") +#define TR_RADIO_SETUP TR("SENDER-EINSTELLEN", "SENDER-GRUNDEINSTELLUNGEN") #define TR_MENUDATEANDTIME "DATUM UND ZEIT" #define TR_MENUTRAINER TR("LEHRER/SCHÜLER", "LEHRER/SCHÜLER") #define TR_MENUSPECIALFUNCS "GLOBALE FUNKTIONEN" @@ -613,7 +609,7 @@ #define TR_CHANNELS2FAILSAFE "Channels=>Failsafe" #define TR_CHANNEL2FAILSAFE "Channel=>Failsafe" #define TR_MENUMODELSEL TR("MODELLE", "MODELL WÄHLEN") -#define TR_MENUSETUP TR("MODELL-EINSTELLUNG", "MODELL-EINSTELLUNGEN") +#define TR_MENU_MODEL_SETUP TR("MODELL-EINSTELLUNG", "MODELL-EINSTELLUNGEN") #define TR_MENUFLIGHTMODE "FLUGPHASE" #define TR_MENUFLIGHTMODES "FLUGPHASEN" #define TR_MENUHELISETUP TR("HELI TS-Mischer", "HELI TS-Mischer CYC1-3") @@ -642,7 +638,7 @@ #define TR_MULTI_RFTUNE TR(INDENT "RF Freq.", INDENT "RF Freq. Feintuning") #define TR_MULTI_TELEMETRY "Telemetry" #define TR_MULTI_VIDFREQ TR(INDENT "Vid. Freq.", INDENT "Video Frequenz") -#define TR_RFPOWER INDENT "RF Power" +#define TR_RF_POWER INDENT "RF Power" #define TR_MULTI_FIXEDID TR("FixedID", "Fixed ID") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Optionswert") #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on channel") @@ -672,14 +668,13 @@ #define TR_MINRSSI "Min. RSSI" #define TR_LATITUDE "Breite:" #define TR_LONGITUDE "Länge:" -#define TR_GPSCOORD TR("GPS-Koord.", "GPS-Koordinaten-Format") +#define TR_GPS_COORDS_FORMAT TR("GPS-Koord.", "GPS-Koordinaten-Format") #define TR_VARIO "Variometer" -#define TR_PITCH_AT_ZERO INDENT "Töne sinken" -#define TR_PITCH_AT_MAX INDENT "Töne steigen" -#define TR_REPEAT_AT_ZERO INDENT "Wiederholrate" -#define TR_POWEROFF "\027Power OFF..." +#define TR_PITCH_AT_ZERO "Töne sinken" +#define TR_PITCH_AT_MAX "Töne steigen" +#define TR_REPEAT_AT_ZERO "Wiederholrate" #define TR_SHUTDOWN "Herunterfahren" -#define TR_SAVEMODEL "Modelleinstellungen speichern" +#define TR_SAVE_MODEL "Modelleinstellungen speichern" #define TR_BATT_CALIB TR("AkkuSpgwert", "Akku Kalibrierung") #define TR_CURRENT_CALIB "Strom abgl." #define TR_VOLTAGE TR(INDENT "Spg", INDENT "Spannungsquelle") //9XR-Pro @@ -736,7 +731,7 @@ #define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "SPEICHER" #define TR_EEPROM_CONVERTING "EEPROM Konvertierung" -#define TR_THROTTLEWARN "GAS" +#define TR_THROTTLE_UPPERCASE "GAS" #define TR_ALARMSWARN "ALARM" #define TR_SWITCHWARN "SCHALTER" #define TR_FAILSAFEWARN "FAILSAFE" @@ -751,9 +746,9 @@ #define TR_NO_FAILSAFE TR("Failsafe not set", "Failsafe nicht programmiert") #define TR_KEYSTUCK "Taste klemmt" //Key stuck=Taste klemmt #define TR_INVERT_THR TR("Gas umkehren?", "Vollgas hinten?") // Th9x 9XR -#define TR_SPEAKER_VOLUME INDENT "Lautstärke" +#define TR_VOLUME "Lautstärke" #define TR_LCD "Bildschirm" -#define TR_BRIGHTNESS INDENT "Helligkeit" +#define TR_BRIGHTNESS "Helligkeit" #define TR_CPU_TEMP "CPU-Temp.\016>" #define TR_CPU_CURRENT "Strom\022>" #define TR_CPU_MAH "Verbrauch" @@ -864,11 +859,11 @@ #define TR_MENU_SPECTRUM_ANALYSER "SPECTRUM ANALYSER" #define TR_MENU_POWER_METER "POWER METER" #define TR_SENSOR "SENSOR" -#define TR_COUNTRYCODE "Landescode" +#define TR_COUNTRY_CODE "Landescode" #define TR_USBMODE "USB Modus" -#define TR_JACKMODE "Jack Mode" -#define TR_VOICELANG "Sprachansagen" -#define TR_UNITSSYSTEM "Einheiten" +#define TR_JACK_MODE "Jack Mode" +#define TR_VOICE_LANGUAGE "Sprachansagen" +#define TR_UNITS_SYSTEM "Einheiten" #define TR_EDIT "Zeile Editieren" #define TR_INSERT_BEFORE "Neue Zeile davor" #define TR_INSERT_AFTER "Neue Zeile danach" @@ -1144,7 +1139,7 @@ #define TR_SETUP "Setup" #define TR_MAINVIEWX "Ansicht X" #define TR_LAYOUT "Layout" -#define TR_ADDMAINVIEW "Ansicht hinzufügen" +#define TR_ADD_MAIN_VIEW "Ansicht hinzufügen" #define TR_BACKGROUND_COLOR "Hintergrundfarbe" #define TR_MAIN_COLOR "Hauptfarbe" #define TR_TEXT_VIEWER "Text Viewer" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index f3af747ff..6f28a99ff 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -86,14 +86,14 @@ #define LEN_VPERSISTENT "\014" #define TR_VPERSISTENT "OFF\0 ""Flight\0 ""Manual Reset" -#define LEN_COUNTRYCODES TR("\002", "\007") -#define TR_COUNTRYCODES TR("US""JP""EU", "America""Japan\0 ""Europe\0") +#define LEN_COUNTRY_CODES TR("\002", "\007") +#define TR_COUNTRY_CODES TR("US""JP""EU", "America""Japan\0 ""Europe\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_JACKMODES "\007" -#define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" +#define LEN_JACK_MODES "\007" +#define TR_JACK_MODES "Ask\0 ""Audio\0 ""Trainer" #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" @@ -314,18 +314,18 @@ #define LEN_VSWITCHES "\003" #define LEN_VSRCRAW "\004" -#define TR_STICKS_VSRCRAW "\307Rud""\307Ele""\307Thr""\307Ail" +#define TR_STICKS_VSRCRAW "\207Rud""\207Ele""\207Thr""\207Ail" #if defined(PCBHORUS) - #define TR_TRIMS_VSRCRAW "\313Rud""\313Ele""\313Thr""\313Ail""\313T5\0""\313T6\0" + #define TR_TRIMS_VSRCRAW "\213Rud""\213Ele""\213Thr""\213Ail""\213T5\0""\213T6\0" #else - #define TR_TRIMS_VSRCRAW "\313Rud""\313Ele""\313Thr""\313Ail" + #define TR_TRIMS_VSRCRAW "\213Rud""\213Ele""\213Thr""\213Ail" #endif #if defined(PCBHORUS) - #define TR_TRIMS_SWITCHES "\313Rl""\313Rr""\313Ed""\313Eu""\313Td""\313Tu""\313Al""\313Ar""\3135d""\3135u""\3136d""\3136u" + #define TR_TRIMS_SWITCHES "\213Rl""\213Rr""\213Ed""\213Eu""\213Td""\213Tu""\213Al""\213Ar""\2135d""\2135u""\2136d""\2136u" #else - #define TR_TRIMS_SWITCHES TR("tRl""tRr""tEd""tEu""tTd""tTu""tAl""tAr", "\313Rl""\313Rr""\313Ed""\313Eu""\313Td""\313Tu""\313Al""\313Ar") + #define TR_TRIMS_SWITCHES TR("tRl""tRr""tEd""tEu""tTd""tTu""tAl""tAr", "\213Rl""\213Rr""\213Ed""\213Eu""\213Td""\213Tu""\213Al""\213Ar") #endif #if defined(PCBSKY9X) @@ -367,7 +367,6 @@ #define LEN_VFAILSAFE "\011" #define TR_VFAILSAFE "Not set\0 ""Hold\0 ""Custom\0 ""No pulses""Receiver\0" - #define LEN_VSENSORTYPES "\012" #define TR_VSENSORTYPES "Custom\0 ""Calculated" @@ -494,27 +493,27 @@ #define TR_RANGE INDENT "Range" #define TR_CENTER INDENT "Center" #define TR_BAR "Bar" -#define TR_ALARM INDENT "Alarm" +#define TR_ALARM "Alarm" #define TR_USRDATA TR("UsrData", "User data") -#define TR_BLADES INDENT "Blades/Poles" +#define TR_BLADES "Blades/Poles" #define TR_SCREEN "Screen\001" #define TR_SOUND_LABEL "Sound" -#define TR_LENGTH INDENT "Length" -#define TR_BEEP_LENGTH INDENT "Beep length" -#define TR_SPKRPITCH INDENT "Beep pitch" +#define TR_LENGTH "Length" +#define TR_BEEP_LENGTH "Beep length" +#define TR_BEEP_PITCH "Beep pitch" #define TR_HAPTIC_LABEL "Haptic" -#define TR_HAPTICSTRENGTH INDENT "Strength" +#define TR_STRENGTH "Strength" #define TR_GYRO_LABEL "Gyro" #define TR_GYRO_OFFSET "Offset" #define TR_GYRO_MAX "Max" #define TR_CONTRAST "Contrast" #define TR_ALARMS_LABEL "Alarms" #define TR_BATTERY_RANGE TR("Batt. range", "Battery meter range") -#define TR_BATTERYWARNING INDENT "Battery low" -#define TR_INACTIVITYALARM INDENT "Inactivity" -#define TR_MEMORYWARNING INDENT "Memory low" -#define TR_ALARMWARNING INDENT "Sound off" -#define TR_RSSISHUTDOWNALARM TR(INDENT "Rssi Shutdown", INDENT "Check Rssi on Shutdown") +#define TR_BATTERYWARNING "Battery low" +#define TR_INACTIVITYALARM "Inactivity" +#define TR_MEMORYWARNING "Memory low" +#define TR_ALARMWARNING "Sound off" +#define TR_RSSI_SHUTDOWN_ALARM TR("RSSI shutdown", "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" @@ -525,21 +524,19 @@ #define TR_BEEPCOUNTDOWN INDENT "Countdown" #define TR_PERSISTENT TR(INDENT "Persist.", INDENT "Persistent") #define TR_BACKLIGHT_LABEL "Backlight" -#define TR_BLDELAY INDENT "Duration" -#define TR_BL_MODE_DUR INDENT "Mode-Duration" -#define TR_BLONBRIGHTNESS INDENT "ON brightness" -#define TR_BLOFFBRIGHTNESS INDENT "OFF brightness" -#define TR_BLCOLOR INDENT "Color" +#define TR_BLONBRIGHTNESS "ON brightness" +#define TR_BLOFFBRIGHTNESS "OFF brightness" +#define TR_BLCOLOR "Color" #define TR_SPLASHSCREEN "Splash screen" #define TR_PWR_ON_DELAY "Pwr On delay" #define TR_PWR_OFF_DELAY "Pwr Off delay" -#define TR_THROTTLEWARNING TR(INDENT "T-Warning", INDENT "Throttle state") +#define TR_THROTTLE_WARNING TR(INDENT "T-Warning", INDENT "Throttle state") #define TR_SWITCHWARNING TR(INDENT "S-Warning", INDENT "Switch positions") #define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") #define TR_SLIDERWARNING TR(INDENT "Slid. pos.", INDENT "Slider positions") #define TR_POTWARNING TR(INDENT "Pot warn.", INDENT "Pot positions") -#define TR_TIMEZONE TR("Time Zone", INDENT "Time zone") -#define TR_ADJUST_RTC TR("Adjust RTC", INDENT "Adjust RTC") +#define TR_TIMEZONE "Time zone" +#define TR_ADJUST_RTC "Adjust RTC" #define TR_GPS "GPS" #define TR_RXCHANNELORD TR("Rx channel ord", "Default channel order") #define TR_STICKS "Sticks" @@ -553,7 +550,7 @@ #define TR_CALIBRATION "Calibration" #define TR_VTRIM "Trim- +" #define TR_BG "BG:" -#define TR_CALIB_DONE "Calibration completed" +#define TR_CALIB_DONE "Calibration completed" #if defined(PCBHORUS) #define TR_MENUTOSTART "Press [Enter] to start" #define TR_SETMIDPOINT "Center sticks/pots/sliders and press [Enter]" @@ -573,11 +570,10 @@ #define OFS_RX 4 #define TR_ACCEL "Acc:" #define TR_NODATA CENTER "NO DATA" -#define TR_TOTTM1TM2THRTHP "\037\146SES\036TM1\037\146TM2\036THR\037\146TH%" -#define TR_US "us" +#define TR_US "us" #define TR_TMR1JITTERUS "Tmr1 Jitter\037\124us" -#define TR_TMIXMAXMS "Tmix max" -#define TR_FREE_STACK "Free stack" +#define TR_TMIXMAXMS "Tmix max" +#define TR_FREE_STACK "Free stack" #define TR_MENUTORESET TR_ENTER " to reset" #define TR_PPM_TRAINER "TR" #define TR_CH "CH" @@ -585,9 +581,8 @@ #define TR_FM "FM" #define TR_MIX "MIX" #define TR_EEPROMLOWMEM "EEPROM low mem" -#define TR_ALERT "\016ALERT" -#define TR_PRESSANYKEYTOSKIP "Press any key to skip" -#define TR_THROTTLENOTIDLE "Throttle not idle" +#define TR_PRESS_ANY_KEY_TO_SKIP "Press any key to skip" +#define TR_THROTTLE_NOT_IDLE "Throttle not idle" #define TR_ALARMSDISABLED "Alarms disabled" #define TR_PRESSANYKEY TR("\010Press any Key", "Press any key") #define TR_BADEEPROMDATA "Bad EEprom data" @@ -595,7 +590,7 @@ #define TR_EEPROMFORMATTING "Formatting EEPROM" #define TR_STORAGE_FORMAT "Storage preparation" #define TR_EEPROMOVERFLOW "EEPROM overflow" -#define TR_MENURADIOSETUP "RADIO SETUP" +#define TR_RADIO_SETUP "RADIO SETUP" #define TR_MENUDATEANDTIME "DATE AND TIME" #define TR_MENUTRAINER "TRAINER" #define TR_MENUSPECIALFUNCS "GLOBAL FUNCTIONS" @@ -611,7 +606,7 @@ #define TR_CHANNELS2FAILSAFE "Channels=>Failsafe" #define TR_CHANNEL2FAILSAFE "Channel=>Failsafe" #define TR_MENUMODELSEL TR("MODELSEL", "MODEL SELECTION") -#define TR_MENUSETUP TR("SETUP", "MODEL SETUP") +#define TR_MENU_MODEL_SETUP TR("SETUP", "MODEL SETUP") #define TR_MENUFLIGHTMODES "FLIGHT MODES" #define TR_MENUFLIGHTMODE "FLIGHT MODE" #define TR_MENUHELISETUP "HELI SETUP" @@ -640,7 +635,7 @@ #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_RF_POWER "RF Power" #define TR_MULTI_FIXEDID TR("FixedID", "Fixed ID") #define TR_MULTI_OPTION TR("Option", "Option value") #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on channel") @@ -671,14 +666,13 @@ #define TR_FLYSKY_TELEMETRY TR("FlySky RSSI #", "Use FlySky RSSI value without rescalling") #define TR_LATITUDE "Latitude" #define TR_LONGITUDE "Longitude" -#define TR_GPSCOORD TR("GPS Coords", INDENT "Coordinate format") +#define TR_GPS_COORDS_FORMAT TR("GPS Coords", "Coordinate format") #define TR_VARIO TR("Vario", "Variometer") -#define TR_PITCH_AT_ZERO INDENT "Pitch zero" -#define TR_PITCH_AT_MAX INDENT "Pitch max" -#define TR_REPEAT_AT_ZERO INDENT "Repeat zero" -#define TR_POWEROFF "\027Power OFF..." +#define TR_PITCH_AT_ZERO "Pitch zero" +#define TR_PITCH_AT_MAX "Pitch max" +#define TR_REPEAT_AT_ZERO "Repeat zero" #define TR_SHUTDOWN "SHUTTING DOWN" -#define TR_SAVEMODEL "Saving model settings" +#define TR_SAVE_MODEL "Saving model settings" #define TR_BATT_CALIB TR("Batt. calib", "Battery calibration") #define TR_CURRENT_CALIB "Current calib" #define TR_VOLTAGE TR(INDENT "Voltage", INDENT "Voltage source") @@ -735,13 +729,13 @@ #define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "STORAGE" #define TR_EEPROM_CONVERTING "Converting EEPROM" -#define TR_THROTTLEWARN "THROTTLE" +#define TR_THROTTLE_UPPERCASE "THROTTLE" #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_WRONG_SDCARDVERSION TR("Expected ver: ","Expected version: ") +#define TR_WRONG_SDCARDVERSION TR("Expected ver: ", "Expected version: ") #define TR_WARN_RTC_BATTERY_LOW "RTC Battery low" #define TR_BATTERY "BATTERY" #define TR_WRONG_PCBREV "Wrong PCB detected" @@ -750,9 +744,9 @@ #define TR_NO_FAILSAFE "Failsafe not set" #define TR_KEYSTUCK "Key stuck" #define TR_INVERT_THR TR("Invert thr?", "Invert throttle?") -#define TR_SPEAKER_VOLUME INDENT "Volume" // TODO could be TR_VOLUME ? +#define TR_VOLUME "Volume" #define TR_LCD "LCD" -#define TR_BRIGHTNESS INDENT "Brightness" +#define TR_BRIGHTNESS "Brightness" #define TR_CPU_TEMP "CPU temp." #define TR_CPU_CURRENT "Current" #define TR_CPU_MAH "Consumpt." @@ -791,7 +785,6 @@ #define TR_TEMP_CALIB "Temp. Calib" #define TR_TIME "Time" #define TR_MAXBAUDRATE "Max bauds" - #define TR_BLUETOOTH "Bluetooth" #define TR_BLUETOOTH_DISC "Discover" #define TR_BLUETOOTH_INIT "Init" @@ -864,19 +857,19 @@ #define TR_MENU_SPECTRUM_ANALYSER "SPECTRUM ANALYSER" #define TR_MENU_POWER_METER "POWER METER" #define TR_SENSOR "SENSOR" -#define TR_COUNTRYCODE "Country code" -#define TR_USBMODE "USB Mode" -#define TR_JACKMODE "Jack Mode" -#define TR_VOICELANG "Voice language" -#define TR_UNITSSYSTEM "Units" +#define TR_COUNTRY_CODE "Country code" +#define TR_USBMODE "USB mode" +#define TR_JACK_MODE "Jack mode" +#define TR_VOICE_LANGUAGE "Voice language" +#define TR_UNITS_SYSTEM "Units" #define TR_EDIT "Edit" -#define TR_INSERT_BEFORE "Insert Before" -#define TR_INSERT_AFTER "Insert After" +#define TR_INSERT_BEFORE "Insert before" +#define TR_INSERT_AFTER "Insert after" #define TR_COPY "Copy" #define TR_MOVE "Move" #define TR_PASTE "Paste" -#define TR_PASTE_AFTER "Paste After" -#define TR_PASTE_BEFORE "Paste Before" +#define TR_PASTE_AFTER "Paste after" +#define TR_PASTE_BEFORE "Paste before" #define TR_DELETE "Delete" #define TR_INSERT "Insert" #define TR_RESET_FLIGHT "Reset flight" @@ -917,7 +910,6 @@ #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("Keys", "Switches")) #define TR_ANALOGS_BTN BUTTON(TR("Anas", "Analogs")) -#define TR_CALIBRATION "Calibration" #define TR_SET BUTTON("Set") #define TR_TRAINER "Trainer" #define TR_ANTENNAPROBLEM CENTER "TX antenna problem!" @@ -1094,7 +1086,7 @@ #define TR_BEEP_VOLUME "Beep volume" #define TR_WAV_VOLUME "Wav volume" -#define TR_BG_VOLUME TR("Bg volume", "Background Volume") +#define TR_BG_VOLUME TR("Bg volume", "Background volume") #define TR_TOP_BAR "Top bar" #define TR_FLASH_ERASE "Flash erase..." @@ -1147,24 +1139,23 @@ #define TR_SETUP "Setup" #define TR_MAINVIEWX "Main view X" #define TR_LAYOUT "Layout" -#define TR_ADDMAINVIEW "Add main view" +#define TR_ADD_MAIN_VIEW "Add main view" #define TR_BACKGROUND_COLOR "Background color" #define TR_MAIN_COLOR "Main color" #define TR_TEXT_VIEWER "Text Viewer" - -#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_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_GVARS "\311GVars" -#define TR_MENU_TELEMETRY "\321Telemetry" +#define TR_MENU_INPUTS "\214Inputs" +#define TR_MENU_LUA "\222Lua scripts" +#define TR_MENU_STICKS "\207Sticks" +#define TR_MENU_POTS "\210Pots" +#define TR_MENU_MAX "\215MAX" +#define TR_MENU_HELI "\216Cyclic" +#define TR_MENU_TRIMS "\213Trims" +#define TR_MENU_SWITCHES "\212Switches" +#define TR_MENU_LOGICAL_SWITCHES "\212Logical switches" +#define TR_MENU_TRAINER "\217Trainer" +#define TR_MENU_CHANNELS "\220Channels" +#define TR_MENU_GVARS "\211GVars" +#define TR_MENU_TELEMETRY "\221Telemetry" #define TR_MENU_DISPLAY "DISPLAY" #define TR_MENU_OTHER "Other" #define TR_MENU_INVERT "Invert" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 2938d8ff8..8e2bf2647 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -86,14 +86,14 @@ #define LEN_VPERSISTENT "\014" #define TR_VPERSISTENT "OFF\0 ""Flight\0 ""Manual Reset" -#define LEN_COUNTRYCODES TR("\002", "\007") -#define TR_COUNTRYCODES TR("US""JP""EU", "America""Japon\0 ""Europa\0") +#define LEN_COUNTRY_CODES TR("\002", "\007") +#define TR_COUNTRY_CODES 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_JACKMODES "\007" -#define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" +#define LEN_JACK_MODES "\007" +#define TR_JACK_MODES "Ask\0 ""Audio\0 ""Trainer" #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" @@ -514,27 +514,27 @@ #define TR_RANGE INDENT"Alcance" #define TR_CENTER INDENT "Center" #define TR_BAR "Bar" -#define TR_ALARM INDENT"Alarma" +#define TR_ALARM "Alarma" #define TR_USRDATA "UsrData" -#define TR_BLADES INDENT"Palas" +#define TR_BLADES "Palas" #define TR_SCREEN "Pantalla" #define TR_SOUND_LABEL "Sonido" -#define TR_LENGTH INDENT"Longitud" -#define TR_BEEP_LENGTH INDENT "Beep Length" -#define TR_SPKRPITCH INDENT"Tono" +#define TR_LENGTH "Longitud" +#define TR_BEEP_LENGTH "Beep Length" +#define TR_BEEP_PITCH "Tono" #define TR_HAPTIC_LABEL "Tactil" -#define TR_HAPTICSTRENGTH INDENT"Intensidad" +#define TR_STRENGTH "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_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_BATTERYWARNING "Bateria Baja" +#define TR_INACTIVITYALARM "Inactividad" +#define TR_MEMORYWARNING "Memoria Baja" +#define TR_ALARMWARNING "Sin Sonido" +#define TR_RSSI_SHUTDOWN_ALARM TR("Rssi Shutdown", "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" @@ -545,21 +545,19 @@ #define TR_BEEPCOUNTDOWN INDENT"Cuentaatras" #define TR_PERSISTENT TR(INDENT"Persist.", INDENT"Persistente") #define TR_BACKLIGHT_LABEL "Luz Fondo" -#define TR_BLDELAY INDENT"Duracion" -#define TR_BL_MODE_DUR INDENT "Mode-Duration" -#define TR_BLONBRIGHTNESS INDENT"MAS Brillo" -#define TR_BLOFFBRIGHTNESS INDENT"MENOS Brillo" -#define TR_BLCOLOR INDENT "Color" +#define TR_BLONBRIGHTNESS "MAS Brillo" +#define TR_BLOFFBRIGHTNESS "MENOS Brillo" +#define TR_BLCOLOR "Color" #define TR_SPLASHSCREEN "Ptalla.inicio" #define TR_PWR_ON_DELAY "Pwr On delay" #define TR_PWR_OFF_DELAY "Pwr Off delay" -#define TR_THROTTLEWARNING TR("Aviso-A", INDENT "Aviso Acelerador") +#define TR_THROTTLE_WARNING 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_TIMEZONE TR("Zona Hora", "GPS Zona Hora") -#define TR_ADJUST_RTC TR("Adjust RTC", INDENT "Adjust RTC") +#define TR_ADJUST_RTC TR("Adjust RTC", "Adjust RTC") #define TR_GPS "GPS" #define TR_RXCHANNELORD TR("Rx Orden canal", "Orden habitual canales") #define TR_STICKS "Sticks" @@ -588,7 +586,6 @@ #define OFS_RX 4 #define TR_ACCEL "Acc:" #define TR_NODATA CENTER "SIN DATOS" -#define TR_TOTTM1TM2THRTHP "\037\146SES\036TM1\037\146TM2\036THR\037\146TH%" #define TR_US "us" #define TR_TMR1JITTERUS "Tmr1 Jitter\037\124us" #define TR_TMIXMAXMS "Tmix max" @@ -600,9 +597,8 @@ #define TR_FM "FM" #define TR_MIX "MIX" #define TR_EEPROMLOWMEM "EEPROM mem.baja" -#define TR_ALERT "\016ALERTA" -#define TR_PRESSANYKEYTOSKIP "Pulsar tecla omitir" -#define TR_THROTTLENOTIDLE "Aceler. Activado" +#define TR_PRESS_ANY_KEY_TO_SKIP "Pulsar tecla omitir" +#define TR_THROTTLE_NOT_IDLE "Aceler. Activado" #define TR_ALARMSDISABLED "Alarmas Desact." #define TR_PRESSANYKEY TR("\010Pulsa una Tecla", "Pulsa una Tecla") #define TR_BADEEPROMDATA "Datos EEprom mal" @@ -610,7 +606,7 @@ #define TR_EEPROMFORMATTING "Formateo EEPROM" #define TR_STORAGE_FORMAT "Storage Preparation" #define TR_EEPROMOVERFLOW "Desborde EEPROM" -#define TR_MENURADIOSETUP "CONFIGURACION" +#define TR_RADIO_SETUP "CONFIGURACION" #define TR_MENUDATEANDTIME "FECHA Y HORA" #define TR_MENUTRAINER "APRENDIZ" #define TR_MENUSPECIALFUNCS "GLOBAL FUNCTIONS" @@ -626,7 +622,7 @@ #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_MENU_MODEL_SETUP TR("CONF.", "CONF.MODELO") #define TR_MENUFLIGHTMODE "MODO VUELO" #define TR_MENUFLIGHTMODES "MODOS VUELO" #define TR_MENUHELISETUP "CONF. HELI" @@ -664,7 +660,7 @@ #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_RF_POWER "RF Power" #define TR_MULTI_FIXEDID TR("FixedID", "Fixed ID") #define TR_MULTI_OPTION TR("Option", "Option value") #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on channel") @@ -695,14 +691,13 @@ #define TR_FLYSKY_TELEMETRY TR("FlySky RSSI #", "Use FlySky RSSI value without rescalling") #define TR_LATITUDE "Latitud" #define TR_LONGITUDE "Longitud" -#define TR_GPSCOORD TR("GPS Coords", "GPS formato coordenadas") +#define TR_GPS_COORDS_FORMAT 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_POWEROFF "\027Power OFF..." +#define TR_PITCH_AT_ZERO "Pitch at Zero" +#define TR_PITCH_AT_MAX "Pitch at Max" +#define TR_REPEAT_AT_ZERO "Repeat at Zero" #define TR_SHUTDOWN "APAGANDO" -#define TR_SAVEMODEL "Saving model settings" +#define TR_SAVE_MODEL "Saving model settings" #define TR_BATT_CALIB "Calib.bateria" #define TR_CURRENT_CALIB "Calib. actual" #define TR_VOLTAGE INDENT"Voltaje" @@ -759,7 +754,7 @@ #define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "STORAGE" #define TR_EEPROM_CONVERTING "EEPROM Converting" -#define TR_THROTTLEWARN "ACELERADOR" +#define TR_THROTTLE_UPPERCASE "ACELERADOR" #define TR_ALARMSWARN "ALARMAS" #define TR_SWITCHWARN "INTERPTOR" #define TR_FAILSAFEWARN "FAILSAFE" @@ -774,9 +769,9 @@ #define TR_NO_FAILSAFE "Failsafe not set" #define TR_KEYSTUCK "Key stuck" #define TR_INVERT_THR TR("Invertir Acel?", "Invertir Acel.?") -#define TR_SPEAKER_VOLUME INDENT "Volumen" +#define TR_VOLUME "Volumen" #define TR_LCD "LCD" -#define TR_BRIGHTNESS INDENT "Brillo" +#define TR_BRIGHTNESS "Brillo" #define TR_CPU_TEMP "CPU Temp.\016>" #define TR_CPU_CURRENT "Actual\022>" #define TR_CPU_MAH "Consumo" @@ -887,11 +882,11 @@ #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_COUNTRY_CODE "Codigo Pais" #define TR_USBMODE "USB Mode" -#define TR_JACKMODE "Jack Mode" -#define TR_VOICELANG "Idioma voces" -#define TR_UNITSSYSTEM "Unidades" +#define TR_JACK_MODE "Jack Mode" +#define TR_VOICE_LANGUAGE "Idioma voces" +#define TR_UNITS_SYSTEM "Unidades" #define TR_EDIT "Editar" #define TR_INSERT_BEFORE "Insertar antes" #define TR_INSERT_AFTER "Insertar despues" @@ -1167,7 +1162,7 @@ #define TR_SETUP "Setup" #define TR_MAINVIEWX "Main view X" #define TR_LAYOUT "Layout" -#define TR_ADDMAINVIEW "Add main view" +#define TR_ADD_MAIN_VIEW "Add main view" #define TR_BACKGROUND_COLOR "Background color" #define TR_MAIN_COLOR "Main color" #define TR_TEXT_VIEWER "Text Viewer" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index de8f9946f..9af552a2a 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -86,14 +86,14 @@ #define LEN_VPERSISTENT "\014" #define TR_VPERSISTENT "OFF\0 ""Flight\0 ""Manual Reset" -#define LEN_COUNTRYCODES TR("\002", "\007") -#define TR_COUNTRYCODES TR("US""JP""EU", "Amerikk""Japani\0""Euroopp") +#define LEN_COUNTRY_CODES TR("\002", "\007") +#define TR_COUNTRY_CODES TR("US""JP""EU", "Amerikk""Japani\0""Euroopp") #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_JACKMODES "\007" -#define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" +#define LEN_JACK_MODES "\007" +#define TR_JACK_MODES "Ask\0 ""Audio\0 ""Trainer" #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" @@ -506,27 +506,27 @@ #define TR_RANGE INDENT"Range" #define TR_CENTER INDENT "Center" #define TR_BAR "Bar" -#define TR_ALARM INDENT"Alarm" +#define TR_ALARM "Alarm" #define TR_USRDATA "UsrData" -#define TR_BLADES INDENT"Blades/Poles" +#define TR_BLADES "Blades/Poles" #define TR_SCREEN "Screen " #define TR_SOUND_LABEL "Sound" -#define TR_LENGTH INDENT"Length" -#define TR_BEEP_LENGTH INDENT "Beep Length" -#define TR_SPKRPITCH INDENT"Pitch" +#define TR_LENGTH "Length" +#define TR_BEEP_LENGTH "Beep Length" +#define TR_BEEP_PITCH "Pitch" #define TR_HAPTIC_LABEL "Haptic" -#define TR_HAPTICSTRENGTH INDENT"Strength" +#define TR_STRENGTH "Strength" #define TR_GYRO_LABEL "Gyro" #define TR_GYRO_OFFSET "Offset" #define TR_GYRO_MAX "Max" #define TR_CONTRAST "Contrast" #define TR_ALARMS_LABEL "Alarms" #define TR_BATTERY_RANGE TR("Battery range","Battery meter range") -#define TR_BATTERYWARNING INDENT"Battery Low" -#define TR_INACTIVITYALARM INDENT"Inactivity" -#define TR_MEMORYWARNING INDENT"Memory Low" -#define TR_ALARMWARNING INDENT"Sound Off" -#define TR_RSSISHUTDOWNALARM TR(INDENT "Rssi Shutdown", INDENT "Check Rssi on Shutdown") +#define TR_BATTERYWARNING "Battery Low" +#define TR_INACTIVITYALARM "Inactivity" +#define TR_MEMORYWARNING "Memory Low" +#define TR_ALARMWARNING "Sound Off" +#define TR_RSSI_SHUTDOWN_ALARM TR("Rssi Shutdown", "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" @@ -537,21 +537,19 @@ #define TR_BEEPCOUNTDOWN INDENT"Countdown" #define TR_PERSISTENT TR(INDENT"Persist.", INDENT"Persistent") #define TR_BACKLIGHT_LABEL "Backlight" -#define TR_BLDELAY INDENT"Duration" -#define TR_BL_MODE_DUR INDENT "Mode-Duration" -#define TR_BLONBRIGHTNESS INDENT"ON Brightness" -#define TR_BLOFFBRIGHTNESS INDENT"OFF Brightness" -#define TR_BLCOLOR INDENT "Color" +#define TR_BLONBRIGHTNESS "ON Brightness" +#define TR_BLOFFBRIGHTNESS "OFF Brightness" +#define TR_BLCOLOR "Color" #define TR_SPLASHSCREEN "Splash screen" #define TR_PWR_ON_DELAY "Pwr On delay" #define TR_PWR_OFF_DELAY "Pwr Off delay" -#define TR_THROTTLEWARNING TR("T-Warning", INDENT "Throttle Warning") +#define TR_THROTTLE_WARNING TR("T-Warning", INDENT "Throttle Warning") #define TR_SWITCHWARNING TR("S-Warning", INDENT "Switch Warning") #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_TIMEZONE TR("Time Zone","GPS Time zone") -#define TR_ADJUST_RTC TR("Adjust RTC", INDENT "Adjust RTC") +#define TR_ADJUST_RTC TR("Adjust RTC", "Adjust RTC") #define TR_GPS "GPS" #define TR_RXCHANNELORD TR("Rx Channel Ord","Default channel order") #define TR_STICKS "Sticks" @@ -580,7 +578,6 @@ #define OFS_RX 4 #define TR_ACCEL "Acc:" #define TR_NODATA CENTER "NO DATA" -#define TR_TOTTM1TM2THRTHP "\037\146SES\036TM1\037\146TM2\036THR\037\146TH%" #define TR_US "us" #define TR_TMR1JITTERUS "Tmr1 Jitter\037\124us" @@ -594,9 +591,8 @@ #define TR_FM "FM" #define TR_MIX "MIX" #define TR_EEPROMLOWMEM "FINSKA low mem" -#define TR_ALERT "\016ALERT" -#define TR_PRESSANYKEYTOSKIP "Press any key to skip" -#define TR_THROTTLENOTIDLE "Throttle not idle" +#define TR_PRESS_ANY_KEY_TO_SKIP "Press any key to skip" +#define TR_THROTTLE_NOT_IDLE "Throttle not idle" #define TR_ALARMSDISABLED "Alarms Disabled" #define TR_PRESSANYKEY TR("\010Press any Key", "Press any Key") #define TR_BADEEPROMDATA "Bad FINSKA Data" @@ -604,7 +600,7 @@ #define TR_EEPROMFORMATTING "Formatting FINSKA" #define TR_STORAGE_FORMAT "Storage Preparation" #define TR_EEPROMOVERFLOW "FINSKA overflow" -#define TR_MENURADIOSETUP "RADIO SETUP" +#define TR_RADIO_SETUP "RADIO SETUP" #define TR_MENUDATEANDTIME "DATE AND TIME" #define TR_MENUTRAINER "TRAINER" #define TR_MENUSPECIALFUNCS "GLOBAL FUNCTIONS" @@ -620,7 +616,7 @@ #define TR_CHANNELS2FAILSAFE "Channels=>Failsafe" #define TR_CHANNEL2FAILSAFE "Channel=>Failsafe" #define TR_MENUMODELSEL TR("MODELSEL","MODEL SELECTION") -#define TR_MENUSETUP TR("SETUP","MODEL SETUP") +#define TR_MENU_MODEL_SETUP TR("SETUP","MODEL SETUP") #define TR_MENUFLIGHTMODE "FLIGHT MODE" #define TR_MENUFLIGHTMODES "FLIGHT MODES" #define TR_MENUHELISETUP "HELI SETUP" @@ -658,7 +654,7 @@ #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_RF_POWER "RF Power" #define TR_MULTI_FIXEDID TR("FixedID", "Fixed ID") #define TR_MULTI_OPTION TR("Option", "Option value") #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on channel") @@ -689,14 +685,13 @@ #define TR_FLYSKY_TELEMETRY TR("FlySky RSSI #", "Use FlySky RSSI value without rescalling") #define TR_LATITUDE "Latitude" #define TR_LONGITUDE "Longitude" -#define TR_GPSCOORD TR("GPS Coords", "GPS coordinate format") +#define TR_GPS_COORDS_FORMAT TR("GPS Coords", "GPS coordinate format") #define TR_VARIO TR("Vario", "Variometer") -#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_POWEROFF "\027Power OFF..." +#define TR_PITCH_AT_ZERO "Pitch at Zero" +#define TR_PITCH_AT_MAX "Pitch at Max" +#define TR_REPEAT_AT_ZERO "Repeat at Zero" #define TR_SHUTDOWN "SHUTTING DOWN" -#define TR_SAVEMODEL "Saving model settings" +#define TR_SAVE_MODEL "Saving model settings" #define TR_BATT_CALIB "Battery Calib" #define TR_CURRENT_CALIB "Current Calib" #define TR_VOLTAGE INDENT"Voltage" @@ -753,7 +748,7 @@ #define TR_EEPROMWARN "FINSKA" #define TR_STORAGE_WARNING "STORAGE" #define TR_EEPROM_CONVERTING "EEPROM Converting" -#define TR_THROTTLEWARN "THROTTLE" +#define TR_THROTTLE_UPPERCASE "THROTTLE" #define TR_ALARMSWARN "ALARMS" #define TR_SWITCHWARN TR("SWITCH","CONTROL") #define TR_FAILSAFEWARN "FAILSAFE" @@ -768,9 +763,9 @@ #define TR_NO_FAILSAFE "Failsafe not set" #define TR_KEYSTUCK "Key stuck" #define TR_INVERT_THR TR("Invert Thr?","Invert Throttle?") -#define TR_SPEAKER_VOLUME INDENT "Volume" +#define TR_VOLUME "Volume" #define TR_LCD "LCD" -#define TR_BRIGHTNESS INDENT "Brightness" +#define TR_BRIGHTNESS "Brightness" #define TR_CPU_TEMP "CPU Temp.\016>" #define TR_CPU_CURRENT "Current\022>" #define TR_CPU_MAH "Consumpt." @@ -881,11 +876,11 @@ #define TR_MENU_SPECTRUM_ANALYSER "SPECTRUM ANALYSER" #define TR_MENU_POWER_METER "POWER METER" #define TR_SENSOR "SENSOR" -#define TR_COUNTRYCODE "Country Code" +#define TR_COUNTRY_CODE "Country Code" #define TR_USBMODE "USB Mode" -#define TR_JACKMODE "Jack Mode" -#define TR_VOICELANG "Voice Language" -#define TR_UNITSSYSTEM "Units" +#define TR_JACK_MODE "Jack Mode" +#define TR_VOICE_LANGUAGE "Voice Language" +#define TR_UNITS_SYSTEM "Units" #define TR_EDIT "Edit" #define TR_INSERT_BEFORE "Insert Before" #define TR_INSERT_AFTER "Insert After" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 6090c4e2b..2eb724147 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -89,14 +89,14 @@ #define LEN_VPERSISTENT "\014" #define TR_VPERSISTENT "OFF\0 ""Vol\0 ""Reset Manuel" -#define LEN_COUNTRYCODES TR("\002", "\006") -#define TR_COUNTRYCODES TR("US""JP""EU", "USA\0 ""Japon\0""Europe") +#define LEN_COUNTRY_CODES TR("\002", "\006") +#define TR_COUNTRY_CODES TR("US""JP""EU", "USA\0 ""Japon\0""Europe") #define LEN_USBMODES TR("\006", "\010") #define TR_USBMODES TR("Popup\0""Joyst\0""SDCard""Série\0", "Demander""Joystick""Stockage""Série\0 ") -#define LEN_JACKMODES "\007" -#define TR_JACKMODES "Demander""Audio\0 ""Ecolage" +#define LEN_JACK_MODES "\007" +#define TR_JACK_MODES "Demander""Audio\0 ""Ecolage" #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" @@ -512,27 +512,27 @@ #define TR_RANGE INDENT "Plage" #define TR_CENTER INDENT "Centre" #define TR_BAR "Barre" -#define TR_ALARM INDENT "Alarme" +#define TR_ALARM "Alarme" #define TR_USRDATA "Données" -#define TR_BLADES INDENT "Pales/Poles" +#define TR_BLADES "Pales/Poles" #define TR_SCREEN "Ecran " #define TR_SOUND_LABEL "Son" -#define TR_LENGTH INDENT "Durée" -#define TR_BEEP_LENGTH INDENT "Durée bips" -#define TR_SPKRPITCH INDENT "Tonalité" +#define TR_LENGTH "Durée" +#define TR_BEEP_LENGTH "Durée bips" +#define TR_BEEP_PITCH "Tonalité" #define TR_HAPTIC_LABEL "Vibreur" -#define TR_HAPTICSTRENGTH INDENT "Force" +#define TR_STRENGTH "Force" #define TR_GYRO_LABEL "Gyro" #define TR_GYRO_OFFSET "Offset" #define TR_GYRO_MAX "Max" #define TR_CONTRAST "Contraste" #define TR_ALARMS_LABEL "Alarmes" #define TR_BATTERY_RANGE "Plage batterie" -#define TR_BATTERYWARNING TR(INDENT "Batterie", INDENT "Batterie faible") -#define TR_INACTIVITYALARM INDENT "Inactivité" -#define TR_MEMORYWARNING INDENT "Mémoire pleine" -#define TR_ALARMWARNING TR(INDENT "Silence", INDENT "Sons désactivés") -#define TR_RSSISHUTDOWNALARM TR(INDENT "RSSI extinct.", INDENT "Vérif RSSI à l'extinction") +#define TR_BATTERYWARNING TR("Batterie", "Batterie faible") +#define TR_INACTIVITYALARM "Inactivité" +#define TR_MEMORYWARNING "Mémoire pleine" +#define TR_ALARMWARNING TR("Silence", "Sons désactivés") +#define TR_RSSI_SHUTDOWN_ALARM TR("RSSI extinct.", "Vérif RSSI à l'extinction") #define TR_FLYSKY_TELEMETRY TR("FlySky RSSI #", "Use FlySky RSSI value without rescalling") #define TR_MODEL_STILL_POWERED TR("Modèle allumé", "Modèle encore allumé") #define TR_MODEL_SHUTDOWN "Eteindre ?" @@ -544,21 +544,19 @@ #define TR_BEEPCOUNTDOWN TR(INDENT "Bip fin", INDENT "Compte à rebours") #define TR_PERSISTENT TR(INDENT "Persist.", INDENT "Persistant") #define TR_BACKLIGHT_LABEL "Rétroéclairage" -#define TR_BLDELAY INDENT "Durée" -#define TR_BL_MODE_DUR INDENT "Mode-Durée" -#define TR_BLONBRIGHTNESS INDENT "Luminosité ON" -#define TR_BLOFFBRIGHTNESS INDENT "Luminosité OFF" -#define TR_BLCOLOR INDENT "Couleur" +#define TR_BLONBRIGHTNESS "Luminosité ON" +#define TR_BLOFFBRIGHTNESS "Luminosité OFF" +#define TR_BLCOLOR "Couleur" #define TR_SPLASHSCREEN "Logo d'accueil" #define TR_PWR_ON_DELAY "Pwr On delay" #define TR_PWR_OFF_DELAY "Pwr Off delay" -#define TR_THROTTLEWARNING TR(INDENT "Alerte gaz", INDENT "Alerte gaz") +#define TR_THROTTLE_WARNING TR(INDENT "Alerte gaz", INDENT "Alerte gaz") #define TR_SWITCHWARNING TR(INDENT "Alerte int", INDENT "Pos. interrupteurs") #define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") #define TR_SLIDERWARNING TR(INDENT "Slid. pos.", INDENT "Slider positions") #define TR_POTWARNING TR(INDENT "Alerte pot", INDENT "Pos. potentios") #define TR_TIMEZONE "Fuseau horaire" -#define TR_ADJUST_RTC TR("Ajust. RTC", INDENT "Ajust. heure auto") +#define TR_ADJUST_RTC TR("Ajust. RTC", "Ajust. heure auto") #define TR_GPS "GPS" #define TR_RXCHANNELORD TR("Ordre voies RX","Ordre des voies préféré") #define TR_STICKS "Manches" @@ -591,7 +589,6 @@ #define OFS_RX 4 #define TR_ACCEL "Acc:" #define TR_NODATA CENTER "NO DATA" -#define TR_TOTTM1TM2THRTHP "\037\146SES\036TM1\037\146TM2\036GAZ\037\146GZ%" #define TR_US "us" #define TR_TMR1LATMINUS "Tmr1Lat min\037\124us" #define TR_TMR1JITTERUS "Tmr1 Jitter\037\124us" @@ -606,9 +603,8 @@ #define TR_FM "PV" #define TR_MIX "MIX" #define TR_EEPROMLOWMEM "EEPROM pleine!" -#define TR_ALERT "\014ALERTE" -#define TR_PRESSANYKEYTOSKIP "Touche pour ignorer" -#define TR_THROTTLENOTIDLE "Gaz pas à zéro" +#define TR_PRESS_ANY_KEY_TO_SKIP "Touche pour ignorer" +#define TR_THROTTLE_NOT_IDLE "Gaz pas à zéro" #define TR_ALARMSDISABLED "Alarmes Désactivées" #define TR_PRESSANYKEY TR("Touche pour continuer", "Touche pour continuer") #define TR_BADEEPROMDATA "EEPROM corrompue" @@ -616,7 +612,7 @@ #define TR_EEPROMFORMATTING "Formatage EEPROM" #define TR_STORAGE_FORMAT "Préparation stockage" #define TR_EEPROMOVERFLOW "Dépassement EEPROM" -#define TR_MENURADIOSETUP "CONFIG RADIO" +#define TR_RADIO_SETUP "CONFIG RADIO" #define TR_MENUDATEANDTIME "DATE ET HEURE" #define TR_MENUTRAINER "ECOLAGE" #define TR_MENUSPECIALFUNCS "FONCTIONS GLOBALES" @@ -632,7 +628,7 @@ #define TR_CHANNELS2FAILSAFE "Channels=>Failsafe" #define TR_CHANNEL2FAILSAFE "Channel=>Failsafe" #define TR_MENUMODELSEL "MODELES" -#define TR_MENUSETUP TR("CONF. MODELE", "CONFIGURATION") +#define TR_MENU_MODEL_SETUP TR("CONF. MODELE", "CONFIGURATION") #define TR_MENUFLIGHTMODE "PHASE DE VOL" #define TR_MENUFLIGHTMODES "PHASES DE VOL" #define TR_MENUHELISETUP TR("CONF.HELI", "CONFIGURATION HELICO") @@ -662,7 +658,7 @@ #define TR_MULTI_RFTUNE TR(INDENT "Ajust.fréq", INDENT "Ajustement fréq.") #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(INDENT "Puiss. RF", INDENT "Puissance RF") +#define TR_RF_POWER TR(INDENT "Puiss. RF", INDENT "Puissance RF") #define TR_MULTI_FIXEDID TR("FixedID", "Fixed ID") #define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option perso") #define TR_MULTI_AUTOBIND TR(INDENT "Bind auto", INDENT "Bind automatique") @@ -692,14 +688,13 @@ #define TR_MINRSSI "RSSI Min." #define TR_LATITUDE "Latitude" #define TR_LONGITUDE "Longitude" -#define TR_GPSCOORD TR("Coordonnées", "Coordonnées GPS") +#define TR_GPS_COORDS_FORMAT TR("Coordonnées", "Coordonnées GPS") #define TR_VARIO TR("Vario", "Variomètre") -#define TR_PITCH_AT_ZERO INDENT "Tonalité zéro" -#define TR_PITCH_AT_MAX INDENT "Tonalité max" -#define TR_REPEAT_AT_ZERO TR(INDENT "Interv. zéro", INDENT "Intervalle au zéro") -#define TR_POWEROFF "\037\120ARRET..." +#define TR_PITCH_AT_ZERO "Tonalité zéro" +#define TR_PITCH_AT_MAX "Tonalité max" +#define TR_REPEAT_AT_ZERO TR("Interv. zéro", "Intervalle au zéro") #define TR_SHUTDOWN "ARRET EN COURS" -#define TR_SAVEMODEL "Sauvegarde modèle..." +#define TR_SAVE_MODEL "Sauvegarde modèle..." #define TR_BATT_CALIB "Calib. batt" #define TR_CURRENT_CALIB "Calib. cour" #define TR_VOLTAGE TR(INDENT "Tension",INDENT "Source tension") @@ -756,7 +751,7 @@ #define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "STOCKAGE" #define TR_EEPROM_CONVERTING "Conversion EEPROM" -#define TR_THROTTLEWARN "GAZ" +#define TR_THROTTLE_UPPERCASE "GAZ" #define TR_ALARMSWARN "SON" #define TR_SWITCHWARN TR("INTERS","CONTROLES") #define TR_FAILSAFEWARN "FAILSAFE" @@ -771,9 +766,9 @@ #define TR_NO_FAILSAFE TR3("Failsafe pas déf.", "Failsafe pas déf.", "Failsafe pas défini") #define TR_KEYSTUCK "Touche bloquée" #define TR_INVERT_THR "Inverser gaz?" -#define TR_SPEAKER_VOLUME INDENT "Volume" +#define TR_VOLUME "Volume" #define TR_LCD "Afficheur" -#define TR_BRIGHTNESS INDENT "Luminosité" +#define TR_BRIGHTNESS "Luminosité" #define TR_CPU_TEMP "Temp. CPU\016>" #define TR_CPU_CURRENT "Courant\022>" #define TR_CPU_MAH "Consomm." @@ -883,11 +878,11 @@ #define TR_MENU_SPECTRUM_ANALYSER "ANALYSEUR SPECTRE" #define TR_MENU_POWER_METER "MESURE PUISS." #define TR_SENSOR "CAPTEUR" -#define TR_COUNTRYCODE TR("Zone géo.", "Zone géographique") +#define TR_COUNTRY_CODE TR("Zone géo.", "Zone géographique") #define TR_USBMODE "Mode USB" -#define TR_JACKMODE "Mode Jack" -#define TR_VOICELANG TR("Langue voix", "Langue annonces vocales") -#define TR_UNITSSYSTEM "Unités" +#define TR_JACK_MODE "Mode Jack" +#define TR_VOICE_LANGUAGE TR("Langue voix", "Langue annonces vocales") +#define TR_UNITS_SYSTEM "Unités" #define TR_EDIT "Editer" #define TR_INSERT_BEFORE "Insérer avant" #define TR_INSERT_AFTER "Insérer après" @@ -936,7 +931,6 @@ #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("Btns","Inters")) #define TR_ANALOGS_BTN BUTTON(TR("Anas", "Analogs")) -#define TR_CALIBRATION "Calibration" #define TR_SET BUTTON("Déf") #define TR_TRAINER "Ecolage" #define TR_ANTENNAPROBLEM CENTER "Antenne radio défect.!" @@ -1169,7 +1163,7 @@ #define TR_SETUP "Configuration" #define TR_MAINVIEWX "Vue principale X" #define TR_LAYOUT "Disposition" -#define TR_ADDMAINVIEW "Ajouter vue principale" +#define TR_ADD_MAIN_VIEW "Ajouter vue principale" #define TR_BACKGROUND_COLOR "Couleur de fond" #define TR_MAIN_COLOR "Couleur principale" #define TR_TEXT_VIEWER "Visualisateur de texte" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index bb6a7540b..270052faf 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -86,8 +86,8 @@ #define LEN_VPERSISTENT "\015" #define TR_VPERSISTENT "NO\0 ""Volo\0 ""Reset Manuale" -#define LEN_COUNTRYCODES TR("\002", "\007") -#define TR_COUNTRYCODES TR("US""JP""EU", "America""Japan\0 ""Europa\0") +#define LEN_COUNTRY_CODES TR("\002", "\007") +#define TR_COUNTRY_CODES TR("US""JP""EU", "America""Japan\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 ") @@ -95,8 +95,8 @@ #define LEN_MODULE_PROTOCOLS "\004" #define TR_MODULE_PROTOCOLS "OFF\0""PPM\0""XJT\0""XJT2""DSM2""CRSF""MULT""R9M\0""R9M2""SBUS" -#define LEN_JACKMODES "\007" -#define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" +#define LEN_JACK_MODES "\007" +#define TR_JACK_MODES "Ask\0 ""Audio\0 ""Trainer" #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" @@ -516,27 +516,27 @@ #define TR_RANGE TR(INDENT"Inter.", INDENT"Intervallo") #define TR_CENTER INDENT "Centro" #define TR_BAR "Barra" -#define TR_ALARM TR(INDENT"Allar.", INDENT"Allarme") +#define TR_ALARM TR("Allar.", "Allarme") #define TR_USRDATA "Dati" -#define TR_BLADES INDENT"Pale" +#define TR_BLADES "Pale" #define TR_SCREEN "Schermo " #define TR_SOUND_LABEL "Suono" -#define TR_LENGTH INDENT"Durata" -#define TR_BEEP_LENGTH INDENT "Lung. Beep" -#define TR_SPKRPITCH INDENT"Tono" +#define TR_LENGTH "Durata" +#define TR_BEEP_LENGTH "Lung. Beep" +#define TR_BEEP_PITCH "Tono" #define TR_HAPTIC_LABEL "Vibraz" -#define TR_HAPTICSTRENGTH INDENT"Forza" +#define TR_STRENGTH "Forza" #define TR_GYRO_LABEL "Gyro" #define TR_GYRO_OFFSET "Offset" #define TR_GYRO_MAX "Max" #define TR_CONTRAST "Contrasto" #define TR_ALARMS_LABEL "Allarmi" #define TR_BATTERY_RANGE TR("Interv. Batt", "Intervallo batteria") -#define TR_BATTERYWARNING INDENT"Avviso batteria" -#define TR_INACTIVITYALARM INDENT"Inattivita'" -#define TR_MEMORYWARNING INDENT"Avviso memoria" -#define TR_ALARMWARNING INDENT"Spegni suono" -#define TR_RSSISHUTDOWNALARM TR(INDENT "Rssi Shutdown", INDENT "Check Rssi on Shutdown") +#define TR_BATTERYWARNING "Avviso batteria" +#define TR_INACTIVITYALARM "Inattivita'" +#define TR_MEMORYWARNING "Avviso memoria" +#define TR_ALARMWARNING "Spegni suono" +#define TR_RSSI_SHUTDOWN_ALARM TR("Rssi Shutdown", "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" @@ -547,21 +547,19 @@ #define TR_BEEPCOUNTDOWN TR(INDENT"Conto rov", INDENT"Conto rovescia") #define TR_PERSISTENT TR(INDENT"Persist.", INDENT"Persistente") #define TR_BACKLIGHT_LABEL TR("Retroillum.", "Retroilluminazione") -#define TR_BLDELAY INDENT"Durata" -#define TR_BL_MODE_DUR INDENT "Mode-Duration" -#define TR_BLONBRIGHTNESS TR(INDENT"Lumin. ON",INDENT"Luminosità ON") -#define TR_BLOFFBRIGHTNESS TR(INDENT"Lumin. OFF",INDENT"Luminosità OFF") -#define TR_BLCOLOR INDENT "Colore" +#define TR_BLONBRIGHTNESS TR("Lumin. ON", "Luminosità ON") +#define TR_BLOFFBRIGHTNESS TR("Lumin. OFF", "Luminosità OFF") +#define TR_BLCOLOR "Colore" #define TR_SPLASHSCREEN TR("Schermo avvio", "Schermata di avvio") #define TR_PWR_ON_DELAY "Pwr On delay" #define TR_PWR_OFF_DELAY "Pwr Off delay" -#define TR_THROTTLEWARNING TR("All. Mot.", INDENT "Allarme Motore") +#define TR_THROTTLE_WARNING TR("All. Mot.", INDENT "Allarme Motore") #define TR_SWITCHWARNING TR("Avv. Int.", INDENT "Avviso Interr.") #define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") #define TR_SLIDERWARNING TR(INDENT "Slid. pos.", INDENT "Slider positions") #define TR_POTWARNING TR("Avv. Pot.", INDENT "Avviso Pot.") #define TR_TIMEZONE "Ora locale" -#define TR_ADJUST_RTC TR("Aggiusta RTC", INDENT "Aggiusta RTC") +#define TR_ADJUST_RTC TR("Aggiusta RTC", "Aggiusta RTC") #define TR_GPS "GPS" #define TR_RXCHANNELORD "Ordine ch RX" #define TR_STICKS "Sticks" @@ -594,7 +592,6 @@ #define OFS_RX 4 #define TR_ACCEL "Acc:" #define TR_NODATA CENTER"DATI ASSENTI" -#define TR_TOTTM1TM2THRTHP "\037\146SES\036TM1\037\146TM2\036THR\037\146TH%" #define TR_US "us" #define TR_TMR1JITTERUS "Tmr1 Jitter\037\124us" #define TR_TMIXMAXMS "Tmix max" @@ -606,9 +603,8 @@ #define TR_FM "FV" #define TR_MIX "MIX" #define TR_EEPROMLOWMEM "EEPROM quasi piena!" -#define TR_ALERT "\016ALERT" -#define TR_PRESSANYKEYTOSKIP "\010Premi un tasto" -#define TR_THROTTLENOTIDLE TR("Motore non in posiz.","Motore non in posizione") +#define TR_PRESS_ANY_KEY_TO_SKIP "\010Premi un tasto" +#define TR_THROTTLE_NOT_IDLE TR("Motore non in posiz.","Motore non in posizione") #define TR_ALARMSDISABLED "Avvisi Disattivati!" #define TR_PRESSANYKEY "\010Premi un tasto" #define TR_BADEEPROMDATA "Dati corrotti!" @@ -616,7 +612,7 @@ #define TR_EEPROMFORMATTING "Formatto EEPROM..." #define TR_STORAGE_FORMAT "Storage Preparation" #define TR_EEPROMOVERFLOW "EEPROM Piena" -#define TR_MENURADIOSETUP "CONFIGURATX" +#define TR_RADIO_SETUP "CONFIGURATX" #define TR_MENUDATEANDTIME "DATA E ORA" #define TR_MENUTRAINER "MAESTRO/ALLIEVO" #define TR_MENUSPECIALFUNCS "FUNZIONI GLOBALI" @@ -632,7 +628,7 @@ #define TR_CHANNELS2FAILSAFE "Channels=>Failsafe" #define TR_CHANNEL2FAILSAFE "Channel=>Failsafe" #define TR_MENUMODELSEL "MODELLI" -#define TR_MENUSETUP "CONFIGURA" +#define TR_MENU_MODEL_SETUP "CONFIGURA" #define TR_MENUFLIGHTMODE "FASE DI VOLO" #define TR_MENUFLIGHTMODES "FASI DI VOLO" #define TR_MENUHELISETUP "CONFIGURA ELI" @@ -662,7 +658,7 @@ #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_RF_POWER "RF Power" #define TR_MULTI_FIXEDID TR("FixedID", "Fixed ID") #define TR_MULTI_OPTION TR("Option", "Option value") #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on channel") @@ -693,14 +689,13 @@ #define TR_FLYSKY_TELEMETRY TR("FlySky RSSI #", "Use FlySky RSSI value without rescalling") #define TR_LATITUDE "Latitud." #define TR_LONGITUDE "Longitud." -#define TR_GPSCOORD TR("GPS Coords", INDENT "Formato Coordinate") +#define TR_GPS_COORDS_FORMAT TR("GPS Coords", "Formato Coordinate") #define TR_VARIO TR("Vario", "Variometro") -#define TR_PITCH_AT_ZERO INDENT "Tono a Zero" -#define TR_PITCH_AT_MAX INDENT "Tono al Max" -#define TR_REPEAT_AT_ZERO INDENT "Ripeti a Zero" -#define TR_POWEROFF "\027Power OFF..." +#define TR_PITCH_AT_ZERO "Tono a Zero" +#define TR_PITCH_AT_MAX "Tono al Max" +#define TR_REPEAT_AT_ZERO "Ripeti a Zero" #define TR_SHUTDOWN "ARRESTO.." -#define TR_SAVEMODEL "Salvataggio dati modello" +#define TR_SAVE_MODEL "Salvataggio dati modello" #define TR_BATT_CALIB "Calibra batt." #define TR_CURRENT_CALIB "Calibra corr." #define TR_VOLTAGE TR(INDENT "Voltagg.",INDENT "Voltaggio") @@ -757,7 +752,7 @@ #define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "STORAGE" #define TR_EEPROM_CONVERTING "Conversione EEPROM" -#define TR_THROTTLEWARN "MOTORE" +#define TR_THROTTLE_UPPERCASE "MOTORE" #define TR_ALARMSWARN "ALLARMI" #define TR_SWITCHWARN "CONTROLLI" #define TR_FAILSAFEWARN "FAILSAFE" @@ -772,9 +767,9 @@ #define TR_NO_FAILSAFE "Failsafe non settato" #define TR_KEYSTUCK "Tasto bloccato" #define TR_INVERT_THR "Inverti Mot?" -#define TR_SPEAKER_VOLUME "Volume Audio" +#define TR_VOLUME "Volume Audio" #define TR_LCD "LCD" -#define TR_BRIGHTNESS INDENT "Luminosità" +#define TR_BRIGHTNESS "Luminosità" #define TR_CPU_TEMP "Temp CPU \016>" #define TR_CPU_CURRENT "Corrente\022>" #define TR_CPU_MAH "Consumo" @@ -885,11 +880,11 @@ #define TR_MENU_SPECTRUM_ANALYSER "SPECTRUM ANALYSER" #define TR_MENU_POWER_METER "POWER METER" #define TR_SENSOR "SENSOR" -#define TR_COUNTRYCODE TR("Codice Paese","Standard 2.4Ghz") +#define TR_COUNTRY_CODE TR("Codice Paese","Standard 2.4Ghz") #define TR_USBMODE "USB Mode" -#define TR_JACKMODE "Jack Mode" -#define TR_VOICELANG "Lingua Voce" -#define TR_UNITSSYSTEM "Unità" +#define TR_JACK_MODE "Jack Mode" +#define TR_VOICE_LANGUAGE "Lingua Voce" +#define TR_UNITS_SYSTEM "Unità" #define TR_EDIT "Modifica" #define TR_INSERT_BEFORE "Inserisci prima" #define TR_INSERT_AFTER "Inserisci dopo" @@ -1166,7 +1161,7 @@ #define TR_SETUP "Setup" #define TR_MAINVIEWX "Main view X" #define TR_LAYOUT "Layout" -#define TR_ADDMAINVIEW "Add main view" +#define TR_ADD_MAIN_VIEW "Add main view" #define TR_BACKGROUND_COLOR "Background color" #define TR_MAIN_COLOR "Main color" #define TR_TEXT_VIEWER "Text Viewer" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 2e6f4d24d..0f20dc5fc 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -87,14 +87,14 @@ #define LEN_VPERSISTENT "\020" #define TR_VPERSISTENT "UIT\0 ""Vliegtijd\0 ""Handmatige Reset" -#define LEN_COUNTRYCODES TR("\002", "\007") -#define TR_COUNTRYCODES TR("US""JP""EU", "Amerika""Japan\0 ""Europa\0") +#define LEN_COUNTRY_CODES TR("\002", "\007") +#define TR_COUNTRY_CODES TR("US""JP""EU", "Amerika""Japan\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_JACKMODES "\007" -#define TR_JACKMODES "Popup\0 ""Audio\0 ""Trainer" +#define LEN_JACK_MODES "\007" +#define TR_JACK_MODES "Popup\0 ""Audio\0 ""Trainer" #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" @@ -494,17 +494,17 @@ TR_GYR_VSRCRAW #define TR_RANGE INDENT "Bereik" #define TR_CENTER INDENT "Centreer" #define TR_BAR "Balk" -#define TR_ALARM INDENT "Alarm" +#define TR_ALARM "Alarm" #define TR_USRDATA "Data berekenen uit" #define TR_BLADES "Bladen" #define TR_SCREEN "Scherm\001" #define TR_SOUND_LABEL "Geluid-" -#define TR_LENGTH INDENT "Duur" -#define TR_BEEP_LENGTH INDENT "Piep-Lengte" -#define TR_SPKRPITCH INDENT "Piep-Freq. +/-" +#define TR_LENGTH "Duur" +#define TR_BEEP_LENGTH "Piep-Lengte" +#define TR_BEEP_PITCH "Piep-Freq. +/-" #define TR_HAPTIC_LABEL "Haptic" -#define TR_HAPTICSTRENGTH INDENT "Sterkte" +#define TR_STRENGTH "Sterkte" #define TR_GYRO_LABEL "Gyro" #define TR_GYRO_OFFSET "Offset" #define TR_GYRO_MAX "Max" @@ -512,11 +512,11 @@ TR_GYR_VSRCRAW #define TR_ALARMS_LABEL "Alarm" #define TR_BATTERY_RANGE TR("Accu Bereik", "Accu Spngs-Bereik") // Symbol Akku Ladezustand -#define TR_BATTERYWARNING INDENT "Accu laag" -#define TR_INACTIVITYALARM TR(INDENT "Inactiviteit", INDENT "Inactiviteit na") //9XR-Pro -#define TR_MEMORYWARNING INDENT "Geheugen laag" -#define TR_ALARMWARNING TR(INDENT "Al Geluid uit?", INDENT "Al het geluid uit?") -#define TR_RSSISHUTDOWNALARM TR(INDENT "Rssi Shutdown", INDENT "Check Rssi on Shutdown") +#define TR_BATTERYWARNING "Accu laag" +#define TR_INACTIVITYALARM TR("Inactiviteit", "Inactiviteit na") +#define TR_MEMORYWARNING "Geheugen laag" +#define TR_ALARMWARNING TR("Al Geluid uit?", "Al het geluid uit?") +#define TR_RSSI_SHUTDOWN_ALARM TR("Rssi Shutdown", "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" @@ -527,21 +527,19 @@ TR_GYR_VSRCRAW #define TR_BEEPCOUNTDOWN INDENT "Countdown" #define TR_PERSISTENT TR(INDENT "Vasth.", INDENT "Vasthouden") #define TR_BACKLIGHT_LABEL "LCD-Verlichting" -#define TR_BLDELAY INDENT "Duur" -#define TR_BL_MODE_DUR INDENT "Mode-Duration" -#define TR_BLONBRIGHTNESS INDENT "Aan-Helderheid" -#define TR_BLOFFBRIGHTNESS INDENT "Uit-Helderheid" -#define TR_BLCOLOR INDENT "Kleur" +#define TR_BLONBRIGHTNESS "Aan-Helderheid" +#define TR_BLOFFBRIGHTNESS "Uit-Helderheid" +#define TR_BLCOLOR "Kleur" #define TR_SPLASHSCREEN "Startscherm Aan" #define TR_PWR_ON_DELAY "Pwr On delay" #define TR_PWR_OFF_DELAY "Pwr Off delay" -#define TR_THROTTLEWARNING TR(INDENT "T-Warning", INDENT "Throttle Status") +#define TR_THROTTLE_WARNING TR(INDENT "T-Warning", INDENT "Throttle Status") #define TR_SWITCHWARNING TR(INDENT "S-Warning", INDENT "Switch Posities") #define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") #define TR_SLIDERWARNING TR(INDENT "Slid. pos.", INDENT "Slider positions") #define TR_POTWARNING TR(INDENT "Pot Warn.", INDENT "Pot Posities") #define TR_TIMEZONE TR("Tijdzone", "GPS-Tijdzone +/-Std") -#define TR_ADJUST_RTC TR("Klok instellen", INDENT "Klok middels GPS instellen") +#define TR_ADJUST_RTC TR("Klok instellen", "Klok middels GPS instellen") #define TR_GPS "GPS" #define TR_RXCHANNELORD TR("Kan.Volgorde", "Kanaalvolgorde") #define TR_STICKS "Sticks" @@ -576,7 +574,6 @@ TR_GYR_VSRCRAW #define OFS_RX 4 #define TR_ACCEL "Acc:" #define TR_NODATA CENTER"Geen Data" -#define TR_TOTTM1TM2THRTHP "\037\146SES\036TM1\037\146TM2\036THR\037\146TH%" #define TR_US "us" #define TR_TMR1JITTERUS "Tmr1 Jitter\037\124us" #define TR_TMIXMAXMS "Tmix max" @@ -588,9 +585,8 @@ TR_GYR_VSRCRAW #define TR_FM "FM" #define TR_MIX "MIX" #define TR_EEPROMLOWMEM "EEPROM weinig geheugen" -#define TR_ALERT "ALARM" -#define TR_PRESSANYKEYTOSKIP "Druk een toets.." -#define TR_THROTTLENOTIDLE "Gas niet Dicht!" +#define TR_PRESS_ANY_KEY_TO_SKIP "Druk een toets.." +#define TR_THROTTLE_NOT_IDLE "Gas niet Dicht!" #define TR_ALARMSDISABLED "Alarm uitgeschakeld" #define TR_PRESSANYKEY TR("\010Druk een Toets", "Druk een Toets") #define TR_BADEEPROMDATA "EEPROM Ongeldig" @@ -598,7 +594,7 @@ TR_GYR_VSRCRAW #define TR_EEPROMFORMATTING "EEPROM Initialiseren" #define TR_STORAGE_FORMAT "Storage Preparation" #define TR_EEPROMOVERFLOW "EEPROM Overflow" -#define TR_MENURADIOSETUP TR("ZENDER-INSTELLEN", "ZENDER-BASISINSTELLINGEN") +#define TR_RADIO_SETUP TR("ZENDER-INSTELLEN", "ZENDER-BASISINSTELLINGEN") #define TR_MENUDATEANDTIME "DATUM EN TIJD" @@ -617,7 +613,7 @@ TR_GYR_VSRCRAW #define TR_CHANNELS2FAILSAFE "Channels=>Failsafe" #define TR_CHANNEL2FAILSAFE "Channel=>Failsafe" #define TR_MENUMODELSEL TR("MODELLEN", "MODEL KIEZEN") -#define TR_MENUSETUP TR("MODEL-INSTELLING", "MODEL-INSTELLINGEN") +#define TR_MENU_MODEL_SETUP TR("MODEL-INSTELLING", "MODEL-INSTELLINGEN") #define TR_MENUFLIGHTMODES "VLIEGFASES" #define TR_MENUFLIGHTMODE "VLIEGFASE" #define TR_MENUHELISETUP "HELI TS-Mixer" @@ -647,7 +643,7 @@ TR_GYR_VSRCRAW #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_RF_POWER "RF Power" #define TR_MULTI_FIXEDID TR("FixedID", "Fixed ID") #define TR_MULTI_OPTION TR("Option", "Option value") #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on channel") @@ -678,14 +674,13 @@ TR_GYR_VSRCRAW #define TR_FLYSKY_TELEMETRY TR("FlySky RSSI #", "Use FlySky RSSI value without rescalling") #define TR_LATITUDE "Latitude" #define TR_LONGITUDE "Longitude" -#define TR_GPSCOORD TR("GPS-coord.", "GPS-coordinaten format") +#define TR_GPS_COORDS_FORMAT TR("GPS-coord.", "GPS-coordinaten format") #define TR_VARIO "Variometer" -#define TR_PITCH_AT_ZERO INDENT "Laagste Toon" -#define TR_PITCH_AT_MAX INDENT "Hoogste Toon" -#define TR_REPEAT_AT_ZERO INDENT "Herhalen bij 0" -#define TR_POWEROFF "\027Uitschakelen..." +#define TR_PITCH_AT_ZERO "Laagste Toon" +#define TR_PITCH_AT_MAX "Hoogste Toon" +#define TR_REPEAT_AT_ZERO "Herhalen bij 0" #define TR_SHUTDOWN "Afsluiten" -#define TR_SAVEMODEL "Bewaar Model-instellingen" +#define TR_SAVE_MODEL "Bewaar Model-instellingen" #define TR_BATT_CALIB "Accu Calib" #define TR_CURRENT_CALIB "Stroom Calib" #define TR_VOLTAGE TR(INDENT "Spg", INDENT "Spanningsbron") //9XR-Pro @@ -742,7 +737,7 @@ TR_GYR_VSRCRAW #define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "STORAGE" #define TR_EEPROM_CONVERTING "EEPROM Converteren" -#define TR_THROTTLEWARN "GAS" +#define TR_THROTTLE_UPPERCASE "GAS" #define TR_ALARMSWARN "ALARM" #define TR_SWITCHWARN "SCHAKELAAR" #define TR_FAILSAFEWARN "FAILSAFE" @@ -757,9 +752,9 @@ TR_GYR_VSRCRAW #define TR_NO_FAILSAFE TR("Failsafe niet ing.", "Failsafe niet ingesteld") #define TR_KEYSTUCK "Toets klemt" #define TR_INVERT_THR TR("Gas omdraaien?", "Volgas achter?") -#define TR_SPEAKER_VOLUME INDENT "Volume" +#define TR_VOLUME "Volume" #define TR_LCD "LCD" -#define TR_BRIGHTNESS INDENT "Helderheid" +#define TR_BRIGHTNESS "Helderheid" #define TR_CPU_TEMP "CPU-Temp.\016>" #define TR_CPU_CURRENT "Stroom\022>" #define TR_CPU_MAH "Verbruik" @@ -870,11 +865,11 @@ TR_GYR_VSRCRAW #define TR_MENU_SPECTRUM_ANALYSER "SPECTRUM ANALYSER" #define TR_MENU_POWER_METER "POWER METER" #define TR_SENSOR "SENSOR" -#define TR_COUNTRYCODE "Landcode" +#define TR_COUNTRY_CODE "Landcode" #define TR_USBMODE "USB Mode" -#define TR_JACKMODE "Jack Mode" -#define TR_VOICELANG "Taal" -#define TR_UNITSSYSTEM "Eenheden" +#define TR_JACK_MODE "Jack Mode" +#define TR_VOICE_LANGUAGE "Taal" +#define TR_UNITS_SYSTEM "Eenheden" #define TR_EDIT "Wijzigen" #define TR_INSERT_BEFORE "Invoegen ervoor" #define TR_INSERT_AFTER "Invoegen erna" @@ -1155,7 +1150,7 @@ TR_GYR_VSRCRAW #define TR_SETUP "Setup" #define TR_MAINVIEWX "Main view X" #define TR_LAYOUT "Layout" -#define TR_ADDMAINVIEW "Add main view" +#define TR_ADD_MAIN_VIEW "Add main view" #define TR_BACKGROUND_COLOR "Background color" #define TR_MAIN_COLOR "Main color" #define TR_TEXT_VIEWER "Text Viewer" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index abf6a6969..2755819e3 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -86,14 +86,14 @@ #define LEN_VPERSISTENT "\014" /*12 decimal*/ #define TR_VPERSISTENT "Wyłącz\0 ""Lot\0 ""Ręczny Reset" -#define LEN_COUNTRYCODES TR("\002", "\007") -#define TR_COUNTRYCODES TR("US""JP""EU", "Ameryka""Japonia""Europa\0") +#define LEN_COUNTRY_CODES TR("\002", "\007") +#define TR_COUNTRY_CODES TR("US""JP""EU", "Ameryka""Japonia""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_JACKMODES "\007" -#define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" +#define LEN_JACK_MODES "\007" +#define TR_JACK_MODES "Ask\0 ""Audio\0 ""Trainer" #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" @@ -513,27 +513,27 @@ #define TR_RANGE INDENT "Zakres" #define TR_CENTER INDENT "Środek" #define TR_BAR "Pas" -#define TR_ALARM INDENT "Alarm" +#define TR_ALARM "Alarm" #define TR_USRDATA TR("Dane Użytk.", "Dane użytkownika") -#define TR_BLADES " Łopaty śmigla" +#define TR_BLADES "Łopaty śmigla" #define TR_SCREEN "Ekran " #define TR_SOUND_LABEL "Dźwięk" -#define TR_LENGTH INDENT"Długość" -#define TR_BEEP_LENGTH INDENT "Dług. Beepa" -#define TR_SPKRPITCH INDENT"Dźwięk" +#define TR_LENGTH "Długość" +#define TR_BEEP_LENGTH "Dług. Beepa" +#define TR_BEEP_PITCH "Dźwięk" #define TR_HAPTIC_LABEL "Wibracja" -#define TR_HAPTICSTRENGTH INDENT"Siła" +#define TR_STRENGTH "Siła" #define TR_GYRO_LABEL "Gyro" #define TR_GYRO_OFFSET "Offset" #define TR_GYRO_MAX "Max" #define TR_CONTRAST "Kontrast" #define TR_ALARMS_LABEL "Alarmy" #define TR_BATTERY_RANGE TR("PokażPasBat.", "Pokaż pasek bateri") -#define TR_BATTERYWARNING INDENT"Bateria rozładowana" -#define TR_INACTIVITYALARM INDENT"Alarm bezczynności" -#define TR_MEMORYWARNING INDENT"Pełna pamięć" -#define TR_ALARMWARNING INDENT"Wyłącz dźwięk" -#define TR_RSSISHUTDOWNALARM TR(INDENT "Rssi Shutdown", INDENT "Check Rssi on Shutdown") +#define TR_BATTERYWARNING "Bateria rozładowana" +#define TR_INACTIVITYALARM "Alarm bezczynności" +#define TR_MEMORYWARNING "Pełna pamięć" +#define TR_ALARMWARNING "Wyłącz dźwięk" +#define TR_RSSI_SHUTDOWN_ALARM TR("Rssi Shutdown", "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" @@ -544,21 +544,19 @@ #define TR_BEEPCOUNTDOWN INDENT "Odliczanie" #define TR_PERSISTENT TR(INDENT "Dokł.", INDENT "Dokładny") #define TR_BACKLIGHT_LABEL "Podświetl" -#define TR_BLDELAY INDENT"Czas trwania" -#define TR_BL_MODE_DUR INDENT "Mode-Duration" -#define TR_BLONBRIGHTNESS INDENT"Jasnośc wł." -#define TR_BLOFFBRIGHTNESS INDENT"Jasność wył." -#define TR_BLCOLOR INDENT "Color" +#define TR_BLONBRIGHTNESS "Jasnośc wł." +#define TR_BLOFFBRIGHTNESS "Jasność wył." +#define TR_BLCOLOR "Color" #define TR_SPLASHSCREEN "Logo ekranu" #define TR_PWR_ON_DELAY "Pwr On delay" #define TR_PWR_OFF_DELAY "Pwr Off delay" -#define TR_THROTTLEWARNING TR(INDENT"OstrzGaz", INDENT "OstrzeżenieGaz") +#define TR_THROTTLE_WARNING TR(INDENT"OstrzGaz", INDENT "OstrzeżenieGaz") #define TR_SWITCHWARNING TR(INDENT "OstrzPrzeł", INDENT "PozycjaPrzeł") #define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") #define TR_SLIDERWARNING TR(INDENT "Slid. pos.", INDENT "Slider positions") #define TR_POTWARNING TR(INDENT "Ostrz.Poten.", INDENT "PozycjaPotencj.") #define TR_TIMEZONE TR("Strefa czasowa" ,"Strefa czasowa GPS") -#define TR_ADJUST_RTC TR("RegulujRTC", INDENT "RegulujRTC") +#define TR_ADJUST_RTC TR("RegulujRTC", "RegulujRTC") #define TR_GPS "GPS" #define TR_RXCHANNELORD TR("KolejnKan.RX", "Bazowa kolejność kanałów") #define TR_STICKS "Drążki" @@ -591,7 +589,6 @@ #define OFS_RX 4 #define TR_ACCEL "Acc:" #define TR_NODATA CENTER "BrakDAN" -#define TR_TOTTM1TM2THRTHP "\037\146SES\036TM1\037\146TM2\036THR\037\146TH%" #define TR_US "us" #define TR_TMR1JITTERUS "Tmr1 Jitter\037\124us" #define TR_TMIXMAXMS "TmixMaks" @@ -603,9 +600,8 @@ #define TR_FM "FL" #define TR_MIX "MIX" #define TR_EEPROMLOWMEM "Niska pamięć EEPROM" -#define TR_ALERT "\006UWAGA" -#define TR_PRESSANYKEYTOSKIP "Wciśnij guzik->ignoruj" -#define TR_THROTTLENOTIDLE "Gaz nie na zerze" +#define TR_PRESS_ANY_KEY_TO_SKIP "Wciśnij guzik->ignoruj" +#define TR_THROTTLE_NOT_IDLE "Gaz nie na zerze" #define TR_ALARMSDISABLED "Alarmy wyłączone" #define TR_PRESSANYKEY TR("\010Wciśnij jakiś klawisz","Wciśnij jakiś klawisz") #define TR_BADEEPROMDATA "\006Błąd danych EEPROM" @@ -613,7 +609,7 @@ #define TR_EEPROMFORMATTING "\004Formatowanie EEPROM" #define TR_STORAGE_FORMAT "Storage Preparation" #define TR_EEPROMOVERFLOW "Przeładowany EEPROM" -#define TR_MENURADIOSETUP "USTAWIENIA RADIA" +#define TR_RADIO_SETUP "USTAWIENIA RADIA" #define TR_MENUDATEANDTIME "DATA I CZAS" #define TR_MENUTRAINER "TRENER" #define TR_MENUSPECIALFUNCS "FUNKCJE GLOBALNE" @@ -629,7 +625,7 @@ #define TR_CHANNELS2FAILSAFE "Channels=>Failsafe" #define TR_CHANNEL2FAILSAFE "Channel=>Failsafe" #define TR_MENUMODELSEL TR("WYB.MODEL","WYBÓR MODELU") -#define TR_MENUSETUP TR("USTAW","USTAW MODELU") +#define TR_MENU_MODEL_SETUP TR("USTAW","USTAW MODELU") #define TR_MENUFLIGHTMODE "FAZA LOTU" #define TR_MENUFLIGHTMODES "FAZY LOTU" #define TR_MENUHELISETUP "USTAW HELI" @@ -659,7 +655,7 @@ #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_RF_POWER "RF Power" #define TR_MULTI_FIXEDID TR("FixedID", "Fixed ID") #define TR_MULTI_OPTION TR("Option", "Option value") #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on channel") @@ -690,14 +686,13 @@ #define TR_FLYSKY_TELEMETRY TR("FlySky RSSI #", "Use FlySky RSSI value without rescalling") #define TR_LATITUDE "Szer. geo." #define TR_LONGITUDE "Dł. geo." -#define TR_GPSCOORD TR("Koord.GPS","Typ koordynat GPS") +#define TR_GPS_COORDS_FORMAT TR("Koord.GPS","Typ koordynat GPS") #define TR_VARIO TR("Wario","Wariometr") -#define TR_PITCH_AT_ZERO INDENT "Ton przy Zerze" -#define TR_PITCH_AT_MAX INDENT "Ton przy Max" -#define TR_REPEAT_AT_ZERO INDENT "Powtórz przy Zerze" -#define TR_POWEROFF "\027Wyłączanie.." +#define TR_PITCH_AT_ZERO "Ton przy Zerze" +#define TR_PITCH_AT_MAX "Ton przy Max" +#define TR_REPEAT_AT_ZERO "Powtórz przy Zerze" #define TR_SHUTDOWN "Wyłączanie.." -#define TR_SAVEMODEL "Zapisz ustwienia modelu" +#define TR_SAVE_MODEL "Zapisz ustwienia modelu" #define TR_BATT_CALIB "Kalib:Baterii" #define TR_CURRENT_CALIB " +=\006Kalibracja prądu" #define TR_VOLTAGE TR (INDENT"Napięcie",INDENT"Źródło Napięcia") @@ -754,7 +749,7 @@ #define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "STORAGE" #define TR_EEPROM_CONVERTING "Konwersja EEPROM" -#define TR_THROTTLEWARN "GAZ" +#define TR_THROTTLE_UPPERCASE "GAZ" #define TR_ALARMSWARN "ALARM" #define TR_SWITCHWARN TR("Przełą","Kontrola") #define TR_FAILSAFEWARN "FAILSAFE" @@ -769,9 +764,9 @@ #define TR_NO_FAILSAFE "Brak Failsafe" #define TR_KEYSTUCK "Blokada klucza" #define TR_INVERT_THR TR("Odw.Gaz?","Odwróć gaz?") -#define TR_SPEAKER_VOLUME INDENT "Głośność" +#define TR_VOLUME "Głośność" #define TR_LCD "LCD" -#define TR_BRIGHTNESS INDENT "Jasność" +#define TR_BRIGHTNESS "Jasność" #define TR_CPU_TEMP "Temp. CPU\016>" #define TR_CPU_CURRENT "Prąd" #define TR_CPU_MAH "Zużycie" @@ -882,11 +877,11 @@ #define TR_MENU_SPECTRUM_ANALYSER "SPECTRUM ANALYSER" #define TR_MENU_POWER_METER "POWER METER" #define TR_SENSOR "SENSOR" -#define TR_COUNTRYCODE "Kod regionu" +#define TR_COUNTRY_CODE "Kod regionu" #define TR_USBMODE "USB Mode" -#define TR_JACKMODE "Jack Mode" -#define TR_VOICELANG "Język głosu" -#define TR_UNITSSYSTEM "Jednostki" +#define TR_JACK_MODE "Jack Mode" +#define TR_VOICE_LANGUAGE "Język głosu" +#define TR_UNITS_SYSTEM "Jednostki" #define TR_EDIT "Edytuj" #define TR_INSERT_BEFORE "Wstaw przed" #define TR_INSERT_AFTER "Wstaw za" @@ -1163,7 +1158,7 @@ #define TR_SETUP "Setup" #define TR_MAINVIEWX "Main view X" #define TR_LAYOUT "Layout" -#define TR_ADDMAINVIEW "Add main view" +#define TR_ADD_MAIN_VIEW "Add main view" #define TR_BACKGROUND_COLOR "Background color" #define TR_MAIN_COLOR "Main color" #define TR_TEXT_VIEWER "Text Viewer" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 63350ac50..7977b950c 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -86,14 +86,14 @@ #define LEN_VPERSISTENT "\014" #define TR_VPERSISTENT "OFF\0 ""Flight\0 ""Manual Reset" -#define LEN_COUNTRYCODES TR("\002", "\007") -#define TR_COUNTRYCODES TR("US""JP""EU", "America""Japan\0 ""Europe\0") +#define LEN_COUNTRY_CODES TR("\002", "\007") +#define TR_COUNTRY_CODES TR("US""JP""EU", "America""Japan\0 ""Europe\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_JACKMODES "\007" -#define TR_JACKMODES "Popup\0 ""Audio\0 ""Trainer" +#define LEN_JACK_MODES "\007" +#define TR_JACK_MODES "Popup\0 ""Audio\0 ""Trainer" #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" @@ -499,27 +499,27 @@ #define TR_RANGE INDENT"Range" #define TR_CENTER INDENT "Center" #define TR_BAR "Bar" -#define TR_ALARM INDENT"Alarme" +#define TR_ALARM "Alarme" #define TR_USRDATA "UsrData" -#define TR_BLADES INDENT"Helice" +#define TR_BLADES "Helice" #define TR_SCREEN "Tela" #define TR_SOUND_LABEL "Som" -#define TR_LENGTH INDENT"Comprimento" -#define TR_BEEP_LENGTH INDENT "Beep Length" -#define TR_SPKRPITCH INDENT"Pitch" +#define TR_LENGTH "Comprimento" +#define TR_BEEP_LENGTH "Beep Length" +#define TR_BEEP_PITCH "Pitch" #define TR_HAPTIC_LABEL "Vibrar" -#define TR_HAPTICSTRENGTH INDENT"Forca" +#define TR_STRENGTH "Forca" #define TR_GYRO_LABEL "Gyro" #define TR_GYRO_OFFSET "Offset" #define TR_GYRO_MAX "Max" #define TR_CONTRAST "Contraste" #define TR_ALARMS_LABEL "Alarmes" #define TR_BATTERY_RANGE "Battery Range" -#define TR_BATTERYWARNING INDENT"Bateria Baixa" -#define TR_INACTIVITYALARM INDENT"Inactividade" -#define TR_MEMORYWARNING INDENT"Memoria Baixa" -#define TR_ALARMWARNING INDENT"Som Off" -#define TR_RSSISHUTDOWNALARM TR(INDENT "Rssi Shutdown", INDENT "Check Rssi on Shutdown") +#define TR_BATTERYWARNING "Bateria Baixa" +#define TR_INACTIVITYALARM "Inactividade" +#define TR_MEMORYWARNING "Memoria Baixa" +#define TR_ALARMWARNING "Som Off" +#define TR_RSSI_SHUTDOWN_ALARM TR("Rssi Shutdown", "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" @@ -530,21 +530,19 @@ #define TR_BEEPCOUNTDOWN INDENT "Beep Regressivo" #define TR_PERSISTENT INDENT "Persist." #define TR_BACKLIGHT_LABEL "Backlight" -#define TR_BLDELAY INDENT "Tempo Backlight" -#define TR_BL_MODE_DUR INDENT "Mode-Duration" -#define TR_BLONBRIGHTNESS INDENT "ON Brightness" -#define TR_BLOFFBRIGHTNESS INDENT "OFF Brightness" -#define TR_BLCOLOR INDENT "Color" +#define TR_BLONBRIGHTNESS "ON Brightness" +#define TR_BLOFFBRIGHTNESS "OFF Brightness" +#define TR_BLCOLOR "Color" #define TR_SPLASHSCREEN "Splash screen" #define TR_PWR_ON_DELAY "Pwr On delay" #define TR_PWR_OFF_DELAY "Pwr Off delay" -#define TR_THROTTLEWARNING TR("Avisa Acel", INDENT "Avisa Acel") +#define TR_THROTTLE_WARNING TR("Avisa Acel", INDENT "Avisa Acel") #define TR_SWITCHWARNING TR("Avisa Chav", INDENT "Avisa Chav") #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_TIMEZONE "Time Zone" -#define TR_ADJUST_RTC TR("Adjust RTC", INDENT "Adjust RTC") +#define TR_ADJUST_RTC TR("Adjust RTC", "Adjust RTC") #define TR_GPS "GPS" #define TR_RXCHANNELORD "Ordem Canal RX" #define TR_STICKS "Sticks" @@ -573,7 +571,6 @@ #define OFS_RX 4 #define TR_ACCEL "Acc:" #define TR_NODATA CENTER"SEM DADOS" -#define TR_TOTTM1TM2THRTHP "\037\146SES\036TM1\037\146TM2\036THR\037\146TH%" #define TR_US "us" #define TR_TMR1JITTERUS "Tmr1 Jitter\037\124us" #define TR_TMIXMAXMS "Tmix max" @@ -585,9 +582,8 @@ #define TR_FM "FP" #define TR_MIX "MIX" #define TR_EEPROMLOWMEM "EEPROM BX Memoria" -#define TR_ALERT "\016ALERT" -#define TR_PRESSANYKEYTOSKIP "Pulsar Tecla p/ sair" -#define TR_THROTTLENOTIDLE "**ACELERADOR ATIVO**" +#define TR_PRESS_ANY_KEY_TO_SKIP "Pulsar Tecla p/ sair" +#define TR_THROTTLE_NOT_IDLE "**ACELERADOR ATIVO**" #define TR_ALARMSDISABLED "Desabilita Alarmes" #define TR_PRESSANYKEY "\010Pressione Tecla" #define TR_BADEEPROMDATA "EEPRON INVALIDA" @@ -595,7 +591,7 @@ #define TR_EEPROMFORMATTING "Formatando EEPROM" #define TR_STORAGE_FORMAT "Storage Preparation" #define TR_EEPROMOVERFLOW "EEPROM CHEIA" -#define TR_MENURADIOSETUP "AJUSTAR RADIO" +#define TR_RADIO_SETUP "AJUSTAR RADIO" #define TR_MENUDATEANDTIME "DATA E HORA" #define TR_MENUTRAINER "TRAINER" #define TR_MENUSPECIALFUNCS "GLOBAL FUNCTIONS" @@ -611,7 +607,7 @@ #define TR_CHANNELS2FAILSAFE "Channels=>Failsafe" #define TR_CHANNEL2FAILSAFE "Channel=>Failsafe" #define TR_MENUMODELSEL "MODELOS" -#define TR_MENUSETUP "SETUP" +#define TR_MENU_MODEL_SETUP "SETUP" #define TR_MENUFLIGHTMODE "MODO DE VOO" #define TR_MENUFLIGHTMODES "MODOS DE VOO" #define TR_MENUHELISETUP "HELI SETUP" @@ -650,7 +646,7 @@ #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_RF_POWER "RF Power" #define TR_MULTI_FIXEDID TR("FixedID", "Fixed ID") #define TR_MULTI_OPTION TR("Option", "Option value") #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on channel") @@ -680,14 +676,13 @@ #define TR_FLYSKY_TELEMETRY TR("FlySky RSSI #", "Use FlySky RSSI value without rescalling") #define TR_LATITUDE "Latitude" #define TR_LONGITUDE "Longitude" -#define TR_GPSCOORD "Gps Coords" +#define TR_GPS_COORDS_FORMAT "Gps Coords" #define TR_VARIO "Vario" -#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_POWEROFF "\027Power OFF..." +#define TR_PITCH_AT_ZERO "Pitch at Zero" +#define TR_PITCH_AT_MAX "Pitch at Max" +#define TR_REPEAT_AT_ZERO "Repeat at Zero" #define TR_SHUTDOWN "DESLIGANDOo" -#define TR_SAVEMODEL "Saving model settings" +#define TR_SAVE_MODEL "Saving model settings" #define TR_BATT_CALIB "CALIBRAR BATT" #define TR_CURRENT_CALIB "Corrente Calib" #define TR_VOLTAGE INDENT"Volts" @@ -744,7 +739,7 @@ #define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "STORAGE" #define TR_EEPROM_CONVERTING "EEPROM Converting" -#define TR_THROTTLEWARN "ACELERAD" +#define TR_THROTTLE_UPPERCASE "ACELERAD" #define TR_ALARMSWARN "ALARMES" #define TR_SWITCHWARN "CHAVES" #define TR_FAILSAFEWARN "FAILSAFE" @@ -759,9 +754,9 @@ #define TR_NO_FAILSAFE "Failsafe not set" #define TR_KEYSTUCK "Key stuck" #define TR_INVERT_THR "Inverte Acel?" -#define TR_SPEAKER_VOLUME INDENT "Volume" +#define TR_VOLUME "Volume" #define TR_LCD "LCD" -#define TR_BRIGHTNESS INDENT "Brilho" +#define TR_BRIGHTNESS "Brilho" #define TR_CPU_TEMP "CPU Temp.\016>" #define TR_CPU_CURRENT "Current\022>" #define TR_CPU_MAH "Consumo." @@ -872,11 +867,11 @@ #define TR_MENU_SPECTRUM_ANALYSER "SPECTRUM ANALYSER" #define TR_MENU_POWER_METER "POWER METER" #define TR_SENSOR "SENSOR" -#define TR_COUNTRYCODE "Country Code" +#define TR_COUNTRY_CODE "Country Code" #define TR_USBMODE "USB Mode" -#define TR_JACKMODE "Jack Mode" -#define TR_VOICELANG "Voice Language" -#define TR_UNITSSYSTEM "Units" +#define TR_JACK_MODE "Jack Mode" +#define TR_VOICE_LANGUAGE "Voice Language" +#define TR_UNITS_SYSTEM "Units" #define TR_EDIT "Edit" #define TR_INSERT_BEFORE "Insert Before" #define TR_INSERT_AFTER "Insert After" @@ -1152,7 +1147,7 @@ #define TR_SETUP "Setup" #define TR_MAINVIEWX "Main view X" #define TR_LAYOUT "Layout" -#define TR_ADDMAINVIEW "Add main view" +#define TR_ADD_MAIN_VIEW "Add main view" #define TR_BACKGROUND_COLOR "Background color" #define TR_MAIN_COLOR "Main color" #define TR_TEXT_VIEWER "Text Viewer" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 48fd62151..e8d0f0616 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -89,14 +89,14 @@ #define LEN_VPERSISTENT "\014" #define TR_VPERSISTENT "Av\0 ""Flygning\0 ""Nolla Själv\0" -#define LEN_COUNTRYCODES TR("\002", "\007") -#define TR_COUNTRYCODES TR("US""JP""EU", "Amerika""Japan\0 ""Europa\0") +#define LEN_COUNTRY_CODES TR("\002", "\007") +#define TR_COUNTRY_CODES TR("US""JP""EU", "Amerika""Japan\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_JACKMODES "\007" -#define TR_JACKMODES "Ask\0 ""Audio\0 ""Trainer" +#define LEN_JACK_MODES "\007" +#define TR_JACK_MODES "Ask\0 ""Audio\0 ""Trainer" #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" @@ -512,27 +512,27 @@ #define TR_RANGE INDENT"MinMax" #define TR_CENTER INDENT "Center" #define TR_BAR "Data" -#define TR_ALARM INDENT"Alarm" +#define TR_ALARM "Alarm" #define TR_USRDATA "Användardata" -#define TR_BLADES INDENT"Blad" +#define TR_BLADES "Blad" #define TR_SCREEN "Skärm " #define TR_SOUND_LABEL "Ljud " -#define TR_LENGTH INDENT"Tid" -#define TR_BEEP_LENGTH INDENT "Pip-längd" -#define TR_SPKRPITCH INDENT "Pip-ton" +#define TR_LENGTH "Tid" +#define TR_BEEP_LENGTH "Pip-längd" +#define TR_BEEP_PITCH "Pip-ton" #define TR_HAPTIC_LABEL "Vibrator" -#define TR_HAPTICSTRENGTH INDENT"Styrka" +#define TR_STRENGTH "Styrka" #define TR_GYRO_LABEL "Gyro" #define TR_GYRO_OFFSET "Offset" #define TR_GYRO_MAX "Max" #define TR_CONTRAST "Kontrast" #define TR_ALARMS_LABEL "Alarm" #define TR_BATTERY_RANGE "Batteri-MinMax" -#define TR_BATTERYWARNING INDENT"Batteri" -#define TR_INACTIVITYALARM INDENT"Inaktivitet" -#define TR_MEMORYWARNING INDENT"Lite Minne" -#define TR_ALARMWARNING INDENT"Ljud Av" -#define TR_RSSISHUTDOWNALARM TR(INDENT "Rssi Shutdown", INDENT "Check Rssi on Shutdown") +#define TR_BATTERYWARNING "Batteri" +#define TR_INACTIVITYALARM "Inaktivitet" +#define TR_MEMORYWARNING "Lite Minne" +#define TR_ALARMWARNING "Ljud Av" +#define TR_RSSI_SHUTDOWN_ALARM TR("Rssi Shutdown", "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" @@ -543,21 +543,19 @@ #define TR_BEEPCOUNTDOWN INDENT "Nedräkning" #define TR_PERSISTENT TR("Jämt på ", INDENT"Alltid På") #define TR_BACKLIGHT_LABEL "Belysning" -#define TR_BLDELAY INDENT "Av efter" -#define TR_BL_MODE_DUR INDENT "Mode-Duration" -#define TR_BLONBRIGHTNESS INDENT "På Ljusstyrka" -#define TR_BLOFFBRIGHTNESS INDENT "Av Ljusstyrka" +#define TR_BLONBRIGHTNESS "På Ljusstyrka" +#define TR_BLOFFBRIGHTNESS "Av Ljusstyrka" #define TR_SPLASHSCREEN "Startbild" #define TR_PWR_ON_DELAY "Pwr On delay" #define TR_PWR_OFF_DELAY "Pwr Off delay" -#define TR_BLCOLOR INDENT "Color" -#define TR_THROTTLEWARNING TR("Gasvarning", INDENT "Gasvarning") +#define TR_BLCOLOR "Color" +#define TR_THROTTLE_WARNING TR("Gasvarning", INDENT "Gasvarning") #define TR_SWITCHWARNING TR("Bryt.varn.", INDENT "Brytarvarning") #define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") #define TR_SLIDERWARNING TR(INDENT "Slid. pos.", INDENT "Slider positions") #define TR_POTWARNING TR("Rattvarn.", INDENT "Rattvarning") #define TR_TIMEZONE TR("Tidszon", "GPS Tidszon") -#define TR_ADJUST_RTC TR("Adjust RTC", INDENT "Adjust RTC") +#define TR_ADJUST_RTC TR("Adjust RTC", "Adjust RTC") #define TR_GPS "GPS" #define TR_RXCHANNELORD "Kanaler i RX" #define TR_STICKS "Sticks" @@ -590,7 +588,6 @@ #define OFS_RX 4 #define TR_ACCEL "Acc:" #define TR_NODATA CENTER "DATA SAKNAS" -#define TR_TOTTM1TM2THRTHP "\037\146SES\036TM1\037\146TM2\036THR\037\146TH%" #define TR_US "us" #define TR_TMR1JITTERUS "Tmr1 Jitter\037\124us" #define TR_TMIXMAXMS "Tmix max" @@ -602,9 +599,8 @@ #define TR_FM "FL" #define TR_MIX "MIX" #define TR_EEPROMLOWMEM "Minnesbrist" -#define TR_ALERT "\016OBS" -#define TR_PRESSANYKEYTOSKIP "Tryck ned en knapp" -#define TR_THROTTLENOTIDLE "Gasen är påslagen!" +#define TR_PRESS_ANY_KEY_TO_SKIP "Tryck ned en knapp" +#define TR_THROTTLE_NOT_IDLE "Gasen är påslagen!" #define TR_ALARMSDISABLED "Alarmen Avstängda!" #define TR_PRESSANYKEY "Tryck ned en knapp" #define TR_BADEEPROMDATA "Minnet kan inte tolkas" @@ -612,7 +608,7 @@ #define TR_EEPROMFORMATTING "Minnet Nollställs" #define TR_STORAGE_FORMAT "SD-Lagring förbereds" #define TR_EEPROMOVERFLOW "Minnesfel" -#define TR_MENURADIOSETUP "INSTÄLLNINGAR" +#define TR_RADIO_SETUP "INSTÄLLNINGAR" #define TR_MENUDATEANDTIME "DAG OCH TID" #define TR_MENUTRAINER "TRAINER (PPM IN)" #define TR_MENUSPECIALFUNCS "GLOBALA FUNKTIONER" @@ -628,7 +624,7 @@ #define TR_CHANNELS2FAILSAFE "Channels=>Failsafe" #define TR_CHANNEL2FAILSAFE "Channel=>Failsafe" #define TR_MENUMODELSEL TR("MODELL","VÄLJ MODELL") -#define TR_MENUSETUP TR("VÄRDEN","MODELLINSTÄLLNINGAR") +#define TR_MENU_MODEL_SETUP TR("VÄRDEN","MODELLINSTÄLLNINGAR") #define TR_MENUFLIGHTMODE "FLYGLÄGE" #define TR_MENUFLIGHTMODES "FLYGLÄGEN" #define TR_MENUHELISETUP "HELIKOPTER" @@ -659,7 +655,7 @@ #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_RF_POWER "RF Power" #define TR_MULTI_FIXEDID TR("FixedID", "Fixed ID") #define TR_MULTI_OPTION TR("Option", "Option value") #define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on channel") @@ -689,14 +685,13 @@ #define TR_FLYSKY_TELEMETRY TR("FlySky RSSI #", "Use FlySky RSSI value without rescalling") #define TR_LATITUDE "Breddgrad" #define TR_LONGITUDE "Längdgrad" -#define TR_GPSCOORD TR("GPS-Koordinater", "GPS-koordinatsystem") +#define TR_GPS_COORDS_FORMAT TR("GPS-Koordinater", "GPS-koordinatsystem") #define TR_VARIO TR("Vario", "Variometer") -#define TR_PITCH_AT_ZERO INDENT "Ton vid Noll" -#define TR_PITCH_AT_MAX INDENT "Ton vid Max" -#define TR_REPEAT_AT_ZERO INDENT "Repetera vid Noll" -#define TR_POWEROFF "\027Stänger Av..." +#define TR_PITCH_AT_ZERO "Ton vid Noll" +#define TR_PITCH_AT_MAX "Ton vid Max" +#define TR_REPEAT_AT_ZERO "Repetera vid Noll" #define TR_SHUTDOWN "STÄNGER AV" -#define TR_SAVEMODEL "Spara modellinställn." +#define TR_SAVE_MODEL "Spara modellinställn." #define TR_BATT_CALIB "Kalib. Batteri" #define TR_CURRENT_CALIB "Kalib. Ström" #define TR_VOLTAGE INDENT"Volt" @@ -753,7 +748,7 @@ #define TR_EEPROMWARN "EEPROM" #define TR_STORAGE_WARNING "LAGRING" #define TR_EEPROM_CONVERTING "EEPROM Konvertering" -#define TR_THROTTLEWARN "GAS" +#define TR_THROTTLE_UPPERCASE "GAS" #define TR_ALARMSWARN "ALARM" #define TR_SWITCHWARN "BRYTARE" #define TR_FAILSAFEWARN "FAILSAFE" @@ -769,9 +764,9 @@ #define TR_NO_FAILSAFE "Failsafe ej given" #define TR_KEYSTUCK "Knapp-fel" #define TR_INVERT_THR TR("Invert.Gas?", "Invertera Gasen?") -#define TR_SPEAKER_VOLUME INDENT "Volym" +#define TR_VOLUME "Volym" #define TR_LCD "LCD" -#define TR_BRIGHTNESS INDENT "Ljusstyrka" +#define TR_BRIGHTNESS "Ljusstyrka" #define TR_CPU_TEMP "CPU temp.\016>" #define TR_CPU_CURRENT "Ström\022>" #define TR_CPU_MAH "Förbrukn." @@ -882,11 +877,11 @@ #define TR_MENU_SPECTRUM_ANALYSER "SPECTRUM ANALYSER" #define TR_MENU_POWER_METER "POWER METER" #define TR_SENSOR "SENSOR" -#define TR_COUNTRYCODE "Landskod" +#define TR_COUNTRY_CODE "Landskod" #define TR_USBMODE "USB Mode" -#define TR_JACKMODE "Jack Mode" -#define TR_VOICELANG "Röstspråk" -#define TR_UNITSSYSTEM "Enheter" +#define TR_JACK_MODE "Jack Mode" +#define TR_VOICE_LANGUAGE "Röstspråk" +#define TR_UNITS_SYSTEM "Enheter" #define TR_EDIT "Redigera" #define TR_INSERT_BEFORE "Addera Före" #define TR_INSERT_AFTER "Addera Efter" @@ -1163,7 +1158,7 @@ #define TR_SETUP "Setup" #define TR_MAINVIEWX "Main view X" #define TR_LAYOUT "Layout" -#define TR_ADDMAINVIEW "Add main view" +#define TR_ADD_MAIN_VIEW "Add main view" #define TR_BACKGROUND_COLOR "Background color" #define TR_MAIN_COLOR "Main color" #define TR_TEXT_VIEWER "Text Viewer" diff --git a/radio/util/font2png.py b/radio/util/font2png.py deleted file mode 100755 index 6ed21890c..000000000 --- a/radio/util/font2png.py +++ /dev/null @@ -1,95 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import sys, os -import glob - -from PIL import Image, ImageDraw, ImageFont - -chars_en = u""" !"#$%&'()*+,-./0123456789:;<=>?°ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz~|≥""" -chars_fr = u"""éèàîç""" -chars_de = u"""ÄäÖöÜüß""" -chars_cz = u"""ěščřžýáíéňóůúďťĚŠČŘŽÝÁÍÉŇÓÚŮĎŤ""" -chars_es = u"""Ññ""" -chars_fi = u"""åäöÅÄÖ""" -chars_it = u"""àù""" -chars_pl = u"""ąćęłńóśżźĄĆĘŁŃÓŚŻŹ""" -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 - - -def createFontBitmap(filename, fontname, fontsize, fontoffset, foreground, background, coordsfile=True): - coords = [fontsize + 4] - font_filename = 'fonts/' + fontname + '.ttf' - - print("Font filename: %s" % font_filename) - font = ImageFont.truetype(font_filename, fontsize) - - extraImage = None - extraFilename = 'fonts/extra_%dpx.png' % fontsize - - try: - extraImage = Image.open(extraFilename) - extraImage = extraImage.convert('RGB') - - except IOError: - print("Missing extra symbol filename %s" % extraFilename) - - def getCharWidth(c): - if c in chars_extra: - if extraImage: - # Extra characters 16px - #if fontsize == 16: - if ord(c) <= 9: - return 13 - else: - return 15 - else: - return 0 - elif c == " ": - return 4 - else: - w, h = font.getsize(c) - return w + 1 - - def getFontWidth(): - width = 0 - for c in chars: - width += getCharWidth(c) - return width - - width = getFontWidth() - image = Image.new('RGB', (width, fontsize + 4), background) - - print(fontsize + 4) - draw = ImageDraw.Draw(image) - - width = 0 - for c in chars: - coords.append(width) - - if c in chars_extra: - if extraImage and c == chars_extra[0]: - image.paste(extraImage.copy(), (width, fontsize % 2)) - elif c == " ": - pass - else: - w, h = font.getsize(c) - draw.text((width + 1, fontoffset), c, fill=foreground, font=font) - - width += getCharWidth(c) - - coords.append(width) - - image.save(filename + ".png") - if coordsfile: - with open(filename + ".specs", "w") as f: - f.write(",".join(str(tmp) for tmp in coords)) - - -if __name__ == "__main__": - createFontBitmap(sys.argv[4], sys.argv[1], int(sys.argv[2]), int(sys.argv[3]), (0, 0, 0), (255, 255, 255)) diff --git a/radio/util/translate.py b/radio/util/translate.py deleted file mode 100755 index 53e113ca7..000000000 --- a/radio/util/translate.py +++ /dev/null @@ -1,193 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# Imports -import argparse -import codecs -import sys - -translations = {'cz_reduced': [('\\200', u'á'), - ('\\201', u'č'), - ('\\201', u'Č'), - ('\\202', u'é'), - ('\\203', u'ě'), - ('\\203', u'Ě'), - ('\\204', u'í'), - ('\\205', u'ó'), - ('\\206', u'ř'), - ('\\207', u'š'), - ('\\207', u'Š'), - ('\\210', u'ú'), - ('\\210', u'Ú'), - ('\\211', u'ů'), - ('\\211', u'Ů'), - ('\\212', u'ý'), - ('\\213', u'Á'), - ('\\214', u'Í'), - ('\\215', u'Ř'), - ('\\216', u'Ý'), - ('\\217', u'ž'), - ('\\217', u'Ž'), - ('\\220', u'É')], - - 'cz': [('\\200', u'ě'), - ('\\201', u'š'), - ('\\202', u'č'), - ('\\203', u'ř'), - ('\\204', u'ž'), - ('\\205', u'ý'), - ('\\206', u'á'), - ('\\207', u'í'), - ('\\210', u'é'), - ('\\211', u'ň'), - ('\\212', u'ó'), - ('\\213', u'ů'), - ('\\214', u'ú'), - ('\\215', u'ď'), - ('\\216', u'ť'), - ('\\217', u'Ě'), - ('\\220', u'Š'), - ('\\221', u'Č'), - ('\\222', u'Ř'), - ('\\223', u'Ž'), - ('\\224', u'Ý'), - ('\\225', u'Á'), - ('\\226', u'Í'), - ('\\227', u'É'), - ('\\230', u'Ň'), - ('\\231', u'Ó'), - ('\\232', u'Ú'), - ('\\233', u'Ů'), - ('\\234', u'Ď'), - ('\\235', u'Ť')], - - 'de': [('\\200', u'Ä'), - ('\\201', u'ä'), - ('\\202', u'Ö'), - ('\\203', u'ö'), - ('\\204', u'Ü'), - ('\\205', u'ü'), - ('\\206', u'ß')], - - 'es': [('\\200', u'Ñ'), - ('\\201', u'ñ')], - - 'fi': [('\\200', u'å'), - ('\\201', u'ä'), - ('\\202', u'ö'), - ('\\203', u'Å'), - ('\\204', u'Ä'), - ('\\205', u'Ö')], - - 'fr': [('\\200', u'é'), - ('\\201', u'è'), - ('\\202', u'à'), - ('\\203', u'î'), - ('\\204', u'ç')], - - 'it': [('\\200', u'à'), - ('\\201', u'ù')], - - 'pl': [('\\200', u'ą'), - ('\\201', u'ć'), - ('\\202', u'ę'), - ('\\203', u'ł'), - ('\\204', u'ń'), - ('\\205', u'ó'), - ('\\206', u'ś'), - ('\\207', u'ż'), - ('\\210', u'ź'), - ('\\211', u'Ą'), - ('\\212', u'Ć'), - ('\\213', u'Ę'), - ('\\214', u'Ł'), - ('\\215', u'Ń'), - ('\\216', u'Ó'), - ('\\217', u'Ś'), - ('\\220', u'Ż'), - ('\\221', u'Ź')], - - 'pt': [('\\200', u'Á'), - ('\\201', u'á'), - ('\\202', u'Â'), - ('\\203', u'â'), - ('\\204', u'Ã'), - ('\\205', u'ã'), - ('\\206', u'À'), - ('\\207', u'à'), - ('\\210', u'Ç'), - ('\\211', u'ç'), - ('\\212', u'É'), - ('\\213', u'é'), - ('\\214', u'Ê'), - ('\\215', u'ê'), - ('\\216', u'Í'), - ('\\217', u'í'), - ('\\218', u'Ó'), - ('\\219', u'ó'), - ('\\220', u'Ô'), - ('\\221', u'ô'), - ('\\222', u'Õ'), - ('\\223', u'õ'), - ('\\224', u'Ú'), - ('\\225', u'ú'), ], - - 'se': [('\\200', u'å'), - ('\\201', u'ä'), - ('\\202', u'ö'), - ('\\203', u'Å'), - ('\\204', u'Ä'), - ('\\205', u'Ö')], - - 'en': [], - - 'nl': [], - - 'all': [('\\306', u'Δ'), - ('\\173', u'~'), - ('\\036', u'\\n'), - ('\\035', u'\\t')], - } - -# Take care of command line options -parser = argparse.ArgumentParser(description='Encoder for open9x translations') -parser.add_argument('input', action="store", help="Input file name") -parser.add_argument('output', action="store", help="Output file name") -parser.add_argument('language', action="store", help="Two letter language identifier") -parser.add_argument("--reverse", help="Reversed char conversion (from number to char)", action="store_true") -args = parser.parse_args() - -if args.language not in translations: - parser.error(args.language + ' is not a supported language. Try one of the supported ones: ' + str(list(translations.keys()))) - sys.exit() - -if args.reverse: - for translation in translations: - translations[translation] = [(after, before) for (before, after) in translations[translation]] - -# Read the input file into a buffer -in_file = codecs.open(args.input, "r", "utf-8") - -# Write the result to a temporary file -out_file = codecs.open(args.output, 'w', 'utf-8') - -for line in in_file.readlines(): - # Do the special chars replacements - for after, before in translations[args.language] + translations["all"]: - line = line.replace(before, after) - if line.startswith("#define ZSTR_"): - before = line[32:-2] - after = "" - for c in before: - if ord(c) >= ord('A') and ord(c) <= ord('Z'): - c = "\\%03o" % (ord(c) - ord('A') + 1) - elif ord(c) >= ord('a') and ord(c) <= ord('z'): - c = "\\%03o" % (-ord(c) + ord('a') + 255) - elif ord(c) >= ord('0') and ord(c) <= ord('9'): - c = "\\%03o" % (ord(c) - ord('0') + 27) - after = after + c - line = line[:32] + after + line[-2:] - out_file.write(line) - -out_file.close() -in_file.close() diff --git a/tools/build-font-bitmap.py b/tools/build-font-bitmap.py new file mode 100755 index 000000000..2adcc3dca --- /dev/null +++ b/tools/build-font-bitmap.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import argparse +import os +from PIL import Image, ImageDraw, ImageFont +from charset import get_chars, special_chars, extra_chars + + +class FontBitmap: + def __init__(self, chars, font_size, font_name, cn_font_name, foreground, background): + self.chars = chars + self.font_size = font_size + self.foreground = foreground + self.background = background + + self.font, self.font_offset = self.load_font(font_name) + self.cn_font, self.cn_font_offset = self.load_font(cn_font_name) + self.extra_bitmap = self.load_extra_bitmap() + + def load_extra_bitmap(self): + try: + extra_filename = 'fonts/extra_%dpx.png' % self.font_size + extra_image = Image.open(extra_filename) + return extra_image.convert('RGB') + except IOError: + return None + + def load_font(self, font_name): + # print(font_name) + font_name, font_offset = font_name.split(":") + for ext in (".ttf", ".otf"): + path = 'fonts/' + font_name + ext + if os.path.exists(path): + return ImageFont.truetype(path, self.font_size), int(font_offset) + + def get_char_width(self, c): + if c in extra_chars: + if self.extra_bitmap: + # Extra characters 16px + # if fontsize == 16: + if extra_chars.index(c) < 9: + return 13 + else: + return 15 + else: + return 0 + elif c == " ": + return 4 + elif c in special_chars["cn"]: + w, h = self.cn_font.getsize(c) + return w + 1 + else: + w, h = self.font.getsize(c) + return w + 1 + + def get_width(self): + width = 0 + for c in self.chars: + width += self.get_char_width(c) + return width + + def generate(self, filename, generate_coords_file=True): + coords = [self.font_size + 4] + width = self.get_width() + image = Image.new('RGB', (width, self.font_size + 4), self.background) + draw = ImageDraw.Draw(image) + + width = 0 + for c in self.chars: + coords.append(width) + + if c in extra_chars: + if self.extra_bitmap and c == extra_chars[0]: + if self.font_size == 16: + offset = 1 + else: + offset = self.font_size % 2 + image.paste(self.extra_bitmap.copy(), (width, offset)) + elif c == " ": + pass + elif c in special_chars["cn"]: + draw.text((width + 1, self.cn_font_offset), c, fill=self.foreground, font=self.cn_font) + else: + draw.text((width + 1, self.font_offset), c, fill=self.foreground, font=self.font) + + width += self.get_char_width(c) + + coords.append(width) + + image.save(filename + ".png") + if generate_coords_file: + with open(filename + ".specs", "w") as f: + f.write(",".join(str(tmp) for tmp in coords)) + + +def main(): + parser = argparse.ArgumentParser(description="Builder for OpenTX font files") + parser.add_argument('--output', help="Output file name") + parser.add_argument('--subset', help="Subset", default="all") + parser.add_argument('--size', type=int, help="Font size") + parser.add_argument('--font', help="Font name") + parser.add_argument('--cn-font', help="Chinese font name") + args = parser.parse_args() + + font = FontBitmap(get_chars(args.subset), args.size, args.font, args.cn_font, (0, 0, 0), (255, 255, 255)) + font.generate(args.output) + + +if __name__ == "__main__": + main() diff --git a/tools/charset.py b/tools/charset.py new file mode 100644 index 000000000..eda770294 --- /dev/null +++ b/tools/charset.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# used ? Δ~\n\t + +import os + +standard_chars = "!#$%&'()*+,-./0123456789:;<=>?°ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz~|≥" + +extra_chars = "".join([chr(0x10000+i) for i in range(21)]) + + +def chinese_chars(): + charset = set() + tools_path = os.path.dirname(os.path.realpath(__file__)) + with open(os.path.join(tools_path, "../radio/src/translations/cn.h.txt")) as f: + data = f.read() + for c in data: + if 0x4E00 <= ord(c) <= 0x9FFF: + charset.add(c) + # print(ord(c)) + result = list(charset) + result.sort() + return result + + +special_chars = { + "en": "", + "fr": "éèàîç", + "de": "ÄäÖöÜüß", + "cz": "ěščřžýáíéňóůúďťĚŠČŘŽÝÁÍÉŇÓÚŮĎŤ", + "nl": "", + "es": "Ññ", + "fi": "åäöÅÄÖ", + "it": "àù", + "pl": "ąćęłńóśżźĄĆĘŁŃÓŚŻŹ", + "pt": "ÁáÂâÃãÀàÇçÉéÊêÍíÓóÔôÕõÚú", + "se": "åäöÅÄÖ", + "cn": "".join(chinese_chars()) +} + +subset_lowercase = { + "Č": "č", + "Ě": "ě", + "Š": "š", + "Ú": "ú", + "Ů": "ů", + "Ž": "ž" +} + +# print("CN charset: %d symbols" % len(special_chars["cn"])) + + +def get_chars(subset): + result = standard_chars + extra_chars + if subset == "all": + for key, chars in special_chars.items(): + result += "".join([char for char in chars if char not in result]) + else: + if subset in special_chars: + result += "".join([char for char in special_chars[subset] if char not in subset_lowercase]) + return result + + +def get_chars_encoding(subset): + result = {} + if subset == "all": + chars = get_chars(subset) + for char in chars: + if char in special_chars["cn"]: + index = special_chars["cn"].index(char) + 1 + if index >= 0x100: + index += 1 + result[char] = "\\%03o\\%03o" % (0xFE + ((index >> 8) & 0x01), index & 0xFF) + elif char not in standard_chars and char not in extra_chars: + result[char] = "\\%03o" % (0xC0 + chars.index(char) - len(standard_chars)) + else: + offset = 128 - len(standard_chars) + chars = get_chars(subset) + for char in chars: + if char not in standard_chars: + result[char] = "\\%03o" % (offset + chars.index(char)) + for upper, lower in subset_lowercase.items(): + if lower in result: + result[upper] = result[lower] + return result diff --git a/tools/encode-translation.py b/tools/encode-translation.py new file mode 100755 index 000000000..10282afa3 --- /dev/null +++ b/tools/encode-translation.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import argparse +import codecs +import sys +from charset import special_chars, get_chars_encoding + + +def main(): + parser = argparse.ArgumentParser(description='Encoder for OpenTX translations') + parser.add_argument('input', action="store", help="Input file name") + parser.add_argument('output', action="store", help="Output file name") + parser.add_argument('language', action="store", help="Two letter language identifier", default=None) + parser.add_argument("--reverse", help="Reversed char conversion (from number to char)", action="store_true") + args = parser.parse_args() + + if args.language != "all" and args.language not in special_chars: + parser.error(args.language + ' is not a supported language. Try one of the supported ones: %s' % list(special_chars.keys())) + sys.exit() + + # if args.reverse: + # for translation in special_chars: + # translations[translation] = [(after, before) for (before, after) in translations[translation]] + + # Read the input file into a buffer + in_file = codecs.open(args.input, "r", "utf-8") + + # Write the result to a temporary file + out_file = codecs.open(args.output, 'w', 'utf-8') + + for line in in_file.readlines(): + # Do the special chars replacements + for before, after in get_chars_encoding(args.language).items(): + line = line.replace(before, after) + if line.startswith("#define ZSTR_"): + before = line[32:-2] + after = "" + for c in before: + if ord('A') <= ord(c) <= ord('Z'): + c = "\\%03o" % (ord(c) - ord('A') + 1) + elif ord('a') <= ord(c) <= ord('z'): + c = "\\%03o" % (-ord(c) + ord('a') + 255) + elif ord('0') <= ord(c) <= ord('9'): + c = "\\%03o" % (ord(c) - ord('0') + 27) + after = after + c + line = line[:32] + after + line[-2:] + out_file.write(line) + + out_file.close() + in_file.close() + + +if __name__ == "__main__": + main() diff --git a/tools/nightly23/build-nightly.sh b/tools/nightly23/build-nightly.sh deleted file mode 100755 index 391f468ac..000000000 --- a/tools/nightly23/build-nightly.sh +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/bash - -set -e - -branch=2.3.0 -docker=nightly23 -workdir=/home/opentx/nightly23 -output=/var/www/html/2.3/nightlies -version=2.3.0 - -echo "Increment nightly index" -index=`cat index.txt` -index=`expr $index + 1` -suffix="N$index" - -cd ${workdir} - -echo "Create on-demand build environment" -cp code/radio/util/Dockerfile . -docker build -t new-${docker} --build-arg OPENTX_VERSION_SUFFIX=${suffix} . -docker rmi -f ${docker} || true -docker tag new-${docker} ${docker} -docker rmi -f new-${docker} - -echo "Call sdcard generation" -code/tools/nightly23/build-sdcard.sh - -echo "Delete companion container in case of previous failed atempt" -if [ "$(docker ps -aq -f name=companion)" ]; then - docker rm --force companion -fi - -echo "Build firmware stamps" -docker run -dit --name companion -v /home/opentx/${docker}:/opentx ${docker} -docker exec companion sh -c "mkdir -p build && cd build && cmake /opentx/code && cp radio/src/stamp.h /opentx/binaries/stamp-opentx.txt" -cp -f ${workdir}/binaries/stamp-opentx.txt ${output}/firmware -# These radios are currently not enabled -# echo "#define BLOCK \"x10,x12s\"" >> ${output}/firmware/stamp-opentx.txt -echo "#define ERROR \"MOVE_TO_RC\"" >> ${output}/firmware/stamp-opentx.txt -docker exec companion rm -rf build - -echo "Check if Linux companion is needed" -if [ ! -f ${output}/companion/linux/companion23_${version}${suffix}_amd64.deb ]; then - echo "Build Linux companion" - docker exec companion /opentx/code/tools/build-companion-nightly.sh /opentx/code /opentx/binaries/ ${suffix} - cp -f binaries/*.deb ${output}/companion/linux/companion23_${version}${suffix}_amd64.deb -fi -docker stop companion -docker rm companion - -echo "Check if Windows companion is needed" -if [ ! -f ${output}/companion/windows/companion-windows-${version}${suffix}.exe ]; then - echo "Build Windows companion" - cd ${output}/companion/windows - wget --tries=1 --read-timeout=6000 -O- http://winbox.open-tx.org/companion-builds/compile23.php?branch=$branch\&suffix=${suffix} - wget -O companion-windows-${version}${suffix}.exe http://winbox.open-tx.org/companion-builds/companion-windows-${version}${suffix}.exe - chmod -Rf g+w companion-windows-${version}${suffix}.exe -fi - -echo "Check if Macosc companion is needed" -if [ ! -f ${output}/companion/macosx/opentx-companion-${version}${suffix}.dmg ]; then - echo "Build Macosx companion" - cd ${output}/companion/macosx - wget --tries=1 -qO- http://opentx.blinkt.de:8080/~opentx/build-opentx.py?branch=${branch}\&suffix=${suffix} - wget -O opentx-companion-${version}${suffix}.dmg http://opentx.blinkt.de:8080/~opentx/builds/opentx-companion-${version}${suffix}.dmg - chmod -Rf g+w opentx-companion-${version}${suffix}.dmg -fi - -echo "Update Companion stamps" -echo "#define VERSION \"${version}${suffix}\"" > ${output}/companion/companion-windows.stamp -cp -f ${output}/companion/companion-windows.stamp ${output}/companion/companion-linux.stamp -cp -f ${output}/companion/companion-windows.stamp ${output}/companion/companion-macosx.stamp - -echo "Clean binaries It will be hosting built on demand firmware" -rm -rf ${workdir}/binaries/* -rm -rf ${workdir}/binaries/.lock - -echo "Release $index successfully completed" -echo $index > ${workdir}/index.txt diff --git a/tools/nightly23/build-sdcard.sh b/tools/nightly23/build-sdcard.sh deleted file mode 100755 index a294794d1..000000000 --- a/tools/nightly23/build-sdcard.sh +++ /dev/null @@ -1,76 +0,0 @@ -#!/bin/bash - -set -e -set -x - -workdir=/home/opentx/nightly23 -output=/var/www/html/2.3/nightlies - -# Handle opentx.sdcard.version -sdcard_version="2.3V"$(grep 'set(SDCARD_REVISION' ${workdir}/code/CMakeLists.txt | grep -o '".*"' | sed 's/"//g') -echo ${sdcard_version} > ${workdir}/code/radio/sdcard/horus/opentx.sdcard.version -echo ${sdcard_version} > ${workdir}/code/radio/sdcard/taranis-x9/opentx.sdcard.version -echo ${sdcard_version} > ${workdir}/code/radio/sdcard/taranis-x7/opentx.sdcard.version - -if cmp --silent ${workdir}/code/radio/sdcard/horus/opentx.sdcard.version ${workdir}/opentx.sdcard.version -then - exit -else - cd ${workdir} - - # Copy git sdcard data - rm -Rf ${workdir}/sdcard - cp -r ${workdir}/code/radio/sdcard . - - # Get images for Horus - mkdir -p ${workdir}/sdcard/horus/IMAGES - cp /home/opentx/horus-bitmaps/* ${workdir}/sdcard/horus/IMAGES/ - - - # Request sound pack generation - if [[ ! -d /tmp/SOUNDS/fr ]];then - ${workdir}/code/tools/nightly23/tts.py en csv files - fi - if [[ ! -d /tmp/SOUNDS/es ]];then - ${workdir}/code/tools/nightly23/tts.py fr csv files - fi - if [[ ! -d /tmp/SOUNDS/it ]];then - ${workdir}/code/tools/nightly23/tts.py es csv files - fi - if [[ ! -d /tmp/SOUNDS/de ]];then - ${workdir}/code/tools/nightly23/tts.py it csv files - fi - if [[ ! -d /tmp/SOUNDS/cz ]];then - ${workdir}/code/tools/nightly23/tts.py de csv files - fi - if [[ ! -d /tmp/SOUNDS/pl ]];then - ${workdir}/code/tools/nightly23/tts.py cz csv files - fi - if [[ ! -d /tmp/SOUNDS/ru ]];then - ${workdir}/code/tools/nightly23/tts.py pt csv files - fi - ${workdir}/code/tools/nightly23/tts.py ru csv psv files - - # Create sdcards.zips for supported platforms - mv /tmp/SOUNDS ${workdir}/sdcard/horus/ - mkdir ${workdir}/sdcard/taranis-x9/SOUNDS - mkdir ${workdir}/sdcard/taranis-x7/SOUNDS - cp -r ${workdir}/sdcard/horus/SOUNDS ${workdir}/sdcard/taranis-x9/ - cp -r ${workdir}/sdcard/horus/SOUNDS ${workdir}/sdcard/taranis-x7/ - cd ${workdir}/sdcard/horus && zip -r ${output}/sdcard/sdcard-horus-${sdcard_version}.zip * - cd ${workdir}/sdcard/taranis-x9 && zip -r ${output}/sdcard/sdcard-taranis-x9-${sdcard_version}.zip * - cd ${workdir}/sdcard/taranis-x7 && zip -r ${output}/sdcard/sdcard-taranis-x7-${sdcard_version}.zip * - - # Create symlinks for other radios - ln -s ${output}/sdcard/sdcard-taranis-x7-${sdcard_version}.zip ${output}/sdcard/sdcard-taranis-xlite-${sdcard_version}.zip - ln -s ${output}/sdcard/sdcard-taranis-x7-${sdcard_version}.zip ${output}/sdcard/sdcard-taranis-x9lite-${sdcard_version}.zip - ln -s ${output}/sdcard/sdcard-taranis-x7-${sdcard_version}.zip ${output}/sdcard/sdcard-jumper-t12-${sdcard_version}.zip - - # remove LUA stuff for 9x platform - rm -Rf ${workdir}/sdcard/taranis-x7/SCRIPTS - rm -Rf ${workdir}/sdcard/taranis-x7/FrSky-utilities - cd ${workdir}/sdcard/taranis-x7 && zip -r ${output}/sdcard/sdcard-9xarm-${sdcard_version}.zip * - - rm -Rf ${workdir}/sdcard - cp -r ${workdir}/code/radio/sdcard/horus/opentx.sdcard.version ${workdir} -fi diff --git a/tools/nightly23/build-sdcard.sh.winbox b/tools/nightly23/build-sdcard.sh.winbox deleted file mode 100755 index 971d247ca..000000000 --- a/tools/nightly23/build-sdcard.sh.winbox +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/bash - -set -e - -branch=2.3 -workdir=/home/opentx/nightly23 -output=/var/www/html/2.3/nightly - -cd ${workdir} - -# Copy git sdcard data -rm -Rf ${workdir}/sdcard -cp -r ${workdir}/code/radio/sdcard . - -# Get images for Horus -mkdir -p ${workdir}/sdcard/horus/IMAGES -cp /home/opentx/horus-bitmaps/* ${workdir}/sdcard/horus/IMAGES/ - -# Request sound pack generation -wget -qO- http://winbox.open-tx.org/voice-builds/compile23.php?branch=${branch} - -# Get sounds -cd sdcard -wget http://winbox.open-tx.org/voice-builds/english-irish-taranis.zip -wget http://winbox.open-tx.org/voice-builds/english-scottish-taranis.zip -wget http://winbox.open-tx.org/voice-builds/english-american-taranis.zip -wget http://winbox.open-tx.org/voice-builds/english-australian-taranis.zip -wget http://winbox.open-tx.org/voice-builds/french-taranis.zip - -# Prepare the sdcard zip files for Horus -unzip english-irish-taranis.zip -d ${workdir}/sdcard/horus -mv ${workdir}/sdcard/horus/SOUNDS/en ${workdir}/sdcard/horus/SOUNDS/en-irish -unzip english-scottish-taranis.zip -d ${workdir}/sdcard/horus -mv ${workdir}/sdcard/horus/SOUNDS/en ${workdir}/sdcard/horus/SOUNDS/en-scottish -unzip english-australian-taranis.zip -d ${workdir}/sdcard/horus -mv ${workdir}/sdcard/horus/SOUNDS/en ${workdir}/sdcard/horus/SOUNDS/en-australian -unzip english-american-taranis -d ${workdir}/sdcard/horus -unzip french-taranis.zip -d ${workdir}/sdcard/horus -wget -O ${workdir}/sdcard/horus/SOUNDS/en/english.csv http://winbox.open-tx.org/voice-builds/english-american-taranis.csv -wget -O ${workdir}/sdcard/horus/SOUNDS/fr/french.csv http://winbox.open-tx.org/voice-builds/french-taranis.csv - -# Duplicate for Taranis and create sdcards.zip -mkdir ${workdir}/sdcard/taranis/SOUNDS -cp -r ${workdir}/sdcard/horus/SOUNDS ${workdir}/sdcard/taranis/ -rm -f ${workdir}/sdcard/*.zip -cd ${workdir}/sdcard/taranis && zip -r ${output}/sdcard/sdcard-taranis.zip * -cd ${workdir}/sdcard/horus && zip -r ${output}/sdcard/sdcard-horus.zip * -rm -Rf ${workdir}/sdcard diff --git a/tools/nightly23/tts.py b/tools/nightly23/tts.py deleted file mode 100755 index 0f42804d5..000000000 --- a/tools/nightly23/tts.py +++ /dev/null @@ -1,154 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - - -# This script is a modified version to support Linux TTS file generation using PicoTTS - -# Sound pack maintainers (incomplete list) by language alphabetical order -# Czech : Martin Hotar -# French : Bertrand Songis & André Bernet -# English : Rob Thompson & Martin Hotar -# German : Romolo Manfredini (Some corrections by Peer) -# Italian : Romolo Manfredini -# Portuguese : Romolo Manfredini -# Spanish : Romolo Manfredini (With the help of Jose Moreno) - -# from __future__ import print_function - -import os -import sys -import subprocess -import zipfile -from gtts import gTTS -from tts_common import * - - -board = "taranis" - -reload(sys) -sys.setdefaultencoding('utf8') - -SOURCE_DIRECTORY = os.path.dirname(os.path.realpath(__file__)) -lib_path = os.path.abspath(os.path.join(SOURCE_DIRECTORY, '..', '..', 'radio', 'util')) -sys.path.append(lib_path) - -def generate(str, filename): - if 0: - output = "output.wav" - command = 'pico2wave -l=%s -w=%s "%s"' % (voice, output, str) - os.system(command.encode('utf-8')) - command = "sox %s -r 32000 %s reverse silence 1 0.1 0.1%% reverse" % (output, filename) - os.system(command.encode('utf-8')) - else: - output = u"output.mp3" - tts = gTTS(text=str, lang=voice[:2]) - tts.save(output) - command = "sox --norm %s -r 32000 %s tempo 1.2" % (output, filename) - os.system(command.encode('utf-8')) - command = "rm -f output.mp3" - os.system(command.encode('utf-8')) - -################################################################ - -if __name__ == "__main__": - if "en" in sys.argv: - from tts_en import systemSounds, sounds - - directory = "en" - voice = "en-US" - - elif "fr" in sys.argv: - from tts_fr import systemSounds, sounds - - directory = "fr" - voice = "fr-FR" - - elif "it" in sys.argv: - from tts_it import systemSounds, sounds - - directory = "it" - voice = "it-IT" - - elif "de" in sys.argv: - from tts_de import systemSounds, sounds - - directory = "de" - voice = "de-DE" - - elif "es" in sys.argv: - from tts_es import systemSounds, sounds - - directory = "es" - voice = "es-ES" - - elif "cz" in sys.argv: - from tts_cz import systemSounds, sounds - - directory = "cz" - voice = "cs-CZ" - - elif "ru" in sys.argv: - from tts_ru import systemSounds, sounds - - directory = "ru" - voice = "ru-RU" - - elif "pt" in sys.argv: - from tts_pt import systemSounds, sounds - - directory = "pt" - voice = "pt-PT" - - else: - print("which language?") - exit() - - if "csv" in sys.argv: - path = "/tmp/SOUNDS/" + directory + "/SYSTEM/" - if not os.path.exists(path): - os.makedirs(path) - os.chdir(path) - with open("%s-%s.csv" % (voice, board), "wb") as csvFile: - for s, f in systemSounds: - if s and f: - l = u"" - if board in ("sky9x", "taranis"): - l += u"SOUNDS/%s/SYSTEM;" % directory - l += f + u";" + s + u"\n" - csvFile.write(l.encode("utf-8")) - for s, f in sounds: - if s and f: - l = u"" - if board in ("sky9x", "taranis"): - l += u"SOUNDS/%s;" % directory - l += f + u";" + s + u"\n" - csvFile.write(l.encode("utf-8")) - - if "psv" in sys.argv: - path = "/tmp/SOUNDS/" + directory + "/" - if not os.path.exists(path): - os.makedirs(path) - os.chdir(path) - with open("%s-%s.psv" % (voice, board), "wb") as csvFile: - for s, f in systemSounds: - if s and f: - l = u"SYSTEM|" + f.replace(".wav", "") + u"|" + s + u"\r\n" - csvFile.write(l.encode("windows-1251")) - for s, f in sounds: - if s and f: - l = u"|" + f.replace(".wav", "") + u"|" + s + u"\r\n" - csvFile.write(l.encode("windows-1251")) - - - if "files" in sys.argv: - path = "/tmp/SOUNDS/" + directory + "/SYSTEM/" - if not os.path.exists(path): - os.makedirs(path) - os.chdir(path) - for s, f in systemSounds: - if s and f: - generate(s, f) - os.chdir("..") - for s, f in sounds: - if s and f: - generate(s, f) diff --git a/tools/nightly23/tts_common.py b/tools/nightly23/tts_common.py deleted file mode 100644 index b38eb8efa..000000000 --- a/tools/nightly23/tts_common.py +++ /dev/null @@ -1,19 +0,0 @@ -NO_ALTERNATE = 1024 -PROMPT_CUSTOM_BASE = 256 -PROMPT_SYSTEM_BASE = 0 -board = "taranis" - -import sys - -def filename(idx, alternate=0): - ext = ".wav" - if isinstance(idx, int): - result = "%04d%s" % (idx, ext) - elif board in ('sky9x', 'taranis'): - result = idx + ext - return result - - - - - diff --git a/tools/rc23/build-rc.sh b/tools/rc23/build-rc.sh deleted file mode 100755 index e3012b298..000000000 --- a/tools/rc23/build-rc.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/bash - -set -e - -branch=2.3.0 -docker=rc23 -workdir=/home/opentx/rc23 -output=/var/www/html/2.3/rc -version=2.3.0 - -# Increment RC index -index=`cat index.txt` -index=`expr $index + 1` -suffix="RC$index" - -cd ${workdir} - -# Create on-demand build environment -cp code/radio/util/Dockerfile . -docker build -t new-${docker} --build-arg OPENTX_VERSION_SUFFIX=${suffix} . -set +e -docker rmi -f ${docker} -set -e -docker tag new-${docker} ${docker} -docker rmi -f new-${docker} - -# Call sdcard generation -code/tools/rc23/build-sdcard.sh - -# Build Linux companion -docker run -dit --name companion -v /home/opentx/${docker}:/opentx ${docker} -docker exec companion sh -c "mkdir -p build && cd build && cmake /opentx/code && cp radio/src/stamp.h /opentx/binaries/stamp-opentx.txt" -docker exec companion rm -rf build -if [ ! -f ${output}/companion/linux/companion23_${version}${suffix}_amd64.deb ]; then - docker exec companion /opentx/code/tools/build-companion-release.sh /opentx/code /opentx/binaries/ - docker exec companion sh -c "cp /build/radio/src/lua/*.txt /opentx/binaries" - cp -f binaries/*.deb ${output}/companion/linux/companion23_${version}${suffix}_amd64.deb - cp -f binaries/lua_fields_*.txt ${output}/firmware -fi -docker stop companion -docker rm companion - -# Request companion compilation on Windows -if [ ! -f ${output}/companion/windows/companion-windows-${version}${suffix}.exe ]; then - cd ${output}/companion/windows - wget -qO- http://winbox.open-tx.org/companion-builds/compile23.php?branch=$branch\&suffix=${suffix} - wget -O companion-windows-${version}${suffix}.exe http://winbox.open-tx.org/companion-builds/companion-windows-${version}${suffix}.exe - chmod -Rf g+w companion-windows-${version}${suffix}.exe -fi - -# Request companion compilation on Mac OS X -if [ ! -f ${output}/companion/macosx/opentx-companion-${version}${suffix}.dmg ]; then - cd ${output}/companion/macosx - wget -qO- http://opentx.blinkt.de:8080/~opentx/build-opentx.py?branch=${branch}\&suffix=${suffix} - wget -O opentx-companion-${version}${suffix}.dmg http://opentx.blinkt.de:8080/~opentx/builds/opentx-companion-${version}${suffix}.dmg - chmod -Rf g+w opentx-companion-${version}${suffix}.dmg -fi - -# Update stamps -cp -f $workdir/binaries/stamp-opentx.txt ${output}/firmware -echo "#define VERSION \"${version}${suffix}\"" > ${output}/companion/companion-windows.stamp -cp -f ${output}/companion/companion-windows.stamp ${output}/companion/companion-macosx.stamp -cp -f ${output}/companion/companion-windows.stamp ${output}/companion/companion-linux.stamp - - -# Clean binaries It will be hosting built on demand firmware -rm -rf $workdir/binaries/* -rm -rf $workdir/binaries/.lock - -# RC is considered as valid ony if we get to that point -echo $index > ${workdir}/index.txt diff --git a/tools/rc23/build-sdcard.sh b/tools/rc23/build-sdcard.sh deleted file mode 100755 index 6dbeded39..000000000 --- a/tools/rc23/build-sdcard.sh +++ /dev/null @@ -1,77 +0,0 @@ -#!/bin/bash - -set -e -set -x - -workdir=/home/opentx/rc23 -output=/var/www/html/2.3/rc - -# Handle opentx.sdcard.version -sdcard_version="2.3V"$(grep 'set(SDCARD_REVISION' ${workdir}/code/CMakeLists.txt | grep -o '".*"' | sed 's/"//g') -echo ${sdcard_version} > ${workdir}/code/radio/sdcard/horus/opentx.sdcard.version -echo ${sdcard_version} > ${workdir}/code/radio/sdcard/taranis-x9/opentx.sdcard.version -echo ${sdcard_version} > ${workdir}/code/radio/sdcard/taranis-x7/opentx.sdcard.version - - -if cmp --silent ${workdir}/code/radio/sdcard/horus/opentx.sdcard.version ${workdir}/opentx.sdcard.version -then - exit -else - cd ${workdir} - - # Copy git sdcard data - rm -Rf ${workdir}/sdcard - cp -r ${workdir}/code/radio/sdcard . - - # Get images for Horus - mkdir -p ${workdir}/sdcard/horus/IMAGES - cp /home/opentx/horus-bitmaps/* ${workdir}/sdcard/horus/IMAGES/ - - - # Request sound pack generation - if [[ ! -d /tmp/SOUNDS/fr ]];then - ${workdir}/code/tools/rc23/tts.py en csv files - fi - if [[ ! -d /tmp/SOUNDS/es ]];then - ${workdir}/code/tools/rc23/tts.py fr csv files - fi - if [[ ! -d /tmp/SOUNDS/it ]];then - ${workdir}/code/tools/rc23/tts.py es csv files - fi - if [[ ! -d /tmp/SOUNDS/de ]];then - ${workdir}/code/tools/rc23/tts.py it csv files - fi - if [[ ! -d /tmp/SOUNDS/cz ]];then - ${workdir}/code/tools/rc23/tts.py de csv files - fi - if [[ ! -d /tmp/SOUNDS/pl ]];then - ${workdir}/code/tools/rc23/tts.py cz csv files - fi - if [[ ! -d /tmp/SOUNDS/ru ]];then - ${workdir}/code/tools/rc23/tts.py pt csv files - fi - ${workdir}/code/tools/rc23/tts.py ru csv psv files - - # Create sdcards.zips for supported platforms - mv /tmp/SOUNDS ${workdir}/sdcard/horus/ - mkdir ${workdir}/sdcard/taranis-x9/SOUNDS - mkdir ${workdir}/sdcard/taranis-x7/SOUNDS - cp -r ${workdir}/sdcard/horus/SOUNDS ${workdir}/sdcard/taranis-x9/ - cp -r ${workdir}/sdcard/horus/SOUNDS ${workdir}/sdcard/taranis-x7/ - cd ${workdir}/sdcard/horus && zip -r ${output}/sdcard/sdcard-horus-${sdcard_version}.zip * - cd ${workdir}/sdcard/taranis-x9 && zip -r ${output}/sdcard/sdcard-taranis-x9-${sdcard_version}.zip * - cd ${workdir}/sdcard/taranis-x7 && zip -r ${output}/sdcard/sdcard-taranis-x7-${sdcard_version}.zip * - - # Create symlinks for other radios - ln -s ${output}/sdcard/sdcard-taranis-x7-${sdcard_version}.zip ${output}/sdcard/sdcard-taranis-xlite-${sdcard_version}.zip - ln -s ${output}/sdcard/sdcard-taranis-x7-${sdcard_version}.zip ${output}/sdcard/sdcard-taranis-x9lite-${sdcard_version}.zip - ln -s ${output}/sdcard/sdcard-taranis-x7-${sdcard_version}.zip ${output}/sdcard/sdcard-jumper-t12-${sdcard_version}.zip - - # remove LUA stuff for 9x platform - rm -Rf ${workdir}/sdcard/taranis-x7/SCRIPTS - rm -Rf ${workdir}/sdcard/taranis-x7/FrSky-utilities - cd ${workdir}/sdcard/taranis-x7 && zip -r ${output}/sdcard/sdcard-9xarm-${sdcard_version}.zip * - - rm -Rf ${workdir}/sdcard - cp -r ${workdir}/code/radio/sdcard/horus/opentx.sdcard.version ${workdir} -fi diff --git a/tools/rc23/tts.py b/tools/rc23/tts.py deleted file mode 100755 index fc42cfeb6..000000000 --- a/tools/rc23/tts.py +++ /dev/null @@ -1,152 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - - -# This script is a modified version to support Linux TTS fiel genration using PicoTTS - -# Sound pack maintainers (incomplete list) by language alphabetical order -# Czech : Martin Hotar -# French : Bertrand Songis & André Bernet -# English : Rob Thompson & Martin Hotar -# German : Romolo Manfredini (Some corrections by Peer) -# Italian : Romolo Manfredini -# Portuguese : Romolo Manfredini -# Spanish : Romolo Manfredini (With the help of Jose Moreno) - -# from __future__ import print_function - -import os -import sys -import subprocess -import zipfile -from gtts import gTTS -from tts_common import * -board = "taranis" - -reload(sys) -sys.setdefaultencoding('utf8') - -SOURCE_DIRECTORY = os.path.dirname(os.path.realpath(__file__)) -lib_path = os.path.abspath(os.path.join(SOURCE_DIRECTORY, '..', '..', 'radio', 'util')) -sys.path.append(lib_path) - -def generate(str, filename): - if 0: - output = "output.wav" - command = 'pico2wave -l=%s -w=%s "%s"' % (voice, output, str) - os.system(command.encode('utf-8')) - command = "sox %s -r 32000 %s reverse silence 1 0.1 0.1%% reverse" % (output, filename) - os.system(command.encode('utf-8')) - else: - output = u"output.mp3" - tts = gTTS(text=str, lang=voice[:2]) - tts.save(output) - command = "sox --norm %s -r 32000 %s tempo 1.2" % (output, filename) - os.system(command.encode('utf-8')) - command = "rm -f output.mp3" - os.system(command.encode('utf-8')) - -################################################################ - -if __name__ == "__main__": - if "en" in sys.argv: - from tts_en import systemSounds, sounds - - directory = "en" - voice = "en-US" - - elif "fr" in sys.argv: - from tts_fr import systemSounds, sounds - - directory = "fr" - voice = "fr-FR" - - elif "it" in sys.argv: - from tts_it import systemSounds, sounds - - directory = "it" - voice = "it-IT" - - elif "de" in sys.argv: - from tts_de import systemSounds, sounds - - directory = "de" - voice = "de-DE" - - elif "es" in sys.argv: - from tts_es import systemSounds, sounds - - directory = "es" - voice = "es-ES" - - elif "cz" in sys.argv: - from tts_cz import systemSounds, sounds - - directory = "cz" - voice = "cs-CZ" - - elif "ru" in sys.argv: - from tts_ru import systemSounds, sounds - - directory = "ru" - voice = "ru-RU" - - elif "pt" in sys.argv: - from tts_pt import systemSounds, sounds - - directory = "pt" - voice = "pt-PT" - - else: - print("which language?") - exit() - - if "csv" in sys.argv: - path = "/tmp/SOUNDS/" + directory + "/SYSTEM/" - if not os.path.exists(path): - os.makedirs(path) - os.chdir(path) - with open("%s-%s.csv" % (voice, board), "wb") as csvFile: - for s, f in systemSounds: - if s and f: - l = u"" - if board in ("sky9x", "taranis"): - l += u"SOUNDS/%s/SYSTEM;" % directory - l += f + u";" + s + u"\n" - csvFile.write(l.encode("utf-8")) - for s, f in sounds: - if s and f: - l = u"" - if board in ("sky9x", "taranis"): - l += u"SOUNDS/%s;" % directory - l += f + u";" + s + u"\n" - csvFile.write(l.encode("utf-8")) - - if "psv" in sys.argv: - path = "/tmp/SOUNDS/" + directory + "/" - if not os.path.exists(path): - os.makedirs(path) - os.chdir(path) - with open("%s-%s.psv" % (voice, board), "wb") as csvFile: - for s, f in systemSounds: - if s and f: - l = u"SYSTEM|" + f.replace(".wav", "") + u"|" + s + u"\r\n" - csvFile.write(l.encode("windows-1251")) - for s, f in sounds: - if s and f: - l = u"|" + f.replace(".wav", "") + u"|" + s + u"\r\n" - csvFile.write(l.encode("windows-1251")) - - - if "files" in sys.argv: - path = "/tmp/SOUNDS/" + directory + "/SYSTEM/" - if not os.path.exists(path): - os.makedirs(path) - os.chdir(path) - for s, f in systemSounds: - if s and f: - generate(s, f) - os.chdir("..") - for s, f in sounds: - if s and f: - generate(s, f) diff --git a/tools/rc23/tts_common.py b/tools/rc23/tts_common.py deleted file mode 100644 index 25623b005..000000000 --- a/tools/rc23/tts_common.py +++ /dev/null @@ -1,14 +0,0 @@ -NO_ALTERNATE = 1024 -PROMPT_CUSTOM_BASE = 256 -PROMPT_SYSTEM_BASE = 0 -board = "taranis" - -import sys - -def filename(idx, alternate=0): - ext = ".wav" - if isinstance(idx, int): - result = "%04d%s" % (idx, ext) - elif board in ('sky9x', 'taranis'): - result = idx + ext - return result