From: Soeren Apel Date: Thu, 14 Mar 2024 20:58:47 +0000 (+0100) Subject: Session: Fix issue #67 by improving error handling X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=commitdiff_plain;h=HEAD;hp=5675292c804dec6e6f2becd9876594ccb6fcec7c Session: Fix issue #67 by improving error handling --- diff --git a/.gitignore b/.gitignore index fdfff454..97192711 100644 --- a/.gitignore +++ b/.gitignore @@ -65,3 +65,6 @@ manual/manual.html manual/manual.pdf test/cmake_install.cmake *_autogen + +# Translation binaries +*.qm diff --git a/CMakeLists.txt b/CMakeLists.txt index 9835094f..ec86073d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,6 +3,7 @@ ## ## Copyright (C) 2012 Joel Holdsworth ## Copyright (C) 2012-2013 Alexandru Gagniuc +## Copyright (C) 2020 Soeren Apel ## ## This program is free software: you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by @@ -20,9 +21,9 @@ cmake_minimum_required(VERSION 2.8.12) -include(GNUInstallDirs) +project(pulseview C CXX) -project(pulseview) +include(GNUInstallDirs) # Let AUTOMOC and AUTOUIC process GENERATED files. if(POLICY CMP0071) @@ -47,6 +48,7 @@ option(ENABLE_DECODE "Build with libsigrokdecode" TRUE) option(ENABLE_FLOW "Build with libsigrokflow" FALSE) option(ENABLE_TESTS "Enable unit tests" FALSE) option(STATIC_PKGDEPS_LIBS "Statically link to (pkg-config) libraries" FALSE) +option(ENABLE_TS_UPDATE "Update .ts source files (Qt l10n)" FALSE) if(WIN32) # On Windows/MinGW we need to statically link to libraries. @@ -73,15 +75,66 @@ add_subdirectory(manual) #= Dependencies #------------------------------------------------------------------------------- +include(CheckCSourceCompiles) +include(CheckCXXCompilerFlag) +include(CheckCXXSourceCompiles) +include(CMakePushCheckState) +include(memaccess) + +find_package(PkgConfig) + +if(CMAKE_VERSION VERSION_EQUAL "3.8.0" OR CMAKE_VERSION VERSION_GREATER "3.8.0") + check_cxx_compiler_flag("-std=c++17" HAVE_STD_CXX_17) + check_cxx_compiler_flag("-std=c++14" HAVE_STD_CXX_14) + check_cxx_compiler_flag("-std=c++11" HAVE_STD_CXX_11) + if(HAVE_STD_CXX_17) + message(STATUS "Using C++17 for the application build") + set(CMAKE_CXX_STANDARD 17) + set(REQUIRED_STD_CXX_FLAGS "-std=c++17") + elseif(HAVE_STD_CXX_14) + message(STATUS "Using C++14 for the application build") + set(CMAKE_CXX_STANDARD 14) + set(REQUIRED_STD_CXX_FLAGS "-std=c++14") + elseif(HAVE_STD_CXX_11) + message(STATUS "Using C++11 for the application build") + set(CMAKE_CXX_STANDARD 11) + set(REQUIRED_STD_CXX_FLAGS "-std=c++11") + else() + message(FATAL_ERROR "Need modern C++, at least language standard 11") + endif() +else() + check_cxx_compiler_flag("-std=c++14" HAVE_STD_CXX_14) + check_cxx_compiler_flag("-std=c++11" HAVE_STD_CXX_11) + if(HAVE_STD_CXX_14) + message(STATUS "Using C++14 for the application build") + set(CMAKE_CXX_STANDARD 14) + set(REQUIRED_STD_CXX_FLAGS "-std=c++14") + elseif(HAVE_STD_CXX_11) + message(STATUS "Using C++11 for the application build") + set(CMAKE_CXX_STANDARD 11) + set(REQUIRED_STD_CXX_FLAGS "-std=c++11") + else() + message(FATAL_ERROR "Need modern C++, at least language standard 11") + endif() +endif() + list(APPEND PKGDEPS glib-2.0>=2.28.0) -list(APPEND PKGDEPS glibmm-2.4>=2.28.0) + +# Try to find the prefered glibmm-2.4. If not found then add glibmm-2.68 +# to the dependency list. +pkg_check_modules(GLIBMM_2_4 glibmm-2.4>=2.28.0) +if(GLIBMM_2_4_FOUND) + list(APPEND PKGDEPS glibmm-2.4>=2.28.0) +else() + list(APPEND PKGDEPS glibmm-2.68>=2.68.0) +endif() if(ENABLE_FLOW) list(APPEND PKGDEPS gstreamermm-1.0>=1.8.0) list(APPEND PKGDEPS libsigrokflow>=0.1.0) endif() -set(LIBSR_CXX_BINDING "libsigrokcxx>=0.5.1") +set(LIBSR_CXX_BINDING "libsigrokcxx>=0.5.2") list(APPEND PKGDEPS "${LIBSR_CXX_BINDING}") if(ENABLE_DECODE) @@ -92,7 +145,6 @@ if(ANDROID) list(APPEND PKGDEPS libsigrokandroidutils>=0.1.0) endif() -find_package(PkgConfig) pkg_check_modules(LIBSRCXX ${LIBSR_CXX_BINDING}) if(NOT LIBSRCXX_FOUND OR NOT LIBSRCXX_VERSION) message(FATAL_ERROR "libsigrok C++ bindings missing, check libsigrok's 'configure' output (missing dependencies?)") @@ -101,18 +153,35 @@ pkg_check_modules(PKGDEPS REQUIRED ${PKGDEPS}) set(CMAKE_AUTOMOC TRUE) -find_package(Qt5 5.3 COMPONENTS Core Gui Widgets Svg REQUIRED) +# Check for Qt5, and check for Qt6 if Qt5 is not found. +set(QT_COMPONENTS Core Gui LinguistTools Widgets Svg) +find_package(Qt5 5.3 QUIET COMPONENTS Core) +if(Qt5_FOUND) + find_package(Qt5 5.3 COMPONENTS ${QT_COMPONENTS} REQUIRED) + message(STATUS "Qt version: ${Qt5_VERSION}") +else() + find_package(Qt6 6.2 COMPONENTS ${QT_COMPONENTS} REQUIRED) + message(STATUS "Qt version: ${Qt6_VERSION}") +endif() if(WIN32) - # MXE workaround: Use pkg-config to find Qt5 libs. + # MXE workaround: Use pkg-config to find Qt5 and Qt6 libs. # https://github.com/mxe/mxe/issues/1642 # Not required (and doesn't work) on MSYS2. if(NOT DEFINED ENV{MSYSTEM}) - pkg_check_modules(QT5ALL REQUIRED Qt5Widgets>=5.3 Qt5Gui>=5.3 Qt5Svg>=5.3) + if(Qt5_FOUND) + pkg_check_modules(QT5ALL REQUIRED Qt5Widgets>=5.3 Qt5Gui>=5.3 Qt5Svg>=5.3) + else() + pkg_check_modules(QT6ALL REQUIRED Qt6Widgets>=6.2 Qt6Gui>=6.2 Qt6Svg>=6.2) + endif() endif() endif() -set(QT_LIBRARIES Qt5::Gui Qt5::Widgets Qt5::Svg) +if(Qt5_FOUND) + set(QT_LIBRARIES Qt5::Gui Qt5::Widgets Qt5::Svg) +else() + set(QT_LIBRARIES Qt6::Gui Qt6::Widgets Qt6::Svg) +endif() set(BOOSTCOMPS filesystem serialization system) if(ENABLE_TESTS) @@ -120,6 +189,14 @@ if(ENABLE_TESTS) endif() if(ENABLE_STACKTRACE) + include(FindBacktrace) + if (Backtrace_FOUND) + set(_Boost_STACKTRACE_BACKTRACE_HEADERS "boost/stacktrace.hpp") + list(APPEND BOOSTCOMPS stacktrace_backtrace) + else() + set(_Boost_STACKTRACE_BASIC_HEADERS "boost/stacktrace.hpp") + list(APPEND BOOSTCOMPS stacktrace_basic) + endif() find_package(Boost 1.65.1 COMPONENTS ${BOOSTCOMPS} REQUIRED) else() find_package(Boost 1.55 COMPONENTS ${BOOSTCOMPS} REQUIRED) @@ -140,48 +217,66 @@ find_package(Threads REQUIRED) # Helper for checking for atomics function(check_working_cxx_atomics varname additional_lib) - include(CheckCXXSourceCompiles) - include(CMakePushCheckState) - cmake_push_check_state() - set(CMAKE_REQUIRED_FLAGS "-std=c++11") - set(CMAKE_REQUIRED_LIBRARIES "${additional_lib}") - set(CMAKE_REQUIRED_QUIET 1) - CHECK_CXX_SOURCE_COMPILES(" + cmake_push_check_state() + set(CMAKE_REQUIRED_FLAGS "${REQUIRED_STD_CXX_FLAGS}") + set(CMAKE_REQUIRED_LIBRARIES "${additional_lib}") + set(CMAKE_REQUIRED_QUIET 1) + CHECK_CXX_SOURCE_COMPILES(" #include std::atomic x; int main() { - return std::atomic_fetch_add_explicit(&x, 1, std::memory_order_seq_cst); + return std::atomic_fetch_add_explicit(&x, 1, std::memory_order_seq_cst); } " ${varname}) - cmake_pop_check_state() + cmake_pop_check_state() endfunction(check_working_cxx_atomics) # First check if atomics work without the library. # If not, check if the library exists, and atomics work with it. check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITHOUT_LIB "") if(HAVE_CXX_ATOMICS_WITHOUT_LIB) - message(STATUS "Atomics provided by the C-library - yes") + message(STATUS "Atomics provided by the C-library - yes") else() - message(STATUS "Atomics provided by the C-library - no") - find_library(LIBATOMIC_LIBRARY NAMES atomic PATH_SUFFIXES lib) - if(LIBATOMIC_LIBRARY) - check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITH_LIB "${LIBATOMIC_LIBRARY}") - if (HAVE_CXX_ATOMICS_WITH_LIB) - message(STATUS "Atomics provided by libatomic - yes") - else() - message(STATUS "Atomics provided by libatomic - no") - message(FATAL_ERROR "Compiler must support std::atomic!") - endif() - else() - message(FATAL_ERROR "Compiler appears to require libatomic, but cannot find it.") - endif() + message(STATUS "Atomics provided by the C-library - no") + find_library(LIBATOMIC_LIBRARY NAMES atomic PATH_SUFFIXES lib) + if(LIBATOMIC_LIBRARY) + check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITH_LIB "${LIBATOMIC_LIBRARY}") + if (HAVE_CXX_ATOMICS_WITH_LIB) + message(STATUS "Atomics provided by libatomic - yes") + else() + message(STATUS "Atomics provided by libatomic - no") + message(FATAL_ERROR "Compiler must support std::atomic!") + endif() + else() + message(FATAL_ERROR "Compiler appears to require libatomic, but cannot find it.") + endif() +endif() + +# Check availability of features which depend on library versions. +# TODO Ideally use check_symbol_exists() instead, reduce boilerplate. +if(ENABLE_DECODE) + cmake_push_check_state() + set(CMAKE_REQUIRED_INCLUDES "${PKGDEPS_INCLUDE_DIRS}") + set(CMAKE_REQUIRED_LIBRARIES "sigrokdecode") + foreach (LPATH ${PKGDEPS_LIBRARY_DIRS}) + list(APPEND CMAKE_REQUIRED_LINK_OPTIONS "-L${LPATH}") + endforeach () + check_c_source_compiles(" + #include + int main(int argc, char *argv[]) + { + (void)argc; + (void)argv; + return srd_session_send_eof(NULL); + } + " HAVE_SRD_SESSION_SEND_EOF) + cmake_pop_check_state() endif() #=============================================================================== #= System Introspection #------------------------------------------------------------------------------- -include(memaccess) memaccess_check_unaligned_le(HAVE_UNALIGNED_LITTLE_ENDIAN_ACCESS) #=============================================================================== @@ -191,7 +286,11 @@ memaccess_check_unaligned_le(HAVE_UNALIGNED_LITTLE_ENDIAN_ACCESS) set(PV_TITLE PulseView) set(PV_VERSION_STRING "0.5.0") -set(PV_GLIBMM_VERSION ${PKGDEPS_glibmm-2.4_VERSION}) +if(GLIBMM_2_4_FOUND) + set(PV_GLIBMM_VERSION ${PKGDEPS_glibmm-2.4_VERSION}) +else() + set(PV_GLIBMM_VERSION ${PKGDEPS_glibmm-2.68_VERSION}) +endif() include(GetGitRevisionDescription) @@ -236,6 +335,7 @@ set(pulseview_SOURCES pv/globalsettings.cpp pv/logging.cpp pv/mainwindow.cpp + pv/metadata_obj.cpp pv/session.cpp pv/storesession.cpp pv/util.cpp @@ -246,6 +346,7 @@ set(pulseview_SOURCES pv/data/analogsegment.cpp pv/data/logic.cpp pv/data/logicsegment.cpp + pv/data/mathsignal.cpp pv/data/signalbase.cpp pv/data/signaldata.cpp pv/data/segment.cpp @@ -273,6 +374,7 @@ set(pulseview_SOURCES pv/views/trace/cursorpair.cpp pv/views/trace/flag.cpp pv/views/trace/header.cpp + pv/views/trace/mathsignal.cpp pv/views/trace/marginwidget.cpp pv/views/trace/logicsignal.cpp pv/views/trace/ruler.cpp @@ -297,6 +399,7 @@ set(pulseview_SOURCES pv/widgets/colorpopup.cpp pv/widgets/devicetoolbutton.cpp pv/widgets/exportmenu.cpp + pv/widgets/flowlayout.cpp pv/widgets/importmenu.cpp pv/widgets/popup.cpp pv/widgets/popuptoolbutton.cpp @@ -307,9 +410,11 @@ set(pulseview_SOURCES # This list includes only QObject derived class headers. set(pulseview_HEADERS + pv/exprtk.hpp pv/logging.hpp pv/globalsettings.hpp pv/mainwindow.hpp + pv/metadata_obj.hpp pv/session.hpp pv/storesession.hpp pv/binding/device.hpp @@ -317,6 +422,7 @@ set(pulseview_HEADERS pv/data/analogsegment.hpp pv/data/logic.hpp pv/data/logicsegment.hpp + pv/data/mathsignal.hpp pv/data/signalbase.hpp pv/dialogs/connect.hpp pv/dialogs/inputoutputoptions.hpp @@ -337,6 +443,7 @@ set(pulseview_HEADERS pv/views/trace/flag.hpp pv/views/trace/header.hpp pv/views/trace/logicsignal.hpp + pv/views/trace/mathsignal.hpp pv/views/trace/marginwidget.hpp pv/views/trace/ruler.hpp pv/views/trace/signal.hpp @@ -356,6 +463,7 @@ set(pulseview_HEADERS pv/widgets/colorpopup.hpp pv/widgets/devicetoolbutton.hpp pv/widgets/exportmenu.hpp + pv/widgets/flowlayout.hpp pv/widgets/importmenu.hpp pv/widgets/popup.hpp pv/widgets/popuptoolbutton.hpp @@ -384,6 +492,10 @@ if(ENABLE_DECODE) pv/subwindows/decoder_selector/item.cpp pv/subwindows/decoder_selector/model.cpp pv/subwindows/decoder_selector/subwindow.cpp + pv/views/decoder_binary/view.cpp + pv/views/decoder_binary/QHexView.cpp + pv/views/tabular_decoder/model.cpp + pv/views/tabular_decoder/view.cpp pv/views/trace/decodetrace.cpp pv/widgets/decodergroupbox.cpp pv/widgets/decodermenu.cpp @@ -392,6 +504,9 @@ if(ENABLE_DECODE) list(APPEND pulseview_HEADERS pv/data/decodesignal.hpp pv/subwindows/decoder_selector/subwindow.hpp + pv/views/decoder_binary/view.hpp + pv/views/decoder_binary/QHexView.hpp + pv/views/tabular_decoder/view.hpp pv/views/trace/decodetrace.hpp pv/widgets/decodergroupbox.hpp pv/widgets/decodermenu.hpp @@ -412,7 +527,35 @@ if(ANDROID) ) endif() -qt5_add_resources(pulseview_RESOURCES_RCC ${pulseview_RESOURCES}) +if(Qt5_FOUND) + qt5_add_resources(pulseview_RESOURCES_RCC ${pulseview_RESOURCES}) +else() + qt6_add_resources(pulseview_RESOURCES_RCC ${pulseview_RESOURCES}) +endif() + +#=============================================================================== +#= Translations +#------------------------------------------------------------------------------- + +file(GLOB TS_FILES ${CMAKE_SOURCE_DIR}/l10n/*.ts) +set_property(SOURCE ${TS_FILES} PROPERTY OUTPUT_LOCATION ${CMAKE_BINARY_DIR}/l10n) +if (NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) + configure_file("translations.qrc" "translations.qrc" COPYONLY) +endif () + +if(Qt5_FOUND) + qt5_add_translation(QM_FILES ${TS_FILES}) + qt5_add_resources(pulseview_RESOURCES_RCC ${CMAKE_BINARY_DIR}/translations.qrc) + if (ENABLE_TS_UPDATE) + qt5_create_translation(QM_FILES ${pulseview_SOURCES} ${TS_FILES}) + endif () +else() + qt6_add_translation(QM_FILES ${TS_FILES}) + qt6_add_resources(pulseview_RESOURCES_RCC ${CMAKE_BINARY_DIR}/translations.qrc) + if (ENABLE_TS_UPDATE) + qt6_create_translation(QM_FILES ${pulseview_SOURCES} ${TS_FILES}) + endif () +endif() #=============================================================================== #= Global Definitions @@ -421,8 +564,12 @@ qt5_add_resources(pulseview_RESOURCES_RCC ${pulseview_RESOURCES}) add_definitions(-DQT_NO_KEYWORDS) add_definitions(-D__STDC_LIMIT_MACROS) add_definitions(-Wall -Wextra) -add_definitions(-std=c++11) +add_definitions(${REQUIRED_STD_CXX_FLAGS}) + add_definitions(-DBOOST_MATH_DISABLE_FLOAT128=1) +if(WIN32) + add_definitions(-Wa,-mbig-obj -O3) +endif() if(ENABLE_FLOW) add_definitions(-DENABLE_FLOW) @@ -441,7 +588,10 @@ if(ENABLE_SIGNALS) endif() if(ENABLE_STACKTRACE) - add_definitions(-DENABLE_STACKTRACE) + add_definitions(-DENABLE_STACKTRACE -no-pie -fno-pie) + if (Backtrace_FOUND) + add_definitions(-DBOOST_STACKTRACE_USE_BACKTRACE) + endif() endif() #=============================================================================== @@ -487,27 +637,34 @@ if(WIN32) # We also need QWindowsIntegrationPlugin, Qt5PlatformSupport (only for # Qt < 5.8.0), and all Qt libs and their dependencies. add_definitions(-DQT_STATICPLUGIN) - list(APPEND PULSEVIEW_LINK_LIBS Qt5::QSvgPlugin) - list(APPEND PULSEVIEW_LINK_LIBS Qt5::QWindowsIntegrationPlugin) - if(Qt5Gui_VERSION VERSION_LESS 5.8.0) - list(APPEND PULSEVIEW_LINK_LIBS -lQt5PlatformSupport) + if(Qt5_FOUND) + list(APPEND PULSEVIEW_LINK_LIBS Qt5::QSvgPlugin) + list(APPEND PULSEVIEW_LINK_LIBS Qt5::QWindowsIntegrationPlugin) + if(Qt5Gui_VERSION VERSION_LESS 5.8.0) + list(APPEND PULSEVIEW_LINK_LIBS -lQt5PlatformSupport) + endif() + list(APPEND PULSEVIEW_LINK_LIBS ${QT5ALL_LDFLAGS}) + else() + list(APPEND PULSEVIEW_LINK_LIBS Qt6::QSvgPlugin) + list(APPEND PULSEVIEW_LINK_LIBS Qt6::QWindowsIntegrationPlugin) + list(APPEND PULSEVIEW_LINK_LIBS ${QT6ALL_LDFLAGS}) endif() - list(APPEND PULSEVIEW_LINK_LIBS ${QT5ALL_LDFLAGS}) endif() if(ENABLE_STACKTRACE) - # Needed to resolve dladdr. - list(APPEND PULSEVIEW_LINK_LIBS "-ldl") + list(APPEND PULSEVIEW_LINK_LIBS ${CMAKE_DL_LIBS} ${Backtrace_LIBRARIES}) + link_libraries("-no-pie -fno-pie") endif() if(ANDROID) list(APPEND PULSEVIEW_LINK_LIBS "-llog") endif() +set(INPUT_FILES_LIST ${pulseview_SOURCES} ${pulseview_RESOURCES_RCC} ${QM_FILES}) if(ANDROID) - add_library(${PROJECT_NAME} SHARED ${pulseview_SOURCES} ${pulseview_RESOURCES_RCC}) + add_library(${PROJECT_NAME} SHARED ${INPUT_FILES_LIST}) else() - add_executable(${PROJECT_NAME} ${pulseview_SOURCES} ${pulseview_RESOURCES_RCC}) + add_executable(${PROJECT_NAME} ${INPUT_FILES_LIST}) endif() target_link_libraries(${PROJECT_NAME} ${PULSEVIEW_LINK_LIBS}) diff --git a/INSTALL b/INSTALL index dce8eb64..e777959f 100644 --- a/INSTALL +++ b/INSTALL @@ -15,18 +15,18 @@ Requirements - cmake >= 2.8.12 - libglib >= 2.28.0 - glibmm-2.4 (>= 2.28.0) - - gstreamermm-1.0 (>= 1.8.0) - Qt5 (>= 5.3), including the following components: - - Qt5Core, Qt5Gui, Qt5Widgets, Qt5Svg + - Qt5Core, Qt5Gui, Qt5Widgets, Qt5Svg, + Qt5LinguistTools (qttools5-dev, qttools5-dev-tools) + - Qt translation package (optional; needed at runtime, not build time) - libboost >= 1.55 (including the following libs): - libboost-system - libboost-filesystem - libboost-serialization - libboost-test (optional, only needed to run the unit tests) - libboost-stacktrace (optional, only needed for debugging) - - libsigrokflow >= 0.1.0 - - libsigrokcxx >= 0.5.1 (libsigrok C++ bindings) - - libsigrokdecode >= 0.6.0 + - libsigrokcxx >= 0.5.2 (libsigrok C++ bindings) + - libsigrokdecode >= 0.5.2 - libsigrokandroidutils >= 0.1.0 (optional, only needed on Android) - asciidoctor (optional, only needed to build the HTML manual) - asciidoctor-pdf (optional, only needed to build the PDF manual) diff --git a/README b/README index 588edc4c..61de9b21 100644 --- a/README +++ b/README @@ -22,9 +22,9 @@ PulseView is licensed under the terms of the GNU General Public License (GPL), version 3 or later. While some individual source code files are licensed under the GPLv2+, and -some files are licensed under the GPLv3+, this doesn't change the fact that -the program as a whole is licensed under the terms of the GPLv3+ (e.g. also -due to the fact that it links against GPLv3+ libraries). +some files are licensed under the GPLv3+ or MIT, this doesn't change the fact +that the program as a whole is licensed under the terms of the GPLv3+ (e.g. +also due to the fact that it links against GPLv3+ libraries). Please see the individual source files for the full list of copyright holders. @@ -51,6 +51,7 @@ icons/application-exit.png, icons/document-new.png, icons/document-open.png, icons/document-save-as.png, +icons/edit-paste.svg, icons/help-browser.png, icons/media-playback-pause.png, icons/media-playback-start.png, @@ -70,6 +71,11 @@ icons/information.svg: Bobarino GFDL 1.2 or later / CC-BY-SA 3.0 https://en.wikipedia.org/wiki/File:Information.svg#Licensing +icons/add-math-channel.svg: Inductiveload + https://en.wikipedia.org/wiki/File:Icon_Mathematical_Plot.svg + License: + Public Domain + QDarkStyleSheet: Colin Duquesnoy https://github.com/ColinDuquesnoy/QDarkStyleSheet License: @@ -82,6 +88,17 @@ DarkStyle: Juergen Skrotzky MIT license https://github.com/Jorgen-VikingGod/Qt-Frameless-Window-DarkStyle#licence +QHexView: Victor Anjin + https://github.com/virinext/QHexView + License: + MIT license + https://github.com/virinext/QHexView/blob/master/LICENSE + +ExprTk: Arash Partow + https://www.partow.net/programming/exprtk/index.html + License: + MIT license + Mailing list ------------ @@ -92,7 +109,7 @@ Mailing list IRC --- -You can find the sigrok developers in the #sigrok IRC channel on Freenode. +You can find the sigrok developers in the #sigrok IRC channel on Libera.Chat. Website diff --git a/config.h.in b/config.h.in index 7720001a..f5855d18 100644 --- a/config.h.in +++ b/config.h.in @@ -34,6 +34,9 @@ /* Platform properties */ #cmakedefine HAVE_UNALIGNED_LITTLE_ENDIAN_ACCESS +/* Presence of features which depend on library versions. */ +#cmakedefine HAVE_SRD_SESSION_SEND_EOF 1 + #define PV_GLIBMM_VERSION "@PV_GLIBMM_VERSION@" #endif diff --git a/contrib/pulseview_cross.nsi.in b/contrib/pulseview_cross.nsi.in index fdcdf49e..1cbd9eb1 100644 --- a/contrib/pulseview_cross.nsi.in +++ b/contrib/pulseview_cross.nsi.in @@ -1,7 +1,7 @@ ## ## This file is part of the PulseView project. ## -## Copyright (C) 2013-2014 Uwe Hermann +## Copyright (C) 2013-2020 Uwe Hermann ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by @@ -43,7 +43,11 @@ Name "PulseView" OutFile "pulseview-@PV_VERSION_STRING@-installer.exe" # Where to install the application. -InstallDir "$PROGRAMFILES\sigrok\PulseView" +!ifdef PE64 + InstallDir "$PROGRAMFILES64\sigrok\PulseView" +!else + InstallDir "$PROGRAMFILES\sigrok\PulseView" +!endif # Request admin privileges for Windows Vista and Windows 7. # http://nsis.sourceforge.net/Docs/Chapter4.html @@ -160,6 +164,7 @@ Section "PulseView (required)" Section1 # Python File "${CROSS}/python34.dll" File "${CROSS}/python34.zip" + File "${CROSS}/*.pyd" SetOutPath "$INSTDIR\share" @@ -183,6 +188,12 @@ Section "PulseView (required)" Section1 0 SW_SHOWNORMAL \ "" "Open-source, portable sigrok GUI" + # Create a shortcut for the PulseView application in "safe mode". + CreateShortCut "$SMPROGRAMS\sigrok\PulseView\PulseView (Safe Mode).lnk" \ + "$INSTDIR\pulseview.exe" "-c -D" "$INSTDIR\pulseview.exe" \ + 0 SW_SHOWNORMAL \ + "" "Open-source, portable sigrok GUI (Safe Mode)" + # Create a shortcut for the PulseView application running in debug mode. CreateShortCut "$SMPROGRAMS\sigrok\PulseView\PulseView (Debug).lnk" \ "$INSTDIR\pulseview.exe" "-l 5" "$INSTDIR\pulseview.exe" \ @@ -272,6 +283,7 @@ Section "Uninstall" Delete "$INSTDIR\zadig_xp.exe" Delete "$INSTDIR\python34.dll" Delete "$INSTDIR\python34.zip" + Delete "$INSTDIR\*.pyd" # Delete all decoders and everything else in libsigrokdecode/. # There could be *.pyc files or __pycache__ subdirs and so on. @@ -294,6 +306,7 @@ Section "Uninstall" # Delete the links from the start menu. Delete "$SMPROGRAMS\sigrok\PulseView\PulseView.lnk" + Delete "$SMPROGRAMS\sigrok\PulseView\PulseView (Safe Mode).lnk" Delete "$SMPROGRAMS\sigrok\PulseView\PulseView (Debug).lnk" Delete "$SMPROGRAMS\sigrok\PulseView\Uninstall PulseView.lnk" Delete "$SMPROGRAMS\sigrok\PulseView\Zadig (PulseView).lnk" diff --git a/doc/pulseview.1 b/doc/pulseview.1 index 9c993070..749f6dab 100644 --- a/doc/pulseview.1 +++ b/doc/pulseview.1 @@ -1,4 +1,4 @@ -.TH PULSEVIEW 1 "July 31, 2019" +.TH PULSEVIEW 1 "March 31, 2020" .SH "NAME" PulseView \- Qt-based LA/scope/MSO GUI for sigrok .SH "SYNOPSIS" @@ -90,6 +90,9 @@ Show / hide analog minor grid (in addition to the vdiv grid). .B "c" Show / hide cursors. .TP +.B "d" +Show / hide protocol decoder selector. +.TP .B "b" Toggle between coloured trace backgrounds and alternating light/dark gray trace backgrounds. @@ -100,14 +103,17 @@ Start / stop an acquisition. .B "Left/right arrow keys" Scroll left/right. .TP +.B "+/-" +Zoom in/out. +.TP .B "Up/down arrow keys" Zoom in/out. .TP -.B "Home" -Jump to the start of the sample data. +.B "Home/End" +Jump to the start/end of the sample data. .TP -.B "End" -Jump to the end of the sample data. +.B "1/2" +Attach left/right side of the cursors to the mouse. .TP .B "CTRL+o" Open file. @@ -127,17 +133,14 @@ Ungroup the traces in the currently selected trace group. .B "CTRL+up/down arrow keys" Scroll down/up. .TP -.B "CTRL++" -Zoom in. -.TP -.B "CTRL+-" -Zoom out. -.TP .B "CTRL+q" Quit, i.e. shutdown PulseView (closing all session tabs). .TP .B "CTRL+w" Close the current session tab. +.TP +.B "SHIFT+mouse wheel" +Scroll horizontally instead of zooming in/out. .SH "EXIT STATUS" .B PulseView exits with 0 on success, 1 on most failures. diff --git a/icons/add-math-signal.svg b/icons/add-math-signal.svg new file mode 100644 index 00000000..4fa71243 --- /dev/null +++ b/icons/add-math-signal.svg @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Jakub Steiner + + + http://jimmac.musichall.cz + + Accessibility + + + accessibility + assist + + + + + + + + + + + + + + + + + + + + diff --git a/icons/edit-paste.svg b/icons/edit-paste.svg new file mode 100644 index 00000000..39150d71 --- /dev/null +++ b/icons/edit-paste.svg @@ -0,0 +1,531 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Edit Paste + 2005-10-10 + + + Andreas Nilsson + + + + + edit + paste + + + + + + Jakub Steiner + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/icons/math.svg b/icons/math.svg new file mode 100644 index 00000000..afdaeb63 --- /dev/null +++ b/icons/math.svg @@ -0,0 +1,197 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + - + + + - + + + + + diff --git a/l10n/de.ts b/l10n/de.ts new file mode 100644 index 00000000..5553fa8b --- /dev/null +++ b/l10n/de.ts @@ -0,0 +1,1697 @@ + + + + + Application + + + Some parts of the application may still use the previous language. Re-opening the affected windows or restarting the application will remedy this. + Einige Teile der Anwendung verwenden vielleicht noch die vorherige Sprache. Sollte das der Fall sein, kann dies durch ein Schließen und neu Öffnen der betroffenen Fenster oder der Anwendung behoben werden. + + + + QApplication + + Select a decoder to see its description here. + Wähle einen Dekoder, um dessen Beschreibung hier lesen zu können. + + + Session %1 + Analysesitzung %1 + + + + Querying config key %1 is not allowed + Internal message + + + + + Querying config key %1 resulted in %2 + Internal message + + + + + Unknown type supplied when attempting to query %1 + Internal message + + + + + Error when scanning device driver '%1': %2 + Internal message + + + + + QHexView + + + No data available + Keine Daten vorhanden + + + + QObject + + + Cancel + Abbrechen + + + + Scanning for devices that driver %1 can access... + Suche nach Geräten, die von Treiber %1 angesprochen werden können... + + + + Stack trace of previous crash: + Internal message + + + + + Don't show this message again + Diese Meldung in Zukunft nicht mehr anzeigen + + + + When %1 last crashed, it created a stack trace. +A human-readable form has been saved to disk and was written to the log. You may access it from the settings dialog. + Internal message + + + + + SubWindow + + <p align='right'>Tags: %1</p> + <p align='right'>Stichworte: %1</p> + + + + pv::MainWindow + + + PulseView + Name + + + + + Decoder Selector + Protokolldekoder + + + + Session %1 + Analysesitzung %1 + + + + Create New Session + Neue Analysesitzung + + + + Start/Stop Acquisition + Datenerfassung starten/stoppen + + + + Settings + Einstellungen + + + + Reload + Neu laden + + + + + + Confirmation + Bestätigung + + + + There is unsaved data. Close anyway? + Es gibt noch ungespeicherte Daten. Trotzdem beenden? + + + + + Run + Starten + + + + Stop + Stoppen + + + + + This session contains unsaved data. Close it anyway? + Die Daten dieser Analysesitzung wurden nicht gespeichert. Trotzdem schließen? + + + + pv::Session + + + Failed to select device + Fehler beim Auswählen des Gerätes + + + + Failed to open device + Fehler beim Öffnen des Gerätes + + + + Error + Fehler + + + Unexpected input format: %s + Unerwartetes Importformat: %s + + + + Unexpected input format: %1 + Unerwartetes Importformat: %1 + + + + Failed to load %1 + Fehler beim Laden von %1 + + + + No active device set, can't start acquisition. + Kein Gerät aktiv, kann Datenerfassung nicht starten. + + + + No channels enabled. + Keine aktiven Kanäle vorhanden. + + + + Out of memory, acquisition stopped. + Nicht genügend Arbeitsspeicher vorhanden, Datenerfassung wurde gestoppt. + + + + Can't handle more than 64 logic channels. + Internal message + + + + + pv::StoreSession + + + Can't save logic channel without data. + Kann Logikkanal nicht speichern, da er keine Daten beinhaltet. + + + + Can't save analog channel without data. + Kann Analogkanal nicht speichern, da er keine Daten beinhaltet. + + + + No channels enabled. + Keine Kanäle aktiviert. + + + + Can't save range without sample data. + In dem gewählten Bereich befinden sich keine Daten zum Speichern. + + + + + Error while saving: + Fehler beim Speichern: + + + + pv::data::DecodeSignal + + + No decoders + Keine Protokolldekoder + + + + There are no channels assigned to this decoder + Dem Protokolldekoder sind keine Kanäle zugeordnet + + + + One or more required channels have not been specified + Mindestens ein notwendiger Kanal wurde noch nicht zugeordnet + + + + No input data + Keine Daten zum Auswerten vorhanden + + + + Decoder reported an error + Protokolldekoder meldet Fehler + + + + Failed to create decoder instance + Fehler beim Erzeugen des Protokolldekoders + + + + pv::data::SignalBase + + + Signal average + Durchschnittlicher Signalpegel + + + + 0.9V (for 1.8V CMOS) + 0.9V (für 1.8V CMOS) + + + + 1.8V (for 3.3V CMOS) + 1.8V (für 3.3V CMOS) + + + + 2.5V (for 5.0V CMOS) + 2.5V (für 5.0V CMOS) + + + + 1.5V (for TTL) + 1.5V (für TTL) + + + + Signal average +/- 15% + Durchschnittlicher Signalpegel +/- 15% + + + + 0.3V/1.2V (for 1.8V CMOS) + 0.3V/1.2V (für 1.8V CMOS) + + + + 0.7V/2.5V (for 3.3V CMOS) + 0.7V/2.5V (für 3.3V CMOS) + + + + 1.3V/3.7V (for 5.0V CMOS) + 1.3V/3.7V (für 5.0V CMOS) + + + + 0.8V/2.0V (for TTL) + 0.8V/2.0V (für TTL) + + + + pv::dialogs::Connect + + + &Scan for devices using driver above + Nach Geräten &suchen, die der ausgewählte Treiber ansprechen kann + + + + Connect to Device + Mit Gerät verbinden + + + + Step 1: Choose the driver + Schritt 1: Treiber auswählen + + + + &USB + + + + + Serial &Port + Serielle Sch&nittstelle + + + + &TCP/IP + + + + + Protocol: + Protokoll: + + + + Step 2: Choose the interface + Schritt 2: Schnittstelle auswählen + + + + Step 3: Scan for devices + Schritt 3: Nach Geräten suchen + + + + Step 4: Select the device + Schritt 4: Gerät auswählen + + + + pv::dialogs::Settings + + + + General + Allgemein + + + + Views + Ansichten + + + + + Decoders + Protokolldekoder + + + + About + Programmdetails + + + + Logging + Programminterne Meldungen + + + + User interface language + Sprache der Benutzeroberfläche + + + + User interface theme + Design der Benutzeroberfläche + + + + (You may need to restart PulseView for all UI elements to update) + (Ein Neustart von PulseView kann notwendig sein, damit alle Bedienelemente das neue Design übernehmen) + + + + System Default + Standard + + + + Qt widget style + Qt-Anzeigestil + + + + (Dark themes look best with the Fusion style) + (Dunkle Designs sehen mit dem Fusion-Stil am besten aus) + + + + Save session &setup along with .sr file + Analyse&sitzungs-Konfiguration zusammen mit .sr-Dateien speichern + + + + Trace View + Signalansicht + + + + Use colored trace &background + Verwende &farbigen Kanalhintergrund + + + + Constantly perform &zoom-to-fit during acquisition + Ständig den &Zoom anpassen, während Daten aufgezeichnet werden + + + + Perform a zoom-to-&fit when acquisition stops + Den Zoom &anpassen, wenn die Datenerfassung stoppt + + + + Show time zero at the trigger + Den Triggerzeitpunkt automatisch als Nullpunkt festlegen + + + + Always keep &newest samples at the right edge during capture + Die neuesten Datenpunkte während der Aufzeichnung immer am rechten &Rand anzeigen + + + + Show data &sampling points + Daten&punkte visuell hervorheben + + + + Fill high areas of logic signals + High-Pegel von Logiksignalen hervorheben + + + + Color to fill high areas of logic signals with + Farbe für hervorgehobene High-Pegel + + + + Show analog minor grid in addition to div grid + Vertikale Unterteilungen nochmals unterteilen + + + + Highlight mouse cursor using a vertical marker line + Position des Mauscursors durch vertikalen Balken hervorheben + + + + + + pixels + Pixel + + + + Maximum distance from edges before markers snap to them + Abstand zu Signalflanken, bevor Markierer einrasten + + + + Color to fill cursor area with + Farbe für die Auswahl-Markierung + + + + None + Keine + + + + Background + Hintergrundfarbe + + + + Dots + Farbige Abtastpunkte + + + + Conversion threshold display mode (analog traces only) + Darstellung von Konvertierungsschwellen (nur für analoge Kanäle) + + + + Default analog trace div height + Standardgröße von analogen Kanälen + + + + Default logic trace height + Standardgröße von Logikkanälen + + + + Allow configuration of &initial signal state + &Initialzustände von Signalen konfigurierbar machen + + + + Always show all &rows, even if no annotation is visible + Immer alle &Kategorien (Zeilen) anzeigen, auch wenn hierfür keine dekodierten Werte vorliegen + + + + Annotation export format + Format für zu exportierende Dekodierwerte + + + + %s = sample range; %d: decoder name; %r: row name; %c: class name + %s = Start-/Endsample; %d: Dekodername; %r: Kategorie (Name der Zeile); %c: Unterkategorie + + + + %1: longest annotation text; %a: all annotation texts; %q: use quotation marks + %1: Längste Beschreibung des dekodierten Wertes; %a: Alle Beschreibungen des dekodierten Wertes; %q: Benutze Anführungszeichen + + + %s = sample range; %d: decoder name; %r: row name; %q: use quotation marks + %s = Start-/Endsample; %d: Dekodername; %c Name der Kategorie; %q: Benutze Anführungszeichen + + + %s = sample range; %d: decoder name; %c: row name; %q: use quotations marks + %s = Start-/Endsample; %d: Dekodername; %c Name der Kategorie; %q: Benutze Anführungszeichen + + + %1: longest annotation text; %a: all annotation texts + %1: Längste Beschreibung des dekodierten Wertes; %a: Alle Beschreibungen des dekodierten Wertes + + + + %1<br /><a href="http://%2">%2</a> + + + + + GNU GPL, version 3 or later + GNU GPL, Version 3 oder neuer + + + + Versions, libraries and features: + Versionen, Bibliotheken und Features: + + + + Firmware search paths: + Suchpfade für Firmware: + + + + Protocol decoder search paths: + Suchpfade für Protokolldekoder: + + + + Supported hardware drivers: + Unterstützte Hardwaretreiber: + + + + Supported input formats: + Unterstützte Importformate: + + + + Supported output formats: + Unterstützte Exportformate: + + + + Supported protocol decoders: + Unterstützte Protokolldekoder: + + + + Available Translations: + Verfügbare Übersetzungen: + + + + Log level: + Log-Level: + + + + lines + Zeilen + + + + Length of background buffer: + Länge des Logpuffers: + + + + &Save to File + &Speichern + + + + &Pop out + &Abdocken + + + + You selected a dark theme. +Should I set the user-adjustable colors to better suit your choice? + +Please keep in mind that PulseView may need a restart to display correctly. + Es wurde ein dunkles Design gewählt. +Sollen die benutzerspezifischen Farben entsprechend angepasst werden, damit sie besser harmonieren? + +Bei einer Änderung benötigt PulseView eventuell einen Neustart, damit alles korrekt angezeigt wird. + + + + You selected a bright theme. +Should I set the user-adjustable colors to better suit your choice? + +Please keep in mind that PulseView may need a restart to display correctly. + Es wurde ein helles Design gewählt. +Sollen die benutzerspezifischen Farben entsprechend angepasst werden, damit sie besser harmonieren? + +Bei einer Änderung benötigt PulseView eventuell einen Neustart, damit alles korrekt angezeigt wird. + + + + Save Log + Log speichern + + + + Log Files (*.txt *.log);;All Files (*) + Logdateien (*.txt *.log);;Alle Dateien (*) + + + + Success + Erfolg + + + + Log saved to %1. + Log als %1 gespeichert. + + + + Error + Fehler + + + + File %1 could not be written to. + Konnte Datei %1 nicht speichern. + + + + %1 Log + + + + + pv::dialogs::StoreProgress + + + Saving... + Speichere... + + + + Cancel + Abbrechen + + + + Failed to save session. + Beim Speichern trat ein Fehler auf. + + + + pv::popups::Channels + + + + + + All + Alle + + + + + Logic + Logik + + + + + Analog + Analog + + + + Named + Benamte + + + + Unnamed + Unbenamte + + + + Changing + Sich ändernde + + + + Non-changing + Konstante + + + + Disable: + Deaktivieren: + + + + Enable: + Aktivieren: + + + + + None + Keine + + + + pv::prop::Bool + + + + Querying config key %1 resulted in %2 + Internal message + + + + + pv::prop::Double + + + + Querying config key %1 resulted in %2 + Internal message + + + + + pv::prop::Enum + + + + Querying config key %1 resulted in %2 + Internal message + + + + + pv::prop::Int + + + + Querying config key %1 resulted in %2 + Internal message + + + + + pv::prop::String + + + + Querying config key %1 resulted in %2 + Internal message + + + + + pv::subwindows::decoder_selector::DecoderCollectionModel + + + Decoder + Dekoder + + + + Name + + + + + ID + + + + + All Decoders + Alle Dekoder + + + + pv::subwindows::decoder_selector::SubWindow + + + Select a decoder to see its description here. + Wähle einen Dekoder, um dessen Beschreibung hier lesen zu können. + + + + , %1 + + + + + <p align='right'>Tags: %1</p> + <p align='right'>Stichworte: %1</p> + + + + Protocol decoder <b>%1</b> requires input type <b>%2</b> which several decoders provide.<br>Choose which one to use:<br> + Protokolldekoder <b>%1</b> benötigt Daten vom Typ <b>%2</b>, die von verschiedenen Protokolldekodern bereitgestellt werden. <br>Wähle, welcher benutzt werden soll:<br> + + + + Choose Decoder + Wähle Protokolldekoder + + + + pv::toolbars::MainBar + + + New &View + Neue &Ansicht + + + + &Open... + &Öffnen... + + + + Restore Session Setu&p... + &Konfiguration der Analysesitzung laden... + + + &Save As... + &Speichern als... + + + + &Save... + &Speichern... + + + + Save &As... + Speichern &als... + + + + Save Selected &Range As... + Ausgewählten &Bereich speichern als... + + + + Save Session Setu&p... + &Konfiguration der Analysesitzung speichern... + + + + &Export + + + + + &Import + + + + + &Connect to Device... + Mit Gerät &verbinden... + + + + Add protocol decoder + Protokolldekoder hinzufügen + + + + Configure Device + Gerät konfigurieren + + + + Configure Channels + Kanäle konfigurieren + + + + Failed to get sample rate list: + Konnte Liste unterstützter Abtastraten nicht abfragen: + + + + Failed to get sample rate: + Konnte Abtastrate nicht abfragen: + + + + Failed to get sample limit list: + Konnte Liste der maximal erlaubten Abtastraten nicht abfragen: + + + + Failed to configure samplerate: + Konnte Abtastrate nicht einstellen: + + + + Failed to configure sample count: + Konnte Anzahl der Abtastpunkte nicht einstellen: + + + + Missing Cursors + Fehlende Auswahl + + + + You need to set the cursors before you can save the data enclosed by them to a session file (e.g. using the Show Cursors button). + Du musst die Auswahl-Markierer setzen, bevor du die darin befindlichen Daten abspeichern kannst. Verwende hierzu bspw. den Knopf für die Auswahl-Markierer. + + + + Invalid Range + Auswahl ungültig + + + + The cursors don't define a valid range of samples. + Die Auswahl-Markierer geben keinen gültigen Datenbereich an. + + + + %1 files + %1-Dateien + + + + + All Files + Alle Dateien + + + + + Save File + Speichern + + + + Export %1 + %1 exportieren + + + + %1 files + %1-Dateien + + + + Import File + Dateiimport + + + + Import %1 + %1 importieren + + + + + Open File + Öffnen + + + + sigrok Sessions (*.sr);;All Files (*) + sigrok-Datenformat (*.sr);;Alle Dateien (*) + + + + + PulseView Session Setups (*.pvs);;All Files (*) + Analysesitzungs-Konfigurationen (*.pvs);;Alle Dateien (*) + + + + Total sampling time: %1 + Internal message + + + + + pv::views::decoder_binary::View + + + Decoder: + Dekoder: + + + + Show data as + Zeige Daten als + + + + Hexdump + Hex-Dump + + + + &Save... + &Speichern... + + + + + Save Binary Data + Binäre Daten speichern + + + + Binary Data Files (*.bin);;All Files (*) + Binärdateien (*.bin);;Alle Dateien (*) + + + + + Error + Fehler + + + + + File %1 could not be written to. + Konnte Datei %1 nicht speichern. + + + + Hex Dumps (*.txt);;All Files (*) + Hex-Dumps (*.txt);;Alle Dateien (*) + + + + pv::views::decoder_output::View + + Decoder: + Dekoder: + + + Show data as + Zeige Daten als + + + Hexdump + Hex-Dump + + + &Save... + &Speichern... + + + Save Binary Data + Binäre Daten speichern + + + Binary Data Files (*.bin);;All Files (*) + Binärdateien (*.bin);;Alle Dateien (*) + + + Error + Fehler + + + File %1 could not be written to. + Konnte Datei %1 nicht speichern. + + + Hex Dumps (*.txt);;All Files (*) + Hex-Dumps (*.txt);;Alle Dateien (*) + + + + pv::views::tabular_decoder::AnnotationCollectionModel + + + Sample + Sample + + + + Time + Zeit + + + + Decoder + Dekoder + + + + Ann Row + Kategorie + + + + Ann Class + Unterkategorie + + + + Value + Wert + + + + s + s + + + + sa + sa + + + + pv::views::tabular_decoder::View + + + Decoder: + Dekoder: + + + + Hide Hidden Rows/Classes + Verstecke nicht angezeigte (Unter-)Kategorien + + + + &Save... + &Speichern... + + + + Save Annotations as CSV + Dekodierte Werte als CSV speichern + + + + CSV Files (*.csv);;Text Files (*.txt);;All Files (*) + CSV-Dateien (*.csv);;Textdateien (*.txt);;Alle Dateien (*) + + + + Error + Fehler + + + + File %1 could not be written to. + Konnte Datei %1 nicht speichern. + + + + pv::views::trace::AnalogSignal + + + Number of pos vertical divs + Anzahl Unterteilungen im Positiven + + + + Number of neg vertical divs + Anzahl Unterteilungen im Negativen + + + + pixels + Pixel + + + + Div height + Höhe einer Unterteilung + + + + V/div + V/div + + + + Vertical resolution + Vertikale Auflösung + + + + Autoranging + Automatische Skalierung + + + + none + keine + + + + to logic via threshold + zu Logik mittels Schwellwert + + + + to logic via schmitt-trigger + zu Logik mittels Schmitt-Trigger + + + + Conversion + Konvertierung + + + + Conversion threshold(s) + Konvertierungs-Schwellwert(e) + + + + analog + nur analog + + + + converted + nur konvertiert + + + + analog+converted + analog+konvertiert + + + + Show traces for + Anzuzeigende Signale + + + + pv::views::trace::Cursor + + + Disable snapping + Einrasten deaktivieren + + + + pv::views::trace::CursorPair + + + Display interval + Intervall anzeigen + + + + Display frequency + Frequenz anzeigen + + + + Display samples + Samples anzeigen + + + + pv::views::trace::DecodeTrace + + + <p><i>No decoders in the stack</i></p> + <p><i>Keine Protokolldekoder vorhanden</i></p> + + + + <i>* Required channels</i> + <i>* Notwendige Kanäle</i> + + + + Stack Decoder + Protokolldekoder stapeln + + + + Stack a higher-level decoder on top of this one + Weiteren Protokolldekoder auf diesen stapeln + + + + Delete + Löschen + + + + Resume decoding + Dekodierung fortsetzen + + + + Pause decoding + Dekodierung anhalten + + + + Copy annotation text to clipboard + Dekodierten Wert in die Zwischenablage kopieren + + + + Export all annotations + Alle dekodierten Werte exportieren + + + + Export all annotations for this row + Alle dekodierten Werte dieser Kategorie (Zeile) exportieren + + + + Export all annotations, starting here + Alle dekodierten Werte ab hier exportieren + + + + Export annotations for this row, starting here + Alle dekodierten Werte dieser Kategorie (Zeile) ab hier exportieren + + + + Export all annotations within cursor range + Alle dekodierten Werte innerhalb des gewählten Bereiches exportieren + + + + Export annotations for this row within cursor range + Alle dekodierten Werte dieser Kategorie (Zeile) innerhalb des gewählten Bereiches exportieren + + + + %1: +%2 + + + + + <b>%1</b> (%2) %3 + + + + + Export annotations + Dekodierte Werte exportieren + + + + Text Files (*.txt);;All Files (*) + Textdateien (*.txt);;Alle Dateien (*) + + + + Error + Fehler + + + + File %1 could not be written to. + Konnte Datei %1 nicht speichern. + + + + Show this row + Diese Kategorie anzeigen + + + + Show All + Alle anzeigen + + + + Hide All + Alle verstecken + + + + pv::views::trace::Flag + + + Text + + + + + Delete + Löschen + + + + Disable snapping + Einrasten deaktivieren + + + + pv::views::trace::Header + + + Group + Gruppieren + + + + pv::views::trace::LogicSignal + + + No trigger + Kein Trigger + + + + Trigger on rising edge + Trigger auf steigende Flanke + + + + Trigger on high level + Trigger auf High-Pegel + + + + Trigger on falling edge + Trigger auf fallende Flanke + + + + Trigger on low level + Trigger auf Low-Pegel + + + + Trigger on rising or falling edge + Trigger auf steigende oder fallende Flanke + + + + pixels + Pixel + + + + Trace height + Kanalgröße + + + + Trigger + Trigger + + + + pv::views::trace::Ruler + + + Create marker here + Hier neue Markierung anlegen + + + + Set as zero point + Als Nullpunkt setzen + + + + Reset zero point + Nullpunkt zurücksetzen + + + + Disable mouse hover marker + Mauszeigerbalken deaktivieren + + + + Enable mouse hover marker + Mauszeigerbalken aktivieren + + + + pv::views::trace::Signal + + + Name + + + + + Disable + Deaktivieren + + + + pv::views::trace::StandardBar + + + Zoom &In + H&ineinzoomen + + + + Zoom &Out + Hera&uszoomen + + + + Zoom to &Fit + &Passend zoomen + + + + Show &Cursors + &Auswahl-Markierer anzeigen + + + + Display last segment only + Nur letztes Segment anzeigen + + + + Display last complete segment only + Nur letztes vollständiges Segment anzeigen + + + + Display a single segment + Einzelnes Segment anzeigen + + + + pv::views::trace::TimeMarker + + + Time + Zeit + + + + pv::views::trace::Trace + + + Create marker here + Hier neue Markierung anlegen + + + + Color + Farbe + + + + Name + + + + + pv::views::trace::TraceGroup + + + Ungroup + Trennen + + + + pv::widgets::DecoderGroupBox + + + Show/hide this decoder trace + Dekoder anzeigen/verbergen + + + + Delete this decoder trace + Protokolldekoder entfernen + + + + pv::widgets::DeviceToolButton + + + + <No Device> + <Kein Gerät> + + + + pv::widgets::ExportMenu + + + Export %1... + %1 exportieren... + + + + pv::widgets::ImportMenu + + + Import %1... + %1 importieren... + + + diff --git a/l10n/es_MX.ts b/l10n/es_MX.ts new file mode 100644 index 00000000..77afc7fe --- /dev/null +++ b/l10n/es_MX.ts @@ -0,0 +1,2248 @@ + + + + + Application + + + Some parts of the application may still use the previous language. Re-opening the affected windows or restarting the application will remedy this. + Algunas partes de la aplicación podrían seguir usando el idioma anterior. Volver a abrir las ventanas afectadas o reiniciar la aplicación solucionará esto. + + + + QApplication + + + Error when scanning device driver '%1': %2 + Error al escanear el controlador del dispositivo '%1': %2 + + + + Querying config key %1 is not allowed + No se permite consultar la clave de configuración %1 + + + + Querying config key %1 resulted in %2 + La consulta de la clave de configuración %1 resultó en %2 + + + + Unknown type supplied when attempting to query %1 + Tipo desconocido proporcionado al intentar consultar %1 + + + + QHexView + + + No data available + Datos no disponibles + + + + QObject + + + Stack trace of previous crash: + Seguimiento de pila del fallo anterior: + + + + Don't show this message again + No volver a mostrar este mensaje + + + + When %1 last crashed, it created a stack trace. +A human-readable form has been saved to disk and was written to the log. You may access it from the settings dialog. + Cuando %1 se bloqueó por última vez, creó un seguimiento de pila. +Se guardó un formulario legible para humanosen el disco y fue escrito en el log. Puedes acceder a el desde el dialogo de configuración. + + + + Cancel + Cancelar + + + + Scanning for devices that driver %1 can access... + Buscando dispositivos a los que el controlador %1 puede acceder... + + + + pv::MainWindow + + + PulseView + PulseView + + + + Decoder Selector + Selección de decodificador + + + + Session %1 + Sesión %1 + + + + Create New Session + Crear nueva sesión + + + + Start/Stop Acquisition + Iniciar/Detener adquisición + + + + Settings + Ajustes + + + + Reload + Recargar + + + + + Run + Ejecutar + + + + Stop + Detener + + + + + + Confirmation + Confirmación + + + + There is unsaved data. Close anyway? + Hay datos sin guardar. ¿Cerrar de todos modos? + + + + + This session contains unsaved data. Close it anyway? + Esta sesión contiene datos sin guardar. ¿Cerrar de todos modos? + + + + pv::Session + + + Failed to select device + Si en el panel "Sources and forms" la cadena de texto está dentro de "show_session_error(tr("Failed to ..."),e)" traducir "Failed " como "Error" + Error al seleccionar dispositivo + + + + Failed to open device + Error al abrir dispositivo + + + + Error + Error + + + Unexpected input format: %s + Formato de entrada inesperado: %s + + + + Can't restore generated signal of unknown type %1 (%2) + No se puede restaurar la señal generada de tipo desconocido %1 ( %2) + + + + Unexpected input format: %1 + Formato de entrada inesperado: %1 + + + + Failed to load %1 + Error al cargar %1 + + + + No active device set, can't start acquisition. + No hay un dispositivo activo configurado, no se puede iniciar la adquisición. + + + + No channels enabled. + No hay canales habilitados. + + + + Out of memory, acquisition stopped. + Sin memoria, la adquisición se detuvo. + + + + Can't handle more than 64 logic channels. + No puede manejar más de 64 canales lógicos. + + + + pv::StoreSession + + + Can't save logic channel without data. + No se puede guardar el canal lógico sin datos. + + + + Can't save analog channel without data. + No se puede guardar el canal analógico sin datos. + + + + No channels enabled. + No hay canales habilitados. + + + + Can't save range without sample data. + No se puede guardar el rango sin datos de muestra. + + + + + + Error while saving: + Error al guardar: + + + + pv::binding::Device + + + Note for device developers: Ignoring device configuration capability '%1' as it is missing GET and/or SET + Nota para desarrolladores de dispositivos: Ignorar la capacidad de configuración del dispositivo '%1', ya que falta GET y/o SET + + + + No Limit + Sín límite + + + + pv::data::DecodeSignal + + + No decoders + Sin decodificadores + + + + There are no channels assigned to this decoder + No hay canales asignados a este decodificador + + + + One or more required channels have not been specified + No se han especificado uno o más canales requeridos + + + + No input data + Sin datos de entrada + + + + Decoder reported an error + El decodificador reportó un error + + + + Failed to create decoder instance + Error al crear la instancia del decodificador + + + + pv::data::MathSignal + + + Math%1 + Math%1 + + + + No expression defined, nothing to do + Sin expresión definida, nada que hacer + + + + %1 at line %2, column %3: %4 + %1 en línea %2, columna %3: %4 + + + + + "%1" isn't a valid analog signal + "%1" no es una señal analógica válida + + + + + No data will be generated as %1 must be enabled + No se generarán datos ya que %1 debe estar habilitado + + + + pv::data::SignalBase + + + Signal average + Promedio de la señal + + + + 0.9V (for 1.8V CMOS) + 0.9V (para 1.8V CMOS) + + + + 1.8V (for 3.3V CMOS) + 1.8V (para 3.3V CMOS) + + + + 2.5V (for 5.0V CMOS) + 2.5V (para 5.0V CMOS) + + + + 1.5V (for TTL) + 1.5V (para TTL) + + + + Signal average +/- 15% + Promedio de la señal +/- 15% + + + + 0.3V/1.2V (for 1.8V CMOS) + 0.3V/1.2V (para 1.8V CMOS) + + + + 0.7V/2.5V (for 3.3V CMOS) + 0.7V/2.5V (para 3.3V CMOS) + + + + 1.3V/3.7V (for 5.0V CMOS) + 1.3V/3.7V (para 5.0V CMOS) + + + + 0.8V/2.0V (for TTL) + 0.8V/2.0V (para TTL) + + + + pv::dialogs::Connect + + + &Scan for devices using driver above + E&scanea por dispositivos utilizando el controlador de arriba + + + + Connect to Device + Conectarse al dispositivo + + + + Step 1: Choose the driver + Paso 1: Elige el controlador + + + + &USB + &USB + + + + Serial &Port + &Puerto serial + + + + &TCP/IP + &TCP/IP + + + + Protocol: + Protocolo: + + + + Step 2: Choose the interface + Paso 2: Elige la interfaz + + + + Step 3: Scan for devices + Paso 3: Escanea por dispositivos + + + + Step 4: Select the device + Paso 4: Selecciona el dispositivo + + + + pv::dialogs::Settings + + + + General + General + + + + Views + Vistas + + + + + Decoders + Decodificadores + + + + About + Acerca de + + + + Logging + Registros + + + + User interface language + Idioma de la interfaz de usuario + + + + User interface theme + Tema de la interfaz de usuario + + + + (You may need to restart PulseView for all UI elements to update) + (Es posible que deba reiniciar PulseView para que se actualicen todos los elementos de la interfaz de usuario) + + + + System Default + Por defecto del sistema + + + + Qt widget style + Estilo de widget Qt + + + + (Dark themes look best with the Fusion style) + (Los temas oscuros se ven mejor con el estilo Fusion) + + + + Save session &setup along with .sr file + Guardar &configuración de sesión junto al archivo .sr + + + + Start acquisition for all open sessions when clicking 'Run' + Iniciar adquisición para todas las sesiones abiertas al dar clic en 'Ejecutar' + + + + Trace View + Vista de señales + + + + Use colored trace &background + Usar &fondo de trazos coloreado + + + + Constantly perform &zoom-to-fit during acquisition + Realizar constantemente zoom para &ajustar durante la adquisición + + + + Perform a zoom-to-&fit when acquisition stops + Realizar un zoom para ajustar cuando la adquisición se &detenga + + + Show time zero at the trigger + Mostrar el tiempo cero en el trigger + + + + Always keep &newest samples at the right edge during capture + Mantener siempre las muestras más &recientes en el borde derecho durante la captura + + + + Show data &sampling points + Mostrar puntos de datos mue&streados + + + Fill high areas of logic signals + Rellenar áreas altas de señales lógicas + + + + Show time zero at the &trigger + Mostrar tiempo cero en el &disparo + + + + Allow &vertical dragging in the view area + Permitir arrastre &vertical in el área de vista + + + + Fill &high areas of logic signals + Llenar áreas en &alto de señales lógicas + + + + Color to fill high areas of logic signals with + Color para llenar áreas altas de señales lógicas + + + + Show analog minor grid in addition to div grid + Mostrar cuadrícula menor analógica además de cuadrícula por división + + + + Highlight mouse cursor using a vertical marker line + Resaltar el cursor del mouse usando una línea de marcador vertical + + + + Keep active item on ruler selected when editing popup is closed + Mantener el elemento activo seleccionado en la regla cuando se cierre la ventana de edición emergente + + + + + + pixels + píxeles + + + + Maximum distance from edges before markers snap to them + Distancia máxima desde los bordes antes de que los marcadores se ajusten a ellos + + + + Color to fill cursor area with + Color para llenar el área del cursor + + + + None + Ninguna + + + + Background + Fondo + + + + Dots + Puntos + + + + Conversion threshold display mode (analog traces only) + Modo de visualización del umbral de conversión (solo trazos analógicos) + + + + Default analog trace div height + Altura de división de trazo analógico por defecto + + + + Default logic trace height + Altura de trazo lógico por defecto + + + + Allow configuration of &initial signal state + Permitir configuración de estado de señal &inicial + + + + Always show all &rows, even if no annotation is visible + Mostrar siempre todas las &filas, incluso si no hay ninguna anotación visible + + + + Annotation export format + Formato de exportación de anotaciones + + + + %s = sample range; %d: decoder name; %r: row name; %c: class name + %s = rango de muestra; %d: nombre del decodificador; %r: nombre de fila; %c: nombre de clase + + + + %1: longest annotation text; %a: all annotation texts; %q: use quotation marks + %1: texto de anotación más largo; %a: todos los textos de anotación; %q: use comillas + + + + %1<br /><a href="http://%2">%2</a> + %1<br /><a href="http://%2">%2</a> + + + + GNU GPL, version 3 or later + GNU GPL, versión 3 o posterior + + + + Versions, libraries and features: + Versiones, bibliotecas y características: + + + + Firmware search paths: + Rutas de búsqueda de firmware: + + + + Protocol decoder search paths: + Ruta de búsqueda del decodificador de protocolo: + + + + <tr><td colspan="2">(Note: Set environment variable SIGROKDECODE_DIR to add a custom directory)</td></tr> + <tr> <td colspan = "2"> (Nota: Establecer variable de entorno SIGROKDECODE_DIR para agregar un directorio personalizado) </td> </tr> + + + + Supported hardware drivers: + Controladores de hardware soportados: + + + + Supported input formats: + Formatos de entrada soportados: + + + + Supported output formats: + Formatos de salida soportados: + + + + Supported protocol decoders: + Decodificadores de protocolo soportados: + + + + Available Translations: + Traducciones disponibles: + + + + Log level: + Nivel de registro: + + + + lines + líneas + + + + Length of background buffer: + Longitud del búfer de fondo: + + + + &Save to File + &Guardar en archivo + + + + &Pop out + Des&plegar + + + + You selected a dark theme. +Should I set the user-adjustable colors to better suit your choice? + +Please keep in mind that PulseView may need a restart to display correctly. + Seleccionaste un tema oscuro. +¿Debería de establecer los colores ajustables por el usuario a los que mejor se ajustan a tu elección? + +Por favor ten en cuenta que Pulseview tal vez se tenga que reiniciar para mostrarse correctamente. + + + + You selected a bright theme. +Should I set the user-adjustable colors to better suit your choice? + +Please keep in mind that PulseView may need a restart to display correctly. + Seleccionaste un tema claro. +¿Debería de establecer los colores ajustables por el usuario a los que mejor se ajustan a tu elección? + +Por favor ten en cuenta que Pulseview tal vez se tenga que reiniciar para mostrarse correctamente. + + + + Save Log + Guardar registro + + + + Log Files (*.txt *.log);;All Files (*) + Archivos de registro (*.txt *.log);;Todos los archivos (*) + + + + Success + Éxito + + + + Log saved to %1. + Registro guardado en %1. + + + + Error + Error + + + + File %1 could not be written to. + No se pudo escribir en el archivo%1. + + + + %1 Log + %1 Log + + + + pv::dialogs::StoreProgress + + + Saving... + Guardando... + + + + Cancel + Cancelar + + + + Failed to save session. + Error al guardar sesión. + + + + pv::popups::Channels + + + + + + All + Todo + + + + + Logic + Lógico + + + + + Analog + Análogico + + + + Named + Nombrado + + + + Unnamed + Sin nombre + + + + Changing + Cambiando + + + + Non-changing + Sin cambios + + + + Disable: + Deshabilitar: + + + + Enable: + Habilitar: + + + + + None + Ninguna + + + + pv::prop::Bool + + + + Querying config key %1 resulted in %2 + La consulta de la clave de configuración %1 resultó en %2 + + + + pv::prop::Double + + + + Querying config key %1 resulted in %2 + La consulta de la clave de configuración %1 resultó en %2 + + + + pv::prop::Enum + + + + Querying config key %1 resulted in %2 + La consulta de la clave de configuración %1 resultó en %2 + + + + pv::prop::Int + + + + Querying config key %1 resulted in %2 + La consulta de la clave de configuración %1 resultó en %2 + + + + pv::prop::String + + + + Querying config key %1 resulted in %2 + La consulta de la clave de configuración %1 resultó en %2 + + + + pv::subwindows::decoder_selector::DecoderCollectionModel + + + Decoder + Decodificador + + + + Name + Nombre + + + + ID + ID + + + + All Decoders + Todos los decodificadores + + + + pv::subwindows::decoder_selector::SubWindow + + + Select a decoder to see its description here. + Selecciona un decodificador para ver su descripción aquí. + + + + , %1 + , %1 + + + + <p align='right'>Tags: %1</p> + <p align='right'>Etiquetas: %1</p> + + + + Protocol decoder <b>%1</b> requires input type <b>%2</b> which several decoders provide.<br>Choose which one to use:<br> + Decodificador de protocolo <b>%1</b> requiere tipo de entrada <b>%2</b> que proporcionan varios decodificadores.<br>Elige cúal usar:<br> + + + + Choose Decoder + Elige decodificador + + + + pv::toolbars::MainBar + + + New &View + Nueva &Vista + + + + &Open... + &Abrir... + + + + Restore Session Setu&p... + Restaurar Configu&ración de Sesión... + + + &Save As... + G&uardar Como... + + + + &Save... + &Guardar... + + + + Save &As... + Guardar Como... + + + + Save Selected &Range As... + Guardar &Rango Seleccionado Como... + + + + Save Session Setu&p... + Guardar Confi&guración de Sesión... + + + + &Export + &Exportar + + + + &Import + &Importar + + + + &Connect to Device... + &Conectar a Dispositivo... + + + + Add protocol decoder + Agregar decodificador de protocolo + + + + Add math signal + Agregar señal matemática + + + + Configure Device + Configurar Dispositivo + + + + Configure Channels + Configurar Canales + + + + Failed to get sample rate list: + Error al obtener la lista de frecuencia de muestreo: + + + + Failed to get sample rate: + Error al obtener la frecuencia de muestreo: + + + + Failed to get sample limit list: + Error al obtener la lista de límites de muestra: + + + + Failed to configure samplerate: + Error al configurar frecuencia de muestreo: + + + + Failed to configure sample count: + Error al configurar cuenta de muestras: + + + + Missing Cursors + Cursores Faltantes + + + + You need to set the cursors before you can save the data enclosed by them to a session file (e.g. using the Show Cursors button). + Debes configurar los cursores antes de poder guardar los datos encerrados en un archivo de sesión (por ejemplo, usando el botón Mostrar Cursores). + + + + Invalid Range + Rango Inválido + + + + The cursors don't define a valid range of samples. + Los cursores no definen un rango válido de muestras. + + + + %1 files + %1 archivos + + + + + All Files + Todos los archivos + + + + + Save File + Guardar Archivo + + + + Export %1 + Exportar %1 + + + + %1 files + %1 archivos + + + + Import File + Importar Archivo + + + + Import %1 + Importar %1 + + + + + Open File + Abrir Archivo + + + + sigrok Sessions (*.sr);;All Files (*) + Sesiones sigrok (*sr);;Todos los archivos (*) + + + + + PulseView Session Setups (*.pvs);;All Files (*) + Configurciones de Sesión de PulseView (*.pvs);;Todos los Archivos (*) + + + + Total sampling time: %1 + Tiempo de muestreo total: %1 + + + + pv::views::decoder_binary::View + + + Decoder: + Decodificador: + + + + Show data as + Muestra datos como + + + + Hexdump + Volcado hexadecimal + + + + &Save... + &Guardar... + + + + + Save Binary Data + Guardar Datos Binarios + + + + Binary Data Files (*.bin);;All Files (*) + Archivos de Datos Binarios (*.bin);;Todos los archivos (*) + + + + + Error + Error + + + + + File %1 could not be written to. + No se pudo escribir en el archivo%1. + + + + Hex Dumps (*.txt);;All Files (*) + Volcados hexadecimales (*.txt);;Todos los archivos (*) + + + + pv::views::tabular_decoder::AnnotationCollectionModel + + + Sample + Muestra + + + + Time + Tiempo + + + + Decoder + Decodificador + + + + Ann Row + Fila de anotación + + + + Ann Class + Clase de anotación + + + + Value + Valor + + + + s + s + + + + sa + sa + + + + pv::views::tabular_decoder::View + + + Decoder: + Decodificador: + + + + Hide Hidden Rows/Classes + Ocultar Filas/Columnas ocultas + + + + &Save... + &Guardar... + + + + Save Annotations as CSV + Guardar anotaciones como CSV + + + + CSV Files (*.csv);;Text Files (*.txt);;All Files (*) + Archivos CSV (*.csv);;Archivos de texto (*.txt);;Todos los archivos (*) + + + + Error + Error + + + + File %1 could not be written to. + No se pudo escribir en el archivo%1. + + + + pv::views::trace::AnalogSignal + + + Number of pos vertical divs + Número de divisiones verticales positivas + + + + Number of neg vertical divs + Número de divisiones verticales negativas + + + + pixels + píxeles + + + + Div height + Altura de división + + + + V/div + V/división + + + + Vertical resolution + Resolución vertical + + + + Autoranging + Autorango + + + + none + ninguna + + + + to logic via threshold + a nivel lógico a partir de umbral + + + + to logic via schmitt-trigger + a nivel lógico a partir de schmitt-trigger + + + + Conversion + Conversión + + + + Conversion threshold(s) + Umbral(es) de conversión + + + + analog + señal análogica + + + + converted + señal convertida + + + + analog+converted + señales analógica + convertida + + + + Show traces for + Mostrar trazos de + + + + pv::views::trace::Cursor + + + Disable snapping + Deshabilita snapping + + + + pv::views::trace::CursorPair + + + Display interval + Mostrar intervalo + + + + Display frequency + Mostrar frecuencia + + + + Display samples + Mostrar muestras + + + + pv::views::trace::DecodeTrace + + + <p><i>No decoders in the stack</i></p> + <p><i>No hay decodificadores en la pila.</i></p> + + + + <i>* Required channels</i> + <i>* Canales requeridos</i> + + + + Stack Decoder + Apilar Decodificador + + + + Stack a higher-level decoder on top of this one + Apilar un decodificador de nivel superior encima de este + + + + Delete + Eliminar + + + + Resume decoding + Reanudar decodificación + + + + Pause decoding + Pausar decodificación + + + + Copy annotation text to clipboard + Copiar texto de anotación al portapapeles + + + + Export all annotations + Exportar todas las anotaciones + + + + Export all annotations for this row + Exportar todas las anotaciones para esta fila + + + + Export all annotations, starting here + Exportar todas las anotaciones, comenzando aquí + + + + Export annotations for this row, starting here + Exportar todas las anotaciones para esta fila, comenzando aquí + + + + Export all annotations within cursor range + Exportar todas las anotaciones dentro del rango del cursor + + + + Export annotations for this row within cursor range + Exportar todas las anotaciones para esta fila dentro del rango del cursor + + + + %1: +%2 + %1\n%2 + + + + <b>%1</b> (%2) %3 + <b>%1</b> (%2) %3 + + + + Export annotations + Exportar anotaciones + + + + Text Files (*.txt);;All Files (*) + Archivos de texto (*.txt);;Todos los archivos (*) + + + + Error + Error + + + + File %1 could not be written to. + No se pudo escribir en el archivo%1. + + + + Show this row + Mostrar esta fila + + + + Show All + Mostrar todo + + + + Hide All + Ocultar todo + + + + pv::views::trace::Flag + + + Text + Texto + + + + Delete + Eliminar + + + + Disable snapping + Deshabilitar snapping + + + + pv::views::trace::Header + + + Group + Grupo + + + + pv::views::trace::LogicSignal + + + No trigger + Sin trigger + + + + Trigger on rising edge + Trigger en flanco de subida + + + + Trigger on high level + Trigger en nivel alto + + + + Trigger on falling edge + Trigger en flanco de bajada + + + + Trigger on low level + Trigger en nivel bajo + + + + Trigger on rising or falling edge + Trigger en flanco de subida o bajada + + + + pixels + pixeles + + + + Trace height + Altura del trazo + + + + Trigger + Trigger + + + + pv::views::trace::MathEditDialog + + + Math Expression Editor + Editor de expresiones matemáticas + + + + Inputs: + Entradas: + + + + Variables: + Variables: + + + + Basic operators: + Operadores básicos: + + + + Assignments: + Asignaciones: + + + + General purpose functions: + Funciones de propósito general: + + + + abs(x) Absolute value of x + abs(x) Valor absoluto de x + + + + avg(x, y, ...) Average of all input values + avg(x, y, ...) Promedio de todos los valores de entrada + + + + ceil(x) Smallest integer that is greater than or equal to x + ceil(x) Entero más pequeño que es mayor o igual a x + + + + clamp(lb, x, ub) Clamp x in range between lb and ub, where lb < ub + clamp(lb, x, ub) Fija x en el rango entre lb y ub, donde lb < ub + + + + equal(x, y) Equality test between x and y using normalised epsilon + equal(x, y) Prueba de igualdad entre x e y usando epsilon normalizado + + + + erf(x) Error function of x + erf(x) Función error de x + + + + erfc(x) Complimentary error function of x + erfc(x) Función de error complementario de x + + + + exp(x) e to the power of x + exp(x) e a la potencia de x + + + + expm1(x) e to the power of x minus 1, where x is very small. + expm1(x) e a la potencia de x menos 1, donde z es muy pequeño. + + + + floor(x) Largest integer that is less than or equal to x + floor(x) Entero más grande que is menor o igual a x + + + + frac(x) Fractional portion of x + frac(x) Porción fraccional de x + + + + hypot(x) Hypotenuse of x and y (i.e. sqrt(x*x + y*y)) + hypot(x) Hipotenusa de x e y (es decir sqrt(x*x + y*y)) + + + + iclamp(lb, x, ub) Inverse-clamp x outside of the range lb and ub, where lb < ub. + If x is within the range it will snap to the closest bound + iclamp(lb, x, ub) Fijación inversa de x fuera del rango lb y ub, donde lb < ub. + Si x está en el rango se fijará al límite más cercano + + + + inrange(lb, x, ub) In-range returns true when x is within the range lb and ub, where lb < ub. + inrange(lb, x, ub) En-rango regresa verdadero cuando x está en el rango lb y ub, donde lb < ub. + + + + log(x) Natural logarithm of x + log(x) Logaritmo natural de x + + + + log10(x) Base 10 logarithm of x + log10(x) Logaritmo base 10 de x + + + + log1p(x) Natural logarithm of 1 + x, where x is very small + log1p(x) Logaritmo natural de 1 + x, donde x es muy pequeño + + + + log2(x) Base 2 logarithm of x + log2(x) Logaritmo base 2 de x + + + + logn(x) Base N logarithm of x, where n is a positive integer + logn(x) Logaritmo base N de x, donde n es un entero positivo + + + + max(x, y, ...) Largest value of all the inputs + max(x, y, ...) Valor más grande de todas las entradas + + + + min(x, y, ...) Smallest value of all the inputs + min(x, y, ...) Valor más pequeño de todas las entradas + + + + mul(x, y, ...) Product of all the inputs + mul(x, y, ...) Producto de todas las entradas + + + + ncdf(x) Normal cumulative distribution function + ncdf(x) Función de distribución acumulativa normal + + + + nequal(x, y) Not-equal test between x and y using normalised epsilon + nequal(x, y) Prueba de no igualdad entre x e y usando epsilon normalizado + + + + pow(x, y) x to the power of y + pow(x, y) x a la potencia de y + + + + root(x, n) Nth-Root of x, where n is a positive integer + root(x, n) Enésima raíz de x, donde n es un entero positivo + + + + round(x) Round x to the nearest integer + round(x) Redondear x al entero más cercano + + + + roundn(x, n) Round x to n decimal places, where n > 0 and is an integer + roundn(x, n) Redondear x a n lugares decimales, donde n > 0 y es un entero + + + + sgn(x) Sign of x; -1 if x < 0, +1 if x > 0, else zero + sgn(x) Sigon de x; -1 si x < 0, +1 si x > 0, otro cero + + + + sqrt(x) Square root of x, where x >= 0 + sqrt(x) Raíz cuadrada de x, donde x >= 0 + + + + sum(x, y, ..,) Sum of all the inputs + sum(x, y, ..,) Suma de todas las entradas + + + + swap(x, y) Swap the values of the variables x and y and return the current value of y + swap(x, y) Intercambia los valores de las variables x e y y regresa el valor actual de y + + + + trunc(x) Integer portion of x + trunc(x) Porción entera de x + + + + Trigonometry functions: + Funciones trigonométricas: + + + + acos(x) Arc cosine of x expressed in radians. Interval [-1,+1] + acos(x) Arco coseno de x expresado en radianes. Intervalo [-1,+1] + + + + acosh(x) Inverse hyperbolic cosine of x expressed in radians + acosh(x) Coseno hiperbólico inverso de x expresado en radianes + + + + asin(x) Arc sine of x expressed in radians. Interval [-1,+1] + asin(x) Arco seno de x expresado en radianes. Intervalo [-1,+1] + + + + asinh(x) Inverse hyperbolic sine of x expressed in radians + asinh(x) Seno hiperbólico inverso de x expresado en radianes + + + + atan(x) Arc tangent of x expressed in radians. Interval [-1,+1] + atan(x) Arco tangente de x expresado en radianes. Intervalo [-1,+1] + + + + atan2(x, y) Arc tangent of (x / y) expressed in radians. [-pi,+pi] + atan2(x, y) Arco tangente de (x / y) expresado en radianes. [-pi,+pi] + + + + atanh(x) Inverse hyperbolic tangent of x expressed in radians + atanh(x) Tangente hiperbólica inversa de x expresada en radianes + + + + cos(x) Cosine of x + cos(x) Coseno de x + + + + cosh(x) Hyperbolic cosine of x + cosh(x) Coseno hiperbólico de x + + + + cot(x) Cotangent of x + cot(x) Cotangente de x + + + + csc(x) Cosectant of x + csc(x) Cosecante de x + + + + sec(x) Secant of x + sec(x) Secante de x + + + + sin(x) Sine of x + sin(x) Seno de x + + + + sinc(x) Sine cardinal of x + sinc(x) Seno cardinal de x + + + + sinh(x) Hyperbolic sine of x + sinh(x) Seno hiperbólico de x + + + + tan(x) Tangent of x + tan(x) Tangente de x + + + + tanh(x) Hyperbolic tangent of x + tanh(x) Tangente hiperbólica de x + + + + deg2rad(x) Convert x from degrees to radians + deg2rad(x) Convierte x de grados sexagesimales a radianes + + + + deg2grad(x) Convert x from degrees to gradians + deg2grad(x) Convierte x de grados sexagesimales a grados centesimales + + + + rad2deg(x) Convert x from radians to degrees + rad2deg(x) Convierte x de radianes a grados sexagesimales + + + + grad2deg(x) Convert x from gradians to degrees + grad2deg(x) Convierte x de grados centesimales a grados sexagesimales + + + + Logic operators: + Operadores lógicos: + + + + Comparisons: + Comparaciones: + + + + x = y or x == y True only if x is strictly equal to y + x = y o x == y Verdadero solo si x es estrictemente igual a y + + + + x <> y or x != y True only if x does not equal y + x <> y o x != y Verdadero solo si x no es igual a y + + + + x < y True only if x is less than y + x < y Verdadero solo si x es menor que y + + + + x <= y True only if x is less than or equal to y + x <= y Verdadero solo si x es menor o igual a y + + + + x > y True only if x is greater than y + x > y Verdadero solo si x es mayor que y + + + + x >= y True only if x is greater than or equal to y + x >= y Verdadero solo si x es mayor o igual a y + + + + Flow control: + Fujo de cotrol: + + + + { ... } Beginning and end of instruction block + { ... } Inicio y fin de un bloque de instrucciones + + + + if (x, y, z) If x is true then return y else return z +if (x) y; variant without implied else +if (x) { y }; variant with an instruction block +if (x) y; else z; variant with explicit else +if (x) { y } else { z }; variant with instruction blocks + if (x, y, z) Si x es verdadero entonces regresa y si no regresa z +if (x) y; variante sin si no implicado +if (x) { y }; variante con un bloque de instrucción +if (x) y; else z; variante con si no explícito +if (x) { y } else { z }; variante con bloques de instrucciones + + + + x ? y : z Ternary operator, equivalent to 'if (x, y, z)' + x ? y : z Operador ternario, equivalente a 'if (x, y, z)' + + + + switch { The first true case condition that is encountered will + case x > 1: a; determine the result of the switch. If none of the case + case x < 1: b; conditions hold true, the default action is used + default: c; to determine the return value +} + switch { La primera condición de caso verdadera que es encontrada + case x > 1: a; determina el resultado del interruptor. Si ninguno de las condiciones de + case x < 1: b; los casos se mantienen verdaderas, la acción predeterminada se usa + default: c; para determinar el valor de retorno +} + + + + while (conditon) { Evaluates expression repeatedly as long as condition is true, + expression; returning the last value of expression +} + while (conditon) { Evalúa la expresión repetidamente siempre que la condición sea verdadera, +expresión; devuelve el último valor de la expresión +} + + + + repeat Evalues expression repeatedly as long as condition is false, + expression; returning the last value of expression +until (condition) + + repeat Evalúa la expresión repetidamente siempre que la condición sea falsa +expresión; devuelve el último valor de la expresión +hasta que (condición) + + + + + for (var x := 0; condition; x += 1) { Repeatedly evaluates expression while the condition is true, + expression while evaluating the 'increment' expression on each loop +} + for (var x := 0; condición; x += 1) { Evalua repetidamente la expresión mientras la condición sea verdadera, + expresión mientras se evalúa la expresión de 'incremento' en cada bucle +} + + + + break Terminates the execution of the nearest enclosed loop, returning NaN + break Finaliza la ejecución del bucle cerrado más cercano, devolviendo NaN + + + + break[x] Terminates the execution of the nearest enclosed loop, returning x + break[x] Finaliza la ejecución del bucle cerrado más cercano, devolviendo x + + + + continue Interrupts loop execution and resumes with the next loop iteration + continue Interrumpe la ejecución del bucle y se reanuda con la siguiente iteración de bucle + + + + return[x] Returns immediately from within the current expression, returning x + return[x] Devuelve inmediatamente desde la expresión actual, regresando x + + + + ~(expr; expr; ...) Evaluates each sub-expression and returns the value of the last one +~{expr; expr; ...} + ~(expr; expr; ...) Evalúa cada subexpresión y devuelve el valor de la última +~{expr; expr; ...} + + + + Copy to expression + Copiar a expresión + + + + Basics + Básicas + + + + Functions 1 + Funciones 1 + + + + Functions 2 + Funciones 2 + + + + Trigonometry + Trigonometría + + + + Logic + Lógica + + + + Flow Control 1 + Flujo de control 1 + + + + Flow Control 2 + Flujo de control 2 + + + + Examples + Ejemplos + + + + pv::views::trace::MathSignal + + + Expression + Espresión + + + + + same as session + igual que la sesión + + + + + 100 + 100 + + + + + 10000 + 10000 + + + + + 1000000 + 1000000 + + + + Number of Samples + Número de muestras + + + + Sample rate + Tasa de muestreo + + + + pv::views::trace::Ruler + + + Create marker here + Crear marcador aquí + + + + Set as zero point + Establecer como punto cero + + + + Reset zero point + Reiniciar punto cero + + + + Disable mouse hover marker + Deshabilitar marcador de desplazamiento del ratón + + + + Enable mouse hover marker + Habilitar marcador de desplazamiento del ratón + + + + pv::views::trace::Signal + + + Name + Nombre + + + + Remove + Eliminar + + + + Disable + Deshabilitar + + + + pv::views::trace::StandardBar + + + Zoom &In + &Acercar + + + + Zoom &Out + A&lejar + + + + Zoom to &Fit + Hacer Zoom para &Encajar + + + + Show &Cursors + Mostrar &Cursores + + + + Display last segment only + Mostrar solo el último segmento + + + + Display last complete segment only + Mostrar solo el último segmento completo + + + + Display a single segment + Mostrar un solo segmento + + + + pv::views::trace::TimeMarker + + + Time + Tiempo + + + + pv::views::trace::Trace + + + Create marker here + Crear marcador aquí + + + + Color + Color + + + + Name + Nombre + + + + pv::views::trace::TraceGroup + + + Ungroup + Desagrupar + + + + pv::views::trace::View + + + Create marker here + Crear marcador aquí + + + + pv::widgets::DecoderGroupBox + + + Show/hide this decoder trace + Mostrar/ocultar este trazo de decodificador + + + + Delete this decoder trace + Eliminar este trazo de decodificador + + + + pv::widgets::DeviceToolButton + + + + <No Device> + <Sin dispositivo> + + + + pv::widgets::ExportMenu + + + Export %1... + Exportar %1... + + + + pv::widgets::ImportMenu + + + Import %1... + Importar %1... + + + diff --git a/l10n/ja_jp.ts b/l10n/ja_jp.ts new file mode 100644 index 00000000..164ea30f --- /dev/null +++ b/l10n/ja_jp.ts @@ -0,0 +1,2201 @@ + + + + + Application + + + Some parts of the application may still use the previous language. Re-opening the affected windows or restarting the application will remedy this. + アプリケーションの一部では、以前の言語が引き続き使用される場合があります。 影響を受けたウィンドウを再度開くか、アプリケーションを再起動すると、これが改善されます。 + + + + QApplication + + + Error when scanning device driver '%1': %2 + デバイスドライバ'%1'をスキャンするときにエラーが発生しました:%2 + + + + Querying config key %1 is not allowed + + + + + Querying config key %1 resulted in %2 + + + + + Unknown type supplied when attempting to query %1 + + + + + QHexView + + + No data available + データなし + + + + QObject + + + Stack trace of previous crash: + + + + + Don't show this message again + このメッセージを二度と表示しない + + + + When %1 last crashed, it created a stack trace. +A human-readable form has been saved to disk and was written to the log. You may access it from the settings dialog. + %1が最後にクラッシュしたとき、スタックトレースが作成されました。 +人間が読める形式がディスクに保存され、ログに書き込まれました。 設定ダイアログからアクセスできます。 + + + + Cancel + キャンセル + + + + Scanning for devices that driver %1 can access... + ドライバー %1 がアクセスできるデバイスをスキャンしています... + + + + pv::MainWindow + + + PulseView + + + + + Decoder Selector + デコーダー選択 + + + + Session %1 + セッション %1 + + + + Create New Session + 新規セッションを作成 + + + + Start/Stop Acquisition + 取得の開始/停止 + + + + Settings + 設定 + + + + Reload + 再読込 + + + + + Run + 実行 + + + + Stop + 停止 + + + + + + Confirmation + 確認 + + + + There is unsaved data. Close anyway? + 保存されていないデータがあります。 閉じますか? + + + + + This session contains unsaved data. Close it anyway? + このセッションには、保存されていないデータが含まれています。 閉じますか? + + + + pv::Session + + + Can't restore generated signal of unknown type %1 (%2) + 不明なタイプ%1 (%2)の生成された信号を復元できません + + + + Failed to select device + デバイスの選択に失敗しました + + + + Failed to open device + デバイスを開くことができませんでした + + + + Error + エラー + + + + Unexpected input format: %1 + 予期しない入力形式:%1% + + + + Failed to load %1 + %1 のロードに失敗しました + + + + No active device set, can't start acquisition. + アクティブなデバイスが設定されていないため、取得を開始できません。 + + + + No channels enabled. + チャネルが有効になっていません。 + + + + Out of memory, acquisition stopped. + メモリが不足しているため、取得が停止しました。 + + + + Can't handle more than 64 logic channels. + 64を超えるロジックチャネルを処理することはできません。 + + + + pv::StoreSession + + + Can't save logic channel without data. + データなしでロジックチャネルを保存することはできません。 + + + + Can't save analog channel without data. + データなしでアナログチャンネルを保存することはできません。 + + + + No channels enabled. + チャネルが有効になっていません。 + + + + Can't save range without sample data. + サンプルデータなしでは範囲を保存できません。 + + + + + + Error while saving: + 保存中のエラー: + + + + pv::binding::Device + + + Note for device developers: Ignoring device configuration capability '%1' as it is missing GET and/or SET + デバイス開発者への注意:GETやSETがないため、デバイス構成機能'%1'を無視します + + + + No Limit + + + + + pv::data::DecodeSignal + + + No decoders + デコーダーなし + + + + There are no channels assigned to this decoder + このデコーダーに割り当てられたチャネルはありません + + + + One or more required channels have not been specified + 1つ以上の必要なチャネルが指定されていません + + + + No input data + 入力データなし + + + + Decoder reported an error + デコーダーがエラーを報告しました + + + + Failed to create decoder instance + デコーダーインスタンスの作成に失敗しました + + + + pv::data::MathSignal + + + Math%1 + + + + + No expression defined, nothing to do + 式は定義されていません、何もしません + + + + %1 at line %2, column %3: %4 + %1 行 %2, 列 %3: %4 + + + + + "%1" isn't a valid analog signal + "%1" は有効なアナログ信号ではありません + + + + + No data will be generated as %1 must be enabled + %1を有効にする必要があるため、データは生成されません + + + + pv::data::SignalBase + + + Signal average + + + + + 0.9V (for 1.8V CMOS) + + + + + 1.8V (for 3.3V CMOS) + + + + + 2.5V (for 5.0V CMOS) + + + + + 1.5V (for TTL) + + + + + Signal average +/- 15% + + + + + 0.3V/1.2V (for 1.8V CMOS) + + + + + 0.7V/2.5V (for 3.3V CMOS) + + + + + 1.3V/3.7V (for 5.0V CMOS) + + + + + 0.8V/2.0V (for TTL) + + + + + pv::dialogs::Connect + + + &Scan for devices using driver above + 上記のドライバーを使用してデバイスをスキャンする + + + + Connect to Device + デバイスに接続 + + + + Step 1: Choose the driver + ステップ1:ドライバーを選択 + + + + &USB + + + + + Serial &Port + + + + + &TCP/IP + + + + + Protocol: + + + + + Step 2: Choose the interface + ステップ2:インターフェースを選択 + + + + Step 3: Scan for devices + ステップ3:デバイスをスキャン + + + + Step 4: Select the device + ステップ4:デバイスを選択 + + + + pv::dialogs::Settings + + + + General + 全般 + + + + Views + 表示 + + + + + Decoders + デコーダー + + + + About + + + + + Logging + ロギング + + + + User interface language + 表示言語 + + + + User interface theme + 表示のテーマ + + + + (You may need to restart PulseView for all UI elements to update) + (すべてのUI要素を更新するには、PulseViewを再起動する必要がある場合があります) + + + + System Default + システムのデフォルト + + + + Qt widget style + Qt widget スタイル + + + + (Dark themes look best with the Fusion style) + (ダークテーマはFusionスタイルで最もよく見えます) + + + + Save session &setup along with .sr file + セッション設定を.srファイルと一緒に保存します + + + + Start acquisition for all open sessions when clicking 'Run' + [実行]をクリックすると、開いているすべてのセッションの取得を開始します + + + + Trace View + トレースビュー + + + + Use colored trace &background + 色付きのトレースと背景を使用する(&b) + + + + Constantly perform &zoom-to-fit during acquisition + 取得中は常にズームツーフィットを実行します(&z) + + + + Perform a zoom-to-&fit when acquisition stops + 取得が停止したときにズームツーフィットする(&f) + + + + Show time zero at the &trigger + トリガーで時間ゼロを表示する(&t) + + + + Always keep &newest samples at the right edge during capture + キャプチャ中は常に最新のサンプルを右端に保持(&n) + + + + Allow &vertical dragging in the view area + ビューエリアでの垂直方向のドラッグを許可する(&v) + + + + Show data &sampling points + データサンプリングポイントを表示する(&s) + + + + Fill &high areas of logic signals + ロジック信号の高い領域を埋める(&h) + + + + Color to fill high areas of logic signals with + 論理信号の高い領域を塗りつぶす色 + + + + Show analog minor grid in addition to div grid + divグリッドに加えてアナログマイナーグリッドを表示する + + + + Highlight mouse cursor using a vertical marker line + 垂直マーカーラインを使用してマウスカーソルを強調表示します + + + + + + pixels + + + + + Maximum distance from edges before markers snap to them + マーカーがエッジにスナップする前のエッジからの最大距離 + + + + Color to fill cursor area with + カーソル領域を塗りつぶす色 + + + + None + + + + + Background + + + + + Dots + + + + + Conversion threshold display mode (analog traces only) + 変換閾値表示モード(アナログトレースのみ) + + + + Default analog trace div height + デフォルトのアナログトレースdivの高さ + + + + Default logic trace height + デフォルトのロジックトレースの高さ + + + + Allow configuration of &initial signal state + 初期信号状態の構成を許可する(&i) + + + + Always show all &rows, even if no annotation is visible + 注釈が表示されていない場合でも、常にすべての行を表示します(&r) + + + + Annotation export format + 注釈のエクスポート形式 + + + + %s = sample range; %d: decoder name; %r: row name; %c: class name + %s = サンプル範囲; %d: デコーダー名; %r: 行名; %c: クラス名 + + + + %1: longest annotation text; %a: all annotation texts; %q: use quotation marks + %1: 最長の注釈テキスト; %a: すべての注釈テキスト; %q: 引用符を使用 + + + + %1<br /><a href="http://%2">%2</a> + + + + + GNU GPL, version 3 or later + + + + + Versions, libraries and features: + + + + + Firmware search paths: + + + + + Protocol decoder search paths: + プロトコルデコーダの検索パス: + + + + <tr><td colspan="2">(Note: Set environment variable SIGROKDECODE_DIR to add a custom directory)</td></tr> + + + + + Supported hardware drivers: + + + + + Supported input formats: + + + + + Supported output formats: + + + + + Supported protocol decoders: + + + + + Available Translations: + + + + + Log level: + ログレベル: + + + + lines + 行数 + + + + Length of background buffer: + バックグラウンドバッファの長さ: + + + + &Save to File + ファイルに保存(&S) + + + + &Pop out + + + + + You selected a dark theme. +Should I set the user-adjustable colors to better suit your choice? + +Please keep in mind that PulseView may need a restart to display correctly. + ダークテーマを選択しました。 +選択に合わせてユーザー調整可能な色を設定する必要があります + +正しく表示するには、PulseViewを再起動する必要がある場合があることに注意してください。 + + + + You selected a bright theme. +Should I set the user-adjustable colors to better suit your choice? + +Please keep in mind that PulseView may need a restart to display correctly. + 明るいテーマを選択しました。 +選択に合わせてユーザー調整可能な色を設定する必要があります + +正しく表示するには、PulseViewを再起動する必要がある場合があることに注意してください。 + + + + Save Log + ログ保存 + + + + Log Files (*.txt *.log);;All Files (*) + + + + + Success + 成功 + + + + Log saved to %1. + ログは %1 に保存されました。 + + + + Error + エラー + + + + File %1 could not be written to. + ファイル %1 に書き込めませんでした。 + + + + %1 Log + %1 ログ + + + + pv::dialogs::StoreProgress + + + Saving... + 保存中... + + + + Cancel + キャンセル + + + + Failed to save session. + セッションの保存に失敗しました。 + + + + pv::popups::Channels + + + + + + All + + + + + + Logic + + + + + + Analog + + + + + Named + + + + + Unnamed + + + + + Changing + + + + + Non-changing + + + + + Disable: + + + + + Enable: + + + + + + None + + + + + pv::prop::Bool + + + + Querying config key %1 resulted in %2 + + + + + pv::prop::Double + + + + Querying config key %1 resulted in %2 + + + + + pv::prop::Enum + + + + Querying config key %1 resulted in %2 + + + + + pv::prop::Int + + + + Querying config key %1 resulted in %2 + + + + + pv::prop::String + + + + Querying config key %1 resulted in %2 + + + + + pv::subwindows::decoder_selector::DecoderCollectionModel + + + Decoder + デコーダー + + + + Name + 名前 + + + + ID + + + + + All Decoders + + + + + pv::subwindows::decoder_selector::SubWindow + + + Select a decoder to see its description here. + ここに説明を表示するには、デコーダーを選択してください。 + + + + , %1 + + + + + <p align='right'>Tags: %1</p> + + + + + Protocol decoder <b>%1</b> requires input type <b>%2</b> which several decoders provide.<br>Choose which one to use:<br> + + + + + Choose Decoder + デコーダーを選択 + + + + pv::toolbars::MainBar + + + New &View + 新しいビュー(&V) + + + + &Open... + 開く(&O)... + + + + Restore Session Setu&p... + セッション設定を復元(&p)... + + + + &Save... + 保存(&S)... + + + + Save &As... + 名前をつけて保存(&A)... + + + + Save Selected &Range As... + 選択した範囲を名前を付けて保存(&R)... + + + + Save Session Setu&p... + セッション設定を保存(&p)... + + + + &Export + エクスポート(&E) + + + + &Import + インポート(&I) + + + + &Connect to Device... + デバイスへ接続(&C)... + + + + Add protocol decoder + プロトコルデコーダーを追加 + + + + Add math signal + math信号を追加 + + + + Configure Device + デバイスの構成 + + + + Configure Channels + チャンネルの構成 + + + + Failed to get sample rate list: + + + + + Failed to get sample rate: + + + + + Failed to get sample limit list: + + + + + Failed to configure samplerate: + + + + + Failed to configure sample count: + + + + + Missing Cursors + カーソルがありません + + + + You need to set the cursors before you can save the data enclosed by them to a session file (e.g. using the Show Cursors button). + カーソルで囲まれたデータをセッションファイルに保存する前に、カーソルを設定する必要があります(たとえば、[カーソルの表示]ボタンを使用)。 + + + + Invalid Range + 範囲が無効です + + + + The cursors don't define a valid range of samples. + カーソルはサンプルの有効な範囲を定義していません。 + + + + %1 files + + + + + + All Files + すべてのファイル + + + + + Save File + ファイル保存 + + + + Export %1 + エクスポート %1 + + + + %1 files + + + + + Import File + インポートファイル + + + + Import %1 + インポート %1 + + + + + Open File + ファイルを開く + + + + sigrok Sessions (*.sr);;All Files (*) + + + + + + PulseView Session Setups (*.pvs);;All Files (*) + + + + + Total sampling time: %1 + 総サンプリング時間: %1 + + + + pv::views::decoder_binary::View + + + Decoder: + デコーダー: + + + + Show data as + データ表示形式 + + + + Hexdump + 16進ダンプ + + + + &Save... + 保存(&S) + + + + + Save Binary Data + バイナリデータを保存 + + + + Binary Data Files (*.bin);;All Files (*) + + + + + + Error + エラー + + + + + File %1 could not be written to. + ファイル%1に書き込めませんでした。 + + + + Hex Dumps (*.txt);;All Files (*) + + + + + pv::views::tabular_decoder::AnnotationCollectionModel + + + Sample + サンプル + + + + Time + 時間 + + + + Decoder + デコーダー + + + + Ann Row + + + + + Ann Class + + + + + Value + 値 + + + + s + + + + + sa + + + + + pv::views::tabular_decoder::View + + + Decoder: + デコーダー: + + + + Hide Hidden Rows/Classes + + + + + &Save... + 保存(&S) + + + + Save Annotations as CSV + 注釈をCSVとして保存 + + + + CSV Files (*.csv);;Text Files (*.txt);;All Files (*) + + + + + Error + エラー + + + + File %1 could not be written to. + ファイル%1に書き込めませんでした。 + + + + pv::views::trace::AnalogSignal + + + Number of pos vertical divs + 正の垂直divの数 + + + + Number of neg vertical divs + 負の垂直divの数 + + + + pixels + + + + + Div height + Divの高さ + + + + V/div + + + + + Vertical resolution + 垂直解像度 + + + + Autoranging + オートレンジ + + + + none + なし + + + + to logic via threshold + 閾値でロジック変換 + + + + to logic via schmitt-trigger + シュミットトリガーでロジック変換 + + + + Conversion + 変換 + + + + Conversion threshold(s) + 変換閾値 + + + + analog + アナログ + + + + converted + 変換済 + + + + analog+converted + アナログ+変換済 + + + + Show traces for + トレースを表示 + + + + pv::views::trace::Cursor + + + Disable snapping + スナップを無効にする + + + + pv::views::trace::CursorPair + + + Display interval + 間隔表示 + + + + Display frequency + 周波数表示 + + + + Display samples + サンプル数表示 + + + + pv::views::trace::DecodeTrace + + + <p><i>No decoders in the stack</i></p> + + + + + <i>* Required channels</i> + + + + + Stack Decoder + + + + + Stack a higher-level decoder on top of this one + この上に高レベルのデコーダーをスタック + + + + Delete + 削除 + + + + Resume decoding + デコードを再開 + + + + Pause decoding + デコードを一時中断 + + + + Copy annotation text to clipboard + 注釈テキストをクリップボードにコピー + + + + Export all annotations + すべての注釈をエクスポート + + + + Export all annotations for this row + この行のすべての注釈をエクスポート + + + + Export all annotations, starting here + ここから始めて、すべての注釈をエクスポート + + + + Export annotations for this row, starting here + ここから始めて、この行の注釈をエクスポート + + + + Export all annotations within cursor range + カーソル範囲内のすべての注釈をエクスポート + + + + Export annotations for this row within cursor range + カーソル範囲内のこの行の注釈をエクスポート + + + + %1: +%2 + + + + + <b>%1</b> (%2) %3 + + + + + Export annotations + 注釈をエクスポート + + + + Text Files (*.txt);;All Files (*) + + + + + Error + エラー + + + + File %1 could not be written to. + ファイル%1に書き込めませんでした。 + + + + Show this row + この行を表示 + + + + Show All + すべて表示 + + + + Hide All + すべて非表示 + + + + pv::views::trace::Flag + + + Text + テキスト + + + + Delete + 削除 + + + + Disable snapping + スナップを無効 + + + + pv::views::trace::Header + + + Group + グループ + + + + pv::views::trace::LogicSignal + + + No trigger + + + + + Trigger on rising edge + + + + + Trigger on high level + + + + + Trigger on falling edge + + + + + Trigger on low level + + + + + Trigger on rising or falling edge + + + + + pixels + + + + + Trace height + トレースの高さ + + + + Trigger + トリガー + + + + pv::views::trace::MathEditDialog + + + Math Expression Editor + 数式エディタ + + + + Inputs: + 入力: + + + + Variables: + 変数: + + + + Basic operators: + 基本的な演算子: + + + + Assignments: + 割り当て: + + + + General purpose functions: + 汎用機能: + + + + abs(x) Absolute value of x + + + + + avg(x, y, ...) Average of all input values + + + + + ceil(x) Smallest integer that is greater than or equal to x + + + + + clamp(lb, x, ub) Clamp x in range between lb and ub, where lb < ub + + + + + equal(x, y) Equality test between x and y using normalised epsilon + + + + + erf(x) Error function of x + + + + + erfc(x) Complimentary error function of x + + + + + exp(x) e to the power of x + + + + + expm1(x) e to the power of x minus 1, where x is very small. + + + + + floor(x) Largest integer that is less than or equal to x + + + + + frac(x) Fractional portion of x + + + + + hypot(x) Hypotenuse of x and y (i.e. sqrt(x*x + y*y)) + + + + + iclamp(lb, x, ub) Inverse-clamp x outside of the range lb and ub, where lb < ub. + If x is within the range it will snap to the closest bound + + + + + inrange(lb, x, ub) In-range returns true when x is within the range lb and ub, where lb < ub. + + + + + log(x) Natural logarithm of x + + + + + log10(x) Base 10 logarithm of x + + + + + log1p(x) Natural logarithm of 1 + x, where x is very small + + + + + log2(x) Base 2 logarithm of x + + + + + logn(x) Base N logarithm of x, where n is a positive integer + + + + + max(x, y, ...) Largest value of all the inputs + + + + + min(x, y, ...) Smallest value of all the inputs + + + + + mul(x, y, ...) Product of all the inputs + + + + + ncdf(x) Normal cumulative distribution function + + + + + nequal(x, y) Not-equal test between x and y using normalised epsilon + + + + + pow(x, y) x to the power of y + + + + + root(x, n) Nth-Root of x, where n is a positive integer + + + + + round(x) Round x to the nearest integer + + + + + roundn(x, n) Round x to n decimal places, where n > 0 and is an integer + + + + + sgn(x) Sign of x; -1 if x < 0, +1 if x > 0, else zero + + + + + sqrt(x) Square root of x, where x >= 0 + + + + + sum(x, y, ..,) Sum of all the inputs + + + + + swap(x, y) Swap the values of the variables x and y and return the current value of y + + + + + trunc(x) Integer portion of x + + + + + Trigonometry functions: + 三角関数: + + + + acos(x) Arc cosine of x expressed in radians. Interval [-1,+1] + + + + + acosh(x) Inverse hyperbolic cosine of x expressed in radians + + + + + asin(x) Arc sine of x expressed in radians. Interval [-1,+1] + + + + + asinh(x) Inverse hyperbolic sine of x expressed in radians + + + + + atan(x) Arc tangent of x expressed in radians. Interval [-1,+1] + + + + + atan2(x, y) Arc tangent of (x / y) expressed in radians. [-pi,+pi] + + + + + atanh(x) Inverse hyperbolic tangent of x expressed in radians + + + + + cos(x) Cosine of x + + + + + cosh(x) Hyperbolic cosine of x + + + + + cot(x) Cotangent of x + + + + + csc(x) Cosectant of x + + + + + sec(x) Secant of x + + + + + sin(x) Sine of x + + + + + sinc(x) Sine cardinal of x + + + + + sinh(x) Hyperbolic sine of x + + + + + tan(x) Tangent of x + + + + + tanh(x) Hyperbolic tangent of x + + + + + deg2rad(x) Convert x from degrees to radians + + + + + deg2grad(x) Convert x from degrees to gradians + + + + + rad2deg(x) Convert x from radians to degrees + + + + + grad2deg(x) Convert x from gradians to degrees + + + + + Logic operators: + 論理演算子: + + + + Comparisons: + 比較: + + + + x = y or x == y True only if x is strictly equal to y + + + + + x <> y or x != y True only if x does not equal y + + + + + x < y True only if x is less than y + + + + + x <= y True only if x is less than or equal to y + + + + + x > y True only if x is greater than y + + + + + x >= y True only if x is greater than or equal to y + + + + + Flow control: + フロー制御: + + + + { ... } Beginning and end of instruction block + + + + + if (x, y, z) If x is true then return y else return z +if (x) y; variant without implied else +if (x) { y }; variant with an instruction block +if (x) y; else z; variant with explicit else +if (x) { y } else { z }; variant with instruction blocks + + + + + x ? y : z Ternary operator, equivalent to 'if (x, y, z)' + + + + + switch { The first true case condition that is encountered will + case x > 1: a; determine the result of the switch. If none of the case + case x < 1: b; conditions hold true, the default action is used + default: c; to determine the return value +} + + + + + while (conditon) { Evaluates expression repeatedly as long as condition is true, + expression; returning the last value of expression +} + + + + + repeat Evalues expression repeatedly as long as condition is false, + expression; returning the last value of expression +until (condition) + + + + + + for (var x := 0; condition; x += 1) { Repeatedly evaluates expression while the condition is true, + expression while evaluating the 'increment' expression on each loop +} + + + + + break Terminates the execution of the nearest enclosed loop, returning NaN + + + + + break[x] Terminates the execution of the nearest enclosed loop, returning x + + + + + continue Interrupts loop execution and resumes with the next loop iteration + + + + + return[x] Returns immediately from within the current expression, returning x + + + + + ~(expr; expr; ...) Evaluates each sub-expression and returns the value of the last one +~{expr; expr; ...} + + + + + Copy to expression + 式にコピー + + + + Basics + 基本 + + + + Functions 1 + 関数 1 + + + + Functions 2 + 関数 2 + + + + Trigonometry + 三角関数 + + + + Logic + 論理 + + + + Flow Control 1 + フロー制御 1 + + + + Flow Control 2 + フロー制御 2 + + + + Examples + 例 + + + + pv::views::trace::MathSignal + + + Expression + 式 + + + + + same as session + セッションと同じ + + + + + 100 + + + + + + 10000 + + + + + + 1000000 + + + + + Number of Samples + サンプル数 + + + + Sample rate + サンプルレート + + + + pv::views::trace::Ruler + + + Create marker here + ここでマーカーを作成 + + + + Set as zero point + ゼロポイントとして設定 + + + + Reset zero point + ゼロポイントをリセット + + + + Disable mouse hover marker + マウスホバーマーカーを無効 + + + + Enable mouse hover marker + マウスホバーマーカーを有効 + + + + pv::views::trace::Signal + + + Name + 名前 + + + + Remove + 削除 + + + + Disable + 無効 + + + + pv::views::trace::StandardBar + + + Zoom &In + ズームイン(&I) + + + + Zoom &Out + ズームアウト(&O) + + + + Zoom to &Fit + ウインドウに合わせる(&F) + + + + Show &Cursors + カーソル表示(&C) + + + + Display last segment only + 最後のセグメントのみ表示 + + + + Display last complete segment only + 最後の完全なセグメントのみ表示 + + + + Display a single segment + 単一のセグメントを表示 + + + + pv::views::trace::TimeMarker + + + Time + 時間 + + + + pv::views::trace::Trace + + + Create marker here + ここにマーカーを作成 + + + + Color + 色 + + + + Name + 名前 + + + + pv::views::trace::TraceGroup + + + Ungroup + グループ解除 + + + + pv::widgets::DecoderGroupBox + + + Show/hide this decoder trace + このデコーダートレースを表示/非表示 + + + + Delete this decoder trace + このデコーダートレースを削除 + + + + pv::widgets::DeviceToolButton + + + + <No Device> + + + + + pv::widgets::ExportMenu + + + Export %1... + エクスポート %1... + + + + pv::widgets::ImportMenu + + + Import %1... + インポート %1... + + + diff --git a/l10n/zh_cn.ts b/l10n/zh_cn.ts new file mode 100644 index 00000000..937a96cb --- /dev/null +++ b/l10n/zh_cn.ts @@ -0,0 +1,2207 @@ + + + + + Application + + + Some parts of the application may still use the previous language. Re-opening the affected windows or restarting the application will remedy this. + 应用程序的某些部分可能仍然使用以前的语言。重新打开受影响的窗口或重新启动应用程序将解决此问题。 + + + + QApplication + + + Error when scanning device driver '%1': %2 + 扫描设备驱动程序时出错 '%1': %2 + + + + Querying config key %1 is not allowed + 不允许查询 %1 配置 + + + + Querying config key %1 resulted in %2 + 查询配置 '%1': %2 + + + + Unknown type supplied when attempting to query %1 + 查询 %1 时 返回未知类型 + + + + QHexView + + + No data available + 无可用数据 + + + + QObject + + + Stack trace of previous crash: + 跟踪上次崩溃日志: + + + + Don't show this message again + 不再显示此消息 + + + + When %1 last crashed, it created a stack trace. +A human-readable form has been saved to disk and was written to the log. You may access it from the settings dialog. + 上次崩溃时 %1 ,创建了日志文件。 +可在 设置\Logging 中查看。 + + + + Cancel + 取消 + + + + Scanning for devices that driver %1 can access... + 正在扫描驱动程序 %1 可以访问的设备... + + + + pv::MainWindow + + + PulseView + PulseView + + + + Decoder Selector + 协议解码器 + + + + Session %1 + 会话 %1 + + + + Create New Session + 创建新会话 + + + + Start/Stop Acquisition + 开始/停止 采集 + + + + Settings + 设置 + + + + Reload + 重新加载 + + + + + Run + 开始 + + + + Stop + 停止 + + + + + + Confirmation + 确认 + + + + There is unsaved data. Close anyway? + 数据未保存。是否关闭? + + + + + This session contains unsaved data. Close it anyway? + 此会话数据未保存。是否关闭? + + + + pv::Session + + + Can't restore generated signal of unknown type %1 (%2) + 无法还原生成的未知类型的信号 %1 (%2) + + + + Failed to select device + 无法选择的设备 + + + + Failed to open device + 无法打开的设备 + + + + Error + + + + + Unexpected input format: %1 + 不支持的输入格式: %1 + + + + Failed to load %1 + 无法加载 %1 + + + + No active device set, can't start acquisition. + 未设置活动设备,无法采集。 + + + + No channels enabled. + 未启用任何通道。 + + + + Out of memory, acquisition stopped. + 内存不足,采集停止。 + + + + Can't handle more than 64 logic channels. + 无法处理超过64个逻辑通道。 + + + + pv::StoreSession + + + Can't save logic channel without data. + 无法保存,逻辑通道内没有数据。 + + + + Can't save analog channel without data. + 无法保存,模拟通道内没有数据。 + + + + No channels enabled. + 未启用任何通道。 + + + + Can't save range without sample data. + 无法保存,光标范围内没有数据。 + + + + + + Error while saving: + 保存时出错: + + + + pv::binding::Device + + + Note for device developers: Ignoring device configuration capability '%1' as it is missing GET and/or SET + 设备开发人员注意:缺少 GET/SET,忽略该设备配置功能 '%1' + + + + No Limit + 没有限制 + + + + pv::data::DecodeSignal + + + No decoders + 没有解码器 + + + + There are no channels assigned to this decoder + 解码器没有选择通道 + + + + One or more required channels have not been specified + 解码器缺少一个或多个通道 + + + + No input data + 无数据输入 + + + + Decoder reported an error + 解码器解码错误 + + + + Failed to create decoder instance + 无法创建的解码器实例 + + + + pv::data::MathSignal + + + Math%1 + + + + + No expression defined, nothing to do + 未定义表达式,不执行任何操作 + + + + %1 at line %2, column %3: %4 + %1 行 %2, 列 %3: %4 + + + + + "%1" isn't a valid analog signal + "%1" 不是有效的模拟信号 + + + + + No data will be generated as %1 must be enabled + 不会生成数据,因为必须启用 %1 + + + + pv::data::SignalBase + + + Signal average + 平均信号电平 + + + + 0.9V (for 1.8V CMOS) + + + + + 1.8V (for 3.3V CMOS) + + + + + 2.5V (for 5.0V CMOS) + + + + + 1.5V (for TTL) + + + + + Signal average +/- 15% + 平均信号电平 +/- 15% + + + + 0.3V/1.2V (for 1.8V CMOS) + + + + + 0.7V/2.5V (for 3.3V CMOS) + + + + + 1.3V/3.7V (for 5.0V CMOS) + + + + + 0.8V/2.0V (for TTL) + + + + + pv::dialogs::Connect + + + &Scan for devices using driver above + 使用上述驱动程序扫描设备 + + + + Connect to Device + 连接到设备 + + + + Step 1: Choose the driver + 步骤1:选择驱动程序 + + + + &USB + + + + + Serial &Port + 串行和端口 + + + + &TCP/IP + + + + + Protocol: + 协议: + + + + Step 2: Choose the interface + 步骤2:选择接口 + + + + Step 3: Scan for devices + 步骤3:扫描设备 + + + + Step 4: Select the device + 步骤4:选择设备 + + + + pv::dialogs::Settings + + + + General + 常规 + + + + Views + 显示 + + + + + Decoders + 解码器 + + + + About + + + + + Logging + + + + + User interface language + 语言 + + + + User interface theme + 主题 + + + + (You may need to restart PulseView for all UI elements to update) + (您可能需要重新启动PulseView才能更新所有UI元素) + + + + System Default + + + + + Qt widget style + QT 软件界面风格 + + + + (Dark themes look best with the Fusion style) + (深色主题与Fusion风格搭配效果最佳) + + + + Save session &setup along with .sr file + 将会话设置与 .sr文件一起保存 + + + + Start acquisition for all open sessions when clicking 'Run' + 单击“开始”时启动所有打开会话的采集 + + + + Trace View + 采集视图 + + + + Use colored trace &background + 使用彩色通道背景 + + + + Constantly perform &zoom-to-fit during acquisition + 采集数据过程中不断调整和缩放以适应窗口 ( &Z ) + + + + Perform a zoom-to-&fit when acquisition stops + 采集停止时执行调整和缩放以适应窗口 ( &A ) + + + + Show time zero at the &trigger + 在触发器处显示时间零点 ( &T ) + + + + Always keep &newest samples at the right edge during capture + 采集过程中始终跟踪右侧最新数据 ( &Q ) + + + + Allow &vertical dragging in the view area + 允许在视图区域中垂直拖动 + + + + Show data &sampling points + 显示数据采样点 + + + + Fill &high areas of logic signals + 填充逻辑信号高电平的区域 ( &H ) + + + + Color to fill high areas of logic signals with + 填充逻辑信号高电平区域的颜色 + + + + Show analog minor grid in addition to div grid + 模拟通道除了div网格之外,还显示更多垂直细分网格 + + + + Highlight mouse cursor using a vertical marker line + 用竖线突出显示鼠标光标位置 + + + + + + pixels + + + + + Maximum distance from edges before markers snap to them + 光标吸附到边沿前的最大距离 + + + + Color to fill cursor area with + 填充光标范围内的颜色 + + + + None + + + + + Background + + + + + Dots + + + + + Conversion threshold display mode (analog traces only) + 转换阈值显示模式(仅限模拟通道) + + + + Default analog trace div height + 模拟通道垂直高度 + + + + Default logic trace height + 逻辑通道垂直高度 + + + + Allow configuration of &initial signal state + 允许配置初始信号状态 + + + + Always show all &rows, even if no annotation is visible + 始终显示所有解码,即使未解码 + + + + Annotation export format + 解码数据导出格式 + + + + %s = sample range; %d: decoder name; %r: row name; %c: class name + + + + + %1: longest annotation text; %a: all annotation texts; %q: use quotation marks + + + + + %1<br /><a href="http://%2">%2</a> + + + + + GNU GPL, version 3 or later + + + + + Versions, libraries and features: + 版本、库和功能: + + + + Firmware search paths: + 固件搜索路径: + + + + Protocol decoder search paths: + 协议解码器搜索路径: + + + + <tr><td colspan="2">(Note: Set environment variable SIGROKDECODE_DIR to add a custom directory)</td></tr> + + + + + Supported hardware drivers: + 支持的硬件驱动程序: + + + + Supported input formats: + 支持的输入格式: + + + + Supported output formats: + 支持的输出格式: + + + + Supported protocol decoders: + 支持的协议解码器: + + + + Available Translations: + 可用翻译: + + + + Log level: + 日志级别: + + + + lines + 行 + + + + Length of background buffer: + 日志缓存长度: + + + + &Save to File + 保存到文件 + + + + &Pop out + 独立弹出日志窗口 + + + + You selected a dark theme. +Should I set the user-adjustable colors to better suit your choice? + +Please keep in mind that PulseView may need a restart to display correctly. + 您选择了一个深色主题。 +是否相应地调整特定的颜色,以更好地协调? +PulseView可能需要重新启动才能正确显示。 + + + + You selected a bright theme. +Should I set the user-adjustable colors to better suit your choice? + +Please keep in mind that PulseView may need a restart to display correctly. + 您选择了一个明亮主题。 +是否相应地调整特定的颜色,以更好地协调? +PulseView可能需要重新启动才能正确显示。 + + + + Save Log + 保存日志 + + + + Log Files (*.txt *.log);;All Files (*) + + + + + Success + 成功 + + + + Log saved to %1. + 日志已保存到 %1。 + + + + Error + + + + + File %1 could not be written to. + 文件 %1 无法保存。 + + + + %1 Log + + + + + pv::dialogs::StoreProgress + + + Saving... + 保存中... + + + + Cancel + 取消 + + + + Failed to save session. + 未能保存会话。 + + + + pv::popups::Channels + + + + + + All + 全部 + + + + + Logic + 逻辑 + + + + + Analog + 模拟 + + + + Named + 更名过 + + + + Unnamed + 未更名 + + + + Changing + 有数据的 + + + + Non-changing + 无数据的 + + + + Disable: + 禁用: + + + + Enable: + 启用: + + + + + None + 全关 + + + + pv::prop::Bool + + + + Querying config key %1 resulted in %2 + 查询配置 '%1': %2 + + + + pv::prop::Double + + + + Querying config key %1 resulted in %2 + 查询配置 '%1': %2 + + + + pv::prop::Enum + + + + Querying config key %1 resulted in %2 + 查询配置 '%1': %2 + + + + pv::prop::Int + + + + Querying config key %1 resulted in %2 + 查询配置 '%1': %2 + + + + pv::prop::String + + + + Querying config key %1 resulted in %2 + 查询配置 '%1': %2 + + + + pv::subwindows::decoder_selector::DecoderCollectionModel + + + Decoder + 解码器 + + + + Name + + + + + ID + + + + + All Decoders + 所有解码器 + + + + pv::subwindows::decoder_selector::SubWindow + + + Select a decoder to see its description here. + 选择解码器以在此处查看其说明。 + + + + , %1 + + + + + <p align='right'>Tags: %1</p> + + + + + Protocol decoder <b>%1</b> requires input type <b>%2</b> which several decoders provide.<br>Choose which one to use:<br> + 协议解码器 <b>%1</b> 有不同的<b>%2</b> 协议类型。<br>选择要使用的:<br> + + + + Choose Decoder + 选择解码器 + + + + pv::toolbars::MainBar + + + New &View + 新建视图 + + + + &Open... + 打开... ( &O ) + + + + Restore Session Setu&p... + 从文件打开会话设置... + + + + &Save... + 保存... ( &S ) + + + + Save &As... + 另存为... ( &A ) + + + + Save Selected &Range As... + 将所选范围另存为... ( &R ) + + + + Save Session Setu&p... + 保存会话设置... + + + + &Export + 导出 + + + + &Import + 导入 + + + + &Connect to Device... + 连接到设备... + + + + Add protocol decoder + 添加协议解码器 + + + + Add math signal + 添加 math 信号 + + + + Configure Device + 设备配置 + + + + Configure Channels + 通道配置 + + + + Failed to get sample rate list: + 无法获取采样率列表: + + + + Failed to get sample rate: + 无法获取采样率: + + + + Failed to get sample limit list: + 无法获取采样限制列表: + + + + Failed to configure samplerate: + 无法配置采样率: + + + + Failed to configure sample count: + 无法配置采样计数: + + + + Missing Cursors + 缺少光标 + + + + You need to set the cursors before you can save the data enclosed by them to a session file (e.g. using the Show Cursors button). + 您需要设置光标,然后才能将光标范围内的数据保存到会话文件中(例如,使用“显示光标”按钮)。 + + + + Invalid Range + 无效的范围 + + + + The cursors don't define a valid range of samples. + 光标没有定义有效的采样范围。 + + + + %1 files + + + + + + All Files + 所有文件 + + + + + Save File + 保存文件 + + + + Export %1 + 导出 %1 + + + + %1 files + + + + + Import File + 导入文件 + + + + Import %1 + 导入 %1 + + + + + Open File + 打开文件 + + + + sigrok Sessions (*.sr);;All Files (*) + + + + + + PulseView Session Setups (*.pvs);;All Files (*) + + + + + Total sampling time: %1 + 总采样时间: %1 + + + + pv::views::decoder_binary::View + + + Decoder: + 解码器: + + + + Show data as + 数据显示格式 + + + + Hexdump + + + + + &Save... + 保存... ( &S ) + + + + + Save Binary Data + 保存二进制数据 + + + + Binary Data Files (*.bin);;All Files (*) + + + + + + Error + + + + + + File %1 could not be written to. + 文件 %1 无法保存。 + + + + Hex Dumps (*.txt);;All Files (*) + + + + + pv::views::tabular_decoder::AnnotationCollectionModel + + + Sample + 采样 + + + + Time + + + + + Decoder + 解码器 + + + + Ann Row + + + + + Ann Class + + + + + Value + + + + + s + + + + + sa + + + + + pv::views::tabular_decoder::View + + + Decoder: + 解码器: + + + + Hide Hidden Rows/Classes + 隐藏隐藏的行/列 + + + + &Save... + 保存... ( &S ) + + + + Save Annotations as CSV + 将解码数据另存为CSV + + + + CSV Files (*.csv);;Text Files (*.txt);;All Files (*) + + + + + Error + + + + + File %1 could not be written to. + 文件 %1 无法保存。 + + + + pv::views::trace::AnalogSignal + + + Number of pos vertical divs + 正区间div垂直细分网格数 + + + + Number of neg vertical divs + 负区间div垂直细分网格数 + + + + pixels + + + + + Div height + Div高度 + + + + V/div + + + + + Vertical resolution + 垂直分辨率 + + + + Autoranging + 自动量程 + + + + none + 无 + + + + to logic via threshold + 通过阈值转换为逻辑 + + + + to logic via schmitt-trigger + 通过施密特触发器转换为逻辑 + + + + Conversion + 转换 + + + + Conversion threshold(s) + 转换阈值 + + + + analog + 模拟 + + + + converted + 转换 + + + + analog+converted + 模拟+转换 + + + + Show traces for + 显示采集 + + + + pv::views::trace::Cursor + + + Disable snapping + 禁用捕捉 + + + + pv::views::trace::CursorPair + + + Display interval + 显示间隔 + + + + Display frequency + 显示频率 + + + + Display samples + 显示采样 + + + + pv::views::trace::DecodeTrace + + + <p><i>No decoders in the stack</i></p> + <p><i>堆叠中没有解码器</i></p> + + + + <i>* Required channels</i> + <i>* 所需通道</i> + + + + Stack Decoder + 堆叠解码器 + + + + Stack a higher-level decoder on top of this one + 在这之上面堆叠一个更高级别的解码器 + + + + Delete + 删除 + + + + Resume decoding + 继续解码 + + + + Pause decoding + 暂停解码 + + + + Copy annotation text to clipboard + 将解码数据复制到剪贴板 + + + + Export all annotations + 导出所有解码数据 + + + + Export all annotations for this row + 导出此行的解码数据 + + + + Export all annotations, starting here + 导出从这以后所有的解码数据 + + + + Export annotations for this row, starting here + 导出从这以后此行的解码数据 + + + + Export all annotations within cursor range + 导出光标范围内所有的解码数据 + + + + Export annotations for this row within cursor range + 导出光标范围内此行的解码数据 + + + + %1: +%2 + + + + + <b>%1</b> (%2) %3 + + + + + Export annotations + 导出解码数据 + + + + Text Files (*.txt);;All Files (*) + + + + + Error + + + + + File %1 could not be written to. + 文件 %1 无法保存。 + + + + Show this row + 显示此行 + + + + Show All + 全部显示 + + + + Hide All + 全部隐藏 + + + + pv::views::trace::Flag + + + Text + + + + + Delete + 删除 + + + + Disable snapping + 禁用捕捉 + + + + pv::views::trace::Header + + + Group + 组 + + + + pv::views::trace::LogicSignal + + + No trigger + 无触发 + + + + Trigger on rising edge + 上升沿触发 + + + + Trigger on high level + 高电平触发 + + + + Trigger on falling edge + 下降沿触发 + + + + Trigger on low level + 低电平触发 + + + + Trigger on rising or falling edge + 上升沿或下降沿触发 + + + + pixels + + + + + Trace height + 通道高度 + + + + Trigger + 触发 + + + + pv::views::trace::MathEditDialog + + + Math Expression Editor + Math 表达式编辑器 + + + + Inputs: + + + + + Variables: + + + + + Basic operators: + + + + + Assignments: + + + + + General purpose functions: + + + + + abs(x) Absolute value of x + + + + + avg(x, y, ...) Average of all input values + + + + + ceil(x) Smallest integer that is greater than or equal to x + + + + + clamp(lb, x, ub) Clamp x in range between lb and ub, where lb < ub + + + + + equal(x, y) Equality test between x and y using normalised epsilon + + + + + erf(x) Error function of x + + + + + erfc(x) Complimentary error function of x + + + + + exp(x) e to the power of x + + + + + expm1(x) e to the power of x minus 1, where x is very small. + + + + + floor(x) Largest integer that is less than or equal to x + + + + + frac(x) Fractional portion of x + + + + + hypot(x) Hypotenuse of x and y (i.e. sqrt(x*x + y*y)) + + + + + iclamp(lb, x, ub) Inverse-clamp x outside of the range lb and ub, where lb < ub. + If x is within the range it will snap to the closest bound + + + + + inrange(lb, x, ub) In-range returns true when x is within the range lb and ub, where lb < ub. + + + + + log(x) Natural logarithm of x + + + + + log10(x) Base 10 logarithm of x + + + + + log1p(x) Natural logarithm of 1 + x, where x is very small + + + + + log2(x) Base 2 logarithm of x + + + + + logn(x) Base N logarithm of x, where n is a positive integer + + + + + max(x, y, ...) Largest value of all the inputs + + + + + min(x, y, ...) Smallest value of all the inputs + + + + + mul(x, y, ...) Product of all the inputs + + + + + ncdf(x) Normal cumulative distribution function + + + + + nequal(x, y) Not-equal test between x and y using normalised epsilon + + + + + pow(x, y) x to the power of y + + + + + root(x, n) Nth-Root of x, where n is a positive integer + + + + + round(x) Round x to the nearest integer + + + + + roundn(x, n) Round x to n decimal places, where n > 0 and is an integer + + + + + sgn(x) Sign of x; -1 if x < 0, +1 if x > 0, else zero + + + + + sqrt(x) Square root of x, where x >= 0 + + + + + sum(x, y, ..,) Sum of all the inputs + + + + + swap(x, y) Swap the values of the variables x and y and return the current value of y + + + + + trunc(x) Integer portion of x + + + + + Trigonometry functions: + + + + + acos(x) Arc cosine of x expressed in radians. Interval [-1,+1] + + + + + acosh(x) Inverse hyperbolic cosine of x expressed in radians + + + + + asin(x) Arc sine of x expressed in radians. Interval [-1,+1] + + + + + asinh(x) Inverse hyperbolic sine of x expressed in radians + + + + + atan(x) Arc tangent of x expressed in radians. Interval [-1,+1] + + + + + atan2(x, y) Arc tangent of (x / y) expressed in radians. [-pi,+pi] + + + + + atanh(x) Inverse hyperbolic tangent of x expressed in radians + + + + + cos(x) Cosine of x + + + + + cosh(x) Hyperbolic cosine of x + + + + + cot(x) Cotangent of x + + + + + csc(x) Cosectant of x + + + + + sec(x) Secant of x + + + + + sin(x) Sine of x + + + + + sinc(x) Sine cardinal of x + + + + + sinh(x) Hyperbolic sine of x + + + + + tan(x) Tangent of x + + + + + tanh(x) Hyperbolic tangent of x + + + + + deg2rad(x) Convert x from degrees to radians + + + + + deg2grad(x) Convert x from degrees to gradians + + + + + rad2deg(x) Convert x from radians to degrees + + + + + grad2deg(x) Convert x from gradians to degrees + + + + + Logic operators: + + + + + Comparisons: + + + + + x = y or x == y True only if x is strictly equal to y + + + + + x <> y or x != y True only if x does not equal y + + + + + x < y True only if x is less than y + + + + + x <= y True only if x is less than or equal to y + + + + + x > y True only if x is greater than y + + + + + x >= y True only if x is greater than or equal to y + + + + + Flow control: + + + + + { ... } Beginning and end of instruction block + + + + + if (x, y, z) If x is true then return y else return z +if (x) y; variant without implied else +if (x) { y }; variant with an instruction block +if (x) y; else z; variant with explicit else +if (x) { y } else { z }; variant with instruction blocks + + + + + x ? y : z Ternary operator, equivalent to 'if (x, y, z)' + + + + + switch { The first true case condition that is encountered will + case x > 1: a; determine the result of the switch. If none of the case + case x < 1: b; conditions hold true, the default action is used + default: c; to determine the return value +} + + + + + while (conditon) { Evaluates expression repeatedly as long as condition is true, + expression; returning the last value of expression +} + + + + + repeat Evalues expression repeatedly as long as condition is false, + expression; returning the last value of expression +until (condition) + + + + + + for (var x := 0; condition; x += 1) { Repeatedly evaluates expression while the condition is true, + expression while evaluating the 'increment' expression on each loop +} + + + + + break Terminates the execution of the nearest enclosed loop, returning NaN + + + + + break[x] Terminates the execution of the nearest enclosed loop, returning x + + + + + continue Interrupts loop execution and resumes with the next loop iteration + + + + + return[x] Returns immediately from within the current expression, returning x + + + + + ~(expr; expr; ...) Evaluates each sub-expression and returns the value of the last one +~{expr; expr; ...} + + + + + Copy to expression + + + + + Basics + + + + + Functions 1 + + + + + Functions 2 + + + + + Trigonometry + + + + + Logic + + + + + Flow Control 1 + + + + + Flow Control 2 + + + + + Examples + + + + + pv::views::trace::MathSignal + + + Expression + 表达式 + + + + + same as session + 与会话相同 + + + + + 100 + + + + + + 10000 + + + + + + 1000000 + + + + + Number of Samples + 采样数 + + + + Sample rate + 采样率 + + + + pv::views::trace::Ruler + + + Create marker here + 在此处创建标记 + + + + Set as zero point + 设为零点 + + + + Reset zero point + 重置零点 + + + + Disable mouse hover marker + 禁用鼠标位置标记 + + + + Enable mouse hover marker + 启用鼠标位置标记 + + + + pv::views::trace::Signal + + + Name + + + + + Remove + 删除 + + + + Disable + 关闭 + + + + pv::views::trace::StandardBar + + + Zoom &In + 放大 + + + + Zoom &Out + 缩小 + + + + Zoom to &Fit + 适应窗口 + + + + Show &Cursors + 显示光标 + + + + Display last segment only + 仅显示最后一段 + + + + Display last complete segment only + 仅显示最后一个完整分段 + + + + Display a single segment + 仅显示一段 + + + + pv::views::trace::TimeMarker + + + Time + + + + + pv::views::trace::Trace + + + Create marker here + 在此处创建标记 + + + + Color + 颜色 + + + + Name + + + + + pv::views::trace::TraceGroup + + + Ungroup + 取消组合 + + + + pv::views::trace::View + + + Create marker here + 在此处创建标记 + + + + pv::widgets::DecoderGroupBox + + + Show/hide this decoder trace + 显示/隐藏此解码器采集 + + + + Delete this decoder trace + 删除此解码器采集 + + + + pv::widgets::DeviceToolButton + + + + <No Device> + + + + + pv::widgets::ExportMenu + + + Export %1... + 导出 %1... + + + + pv::widgets::ImportMenu + + + Import %1... + 导入 %1... + + + diff --git a/main.cpp b/main.cpp index 4bbddcc6..0867187c 100644 --- a/main.cpp +++ b/main.cpp @@ -60,6 +60,7 @@ #include "pv/mainwindow.hpp" #include "pv/session.hpp" #include "pv/util.hpp" +#include "pv/data/segment.hpp" #ifdef ANDROID #include @@ -69,9 +70,11 @@ #ifdef _WIN32 #include +#ifdef QT_STATIC Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin) Q_IMPORT_PLUGIN(QSvgPlugin) #endif +#endif using std::exception; using std::ifstream; @@ -274,13 +277,17 @@ int main(int argc, char *argv[]) for (int i = 0; i < argc; i++) open_files.emplace_back(argv[i]); - qRegisterMetaType("util::Timestamp"); qRegisterMetaType("uint64_t"); + qRegisterMetaType("util::Timestamp"); + qRegisterMetaType("SharedPtrToSegment"); + qRegisterMetaType>("shared_ptr"); // Prepare the global settings since logging needs them early on pv::GlobalSettings settings; + settings.add_change_handler(&a); // Only the application object can't register itself settings.save_internal_defaults(); settings.set_defaults_where_needed(); + settings.apply_language(); settings.apply_theme(); pv::logging.init(); @@ -325,7 +332,7 @@ int main(int argc, char *argv[]) // Create the device manager, initialise the drivers pv::DeviceManager device_manager(context, driver, do_scan); - a.collect_version_info(context); + a.collect_version_info(device_manager); if (show_version) { a.print_version_info(); } else { @@ -345,10 +352,9 @@ int main(int argc, char *argv[]) #ifdef ENABLE_SIGNALS if (SignalHandler::prepare_signals()) { SignalHandler *const handler = new SignalHandler(&w); - QObject::connect(handler, SIGNAL(int_received()), - &w, SLOT(close())); - QObject::connect(handler, SIGNAL(term_received()), - &w, SLOT(close())); + QObject::connect(handler, SIGNAL(int_received()), &w, SLOT(close())); + QObject::connect(handler, SIGNAL(term_received()), &w, SLOT(close())); + QObject::connect(handler, SIGNAL(usr1_received()), &w, SLOT(on_run_stop_clicked())); } else qWarning() << "Could not prepare signal handler."; #endif diff --git a/manual/CMakeLists.txt b/manual/CMakeLists.txt index c425f36b..3b881a56 100644 --- a/manual/CMakeLists.txt +++ b/manual/CMakeLists.txt @@ -19,6 +19,8 @@ cmake_minimum_required(VERSION 2.8.12) +project(PV_MANUAL) + # External dependencies, required and optional tools. find_program(ASCIIDOCTOR_EXECUTABLE NAMES asciidoctor) find_program(ASCIIDOCTOR_PDF_EXECUTABLE NAMES asciidoctor-pdf) @@ -34,6 +36,22 @@ set(MANUAL_SRC "${CMAKE_CURRENT_SOURCE_DIR}/manual.txt") set(MANUAL_OUT_HTML "${CMAKE_CURRENT_BINARY_DIR}/manual.html") set(MANUAL_OUT_PDF "${CMAKE_CURRENT_BINARY_DIR}/manual.pdf") +# Make in-source images/ content available to the output hierarchy for +# the inspection of created output documents during development in the +# case of out-of-source build configurations. +if (NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/images") + message(STATUS "creating symlink for manual's images/ subdirectory") + execute_process( + COMMAND ${CMAKE_COMMAND} -E create_symlink + "${CMAKE_CURRENT_SOURCE_DIR}/images" + "${CMAKE_CURRENT_BINARY_DIR}/images" + RESULT_VARIABLE IMAGES_LINK_RESULT + ) + if (NOT IMAGES_LINK_RESULT EQUAL 0) + message(WARNING "manual rendering will lack images") + endif () +endif () + # Manual related make(1) targets. add_custom_target(manual-html COMMAND ${ASCIIDOCTOR_EXECUTABLE} @@ -57,7 +75,7 @@ if (ASCIIDOCTOR_PDF_EXECUTABLE) BYPRODUCTS ${MANUAL_OUT_PDF} DEPENDS ${MANUAL_SRC} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - COMMENT "Generating manual, HTML output" + COMMENT "Generating manual, PDF output" ) else () add_custom_target(manual-pdf diff --git a/manual/analysis.txt b/manual/analysis.txt index bc2c11d0..b6547fe4 100644 --- a/manual/analysis.txt +++ b/manual/analysis.txt @@ -30,10 +30,12 @@ you'd expect. To do so, you'll want to use cursors and markers. In the picture above, you can enable the cursor by clicking on the cursor button. You can move both of its boundaries around by clicking on the blue flags in the -time scale area. The area between the two boundary lines shows the time distance -and its inverse (i.e. the frequency). If you can't see it, just zoom in until it -shows. You can also move both boundaries at the same time by dragging the label -where this information is shown. +time scale area. The area between the two boundary lines shows the time distance, +its inverse (i.e. the frequency) and/or the number of samples encompassed. If there's +not enough space to see these, you can either zoom in until it shows, hover the mouse +cursor over the label in the middle or right-click on the label to configure what +you want to see. You can also move both boundaries at the same time by dragging said +label. image::pv_cursors_markers.png[] @@ -48,6 +50,19 @@ the ruler or a signal trace. You can click on its label and you'll have the option to change its name, or drag it to reposition it. +When you have multiple markers, you can have PulseView show you the time difference +between the markers by hovering over one of them, like so: + +image::pv_marker_deltas.png[] + +This works on the cursor, too. + +Speaking of which - if you want to place or move the cursor ranges quickly, you +can also press '1' and '2' on your keyboard to attach either side to your mouse +cursor. They will stay put when you either press Esc or click with the left +mouse button. This also works when the cursor isn't even showing, so using this +method allows you to place the cursor quickly without having to enable it first. + [NOTE] For timing comparison purposes, you can also enable a vertical marker line that follows your mouse cursor: _Settings_ -> _Views_ -> _Highlight mouse cursor_ @@ -55,7 +70,7 @@ follows your mouse cursor: _Settings_ -> _Views_ -> _Highlight mouse cursor_ [NOTE] There is also a special kind of marker that appears for each time the data acquisition device has triggered. It cannot be moved and appears as a vertical -dashed line. +dashed blue line. === Special-Purpose Decoders diff --git a/manual/decoders.txt b/manual/decoders.txt index d50a6983..6915f82c 100644 --- a/manual/decoders.txt +++ b/manual/decoders.txt @@ -50,7 +50,7 @@ image::pv_decoders_3.png[] With the stacked decoder added, we can now see that PulseView has decoded the meaning of the I²C commands, so that we don't need to bother searching the reference manual. In this view, we can see that the I²C packet was a command to read the date and time, -which was then reported to be 10.03.2013 23:35:30. +which was then reported to be "10.03.2013 23:35:30". In this example, we added the I²C and DS1307 decoders separately. However, when opening the decoder selector window, you can also double-click on the DS1307 decoder and PulseView @@ -79,6 +79,48 @@ as you can now visually understand where the ranges for high and low are placed. Aside from the default conversion threshold(s), you can choose from a few common presets or enter custom values as well. They take the form "0.0V" and "0.0V/0.0V", respectively. +=== Per-row Settings and Actions + +Sometimes, you don't want to see all protocol decoder rows or all of the annotation classes +available in a row. To do so, simply click on the arrow or label of the row you want to +customize. + +image::pv_class_selectors.png[] + +From that menu, you can either show/hide the entire row or choose the annotation classes +you want to see. Everything is visible by default but if you want to focus on specific +protocol messages or status annotations like warnings or errors, this should help. + +Also, if you are examining really long traces, disabling annotations for the most-often +occuring class (e.g. bit annotations for SPI) then drawing performance will increase, too. + +=== Binary Decoder Output + +While all protocol decoders create visible annotations, some of them also create binary +output data which isn't immediately visible at the moment. However, you can examine it +by opening the Binary Decoder Output View as shown below. + +image::pv_binary_decoder_output_view.png[] + +Once opened, you need to select a decoder with binary output for it to show anything - +among which are I2C, I2S, EEPROM24xx, SPI and UART. Having acquired some I2S data and +using the I2S protocol decoder lets you have the sound data as raw .wav file data, for +example: + +image::pv_binary_decoder_output_view_i2s.png[] + +Using the save icon at the top then lets you save this data either as a binary file +(in this case creating a valid .wav file) or various types of hex dumps. If you want to +only save a certain part of the binary data, simply select that part before saving. + +You may have noticed that the bytes are grouped by color somehow. The meaning behind +this is that every chunk of bytes emitted by the protocol decoder receives one color, +the next chunk another color and so on. As there are currently three colors, the cycle +repeats. This makes it easier to visually organize the data that you see - in the case +of the I2S decoder, the header has one color because it's sent out in one go and +following that, every sample for left/right consists of 4 bytes with the same color +since they're sent out one by one. + === Troubleshooting In case a protocol decoder doesn't provide the expected result, there are several things @@ -88,29 +130,29 @@ The first check you should perform is whether the time unit in the ruler is given as "sa". This is short for "samples" and means that the device didn't provide a sample rate and so PulseView has no way of showing a time scale in seconds or fractions thereof. While some decoders can run without timing information, or only -optionally make use of the time scale, others may not be able to interpret the -input data since timing information is an essential part of the very protocol. +optionally make use of it, others may not be able to interpret the input data since +timing information may be an essential part of that protocol. Another issue to remain aware of is that decoders need enough samples per protocol step to reliably interpret the information. In typical cases the minimum sample rate should -be four to five times the rate of the fastest activity in the protocol. +be 4-5 times the rate of the fastest activity in the protocol (e.g. its clock signal). If a protocol decoder runs but shows you annotations that don't seem to make any sense, it's worth double-checking the decoder settings. One common source of error is the baud rate. For example, the CAN protocol decoder doesn't know what baud rate is used on the bus that you captured, so it could be that a different baud rate is used -than the one you set. Also, if this is still not the reason for the malfunction, it's -worth checking whether any of the signals have been captured inverted. Again using the -CAN bus as an example, the decoder will decode the signal just fine if it's inverted but +than the one you set. If this is still not the reason for the malfunction, it's worth +checking whether any of the signals have been captured inverted. Again using the CAN +bus as an example, the decoder will decode the signal just fine if it's inverted but it'll show data even when the signal looks "idle". When a protocol decoder stops execution because of an unmet constraint (required input not connected, essential parameter not specified) or a bug in the decoder itself, you will be presented a static red message in the protocol decoder's display area. -In that case, you check the log output in the settings menu. There you'll find the Python -error description which you can use to either adjust the configuration, -or debug the decoder (and let us know of the fix) or you can copy that information and -file a bug report so that we can fix it. +In that case, you can check the log output in the settings menu. There you'll find the +Python error description which you can use to either adjust the configuration, +debug the decoder (and let us know of the fix) or create a bug report so that we can +fix it. Further helpful knowledge and explanations on logic analyzers can be found in our https://sigrok.org/wiki/FAQ#Where_can_I_learn_more_about_logic_analyzers.3F["Learn about logic analyzers" FAQ item]. @@ -122,12 +164,19 @@ can do so by right-clicking into the area of the decode signal (not on the signa on the left). You are shown several export methods to choose from, with the last one being only available if the cursor is enabled. +image::pv_ann_export_menu.png[] + After you chose a method that suits your needs, you are prompted for a file to export the annotations to. The contents of the file very much depend on the option you chose but also on the annotation export format string that you can define in the _Decoders_ menu of the settings dialog. If the default output isn't useful to you, you can customize it there. +image::pv_ann_export_format.png[] + +For example, the string "%s %d: %1" will generate this type of output for the DS1307 +RTC clock protocol decoder: "253-471 DS1307: Read date/time: Sunday, 10.03.2013 23:35:30" + === Creating a Protocol Decoder Protocol decoders are written in Python and can be created using nothing more than a diff --git a/manual/images/pv_ann_export_format.png b/manual/images/pv_ann_export_format.png new file mode 100644 index 00000000..c75c4885 Binary files /dev/null and b/manual/images/pv_ann_export_format.png differ diff --git a/manual/images/pv_ann_export_menu.png b/manual/images/pv_ann_export_menu.png new file mode 100644 index 00000000..e1368fd8 Binary files /dev/null and b/manual/images/pv_ann_export_menu.png differ diff --git a/manual/images/pv_binary_decoder_output_view.png b/manual/images/pv_binary_decoder_output_view.png new file mode 100644 index 00000000..d8cb49d6 Binary files /dev/null and b/manual/images/pv_binary_decoder_output_view.png differ diff --git a/manual/images/pv_binary_decoder_output_view_i2s.png b/manual/images/pv_binary_decoder_output_view_i2s.png new file mode 100644 index 00000000..8033592b Binary files /dev/null and b/manual/images/pv_binary_decoder_output_view_i2s.png differ diff --git a/manual/images/pv_class_selectors.png b/manual/images/pv_class_selectors.png new file mode 100644 index 00000000..c1550ab3 Binary files /dev/null and b/manual/images/pv_class_selectors.png differ diff --git a/manual/images/pv_marker_deltas.png b/manual/images/pv_marker_deltas.png new file mode 100644 index 00000000..46f5bf31 Binary files /dev/null and b/manual/images/pv_marker_deltas.png differ diff --git a/manual/installation.txt b/manual/installation.txt index 047333ed..f890a565 100644 --- a/manual/installation.txt +++ b/manual/installation.txt @@ -36,7 +36,7 @@ delete the AppImage. If you also want the stored settings gone, delete ~/.config _[install dependencies https://sigrok.org/wiki/Linux#Building[as listed on the wiki]]_ mkdir ~/sr cd ~/sr -wget 'https://sigrok.org/gitweb/?p=sigrok-util.git;a=blob_plain;f=cross-compile/linux/sigrok-cross-linux' -O sigrok-cross-linux +wget -O sigrok-cross-linux "'https://sigrok.org/gitweb/?p=sigrok-util.git;a=blob_plain;f=cross-compile/linux/sigrok-cross-linux'" chmod u+x sigrok-cross-linux ./sigrok-cross-linux export LD_LIBRARY_PATH=~/sr/lib @@ -58,9 +58,9 @@ Here's how you install them: [listing, subs="normal"] sudo bash cd /etc/udev/rules.d/ -wget 'https://sigrok.org/gitweb/?p=libsigrok.git;a=blob_plain;f=contrib/60-libsigrok.rules' -O 60-libsigrok.rules -wget 'https://sigrok.org/gitweb/?p=libsigrok.git;a=blob_plain;f=contrib/61-libsigrok-plugdev.rules' -O 61-libsigrok-plugdev.rules -wget 'https://sigrok.org/gitweb/?p=libsigrok.git;a=blob_plain;f=contrib/61-libsigrok-uaccess.rules' -O 61-libsigrok-uaccess.rules +wget -O 60-libsigrok.rules "'https://sigrok.org/gitweb/?p=libsigrok.git;a=blob_plain;f=contrib/60-libsigrok.rules'" +wget -O 61-libsigrok-plugdev.rules "'https://sigrok.org/gitweb/?p=libsigrok.git;a=blob_plain;f=contrib/61-libsigrok-plugdev.rules'" +wget -O 61-libsigrok-uaccess.rules "'https://sigrok.org/gitweb/?p=libsigrok.git;a=blob_plain;f=contrib/61-libsigrok-uaccess.rules'" sudo udevadm control --reload-rules -- diff --git a/manual/manual.txt b/manual/manual.txt index c4a31277..11983e5f 100644 --- a/manual/manual.txt +++ b/manual/manual.txt @@ -1,6 +1,6 @@ PulseView User Manual ===================== -unreleased development snapshot, dated 2018-10-29 +unreleased pulseview development snapshot, manual last changed 2020-02-29 :doctype: book :imagesdir: ./images :sectnums: diff --git a/manual/overview.txt b/manual/overview.txt index bfd87f85..bde75750 100644 --- a/manual/overview.txt +++ b/manual/overview.txt @@ -15,7 +15,7 @@ as $5. These can easily be found by searching for _24MHz Logic Analyzer_. There Cypress FX2 boards such as the Lcsoft Mini Board, which can usually be found by searching for _Cypress FX2 Board_ or similar. -In addition, a good set of https://sigrok.org/wiki/Probe_comparison[quality probe hooks] is recommended. +Additionally, a good set of https://sigrok.org/wiki/Probe_comparison[quality probe hooks] is recommended. Aside from FX2-based logic analyzers, sigrok also supports FX2-based oscilloscopes such as the https://sigrok.org/wiki/Hantek_6022BE[Hantek 6022BE], non-FX2 devices like the diff --git a/pulseview.qrc b/pulseview.qrc index 9acd3fac..706fe8d0 100644 --- a/pulseview.qrc +++ b/pulseview.qrc @@ -1,6 +1,7 @@ icons/add-decoder.svg + icons/add-math-signal.svg icons/application-exit.png icons/channels.svg icons/decoder-delete.svg @@ -9,6 +10,8 @@ icons/document-new.png icons/document-open.png icons/document-save-as.png + icons/math.svg + icons/edit-paste.svg icons/help-browser.png icons/information.svg icons/media-playback-pause.png diff --git a/pv/application.cpp b/pv/application.cpp index 5a6e28a1..cce6393c 100644 --- a/pv/application.cpp +++ b/pv/application.cpp @@ -17,13 +17,14 @@ * along with this program; if not, see . */ -#include "application.hpp" -#include "config.h" - #include #include #include +#include +#include +#include +#include #include @@ -35,6 +36,12 @@ #include #endif +#include + +#include "application.hpp" +#include "config.h" +#include "globalsettings.hpp" + using std::cout; using std::endl; using std::exception; @@ -60,13 +67,96 @@ Application::Application(int &argc, char* argv[]) : setOrganizationDomain("sigrok.org"); } -void Application::collect_version_info(shared_ptr context) +const QStringList Application::get_languages() const +{ + const QStringList files = QDir(":/l10n/").entryList(QStringList("*.qm"), QDir::Files); + + QStringList result; + result << "en"; // Add default language to the set + + // Remove file extensions + for (const QString& file : files) + result << file.split(".").front(); + + result.sort(Qt::CaseInsensitive); + + return result; +} + +const QString Application::get_language_editors(const QString& language) const +{ + if (language == "de") return "Sören Apel, Uwe Hermann"; + if (language == "es_MX") return "Carlos Diaz, Ulices Avila Hernandez"; + if (language == "ja_jp") return "Yukari Shoji"; + if (language == "zh_cn") return "ZtyPro"; + + return QString(); +} + +void Application::switch_language(const QString& language) +{ + removeTranslator(&app_translator_); + removeTranslator(&qt_translator_); + removeTranslator(&qtbase_translator_); + + if ((language != "C") && (language != "en")) { + // Application translations + QString resource = ":/l10n/" + language +".qm"; + if (app_translator_.load(resource)) + installTranslator(&app_translator_); + else + qWarning() << "Translation resource" << resource << "not found"; + + // Qt translations +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + QString tr_path(QLibraryInfo::path(QLibraryInfo::TranslationsPath)); +#else + QString tr_path(QLibraryInfo::location(QLibraryInfo::TranslationsPath)); +#endif + + if (qt_translator_.load("qt_" + language, tr_path)) + installTranslator(&qt_translator_); + else + qWarning() << "QT translations for" << language << "not found at" << + tr_path << ", Qt translations package is probably missing"; + + // Qt base translations + if (qtbase_translator_.load("qtbase_" + language, tr_path)) + installTranslator(&qtbase_translator_); + else + qWarning() << "QT base translations for" << language << "not found at" << + tr_path << ", Qt translations package is probably missing"; + } + + if (!topLevelWidgets().empty()) { + // Force all windows to update + for (QWidget *widget : topLevelWidgets()) + widget->update(); + + QMessageBox msg(topLevelWidgets().front()); + msg.setText(tr("Some parts of the application may still " \ + "use the previous language. Re-opening the affected windows or " \ + "restarting the application will remedy this.")); + msg.setStandardButtons(QMessageBox::Ok); + msg.setIcon(QMessageBox::Information); + msg.exec(); + } +} + +void Application::on_setting_changed(const QString &key, const QVariant &value) +{ + if (key == pv::GlobalSettings::Key_General_Language) + switch_language(value.toString()); +} + +void Application::collect_version_info(pv::DeviceManager &device_manager) { // Library versions and features version_info_.emplace_back(applicationName(), applicationVersion()); version_info_.emplace_back("Qt", qVersion()); version_info_.emplace_back("glibmm", PV_GLIBMM_VERSION); version_info_.emplace_back("Boost", BOOST_LIB_VERSION); + version_info_.emplace_back("exprtk", QString::fromUtf8(exprtk::information::date)); version_info_.emplace_back("libsigrok", QString("%1/%2 (rt: %3/%4)") .arg(SR_PACKAGE_VERSION_STRING, SR_LIB_VERSION_STRING, @@ -127,17 +217,18 @@ void Application::collect_version_info(shared_ptr context) #endif // Device drivers - for (auto& entry : context->drivers()) - driver_list_.emplace_back(QString::fromUtf8(entry.first.c_str()), - QString::fromUtf8(entry.second->long_name().c_str())); + for (auto& entry : device_manager.context()->drivers()) + if (device_manager.driver_supported(entry.second)) + driver_list_.emplace_back(QString::fromUtf8(entry.first.c_str()), + QString::fromUtf8(entry.second->long_name().c_str())); // Input formats - for (auto& entry : context->input_formats()) + for (auto& entry : device_manager.context()->input_formats()) input_format_list_.emplace_back(QString::fromUtf8(entry.first.c_str()), QString::fromUtf8(entry.second->description().c_str())); // Output formats - for (auto& entry : context->output_formats()) + for (auto& entry : device_manager.context()->output_formats()) output_format_list_.emplace_back(QString::fromUtf8(entry.first.c_str()), QString::fromUtf8(entry.second->description().c_str())); diff --git a/pv/application.hpp b/pv/application.hpp index c618f80d..bfe46570 100644 --- a/pv/application.hpp +++ b/pv/application.hpp @@ -23,21 +23,32 @@ #include #include +#include +#include #include +#include "devicemanager.hpp" +#include "globalsettings.hpp" + using std::shared_ptr; using std::pair; using std::vector; -class Application : public QApplication +class Application : public QApplication, public pv::GlobalSettingsInterface { Q_OBJECT public: Application(int &argc, char* argv[]); - void collect_version_info(shared_ptr context); + const QStringList get_languages() const; + const QString get_language_editors(const QString& language) const; + void switch_language(const QString& language); + + void on_setting_changed(const QString &key, const QVariant &value); + + void collect_version_info(pv::DeviceManager &device_manager); void print_version_info(); vector< pair > get_version_info() const; @@ -58,6 +69,8 @@ private: vector< pair > input_format_list_; vector< pair > output_format_list_; vector< pair > pd_list_; + + QTranslator app_translator_, qt_translator_, qtbase_translator_; }; #endif // PULSEVIEW_PV_APPLICATION_HPP diff --git a/pv/binding/binding.cpp b/pv/binding/binding.cpp index 9735e146..1f17aefd 100644 --- a/pv/binding/binding.cpp +++ b/pv/binding/binding.cpp @@ -82,6 +82,7 @@ void Binding::add_properties_to_form(QFormLayout *layout, bool auto_commit) help_lbl = new QLabel(p->desc()); help_lbl->setVisible(false); help_lbl->setWordWrap(true); + help_lbl->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding); help_labels_[help_btn] = help_lbl; } diff --git a/pv/binding/decoder.cpp b/pv/binding/decoder.cpp index f51f9077..80725d2a 100644 --- a/pv/binding/decoder.cpp +++ b/pv/binding/decoder.cpp @@ -54,12 +54,11 @@ Decoder::Decoder( { assert(decoder_); - const srd_decoder *const dec = decoder_->decoder(); + const srd_decoder *const dec = decoder_->get_srd_decoder(); assert(dec); for (GSList *l = dec->options; l; l = l->next) { - const srd_decoder_option *const opt = - (srd_decoder_option*)l->data; + const srd_decoder_option *const opt = (srd_decoder_option*)l->data; const QString name = QString::fromUtf8(opt->desc); @@ -115,12 +114,11 @@ Glib::VariantBase Decoder::getter(const char *id) if (iter != options.end()) val = (*iter).second; else { - assert(decoder_->decoder()); + assert(decoder_->get_srd_decoder()); // Get the default value if not - for (GSList *l = decoder_->decoder()->options; l; l = l->next) { - const srd_decoder_option *const opt = - (srd_decoder_option*)l->data; + for (GSList *l = decoder_->get_srd_decoder()->options; l; l = l->next) { + const srd_decoder_option *const opt = (srd_decoder_option*)l->data; if (strcmp(opt->id, id) == 0) { val = opt->def; break; diff --git a/pv/binding/device.cpp b/pv/binding/device.cpp index 37c9d43d..855052cd 100644 --- a/pv/binding/device.cpp +++ b/pv/binding/device.cpp @@ -59,20 +59,30 @@ Device::Device(shared_ptr configurable) : for (auto key : keys) { + string descr_str; + try { + descr_str = key->description(); + } catch (Error& e) { + descr_str = key->name(); + } + const QString descr = QString::fromStdString(descr_str); + auto capabilities = configurable->config_capabilities(key); if (!capabilities.count(Capability::GET) || - !capabilities.count(Capability::SET)) - continue; + !capabilities.count(Capability::SET)) { - string name_str; - try { - name_str = key->description(); - } catch (Error& e) { - name_str = key->name(); - } + // Ignore common read-only keys + if ((key->id() == SR_CONF_CONTINUOUS) || (key->id() == SR_CONF_TRIGGER_MATCH) || + (key->id() == SR_CONF_CONN) || (key->id() == SR_CONF_SERIALCOMM) || (key->id() == SR_CONF_NUM_LOGIC_CHANNELS) || + (key->id() == SR_CONF_NUM_ANALOG_CHANNELS) || (key->id() == SR_CONF_SESSIONFILE) || (key->id() == SR_CONF_CAPTUREFILE) || + (key->id() == SR_CONF_CAPTURE_UNITSIZE)) + continue; - const QString name = QString::fromStdString(name_str); + qDebug() << QString(tr("Note for device developers: Ignoring device configuration capability '%1' " \ + "as it is missing GET and/or SET")).arg(descr); + continue; + } const Property::Getter get = [&, key]() { return configurable_->config_get(key); }; @@ -88,7 +98,13 @@ Device::Device(shared_ptr configurable) : break; case SR_CONF_CAPTURE_RATIO: - bind_int(name, "", "%", pair(0, 100), get, set); + bind_int(descr, "", "%", pair(0, 100), get, set); + break; + + case SR_CONF_LIMIT_FRAMES: + // Value 0 means that there is no limit + bind_int(descr, "", "", pair(0, 1000000), get, set, + tr("No Limit")); break; case SR_CONF_PATTERN_MODE: @@ -99,7 +115,7 @@ Device::Device(shared_ptr configurable) : case SR_CONF_CLOCK_EDGE: case SR_CONF_DATA_SOURCE: case SR_CONF_EXTERNAL_CLOCK_SOURCE: - bind_enum(name, "", key, capabilities, get, set); + bind_enum(descr, "", key, capabilities, get, set); break; case SR_CONF_FILTER: @@ -107,33 +123,34 @@ Device::Device(shared_ptr configurable) : case SR_CONF_RLE: case SR_CONF_POWER_OFF: case SR_CONF_AVERAGING: - bind_bool(name, "", get, set); + case SR_CONF_CONTINUOUS: + bind_bool(descr, "", get, set); break; case SR_CONF_TIMEBASE: - bind_enum(name, "", key, capabilities, get, set, print_timebase); + bind_enum(descr, "", key, capabilities, get, set, print_timebase); break; case SR_CONF_VDIV: - bind_enum(name, "", key, capabilities, get, set, print_vdiv); + bind_enum(descr, "", key, capabilities, get, set, print_vdiv); break; case SR_CONF_VOLTAGE_THRESHOLD: - bind_enum(name, "", key, capabilities, get, set, print_voltage_threshold); + bind_enum(descr, "", key, capabilities, get, set, print_voltage_threshold); break; case SR_CONF_PROBE_FACTOR: if (capabilities.count(Capability::LIST)) - bind_enum(name, "", key, capabilities, get, set, print_probe_factor); + bind_enum(descr, "", key, capabilities, get, set, print_probe_factor); else - bind_int(name, "", "", pair(1, 500), get, set); + bind_int(descr, "", "", pair(1, 500), get, set); break; case SR_CONF_AVG_SAMPLES: if (capabilities.count(Capability::LIST)) - bind_enum(name, "", key, capabilities, get, set, print_averages); + bind_enum(descr, "", key, capabilities, get, set, print_averages); else - bind_int(name, "", "", pair(0, INT32_MAX), get, set); + bind_int(descr, "", "", pair(0, INT32_MAX), get, set); break; default: @@ -178,13 +195,13 @@ void Device::bind_enum(const QString &name, const QString &desc, } void Device::bind_int(const QString &name, const QString &desc, QString suffix, - optional< pair > range, - Property::Getter getter, Property::Setter setter) + optional< pair > range, Property::Getter getter, + Property::Setter setter, QString special_value_text) { assert(configurable_); properties_.push_back(shared_ptr(new Int(name, desc, suffix, - range, getter, setter))); + range, getter, setter, special_value_text))); } QString Device::print_timebase(Glib::VariantBase gvar) diff --git a/pv/binding/device.hpp b/pv/binding/device.hpp index 9f5daf57..30d89ddd 100644 --- a/pv/binding/device.hpp +++ b/pv/binding/device.hpp @@ -62,7 +62,8 @@ private: function printer = print_gvariant); void bind_int(const QString &name, const QString &desc, QString suffix, boost::optional< pair > range, - prop::Property::Getter getter, prop::Property::Setter setter); + prop::Property::Getter getter, prop::Property::Setter setter, + QString special_value_text = ""); static QString print_timebase(Glib::VariantBase gvar); static QString print_vdiv(Glib::VariantBase gvar); diff --git a/pv/binding/inputoutput.cpp b/pv/binding/inputoutput.cpp index f9a061c7..9ba387fb 100644 --- a/pv/binding/inputoutput.cpp +++ b/pv/binding/inputoutput.cpp @@ -59,7 +59,7 @@ namespace binding { InputOutput::InputOutput( const map> &options) { - for (const pair>& o : options) { + for (const pair>& o : options) { const shared_ptr