init.
This commit is contained in:
commit
11c0e2347a
76
CMakeLists.txt
Normal file
76
CMakeLists.txt
Normal file
@ -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()
|
||||
463
CMakeLists.txt.user
Normal file
463
CMakeLists.txt.user
Normal file
@ -0,0 +1,463 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE QtCreatorProject>
|
||||
<!-- Written by QtCreator 16.0.1, 2025-05-14T21:31:38. -->
|
||||
<qtcreator>
|
||||
<data>
|
||||
<variable>EnvironmentId</variable>
|
||||
<value type="QByteArray">{1ef3ffc4-a5a8-4c60-8a81-af3ba8bbb143}</value>
|
||||
</data>
|
||||
<data>
|
||||
<variable>ProjectExplorer.Project.ActiveTarget</variable>
|
||||
<value type="qlonglong">0</value>
|
||||
</data>
|
||||
<data>
|
||||
<variable>ProjectExplorer.Project.EditorSettings</variable>
|
||||
<valuemap type="QVariantMap">
|
||||
<value type="bool" key="EditorConfiguration.AutoDetect">true</value>
|
||||
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
|
||||
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
|
||||
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
|
||||
<value type="QString" key="language">Cpp</value>
|
||||
<valuemap type="QVariantMap" key="value">
|
||||
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
|
||||
</valuemap>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
|
||||
<value type="QString" key="language">QmlJS</value>
|
||||
<valuemap type="QVariantMap" key="value">
|
||||
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
|
||||
</valuemap>
|
||||
</valuemap>
|
||||
<value type="qlonglong" key="EditorConfiguration.CodeStyle.Count">2</value>
|
||||
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
|
||||
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
|
||||
<value type="int" key="EditorConfiguration.IndentSize">4</value>
|
||||
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
|
||||
<value type="int" key="EditorConfiguration.LineEndingBehavior">0</value>
|
||||
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
|
||||
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
|
||||
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
|
||||
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
|
||||
<value type="int" key="EditorConfiguration.PreferAfterWhitespaceComments">0</value>
|
||||
<value type="bool" key="EditorConfiguration.PreferSingleLineComments">false</value>
|
||||
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
|
||||
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
|
||||
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">2</value>
|
||||
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
|
||||
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
|
||||
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
|
||||
<value type="int" key="EditorConfiguration.TabSize">8</value>
|
||||
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
|
||||
<value type="bool" key="EditorConfiguration.UseIndenter">false</value>
|
||||
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
|
||||
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
|
||||
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
|
||||
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
|
||||
<value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, Makefile</value>
|
||||
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
|
||||
<value type="bool" key="EditorConfiguration.skipTrailingWhitespace">true</value>
|
||||
<value type="bool" key="EditorConfiguration.tintMarginArea">true</value>
|
||||
</valuemap>
|
||||
</data>
|
||||
<data>
|
||||
<variable>ProjectExplorer.Project.PluginSettings</variable>
|
||||
<valuemap type="QVariantMap">
|
||||
<valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks">
|
||||
<value type="bool" key="AutoTest.Framework.Boost">true</value>
|
||||
<value type="bool" key="AutoTest.Framework.CTest">false</value>
|
||||
<value type="bool" key="AutoTest.Framework.Catch">true</value>
|
||||
<value type="bool" key="AutoTest.Framework.GTest">true</value>
|
||||
<value type="bool" key="AutoTest.Framework.QtQuickTest">true</value>
|
||||
<value type="bool" key="AutoTest.Framework.QtTest">true</value>
|
||||
</valuemap>
|
||||
<value type="bool" key="AutoTest.ApplyFilter">false</value>
|
||||
<valuemap type="QVariantMap" key="AutoTest.CheckStates"/>
|
||||
<valuelist type="QVariantList" key="AutoTest.PathFilters"/>
|
||||
<value type="int" key="AutoTest.RunAfterBuild">0</value>
|
||||
<value type="bool" key="AutoTest.UseGlobal">true</value>
|
||||
<valuemap type="QVariantMap" key="ClangTools">
|
||||
<value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
|
||||
<value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
|
||||
<value type="QString" key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
|
||||
<value type="int" key="ClangTools.ParallelJobs">4</value>
|
||||
<value type="bool" key="ClangTools.PreferConfigFile">true</value>
|
||||
<valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
|
||||
<valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
|
||||
<valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
|
||||
<value type="bool" key="ClangTools.UseGlobalSettings">true</value>
|
||||
</valuemap>
|
||||
</valuemap>
|
||||
</data>
|
||||
<data>
|
||||
<variable>ProjectExplorer.Project.Target.0</variable>
|
||||
<valuemap type="QVariantMap">
|
||||
<value type="QString" key="DeviceType">Desktop</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 6.6.3 GCC 64bit</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 6.6.3 GCC 64bit</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt6.663.gcc_64_kit</value>
|
||||
<value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
|
||||
<value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
|
||||
<value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
|
||||
<value type="QString" key="CMake.Build.Type">Debug</value>
|
||||
<value type="int" key="CMake.Configure.BaseEnvironment">2</value>
|
||||
<value type="bool" key="CMake.Configure.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMake.Configure.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="CMake.Initial.Parameters">-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}</value>
|
||||
<value type="int" key="EnableQmlDebugging">0</value>
|
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/leo/devCode/outer/USBFilter_30/uppper_LibUSB/build/Desktop_Qt_6_6_3_GCC_64bit-Debug</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||
<value type="QString">all</value>
|
||||
</valuelist>
|
||||
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||
</valuemap>
|
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||
<value type="QString">clean</value>
|
||||
</valuelist>
|
||||
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||
</valuemap>
|
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
|
||||
<value type="QString" key="CMake.Build.Type">Release</value>
|
||||
<value type="int" key="CMake.Configure.BaseEnvironment">2</value>
|
||||
<value type="bool" key="CMake.Configure.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMake.Configure.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="CMake.Initial.Parameters">-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}</value>
|
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/leo/devCode/outer/USBFilter_30/uppper_LibUSB/build/Desktop_Qt_6_6_3_GCC_64bit-Release</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||
<value type="QString">all</value>
|
||||
</valuelist>
|
||||
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||
</valuemap>
|
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||
<value type="QString">clean</value>
|
||||
</valuelist>
|
||||
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||
</valuemap>
|
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
|
||||
<value type="QString" key="CMake.Build.Type">RelWithDebInfo</value>
|
||||
<value type="int" key="CMake.Configure.BaseEnvironment">2</value>
|
||||
<value type="bool" key="CMake.Configure.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMake.Configure.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="CMake.Initial.Parameters">-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}</value>
|
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/leo/devCode/outer/USBFilter_30/uppper_LibUSB/build/Desktop_Qt_6_6_3_GCC_64bit-RelWithDebInfo</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||
<value type="QString">all</value>
|
||||
</valuelist>
|
||||
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||
</valuemap>
|
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||
<value type="QString">clean</value>
|
||||
</valuelist>
|
||||
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||
</valuemap>
|
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release with Debug Information</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.3">
|
||||
<value type="QString" key="CMake.Build.Type">RelWithDebInfo</value>
|
||||
<value type="int" key="CMake.Configure.BaseEnvironment">2</value>
|
||||
<value type="bool" key="CMake.Configure.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMake.Configure.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="CMake.Initial.Parameters">-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}</value>
|
||||
<value type="int" key="EnableQmlDebugging">0</value>
|
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/leo/devCode/outer/USBFilter_30/uppper_LibUSB/build/Desktop_Qt_6_6_3_GCC_64bit-Profile</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||
<value type="QString">all</value>
|
||||
</valuelist>
|
||||
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||
</valuemap>
|
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||
<value type="QString">clean</value>
|
||||
</valuelist>
|
||||
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||
</valuemap>
|
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.4">
|
||||
<value type="QString" key="CMake.Build.Type">MinSizeRel</value>
|
||||
<value type="int" key="CMake.Configure.BaseEnvironment">2</value>
|
||||
<value type="bool" key="CMake.Configure.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMake.Configure.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="CMake.Initial.Parameters">-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}</value>
|
||||
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/leo/devCode/outer/USBFilter_30/uppper_LibUSB/build/Desktop_Qt_6_6_3_GCC_64bit-MinSizeRel</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||
<value type="QString">all</value>
|
||||
</valuelist>
|
||||
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||
</valuemap>
|
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||
<value type="QString">clean</value>
|
||||
</valuelist>
|
||||
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
|
||||
</valuemap>
|
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
|
||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Minimum Size Release</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
|
||||
</valuemap>
|
||||
<value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">5</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
|
||||
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.1">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
||||
<value type="QString" key="CMakeProjectManager.MakeStep.BuildPreset"></value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
|
||||
<value type="QString"></value>
|
||||
</valuelist>
|
||||
<value type="bool" key="CMakeProjectManager.MakeStep.ClearSystemEnvironment">false</value>
|
||||
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.UserEnvironmentChanges"/>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ApplicationManagerPlugin.Deploy.CMakePackageStep</value>
|
||||
</valuemap>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
||||
<value type="QString" key="ApplicationManagerPlugin.Deploy.InstallPackageStep.Arguments">install-package --acknowledge</value>
|
||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Install Application Manager package</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ApplicationManagerPlugin.Deploy.InstallPackageStep</value>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedFiles"/>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedHosts"/>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedRemotePaths"/>
|
||||
<valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedSysroots"/>
|
||||
<valuelist type="QVariantList" key="RemoteLinux.LastDeployedLocalTimes"/>
|
||||
<valuelist type="QVariantList" key="RemoteLinux.LastDeployedRemoteTimes"/>
|
||||
</valuemap>
|
||||
<value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
||||
</valuemap>
|
||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
|
||||
<value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ApplicationManagerPlugin.Deploy.Configuration</value>
|
||||
</valuemap>
|
||||
<value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">2</value>
|
||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
|
||||
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
|
||||
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
|
||||
<value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
|
||||
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
|
||||
<valuelist type="QVariantList" key="CustomOutputParsers"/>
|
||||
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
|
||||
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
|
||||
<value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
|
||||
<value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph dwarf,4096 -F 250</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">uppper_LibUSB</value>
|
||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeRunConfiguration.</value>
|
||||
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">uppper_LibUSB</value>
|
||||
<value type="bool" key="ProjectExplorer.RunConfiguration.Customized">true</value>
|
||||
<value type="bool" key="RunConfiguration.RunAsRoot">true</value>
|
||||
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
|
||||
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
|
||||
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
|
||||
<value type="QString" key="RunConfiguration.WorkingDirectory.default">/home/leo/devCode/outer/USBFilter_30/uppper_LibUSB/build/Desktop_Qt_6_6_3_GCC_64bit-Debug</value>
|
||||
</valuemap>
|
||||
<value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
|
||||
</valuemap>
|
||||
</data>
|
||||
<data>
|
||||
<variable>ProjectExplorer.Project.TargetCount</variable>
|
||||
<value type="qlonglong">1</value>
|
||||
</data>
|
||||
<data>
|
||||
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
|
||||
<value type="int">22</value>
|
||||
</data>
|
||||
<data>
|
||||
<variable>Version</variable>
|
||||
<value type="int">22</value>
|
||||
</data>
|
||||
</qtcreator>
|
||||
@ -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()
|
||||
@ -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")
|
||||
|
||||
|
||||
|
||||
@ -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)
|
||||
BIN
build/Desktop_Qt_6_6_3_GCC_64bit-Debug/uppper_LibUSB
Executable file
BIN
build/Desktop_Qt_6_6_3_GCC_64bit-Debug/uppper_LibUSB
Executable file
Binary file not shown.
@ -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 <QtCore/QVariant>
|
||||
#include <QtWidgets/QApplication>
|
||||
#include <QtWidgets/QComboBox>
|
||||
#include <QtWidgets/QGridLayout>
|
||||
#include <QtWidgets/QLabel>
|
||||
#include <QtWidgets/QMainWindow>
|
||||
#include <QtWidgets/QPushButton>
|
||||
#include <QtWidgets/QSpacerItem>
|
||||
#include <QtWidgets/QStatusBar>
|
||||
#include <QtWidgets/QTextBrowser>
|
||||
#include <QtWidgets/QTextEdit>
|
||||
#include <QtWidgets/QWidget>
|
||||
|
||||
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
|
||||
@ -0,0 +1,3 @@
|
||||
// This file is autogenerated. Changes will be overwritten.
|
||||
#include "EWIEGA46WW/moc_mainwindow.cpp"
|
||||
#include "EWIEGA46WW/moc_usbhandler.cpp"
|
||||
80
log.h
Normal file
80
log.h
Normal file
@ -0,0 +1,80 @@
|
||||
#ifndef LOG_H
|
||||
#define LOG_H
|
||||
|
||||
#include <ctime> // 使用 std::time 和 std::strftime
|
||||
#include <cstdio> // 使用 printf
|
||||
#include <cstdarg> // 使用 va_list 和 va_start
|
||||
#include <mutex> // 使用 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<std::mutex> 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
|
||||
13
main.cpp
Normal file
13
main.cpp
Normal file
@ -0,0 +1,13 @@
|
||||
#include "mainwindow.h"
|
||||
|
||||
#include <QApplication>
|
||||
|
||||
|
||||
FILE* log_output =stdout;
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QApplication a(argc, argv);
|
||||
MainWindow w;
|
||||
w.show();
|
||||
return a.exec();
|
||||
}
|
||||
139
mainwindow.cpp
Normal file
139
mainwindow.cpp
Normal file
@ -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<int, QString> *__productList){
|
||||
ui->comboBox->clear();;
|
||||
LOG_DEBUG("list length is %d",__productList->size());
|
||||
QMap<int,QString>::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<int, QString> *__interfaceList){
|
||||
ui->comboBox_2->clear();
|
||||
LOG_DEBUG("list length is %d",__interfaceList->size());
|
||||
QMap<int,QString>::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<int, QString> *__endPointList){
|
||||
ui->comboBox_3->clear();
|
||||
LOG_DEBUG("list length is %d",__endPointList->size());
|
||||
QMap<int,QString>::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();
|
||||
}
|
||||
|
||||
51
mainwindow.h
Normal file
51
mainwindow.h
Normal file
@ -0,0 +1,51 @@
|
||||
#ifndef MAINWINDOW_H
|
||||
#define MAINWINDOW_H
|
||||
|
||||
#include <QMainWindow>
|
||||
#include "usbhandler.h"
|
||||
#include <QRegularExpression>
|
||||
#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<int,QString> *__productList);
|
||||
void comboxUpdate_interface(QMap<int,QString> *__interfaceList);
|
||||
void comboxUpdate_endpoint(QMap<int,QString> *__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
|
||||
162
mainwindow.ui
Normal file
162
mainwindow.ui
Normal file
@ -0,0 +1,162 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MainWindow</class>
|
||||
<widget class="QMainWindow" name="MainWindow">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>814</width>
|
||||
<height>613</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>MainWindow</string>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="1" column="1">
|
||||
<widget class="QComboBox" name="comboBox"/>
|
||||
</item>
|
||||
<item row="12" column="0" colspan="4">
|
||||
<widget class="QTextBrowser" name="textBrowser"/>
|
||||
</item>
|
||||
<item row="0" column="0" colspan="4">
|
||||
<widget class="QPushButton" name="pushButton">
|
||||
<property name="text">
|
||||
<string>Refresh</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="2" colspan="2">
|
||||
<widget class="QPushButton" name="pushButton_4">
|
||||
<property name="text">
|
||||
<string>Send ViaBulkTrans</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="2" colspan="2">
|
||||
<widget class="QPushButton" name="pushButton_2">
|
||||
<property name="text">
|
||||
<string>Send ViaControlTrans</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="10" column="2" colspan="2">
|
||||
<widget class="QPushButton" name="pushButton_3">
|
||||
<property name="text">
|
||||
<string>send ViaAsyncTrans</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="QComboBox" name="comboBox_3"/>
|
||||
</item>
|
||||
<item row="9" column="2">
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Orientation::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Device List:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="2" colspan="2">
|
||||
<widget class="QPushButton" name="pushButton_8">
|
||||
<property name="text">
|
||||
<string>Check</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0" rowspan="6" colspan="2">
|
||||
<widget class="QTextEdit" name="textEdit"/>
|
||||
</item>
|
||||
<item row="4" column="2" colspan="2">
|
||||
<widget class="QPushButton" name="pushButton_7">
|
||||
<property name="text">
|
||||
<string>Close</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2" colspan="2">
|
||||
<widget class="QPushButton" name="pushButton_6">
|
||||
<property name="text">
|
||||
<string>Open</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="11" column="1">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>LOG</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>EndPoint List:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QComboBox" name="comboBox_2">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>Interface List:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="13" column="3">
|
||||
<widget class="QPushButton" name="pushButton_5">
|
||||
<property name="text">
|
||||
<string>Clear</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="3">
|
||||
<spacer name="verticalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Orientation::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QStatusBar" name="statusbar"/>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
300
usbhandler.cpp
Normal file
300
usbhandler.cpp
Normal file
@ -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<int,QString>[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<int,QString>[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<int, QString>;
|
||||
for(int j=0;j<interface.num_altsetting;j++){
|
||||
const libusb_interface_descriptor &alt = interface.altsetting[j];
|
||||
|
||||
for (int k = 0; k < alt.bNumEndpoints; ++k) {
|
||||
const libusb_endpoint_descriptor &ep = alt.endpoint[k];
|
||||
|
||||
QString epTypeStr;
|
||||
switch (ep.bmAttributes & LIBUSB_TRANSFER_TYPE_MASK) {
|
||||
case LIBUSB_TRANSFER_TYPE_CONTROL: epTypeStr = "Control"; break;
|
||||
case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: epTypeStr = "Isochronous"; break;
|
||||
case LIBUSB_TRANSFER_TYPE_BULK: epTypeStr = "Bulk"; break;
|
||||
case LIBUSB_TRANSFER_TYPE_INTERRUPT: epTypeStr = "Interrupt"; break;
|
||||
default: epTypeStr = "Unknown"; break;
|
||||
}
|
||||
|
||||
QString direction = (ep.bEndpointAddress & LIBUSB_ENDPOINT_IN) ? "IN" : "OUT";
|
||||
|
||||
QString info= QString("Endpoint 0x%1 (%2, %3), MaxPacketSize: %4")
|
||||
.arg(ep.bEndpointAddress, 2, 16, QChar('0'))
|
||||
.arg(direction)
|
||||
.arg(epTypeStr)
|
||||
.arg(ep.wMaxPacketSize);
|
||||
endPointList->insert(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;
|
||||
}
|
||||
}
|
||||
67
usbhandler.h
Normal file
67
usbhandler.h
Normal file
@ -0,0 +1,67 @@
|
||||
#ifndef USBHANDLER_H
|
||||
#define USBHANDLER_H
|
||||
|
||||
#include <libusb-1.0/libusb.h>
|
||||
#include <QByteArray>
|
||||
#include <QString>
|
||||
#include <QObject>
|
||||
#include <QDebug>
|
||||
#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<int,QString> *_productList);
|
||||
void interfaceListUpdate(QMap<int,QString> *_interfaceList);
|
||||
void endPointListUpdate(QMap<int,QString> *_endPointList);
|
||||
|
||||
|
||||
|
||||
private:
|
||||
libusb_context *context;
|
||||
libusb_device **deviceList;
|
||||
ssize_t deviceCount;
|
||||
libusb_device_handle *handle;
|
||||
QMap<int,QString> *productList;
|
||||
QMap<int,QString> *interfaceList;
|
||||
QMap<int,QString> *endPointList;
|
||||
|
||||
|
||||
QString printDeviceInfo(libusb_device *device);
|
||||
};
|
||||
|
||||
#endif // USBHANDLER_H
|
||||
Reference in New Issue
Block a user