commit 11c0e2347af856501e1e575466109c18e17e511a Author: lumos Date: Wed May 14 21:36:17 2025 +0800 init. diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..da26f87 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,76 @@ +cmake_minimum_required(VERSION 3.16) + +project(uppper_LibUSB VERSION 0.1 LANGUAGES CXX) + +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets) +find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets) +find_package(PkgConfig REQUIRED) +pkg_check_modules(LIBUSB REQUIRED libusb-1.0) # 模块名固定为 "libusb-1.0" + +set(PROJECT_SOURCES + main.cpp + mainwindow.cpp + mainwindow.h + mainwindow.ui +) + +if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) + qt_add_executable(uppper_LibUSB + MANUAL_FINALIZATION + ${PROJECT_SOURCES} + log.h + usbhandler.h usbhandler.cpp + ) +# Define target properties for Android with Qt 6 as: +# set_property(TARGET uppper_LibUSB APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR +# ${CMAKE_CURRENT_SOURCE_DIR}/android) +# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation +else() + if(ANDROID) + add_library(uppper_LibUSB SHARED + ${PROJECT_SOURCES} + ) +# Define properties for Android with Qt 5 after find_package() calls as: +# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android") + else() + add_executable(uppper_LibUSB + ${PROJECT_SOURCES} + ) + endif() +endif() + +target_link_libraries(uppper_LibUSB PRIVATE Qt${QT_VERSION_MAJOR}::Widgets + ${LIBUSB_LIBRARIES} +) + +# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1. +# If you are developing for iOS or macOS you should consider setting an +# explicit, fixed bundle identifier manually though. +if(${QT_VERSION} VERSION_LESS 6.1.0) + set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.uppper_LibUSB) +endif() +set_target_properties(uppper_LibUSB PROPERTIES + ${BUNDLE_ID_OPTION} + MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} + MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} + MACOSX_BUNDLE TRUE + WIN32_EXECUTABLE TRUE +) + +include(GNUInstallDirs) +install(TARGETS uppper_LibUSB + BUNDLE DESTINATION . + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} +) + +if(QT_VERSION_MAJOR EQUAL 6) + qt_finalize_executable(uppper_LibUSB) +endif() diff --git a/CMakeLists.txt.user b/CMakeLists.txt.user new file mode 100644 index 0000000..bed9f48 --- /dev/null +++ b/CMakeLists.txt.user @@ -0,0 +1,463 @@ + + + + + + EnvironmentId + {1ef3ffc4-a5a8-4c60-8a81-af3ba8bbb143} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + true + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 0 + 80 + true + true + 1 + 0 + false + true + false + 2 + true + true + 0 + 8 + true + false + 1 + true + true + true + *.md, *.MD, Makefile + false + true + true + + + + ProjectExplorer.Project.PluginSettings + + + true + false + true + true + true + true + + false + + + 0 + true + + true + true + Builtin.DefaultTidyAndClazy + 4 + true + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop Qt 6.6.3 GCC 64bit + Desktop Qt 6.6.3 GCC 64bit + qt.qt6.663.gcc_64_kit + 0 + 0 + 0 + + Debug + 2 + false + + -DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake +-DCMAKE_COLOR_DIAGNOSTICS:BOOL=ON +-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} +-DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG} +-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} +-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} +-DCMAKE_GENERATOR:STRING=Ninja +-DCMAKE_BUILD_TYPE:STRING=Debug +-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} + 0 + /home/leo/devCode/outer/USBFilter_30/uppper_LibUSB/build/Desktop_Qt_6_6_3_GCC_64bit-Debug + + + + + all + + false + + true + Build + CMakeProjectManager.MakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + + clean + + false + + true + Build + CMakeProjectManager.MakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Debug + CMakeProjectManager.CMakeBuildConfiguration + + + Release + 2 + false + + -DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake +-DCMAKE_COLOR_DIAGNOSTICS:BOOL=ON +-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} +-DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG} +-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} +-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} +-DCMAKE_GENERATOR:STRING=Ninja +-DCMAKE_BUILD_TYPE:STRING=Release +-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} + /home/leo/devCode/outer/USBFilter_30/uppper_LibUSB/build/Desktop_Qt_6_6_3_GCC_64bit-Release + + + + + all + + false + + true + CMakeProjectManager.MakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + + clean + + false + + true + CMakeProjectManager.MakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Release + CMakeProjectManager.CMakeBuildConfiguration + + + RelWithDebInfo + 2 + false + + -DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake +-DCMAKE_COLOR_DIAGNOSTICS:BOOL=ON +-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} +-DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG} +-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} +-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} +-DCMAKE_GENERATOR:STRING=Ninja +-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo +-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} + /home/leo/devCode/outer/USBFilter_30/uppper_LibUSB/build/Desktop_Qt_6_6_3_GCC_64bit-RelWithDebInfo + + + + + all + + false + + true + CMakeProjectManager.MakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + + clean + + false + + true + CMakeProjectManager.MakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Release with Debug Information + CMakeProjectManager.CMakeBuildConfiguration + + + RelWithDebInfo + 2 + false + + -DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake +-DCMAKE_COLOR_DIAGNOSTICS:BOOL=ON +-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} +-DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG} +-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} +-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} +-DCMAKE_GENERATOR:STRING=Ninja +-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo +-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} + 0 + /home/leo/devCode/outer/USBFilter_30/uppper_LibUSB/build/Desktop_Qt_6_6_3_GCC_64bit-Profile + + + + + all + + false + + true + CMakeProjectManager.MakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + + clean + + false + + true + CMakeProjectManager.MakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Profile + CMakeProjectManager.CMakeBuildConfiguration + + + MinSizeRel + 2 + false + + -DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake +-DCMAKE_COLOR_DIAGNOSTICS:BOOL=ON +-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} +-DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG} +-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} +-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} +-DCMAKE_GENERATOR:STRING=Ninja +-DCMAKE_BUILD_TYPE:STRING=MinSizeRel +-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} + /home/leo/devCode/outer/USBFilter_30/uppper_LibUSB/build/Desktop_Qt_6_6_3_GCC_64bit-MinSizeRel + + + + + all + + false + + true + CMakeProjectManager.MakeStep + + 1 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + + + clean + + false + + true + CMakeProjectManager.MakeStep + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Minimum Size Release + CMakeProjectManager.CMakeBuildConfiguration + + 5 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + + + + + + + + false + + true + ApplicationManagerPlugin.Deploy.CMakePackageStep + + + install-package --acknowledge + true + Install Application Manager package + ApplicationManagerPlugin.Deploy.InstallPackageStep + + + + + + + + 2 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ApplicationManagerPlugin.Deploy.Configuration + + 2 + + true + true + 0 + true + + 2 + + false + -e cpu-cycles --call-graph dwarf,4096 -F 250 + uppper_LibUSB + CMakeProjectManager.CMakeRunConfiguration. + uppper_LibUSB + true + true + true + true + true + /home/leo/devCode/outer/USBFilter_30/uppper_LibUSB/build/Desktop_Qt_6_6_3_GCC_64bit-Debug + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/build/Desktop_Qt_6_6_3_GCC_64bit-Debug/.qtc/package-manager/auto-setup.cmake b/build/Desktop_Qt_6_6_3_GCC_64bit-Debug/.qtc/package-manager/auto-setup.cmake new file mode 100644 index 0000000..7305ab8 --- /dev/null +++ b/build/Desktop_Qt_6_6_3_GCC_64bit-Debug/.qtc/package-manager/auto-setup.cmake @@ -0,0 +1,354 @@ +# +# Internal Qt Creator variable reference +# +foreach(qtcreator_var + QT_QMAKE_EXECUTABLE CMAKE_PREFIX_PATH CMAKE_C_COMPILER CMAKE_CXX_COMPILER + CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELWITHDEBINFO) + set(__just_reference_${qtcreator_var} ${${qtcreator_var}}) +endforeach() + +option(QT_CREATOR_SOURCE_GROUPS "Qt Creator source groups extensions" ON) +if (QT_CREATOR_SOURCE_GROUPS) + source_group("Resources" REGULAR_EXPRESSION "\\.(pdf|plist|png|jpeg|jpg|storyboard|xcassets|qrc|svg|gif|ico|webp)$") + source_group("Forms" REGULAR_EXPRESSION "\\.(ui)$") + source_group("State charts" REGULAR_EXPRESSION "\\.(scxml)$") +endif() + +# +# Set a better default value for CMAKE_INSTALL_PREFIX +# +function(qtc_modify_default_install_prefix) + # If at configure time the user didn't specify a CMAKE_INSTALL_PREFIX variable + # Modules/CMakeGenericSystem.cmake will set a default value + # to CMAKE_INSTALL_PREFIX and set CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT to ON + + # In practice there are cases when CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT is + # set to ON and a custom CMAKE_INSTALL_PREFIX is set + + # Do the original CMAKE_INSTALL_PREFIX detection + if(CMAKE_HOST_UNIX) + set(original_cmake_install_prefix "/usr/local") + else() + GetDefaultWindowsPrefixBase(CMAKE_GENERIC_PROGRAM_FILES) + set(original_cmake_install_prefix + "${CMAKE_GENERIC_PROGRAM_FILES}/${PROJECT_NAME}") + unset(CMAKE_GENERIC_PROGRAM_FILES) + endif() + + # When the user code didn't modify the CMake set CMAKE_INSTALL_PREFIX + # then set the "/tmp" better value for CMAKE_INSTALL_PREFIX + if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT AND + CMAKE_INSTALL_PREFIX STREQUAL "${original_cmake_install_prefix}") + set_property(CACHE CMAKE_INSTALL_PREFIX PROPERTY VALUE "/tmp") + endif() +endfunction() +if (CMAKE_VERSION GREATER_EQUAL "3.19") + cmake_language(DEFER CALL qtc_modify_default_install_prefix) +endif() + +if (EXISTS "${CMAKE_SOURCE_DIR}/QtCreatorPackageManager.cmake") + include("${CMAKE_SOURCE_DIR}/QtCreatorPackageManager.cmake") +endif() + +if (QT_CREATOR_SKIP_PACKAGE_MANAGER_SETUP) + return() +endif() +option(QT_CREATOR_SKIP_PACKAGE_MANAGER_SETUP "Skip Qt Creator's package manager auto-setup" OFF) + +# Store the C/C++ object output extension +if (CMAKE_VERSION GREATER_EQUAL "3.19") + cmake_language(DEFER CALL set CMAKE_C_OUTPUT_EXTENSION "${CMAKE_C_OUTPUT_EXTENSION}" CACHE STRING "" FORCE) + cmake_language(DEFER CALL set CMAKE_CXX_OUTPUT_EXTENSION "${CMAKE_CXX_OUTPUT_EXTENSION}" CACHE STRING "" FORCE) +endif() + +macro(qtc_auto_setup_compiler_standard toolchainFile) + foreach(lang_var C CXX CUDA OBJC OBJCXX) + foreach(prop_var STANDARD STANDARD_REQUIRED EXTENSIONS) + if (CMAKE_${lang_var}_${prop_var}) + file(APPEND "${toolchainFile}" + "set(CMAKE_${lang_var}_${prop_var} ${CMAKE_${lang_var}_${prop_var}})\n") + endif() + endforeach() + endforeach() + + # Forward important CMake variables to the package manager in the toolchain file + foreach(fwd_var CMAKE_MSVC_RUNTIME_LIBRARY CMAKE_SYSROOT CMAKE_OSX_SYSROOT CMAKE_OSX_ARCHITECTURES) + if (${fwd_var}) + file(APPEND "${toolchainFile}" + "set(${fwd_var} ${${fwd_var}})\n") + endif() + endforeach() +endmacro() + +# +# conan +# +macro(qtc_auto_setup_conan) + foreach(file conanfile.txt conanfile.py) + if (EXISTS "${CMAKE_SOURCE_DIR}/${file}") + set(conanfile_txt "${CMAKE_SOURCE_DIR}/${file}") + break() + endif() + endforeach() + + if (conanfile_txt AND NOT QT_CREATOR_SKIP_CONAN_SETUP) + option(QT_CREATOR_SKIP_CONAN_SETUP "Skip Qt Creator's conan package manager auto-setup" OFF) + set(QT_CREATOR_CONAN_BUILD_POLICY "missing" CACHE STRING "Qt Creator's conan package manager auto-setup build policy. This is used for the BUILD property of cmake_conan_run") + + set_property( + DIRECTORY "${CMAKE_SOURCE_DIR}" + APPEND + PROPERTY CMAKE_CONFIGURE_DEPENDS "${conanfile_txt}") + + find_program(conan_program conan) + if (NOT conan_program) + message(WARNING "Qt Creator: conan executable not found. " + "Package manager auto-setup will be skipped. " + "To disable this warning set QT_CREATOR_SKIP_CONAN_SETUP to ON.") + return() + endif() + execute_process(COMMAND ${conan_program} --version + RESULT_VARIABLE result_code + OUTPUT_VARIABLE conan_version_output + ERROR_VARIABLE conan_version_output) + if (NOT result_code EQUAL 0) + message(FATAL_ERROR "conan --version failed='${result_code}: ${conan_version_output}") + endif() + + string(REGEX REPLACE ".*Conan version ([0-9].[0-9]).*" "\\1" conan_version "${conan_version_output}") + + set(conanfile_timestamp_file "${CMAKE_BINARY_DIR}/conan-dependencies/conanfile.timestamp") + file(TIMESTAMP "${conanfile_txt}" conanfile_timestamp) + + set(do_conan_installation ON) + if (EXISTS "${conanfile_timestamp_file}") + file(READ "${conanfile_timestamp_file}" old_conanfile_timestamp) + if ("${conanfile_timestamp}" STREQUAL "${old_conanfile_timestamp}") + set(do_conan_installation OFF) + endif() + endif() + + set(conanfile_build_policy_file "${CMAKE_BINARY_DIR}/conan-dependencies/conanfile.buildpolicy") + if (EXISTS "${conanfile_build_policy_file}") + file(READ "${conanfile_build_policy_file}" build_policy) + if (NOT "${build_policy}" STREQUAL "${QT_CREATOR_CONAN_BUILD_POLICY}") + set(do_conan_installation ON) + endif() + endif() + + if (do_conan_installation) + message(STATUS "Qt Creator: conan package manager auto-setup. " + "Skip this step by setting QT_CREATOR_SKIP_CONAN_SETUP to ON.") + + file(COPY "${conanfile_txt}" DESTINATION "${CMAKE_BINARY_DIR}/conan-dependencies/") + + # conanfile should have a generator specified, when both file and conan_install + # specifcy the CMakeDeps generator, conan_install will issue an error + file(READ "${conanfile_txt}" conanfile_text_content) + unset(conan_generator) + if (NOT "${conanfile_text_content}" MATCHES ".*CMakeDeps.*") + set(conan_generator "-g CMakeDeps") + endif() + + file(WRITE "${CMAKE_BINARY_DIR}/conan-dependencies/toolchain.cmake" " + set(CMAKE_C_COMPILER \"${CMAKE_C_COMPILER}\") + set(CMAKE_CXX_COMPILER \"${CMAKE_CXX_COMPILER}\") + ") + qtc_auto_setup_compiler_standard("${CMAKE_BINARY_DIR}/conan-dependencies/toolchain.cmake") + + if (CMAKE_TOOLCHAIN_FILE) + file(APPEND "${CMAKE_BINARY_DIR}/conan-dependencies/toolchain.cmake" + "include(\"${CMAKE_TOOLCHAIN_FILE}\")\n") + endif() + + file(WRITE "${CMAKE_BINARY_DIR}/conan-dependencies/CMakeLists.txt" " + cmake_minimum_required(VERSION 3.15) + + unset(CMAKE_PROJECT_INCLUDE_BEFORE CACHE) + project(conan-setup) + + if (${conan_version} VERSION_GREATER_EQUAL 2.0) + set(CONAN_COMMAND \"${conan_program}\") + include(\"${CMAKE_CURRENT_LIST_DIR}/conan_provider.cmake\") + conan_profile_detect_default() + detect_host_profile(\"${CMAKE_BINARY_DIR}/conan-dependencies/conan_host_profile\") + + set(build_types \${CMAKE_BUILD_TYPE}) + if (CMAKE_CONFIGURATION_TYPES) + set(build_types \${CMAKE_CONFIGURATION_TYPES}) + endif() + + foreach(type \${build_types}) + conan_install( + -pr \"${CMAKE_BINARY_DIR}/conan-dependencies/conan_host_profile\" + --build=${QT_CREATOR_CONAN_BUILD_POLICY} + -s build_type=\${type} + ${conan_generator}) + endforeach() + + get_property(CONAN_INSTALL_SUCCESS GLOBAL PROPERTY CONAN_INSTALL_SUCCESS) + if (CONAN_INSTALL_SUCCESS) + get_property(CONAN_GENERATORS_FOLDER GLOBAL PROPERTY CONAN_GENERATORS_FOLDER) + file(TO_CMAKE_PATH \"\${CONAN_GENERATORS_FOLDER}\" CONAN_GENERATORS_FOLDER) + file(WRITE \"${CMAKE_BINARY_DIR}/conan-dependencies/conan_paths.cmake\" \" + list(PREPEND CMAKE_PREFIX_PATH \\\"\${CONAN_GENERATORS_FOLDER}\\\") + list(PREPEND CMAKE_MODULE_PATH \\\"\${CONAN_GENERATORS_FOLDER}\\\") + list(PREPEND CMAKE_FIND_ROOT_PATH \\\"\${CONAN_GENERATORS_FOLDER}\\\") + list(REMOVE_DUPLICATES CMAKE_PREFIX_PATH) + list(REMOVE_DUPLICATES CMAKE_MODULE_PATH) + list(REMOVE_DUPLICATES CMAKE_FIND_ROOT_PATH) + set(CMAKE_PREFIX_PATH \\\"\\\${CMAKE_PREFIX_PATH}\\\" CACHE STRING \\\"\\\" FORCE) + set(CMAKE_MODULE_PATH \\\"\\\${CMAKE_MODULE_PATH}\\\" CACHE STRING \\\"\\\" FORCE) + set(CMAKE_FIND_ROOT_PATH \\\"\\\${CMAKE_FIND_ROOT_PATH}\\\" CACHE STRING \\\"\\\" FORCE) + \") + endif() + else() + include(\"${CMAKE_CURRENT_LIST_DIR}/conan.cmake\") + conan_cmake_run( + CONANFILE \"${conanfile_txt}\" + INSTALL_FOLDER \"${CMAKE_BINARY_DIR}/conan-dependencies\" + GENERATORS cmake_paths cmake_find_package json + BUILD ${QT_CREATOR_CONAN_BUILD_POLICY} + ENV CONAN_CMAKE_TOOLCHAIN_FILE=\"${CMAKE_BINARY_DIR}/conan-dependencies/toolchain.cmake\" + ) + endif() + ") + + if (NOT DEFINED CMAKE_BUILD_TYPE AND NOT DEFINED CMAKE_CONFIGURATION_TYPES) + set(CMAKE_CONFIGURATION_TYPES "Debug;Release") + endif() + + execute_process(COMMAND ${CMAKE_COMMAND} + -S "${CMAKE_BINARY_DIR}/conan-dependencies/" + -B "${CMAKE_BINARY_DIR}/conan-dependencies/build" + -C "${CMAKE_BINARY_DIR}/qtcsettings.cmake" + -D "CMAKE_TOOLCHAIN_FILE=${CMAKE_BINARY_DIR}/conan-dependencies/toolchain.cmake" + -G ${CMAKE_GENERATOR} + -D CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -D "CMAKE_CONFIGURATION_TYPES=${CMAKE_CONFIGURATION_TYPES}" + RESULT_VARIABLE result + ) + if (result EQUAL 0) + file(WRITE "${conanfile_timestamp_file}" "${conanfile_timestamp}") + file(WRITE "${conanfile_build_policy_file}" ${QT_CREATOR_CONAN_BUILD_POLICY}) + else() + message(WARNING "Qt Creator's conan package manager auto-setup failed. Consider setting " + "QT_CREATOR_SKIP_CONAN_SETUP to ON and reconfigure to skip this step.") + return() + endif() + endif() + + include("${CMAKE_BINARY_DIR}/conan-dependencies/conan_paths.cmake") + endif() + unset(conanfile_txt) +endmacro() +qtc_auto_setup_conan() + +# +# vcpkg +# +macro(qtc_auto_setup_vcpkg) + if (EXISTS "${CMAKE_SOURCE_DIR}/vcpkg.json" AND NOT QT_CREATOR_SKIP_VCPKG_SETUP) + option(QT_CREATOR_SKIP_VCPKG_SETUP "Skip Qt Creator's vcpkg package manager auto-setup" OFF) + + set_property( + DIRECTORY "${CMAKE_SOURCE_DIR}" + APPEND + PROPERTY CMAKE_CONFIGURE_DEPENDS "${CMAKE_SOURCE_DIR}/vcpkg.json") + + find_program(vcpkg_program vcpkg + PATHS $ENV{VCPKG_ROOT} ${CMAKE_SOURCE_DIR}/vcpkg ${CMAKE_SOURCE_DIR}/3rdparty/vcpkg + NO_DEFAULT_PATH + ) + if (NOT vcpkg_program) + message(WARNING "Qt Creator: vcpkg executable not found. " + "Package manager auto-setup will be skipped. " + "To disable this warning set QT_CREATOR_SKIP_VCPKG_SETUP to ON.") + return() + endif() + execute_process(COMMAND ${vcpkg_program} version + RESULT_VARIABLE result_code + OUTPUT_VARIABLE vcpkg_version_output + ERROR_VARIABLE vcpkg_version_output) + if (NOT result_code EQUAL 0) + message(FATAL_ERROR "vcpkg version failed='${result_code}: ${vcpkg_version_output}") + endif() + + # Resolve any symlinks + get_filename_component(vpkg_program_real_path ${vcpkg_program} REALPATH) + get_filename_component(vpkg_root ${vpkg_program_real_path} DIRECTORY) + + if (NOT EXISTS "${CMAKE_BINARY_DIR}/vcpkg-dependencies/toolchain.cmake") + message(STATUS "Qt Creator: vcpkg package manager auto-setup. " + "Skip this step by setting QT_CREATOR_SKIP_VCPKG_SETUP to ON.") + + file(WRITE "${CMAKE_BINARY_DIR}/vcpkg-dependencies/toolchain.cmake" " + set(CMAKE_C_COMPILER \"${CMAKE_C_COMPILER}\") + set(CMAKE_CXX_COMPILER \"${CMAKE_CXX_COMPILER}\") + ") + qtc_auto_setup_compiler_standard("${CMAKE_BINARY_DIR}/vcpkg-dependencies/toolchain.cmake") + + if (CMAKE_TOOLCHAIN_FILE AND NOT + CMAKE_TOOLCHAIN_FILE STREQUAL "${CMAKE_BINARY_DIR}/vcpkg-dependencies/toolchain.cmake") + file(APPEND "${CMAKE_BINARY_DIR}/vcpkg-dependencies/toolchain.cmake" + "include(\"${CMAKE_TOOLCHAIN_FILE}\")\n") + endif() + + if (VCPKG_TARGET_TRIPLET) + set(vcpkg_triplet ${VCPKG_TARGET_TRIPLET}) + else() + if (ANDROID_ABI) + if (ANDROID_ABI STREQUAL "armeabi-v7a") + set(vcpkg_triplet arm-neon-android) + elseif (ANDROID_ABI STREQUAL "arm64-v8a") + set(vcpkg_triplet arm64-android) + elseif (ANDROID_ABI STREQUAL "x86") + set(vcpkg_triplet x86-android) + elseif (ANDROID_ABI STREQUAL "x86_64") + set(vcpkg_triplet x64-android) + else() + message(FATAL_ERROR "Unsupported Android ABI: ${ANDROID_ABI}") + endif() + # Needed by vcpkg/scripts/toolchains/android.cmake + file(APPEND "${CMAKE_BINARY_DIR}/vcpkg-dependencies/toolchain.cmake" " + set(ENV{ANDROID_NDK_HOME} \"${ANDROID_NDK}\") + ") + elseif (WIN32) + set(vcpkg_triplet x64-mingw-static) + if (CMAKE_CXX_COMPILER MATCHES ".*/(.*)/cl.exe") + set(vcpkg_triplet ${CMAKE_MATCH_1}-windows) + endif() + elseif(APPLE) + # We're too early to use CMAKE_HOST_SYSTEM_PROCESSOR + execute_process( + COMMAND uname -m + OUTPUT_VARIABLE __apple_host_system_processor + OUTPUT_STRIP_TRAILING_WHITESPACE) + if (__apple_host_system_processor MATCHES "arm64") + set(vcpkg_triplet arm64-osx) + else() + set(vcpkg_triplet x64-osx) + endif() + else() + set(vcpkg_triplet x64-linux) + endif() + endif() + + file(APPEND "${CMAKE_BINARY_DIR}/vcpkg-dependencies/toolchain.cmake" " + set(VCPKG_TARGET_TRIPLET ${vcpkg_triplet}) + include(\"${vpkg_root}/scripts/buildsystems/vcpkg.cmake\") + ") + endif() + + set(CMAKE_TOOLCHAIN_FILE "${CMAKE_BINARY_DIR}/vcpkg-dependencies/toolchain.cmake" CACHE PATH "" FORCE) + + # Save CMAKE_PREFIX_PATH and CMAKE_MODULE_PATH as cache variables + if (CMAKE_VERSION GREATER_EQUAL "3.19") + cmake_language(DEFER CALL list REMOVE_DUPLICATES CMAKE_PREFIX_PATH) + cmake_language(DEFER CALL list REMOVE_DUPLICATES CMAKE_MODULE_PATH) + cmake_language(DEFER CALL set CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH}" CACHE STRING "" FORCE) + cmake_language(DEFER CALL set CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" CACHE STRING "" FORCE) + endif() + endif() +endmacro() +qtc_auto_setup_vcpkg() diff --git a/build/Desktop_Qt_6_6_3_GCC_64bit-Debug/CMakeFiles/3.30.5/CMakeCXXCompiler.cmake b/build/Desktop_Qt_6_6_3_GCC_64bit-Debug/CMakeFiles/3.30.5/CMakeCXXCompiler.cmake new file mode 100644 index 0000000..842b2b9 --- /dev/null +++ b/build/Desktop_Qt_6_6_3_GCC_64bit-Debug/CMakeFiles/3.30.5/CMakeCXXCompiler.cmake @@ -0,0 +1,101 @@ +set(CMAKE_CXX_COMPILER "/bin/g++-12") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "GNU") +set(CMAKE_CXX_COMPILER_VERSION "12.3.0") +set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_CXX_STANDARD_LATEST "23") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") +set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") +set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23") +set(CMAKE_CXX26_COMPILE_FEATURES "") + +set(CMAKE_CXX_PLATFORM_ID "Linux") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_CXX_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/bin/ar") +set(CMAKE_CXX_COMPILER_AR "/bin/gcc-ar-12") +set(CMAKE_RANLIB "/bin/ranlib") +set(CMAKE_CXX_COMPILER_RANLIB "/bin/gcc-ranlib-12") +set(CMAKE_LINKER "/bin/ld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_CXX_COMPILER_LINKER "/usr/bin/ld") +set(CMAKE_CXX_COMPILER_LINKER_ID "GNU") +set(CMAKE_CXX_COMPILER_LINKER_VERSION 2.38) +set(CMAKE_CXX_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCXX 1) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm;ccm;cxxm;c++m) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) + +foreach (lang IN ITEMS C OBJC OBJCXX) + if (CMAKE_${lang}_COMPILER_ID_RUN) + foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) + list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) + endforeach() + endif() +endforeach() + +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) +set(CMAKE_CXX_LINKER_DEPFILE_SUPPORTED FALSE) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "8") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "/usr/include/c++/12;/usr/include/x86_64-linux-gnu/c++/12;/usr/include/c++/12/backward;/usr/lib/gcc/x86_64-linux-gnu/12/include;/usr/local/include;/usr/include/x86_64-linux-gnu;/usr/include") +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "stdc++;m;gcc_s;gcc;c;gcc_s;gcc") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/12;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") +set(CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR "") + +set(CMAKE_CXX_COMPILER_IMPORT_STD "") +### Imported target for C++23 standard library +set(CMAKE_CXX23_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Toolchain does not support discovering `import std` support") + + + diff --git a/build/Desktop_Qt_6_6_3_GCC_64bit-Debug/CMakeFiles/3.30.5/CMakeSystem.cmake b/build/Desktop_Qt_6_6_3_GCC_64bit-Debug/CMakeFiles/3.30.5/CMakeSystem.cmake new file mode 100644 index 0000000..05c8d91 --- /dev/null +++ b/build/Desktop_Qt_6_6_3_GCC_64bit-Debug/CMakeFiles/3.30.5/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Linux-6.8.0-57-generic") +set(CMAKE_HOST_SYSTEM_NAME "Linux") +set(CMAKE_HOST_SYSTEM_VERSION "6.8.0-57-generic") +set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64") + + + +set(CMAKE_SYSTEM "Linux-6.8.0-57-generic") +set(CMAKE_SYSTEM_NAME "Linux") +set(CMAKE_SYSTEM_VERSION "6.8.0-57-generic") +set(CMAKE_SYSTEM_PROCESSOR "x86_64") + +set(CMAKE_CROSSCOMPILING "FALSE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/build/Desktop_Qt_6_6_3_GCC_64bit-Debug/uppper_LibUSB b/build/Desktop_Qt_6_6_3_GCC_64bit-Debug/uppper_LibUSB new file mode 100755 index 0000000..98e149a Binary files /dev/null and b/build/Desktop_Qt_6_6_3_GCC_64bit-Debug/uppper_LibUSB differ diff --git a/build/Desktop_Qt_6_6_3_GCC_64bit-Debug/uppper_LibUSB_autogen/include/ui_mainwindow.h b/build/Desktop_Qt_6_6_3_GCC_64bit-Debug/uppper_LibUSB_autogen/include/ui_mainwindow.h new file mode 100644 index 0000000..4ddfd59 --- /dev/null +++ b/build/Desktop_Qt_6_6_3_GCC_64bit-Debug/uppper_LibUSB_autogen/include/ui_mainwindow.h @@ -0,0 +1,200 @@ +/******************************************************************************** +** Form generated from reading UI file 'mainwindow.ui' +** +** Created by: Qt User Interface Compiler version 6.6.3 +** +** WARNING! All changes made in this file will be lost when recompiling UI file! +********************************************************************************/ + +#ifndef UI_MAINWINDOW_H +#define UI_MAINWINDOW_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class Ui_MainWindow +{ +public: + QWidget *centralwidget; + QGridLayout *gridLayout; + QComboBox *comboBox; + QTextBrowser *textBrowser; + QPushButton *pushButton; + QPushButton *pushButton_4; + QPushButton *pushButton_2; + QPushButton *pushButton_3; + QComboBox *comboBox_3; + QSpacerItem *verticalSpacer; + QLabel *label; + QPushButton *pushButton_8; + QTextEdit *textEdit; + QPushButton *pushButton_7; + QPushButton *pushButton_6; + QLabel *label_2; + QLabel *label_4; + QComboBox *comboBox_2; + QLabel *label_3; + QPushButton *pushButton_5; + QSpacerItem *verticalSpacer_2; + QStatusBar *statusbar; + + void setupUi(QMainWindow *MainWindow) + { + if (MainWindow->objectName().isEmpty()) + MainWindow->setObjectName("MainWindow"); + MainWindow->resize(814, 613); + QSizePolicy sizePolicy(QSizePolicy::Policy::Expanding, QSizePolicy::Policy::Expanding); + sizePolicy.setHorizontalStretch(0); + sizePolicy.setVerticalStretch(0); + sizePolicy.setHeightForWidth(MainWindow->sizePolicy().hasHeightForWidth()); + MainWindow->setSizePolicy(sizePolicy); + centralwidget = new QWidget(MainWindow); + centralwidget->setObjectName("centralwidget"); + gridLayout = new QGridLayout(centralwidget); + gridLayout->setObjectName("gridLayout"); + comboBox = new QComboBox(centralwidget); + comboBox->setObjectName("comboBox"); + + gridLayout->addWidget(comboBox, 1, 1, 1, 1); + + textBrowser = new QTextBrowser(centralwidget); + textBrowser->setObjectName("textBrowser"); + + gridLayout->addWidget(textBrowser, 12, 0, 1, 4); + + pushButton = new QPushButton(centralwidget); + pushButton->setObjectName("pushButton"); + + gridLayout->addWidget(pushButton, 0, 0, 1, 4); + + pushButton_4 = new QPushButton(centralwidget); + pushButton_4->setObjectName("pushButton_4"); + + gridLayout->addWidget(pushButton_4, 8, 2, 1, 2); + + pushButton_2 = new QPushButton(centralwidget); + pushButton_2->setObjectName("pushButton_2"); + + gridLayout->addWidget(pushButton_2, 5, 2, 1, 2); + + pushButton_3 = new QPushButton(centralwidget); + pushButton_3->setObjectName("pushButton_3"); + + gridLayout->addWidget(pushButton_3, 10, 2, 1, 2); + + comboBox_3 = new QComboBox(centralwidget); + comboBox_3->setObjectName("comboBox_3"); + + gridLayout->addWidget(comboBox_3, 4, 1, 1, 1); + + verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Policy::Minimum, QSizePolicy::Policy::Expanding); + + gridLayout->addItem(verticalSpacer, 9, 2, 1, 1); + + label = new QLabel(centralwidget); + label->setObjectName("label"); + + gridLayout->addWidget(label, 1, 0, 1, 1); + + pushButton_8 = new QPushButton(centralwidget); + pushButton_8->setObjectName("pushButton_8"); + + gridLayout->addWidget(pushButton_8, 3, 2, 1, 2); + + textEdit = new QTextEdit(centralwidget); + textEdit->setObjectName("textEdit"); + + gridLayout->addWidget(textEdit, 5, 0, 6, 2); + + pushButton_7 = new QPushButton(centralwidget); + pushButton_7->setObjectName("pushButton_7"); + + gridLayout->addWidget(pushButton_7, 4, 2, 1, 2); + + pushButton_6 = new QPushButton(centralwidget); + pushButton_6->setObjectName("pushButton_6"); + + gridLayout->addWidget(pushButton_6, 1, 2, 1, 2); + + label_2 = new QLabel(centralwidget); + label_2->setObjectName("label_2"); + + gridLayout->addWidget(label_2, 11, 1, 1, 1); + + label_4 = new QLabel(centralwidget); + label_4->setObjectName("label_4"); + + gridLayout->addWidget(label_4, 4, 0, 1, 1); + + comboBox_2 = new QComboBox(centralwidget); + comboBox_2->setObjectName("comboBox_2"); + QSizePolicy sizePolicy1(QSizePolicy::Policy::Preferred, QSizePolicy::Policy::Fixed); + sizePolicy1.setHorizontalStretch(0); + sizePolicy1.setVerticalStretch(0); + sizePolicy1.setHeightForWidth(comboBox_2->sizePolicy().hasHeightForWidth()); + comboBox_2->setSizePolicy(sizePolicy1); + + gridLayout->addWidget(comboBox_2, 3, 1, 1, 1); + + label_3 = new QLabel(centralwidget); + label_3->setObjectName("label_3"); + + gridLayout->addWidget(label_3, 3, 0, 1, 1); + + pushButton_5 = new QPushButton(centralwidget); + pushButton_5->setObjectName("pushButton_5"); + + gridLayout->addWidget(pushButton_5, 13, 3, 1, 1); + + verticalSpacer_2 = new QSpacerItem(20, 40, QSizePolicy::Policy::Minimum, QSizePolicy::Policy::Expanding); + + gridLayout->addItem(verticalSpacer_2, 6, 3, 1, 1); + + MainWindow->setCentralWidget(centralwidget); + statusbar = new QStatusBar(MainWindow); + statusbar->setObjectName("statusbar"); + MainWindow->setStatusBar(statusbar); + + retranslateUi(MainWindow); + + QMetaObject::connectSlotsByName(MainWindow); + } // setupUi + + void retranslateUi(QMainWindow *MainWindow) + { + MainWindow->setWindowTitle(QCoreApplication::translate("MainWindow", "MainWindow", nullptr)); + pushButton->setText(QCoreApplication::translate("MainWindow", "Refresh", nullptr)); + pushButton_4->setText(QCoreApplication::translate("MainWindow", "Send ViaBulkTrans", nullptr)); + pushButton_2->setText(QCoreApplication::translate("MainWindow", "Send ViaControlTrans", nullptr)); + pushButton_3->setText(QCoreApplication::translate("MainWindow", "send ViaAsyncTrans", nullptr)); + label->setText(QCoreApplication::translate("MainWindow", "Device List:", nullptr)); + pushButton_8->setText(QCoreApplication::translate("MainWindow", "Check", nullptr)); + pushButton_7->setText(QCoreApplication::translate("MainWindow", "Close", nullptr)); + pushButton_6->setText(QCoreApplication::translate("MainWindow", "Open", nullptr)); + label_2->setText(QCoreApplication::translate("MainWindow", "LOG", nullptr)); + label_4->setText(QCoreApplication::translate("MainWindow", "EndPoint List:", nullptr)); + label_3->setText(QCoreApplication::translate("MainWindow", "Interface List:", nullptr)); + pushButton_5->setText(QCoreApplication::translate("MainWindow", "Clear", nullptr)); + } // retranslateUi + +}; + +namespace Ui { + class MainWindow: public Ui_MainWindow {}; +} // namespace Ui + +QT_END_NAMESPACE + +#endif // UI_MAINWINDOW_H diff --git a/build/Desktop_Qt_6_6_3_GCC_64bit-Debug/uppper_LibUSB_autogen/mocs_compilation.cpp b/build/Desktop_Qt_6_6_3_GCC_64bit-Debug/uppper_LibUSB_autogen/mocs_compilation.cpp new file mode 100644 index 0000000..8162693 --- /dev/null +++ b/build/Desktop_Qt_6_6_3_GCC_64bit-Debug/uppper_LibUSB_autogen/mocs_compilation.cpp @@ -0,0 +1,3 @@ +// This file is autogenerated. Changes will be overwritten. +#include "EWIEGA46WW/moc_mainwindow.cpp" +#include "EWIEGA46WW/moc_usbhandler.cpp" diff --git a/build/Desktop_Qt_6_6_3_GCC_64bit-Debug/uppper_LibUSB_autogen/timestamp b/build/Desktop_Qt_6_6_3_GCC_64bit-Debug/uppper_LibUSB_autogen/timestamp new file mode 100644 index 0000000..e69de29 diff --git a/log.h b/log.h new file mode 100644 index 0000000..04b8a90 --- /dev/null +++ b/log.h @@ -0,0 +1,80 @@ +#ifndef LOG_H +#define LOG_H + +#include // 使用 std::time 和 std::strftime +#include // 使用 printf +#include // 使用 va_list 和 va_start +#include // 使用 std::mutex + +// 定义打印等级 +#define LOG_LEVEL_DEBUG 0 +#define LOG_LEVEL_INFO 1 +#define LOG_LEVEL_WARN 2 +#define LOG_LEVEL_ERROR 3 + +// 默认日志等级为INFO +#ifndef LOG_LEVEL +#define LOG_LEVEL LOG_LEVEL_DEBUG +#endif + +// 颜色配置:用户空间启用颜色 +#define LOG_COLOR true + +// 颜色宏定义 +#if LOG_COLOR +#define RESET_COLOR "\033[0m" +#define COLOR_DEBUG "\033[34m" // 蓝色 +#define COLOR_INFO "\033[32m" // 绿色 +#define COLOR_WARN "\033[33m" // 黄色 +#define COLOR_ERROR "\033[31m" // 红色 +#else +#define RESET_COLOR "" +#define COLOR_DEBUG "" +#define COLOR_INFO "" +#define COLOR_WARN "" +#define COLOR_ERROR "" +#endif + +// 获取当前时间的字符串(用户空间实现) +inline const char* current_time() { + static char buffer[64]; + std::time_t now = std::time(nullptr); + std::tm* tm_now = std::localtime(&now); + + std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", tm_now); + return buffer; +} + +// 定义一个静态互斥锁,保证线程安全 +static std::mutex log_mutex; + +// 定义一个外部 FILE 变量,可以用来切换输出目标 +extern FILE* log_output; // 默认为 stdout + +// 用户空间打印日志 +#define LOG(level, format, ...) do {\ +if (level >= LOG_LEVEL) {\ + std::lock_guard lock(log_mutex); /* 自动锁住互斥锁 */\ + const char *level_str;\ + const char *color;\ + switch (level) {\ + case LOG_LEVEL_DEBUG: level_str = "[DEBUG]"; color = COLOR_DEBUG; break;\ + case LOG_LEVEL_INFO: level_str = "[INFO]"; color = COLOR_INFO; break;\ + case LOG_LEVEL_WARN: level_str = "[WARN]"; color = COLOR_WARN; break;\ + case LOG_LEVEL_ERROR: level_str = "[ERROR]"; color = COLOR_ERROR; break;\ + default: level_str = "[UNKNOWN]"; color = ""; break;\ + }\ + fprintf(log_output, "%s%s %s %s:%d - ", color, current_time(), level_str, __FILE__, __LINE__);\ + fprintf(log_output, format, ##__VA_ARGS__); /* 打印日志信息 */\ + fprintf(log_output, "%s\n", RESET_COLOR);\ + fflush(log_output); /* 强制刷新到指定输出目标 */\ +}\ +} while (0) + +// 简便宏,用于各个等级的日志 +#define LOG_DEBUG(format, ...) LOG(LOG_LEVEL_DEBUG, format, ##__VA_ARGS__) +#define LOG_INFO(format, ...) LOG(LOG_LEVEL_INFO, format, ##__VA_ARGS__) +#define LOG_WARN(format, ...) LOG(LOG_LEVEL_WARN, format, ##__VA_ARGS__) +#define LOG_ERROR(format, ...) LOG(LOG_LEVEL_ERROR, format, ##__VA_ARGS__) + +#endif // LOG_H diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..6dee83c --- /dev/null +++ b/main.cpp @@ -0,0 +1,13 @@ +#include "mainwindow.h" + +#include + + +FILE* log_output =stdout; +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + w.show(); + return a.exec(); +} diff --git a/mainwindow.cpp b/mainwindow.cpp new file mode 100644 index 0000000..159da56 --- /dev/null +++ b/mainwindow.cpp @@ -0,0 +1,139 @@ +#include "mainwindow.h" +#include "./ui_mainwindow.h" + +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent) + , ui(new Ui::MainWindow) +{ + ui->setupUi(this); + uh = new UsbHandler(this); + + connect(uh,&UsbHandler::productListUpdate,this,&MainWindow::comboxUpdate); + connect(uh,&UsbHandler::errorOccurred,this,&MainWindow::onLogPrint); + connect(uh,&UsbHandler::interfaceListUpdate,this,&MainWindow::comboxUpdate_interface); + connect(uh,&UsbHandler::endPointListUpdate,this,&MainWindow::comboxUpdate_endpoint); +} + +MainWindow::~MainWindow() +{ + delete ui; +} + +void MainWindow::on_pushButton_clicked() +{ + uh->listDevices(); +} + + + +void MainWindow::comboxUpdate(QMap *__productList){ + ui->comboBox->clear();; + LOG_DEBUG("list length is %d",__productList->size()); + QMap::iterator it; + for(it=__productList->begin();it!=__productList->end();it++){ + ui->comboBox->addItem(QString::number(it.key())+":"+it.value()); + } +} + +void MainWindow::on_pushButton_6_clicked() +{ + QString tmp = ui->comboBox->currentText(); + uh->openDevice(tmp.at(0).digitValue()); + LOG_DEBUG("try to open device,index is %d",tmp.at(0).digitValue()); + uh->listInterfaces(tmp.at(0).digitValue()); +} + + +void MainWindow::onLogPrint(QString err){ + QDateTime cur = QDateTime::currentDateTime(); + QString tmp =cur.toString("yyyy-MM-dd HH:mm:ss"); + ui->textBrowser->append(tmp+" --> "+err); +} + +void MainWindow::on_pushButton_7_clicked() +{ + uh->closeDevice(); +} + + +void MainWindow::comboxUpdate_interface(QMap *__interfaceList){ + ui->comboBox_2->clear(); + LOG_DEBUG("list length is %d",__interfaceList->size()); + QMap::iterator it; + for(it=__interfaceList->begin();it!=__interfaceList->end();it++){ + ui->comboBox_2->addItem(QString::number(it.key())+":"+it.value()); + } +} + +void MainWindow::on_pushButton_2_clicked() +{ + LOG_DEBUG("Defalut: Acquire device description"); + unsigned char *data =new unsigned char [18]; + memset(data,0,18); + uh->sendControlTransfer(0x80,0x06,0x0100,0x0000,data,18); + for(int i=0;i<18;i++){ + LOG_DEBUG("data[%d] is 0x%x",i,data[i]); + } +} + + +void MainWindow::comboxUpdate_endpoint(QMap *__endPointList){ + ui->comboBox_3->clear(); + LOG_DEBUG("list length is %d",__endPointList->size()); + QMap::iterator it; + for(it=__endPointList->begin();it!=__endPointList->end();it++){ + ui->comboBox_3->addItem(QString::number(it.key())+":"+it.value()); + } +} + +void MainWindow::on_pushButton_8_clicked() +{ + QString tmp = ui->comboBox->currentText(); + int deviceIdx = tmp.at(0).digitValue(); + tmp = ui->comboBox_2->currentText(); + int interfaceIdx = tmp.at(0).digitValue(); + uh->listInterfaceEndpoints(deviceIdx,interfaceIdx); +} + + +void MainWindow::on_pushButton_4_clicked() +{ + QString tmp = ui->comboBox_3->currentText(); + QRegularExpression regex("0x[0-9A-Fa-f]+"); // 匹配以 "0x" 开头的16进制数 + QRegularExpressionMatch match = regex.match(tmp); + QString endpointAddress = match.captured(0); // 获取第一个匹配的结果 + uint8_t endpointValue = endpointAddress.mid(2).toUInt(NULL, 16); // 16 表示十六进制 + + uint8_t data=ui->textEdit->toPlainText().toUInt(); + int len = ui->textEdit->toPlainText().length(); + if(uh->sendBulkTransfer(endpointValue,&data,len)){ + LOG_DEBUG("Send endPoint 0x%x via BulkTransfer success.",endpointValue); + } + +} + + +void MainWindow::on_pushButton_3_clicked() +{ + QString tmp = ui->comboBox_3->currentText(); + QRegularExpression regex("0x[0-9A-Fa-f]+"); // 匹配以 "0x" 开头的16进制数 + QRegularExpressionMatch match = regex.match(tmp); + QString endpointAddress = match.captured(0); // 获取第一个匹配的结果 + uint8_t endpointValue = endpointAddress.mid(2).toUInt(NULL, 16); // 16 表示十六进制 + + uint8_t data=ui->textEdit->toPlainText().toUInt(); + int len = ui->textEdit->toPlainText().length(); + if(uh->sendAsyncTransfer(endpointValue,&data,len)){ + LOG_DEBUG("Send endPoint 0x%x via AsyncTransfer success.",endpointValue); + } +} + + + + + +void MainWindow::on_pushButton_5_clicked() +{ + ui->textBrowser->clear(); +} + diff --git a/mainwindow.h b/mainwindow.h new file mode 100644 index 0000000..99ca553 --- /dev/null +++ b/mainwindow.h @@ -0,0 +1,51 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include +#include "usbhandler.h" +#include +#include "QDateTime" + +QT_BEGIN_NAMESPACE +namespace Ui { +class MainWindow; +} +QT_END_NAMESPACE + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + MainWindow(QWidget *parent = nullptr); + ~MainWindow(); + + +private slots: + void on_pushButton_clicked(); + void comboxUpdate(QMap *__productList); + void comboxUpdate_interface(QMap *__interfaceList); + void comboxUpdate_endpoint(QMap *__endPointList); + + void onLogPrint(QString err); + + void on_pushButton_6_clicked(); + + void on_pushButton_7_clicked(); + + void on_pushButton_2_clicked(); + + void on_pushButton_8_clicked(); + + void on_pushButton_4_clicked(); + + void on_pushButton_3_clicked(); + + + void on_pushButton_5_clicked(); + +private: + Ui::MainWindow *ui; + UsbHandler *uh; +}; +#endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui new file mode 100644 index 0000000..95c0c27 --- /dev/null +++ b/mainwindow.ui @@ -0,0 +1,162 @@ + + + MainWindow + + + + 0 + 0 + 814 + 613 + + + + + 0 + 0 + + + + MainWindow + + + + + + + + + + + + + Refresh + + + + + + + Send ViaBulkTrans + + + + + + + Send ViaControlTrans + + + + + + + send ViaAsyncTrans + + + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + Device List: + + + + + + + Check + + + + + + + + + + Close + + + + + + + Open + + + + + + + LOG + + + + + + + EndPoint List: + + + + + + + + 0 + 0 + + + + + + + + Interface List: + + + + + + + Clear + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + + + diff --git a/usbhandler.cpp b/usbhandler.cpp new file mode 100644 index 0000000..aeec342 --- /dev/null +++ b/usbhandler.cpp @@ -0,0 +1,300 @@ +#include "usbhandler.h" + +UsbHandler::UsbHandler(QObject *parent) : QObject(parent), context(nullptr), deviceList(nullptr), deviceCount(0), handle(nullptr) +{ + // Initialize libusb context + if (libusb_init(&context) < 0) { + emit errorOccurred("Failed to initialize libusb."); + } +} + +UsbHandler::~UsbHandler() +{ + if (handle) { + libusb_close(handle); + } + if (deviceList) { + libusb_free_device_list(deviceList, 1); + } + libusb_exit(context); +} + +bool UsbHandler::initialize() +{ + // Initialize the libusb context and check for errors + if (libusb_init(&context) < 0) { + emit errorOccurred("Failed to initialize libusb."); + return false; + } + return true; +} + +void UsbHandler::listDevices() +{ + // Retrieve the list of connected USB devices + deviceCount = libusb_get_device_list(context, &deviceList); + if (deviceCount < 0) { + emit errorOccurred("Failed to get USB device list."); + return; + }else{ + productList = new QMap[deviceCount]; + } + + + for (ssize_t i = 0; i < deviceCount; ++i) { + productList->insert(i,printDeviceInfo(deviceList[i])); + // Optionally add more detailed device information here + } + emit productListUpdate(productList); +} + +bool UsbHandler::openDevice(int deviceIndex) +{ + if (deviceIndex < 0 || deviceIndex >= deviceCount) { + emit errorOccurred("Invalid device index."); + return false; + } + + // Open the selected device + libusb_device_handle *devHandle; + int status = libusb_open(deviceList[deviceIndex], &devHandle); + if (status < 0) { + emit errorOccurred("Failed to open USB device."); + return false; + } + + // Store the device handle for further operations + handle = devHandle; + LOG_DEBUG("open deviceindex %d success",deviceIndex); + return true; +} + +bool UsbHandler::sendControlTransfer(uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint8_t *data, uint16_t length) +{ + if (handle == nullptr) { + emit errorOccurred("No device handle."); + return false; + } + int status = libusb_control_transfer(handle, bmRequestType, bRequest, wValue, wIndex, data, length, 1000); + if (status < 0) { + emit errorOccurred("Control transfer failed."); + return false; + } + return true; +} + +bool UsbHandler::sendBulkTransfer(uint8_t endpoint, uint8_t *data, int length) +{ + if (handle == nullptr) { + emit errorOccurred("No device handle."); + return false; + } + + int actualLength; + int status = libusb_bulk_transfer(handle, endpoint, data, length, &actualLength, 1000); + if (status < 0) { + emit errorOccurred("Bulk transfer failed."); + return false; + } + return true; +} + +//主要用在数据读,从设备到主机 +// bool UsbHandler::sendInterruptTransfer(uint8_t endpoint, uint8_t *data, int length) +// { +// if (handle == nullptr) { +// emit errorOccurred("No device handle."); +// return false; +// } + +// int actualLength; +// int status = libusb_interrupt_transfer(handle, endpoint, data, length, &actualLength, 1000); +// if (status < 0) { +// emit errorOccurred("Interrupt transfer failed."); +// return false; +// } +// return true; +// } + + +bool UsbHandler::sendAsyncTransfer(uint8_t endpoint, uint8_t *data, int length) +{ + if (handle == nullptr) { + emit errorOccurred("No device handle."); + return false; + } + + // 1. 创建 libusb_transfer 对象 + libusb_transfer *transfer = libusb_alloc_transfer(0); // 0 表示默认的最大传输包大小 + if (transfer == nullptr) { + emit errorOccurred("Failed to allocate transfer."); + return false; + } + + // 2. 设置传输类型和参数 + if (endpoint & LIBUSB_ENDPOINT_IN) { // 如果是输入端点 (IN) + libusb_fill_bulk_transfer(transfer, handle, endpoint, data, length, + [](libusb_transfer *transfer) { + // 回调函数,当传输完成时调用 + if (transfer->status == LIBUSB_TRANSFER_COMPLETED) { + LOG_DEBUG("Async Transfer completed successfully."); + } else { + LOG_ERROR("Async Transfer failed with status:0x%x",transfer->status); + } + libusb_free_transfer(transfer); // 释放传输资源 + }, nullptr, 0); + } else { // 如果是输出端点 (OUT) + libusb_fill_bulk_transfer(transfer, handle, endpoint, data, length, + [](libusb_transfer *transfer) { + // 回调函数,当传输完成时调用 + if (transfer->status == LIBUSB_TRANSFER_COMPLETED) { + LOG_DEBUG("Async Transfer completed successfully."); + } else { + LOG_ERROR("Async Transfer failed with status:0x%x",transfer->status); + } + libusb_free_transfer(transfer); // 释放传输资源 + }, nullptr, 0); + } + + // 3. 提交传输 + int status = libusb_submit_transfer(transfer); + if (status < 0) { + emit errorOccurred("Failed to submit async transfer."); + libusb_free_transfer(transfer); + return false; + } + + libusb_handle_events(context); // 确保事件循环能处理异步传输 + + return true; +} + +QString UsbHandler::printDeviceInfo(libusb_device *device) +{ + libusb_device_descriptor desc; + QString tmp={}; + if (libusb_get_device_descriptor(device, &desc) == 0) { + tmp= "Vendor ID: 0x"+QString::number(desc.idVendor,16)+",Product ID: 0x"+QString::number(desc.idProduct,16); + LOG_DEBUG("Vendor ID: 0x%x, Product ID: 0x%x", desc.idVendor, desc.idProduct); + } else { + LOG_ERROR("Failed to retrieve device descriptor."); + } + return tmp; +} + + +void UsbHandler::listInterfaces(int deviceIndex) { + if (deviceIndex < 0 || deviceIndex >= deviceCount) { + emit errorOccurred("无效的设备索引"); + return; + } + + libusb_device *device = deviceList[deviceIndex]; + + libusb_config_descriptor *config = nullptr; + if (libusb_get_active_config_descriptor(device, &config) != 0) { + emit errorOccurred("获取配置描述符失败"); + return; + } + + LOG_DEBUG("接口总数: %d",config->bNumInterfaces); + + interfaceList = new QMap[config->bNumInterfaces]; + + + for (int i = 0; i < config->bNumInterfaces; ++i) { + const libusb_interface &interface = config->interface[i]; + QString tmp; + + for (int j = 0; j < interface.num_altsetting; ++j) { + const libusb_interface_descriptor &alt = interface.altsetting[j]; + + tmp += QString("Interface #[%1]: %2, Class: %3, SubClass: %4, Protocol: %5") + .arg(i) + .arg(alt.bInterfaceNumber) + .arg(alt.bInterfaceClass) + .arg(alt.bInterfaceSubClass) + .arg(alt.bInterfaceProtocol); + } + + interfaceList->insert(i, tmp); + } + + + libusb_free_config_descriptor(config); + emit interfaceListUpdate(interfaceList); +} + + +void UsbHandler::listInterfaceEndpoints(int deviceIndex, int interfaceNumber) { + LOG_DEBUG("devivceIdx is %d,interfaceiIdx is %d",deviceIndex,interfaceNumber); + if (deviceIndex < 0 || deviceIndex >= deviceCount) { + qDebug() << "无效的设备索引"; + return; + } + + libusb_device *device = deviceList[deviceIndex]; + libusb_config_descriptor *config = nullptr; + + if (libusb_get_active_config_descriptor(device, &config) != 0) { + qDebug() << "获取配置描述符失败"; + return; + } + + if (interfaceNumber < 0 || interfaceNumber >= config->bNumInterfaces) { + qDebug() << "无效的接口编号"; + libusb_free_config_descriptor(config); + return; + } + + const libusb_interface &interface = config->interface[interfaceNumber]; + + if (interface.num_altsetting < 1) { + qDebug() << "接口无 altsetting"; + libusb_free_config_descriptor(config); + return; + } + + endPointList = new QMap; + for(int j=0;jinsert(k, info); + } + } + + libusb_free_config_descriptor(config); + + emit endPointListUpdate(endPointList); +} + +bool UsbHandler::closeDevice() { + if (handle) { + libusb_close(handle); + handle = nullptr; + LOG_DEBUG("设备关闭成功"); + return true; + } else { + LOG_DEBUG("无打开的设备"); + return false; + } +} diff --git a/usbhandler.h b/usbhandler.h new file mode 100644 index 0000000..273b9dd --- /dev/null +++ b/usbhandler.h @@ -0,0 +1,67 @@ +#ifndef USBHANDLER_H +#define USBHANDLER_H + +#include +#include +#include +#include +#include +#include "log.h" +#include "QMap" + +class UsbHandler : public QObject +{ + Q_OBJECT + +public: + explicit UsbHandler(QObject *parent = nullptr); + ~UsbHandler(); + + bool initialize(); + void listDevices(); + bool openDevice(int deviceIndex); // New function to open a device by index + //控制传输使用的是 endpoint 0(默认控制端点) + bool sendControlTransfer( + uint8_t bmRequestType, // 请求类型 + uint8_t bRequest, // 请求编号 + uint16_t wValue, // 请求参数值(根据请求定义而定) + uint16_t wIndex, // 接口号或端点号 + uint8_t *data, // 数据缓冲区(发送或接收) + uint16_t length // 数据长度 + ); + + + bool sendBulkTransfer(uint8_t endpoint, uint8_t *data, int length); + bool sendAsyncTransfer(uint8_t endpoint, uint8_t *data, int length); + void listInterfaces(int deviceIndex); + + // bool sendInterruptTransfer(uint8_t endpoint, uint8_t *data, int length); + + bool closeDevice(); + + void listInterfaceEndpoints(int deviceIndex, int interfaceNumber); + + + +signals: + void errorOccurred(const QString &errorMessage); + void productListUpdate(QMap *_productList); + void interfaceListUpdate(QMap *_interfaceList); + void endPointListUpdate(QMap *_endPointList); + + + +private: + libusb_context *context; + libusb_device **deviceList; + ssize_t deviceCount; + libusb_device_handle *handle; + QMap *productList; + QMap *interfaceList; + QMap *endPointList; + + + QString printDeviceInfo(libusb_device *device); +}; + +#endif // USBHANDLER_H