diff --git a/.github/workflows/build_android_signed.yml b/.github/workflows/build_android_signed.yml index 7667cbe6d..ad361d7a5 100644 --- a/.github/workflows/build_android_signed.yml +++ b/.github/workflows/build_android_signed.yml @@ -38,7 +38,7 @@ jobs: steps: - name: Checkout repo - uses: actions/checkout@v3 + uses: actions/checkout@v5 with: submodules: recursive diff --git a/.github/workflows/build_android_signed_qt6.yml b/.github/workflows/build_android_signed_qt6.yml index 69f44c4a1..6db4a76ae 100644 --- a/.github/workflows/build_android_signed_qt6.yml +++ b/.github/workflows/build_android_signed_qt6.yml @@ -40,7 +40,7 @@ jobs: steps: - name: Checkout repository and submodules - uses: actions/checkout@v3 + uses: actions/checkout@v5 with: submodules: recursive @@ -110,7 +110,7 @@ jobs: run: ccache -s - name: Upload AAB artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v5 with: name: ${{ matrix.ARTIFACT }} path: ${{ runner.temp }}/shadow_build_dir/android-build/build/outputs/bundle/release/*.aab diff --git a/.github/workflows/build_android_unsigned.yml b/.github/workflows/build_android_unsigned.yml index 5543efe4f..e7454ae01 100644 --- a/.github/workflows/build_android_unsigned.yml +++ b/.github/workflows/build_android_unsigned.yml @@ -28,7 +28,7 @@ jobs: steps: - name: Checkout repo - uses: actions/checkout@v3 + uses: actions/checkout@v5 with: submodules: recursive diff --git a/.github/workflows/build_package_Rock5.yml b/.github/workflows/build_package_Rock5.yml index 208af2e22..70a9a7804 100644 --- a/.github/workflows/build_package_Rock5.yml +++ b/.github/workflows/build_package_Rock5.yml @@ -30,7 +30,7 @@ jobs: echo "BRANCH=${GITHUB_REF##*/}" >> $GITHUB_ENV - name: Checkout repository and submodules - uses: actions/checkout@v3 + uses: actions/checkout@v5 with: submodules: recursive - name: Building QOpenHD in CHROOT @@ -58,7 +58,7 @@ jobs: run: echo "artifact_name=QOpenHD-${{ env.DT }}" >> $GITHUB_ENV - name: Upload to Github - uses: 'actions/upload-artifact@v4' + uses: 'actions/upload-artifact@v5' with: name: "QOpenHD-${{ env.DT }}" path: | diff --git a/.github/workflows/build_package_rpi.yml b/.github/workflows/build_package_rpi.yml index a71e2f018..865a09c61 100644 --- a/.github/workflows/build_package_rpi.yml +++ b/.github/workflows/build_package_rpi.yml @@ -27,7 +27,7 @@ jobs: remove-haskell: 'true' overprovision-lvm: 'true' - - uses: actions/checkout@v2 + - uses: actions/checkout@v5 with: submodules: recursive @@ -55,7 +55,7 @@ jobs: ls -a - name: Upload to Github - uses: 'actions/upload-artifact@v4' + uses: 'actions/upload-artifact@v5' with: name: "QOpenHd" path: | diff --git a/.github/workflows/build_package_x86_jammy.yml b/.github/workflows/build_package_x86_jammy.yml index 35bfae12a..4cb5d58aa 100644 --- a/.github/workflows/build_package_x86_jammy.yml +++ b/.github/workflows/build_package_x86_jammy.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Checkout repository and submodules - uses: actions/checkout@v3 + uses: actions/checkout@v5 with: submodules: recursive diff --git a/.github/workflows/build_package_x86_noble.yml b/.github/workflows/build_package_x86_noble.yml index 48dc23a9e..a8422640e 100644 --- a/.github/workflows/build_package_x86_noble.yml +++ b/.github/workflows/build_package_x86_noble.yml @@ -43,7 +43,7 @@ jobs: ls -a - name: Upload to Github - uses: 'actions/upload-artifact@v4' + uses: 'actions/upload-artifact@v5' with: name: "QOpenHD" path: | diff --git a/.github/workflows/ubuntu22_build_test.yml b/.github/workflows/ubuntu22_build_test.yml index af4ead722..eef71e8a3 100644 --- a/.github/workflows/ubuntu22_build_test.yml +++ b/.github/workflows/ubuntu22_build_test.yml @@ -23,7 +23,7 @@ jobs: steps: - name: Checkout repository and submodules - uses: actions/checkout@v3 + uses: actions/checkout@v5 with: submodules: recursive diff --git a/.github/workflows/ubuntu22_build_test_qt6.yml b/.github/workflows/ubuntu22_build_test_qt6.yml index 0ade59c36..ea89c136b 100644 --- a/.github/workflows/ubuntu22_build_test_qt6.yml +++ b/.github/workflows/ubuntu22_build_test_qt6.yml @@ -22,7 +22,7 @@ jobs: steps: - name: Checkout repository and submodules - uses: actions/checkout@v3 + uses: actions/checkout@v5 with: submodules: recursive diff --git a/CMakeLists.txt b/CMakeLists.txt index bb167400e..2510b0aa6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,6 +14,7 @@ find_package(Qt6 ${X_QT_VERSION} REQUIRED COMPONENTS Core) find_package(Qt6 ${X_QT_VERSION} REQUIRED COMPONENTS Quick) find_package(Qt6 ${X_QT_VERSION} REQUIRED COMPONENTS Gui) find_package(Qt6 ${X_QT_VERSION} REQUIRED COMPONENTS Widgets) +find_package(Qt6 ${X_QT_VERSION} REQUIRED COMPONENTS LinguistTools) qt_standard_project_setup(REQUIRES ${X_QT_VERSION}) @@ -89,6 +90,27 @@ qt_add_executable(QOpenHDApp androidqt6/AndroidManifest.xml ) +# Translation files +set(QOPENHD_TS_FILES + translations/QOpenHD_en.ts + translations/QOpenHD_de.ts + translations/QOpenHD_uk.ts + translations/QOpenHD_ru.ts + translations/QOpenHD_nl.ts + translations/QOpenHD_es.ts + translations/QOpenHD_fr.ts + translations/QOpenHD_zh.ts + translations/QOpenHD_it.ts + translations/QOpenHD_ro.ts +) + +qt_add_translations(QOpenHDApp + TS_FILES ${QOPENHD_TS_FILES} + QM_FILES_OUTPUT_VARIABLE QOPENHD_QM_FILES + LUPDATE_OPTIONS -no-obsolete + LRELEASE_OPTIONS -compress +) + target_include_directories(QOpenHDApp PUBLIC app) target_include_directories(QOpenHDApp PUBLIC app/common) target_include_directories(QOpenHDApp PUBLIC app/adsb) @@ -131,6 +153,25 @@ include(lib/h264/h264.cmake) #include(app/videostreaming/gstreamer/gst_video.cmake) qt_finalize_executable(QOpenHDApp) + +# Copy generated .qm files to qml directory for qml.qrc +foreach(QM_FILE ${QOPENHD_QM_FILES}) + get_filename_component(QM_FILENAME ${QM_FILE} NAME) + add_custom_command(OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/qml/${QM_FILENAME} + COMMAND ${CMAKE_COMMAND} -E copy ${QM_FILE} ${CMAKE_CURRENT_SOURCE_DIR}/qml/${QM_FILENAME} + DEPENDS ${QM_FILE} + COMMENT "Copying ${QM_FILENAME} to qml directory for qrc inclusion" + ) + list(APPEND QM_COPY_FILES ${CMAKE_CURRENT_SOURCE_DIR}/qml/${QM_FILENAME}) +endforeach() + +add_custom_target(copy_qm_files ALL DEPENDS ${QM_COPY_FILES}) + +# Ensure generated translation files exist before processing the qml.qrc resource +if(TARGET QOpenHDApp_autogen) + add_dependencies(QOpenHDApp_autogen copy_qm_files) +endif() + #include(GNUInstallDirs) #install(TARGETS QOpenHD # BUNDLE DESTINATION . diff --git a/QOpenHD.pro b/QOpenHD.pro index b4cbbb694..a3cfb6e99 100755 --- a/QOpenHD.pro +++ b/QOpenHD.pro @@ -7,6 +7,7 @@ CONFIG += resources_big TRANSLATIONS = translations/QOpenHD_en.ts \ translations/QOpenHD_de.ts \ + translations/QOpenHD_uk.ts \ translations/QOpenHD_ru.ts \ translations/QOpenHD_nl.ts \ translations/QOpenHD_es.ts \ @@ -15,6 +16,26 @@ TRANSLATIONS = translations/QOpenHD_en.ts \ translations/QOpenHD_it.ts \ translations/QOpenHD_ro.ts +# Generate .qm files into qml/ so rcc finds the compiled translations +translation_outputs = +for(tsfile, TRANSLATIONS) { + qm_base = $$basename(tsfile) + qm_base = $$replace(qm_base, \\.ts$, ) + qm_file = $$PWD/qml/$${qm_base}.qm + ts_abs = $$PWD/$$tsfile + + qmtarget = qm_$${qm_base} + $${qmtarget}.target = $$qm_file + $${qmtarget}.commands = mkdir -p $$PWD/qml && lrelease $$ts_abs -qm $$qm_file + $${qmtarget}.depends = $$ts_abs + + QMAKE_EXTRA_TARGETS += $$qmtarget + PRE_TARGETDEPS += $$qm_file + QMAKE_CLEAN += $$qm_file + translation_outputs += $$qm_file +} + +qml/qml.qrc.depends += $$translation_outputs include(platforms.pri) @@ -246,7 +267,12 @@ AndroidBuild { message("AndroidBuild") # Text to speech crashes on android for some weird reason #CONFIG += EnableSpeech - QT += androidextras + androidextras_hdr = $$[QT_INSTALL_HEADERS]/QtAndroidExtras + exists($$androidextras_hdr) { + QT += androidextras + } else { + message("androidextras module not available, skipping") + } include(app/videostreaming/gstreamer/gst_video.pri) include(app/videostreaming/android/videostreamingandroid.pri) @@ -264,4 +290,4 @@ EnableSpeech { android{ ANDROID_PACKAGE_SOURCE_DIR = \ $$PWD/android -} +} \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle index e4a017977..66195ec8b 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -63,4 +63,13 @@ android { aaptOptions { noCompress 'rcc' } + + // Customize the generated APK name to include version and build timestamp + applicationVariants.all { variant -> + variant.outputs.all { output -> + def versionLabel = variant.versionName ?: output.versionName + def timestamp = new Date().format('yyyyMMdd_HHmmss') + outputFileName = "QOpenHD_${versionLabel}_${timestamp}.apk" + } + } } diff --git a/app/main.cpp b/app/main.cpp index e65248400..cd8eb0463 100755 --- a/app/main.cpp +++ b/app/main.cpp @@ -324,20 +324,15 @@ int main(int argc, char *argv[]) { //QLoggingCategory::setFilterRules("qt.scenegraph.general=true"); //QLoggingCategory::setFilterRules("qt.scenegraph.time.texture=true"); //QLoggingCategory::setFilterRules("qt.scenegraph.time.renderloop=true"); + //QLoggingCategory::setFilterRules("qt.scenegraph.time.*=true"); //QLoggingCategory::setFilterRules("qt.qpa.eglfs.*=true"); //QLoggingCategory::setFilterRules("qt.qpa.egl*=true"); - // From https://stackoverflow.com/questions/63473541/how-to-dynamically-toggle-vsync-in-a-qt-application-at-runtime - // Get rid of VSYNC if possible. Might / might not work. On my ubuntu nvidia & intel laptop, this at least seems to - // result in tripple buffering with unlimited fps, a bit "better" regarding latency than default. - if(settings.value("dev_set_swap_interval_zero",false).toBool()){ - qDebug()<<"Request swap interval of 0"; - QSurfaceFormat format=QSurfaceFormat::defaultFormat(); - format.setSwapInterval(0); - QSurfaceFormat::setDefaultFormat(format); - } - QApplication app(argc, argv); + + // Load translation based on saved locale (requires an active Q(Core)Application on Qt5) + QString localeStr = settings.value("locale", "en").toString(); + QOpenHD::instance().installTranslatorForLanguage(localeStr, &settings); { // This includes dpi adjustment QScreen* screen=app.primaryScreen(); if(screen){ diff --git a/app/telemetry/models/openhd_core/camera.hpp b/app/telemetry/models/openhd_core/camera.hpp index a1b313498..4d5e8db9b 100644 --- a/app/telemetry/models/openhd_core/camera.hpp +++ b/app/telemetry/models/openhd_core/camera.hpp @@ -21,837 +21,848 @@ * © OpenHD, All Rights Reserved. ******************************************************************************/ - #ifndef OPENHD_CAMERA_HPP - #define OPENHD_CAMERA_HPP - - #include - #include - #include - #include - #include - #include - - #include "platform.hpp" - +#ifndef OPENHD_CAMERA_HPP +#define OPENHD_CAMERA_HPP - /** - * NOTE: This file is copied into QOpenHD to populate the UI. - */ - - // For development, always 'works' since fully emulated in SW. - static constexpr int X_CAM_TYPE_DUMMY_SW = 0; // Dummy sw picture - // Manually feed camera data (encoded,rtp) to openhd. Bitrate control and more - // is not working in this mode, making it only valid for development and in - // extreme cases valid for users that want to use a specific ip camera. - static constexpr int X_CAM_TYPE_EXTERNAL = 2; - // For openhd, this is exactly the same as X_CAM_TYPE_EXTERNAL - only file - // start_ip_cam.txt is created Such that the ip cam service can start forwarding - // data to openhd core. - static constexpr int X_CAM_TYPE_EXTERNAL_IP = 3; - // For development, camera that reads input from a file, and then re-encodes it - // using the platform encoder - static constexpr int X_CAM_TYPE_DEVELOPMENT_FILESRC = 4; - // ... reserved for development / custom cameras - - // OpenHD supports any usb camera outputting raw video (with sw encoding). - // H264 usb cameras are not supported, since in general, they do not support - // changing bitrate/ encoding parameters. - static constexpr int X_CAM_TYPE_USB_GENERIC = 10; - // 384x292@25 cam - static constexpr int X_CAM_TYPE_USB_INFIRAY = 11; - // 256x192@25 but only 0x0@0 works (urghs) - static constexpr int X_CAM_TYPE_USB_INFIRAY_T2 = 12; - static constexpr int X_CAM_TYPE_USB_INFIRAY_X2 = 13; - static constexpr int X_CAM_TYPE_USB_INFIRAY_P2_PRO = 14; - static constexpr int X_CAM_TYPE_USB_FLIR_VUE = 15; - static constexpr int X_CAM_TYPE_USB_FLIR_BOSON = 16; - // ... reserved for future (Thermal) USB cameras - // - // RPI Specific starts here - // - // As of now, we have mmal only for the geekworm hdmi to csi adapter - static constexpr int X_CAM_TYPE_RPI_MMAL_HDMI_TO_CSI = 20; - // ... 9 reserved for future use - // ... - // RPIF stands for RPI Foundation (aka original rpi foundation cameras) - static constexpr int X_CAM_TYPE_RPI_LIBCAMERA_RPIF_V1_OV5647 = 30; - static constexpr int X_CAM_TYPE_RPI_LIBCAMERA_RPIF_V2_IMX219 = 31; - static constexpr int X_CAM_TYPE_RPI_LIBCAMERA_RPIF_V3_IMX708 = 32; - static constexpr int X_CAM_TYPE_RPI_LIBCAMERA_RPIF_HQ_IMX477 = 33; - // .... 5 reserved for future use - // Now to all the rpi libcamera arducam cameras - static constexpr int X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_SKYMASTERHDR_IMX708 = 40; - static constexpr int X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_SKYVISIONPRO_IMX519 = 41; - static constexpr int X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX477M = 42; - static constexpr int X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX462 = 43; - static constexpr int X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX327 = 44; - static constexpr int X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX290 = 45; - static constexpr int X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX462_LOWLIGHT_MINI = 46; - // ... 13 reserved for future use - static constexpr int X_CAM_TYPE_RPI_V4L2_VEYE_2MP = 60; - static constexpr int X_CAM_TYPE_RPI_V4L2_VEYE_CSIMX307 = 61; - static constexpr int X_CAM_TYPE_RPI_V4L2_VEYE_CSSC132 = 62; - static constexpr int X_CAM_TYPE_RPI_V4L2_VEYE_MVCAM = 63; - // ... 6 reserved for future use - // - // X20 Specific starts here - // - // Right now we only have one camera, but more (might) follow. - // Generic - camera(s) that don't support any IQ params or changing settings. - // For example the Foxeer cameras, or old runcam cameras - static constexpr int X_CAM_TYPE_X20_HDZERO_GENERIC = 70; - static constexpr int X_CAM_TYPE_X20_HDZERO_RUNCAM_V1 = 71; - static constexpr int X_CAM_TYPE_X20_HDZERO_RUNCAM_V2 = 72; - static constexpr int X_CAM_TYPE_X20_HDZERO_RUNCAM_V3 = 73; - static constexpr int X_CAM_TYPE_X20_HDZERO_RUNCAM_NANO_90 = 74; - static constexpr int X_CAM_TYPE_X20_OHD_Jaguar = 75; - static constexpr int X_CAM_TYPE_X21_OHD_Jaguar = 76; - - // ... 9 reserved for future use - // - // ROCK 5 starts here - // - static constexpr int X_CAM_TYPE_ROCK_5_HDMI_IN = 80; - static constexpr int X_CAM_TYPE_ROCK_5_OV5647 = 81; - static constexpr int X_CAM_TYPE_ROCK_5_IMX219 = 82; - static constexpr int X_CAM_TYPE_ROCK_5_IMX708 = 83; - static constexpr int X_CAM_TYPE_ROCK_5_IMX462 = 84; - static constexpr int X_CAM_TYPE_ROCK_5_IMX415 = 85; - static constexpr int X_CAM_TYPE_ROCK_5_IMX477 = 86; - static constexpr int X_CAM_TYPE_ROCK_5_IMX519 = 87; - static constexpr int X_CAM_TYPE_ROCK_5_OHD_Jaguar = 88; - // ROCK 3 starts here - // - static constexpr int X_CAM_TYPE_ROCK_3_HDMI_IN = 90; - static constexpr int X_CAM_TYPE_ROCK_3_OV5647 = 91; - static constexpr int X_CAM_TYPE_ROCK_3_IMX219 = 92; - static constexpr int X_CAM_TYPE_ROCK_3_IMX708 = 93; - static constexpr int X_CAM_TYPE_ROCK_3_IMX462 = 94; - static constexpr int X_CAM_TYPE_ROCK_3_IMX519 = 95; - static constexpr int X_CAM_TYPE_ROCK_3_OHD_Jaguar = 96; - static constexpr int X_CAM_TYPE_ROCK_3_VEYE = 97; - // - // NVIDIA XAVIER specific starts here - static constexpr int X_CAM_TYPE_NVIDIA_XAVIER_IMX577 = 101; - // OpenIPC specific starts here - static constexpr int X_CAM_TYPE_OPENIPC_GENERIC = 110; - // Qualcomm specific starts here - static constexpr int X_CAM_TYPE_QC_IMX577 = 120; - static constexpr int X_CAM_TYPE_QC_OV9282 = 121; - // Projects are here - static constexpr int X_CAM_TYPE_WILLY_HORNET = 122; - static constexpr int X_CAM_TYPE_WILLY_JAGUAR = 123; - static constexpr int X_CAM_TYPE_WILLY_REKINDLE = 124; - - // - // ... rest is reserved for future use - // no camera, only exists to have a default value for secondary camera (which is - // disabled by default). NOTE: The primary camera cannot be disabled ! - static constexpr int X_CAM_TYPE_DISABLED = 255; // Max for uint8_t - - static std::string x_cam_type_to_string(int camera_type) { - switch (camera_type) { - case X_CAM_TYPE_DUMMY_SW: - return "DUMMY"; - case X_CAM_TYPE_EXTERNAL: - return "EXTERNAL"; - case X_CAM_TYPE_EXTERNAL_IP: - return "EXTERNAL_IP"; - case X_CAM_TYPE_DEVELOPMENT_FILESRC: - return "DEV_FILESRC"; - case X_CAM_TYPE_USB_GENERIC: - return "USB"; - case X_CAM_TYPE_USB_INFIRAY: - return "INFIRAY"; - case X_CAM_TYPE_USB_INFIRAY_T2: - return "INFIRAY_T2"; - case X_CAM_TYPE_USB_INFIRAY_P2_PRO: - return "INFIRAY_P2_PRO"; - case X_CAM_TYPE_USB_INFIRAY_X2: - return "INFIRAY_X2"; - case X_CAM_TYPE_USB_FLIR_VUE: - return "FLIR VUE"; - case X_CAM_TYPE_USB_FLIR_BOSON: - return "FLIR BOSON"; - // All the rpi stuff begin - case X_CAM_TYPE_RPI_MMAL_HDMI_TO_CSI: - return "MMAL_HDMI"; - case X_CAM_TYPE_RPI_LIBCAMERA_RPIF_V1_OV5647: - return "RPIF_V1_OV5647"; - case X_CAM_TYPE_RPI_LIBCAMERA_RPIF_V2_IMX219: - return "RPIF_V2_IMX219"; - case X_CAM_TYPE_RPI_LIBCAMERA_RPIF_V3_IMX708: - return "RPIF_V3_IMX708"; - case X_CAM_TYPE_RPI_LIBCAMERA_RPIF_HQ_IMX477: - return "RPIF_HQ_IMX477"; - case X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_SKYMASTERHDR_IMX708: - return "ARDUCAM_SKYMASTERHDR"; - case X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_SKYVISIONPRO_IMX519: - return "ARDUCAM_SKYVISIONPRO"; - case X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX477M: - return "ARDUCAM_IMX477M"; - case X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX462: - return "ARDUCAM_IMX462"; - case X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX327: - return "ARDUCAM_IMX327"; - case X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX290: - return "ARDUCAM_IMX290"; - case X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX462_LOWLIGHT_MINI: - return "ARDUCAM_IMX462_LOWLIGHT_MINI"; - case X_CAM_TYPE_RPI_V4L2_VEYE_2MP: - return "VEYE_2MP"; - case X_CAM_TYPE_RPI_V4L2_VEYE_CSIMX307: - return "VEYE_IMX307"; - case X_CAM_TYPE_RPI_V4L2_VEYE_CSSC132: - return "VEYE_CSSC132"; - case X_CAM_TYPE_RPI_V4L2_VEYE_MVCAM: - return "VEYE_MVCAM"; - // All the x20 begin - case X_CAM_TYPE_X20_HDZERO_GENERIC: - return "X20_HDZERO_GENERIC"; - case X_CAM_TYPE_X20_HDZERO_RUNCAM_V1: - return "X20_HDZERO_RUNCAM_V1"; - case X_CAM_TYPE_X20_HDZERO_RUNCAM_V2: - return "X20_HDZERO_RUNCAM_V2"; - case X_CAM_TYPE_X20_HDZERO_RUNCAM_V3: - return "X20_HDZERO_RUNCAM_V3"; - case X_CAM_TYPE_X20_HDZERO_RUNCAM_NANO_90: - return "X20_HDZERO_RUNCAM_NANO"; - case X_CAM_TYPE_X20_OHD_Jaguar: - return "X20_OHD_Jaguar"; - case X_CAM_TYPE_X21_OHD_Jaguar: - return "X21_OHD_Jaguar"; - // All the rock begin - case X_CAM_TYPE_ROCK_5_HDMI_IN: - return "ROCK_5_HDMI_IN"; - case X_CAM_TYPE_ROCK_5_OV5647: - return "ROCK_5_OV5647"; - case X_CAM_TYPE_ROCK_5_IMX219: - return "ROCK_5_IMX219"; - case X_CAM_TYPE_ROCK_5_IMX708: - return "ROCK_5_IMX708"; - case X_CAM_TYPE_ROCK_5_IMX462: - return "ROCK_5_IMX462"; - case X_CAM_TYPE_ROCK_5_IMX415: - return "ROCK_5_IMX415"; - case X_CAM_TYPE_ROCK_5_IMX477: - return "ROCK_5_IMX415"; - case X_CAM_TYPE_ROCK_5_IMX519: - return "ROCK_5_IMX415"; - case X_CAM_TYPE_ROCK_5_OHD_Jaguar: - return "ROCK_5_OHD_Jaguar"; - case X_CAM_TYPE_ROCK_3_HDMI_IN: - return "ROCK_3_HDMI_IN"; - case X_CAM_TYPE_ROCK_3_OV5647: - return "ROCK_3_OV5647"; - case X_CAM_TYPE_ROCK_3_IMX219: - return "ROCK_3_IMX219"; - case X_CAM_TYPE_ROCK_3_IMX708: - return "ROCK_3_IMX708"; - case X_CAM_TYPE_ROCK_3_IMX462: - return "ROCK_3_IMX462"; - case X_CAM_TYPE_ROCK_3_IMX519: - return "ROCK_3_IMX519"; - case X_CAM_TYPE_ROCK_3_OHD_Jaguar: - return "ROCK_3_OHD_Jaguar"; - case X_CAM_TYPE_DISABLED: - return "DISABLED"; - case X_CAM_TYPE_OPENIPC_GENERIC: - return "OPENIPC_X"; - case X_CAM_TYPE_NVIDIA_XAVIER_IMX577: - return "XAVIER_IMX577"; - case X_CAM_TYPE_QC_IMX577: - return "CORETRONIC IMX577"; - case X_CAM_TYPE_QC_OV9282: - return "CORETRONIC OV9282"; - default: - break; - } - std::stringstream ss; - ss << "UNKNOWN (" << camera_type << ")"; - return ss.str(); - }; - - struct ResolutionFramerate { - int width_px; - int height_px; - int fps; - std::string as_string() const { - std::stringstream ss; - ss << width_px << "x" << height_px << "@" << fps; - return ss.str(); - } - }; - - struct XCamera { - int camera_type = X_CAM_TYPE_DUMMY_SW; - // 0 for primary camera, 1 for secondary camera - int index; - // Only valid if camera is of type USB - // For CSI camera(s) we in general 'know' from platform and cam type how to - // tell the pipeline which cam/source to use. - int usb_v4l2_device_number; - bool requires_rpi_mmal_pipeline() const { - return camera_type == X_CAM_TYPE_RPI_MMAL_HDMI_TO_CSI; - } - bool requires_rpi_libcamera_pipeline() const { - return camera_type >= 30 && camera_type < 60; - } - bool requires_x20_cedar_pipeline() const { - return camera_type >= 70 && camera_type < 80; - } - bool requires_rpi_veye_pipeline() const { - return camera_type >= 60 && camera_type < 70; - } - bool x20_supports_basic_iq_params() const { - return requires_x20_cedar_pipeline() && - camera_type != X_CAM_TYPE_X20_HDZERO_GENERIC; - } - bool requires_rockchip5_mpp_pipeline() const { - return camera_type >= 80 && camera_type < 90; - } - bool requires_rockchip3_mpp_pipeline() const { - return camera_type >= 90 && camera_type < 100; - } - bool requires_willy_pipeline() const { - return camera_type >= 122 && camera_type < 124; - } - std::string cam_type_as_verbose_string() const { - return x_cam_type_to_string(camera_type); - } - bool is_camera_type_usb_infiray() const { - return camera_type == X_CAM_TYPE_USB_INFIRAY || - camera_type == X_CAM_TYPE_USB_INFIRAY_T2 || - camera_type == X_CAM_TYPE_USB_INFIRAY_P2_PRO || - camera_type == X_CAM_TYPE_USB_FLIR_VUE || - camera_type == X_CAM_TYPE_USB_FLIR_BOSON || - camera_type == X_CAM_TYPE_USB_INFIRAY_X2; - }; - // Returns a list of known supported resolution(s). - // They should be ordered in ascending resolution / framerate - // Must always return at least one resolution - // Might not return all resolutions a camera supports per HW - // (In qopenhd, we have the experiment checkbox, where the user can enter - // anything he likes) - std::vector get_supported_resolutions() const { - if (requires_rpi_veye_pipeline()) { - // Except one, all veye camera(s) only do 1080p30 - - if (camera_type == X_CAM_TYPE_RPI_V4L2_VEYE_CSIMX307) { - std::vector ret; - ret.push_back(ResolutionFramerate{1280, 720, 60}); - ret.push_back(ResolutionFramerate{1920, 1080, 30}); - return ret; - } else { - return {ResolutionFramerate{1920, 1080, 30}}; - } - return {ResolutionFramerate{1920, 1080, 30}}; - } else if (requires_x20_cedar_pipeline()) { - // also easy, 720p60 only (for now) - return {ResolutionFramerate{1280, 720, 60}}; - } else if (requires_willy_pipeline()) { - // also easy, 720p60 only (for now) - return {ResolutionFramerate{960, 720, 120}}; - } else if (camera_type == X_CAM_TYPE_USB_INFIRAY) { - return {ResolutionFramerate{384, 292, 25}}; - } else if (camera_type == X_CAM_TYPE_USB_INFIRAY_T2) { - std::vector ret; - ret.push_back(ResolutionFramerate{256, 192, 25}); - ret.push_back(ResolutionFramerate{0, 0, 0}); - return ret; - } else if (camera_type == X_CAM_TYPE_USB_INFIRAY_P2_PRO) { - return {ResolutionFramerate{256, 192, 25}}; - } else if (camera_type == X_CAM_TYPE_USB_INFIRAY_X2) { - return {ResolutionFramerate{384, 292, 50}}; - } else if (camera_type == X_CAM_TYPE_USB_FLIR_VUE) { - return {ResolutionFramerate{640, 512, 30}}; - } else if (camera_type == X_CAM_TYPE_USB_FLIR_BOSON) { - return {ResolutionFramerate{640, 512, 60}}; - } else if (camera_type == X_CAM_TYPE_USB_GENERIC) { - std::vector ret; - // most likely working resolution - ret.push_back(ResolutionFramerate{640, 480, 30}); - // auto is also a good choice on usb - ret.push_back(ResolutionFramerate{0, 0, 0}); - return ret; - } else if (requires_rpi_libcamera_pipeline()) { - std::vector ret; - if (camera_type == X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX462 || - camera_type == - X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX462_LOWLIGHT_MINI) { - ret.push_back(ResolutionFramerate{640, 480, 60}); - ret.push_back(ResolutionFramerate{896, 504, 30}); - ret.push_back(ResolutionFramerate{896, 504, 60}); - ret.push_back(ResolutionFramerate{1280, 720, 30}); - ret.push_back(ResolutionFramerate{1280, 720, 60}); - ret.push_back(ResolutionFramerate{1920, 1080, 30}); - } else if (camera_type == X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX477M || - camera_type == X_CAM_TYPE_RPI_LIBCAMERA_RPIF_HQ_IMX477) { - ret.push_back(ResolutionFramerate{640, 480, 50}); - ret.push_back(ResolutionFramerate{896, 504, 50}); - ret.push_back(ResolutionFramerate{1280, 720, 50}); - ret.push_back(ResolutionFramerate{1920, 1080, 30}); - } else if (camera_type == X_CAM_TYPE_RPI_LIBCAMERA_RPIF_V2_IMX219) { - ret.push_back(ResolutionFramerate{640, 480, 47}); - ret.push_back(ResolutionFramerate{896, 504, 47}); - ret.push_back(ResolutionFramerate{1280, 720, 47}); - ret.push_back(ResolutionFramerate{1920, 1080, 30}); - } else if (camera_type == - X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_SKYVISIONPRO_IMX519) { - ret.push_back(ResolutionFramerate{640, 480, 60}); - ret.push_back(ResolutionFramerate{896, 504, 60}); - ret.push_back(ResolutionFramerate{1280, 720, 60}); - ret.push_back(ResolutionFramerate{1920, 1080, 30}); - } else if (camera_type == - X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_SKYMASTERHDR_IMX708 || - camera_type == X_CAM_TYPE_RPI_LIBCAMERA_RPIF_V3_IMX708) { - ret.push_back(ResolutionFramerate{640, 480, 60}); - ret.push_back(ResolutionFramerate{896, 504, 60}); - ret.push_back(ResolutionFramerate{1280, 720, 60}); - ret.push_back(ResolutionFramerate{1920, 1080, 30}); - } else if (camera_type == X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX327) { - ret.push_back(ResolutionFramerate{640, 480, 60}); - ret.push_back(ResolutionFramerate{896, 504, 60}); - ret.push_back(ResolutionFramerate{1280, 720, 60}); - ret.push_back(ResolutionFramerate{1920, 1080, 30}); - } else if (camera_type == X_CAM_TYPE_RPI_LIBCAMERA_RPIF_V1_OV5647) { - ret.push_back(ResolutionFramerate{1280, 720, 30}); - ret.push_back(ResolutionFramerate{1920, 1080, 30}); - } else { - std::cerr << "Not yet mapped:" << camera_type << std::endl; - ret.push_back(ResolutionFramerate{1920, 1080, 30}); - } - return ret; - } else if (camera_type == X_CAM_TYPE_RPI_MMAL_HDMI_TO_CSI) { - std::vector ret; - // 720p60 is the most commonly used / works in a lot of scenarios - ret.push_back(ResolutionFramerate{1280, 720, 30}); - ret.push_back(ResolutionFramerate{1920, 1080, 25}); - ret.push_back(ResolutionFramerate{1280, 720, 60}); - return ret; - } else if (camera_type == X_CAM_TYPE_DUMMY_SW) { - std::vector ret; - ret.push_back(ResolutionFramerate{640, 480, 30}); - ret.push_back(ResolutionFramerate{1280, 720, 30}); - ret.push_back(ResolutionFramerate{1280, 720, 60}); - return ret; - } else if (camera_type == X_CAM_TYPE_DEVELOPMENT_FILESRC) { - std::vector ret; - ret.push_back(ResolutionFramerate{848, 480, 60}); - ret.push_back(ResolutionFramerate{1280, 720, 60}); - ret.push_back(ResolutionFramerate{1920, 1080, 60}); - return ret; - } else if (camera_type == X_CAM_TYPE_ROCK_5_IMX462) { - std::vector ret; - ret.push_back(ResolutionFramerate{1280, 720, 30}); - ret.push_back(ResolutionFramerate{1280, 720, 60}); - ret.push_back(ResolutionFramerate{1920, 1080, 30}); - ret.push_back(ResolutionFramerate{1920, 1080, 60}); - return ret; - } else if (camera_type == X_CAM_TYPE_ROCK_5_HDMI_IN) { - std::vector ret; - ret.push_back(ResolutionFramerate{1280, 720, 30}); - ret.push_back(ResolutionFramerate{1280, 720, 60}); - ret.push_back(ResolutionFramerate{1920, 1080, 30}); - ret.push_back(ResolutionFramerate{1920, 1080, 60}); - ret.push_back(ResolutionFramerate{3840, 2160, 30}); - ret.push_back(ResolutionFramerate{3840, 2160, 60}); - return ret; - } else if (camera_type == X_CAM_TYPE_ROCK_5_OV5647) { - std::vector ret; - ret.push_back(ResolutionFramerate{640, 480, 60}); - ret.push_back(ResolutionFramerate{1280, 720, 30}); - ret.push_back(ResolutionFramerate{1920, 1080, 30}); - return ret; - } else if (camera_type == X_CAM_TYPE_ROCK_5_IMX219) { - std::vector ret; - ret.push_back(ResolutionFramerate{640, 480, 30}); - ret.push_back(ResolutionFramerate{848, 480, 30}); - ret.push_back(ResolutionFramerate{1280, 720, 30}); - ret.push_back(ResolutionFramerate{1920, 1080, 30}); - return ret; - } else if (camera_type == X_CAM_TYPE_ROCK_5_IMX708) { - std::vector ret; - ret.push_back(ResolutionFramerate{1280, 720, 30}); - ret.push_back(ResolutionFramerate{1280, 720, 60}); - ret.push_back(ResolutionFramerate{1920, 1080, 60}); - ret.push_back(ResolutionFramerate{4608, 2592, 14}); - return ret; - } else if (camera_type == X_CAM_TYPE_ROCK_5_IMX415) { - std::vector ret; - ret.push_back(ResolutionFramerate{1280, 720, 30}); - ret.push_back(ResolutionFramerate{1280, 720, 30}); - ret.push_back(ResolutionFramerate{1920, 1080, 30}); - ret.push_back(ResolutionFramerate{3864, 2192, 30}); - return ret; - } else if (camera_type == X_CAM_TYPE_ROCK_5_IMX477) { - std::vector ret; - ret.push_back(ResolutionFramerate{1280, 720, 60}); - ret.push_back(ResolutionFramerate{1920, 1080, 60}); - ret.push_back(ResolutionFramerate{3840, 2160, 20}); - ret.push_back(ResolutionFramerate{4056, 3040, 10}); - return ret; - } else if (camera_type == X_CAM_TYPE_ROCK_5_IMX519) { - std::vector ret; - ret.push_back(ResolutionFramerate{1280, 720, 60}); - ret.push_back(ResolutionFramerate{1920, 1080, 60}); - ret.push_back(ResolutionFramerate{3840, 2160, 20}); - ret.push_back(ResolutionFramerate{4056, 3040, 9}); - return ret; - } else if (camera_type == X_CAM_TYPE_ROCK_5_OHD_Jaguar) { - std::vector ret; - ret.push_back(ResolutionFramerate{1280, 720, 120}); - ret.push_back(ResolutionFramerate{1920, 1080, 100}); - ret.push_back(ResolutionFramerate{3840, 2160, 90}); - return ret; - } else if (camera_type == X_CAM_TYPE_ROCK_3_HDMI_IN) { - std::vector ret; - ret.push_back(ResolutionFramerate{1280, 720, 30}); - ret.push_back(ResolutionFramerate{1280, 720, 60}); - return ret; - } else if (camera_type == X_CAM_TYPE_ROCK_3_OV5647) { - std::vector ret; - ret.push_back(ResolutionFramerate{640, 480, 60}); - ret.push_back(ResolutionFramerate{1280, 720, 30}); - ret.push_back(ResolutionFramerate{1920, 1080, 30}); - return ret; - } else if (camera_type == X_CAM_TYPE_ROCK_3_IMX219) { - std::vector ret; - ret.push_back(ResolutionFramerate{640, 480, 30}); - ret.push_back(ResolutionFramerate{848, 480, 30}); - ret.push_back(ResolutionFramerate{1280, 720, 30}); - ret.push_back(ResolutionFramerate{1920, 1080, 30}); - return ret; - } else if (camera_type == X_CAM_TYPE_ROCK_3_IMX708) { - std::vector ret; - ret.push_back(ResolutionFramerate{1280, 720, 30}); - ret.push_back(ResolutionFramerate{1280, 720, 60}); - ret.push_back(ResolutionFramerate{1920, 1080, 60}); - return ret; - } else if (camera_type == X_CAM_TYPE_ROCK_3_IMX462) { - std::vector ret; - ret.push_back(ResolutionFramerate{1280, 720, 60}); - ret.push_back(ResolutionFramerate{1280, 720, 30}); - ret.push_back(ResolutionFramerate{1920, 1080, 30}); - ret.push_back(ResolutionFramerate{1920, 1080, 60}); - return ret; - } else if (camera_type == X_CAM_TYPE_ROCK_3_IMX519) { - std::vector ret; - ret.push_back(ResolutionFramerate{1280, 720, 60}); - ret.push_back(ResolutionFramerate{1280, 720, 30}); - ret.push_back(ResolutionFramerate{1920, 1080, 30}); - ret.push_back(ResolutionFramerate{1920, 1080, 60}); - return ret; - } else if (camera_type == X_CAM_TYPE_ROCK_3_OHD_Jaguar) { - std::vector ret; - ret.push_back(ResolutionFramerate{1280, 720, 60}); - ret.push_back(ResolutionFramerate{1280, 720, 120}); - ret.push_back(ResolutionFramerate{1920, 1080, 60}); - ret.push_back(ResolutionFramerate{1920, 1080, 100}); - return ret; - } else if (camera_type == X_CAM_TYPE_NVIDIA_XAVIER_IMX577) { - std::vector ret; - ret.push_back(ResolutionFramerate{1280, 720, 60}); - ret.push_back(ResolutionFramerate{1920, 1080, 60}); - return ret; - } else if (camera_type == X_CAM_TYPE_QC_IMX577) { - std::vector ret; - // very basic integration, driver is missing a lot of settings - ret.push_back(ResolutionFramerate{1280, 720, 30}); - ret.push_back(ResolutionFramerate{1920, 1080, 30}); - return ret; - } else if (camera_type == X_CAM_TYPE_QC_OV9282) { - std::vector ret; - // correct specs still missing - ret.push_back(ResolutionFramerate{1280, 720, 30}); - return ret; - } else if (camera_type == X_CAM_TYPE_WILLY_HORNET) { - std::vector ret; - // correct specs still missing - ret.push_back(ResolutionFramerate{960, 720, 120}); - return ret; - } else if (camera_type == X_CAM_TYPE_WILLY_JAGUAR) { - std::vector ret; - // correct specs still missing - ret.push_back(ResolutionFramerate{1280, 720, 120}); - return ret; - } else if (camera_type == X_CAM_TYPE_WILLY_REKINDLE) { - std::vector ret; - // correct specs still missing - ret.push_back(ResolutionFramerate{1280, 720, 60}); - return ret; - } else { - // Not mapped yet - // return something that might work or might not work - return {ResolutionFramerate{640, 480, 30}}; - } - } - // We default to the last supported resolution - [[nodiscard]] ResolutionFramerate get_default_resolution_fps() const { - auto supported_resolutions = get_supported_resolutions(); - return supported_resolutions.at(supported_resolutions.size() - 1); - } - }; - - static bool is_rpi_csi_camera(int cam_type) { - return cam_type >= 20 && cam_type <= 69; - } - static bool is_rock_csi_camera(int cam_type) { - return cam_type >= 80 && cam_type <= 99; - } - static bool is_willy_csi_camera(int cam_type) { - return cam_type >= 122 && cam_type <= 124; - } - static bool is_usb_camera(int cam_type) { - return cam_type >= 10 && cam_type < 19; - } - - static bool is_valid_primary_cam_type(int cam_type) { - if (cam_type >= 0 && cam_type < X_CAM_TYPE_DISABLED) return true; - return false; - } - static bool is_valid_secondary_cam_type(int cam_type) { - if (is_usb_camera(cam_type)) return true; - if (cam_type == X_CAM_TYPE_DUMMY_SW || cam_type == X_CAM_TYPE_EXTERNAL || - cam_type == X_CAM_TYPE_EXTERNAL_IP || cam_type == X_CAM_TYPE_DISABLED) { - return true; - } - return false; - } - // Takes a string in the from {width}x{height}@{framerate} - // e.g. 1280x720@30 - static std::optional parse_video_format( - const std::string& videoFormat) { - // 0x0@0 is a valid resolution (omit resolution / fps in the pipeline) - if (videoFormat == "0x0@0") return ResolutionFramerate{0, 0, 0}; - // Otherwise, we need at least 6 characters (0x0@0 is 5 characters) - if (videoFormat.size() <= 5) { - return std::nullopt; - } - ResolutionFramerate tmp_video_format{0, 0, 0}; - const std::regex reg{R"((\d*)x(\d*)\@(\d*))"}; - std::smatch result; - if (std::regex_search(videoFormat, result, reg)) { - if (result.size() == 4) { - // openhd::log::get_default()->debug("result[0]=["+result[0].str()+"]"); - tmp_video_format.width_px = atoi(result[1].str().c_str()); - tmp_video_format.height_px = atoi(result[2].str().c_str()); - tmp_video_format.fps = atoi(result[3].str().c_str()); - return tmp_video_format; - } - } - return std::nullopt; - } - - // - // Used in QOpenHD UI - // - static std::string get_verbose_string_of_resolution( - const ResolutionFramerate& resolution_framerate) { - if (resolution_framerate.width_px == 0 && - resolution_framerate.height_px == 0 && resolution_framerate.fps == 0) { - return "AUTO"; - } - std::stringstream ss; - if (resolution_framerate.width_px == 640 && - resolution_framerate.height_px == 480) { - ss << "VGA 4:3"; - } else if (resolution_framerate.width_px == 848 && - resolution_framerate.height_px == 480) { - ss << "VGA 16:9"; - } else if (resolution_framerate.width_px == 896 && - resolution_framerate.height_px == 504) { - ss << "SD 16:9"; - } else if (resolution_framerate.width_px == 1280 && - resolution_framerate.height_px == 720) { - ss << "HD 16:9"; - } else if (resolution_framerate.width_px == 1920 && - resolution_framerate.height_px == 1080) { - ss << "FHD 16:9"; - } else if (resolution_framerate.width_px == 2560 && - resolution_framerate.height_px == 1440) { - ss << "2K 16:9"; - } else { - ss << resolution_framerate.width_px << "x" - << resolution_framerate.height_px; - } - ss << "\n" << resolution_framerate.fps << "fps"; - return ss.str(); - } - - static std::string get_v4l2_device_name_string(int value) { - std::stringstream ss; - ss << "/dev/video" << value; - return ss.str(); - } - - /** - * On platforms with many cameras (e.g. rpi) we need a differentiation by - * manufacturer to make a nice UI - otherwise, the choices are overwhelming. - * Manufacturer is not really the right name for all categories that result - * here, but it is 'okay' for the UI in qopenhd. - */ - struct CameraNameAndType { - std::string name; - int type; - }; - struct ManufacturerForPlatform { - std::string manufacturer_name; - std::vector cameras; - }; - /** - * Return: a list of categories for this platform. - * Each category has a list of valid camera types (for this platform). - * @param platform_type unique platform type - * @param is_secondary selection is different for secondary cam,most notably, we - * only support usb, develop and a 'disabled' type. - */ - static std::vector get_camera_choices_for_platform( - int platform_type, bool is_secondary) { - std::vector usb_cameras{ - CameraNameAndType{"INFIRAY USB", X_CAM_TYPE_USB_INFIRAY}, - CameraNameAndType{"INFIRAY USB T2", X_CAM_TYPE_USB_INFIRAY_T2}, - CameraNameAndType{"INFIRAY USB P2 Pro", X_CAM_TYPE_USB_INFIRAY_P2_PRO}, - CameraNameAndType{"INFIRAY USB X2", X_CAM_TYPE_USB_INFIRAY_X2}, - CameraNameAndType{"FLIR_VUE", X_CAM_TYPE_USB_FLIR_VUE}, - CameraNameAndType{"FLIR_BOSON", X_CAM_TYPE_USB_FLIR_BOSON}, - CameraNameAndType{"EXP USB GENERIC", X_CAM_TYPE_USB_GENERIC}}; - ManufacturerForPlatform MANUFACTURER_USB{"USB", usb_cameras}; - std::vector debug_cameras{ - CameraNameAndType{"Dummy (debug)", 0}, - CameraNameAndType{"External (DEV)", 2}, - // CameraNameAndType{"External IP (DEV)",3}, - CameraNameAndType{"DEV Filecamera", 4}, - }; - ManufacturerForPlatform MANUFACTURER_DEBUG{"DEV/DEBUG", debug_cameras}; - // Secondary can only be used with USB and / or the debug cameras. CSI is not - // usable for secondary. - if (is_secondary) { - // Not really a manufacturer, but ui looks okay with this - std::vector disable_camera{ - CameraNameAndType{"DISABLE", X_CAM_TYPE_DISABLED}, - }; - ManufacturerForPlatform MANUFACTURER_DISABLE{"DISABLE", disable_camera}; - return std::vector{ - MANUFACTURER_DISABLE, MANUFACTURER_USB, MANUFACTURER_DEBUG}; - } - if (platform_type == X_PLATFORM_TYPE_RPI_OLD || - platform_type == X_PLATFORM_TYPE_RPI_4 || - platform_type == X_PLATFORM_TYPE_RPI_CM4) { - std::vector arducam_cameras{ - CameraNameAndType{"SKYMASTERHDR", 40}, - CameraNameAndType{"SKYVISIONPRO", 41}, - CameraNameAndType{"IMX477m", 42}, - CameraNameAndType{"IMX462", 43}, - CameraNameAndType{"IMX327", 44}, - CameraNameAndType{"IMX290", 45}, - CameraNameAndType{"IMX462_LOWLIGHT_MINI", 46}}; - std::vector veye_cameras{ - CameraNameAndType{"2MP", 60}, - CameraNameAndType{"CSIMX307", 61}, - CameraNameAndType{"CSSC132", 62}, - CameraNameAndType{"MVCAM", 63}, - }; - std::vector rpif_cameras{ - CameraNameAndType{"V1 OV5647", 30}, - CameraNameAndType{"V2 IMX219", 31}, - CameraNameAndType{"V3 IMX708", 32}, - CameraNameAndType{"HQ IMX477", 33}, - }; - std::vector hdmi_to_csi_cameras{ - CameraNameAndType{"GENERIC HDMI to CSI", 20}}; - return std::vector{ - ManufacturerForPlatform{"ARDUCAM", arducam_cameras}, - ManufacturerForPlatform{"VEYE", veye_cameras}, - ManufacturerForPlatform{"RPI FOUNDATION", rpif_cameras}, - ManufacturerForPlatform{"HDMI TO CSI", hdmi_to_csi_cameras}, - MANUFACTURER_USB, - MANUFACTURER_DEBUG}; - } else if (platform_type == X_PLATFORM_TYPE_ALWINNER_X20) { - std::vector runcam_cameras{ - CameraNameAndType{"OpenHD Jaguar", X_CAM_TYPE_X21_OHD_Jaguar}, - }; - } else if (platform_type == X_PLATFORM_TYPE_ALWINNER_X20) { - // On the X20, we have auto detection of the camera type, - // But we still populate the UI like for platforms where the user has to - // select the cam type. - std::vector generic_cameras{ - CameraNameAndType{"GENERIC", X_PLATFORM_TYPE_ROCKCHIP_RV1126}, - }; - std::vector runcam_cameras{ - CameraNameAndType{"RUNCAM V1", X_CAM_TYPE_X20_HDZERO_RUNCAM_V1}, - CameraNameAndType{"RUNCAM V2", X_CAM_TYPE_X20_HDZERO_RUNCAM_V2}, - CameraNameAndType{"RUNCAM V3", X_CAM_TYPE_X20_HDZERO_RUNCAM_V3}, - CameraNameAndType{"RUNCAM NANO 90", - X_CAM_TYPE_X20_HDZERO_RUNCAM_NANO_90}, - CameraNameAndType{"OpenHD Jaguar", X_CAM_TYPE_X20_OHD_Jaguar}, - }; - return std::vector{ - ManufacturerForPlatform{"HDZERO", generic_cameras}, - ManufacturerForPlatform{"RUNCAM", runcam_cameras}}; - } else if ((platform_type == X_PLATFORM_TYPE_ROCKCHIP_RK3566_RADXA_ZERO3W) || - (platform_type == X_PLATFORM_TYPE_ROCKCHIP_RK3566_RADXA_CM3)) { - std::vector arducam_cameras{ - CameraNameAndType{"IMX462", X_CAM_TYPE_ROCK_3_IMX462}, - CameraNameAndType{"IMX519", X_CAM_TYPE_ROCK_3_IMX519}, - CameraNameAndType{"IMX708", X_CAM_TYPE_ROCK_3_IMX708}, - CameraNameAndType{"OpenHD Jaguar", X_CAM_TYPE_ROCK_3_OHD_Jaguar}}; - std::vector generic_cameras{ - CameraNameAndType{"HDMI IN", X_CAM_TYPE_ROCK_3_HDMI_IN}, - CameraNameAndType{"OV5647", X_CAM_TYPE_ROCK_3_OV5647}, - CameraNameAndType{"IMX219", X_CAM_TYPE_ROCK_3_IMX219}}; - return std::vector{ - ManufacturerForPlatform{"Arducam", arducam_cameras}, MANUFACTURER_USB, - MANUFACTURER_DEBUG}; - } else if (platform_type == X_PLATFORM_TYPE_ROCKCHIP_RK3588_RADXA_ROCK5_A) { - std::vector generic_cameras{ - CameraNameAndType{"IMX415", X_CAM_TYPE_ROCK_5_IMX415}, - CameraNameAndType{"IMX462", X_CAM_TYPE_ROCK_5_IMX462}, - CameraNameAndType{"IMX477", X_CAM_TYPE_ROCK_5_IMX477}, - CameraNameAndType{"IMX519", X_CAM_TYPE_ROCK_5_IMX519}, - CameraNameAndType{"OV5647", X_CAM_TYPE_ROCK_5_OV5647}, - CameraNameAndType{"IMX219", X_CAM_TYPE_ROCK_5_IMX219}, - CameraNameAndType{"IMX708", X_CAM_TYPE_ROCK_5_IMX708}, - CameraNameAndType{"OpenHD Jaguar", X_CAM_TYPE_ROCK_5_OHD_Jaguar}}; - return std::vector{ - ManufacturerForPlatform{"Generic", generic_cameras}, MANUFACTURER_USB, - MANUFACTURER_DEBUG}; - } else if (platform_type == X_PLATFORM_TYPE_ROCKCHIP_RK3588_RADXA_ROCK5_B) { - std::vector generic_cameras{ - CameraNameAndType{"HDMI IN", X_CAM_TYPE_ROCK_5_HDMI_IN}, - CameraNameAndType{"IMX415", X_CAM_TYPE_ROCK_5_IMX415}, - CameraNameAndType{"IMX462", X_CAM_TYPE_ROCK_5_IMX462}, - CameraNameAndType{"IMX477", X_CAM_TYPE_ROCK_5_IMX477}, - CameraNameAndType{"IMX519", X_CAM_TYPE_ROCK_5_IMX519}, - CameraNameAndType{"OV5647", X_CAM_TYPE_ROCK_5_OV5647}, - CameraNameAndType{"IMX219", X_CAM_TYPE_ROCK_5_IMX219}, - CameraNameAndType{"IMX708", X_CAM_TYPE_ROCK_5_IMX708}, - CameraNameAndType{"OpenHD Jaguar", X_CAM_TYPE_ROCK_5_OHD_Jaguar}, - }; - return std::vector{ - ManufacturerForPlatform{"Generic", generic_cameras}, MANUFACTURER_USB, - MANUFACTURER_DEBUG}; - } else if (platform_type == X_PLATFORM_TYPE_X86) { - return std::vector{MANUFACTURER_USB, - MANUFACTURER_DEBUG}; - } else if (platform_type == X_PLATFORM_TYPE_NVIDIA_XAVIER) { - std::vector nvidia_leopard_csi_cameras{ - CameraNameAndType{"IMX577", X_CAM_TYPE_NVIDIA_XAVIER_IMX577}, - }; - return std::vector{ - ManufacturerForPlatform{"LEOPARD", nvidia_leopard_csi_cameras}, - MANUFACTURER_USB, MANUFACTURER_DEBUG}; - } else if (platform_type == X_PLATFORM_TYPE_WILLY) { - std::vector willy_cameras{ - CameraNameAndType{"HORNET", X_CAM_TYPE_WILLY_HORNET}, - CameraNameAndType{"JAGUAR", X_CAM_TYPE_WILLY_JAGUAR}, - CameraNameAndType{"REKINDLE", X_CAM_TYPE_WILLY_REKINDLE}, - }; - return std::vector{ - ManufacturerForPlatform{"WILLY", willy_cameras}, MANUFACTURER_USB, - MANUFACTURER_DEBUG}; - } - return std::vector{MANUFACTURER_DEBUG}; - } - - #endif // OPENHD_CAMERA_HPP - \ No newline at end of file +#include +#include +#include +#include +#include +#include + +#include "openhd_platform.h" + +/** + * NOTE: This file is copied into QOpenHD to populate the UI. + */ + +// For development, always 'works' since fully emulated in SW. +static constexpr int X_CAM_TYPE_DUMMY_SW = 0; // Dummy sw picture +// Manually feed camera data (encoded,rtp) to openhd. Bitrate control and more +// is not working in this mode, making it only valid for development and in +// extreme cases valid for users that want to use a specific ip camera. +static constexpr int X_CAM_TYPE_EXTERNAL = 2; +// For openhd, this is exactly the same as X_CAM_TYPE_EXTERNAL - only file +// start_ip_cam.txt is created Such that the ip cam service can start forwarding +// data to openhd core. +static constexpr int X_CAM_TYPE_EXTERNAL_IP = 3; +// For development, camera that reads input from a file, and then re-encodes it +// using the platform encoder +static constexpr int X_CAM_TYPE_DEVELOPMENT_FILESRC = 4; +// ... reserved for development / custom cameras + +// OpenHD supports any usb camera outputting raw video (with sw encoding). +// H264 usb cameras are not supported, since in general, they do not support +// changing bitrate/ encoding parameters. +static constexpr int X_CAM_TYPE_USB_GENERIC = 10; +// 384x292@25 cam +static constexpr int X_CAM_TYPE_USB_INFIRAY = 11; +// 256x192@25 but only 0x0@0 works (urghs) +static constexpr int X_CAM_TYPE_USB_INFIRAY_T2 = 12; +static constexpr int X_CAM_TYPE_USB_INFIRAY_X2 = 13; +static constexpr int X_CAM_TYPE_USB_INFIRAY_P2_PRO = 14; +static constexpr int X_CAM_TYPE_USB_FLIR_VUE = 15; +static constexpr int X_CAM_TYPE_USB_FLIR_BOSON = 16; +// ... reserved for future (Thermal) USB cameras +// +// RPI Specific starts here +// +// As of now, we have mmal only for the geekworm hdmi to csi adapter +static constexpr int X_CAM_TYPE_RPI_MMAL_HDMI_TO_CSI = 20; +// ... 9 reserved for future use +// ... +// RPIF stands for RPI Foundation (aka original rpi foundation cameras) +static constexpr int X_CAM_TYPE_RPI_LIBCAMERA_RPIF_V1_OV5647 = 30; +static constexpr int X_CAM_TYPE_RPI_LIBCAMERA_RPIF_V2_IMX219 = 31; +static constexpr int X_CAM_TYPE_RPI_LIBCAMERA_RPIF_V3_IMX708 = 32; +static constexpr int X_CAM_TYPE_RPI_LIBCAMERA_RPIF_HQ_IMX477 = 33; +// .... 5 reserved for future use +// Now to all the rpi libcamera arducam cameras +static constexpr int X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_SKYMASTERHDR_IMX708 = 40; +static constexpr int X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_SKYVISIONPRO_IMX519 = 41; +static constexpr int X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX477M = 42; +static constexpr int X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX462 = 43; +static constexpr int X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX327 = 44; +static constexpr int X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX290 = 45; +static constexpr int X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX462_LOWLIGHT_MINI = 46; +static constexpr int X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX662 = 47; +// ... 13 reserved for future use +static constexpr int X_CAM_TYPE_RPI_V4L2_VEYE_2MP = 60; +static constexpr int X_CAM_TYPE_RPI_V4L2_VEYE_CSIMX307 = 61; +static constexpr int X_CAM_TYPE_RPI_V4L2_VEYE_CSSC132 = 62; +static constexpr int X_CAM_TYPE_RPI_V4L2_VEYE_MVCAM = 63; +// ... 6 reserved for future use +// +// X20 Specific starts here +// +// Right now we only have one camera, but more (might) follow. +// Generic - camera(s) that don't support any IQ params or changing settings. +// For example the Foxeer cameras, or old runcam cameras +static constexpr int X_CAM_TYPE_X20_HDZERO_GENERIC = 70; +static constexpr int X_CAM_TYPE_X20_HDZERO_RUNCAM_V1 = 71; +static constexpr int X_CAM_TYPE_X20_HDZERO_RUNCAM_V2 = 72; +static constexpr int X_CAM_TYPE_X20_HDZERO_RUNCAM_V3 = 73; +static constexpr int X_CAM_TYPE_X20_HDZERO_RUNCAM_NANO_90 = 74; +static constexpr int X_CAM_TYPE_X20_OHD_Jaguar = 75; +static constexpr int X_CAM_TYPE_X21_OHD_Jaguar = 76; + +// ... 9 reserved for future use +// +// ROCK 5 starts here +// +static constexpr int X_CAM_TYPE_ROCK_5_HDMI_IN = 80; +static constexpr int X_CAM_TYPE_ROCK_5_OV5647 = 81; +static constexpr int X_CAM_TYPE_ROCK_5_IMX219 = 82; +static constexpr int X_CAM_TYPE_ROCK_5_IMX708 = 83; +static constexpr int X_CAM_TYPE_ROCK_5_IMX462 = 84; +static constexpr int X_CAM_TYPE_ROCK_5_IMX415 = 85; +static constexpr int X_CAM_TYPE_ROCK_5_IMX477 = 86; +static constexpr int X_CAM_TYPE_ROCK_5_IMX519 = 87; +static constexpr int X_CAM_TYPE_ROCK_5_OHD_Jaguar = 88; +// ROCK 3 starts here +// +static constexpr int X_CAM_TYPE_ROCK_3_HDMI_IN = 90; +static constexpr int X_CAM_TYPE_ROCK_3_OV5647 = 91; +static constexpr int X_CAM_TYPE_ROCK_3_IMX219 = 92; +static constexpr int X_CAM_TYPE_ROCK_3_IMX708 = 93; +static constexpr int X_CAM_TYPE_ROCK_3_IMX462 = 94; +static constexpr int X_CAM_TYPE_ROCK_3_IMX519 = 95; +static constexpr int X_CAM_TYPE_ROCK_3_OHD_Jaguar = 96; +static constexpr int X_CAM_TYPE_ROCK_3_VEYE = 97; +// +// NVIDIA XAVIER specific starts here +static constexpr int X_CAM_TYPE_NVIDIA_XAVIER_IMX577 = 101; +// OpenIPC specific starts here +static constexpr int X_CAM_TYPE_OPENIPC_GENERIC = 110; +// Qualcomm specific starts here +static constexpr int X_CAM_TYPE_QC_IMX577 = 120; +static constexpr int X_CAM_TYPE_QC_OV9282 = 121; +// Projects are here +static constexpr int X_CAM_TYPE_ORQA_HORNET = 122; +static constexpr int X_CAM_TYPE_ORQA_JAGUAR = 123; +static constexpr int X_CAM_TYPE_ORQA_REKINDLE = 124; + +// +// ... rest is reserved for future use +// no camera, only exists to have a default value for secondary camera (which is +// disabled by default). NOTE: The primary camera cannot be disabled ! +static constexpr int X_CAM_TYPE_DISABLED = 255; // Max for uint8_t + +static std::string x_cam_type_to_string(int camera_type) { + switch (camera_type) { + case X_CAM_TYPE_DUMMY_SW: + return "DUMMY"; + case X_CAM_TYPE_EXTERNAL: + return "EXTERNAL"; + case X_CAM_TYPE_EXTERNAL_IP: + return "EXTERNAL_IP"; + case X_CAM_TYPE_DEVELOPMENT_FILESRC: + return "DEV_FILESRC"; + case X_CAM_TYPE_USB_GENERIC: + return "USB"; + case X_CAM_TYPE_USB_INFIRAY: + return "INFIRAY"; + case X_CAM_TYPE_USB_INFIRAY_T2: + return "INFIRAY_T2"; + case X_CAM_TYPE_USB_INFIRAY_P2_PRO: + return "INFIRAY_P2_PRO"; + case X_CAM_TYPE_USB_INFIRAY_X2: + return "INFIRAY_X2"; + case X_CAM_TYPE_USB_FLIR_VUE: + return "FLIR VUE"; + case X_CAM_TYPE_USB_FLIR_BOSON: + return "FLIR BOSON"; + // All the rpi stuff begin + case X_CAM_TYPE_RPI_MMAL_HDMI_TO_CSI: + return "MMAL_HDMI"; + case X_CAM_TYPE_RPI_LIBCAMERA_RPIF_V1_OV5647: + return "RPIF_V1_OV5647"; + case X_CAM_TYPE_RPI_LIBCAMERA_RPIF_V2_IMX219: + return "RPIF_V2_IMX219"; + case X_CAM_TYPE_RPI_LIBCAMERA_RPIF_V3_IMX708: + return "RPIF_V3_IMX708"; + case X_CAM_TYPE_RPI_LIBCAMERA_RPIF_HQ_IMX477: + return "RPIF_HQ_IMX477"; + case X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_SKYMASTERHDR_IMX708: + return "ARDUCAM_SKYMASTERHDR"; + case X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_SKYVISIONPRO_IMX519: + return "ARDUCAM_SKYVISIONPRO"; + case X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX477M: + return "ARDUCAM_IMX477M"; + case X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX462: + return "ARDUCAM_IMX462"; + case X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX327: + return "ARDUCAM_IMX327"; + case X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX290: + return "ARDUCAM_IMX290"; + case X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX462_LOWLIGHT_MINI: + return "ARDUCAM_IMX462_LOWLIGHT_MINI"; + case X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX662: + return "ARDUCAM_IMX662"; + case X_CAM_TYPE_RPI_V4L2_VEYE_2MP: + return "VEYE_2MP"; + case X_CAM_TYPE_RPI_V4L2_VEYE_CSIMX307: + return "VEYE_IMX307"; + case X_CAM_TYPE_RPI_V4L2_VEYE_CSSC132: + return "VEYE_CSSC132"; + case X_CAM_TYPE_RPI_V4L2_VEYE_MVCAM: + return "VEYE_MVCAM"; + // All the x20 begin + case X_CAM_TYPE_X20_HDZERO_GENERIC: + return "X20_HDZERO_GENERIC"; + case X_CAM_TYPE_X20_HDZERO_RUNCAM_V1: + return "X20_HDZERO_RUNCAM_V1"; + case X_CAM_TYPE_X20_HDZERO_RUNCAM_V2: + return "X20_HDZERO_RUNCAM_V2"; + case X_CAM_TYPE_X20_HDZERO_RUNCAM_V3: + return "X20_HDZERO_RUNCAM_V3"; + case X_CAM_TYPE_X20_HDZERO_RUNCAM_NANO_90: + return "X20_HDZERO_RUNCAM_NANO"; + case X_CAM_TYPE_X20_OHD_Jaguar: + return "X20_OHD_Jaguar"; + case X_CAM_TYPE_X21_OHD_Jaguar: + return "X21_OHD_Jaguar"; + // All the rock begin + case X_CAM_TYPE_ROCK_5_HDMI_IN: + return "ROCK_5_HDMI_IN"; + case X_CAM_TYPE_ROCK_5_OV5647: + return "ROCK_5_OV5647"; + case X_CAM_TYPE_ROCK_5_IMX219: + return "ROCK_5_IMX219"; + case X_CAM_TYPE_ROCK_5_IMX708: + return "ROCK_5_IMX708"; + case X_CAM_TYPE_ROCK_5_IMX462: + return "ROCK_5_IMX462"; + case X_CAM_TYPE_ROCK_5_IMX415: + return "ROCK_5_IMX415"; + case X_CAM_TYPE_ROCK_5_IMX477: + return "ROCK_5_IMX415"; + case X_CAM_TYPE_ROCK_5_IMX519: + return "ROCK_5_IMX415"; + case X_CAM_TYPE_ROCK_5_OHD_Jaguar: + return "ROCK_5_OHD_Jaguar"; + case X_CAM_TYPE_ROCK_3_HDMI_IN: + return "ROCK_3_HDMI_IN"; + case X_CAM_TYPE_ROCK_3_OV5647: + return "ROCK_3_OV5647"; + case X_CAM_TYPE_ROCK_3_IMX219: + return "ROCK_3_IMX219"; + case X_CAM_TYPE_ROCK_3_IMX708: + return "ROCK_3_IMX708"; + case X_CAM_TYPE_ROCK_3_IMX462: + return "ROCK_3_IMX462"; + case X_CAM_TYPE_ROCK_3_IMX519: + return "ROCK_3_IMX519"; + case X_CAM_TYPE_ROCK_3_OHD_Jaguar: + return "ROCK_3_OHD_Jaguar"; + case X_CAM_TYPE_DISABLED: + return "DISABLED"; + case X_CAM_TYPE_OPENIPC_GENERIC: + return "OPENIPC_X"; + case X_CAM_TYPE_NVIDIA_XAVIER_IMX577: + return "XAVIER_IMX577"; + case X_CAM_TYPE_QC_IMX577: + return "CORETRONIC IMX577"; + case X_CAM_TYPE_QC_OV9282: + return "CORETRONIC OV9282"; + case X_CAM_TYPE_ORQA_HORNET: + return "ORQA_HORNET"; + case X_CAM_TYPE_ORQA_JAGUAR: + return "ORQA_JAGUAR"; + case X_CAM_TYPE_ORQA_REKINDLE: + return "ORQA_REKINDLE"; + default: + break; + } + std::stringstream ss; + ss << "UNKNOWN (" << camera_type << ")"; + return ss.str(); +}; + +struct ResolutionFramerate { + int width_px; + int height_px; + int fps; + std::string as_string() const { + std::stringstream ss; + ss << width_px << "x" << height_px << "@" << fps; + return ss.str(); + } +}; + +struct XCamera { + int camera_type = X_CAM_TYPE_DUMMY_SW; + // 0 for primary camera, 1 for secondary camera + int index; + // Only valid if camera is of type USB + // For CSI camera(s) we in general 'know' from platform and cam type how to + // tell the pipeline which cam/source to use. + int usb_v4l2_device_number; + bool requires_rpi_mmal_pipeline() const { + return camera_type == X_CAM_TYPE_RPI_MMAL_HDMI_TO_CSI; + } + bool requires_rpi_libcamera_pipeline() const { + return camera_type >= 30 && camera_type < 60; + } + bool requires_x20_cedar_pipeline() const { + return camera_type >= 70 && camera_type < 80; + } + bool requires_rpi_veye_pipeline() const { + return camera_type >= 60 && camera_type < 70; + } + bool x20_supports_basic_iq_params() const { + return requires_x20_cedar_pipeline() && + camera_type != X_CAM_TYPE_X20_HDZERO_GENERIC; + } + bool requires_rockchip5_mpp_pipeline() const { + return camera_type >= 80 && camera_type < 90; + } + bool requires_rockchip3_mpp_pipeline() const { + return camera_type >= 90 && camera_type < 100; + } + bool requires_orqa_pipeline() const { + return camera_type >= 122 && camera_type <= 124; + } + std::string cam_type_as_verbose_string() const { + return x_cam_type_to_string(camera_type); + } + bool is_camera_type_usb_infiray() const { + return camera_type == X_CAM_TYPE_USB_INFIRAY || + camera_type == X_CAM_TYPE_USB_INFIRAY_T2 || + camera_type == X_CAM_TYPE_USB_INFIRAY_P2_PRO || + camera_type == X_CAM_TYPE_USB_FLIR_VUE || + camera_type == X_CAM_TYPE_USB_FLIR_BOSON || + camera_type == X_CAM_TYPE_USB_INFIRAY_X2; + }; + // Returns a list of known supported resolution(s). + // They should be ordered in ascending resolution / framerate + // Must always return at least one resolution + // Might not return all resolutions a camera supports per HW + // (In qopenhd, we have the experiment checkbox, where the user can enter + // anything he likes) + std::vector get_supported_resolutions() const { + if (requires_rpi_veye_pipeline()) { + // Except one, all veye camera(s) only do 1080p30 - + if (camera_type == X_CAM_TYPE_RPI_V4L2_VEYE_CSIMX307) { + std::vector ret; + ret.push_back(ResolutionFramerate{1280, 720, 60}); + ret.push_back(ResolutionFramerate{1920, 1080, 30}); + return ret; + } else { + return {ResolutionFramerate{1920, 1080, 30}}; + } + return {ResolutionFramerate{1920, 1080, 30}}; + } else if (requires_x20_cedar_pipeline()) { + // also easy, 720p60 only (for now) + return {ResolutionFramerate{1280, 720, 60}}; + } else if (requires_orqa_pipeline()) { + // also easy, 720p60 only (for now) + return {ResolutionFramerate{960, 720, 120}}; + } else if (camera_type == X_CAM_TYPE_USB_INFIRAY) { + return {ResolutionFramerate{384, 292, 25}}; + } else if (camera_type == X_CAM_TYPE_USB_INFIRAY_T2) { + std::vector ret; + ret.push_back(ResolutionFramerate{256, 192, 25}); + ret.push_back(ResolutionFramerate{0, 0, 0}); + return ret; + } else if (camera_type == X_CAM_TYPE_USB_INFIRAY_P2_PRO) { + return {ResolutionFramerate{256, 192, 25}}; + } else if (camera_type == X_CAM_TYPE_USB_INFIRAY_X2) { + return {ResolutionFramerate{384, 292, 50}}; + } else if (camera_type == X_CAM_TYPE_USB_FLIR_VUE) { + return {ResolutionFramerate{640, 512, 30}}; + } else if (camera_type == X_CAM_TYPE_USB_FLIR_BOSON) { + return {ResolutionFramerate{640, 512, 60}}; + } else if (camera_type == X_CAM_TYPE_USB_GENERIC) { + std::vector ret; + // most likely working resolution + ret.push_back(ResolutionFramerate{640, 480, 30}); + // auto is also a good choice on usb + ret.push_back(ResolutionFramerate{0, 0, 0}); + return ret; + } else if (requires_rpi_libcamera_pipeline()) { + std::vector ret; + if (camera_type == X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX462 || + camera_type == + X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX462_LOWLIGHT_MINI) { + ret.push_back(ResolutionFramerate{640, 480, 60}); + ret.push_back(ResolutionFramerate{896, 504, 30}); + ret.push_back(ResolutionFramerate{896, 504, 60}); + ret.push_back(ResolutionFramerate{1280, 720, 30}); + ret.push_back(ResolutionFramerate{1280, 720, 60}); + ret.push_back(ResolutionFramerate{1920, 1080, 30}); + } else if (camera_type == X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX477M || + camera_type == X_CAM_TYPE_RPI_LIBCAMERA_RPIF_HQ_IMX477) { + ret.push_back(ResolutionFramerate{640, 480, 50}); + ret.push_back(ResolutionFramerate{896, 504, 50}); + ret.push_back(ResolutionFramerate{1280, 720, 50}); + ret.push_back(ResolutionFramerate{1920, 1080, 30}); + } else if (camera_type == X_CAM_TYPE_RPI_LIBCAMERA_RPIF_V2_IMX219) { + ret.push_back(ResolutionFramerate{640, 480, 47}); + ret.push_back(ResolutionFramerate{896, 504, 47}); + ret.push_back(ResolutionFramerate{1280, 720, 47}); + ret.push_back(ResolutionFramerate{1920, 1080, 30}); + } else if (camera_type == + X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_SKYVISIONPRO_IMX519) { + ret.push_back(ResolutionFramerate{640, 480, 60}); + ret.push_back(ResolutionFramerate{896, 504, 60}); + ret.push_back(ResolutionFramerate{1280, 720, 60}); + ret.push_back(ResolutionFramerate{1920, 1080, 30}); + } else if (camera_type == + X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_SKYMASTERHDR_IMX708 || + camera_type == X_CAM_TYPE_RPI_LIBCAMERA_RPIF_V3_IMX708) { + ret.push_back(ResolutionFramerate{640, 480, 60}); + ret.push_back(ResolutionFramerate{896, 504, 60}); + ret.push_back(ResolutionFramerate{1280, 720, 60}); + ret.push_back(ResolutionFramerate{1920, 1080, 30}); + } else if (camera_type == X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX327) { + ret.push_back(ResolutionFramerate{640, 480, 60}); + ret.push_back(ResolutionFramerate{896, 504, 60}); + ret.push_back(ResolutionFramerate{1280, 720, 60}); + ret.push_back(ResolutionFramerate{1920, 1080, 30}); + } else if (camera_type == X_CAM_TYPE_RPI_LIBCAMERA_ARDUCAM_IMX662) { + ret.push_back(ResolutionFramerate{1280, 720, 60}); + ret.push_back(ResolutionFramerate{1920, 1080, 30}); + } else if (camera_type == X_CAM_TYPE_RPI_LIBCAMERA_RPIF_V1_OV5647) { + ret.push_back(ResolutionFramerate{1280, 720, 30}); + ret.push_back(ResolutionFramerate{1920, 1080, 30}); + } else { + std::cerr << "Not yet mapped:" << camera_type << std::endl; + ret.push_back(ResolutionFramerate{1920, 1080, 30}); + } + return ret; + } else if (camera_type == X_CAM_TYPE_RPI_MMAL_HDMI_TO_CSI) { + std::vector ret; + // 720p60 is the most commonly used / works in a lot of scenarios + ret.push_back(ResolutionFramerate{1280, 720, 30}); + ret.push_back(ResolutionFramerate{1920, 1080, 25}); + ret.push_back(ResolutionFramerate{1280, 720, 60}); + return ret; + } else if (camera_type == X_CAM_TYPE_DUMMY_SW) { + std::vector ret; + ret.push_back(ResolutionFramerate{640, 480, 30}); + ret.push_back(ResolutionFramerate{1280, 720, 30}); + ret.push_back(ResolutionFramerate{1280, 720, 60}); + return ret; + } else if (camera_type == X_CAM_TYPE_DEVELOPMENT_FILESRC) { + std::vector ret; + ret.push_back(ResolutionFramerate{848, 480, 60}); + ret.push_back(ResolutionFramerate{1280, 720, 60}); + ret.push_back(ResolutionFramerate{1920, 1080, 60}); + return ret; + } else if (camera_type == X_CAM_TYPE_ROCK_5_IMX462) { + std::vector ret; + ret.push_back(ResolutionFramerate{1280, 720, 30}); + ret.push_back(ResolutionFramerate{1280, 720, 60}); + ret.push_back(ResolutionFramerate{1920, 1080, 30}); + ret.push_back(ResolutionFramerate{1920, 1080, 60}); + return ret; + } else if (camera_type == X_CAM_TYPE_ROCK_5_HDMI_IN) { + std::vector ret; + ret.push_back(ResolutionFramerate{1280, 720, 30}); + ret.push_back(ResolutionFramerate{1280, 720, 60}); + ret.push_back(ResolutionFramerate{1920, 1080, 30}); + ret.push_back(ResolutionFramerate{1920, 1080, 60}); + ret.push_back(ResolutionFramerate{3840, 2160, 30}); + ret.push_back(ResolutionFramerate{3840, 2160, 60}); + return ret; + } else if (camera_type == X_CAM_TYPE_ROCK_5_OV5647) { + std::vector ret; + ret.push_back(ResolutionFramerate{640, 480, 60}); + ret.push_back(ResolutionFramerate{1280, 720, 30}); + ret.push_back(ResolutionFramerate{1920, 1080, 30}); + return ret; + } else if (camera_type == X_CAM_TYPE_ROCK_5_IMX219) { + std::vector ret; + ret.push_back(ResolutionFramerate{640, 480, 30}); + ret.push_back(ResolutionFramerate{848, 480, 30}); + ret.push_back(ResolutionFramerate{1280, 720, 30}); + ret.push_back(ResolutionFramerate{1920, 1080, 30}); + return ret; + } else if (camera_type == X_CAM_TYPE_ROCK_5_IMX708) { + std::vector ret; + ret.push_back(ResolutionFramerate{1280, 720, 30}); + ret.push_back(ResolutionFramerate{1280, 720, 60}); + ret.push_back(ResolutionFramerate{1920, 1080, 60}); + ret.push_back(ResolutionFramerate{4608, 2592, 14}); + return ret; + } else if (camera_type == X_CAM_TYPE_ROCK_5_IMX415) { + std::vector ret; + ret.push_back(ResolutionFramerate{1280, 720, 30}); + ret.push_back(ResolutionFramerate{1280, 720, 30}); + ret.push_back(ResolutionFramerate{1920, 1080, 30}); + ret.push_back(ResolutionFramerate{3864, 2192, 30}); + return ret; + } else if (camera_type == X_CAM_TYPE_ROCK_5_IMX477) { + std::vector ret; + ret.push_back(ResolutionFramerate{1280, 720, 60}); + ret.push_back(ResolutionFramerate{1920, 1080, 60}); + ret.push_back(ResolutionFramerate{3840, 2160, 20}); + ret.push_back(ResolutionFramerate{4056, 3040, 10}); + return ret; + } else if (camera_type == X_CAM_TYPE_ROCK_5_IMX519) { + std::vector ret; + ret.push_back(ResolutionFramerate{1280, 720, 60}); + ret.push_back(ResolutionFramerate{1920, 1080, 60}); + ret.push_back(ResolutionFramerate{3840, 2160, 20}); + ret.push_back(ResolutionFramerate{4056, 3040, 9}); + return ret; + } else if (camera_type == X_CAM_TYPE_ROCK_5_OHD_Jaguar) { + std::vector ret; + ret.push_back(ResolutionFramerate{1280, 720, 120}); + ret.push_back(ResolutionFramerate{1920, 1080, 100}); + ret.push_back(ResolutionFramerate{3840, 2160, 90}); + return ret; + } else if (camera_type == X_CAM_TYPE_ROCK_3_HDMI_IN) { + std::vector ret; + ret.push_back(ResolutionFramerate{1280, 720, 30}); + ret.push_back(ResolutionFramerate{1280, 720, 60}); + return ret; + } else if (camera_type == X_CAM_TYPE_ROCK_3_OV5647) { + std::vector ret; + ret.push_back(ResolutionFramerate{640, 480, 60}); + ret.push_back(ResolutionFramerate{1280, 720, 30}); + ret.push_back(ResolutionFramerate{1920, 1080, 30}); + return ret; + } else if (camera_type == X_CAM_TYPE_ROCK_3_IMX219) { + std::vector ret; + ret.push_back(ResolutionFramerate{640, 480, 30}); + ret.push_back(ResolutionFramerate{848, 480, 30}); + ret.push_back(ResolutionFramerate{1280, 720, 30}); + ret.push_back(ResolutionFramerate{1920, 1080, 30}); + return ret; + } else if (camera_type == X_CAM_TYPE_ROCK_3_IMX708) { + std::vector ret; + ret.push_back(ResolutionFramerate{1280, 720, 30}); + ret.push_back(ResolutionFramerate{1280, 720, 60}); + ret.push_back(ResolutionFramerate{1920, 1080, 60}); + return ret; + } else if (camera_type == X_CAM_TYPE_ROCK_3_IMX462) { + std::vector ret; + ret.push_back(ResolutionFramerate{1280, 720, 60}); + ret.push_back(ResolutionFramerate{1280, 720, 30}); + ret.push_back(ResolutionFramerate{1920, 1080, 30}); + ret.push_back(ResolutionFramerate{1920, 1080, 60}); + return ret; + } else if (camera_type == X_CAM_TYPE_ROCK_3_IMX519) { + std::vector ret; + ret.push_back(ResolutionFramerate{1280, 720, 60}); + ret.push_back(ResolutionFramerate{1280, 720, 30}); + ret.push_back(ResolutionFramerate{1920, 1080, 30}); + ret.push_back(ResolutionFramerate{1920, 1080, 60}); + return ret; + } else if (camera_type == X_CAM_TYPE_ROCK_3_OHD_Jaguar) { + std::vector ret; + ret.push_back(ResolutionFramerate{1280, 720, 60}); + ret.push_back(ResolutionFramerate{1280, 720, 120}); + ret.push_back(ResolutionFramerate{1920, 1080, 60}); + ret.push_back(ResolutionFramerate{1920, 1080, 100}); + return ret; + } else if (camera_type == X_CAM_TYPE_NVIDIA_XAVIER_IMX577) { + std::vector ret; + ret.push_back(ResolutionFramerate{1280, 720, 60}); + ret.push_back(ResolutionFramerate{1920, 1080, 60}); + return ret; + } else if (camera_type == X_CAM_TYPE_QC_IMX577) { + std::vector ret; + // very basic integration, driver is missing a lot of settings + ret.push_back(ResolutionFramerate{1280, 720, 30}); + ret.push_back(ResolutionFramerate{1920, 1080, 30}); + return ret; + } else if (camera_type == X_CAM_TYPE_QC_OV9282) { + std::vector ret; + // correct specs still missing + ret.push_back(ResolutionFramerate{1280, 720, 30}); + return ret; + } else if (camera_type == X_CAM_TYPE_ORQA_HORNET) { + std::vector ret; + // correct specs still missing + ret.push_back(ResolutionFramerate{960, 720, 120}); + return ret; + } else if (camera_type == X_CAM_TYPE_ORQA_JAGUAR) { + std::vector ret; + // correct specs still missing + ret.push_back(ResolutionFramerate{1280, 720, 120}); + return ret; + } else if (camera_type == X_CAM_TYPE_ORQA_REKINDLE) { + std::vector ret; + // correct specs still missing + ret.push_back(ResolutionFramerate{1280, 720, 60}); + return ret; + } else { + // Not mapped yet + // return something that might work or might not work + return {ResolutionFramerate{640, 480, 30}}; + } + } + // We default to the last supported resolution + [[nodiscard]] ResolutionFramerate get_default_resolution_fps() const { + auto supported_resolutions = get_supported_resolutions(); + return supported_resolutions.at(supported_resolutions.size() - 1); + } +}; + +static bool is_rpi_csi_camera(int cam_type) { + return cam_type >= 20 && cam_type <= 69; +} +static bool is_rock_csi_camera(int cam_type) { + return cam_type >= 80 && cam_type <= 99; +} +static bool is_orqa_csi_camera(int cam_type) { + return cam_type >= 122 && cam_type <= 124; +} +static bool is_usb_camera(int cam_type) { + return cam_type >= 10 && cam_type < 19; +} + +static bool is_valid_primary_cam_type(int cam_type) { + if (cam_type >= 0 && cam_type < X_CAM_TYPE_DISABLED) return true; + return false; +} +static bool is_valid_secondary_cam_type(int cam_type) { + if (is_usb_camera(cam_type)) return true; + if (cam_type == X_CAM_TYPE_DUMMY_SW || cam_type == X_CAM_TYPE_EXTERNAL || + cam_type == X_CAM_TYPE_EXTERNAL_IP || cam_type == X_CAM_TYPE_DISABLED) { + return true; + } + return false; +} +// Takes a string in the from {width}x{height}@{framerate} +// e.g. 1280x720@30 +static std::optional parse_video_format( + const std::string& videoFormat) { + // 0x0@0 is a valid resolution (omit resolution / fps in the pipeline) + if (videoFormat == "0x0@0") return ResolutionFramerate{0, 0, 0}; + // Otherwise, we need at least 6 characters (0x0@0 is 5 characters) + if (videoFormat.size() <= 5) { + return std::nullopt; + } + ResolutionFramerate tmp_video_format{0, 0, 0}; + const std::regex reg{R"((\d*)x(\d*)\@(\d*))"}; + std::smatch result; + if (std::regex_search(videoFormat, result, reg)) { + if (result.size() == 4) { + // openhd::log::get_default()->debug("result[0]=["+result[0].str()+"]"); + tmp_video_format.width_px = atoi(result[1].str().c_str()); + tmp_video_format.height_px = atoi(result[2].str().c_str()); + tmp_video_format.fps = atoi(result[3].str().c_str()); + return tmp_video_format; + } + } + return std::nullopt; +} + +// +// Used in QOpenHD UI +// +static std::string get_verbose_string_of_resolution( + const ResolutionFramerate& resolution_framerate) { + if (resolution_framerate.width_px == 0 && + resolution_framerate.height_px == 0 && resolution_framerate.fps == 0) { + return "AUTO"; + } + std::stringstream ss; + if (resolution_framerate.width_px == 640 && + resolution_framerate.height_px == 480) { + ss << "VGA 4:3"; + } else if (resolution_framerate.width_px == 848 && + resolution_framerate.height_px == 480) { + ss << "VGA 16:9"; + } else if (resolution_framerate.width_px == 896 && + resolution_framerate.height_px == 504) { + ss << "SD 16:9"; + } else if (resolution_framerate.width_px == 1280 && + resolution_framerate.height_px == 720) { + ss << "HD 16:9"; + } else if (resolution_framerate.width_px == 1920 && + resolution_framerate.height_px == 1080) { + ss << "FHD 16:9"; + } else if (resolution_framerate.width_px == 2560 && + resolution_framerate.height_px == 1440) { + ss << "2K 16:9"; + } else { + ss << resolution_framerate.width_px << "x" + << resolution_framerate.height_px; + } + ss << "\n" << resolution_framerate.fps << "fps"; + return ss.str(); +} + +static std::string get_v4l2_device_name_string(int value) { + std::stringstream ss; + ss << "/dev/video" << value; + return ss.str(); +} + +/** + * On platforms with many cameras (e.g. rpi) we need a differentiation by + * manufacturer to make a nice UI - otherwise, the choices are overwhelming. + * Manufacturer is not really the right name for all categories that result + * here, but it is 'okay' for the UI in qopenhd. + */ +struct CameraNameAndType { + std::string name; + int type; +}; +struct ManufacturerForPlatform { + std::string manufacturer_name; + std::vector cameras; +}; +/** + * Return: a list of categories for this platform. + * Each category has a list of valid camera types (for this platform). + * @param platform_type unique platform type + * @param is_secondary selection is different for secondary cam,most notably, we + * only support usb, develop and a 'disabled' type. + */ +static std::vector get_camera_choices_for_platform( + int platform_type, bool is_secondary) { + std::vector usb_cameras{ + CameraNameAndType{"INFIRAY USB", X_CAM_TYPE_USB_INFIRAY}, + CameraNameAndType{"INFIRAY USB T2", X_CAM_TYPE_USB_INFIRAY_T2}, + CameraNameAndType{"INFIRAY USB P2 Pro", X_CAM_TYPE_USB_INFIRAY_P2_PRO}, + CameraNameAndType{"INFIRAY USB X2", X_CAM_TYPE_USB_INFIRAY_X2}, + CameraNameAndType{"FLIR_VUE", X_CAM_TYPE_USB_FLIR_VUE}, + CameraNameAndType{"FLIR_BOSON", X_CAM_TYPE_USB_FLIR_BOSON}, + CameraNameAndType{"EXP USB GENERIC", X_CAM_TYPE_USB_GENERIC}}; + ManufacturerForPlatform MANUFACTURER_USB{"USB", usb_cameras}; + std::vector debug_cameras{ + CameraNameAndType{"Dummy (debug)", 0}, + CameraNameAndType{"External (DEV)", 2}, + // CameraNameAndType{"External IP (DEV)",3}, + CameraNameAndType{"DEV Filecamera", 4}, + }; + ManufacturerForPlatform MANUFACTURER_DEBUG{"DEV/DEBUG", debug_cameras}; + // Secondary can only be used with USB and / or the debug cameras. CSI is not + // usable for secondary. + if (is_secondary) { + // Not really a manufacturer, but ui looks okay with this + std::vector disable_camera{ + CameraNameAndType{"DISABLE", X_CAM_TYPE_DISABLED}, + }; + ManufacturerForPlatform MANUFACTURER_DISABLE{"DISABLE", disable_camera}; + return std::vector{ + MANUFACTURER_DISABLE, MANUFACTURER_USB, MANUFACTURER_DEBUG}; + } + if (platform_type == X_PLATFORM_TYPE_RPI_OLD || + platform_type == X_PLATFORM_TYPE_RPI_4 || + platform_type == X_PLATFORM_TYPE_RPI_CM4) { + std::vector arducam_cameras{ + CameraNameAndType{"SKYMASTERHDR", 40}, + CameraNameAndType{"SKYVISIONPRO", 41}, + CameraNameAndType{"IMX477m", 42}, + CameraNameAndType{"IMX462", 43}, + CameraNameAndType{"IMX327", 44}, + CameraNameAndType{"IMX290", 45}, + CameraNameAndType{"IMX462_LOWLIGHT_MINI", 46}, + CameraNameAndType{"IMX662", 47}}; + std::vector veye_cameras{ + CameraNameAndType{"2MP", 60}, + CameraNameAndType{"CSIMX307", 61}, + CameraNameAndType{"CSSC132", 62}, + CameraNameAndType{"MVCAM", 63}, + }; + std::vector rpif_cameras{ + CameraNameAndType{"V1 OV5647", 30}, + CameraNameAndType{"V2 IMX219", 31}, + CameraNameAndType{"V3 IMX708", 32}, + CameraNameAndType{"HQ IMX477", 33}, + }; + std::vector hdmi_to_csi_cameras{ + CameraNameAndType{"GENERIC HDMI to CSI", 20}}; + return std::vector{ + ManufacturerForPlatform{"ARDUCAM", arducam_cameras}, + ManufacturerForPlatform{"VEYE", veye_cameras}, + ManufacturerForPlatform{"RPI FOUNDATION", rpif_cameras}, + ManufacturerForPlatform{"HDMI TO CSI", hdmi_to_csi_cameras}, + MANUFACTURER_USB, + MANUFACTURER_DEBUG}; + } else if (platform_type == X_PLATFORM_TYPE_ALWINNER_X20) { + std::vector runcam_cameras{ + CameraNameAndType{"OpenHD Jaguar", X_CAM_TYPE_X21_OHD_Jaguar}, + }; + } else if (platform_type == X_PLATFORM_TYPE_ALWINNER_X20) { + // On the X20, we have auto detection of the camera type, + // But we still populate the UI like for platforms where the user has to + // select the cam type. + std::vector generic_cameras{ + CameraNameAndType{"GENERIC", X_PLATFORM_TYPE_ROCKCHIP_RV1126}, + }; + std::vector runcam_cameras{ + CameraNameAndType{"RUNCAM V1", X_CAM_TYPE_X20_HDZERO_RUNCAM_V1}, + CameraNameAndType{"RUNCAM V2", X_CAM_TYPE_X20_HDZERO_RUNCAM_V2}, + CameraNameAndType{"RUNCAM V3", X_CAM_TYPE_X20_HDZERO_RUNCAM_V3}, + CameraNameAndType{"RUNCAM NANO 90", + X_CAM_TYPE_X20_HDZERO_RUNCAM_NANO_90}, + CameraNameAndType{"OpenHD Jaguar", X_CAM_TYPE_X20_OHD_Jaguar}, + }; + return std::vector{ + ManufacturerForPlatform{"HDZERO", generic_cameras}, + ManufacturerForPlatform{"RUNCAM", runcam_cameras}}; + } else if ((platform_type == X_PLATFORM_TYPE_ROCKCHIP_RK3566_RADXA_ZERO3W) || + (platform_type == X_PLATFORM_TYPE_ROCKCHIP_RK3566_RADXA_CM3)) { + std::vector arducam_cameras{ + CameraNameAndType{"IMX462", X_CAM_TYPE_ROCK_3_IMX462}, + CameraNameAndType{"IMX519", X_CAM_TYPE_ROCK_3_IMX519}, + CameraNameAndType{"IMX708", X_CAM_TYPE_ROCK_3_IMX708}, + CameraNameAndType{"OpenHD Jaguar", X_CAM_TYPE_ROCK_3_OHD_Jaguar}}; + std::vector generic_cameras{ + CameraNameAndType{"HDMI IN", X_CAM_TYPE_ROCK_3_HDMI_IN}, + CameraNameAndType{"OV5647", X_CAM_TYPE_ROCK_3_OV5647}, + CameraNameAndType{"IMX219", X_CAM_TYPE_ROCK_3_IMX219}}; + return std::vector{ + ManufacturerForPlatform{"Arducam", arducam_cameras}, MANUFACTURER_USB, + MANUFACTURER_DEBUG}; + } else if (platform_type == X_PLATFORM_TYPE_ROCKCHIP_RK3588_RADXA_ROCK5_A) { + std::vector generic_cameras{ + CameraNameAndType{"IMX415", X_CAM_TYPE_ROCK_5_IMX415}, + CameraNameAndType{"IMX462", X_CAM_TYPE_ROCK_5_IMX462}, + CameraNameAndType{"IMX477", X_CAM_TYPE_ROCK_5_IMX477}, + CameraNameAndType{"IMX519", X_CAM_TYPE_ROCK_5_IMX519}, + CameraNameAndType{"OV5647", X_CAM_TYPE_ROCK_5_OV5647}, + CameraNameAndType{"IMX219", X_CAM_TYPE_ROCK_5_IMX219}, + CameraNameAndType{"IMX708", X_CAM_TYPE_ROCK_5_IMX708}, + CameraNameAndType{"OpenHD Jaguar", X_CAM_TYPE_ROCK_5_OHD_Jaguar}}; + return std::vector{ + ManufacturerForPlatform{"Generic", generic_cameras}, MANUFACTURER_USB, + MANUFACTURER_DEBUG}; + } else if (platform_type == X_PLATFORM_TYPE_ROCKCHIP_RK3588_RADXA_ROCK5_B) { + std::vector generic_cameras{ + CameraNameAndType{"HDMI IN", X_CAM_TYPE_ROCK_5_HDMI_IN}, + CameraNameAndType{"IMX415", X_CAM_TYPE_ROCK_5_IMX415}, + CameraNameAndType{"IMX462", X_CAM_TYPE_ROCK_5_IMX462}, + CameraNameAndType{"IMX477", X_CAM_TYPE_ROCK_5_IMX477}, + CameraNameAndType{"IMX519", X_CAM_TYPE_ROCK_5_IMX519}, + CameraNameAndType{"OV5647", X_CAM_TYPE_ROCK_5_OV5647}, + CameraNameAndType{"IMX219", X_CAM_TYPE_ROCK_5_IMX219}, + CameraNameAndType{"IMX708", X_CAM_TYPE_ROCK_5_IMX708}, + CameraNameAndType{"OpenHD Jaguar", X_CAM_TYPE_ROCK_5_OHD_Jaguar}, + }; + return std::vector{ + ManufacturerForPlatform{"Generic", generic_cameras}, MANUFACTURER_USB, + MANUFACTURER_DEBUG}; + } else if (platform_type == X_PLATFORM_TYPE_X86) { + return std::vector{MANUFACTURER_USB, + MANUFACTURER_DEBUG}; + } else if (platform_type == X_PLATFORM_TYPE_NVIDIA_XAVIER) { + std::vector nvidia_leopard_csi_cameras{ + CameraNameAndType{"IMX577", X_CAM_TYPE_NVIDIA_XAVIER_IMX577}, + }; + return std::vector{ + ManufacturerForPlatform{"LEOPARD", nvidia_leopard_csi_cameras}, + MANUFACTURER_USB, MANUFACTURER_DEBUG}; + } else if (platform_type == X_PLATFORM_TYPE_ORQA) { + std::vector orqa_cameras{ + CameraNameAndType{"HORNET", X_CAM_TYPE_ORQA_HORNET}, + CameraNameAndType{"JAGUAR", X_CAM_TYPE_ORQA_JAGUAR}, + CameraNameAndType{"REKINDLE", X_CAM_TYPE_ORQA_REKINDLE}, + }; + return std::vector{ + ManufacturerForPlatform{"ORQA DIGITAL", orqa_cameras}, + MANUFACTURER_USB, MANUFACTURER_DEBUG}; + } + return std::vector{MANUFACTURER_DEBUG}; +} + +#endif // OPENHD_CAMERA_HPP diff --git a/app/telemetry/models/openhd_core/openhd_platform.h b/app/telemetry/models/openhd_core/openhd_platform.h new file mode 100644 index 000000000..d3e425a8b --- /dev/null +++ b/app/telemetry/models/openhd_core/openhd_platform.h @@ -0,0 +1,6 @@ +#ifndef OPENHD_PLATFORM_H +#define OPENHD_PLATFORM_H + +#include "platform.hpp" + +#endif // OPENHD_PLATFORM_H diff --git a/app/telemetry/models/openhd_core/platform.hpp b/app/telemetry/models/openhd_core/platform.hpp index 177509922..922a5f015 100644 --- a/app/telemetry/models/openhd_core/platform.hpp +++ b/app/telemetry/models/openhd_core/platform.hpp @@ -45,7 +45,7 @@ static constexpr int X_PLATFORM_TYPE_NVIDIA_XAVIER = 40; // Numbers 46..50 are reserved for QUALCOMM static constexpr int X_PLATFORM_TYPE_QUALCOMM_QRB5165 = 46; static constexpr int X_PLATFORM_TYPE_QUALCOMM_QCS405 = 47; -static constexpr int X_PLATFORM_TYPE_WILLY = 51; +static constexpr int X_PLATFORM_TYPE_ORQA = 51; // ORQA Digital static constexpr int X_PLATFORM_TYPE_UXV_MOD = 52; // Numbers static std::string x_platform_type_to_string(int platform_type) { @@ -75,15 +75,15 @@ static std::string x_platform_type_to_string(int platform_type) { case X_PLATFORM_TYPE_ALWINNER_X20: return "X20"; case X_PLATFORM_TYPE_ROCKCHIP_RV1126: - return "SCHWANZUS LONGUS"; - case X_PLATFORM_TYPE_WILLY: - return "FREE WILLY"; + return "X21"; case X_PLATFORM_TYPE_UXV_MOD: return "UXV NAV"; case X_PLATFORM_TYPE_OPENIPC_SIGMASTAR_UNDEFINED: return "OPENIPC SIGMASTAR"; case X_PLATFORM_TYPE_NVIDIA_XAVIER: return "NVIDIA_XAVIER"; + case X_PLATFORM_TYPE_ORQA: + return "ORQA DIGITAL"; default: break; } diff --git a/app/util/qopenhd.cpp b/app/util/qopenhd.cpp index c14c37a7b..679bb7e9a 100644 --- a/app/util/qopenhd.cpp +++ b/app/util/qopenhd.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -76,24 +77,46 @@ void QOpenHD::setEngine(QQmlApplicationEngine *engine) { m_engine = engine; } -void QOpenHD::switchToLanguage(const QString &language) { - if(m_engine==nullptr){ - qDebug()<<"Error switch language- engine not set"; - return; - } +bool QOpenHD::loadTranslator(const QString &language, QSettings *settings) +{ QLocale::setDefault(QLocale(language)); - if (!m_translator.isEmpty()) { - QCoreApplication::removeTranslator(&m_translator); + QString qmFile = QString(":/translations/QOpenHD_%1.qm").arg(language); + if (!m_translator.load(qmFile)) { + qDebug() << "Translation load failed for" << language << ", falling back to English"; + QLocale::setDefault(QLocale("en")); + if (settings != nullptr) { + settings->setValue("locale", "en"); + } + return m_translator.load(":/translations/QOpenHD_en.qm"); } - bool success = m_translator.load(":/translations/QOpenHD.qm"); - if (!success) { - qDebug() << "Translation load failed"; - return; + if (settings != nullptr) { + settings->setValue("locale", language); } + + return true; +} + +bool QOpenHD::installTranslatorForLanguage(const QString &language, QSettings *settings) +{ + QCoreApplication::removeTranslator(&m_translator); + + bool success = loadTranslator(language, settings); QCoreApplication::installTranslator(&m_translator); - m_engine->retranslate(); + + return success; +} + +void QOpenHD::switchToLanguage(const QString &language) { + if(m_engine==nullptr){ + qDebug()<<"Error switch language- engine not set"; + return; + } + QSettings settings; + installTranslatorForLanguage(language, &settings); + // QML should automatically retranslate when translator is installed/removed + // Calling retranslate() can cause UI issues in QML applications } void QOpenHD::setFontFamily(QString fontFamily) { diff --git a/app/util/qopenhd.h b/app/util/qopenhd.h index a07510954..6c6e3f04d 100644 --- a/app/util/qopenhd.h +++ b/app/util/qopenhd.h @@ -5,6 +5,8 @@ #include #include #include +#include +#include #ifdef ENABLE_SPEECH #include @@ -71,22 +73,26 @@ class QOpenHD : public QObject // Tries to mimic android toast as much as possible // Q_INVOKABLE void show_toast(QString message,bool long_toast=false); - L_RO_PROP(QString,version_string,set_version_string,"2.6.4-evo"); + L_RO_PROP(QString,version_string,set_version_string,"2.7.0-evo"); // // Shows a message popup to the user that needs to be clicked away - use sparingly // Q_INVOKABLE void show_error_message(QString message); L_RO_PROP(QString,error_message_text,set_error_message_text,""); // Notify that something is going on for a specified amount of time -public: + public: Q_INVOKABLE void set_busy_for_milliseconds(int milliseconds,QString reason); L_RO_PROP(bool,is_busy,set_is_busy,false); L_RO_PROP(QString,busy_reason,set_busy_reason,""); -public: + public: L_RO_PROP(QString,toast_text,set_toast_text,"NONE"); L_RO_PROP(bool,toast_visible,set_toast_visible,false); -public: -signals: + public: + bool installTranslatorForLanguage(const QString &language, QSettings *settings = nullptr); + private: + bool loadTranslator(const QString &language, QSettings *settings); + public: + signals: void fontFamilyChanged(QString fontFamily); private: QQmlApplicationEngine *m_engine = nullptr; diff --git a/app/videostreaming/android/lowlagdecoder.cpp b/app/videostreaming/android/lowlagdecoder.cpp index dc7fd34b3..8e04cf276 100644 --- a/app/videostreaming/android/lowlagdecoder.cpp +++ b/app/videostreaming/android/lowlagdecoder.cpp @@ -6,12 +6,14 @@ #include #include +#include -#define MLOGD qDebug() +#define MLOGD if(m_printDebugInfo) qDebug()<<"["< buff={}; const auto SPS=kff.getCSD0(); const auto PPS=kff.getCSD1(); @@ -40,49 +45,72 @@ static void h265_configureAMediaFormat(CodecConfigFinder& kff,AMediaFormat* form AMediaFormat_setInt32(format,AMEDIAFORMAT_KEY_WIDTH,videoWH[0]); AMediaFormat_setInt32(format,AMEDIAFORMAT_KEY_HEIGHT,videoWH[1]); AMediaFormat_setBuffer(format,"csd-0",buff.data(),buff.size()); - MLOGD<<"Video WH:"<GetJavaVM(&javaVm); resetStatistics(); } -void LowLagDecoder::setOutputSurface(JNIEnv* env,jobject surface){ - USE_SW_DECODER_INSTEAD=false; - if(surface==nullptr){ - //MLOGD<<"Set output surface to null"; - //assert(decoder.window!=nullptr); - if(decoder.window== nullptr){ - //MLOGD<<"Decoder window is already null"; - return; - } - std::lock_guard lock(mMutexInputPipe); - inputPipeClosed=true; - if(decoder.configured){ +void LowLagDecoder::releaseDecoderResources(bool releaseWindow) +{ + std::lock_guard lock(mMutexInputPipe); + releaseDecoderResourcesLocked(releaseWindow); +} + +void LowLagDecoder::releaseDecoderResourcesLocked(bool releaseWindow) +{ + inputPipeClosed=true; + if(decoder.configured){ + if (decoder.codec) { AMediaCodec_stop(decoder.codec); AMediaCodec_delete(decoder.codec); decoder.codec=nullptr; - mKeyFrameFinder.reset(); - decoder.configured=false; - if(mCheckOutputThread->joinable()){ - mCheckOutputThread->join(); - mCheckOutputThread.reset(); - } } + mKeyFrameFinder.reset(); + decoder.configured=false; + if(mCheckOutputThread && mCheckOutputThread->joinable()){ + mCheckOutputThread->join(); + } + mCheckOutputThread.reset(); + } + if (releaseWindow && decoder.window) { ANativeWindow_release(decoder.window); decoder.window=nullptr; - resetStatistics(); - }else{ - // Throw warning if the surface is set without clearing it first - assert(decoder.window==nullptr); - decoder.window=ANativeWindow_fromSurface(env,surface); - // open the input pipe - now the decoder will start as soon as enough data is available + } + resetStatistics(); + if (!releaseWindow && decoder.window) { inputPipeClosed=false; } } +void LowLagDecoder::setOutputSurface(JNIEnv* env,jobject surface){ + USE_SW_DECODER_INSTEAD=false; + + std::lock_guard lock(mMutexInputPipe); + + if(surface==nullptr){ + if(decoder.window== nullptr){ + return; + } + releaseDecoderResourcesLocked(true); + return; + } + + if(decoder.window!=nullptr){ + releaseDecoderResourcesLocked(true); + } + + decoder.window=ANativeWindow_fromSurface(env,surface); + // open the input pipe - now the decoder will start as soon as enough data is available + inputPipeClosed=false; +} + void LowLagDecoder::registerOnDecoderRatioChangedCallback(DECODER_RATIO_CHANGED decoderRatioChangedC) { onDecoderRatioChangedCallback=std::move(decoderRatioChangedC); } @@ -94,8 +122,10 @@ void LowLagDecoder::registerOnDecodingInfoChangedCallback(DECODING_INFO_CHANGED_ void LowLagDecoder::interpretNALU(const NALU& nalu){ //return; // TODO: RN switching between h264 / h265 requires re-setting the surface - if(decoder.configured){ - assert(nalu.IS_H265_PACKET==IS_H265); + std::lock_guard lock(mMutexInputPipe); + if(decoder.configured && nalu.IS_H265_PACKET!=IS_H265){ + MLOGD << "Codec change detected while decoder is configured; restarting decoder"; + releaseDecoderResourcesLocked(false); } IS_H265=nalu.IS_H265_PACKET; //MLOGD<<"Is H265 "< lock(mMutexInputPipe); decodingInfo.nNALU++; if(nalu.getSize()<=4){ //No data in NALU (e.g at the beginning of a stream) @@ -159,12 +187,18 @@ void LowLagDecoder::configureStartDecoder(){ //MLOGD<<"Created decoder "<TIME_BETWEEN_LOGS){ - lastLog=now; - std::ostringstream frameLog; - frameLog<TIME_BETWEEN_LOGS){ + lastLog=now; + std::ostringstream frameLog; + frameLog< #include #include +#include #include #include @@ -64,7 +65,7 @@ class LowLagDecoder { //We cannot initialize the Decoder until we have SPS and PPS data - //when streaming this data will be available at some point in future //Therefore we don't allocate the MediaCodec resources here - LowLagDecoder(JNIEnv* env); + LowLagDecoder(JNIEnv* env, bool verboseLogging = false, std::string logTag = "decoder"); // This call acquires or releases the output surface // After acquiring the surface, the decoder will be started as soon as enough configuration data was passed to it // When releasing the surface, the decoder will be stopped if running and any resources will be freed @@ -78,6 +79,8 @@ class LowLagDecoder { // If the input pipe was closed (surface has been removed or is not set yet), only buffer key frames void interpretNALU(const NALU& nalu); private: + void releaseDecoderResources(bool releaseWindow); + void releaseDecoderResourcesLocked(bool releaseWindow); //Initialize decoder with SPS / PPS data from KeyFrameFinder //Set Decoder.configured to true on success void configureStartDecoder(); @@ -108,7 +111,8 @@ class LowLagDecoder { AvgCalculator decodingTime; //Every n ms re-calculate the Decoding info static const constexpr auto DECODING_INFO_RECALCULATION_INTERVAL=std::chrono::milliseconds(1000); - static constexpr const bool PRINT_DEBUG_INFO=true; + const bool m_printDebugInfo; + const std::string m_logTag; static constexpr auto TIME_BETWEEN_LOGS=std::chrono::seconds(5); static constexpr int64_t BUFFER_TIMEOUT_US=35*1000; //40ms (a little bit more than 32 ms (==30 fps)) private: diff --git a/app/videostreaming/android/qandroidmediaplayer.cpp b/app/videostreaming/android/qandroidmediaplayer.cpp index 33d32b520..b9f9eeffb 100644 --- a/app/videostreaming/android/qandroidmediaplayer.cpp +++ b/app/videostreaming/android/qandroidmediaplayer.cpp @@ -2,21 +2,28 @@ #include "qsurfacetexture.h" #include +#include #include QAndroidMediaPlayer::QAndroidMediaPlayer(QObject *parent) : QObject(parent) { - setup_start_video_decoder_display(); + const auto settings = QOpenHDVideoHelper::read_config_from_settings(); + m_primaryVideoEnabled = !settings.generic.dev_disable_primary_video; + if (!m_primaryVideoEnabled) { + qInfo() << "Primary Android video disabled in settings; skipping decoder initialization"; + return; + } + setup_start_video_decoder_display(settings); } -void QAndroidMediaPlayer::setup_start_video_decoder_display() +void QAndroidMediaPlayer::setup_start_video_decoder_display(const QOpenHDVideoHelper::VideoStreamConfig &config) { // Everything should be cleaned up assert(m_low_lag_decoder==nullptr); assert(m_receiver==nullptr); - m_low_lag_decoder=std::make_unique(nullptr); + m_low_lag_decoder=std::make_unique(nullptr, false, "primary"); auto stats_cb=[](const DecodingInfo di){ std::stringstream ss; ss<registerOnDecoderRatioChangedCallback(ratio_changed_cb); - const auto settings=QOpenHDVideoHelper::read_config_from_settings(); - auto codec=settings.primary_stream_config.video_codec; - const int port = settings.generic.qopenhd_switch_primary_secondary ? 5601 : 5600; + auto codec=config.primary_stream_config.video_codec; + const int port = config.generic.qopenhd_switch_primary_secondary ? 5601 : 5600; m_receiver=std::make_unique(port,codec); } void QAndroidMediaPlayer::stop_cleanup_decoder_display() { // first, we stop the rtp receiver - m_receiver->stop_receiving(); - m_receiver=nullptr; + if (m_receiver) { + m_receiver->stop_receiving(); + m_receiver=nullptr; + } // Then we can safely clean up the decoder (and its surface) - m_low_lag_decoder->setOutputSurface(nullptr,nullptr); - m_low_lag_decoder=nullptr; + if (m_low_lag_decoder) { + m_low_lag_decoder->setOutputSurface(nullptr,nullptr); + m_low_lag_decoder=nullptr; + } } QAndroidMediaPlayer::~QAndroidMediaPlayer() @@ -69,7 +79,11 @@ void QAndroidMediaPlayer::setVideoOut(QSurfaceTexture *videoOut) if (m_videoOut) m_videoOut->disconnect(this); m_videoOut = videoOut; - qDebug()<<"QAndroidMediaPlayer::setVideoOut"; + if (!m_primaryVideoEnabled) { + qInfo() << "Primary Android video is disabled; not attaching video surface"; + emit videoOutChanged(); + return; + } auto setSurfaceTexture = [=]{ // Create a new Surface object from our SurfaceTexture @@ -91,6 +105,10 @@ void QAndroidMediaPlayer::setVideoOut(QSurfaceTexture *videoOut) QAndroidJniEnvironment env; m_low_lag_decoder->setOutputSurface(env,surface.object()); } + if (!m_receiver || !m_low_lag_decoder) { + qWarning() << "Primary Android video pipeline not initialized; cannot start playback"; + return; + } auto cb=[this](std::shared_ptr> sample){ bool is_h265=m_receiver->get_codec()==QOpenHDVideoHelper::VideoCodecH265; NALU nalu(sample->data(),sample->size(),is_h265); diff --git a/app/videostreaming/android/qandroidmediaplayer.h b/app/videostreaming/android/qandroidmediaplayer.h index 4dfceff3d..87524ee5a 100644 --- a/app/videostreaming/android/qandroidmediaplayer.h +++ b/app/videostreaming/android/qandroidmediaplayer.h @@ -7,6 +7,7 @@ #include "lowlagdecoder.h" #include "../gstreamer/gstrtpreceiver.h" +#include "../vscommon/QOpenHDVideoHelper.hpp" class QSurfaceTexture; class QAndroidMediaPlayer : public QObject @@ -24,7 +25,7 @@ class QAndroidMediaPlayer : public QObject //Q_INVOKABLE void playFile(const QString &file); void switch_primary_secondary(); private: - void setup_start_video_decoder_display(); + void setup_start_video_decoder_display(const QOpenHDVideoHelper::VideoStreamConfig &config); void stop_cleanup_decoder_display(); signals: void videoOutChanged(); @@ -32,6 +33,7 @@ class QAndroidMediaPlayer : public QObject private: QPointer m_videoOut; private: + bool m_primaryVideoEnabled = true; std::unique_ptr m_low_lag_decoder=nullptr; std::unique_ptr m_receiver=nullptr; }; diff --git a/app/videostreaming/android/qandroidsecondarymediaplayer.cpp b/app/videostreaming/android/qandroidsecondarymediaplayer.cpp index 77bb292b5..f804a0629 100644 --- a/app/videostreaming/android/qandroidsecondarymediaplayer.cpp +++ b/app/videostreaming/android/qandroidsecondarymediaplayer.cpp @@ -7,21 +7,10 @@ #include "qsurfacetexture.h" -#include "../vscommon/QOpenHDVideoHelper.hpp" - namespace { -QString buildStreamUrl(const QOpenHDVideoHelper::VideoStreamConfigXX &config) +QString codecName(QOpenHDVideoHelper::VideoCodec codec) { - const QString ip = QString::fromStdString(config.udp_rtp_input_ip_address).trimmed(); - const int port = config.udp_rtp_input_port; - - if (ip.isEmpty()) - return {}; - - if (ip == QLatin1String("127.0.0.1") || ip == QLatin1String("0.0.0.0")) - return QStringLiteral("udp://@:%1").arg(port); - - return QStringLiteral("udp://%1:%2").arg(ip).arg(port); + return QString::fromStdString(QOpenHDVideoHelper::video_codec_to_string(codec)); } } // namespace @@ -32,7 +21,7 @@ QAndroidSecondaryMediaPlayer::QAndroidSecondaryMediaPlayer(QObject *parent) QAndroidSecondaryMediaPlayer::~QAndroidSecondaryMediaPlayer() { - releaseMediaPlayer(); + stopPlayback(); } QSurfaceTexture *QAndroidSecondaryMediaPlayer::videoOut() const @@ -45,15 +34,18 @@ void QAndroidSecondaryMediaPlayer::setVideoOut(QSurfaceTexture *videoOut) if (m_videoOut == videoOut) return; - if (m_videoOut) + if (m_videoOut) { m_videoOut->disconnect(this); + stopPlayback(); + } m_videoOut = videoOut; if (!m_videoOut) { - releaseMediaPlayer(); + stopPlayback(); } else { connect(m_videoOut.data(), &QSurfaceTexture::surfaceTextureChanged, this, [this] { + stopPlayback(); m_pendingPlayback = true; tryStartPlayback(); }); @@ -69,161 +61,147 @@ void QAndroidSecondaryMediaPlayer::playDebugLoop() tryStartPlayback(); } +std::optional QAndroidSecondaryMediaPlayer::resolveStreamConfig() const +{ + const auto settings = QOpenHDVideoHelper::read_config_from_settings(); + auto streamConfig = settings.secondary_stream_config; + switch (settings.generic.dev_secondary_video_input_mode) { + case 1: + streamConfig = settings.primary_stream_config; + break; + case 2: + qWarning() << "Secondary Android test clip mode is not supported with the low-latency decoder"; + return std::nullopt; + default: + if (settings.generic.qopenhd_switch_primary_secondary) + streamConfig = settings.primary_stream_config; + break; + } + + if (streamConfig.video_codec == QOpenHDVideoHelper::VideoCodecMJPEG) { + qWarning() << "Secondary Android low-latency decoder does not support MJPEG codec"; + return std::nullopt; + } + + return streamConfig; +} + void QAndroidSecondaryMediaPlayer::tryStartPlayback() { if (!m_pendingPlayback) return; - if (!m_mediaPlayer.isValid()) { - m_mediaPlayer = QAndroidJniObject("android/media/MediaPlayer"); - if (!m_mediaPlayer.isValid()) { - qWarning("Failed to create Android MediaPlayer for secondary video"); - QAndroidJniEnvironment env; - if (env->ExceptionCheck()) { - env->ExceptionDescribe(); - env->ExceptionClear(); - } - return; - } - } - if (!m_videoOut) return; - const QAndroidJniObject surfaceTexture = m_videoOut->surfaceTexture(); - if (!surfaceTexture.isValid()) + if (m_playbackRunning) { + m_pendingPlayback = false; return; + } - const QString streamUrl = resolveStreamUrl(); - if (streamUrl.isEmpty()) + const auto streamConfig = resolveStreamConfig(); + if (!streamConfig) { return; + } - startPlaybackOnAndroidThread(streamUrl, surfaceTexture); -} + const QAndroidJniObject surfaceTexture = m_videoOut->surfaceTexture(); + if (!surfaceTexture.isValid()) { + qWarning() << "Secondary Android surface texture is invalid; delaying playback"; + return; + } -QString QAndroidSecondaryMediaPlayer::resolveStreamUrl() const -{ - const auto settings = QOpenHDVideoHelper::read_config_from_settings(); - auto streamConfig = settings.secondary_stream_config; - if (settings.generic.qopenhd_switch_primary_secondary) - streamConfig = settings.primary_stream_config; + if (m_activeConfig != streamConfig) { + qInfo() << "Secondary Android stream config updated. Port:" << streamConfig->udp_rtp_input_port + << "Codec:" << codecName(streamConfig->video_codec); + stopPlayback(); + m_activeConfig = streamConfig; + } - if (streamConfig.video_codec == QOpenHDVideoHelper::VideoCodecMJPEG) { - qWarning() << "Secondary Android MediaPlayer does not support MJPEG codec"; - return {}; + if (!m_lowLagDecoder) { + qInfo() << "Creating secondary low-latency decoder"; + m_lowLagDecoder = std::make_unique(nullptr, true, "secondary"); + m_lowLagDecoder->registerOnDecoderRatioChangedCallback([this](const VideoRatio ratio) { + if (m_videoOut) { + m_videoOut->set_video_texture_size(ratio.width, ratio.height); + } + }); + m_lowLagDecoder->registerOnDecodingInfoChangedCallback([](const DecodingInfo &info) { + qInfo() << "Secondary decoder stats fps:" << info.currentFPS << "parse_ms:" << info.avgParsingTime_ms + << "wait_ms:" << info.avgWaitForInputBTime_ms << "decode_ms:" << info.avgDecodingTime_ms; + }); + } + + if (!m_receiver && m_activeConfig) { + qInfo() << "Starting secondary RTP receiver on port" << m_activeConfig->udp_rtp_input_port + << "for codec" << codecName(m_activeConfig->video_codec); + m_receiver = std::make_unique(m_activeConfig->udp_rtp_input_port, + m_activeConfig->video_codec); } - const QString url = buildStreamUrl(streamConfig); - if (url.isEmpty()) - qWarning() << "Unable to resolve UDP URL for Android secondary stream"; + if (!m_receiver || !m_lowLagDecoder) + return; - return url; + startPlaybackOnAndroidThread(surfaceTexture); } -void QAndroidSecondaryMediaPlayer::startPlaybackOnAndroidThread(const QString &streamUrl, - const QAndroidJniObject &surfaceTexture) +void QAndroidSecondaryMediaPlayer::startPlaybackOnAndroidThread(const QAndroidJniObject &surfaceTexture) { - QPointer that(this); - QtAndroid::runOnAndroidThread([that, surfaceTexture, streamUrl] { - if (!that) - return; + if (!m_activeConfig || !m_lowLagDecoder || !m_receiver) + return; - if (!that->m_mediaPlayer.isValid()) + QPointer that(this); + QtAndroid::runOnAndroidThread([this, that, surfaceTexture] { + if (!that || !m_activeConfig || !m_lowLagDecoder || !m_receiver) return; QAndroidJniEnvironment env; - - that->m_surface = QAndroidJniObject("android/view/Surface", - "(Landroid/graphics/SurfaceTexture;)V", - surfaceTexture.object()); - if (!that->m_surface.isValid()) { - if (env->ExceptionCheck()) { - env->ExceptionDescribe(); - env->ExceptionClear(); - } - return; - } - - that->m_mediaPlayer.callMethod("setSurface", - "(Landroid/view/Surface;)V", - that->m_surface.object()); - if (env->ExceptionCheck()) { - env->ExceptionDescribe(); - env->ExceptionClear(); - return; - } - - that->m_mediaPlayer.callMethod("reset"); + QAndroidJniObject surface("android/view/Surface", + "(Landroid/graphics/SurfaceTexture;)V", + surfaceTexture.object()); if (env->ExceptionCheck()) { + qWarning() << "Secondary Android surface creation failed"; env->ExceptionDescribe(); env->ExceptionClear(); return; } - const QAndroidJniObject url = QAndroidJniObject::fromString(streamUrl); - that->m_mediaPlayer.callMethod("setDataSource", - "(Ljava/lang/String;)V", - url.object()); - if (env->ExceptionCheck()) { - env->ExceptionDescribe(); - env->ExceptionClear(); + if (!surface.isValid()) { + qWarning() << "Secondary Android surface is invalid"; return; } - that->m_mediaPlayer.callMethod("setLooping", "(Z)V", true); - if (env->ExceptionCheck()) { - env->ExceptionDescribe(); - env->ExceptionClear(); - return; - } - - that->m_mediaPlayer.callMethod("prepare"); - if (env->ExceptionCheck()) { - env->ExceptionDescribe(); - env->ExceptionClear(); - return; - } + m_lowLagDecoder->setOutputSurface(env, surface.object()); - that->m_mediaPlayer.callMethod("start"); - if (env->ExceptionCheck()) { - env->ExceptionDescribe(); - env->ExceptionClear(); - return; - } + auto *receiver = m_receiver.get(); + auto *decoder = m_lowLagDecoder.get(); + m_receiver->start_receiving([that, decoder, receiver](std::shared_ptr> sample) { + if (!that || !decoder || !receiver) + return; + const bool is_h265 = receiver->get_codec() == QOpenHDVideoHelper::VideoCodecH265; + NALU nalu(sample->data(), sample->size(), is_h265); + decoder->interpretNALU(nalu); + }); - that->m_pendingPlayback = false; + m_pendingPlayback = false; + m_playbackRunning = true; }); } -void QAndroidSecondaryMediaPlayer::releaseMediaPlayer() +void QAndroidSecondaryMediaPlayer::stopPlayback() { - if (!m_mediaPlayer.isValid()) { - m_pendingPlayback = false; - m_surface = QAndroidJniObject(); - return; + if (m_receiver) { + qInfo() << "Stopping secondary RTP receiver"; + m_receiver->stop_receiving(); + m_receiver.reset(); } - QAndroidJniObject player = m_mediaPlayer; - QtAndroid::runOnAndroidThread([player] { + if (m_lowLagDecoder) { QAndroidJniEnvironment env; - player.callMethod("stop"); - if (env->ExceptionCheck()) { - env->ExceptionDescribe(); - env->ExceptionClear(); - } - player.callMethod("reset"); - if (env->ExceptionCheck()) { - env->ExceptionDescribe(); - env->ExceptionClear(); - } - player.callMethod("release"); - if (env->ExceptionCheck()) { - env->ExceptionDescribe(); - env->ExceptionClear(); - } - }); + m_lowLagDecoder->setOutputSurface(env, nullptr); + m_lowLagDecoder.reset(); + } - m_mediaPlayer = QAndroidJniObject(); - m_surface = QAndroidJniObject(); + m_activeConfig.reset(); m_pendingPlayback = false; + m_playbackRunning = false; } diff --git a/app/videostreaming/android/qandroidsecondarymediaplayer.h b/app/videostreaming/android/qandroidsecondarymediaplayer.h index 7e3e4d3e0..281f5a366 100644 --- a/app/videostreaming/android/qandroidsecondarymediaplayer.h +++ b/app/videostreaming/android/qandroidsecondarymediaplayer.h @@ -5,8 +5,15 @@ #include #include +#include +#include + #include +#include "lowlagdecoder.h" +#include "../gstreamer/gstrtpreceiver.h" +#include "../vscommon/QOpenHDVideoHelper.hpp" + class QSurfaceTexture; class QAndroidSecondaryMediaPlayer : public QObject @@ -28,15 +35,16 @@ class QAndroidSecondaryMediaPlayer : public QObject private: void tryStartPlayback(); - void startPlaybackOnAndroidThread(const QString &streamUrl, - const QAndroidJniObject &surfaceTexture); - QString resolveStreamUrl() const; - void releaseMediaPlayer(); + void startPlaybackOnAndroidThread(const QAndroidJniObject &surfaceTexture); + std::optional resolveStreamConfig() const; + void stopPlayback(); QPointer m_videoOut; bool m_pendingPlayback = false; - QAndroidJniObject m_mediaPlayer; - QAndroidJniObject m_surface; + bool m_playbackRunning = false; + std::optional m_activeConfig; + std::unique_ptr m_lowLagDecoder; + std::unique_ptr m_receiver; }; #endif // QANDROIDSECONDARYMEDIAPLAYER_H diff --git a/app/videostreaming/gstreamer/gstqmlglsinkstream.cpp b/app/videostreaming/gstreamer/gstqmlglsinkstream.cpp index 49b2130d5..8583fb13b 100644 --- a/app/videostreaming/gstreamer/gstqmlglsinkstream.cpp +++ b/app/videostreaming/gstreamer/gstqmlglsinkstream.cpp @@ -133,18 +133,18 @@ GstQmlGlSinkStream::GstQmlGlSinkStream(bool is_primary,QObject *parent) timer(new QTimer), m_isPrimaryStream(is_primary) { - qDebug() << "GstQmlGlSinkStream::GstQmlGlSinkStream()"; + qDebug() << logPrefix() << "GstQmlGlSinkStream::GstQmlGlSinkStream()"; // NOTE: the gstreamer init stuff should be already called via main ! } GstQmlGlSinkStream::~GstQmlGlSinkStream() { - qDebug() << "GstQmlGlSinkStream::~GstQmlGlSinkStream()begin"; + qDebug() << logPrefix() << "GstQmlGlSinkStream::~GstQmlGlSinkStream()begin"; if(timer){ timer->stop(); delete timer; } stopVideoSafe(); - qDebug() << "GstQmlGlSinkStream::~GstQmlGlSinkStream()end"; + qDebug() << logPrefix() << "GstQmlGlSinkStream::~GstQmlGlSinkStream()end"; } GstQmlGlSinkStream& GstQmlGlSinkStream::instancePrimary() @@ -169,7 +169,7 @@ void GstQmlGlSinkStream::init(QQuickItem* videoOutputWindow) { lastDataTimeout = QDateTime::currentMSecsSinceEpoch(); QObject::connect(timer, &QTimer::timeout, this, &GstQmlGlSinkStream::timerCallback); timer->start(1000); - qDebug() << "GstQmlGlSinkStream::init()"; + qDebug() << logPrefix() << "GstQmlGlSinkStream::init()"; } void GstQmlGlSinkStream::check_common_mistakes_then_init(QQuickItem* qmlglsinkvideoitem) @@ -199,7 +199,7 @@ static gboolean PipelineCb(GstBus *bus, GstMessage *msg, gpointer data) { GError *error; gst_message_parse_error (msg, &error, &debug); g_free (debug); - qDebug()<<"Error:"<message); + qDebug()<logPrefix()<<"Error:"<message); g_printerr ("Error: %s\n", error->message); g_error_free (error); instance->has_decoder_error=true; @@ -210,7 +210,7 @@ static gboolean PipelineCb(GstBus *bus, GstMessage *msg, gpointer data) { GError *error; gst_message_parse_warning(msg, &error, &debug); g_free (debug); - qDebug()<<"Error:"<message); + qDebug()<logPrefix()<<"Error:"<message); g_printerr ("Error: %s\n", error->message); g_error_free (error); break; @@ -229,7 +229,7 @@ static gboolean PipelineCb(GstBus *bus, GstMessage *msg, gpointer data) { case GST_MESSAGE_ELEMENT:{ auto m = QString(gst_structure_get_name(gst_message_get_structure(msg))); if (m == "GstUDPSrcTimeout") { - qDebug() << "GstUDPSrcTimeout"; + qDebug() << instance->logPrefix() << "GstUDPSrcTimeout"; instance->lastDataTimeout = QDateTime::currentMSecsSinceEpoch(); } break; @@ -253,17 +253,18 @@ static gboolean PipelineCb(GstBus *bus, GstMessage *msg, gpointer data) { // https://gstreamer.freedesktop.org/documentation/application-development/basics/helloworld.html?gi-language=c static gboolean bus_call (GstBus *bus,GstMessage *msg,gpointer data){ - qDebug()<<"bus_call"<(data); + qDebug()<logPrefix()<<"bus_call"<logPrefix()<<"End of stream"; break; case GST_MESSAGE_ERROR: { gchar *debug; GError *error; gst_message_parse_error (msg, &error, &debug); g_free (debug); - qDebug()<<"Error:"<message); + qDebug()<logPrefix()<<"Error:"<message); g_printerr ("Error: %s\n", error->message); g_error_free (error); break; @@ -276,22 +277,29 @@ static gboolean bus_call (GstBus *bus,GstMessage *msg,gpointer data){ void GstQmlGlSinkStream::startVideo() { - qDebug()<<"GstQmlGlSinkStream::startVideo() begin"; + qDebug()< display) port=" << stream_config.udp_rtp_input_port + << "codec=" << QString::fromStdString(QOpenHDVideoHelper::video_codec_to_string(stream_config.video_codec)) + << "softwareDecoder=" << stream_config.enable_software_video_decoder; const auto pipeline=constructGstreamerPipeline(m_videoStreamConfig); + qDebug() << logPrefix() << "GStreamer pipeline (udp -> depay -> decode -> qmlglsink):" << pipeline.c_str(); GError *error = nullptr; m_pipeline = gst_parse_launch(pipeline.c_str(), &error); - qDebug() << "GSTREAMER PIPE=[" << pipeline.c_str()<<"]"; if (error) { - qDebug() << "gst_parse_launch error: " << error->message; + qDebug() << logPrefix() << "gst_parse_launch error: " << error->message; return; } if(!m_pipeline || !(GST_IS_PIPELINE(m_pipeline))){ - qDebug()<<"Cannot construct pipeline"; + qDebug()< #include +#include #include #include @@ -52,6 +53,7 @@ class GstQmlGlSinkStream : public QObject{ bool has_decoder_error=false; // This is called when the user clicks the dev restart video Q_INVOKABLE void dev_restart_stream(); + QString logPrefix() const; private: /** * @brief fired by m_timer. diff --git a/app/videostreaming/gstreamer/gstrtpreceiver.cpp b/app/videostreaming/gstreamer/gstrtpreceiver.cpp index 209f75a5a..96b6a131b 100644 --- a/app/videostreaming/gstreamer/gstrtpreceiver.cpp +++ b/app/videostreaming/gstreamer/gstrtpreceiver.cpp @@ -3,6 +3,8 @@ #include "gst/gstpipeline.h" #include "gst/app/gstappsink.h" #include "gst_helper.hpp" +#include +#include #include #include @@ -35,32 +37,58 @@ G_BEGIN_DECLS GST_PLUGIN_STATIC_DECLARE(qgc); G_END_DECLS -GstRtpReceiver::GstRtpReceiver(int udp_port, QOpenHDVideoHelper::VideoCodec video_codec) +namespace { +std::once_flag gstInitOnceFlag; +bool gstInitSuccess = false; + +void ensureGstInitialized() { - m_port=udp_port; - m_video_codec=video_codec; + std::call_once(gstInitOnceFlag, [] { + GError *error = nullptr; + if (!gst_init_check(nullptr, nullptr, &error)) { + qWarning() << "gst_init_check failed" << (error ? error->code : 0) + << (error && error->message ? error->message : ""); + if (error) + g_error_free(error); + gstInitSuccess = false; + return; + } #if defined(__android__) || defined(__ios__) - GST_PLUGIN_STATIC_REGISTER(coreelements); - GST_PLUGIN_STATIC_REGISTER(playback); - GST_PLUGIN_STATIC_REGISTER(libav); - GST_PLUGIN_STATIC_REGISTER(rtp); - GST_PLUGIN_STATIC_REGISTER(rtsp); - GST_PLUGIN_STATIC_REGISTER(udp); - GST_PLUGIN_STATIC_REGISTER(videoparsersbad); - GST_PLUGIN_STATIC_REGISTER(x264); - GST_PLUGIN_STATIC_REGISTER(rtpmanager); - GST_PLUGIN_STATIC_REGISTER(isomp4); - GST_PLUGIN_STATIC_REGISTER(matroska); - GST_PLUGIN_STATIC_REGISTER(mpegtsdemux); - GST_PLUGIN_STATIC_REGISTER(opengl); - GST_PLUGIN_STATIC_REGISTER(tcp); - GST_PLUGIN_STATIC_REGISTER(app);//XX + GST_PLUGIN_STATIC_REGISTER(coreelements); + GST_PLUGIN_STATIC_REGISTER(playback); + GST_PLUGIN_STATIC_REGISTER(libav); + GST_PLUGIN_STATIC_REGISTER(rtp); + GST_PLUGIN_STATIC_REGISTER(rtsp); + GST_PLUGIN_STATIC_REGISTER(udp); + GST_PLUGIN_STATIC_REGISTER(videoparsersbad); + GST_PLUGIN_STATIC_REGISTER(x264); + GST_PLUGIN_STATIC_REGISTER(rtpmanager); + GST_PLUGIN_STATIC_REGISTER(isomp4); + GST_PLUGIN_STATIC_REGISTER(matroska); + GST_PLUGIN_STATIC_REGISTER(mpegtsdemux); + GST_PLUGIN_STATIC_REGISTER(opengl); + GST_PLUGIN_STATIC_REGISTER(tcp); + GST_PLUGIN_STATIC_REGISTER(app);//XX #if defined(__android__) - GST_PLUGIN_STATIC_REGISTER(androidmedia); + GST_PLUGIN_STATIC_REGISTER(androidmedia); #elif defined(__ios__) - GST_PLUGIN_STATIC_REGISTER(applemedia); + GST_PLUGIN_STATIC_REGISTER(applemedia); #endif #endif + // qmlgl and qgc are provided as dynamic plugins in our Android/iOS + // builds, so avoid static registration to prevent unresolved symbols + // when the static variants are absent from the link set. + gstInitSuccess = true; + }); +} +} // namespace + +GstRtpReceiver::GstRtpReceiver(int udp_port, QOpenHDVideoHelper::VideoCodec video_codec) +{ + m_port=udp_port; + m_video_codec=video_codec; + ensureGstInitialized(); + m_initialized = gstInitSuccess; } GstRtpReceiver::~GstRtpReceiver() @@ -155,7 +183,14 @@ void GstRtpReceiver::debug_sample(std::shared_ptr > sample) void GstRtpReceiver::start_receiving(NEW_FRAME_CALLBACK cb) { qDebug()<<"GstRtpReceiver::start_receiving begin"; - assert(m_gst_pipeline==nullptr); + if (!m_initialized) { + qWarning() << "GstRtpReceiver::start_receiving aborted; GStreamer failed to initialize"; + return; + } + if (m_gst_pipeline != nullptr) { + qWarning() << "GstRtpReceiver was already running; restarting existing pipeline"; + stop_receiving(); + } m_cb=cb; const auto pipeline=construct_gstreamer_pipeline(); @@ -175,7 +210,11 @@ void GstRtpReceiver::start_receiving(NEW_FRAME_CALLBACK cb) // // we pull data out of the gst pipeline as cpu memory buffer(s) using the gstreamer "appsink" element m_app_sink_element=gst_bin_get_by_name(GST_BIN(m_gst_pipeline), "out_appsink"); - assert(m_app_sink_element); + if (!m_app_sink_element) { + qWarning() << "GstRtpReceiver::start_receiving could not find appsink 'out_appsink' in pipeline; aborting start"; + stop_receiving(); + return; + } m_pull_samples_run= true; m_pull_samples_thread=std::make_unique(&GstRtpReceiver::loop_pull_samples, this); diff --git a/app/videostreaming/gstreamer/gstrtpreceiver.h b/app/videostreaming/gstreamer/gstrtpreceiver.h index 2f8ffd5e7..ecc41e6d6 100644 --- a/app/videostreaming/gstreamer/gstrtpreceiver.h +++ b/app/videostreaming/gstreamer/gstrtpreceiver.h @@ -31,6 +31,7 @@ class GstRtpReceiver { void on_new_sample(std::shared_ptr> sample); void debug_sample(std::shared_ptr> sample); private: + bool m_initialized = false; // The gstreamer pipeline GstElement * m_gst_pipeline=nullptr; NEW_FRAME_CALLBACK m_cb; diff --git a/app/videostreaming/vscommon/QOpenHDVideoHelper.hpp b/app/videostreaming/vscommon/QOpenHDVideoHelper.hpp index 031d4ccb6..c56c6d174 100644 --- a/app/videostreaming/vscommon/QOpenHDVideoHelper.hpp +++ b/app/videostreaming/vscommon/QOpenHDVideoHelper.hpp @@ -54,6 +54,8 @@ static VideoTestMode videoTestModeFromInt(int value){ struct GenericVideoSettings{ // used for testing and development. VideoTestMode dev_test_video_mode = VideoTestMode::DISABLED; + // Select alternative secondary video input sources for testing (android only for now) + int dev_secondary_video_input_mode = 0; // bool dev_enable_custom_pipeline=false; std::string dev_custom_pipeline=""; @@ -67,6 +69,8 @@ struct GenericVideoSettings{ bool dev_rpi_use_external_omx_decode_service=true; // platforms other than RPI bool dev_always_use_generic_external_decode_service=false; + // Android helper to allow disabling primary video rendering to debug the secondary stream + bool dev_disable_primary_video=false; // On embedded devices, video is commonly rendered on a special surface, independent of QOpenHD // r.n only the rpi mmal impl. supports proper video rotation int extra_screen_rotation=0; @@ -75,6 +79,7 @@ struct GenericVideoSettings{ // 2 configs are equal if all members are exactly the same. bool operator==(const GenericVideoSettings &o) const { return this->dev_test_video_mode == o.dev_test_video_mode && + this->dev_secondary_video_input_mode == o.dev_secondary_video_input_mode && this->dev_enable_custom_pipeline==o.dev_enable_custom_pipeline && this->dev_custom_pipeline==o.dev_custom_pipeline && this->dev_limit_fps_on_test_file == o.dev_limit_fps_on_test_file && @@ -82,6 +87,7 @@ struct GenericVideoSettings{ this->dev_feed_incomplete_frames_to_decoder == o.dev_feed_incomplete_frames_to_decoder && this->dev_rpi_use_external_omx_decode_service==o.dev_rpi_use_external_omx_decode_service && this->dev_always_use_generic_external_decode_service==o.dev_always_use_generic_external_decode_service && + this->dev_disable_primary_video==o.dev_disable_primary_video && this->extra_screen_rotation == o.extra_screen_rotation && this->qopenhd_switch_primary_secondary == o.qopenhd_switch_primary_secondary; } @@ -165,6 +171,7 @@ static GenericVideoSettings read_generic_from_settings(){ QSettings settings; GenericVideoSettings _videoStreamConfig; _videoStreamConfig.dev_test_video_mode=QOpenHDVideoHelper::videoTestModeFromInt(settings.value("dev_test_video_mode", 0).toInt()); + _videoStreamConfig.dev_secondary_video_input_mode=settings.value("dev_secondary_video_input_mode",0).toInt(); _videoStreamConfig.dev_enable_custom_pipeline=settings.value("dev_enable_custom_pipeline",false).toBool(); _videoStreamConfig.dev_limit_fps_on_test_file=settings.value("dev_limit_fps_on_test_file",-1).toInt(); @@ -172,6 +179,7 @@ static GenericVideoSettings read_generic_from_settings(){ // _videoStreamConfig.dev_rpi_use_external_omx_decode_service=settings.value("dev_rpi_use_external_omx_decode_service", true).toBool(); _videoStreamConfig.dev_always_use_generic_external_decode_service=settings.value("dev_always_use_generic_external_decode_service", false).toBool(); + _videoStreamConfig.dev_disable_primary_video=settings.value("dev_disable_primary_video", false).toBool(); _videoStreamConfig.qopenhd_switch_primary_secondary=settings.value("qopenhd_switch_primary_secondary", false).toBool(); _videoStreamConfig.extra_screen_rotation=get_display_rotation(); // QML text input sucks, so we read a file. Not ideal, but for testing only anyways diff --git a/build_qmake.sh b/build_qmake.sh index e68a9b955..2f03e8f2e 100755 --- a/build_qmake.sh +++ b/build_qmake.sh @@ -1,6 +1,20 @@ #!/bin/bash -# Convenient script to build this project with CMake +set -euo pipefail + +# Force Qt 5 tools when both Qt 5 and Qt 6 are installed +export QT_SELECT="${QT_SELECT:-qt5}" + +# Ensure submodules are available for the build +MAVLINK_HEADER="lib/mavlink-headers/mavlink/v2.0/openhd/mavlink.h" +if [ ! -f "${MAVLINK_HEADER}" ]; then + echo "Syncing git submodules (mavlink headers missing)..." + git submodule update --init --recursive +fi + +lupdate ./QOpenHD.pro +lrelease ./QOpenHD.pro +cp ./translations/*.qm ./qml/ rm -rf build mkdir build @@ -13,3 +27,4 @@ if [[ "$(uname)" == "Darwin" ]]; then else make -j$(( $(nproc) / 2 )) fi + diff --git a/install_build_dep.sh b/install_build_dep.sh index 3317e4480..57d11dd65 100755 --- a/install_build_dep.sh +++ b/install_build_dep.sh @@ -7,7 +7,7 @@ QTTYPE="$2" BASE_PACKAGES="gnupg libjsoncpp-dev libtinyxml2-dev zlib1g libcurl4-gnutls-dev gnupg1 gnupg2 apt-transport-https apt-utils libgles2-mesa-dev libegl1-mesa-dev libgbm-dev libsdl2-dev libsdl1.2-dev" VIDEO_PACKAGES="libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-good libavcodec-dev libavformat-dev" -BUILD_PACKAGES="ruby-dev meson build-essential cmake git ruby-dev python3-pip python3-future" +BUILD_PACKAGES="ruby-dev meson build-essential cmake git ruby-dev python3-pip python3-future qttools5-dev-tools" function install_pi_packages { @@ -41,7 +41,7 @@ PLATFORM_PACKAGES="qml-module-qt-labs-platform" if [[ "${QTTYPE}" == "custom" ]]; then apt install -y openhd-qt else - apt -y install qml-module-qtquick-controls2 libqt5texttospeech5-dev libqt5concurrent5 libqt5core5a libqt5dbus5 libqt5designer5 libqt5gui5 libqt5help5 libqt5location5 libqt5location5-plugins libqt5multimedia5 libqt5multimedia5-plugins libqt5multimediagsttools5 libqt5multimediawidgets5 libqt5network5 libqt5opengl5 libqt5opengl5-dev libqt5positioning5 libqt5positioning5-plugins libqt5positioningquick5 libqt5printsupport5 libqt5qml5 libqt5quick5 libqt5quickparticles5 libqt5quickshapes5 libqt5quicktest5 libqt5quickwidgets5 libqt5sensors5 libqt5sql5 libqt5sql5-sqlite libqt5svg5 libqt5test5 libqt5webchannel5 libqt5webkit5 libqt5widgets5 libqt5x11extras5 libqt5xml5 openshot-qt python3-pyqt5 python3-pyqt5.qtopengl python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-pyqtgraph qml-module-qt-labs-settings qml-module-qtgraphicaleffects qml-module-qtlocation qml-module-qtpositioning qml-module-qtquick-controls qml-module-qtquick-dialogs qml-module-qtquick-extras qml-module-qtquick-layouts qml-module-qtquick-privatewidgets qml-module-qtquick-shapes qml-module-qtquick-window2 qml-module-qtquick2 qt5-gtk-platformtheme qt5-qmake qt5-qmake-bin qt5-qmltooling-plugins qtbase5-dev qtbase5-dev-tools qtchooser qtdeclarative5-dev qtdeclarative5-dev-tools qtpositioning5-dev qttranslations5-l10n libqt5charts5-dev + apt -y install qml-module-qtquick-controls2 libqt5texttospeech5-dev libqt5concurrent5 libqt5core5a libqt5dbus5 libqt5designer5 libqt5gui5 libqt5help5 libqt5location5 libqt5location5-plugins libqt5multimedia5 libqt5multimedia5-plugins libqt5multimediagsttools5 libqt5multimediawidgets5 qtmultimedia5-dev libqt5network5 libqt5opengl5 libqt5opengl5-dev libqt5positioning5 libqt5positioning5-plugins libqt5positioningquick5 libqt5printsupport5 libqt5qml5 libqt5quick5 libqt5quickparticles5 libqt5quickshapes5 libqt5quicktest5 libqt5quickwidgets5 libqt5sensors5 libqt5sql5 libqt5sql5-sqlite libqt5svg5 libqt5test5 libqt5webchannel5 libqt5webkit5 libqt5widgets5 libqt5x11extras5 libqt5xml5 openshot-qt python3-pyqt5 python3-pyqt5.qtopengl python3-pyqt5.qtsvg python3-pyqt5.qtwebkit python3-pyqtgraph qml-module-qt-labs-settings qml-module-qtgraphicaleffects qml-module-qtlocation qml-module-qtpositioning qml-module-qtquick-controls qml-module-qtquick-dialogs qml-module-qtquick-extras qml-module-qtquick-layouts qml-module-qtquick-privatewidgets qml-module-qtquick-shapes qml-module-qtquick-window2 qml-module-qtquick2 qt5-gtk-platformtheme qt5-qmake qt5-qmake-bin qt5-qmltooling-plugins qtbase5-dev qtbase5-dev-tools qtchooser qtdeclarative5-dev qtdeclarative5-dev-tools qtpositioning5-dev qttools5-dev-tools qttranslations5-l10n libqt5charts5-dev fi # Install platform-specific packages diff --git a/package.sh b/package.sh index e34f0d7ae..45a17ab99 100755 --- a/package.sh +++ b/package.sh @@ -82,7 +82,7 @@ elif [[ "${PACKAGE_ARCH}" = "arm64" ]]; then cp rock_qt_eglfs_kms_config.json /tmp/qopenhd/usr/local/share/qopenhd/ || exit 1 fi -VERSION="2.6.4-$(date -d '+1 hour' +'%m-%d-%Y--%H-%M-%S')-${VER2}" +VERSION="2.7.0-$(date -d '+1 hour' +'%m-%d-%Y--%H-%M-%S')-${VER2}" ls -a ${TMPDIR}/usr/local/bin echo "going into packaging stage" diff --git a/qml/qml.qrc b/qml/qml.qrc index 36b9bd648..6be084b8f 100644 --- a/qml/qml.qrc +++ b/qml/qml.qrc @@ -1,35 +1,20 @@ - - ../translations/QOpenHD_en.qm + + QOpenHD_en.qm + QOpenHD_de.qm + QOpenHD_uk.qm + QOpenHD_ru.qm + QOpenHD_es.qm + QOpenHD_fr.qm + QOpenHD_nl.qm + QOpenHD_ro.qm + QOpenHD_it.qm + QOpenHD_zh.qm resources/cursors/arrow_512_green.png resources/cursors/arrow_512_transparent.png resources/cursors/arrow_512_white.png resources/cursors/hand_white.png - - ../translations/QOpenHD_de.qm - - - ../translations/QOpenHD_ru.qm - - - ../translations/QOpenHD_es.qm - - - ../translations/QOpenHD_fr.qm - - - ../translations/QOpenHD_nl.qm - - - ../translations/QOpenHD_ro.qm - - - ../translations/QOpenHD_it.qm - - - ../translations/QOpenHD_zh.qm - main.qml qtquickcontrols2.conf diff --git a/qml/ui/HUDOverlayGrid.qml b/qml/ui/HUDOverlayGrid.qml index 9dd0f1629..d7e66ef5f 100644 --- a/qml/ui/HUDOverlayGrid.qml +++ b/qml/ui/HUDOverlayGrid.qml @@ -283,7 +283,7 @@ Item { onClicked: { sidebar.notify_sidebar_user_clicked_outside(); } - enabled: sidebar.visible + enabled: sidebar.m_is_active } // By default on top row diff --git a/qml/ui/configpopup/qopenhd_settings/AppVideoSettingsView.qml b/qml/ui/configpopup/qopenhd_settings/AppVideoSettingsView.qml index 84493567b..fae556eb1 100755 --- a/qml/ui/configpopup/qopenhd_settings/AppVideoSettingsView.qml +++ b/qml/ui/configpopup/qopenhd_settings/AppVideoSettingsView.qml @@ -209,6 +209,51 @@ ScrollView { } } + SettingBaseElement{ + m_short_description: "Secondary video input (Android dev)" + visible: _qopenhd.is_android() + ComboBox { + width: 320 + height: elementHeight + anchors.right: parent.right + anchors.rightMargin: Qt.inputMethod.visible ? 96 : 36 + anchors.verticalCenter: parent.verticalCenter + model: ListModel { + ListElement { text: "UDP secondary port" } + ListElement { text: "UDP primary port" } + ListElement { text: "HTTP test clip" } + } + Component.onCompleted: { + if(settings.dev_secondary_video_input_mode < 0 || settings.dev_secondary_video_input_mode > 2){ + settings.dev_secondary_video_input_mode = 0; + } + currentIndex = settings.dev_secondary_video_input_mode + } + onCurrentIndexChanged: settings.dev_secondary_video_input_mode = currentIndex + } + } + + SettingBaseElement{ + m_short_description: "Disable primary video (Android)" + m_long_description: "Stops rendering the primary stream on Android to debug the secondary feed. Requires restart." + visible: _qopenhd.is_android() + Switch { + width: 32 + height: elementHeight + anchors.rightMargin: Qt.inputMethod.visible ? 96 : 36 + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + checked: settings.dev_disable_primary_video + onCheckedChanged: { + const actually_changed = settings.dev_disable_primary_video !== checked + settings.dev_disable_primary_video = checked + if (actually_changed) { + _restartqopenhdmessagebox.show() + } + } + } + } + Rectangle { width: parent.width height: rowHeight diff --git a/qml/ui/elements/AppSettings.qml b/qml/ui/elements/AppSettings.qml index 77df321fe..3ce2c5e1a 100644 --- a/qml/ui/elements/AppSettings.qml +++ b/qml/ui/elements/AppSettings.qml @@ -35,6 +35,9 @@ Settings { // When the app is started, this value is automatically reset to false property bool qopenhd_switch_primary_secondary: false + // Android debugging helper: disable the primary video renderer while keeping the secondary stream available + property bool dev_disable_primary_video: false + // Video decode settings, per primary / secondary video property int qopenhd_primary_video_rtp_input_port: 5600 property string qopenhd_primary_video_rtp_input_ip: "127.0.0.1" @@ -52,6 +55,9 @@ Settings { // 1 = raw video // 2 = raw vide encode and then decode property int dev_test_video_mode:0 // 0 is disabled + // Switch input source for secondary video (android only) + // 0 = UDP secondary port, 1 = UDP primary port, 2 = HTTP test clip + property int dev_secondary_video_input_mode: 0 // When this one is set to true, we read a file (where you can then write your custom rx gstreamer pipeline // that ends with qmlglsink ) property bool dev_enable_custom_pipeline: false @@ -438,7 +444,7 @@ Settings { property bool show_sidebar: true property int qopenhd_mavlink_connection_mode: 0; - property string qopenhd_mavlink_connection_manual_tcp_ip: "192.168.178.36" + property string qopenhd_mavlink_connection_manual_tcp_ip: "192.168.1.42" property string wind_unit: "km/h" diff --git a/qml/ui/elements/LanguageSelectForm.ui.qml b/qml/ui/elements/LanguageSelectForm.ui.qml index 51e5e2223..5d0c998c0 100644 --- a/qml/ui/elements/LanguageSelectForm.ui.qml +++ b/qml/ui/elements/LanguageSelectForm.ui.qml @@ -8,6 +8,7 @@ Item { model: ListModel { id: locales ListElement { text: "German"; locale: "de" } + ListElement { text: "Ukranian"; locale: "uk" } ListElement { text: "Russian"; locale: "ru" } ListElement { text: "English"; locale: "en" } ListElement { text: "French"; locale: "fr" } diff --git a/qml/ui/widgets/VerticalSpeedSimpleWidget.qml b/qml/ui/widgets/VerticalSpeedSimpleWidget.qml index b993d4687..b05c7bfc4 100644 --- a/qml/ui/widgets/VerticalSpeedSimpleWidget.qml +++ b/qml/ui/widgets/VerticalSpeedSimpleWidget.qml @@ -55,7 +55,7 @@ BaseWidget { vert_speed*=-1; } } - var ret=Number(vert_speed).toLocaleString( Qt.locale(), 'f', 0) + var ret=Number(vert_speed).toLocaleString(Qt.locale(), 'f', 1) if(settings.vertical_speed_simple_widget_show_unit && vert_speed <99){ ret+=get_v_speed_unit(); } diff --git a/qml/video/SecondaryVideoAndroid.qml b/qml/video/SecondaryVideoAndroid.qml index 6baa692fd..721aba8cf 100644 --- a/qml/video/SecondaryVideoAndroid.qml +++ b/qml/video/SecondaryVideoAndroid.qml @@ -5,6 +5,13 @@ import OpenHD 1.0 SurfaceTexture { id: secondaryAndroidVideo anchors.fill: parent + // Ensure the surface follows the container sizing logic from the surrounding + // SecondaryVideoGStreamer component so Android mirrors the Linux behaviour. + width: parent ? parent.width : 0 + height: parent ? parent.height : 0 + // We only want the outer widget's mouse areas (for resize / maximize) to + // react to clicks, so keep the texture itself passive. + enabled: false Component.onCompleted: { if (typeof _secondaryMediaPlayer !== "undefined" && _secondaryMediaPlayer) { diff --git a/translations/QOpenHD_de.qm b/translations/QOpenHD_de.qm deleted file mode 100644 index 0cf17f20d..000000000 Binary files a/translations/QOpenHD_de.qm and /dev/null differ diff --git a/translations/QOpenHD_de.ts b/translations/QOpenHD_de.ts index 70d4f717a..af4606209 100644 --- a/translations/QOpenHD_de.ts +++ b/translations/QOpenHD_de.ts @@ -2,1483 +2,1995 @@ - AboutPanelForm.ui + AirBatteryWidget - QOpenHD - QOpenHD + + Show volts and amps + - Air - Luft + + Use batt id 0 only + - OpenHD Version: + + Batt1: - Ground - Boden + + Batt2: + - License: GPLv3 - Lizenz: GPLv3 + + %L1% + - AdsbWidgetForm.ui + AirspeedTempWidget - Transparency - Transparenz + + AIRSPEED SENSOR TEMPERATURE + - Size - Größe + + Declutter Upon Arm + - Range - Reichweite + + Warn Temp + + + + + Caution Temp + - Source OpenSky / SDR + + N/A - AirBatteryWidgetForm.ui + AltitudeSecondWidget - Voltage: - Spannug: + + Relative / MSL + + + + AltitudeWidget - Current: - Strom: + + Use MSL + - Transparency - Transparenz + + Show ladder + - Size - Größe + + Show unit + - Show volts and amps - Spannung und Strom + + Range + + + + + AoaWidget + + + Range + + + + AppDevSettingsView - Show single cell voltage - Batteriezellen einzeln anz. + + Save + - %L1% - %1L1% + + Load + - Use telemetry percentege + + Reset - - - AirStatusWidgetForm.ui - Transparency - Transparenz + + WARNING + - Size - Größe + + Continue + + + + + Cancel + - AltitudeSecondWidgetForm.ui + AppDeveloperStatsPanel - Transparency - Transparenz + + Developer Menu + - Size - Größe + + Restart QOpenHD + - Relative / MSL - Rel. über Normalnull + + Cancel QOpenHD + - AltitudeWidgetForm.ui + AppGeneralSettingsView - Transparency - Transparenz + + Animation Smoothing + + + + AppScreenSettingsView - Size - Größe + + 0° + - Relative / MSL - Rel. über Normalnull + + 90° (WARNING) + - Show ladder - Leiter anz. + + 180° + - Range - Unterteilung + + 270° (WARNING) + - - - AppSettingsPanel.ui - General - Allgemein + + -1 Disable + - Widgets - Widgets + + 0 Auto (Recommended) + - Screen - Bildschirm + + 50 (ultra small) + - Video - Videoübertragung + + 72 (smaller) + - Manage - Verwalten + + 100 + - Enable Speech - Sprachausgabe + + 120 (bigger) + - Battery Cells - Anz. Batteriezellen + + 150 (ultra big) + + + + AppSettingsPanel - Imperial units - Imperiales Einheitensystem + + Widgets + - Enable RC - RC-Steuerung aktivieren + + Style + - Mavlink SysID - Mavlink SysID + + General + - Language / Locale - Sprache + + Vehicle + - Shape Color - Umrissfarbe + + Screen + - Choose a color - Wähle eine Farbe + + Video + - Glow Color - Umrissfarbe + + Dev + + + + AppVideoSettingsView - Text Color - Textfarbe + + Video test mode + - Top/bottom bars - Statusbalken + + Limit FPS in test file + + + + AppWidgetSettingsView - Hide - Verstecken + + Show GPS + - Transparent black - Transparentes black + + Show Home Distance + - Hide when drone armed + + Show RC RSSI (not OpenHD RC) - Turn red when drone armed + + Show Flight Timer - Show Downlink RSSI - Downlink RSSI + + Show Flight Mode + - Show Uplink RSSI - Uplink RSSI + + Show IMU Sensor Temperature + - Show RC RSSI (not OpenHD RC) + + Show Pressure Sensor Temperature - Show Bitrate - Bitrate + + Show Pressure Sensor 2 Temperature + - Show GPS - GPS + + Show Pressure Sensor 3 Temperature + - Show Home Distance - Distanz zum Startpunkt + + Show Airspeed Sensor Temperature + - Show Flight Timer - Flugdauer + + Show Esc Temperature + - Show Flight Mode - Flugmodus + + Show Battery Temperature + - Show Flight Controller Temperature - Flugreglertemperatur anzeigen + + Show Ground Status + - Show Ground Status - Status Bodenstation + + Show Ground Battery + + Show Air Status - Status Fluggerät + + Show Air Battery - Flugakku + + Show mAh - mAh Anzeige + - Show Total Flight Distance - ges. Flugdistanz + + Show Efficiency in mAh/km + - Show log messages on-screen - Log Nachrichten auf OSD anzeigen + + Show Total Flight Distance + + Show Horizon - Künstlicher Horizont + + + Show performance horizon + + + + Show Flight Path Vector - Flugbahn + + Show Altitude - Höhe + + Show Speed - Geschwindigkeit + + Show Second Speed - Sekundäre Geschwindigkeit + + Show Heading - Kurs + + Show Second Altitude - Sekundäre Hohe + + Show Bank Angle Indicator + Show Home Arrow - Pfeil zum Startpunkt - - - Show Map - Karte + + Show Throttle - Schub + + Show Control Inputs - RC Eingabe - - - Show GPIO - GPIOs + + Show Vibration - Vibrationssensoren - - - Show Vertical Speed - Vertikale Geschwindigkeit + - Show Wind (Experimental) - Winrichtung/-stärke (experimentell) + + Show Vertical Speed (minimal) + - Show ADS-B Traffic - ADS-B anzeigen + + Show Vertical Speed Gauge + - Show BlackBox - Anzeigen BlackBox + + Show Wind (Experimental) + - Show example widget - Beispiel Widget + + Show Missions + - Screen Scale - Bildschrim Skalierung + + Show Angle of Attack + - Brightness - Helligkeit + + Show Map + - Always use software video decoder - Video in Software decodieren + + Show ADSB + - Enable PiP - Bild-in-Bild Modus + + Show log messages on-screen + - Enable LTE - LTE Backup + + Show Sidebar + - Hide warning watermark - Wasserzeichen / Warnung unterdrücken + + Show QT Render stats + - Enable stereo mode - Aktivieren Sie den Stereomodus + + Show GPIO + + + + AppWidgetStyleSettingsView - Stereo OSD mode - Stereo-OSD-Modus + + Shape Color + - Load settings from file - Konfigurationsdatei lesen + + Glow Color + - Load - Lesen + + Text Color + - Select settings file - Konfigurationsdatei auswählen + + Text font + + + + ArrowWidget - Save settings to file - Konfigurationsdatei schreiben + + Invert Arrow + + + + BaseWidgetDefaultUiControlElements - Save - Speichern + + Transparency + - Select location - Ort auswählen + + Lock to Horizontal Center + - Reset all settings - Konfiguration zurücksetzen + + Lock to Vertical Center + + + + BatteryTempWidget - Reset - Rücksetzen + + BATTERY SENSOR TEMPERATURE + - Settings reset - Konfiguration zurücksetzen + + Declutter Upon Arm + - Log Level + + Warn Temp - Text font + + Caution Temp - Show IMU Sensor Temperature + + N/A + + + ColorPicker - Show Pressure Sensor Temperature + + Cancel - Show Esc Temperature + + Select + + + ConnectPanel - Show Efficiency in mAh/km + + CONNECT TO OPENHD GND / AIR UNIT - ArrowWidgetForm + ControlWidget - Transparency - Transparenz + + Show two controls + - Size - Größe + + Use FC channels + - Invert Arrow - Richtung umkehren + + Reverse Pitch + - - - BitrateWidgetForm.ui - Measured: - Gemessen: + + Reverse Roll + - Set: - Festgelegt: + + Reverse yaw + - Skipped packets: - Ausgelassene Pakete: + + Reverse Throttle + + + + DialoqueFreqChangeGndOnly - Injection failed: - Injektion gescheitert: + + GND Only + - Transparency - Transparenz + + Okay + - Size - Größe + + YES,GND ONLY + - Show skip / fail count - Zähler: Ausgelassen / Gescheitert + + Cancel + - BlackBoxWidgetForm.ui + DialoqueNotAlive - Transparency - Transparenz + + QOpenHD + - Size - Größe + + OKAY + - restart telemetry + + TAKE ME - ColorPicker + ErrorMessageBox - Cancel + + ERROR - Select + + Okay - ControlWidgetForm.ui + EscTempWidget - Transparency - Transparenz + + Declutter Upon Arm + - Size - Größe - - - Show two controls - Zwei Joysticks + + Warn Temp + - Reverse Pitch - Höhenruder umkehren + + Caution Temp + - Reverse Roll - Querruder umkehren + + N/A + + + + ExampleWidget - Reverse yaw - Seitenruder umkehren + + Example widget + + + + FCMavlinkSystem - Reverse Throttle - Schub umkehren + + %1 flight mode + %1 Flugmodus - DownlinkRSSIWidgetForm.ui + FlightModeWidget - dBm - dBm + + Show disarmed + - (%L1%) - (%L1%) + + Only For Ardupilot + + + + FooterRebootShutdownWarning - CTS: - CTS: + + REBOOT + - Transparency - Transparenz + + SHUTDOWN + + + + FpvWidget - Size - Größe + + Dynamic + - Show lost/damaged - Verlorene / Beschädigte Pakete + + Invert Pitch + - Show all cards to right - Alle WiFi Adapter rechts anz. + + Vertical Limit + - N/A - n.v. + + Lateral Limit + + + + FreqComboBoxRow - dBm - dBm + +  + - EscTempWidgetForm.ui + GPSWidget - Transparency - Transparenz + + Always show lat/lon + - Size - Größe + + Hide identity + - N/A - n.v. + + Declutter Upon Arm + - - - ExampleWidgetForm.ui - Example widget - Beispiel Widget + + Warn HDOP + - - - FcTempWidgetForm.ui - Transparency - Transparenz + + Caution HDOP + - Size - Größe + + + Lat: + - N/A - n.v. + + + Lon: + - - - FlightDistanceWidgetForm.ui - Transparency - Transparenz + + GPS Count: + - Size - Größe + + GPS Lock: + - - - FlightMahKmWidgetForm.ui - Transparency - Transparenz + + HDOP: + - Size - Größe + + VDOP: + + + + + %L1 + - FlightMahWidgetForm.ui + GroundPowerWidget - Transparency - Transparenz + + Show single cell voltage + - Size - Größe + + Battery Type + - Use telemetry data - Telemetriedaten verwenden + + Battery Low + - - - FlightModeWidgetForm.ui - Transparency - Transparenz + + Battery Mid + - Size - Größe + + Battery Full + - FlightTimerWidgetForm.ui + HeadingLadder - Transparency - Transparenz + + N + N - Size - Größe + + NE + NO + + + + E + O + + + + SE + SO + + + + S + S + + + + SW + SW + + + + W + W + + + + NW + NW - FpvWidgetForm.ui + HeadingWidget - Dynamic - Dynamisch + + Show ticks + - Sensitivity - Empfindlichkeit + + Show N/S/E/W + + + + HomeDistanceWidget - Transparency - Transparenz + + Home Lat: + - Size - Größe + + Home Lon: + - GPSWidgetForm.ui + HorizonLadder - Lat: - Lat: + + N + N - Lon: - Lon: + + NE + NO - Transparency - Transparenz + + E + O - Size - Größe + + SE + SO - Always show lat/lon - Immer Lat/Lon anzeigen + + S + S - %L1 - %L1 + + SW + SW + + + + W + W + + + + NW + NW - GroundPiSettingsPanelForm.ui + HorizonWidget - Presets - Presets + + Clip area + - General - Allgemein + + Width + - Radio - Funkstrecke + + Spacing + - Video - Videoübertragung + + Range + - RC - RC Steuerung + + Step + + + + + Invert Pitch + - Hotspot - Hotspot + + Invert Roll + - Smart Sync - Smart Sync + + Show Ladder + - Other - Sonstiges + + Show Home + - Apply preset - Preset anwenden + + Show heading + - Save - Speichern + + Show N/S/E/W + - saved - Speichern + + Show center indicator + - GroundPiSettingsPresetView.ui + ImuTempWidget + + + Declutter Upon Arm + + - Presets are groups of settings that must be configured together for some OpenHD features and to make common configurations easier to use. Once you apply a preset, the ground station will reboot and enter SmartSync mode automatically, then power on your drone to let it sync the new settings. - Presets sind eine Reihe von Einstellungen, die für einige OpenHD-Funktionen zusammen konfiguriert werden müssen. Sobald ein Preset angewendet wird, startet die Bodenstation neu und schaltet automatisch in den SmartSync-Modus um die Einstellungen mit dem Fluggerät zu synchronisieren. + + Warn Temp + - Note: you can apply more than one preset, but any settings that are mutually exclusive (band switcher + 2nd camera at the same time), the last preset to be configured "wins" - Hinweis: Mehr als ein Preset kann anwendbar. Bei Einstellungen, die sich gegenseitig ausschließen (bswp. Bandbreiten-Kontrolle und 2. Kamera ), überschreibt das zuletzt gewählte Preset die vorher gesetzten Parameter. + + Caution Temp + - Changes that will be applied: - Änderungen die angewendet werden: + + N/A + - GroundPowerWidgetForm.ui + LinkDownRSSIWidget - Voltage in: - Eingangsspannung: + + Show stats per card + - Voltage out: - Ausgangsspannung: + + dBm of each ant/card + - Current out: - Ausgangsstrom: + + Loss caution + - Voltage bat: - Spannung Bat.: + + Loss warn + - Transparency - Transparenz + + dBm low warning + + + + + Show pollution estimate % + + + + + Show signal quality % + + + + + dBm + + + + +  + - GroundStatusWidgetForm.ui + LinkUpRSSIWidget - Transparency - Transparenz + + dBm + + + + LogMessagesStatusView - Size - Größe + + LOG GND + + + + + LOG OpenHD AIR + + + + + LOG FC + - HeadingLadder + MapWidgetForm.ui - N - N + + MAP + - NE - NO + + + Zoom + - E - O + + Size + - SE - SO + + Transparency(S) + - S - S + + + Lock map to drone direction + - SW - SW + + Show Drone Track + - W - W + + Show Mission waypoints + - NW - NW + + Enable ADSB + + + + + ADSB Internet Source + + + + + ADSB SDR Source + + + + + ADSB Radius + + + + + Transparency(B) + - HeadingWidgetForm.ui + MavlinkParamPanel - Transparency - Transparenz + +  + - Width - Breite + + +  + + + + MissionWidget - Size - Größe + + Waypoints curr/total: + - UAV is iNav - UAV mit iNav + + Type: + - Show ticks - Einteilung anz. + + Sync status: + - Show N/S/E/W - N/S/O/W anzeigen + + Mission + - HomeDistanceWidgetForm.ui + NewSwitch - Lat: - Lat: + + SwitchDelegate + + + + OHDSettingsPanel - Lon: - Lon: + + LINK/QUICK + - Size - Größe + + AIR CAM 1 + - Transparency - Transparenz + + AIR CAM 2 + + + + + AIR + + + + + GROUND + - HorizonWidgetForm.ui + OSDCustomizer - Transparency - Transparenz + + Shape Color + - Size - Größe + + Glow Color + + + + + Text Color + + + + + Done + + + + + PanelStatus + + + SYSTEM STATUS + + + + + PowerActionDialoque + + + Confirm Power Change + + + + + If your drone is in the air, rebooting or shutting down may cause a crash or make it enter failsafe mode! + - Invert Pitch - Höhenruder umkehren + + Cancel + - Invert Roll - Querruder umkehren + + Reboot Ground + - Spacing - Abstand + + Shutdown Ground + - Show Home - Pfeil zum Startpunkt + + Reboot Air + - Show heading - Kurs + + Shutdown Air + - Show N/S/E/W - N/S/O/W anzeigen + + Reboot FC + - UAV is iNav - UAV mit iNav + + Shutdown FC + - Show Ladder - Leiter anz. + + Yes + - ImuTempWidgetForm.ui + PressTempWidget - Transparency - Transparenz + + Declutter Upon Arm + - Size - Größe + + Warn Temp + + + + + Caution Temp + + N/A - n.v. + - MainVideoAndroid + PressTempWidget2 - Do not fly with this app! Video is not stable yet! - Fliegen Sie nicht mit dieser App! Video ist noch nicht stabil! + + Declutter Upon Arm + - - - MainVideoGStreamer - Do not fly with this app! Video is not stable yet! - Fliegen Sie nicht mit dieser App! Video ist noch nicht stabil! + + Warn Temp + + + + + Caution Temp + - - - MainVideoRender - Do not fly with this app! Video is not stable yet! - Fliegen Sie nicht mit dieser App! Video ist noch nicht stabil! + + N/A + - MapWidgetForm.ui + PressTempWidget3 - Zoom - Zoom + + Declutter Upon Arm + - Transparency - Transparenz + + Warn Temp + - Lock map to drone direction - Kartenausrichtung folgt Flugrichtung + + Caution Temp + - Show Drone Track - Drohnenpfad anzeigen + + N/A + - OSDCustomizer - - Shape Color - Umrissfarbe - - - Glow Color - Umrissfarbe - + QOpenHDServiceDialoque - Text Color - Textfarbe + + QOpenHD + - Done + + Cancel - OpenHD + QOpenHDVersionCard - %1 flight mode - %1 Flugmodus + + GPLv3 + - PowerPanel + QRenderStatsWidget - Confirm Power Change - Änderung bestätigen - - - If your drone is in the air, rebooting or shutting down the ground or air pi may cause a crash or make it enter failsafe mode! - Gefahr von Fail-Safe oder Absturz falls Drone im Flug + + QT FT: + - Cancel - Abbrechen + + QT RP: + - Reboot Ground - Groundstation neustarten + + D:R: + - Shutdown Ground - Groundstation abschalten + + Parse&EnqT: + - Reboot Air + + DecT: - Shutdown Air + + DecRT: - Yes - Ja + + Doing wait_for_frame_decode: + - - - PowerPanelForm.ui - Reboot or safely shut down the air/ground before removing power, or to apply settings changes when it is difficult to cycle power manually. If you have a power control board or sensors connected you may also see power supply information. + + Format: - Air - Luft + + Decoding type: + - Output Voltage: - Uitgangsspanning: + + Rtp parse n gaps: + - Current: - Ausgangsstrom: + + RTP QOHD measured: + - Reboot - Neustart + + estimate fps: + - Shutdown - Ausschalten + + estimate keyframe i: + - Ground - Boden + + decode dropped: + + + + RCRssiWidget - Supply Voltage: - Voedingsspanning: + + % + - Output Current: - Ausgangsstrom: + + + - Battery Voltage: - Batteriespannung + + N/A + - PressTempWidgetForm.ui + RcDebugScreenFC - Transparency - Transparenz + + FC RC (for debugging) + - Size - Größe + + NOTE: Only works on ardupilot! +NOTE: Slow update rate(1Hz)-only for debugging +Here you can see the rc channel values your FC reports via mavlink + - N/A - n.v. + + ranges: 1000-2000(pwm) +unused: 65535, +not set: -1 + - RcRSSIWidgetForm.ui + RcDebugScreenOpenHD - Transparency - Transparenz + + OpenHD RC + - Size - Größe + + Here you can view the values which OpenHD reads from your Joystick + and sends to the FC via wifibroadcast (If enabled) + - - + + ranges: 1000-2000(pwm) +unused: 65535, +not set: -1 + + + + RcInfoPanel - N/A - n.v. + + About + + + + + RC over OpenHD - debug + + + + + FC channels - debug + - RestartDialog + RcInfoScreen - Restart required + + Info - You must restart the app for your loaded configuration file to take effect - Sie müssen die App neu starten, damit die Konfiguration festgelegt werden kann + + Enable OpenHD-RC: + +1. OpenHD GND: Set 'ENABLE_JOY_RC' to 'ENABLED', +2.Connect a joystick via USB to GND Station +3.Optionally reboot + +You can use the other screens to validate/debug your setup. +NOTE: Using a seperate RC link (e.g. ExpressLRS) is recommended ! + + - Cancel + + Channel mapping - Close App - Sluiten App + + Channel mapping is not intuitive, but it works when done correctly. +If you cannot make it work, any proper RC controller (e.g. running EdgeTX / OpenTX) +supports more advanced channel mapping and works via USB ! + - RollWidgetForm.ui + RestartQOpenHDMessageBox - Transparency - Transparenz + + QOpenHD + - Size - Größe + + Restart + + + + + Cancel + + + + RollWidget + Invert Roll - Querruder umkehren + + Show Arc + Show Numbers - Toon nummers + + Sky Pointer - SensorPanelForm.ui + SOCStatusWidgetGeneric - If you have temperature or IMU sensors connected you may see and/or calibrate them below. + + Declutter Upon Arm - - - SettingsPopupForm.ui - - App - App - - Ground - Boden + + Show undervolt icon + - Status - Status + + Caution CPU + - Charts - Graphen + + Warn CPU + - Power - Energie + + Caution Temp + - Sensors - Sensoren + + Warn Temp + + + + SettingsCategory - About - Über + +  + - Close - Schließen + +  + - SpeedSecondWidgetForm.ui + SpeedSecondWidget - Transparency - Transparenz + + Use groundspeed + - Size - Größe + + Use km/h + - Airspeed / Groundspeed - Airspeed / GPS + + Show unit + - SpeedWidgetForm.ui + SpeedWidget - Transparency - Transparenz + + Use groundspeed + - Size - Größe + + Show ladder + - Airspeed / Groundspeed - Airspeed / GPS + + Show unit + - Show ladder - Leiter anz. + + Use km/h + + Range - Unterteilung - - - Minimum - Minimum + - StatusChartForm.ui + StatusCardBodyFC - Air CPU + + Firmware: - Air Temp + + Ping: - Gnd CPU + + Type: - Gnd Temp + + Alive: - Lost Pkt - Verloren: - - - Damage Blk - Beschädigt: - - - Down RSSI - Downlink RSSI - - - Up RSSI - Uplink RSSI + + SysID: + + + + StatusCardBodyOpenHD - Inj. Fail + + Platform: - Skip Pkt + + Version: - Bitrate - Bitrate + + Link: + - StatusPanelForm.ui + StatusCardsColumn + + + Ground station + + - Last RSSI: + + Air unit - HB: + + Flight Controller + + + ThrottleWidget - | ATT: + + throttle + + + VerticalSpeedGaugeWidget - | BAT: + + Range + + + VerticalSpeedSimpleWidget - | GPS: + + Show unit - | VFR: + + Show up / down arrow - ThrottleWidgetForm.ui + VibrationWidget - Transparency - Transparenz + + X + - Size - Größe + + Y + - throttle - Schub + + Z + - UplinkRSSIWidgetForm.ui + VideoBitrateWidgetGeneric - Transparency - Transparenz + + Show RED recording active + - Size - Größe + + Status: + - dBm - dBm + + Type: + - N/A - n.v. + + Codec: + - - - VibrationWidgetForm.ui - Transparency - Transparenz + + Resolution: + - Size - Größe + + Bitrate SET: + - X - X + + MEASURED: + - Y - Y + + Injected(+FEC): + - Z - Z + + TX Dropped/RX lost: + - - - VideoWidgetGStreamerForm.ui - Transparency - Transparenz + + FREE SPACE: + - - - VideoWidgetRenderForm.ui - Transparency - Transparenz + + AIR RECORD: + - VirtualJoystick + WBLinkRateControlWidget - Virtual Joystick - Virtueller Joystick + + Show frequency + - - - VsiWidgetForm.ui - Transparency - Transparenz + + Show bitrate + - Size - Größe + + Show fec and keyframe + - Range - Unterteilung + + Bitrate show detailed + - WindWidgetForm.ui - - Transparency - Transparenz - - - Size - Größe - + WindWidget + Style: Arrow / Circle - Anzeige: Pfeil / Kreis + + Plane / Copter - Flugzeug / Kopter + + 45 Degree Speed M/S - Geschw. bei 45° (ms/s) - - - - main - - Open.HD - Open.HD - - - You must restart the app for your loaded configuration file to take effect - Sie müssen die App neu starten, damit die Konfiguration festgelegt werden kann + - Cancel - Stornieren + + Wind Unit + + + + WorkaroundMessageBox - Restart App - App neu starten + + QOpenHD + - Close App - Sluiten App + + Okay + + + + main - Rapidly tap between widgets to enable/disable stereo + + QOpenHD EVO diff --git a/translations/QOpenHD_en.qm b/translations/QOpenHD_en.qm deleted file mode 100644 index c8c9e9163..000000000 Binary files a/translations/QOpenHD_en.qm and /dev/null differ diff --git a/translations/QOpenHD_en.ts b/translations/QOpenHD_en.ts index e1099d676..8b81b8a6a 100644 --- a/translations/QOpenHD_en.ts +++ b/translations/QOpenHD_en.ts @@ -2,1444 +2,1995 @@ - AboutPanelForm.ui + AirBatteryWidget - QOpenHD + + Show volts and amps - Air + + Use batt id 0 only - OpenHD Version: + + Batt1: - Ground + + Batt2: - License: GPLv3 + + %L1% - AdsbWidgetForm.ui + AirspeedTempWidget - Transparency + + AIRSPEED SENSOR TEMPERATURE - Size + + Declutter Upon Arm - Range + + Warn Temp + + + + + Caution Temp - Source OpenSky / SDR + + N/A - AirBatteryWidgetForm.ui + AltitudeSecondWidget - Voltage: + + Relative / MSL + + + AltitudeWidget - Current: + + Use MSL - Transparency + + Show ladder - Size + + Show unit - Show volts and amps + + Range + + + AoaWidget - Show single cell voltage + + Range + + + AppDevSettingsView - %L1% + + Save - Use telemetry percentege + + Load - - - AirStatusWidgetForm.ui - Transparency + + Reset - Size + + WARNING + + + + + Continue + + + + + Cancel - AltitudeSecondWidgetForm.ui + AppDeveloperStatsPanel - Transparency + + Developer Menu - Size + + Restart QOpenHD - Relative / MSL + + Cancel QOpenHD - AltitudeWidgetForm.ui + AppGeneralSettingsView - Transparency + + Animation Smoothing + + + AppScreenSettingsView - Size + + - Relative / MSL + + 90° (WARNING) - Show ladder + + 180° - Range + + 270° (WARNING) - - - AppSettingsPanel.ui - General + + -1 Disable - Widgets + + 0 Auto (Recommended) - Screen + + 50 (ultra small) - Video + + 72 (smaller) - Manage + + 100 - Enable Speech + + 120 (bigger) - Battery Cells + + 150 (ultra big) + + + AppSettingsPanel - Imperial units + + Widgets - Enable RC + + Style - Mavlink SysID + + General - Language / Locale + + Vehicle - Shape Color + + Screen - Glow Color + + Video - Text Color + + Dev + + + AppVideoSettingsView - Top/bottom bars + + Video test mode - Hide + + Limit FPS in test file + + + AppWidgetSettingsView - Transparent black + + Show GPS - Hide when drone armed + + Show Home Distance - Turn red when drone armed + + Show RC RSSI (not OpenHD RC) - Show Downlink RSSI + + Show Flight Timer - Show Uplink RSSI + + Show Flight Mode - Show RC RSSI (not OpenHD RC) + + Show IMU Sensor Temperature - Show Bitrate + + Show Pressure Sensor Temperature - Show GPS + + Show Pressure Sensor 2 Temperature - Show Home Distance + + Show Pressure Sensor 3 Temperature - Show Flight Timer + + Show Airspeed Sensor Temperature - Show Flight Mode + + Show Esc Temperature + + + + + Show Battery Temperature + Show Ground Status + + Show Ground Battery + + + + Show Air Status + Show Air Battery + Show mAh - Show Total Flight Distance + + Show Efficiency in mAh/km - Show log messages on-screen + + Show Total Flight Distance + Show Horizon + + Show performance horizon + + + + Show Flight Path Vector + Show Altitude + Show Speed + Show Second Speed + Show Heading + Show Second Altitude + Show Bank Angle Indicator + Show Home Arrow - Show Map - - - + Show Throttle + Show Control Inputs - Show GPIO + + Show Vibration - Show Vibration + + Show Vertical Speed (minimal) - Show Vertical Speed + + Show Vertical Speed Gauge + Show Wind (Experimental) - Show ADS-B Traffic + + Show Missions - Show BlackBox + + Show Angle of Attack - Show example widget + + Show Map - Screen Scale + + Show ADSB - Brightness + + Show log messages on-screen - Always use software video decoder + + Show Sidebar - Enable PiP + + Show QT Render stats - Enable LTE + + Show GPIO + + + AppWidgetStyleSettingsView - Hide warning watermark + + Shape Color - Enable stereo mode + + Glow Color - Stereo OSD mode + + Text Color - Load settings from file + + Text font + + + ArrowWidget - Load + + Invert Arrow + + + BaseWidgetDefaultUiControlElements - Select settings file + + Transparency - Save settings to file + + Lock to Horizontal Center - Save + + Lock to Vertical Center + + + BatteryTempWidget - Select location + + BATTERY SENSOR TEMPERATURE - Reset all settings + + Declutter Upon Arm - Reset + + Warn Temp - Settings reset + + Caution Temp - Log Level + + N/A + + + ColorPicker - Text font + + Cancel - Show IMU Sensor Temperature + + Select + + + ConnectPanel - Show Pressure Sensor Temperature + + CONNECT TO OPENHD GND / AIR UNIT + + + ControlWidget - Show Esc Temperature + + Show two controls - Show Efficiency in mAh/km + + Use FC channels - - - ArrowWidgetForm - Transparency + + Reverse Pitch - Size + + Reverse Roll - Invert Arrow + + Reverse yaw + + + + + Reverse Throttle - BitrateWidgetForm.ui + DialoqueFreqChangeGndOnly - Measured: + + GND Only - Set: + + Okay - Skipped packets: + + YES,GND ONLY - Injection failed: + + Cancel + + + DialoqueNotAlive - Transparency + + QOpenHD - Size + + OKAY - Show skip / fail count + + TAKE ME - BlackBoxWidgetForm.ui + ErrorMessageBox - Transparency + + ERROR - Size + + Okay + + + EscTempWidget - restart telemetry + + Declutter Upon Arm - - - ColorPicker - Cancel + + Warn Temp - Select + + Caution Temp - - - ControlWidgetForm.ui - Transparency + + N/A + + + ExampleWidget - Size + + Example widget + + + FCMavlinkSystem - Show two controls + + %1 flight mode + + + FlightModeWidget - Reverse Pitch + + Show disarmed - Reverse Roll + + Only For Ardupilot + + + FooterRebootShutdownWarning - Reverse yaw + + REBOOT - Reverse Throttle + + SHUTDOWN - DownlinkRSSIWidgetForm.ui + FpvWidget - dBm + + Dynamic - (%L1%) + + Invert Pitch - CTS: + + Vertical Limit - Transparency + + Lateral Limit + + + FreqComboBoxRow - Size + + + + + GPSWidget - Show lost/damaged + + Always show lat/lon - Show all cards to right + + Hide identity - N/A + + Declutter Upon Arm - dBm + + Warn HDOP - - - EscTempWidgetForm.ui - Transparency + + Caution HDOP - Size + + + Lat: - N/A + + + Lon: - - - ExampleWidgetForm.ui - Example widget + + GPS Count: - - - FlightDistanceWidgetForm.ui - Transparency + + GPS Lock: - Size + + HDOP: - - - FlightMahKmWidgetForm.ui - Transparency + + VDOP: - Size + + %L1 - FlightMahWidgetForm.ui + GroundPowerWidget - Transparency + + Show single cell voltage - Size + + Battery Type - Use telemetry data + + Battery Low - - - FlightModeWidgetForm.ui - Transparency + + Battery Mid - Size + + Battery Full - FlightTimerWidgetForm.ui + HeadingLadder - Transparency + + N - Size + + NE - - - FpvWidgetForm.ui - Dynamic + + E - Sensitivity + + SE - Transparency + + S - Size + + SW - - - GPSWidgetForm.ui - Lat: + + W - Lon: + + NW + + + HeadingWidget - Transparency + + Show ticks - Size + + Show N/S/E/W + + + HomeDistanceWidget - Always show lat/lon + + Home Lat: - %L1 + + Home Lon: - GroundPiSettingsPanelForm.ui + HorizonLadder - Presets + + N - General + + NE - Radio + + E - Video + + SE - RC + + S - Hotspot + + SW - Smart Sync + + W - Other + + NW + + + HorizonWidget - Apply preset + + Clip area - Save + + Width - saved + + Spacing - - - GroundPiSettingsPresetView.ui - Presets are groups of settings that must be configured together for some OpenHD features and to make common configurations easier to use. Once you apply a preset, the ground station will reboot and enter SmartSync mode automatically, then power on your drone to let it sync the new settings. + + Range - Note: you can apply more than one preset, but any settings that are mutually exclusive (band switcher + 2nd camera at the same time), the last preset to be configured "wins" + + Step - Changes that will be applied: + + Invert Pitch - - - GroundPowerWidgetForm.ui - Voltage in: + + Invert Roll - Voltage out: + + Show Ladder - Current out: + + Show Home - Voltage bat: + + Show heading - Transparency + + Show N/S/E/W + + + + + Show center indicator - GroundStatusWidgetForm.ui + ImuTempWidget - Transparency + + Declutter Upon Arm - Size + + Warn Temp - - - HeadingLadder - N + + Caution Temp - NE + + N/A + + + LinkDownRSSIWidget - E + + Show stats per card - SE + + dBm of each ant/card - S + + Loss caution - SW + + Loss warn - W + + dBm low warning - NW + + Show pollution estimate % - - - HeadingWidgetForm.ui - Transparency + + Show signal quality % - Width + + dBm - Size + +  + + + + + LinkUpRSSIWidget + + + dBm + + + LogMessagesStatusView - UAV is iNav + + LOG GND - Show ticks + + LOG OpenHD AIR - Show N/S/E/W + + LOG FC - HomeDistanceWidgetForm.ui + MapWidgetForm.ui - Lat: + + MAP - Lon: + + + Zoom + Size - Transparency + + Transparency(S) - - - HorizonWidgetForm.ui - Transparency + + + Lock map to drone direction - Size + + Show Drone Track - Invert Pitch + + Show Mission waypoints - Invert Roll + + Enable ADSB - Spacing + + ADSB Internet Source - Show Home + + ADSB SDR Source - Show heading + + ADSB Radius - Show N/S/E/W + + Transparency(B) + + + MavlinkParamPanel - UAV is iNav + + - Show Ladder + + + - ImuTempWidgetForm.ui + MissionWidget - Transparency + + Waypoints curr/total: - Size + + Type: - N/A + + Sync status: - - - MainVideoAndroid - Do not fly with this app! Video is not stable yet! + + Mission - MainVideoGStreamer + NewSwitch - Do not fly with this app! Video is not stable yet! + + SwitchDelegate - MainVideoRender + OHDSettingsPanel - Do not fly with this app! Video is not stable yet! + + LINK/QUICK - - - MapWidgetForm.ui - Zoom + + AIR CAM 1 - Transparency + + AIR CAM 2 - Lock map to drone direction + + AIR - Show Drone Track + + GROUND OSDCustomizer + Shape Color + Glow Color + Text Color + Done - OpenHD + PanelStatus - %1 flight mode + + SYSTEM STATUS - PowerPanel + PowerActionDialoque + Confirm Power Change - If your drone is in the air, rebooting or shutting down the ground or air pi may cause a crash or make it enter failsafe mode! + + If your drone is in the air, rebooting or shutting down may cause a crash or make it enter failsafe mode! + Cancel + Reboot Ground + Shutdown Ground + Reboot Air + Shutdown Air + + Reboot FC + + + + + Shutdown FC + + + + Yes - PowerPanelForm.ui + PressTempWidget - Reboot or safely shut down the air/ground before removing power, or to apply settings changes when it is difficult to cycle power manually. If you have a power control board or sensors connected you may also see power supply information. + + Declutter Upon Arm - Air + + Warn Temp - Output Voltage: + + Caution Temp - Current: + + N/A + + + + + PressTempWidget2 + + + Declutter Upon Arm + + + + + Warn Temp - Reboot + + Caution Temp - Shutdown + + N/A + + + PressTempWidget3 - Ground + + Declutter Upon Arm - Supply Voltage: + + Warn Temp - Output Current: + + Caution Temp - Battery Voltage: + + N/A - PressTempWidgetForm.ui + QOpenHDServiceDialoque - Transparency + + QOpenHD - Size + + Cancel + + + QOpenHDVersionCard - N/A + + GPLv3 - RcRSSIWidgetForm.ui + QRenderStatsWidget - Transparency + + QT FT: - Size + + QT RP: - - + + D:R: + - N/A + + Parse&EnqT: - - - RestartDialog - Restart required + + DecT: - You must restart the app for your loaded configuration file to take effect + + DecRT: - Cancel + + Doing wait_for_frame_decode: - Close App + + Format: - - - RollWidgetForm.ui - Transparency + + Decoding type: - Size + + Rtp parse n gaps: - Invert Roll + + RTP QOHD measured: - Show Arc + + estimate fps: - Show Numbers + + estimate keyframe i: - Sky Pointer + + decode dropped: - SensorPanelForm.ui + RCRssiWidget + + + % + + - If you have temperature or IMU sensors connected you may see and/or calibrate them below. + + + + + + + N/A - SettingsPopupForm.ui + RcDebugScreenFC - App + + FC RC (for debugging) - Ground + + NOTE: Only works on ardupilot! +NOTE: Slow update rate(1Hz)-only for debugging +Here you can see the rc channel values your FC reports via mavlink - Status + + ranges: 1000-2000(pwm) +unused: 65535, +not set: -1 + + + RcDebugScreenOpenHD - Charts + + OpenHD RC - Power + + Here you can view the values which OpenHD reads from your Joystick + and sends to the FC via wifibroadcast (If enabled) - Sensors + + ranges: 1000-2000(pwm) +unused: 65535, +not set: -1 + + + RcInfoPanel + About - Close + + RC over OpenHD - debug + + + + + FC channels - debug - SpeedSecondWidgetForm.ui + RcInfoScreen - Transparency + + Info - Size + + Enable OpenHD-RC: + +1. OpenHD GND: Set 'ENABLE_JOY_RC' to 'ENABLED', +2.Connect a joystick via USB to GND Station +3.Optionally reboot + +You can use the other screens to validate/debug your setup. +NOTE: Using a seperate RC link (e.g. ExpressLRS) is recommended ! + + + + + + Channel mapping - Airspeed / Groundspeed + + Channel mapping is not intuitive, but it works when done correctly. +If you cannot make it work, any proper RC controller (e.g. running EdgeTX / OpenTX) +supports more advanced channel mapping and works via USB ! - SpeedWidgetForm.ui + RestartQOpenHDMessageBox - Transparency + + QOpenHD - Size + + Restart - Airspeed / Groundspeed + + Cancel + + + RollWidget - Show ladder + + Invert Roll - Range + + Show Arc + + + + + Show Numbers - Minimum + + Sky Pointer - StatusChartForm.ui + SOCStatusWidgetGeneric - Air CPU + + Declutter Upon Arm - Air Temp + + Show undervolt icon - Gnd CPU + + Caution CPU - Gnd Temp + + Warn CPU - Lost Pkt + + Caution Temp - Damage Blk + + Warn Temp + + + SettingsCategory - Down RSSI + + - Up RSSI + + + + + SpeedSecondWidget - Inj. Fail + + Use groundspeed - Skip Pkt + + Use km/h - Bitrate + + Show unit - StatusPanelForm.ui + SpeedWidget + + + Use groundspeed + + + + + Show ladder + + + + + Show unit + + + + + Use km/h + + - Last RSSI: + + Range + + + StatusCardBodyFC - HB: + + Firmware: - | ATT: + + Ping: - | BAT: + + Type: - | GPS: + + Alive: - | VFR: + + SysID: - ThrottleWidgetForm.ui + StatusCardBodyOpenHD - Transparency + + Platform: - Size + + Version: - throttle + + Link: - UplinkRSSIWidgetForm.ui + StatusCardsColumn - Transparency + + Ground station - Size + + Air unit - dBm + + Flight Controller + + + ThrottleWidget - N/A + + throttle - VibrationWidgetForm.ui + VerticalSpeedGaugeWidget - Transparency + + Range + + + VerticalSpeedSimpleWidget - Size + + Show unit + + + + + Show up / down arrow + + + VibrationWidget + X + Y + Z - VideoWidgetGStreamerForm.ui + VideoBitrateWidgetGeneric - Transparency + + Show RED recording active - - - VideoWidgetRenderForm.ui - Transparency + + Status: - - - VirtualJoystick - Virtual Joystick + + Type: - - - VsiWidgetForm.ui - Transparency + + Codec: - Size + + Resolution: - Range + + Bitrate SET: + + + + + MEASURED: + + + + + Injected(+FEC): + + + + + TX Dropped/RX lost: + + + + + FREE SPACE: + + + + + AIR RECORD: - WindWidgetForm.ui + WBLinkRateControlWidget - Transparency + + Show frequency - Size + + Show bitrate + + Show fec and keyframe + + + + + Bitrate show detailed + + + + + WindWidget + + Style: Arrow / Circle + Plane / Copter + 45 Degree Speed M/S + + + Wind Unit + + - main + WorkaroundMessageBox - Open.HD + + QOpenHD + + + + + Okay + + + main - Rapidly tap between widgets to enable/disable stereo + + QOpenHD EVO diff --git a/translations/QOpenHD_es.qm b/translations/QOpenHD_es.qm deleted file mode 100644 index ae7ff0fb6..000000000 Binary files a/translations/QOpenHD_es.qm and /dev/null differ diff --git a/translations/QOpenHD_es.ts b/translations/QOpenHD_es.ts index 29cb4d056..555b3e03b 100644 --- a/translations/QOpenHD_es.ts +++ b/translations/QOpenHD_es.ts @@ -2,1479 +2,1995 @@ - AboutPanelForm.ui + AirBatteryWidget - QOpenHD - QOpenHD + + Show volts and amps + - Air - Aire + + Use batt id 0 only + - OpenHD Version: - OpenHD Versión: + + Batt1: + - Ground - Tierra + + Batt2: + - License: GPLv3 - Licencia: GPLv3 + + %L1% + - AdsbWidgetForm.ui + AirspeedTempWidget - Transparency - Transparencia + + AIRSPEED SENSOR TEMPERATURE + - Size - Talla + + Declutter Upon Arm + - Range - Intervalo + + Warn Temp + + + + + Caution Temp + - Source OpenSky / SDR + + N/A - AirBatteryWidgetForm.ui + AltitudeSecondWidget - Voltage: - Voltaje + + Relative / MSL + + + + AltitudeWidget - Current: - Corriente + + Use MSL + - Transparency - Transparencia + + Show ladder + - Size - Talla + + Show unit + - Show volts and amps - Mostrar voltios y amperios + + Range + + + + + AoaWidget + + + Range + + + + AppDevSettingsView - Show single cell voltage - Mostrar voltaje medio por celda + + Save + - %L1% - %L1% + + Load + - Use telemetry percentege + + Reset - - - AirStatusWidgetForm.ui - Transparency - Transparencia + + WARNING + - Size - Talla + + Continue + + + + + Cancel + - AltitudeSecondWidgetForm.ui + AppDeveloperStatsPanel - Transparency - Transparencia + + Developer Menu + - Size - Talla + + Restart QOpenHD + - Relative / MSL - Relativa / Nivel del mar + + Cancel QOpenHD + - AltitudeWidgetForm.ui + AppGeneralSettingsView - Transparency - Transparencia + + Animation Smoothing + + + + AppScreenSettingsView - Size - Tamaño + + 0° + - Relative / MSL - Relativa / Nivel del mar + + 90° (WARNING) + - Show ladder - Mostrar escala + + 180° + - Range - Rango + + 270° (WARNING) + - - - AppSettingsPanel.ui - General - General + + -1 Disable + - Widgets - Widgets + + 0 Auto (Recommended) + - Screen - Pantalla + + 50 (ultra small) + - Video - Video + + 72 (smaller) + - Manage - Gestionar + + 100 + - Enable Speech - Habilitar Dialogo + + 120 (bigger) + - Battery Cells - Celdas de Bateria + + 150 (ultra big) + + + + AppSettingsPanel - Imperial units - Unidades Imperiales + + Widgets + - Enable RC - Habilitar RC + + Style + - Mavlink SysID - Mavlink SysID + + General + - Language / Locale - Idioma + + Vehicle + - Shape Color - Forma Color + + Screen + - Choose a color - Elige un color + + Video + - Glow Color - Color del brillo + + Dev + + + + AppVideoSettingsView - Text Color - Color del Texto + + Video test mode + - Top/bottom bars - barras de arriba/abajo + + Limit FPS in test file + + + + AppWidgetSettingsView - Hide - Esconder + + Show GPS + - Transparent black + + Show Home Distance - Hide when drone armed + + Show RC RSSI (not OpenHD RC) - Turn red when drone armed + + Show Flight Timer - Show Downlink RSSI - Mostrar Downlink RSSI + + Show Flight Mode + - Show Uplink RSSI - Mostrar Uplink RSSI + + Show IMU Sensor Temperature + - Show RC RSSI (not OpenHD RC) + + Show Pressure Sensor Temperature - Show Bitrate - Mostrar Bitrate + + Show Pressure Sensor 2 Temperature + - Show GPS - Mostrar GPS + + Show Pressure Sensor 3 Temperature + - Show Home Distance - Mostrar distancia a casa + + Show Airspeed Sensor Temperature + - Show Flight Timer - Mostrar temporizador de vuelo + + Show Esc Temperature + - Show Flight Mode - Mostrar modo de vuelo + + Show Battery Temperature + - Show Flight Controller Temperature - Mostrar la temperatura del controlador de vuelo + + Show Ground Status + - Show Ground Status - Mostrar estado de unidad de tierra + + Show Ground Battery + + Show Air Status - Mostrar estado de unidad aérea + + Show Air Battery - Mostrar Bateria unidad aérea + + Show mAh - Mostrar mAh + - Show Total Flight Distance - Mostrar Distancia Total de Vuelo + + Show Efficiency in mAh/km + - Show log messages on-screen - Mostrar mensajes log en pantalla + + Show Total Flight Distance + + Show Horizon - Mostrar Horizonte + + + Show performance horizon + + + + Show Flight Path Vector - Mostrar vector de trayectoria de vuelo + + Show Altitude - Mostrar Altitud + + Show Speed - Mostrar Velocidad + + Show Second Speed - Mostrar segunda velocidad + + Show Heading - Mostrar Orientacion + + Show Second Altitude - Mostrar Segunda Altitud + + Show Bank Angle Indicator + Show Home Arrow - Mostrar flecha direccion casa - - - Show Map - Mostrar Mapa + + Show Throttle - Mostrar gas + + Show Control Inputs - Mostrar inputs de control - - - Show GPIO - Mostrar GPIO + + Show Vibration - Mostrar Vibración - - - Show Vertical Speed - Mostrar Velocidad Vertical + - Show Wind (Experimental) - Mostrar Viento (Experimental) + + Show Vertical Speed (minimal) + - Show ADS-B Traffic - Mostrar ADS-B + + Show Vertical Speed Gauge + - Show BlackBox - Mostrar BlackBox + + Show Wind (Experimental) + - Show example widget - Mostrar ejemplo de widget + + Show Missions + - Screen Scale - Escala de pantalla + + Show Angle of Attack + - Brightness - Brillo + + Show Map + - Always use software video decoder - Usar siempre encoder de video software + + Show ADSB + - Enable PiP - Habilitar PiP + + Show log messages on-screen + - Enable LTE - Habilitar LTE + + Show Sidebar + - Hide warning watermark - No mostrar marca de agua de avisos + + Show QT Render stats + - Enable stereo mode - Habilitar estéreo + + Show GPIO + + + + AppWidgetStyleSettingsView - Stereo OSD mode - Modo OSD estéreo + + Shape Color + - Load settings from file - Cargar configuración desde archivo + + Glow Color + - Load - Leído + + Text Color + - Select settings file - Seleccionar archivo de configuración + + Text font + + + + ArrowWidget - Save settings to file - Escribir la configuración en el archivo + + Invert Arrow + + + + BaseWidgetDefaultUiControlElements - Save - Escribir + + Transparency + - Select location - Seleccionar ubicación + + Lock to Horizontal Center + - Reset all settings - Restablecer todos los ajustes + + Lock to Vertical Center + + + + BatteryTempWidget - Reset - Reinicializar + + BATTERY SENSOR TEMPERATURE + - Settings reset - Reiniciar ajustes + + Declutter Upon Arm + - Log Level + + Warn Temp - Text font + + Caution Temp - Show IMU Sensor Temperature + + N/A + + + ColorPicker - Show Pressure Sensor Temperature + + Cancel - Show Esc Temperature + + Select + + + ConnectPanel - Show Efficiency in mAh/km + + CONNECT TO OPENHD GND / AIR UNIT - ArrowWidgetForm + ControlWidget - Transparency - Transparencia + + Show two controls + - Size - Talla + + Use FC channels + - Invert Arrow - Invertir flecha + + Reverse Pitch + - - - BitrateWidgetForm.ui - Measured: - Medido: + + Reverse Roll + - Set: - Asignar: + + Reverse yaw + - Skipped packets: - Paquetes no procesados + + Reverse Throttle + + + + DialoqueFreqChangeGndOnly - Injection failed: - Inyección falló: + + GND Only + - Transparency - Transparencia + + Okay + - Size - Talla + + YES,GND ONLY + - Show skip / fail count - Mostrar cuenta de no procesados / fallados + + Cancel + - BlackBoxWidgetForm.ui + DialoqueNotAlive - Transparency - Transparencia + + QOpenHD + - Size - Talla + + OKAY + - restart telemetry + + TAKE ME - ColorPicker + ErrorMessageBox - Cancel - Cancelar + + ERROR + - Select + + Okay - ControlWidgetForm.ui + EscTempWidget - Transparency - Transparencia - - - Size - Talla + + Declutter Upon Arm + - Show two controls - Mostrar dos controles + + Warn Temp + - Reverse Pitch - Invertir Pitch + + Caution Temp + - Reverse Roll - Invertir Roll + + N/A + + + + ExampleWidget - Reverse yaw - Invertir Yaw + + Example widget + + + + FCMavlinkSystem - Reverse Throttle - Invertir Throttle + + %1 flight mode + %1 modo de vuelo - DownlinkRSSIWidgetForm.ui + FlightModeWidget - dBm - dBm + + Show disarmed + - (%L1%) - (%L1%) + + Only For Ardupilot + + + + FooterRebootShutdownWarning - CTS: - CTS: + + REBOOT + - Transparency - Transparencia + + SHUTDOWN + + + + FpvWidget - Size - Talla + + Dynamic + - Show lost/damaged - Mostrar perdidos/dañados + + Invert Pitch + - Show all cards to right - Mostrar todas las targetas a la derecha + + Vertical Limit + - N/A - N/A + + Lateral Limit + + + + FreqComboBoxRow - dBm - dBm + +  + - EscTempWidgetForm.ui + GPSWidget - Transparency - Transparencia + + Always show lat/lon + - Size + + Hide identity - N/A - N/A + + Declutter Upon Arm + - - - ExampleWidgetForm.ui - Example widget - Mostrar ejemplo de widget + + Warn HDOP + - - - FcTempWidgetForm.ui - Transparency - Transparencia + + Caution HDOP + - Size - Talla + + + Lat: + - N/A - N/A + + + Lon: + - - - FlightDistanceWidgetForm.ui - Transparency - Transparencia + + GPS Count: + - Size - Talla + + GPS Lock: + - - - FlightMahKmWidgetForm.ui - Transparency - Transparencia + + HDOP: + - Size + + VDOP: + + + + + %L1 - FlightMahWidgetForm.ui + GroundPowerWidget - Transparency - Transparencia + + Show single cell voltage + - Size - Talla + + Battery Type + - Use telemetry data - Usar datos de telemetria + + Battery Low + - - - FlightModeWidgetForm.ui - Transparency - Transparencia + + Battery Mid + - Size - Talla + + Battery Full + - FlightTimerWidgetForm.ui + HeadingLadder - Transparency - Transparencia + + N + N - Size - Talla + + NE + NE + + + + E + E + + + + SE + SE + + + + S + S + + + + SW + SW + + + + W + W + + + + NW + NW - FpvWidgetForm.ui + HeadingWidget - Dynamic - Dinamico + + Show ticks + - Sensitivity - Sensibilidad + + Show N/S/E/W + + + + HomeDistanceWidget - Transparency - Transparencia + + Home Lat: + - Size - Talla + + Home Lon: + - GPSWidgetForm.ui + HorizonLadder - Lat: - Lat: + + N + N - Lon: - Lon: + + NE + NE - Transparency - Transparencia + + E + E - Size - Talla + + SE + SE - Always show lat/lon - Mostrar siempre lat/lon + + S + S - %L1 - %L1 + + SW + SW + + + + W + W + + + + NW + NW - GroundPiSettingsPanelForm.ui + HorizonWidget - Presets - Presets + + Clip area + - General - General + + Width + + + + + Spacing + - Radio - Radio + + Range + - Video - Video + + Step + - RC - RC + + Invert Pitch + - Hotspot - Hotspot + + Invert Roll + - Smart Sync - Smart Sync + + Show Ladder + - Other - Otros + + Show Home + - Apply preset - Aplicar preset + + Show heading + - Save - Guardar + + Show N/S/E/W + - saved - Guardar + + Show center indicator + - GroundPiSettingsPresetView.ui + ImuTempWidget - Presets are groups of settings that must be configured together for some OpenHD features and to make common configurations easier to use. Once you apply a preset, the ground station will reboot and enter SmartSync mode automatically, then power on your drone to let it sync the new settings. - Presets son grupos de opciones que deben ser configuradas juntas para algunas funcionalidades de OpenHD, y para hacer configuraciones comunes mas sencillas de usar. Una vez que se aplique un preset, la unidad de tierra se reiniciará y entrara el modo SmartSync automaticamente, despues enciende tu dron para permitir que sincronize con la nueva configuracion. + + Declutter Upon Arm + - Note: you can apply more than one preset, but any settings that are mutually exclusive (band switcher + 2nd camera at the same time), the last preset to be configured "wins" - Nota: Puedes aplicar más de un preset, pero cualquier opción que sea mutuamente excluyente ( band switcher y segunda camara al mismo tiemo ), sera ingorada y el último preset configurado sera guardado + + Warn Temp + + + + + Caution Temp + - Changes that will be applied: - Cambios que serán aplicados: + + N/A + - GroundPowerWidgetForm.ui + LinkDownRSSIWidget - Voltage in: - Voltaje de entrada: + + Show stats per card + - Voltage out: - Voltaje de salida: + + dBm of each ant/card + - Current out: - Corriente de salida: + + Loss caution + - Voltage bat: - Voltaje bateria: + + Loss warn + - Transparency - Transparencia + + dBm low warning + + + + + Show pollution estimate % + + + + + Show signal quality % + + + + + dBm + + + + +  + - GroundStatusWidgetForm.ui + LinkUpRSSIWidget - Transparency - Transparencia + + dBm + + + + LogMessagesStatusView - Size - Talla + + LOG GND + + + + + LOG OpenHD AIR + + + + + LOG FC + - HeadingLadder + MapWidgetForm.ui - N - N + + MAP + - NE - NE + + + Zoom + - E - E + + Size + - SE - SE + + Transparency(S) + - S - S + + + Lock map to drone direction + - SW - SW + + Show Drone Track + - W - W + + Show Mission waypoints + - NW - NW + + Enable ADSB + + + + + ADSB Internet Source + + + + + ADSB SDR Source + + + + + ADSB Radius + + + + + Transparency(B) + - HeadingWidgetForm.ui + MavlinkParamPanel - Transparency - Transparencia + +  + - Width - Anchura + + +  + + + + MissionWidget - Size - Tamaño + + Waypoints curr/total: + - UAV is iNav - UAV es iNav + + Type: + - Show ticks - Mostrar ticks + + Sync status: + - Show N/S/E/W - Mostrar N/S/E/W + + Mission + - HomeDistanceWidgetForm.ui + NewSwitch - Lat: - Lat: + + SwitchDelegate + + + + OHDSettingsPanel - Lon: - Lon: + + LINK/QUICK + - Size - Talla + + AIR CAM 1 + - Transparency - Transparencia + + AIR CAM 2 + + + + + AIR + + + + + GROUND + + + + + OSDCustomizer + + + Shape Color + + + + + Glow Color + + + + + Text Color + + + + + Done + + + + + PanelStatus + + + SYSTEM STATUS + - HorizonWidgetForm.ui + PowerActionDialoque - Transparency - Transparencia + + Confirm Power Change + - Size - Tamaño + + If your drone is in the air, rebooting or shutting down may cause a crash or make it enter failsafe mode! + - Invert Pitch - Invertir Pitch + + Cancel + - Invert Roll - Invertir Roll + + Reboot Ground + - Spacing - Espaciamiento + + Shutdown Ground + - Show Home - Mostrar casa + + Reboot Air + - Show heading - Mostrar Orientacion + + Shutdown Air + - Show N/S/E/W - Mostrar N/S/E/W + + Reboot FC + - UAV is iNav - El vehículo es iNav + + Shutdown FC + - Show Ladder - Mostrar Ladder + + Yes + - ImuTempWidgetForm.ui + PressTempWidget - Transparency - Transparencia + + Declutter Upon Arm + - Size + + Warn Temp + + + + + Caution Temp + N/A - N/A + - MainVideoAndroid + PressTempWidget2 - Do not fly with this app! Video is not stable yet! - No vuele con esta aplicación, ¡el video aún no es estable! + + Declutter Upon Arm + - - - MainVideoGStreamer - Do not fly with this app! Video is not stable yet! - No vuele con esta aplicación, ¡el video aún no es estable! + + Warn Temp + + + + + Caution Temp + - - - MainVideoRender - Do not fly with this app! Video is not stable yet! - No vuele con esta aplicación, ¡el video aún no es estable! + + N/A + - MapWidgetForm.ui + PressTempWidget3 - Zoom - Zoom + + Declutter Upon Arm + - Transparency - Transparencia + + Warn Temp + - Lock map to drone direction - Bloquear mapa en la direccion del drone + + Caution Temp + - Show Drone Track - Mostrar rastro del vehículo + + N/A + - OSDCustomizer - - Shape Color - Forma Color - - - Glow Color - Color del brillo - + QOpenHDServiceDialoque - Text Color - Color del Texto + + QOpenHD + - Done + + Cancel - OpenHD + QOpenHDVersionCard - %1 flight mode - %1 modo de vuelo + + GPLv3 + - PowerPanel + QRenderStatsWidget - Confirm Power Change - Confirmar cambio de energía - - - If your drone is in the air, rebooting or shutting down the ground or air pi may cause a crash or make it enter failsafe mode! - Si tu drone esta armado puede estrellarse o entrar en modo failsafe + + QT FT: + - Cancel - Cancelar + + QT RP: + - Reboot Ground - Reiniciar tierra + + D:R: + - Shutdown Ground - Desconectar tierra + + Parse&EnqT: + - Reboot Air - Reiniciar Aire + + DecT: + - Shutdown Air - Desconectar Aire + + DecRT: + - Yes - Si + + Doing wait_for_frame_decode: + - - - PowerPanelForm.ui - Reboot or safely shut down the air/ground before removing power, or to apply settings changes when it is difficult to cycle power manually. If you have a power control board or sensors connected you may also see power supply information. + + Format: - Air - Aire + + Decoding type: + - Output Voltage: - Tensión de salida: + + Rtp parse n gaps: + - Current: - Energía: + + RTP QOHD measured: + - Reboot - Reiniciar + + estimate fps: + - Shutdown - Desconectar + + estimate keyframe i: + - Ground - Tierra + + decode dropped: + + + + RCRssiWidget - Supply Voltage: - Voltaje entrante: + + % + - Output Current: - Energía saliente: + + + - Battery Voltage: - Voltaje de la batería: + + N/A + - PressTempWidgetForm.ui + RcDebugScreenFC - Transparency - Transparencia + + FC RC (for debugging) + - Size + + NOTE: Only works on ardupilot! +NOTE: Slow update rate(1Hz)-only for debugging +Here you can see the rc channel values your FC reports via mavlink - N/A - N/A + + ranges: 1000-2000(pwm) +unused: 65535, +not set: -1 + - RcRSSIWidgetForm.ui + RcDebugScreenOpenHD - Transparency - Transparencia + + OpenHD RC + - Size - Talla + + Here you can view the values which OpenHD reads from your Joystick + and sends to the FC via wifibroadcast (If enabled) + - - + + ranges: 1000-2000(pwm) +unused: 65535, +not set: -1 + + + + + RcInfoPanel + + + About + - N/A - N/A + + RC over OpenHD - debug + + + + + FC channels - debug + - RestartDialog + RcInfoScreen - Restart required + + Info - You must restart the app for your loaded configuration file to take effect + + Enable OpenHD-RC: + +1. OpenHD GND: Set 'ENABLE_JOY_RC' to 'ENABLED', +2.Connect a joystick via USB to GND Station +3.Optionally reboot + +You can use the other screens to validate/debug your setup. +NOTE: Using a seperate RC link (e.g. ExpressLRS) is recommended ! + - Cancel - Cancelar + + Channel mapping + - Close App - Cerrar App + + Channel mapping is not intuitive, but it works when done correctly. +If you cannot make it work, any proper RC controller (e.g. running EdgeTX / OpenTX) +supports more advanced channel mapping and works via USB ! + - RollWidgetForm.ui + RestartQOpenHDMessageBox - Transparency - Transparencia + + QOpenHD + - Size - Talla + + Restart + + + + + Cancel + + + + RollWidget + Invert Roll - Invertir Roll + + Show Arc + Show Numbers - Mostrar números + + Sky Pointer - SensorPanelForm.ui + SOCStatusWidgetGeneric - If you have temperature or IMU sensors connected you may see and/or calibrate them below. + + Declutter Upon Arm - - - SettingsPopupForm.ui - - App - App - - Ground - Tierra + + Show undervolt icon + - Status - Estado + + Caution CPU + - Charts - Cartas + + Warn CPU + - Power - Energia + + Caution Temp + - Sensors - Sensores + + Warn Temp + + + + SettingsCategory - About - Sobre + +  + - Close - Cerrar + +  + - SpeedSecondWidgetForm.ui + SpeedSecondWidget - Transparency - Transparencia + + Use groundspeed + - Size - Talla + + Use km/h + - Airspeed / Groundspeed - Velocidad de pitot / GPS + + Show unit + - SpeedWidgetForm.ui + SpeedWidget - Transparency - Transparencia + + Use groundspeed + - Size - Tamaño + + Show ladder + - Airspeed / Groundspeed - Velocidad de pitot / GPS + + Show unit + - Show ladder - Mostrar ladder + + Use km/h + + Range - Rango - - - Minimum - Mínimo + - StatusChartForm.ui + StatusCardBodyFC - Air CPU + + Firmware: - Air Temp + + Ping: - Gnd CPU + + Type: - Gnd Temp + + Alive: - Lost Pkt - Perdidos: - - - Damage Blk - Dañados: - - - Down RSSI - Mostrar Downlink RSSI - - - Up RSSI - Mostrar Uplink RSSI + + SysID: + + + + StatusCardBodyOpenHD - Inj. Fail + + Platform: - Skip Pkt + + Version: - Bitrate - Mostrar Bitrate + + Link: + - StatusPanelForm.ui + StatusCardsColumn + + + Ground station + + - Last RSSI: + + Air unit - HB: + + Flight Controller + + + ThrottleWidget - | ATT: + + throttle + + + VerticalSpeedGaugeWidget - | BAT: + + Range + + + VerticalSpeedSimpleWidget - | GPS: + + Show unit - | VFR: + + Show up / down arrow - ThrottleWidgetForm.ui + VibrationWidget - Transparency - Transparencia + + X + - Size - Talla + + Y + - throttle - Gas + + Z + - UplinkRSSIWidgetForm.ui + VideoBitrateWidgetGeneric - Transparency - Transparencia + + Show RED recording active + - Size - Talla + + Status: + - dBm - dBm + + Type: + - N/A - N/A + + Codec: + - - - VibrationWidgetForm.ui - Transparency - Transparencia + + Resolution: + - Size - Talla + + Bitrate SET: + - X + + MEASURED: - Y + + Injected(+FEC): - Z + + TX Dropped/RX lost: - - - VideoWidgetGStreamerForm.ui - Transparency - Transparencia + + FREE SPACE: + - - - VideoWidgetRenderForm.ui - Transparency - Transparencia + + AIR RECORD: + - VirtualJoystick + WBLinkRateControlWidget - Virtual Joystick - Joystick Virtual + + Show frequency + - - - VsiWidgetForm.ui - Transparency - Transparencia + + Show bitrate + - Size - Talla + + Show fec and keyframe + - Range - Rango + + Bitrate show detailed + - WindWidgetForm.ui - - Transparency - Transparencia - - - Size - Talla - + WindWidget + Style: Arrow / Circle - Estilo: Flecha / Circulo + + Plane / Copter - Avión / Copter + + 45 Degree Speed M/S - 45 Grados velocidad M/S - - - - main - - Open.HD - Open.HD + - Cancel - Cancelar + + Wind Unit + + + + WorkaroundMessageBox - Restart App - Reiniciar App + + QOpenHD + - Close App - Cerrar App + + Okay + + + + main - Rapidly tap between widgets to enable/disable stereo + + QOpenHD EVO diff --git a/translations/QOpenHD_fr.qm b/translations/QOpenHD_fr.qm deleted file mode 100644 index 538a0df49..000000000 Binary files a/translations/QOpenHD_fr.qm and /dev/null differ diff --git a/translations/QOpenHD_fr.ts b/translations/QOpenHD_fr.ts index 294725e5a..bf1cdcf3d 100644 --- a/translations/QOpenHD_fr.ts +++ b/translations/QOpenHD_fr.ts @@ -2,1475 +2,1995 @@ - AboutPanelForm.ui + AirBatteryWidget - QOpenHD - QOpenHD + + Show volts and amps + - Air - Station en vol + + Use batt id 0 only + - OpenHD Version: - Version OpenHD: + + Batt1: + - Ground - Station au sol + + Batt2: + - License: GPLv3 - License: GPLv3 + + %L1% + - AdsbWidgetForm.ui + AirspeedTempWidget - Transparency - Transparence + + AIRSPEED SENSOR TEMPERATURE + - Size - Taille + + Declutter Upon Arm + - Range - Portée + + Warn Temp + + + + + Caution Temp + - Source OpenSky / SDR + + N/A - AirBatteryWidgetForm.ui + AltitudeSecondWidget - Voltage: - Voltage : + + Relative / MSL + + + + AltitudeWidget - Current: - Intensité : + + Use MSL + - Transparency - Transparence + + Show ladder + - Size - Taille + + Show unit + - Show volts and amps - Afficher les volts et les ampères + + Range + + + + + AoaWidget + + + Range + + + + AppDevSettingsView - Show single cell voltage - Afficher le voltage par cellule + + Save + - %L1% - %L1% + + Load + - Use telemetry percentege + + Reset - - - AirStatusWidgetForm.ui - Transparency - Transparence + + WARNING + - Size - Taille + + Continue + + + + + Cancel + - AltitudeSecondWidgetForm.ui + AppDeveloperStatsPanel - Transparency - Transparence + + Developer Menu + - Size - Taille + + Restart QOpenHD + - Relative / MSL - Relative / MSL + + Cancel QOpenHD + - AltitudeWidgetForm.ui + AppGeneralSettingsView - Transparency - Transparence + + Animation Smoothing + + + + AppScreenSettingsView - Size - Taille + + 0° + - Relative / MSL - Relative / MSL + + 90° (WARNING) + - Show ladder - Afficher l'échelle + + 180° + - Range - Portée + + 270° (WARNING) + - - - AppSettingsPanel.ui - General - Général + + -1 Disable + - Widgets - Widget + + 0 Auto (Recommended) + - Screen - Ecran + + 50 (ultra small) + - Video - Vidéo + + 72 (smaller) + - Manage - Gérer + + 100 + - Enable Speech - Activer la vocalisation + + 120 (bigger) + - Battery Cells - Cellules de batterie + + 150 (ultra big) + + + + AppSettingsPanel - Imperial units - Unités non métriques + + Widgets + - Enable RC - Activer RC + + Style + - Mavlink SysID - Mavlink SysID + + General + - Language / Locale - Langue + + Vehicle + - Shape Color - Couleur du contour + + Screen + - Choose a color - Choisir une couleur + + Video + - Glow Color - Couleur de la lumière + + Dev + + + + AppVideoSettingsView - Text Color - Couleur du texte + + Video test mode + - Top/bottom bars - Barres du haut / du bas + + Limit FPS in test file + + + + AppWidgetSettingsView - Hide - Cacher + + Show GPS + - Transparent black - Noir transparent + + Show Home Distance + - Hide when drone armed + + Show RC RSSI (not OpenHD RC) - Turn red when drone armed + + Show Flight Timer - Show Downlink RSSI - Afficher le RSSI descendant + + Show Flight Mode + - Show Uplink RSSI - Afficher le RSSI montant + + Show IMU Sensor Temperature + - Show RC RSSI (not OpenHD RC) + + Show Pressure Sensor Temperature - Show Bitrate - Afficher le débit (Bits/sec) + + Show Pressure Sensor 2 Temperature + - Show GPS - Afficher la position GPS + + Show Pressure Sensor 3 Temperature + - Show Home Distance - Afficher la distance de retour au point de décollage + + Show Airspeed Sensor Temperature + - Show Flight Timer - Afficher le chronomètre de temps de vol + + Show Esc Temperature + - Show Flight Mode - Afficher le mode de vol + + Show Battery Temperature + - Show Flight Controller Temperature - Afficher la température du contrôleur de vol + + Show Ground Status + - Show Ground Status - Afficher le statut du système au sol + + Show Ground Battery + + Show Air Status - Afficher le statut du système en vol + + Show Air Battery - Afficher la batterie en vol + + Show mAh - Afficher les mAh + - Show Total Flight Distance - Afficher la distance de vol totale + + Show Efficiency in mAh/km + - Show log messages on-screen - Afficher les messages d'information à l'écran + + Show Total Flight Distance + + Show Horizon - Afficher l'horizon + + + + + Show performance horizon + + Show Flight Path Vector - Afficher la flèche de la direction de vol + + Show Altitude - Afficher l'altitude + + Show Speed - Afficher la vitesse + + Show Second Speed - Afficher la deuxième vitesse + + Show Heading - Afficher la direction + + Show Second Altitude - Afficher la seconde altitude + + Show Bank Angle Indicator + Show Home Arrow - Afficher la flèche Home - - - Show Map - Afficher la carte + + Show Throttle - Afficher les gaz + + Show Control Inputs - Afficher le contrôle des entrées - - - Show GPIO - Afficher les GPIO + + Show Vibration - Afficher les vibrations - - - Show Vertical Speed - Afficher la vitesse verticale + - Show Wind (Experimental) - Afficher la vitesse du vent (expérimental) + + Show Vertical Speed (minimal) + - Show ADS-B Traffic - Afficher ADS-B + + Show Vertical Speed Gauge + - Show BlackBox - Afficher la Blackbox + + Show Wind (Experimental) + - Show example widget - Afficher l'exemple de widget + + Show Missions + - Screen Scale - Afficher l'échelle + + Show Angle of Attack + - Brightness - Luminosité + + Show Map + - Always use software video decoder - Toujours utiliser le décodage vidéo logiciel + + Show ADSB + - Enable PiP - Activer PiP + + Show log messages on-screen + - Enable LTE - Activer LTE + + Show Sidebar + - Hide warning watermark - Cacher les avertissements en filigrane + + Show QT Render stats + - Enable stereo mode - Activer le mode stéréo + + Show GPIO + + + + AppWidgetStyleSettingsView - Stereo OSD mode - Mode OSD stéréo + + Shape Color + - Load settings from file - Lire le fichier de configuration + + Glow Color + - Load - Lire + + Text Color + - Select settings file - Sélectionnez le fichier de configuration + + Text font + + + + ArrowWidget - Save settings to file - Ecrire la configuration dans un fichier + + Invert Arrow + + + + BaseWidgetDefaultUiControlElements - Save - Sauvegarder + + Transparency + - Select location - Sélectionnez l'emplacement + + Lock to Horizontal Center + - Reset all settings - Réinitialiser la configuration + + Lock to Vertical Center + + + + BatteryTempWidget - Reset - Réinitialiser + + BATTERY SENSOR TEMPERATURE + - Settings reset - Réinitialiser la configuration + + Declutter Upon Arm + - Log Level + + Warn Temp - Text font + + Caution Temp - Show IMU Sensor Temperature + + N/A + + + ColorPicker - Show Pressure Sensor Temperature + + Cancel - Show Esc Temperature + + Select + + + ConnectPanel - Show Efficiency in mAh/km + + CONNECT TO OPENHD GND / AIR UNIT - ArrowWidgetForm + ControlWidget - Transparency - Transparence + + Show two controls + - Size - Taille + + Use FC channels + - Invert Arrow - Inverser la flèche + + Reverse Pitch + - - - BitrateWidgetForm.ui - Measured: - Mesuré : + + Reverse Roll + - Set: - Défini : + + Reverse yaw + - Skipped packets: - Paquets manqués : + + Reverse Throttle + + + + DialoqueFreqChangeGndOnly - Injection failed: - Injection échouée : + + GND Only + - Transparency - Transparence + + Okay + - Size - Taille + + YES,GND ONLY + - Show skip / fail count - Afficher le nombre des paquets manqués/erronés + + Cancel + - BlackBoxWidgetForm.ui + DialoqueNotAlive - Transparency - Transparence + + QOpenHD + - Size - Taille + + OKAY + - restart telemetry + + TAKE ME - ColorPicker + ErrorMessageBox - Cancel - Annuler + + ERROR + - Select + + Okay - ControlWidgetForm.ui + EscTempWidget - Transparency - Transparence - - - Size - Taille + + Declutter Upon Arm + - Show two controls - Afficher 2 contrôles + + Warn Temp + - Reverse Pitch - Inverser le tangage + + Caution Temp + - Reverse Roll - Inverser le roulis + + N/A + + + + ExampleWidget - Reverse yaw - Inverser le lacet + + Example widget + + + + FCMavlinkSystem - Reverse Throttle - Inverser les gaz + + %1 flight mode + %1 mode de vol - DownlinkRSSIWidgetForm.ui + FlightModeWidget - dBm - dBm + + Show disarmed + - (%L1%) - (%L1%) + + Only For Ardupilot + + + + FooterRebootShutdownWarning - CTS: - CTS : + + REBOOT + - Transparency - Transparence + + SHUTDOWN + + + + FpvWidget - Size - Taille + + Dynamic + - Show lost/damaged - Afficher perdus/endommagés + + Invert Pitch + - Show all cards to right - Afficher toutes les cartes à droite + + Vertical Limit + - N/A - Sans objet + + Lateral Limit + + + + FreqComboBoxRow - dBm - dBm + +  + - EscTempWidgetForm.ui + GPSWidget - Transparency - Transparence + + Always show lat/lon + - Size - Taille + + Hide identity + - N/A - Sans objet + + Declutter Upon Arm + - - - ExampleWidgetForm.ui - Example widget - Afficher l'exemple de widget + + Warn HDOP + - - - FcTempWidgetForm.ui - Transparency - Transparence + + Caution HDOP + - Size - Taille + + + Lat: + - - - FlightDistanceWidgetForm.ui - Transparency - Transparence + + + Lon: + - Size - Taille + + GPS Count: + - - - FlightMahKmWidgetForm.ui - Transparency - Transparence + + GPS Lock: + - Size - Taille + + HDOP: + + + + + VDOP: + + + + + %L1 + - FlightMahWidgetForm.ui + GroundPowerWidget - Transparency - Transparence + + Show single cell voltage + - Size - Taille + + Battery Type + - Use telemetry data - Utiliser les données de télémétrie + + Battery Low + - - - FlightModeWidgetForm.ui - Transparency - Transparence + + Battery Mid + - Size - Taille + + Battery Full + - FlightTimerWidgetForm.ui + HeadingLadder - Transparency - Transparence + + N + N - Size - Taille + + NE + NE + + + + E + E + + + + SE + SE + + + + S + S + + + + SW + SO + + + + W + O + + + + NW + NO - FpvWidgetForm.ui + HeadingWidget - Dynamic - Dynamique + + Show ticks + - Sensitivity - Sensibilité + + Show N/S/E/W + + + + HomeDistanceWidget - Transparency - Transparence + + Home Lat: + - Size - Taille + + Home Lon: + - GPSWidgetForm.ui + HorizonLadder - Lat: - Lat : + + N + N - Lon: - Lon : + + NE + NE - Transparency - Transparence + + E + E - Size - Taille + + SE + SE - Always show lat/lon - Toujours afficher les lat/lon + + S + S - %L1 - %L1 + + SW + SO + + + + W + O + + + + NW + NO - GroundPiSettingsPanelForm.ui + HorizonWidget - Presets - Prédéfinis + + Clip area + - General - Général + + Width + + + + + Spacing + - Radio - Radio + + Range + - Video - Vidéo + + Step + - RC - RC + + Invert Pitch + - Hotspot - Point d'accès wifi + + Invert Roll + - Smart Sync - Smart Sync + + Show Ladder + - Other - Autre + + Show Home + - Apply preset - Appliquer les réglages prédéfinis + + Show heading + - Save - Sauvegarder + + Show N/S/E/W + - saved - Sauvegarder + + Show center indicator + - GroundPiSettingsPresetView.ui + ImuTempWidget - Presets are groups of settings that must be configured together for some OpenHD features and to make common configurations easier to use. Once you apply a preset, the ground station will reboot and enter SmartSync mode automatically, then power on your drone to let it sync the new settings. - Les réglages prédéfinis sont des groupes de paramètres qui doivent être configurés ensemble pour certaines fonctions de OpenHD pour permettre une configuration plus facile. Une fois appliqués, la station au sol redémarrera et se mettra automatiquement en mode SmartSync. Ensuite vous devrez redémarrer le drone pour qu'il se synchronise avec les nouveaux paramètres. + + Declutter Upon Arm + + + + + Warn Temp + - Note: you can apply more than one preset, but any settings that are mutually exclusive (band switcher + 2nd camera at the same time), the last preset to be configured "wins" - Note : Vous pouvez appliquer plus d'un ensemble de réglages prédéfinis, mais si des paramètres s'excluent mutuellement (changeur de bande + 2ème caméra) le dernier l'emportera. + + Caution Temp + - Changes that will be applied: - Changements qui seront appliqués : + + N/A + - GroundPowerWidgetForm.ui + LinkDownRSSIWidget + + + Show stats per card + + - Voltage in: - Voltage entrant : + + dBm of each ant/card + + + + + Loss caution + - Voltage out: - Voltage sortant : + + Loss warn + - Current out: - Intensité sortante : + + dBm low warning + - Voltage bat: - Voltage batterie : + + Show pollution estimate % + - Transparency - Transparence + + Show signal quality % + + + + + dBm + + + + +  + - GroundStatusWidgetForm.ui + LinkUpRSSIWidget - Transparency - Transparence + + dBm + + + + LogMessagesStatusView - Size - Taille + + LOG GND + + + + + LOG OpenHD AIR + + + + + LOG FC + - HeadingLadder + MapWidgetForm.ui - N - N + + MAP + - NE - NE + + + Zoom + - E - E + + Size + - SE - SE + + Transparency(S) + - S - S + + + Lock map to drone direction + - SW - SO + + Show Drone Track + - W - O + + Show Mission waypoints + - NW - NO + + Enable ADSB + + + + + ADSB Internet Source + + + + + ADSB SDR Source + + + + + ADSB Radius + + + + + Transparency(B) + - HeadingWidgetForm.ui + MavlinkParamPanel - Transparency - Transparence + +  + - Width - Largeur + + +  + + + + MissionWidget - Size - Taille + + Waypoints curr/total: + - UAV is iNav - Contôleur de vol utilise iNav + + Type: + - Show ticks - Afficher les marques + + Sync status: + - Show N/S/E/W - Afficher N/S/E/O + + Mission + - HomeDistanceWidgetForm.ui + NewSwitch - Lat: - Lat : + + SwitchDelegate + + + + + OHDSettingsPanel + + + LINK/QUICK + - Lon: - Lon : + + AIR CAM 1 + - Size - Taille + + AIR CAM 2 + - Transparency - Transparence + + AIR + + + + + GROUND + - HorizonWidgetForm.ui + OSDCustomizer - Transparency - Transparence + + Shape Color + + + + + Glow Color + + + + + Text Color + + + + + Done + + + + + PanelStatus + + + SYSTEM STATUS + + + + + PowerActionDialoque + + + Confirm Power Change + - Size - Taille + + If your drone is in the air, rebooting or shutting down may cause a crash or make it enter failsafe mode! + - Invert Pitch - Inverser le tangage + + Cancel + - Invert Roll - Inverser le roulis + + Reboot Ground + - Spacing - Espacement + + Shutdown Ground + - Show Home - Afficher la flèche Home + + Reboot Air + - Show heading - Afficher la direction + + Shutdown Air + - Show N/S/E/W - Afficher N/S/E/O + + Reboot FC + - UAV is iNav - Contôleur de vol utilise iNav + + Shutdown FC + - Show Ladder - Afficher l'échelle + + Yes + - ImuTempWidgetForm.ui + PressTempWidget - Transparency - Transparence + + Declutter Upon Arm + - Size - Taille + + Warn Temp + + + Caution Temp + + + + N/A - Sans objet + - MainVideoAndroid + PressTempWidget2 - Do not fly with this app! Video is not stable yet! - Vlieg niet met deze app, video is nog niet stabiel! + + Declutter Upon Arm + - - - MainVideoGStreamer - Do not fly with this app! Video is not stable yet! - Vlieg niet met deze app, video is nog niet stabiel! + + Warn Temp + + + + + Caution Temp + - - - MainVideoRender - Do not fly with this app! Video is not stable yet! - Ne volez pas avec cette application! La vidéo n'est pas encore stable! + + N/A + - MapWidgetForm.ui + PressTempWidget3 - Zoom - Zoom + + Declutter Upon Arm + - Transparency - Transparence + + Warn Temp + - Lock map to drone direction - Orienter la carte selon la direction de vol + + Caution Temp + - Show Drone Track - Toon voertuigspoor + + N/A + - OSDCustomizer - - Shape Color - Couleur du contour - - - Glow Color - Couleur de la lumière - + QOpenHDServiceDialoque - Text Color - Couleur du texte + + QOpenHD + - Done + + Cancel - OpenHD + QOpenHDVersionCard - %1 flight mode - %1 mode de vol + + GPLv3 + - PowerPanel - - Confirm Power Change - Confirmer le changement - + QRenderStatsWidget - If your drone is in the air, rebooting or shutting down the ground or air pi may cause a crash or make it enter failsafe mode! - Si votre appareil est armé, il pourrait s'écraser ou entrer en mode "failsafe" + + QT FT: + - Cancel - Annuler + + QT RP: + - Reboot Ground + + D:R: - Shutdown Ground + + Parse&EnqT: - Reboot Air - Herstarten Voertuig + + DecT: + - Shutdown Air + + DecRT: - Yes - Oui + + Doing wait_for_frame_decode: + - - - PowerPanelForm.ui - Reboot or safely shut down the air/ground before removing power, or to apply settings changes when it is difficult to cycle power manually. If you have a power control board or sensors connected you may also see power supply information. + + Format: - Air - Station en vol + + Decoding type: + - Output Voltage: - Voltage : + + Rtp parse n gaps: + - Current: - Intensité : + + RTP QOHD measured: + - Reboot - Redémarrer + + estimate fps: + - Shutdown - Fermer + + estimate keyframe i: + - Ground - Station au sol + + decode dropped: + + + + RCRssiWidget - Supply Voltage: - Voltage entrant : + + % + - Output Current: - Intensité : + + + - Battery Voltage: - Voltage de batterie: + + N/A + - PressTempWidgetForm.ui + RcDebugScreenFC - Transparency - Transparence + + FC RC (for debugging) + - Size - Taille + + NOTE: Only works on ardupilot! +NOTE: Slow update rate(1Hz)-only for debugging +Here you can see the rc channel values your FC reports via mavlink + - N/A - Sans objet + + ranges: 1000-2000(pwm) +unused: 65535, +not set: -1 + - RcRSSIWidgetForm.ui + RcDebugScreenOpenHD - Transparency - Transparence + + OpenHD RC + - Size - Taille + + Here you can view the values which OpenHD reads from your Joystick + and sends to the FC via wifibroadcast (If enabled) + - - + + ranges: 1000-2000(pwm) +unused: 65535, +not set: -1 + + + + RcInfoPanel - N/A - Sans objet + + About + + + + + RC over OpenHD - debug + + + + + FC channels - debug + - RestartDialog + RcInfoScreen - Restart required + + Info - You must restart the app for your loaded configuration file to take effect + + Enable OpenHD-RC: + +1. OpenHD GND: Set 'ENABLE_JOY_RC' to 'ENABLED', +2.Connect a joystick via USB to GND Station +3.Optionally reboot + +You can use the other screens to validate/debug your setup. +NOTE: Using a seperate RC link (e.g. ExpressLRS) is recommended ! + - Cancel - Annuler + + Channel mapping + - Close App - Fermer l'application + + Channel mapping is not intuitive, but it works when done correctly. +If you cannot make it work, any proper RC controller (e.g. running EdgeTX / OpenTX) +supports more advanced channel mapping and works via USB ! + - RollWidgetForm.ui + RestartQOpenHDMessageBox - Transparency - Transparence + + QOpenHD + - Size - Taille + + Restart + + + + + Cancel + + + + RollWidget + Invert Roll - Inverser le roulis + + Show Arc + Show Numbers - Afficher les nombres + + Sky Pointer - SensorPanelForm.ui + SOCStatusWidgetGeneric - If you have temperature or IMU sensors connected you may see and/or calibrate them below. + + Declutter Upon Arm - - - SettingsPopupForm.ui - - App - Apli - - Ground - Station au sol + + Show undervolt icon + - Status - Statut + + Caution CPU + - Charts - Diagrammes + + Warn CPU + - Power - l' énergie + + Caution Temp + - Sensors - Capteurs + + Warn Temp + + + + SettingsCategory - About - A propos + +  + - Close - Fermer + +  + - SpeedSecondWidgetForm.ui + SpeedSecondWidget - Transparency - Transparence + + Use groundspeed + - Size - Taille + + Use km/h + - Airspeed / Groundspeed - Vitesse Air / GPS + + Show unit + - SpeedWidgetForm.ui + SpeedWidget - Transparency - Transparence + + Use groundspeed + - Size - Taille + + Show ladder + - Airspeed / Groundspeed - Vitesse Air / GPS + + Show unit + - Show ladder - Afficher l'échelle + + Use km/h + + Range - Portée - - - Minimum - Minimum + - StatusChartForm.ui + StatusCardBodyFC - Air CPU + + Firmware: - Air Temp + + Ping: - Gnd CPU + + Type: - Gnd Temp + + Alive: - Lost Pkt - Perdus : - - - Damage Blk - Endommagés : - - - Down RSSI - Afficher le RSSI descendant - - - Up RSSI - Afficher le RSSI montant + + SysID: + + + + StatusCardBodyOpenHD - Inj. Fail + + Platform: - Skip Pkt + + Version: - Bitrate - Afficher le débit (Bits/sec) + + Link: + - StatusPanelForm.ui + StatusCardsColumn + + + Ground station + + - Last RSSI: + + Air unit - HB: + + Flight Controller + + + ThrottleWidget - | ATT: + + throttle + + + VerticalSpeedGaugeWidget - | BAT: + + Range + + + VerticalSpeedSimpleWidget - | GPS: + + Show unit - | VFR: + + Show up / down arrow - ThrottleWidgetForm.ui + VibrationWidget - Transparency - Transparence + + X + - Size - Taille + + Y + - throttle - Gaz + + Z + - UplinkRSSIWidgetForm.ui + VideoBitrateWidgetGeneric - Transparency - Transparence + + Show RED recording active + - Size - Taille + + Status: + - dBm - dBm + + Type: + - N/A - Sans objet + + Codec: + - - - VibrationWidgetForm.ui - Transparency - Transparence + + Resolution: + - Size - Taille + + Bitrate SET: + - X - x + + MEASURED: + - Y - Y + + Injected(+FEC): + - Z - Z + + TX Dropped/RX lost: + - - - VideoWidgetGStreamerForm.ui - Transparency - Transparence + + FREE SPACE: + - - - VideoWidgetRenderForm.ui - Transparency - Transparence + + AIR RECORD: + - VirtualJoystick + WBLinkRateControlWidget - Virtual Joystick - Joystick virtuel + + Show frequency + - - - VsiWidgetForm.ui - Transparency - Transparence + + Show bitrate + - Size - Taille + + Show fec and keyframe + - Range - Portée + + Bitrate show detailed + - WindWidgetForm.ui - - Transparency - Transparence - - - Size - Taille - + WindWidget + Style: Arrow / Circle - Style: Flèche / Cercle + + Plane / Copter - Avion / Copter + + 45 Degree Speed M/S - Vitesse à 45° (m/s) - - - - main - - Open.HD - Open.HD + - Cancel - Annuler + + Wind Unit + + + + WorkaroundMessageBox - Restart App - Redémarrez + + QOpenHD + - Close App - Fermer l'application + + Okay + + + + main - Rapidly tap between widgets to enable/disable stereo + + QOpenHD EVO diff --git a/translations/QOpenHD_it.qm b/translations/QOpenHD_it.qm deleted file mode 100644 index 351add061..000000000 Binary files a/translations/QOpenHD_it.qm and /dev/null differ diff --git a/translations/QOpenHD_it.ts b/translations/QOpenHD_it.ts index 1b8a32ed0..1128fbde9 100644 --- a/translations/QOpenHD_it.ts +++ b/translations/QOpenHD_it.ts @@ -2,1479 +2,1995 @@ - AboutPanelForm.ui + AirBatteryWidget - QOpenHD - QOpenHD + + Show volts and amps + - Air - Aria: + + Use batt id 0 only + - OpenHD Version: - Versione OpenHD: + + Batt1: + - Ground - Terra + + Batt2: + - License: GPLv3 - Licenza: GPLv3 + + %L1% + - AdsbWidgetForm.ui + AirspeedTempWidget - Transparency - Trasparenza + + AIRSPEED SENSOR TEMPERATURE + - Size - Dimensioni + + Declutter Upon Arm + - Range - Intervallo + + Warn Temp + + + + + Caution Temp + - Source OpenSky / SDR + + N/A - AirBatteryWidgetForm.ui + AltitudeSecondWidget - Voltage: - Tensione: + + Relative / MSL + + + + AltitudeWidget - Current: - Corrente: + + Use MSL + - Transparency - Trasparenza + + Show ladder + - Size - Dimensioni + + Show unit + - Show volts and amps - Mostra tensione e corrente + + Range + + + + + AoaWidget + + + Range + + + + AppDevSettingsView - Show single cell voltage - Mostra la tensione della singola cella + + Save + - %L1% - %L1% + + Load + - Use telemetry percentege + + Reset - - - AirStatusWidgetForm.ui - Transparency - Trasparenza + + WARNING + - Size - Dimensioni + + Continue + + + + + Cancel + - AltitudeSecondWidgetForm.ui + AppDeveloperStatsPanel - Transparency - Trasparenza + + Developer Menu + - Size - Dimensioni + + Restart QOpenHD + - Relative / MSL - Relativa / s.l.m. + + Cancel QOpenHD + - AltitudeWidgetForm.ui + AppGeneralSettingsView - Transparency - Trasparenza + + Animation Smoothing + + + + AppScreenSettingsView - Size - Dimensioni + + 0° + - Relative / MSL - Relativa / s.l.m. + + 90° (WARNING) + - Show ladder - Mostra scala + + 180° + - Range - Intervallo + + 270° (WARNING) + - - - AppSettingsPanel.ui - General - Generale + + -1 Disable + - Widgets - Widgets + + 0 Auto (Recommended) + - Screen - Schermo + + 50 (ultra small) + - Video - Video + + 72 (smaller) + - Manage - Gestire + + 100 + - Enable Speech - Abilita voce + + 120 (bigger) + - Battery Cells - Celle batteria + + 150 (ultra big) + + + + AppSettingsPanel - Imperial units - Unità di misura imperiali + + Widgets + - Enable RC - Abilita RC + + Style + - Mavlink SysID - Mavlink SysID + + General + - Language / Locale - Linguaggio + + Vehicle + - Shape Color - Colore figura + + Screen + - Choose a color - Scegli un colore + + Video + - Glow Color - Colore contorno + + Dev + + + + AppVideoSettingsView - Text Color - Colore testo + + Video test mode + - Top/bottom bars - Barre superiori/inferiori + + Limit FPS in test file + + + + AppWidgetSettingsView - Hide - Nascondere + + Show GPS + - Transparent black - Nero trasparente + + Show Home Distance + - Hide when drone armed + + Show RC RSSI (not OpenHD RC) - Turn red when drone armed + + Show Flight Timer - Show Downlink RSSI - Mostra RSSI Downlink + + Show Flight Mode + - Show Uplink RSSI - Mostra RSSI Uplink + + Show IMU Sensor Temperature + - Show RC RSSI (not OpenHD RC) + + Show Pressure Sensor Temperature - Show Bitrate - Mostra bitrate + + Show Pressure Sensor 2 Temperature + - Show GPS - Mostra GPS + + Show Pressure Sensor 3 Temperature + - Show Home Distance - Mostra distanza da casa + + Show Airspeed Sensor Temperature + - Show Flight Timer - Mostra timer di volo + + Show Esc Temperature + - Show Flight Mode - Mostra modalità di volo + + Show Battery Temperature + - Show Flight Controller Temperature - Mostra la temperatura del controller di volo + + Show Ground Status + - Show Ground Status - Mostra stato Terra + + Show Ground Battery + + Show Air Status - Mostra stato Aria + + Show Air Battery - Mostra batteria Aria + + Show mAh - Mostra mAh + - Show Total Flight Distance - Mostra distanza di volo totale + + Show Efficiency in mAh/km + - Show log messages on-screen - Mostra log messaggi sullo schermo + + Show Total Flight Distance + + Show Horizon - Mostra orizzonte + + + + + Show performance horizon + + Show Flight Path Vector - Mostra vettore percorso di volo + + Show Altitude - Mostra altitudine + + Show Speed - Mostra velocità + + Show Second Speed - Mostra velocità secondaria + + Show Heading - Mostra direzione + + Show Second Altitude - Mostra altitudine secondaria + + Show Bank Angle Indicator + Show Home Arrow - Mostra direzione di casa - - - Show Map - Mostra mappa + + Show Throttle - Mostra acceleratore + + Show Control Inputs - Mostra controlli in ingresso - - - Show GPIO - Mostra GPIO + + Show Vibration - Mostra vibrazione - - - Show Vertical Speed - Mostra velocità verticale + - Show Wind (Experimental) - Mostra vento (sperimentale) + + Show Vertical Speed (minimal) + - Show ADS-B Traffic - Mostra ADS-B + + Show Vertical Speed Gauge + - Show BlackBox - Mostra BlackBox + + Show Wind (Experimental) + - Show example widget - Mostra widget di esempio + + Show Missions + - Screen Scale - Intervallo schermo + + Show Angle of Attack + - Brightness - Luminosità + + Show Map + - Always use software video decoder - Usa sempre decoder video software + + Show ADSB + - Enable PiP - Abilita PiP + + Show log messages on-screen + - Enable LTE - Abilita LTE + + Show Sidebar + - Hide warning watermark - Nascondi watermark di avvertimento + + Show QT Render stats + - Enable stereo mode - Abilita la modalità stereo + + Show GPIO + + + + AppWidgetStyleSettingsView - Stereo OSD mode - Modalità OSD stereo + + Shape Color + - Load settings from file - Leggi il file di configurazione + + Glow Color + - Load - Leggere + + Text Color + - Select settings file - Seleziona il file di configurazione + + Text font + + + + ArrowWidget - Save settings to file - Scrivi il file di configurazione + + Invert Arrow + + + + BaseWidgetDefaultUiControlElements - Save - Salva + + Transparency + - Select location - Seleziona la posizione + + Lock to Horizontal Center + - Reset all settings - Ripristina la configurazione + + Lock to Vertical Center + + + + BatteryTempWidget - Reset - Azzerare + + BATTERY SENSOR TEMPERATURE + - Settings reset - Ripristino della configurazione + + Declutter Upon Arm + - Log Level + + Warn Temp - Text font + + Caution Temp - Show IMU Sensor Temperature + + N/A + + + ColorPicker - Show Pressure Sensor Temperature + + Cancel - Show Esc Temperature + + Select + + + ConnectPanel - Show Efficiency in mAh/km + + CONNECT TO OPENHD GND / AIR UNIT - ArrowWidgetForm + ControlWidget - Transparency - Trasparenza + + Show two controls + - Size - Dimensioni + + Use FC channels + - Invert Arrow - Inverti freccia + + Reverse Pitch + - - - BitrateWidgetForm.ui - Measured: - Misurato: + + Reverse Roll + - Set: - Set: + + Reverse yaw + - Skipped packets: - Pacchetti saltati: + + Reverse Throttle + + + + DialoqueFreqChangeGndOnly - Injection failed: - Iniezioni fallite: + + GND Only + - Transparency - Trasparenza + + Okay + - Size - Dimensioni + + YES,GND ONLY + - Show skip / fail count - Mostra conteggio saltati/falliti + + Cancel + - BlackBoxWidgetForm.ui + DialoqueNotAlive - Transparency - Trasparenza + + QOpenHD + - Size - Dimensioni + + OKAY + - restart telemetry + + TAKE ME - ColorPicker + ErrorMessageBox - Cancel - Cancella + + ERROR + - Select + + Okay - ControlWidgetForm.ui + EscTempWidget - Transparency - Trasparenza - - - Size - Dimensioni + + Declutter Upon Arm + - Show two controls - Mostra due controlli + + Warn Temp + - Reverse Pitch - Beccheggio Invertito + + Caution Temp + - Reverse Roll - Rollio invertito + + N/A + + + + ExampleWidget - Reverse yaw - Imbardata invertita + + Example widget + + + + FCMavlinkSystem - Reverse Throttle - Acceleratore invertito + + %1 flight mode + %1 modo di volo - DownlinkRSSIWidgetForm.ui + FlightModeWidget - dBm - dBm + + Show disarmed + - (%L1%) - (%L1%) + + Only For Ardupilot + + + + FooterRebootShutdownWarning - CTS: - CTS: + + REBOOT + - Transparency - Trasparenza + + SHUTDOWN + + + + FpvWidget - Size - Dimensioni + + Dynamic + - Show lost/damaged - Mostra persi/danneggiati + + Invert Pitch + - Show all cards to right - Mostra tutte le schede sulla destra + + Vertical Limit + - N/A - N/A + + Lateral Limit + + + + FreqComboBoxRow - dBm - dBm + +  + - EscTempWidgetForm.ui + GPSWidget - Transparency - Trasparenza + + Always show lat/lon + - Size - Dimensioni + + Hide identity + - N/A - N/A + + Declutter Upon Arm + - - - ExampleWidgetForm.ui - Example widget - Mostra widget di esempio + + Warn HDOP + - - - FcTempWidgetForm.ui - Transparency - Trasparenza + + Caution HDOP + - Size - Dimensioni + + + Lat: + - N/A - N/A + + + Lon: + - - - FlightDistanceWidgetForm.ui - Transparency - Trasparenza + + GPS Count: + - Size - Dimensioni + + GPS Lock: + - - - FlightMahKmWidgetForm.ui - Transparency - Trasparenza + + HDOP: + - Size - Dimensioni + + VDOP: + + + + + %L1 + - FlightMahWidgetForm.ui + GroundPowerWidget - Transparency - Trasparenza + + Show single cell voltage + - Size - Dimensioni + + Battery Type + - Use telemetry data - Usa dati telemetria + + Battery Low + - - - FlightModeWidgetForm.ui - Transparency - Trasparenza + + Battery Mid + - Size - Dimensioni + + Battery Full + - FlightTimerWidgetForm.ui + HeadingLadder - Transparency - Trasparenza + + N + N - Size - Dimensioni + + NE + NE - - - FpvWidgetForm.ui - Dynamic - Dinamico + + E + E - Sensitivity - Sensibilità + + SE + SE - Transparency - Trasparenza + + S + S - Size - Dimensioni + + SW + SO - - - GPSWidgetForm.ui - Lat: - Lat: + + W + O - Lon: - Lon: + + NW + NO + + + HeadingWidget - Transparency - Trasparenza + + Show ticks + - Size - Dimensioni + + Show N/S/E/W + + + + HomeDistanceWidget - Always show lat/lon - Mostra sempre lat/lon + + Home Lat: + - %L1 - %L1 + + Home Lon: + - GroundPiSettingsPanelForm.ui + HorizonLadder - Presets - Presets + + N + N - General - Generale + + NE + NE - Radio - Radio + + E + E - Video - Video + + SE + SE - RC - RC + + S + S - Hotspot - Hotspot + + SW + SO - Smart Sync - Smart Sync + + W + O - Other - Altro + + NW + NO + + + HorizonWidget - Apply preset - Applica preset + + Clip area + - Save - Salva + + Width + - saved - Salva + + Spacing + - - - GroundPiSettingsPresetView.ui - Presets are groups of settings that must be configured together for some OpenHD features and to make common configurations easier to use. Once you apply a preset, the ground station will reboot and enter SmartSync mode automatically, then power on your drone to let it sync the new settings. - I preset sono gruppi di parametri che devono essere configurati assieme per alcune funzionalità di OpenHD, e per facilitare l'uso di configurazioni di uso comune. Una volta applicato un preset, la stazione di terra si riavvierà e entrerà in modalità SmartSync automaticamente, avviare successivamente la stazione di aria per consentirle di sincronizzarsi con i nuovi parametri. + + Range + - Note: you can apply more than one preset, but any settings that are mutually exclusive (band switcher + 2nd camera at the same time), the last preset to be configured "wins" - Nota: si può applicare più di un preset, ma per tutti i parametri mutuamente esclusivi (cambio banda + seconda videocamera allo stesso momento) il preset applicato per ultimo "vince" + + Step + - Changes that will be applied: - Cambiamenti che verranno applicati: + + Invert Pitch + - - - GroundPowerWidgetForm.ui - Voltage in: - Tensione ingresso: + + Invert Roll + - Voltage out: - Tensione uscita: + + Show Ladder + - Current out: - Corrente uscita: + + Show Home + - Voltage bat: - Tensione bat: + + Show heading + - Transparency - Trasparenza + + Show N/S/E/W + + + + + Show center indicator + - GroundStatusWidgetForm.ui + ImuTempWidget - Transparency - Trasparenza + + Declutter Upon Arm + - Size - Dimensioni + + Warn Temp + - - - HeadingLadder - N - N + + Caution Temp + - NE - NE + + N/A + + + + LinkDownRSSIWidget - E - E + + Show stats per card + - SE - SE + + dBm of each ant/card + - S - S + + Loss caution + - SW - SO + + Loss warn + - W - O + + dBm low warning + - NW - NO + + Show pollution estimate % + - - - HeadingWidgetForm.ui - Transparency - Trasparenza + + Show signal quality % + - Width - Larghezza + + dBm + - Size - Dimensioni + +  + + + + + LinkUpRSSIWidget + + + dBm + + + + LogMessagesStatusView - UAV is iNav - UAV usa iNav + + LOG GND + - Show ticks - Mostra tacche + + LOG OpenHD AIR + - Show N/S/E/W - Mostra N/S/E/O + + LOG FC + - HomeDistanceWidgetForm.ui + MapWidgetForm.ui - Lat: - Lat: + + MAP + - Lon: - Lon: + + + Zoom + + Size - Dimensioni + - Transparency - Trasparenza + + Transparency(S) + - - - HorizonWidgetForm.ui - Transparency - Trasparenza + + + Lock map to drone direction + - Size - Dimensioni + + Show Drone Track + - Invert Pitch - Inverti Beccheggio + + Show Mission waypoints + - Invert Roll - Inverti Rollio + + Enable ADSB + - Spacing - Spaziatura + + ADSB Internet Source + - Show Home - Mostra direzione di casa + + ADSB SDR Source + - Show heading - Mostra direzione + + ADSB Radius + - Show N/S/E/W - Mostra N/S/E/O + + Transparency(B) + + + + MavlinkParamPanel - UAV is iNav - UAV usa iNav + +  + - Show Ladder - Mostra scala + + +  + - ImuTempWidgetForm.ui + MissionWidget - Transparency - Trasparenza + + Waypoints curr/total: + - Size - Dimensioni + + Type: + - N/A - N/A + + Sync status: + - - - MainVideoAndroid - Do not fly with this app! Video is not stable yet! - Non volare con questa app! Il video non è ancora stabile! + + Mission + - MainVideoGStreamer + NewSwitch - Do not fly with this app! Video is not stable yet! - Non volare con questa app! Il video non è ancora stabile! + + SwitchDelegate + - MainVideoRender + OHDSettingsPanel - Do not fly with this app! Video is not stable yet! - Non volare con questa app! Il video non è ancora stabile! + + LINK/QUICK + - - - MapWidgetForm.ui - Zoom - Zoom + + AIR CAM 1 + - Transparency - Trasparenza + + AIR CAM 2 + - Lock map to drone direction - Blocca mappa sulla direzione del drone + + AIR + - Show Drone Track - Mostra la traccia del drone + + GROUND + OSDCustomizer + Shape Color - Colore figura + + Glow Color - Colore contorno + + Text Color - Colore testo + + Done - OpenHD + PanelStatus - %1 flight mode - %1 modo di volo + + SYSTEM STATUS + - PowerPanel + PowerActionDialoque + Confirm Power Change - Conferma la modifica + - If your drone is in the air, rebooting or shutting down the ground or air pi may cause a crash or make it enter failsafe mode! - Se il drone è armato può precipitare o entrare in modalità failsafe + + If your drone is in the air, rebooting or shutting down may cause a crash or make it enter failsafe mode! + + Cancel - Cancella + + Reboot Ground - Riavvia stazione di terra + + Shutdown Ground + Reboot Air + Shutdown Air + + Reboot FC + + + + + Shutdown FC + + + + Yes - + - PowerPanelForm.ui + PressTempWidget + + + Declutter Upon Arm + + + + + Warn Temp + + - Reboot or safely shut down the air/ground before removing power, or to apply settings changes when it is difficult to cycle power manually. If you have a power control board or sensors connected you may also see power supply information. + + Caution Temp - Air - Aria: + + N/A + + + + PressTempWidget2 - Output Voltage: - Tensione di uscita: + + Declutter Upon Arm + - Current: - Corrente: + + Warn Temp + - Reboot - Riavvia + + Caution Temp + - Shutdown + + N/A + + + PressTempWidget3 - Ground - Terra + + Declutter Upon Arm + - Supply Voltage: - Tensione ingresso: + + Warn Temp + - Output Current: - Corrente: + + Caution Temp + - Battery Voltage: - Voltaggio batteria: + + N/A + - PressTempWidgetForm.ui + QOpenHDServiceDialoque - Transparency - Trasparenza + + QOpenHD + - Size - Dimensioni + + Cancel + + + + QOpenHDVersionCard - N/A - N/A + + GPLv3 + - RcRSSIWidgetForm.ui + QRenderStatsWidget - Transparency - Trasparenza + + QT FT: + - Size - Dimensioni + + QT RP: + - - + + D:R: + - N/A - N/A + + Parse&EnqT: + - - - RestartDialog - Restart required + + DecT: - You must restart the app for your loaded configuration file to take effect + + DecRT: - Cancel - Cancella + + Doing wait_for_frame_decode: + - Close App - Chiudere l'app + + Format: + - - - RollWidgetForm.ui - Transparency - Trasparenza + + Decoding type: + - Size - Dimensioni + + Rtp parse n gaps: + - Invert Roll - Inverti Rollio + + RTP QOHD measured: + - Show Arc + + estimate fps: - Show Numbers - Mostra i numeri + + estimate keyframe i: + - Sky Pointer + + decode dropped: - SensorPanelForm.ui + RCRssiWidget + + + % + + + + + + + - If you have temperature or IMU sensors connected you may see and/or calibrate them below. + + N/A - SettingsPopupForm.ui + RcDebugScreenFC - App - App + + FC RC (for debugging) + - Ground - Terra + + NOTE: Only works on ardupilot! +NOTE: Slow update rate(1Hz)-only for debugging +Here you can see the rc channel values your FC reports via mavlink + - Status - Stato + + ranges: 1000-2000(pwm) +unused: 65535, +not set: -1 + + + + RcDebugScreenOpenHD - Charts - Mappe + + OpenHD RC + - Power + + Here you can view the values which OpenHD reads from your Joystick + and sends to the FC via wifibroadcast (If enabled) - Sensors - Energia + + ranges: 1000-2000(pwm) +unused: 65535, +not set: -1 + + + + RcInfoPanel + About - Informazioni + + + + + RC over OpenHD - debug + - Close - Chiudi + + FC channels - debug + - SpeedSecondWidgetForm.ui + RcInfoScreen - Transparency - Trasparenza + + Info + - Size - Dimensioni + + Enable OpenHD-RC: + +1. OpenHD GND: Set 'ENABLE_JOY_RC' to 'ENABLED', +2.Connect a joystick via USB to GND Station +3.Optionally reboot + +You can use the other screens to validate/debug your setup. +NOTE: Using a seperate RC link (e.g. ExpressLRS) is recommended ! + + + + + + Channel mapping + - Airspeed / Groundspeed - Velocità aria / GPS + + Channel mapping is not intuitive, but it works when done correctly. +If you cannot make it work, any proper RC controller (e.g. running EdgeTX / OpenTX) +supports more advanced channel mapping and works via USB ! + - SpeedWidgetForm.ui + RestartQOpenHDMessageBox - Transparency - Trasparenza + + QOpenHD + - Size - Dimensioni + + Restart + - Airspeed / Groundspeed - Velocità aria / GPS + + Cancel + + + + RollWidget - Show ladder - Mostra scala + + Invert Roll + - Range - Intervallo + + Show Arc + + + + + Show Numbers + - Minimum - Minimo + + Sky Pointer + - StatusChartForm.ui + SOCStatusWidgetGeneric - Air CPU - Temperatura dell'CPU + + Declutter Upon Arm + - Air Temp - Temperatura dell'aria + + Show undervolt icon + - Gnd CPU + + Caution CPU - Gnd Temp + + Warn CPU - Lost Pkt - Persi: + + Caution Temp + - Damage Blk - Danneggiati: + + Warn Temp + + + + SettingsCategory - Down RSSI - Mostra RSSI Downlink + +  + - Up RSSI - Mostra RSSI Uplink + +  + + + + SpeedSecondWidget - Inj. Fail + + Use groundspeed - Skip Pkt + + Use km/h - Bitrate - Mostra bitrate + + Show unit + - StatusPanelForm.ui + SpeedWidget + + + Use groundspeed + + + + + Show ladder + + + + + Show unit + + + + + Use km/h + + - Last RSSI: + + Range + + + StatusCardBodyFC - HB: + + Firmware: - | ATT: + + Ping: - | BAT: + + Type: - | GPS: + + Alive: - | VFR: + + SysID: - ThrottleWidgetForm.ui + StatusCardBodyOpenHD - Transparency - Trasparenza + + Platform: + - Size - Dimensioni + + Version: + - throttle - acceleratore + + Link: + - UplinkRSSIWidgetForm.ui + StatusCardsColumn - Transparency - Trasparenza + + Ground station + - Size - Dimensioni + + Air unit + - dBm - dBm + + Flight Controller + + + + ThrottleWidget - N/A - N/A + + throttle + - VibrationWidgetForm.ui + VerticalSpeedGaugeWidget - Transparency - Trasparenza + + Range + + + + VerticalSpeedSimpleWidget - Size - Dimensioni + + Show unit + + + + + Show up / down arrow + + + + VibrationWidget + X + Y + Z - VideoWidgetGStreamerForm.ui + VideoBitrateWidgetGeneric - Transparency - Trasparenza + + Show RED recording active + - - - VideoWidgetRenderForm.ui - Transparency - Trasparenza + + Status: + - - - VirtualJoystick - Virtual Joystick - Joystick virtuale + + Type: + - - - VsiWidgetForm.ui - Transparency - Trasparenza + + Codec: + - Size - Dimensioni + + Resolution: + - Range - Intervallo + + Bitrate SET: + + + + + MEASURED: + + + + + Injected(+FEC): + + + + + TX Dropped/RX lost: + + + + + FREE SPACE: + + + + + AIR RECORD: + - WindWidgetForm.ui + WBLinkRateControlWidget - Transparency - Trasparenza + + Show frequency + - Size - Dimensioni + + Show bitrate + + + + + Show fec and keyframe + + + + + Bitrate show detailed + + + + WindWidget + Style: Arrow / Circle - Stile: Freccia / Cerchio + + Plane / Copter - Aereo / Elicottero + + 45 Degree Speed M/S - 45 Gradi Velocità M/S - - - - main - - Open.HD - Open.HD + - Cancel - Cancella + + Wind Unit + + + + WorkaroundMessageBox - Restart App - Riavvia l'app + + QOpenHD + - Close App - Chiudere l'app + + Okay + + + + main - Rapidly tap between widgets to enable/disable stereo + + QOpenHD EVO diff --git a/translations/QOpenHD_nl.qm b/translations/QOpenHD_nl.qm deleted file mode 100644 index 020002ec8..000000000 Binary files a/translations/QOpenHD_nl.qm and /dev/null differ diff --git a/translations/QOpenHD_nl.ts b/translations/QOpenHD_nl.ts index ee3177adb..29bc82fe3 100644 --- a/translations/QOpenHD_nl.ts +++ b/translations/QOpenHD_nl.ts @@ -2,1479 +2,1995 @@ - AboutPanelForm.ui + AirBatteryWidget - QOpenHD - QOpenHD + + Show volts and amps + - Air - Voertuig + + Use batt id 0 only + - OpenHD Version: - OpenHD Versie: + + Batt1: + - Ground - Grond + + Batt2: + - License: GPLv3 - Licentie: GPLv3 + + %L1% + - AdsbWidgetForm.ui + AirspeedTempWidget - Transparency - Transparantie + + AIRSPEED SENSOR TEMPERATURE + - Size - Grootte + + Declutter Upon Arm + - Range - Bereik + + Warn Temp + + + + + Caution Temp + - Source OpenSky / SDR + + N/A - AirBatteryWidgetForm.ui + AltitudeSecondWidget - Voltage: - Voltage: + + Relative / MSL + + + + AltitudeWidget - Current: - Stroom: + + Use MSL + - Transparency - Transparantie + + Show ladder + - Size - Grootte + + Show unit + - Show volts and amps - Toon voltage en stroom + + Range + + + + + AoaWidget + + + Range + + + + AppDevSettingsView - Show single cell voltage - Toon voltage enkele cell + + Save + - %L1% - %L1% + + Load + - Use telemetry percentege + + Reset - - - AirStatusWidgetForm.ui - Transparency - Transparantie + + WARNING + - Size - Grootte + + Continue + + + + + Cancel + - AltitudeSecondWidgetForm.ui + AppDeveloperStatsPanel - Transparency - Transparantie + + Developer Menu + - Size - Grootte + + Restart QOpenHD + - Relative / MSL - Relatief / Zeenivo + + Cancel QOpenHD + - AltitudeWidgetForm.ui + AppGeneralSettingsView - Transparency - Transparantie + + Animation Smoothing + + + + AppScreenSettingsView - Size - Grootte + + 0° + - Relative / MSL - Relatief / Zeenivo + + 90° (WARNING) + - Show ladder - Toon ladder + + 180° + - Range - Bereik + + 270° (WARNING) + - - - AppSettingsPanel.ui - General - Algemeen + + -1 Disable + - Widgets - Widgets + + 0 Auto (Recommended) + - Screen - Scherm + + 50 (ultra small) + - Video - Video + + 72 (smaller) + - Manage - Beheer + + 100 + - Enable Speech - Spraak aanzetten + + 120 (bigger) + - Battery Cells - Batterij cellen + + 150 (ultra big) + + + + AppSettingsPanel - Imperial units - Engelse eenheden + + Widgets + - Enable RC - RC aanzetten + + Style + - Mavlink SysID - Mavlink SysID + + General + - Language / Locale - Taal + + Vehicle + - Shape Color - Vorm Kleur + + Screen + - Choose a color - Kies een kleur + + Video + - Glow Color - Gloei Kleur + + Dev + + + + AppVideoSettingsView - Text Color - Tekstkleur + + Video test mode + - Top/bottom bars - Boven- en onderbalk + + Limit FPS in test file + + + + AppWidgetSettingsView - Hide - Zich verstoppen + + Show GPS + - Transparent black - Transparant zwart + + Show Home Distance + - Hide when drone armed + + Show RC RSSI (not OpenHD RC) - Turn red when drone armed + + Show Flight Timer - Show Downlink RSSI - Toon downlink RSSI + + Show Flight Mode + - Show Uplink RSSI - Toon Uplink RSSI + + Show IMU Sensor Temperature + - Show RC RSSI (not OpenHD RC) + + Show Pressure Sensor Temperature - Show Bitrate - Toon Bitrate + + Show Pressure Sensor 2 Temperature + - Show GPS - Toon GPS + + Show Pressure Sensor 3 Temperature + - Show Home Distance - Toon Afstand Tot Thuis + + Show Airspeed Sensor Temperature + - Show Flight Timer - Toon Vluchttimer + + Show Esc Temperature + - Show Flight Mode - Toon Vluchtmodus + + Show Battery Temperature + - Show Flight Controller Temperature - Toon vluchtcontroller temperatuur + + Show Ground Status + - Show Ground Status - Toon Grond Status + + Show Ground Battery + + Show Air Status - Toon Voertuig Status + + Show Air Battery - Toon Voertuig Batterij + + Show mAh - Toon mAh + - Show Total Flight Distance - Toon Totale Vluchtafstand + + Show Efficiency in mAh/km + - Show log messages on-screen - Toon logberichten op het scherm + + Show Total Flight Distance + + Show Horizon - Toon Horizon + + + + + Show performance horizon + + Show Flight Path Vector - Toon Vluchtpad Vector + + Show Altitude - Toon Hoogte + + Show Speed - Toon Snelheid + + Show Second Speed - Toon tweede snelheid + + Show Heading - Toon Koers + + Show Second Altitude - Toon Tweede Hoogte + + Show Bank Angle Indicator + Show Home Arrow - Toon Pijl Naar Huis - - - Show Map - Toon Kaart + + Show Throttle - Toon Gashendel + + Show Control Inputs - Toon Invoer Assen - - - Show GPIO - Toon GPIO + + Show Vibration - Toon Vibratie - - - Show Vertical Speed - Toon Verticale Snelheid + - Show Wind (Experimental) - Toon Wind (Experimenteel) + + Show Vertical Speed (minimal) + - Show ADS-B Traffic + + Show Vertical Speed Gauge - Show BlackBox - Toon Blackbox + + Show Wind (Experimental) + - Show example widget - Toon Voorbeeldwidget + + Show Missions + - Screen Scale - Scherm Schaal + + Show Angle of Attack + - Brightness - Helderheid + + Show Map + - Always use software video decoder - Gebruik altijd software video decoder + + Show ADSB + - Enable PiP - Toon PiP + + Show log messages on-screen + - Enable LTE - Gebruik LTE + + Show Sidebar + - Hide warning watermark - Verberg waarschuwing watermerk + + Show QT Render stats + - Enable stereo mode - Stereomodus inschakelen + + Show GPIO + + + + AppWidgetStyleSettingsView - Stereo OSD mode - Stereo OSD-modus + + Shape Color + - Load settings from file - Laad instellingen uit bestand + + Glow Color + - Load - Laad + + Text Color + - Select settings file - Selecteer het instellingenbestand + + Text font + + + + ArrowWidget - Save settings to file - Sla het instellingenbestand op + + Invert Arrow + + + + BaseWidgetDefaultUiControlElements - Save - Opschrijven + + Transparency + - Select location - Selecteer een locatie + + Lock to Horizontal Center + - Reset all settings - Reset alle instellingen + + Lock to Vertical Center + + + + BatteryTempWidget - Reset - Reset + + BATTERY SENSOR TEMPERATURE + - Settings reset - Reset instellingen + + Declutter Upon Arm + - Log Level + + Warn Temp - Text font + + Caution Temp - Show IMU Sensor Temperature + + N/A + + + ColorPicker - Show Pressure Sensor Temperature + + Cancel - Show Esc Temperature + + Select + + + ConnectPanel - Show Efficiency in mAh/km + + CONNECT TO OPENHD GND / AIR UNIT - ArrowWidgetForm + ControlWidget - Transparency - Transparantie + + Show two controls + - Size - Grootte + + Use FC channels + - Invert Arrow - Inverteer Pijl + + Reverse Pitch + - - - BitrateWidgetForm.ui - Measured: - Gemeten: + + Reverse Roll + - Set: - Zet: + + Reverse yaw + - Skipped packets: - Overgeslagen paketten: + + Reverse Throttle + + + + DialoqueFreqChangeGndOnly - Injection failed: - Injectie gefaald: + + GND Only + - Transparency - Transparantie + + Okay + - Size - Grootte + + YES,GND ONLY + - Show skip / fail count - Toon overgeslagen / mislukt telling + + Cancel + - BlackBoxWidgetForm.ui + DialoqueNotAlive - Transparency - Transparantie + + QOpenHD + - Size - Grootte + + OKAY + - restart telemetry - herstart telemetrie + + TAKE ME + - ColorPicker + ErrorMessageBox - Cancel - Annuleer + + ERROR + - Select + + Okay - ControlWidgetForm.ui + EscTempWidget - Transparency - Transparantie - - - Size - Grootte + + Declutter Upon Arm + - Show two controls - Toon twee controls + + Warn Temp + - Reverse Pitch - Inverteer Pitch + + Caution Temp + - Reverse Roll - Inverteer Rol + + N/A + + + + ExampleWidget - Reverse yaw - Inverteer Yaw + + Example widget + + + + FCMavlinkSystem - Reverse Throttle - Inverteer Gas + + %1 flight mode + %1 vluchtmodus - DownlinkRSSIWidgetForm.ui + FlightModeWidget - dBm - dBm + + Show disarmed + - (%L1%) - (%L1%) + + Only For Ardupilot + + + + FooterRebootShutdownWarning - CTS: - CTS: + + REBOOT + - Transparency - Transparantie + + SHUTDOWN + + + + FpvWidget - Size - Grootte + + Dynamic + - Show lost/damaged - Toon verloren/beschadigd + + Invert Pitch + - Show all cards to right - Toon alle kaarten rechts + + Vertical Limit + - N/A - N.V.T. + + Lateral Limit + + + + FreqComboBoxRow - dBm - dBm + +  + - EscTempWidgetForm.ui + GPSWidget - Transparency - Transparantie + + Always show lat/lon + - Size - Grootte + + Hide identity + - N/A + + Declutter Upon Arm - - - ExampleWidgetForm.ui - Example widget + + Warn HDOP - - - FcTempWidgetForm.ui - Transparency - Transparantie + + Caution HDOP + - Size - Grootte + + + Lat: + - N/A - N/A + + + Lon: + - - - FlightDistanceWidgetForm.ui - Transparency - Transparantie + + GPS Count: + - Size - Grootte + + GPS Lock: + - - - FlightMahKmWidgetForm.ui - Transparency - Transparantie + + HDOP: + - Size - Grootte + + VDOP: + + + + + %L1 + - FlightMahWidgetForm.ui + GroundPowerWidget - Transparency - Transparantie + + Show single cell voltage + - Size - Grootte + + Battery Type + - Use telemetry data - Gebruik telemetrie data + + Battery Low + - - - FlightModeWidgetForm.ui - Transparency - Transparantie + + Battery Mid + - Size - Grootte + + Battery Full + - FlightTimerWidgetForm.ui + HeadingLadder - Transparency - Transparantie + + N + N - Size - Grootte + + NE + NO + + + + E + O + + + + SE + ZO + + + + S + Z + + + + SW + ZW + + + + W + W + + + + NW + NW - FpvWidgetForm.ui + HeadingWidget - Dynamic - Dynamisch + + Show ticks + - Sensitivity - Gevoeligheid + + Show N/S/E/W + + + + HomeDistanceWidget - Transparency - Transparantie + + Home Lat: + - Size - Grootte + + Home Lon: + - GPSWidgetForm.ui + HorizonLadder - Lat: - Lat: + + N + N - Lon: - Lon: + + NE + NO - Transparency - Transparantie + + E + O - Size - Grootte + + SE + ZO - Always show lat/lon - Toon altijd positie + + S + Z - %L1 - %L1 + + SW + ZW + + + + W + W + + + + NW + NW - GroundPiSettingsPanelForm.ui + HorizonWidget - Presets - Voorinstellingen + + Clip area + - General - Algemeen + + Width + + + + + Spacing + - Radio - Radio + + Range + - Video - Video + + Step + - RC - RC + + Invert Pitch + - Hotspot - Hotspot + + Invert Roll + - Smart Sync - Smart Sync + + Show Ladder + - Other - Anders + + Show Home + - Apply preset - Voortinstelling toepassen + + Show heading + - Save - Opslaan + + Show N/S/E/W + - saved - Opslaan + + Show center indicator + - GroundPiSettingsPresetView.ui + ImuTempWidget - Presets are groups of settings that must be configured together for some OpenHD features and to make common configurations easier to use. Once you apply a preset, the ground station will reboot and enter SmartSync mode automatically, then power on your drone to let it sync the new settings. - Voorinstellingen zijn gegroepeerde instelling die bij elkaar horen voor sommige eigenschappen van Open.HD welke het gebruik ervan makkelijker maken. Als je een voorinstelling toepast zal het grondstation herstarten en gaat deze automatisch in Smart Sync mode, schakel dan het voertuig in om de instellingen automatisch gelijk te laten zetten. + + Declutter Upon Arm + + + + + Warn Temp + - Note: you can apply more than one preset, but any settings that are mutually exclusive (band switcher + 2nd camera at the same time), the last preset to be configured "wins" - Je kunt meer dan 1 voorinstelling gebruiken, maar als er conflicterende eigenschappen overschreven worden (bijvoorbeeld band switcher + 2e camera) dan wordt de waarde van de laatst gekozen voorinstelling gebruikt. + + Caution Temp + - Changes that will be applied: - Veranderingen die worden toegepast: + + N/A + - GroundPowerWidgetForm.ui + LinkDownRSSIWidget - Voltage in: - Inkomend voltage: + + Show stats per card + - Voltage out: - Uitgaand voltage: + + dBm of each ant/card + - Current out: - Inkomende stroom: + + Loss caution + - Voltage bat: - Batterij voltage: + + Loss warn + - Transparency - Transparantie + + dBm low warning + + + + + Show pollution estimate % + + + + + Show signal quality % + + + + + dBm + + + + +  + - GroundStatusWidgetForm.ui + LinkUpRSSIWidget - Transparency - Transparantie + + dBm + + + + LogMessagesStatusView - Size - Grootte + + LOG GND + + + + + LOG OpenHD AIR + + + + + LOG FC + - HeadingLadder + MapWidgetForm.ui - N - N + + MAP + - NE - NO + + + Zoom + - E - O + + Size + - SE - ZO + + Transparency(S) + - S - Z + + + Lock map to drone direction + - SW - ZW + + Show Drone Track + - W - W + + Show Mission waypoints + - NW - NW + + Enable ADSB + + + + + ADSB Internet Source + + + + + ADSB SDR Source + + + + + ADSB Radius + + + + + Transparency(B) + - HeadingWidgetForm.ui + MavlinkParamPanel - Transparency - Transparantie + +  + - Width - Breedte + + +  + + + + MissionWidget - Size - Grootte + + Waypoints curr/total: + - UAV is iNav - Voertuig is iNav + + Type: + - Show ticks - Toon ticks + + Sync status: + - Show N/S/E/W - Toon N/Z/O/W + + Mission + - HomeDistanceWidgetForm.ui + NewSwitch - Lat: - Lat: + + SwitchDelegate + + + + OHDSettingsPanel - Lon: - Lon: + + LINK/QUICK + - Size - Grootte + + AIR CAM 1 + - Transparency - Transparantie + + AIR CAM 2 + + + + + AIR + + + + + GROUND + + + + + OSDCustomizer + + + Shape Color + + + + + Glow Color + + + + + Text Color + + + + + Done + + + + + PanelStatus + + + SYSTEM STATUS + - HorizonWidgetForm.ui + PowerActionDialoque - Transparency - Transparantie + + Confirm Power Change + - Size - Grootte + + If your drone is in the air, rebooting or shutting down may cause a crash or make it enter failsafe mode! + - Invert Pitch - Inverteer Pitch + + Cancel + - Invert Roll - Inverteer Rol + + Reboot Ground + - Spacing - Spatiëring + + Shutdown Ground + - Show Home - Toon Home + + Reboot Air + - Show heading - Toon Rubriek + + Shutdown Air + - Show N/S/E/W - Toon N/S/E/W + + Reboot FC + - UAV is iNav - Voertuig is iNav + + Shutdown FC + - Show Ladder - Toon ladder + + Yes + - ImuTempWidgetForm.ui + PressTempWidget - Transparency - Transparantie + + Declutter Upon Arm + - Size - Grootte + + Warn Temp + + + + + Caution Temp + + N/A - MainVideoAndroid + PressTempWidget2 - Do not fly with this app! Video is not stable yet! - Vlieg niet met deze app, video is nog niet stabiel! + + Declutter Upon Arm + - - - MainVideoGStreamer - Do not fly with this app! Video is not stable yet! - Vlieg niet met deze app, video is nog niet stabiel! + + Warn Temp + - - - MainVideoRender - Do not fly with this app! Video is not stable yet! - Vlieg niet met deze app, video is nog niet stabiel! + + Caution Temp + + + + + N/A + - MapWidgetForm.ui + PressTempWidget3 - Zoom - Zoom + + Declutter Upon Arm + - Transparency - Transparantie + + Warn Temp + - Lock map to drone direction - Vergrendel kaart op voertuigpositie + + Caution Temp + - Show Drone Track - Toon voertuigspoor + + N/A + - OSDCustomizer + QOpenHDServiceDialoque - Shape Color - Vorm Kleur - - - Glow Color - Gloei Kleur - - - Text Color - Tekstkleur + + QOpenHD + - Done + + Cancel - OpenHD + QOpenHDVersionCard - %1 flight mode - %1 vluchtmodus + + GPLv3 + - PowerPanel - - Confirm Power Change - Bevestig de vermogenswijziging - + QRenderStatsWidget - If your drone is in the air, rebooting or shutting down the ground or air pi may cause a crash or make it enter failsafe mode! - Als het voertuig is gestart dan kan het crashen of overschakelen naar failsafe mode + + QT FT: + - Cancel - Annuleer + + QT RP: + - Reboot Ground - Herstart grondstation + + D:R: + - Shutdown Ground - Afsluiten grond + + Parse&EnqT: + - Reboot Air + + DecT: - Shutdown Air - Sfsluiten lucht + + DecRT: + - Yes - Ja + + Doing wait_for_frame_decode: + - - - PowerPanelForm.ui - Reboot or safely shut down the air/ground before removing power, or to apply settings changes when it is difficult to cycle power manually. If you have a power control board or sensors connected you may also see power supply information. + + Format: - Air - Lucht + + Decoding type: + - Output Voltage: - Uitgangsspanning: + + Rtp parse n gaps: + - Current: - Stroom: + + RTP QOHD measured: + - Reboot - Herstarten + + estimate fps: + - Shutdown + + estimate keyframe i: - Ground - Grond + + decode dropped: + + + + RCRssiWidget - Supply Voltage: - Voedingsspanning: + + % + - Output Current: - Uitgangsstroom: + + + - Battery Voltage: - Batterij voltage: + + N/A + - PressTempWidgetForm.ui + RcDebugScreenFC - Transparency - Transparantie + + FC RC (for debugging) + - Size - Grootte + + NOTE: Only works on ardupilot! +NOTE: Slow update rate(1Hz)-only for debugging +Here you can see the rc channel values your FC reports via mavlink + - N/A + + ranges: 1000-2000(pwm) +unused: 65535, +not set: -1 - RcRSSIWidgetForm.ui + RcDebugScreenOpenHD - Transparency - Transparantie + + OpenHD RC + - Size - Grootte + + Here you can view the values which OpenHD reads from your Joystick + and sends to the FC via wifibroadcast (If enabled) + - - + + ranges: 1000-2000(pwm) +unused: 65535, +not set: -1 + + + + + RcInfoPanel + + + About + - N/A + + RC over OpenHD - debug + + + + + FC channels - debug - RestartDialog + RcInfoScreen - Restart required + + Info - You must restart the app for your loaded configuration file to take effect + + Enable OpenHD-RC: + +1. OpenHD GND: Set 'ENABLE_JOY_RC' to 'ENABLED', +2.Connect a joystick via USB to GND Station +3.Optionally reboot + +You can use the other screens to validate/debug your setup. +NOTE: Using a seperate RC link (e.g. ExpressLRS) is recommended ! + - Cancel - Annuleer + + Channel mapping + - Close App - Sluiten App + + Channel mapping is not intuitive, but it works when done correctly. +If you cannot make it work, any proper RC controller (e.g. running EdgeTX / OpenTX) +supports more advanced channel mapping and works via USB ! + - RollWidgetForm.ui + RestartQOpenHDMessageBox - Transparency - Transparantie + + QOpenHD + - Size - Grootte + + Restart + + + Cancel + + + + + RollWidget + + Invert Roll - Inverteer Rol + + Show Arc + Show Numbers - Toon nummers + + Sky Pointer - SensorPanelForm.ui + SOCStatusWidgetGeneric - If you have temperature or IMU sensors connected you may see and/or calibrate them below. + + Declutter Upon Arm - - - SettingsPopupForm.ui - - App - App - - Ground - Grond + + Show undervolt icon + - Status - Status + + Caution CPU + - Charts - Grafieken + + Warn CPU + - Power - Kracht + + Caution Temp + - Sensors - Sensoren + + Warn Temp + + + + SettingsCategory - About - Over + +  + - Close - Sluiten + +  + - SpeedSecondWidgetForm.ui + SpeedSecondWidget - Transparency - Transparantie + + Use groundspeed + - Size - Grootte + + Use km/h + - Airspeed / Groundspeed - Luchtsnelheid / Grondsnelheid + + Show unit + - SpeedWidgetForm.ui + SpeedWidget - Transparency - Transparantie + + Use groundspeed + - Size - Grootte + + Show ladder + - Airspeed / Groundspeed - Luchtsnelheid / Grondsnelheid + + Show unit + - Show ladder - Toon ladder + + Use km/h + + Range - Bereik - - - Minimum - Minimum + - StatusChartForm.ui - - Air CPU - Voertuig CPU - + StatusCardBodyFC - Air Temp - Voertuig temperatuur - - - Gnd CPU + + Firmware: - Gnd Temp + + Ping: - Lost Pkt - Verloren: - - - Damage Blk - Beschadigd: + + Type: + - Down RSSI - Toon downlink RSSI + + Alive: + - Up RSSI - Toon Uplink RSSI + + SysID: + + + + StatusCardBodyOpenHD - Inj. Fail + + Platform: - Skip Pkt + + Version: - Bitrate - Toon Bitrate + + Link: + - StatusPanelForm.ui + StatusCardsColumn + + + Ground station + + - Last RSSI: + + Air unit - HB: + + Flight Controller + + + ThrottleWidget - | ATT: + + throttle + + + VerticalSpeedGaugeWidget - | BAT: + + Range + + + VerticalSpeedSimpleWidget - | GPS: + + Show unit - | VFR: + + Show up / down arrow - ThrottleWidgetForm.ui + VibrationWidget - Transparency - Transparantie + + X + - Size - Grootte + + Y + - throttle - Gashendel + + Z + - UplinkRSSIWidgetForm.ui + VideoBitrateWidgetGeneric - Transparency - Transparantie + + Show RED recording active + - Size - Grootte + + Status: + - dBm - dBm + + Type: + - N/A - N.V.T. + + Codec: + - - - VibrationWidgetForm.ui - Transparency - Transparantie + + Resolution: + - Size - Grootte + + Bitrate SET: + - X + + MEASURED: - Y + + Injected(+FEC): - Z + + TX Dropped/RX lost: - - - VideoWidgetGStreamerForm.ui - Transparency - Transparantie + + FREE SPACE: + - - - VideoWidgetRenderForm.ui - Transparency - Transparantie + + AIR RECORD: + - VirtualJoystick + WBLinkRateControlWidget - Virtual Joystick - Virtuele Joystick + + Show frequency + - - - VsiWidgetForm.ui - Transparency - Transparantie + + Show bitrate + - Size - Grootte + + Show fec and keyframe + - Range - Bereik + + Bitrate show detailed + - WindWidgetForm.ui - - Transparency - Transparantie - - - Size - Grootte - + WindWidget + Style: Arrow / Circle - Stijl: Pijl/Cirkel + + Plane / Copter - Plane / Copter + + 45 Degree Speed M/S - 45 Graden Snelheid m/s - - - - main - - Open.HD - Open.HD + - Cancel - Annuleer + + Wind Unit + + + + WorkaroundMessageBox - Restart App - Herstarten App + + QOpenHD + - Close App - Sluiten App + + Okay + + + + main - Rapidly tap between widgets to enable/disable stereo + + QOpenHD EVO diff --git a/translations/QOpenHD_ro.qm b/translations/QOpenHD_ro.qm deleted file mode 100644 index 97e77b167..000000000 Binary files a/translations/QOpenHD_ro.qm and /dev/null differ diff --git a/translations/QOpenHD_ro.ts b/translations/QOpenHD_ro.ts index 955563591..f0d5f61e4 100644 --- a/translations/QOpenHD_ro.ts +++ b/translations/QOpenHD_ro.ts @@ -2,1479 +2,1995 @@ - AboutPanelForm.ui + AirBatteryWidget - QOpenHD - QOpenHD + + Show volts and amps + - Air - Aer: + + Use batt id 0 only + - OpenHD Version: - Versiunea OpenHD: + + Batt1: + - Ground - Sol: + + Batt2: + - License: GPLv3 - Licență: GPLv3 + + %L1% + - AdsbWidgetForm.ui + AirspeedTempWidget - Transparency - Transparență + + AIRSPEED SENSOR TEMPERATURE + - Size - Dimensiune + + Declutter Upon Arm + - Range - Distanță + + Warn Temp + + + + + Caution Temp + - Source OpenSky / SDR + + N/A - AirBatteryWidgetForm.ui + AltitudeSecondWidget - Voltage: - Voltaj: + + Relative / MSL + + + + AltitudeWidget - Current: - Amperaj: + + Use MSL + - Transparency - Transparență: + + Show ladder + - Size - Dimensiune + + Show unit + - Show volts and amps - Arată voltaj și amperi + + Range + + + + + AoaWidget + + + Range + + + + AppDevSettingsView - Show single cell voltage - Arată voltaj celulă + + Save + - %L1% - %L1% + + Load + - Use telemetry percentege + + Reset - - - AirStatusWidgetForm.ui - Transparency - Transparență + + WARNING + - Size - Dimensiune + + Continue + + + + + Cancel + - AltitudeSecondWidgetForm.ui + AppDeveloperStatsPanel - Transparency - Transparență + + Developer Menu + - Size - Dimensiune + + Restart QOpenHD + - Relative / MSL - Relativă / de la nivelul mediu al mării + + Cancel QOpenHD + - AltitudeWidgetForm.ui + AppGeneralSettingsView - Transparency - Transparență + + Animation Smoothing + + + + AppScreenSettingsView - Size - Dimensiune + + 0° + - Relative / MSL - Relativă / de la nivelul mediu al mării + + 90° (WARNING) + - Show ladder - Arată scăriță + + 180° + - Range - Distanță + + 270° (WARNING) + - - - AppSettingsPanel.ui - General - General + + -1 Disable + - Widgets - Widget-uri + + 0 Auto (Recommended) + - Screen - Ecran + + 50 (ultra small) + - Video - Video + + 72 (smaller) + - Manage - Administra + + 100 + - Enable Speech - Activare vorbire + + 120 (bigger) + - Battery Cells - Celule baterie + + 150 (ultra big) + + + + AppSettingsPanel - Imperial units - Unitate imperială + + Widgets + - Enable RC - Permite RC + + Style + - Mavlink SysID - Mavlink SysID + + General + - Language / Locale - Limbă + + Vehicle + - Shape Color - Culoare formă + + Screen + - Choose a color - Alegeți o culoare + + Video + - Glow Color - Culoare radială + + Dev + + + + AppVideoSettingsView - Text Color - Culoare text + + Video test mode + - Top/bottom bars - Bară superior/inferior + + Limit FPS in test file + + + + AppWidgetSettingsView - Hide - Ascunde + + Show GPS + - Transparent black - Negru transparent + + Show Home Distance + - Hide when drone armed + + Show RC RSSI (not OpenHD RC) - Turn red when drone armed + + Show Flight Timer - Show Downlink RSSI - RSSI recepție + + Show Flight Mode + - Show Uplink RSSI - RSSI transmisie + + Show IMU Sensor Temperature + - Show RC RSSI (not OpenHD RC) + + Show Pressure Sensor Temperature - Show Bitrate - Bitrate video + + Show Pressure Sensor 2 Temperature + - Show GPS - Arată GPS + + Show Pressure Sensor 3 Temperature + - Show Home Distance - Arată distanța de acasă + + Show Airspeed Sensor Temperature + - Show Flight Timer - Timp zbor + + Show Esc Temperature + - Show Flight Mode - Mod zbor + + Show Battery Temperature + - Show Flight Controller Temperature - Afișează temperatura controlerului de zbor + + Show Ground Status + - Show Ground Status - Stare centru comandă + + Show Ground Battery + + Show Air Status - Stare componente aer + + Show Air Battery - Baterie aeronavă + + Show mAh - Arata consum mAh + - Show Total Flight Distance - Distață totală zbor + + Show Efficiency in mAh/km + - Show log messages on-screen - Mesaje log pe ecran + + Show Total Flight Distance + + Show Horizon - Arată orizontul artificial + + + + + Show performance horizon + + Show Flight Path Vector - Arată vector direcție zbor + + Show Altitude - Altitudine + + Show Speed - Viteza zbor + + Show Second Speed - Afișați a doua viteză + + Show Heading - Arată direcție zbor + + Show Second Altitude - Altitudine secundară + + Show Bank Angle Indicator + Show Home Arrow - Săgeată către casă - - - Show Map - Hartă + + Show Throttle - Arată accelerația + + Show Control Inputs - Arată datele de control - - - Show GPIO - Arată GPIO + + Show Vibration - Arată vibrația - - - Show Vertical Speed - Arată viteza verticală + - Show Wind (Experimental) - Arată vânt (Experimental) + + Show Vertical Speed (minimal) + - Show ADS-B Traffic - Afișează ADS-B + + Show Vertical Speed Gauge + - Show BlackBox - Afișați BlackBox + + Show Wind (Experimental) + - Show example widget - Arată widget probă + + Show Missions + - Screen Scale - Scalare imagine + + Show Angle of Attack + - Brightness - Luminozitate + + Show Map + - Always use software video decoder - Utilizare permanentă decodor video software + + Show ADSB + - Enable PiP - Permite PIP + + Show log messages on-screen + - Enable LTE - Permite LTE + + Show Sidebar + - Hide warning watermark - Ascunde watermark avertizare + + Show QT Render stats + - Enable stereo mode - Activați modul stereo + + Show GPIO + + + + AppWidgetStyleSettingsView - Stereo OSD mode - Modul stereo OSD + + Shape Color + - Load settings from file - Citiți fișierul de configurare + + Glow Color + - Load - Citit + + Text Color + - Select settings file - Selectați fișierul cu setări + + Text font + + + + ArrowWidget - Save settings to file - Scrieți fișierul cu setări + + Invert Arrow + + + + BaseWidgetDefaultUiControlElements - Save - Salvează + + Transparency + - Select location - Selectați locația + + Lock to Horizontal Center + - Reset all settings - Reset configuration + + Lock to Vertical Center + + + + BatteryTempWidget - Reset - Resetează + + BATTERY SENSOR TEMPERATURE + - Settings reset - Resetează configurația + + Declutter Upon Arm + - Log Level + + Warn Temp - Text font + + Caution Temp - Show IMU Sensor Temperature + + N/A + + + ColorPicker - Show Pressure Sensor Temperature + + Cancel - Show Esc Temperature + + Select + + + ConnectPanel - Show Efficiency in mAh/km + + CONNECT TO OPENHD GND / AIR UNIT - ArrowWidgetForm + ControlWidget - Transparency - Transparență + + Show two controls + - Size - Dimensiune + + Use FC channels + - Invert Arrow - Inversare săgeată + + Reverse Pitch + - - - BitrateWidgetForm.ui - Measured: - Măsurat: + + Reverse Roll + - Set: - Setare: + + Reverse yaw + - Skipped packets: - Pachete pierdute: + + Reverse Throttle + + + + DialoqueFreqChangeGndOnly - Injection failed: - Injecție pierdută: + + GND Only + - Transparency - Transparență + + Okay + - Size - Dimensiune + + YES,GND ONLY + - Show skip / fail count - Arată contor pierdute / eșuate + + Cancel + - BlackBoxWidgetForm.ui + DialoqueNotAlive - Transparency - Transparență + + QOpenHD + - Size - Dimensiune + + OKAY + - restart telemetry - Utilizează date de telemetrie + + TAKE ME + - ColorPicker + ErrorMessageBox - Cancel - Anulare + + ERROR + - Select + + Okay - ControlWidgetForm.ui + EscTempWidget - Transparency - Transparență  - - - Size - Dimensiune + + Declutter Upon Arm + - Show two controls - Arată două controale + + Warn Temp + - Reverse Pitch - Pitch inversat + + Caution Temp + - Reverse Roll - Roll inversat + + N/A + + + + ExampleWidget - Reverse yaw - Yaw inversat + + Example widget + + + + FCMavlinkSystem - Reverse Throttle - Accelerație inversată + + %1 flight mode + %1 mod zbor - DownlinkRSSIWidgetForm.ui + FlightModeWidget - dBm - dBm + + Show disarmed + - (%L1%) - (%L1%) + + Only For Ardupilot + + + + FooterRebootShutdownWarning - CTS: - CTS: + + REBOOT + - Transparency - Transparență  + + SHUTDOWN + + + + FpvWidget - Size - Dimensiune + + Dynamic + - Show lost/damaged - Arată pierdut/deteriorat + + Invert Pitch + - Show all cards to right - Arată toate cardurile la dreapta + + Vertical Limit + - N/A - N/A + + Lateral Limit + + + + FreqComboBoxRow - dBm + + - EscTempWidgetForm.ui + GPSWidget - Transparency + + Always show lat/lon - Size + + Hide identity - N/A - N/A + + Declutter Upon Arm + - - - ExampleWidgetForm.ui - Example widget - Arată widget probă + + Warn HDOP + - - - FcTempWidgetForm.ui - Transparency - Transparență + + Caution HDOP + - Size - Dimensiune + + + Lat: + - N/A - N/A + + + Lon: + - - - FlightDistanceWidgetForm.ui - Transparency - Transparență  + + GPS Count: + - Size - Dimensiune + + GPS Lock: + - - - FlightMahKmWidgetForm.ui - Transparency + + HDOP: - Size + + VDOP: + + + + + %L1 - FlightMahWidgetForm.ui + GroundPowerWidget - Transparency - Transparență  + + Show single cell voltage + - Size - Dimensiune + + Battery Type + - Use telemetry data - Utilizează date de telemetrie + + Battery Low + - - - FlightModeWidgetForm.ui - Transparency - Transparență  + + Battery Mid + - Size - Dimensiune + + Battery Full + - FlightTimerWidgetForm.ui + HeadingLadder - Transparency - Transparență  + + N + N - Size - Dimensiune + + NE + NE + + + + E + E + + + + SE + SE + + + + S + S + + + + SW + SV + + + + W + V + + + + NW + NV - FpvWidgetForm.ui + HeadingWidget - Dynamic - Dinamic + + Show ticks + - Sensitivity - Senzitivitate + + Show N/S/E/W + + + + HomeDistanceWidget - Transparency - Transparență  + + Home Lat: + - Size - Dimensiune + + Home Lon: + - GPSWidgetForm.ui + HorizonLadder - Lat: - Lat: + + N + N - Lon: - Lon: + + NE + NE - Transparency - Transparență  + + E + E - Size - Dimensiune + + SE + SE - Always show lat/lon - Arată întotdeauna lat/lon + + S + S - %L1 - %L1 + + SW + SV + + + + W + V + + + + NW + NV - GroundPiSettingsPanelForm.ui + HorizonWidget - Presets - Presetări + + Clip area + - General - General + + Width + - Radio - Radio + + Spacing + - Video - Video + + Range + - RC - RC + + Step + - Hotspot - Hotspot + + Invert Pitch + - Smart Sync - Smart Sync + + Invert Roll + - Other - Alte + + Show Ladder + - Apply preset - Aplică presetat + + Show Home + - Save - Salvează + + Show heading + + + + + Show N/S/E/W + - saved - Salvează + + Show center indicator + - GroundPiSettingsPresetView.ui + ImuTempWidget - Presets are groups of settings that must be configured together for some OpenHD features and to make common configurations easier to use. Once you apply a preset, the ground station will reboot and enter SmartSync mode automatically, then power on your drone to let it sync the new settings. - Presetările sunt grupuri de setări care trebuie configurate împreună pentru unele caracteristici OpenHD și pentru a facilita utilizarea configurațiilor comune. După ce aplicați o presetare, stația de la sol se va reporni și va intra în modul SmartSync automat, apoi porniți drona pentru a-i permite să sincronizeze noile setări. + + Declutter Upon Arm + + + + + Warn Temp + - Note: you can apply more than one preset, but any settings that are mutually exclusive (band switcher + 2nd camera at the same time), the last preset to be configured "wins" - Notă: puteți aplica mai mult de o presetare, dar orice setări care se exclud reciproc (comutator de bandă + a doua cameră în același timp), ultima valoare din presetare care este aplicată „câștigă” + + Caution Temp + - Changes that will be applied: - Modificări care se vor aplica: + + N/A + - GroundPowerWidgetForm.ui + LinkDownRSSIWidget - Voltage in: - Tensiune aplicată: + + Show stats per card + - Voltage out: - Tensiune ieșire: + + dBm of each ant/card + - Current out: - Ieșire curent: + + Loss caution + - Voltage bat: - Voltaj baterie: + + Loss warn + - Transparency - Transparență + + dBm low warning + + + + + Show pollution estimate % + + + + + Show signal quality % + + + + + dBm + + + + +  + - GroundStatusWidgetForm.ui + LinkUpRSSIWidget - Transparency - Transparență + + dBm + + + + LogMessagesStatusView - Size - Dimensiune + + LOG GND + + + + + LOG OpenHD AIR + + + + + LOG FC + - HeadingLadder + MapWidgetForm.ui - N - N + + MAP + - NE - NE + + + Zoom + - E - E + + Size + - SE - SE + + Transparency(S) + - S - S + + + Lock map to drone direction + - SW - SV + + Show Drone Track + - W - V + + Show Mission waypoints + - NW - NV + + Enable ADSB + + + + + ADSB Internet Source + + + + + ADSB SDR Source + + + + + ADSB Radius + + + + + Transparency(B) + - HeadingWidgetForm.ui + MavlinkParamPanel - Transparency - Transparență + +  + - Width - Lăţime + + +  + + + + MissionWidget - Size - Mărime + + Waypoints curr/total: + - UAV is iNav - UAV este iNav + + Type: + - Show ticks - Arată atingere ecran + + Sync status: + - Show N/S/E/W - Arată N/S/E/V + + Mission + - HomeDistanceWidgetForm.ui + NewSwitch - Lat: - Lat: + + SwitchDelegate + + + + OHDSettingsPanel - Lon: - Lon: + + LINK/QUICK + - Size - Dimensiune + + AIR CAM 1 + + + + + AIR CAM 2 + + + + + AIR + + + + + GROUND + + + + + OSDCustomizer + + + Shape Color + - Transparency - Transparență + + Glow Color + + + + + Text Color + + + + + Done + + + + + PanelStatus + + + SYSTEM STATUS + - HorizonWidgetForm.ui + PowerActionDialoque - Transparency - Transparență + + Confirm Power Change + - Size - Mărime + + If your drone is in the air, rebooting or shutting down may cause a crash or make it enter failsafe mode! + - Invert Pitch - Pitch inversat + + Cancel + - Invert Roll - Roll inversat + + Reboot Ground + - Spacing - Distanțare + + Shutdown Ground + - Show Home - Săgeată către casă + + Reboot Air + - Show heading - Arată direcție zbor + + Shutdown Air + - Show N/S/E/W - Arată N/S/E/V + + Reboot FC + - UAV is iNav - UAV este iNav + + Shutdown FC + - Show Ladder - Arată scara + + Yes + - ImuTempWidgetForm.ui + PressTempWidget - Transparency + + Declutter Upon Arm - Size + + Warn Temp + + + + + Caution Temp + N/A - N/A + - MainVideoAndroid + PressTempWidget2 - Do not fly with this app! Video is not stable yet! - Nu zburați cu această aplicație! Videoclipul nu este încă stabil! + + Declutter Upon Arm + - - - MainVideoGStreamer - Do not fly with this app! Video is not stable yet! - Nu zburați cu această aplicație! Videoclipul nu este încă stabil! + + Warn Temp + - - - MainVideoRender - Do not fly with this app! Video is not stable yet! - Nu zburați cu această aplicație! Videoclipul nu este încă stabil! + + Caution Temp + + + + + N/A + - MapWidgetForm.ui + PressTempWidget3 - Zoom - Zoom + + Declutter Upon Arm + - Transparency - Transparență + + Warn Temp + - Lock map to drone direction - Blocare hartă pe direcția UAV + + Caution Temp + - Show Drone Track - Afișați traseul vehiculului + + N/A + - OSDCustomizer + QOpenHDServiceDialoque - Shape Color - Culoare formă - - - Glow Color - Culoare radială - - - Text Color - Culoare text + + QOpenHD + - Done + + Cancel - OpenHD + QOpenHDVersionCard - %1 flight mode - %1 mod zbor + + GPLv3 + - PowerPanel - - Confirm Power Change - Confirmați modificarea - + QRenderStatsWidget - If your drone is in the air, rebooting or shutting down the ground or air pi may cause a crash or make it enter failsafe mode! - Dacă drona este armată, se poate prăbuși sau poate intra în modul de siguranță + + QT FT: + - Cancel - Anulare + + QT RP: + - Reboot Ground - Restartare stație sol + + D:R: + - Shutdown Ground + + Parse&EnqT: - Reboot Air + + DecT: - Shutdown Air + + DecRT: - Yes - Da + + Doing wait_for_frame_decode: + - - - PowerPanelForm.ui - Reboot or safely shut down the air/ground before removing power, or to apply settings changes when it is difficult to cycle power manually. If you have a power control board or sensors connected you may also see power supply information. + + Format: - Air - Aer + + Decoding type: + - Output Voltage: - Producţie Voltaj: + + Rtp parse n gaps: + - Current: - Amperaj: + + RTP QOHD measured: + - Reboot - Restartare + + estimate fps: + - Shutdown - Opri + + estimate keyframe i: + - Ground - Sol + + decode dropped: + + + + RCRssiWidget - Supply Voltage: - Tensiune aplicată: + + % + - Output Current: - Amperaj: + + + - Battery Voltage: - Voltajul Bateriei: + + N/A + - PressTempWidgetForm.ui + RcDebugScreenFC - Transparency + + FC RC (for debugging) - Size + + NOTE: Only works on ardupilot! +NOTE: Slow update rate(1Hz)-only for debugging +Here you can see the rc channel values your FC reports via mavlink - N/A - N/A + + ranges: 1000-2000(pwm) +unused: 65535, +not set: -1 + - RcRSSIWidgetForm.ui + RcDebugScreenOpenHD - Transparency - Transparență + + OpenHD RC + - Size - Dimensiune + + Here you can view the values which OpenHD reads from your Joystick + and sends to the FC via wifibroadcast (If enabled) + - - + + ranges: 1000-2000(pwm) +unused: 65535, +not set: -1 + + + + RcInfoPanel - N/A - N/A + + About + + + + + RC over OpenHD - debug + + + + + FC channels - debug + - RestartDialog + RcInfoScreen - Restart required + + Info - You must restart the app for your loaded configuration file to take effect + + Enable OpenHD-RC: + +1. OpenHD GND: Set 'ENABLE_JOY_RC' to 'ENABLED', +2.Connect a joystick via USB to GND Station +3.Optionally reboot + +You can use the other screens to validate/debug your setup. +NOTE: Using a seperate RC link (e.g. ExpressLRS) is recommended ! + - Cancel - Anulare + + Channel mapping + - Close App - Închideți aplicația + + Channel mapping is not intuitive, but it works when done correctly. +If you cannot make it work, any proper RC controller (e.g. running EdgeTX / OpenTX) +supports more advanced channel mapping and works via USB ! + - RollWidgetForm.ui + RestartQOpenHDMessageBox - Transparency - Transparență + + QOpenHD + - Size - Dimensiune + + Restart + + + + + Cancel + + + + RollWidget + Invert Roll - Roll inversat + + Show Arc + Show Numbers - Afișează numere + + Sky Pointer - SensorPanelForm.ui + SOCStatusWidgetGeneric - If you have temperature or IMU sensors connected you may see and/or calibrate them below. + + Declutter Upon Arm - - - SettingsPopupForm.ui - - App - App - - Ground - Sol + + Show undervolt icon + - Status - Status + + Caution CPU + - Charts - Grafic + + Warn CPU + - Power - Energie + + Caution Temp + - Sensors - Senzori + + Warn Temp + + + + SettingsCategory - About - Despre + +  + - Close - Închide + +  + - SpeedSecondWidgetForm.ui + SpeedSecondWidget - Transparency - Transparență + + Use groundspeed + - Size - Dimensiune + + Use km/h + - Airspeed / Groundspeed - Viteza aer / GPS + + Show unit + - SpeedWidgetForm.ui + SpeedWidget - Transparency - Transparenţă + + Use groundspeed + - Size - Mărime + + Show ladder + - Airspeed / Groundspeed - Viteza aer / GPS + + Show unit + - Show ladder - Arată scara + + Use km/h + + Range - Distanţă - - - Minimum - Minim + - StatusChartForm.ui - - Air CPU - Aer CPU - - - Air Temp - Aer Temperatura - - - Gnd CPU - Sol CPU - + StatusCardBodyFC - Gnd Temp - Sol Temperatura + + Firmware: + - Lost Pkt - Pierdut: + + Ping: + - Damage Blk - Deteriorat: + + Type: + - Down RSSI - RSSI recepție + + Alive: + - Up RSSI - RSSI transmisie + + SysID: + + + + StatusCardBodyOpenHD - Inj. Fail + + Platform: - Skip Pkt + + Version: - Bitrate - Bitrate video + + Link: + - StatusPanelForm.ui + StatusCardsColumn + + + Ground station + + - Last RSSI: + + Air unit - HB: + + Flight Controller + + + ThrottleWidget - | ATT: + + throttle + + + VerticalSpeedGaugeWidget - | BAT: + + Range + + + VerticalSpeedSimpleWidget - | GPS: + + Show unit - | VFR: + + Show up / down arrow - ThrottleWidgetForm.ui + VibrationWidget - Transparency - Transparență + + X + - Size - Dimensiune + + Y + - throttle - Acceleratie + + Z + - UplinkRSSIWidgetForm.ui + VideoBitrateWidgetGeneric - Transparency - Transparență + + Show RED recording active + - Size - Dimensiune + + Status: + - dBm + + Type: - N/A - N/A + + Codec: + - - - VibrationWidgetForm.ui - Transparency - Transparență + + Resolution: + - Size - Dimensiune + + Bitrate SET: + - X + + MEASURED: - Y + + Injected(+FEC): - Z + + TX Dropped/RX lost: - - - VideoWidgetGStreamerForm.ui - Transparency - Transparenţă + + FREE SPACE: + - - - VideoWidgetRenderForm.ui - Transparency - Transparență + + AIR RECORD: + - VirtualJoystick + WBLinkRateControlWidget - Virtual Joystick - Virtual Joystick + + Show frequency + - - - VsiWidgetForm.ui - Transparency - Transparență + + Show bitrate + - Size - Dimensiune + + Show fec and keyframe + - Range - Distanță + + Bitrate show detailed + - WindWidgetForm.ui - - Transparency - Transparenţă - - - Size - Dimensiune - + WindWidget + Style: Arrow / Circle - Stil: Săgeată / Cerc + + Plane / Copter - Avion / Copter + + 45 Degree Speed M/S - 45 Grade Viteza M/S - - - - main - - Open.HD - Open.HD + - Cancel - Anulare + + Wind Unit + + + + WorkaroundMessageBox - Restart App - Reporniți aplicația + + QOpenHD + - Close App - Închideți aplicația + + Okay + + + + main - Rapidly tap between widgets to enable/disable stereo + + QOpenHD EVO diff --git a/translations/QOpenHD_ru.qm b/translations/QOpenHD_ru.qm deleted file mode 100644 index 4d6224436..000000000 Binary files a/translations/QOpenHD_ru.qm and /dev/null differ diff --git a/translations/QOpenHD_ru.ts b/translations/QOpenHD_ru.ts index 9ba0a3299..54e8f136d 100644 --- a/translations/QOpenHD_ru.ts +++ b/translations/QOpenHD_ru.ts @@ -1,1468 +1,1996 @@ - + - AboutPanelForm.ui + AirBatteryWidget - QOpenHD - QOpenHD + + Show volts and amps + Показывать Вольты и Амперы - Air - Воздух + + Use batt id 0 only + Использовать только батарею с ID 0 - OpenHD Version: - + + Batt1: + Батарея 1: - Ground - Земля + + Batt2: + Батарея 2: - License: GPLv3 - Лицензия GPLv3 + + %L1% + %L1% - AdsbWidgetForm.ui + AirspeedTempWidget - Transparency - Прозрачность + + AIRSPEED SENSOR TEMPERATURE + - Size - Размер + + Declutter Upon Arm + - Range - Пределы + + Warn Temp + + + + + Caution Temp + - Source OpenSky / SDR + + N/A - AirBatteryWidgetForm.ui + AltitudeSecondWidget - Voltage: - Напряжение: + + Relative / MSL + + + + AltitudeWidget - Current: - Ток: + + Use MSL + - Transparency - Прозрачность + + Show ladder + - Size - Размер + + Show unit + - Show volts and amps - Показывать Напряжение и Ток + + Range + + + + AoaWidget - Show single cell voltage - Показ напряж. 1 ячейки + + Range + + + + AppDevSettingsView - %L1% - %L1% + + Save + - Use telemetry percentege + + Load - - - AirStatusWidgetForm.ui - Transparency - Прозрачность + + Reset + - Size - Размер + + WARNING + + + + + Continue + + + + + Cancel + - AltitudeSecondWidgetForm.ui + AppDeveloperStatsPanel - Transparency - Прозрачность + + Developer Menu + - Size - Размер + + Restart QOpenHD + - Relative / MSL - Относительная/MSL + + Cancel QOpenHD + - AltitudeWidgetForm.ui + AppGeneralSettingsView - Transparency - Прозрачность + + Animation Smoothing + + + + AppScreenSettingsView - Size - Размер + + 0° + - Relative / MSL - Относительная/MSL + + 90° (WARNING) + - Show ladder - Показ лестницы горизонта + + 180° + - Range - Покрытие/расстояние + + 270° (WARNING) + - - - AppSettingsPanel.ui - General - Основное + + -1 Disable + - Widgets - Виджеты + + 0 Auto (Recommended) + - Screen - Экран + + 50 (ultra small) + - Video - Видео + + 72 (smaller) + - Manage - Yправлять + + 100 + - Enable Speech - Включить Голос + + 120 (bigger) + - Battery Cells - Ячейки Батареи + + 150 (ultra big) + + + + AppSettingsPanel - Imperial units - Вкл. Футы/Дюймы + + Widgets + - Enable RC - Включить Р/У через OHD + + Style + - Mavlink SysID - Mavlink SysID + + General + - Language / Locale - язык + + Vehicle + - Shape Color - Цвет очертаний + + Screen + - Choose a color - Выбери цвет + + Video + - Glow Color - Цвет заполнения + + Dev + + + + AppVideoSettingsView - Text Color - Цвет текста + + Video test mode + - Top/bottom bars - Верхняя/Нижняя полоски + + Limit FPS in test file + + + + AppWidgetSettingsView - Hide - скрывать + + Show GPS + - Transparent black + + Show Home Distance - Hide when drone armed + + Show RC RSSI (not OpenHD RC) - Turn red when drone armed + + Show Flight Timer - Show Downlink RSSI - Показывать УровеньСигнала Воздух + + Show Flight Mode + - Show Uplink RSSI - Показывать УровеньСигнала ЗемляРУ + + Show IMU Sensor Temperature + - Show RC RSSI (not OpenHD RC) + + Show Pressure Sensor Temperature - Show Bitrate - Показывать Битрейт + + Show Pressure Sensor 2 Temperature + - Show GPS - Показывать GPS + + Show Pressure Sensor 3 Temperature + - Show Home Distance - Показывать Дистанцию До Дома + + Show Airspeed Sensor Temperature + - Show Flight Timer - Показывать ПолетноеВремя + + Show Esc Temperature + - Show Flight Mode - Показывать ПолетныйРежим + + Show Battery Temperature + + Show Ground Status - Показывать СтатусЗемли + + + + + Show Ground Battery + + Show Air Status - Показывать СтатусВоздуха + + Show Air Battery - Показывать БатареюБорта + + Show mAh - Показывать мА.ч. + - Show Total Flight Distance - Показывать Полный Пройденный Путь + + Show Efficiency in mAh/km + - Show log messages on-screen - Показывать лог сообщений на экране + + Show Total Flight Distance + + Show Horizon - Показывать Горизонт + + + + + Show performance horizon + + Show Flight Path Vector - Показывать ВекторНаправленияПолета + + Show Altitude - Показывать Высоту + + Show Speed - Показывать Скорость + + Show Second Speed + Show Heading - Показывать НаправлениеПолета + + Show Second Altitude - Показывать ВторуюВысоту + + Show Bank Angle Indicator + Show Home Arrow - Показывать СтрелкуДома - - - Show Map - Показывать Карту + + Show Throttle - Показывать Уровень Газа + + Show Control Inputs - Показывать ДанныеРУ - - - Show GPIO - Показывать GPIO + + Show Vibration - Показывать Вибрацию - - - Show Vertical Speed - Показывать ВертикальнуюСкорость + - Show Wind (Experimental) - Показывать Ветер(Экспериментальное) + + Show Vertical Speed (minimal) + - Show ADS-B Traffic + + Show Vertical Speed Gauge - Show BlackBox + + Show Wind (Experimental) - Show example widget - Показывать ПримерВиджета + + Show Missions + - Screen Scale - Масштаб Экрана + + Show Angle of Attack + - Brightness - Яркость + + Show Map + - Always use software video decoder - Всегда использовать софтовое декодирование + + Show ADSB + - Enable PiP - Включить PiP + + Show log messages on-screen + - Enable LTE - Включить LTE + + Show Sidebar + - Hide warning watermark - Скрыть предупреждающий водяной знак + + Show QT Render stats + - Enable stereo mode + + Show GPIO + + + AppWidgetStyleSettingsView - Stereo OSD mode + + Shape Color - Load settings from file + + Glow Color - Load + + Text Color - Select settings file + + Text font + + + ArrowWidget - Save settings to file + + Invert Arrow + + + BaseWidgetDefaultUiControlElements - Save - Сохранить + + Transparency + - Select location + + Lock to Horizontal Center - Reset all settings + + Lock to Vertical Center + + + BatteryTempWidget - Reset + + BATTERY SENSOR TEMPERATURE - Settings reset + + Declutter Upon Arm - Log Level + + Warn Temp - Text font + + Caution Temp - Show IMU Sensor Temperature + + N/A + + + ColorPicker - Show Pressure Sensor Temperature + + Cancel - Show Esc Temperature + + Select + + + ConnectPanel - Show Efficiency in mAh/km + + CONNECT TO OPENHD GND / AIR UNIT - ArrowWidgetForm + ControlWidget - Transparency - Прозрачность + + Show two controls + - Size - Размер + + Use FC channels + - Invert Arrow - Инверт. Стрелку + + Reverse Pitch + - - - BitrateWidgetForm.ui - Measured: - Измерено: + + Reverse Roll + - Set: - Установить: + + Reverse yaw + - Skipped packets: - Пропущено пакетов: + + Reverse Throttle + + + + DialoqueFreqChangeGndOnly - Injection failed: - Неудачная отправка: + + GND Only + - Transparency - Прозрачность + + Okay + - Size - Размер + + YES,GND ONLY + - Show skip / fail count - Показывать счетчик пропущенные/битые пакеты + + Cancel + - BlackBoxWidgetForm.ui + DialoqueNotAlive - Transparency - Прозрачность + + QOpenHD + - Size - Размер + + OKAY + - restart telemetry + + TAKE ME - ColorPicker + ErrorMessageBox - Cancel - Отменить + + ERROR + - Select + + Okay - ControlWidgetForm.ui - - Transparency - Прозрачность - + EscTempWidget - Size - Размер + + Declutter Upon Arm + - Show two controls - Показывать ДваУправления + + Warn Temp + - Reverse Pitch - Reverse Pitch + + Caution Temp + - Reverse Roll - Reverse Roll + + N/A + + + + ExampleWidget - Reverse yaw - Reverse yaw + + Example widget + + + + FCMavlinkSystem - Reverse Throttle - Reverse Throttle + + %1 flight mode + %1 Полетный Режим - DownlinkRSSIWidgetForm.ui + FlightModeWidget - dBm - дБм + + Show disarmed + - (%L1%) - (%L1%) + + Only For Ardupilot + + + + FooterRebootShutdownWarning - CTS: - CTS: + + REBOOT + - Transparency - Прозрачность + + SHUTDOWN + + + + FpvWidget - Size - Размер + + Dynamic + - Show lost/damaged - Показывать потеря/битые + + Invert Pitch + - Show all cards to right - Показывать все Карты Справа + + Vertical Limit + - N/A - н/а + + Lateral Limit + + + + FreqComboBoxRow - dBm - дБм + +  + - EscTempWidgetForm.ui + GPSWidget - Transparency - Прозрачность + + Always show lat/lon + - Size - Размер + + Hide identity + - N/A + + Declutter Upon Arm - - - ExampleWidgetForm.ui - Example widget - Показывать ПримерВиджета + + Warn HDOP + - - - FcTempWidgetForm.ui - Transparency - Прозрачность + + Caution HDOP + - Size - Размер + + + Lat: + - N/A - н/а + + + Lon: + - - - FlightDistanceWidgetForm.ui - Transparency - Прозрачность + + GPS Count: + - Size - Размер + + GPS Lock: + - - - FlightMahKmWidgetForm.ui - Transparency - Прозрачность + + HDOP: + - Size - Размер + + VDOP: + + + + + %L1 + %L1% {1?} - FlightMahWidgetForm.ui + GroundPowerWidget - Transparency - Прозрачность + + Show single cell voltage + - Size - Размер + + Battery Type + - Use telemetry data - Использовать Данные Телеметрии + + Battery Low + - - - FlightModeWidgetForm.ui - Transparency - Прозрачность + + Battery Mid + - Size - Размер + + Battery Full + - FlightTimerWidgetForm.ui + HeadingLadder - Transparency - Прозрачность + + N + С - Size - Размер + + NE + СВ - - - FpvWidgetForm.ui - Dynamic - Динамический + + E + В - Sensitivity - Чувствительность + + SE + ЮВ - Transparency - Прозрачность + + S + Ю - Size - Размер + + SW + ЮЗ - - - GPSWidgetForm.ui - Lat: - Шир: + + W + З - Lon: - Долг: + + NW + СЗ + + + HeadingWidget - Transparency - Прозрачность + + Show ticks + - Size - Размер + + Show N/S/E/W + + + + HomeDistanceWidget - Always show lat/lon - Всегда показ. Шир./Долг. + + Home Lat: + - %L1 - %L1 + + Home Lon: + - GroundPiSettingsPanelForm.ui + HorizonLadder - Presets - Предопределенные установки + + N + С - General - Основные + + NE + СВ - Radio - РадиоКанал + + E + В - Video - Видео + + SE + ЮВ + + + + S + Ю - RC - Р/У + + SW + ЮЗ - Hotspot - Hotspot + + W + З - Smart Sync - Smart Sync (Синхронизация) + + NW + СЗ + + + HorizonWidget - Other - Другое + + Clip area + - Apply preset - Применить установки + + Width + - Save - Сохранить + + Spacing + - saved - Сохранить + + Range + - - - GroundPiSettingsPresetView.ui - Presets are groups of settings that must be configured together for some OpenHD features and to make common configurations easier to use. Once you apply a preset, the ground station will reboot and enter SmartSync mode automatically, then power on your drone to let it sync the new settings. - Пресеты это группы настроек, которые должны быть применены вместе для некоторых функций OpenHD и для того чтобы сделать общие конфигурации проще в использовании. Как только вы применяете пресет, Наземная Станция будет перезагружена и войдет в режим Синхронизации с Воздухом (Бортом) + + Step + - Note: you can apply more than one preset, but any settings that are mutually exclusive (band switcher + 2nd camera at the same time), the last preset to be configured "wins" - Примечание: Вы можете применить несколько пресетов, однако установки, присутствующие в обоих пресетах, будут перезаписаны последним пресетом + + Invert Pitch + - Changes that will be applied: - Установки, которые будут применены: + + Invert Roll + - - - GroundPowerWidgetForm.ui - Voltage in: - Напряжение на Входе: + + Show Ladder + - Voltage out: - Напряжение На Выходе: + + Show Home + - Current out: - Выходной Ток: + + Show heading + - Voltage bat: - Напряжение Батареи: + + Show N/S/E/W + - Transparency - Прозрачность + + Show center indicator + - GroundStatusWidgetForm.ui + ImuTempWidget - Transparency - Прозрачность + + Declutter Upon Arm + - Size - Размер + + Warn Temp + - - - HeadingLadder - N - С + + Caution Temp + - NE - СВ + + N/A + + + + LinkDownRSSIWidget - E - В + + Show stats per card + - SE - ЮВ + + dBm of each ant/card + - S - Ю + + Loss caution + - SW - ЮЗ + + Loss warn + - W - З + + dBm low warning + - NW - СЗ + + Show pollution estimate % + - - - HeadingWidgetForm.ui - Transparency - Прозрачность + + Show signal quality % + - Width - Ширина + + dBm + - Size - Размер + +  + + + + + LinkUpRSSIWidget + + + dBm + + + + LogMessagesStatusView - UAV is iNav - Используется INAV + + LOG GND + - Show ticks - Показывать Черточки + + LOG OpenHD AIR + - Show N/S/E/W - Показывать С/Ю/В/З (компас) + + LOG FC + - HomeDistanceWidgetForm.ui + MapWidgetForm.ui - Lat: - Шир: + + MAP + - Lon: - Долг: + + + Zoom + + Size - Размер + - Transparency - Прозрачность + + Transparency(S) + - - - HorizonWidgetForm.ui - Transparency - Прозрачность + + + Lock map to drone direction + - Size - Размер + + Show Drone Track + - Invert Pitch - Инверт Pitch + + Show Mission waypoints + - Invert Roll - Инверт Roll + + Enable ADSB + - Spacing - Промежуток + + ADSB Internet Source + - Show Home - Показывать СтрелкуДома + + ADSB SDR Source + - Show heading - Показывать НаправлениеПолета + + ADSB Radius + - Show N/S/E/W - Показывать С/Ю/В/З (компас) + + Transparency(B) + + + + MavlinkParamPanel - UAV is iNav - Используется INAV + +  + - Show Ladder - Показывать Лестницу + + +  + - ImuTempWidgetForm.ui + MissionWidget - Transparency - Прозрачность + + Waypoints curr/total: + - Size - Размер + + Type: + - N/A + + Sync status: - - - MainVideoAndroid - Do not fly with this app! Video is not stable yet! - Не летайте с этим приложением! Видео пока не стабильно! + + Mission + - MainVideoGStreamer + NewSwitch - Do not fly with this app! Video is not stable yet! - Не летайте с этим приложением! Видео пока не стабильно! + + SwitchDelegate + - MainVideoRender + OHDSettingsPanel - Do not fly with this app! Video is not stable yet! - Не летайте с этим приложением! Видео пока не стабильно! + + LINK/QUICK + - - - MapWidgetForm.ui - Zoom - Zoom + + AIR CAM 1 + - Transparency - Прозрачность + + AIR CAM 2 + - Lock map to drone direction - Поворачивать карту за направлением полета + + AIR + - Show Drone Track - Показать след дрона + + GROUND + OSDCustomizer + Shape Color - Цвет очертаний + + Glow Color - Цвет заполнения + + Text Color - Цвет текста + + Done - OpenHD + PanelStatus - %1 flight mode - %1 Полетный Режим + + SYSTEM STATUS + - PowerPanel + PowerActionDialoque + Confirm Power Change - Подтвердить изменение + - If your drone is in the air, rebooting or shutting down the ground or air pi may cause a crash or make it enter failsafe mode! - Если Борт Заармлен, он может разбиться или уйти в ФС! + + If your drone is in the air, rebooting or shutting down may cause a crash or make it enter failsafe mode! + + Cancel - Отменить + + Reboot Ground + Shutdown Ground + Reboot Air + Shutdown Air + + Reboot FC + + + + + Shutdown FC + + + + Yes - да + - PowerPanelForm.ui + PressTempWidget + + + Declutter Upon Arm + + - Reboot or safely shut down the air/ground before removing power, or to apply settings changes when it is difficult to cycle power manually. If you have a power control board or sensors connected you may also see power supply information. + + Warn Temp - Air - Воздух + + Caution Temp + + + + + N/A + + + + PressTempWidget2 - Output Voltage: - Напряжение: + + Declutter Upon Arm + - Current: - Ток: + + Warn Temp + - Reboot - Перезапустить + + Caution Temp + - Shutdown + + N/A + + + PressTempWidget3 - Ground - Земля + + Declutter Upon Arm + - Supply Voltage: - Напряжение на Входе: + + Warn Temp + - Output Current: - Ток: + + Caution Temp + - Battery Voltage: - Напряжение батареи: + + N/A + - PressTempWidgetForm.ui + QOpenHDServiceDialoque - Transparency - Прозрачность + + QOpenHD + - Size - Размер + + Cancel + + + + QOpenHDVersionCard - N/A + + GPLv3 - RcRSSIWidgetForm.ui + QRenderStatsWidget - Transparency - Прозрачность + + QT FT: + - Size - Размер + + QT RP: + - - + + D:R: + - N/A - н/а + + Parse&EnqT: + - - - RestartDialog - Restart required + + DecT: - You must restart the app for your loaded configuration file to take effect + + DecRT: - Cancel - Отменить + + Doing wait_for_frame_decode: + - Close App + + Format: - - - RollWidgetForm.ui - Transparency - Прозрачность + + Decoding type: + - Size - Размер + + Rtp parse n gaps: + - Invert Roll - Инверт Roll + + RTP QOHD measured: + - Show Arc + + estimate fps: - Show Numbers - Показать числа + + estimate keyframe i: + - Sky Pointer + + decode dropped: - SensorPanelForm.ui + RCRssiWidget - If you have temperature or IMU sensors connected you may see and/or calibrate them below. + + % + + + + + + + + + + N/A - SettingsPopupForm.ui + RcDebugScreenFC - App - Приложение + + FC RC (for debugging) + - Ground - Земля + + NOTE: Only works on ardupilot! +NOTE: Slow update rate(1Hz)-only for debugging +Here you can see the rc channel values your FC reports via mavlink + - Status - Статус + + ranges: 1000-2000(pwm) +unused: 65535, +not set: -1 + + + + RcDebugScreenOpenHD - Charts - Схемы + + OpenHD RC + - Power - Электроэнергия + + Here you can view the values which OpenHD reads from your Joystick + and sends to the FC via wifibroadcast (If enabled) + - Sensors - датчиков + + ranges: 1000-2000(pwm) +unused: 65535, +not set: -1 + + + + RcInfoPanel + About - О Программе + + + + + RC over OpenHD - debug + - Close - Закрыть + + FC channels - debug + - SpeedSecondWidgetForm.ui + RcInfoScreen - Transparency - Прозрачность + + Info + - Size - Размер + + Enable OpenHD-RC: + +1. OpenHD GND: Set 'ENABLE_JOY_RC' to 'ENABLED', +2.Connect a joystick via USB to GND Station +3.Optionally reboot + +You can use the other screens to validate/debug your setup. +NOTE: Using a seperate RC link (e.g. ExpressLRS) is recommended ! + + + + + + Channel mapping + - Airspeed / Groundspeed - ВоздушнаяСкорость/GPS + + Channel mapping is not intuitive, but it works when done correctly. +If you cannot make it work, any proper RC controller (e.g. running EdgeTX / OpenTX) +supports more advanced channel mapping and works via USB ! + - SpeedWidgetForm.ui + RestartQOpenHDMessageBox - Transparency - Прозрачность + + QOpenHD + - Size - Размер + + Restart + + + + + Cancel + + + + RollWidget - Airspeed / Groundspeed - ВоздушнаяСкорость/GPS + + Invert Roll + - Show ladder - Показывать Лестницу + + Show Arc + - Range - Пределы + + Show Numbers + - Minimum - Минимум + + Sky Pointer + - StatusChartForm.ui + SOCStatusWidgetGeneric - Air CPU - Воздух CPU + + Declutter Upon Arm + - Air Temp - Воздух температура + + Show undervolt icon + - Gnd CPU - Земля CPU + + Caution CPU + - Gnd Temp - Земля температура + + Warn CPU + - Lost Pkt - Потеряно: + + Caution Temp + - Damage Blk - Битые: + + Warn Temp + + + + SettingsCategory - Down RSSI - Показывать УровеньСигнала Воздух + +  + - Up RSSI - Показывать УровеньСигнала ЗемляРУ + +  + + + + SpeedSecondWidget - Inj. Fail + + Use groundspeed - Skip Pkt + + Use km/h - Bitrate - Показывать Битрейт + + Show unit + - StatusPanelForm.ui + SpeedWidget + + + Use groundspeed + + + + + Show ladder + + - Last RSSI: + + Show unit - HB: + + Use km/h - | ATT: + + Range + + + + + StatusCardBodyFC + + + Firmware: + + + + + Ping: - | BAT: + + Type: - | GPS: + + Alive: - | VFR: + + SysID: - ThrottleWidgetForm.ui + StatusCardBodyOpenHD - Transparency - Прозрачность + + Platform: + - Size - Размер + + Version: + - throttle - Газ + + Link: + - UplinkRSSIWidgetForm.ui + StatusCardsColumn - Transparency - Прозрачность + + Ground station + - Size - Размер + + Air unit + - dBm - дБм + + Flight Controller + + + + ThrottleWidget - N/A - N/A + + throttle + - VibrationWidgetForm.ui + VerticalSpeedGaugeWidget - Transparency - Прозрачность + + Range + + + + VerticalSpeedSimpleWidget - Size - Размер + + Show unit + + + + + Show up / down arrow + + + + VibrationWidget + X + Y + Z - VideoWidgetGStreamerForm.ui + VideoBitrateWidgetGeneric - Transparency - Прозрачность + + Show RED recording active + - - - VideoWidgetRenderForm.ui - Transparency - Прозрачность + + Status: + - - - VirtualJoystick - Virtual Joystick - Виртуальный Джойстик + + Type: + - - - VsiWidgetForm.ui - Transparency - Прозрачность + + Codec: + - Size - Размер + + Resolution: + - Range - Пределы + + Bitrate SET: + + + + + MEASURED: + + + + + Injected(+FEC): + + + + + TX Dropped/RX lost: + + + + + FREE SPACE: + + + + + AIR RECORD: + - WindWidgetForm.ui + WBLinkRateControlWidget - Transparency - Прозрачность + + Show frequency + - Size - Размер + + Show bitrate + + + + + Show fec and keyframe + + + + + Bitrate show detailed + + + + WindWidget + Style: Arrow / Circle - Стиль: Стрелка/Круг + + Plane / Copter - Самолет/Коптер + + 45 Degree Speed M/S - 45 градусов Скорость м/с + + + + + Wind Unit + - main + WorkaroundMessageBox - Open.HD - Open.HD + + QOpenHD + - Cancel - Отменить + + Okay + + + + main - Rapidly tap between widgets to enable/disable stereo + + QOpenHD EVO diff --git a/translations/QOpenHD_uk.ts b/translations/QOpenHD_uk.ts new file mode 100644 index 000000000..1091dd081 --- /dev/null +++ b/translations/QOpenHD_uk.ts @@ -0,0 +1,1997 @@ + + + + + AirBatteryWidget + + + Show volts and amps + Показувати вольти і ампери + + + + Use batt id 0 only + Використовувати лише батарею з ID 0 + + + + Batt1: + Батарея 1: + + + + Batt2: + Батарея 2: + + + + %L1% + + + + + AirspeedTempWidget + + + AIRSPEED SENSOR TEMPERATURE + + + + + Declutter Upon Arm + + + + + Warn Temp + + + + + Caution Temp + + + + + N/A + + + + + AltitudeSecondWidget + + + Relative / MSL + + + + + AltitudeWidget + + + Use MSL + + + + + Show ladder + + + + + Show unit + + + + + Range + + + + + AoaWidget + + + Range + + + + + AppDevSettingsView + + + Save + + + + + Load + + + + + Reset + + + + + WARNING + + + + + Continue + + + + + Cancel + Відмінити + + + + AppDeveloperStatsPanel + + + Developer Menu + + + + + Restart QOpenHD + + + + + Cancel QOpenHD + + + + + AppGeneralSettingsView + + + Animation Smoothing + Зглажування анімації + + + + AppScreenSettingsView + + + 0° + + + + + 90° (WARNING) + 90° (УВАЖНО) + + + + 180° + + + + + 270° (WARNING) + 270° (УВАЖНО) + + + + -1 Disable + -1 Вимкнути + + + + 0 Auto (Recommended) + 0 Авто (Рекомендовано) + + + + 50 (ultra small) + 50 (дуже малий) + + + + 72 (smaller) + 72 (малий) + + + + 100 + 100 + + + + 120 (bigger) + 120 (більший) + + + + 150 (ultra big) + 150 (великий) + + + + AppSettingsPanel + + + Widgets + Віджети + + + + Style + Стиль + + + + General + Загальні + + + + Vehicle + Дрон + + + + Screen + Відображення + + + + Video + Відео + + + + Dev + Розробницьке + + + + AppVideoSettingsView + + + Video test mode + Тестувальне відео + + + + Limit FPS in test file + + + + + AppWidgetSettingsView + + + Show GPS + Показувати GPS + + + + Show Home Distance + + + + + Show RC RSSI (not OpenHD RC) + + + + + Show Flight Timer + + + + + Show Flight Mode + + + + + Show IMU Sensor Temperature + + + + + Show Pressure Sensor Temperature + + + + + Show Pressure Sensor 2 Temperature + + + + + Show Pressure Sensor 3 Temperature + + + + + Show Airspeed Sensor Temperature + + + + + Show Esc Temperature + + + + + Show Battery Temperature + + + + + Show Ground Status + + + + + Show Ground Battery + + + + + Show Air Status + + + + + Show Air Battery + + + + + Show mAh + + + + + Show Efficiency in mAh/km + + + + + Show Total Flight Distance + + + + + Show Horizon + + + + + Show performance horizon + + + + + Show Flight Path Vector + + + + + Show Altitude + + + + + Show Speed + + + + + Show Second Speed + + + + + Show Heading + + + + + Show Second Altitude + + + + + Show Bank Angle Indicator + + + + + Show Home Arrow + + + + + Show Throttle + + + + + Show Control Inputs + + + + + Show Vibration + + + + + Show Vertical Speed (minimal) + + + + + Show Vertical Speed Gauge + + + + + Show Wind (Experimental) + + + + + Show Missions + + + + + Show Angle of Attack + + + + + Show Map + + + + + Show ADSB + + + + + Show log messages on-screen + + + + + Show Sidebar + + + + + Show QT Render stats + + + + + Show GPIO + + + + + AppWidgetStyleSettingsView + + + Shape Color + + + + + Glow Color + + + + + Text Color + + + + + Text font + + + + + ArrowWidget + + + Invert Arrow + + + + + BaseWidgetDefaultUiControlElements + + + Transparency + + + + + Lock to Horizontal Center + + + + + Lock to Vertical Center + + + + + BatteryTempWidget + + + BATTERY SENSOR TEMPERATURE + + + + + Declutter Upon Arm + + + + + Warn Temp + + + + + Caution Temp + + + + + N/A + + + + + ColorPicker + + + Cancel + Відмінити + + + + Select + + + + + ConnectPanel + + + CONNECT TO OPENHD GND / AIR UNIT + З'єднайтесь з бортовим чи наземним модулем OpenHD + + + + ControlWidget + + + Show two controls + + + + + Use FC channels + + + + + Reverse Pitch + + + + + Reverse Roll + + + + + Reverse yaw + + + + + Reverse Throttle + + + + + DialoqueFreqChangeGndOnly + + + GND Only + Лише GND + + + + Okay + Добре + + + + YES,GND ONLY + Так, я впевнений + + + + Cancel + Відмінити + + + + DialoqueNotAlive + + + QOpenHD + + + + + OKAY + Добре + + + + TAKE ME + Перейти + + + + ErrorMessageBox + + + ERROR + Помилка + + + + Okay + Добре + + + + EscTempWidget + + + Declutter Upon Arm + + + + + Warn Temp + + + + + Caution Temp + + + + + N/A + + + + + ExampleWidget + + + Example widget + + + + + FCMavlinkSystem + + + %1 flight mode + + + + + FlightModeWidget + + + Show disarmed + + + + + Only For Ardupilot + + + + + FooterRebootShutdownWarning + + + REBOOT + + + + + SHUTDOWN + + + + + FpvWidget + + + Dynamic + + + + + Invert Pitch + + + + + Vertical Limit + + + + + Lateral Limit + + + + + FreqComboBoxRow + + +  + + + + + GPSWidget + + + Always show lat/lon + + + + + Hide identity + + + + + Declutter Upon Arm + + + + + Warn HDOP + + + + + Caution HDOP + + + + + + Lat: + + + + + + Lon: + + + + + GPS Count: + + + + + GPS Lock: + + + + + HDOP: + + + + + VDOP: + + + + + %L1 + + + + + GroundPowerWidget + + + Show single cell voltage + + + + + Battery Type + + + + + Battery Low + + + + + Battery Mid + + + + + Battery Full + + + + + HeadingLadder + + + N + + + + + NE + + + + + E + + + + + SE + + + + + S + + + + + SW + + + + + W + + + + + NW + + + + + HeadingWidget + + + Show ticks + + + + + Show N/S/E/W + + + + + HomeDistanceWidget + + + Home Lat: + + + + + Home Lon: + + + + + HorizonLadder + + + N + + + + + NE + + + + + E + + + + + SE + + + + + S + + + + + SW + + + + + W + + + + + NW + + + + + HorizonWidget + + + Clip area + + + + + Width + + + + + Spacing + + + + + Range + + + + + Step + + + + + Invert Pitch + + + + + Invert Roll + + + + + Show Ladder + + + + + Show Home + + + + + Show heading + + + + + Show N/S/E/W + + + + + Show center indicator + + + + + ImuTempWidget + + + Declutter Upon Arm + + + + + Warn Temp + + + + + Caution Temp + + + + + N/A + + + + + LinkDownRSSIWidget + + + Show stats per card + + + + + dBm of each ant/card + + + + + Loss caution + + + + + Loss warn + + + + + dBm low warning + + + + + Show pollution estimate % + + + + + Show signal quality % + + + + + dBm + + + + +  + + + + + LinkUpRSSIWidget + + + dBm + + + + + LogMessagesStatusView + + + LOG GND + + + + + LOG OpenHD AIR + + + + + LOG FC + + + + + MapWidgetForm.ui + + + MAP + + + + + + Zoom + + + + + Size + + + + + Transparency(S) + + + + + + Lock map to drone direction + + + + + Show Drone Track + + + + + Show Mission waypoints + + + + + Enable ADSB + + + + + ADSB Internet Source + + + + + ADSB SDR Source + + + + + ADSB Radius + + + + + Transparency(B) + + + + + MavlinkParamPanel + + +  + + + + + +  + + + + + MissionWidget + + + Waypoints curr/total: + + + + + Type: + + + + + Sync status: + + + + + Mission + + + + + NewSwitch + + + SwitchDelegate + + + + + OHDSettingsPanel + + + LINK/QUICK + + + + + AIR CAM 1 + + + + + AIR CAM 2 + + + + + AIR + + + + + GROUND + + + + + OSDCustomizer + + + Shape Color + + + + + Glow Color + + + + + Text Color + + + + + Done + + + + + PanelStatus + + + SYSTEM STATUS + + + + + PowerActionDialoque + + + Confirm Power Change + + + + + If your drone is in the air, rebooting or shutting down may cause a crash or make it enter failsafe mode! + + + + + Cancel + Відмінити + + + + Reboot Ground + + + + + Shutdown Ground + + + + + Reboot Air + + + + + Shutdown Air + + + + + Reboot FC + + + + + Shutdown FC + + + + + Yes + + + + + PressTempWidget + + + Declutter Upon Arm + + + + + Warn Temp + + + + + Caution Temp + + + + + N/A + + + + + PressTempWidget2 + + + Declutter Upon Arm + + + + + Warn Temp + + + + + Caution Temp + + + + + N/A + + + + + PressTempWidget3 + + + Declutter Upon Arm + + + + + Warn Temp + + + + + Caution Temp + + + + + N/A + + + + + QOpenHDServiceDialoque + + + QOpenHD + + + + + Cancel + Відмінити + + + + QOpenHDVersionCard + + + GPLv3 + + + + + QRenderStatsWidget + + + QT FT: + + + + + QT RP: + + + + + D:R: + + + + + Parse&EnqT: + + + + + DecT: + + + + + DecRT: + + + + + Doing wait_for_frame_decode: + + + + + Format: + + + + + Decoding type: + + + + + Rtp parse n gaps: + + + + + RTP QOHD measured: + + + + + estimate fps: + + + + + estimate keyframe i: + + + + + decode dropped: + + + + + RCRssiWidget + + + % + + + + + + + + + + N/A + + + + + RcDebugScreenFC + + + FC RC (for debugging) + + + + + NOTE: Only works on ardupilot! +NOTE: Slow update rate(1Hz)-only for debugging +Here you can see the rc channel values your FC reports via mavlink + + + + + ranges: 1000-2000(pwm) +unused: 65535, +not set: -1 + + + + + RcDebugScreenOpenHD + + + OpenHD RC + + + + + Here you can view the values which OpenHD reads from your Joystick + and sends to the FC via wifibroadcast (If enabled) + + + + + ranges: 1000-2000(pwm) +unused: 65535, +not set: -1 + + + + + RcInfoPanel + + + About + + + + + RC over OpenHD - debug + + + + + FC channels - debug + + + + + RcInfoScreen + + + Info + + + + + Enable OpenHD-RC: + +1. OpenHD GND: Set 'ENABLE_JOY_RC' to 'ENABLED', +2.Connect a joystick via USB to GND Station +3.Optionally reboot + +You can use the other screens to validate/debug your setup. +NOTE: Using a seperate RC link (e.g. ExpressLRS) is recommended ! + + + + + + Channel mapping + + + + + Channel mapping is not intuitive, but it works when done correctly. +If you cannot make it work, any proper RC controller (e.g. running EdgeTX / OpenTX) +supports more advanced channel mapping and works via USB ! + + + + + RestartQOpenHDMessageBox + + + QOpenHD + + + + + Restart + + + + + Cancel + Відмінити + + + + RollWidget + + + Invert Roll + + + + + Show Arc + + + + + Show Numbers + + + + + Sky Pointer + + + + + SOCStatusWidgetGeneric + + + Declutter Upon Arm + + + + + Show undervolt icon + + + + + Caution CPU + + + + + Warn CPU + + + + + Caution Temp + + + + + Warn Temp + + + + + SettingsCategory + + +  + + + + +  + + + + + SpeedSecondWidget + + + Use groundspeed + + + + + Use km/h + + + + + Show unit + + + + + SpeedWidget + + + Use groundspeed + + + + + Show ladder + + + + + Show unit + + + + + Use km/h + + + + + Range + + + + + StatusCardBodyFC + + + Firmware: + + + + + Ping: + + + + + Type: + + + + + Alive: + + + + + SysID: + + + + + StatusCardBodyOpenHD + + + Platform: + + + + + Version: + + + + + Link: + + + + + StatusCardsColumn + + + Ground station + + + + + Air unit + + + + + Flight Controller + + + + + ThrottleWidget + + + throttle + + + + + VerticalSpeedGaugeWidget + + + Range + + + + + VerticalSpeedSimpleWidget + + + Show unit + + + + + Show up / down arrow + + + + + VibrationWidget + + + X + + + + + Y + + + + + Z + + + + + VideoBitrateWidgetGeneric + + + Show RED recording active + + + + + Status: + + + + + Type: + + + + + Codec: + + + + + Resolution: + + + + + Bitrate SET: + + + + + MEASURED: + + + + + Injected(+FEC): + + + + + TX Dropped/RX lost: + + + + + FREE SPACE: + + + + + AIR RECORD: + + + + + WBLinkRateControlWidget + + + Show frequency + + + + + Show bitrate + + + + + Show fec and keyframe + + + + + Bitrate show detailed + + + + + WindWidget + + + Style: Arrow / Circle + + + + + Plane / Copter + + + + + 45 Degree Speed M/S + + + + + Wind Unit + + + + + WorkaroundMessageBox + + + QOpenHD + + + + + Okay + Добре + + + + main + + + QOpenHD EVO + + + + diff --git a/translations/QOpenHD_zh.qm b/translations/QOpenHD_zh.qm deleted file mode 100644 index b2f7236c7..000000000 Binary files a/translations/QOpenHD_zh.qm and /dev/null differ diff --git a/translations/QOpenHD_zh.ts b/translations/QOpenHD_zh.ts index 627b0c130..86a5bc829 100644 --- a/translations/QOpenHD_zh.ts +++ b/translations/QOpenHD_zh.ts @@ -2,1463 +2,1995 @@ - AboutPanelForm.ui + AirBatteryWidget - QOpenHD + + Show volts and amps - Air - 空中端 + + Use batt id 0 only + - OpenHD Version: + + Batt1: - Ground - 地面端 + + Batt2: + - License: GPLv3 - 许可证:GPLv3 + + %L1% + - AdsbWidgetForm.ui + AirspeedTempWidget - Transparency - 透明度 + + AIRSPEED SENSOR TEMPERATURE + - Size - 尺寸 + + Declutter Upon Arm + - Range - 范围 + + Warn Temp + + + + + Caution Temp + - Source OpenSky / SDR + + N/A - AirBatteryWidgetForm.ui + AltitudeSecondWidget - Voltage: - 电压: + + Relative / MSL + + + + AltitudeWidget - Current: - 电流: + + Use MSL + - Transparency - 透明度 + + Show ladder + - Size - 尺寸 + + Show unit + - Show volts and amps - 显示电压和电流 + + Range + + + + + AoaWidget + + + Range + + + + AppDevSettingsView - Show single cell voltage - 显示单电池电压 + + Save + - %L1% + + Load - Use telemetry percentege + + Reset - - - AirStatusWidgetForm.ui - Transparency - 透明度 + + WARNING + - Size - 尺寸 + + Continue + + + + + Cancel + - AltitudeSecondWidgetForm.ui + AppDeveloperStatsPanel - Transparency - 透明度 + + Developer Menu + - Size - 尺寸 + + Restart QOpenHD + - Relative / MSL + + Cancel QOpenHD - AltitudeWidgetForm.ui + AppGeneralSettingsView - Transparency - 透明度 + + Animation Smoothing + + + + AppScreenSettingsView - Size - 尺寸 + + 0° + - Relative / MSL + + 90° (WARNING) - Show ladder + + 180° - Range - 范围 + + 270° (WARNING) + - - - AppSettingsPanel.ui - General - 一般的 + + -1 Disable + - Widgets - 工具 + + 0 Auto (Recommended) + - Screen - 屏幕 + + 50 (ultra small) + - Video - 视频 + + 72 (smaller) + - Manage - 管理 + + 100 + - Enable Speech - 启用语音 + + 120 (bigger) + - Battery Cells - 电池节数 + + 150 (ultra big) + + + + AppSettingsPanel - Imperial units + + Widgets - Enable RC + + Style - Mavlink SysID + + General - Language / Locale - + + Vehicle + - Shape Color - 图形颜色 + + Screen + - Choose a color - 选择一种颜色 + + Video + - Glow Color - 发光颜色 + + Dev + + + + AppVideoSettingsView - Text Color - 文字颜色 + + Video test mode + - Top/bottom bars + + Limit FPS in test file + + + AppWidgetSettingsView - Hide - 隐藏 + + Show GPS + - Transparent black + + Show Home Distance - Hide when drone armed + + Show RC RSSI (not OpenHD RC) - Turn red when drone armed + + Show Flight Timer - Show Downlink RSSI - 显示下行信号强度 + + Show Flight Mode + - Show Uplink RSSI - 显示上行信号强度 + + Show IMU Sensor Temperature + - Show RC RSSI (not OpenHD RC) + + Show Pressure Sensor Temperature - Show Bitrate - 显示比特率 + + Show Pressure Sensor 2 Temperature + - Show GPS - 显示GPS信息 + + Show Pressure Sensor 3 Temperature + - Show Home Distance - 显示距离起飞点距离 + + Show Airspeed Sensor Temperature + - Show Flight Timer - 显示飞行计时器 + + Show Esc Temperature + - Show Flight Mode - 显示飞行模式 + + Show Battery Temperature + - Show Flight Controller Temperature - 显示飞行控制器温度 + + Show Ground Status + - Show Ground Status - 显示地面端状态 + + Show Ground Battery + + Show Air Status - 显示空中端状态 + + Show Air Battery - 显示空中端电池状态 + + Show mAh - 以mAh进行显示 + - Show Total Flight Distance - 显示飞行总距离 + + Show Efficiency in mAh/km + - Show log messages on-screen - 在屏幕上显示日志信息 + + Show Total Flight Distance + + Show Horizon - 显示地平线 + + + + + Show performance horizon + + Show Flight Path Vector - 显示飞行轨迹矢量 + + Show Altitude - 显示高度 + + Show Speed - 显示速度 + + Show Second Speed + Show Heading - 显示朝向 + + Show Second Altitude + Show Bank Angle Indicator + Show Home Arrow - 显示起飞点指向 - - - Show Map - 显示地图 + + Show Throttle - 显示油门 + + Show Control Inputs - 显示控制输入状态 + - Show GPIO - 显示输入输出端口 + + Show Vibration + - Show Vibration - 显示抖动 + + Show Vertical Speed (minimal) + - Show Vertical Speed - 显示垂直速度 + + Show Vertical Speed Gauge + + Show Wind (Experimental) - 显示气流(测试性的) + - Show ADS-B Traffic + + Show Missions - Show BlackBox + + Show Angle of Attack - Show example widget - 显示示例工具 + + Show Map + - Screen Scale - 屏幕尺寸 + + Show ADSB + - Brightness - 亮度 + + Show log messages on-screen + - Always use software video decoder - 始终使用视频解码器软件 + + Show Sidebar + - Enable PiP + + Show QT Render stats - Enable LTE - 打开LTE功能 + + Show GPIO + + + + AppWidgetStyleSettingsView - Hide warning watermark - 隐藏警告水印 + + Shape Color + - Enable stereo mode + + Glow Color - Stereo OSD mode + + Text Color - Load settings from file + + Text font + + + ArrowWidget - Load + + Invert Arrow + + + BaseWidgetDefaultUiControlElements - Select settings file + + Transparency - Save settings to file + + Lock to Horizontal Center - Save - 保存 + + Lock to Vertical Center + + + + + BatteryTempWidget + + + BATTERY SENSOR TEMPERATURE + - Select location + + Declutter Upon Arm - Reset all settings + + Warn Temp - Reset + + Caution Temp - Settings reset + + N/A + + + ColorPicker - Log Level + + Cancel - Text font + + Select + + + ConnectPanel - Show IMU Sensor Temperature + + CONNECT TO OPENHD GND / AIR UNIT + + + ControlWidget - Show Pressure Sensor Temperature + + Show two controls - Show Esc Temperature + + Use FC channels - Show Efficiency in mAh/km + + Reverse Pitch - - - ArrowWidgetForm - Transparency - 透明度 + + Reverse Roll + - Size - 尺寸 + + Reverse yaw + - Invert Arrow + + Reverse Throttle - BitrateWidgetForm.ui + DialoqueFreqChangeGndOnly - Measured: - 经测试过的: + + GND Only + - Set: - 设置: + + Okay + - Skipped packets: - 跳过的数据包: + + YES,GND ONLY + - Injection failed: + + Cancel + + + DialoqueNotAlive - Transparency - 透明度 + + QOpenHD + - Size - 尺寸 + + OKAY + - Show skip / fail count - 显示跳过/失效的数据包 + + TAKE ME + - BlackBoxWidgetForm.ui + ErrorMessageBox - Transparency - 透明度 + + ERROR + - Size - 尺寸 + + Okay + + + + + EscTempWidget + + + Declutter Upon Arm + - restart telemetry + + Warn Temp + + + + + Caution Temp + + + + + N/A - ColorPicker + ExampleWidget - Cancel + + Example widget + + + FCMavlinkSystem - Select + + %1 flight mode - ControlWidgetForm.ui + FlightModeWidget - Transparency - 透明度 + + Show disarmed + - Size - 尺寸 + + Only For Ardupilot + + + + FooterRebootShutdownWarning - Show two controls + + REBOOT - Reverse Pitch - 俯仰轴反向 + + SHUTDOWN + + + + FpvWidget - Reverse Roll - 横滚轴反向 + + Dynamic + - Reverse yaw - 航向轴反向 + + Invert Pitch + - Reverse Throttle - 油门反向 + + Vertical Limit + + + + + Lateral Limit + + + + + FreqComboBoxRow + + +  + - DownlinkRSSIWidgetForm.ui + GPSWidget - dBm - dBm + + Always show lat/lon + - (%L1%) + + Hide identity - CTS: - CTS保护: + + Declutter Upon Arm + - Transparency - 透明度 + + Warn HDOP + - Size - 尺寸 + + Caution HDOP + - Show lost/damaged - 显示丢失/损坏 + + + Lat: + - Show all cards to right + + + Lon: - N/A - 不可用 + + GPS Count: + - dBm + + GPS Lock: - - - EscTempWidgetForm.ui - Transparency - 透明度 + + HDOP: + - Size - 尺寸 + + VDOP: + - N/A - 不可用 + + %L1 + - ExampleWidgetForm.ui + GroundPowerWidget - Example widget + + Show single cell voltage + + + + + Battery Type + + + + + Battery Low + + + + + Battery Mid + + + + + Battery Full - FcTempWidgetForm.ui + HeadingLadder - Transparency - 透明度 + + N + - Size - 尺寸 + + NE + + + + + E + + + + + SE + + + + + S + + + + + SW + + + + + W + + + + + NW + - FlightDistanceWidgetForm.ui + HeadingWidget - Transparency - 透明度 + + Show ticks + - Size - 尺寸 + + Show N/S/E/W + - FlightMahKmWidgetForm.ui + HomeDistanceWidget - Transparency - 透明度 + + Home Lat: + - Size - 尺寸 + + Home Lon: + - FlightMahWidgetForm.ui + HorizonLadder - Transparency - 透明度 + + N + - Size - 尺寸 + + NE + - Use telemetry data - 使用数传数据 + + E + - - - FlightModeWidgetForm.ui - Transparency - 透明度 + + SE + - Size - 尺寸 + + S + + + + + SW + + + + + W + + + + + NW + - FlightTimerWidgetForm.ui + HorizonWidget - Transparency - 透明度 + + Clip area + - Size - 尺寸 + + Width + + + + + Spacing + + + + + Range + + + + + Step + + + + + Invert Pitch + + + + + Invert Roll + + + + + Show Ladder + + + + + Show Home + + + + + Show heading + + + + + Show N/S/E/W + + + + + Show center indicator + - FpvWidgetForm.ui + ImuTempWidget - Dynamic - 动态的 + + Declutter Upon Arm + - Sensitivity - 敏感度 + + Warn Temp + - Transparency - 透明度 + + Caution Temp + - Size - 尺寸 + + N/A + - GPSWidgetForm.ui + LinkDownRSSIWidget - Lat: - 纬度: + + Show stats per card + - Lon: + + dBm of each ant/card - Transparency - 透明度 + + Loss caution + - Size - 尺寸 + + Loss warn + - Always show lat/lon + + dBm low warning - %L1 + + Show pollution estimate % + + + + + Show signal quality % + + + + + dBm + + + + + - GroundPiSettingsPanelForm.ui + LinkUpRSSIWidget - Presets + + dBm + + + LogMessagesStatusView - General - 一般的 + + LOG GND + - Radio + + LOG OpenHD AIR - Video - 视频 + + LOG FC + + + + MapWidgetForm.ui - RC - 遥控 + + MAP + - Hotspot - 热点 + + + Zoom + + + + + Size + + + + + Transparency(S) + + + + + + Lock map to drone direction + + + + + Show Drone Track + + + + + Show Mission waypoints + - Smart Sync - Smart Sync + + Enable ADSB + - Other - 其他 + + ADSB Internet Source + - Apply preset - 应用预设 + + ADSB SDR Source + - Save - 保存 + + ADSB Radius + - saved + + Transparency(B) - GroundPiSettingsPresetView.ui + MavlinkParamPanel - Presets are groups of settings that must be configured together for some OpenHD features and to make common configurations easier to use. Once you apply a preset, the ground station will reboot and enter SmartSync mode automatically, then power on your drone to let it sync the new settings. + + - Note: you can apply more than one preset, but any settings that are mutually exclusive (band switcher + 2nd camera at the same time), the last preset to be configured "wins" + + + - - Changes that will be applied: - 将要应用的改变: - - GroundPowerWidgetForm.ui + MissionWidget - Voltage in: - 输入电压: + + Waypoints curr/total: + - Voltage out: - 输出电压: + + Type: + - Current out: - 输出电流: + + Sync status: + - Voltage bat: - 电池电压: + + Mission + + + + NewSwitch - Transparency - 透明度 + + SwitchDelegate + - GroundStatusWidgetForm.ui + OHDSettingsPanel - Transparency - 透明度 + + LINK/QUICK + - Size - 尺寸 + + AIR CAM 1 + - - - HeadingLadder - N + + AIR CAM 2 - NE + + AIR - E + + GROUND + + + OSDCustomizer - SE + + Shape Color - S + + Glow Color - SW + + Text Color - W + + Done + + + PanelStatus - NW + + SYSTEM STATUS - HeadingWidgetForm.ui + PowerActionDialoque - Transparency - 透明度 + + Confirm Power Change + - Width + + If your drone is in the air, rebooting or shutting down may cause a crash or make it enter failsafe mode! - Size - 尺寸 + + Cancel + - UAV is iNav - iNaV飞控的无人机 + + Reboot Ground + - Show ticks + + Shutdown Ground - Show N/S/E/W - 显示 北/南/东/西 + + Reboot Air + - - - HomeDistanceWidgetForm.ui - Lat: - 纬度: + + Shutdown Air + - Lon: + + Reboot FC - Size - 尺寸 + + Shutdown FC + - Transparency - 透明度 + + Yes + - HorizonWidgetForm.ui + PressTempWidget - Transparency - 透明度 - - - Size - 尺寸 - - - Invert Pitch - 倒转俯仰轴 + + Declutter Upon Arm + - Invert Roll + + Warn Temp - Spacing + + Caution Temp - Show Home + + N/A + + + PressTempWidget2 - Show heading + + Declutter Upon Arm - Show N/S/E/W - 显示 北/南/东/西 + + Warn Temp + - UAV is iNav - iNaV飞控的无人机 + + Caution Temp + - Show Ladder + + N/A - ImuTempWidgetForm.ui + PressTempWidget3 - Transparency - 透明度 + + Declutter Upon Arm + - Size - 尺寸 + + Warn Temp + + + Caution Temp + + + + N/A - 不可用 + - MainVideoAndroid + QOpenHDServiceDialoque - Do not fly with this app! Video is not stable yet! + + QOpenHD - - - MainVideoGStreamer - Do not fly with this app! Video is not stable yet! + + Cancel - MainVideoRender + QOpenHDVersionCard - Do not fly with this app! Video is not stable yet! + + GPLv3 - MapWidgetForm.ui + QRenderStatsWidget - Zoom + + QT FT: - Transparency - 透明度 - - - Lock map to drone direction + + QT RP: - Show Drone Track + + D:R: - - - OSDCustomizer - - Shape Color - 图形颜色 - - - Glow Color - 发光颜色 - - Text Color - 文字颜色 + + Parse&EnqT: + - Done + + DecT: - - - OpenHD - %1 flight mode + + DecRT: - - - PowerPanel - Confirm Power Change + + Doing wait_for_frame_decode: - If your drone is in the air, rebooting or shutting down the ground or air pi may cause a crash or make it enter failsafe mode! + + Format: - Cancel + + Decoding type: - Reboot Ground + + Rtp parse n gaps: - Shutdown Ground + + RTP QOHD measured: - Reboot Air + + estimate fps: - Shutdown Air + + estimate keyframe i: - Yes + + decode dropped: - PowerPanelForm.ui + RCRssiWidget - Reboot or safely shut down the air/ground before removing power, or to apply settings changes when it is difficult to cycle power manually. If you have a power control board or sensors connected you may also see power supply information. + + % - Air - 空中端 + + + - Output Voltage: + + N/A + + + RcDebugScreenFC - Current: - 电流: - - - Reboot + + FC RC (for debugging) - Shutdown + + NOTE: Only works on ardupilot! +NOTE: Slow update rate(1Hz)-only for debugging +Here you can see the rc channel values your FC reports via mavlink - Ground - 地面端 + + ranges: 1000-2000(pwm) +unused: 65535, +not set: -1 + + + + RcDebugScreenOpenHD - Supply Voltage: + + OpenHD RC - Output Current: + + Here you can view the values which OpenHD reads from your Joystick + and sends to the FC via wifibroadcast (If enabled) - Battery Voltage: + + ranges: 1000-2000(pwm) +unused: 65535, +not set: -1 - PressTempWidgetForm.ui + RcInfoPanel - Transparency - 透明度 + + About + - Size - 尺寸 + + RC over OpenHD - debug + - N/A - 不可用 + + FC channels - debug + - RcRSSIWidgetForm.ui + RcInfoScreen - Transparency - 透明度 + + Info + - Size - 尺寸 + + Enable OpenHD-RC: + +1. OpenHD GND: Set 'ENABLE_JOY_RC' to 'ENABLED', +2.Connect a joystick via USB to GND Station +3.Optionally reboot + +You can use the other screens to validate/debug your setup. +NOTE: Using a seperate RC link (e.g. ExpressLRS) is recommended ! + + - - + + Channel mapping + - N/A - 不可用 + + Channel mapping is not intuitive, but it works when done correctly. +If you cannot make it work, any proper RC controller (e.g. running EdgeTX / OpenTX) +supports more advanced channel mapping and works via USB ! + - RestartDialog + RestartQOpenHDMessageBox - Restart required + + QOpenHD - You must restart the app for your loaded configuration file to take effect + + Restart + Cancel - - Close App - - - RollWidgetForm.ui - - Transparency - 透明度 - - - Size - 尺寸 - + RollWidget + Invert Roll + Show Arc + Show Numbers + Sky Pointer - SensorPanelForm.ui + SOCStatusWidgetGeneric - If you have temperature or IMU sensors connected you may see and/or calibrate them below. + + Declutter Upon Arm - - - SettingsPopupForm.ui - App + + Show undervolt icon - Ground - 地面端 - - - Status + + Caution CPU - Charts + + Warn CPU - Power + + Caution Temp - Sensors + + Warn Temp + + + SettingsCategory - About + + - Close + + - SpeedSecondWidgetForm.ui + SpeedSecondWidget - Transparency - 透明度 + + Use groundspeed + - Size - 尺寸 + + Use km/h + - Airspeed / Groundspeed + + Show unit - SpeedWidgetForm.ui + SpeedWidget - Transparency - 透明度 + + Use groundspeed + - Size - 尺寸 + + Show ladder + - Airspeed / Groundspeed + + Show unit - Show ladder + + Use km/h + Range - 范围 - - - Minimum - StatusChartForm.ui + StatusCardBodyFC - Air CPU + + Firmware: - Air Temp + + Ping: - Gnd CPU + + Type: - Gnd Temp + + Alive: - Lost Pkt + + SysID: + + + StatusCardBodyOpenHD - Damage Blk + + Platform: - Down RSSI + + Version: - Up RSSI + + Link: + + + StatusCardsColumn - Inj. Fail + + Ground station - Skip Pkt + + Air unit - Bitrate + + Flight Controller - StatusPanelForm.ui - - Last RSSI: - - - - HB: - - + ThrottleWidget - | ATT: + + throttle + + + VerticalSpeedGaugeWidget - | BAT: + + Range + + + VerticalSpeedSimpleWidget - | GPS: + + Show unit - | VFR: + + Show up / down arrow - ThrottleWidgetForm.ui + VibrationWidget - Transparency - 透明度 + + X + - Size - 尺寸 + + Y + - throttle + + Z - UplinkRSSIWidgetForm.ui + VideoBitrateWidgetGeneric - Transparency - 透明度 + + Show RED recording active + - Size - 尺寸 + + Status: + - dBm + + Type: - N/A - 不可用 + + Codec: + - - - VibrationWidgetForm.ui - Transparency - 透明度 + + Resolution: + - Size - 尺寸 + + Bitrate SET: + - X + + MEASURED: - Y + + Injected(+FEC): - Z + + TX Dropped/RX lost: - - - VideoWidgetGStreamerForm.ui - Transparency - 透明度 + + FREE SPACE: + - - - VideoWidgetRenderForm.ui - Transparency - 透明度 + + AIR RECORD: + - VirtualJoystick + WBLinkRateControlWidget - Virtual Joystick + + Show frequency - - - VsiWidgetForm.ui - Transparency - 透明度 + + Show bitrate + - Size - 尺寸 + + Show fec and keyframe + - Range - 范围 + + Bitrate show detailed + - WindWidgetForm.ui - - Transparency - 透明度 - - - Size - 尺寸 - + WindWidget + Style: Arrow / Circle + Plane / Copter - 飞机/多旋翼 + + 45 Degree Speed M/S + + + Wind Unit + + - main + WorkaroundMessageBox + + + QOpenHD + + - Open.HD + + Okay + + + main - Rapidly tap between widgets to enable/disable stereo + + QOpenHD EVO