添加闪光检测模块以及优化单兵终端APP

mc_branch
camelliamc 4 hours ago
parent b65beebb67
commit 945651ca14

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AndroidProjectSystem">
<option name="providerId" value="com.android.tools.idea.GradleProjectSystem" />
</component>
</project>

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetSelector">
<selectionStates>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
</SelectionState>
</selectionStates>
</component>
</project>

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DeviceTable">
<option name="columnSorters">
<list>
<ColumnSorterState>
<option name="column" value="Name" />
<option name="order" value="ASCENDING" />
</ColumnSorterState>
</list>
</option>
</component>
</project>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="MarkdownSettings">
<option name="previewPanelProviderInfo">
<ProviderInfo name="Compose (experimental)" className="com.intellij.markdown.compose.preview.ComposePanelProvider" />
</option>
</component>
</project>

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
</project>

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer" />
<option value="com.intellij.execution.junit.AllInPackageConfigurationProducer" />
<option value="com.intellij.execution.junit.PatternConfigurationProducer" />
<option value="com.intellij.execution.junit.TestInClassConfigurationProducer" />
<option value="com.intellij.execution.junit.UniqueIdConfigurationProducer" />
<option value="com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer" />
</set>
</option>
</component>
</project>

@ -0,0 +1,149 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="NONE" />
</component>
<component name="ChangeListManager">
<list default="true" id="a18d9b77-f676-4091-8831-5c685bffe451" name="Changes" comment="" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="ClangdSettings">
<option name="formatViaClangd" value="false" />
</component>
<component name="ExecutionTargetManager" SELECTED_TARGET="device_and_snapshot_combo_box_target[]" />
<component name="ExternalProjectsData">
<projectState path="$PROJECT_DIR$">
<ProjectState />
</projectState>
</component>
<component name="ExternalProjectsManager">
<system id="GRADLE">
<state>
<projects_view>
<tree_state>
<expand>
<path>
<item name="" type="6a2764b6:ExternalProjectsStructure$RootNode" />
<item name="zhitu" type="f1a62948:ProjectNode" />
</path>
</expand>
<select />
</tree_state>
</projects_view>
</state>
</system>
</component>
<component name="GradleScriptDefinitionsStorage" workingDir="$PROJECT_DIR$" gradleHome="D:\Android\Gradle\wrapper\dists\gradle-8.13-bin\5xuhj0ry160q40clulazy9h7d\gradle-8.13" javaHome="D:\Android\Studio\jbr" gradleVersion="8.13" />
<component name="ProjectColorInfo">{
&quot;associatedIndex&quot;: 3
}</component>
<component name="ProjectId" id="3DoTBi94ujMtDXM9oMbLLm7MtVo" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"Android App.app.executor": "Run",
"ModuleVcsDetector.initialDetectionPerformed": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true",
"RunOnceActivity.cidr.known.project.marker": "true",
"RunOnceActivity.readMode.enableVisualFormatting": "true",
"SHELLCHECK.PATH": "C:\\Users\\86182\\AppData\\Roaming\\Google\\AndroidStudio2025.2.1\\plugins\\Shell Script\\shellcheck.exe",
"cf.first.check.clang-format": "false",
"cidr.known.project.marker": "true",
"com.google.services.firebase.aqiPopupShown": "true",
"kotlin-language-version-configured": "true",
"last_opened_file_path": "D:/Android/Projects/zhitu",
"settings.editor.selected.configurable": "preferences.pluginManager"
}
}]]></component>
<component name="RunManager">
<configuration name="app" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
<module name="zhitu.app" />
<option name="ANDROID_RUN_CONFIGURATION_SCHEMA_VERSION" value="1" />
<option name="DEPLOY" value="true" />
<option name="DEPLOY_APK_FROM_BUNDLE" value="false" />
<option name="DEPLOY_AS_INSTANT" value="false" />
<option name="ARTIFACT_NAME" value="" />
<option name="PM_INSTALL_OPTIONS" value="" />
<option name="ALL_USERS" value="false" />
<option name="ALWAYS_INSTALL_WITH_PM" value="false" />
<option name="ALLOW_ASSUME_VERIFIED" value="false" />
<option name="CLEAR_APP_STORAGE" value="false" />
<option name="DYNAMIC_FEATURES_DISABLED_LIST" value="" />
<option name="ACTIVITY_EXTRA_FLAGS" value="" />
<option name="MODE" value="default_activity" />
<option name="RESTORE_ENABLED" value="false" />
<option name="RESTORE_FILE" value="" />
<option name="RESTORE_FRESH_INSTALL_ONLY" value="false" />
<option name="CLEAR_LOGCAT" value="false" />
<option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
<option name="TARGET_SELECTION_MODE" value="DEVICE_AND_SNAPSHOT_COMBO_BOX" />
<option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
<option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
<option name="DEBUGGER_TYPE" value="Auto" />
<Auto>
<option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
<option name="SHOW_STATIC_VARS" value="true" />
<option name="WORKING_DIR" value="" />
<option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
<option name="SHOW_OPTIMIZED_WARNING" value="true" />
<option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" />
<option name="DEBUG_SANDBOX_SDK" value="false" />
</Auto>
<Hybrid>
<option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
<option name="SHOW_STATIC_VARS" value="true" />
<option name="WORKING_DIR" value="" />
<option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
<option name="SHOW_OPTIMIZED_WARNING" value="true" />
<option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" />
<option name="DEBUG_SANDBOX_SDK" value="false" />
</Hybrid>
<Java>
<option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" />
<option name="DEBUG_SANDBOX_SDK" value="false" />
</Java>
<Native>
<option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
<option name="SHOW_STATIC_VARS" value="true" />
<option name="WORKING_DIR" value="" />
<option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
<option name="SHOW_OPTIMIZED_WARNING" value="true" />
<option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" />
<option name="DEBUG_SANDBOX_SDK" value="false" />
</Native>
<Profilers>
<option name="ADVANCED_PROFILING_ENABLED" value="false" />
<option name="STARTUP_PROFILING_ENABLED" value="false" />
<option name="STARTUP_CPU_PROFILING_ENABLED" value="false" />
<option name="STARTUP_CPU_PROFILING_CONFIGURATION_NAME" value="Java/Kotlin Method Sample (legacy)" />
<option name="STARTUP_NATIVE_MEMORY_PROFILING_ENABLED" value="false" />
<option name="NATIVE_MEMORY_SAMPLE_RATE_BYTES" value="2048" />
</Profilers>
<option name="DEEP_LINK" value="" />
<option name="ACTIVITY" value="" />
<option name="ACTIVITY_CLASS" value="" />
<option name="SEARCH_ACTIVITY_IN_GLOBAL_SCOPE" value="false" />
<option name="SKIP_ACTIVITY_VALIDATION" value="false" />
<method v="2">
<option name="Android.Gradle.BeforeRunTask" enabled="true" />
</method>
</configuration>
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="a18d9b77-f676-4091-8831-5c685bffe451" name="Changes" comment="" />
<created>1778947288825</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1778947288825</updated>
</task>
<servers />
</component>
</project>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
</resources>

@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=file\:/D:/Andriod/Gradle/gradle-8.14.2-bin/gradle-8.14.2-bin.zip
distributionUrl=file\:/D:/Android/Gradle/gradle-8.13-bin.zip
networkTimeout=300000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME

@ -0,0 +1,59 @@
@echo off
echo ========================================
echo ZhiTu Build Script
echo ========================================
echo.
:: Check if in correct directory
if not exist "www\js\app.js" (
echo [ERROR] Please run this script from project root!
pause
exit /b 1
)
echo [1/4] Sync files to www directory...
xcopy /Y js\*.js www\js\ >nul
xcopy /Y css\*.css www\css\ >nul
xcopy /Y index.html www\ >nul
echo Done: Files synced
echo.
echo [2/4] Sync to Android platform...
call npx cap sync android
if errorlevel 1 (
echo [ERROR] Capacitor sync failed!
pause
exit /b 1
)
echo Done: Android sync completed
echo.
echo [3/4] Build APK...
cd android
call gradlew assembleDebug
if errorlevel 1 (
echo [ERROR] APK build failed!
cd ..
pause
exit /b 1
)
cd ..
echo Done: APK built
echo.
echo [4/4] Install to device/emulator...
adb uninstall com.zhitu.soldier >nul 2>&1
adb install android\app\build\outputs\apk\debug\app-debug.apk
if errorlevel 1 (
echo [WARN] APK install failed, check device connection
echo.
echo APK location: android\app\build\outputs\apk\debug\app-debug.apk
) else (
echo Done: APK installed
)
echo.
echo ========================================
echo Build Complete!
echo ========================================
pause

@ -1,13 +1,42 @@
/* ===== 主题变量 ===== */
:root {
/* 浅色主题(默认) */
--bg-primary: #f5f5f5;
--bg-secondary: #ffffff;
--bg-card: #ffffff;
--text-primary: #333333;
--text-secondary: #666666;
--text-muted: #999999;
--border-color: #e0e0e0;
--input-bg: #ffffff;
--menu-hover: #f5f5f5;
}
[data-theme="dark"] {
/* 深色主题 */
--bg-primary: #0f0f23;
--bg-secondary: #1a1a2e;
--bg-card: #16213e;
--text-primary: #e0e0e0;
--text-secondary: #b0b0b0;
--text-muted: #808080;
--border-color: #2a2a3e;
--input-bg: #1a1a2e;
--menu-hover: #1f2940;
}
/* ===== 全局重置 ===== */
* { margin: 0; padding: 0; box-sizing: border-box; }
html, body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;
background: #f5f5f5;
font-size: 16px;
background: var(--bg-primary);
height: 100%;
overflow: hidden;
color: #333;
color: var(--text-primary);
-webkit-tap-highlight-color: transparent;
transition: background 0.3s, color 0.3s;
}
#app {
@ -51,8 +80,8 @@ html, body {
justify-content: space-between;
align-items: center;
padding: 12px 16px;
background: #fff;
border-bottom: 1px solid #f0f0f0;
background: var(--bg-secondary);
border-bottom: 1px solid var(--border-color);
flex-shrink: 0;
}
.page-header .back-btn {
@ -63,7 +92,7 @@ html, body {
.page-header .page-title {
font-size: 15px;
font-weight: 600;
color: #333;
color: var(--text-primary);
}
/* ===== 用户卡片 ===== */
@ -165,7 +194,7 @@ html, body {
/* ===== 卡片 ===== */
.card {
background: white;
background: var(--bg-card);
border-radius: 12px;
padding: 14px;
margin-bottom: 10px;
@ -173,13 +202,13 @@ html, body {
}
.card-title {
font-size: 14px;
color: #666;
color: var(--text-secondary);
margin-bottom: 10px;
}
/* ===== 库存进度条 ===== */
.inventory-item {
background: white;
background: var(--bg-card);
border-radius: 12px;
padding: 12px 14px;
margin-bottom: 10px;
@ -215,7 +244,7 @@ html, body {
}
.location-text {
font-size: 14px;
color: #333;
color: var(--text-primary);
}
/* ===== 表单 ===== */
@ -224,7 +253,7 @@ html, body {
}
.form-label {
font-size: 14px;
color: #333;
color: var(--text-primary);
margin-bottom: 6px;
display: block;
font-weight: 500;
@ -232,17 +261,20 @@ html, body {
.select-box {
width: 100%;
padding: 12px;
border: 1px solid #e0e0e0;
border: 1px solid var(--border-color);
border-radius: 8px;
background: white;
background: var(--input-bg);
color: var(--text-primary);
font-size: 14px;
outline: none;
}
.form-input {
width: 100%;
padding: 12px;
border: 1px solid #e0e0e0;
border: 1px solid var(--border-color);
border-radius: 8px;
background: var(--input-bg);
color: var(--text-primary);
font-size: 14px;
outline: none;
}
@ -256,7 +288,7 @@ html, body {
}
.input-unit {
font-size: 14px;
color: #666;
color: var(--text-secondary);
}
/* ===== 单选组 ===== */
@ -267,13 +299,14 @@ html, body {
.radio-label {
flex: 1;
padding: 10px;
background: #f5f5f5;
background: var(--bg-primary);
border-radius: 8px;
text-align: center;
cursor: pointer;
border: 2px solid transparent;
font-size: 14px;
transition: all 0.2s;
color: var(--text-primary);
}
.radio-label.active {
background: #E6F7FF;
@ -293,8 +326,9 @@ html, body {
display: flex;
align-items: center;
padding: 8px 0;
border-bottom: 1px solid #f0f0f0;
border-bottom: 1px solid var(--border-color);
font-size: 13px;
color: var(--text-primary);
}
.annotate-item:last-child { border-bottom: none; }
.annotate-dot {
@ -315,7 +349,7 @@ html, body {
.drop-card.danger { border-left: 4px solid #FF4D4F; background: #FFF3F3; }
.drop-info {
font-size: 12px;
color: #666;
color: var(--text-secondary);
margin: 4px 0 10px;
}
.drop-info span { margin-right: 12px; }
@ -342,7 +376,7 @@ html, body {
/* ===== 任务监控 ===== */
.task-card { text-align: center; padding: 18px; }
.task-label { font-size: 13px; color: #666; margin-bottom: 5px; }
.task-label { font-size: 13px; color: var(--text-secondary); margin-bottom: 5px; }
.task-id { font-size: 18px; font-weight: 600; margin-bottom: 10px; }
.task-status {
display: inline-block;
@ -352,11 +386,11 @@ html, body {
font-weight: 600;
}
.task-status.running { background: #F6FFED; color: #52C41A; }
.task-eta { font-size: 13px; color: #666; margin-top: 8px; }
.task-eta { font-size: 13px; color: var(--text-secondary); margin-top: 8px; }
.progress-card { text-align: center; padding: 16px; }
.progress-text { font-size: 14px; color: #007AFF; font-weight: 600; margin-bottom: 6px; }
.progress-sub { font-size: 12px; color: #666; }
.progress-sub { font-size: 12px; color: var(--text-secondary); }
.path-card {
background: #E6F7FF;
@ -365,7 +399,7 @@ html, body {
margin-bottom: 12px;
}
.path-label { font-size: 12px; color: #007AFF; margin-bottom: 4px; }
.path-value { font-size: 15px; font-weight: 600; color: #333; margin-bottom: 12px; }
.path-value { font-size: 15px; font-weight: 600; color: var(--text-primary); margin-bottom: 12px; }
.path-value:last-child { margin-bottom: 0; }
.drop-zone {
@ -394,12 +428,12 @@ html, body {
display: flex;
justify-content: space-between;
padding: 10px 0;
border-bottom: 1px solid #f0f0f0;
border-bottom: 1px solid var(--border-color);
font-size: 14px;
}
.stat-row:last-child { border-bottom: none; }
.stat-label { color: #666; }
.stat-value { font-weight: 600; color: #333; }
.stat-label { color: var(--text-secondary); }
.stat-value { font-weight: 600; color: var(--text-primary); }
.stat-value.danger { color: #FF4D4F; }
.tag {
@ -415,16 +449,16 @@ html, body {
/* ===== 日志时间线 ===== */
.log-row {
font-size: 13px;
color: #666;
color: var(--text-secondary);
padding: 8px 0;
border-bottom: 1px solid #f0f0f0;
border-bottom: 1px solid var(--border-color);
}
.log-row:last-child { border-bottom: none; }
.log-time { color: #999; margin-right: 8px; }
.log-time { color: var(--text-muted); margin-right: 8px; }
/* ===== 地图占位 ===== */
.map-placeholder {
background: #F0F0F0;
background: var(--bg-primary);
border: 2px dashed #007AFF;
height: 140px;
display: flex;
@ -434,12 +468,12 @@ html, body {
text-align: center;
}
.map-icon { font-size: 30px; margin-bottom: 5px; }
.map-text { color: #666; font-size: 14px; }
.map-text { color: var(--text-secondary); font-size: 14px; }
/* ===== 警告卡片 ===== */
.warning-card { background: #FFF7E6; border: 1px solid #FFD591; }
.warning-title { font-size: 13px; color: #FA8C16; margin-bottom: 8px; }
.warning-item { font-size: 12px; color: #666; margin-bottom: 4px; }
.warning-item { font-size: 12px; color: var(--text-secondary); margin-bottom: 4px; }
/* ===== 按钮行 ===== */
.btn-row { display: flex; gap: 10px; margin-top: 16px; }
@ -470,14 +504,15 @@ html, body {
justify-content: space-between;
align-items: center;
padding: 14px 16px;
border-bottom: 1px solid #f0f0f0;
border-bottom: 1px solid var(--border-color);
cursor: pointer;
font-size: 14px;
transition: background 0.15s;
color: var(--text-primary);
}
.menu-item:active { background: #f5f5f5; }
.menu-item:active { background: var(--menu-hover); }
.menu-item:last-child { border-bottom: none; }
.menu-value { color: #666; font-size: 13px; }
.menu-value { color: var(--text-secondary); font-size: 13px; }
.menu-toggle {
width: 36px;
height: 20px;
@ -507,8 +542,8 @@ html, body {
/* ===== 底部Tab导航 ===== */
.tab-bar {
display: flex;
background: #fff;
border-top: 1px solid #e8e8e8;
background: var(--bg-secondary);
border-top: 1px solid var(--border-color);
padding-bottom: env(safe-area-inset-bottom);
flex-shrink: 0;
z-index: 100;
@ -524,7 +559,7 @@ html, body {
align-items: center;
padding: 6px 0;
cursor: pointer;
color: #999;
color: var(--text-muted);
transition: color 0.2s;
}
.tab-item.active { color: #007AFF; }
@ -551,3 +586,488 @@ html, body {
/* ===== 滚动条 ===== */
::-webkit-scrollbar { width: 0; }
/* ===== 登录/注册页面优化样式 ===== */
/* 登录页面背景 - 渐变 + 动态光晕 */
#page-login,
#page-register {
background: linear-gradient(135deg, #0F2027 0%, #203A43 50%, #2C5364 100%);
position: relative;
overflow: hidden;
}
/* 动态光晕装饰 */
#page-login::before,
#page-login::after,
#page-register::before,
#page-register::after {
content: '';
position: fixed;
border-radius: 50%;
filter: blur(70px);
opacity: 0.35;
pointer-events: none;
z-index: 0;
}
#page-login::before,
#page-register::before {
top: -15%;
right: -10%;
width: 350px;
height: 350px;
background: radial-gradient(circle, rgba(0,188,212,0.6) 0%, rgba(0,150,136,0.2) 100%);
}
#page-login::after,
#page-register::after {
bottom: -10%;
left: -10%;
width: 320px;
height: 320px;
background: radial-gradient(circle, rgba(255,152,0,0.45) 0%, rgba(255,87,34,0.1) 100%);
}
/* 登录主体容器 */
.login-body {
padding: 2rem 1.5rem 2rem;
position: relative;
z-index: 1;
max-width: 460px;
margin: 0 auto;
min-height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
}
/* 品牌区域 */
.login-logo {
font-size: 3.2rem;
margin-bottom: 0.5rem;
background: rgba(255,255,255,0.1);
width: 70px;
height: 70px;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 30px;
backdrop-filter: blur(4px);
box-shadow: 0 8px 20px rgba(0,0,0,0.2);
}
.login-title {
font-size: 1.9rem;
font-weight: 600;
letter-spacing: 2px;
background: linear-gradient(135deg, #FFF, #B2EBF2);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
margin-top: 0.5rem;
text-align: center;
}
.login-subtitle {
font-size: 0.85rem;
color: rgba(255, 255, 255, 0.7);
margin-top: 0.2rem;
text-align: center;
}
/* 表单样式优化 */
.login-form .form-group,
#page-register .form-group {
margin-bottom: 1.4rem;
}
.login-form .form-label,
#page-register .form-label {
display: block;
font-size: 0.85rem;
font-weight: 500;
margin-bottom: 0.4rem;
color: rgba(255, 255, 255, 0.7);
letter-spacing: 0.5px;
}
.login-form .form-input,
#page-register .form-input {
width: 100%;
padding: 0.9rem 1rem;
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 1.2rem;
font-size: 0.95rem;
color: #FFFFFF;
outline: none;
transition: all 0.3s ease;
}
.login-form .form-input:focus,
#page-register .form-input:focus {
border-color: #00BCD4;
box-shadow: 0 0 0 3px rgba(0, 188, 212, 0.35);
background: rgba(255,255,255,0.12);
}
.login-form .form-input::placeholder,
#page-register .form-input::placeholder {
color: rgba(255, 255, 255, 0.45);
font-size: 0.85rem;
}
/* 登录按钮优化 */
.login-form .button-large {
width: 100%;
padding: 0.9rem;
background: linear-gradient(105deg, #00BCD4 0%, #0097A7 100%);
border: none;
border-radius: 2rem;
font-size: 1rem;
font-weight: 600;
color: white;
cursor: pointer;
transition: all 0.2s ease;
margin-top: 0.8rem;
letter-spacing: 1px;
box-shadow: 0 6px 14px rgba(0,188,212,0.25);
}
.login-form .button-large:hover {
transform: translateY(-2px);
filter: brightness(1.05);
box-shadow: 0 10px 20px rgba(0,188,212,0.35);
}
.login-form .button-large:active {
transform: translateY(1px);
}
/* 切换链接 */
.login-switch {
text-align: center;
margin-top: 1.5rem;
color: rgba(255, 255, 255, 0.7);
font-size: 0.85rem;
cursor: pointer;
transition: all 0.3s ease;
}
.login-switch:hover {
color: #00BCD4;
}
/* 演示账号卡片 */
.login-demo,
.demo-card {
margin-top: 2rem;
background: rgba(255,255,255,0.04);
border-radius: 1.2rem;
padding: 0.8rem 1rem;
border: 1px solid rgba(255,255,255,0.06);
}
.demo-title {
font-size: 0.7rem;
text-transform: uppercase;
letter-spacing: 1px;
color: rgba(255, 255, 255, 0.7);
margin-bottom: 0.6rem;
text-align: center;
}
.demo-item,
.demo-btn {
padding: 0.5rem;
font-size: 0.8rem;
color: rgba(255, 255, 255, 0.8);
cursor: pointer;
transition: all 0.2s;
border-radius: 0.5rem;
margin-bottom: 0.3rem;
}
.demo-item:hover,
.demo-btn:hover {
background: rgba(0,188,212,0.18);
color: #00BCD4;
}
.demo-buttons {
display: flex;
gap: 0.8rem;
justify-content: center;
}
.demo-btn {
background: rgba(0,188,212,0.18);
border: 1px solid rgba(0,188,212,0.4);
border-radius: 2rem;
padding: 0.4rem 1rem;
font-size: 0.7rem;
color: #00BCD4;
font-weight: 500;
}
.brand {
text-align: center;
margin-bottom: 2rem;
}
.brand-icon {
font-size: 3.2rem;
margin-bottom: 0.5rem;
background: rgba(255,255,255,0.1);
width: 70px;
height: 70px;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 30px;
backdrop-filter: blur(4px);
box-shadow: 0 8px 20px rgba(0,0,0,0.2);
}
.brand h1 {
font-size: 1.9rem;
font-weight: 600;
letter-spacing: 2px;
background: linear-gradient(135deg, #FFF, #B2EBF2);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
margin-top: 0.5rem;
}
.brand-sub {
font-size: 0.85rem;
color: rgba(255, 255, 255, 0.7);
margin-top: 0.2rem;
}
/* 注册页面头部优化 */
#page-register .page-header {
background: transparent;
border-bottom: 1px solid rgba(255, 255, 255, 0.12);
position: relative;
z-index: 1;
}
#page-register .back-btn {
color: #00BCD4;
background: rgba(0,188,212,0.15);
padding: 0.3rem 1rem;
border-radius: 2rem;
transition: all 0.3s ease;
}
#page-register .back-btn:hover {
background: rgba(0,188,212,0.35);
}
#page-register .page-title {
color: #FFFFFF;
}
#page-register .page-content {
position: relative;
z-index: 1;
padding: 1.5rem 1.5rem 2rem;
min-height: calc(100vh - 60px);
overflow-y: auto;
}
/* 注册按钮优化 */
#page-register .button-large.success {
background: linear-gradient(105deg, #00BCD4 0%, #0097A7 100%);
border-radius: 2rem;
box-shadow: 0 6px 14px rgba(0,188,212,0.25);
transition: all 0.2s ease;
}
#page-register .button-large.success:hover {
transform: translateY(-2px);
box-shadow: 0 10px 20px rgba(0,188,212,0.35);
}
/* 记住密码和忘记密码 */
.form-footer {
display: flex;
justify-content: space-between;
align-items: center;
margin: 0.8rem 0 1.2rem;
font-size: 0.75rem;
}
.checkbox {
display: flex;
align-items: center;
gap: 0.4rem;
color: rgba(255, 255, 255, 0.7);
cursor: pointer;
}
.checkbox input[type="checkbox"] {
accent-color: #00BCD4;
}
.forgot-link {
color: #00BCD4;
text-decoration: none;
font-size: 0.75rem;
transition: all 0.3s ease;
}
.forgot-link:hover {
text-decoration: underline;
opacity: 0.85;
}
/* 页面切换动画 */
.page.active {
animation: fadeIn 0.3s forwards;
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(6px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* 确保登录/注册页面全屏显示,无底部黑条 */
#page-login .tab-bar,
#page-register .tab-bar {
display: none !important;
}
#page-login,
#page-register {
padding-bottom: 0 !important;
margin-bottom: 0 !important;
}
/* ===== 投放点选择相关样式 ===== */
/* 选中的投放点卡片(在填写物资信息页面) */
.selected-drop-card {
background: linear-gradient(135deg, #E6F7FF 0%, #BAE7FF 100%);
border: 2px solid #007AFF;
border-radius: 12px;
padding: 14px;
margin-bottom: 8px;
animation: slideIn 0.3s ease;
}
@keyframes slideIn {
from {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.selected-drop-info {
display: flex;
flex-direction: column;
gap: 4px;
}
.selected-drop-name {
font-size: 16px;
font-weight: 600;
color: #007AFF;
}
.selected-drop-coords {
font-size: 12px;
color: #666;
}
/* 小卡片(在地图选点页面) */
.mini-drop-card {
display: flex;
align-items: center;
gap: 10px;
padding: 12px;
background: var(--bg-card);
border: 2px solid var(--border-color);
border-radius: 10px;
margin-bottom: 8px;
cursor: pointer;
transition: all 0.2s ease;
}
.mini-drop-card:active {
transform: scale(0.98);
}
.mini-drop-card.selected {
background: linear-gradient(135deg, #E6F7FF 0%, #BAE7FF 100%);
border-color: #007AFF;
box-shadow: 0 2px 8px rgba(0, 122, 255, 0.2);
}
.mini-drop-icon {
font-size: 24px;
flex-shrink: 0;
}
.mini-drop-content {
flex: 1;
min-width: 0;
}
.mini-drop-name {
font-size: 14px;
font-weight: 600;
color: var(--text-primary);
margin-bottom: 2px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.mini-drop-address {
font-size: 12px;
color: var(--text-secondary);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.mini-drop-check {
font-size: 20px;
color: #007AFF;
font-weight: bold;
flex-shrink: 0;
opacity: 0;
transition: opacity 0.2s;
}
.mini-drop-card.selected .mini-drop-check {
opacity: 1;
}
/* 推荐投放点小卡片列表 */
#drop-point-list .mini-drop-card {
margin-bottom: 8px;
}
#drop-point-list .mini-drop-card.safe {
border-left: 4px solid #52c41a;
}
#drop-point-list .mini-drop-card.danger {
border-left: 4px solid #ff4d4f;
opacity: 0.7;
}

@ -8,37 +8,58 @@
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<!-- 动态背景装饰 -->
<div class="glow-orb orb-1"></div>
<div class="glow-orb orb-2"></div>
<!-- 页面容器 -->
<div id="app">
<!-- ===== 登录页 ===== -->
<div class="container" id="appContainer">
<!-- 登录页面 -->
<div class="page active" id="page-login">
<div class="login-body">
<div class="login-logo">📱</div>
<div class="login-title">智途投送</div>
<div class="login-subtitle">单兵终端系统</div>
<div class="login-form">
<div class="form-group">
<label class="form-label">🎖️ 士兵编号</label>
<input type="text" class="form-input" id="login-id" placeholder="请输入士兵编号">
</div>
<div class="form-group">
<label class="form-label">🔑 密码</label>
<input type="password" class="form-input" id="login-pwd" placeholder="请输入密码">
</div>
<button class="button-large" onclick="App.doLogin()">登 录</button>
<div class="login-switch" onclick="App.router('register')">还没有账号?点击注册</div>
<div class="brand">
<div class="brand-icon">📱</div>
<h1>智途投送</h1>
<div class="brand-sub">单兵终端系统 · 安全准入</div>
</div>
<div class="form-group">
<label class="form-label">🎖️ 士兵编号</label>
<input type="text" class="form-input" id="login-id" placeholder="请输入士兵编号" autocomplete="username">
</div>
<div class="form-group">
<label class="form-label">🔑 密码</label>
<input type="password" class="form-input" id="login-pwd" placeholder="请输入密码" autocomplete="current-password">
</div>
<div class="login-demo">
<div class="demo-title">演示账号</div>
<div class="demo-item" onclick="App.fillLogin('soldier_001','123456')"> soldier_001 / 123456 (张三)</div>
<div class="demo-item" onclick="App.fillLogin('soldier_002','123456')"> soldier_002 / 123456 (李四)</div>
<!-- 增加细节:记住密码 + 忘记密码 -->
<div class="form-footer">
<label class="checkbox">
<input type="checkbox" id="rememberMe" style="accent-color: #00BCD4;"> 记住密码
</label>
<a href="#" class="forgot-link" onclick="alert('请联系指挥官重置密码'); return false;">🔐 忘记密码?</a>
</div>
<button class="button-large" onclick="App.doLogin()">登 录</button>
<div class="login-switch" onclick="App.router('register')">
还没有账号?<strong style="color:#00BCD4;">立即注册</strong>
</div>
<!-- 演示账号 (优化:改为简洁胶囊) -->
<div class="demo-card">
<div class="demo-title">⚡ 快速体验</div>
<div class="demo-buttons">
<div class="demo-btn" onclick="App.fillLogin('soldier_001','123456')">张三 · 001</div>
<div class="demo-btn" onclick="App.fillLogin('soldier_002','123456')">李四 · 002</div>
</div>
</div>
</div>
</div>
<!-- ===== 注册页 ===== -->
<!-- 注册页面:保留原始全部字段,视觉上优化间距和按钮 -->
<div class="page" id="page-register">
<div class="page-header">
<span class="back-btn" onclick="App.back()">← 返回</span>
@ -52,22 +73,22 @@
</div>
<div class="form-group">
<label class="form-label">👤 姓名</label>
<input type="text" class="form-input" id="reg-name" placeholder="真实姓名">
<input type="text" class="form-input" id="reg-name" placeholder="请输入真实姓名">
</div>
<div class="form-group">
<label class="form-label">🔑 密码</label>
<input type="password" class="form-input" id="reg-pwd" placeholder="设置密码">
<input type="password" class="form-input" id="reg-pwd" placeholder="6~18位字母或数字">
</div>
<div class="form-group">
<label class="form-label">🏢 所属单位</label>
<input type="text" class="form-input" id="reg-unit" placeholder="如: 第3步兵师/4连" value="第3步兵师/1连">
<input type="text" class="form-input" id="reg-unit" placeholder="第3步兵师/4连" value="第3步兵师/1连">
</div>
<div class="form-group">
<label class="form-label">🎯 职位</label>
<input type="text" class="form-input" id="reg-role" placeholder="如: 狙击手" value="步兵">
<input type="text" class="form-input" id="reg-role" placeholder="狙击手" value="步兵">
</div>
<button class="button-large success" onclick="App.doRegister()"> </button>
<div class="login-switch" onclick="App.router('login')">已有账号?去登录</div>
<button class="button-large success" onclick="App.doRegister()">立即注册</button>
<div class="login-switch" onclick="App.router('login')">已有账号?去登录</div>
</div>
</div>
@ -159,7 +180,13 @@
<div class="form-group">
<label class="form-label">📍 期望投放点</label>
<div class="card" id="demand-drop-display">当前位置A区街角12号</div>
<div class="card selected-drop-card" id="selected-drop-card" style="display: none;">
<div class="selected-drop-info">
<div class="selected-drop-name" id="selected-drop-name">--</div>
<div class="selected-drop-coords" id="selected-drop-coords">--</div>
</div>
</div>
<div class="card" id="demand-drop-display" style="display: block;">未选择投放点</div>
<button class="btn-outline" onclick="App.router('drop')">🎯 选择投放点</button>
</div>
@ -172,7 +199,7 @@
</div>
</div>
<button class="button-large success" onclick="App.submitDemand()">确认上报</button>
<button class="button-large success" onclick="App.submitDemand()">确认上报</button>
</div>
</div>
@ -183,7 +210,7 @@
<span class="page-title">🎯 地图选点</span>
<span></span>
</div>
<div class="page-content" style="padding: 0;">
<div class="page-content" style="padding: 0; overflow-y: auto;">
<!-- 搜索框 -->
<div style="padding: 10px 14px; background: #fff; border-bottom: 1px solid #eee;">
<div style="display: flex; gap: 8px;">
@ -204,19 +231,24 @@
</div>
</div>
<!-- 选中位置信息 -->
<div style="padding: 12px 14px; background: #fff;">
<div style="font-size: 13px; color: #666; margin-bottom: 6px;">📍 已选位置</div>
<div id="drop-selected-name" style="font-size: 15px; font-weight: bold; color: #333; margin-bottom: 4px;">请点击地图选择投放点</div>
<div id="drop-selected-address" style="font-size: 12px; color: #999;">--</div>
<div id="drop-selected-coords" style="font-size: 12px; color: #007AFF; margin-top: 4px;">--</div>
<!-- 选中位置信息卡片 -->
<div id="selected-location-card" style="padding: 12px 14px; background: #fff; display: none;">
<div style="font-size: 13px; color: #666; margin-bottom: 6px;">📍 我选择的位置</div>
<div class="mini-drop-card selected" onclick="App.selectDropPointFromMap()">
<div class="mini-drop-icon">📍</div>
<div class="mini-drop-content">
<div class="mini-drop-name" id="mini-selected-name">--</div>
<div class="mini-drop-address" id="mini-selected-address">--</div>
</div>
<div class="mini-drop-check"></div>
</div>
</div>
<!-- 推荐列表(保留作为参考) -->
<!-- 推荐列表 -->
<div style="padding: 10px 14px;">
<div class="section-title">🎯 附近推荐投放点</div>
<div id="drop-point-list">
<!-- 动态加载 -->
<!-- 动态加载小卡片 -->
</div>
</div>
@ -229,7 +261,6 @@
<!-- ===== 任务监控 ===== -->
<div class="page" id="page-task">
<div class="page-header">
<span class="back-btn" onclick="App.back()">← 返回</span>
<span class="page-title">📋 当前任务</span>
<span></span>
</div>
@ -276,7 +307,6 @@
<!-- ===== 无人机状态 ===== -->
<div class="page" id="page-drone">
<div class="page-header">
<span class="back-btn" onclick="App.back()">← 返回</span>
<span class="page-title">🚀 无人机状态</span>
<span></span>
</div>
@ -345,7 +375,6 @@
<!-- ===== 个人中心 ===== -->
<div class="page" id="page-profile">
<div class="page-header">
<span class="back-btn" onclick="App.back()">← 返回</span>
<span class="page-title">👤 个人中心</span>
<span></span>
</div>
@ -392,19 +421,19 @@
<div class="card menu-list">
<div class="menu-item" onclick="App.showServerConfig()">
<span>🖥️ 服务器地址</span>
<span class="menu-value" id="server-addr">配置 →</span>
<span class="menu-value" id="server-addr">配置</span>
</div>
<div class="menu-item" onclick="App.toggleTheme()">
<span>🌙 主题模式</span>
<span class="menu-value" id="theme-value">◉ 深色</span>
</div>
<div class="menu-item"><span>🌐 语言</span><span class="menu-value">🇨🇳 简体中文 →</span></div>
<div class="menu-item"><span>🌙 主题模式</span><span class="menu-value">◉ 深色 →</span></div>
<div class="menu-item"><span>🔔 消息通知</span><span class="menu-toggle on"></span></div>
<div class="menu-item"><span>📥 自动更新</span><span class="menu-toggle on"></span></div>
<div class="menu-item" onclick="App.toggleSwitch(this)"><span>🔔 消息通知</span><span class="menu-toggle on"></span></div>
</div>
<div class="section-title">🔒 安全设置</div>
<div class="card menu-list">
<div class="menu-item"><span>🔐 启用生物识别</span><span class="menu-toggle on"></span></div>
<div class="menu-item"><span>🔑 修改登录密码</span><span class="menu-value">修改 →</span></div>
<div class="menu-item"><span>📧 联系方式</span><span class="menu-value">138****8888</span></div>
<div class="menu-item" onclick="App.toggleSwitch(this)"><span>🔐 启用生物识别</span><span class="menu-toggle on"></span></div>
<div class="menu-item" onclick="App.showChangePasswordModal()"><span>🔑 修改登录密码</span><span class="menu-value">修改</span></div>
</div>
<div class="section-title"> 关于</div>
@ -439,7 +468,7 @@
<span class="tab-icon">👤</span>
<span class="tab-label">我的</span>
</div>
</nav>
</nav>1
<!-- 提示Toast -->
<div id="toast" class="toast"></div>

@ -142,6 +142,17 @@ const API = (() => {
}
}
async function changePassword(soldierId, oldPassword, newPassword) {
return request('/api/auth/change-password', {
method: 'POST',
body: JSON.stringify({
soldier_id: soldierId,
old_password: oldPassword,
new_password: newPassword
})
});
}
// ===== 模拟数据(后端未就绪时使用) =====
function getMockDropPoints() {
return [
@ -201,6 +212,7 @@ const API = (() => {
sendSOS,
login,
register,
getAccounts
getAccounts,
changePassword
};
})();

@ -10,6 +10,7 @@ const App = (() => {
soldierId: localStorage.getItem('soldier_id') || 'soldier_001',
soldierName: localStorage.getItem('soldier_name') || '张三',
soldierUnit: localStorage.getItem('soldier_unit') || '第3步兵师/1连',
theme: localStorage.getItem('app_theme') || 'dark', // 主题模式:'dark' | 'light' | 'auto'
pollInterval: 5000
};
@ -25,6 +26,9 @@ const App = (() => {
// ===== 初始化 =====
function init() {
// 初始化主题
initTheme();
// 检查登录状态
const saved = localStorage.getItem('soldier_session');
if (saved) {
@ -337,9 +341,20 @@ const App = (() => {
try {
await API.postDemand(demand);
showToast('✅ 需求上报成功!');
// 清空选中的投放点
selectedDropPoint = null;
mapSelectedPoint = null;
// 重置填写物资信息页面的显示
const selectedCard = document.getElementById('selected-drop-card');
const dropDisplay = document.getElementById('demand-drop-display');
if (dropDisplay) dropDisplay.textContent = '当前位置A区街角12号';
if (selectedCard) selectedCard.style.display = 'none';
if (dropDisplay) {
dropDisplay.style.display = 'block';
dropDisplay.textContent = '未选择投放点';
}
setTimeout(() => router('home'), 1000);
} catch (e) {
showToast('❌ 上报失败:' + (e.message || '网络错误'));
@ -352,18 +367,24 @@ const App = (() => {
setTimeout(async () => {
await LocationModule.initPickerMap('drop-map', (point) => {
mapSelectedPoint = point;
// 更新UI显示
const nameEl = document.getElementById('drop-selected-name');
const addrEl = document.getElementById('drop-selected-address');
const coordEl = document.getElementById('drop-selected-coords');
if (nameEl) nameEl.textContent = point.name;
if (addrEl) addrEl.textContent = point.address;
if (coordEl) coordEl.textContent = `${point.lat.toFixed(6)}, ${point.lng.toFixed(6)}`;
showToast('📍 已选择:' + point.name);
// 显示选中位置卡片
const selectedCard = document.getElementById('selected-location-card');
if (selectedCard) {
selectedCard.style.display = 'block';
// 更新卡片内容
const nameEl = document.getElementById('mini-selected-name');
const addrEl = document.getElementById('mini-selected-address');
if (nameEl) nameEl.textContent = point.name;
if (addrEl) addrEl.textContent = point.address || `${point.lat.toFixed(6)}, ${point.lng.toFixed(6)}`;
showToast('📍 已选择:' + point.name);
}
});
}, 300);
// 加载推荐列表
// 加载推荐列表(小卡片形式)
const list = document.getElementById('drop-point-list');
list.innerHTML = '<div style="text-align:center;color:#999;padding:20px;">加载中...</div>';
@ -374,19 +395,17 @@ const App = (() => {
return;
}
// 渲染为小卡片形式
list.innerHTML = points.map((p, i) => {
const isSafe = p.safety_score >= 70;
return `
<div class="card drop-card ${isSafe ? 'safe' : 'danger'}" onclick="App.selectDropPoint(${i})" style="cursor:pointer;">
<div style="font-size:14px;color:#333;margin-bottom:5px;">📍 ${p.name}</div>
<div class="drop-info">
<span>安全系数: ${p.safety_score}%</span>
<span>距离: ${p.distance}m</span>
</div>
<div style="font-size:12px;color:#666;margin-bottom:10px;">${p.reason}</div>
<div style="font-size:12px;color:${isSafe ? '#52c41a' : '#ff4d4f'};">
${isSafe ? '✅ 推荐投放' : '❌ 危险区域'}
<div class="mini-drop-card ${isSafe ? 'safe' : 'danger'}" onclick="App.selectDropPointFromList(${i})">
<div class="mini-drop-icon">${isSafe ? '✅' : '⚠️'}</div>
<div class="mini-drop-content">
<div class="mini-drop-name">${p.name}</div>
<div class="mini-drop-address">安全系数: ${p.safety_score}% · 距离: ${p.distance}m</div>
</div>
<div class="mini-drop-check"></div>
</div>
`;
}).join('');
@ -459,35 +478,54 @@ const App = (() => {
showToast('📍 已定位:' + p.name);
}
// ===== 选择投放点(从列表) =====
function selectDropPoint(index) {
API.getDropPoints().then(async points => {
// ===== 从列表选择投放点 =====
async function selectDropPointFromList(index) {
try {
const points = await API.getDropPoints();
const p = points[index];
if (!p) return;
if (p.safety_score < 70) {
showToast('⚠️ 该区域危险,建议选择其他投放点');
return;
}
selectedDropPoint = p;
// 同时在地图上标记
// 在地图上标记
await LocationModule.setPickerPosition(p.lat, p.lng, p.name, p.address);
// 更新选中显示
// 更新选中状态
mapSelectedPoint = {
lat: p.lat,
lng: p.lng,
name: p.name,
address: p.address || p.name
};
const nameEl = document.getElementById('drop-selected-name');
const addrEl = document.getElementById('drop-selected-address');
const coordEl = document.getElementById('drop-selected-coords');
if (nameEl) nameEl.textContent = p.name;
if (addrEl) addrEl.textContent = p.address || '安全系数 ' + p.safety_score + '%';
if (coordEl) coordEl.textContent = `${p.lat.toFixed(6)}, ${p.lng.toFixed(6)}`;
// 显示选中位置卡片
const selectedCard = document.getElementById('selected-location-card');
if (selectedCard) {
selectedCard.style.display = 'block';
const nameEl = document.getElementById('mini-selected-name');
const addrEl = document.getElementById('mini-selected-address');
if (nameEl) nameEl.textContent = p.name;
if (addrEl) addrEl.textContent = p.address || `安全系数 ${p.safety_score}%`;
}
showToast('已选择:' + p.name);
});
} catch (e) {
showToast('选择失败');
}
}
// ===== 从地图选择投放点(点击选中的卡片) =====
function selectDropPointFromMap() {
if (!mapSelectedPoint) {
showToast('请先在地图上选择一个位置');
return;
}
showToast('📍 已确认:' + mapSelectedPoint.name);
}
function confirmDropPoint() {
@ -495,18 +533,48 @@ const App = (() => {
if (mapSelectedPoint) {
selectedDropPoint = mapSelectedPoint;
router('demand');
const display = document.getElementById('demand-drop-display');
if (display) display.textContent = mapSelectedPoint.name;
// 更新填写物资信息页面的显示
const selectedCard = document.getElementById('selected-drop-card');
const dropDisplay = document.getElementById('demand-drop-display');
if (selectedCard && dropDisplay) {
// 隐藏默认显示,显示选中卡片
dropDisplay.style.display = 'none';
selectedCard.style.display = 'block';
// 更新卡片内容
const nameEl = document.getElementById('selected-drop-name');
const coordsEl = document.getElementById('selected-drop-coords');
if (nameEl) nameEl.textContent = mapSelectedPoint.name;
if (coordsEl) coordsEl.textContent = `${mapSelectedPoint.lat.toFixed(6)}, ${mapSelectedPoint.lng.toFixed(6)}`;
}
showToast('✅ 已确认投放点:' + mapSelectedPoint.name);
return;
}
// fallback到列表选中的点
if (selectedDropPoint) {
router('demand');
const display = document.getElementById('demand-drop-display');
if (display) display.textContent = selectedDropPoint.name;
const selectedCard = document.getElementById('selected-drop-card');
const dropDisplay = document.getElementById('demand-drop-display');
if (selectedCard && dropDisplay) {
dropDisplay.style.display = 'none';
selectedCard.style.display = 'block';
const nameEl = document.getElementById('selected-drop-name');
const coordsEl = document.getElementById('selected-drop-coords');
if (nameEl) nameEl.textContent = selectedDropPoint.name;
if (coordsEl) coordsEl.textContent = `${selectedDropPoint.lat.toFixed(6)}, ${selectedDropPoint.lng.toFixed(6)}`;
}
showToast('✅ 已确认投放点:' + selectedDropPoint.name);
return;
}
showToast('请先点击地图或列表选择一个投放点');
}
@ -549,7 +617,11 @@ const App = (() => {
if (tstart) tstart.textContent = task.start_name || '后方阵地';
const ttarget = document.getElementById('task-target');
if (ttarget) ttarget.textContent = task.target_name || '目标位置';
if (ttarget) {
// 优先使用选中的投放点名称,其次使用后端返回的 target_name
const targetName = selectedDropPoint ? selectedDropPoint.name : (task.target_name || '目标位置');
ttarget.textContent = targetName;
}
const trisk = document.getElementById('task-risk');
if (trisk) trisk.textContent = '安全系数: ' + (task.safety_score || 0) + '%';
@ -692,9 +764,38 @@ const App = (() => {
}
}
function updateDropPoint() {
showToast('投放点已更新');
setTimeout(() => router('task'), 500);
async function updateDropPoint() {
try {
showToast('正在获取当前位置...');
// 获取当前位置
const pos = await LocationModule.getCurrentPosition();
// 构建投放点对象
const newDropPoint = {
name: '当前位置 (' + pos.lat.toFixed(6) + ', ' + pos.lng.toFixed(6) + ')',
lat: pos.lat,
lng: pos.lng,
safety_score: 90, // 默认安全系数
address: 'GPS定位位置'
};
// 更新选中的投放点
selectedDropPoint = newDropPoint;
mapSelectedPoint = newDropPoint;
showToast('✅ 投放点已更新为当前位置');
// 跳转到任务页面
setTimeout(() => {
router('task');
// 强制刷新任务信息
loadTaskInfo();
}, 500);
} catch (e) {
showToast('❌ 获取位置失败:' + (e.message || '未知错误'));
console.error('updateDropPoint错误:', e);
}
}
// ===== 标注 =====
@ -731,6 +832,446 @@ const App = (() => {
}
}
// ===== 主题切换 =====
function initTheme() {
const theme = CONFIG.theme || 'dark';
applyTheme(theme);
updateThemeDisplay();
// 如果是自动模式,监听系统主题变化
if (theme === 'auto') {
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
mediaQuery.addEventListener('change', handleSystemThemeChange);
}
}
function applyTheme(theme) {
if (theme === 'auto') {
const isDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
document.documentElement.setAttribute('data-theme', isDark ? 'dark' : 'light');
} else {
document.documentElement.setAttribute('data-theme', theme);
}
}
function handleSystemThemeChange(e) {
if (CONFIG.theme === 'auto') {
applyTheme('auto');
const themeName = e.matches ? '深色' : '浅色';
showToast('系统主题已切换为:' + themeName + '模式');
}
}
function toggleTheme() {
// 创建自定义选择弹窗
const modal = document.createElement('div');
modal.style.cssText = `
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0,0,0,0.5);
display: flex;
align-items: center;
justify-content: center;
z-index: 10000;
`;
const content = document.createElement('div');
content.style.cssText = `
background: white;
border-radius: 12px;
padding: 20px;
min-width: 280px;
max-width: 90%;
`;
const title = document.createElement('div');
title.textContent = '选择主题模式';
title.style.cssText = `
font-size: 16px;
font-weight: 600;
color: #333;
margin-bottom: 16px;
text-align: center;
`;
const options = [
{ value: 'dark', label: '🌙 深色模式', desc: '始终使用深色主题' },
{ value: 'light', label: '☀️ 浅色模式', desc: '始终使用浅色主题' },
{ value: 'auto', label: '🔄 跟随系统', desc: '自动跟随系统主题' }
];
options.forEach((opt, index) => {
const optionDiv = document.createElement('div');
const isSelected = CONFIG.theme === opt.value;
optionDiv.style.cssText = `
padding: 12px 16px;
margin-bottom: ${index < options.length - 1 ? '8px' : '0'};
border-radius: 8px;
cursor: pointer;
background: ${isSelected ? '#E6F7FF' : '#f5f5f5'};
border: ${isSelected ? '2px solid #007AFF' : '2px solid transparent'};
transition: all 0.2s;
`;
optionDiv.innerHTML = `
<div style="font-size: 14px; font-weight: ${isSelected ? '600' : '400'}; color: #333; margin-bottom: 4px;">
${opt.label}
</div>
<div style="font-size: 12px; color: #666;">
${opt.desc}
</div>
`;
optionDiv.addEventListener('click', () => {
// 应用选择的主题
CONFIG.theme = opt.value;
localStorage.setItem('app_theme', CONFIG.theme);
applyTheme(CONFIG.theme);
updateThemeDisplay();
// 关闭弹窗
document.body.removeChild(modal);
const themeNames = {
'dark': '深色模式',
'light': '浅色模式',
'auto': '环境跟随'
};
showToast('已切换到:' + themeNames[CONFIG.theme]);
// 如果切换到自动模式,开始监听系统主题
if (CONFIG.theme === 'auto') {
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
mediaQuery.addEventListener('change', handleSystemThemeChange);
}
});
content.appendChild(optionDiv);
});
// 添加取消按钮
const cancelBtn = document.createElement('div');
cancelBtn.textContent = '取消';
cancelBtn.style.cssText = `
margin-top: 16px;
padding: 12px;
text-align: center;
color: #007AFF;
font-size: 14px;
cursor: pointer;
border-top: 1px solid #e0e0e0;
`;
cancelBtn.addEventListener('click', () => {
document.body.removeChild(modal);
});
content.appendChild(cancelBtn);
modal.appendChild(content);
document.body.appendChild(modal);
// 点击背景关闭
modal.addEventListener('click', (e) => {
if (e.target === modal) {
document.body.removeChild(modal);
}
});
}
function updateThemeDisplay() {
const themeEl = document.getElementById('theme-value');
if (!themeEl) return;
const themeIcons = {
'dark': '◉ 深色',
'light': '○ 浅色',
'auto': '◎ 跟随系统'
};
themeEl.textContent = themeIcons[CONFIG.theme] + ' →';
}
// ===== 修改密码 =====
function showChangePasswordModal() {
// 获取当前主题
const currentTheme = document.documentElement.getAttribute('data-theme') || 'dark';
const isDark = currentTheme === 'dark';
// 主题颜色配置
const themeColors = {
bg: isDark ? '#1a1a2e' : 'white',
text: isDark ? '#e0e0e0' : '#333',
border: isDark ? '#2a2a3e' : '#e0e0e0',
inputBg: isDark ? '#16213e' : 'white',
cancelBg: isDark ? '#2a2a3e' : '#f5f5f5',
cancelText: isDark ? '#e0e0e0' : '#333'
};
// 创建弹窗
const modal = document.createElement('div');
modal.style.cssText = `
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0,0,0,0.5);
display: flex;
align-items: center;
justify-content: center;
z-index: 10000;
`;
const content = document.createElement('div');
content.style.cssText = `
background: ${themeColors.bg};
border-radius: 12px;
padding: 24px;
min-width: 320px;
max-width: 90%;
`;
const title = document.createElement('div');
title.textContent = '修改登录密码';
title.style.cssText = `
font-size: 18px;
font-weight: 600;
color: ${themeColors.text};
margin-bottom: 20px;
text-align: center;
`;
// 输入框配置
const inputs = [
{ id: 'old-pwd', label: '原密码', type: 'password', placeholder: '请输入原密码' },
{ id: 'new-pwd', label: '新密码', type: 'password', placeholder: '请输入新密码' },
{ id: 'confirm-pwd', label: '确认新密码', type: 'password', placeholder: '请再次输入新密码' }
];
inputs.forEach((input, index) => {
const group = document.createElement('div');
group.style.cssText = 'margin-bottom: 16px;';
const label = document.createElement('label');
label.textContent = input.label;
label.style.cssText = `
display: block;
font-size: 14px;
color: ${themeColors.text};
margin-bottom: 6px;
font-weight: 500;
`;
const inputWrapper = document.createElement('div');
inputWrapper.style.cssText = 'position: relative;';
const inputEl = document.createElement('input');
inputEl.type = input.type;
inputEl.id = input.id;
inputEl.placeholder = input.placeholder;
inputEl.style.cssText = `
width: 100%;
padding: 12px 40px 12px 12px;
border: 1px solid ${themeColors.border};
border-radius: 8px;
font-size: 14px;
outline: none;
box-sizing: border-box;
background: ${themeColors.inputBg};
color: ${themeColors.text};
`;
// 眼睛图标(显示/隐藏密码)
const eyeIcon = document.createElement('span');
eyeIcon.innerHTML = '🙈'; // 默认隐藏密码,显示捂眼
eyeIcon.style.cssText = `
position: absolute;
right: 12px;
top: 50%;
transform: translateY(-50%);
cursor: pointer;
font-size: 18px;
user-select: none;
`;
let isPasswordVisible = false;
eyeIcon.addEventListener('click', () => {
isPasswordVisible = !isPasswordVisible;
inputEl.type = isPasswordVisible ? 'text' : 'password';
// 显示密码时用睁开的眼睛,隐藏时用捂眼
eyeIcon.innerHTML = isPasswordVisible ? '👁️' : '🙈';
});
inputWrapper.appendChild(inputEl);
inputWrapper.appendChild(eyeIcon);
group.appendChild(label);
group.appendChild(inputWrapper);
content.appendChild(group);
});
// 按钮区域
const btnGroup = document.createElement('div');
btnGroup.style.cssText = `
display: flex;
gap: 12px;
margin-top: 24px;
`;
// 取消按钮
const cancelBtn = document.createElement('button');
cancelBtn.textContent = '取消';
cancelBtn.style.cssText = `
flex: 1;
padding: 12px;
background: ${themeColors.cancelBg};
color: ${themeColors.cancelText};
border: none;
border-radius: 8px;
font-size: 14px;
cursor: pointer;
`;
cancelBtn.addEventListener('click', () => {
document.body.removeChild(modal);
});
// 确认按钮
const confirmBtn = document.createElement('button');
confirmBtn.textContent = '确认修改';
confirmBtn.style.cssText = `
flex: 1;
padding: 12px;
background: linear-gradient(135deg, #007AFF 0%, #0056b3 100%);
color: white;
border: none;
border-radius: 8px;
font-size: 14px;
font-weight: 600;
cursor: pointer;
`;
// 显示结果状态的函数
function showResult(success, message) {
content.innerHTML = '';
content.style.textAlign = 'center';
content.style.padding = '40px 24px';
const icon = document.createElement('div');
icon.textContent = success ? '✅' : '❌';
icon.style.cssText = `
font-size: 48px;
margin-bottom: 16px;
`;
const msg = document.createElement('div');
msg.textContent = message;
msg.style.cssText = `
font-size: 16px;
color: ${themeColors.text};
margin-bottom: 24px;
`;
const closeBtn = document.createElement('button');
closeBtn.textContent = '关闭';
closeBtn.style.cssText = `
padding: 12px 48px;
background: ${success ? 'linear-gradient(135deg, #28a745 0%, #1e7e34 100%)' : 'linear-gradient(135deg, #007AFF 0%, #0056b3 100%)'};
color: white;
border: none;
border-radius: 8px;
font-size: 14px;
font-weight: 600;
cursor: pointer;
`;
closeBtn.addEventListener('click', () => {
document.body.removeChild(modal);
});
content.appendChild(icon);
content.appendChild(msg);
content.appendChild(closeBtn);
// 成功时2秒后自动关闭
if (success) {
setTimeout(() => {
if (document.body.contains(modal)) {
document.body.removeChild(modal);
}
}, 2000);
}
}
confirmBtn.addEventListener('click', async () => {
// 防止重复点击
if (confirmBtn.disabled) return;
const oldPwd = document.getElementById('old-pwd').value.trim();
const newPwd = document.getElementById('new-pwd').value.trim();
const confirmPwd = document.getElementById('confirm-pwd').value.trim();
// 验证
if (!oldPwd || !newPwd || !confirmPwd) {
showToast('请填写所有字段');
return;
}
if (newPwd !== confirmPwd) {
showToast('两次输入的新密码不一致');
return;
}
if (newPwd.length < 6) {
showToast('新密码长度不能少于6位');
return;
}
// 立即禁用按钮并显示加载状态
confirmBtn.disabled = true;
confirmBtn.textContent = '处理中...';
confirmBtn.style.opacity = '0.7';
cancelBtn.disabled = true;
try {
const result = await API.changePassword(CONFIG.soldierId, oldPwd, newPwd);
if (result.ok) {
showResult(true, '密码修改成功');
} else {
showResult(false, result.error || '修改失败');
}
} catch (e) {
// 如果后端不可用,使用离线模式
const demoAccounts = {
'soldier_001': '123456',
'soldier_002': '123456',
'soldier_003': '123456'
};
const currentPwd = demoAccounts[CONFIG.soldierId];
if (!currentPwd || oldPwd !== currentPwd) {
showResult(false, '原密码错误');
return;
}
showResult(true, '密码修改成功');
}
});
btnGroup.appendChild(cancelBtn);
btnGroup.appendChild(confirmBtn);
content.appendChild(btnGroup);
modal.appendChild(content);
document.body.appendChild(modal);
// 点击背景关闭
modal.addEventListener('click', (e) => {
if (e.target === modal) {
document.body.removeChild(modal);
}
});
}
// ===== 轮询 =====
function startPolling() {
if (pollTimer) clearInterval(pollTimer);
@ -758,7 +1299,8 @@ const App = (() => {
router,
back,
submitDemand,
selectDropPoint,
selectDropPointFromList,
selectDropPointFromMap,
confirmDropPoint,
searchDropPoint,
selectSearchResult,
@ -770,6 +1312,8 @@ const App = (() => {
showToast,
showServerConfig,
toggleSwitch,
toggleTheme,
showChangePasswordModal,
doLogin,
doRegister,
fillLogin,

@ -1,4 +1,4 @@
#Tue May 12 15:08:32 CST 2026
com.getcapacitor.android.capacitor-android-main-6\:/layout/no_webview.xml=D\:\\智途投送软件系统\\software\\src\\单兵终端APP\\node_modules\\@capacitor\\android\\capacitor\\build\\intermediates\\packaged_res\\debug\\layout\\no_webview.xml
com.getcapacitor.android.capacitor-android-main-6\:/layout/bridge_layout_main.xml=D\:\\智途投送软件系统\\software\\src\\单兵终端APP\\node_modules\\@capacitor\\android\\capacitor\\build\\intermediates\\packaged_res\\debug\\layout\\bridge_layout_main.xml
com.getcapacitor.android.capacitor-android-main-6\:/layout/fragment_bridge.xml=D\:\\智途投送软件系统\\software\\src\\单兵终端APP\\node_modules\\@capacitor\\android\\capacitor\\build\\intermediates\\packaged_res\\debug\\layout\\fragment_bridge.xml
#Sun May 17 10:13:13 CST 2026
com.getcapacitor.android.capacitor-android-main-6\:/layout/no_webview.xml=D\:\\Android\\Projects\\zhitu\\node_modules\\@capacitor\\android\\capacitor\\build\\intermediates\\packaged_res\\debug\\layout\\no_webview.xml
com.getcapacitor.android.capacitor-android-main-6\:/layout/bridge_layout_main.xml=D\:\\Android\\Projects\\zhitu\\node_modules\\@capacitor\\android\\capacitor\\build\\intermediates\\packaged_res\\debug\\layout\\bridge_layout_main.xml
com.getcapacitor.android.capacitor-android-main-6\:/layout/fragment_bridge.xml=D\:\\Android\\Projects\\zhitu\\node_modules\\@capacitor\\android\\capacitor\\build\\intermediates\\packaged_res\\debug\\layout\\fragment_bridge.xml

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<merger version="3" xmlns:ns1="http://schemas.android.com/tools"><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="main$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="main" generated-set="main$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\res"><file name="bridge_layout_main" path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\res\layout\bridge_layout_main.xml" qualifiers="" type="layout"/><file name="fragment_bridge" path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\res\layout\fragment_bridge.xml" qualifiers="" type="layout"/><file name="no_webview" path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\res\layout\no_webview.xml" qualifiers="" type="layout"/><file path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\res\values\attrs.xml" qualifiers=""><declare-styleable name="bridge_fragment">
<merger version="3" xmlns:ns1="http://schemas.android.com/tools"><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="main$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="main" generated-set="main$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\res"><file name="bridge_layout_main" path="D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\res\layout\bridge_layout_main.xml" qualifiers="" type="layout"/><file name="fragment_bridge" path="D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\res\layout\fragment_bridge.xml" qualifiers="" type="layout"/><file name="no_webview" path="D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\res\layout\no_webview.xml" qualifiers="" type="layout"/><file path="D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\res\values\attrs.xml" qualifiers=""><declare-styleable name="bridge_fragment">
<attr format="string" name="start_dir"/>
</declare-styleable></file><file path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\res\values\colors.xml" qualifiers=""><color name="colorPrimary" ns1:ignore="UnusedResources">#3F51B5</color><color name="colorPrimaryDark" ns1:ignore="UnusedResources">#303F9F</color><color name="colorAccent" ns1:ignore="UnusedResources">#FF4081</color></file><file path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\res\values\strings.xml" qualifiers=""><string name="no_webview_text">This app requires a WebView to work</string></file><file path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\res\values\styles.xml" qualifiers=""><style name="AppTheme.NoActionBar" parent="Theme.AppCompat.NoActionBar">
</declare-styleable></file><file path="D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\res\values\colors.xml" qualifiers=""><color name="colorPrimary" ns1:ignore="UnusedResources">#3F51B5</color><color name="colorPrimaryDark" ns1:ignore="UnusedResources">#303F9F</color><color name="colorAccent" ns1:ignore="UnusedResources">#FF4081</color></file><file path="D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\res\values\strings.xml" qualifiers=""><string name="no_webview_text">This app requires a WebView to work</string></file><file path="D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\res\values\styles.xml" qualifiers=""><style name="AppTheme.NoActionBar" parent="Theme.AppCompat.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style></file></source></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="debug$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\debug\res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="debug" generated-set="debug$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\debug\res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="generated$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\build\generated\res\resValues\debug"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="generated" generated-set="generated$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\build\generated\res\resValues\debug"/></dataSet><mergedItems><configuration qualifiers=""><declare-styleable name="bridge_fragment">
</style></file></source></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="debug$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\debug\res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="debug" generated-set="debug$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\debug\res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="generated$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\build\generated\res\resValues\debug"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="generated" generated-set="generated$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\build\generated\res\resValues\debug"/></dataSet><mergedItems><configuration qualifiers=""><declare-styleable name="bridge_fragment">
<attr format="string" name="start_dir"/>
</declare-styleable></configuration></mergedItems></merger>

@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\jniLibs"/></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\debug\jniLibs"/></dataSet></merger>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\jniLibs"/></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\debug\jniLibs"/></dataSet></merger>

@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\shaders"/></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\debug\shaders"/></dataSet></merger>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\shaders"/></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\debug\shaders"/></dataSet></merger>

@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\assets"><file name="native-bridge.js" path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\assets\native-bridge.js"/></source></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\debug\assets"/></dataSet><dataSet config="generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\build\intermediates\shader_assets\debug\out"/></dataSet></merger>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\assets"><file name="native-bridge.js" path="D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\assets\native-bridge.js"/></source></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\debug\assets"/></dataSet><dataSet config="generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\build\intermediates\shader_assets\debug\out"/></dataSet></merger>

@ -1,16 +1,16 @@
-- Merging decision tree log ---
manifest
ADDED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml:2:1-3:12
INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml:2:1-3:12
ADDED from D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml:2:1-3:12
INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml:2:1-3:12
package
INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml
INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml
xmlns:android
ADDED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml:2:11-69
ADDED from D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml:2:11-69
uses-sdk
INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml reason: use-sdk injection requested
INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml
INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml
INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml reason: use-sdk injection requested
INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml
INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml
android:targetSdkVersion
INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml
INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml
android:minSdkVersion
INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml
INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml

@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="main$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\main\res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="main" generated-set="main$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\main\res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="debug$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\debug\res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="debug" generated-set="debug$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\debug\res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="generated$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\build\generated\res\resValues\debug"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="generated" generated-set="generated$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\build\generated\res\resValues\debug"/></dataSet><mergedItems/></merger>
<merger version="3"><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="main$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\main\res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="main" generated-set="main$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\main\res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="debug$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\debug\res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="debug" generated-set="debug$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\debug\res"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="generated$Generated" generated="true" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\build\generated\res\resValues\debug"/></dataSet><dataSet aapt-namespace="http://schemas.android.com/apk/res-auto" config="generated" generated-set="generated$Generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\build\generated\res\resValues\debug"/></dataSet><mergedItems/></merger>

@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\main\jniLibs"/></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\debug\jniLibs"/></dataSet></merger>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\main\jniLibs"/></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\debug\jniLibs"/></dataSet></merger>

@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\main\shaders"/></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\debug\shaders"/></dataSet></merger>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\main\shaders"/></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\debug\shaders"/></dataSet></merger>

@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\main\assets"/></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\debug\assets"/></dataSet><dataSet config="generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\build\intermediates\shader_assets\debug\out"/></dataSet></merger>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\main\assets"/></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\debug\assets"/></dataSet><dataSet config="generated" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\build\intermediates\shader_assets\debug\out"/></dataSet></merger>

@ -1,16 +1,16 @@
-- Merging decision tree log ---
manifest
ADDED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml:1:1-2:12
INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml:1:1-2:12
ADDED from D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml:1:1-2:12
INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml:1:1-2:12
package
INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml
INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml
xmlns:android
ADDED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml:1:11-69
ADDED from D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml:1:11-69
uses-sdk
INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml reason: use-sdk injection requested
INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml
INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml
INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml reason: use-sdk injection requested
INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml
INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml
android:targetSdkVersion
INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml
INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml
android:minSdkVersion
INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml
INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml

@ -1,13 +1,42 @@
/* ===== 主题变量 ===== */
:root {
/* 浅色主题(默认) */
--bg-primary: #f5f5f5;
--bg-secondary: #ffffff;
--bg-card: #ffffff;
--text-primary: #333333;
--text-secondary: #666666;
--text-muted: #999999;
--border-color: #e0e0e0;
--input-bg: #ffffff;
--menu-hover: #f5f5f5;
}
[data-theme="dark"] {
/* 深色主题 */
--bg-primary: #0f0f23;
--bg-secondary: #1a1a2e;
--bg-card: #16213e;
--text-primary: #e0e0e0;
--text-secondary: #b0b0b0;
--text-muted: #808080;
--border-color: #2a2a3e;
--input-bg: #1a1a2e;
--menu-hover: #1f2940;
}
/* ===== 全局重置 ===== */
* { margin: 0; padding: 0; box-sizing: border-box; }
html, body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;
background: #f5f5f5;
font-size: 16px;
background: var(--bg-primary);
height: 100%;
overflow: hidden;
color: #333;
color: var(--text-primary);
-webkit-tap-highlight-color: transparent;
transition: background 0.3s, color 0.3s;
}
#app {
@ -51,8 +80,8 @@ html, body {
justify-content: space-between;
align-items: center;
padding: 12px 16px;
background: #fff;
border-bottom: 1px solid #f0f0f0;
background: var(--bg-secondary);
border-bottom: 1px solid var(--border-color);
flex-shrink: 0;
}
.page-header .back-btn {
@ -63,7 +92,7 @@ html, body {
.page-header .page-title {
font-size: 15px;
font-weight: 600;
color: #333;
color: var(--text-primary);
}
/* ===== 用户卡片 ===== */
@ -165,7 +194,7 @@ html, body {
/* ===== 卡片 ===== */
.card {
background: white;
background: var(--bg-card);
border-radius: 12px;
padding: 14px;
margin-bottom: 10px;
@ -173,13 +202,13 @@ html, body {
}
.card-title {
font-size: 14px;
color: #666;
color: var(--text-secondary);
margin-bottom: 10px;
}
/* ===== 库存进度条 ===== */
.inventory-item {
background: white;
background: var(--bg-card);
border-radius: 12px;
padding: 12px 14px;
margin-bottom: 10px;
@ -215,7 +244,7 @@ html, body {
}
.location-text {
font-size: 14px;
color: #333;
color: var(--text-primary);
}
/* ===== 表单 ===== */
@ -224,7 +253,7 @@ html, body {
}
.form-label {
font-size: 14px;
color: #333;
color: var(--text-primary);
margin-bottom: 6px;
display: block;
font-weight: 500;
@ -232,17 +261,20 @@ html, body {
.select-box {
width: 100%;
padding: 12px;
border: 1px solid #e0e0e0;
border: 1px solid var(--border-color);
border-radius: 8px;
background: white;
background: var(--input-bg);
color: var(--text-primary);
font-size: 14px;
outline: none;
}
.form-input {
width: 100%;
padding: 12px;
border: 1px solid #e0e0e0;
border: 1px solid var(--border-color);
border-radius: 8px;
background: var(--input-bg);
color: var(--text-primary);
font-size: 14px;
outline: none;
}
@ -256,7 +288,7 @@ html, body {
}
.input-unit {
font-size: 14px;
color: #666;
color: var(--text-secondary);
}
/* ===== 单选组 ===== */
@ -267,13 +299,14 @@ html, body {
.radio-label {
flex: 1;
padding: 10px;
background: #f5f5f5;
background: var(--bg-primary);
border-radius: 8px;
text-align: center;
cursor: pointer;
border: 2px solid transparent;
font-size: 14px;
transition: all 0.2s;
color: var(--text-primary);
}
.radio-label.active {
background: #E6F7FF;
@ -293,8 +326,9 @@ html, body {
display: flex;
align-items: center;
padding: 8px 0;
border-bottom: 1px solid #f0f0f0;
border-bottom: 1px solid var(--border-color);
font-size: 13px;
color: var(--text-primary);
}
.annotate-item:last-child { border-bottom: none; }
.annotate-dot {
@ -315,7 +349,7 @@ html, body {
.drop-card.danger { border-left: 4px solid #FF4D4F; background: #FFF3F3; }
.drop-info {
font-size: 12px;
color: #666;
color: var(--text-secondary);
margin: 4px 0 10px;
}
.drop-info span { margin-right: 12px; }
@ -342,7 +376,7 @@ html, body {
/* ===== 任务监控 ===== */
.task-card { text-align: center; padding: 18px; }
.task-label { font-size: 13px; color: #666; margin-bottom: 5px; }
.task-label { font-size: 13px; color: var(--text-secondary); margin-bottom: 5px; }
.task-id { font-size: 18px; font-weight: 600; margin-bottom: 10px; }
.task-status {
display: inline-block;
@ -352,11 +386,11 @@ html, body {
font-weight: 600;
}
.task-status.running { background: #F6FFED; color: #52C41A; }
.task-eta { font-size: 13px; color: #666; margin-top: 8px; }
.task-eta { font-size: 13px; color: var(--text-secondary); margin-top: 8px; }
.progress-card { text-align: center; padding: 16px; }
.progress-text { font-size: 14px; color: #007AFF; font-weight: 600; margin-bottom: 6px; }
.progress-sub { font-size: 12px; color: #666; }
.progress-sub { font-size: 12px; color: var(--text-secondary); }
.path-card {
background: #E6F7FF;
@ -365,7 +399,7 @@ html, body {
margin-bottom: 12px;
}
.path-label { font-size: 12px; color: #007AFF; margin-bottom: 4px; }
.path-value { font-size: 15px; font-weight: 600; color: #333; margin-bottom: 12px; }
.path-value { font-size: 15px; font-weight: 600; color: var(--text-primary); margin-bottom: 12px; }
.path-value:last-child { margin-bottom: 0; }
.drop-zone {
@ -394,12 +428,12 @@ html, body {
display: flex;
justify-content: space-between;
padding: 10px 0;
border-bottom: 1px solid #f0f0f0;
border-bottom: 1px solid var(--border-color);
font-size: 14px;
}
.stat-row:last-child { border-bottom: none; }
.stat-label { color: #666; }
.stat-value { font-weight: 600; color: #333; }
.stat-label { color: var(--text-secondary); }
.stat-value { font-weight: 600; color: var(--text-primary); }
.stat-value.danger { color: #FF4D4F; }
.tag {
@ -415,16 +449,16 @@ html, body {
/* ===== 日志时间线 ===== */
.log-row {
font-size: 13px;
color: #666;
color: var(--text-secondary);
padding: 8px 0;
border-bottom: 1px solid #f0f0f0;
border-bottom: 1px solid var(--border-color);
}
.log-row:last-child { border-bottom: none; }
.log-time { color: #999; margin-right: 8px; }
.log-time { color: var(--text-muted); margin-right: 8px; }
/* ===== 地图占位 ===== */
.map-placeholder {
background: #F0F0F0;
background: var(--bg-primary);
border: 2px dashed #007AFF;
height: 140px;
display: flex;
@ -434,12 +468,12 @@ html, body {
text-align: center;
}
.map-icon { font-size: 30px; margin-bottom: 5px; }
.map-text { color: #666; font-size: 14px; }
.map-text { color: var(--text-secondary); font-size: 14px; }
/* ===== 警告卡片 ===== */
.warning-card { background: #FFF7E6; border: 1px solid #FFD591; }
.warning-title { font-size: 13px; color: #FA8C16; margin-bottom: 8px; }
.warning-item { font-size: 12px; color: #666; margin-bottom: 4px; }
.warning-item { font-size: 12px; color: var(--text-secondary); margin-bottom: 4px; }
/* ===== 按钮行 ===== */
.btn-row { display: flex; gap: 10px; margin-top: 16px; }
@ -470,14 +504,15 @@ html, body {
justify-content: space-between;
align-items: center;
padding: 14px 16px;
border-bottom: 1px solid #f0f0f0;
border-bottom: 1px solid var(--border-color);
cursor: pointer;
font-size: 14px;
transition: background 0.15s;
color: var(--text-primary);
}
.menu-item:active { background: #f5f5f5; }
.menu-item:active { background: var(--menu-hover); }
.menu-item:last-child { border-bottom: none; }
.menu-value { color: #666; font-size: 13px; }
.menu-value { color: var(--text-secondary); font-size: 13px; }
.menu-toggle {
width: 36px;
height: 20px;
@ -507,8 +542,8 @@ html, body {
/* ===== 底部Tab导航 ===== */
.tab-bar {
display: flex;
background: #fff;
border-top: 1px solid #e8e8e8;
background: var(--bg-secondary);
border-top: 1px solid var(--border-color);
padding-bottom: env(safe-area-inset-bottom);
flex-shrink: 0;
z-index: 100;
@ -524,7 +559,7 @@ html, body {
align-items: center;
padding: 6px 0;
cursor: pointer;
color: #999;
color: var(--text-muted);
transition: color 0.2s;
}
.tab-item.active { color: #007AFF; }
@ -549,89 +584,490 @@ html, body {
}
.toast.show { opacity: 1; }
/* ===== 登录页 ===== */
/* ===== 滚动条 ===== */
::-webkit-scrollbar { width: 0; }
/* ===== 登录/注册页面优化样式 ===== */
/* 登录页面背景 - 渐变 + 动态光晕 */
#page-login,
#page-register {
background: linear-gradient(135deg, #0F2027 0%, #203A43 50%, #2C5364 100%);
position: relative;
overflow: hidden;
}
/* 动态光晕装饰 */
#page-login::before,
#page-login::after,
#page-register::before,
#page-register::after {
content: '';
position: fixed;
border-radius: 50%;
filter: blur(70px);
opacity: 0.35;
pointer-events: none;
z-index: 0;
}
#page-login::before,
#page-register::before {
top: -15%;
right: -10%;
width: 350px;
height: 350px;
background: radial-gradient(circle, rgba(0,188,212,0.6) 0%, rgba(0,150,136,0.2) 100%);
}
#page-login::after,
#page-register::after {
bottom: -10%;
left: -10%;
width: 320px;
height: 320px;
background: radial-gradient(circle, rgba(255,152,0,0.45) 0%, rgba(255,87,34,0.1) 100%);
}
/* 登录主体容器 */
.login-body {
padding: 2rem 1.5rem 2rem;
position: relative;
z-index: 1;
max-width: 460px;
margin: 0 auto;
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-height: 100vh;
padding: 40px 24px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
/* 品牌区域 */
.login-logo {
font-size: 64px;
margin-bottom: 16px;
font-size: 3.2rem;
margin-bottom: 0.5rem;
background: rgba(255,255,255,0.1);
width: 70px;
height: 70px;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 30px;
backdrop-filter: blur(4px);
box-shadow: 0 8px 20px rgba(0,0,0,0.2);
}
.login-title {
font-size: 28px;
font-weight: 700;
color: #fff;
margin-bottom: 4px;
font-size: 1.9rem;
font-weight: 600;
letter-spacing: 2px;
background: linear-gradient(135deg, #FFF, #B2EBF2);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
margin-top: 0.5rem;
text-align: center;
}
.login-subtitle {
font-size: 14px;
color: rgba(255,255,255,0.8);
margin-bottom: 32px;
font-size: 0.85rem;
color: rgba(255, 255, 255, 0.7);
margin-top: 0.2rem;
text-align: center;
}
.login-form {
width: 100%;
max-width: 320px;
background: rgba(255,255,255,0.95);
border-radius: 16px;
padding: 24px;
margin-bottom: 20px;
/* 表单样式优化 */
.login-form .form-group,
#page-register .form-group {
margin-bottom: 1.4rem;
}
.login-form .form-group {
margin-bottom: 16px;
.login-form .form-label,
#page-register .form-label {
display: block;
font-size: 0.85rem;
font-weight: 500;
margin-bottom: 0.4rem;
color: rgba(255, 255, 255, 0.7);
letter-spacing: 0.5px;
}
.login-form .form-label {
font-size: 13px;
color: #666;
margin-bottom: 6px;
.login-form .form-input,
#page-register .form-input {
width: 100%;
padding: 0.9rem 1rem;
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 1.2rem;
font-size: 0.95rem;
color: #FFFFFF;
outline: none;
transition: all 0.3s ease;
}
.login-form .form-input:focus,
#page-register .form-input:focus {
border-color: #00BCD4;
box-shadow: 0 0 0 3px rgba(0, 188, 212, 0.35);
background: rgba(255,255,255,0.12);
}
.login-form .form-input {
background: #f5f5f5;
border: 1px solid #e0e0e0;
.login-form .form-input::placeholder,
#page-register .form-input::placeholder {
color: rgba(255, 255, 255, 0.45);
font-size: 0.85rem;
}
/* 登录按钮优化 */
.login-form .button-large {
margin-top: 8px;
margin-bottom: 12px;
width: 100%;
padding: 0.9rem;
background: linear-gradient(105deg, #00BCD4 0%, #0097A7 100%);
border: none;
border-radius: 2rem;
font-size: 1rem;
font-weight: 600;
color: white;
cursor: pointer;
transition: all 0.2s ease;
margin-top: 0.8rem;
letter-spacing: 1px;
box-shadow: 0 6px 14px rgba(0,188,212,0.25);
}
.login-form .button-large:hover {
transform: translateY(-2px);
filter: brightness(1.05);
box-shadow: 0 10px 20px rgba(0,188,212,0.35);
}
.login-form .button-large:active {
transform: translateY(1px);
}
/* 切换链接 */
.login-switch {
text-align: center;
font-size: 13px;
color: #666;
margin-top: 1.5rem;
color: rgba(255, 255, 255, 0.7);
font-size: 0.85rem;
cursor: pointer;
padding: 8px;
transition: all 0.3s ease;
}
.login-switch:hover {
color: #007AFF;
color: #00BCD4;
}
.login-demo {
width: 100%;
max-width: 320px;
background: rgba(255,255,255,0.15);
border-radius: 12px;
padding: 14px 18px;
backdrop-filter: blur(4px);
/* 演示账号卡片 */
.login-demo,
.demo-card {
margin-top: 2rem;
background: rgba(255,255,255,0.04);
border-radius: 1.2rem;
padding: 0.8rem 1rem;
border: 1px solid rgba(255,255,255,0.06);
}
.demo-title {
font-size: 12px;
color: rgba(255,255,255,0.7);
margin-bottom: 8px;
font-size: 0.7rem;
text-transform: uppercase;
letter-spacing: 1px;
color: rgba(255, 255, 255, 0.7);
margin-bottom: 0.6rem;
text-align: center;
}
.demo-item,
.demo-btn {
padding: 0.5rem;
font-size: 0.8rem;
color: rgba(255, 255, 255, 0.8);
cursor: pointer;
transition: all 0.2s;
border-radius: 0.5rem;
margin-bottom: 0.3rem;
}
.demo-item:hover,
.demo-btn:hover {
background: rgba(0,188,212,0.18);
color: #00BCD4;
}
.demo-buttons {
display: flex;
gap: 0.8rem;
justify-content: center;
}
.demo-btn {
background: rgba(0,188,212,0.18);
border: 1px solid rgba(0,188,212,0.4);
border-radius: 2rem;
padding: 0.4rem 1rem;
font-size: 0.7rem;
color: #00BCD4;
font-weight: 500;
}
.brand {
text-align: center;
margin-bottom: 2rem;
}
.brand-icon {
font-size: 3.2rem;
margin-bottom: 0.5rem;
background: rgba(255,255,255,0.1);
width: 70px;
height: 70px;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 30px;
backdrop-filter: blur(4px);
box-shadow: 0 8px 20px rgba(0,0,0,0.2);
}
.demo-item {
.brand h1 {
font-size: 1.9rem;
font-weight: 600;
letter-spacing: 2px;
background: linear-gradient(135deg, #FFF, #B2EBF2);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
margin-top: 0.5rem;
}
.brand-sub {
font-size: 0.85rem;
color: rgba(255, 255, 255, 0.7);
margin-top: 0.2rem;
}
/* 注册页面头部优化 */
#page-register .page-header {
background: transparent;
border-bottom: 1px solid rgba(255, 255, 255, 0.12);
position: relative;
z-index: 1;
}
#page-register .back-btn {
color: #00BCD4;
background: rgba(0,188,212,0.15);
padding: 0.3rem 1rem;
border-radius: 2rem;
transition: all 0.3s ease;
}
#page-register .back-btn:hover {
background: rgba(0,188,212,0.35);
}
#page-register .page-title {
color: #FFFFFF;
}
#page-register .page-content {
position: relative;
z-index: 1;
padding: 1.5rem 1.5rem 2rem;
min-height: calc(100vh - 60px);
overflow-y: auto;
}
/* 注册按钮优化 */
#page-register .button-large.success {
background: linear-gradient(105deg, #00BCD4 0%, #0097A7 100%);
border-radius: 2rem;
box-shadow: 0 6px 14px rgba(0,188,212,0.25);
transition: all 0.2s ease;
}
#page-register .button-large.success:hover {
transform: translateY(-2px);
box-shadow: 0 10px 20px rgba(0,188,212,0.35);
}
/* 记住密码和忘记密码 */
.form-footer {
display: flex;
justify-content: space-between;
align-items: center;
margin: 0.8rem 0 1.2rem;
font-size: 0.75rem;
}
.checkbox {
display: flex;
align-items: center;
gap: 0.4rem;
color: rgba(255, 255, 255, 0.7);
cursor: pointer;
}
.checkbox input[type="checkbox"] {
accent-color: #00BCD4;
}
.forgot-link {
color: #00BCD4;
text-decoration: none;
font-size: 0.75rem;
transition: all 0.3s ease;
}
.forgot-link:hover {
text-decoration: underline;
opacity: 0.85;
}
/* 页面切换动画 */
.page.active {
animation: fadeIn 0.3s forwards;
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(6px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* 确保登录/注册页面全屏显示,无底部黑条 */
#page-login .tab-bar,
#page-register .tab-bar {
display: none !important;
}
#page-login,
#page-register {
padding-bottom: 0 !important;
margin-bottom: 0 !important;
}
/* ===== 投放点选择相关样式 ===== */
/* 选中的投放点卡片(在填写物资信息页面) */
.selected-drop-card {
background: linear-gradient(135deg, #E6F7FF 0%, #BAE7FF 100%);
border: 2px solid #007AFF;
border-radius: 12px;
padding: 14px;
margin-bottom: 8px;
animation: slideIn 0.3s ease;
}
@keyframes slideIn {
from {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.selected-drop-info {
display: flex;
flex-direction: column;
gap: 4px;
}
.selected-drop-name {
font-size: 16px;
font-weight: 600;
color: #007AFF;
}
.selected-drop-coords {
font-size: 12px;
color: rgba(255,255,255,0.9);
padding: 6px 0;
border-bottom: 1px solid rgba(255,255,255,0.1);
color: #666;
}
/* 小卡片(在地图选点页面) */
.mini-drop-card {
display: flex;
align-items: center;
gap: 10px;
padding: 12px;
background: var(--bg-card);
border: 2px solid var(--border-color);
border-radius: 10px;
margin-bottom: 8px;
cursor: pointer;
transition: all 0.2s ease;
}
.demo-item:last-child { border-bottom: none; }
.demo-item:hover { color: #fff; }
/* ===== 滚动条 ===== */
::-webkit-scrollbar { width: 0; }
.mini-drop-card:active {
transform: scale(0.98);
}
.mini-drop-card.selected {
background: linear-gradient(135deg, #E6F7FF 0%, #BAE7FF 100%);
border-color: #007AFF;
box-shadow: 0 2px 8px rgba(0, 122, 255, 0.2);
}
.mini-drop-icon {
font-size: 24px;
flex-shrink: 0;
}
.mini-drop-content {
flex: 1;
min-width: 0;
}
.mini-drop-name {
font-size: 14px;
font-weight: 600;
color: var(--text-primary);
margin-bottom: 2px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.mini-drop-address {
font-size: 12px;
color: var(--text-secondary);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.mini-drop-check {
font-size: 20px;
color: #007AFF;
font-weight: bold;
flex-shrink: 0;
opacity: 0;
transition: opacity 0.2s;
}
.mini-drop-card.selected .mini-drop-check {
opacity: 1;
}
/* 推荐投放点小卡片列表 */
#drop-point-list .mini-drop-card {
margin-bottom: 8px;
}
#drop-point-list .mini-drop-card.safe {
border-left: 4px solid #52c41a;
}
#drop-point-list .mini-drop-card.danger {
border-left: 4px solid #ff4d4f;
opacity: 0.7;
}

@ -8,37 +8,58 @@
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<!-- 动态背景装饰 -->
<div class="glow-orb orb-1"></div>
<div class="glow-orb orb-2"></div>
<!-- 页面容器 -->
<div id="app">
<!-- ===== 登录页 ===== -->
<div class="container" id="appContainer">
<!-- 登录页面 -->
<div class="page active" id="page-login">
<div class="login-body">
<div class="login-logo">📱</div>
<div class="login-title">智途投送</div>
<div class="login-subtitle">单兵终端系统</div>
<div class="login-form">
<div class="form-group">
<label class="form-label">🎖️ 士兵编号</label>
<input type="text" class="form-input" id="login-id" placeholder="请输入士兵编号">
</div>
<div class="form-group">
<label class="form-label">🔑 密码</label>
<input type="password" class="form-input" id="login-pwd" placeholder="请输入密码">
</div>
<button class="button-large" onclick="App.doLogin()">登 录</button>
<div class="login-switch" onclick="App.router('register')">还没有账号?点击注册</div>
<div class="brand">
<div class="brand-icon">📱</div>
<h1>智途投送</h1>
<div class="brand-sub">单兵终端系统 · 安全准入</div>
</div>
<div class="form-group">
<label class="form-label">🎖️ 士兵编号</label>
<input type="text" class="form-input" id="login-id" placeholder="请输入士兵编号" autocomplete="username">
</div>
<div class="form-group">
<label class="form-label">🔑 密码</label>
<input type="password" class="form-input" id="login-pwd" placeholder="请输入密码" autocomplete="current-password">
</div>
<div class="login-demo">
<div class="demo-title">演示账号</div>
<div class="demo-item" onclick="App.fillLogin('soldier_001','123456')"> soldier_001 / 123456 (张三)</div>
<div class="demo-item" onclick="App.fillLogin('soldier_002','123456')"> soldier_002 / 123456 (李四)</div>
<!-- 增加细节:记住密码 + 忘记密码 -->
<div class="form-footer">
<label class="checkbox">
<input type="checkbox" id="rememberMe" style="accent-color: #00BCD4;"> 记住密码
</label>
<a href="#" class="forgot-link" onclick="alert('请联系指挥官重置密码'); return false;">🔐 忘记密码?</a>
</div>
<button class="button-large" onclick="App.doLogin()">登 录</button>
<div class="login-switch" onclick="App.router('register')">
还没有账号?<strong style="color:#00BCD4;">立即注册</strong>
</div>
<!-- 演示账号 (优化:改为简洁胶囊) -->
<div class="demo-card">
<div class="demo-title">⚡ 快速体验</div>
<div class="demo-buttons">
<div class="demo-btn" onclick="App.fillLogin('soldier_001','123456')">张三 · 001</div>
<div class="demo-btn" onclick="App.fillLogin('soldier_002','123456')">李四 · 002</div>
</div>
</div>
</div>
</div>
<!-- ===== 注册页 ===== -->
<!-- 注册页面:保留原始全部字段,视觉上优化间距和按钮 -->
<div class="page" id="page-register">
<div class="page-header">
<span class="back-btn" onclick="App.back()">← 返回</span>
@ -52,22 +73,22 @@
</div>
<div class="form-group">
<label class="form-label">👤 姓名</label>
<input type="text" class="form-input" id="reg-name" placeholder="真实姓名">
<input type="text" class="form-input" id="reg-name" placeholder="请输入真实姓名">
</div>
<div class="form-group">
<label class="form-label">🔑 密码</label>
<input type="password" class="form-input" id="reg-pwd" placeholder="设置密码">
<input type="password" class="form-input" id="reg-pwd" placeholder="6~18位字母或数字">
</div>
<div class="form-group">
<label class="form-label">🏢 所属单位</label>
<input type="text" class="form-input" id="reg-unit" placeholder="如: 第3步兵师/4连" value="第3步兵师/1连">
<input type="text" class="form-input" id="reg-unit" placeholder="第3步兵师/4连" value="第3步兵师/1连">
</div>
<div class="form-group">
<label class="form-label">🎯 职位</label>
<input type="text" class="form-input" id="reg-role" placeholder="如: 狙击手" value="步兵">
<input type="text" class="form-input" id="reg-role" placeholder="狙击手" value="步兵">
</div>
<button class="button-large success" onclick="App.doRegister()"> </button>
<div class="login-switch" onclick="App.router('login')">已有账号?去登录</div>
<button class="button-large success" onclick="App.doRegister()">立即注册</button>
<div class="login-switch" onclick="App.router('login')">已有账号?去登录</div>
</div>
</div>
@ -159,7 +180,13 @@
<div class="form-group">
<label class="form-label">📍 期望投放点</label>
<div class="card" id="demand-drop-display">当前位置A区街角12号</div>
<div class="card selected-drop-card" id="selected-drop-card" style="display: none;">
<div class="selected-drop-info">
<div class="selected-drop-name" id="selected-drop-name">--</div>
<div class="selected-drop-coords" id="selected-drop-coords">--</div>
</div>
</div>
<div class="card" id="demand-drop-display" style="display: block;">未选择投放点</div>
<button class="btn-outline" onclick="App.router('drop')">🎯 选择投放点</button>
</div>
@ -172,7 +199,7 @@
</div>
</div>
<button class="button-large success" onclick="App.submitDemand()">确认上报</button>
<button class="button-large success" onclick="App.submitDemand()">确认上报</button>
</div>
</div>
@ -183,7 +210,7 @@
<span class="page-title">🎯 地图选点</span>
<span></span>
</div>
<div class="page-content" style="padding: 0;">
<div class="page-content" style="padding: 0; overflow-y: auto;">
<!-- 搜索框 -->
<div style="padding: 10px 14px; background: #fff; border-bottom: 1px solid #eee;">
<div style="display: flex; gap: 8px;">
@ -204,19 +231,24 @@
</div>
</div>
<!-- 选中位置信息 -->
<div style="padding: 12px 14px; background: #fff;">
<div style="font-size: 13px; color: #666; margin-bottom: 6px;">📍 已选位置</div>
<div id="drop-selected-name" style="font-size: 15px; font-weight: bold; color: #333; margin-bottom: 4px;">请点击地图选择投放点</div>
<div id="drop-selected-address" style="font-size: 12px; color: #999;">--</div>
<div id="drop-selected-coords" style="font-size: 12px; color: #007AFF; margin-top: 4px;">--</div>
<!-- 选中位置信息卡片 -->
<div id="selected-location-card" style="padding: 12px 14px; background: #fff; display: none;">
<div style="font-size: 13px; color: #666; margin-bottom: 6px;">📍 我选择的位置</div>
<div class="mini-drop-card selected" onclick="App.selectDropPointFromMap()">
<div class="mini-drop-icon">📍</div>
<div class="mini-drop-content">
<div class="mini-drop-name" id="mini-selected-name">--</div>
<div class="mini-drop-address" id="mini-selected-address">--</div>
</div>
<div class="mini-drop-check"></div>
</div>
</div>
<!-- 推荐列表(保留作为参考) -->
<!-- 推荐列表 -->
<div style="padding: 10px 14px;">
<div class="section-title">🎯 附近推荐投放点</div>
<div id="drop-point-list">
<!-- 动态加载 -->
<!-- 动态加载小卡片 -->
</div>
</div>
@ -229,7 +261,6 @@
<!-- ===== 任务监控 ===== -->
<div class="page" id="page-task">
<div class="page-header">
<span class="back-btn" onclick="App.back()">← 返回</span>
<span class="page-title">📋 当前任务</span>
<span></span>
</div>
@ -276,7 +307,6 @@
<!-- ===== 无人机状态 ===== -->
<div class="page" id="page-drone">
<div class="page-header">
<span class="back-btn" onclick="App.back()">← 返回</span>
<span class="page-title">🚀 无人机状态</span>
<span></span>
</div>
@ -345,7 +375,6 @@
<!-- ===== 个人中心 ===== -->
<div class="page" id="page-profile">
<div class="page-header">
<span class="back-btn" onclick="App.back()">← 返回</span>
<span class="page-title">👤 个人中心</span>
<span></span>
</div>
@ -392,19 +421,19 @@
<div class="card menu-list">
<div class="menu-item" onclick="App.showServerConfig()">
<span>🖥️ 服务器地址</span>
<span class="menu-value" id="server-addr">配置 →</span>
<span class="menu-value" id="server-addr">配置</span>
</div>
<div class="menu-item" onclick="App.toggleTheme()">
<span>🌙 主题模式</span>
<span class="menu-value" id="theme-value">◉ 深色</span>
</div>
<div class="menu-item"><span>🌐 语言</span><span class="menu-value">🇨🇳 简体中文 →</span></div>
<div class="menu-item"><span>🌙 主题模式</span><span class="menu-value">◉ 深色 →</span></div>
<div class="menu-item"><span>🔔 消息通知</span><span class="menu-toggle on"></span></div>
<div class="menu-item"><span>📥 自动更新</span><span class="menu-toggle on"></span></div>
<div class="menu-item" onclick="App.toggleSwitch(this)"><span>🔔 消息通知</span><span class="menu-toggle on"></span></div>
</div>
<div class="section-title">🔒 安全设置</div>
<div class="card menu-list">
<div class="menu-item"><span>🔐 启用生物识别</span><span class="menu-toggle on"></span></div>
<div class="menu-item"><span>🔑 修改登录密码</span><span class="menu-value">修改 →</span></div>
<div class="menu-item"><span>📧 联系方式</span><span class="menu-value">138****8888</span></div>
<div class="menu-item" onclick="App.toggleSwitch(this)"><span>🔐 启用生物识别</span><span class="menu-toggle on"></span></div>
<div class="menu-item" onclick="App.showChangePasswordModal()"><span>🔑 修改登录密码</span><span class="menu-value">修改</span></div>
</div>
<div class="section-title"> 关于</div>
@ -439,7 +468,7 @@
<span class="tab-icon">👤</span>
<span class="tab-label">我的</span>
</div>
</nav>
</nav>1
<!-- 提示Toast -->
<div id="toast" class="toast"></div>

@ -142,6 +142,17 @@ const API = (() => {
}
}
async function changePassword(soldierId, oldPassword, newPassword) {
return request('/api/auth/change-password', {
method: 'POST',
body: JSON.stringify({
soldier_id: soldierId,
old_password: oldPassword,
new_password: newPassword
})
});
}
// ===== 模拟数据(后端未就绪时使用) =====
function getMockDropPoints() {
return [
@ -201,6 +212,7 @@ const API = (() => {
sendSOS,
login,
register,
getAccounts
getAccounts,
changePassword
};
})();

@ -10,6 +10,7 @@ const App = (() => {
soldierId: localStorage.getItem('soldier_id') || 'soldier_001',
soldierName: localStorage.getItem('soldier_name') || '张三',
soldierUnit: localStorage.getItem('soldier_unit') || '第3步兵师/1连',
theme: localStorage.getItem('app_theme') || 'dark', // 主题模式:'dark' | 'light' | 'auto'
pollInterval: 5000
};
@ -25,6 +26,9 @@ const App = (() => {
// ===== 初始化 =====
function init() {
// 初始化主题
initTheme();
// 检查登录状态
const saved = localStorage.getItem('soldier_session');
if (saved) {
@ -337,9 +341,20 @@ const App = (() => {
try {
await API.postDemand(demand);
showToast('✅ 需求上报成功!');
// 清空选中的投放点
selectedDropPoint = null;
mapSelectedPoint = null;
// 重置填写物资信息页面的显示
const selectedCard = document.getElementById('selected-drop-card');
const dropDisplay = document.getElementById('demand-drop-display');
if (dropDisplay) dropDisplay.textContent = '当前位置A区街角12号';
if (selectedCard) selectedCard.style.display = 'none';
if (dropDisplay) {
dropDisplay.style.display = 'block';
dropDisplay.textContent = '未选择投放点';
}
setTimeout(() => router('home'), 1000);
} catch (e) {
showToast('❌ 上报失败:' + (e.message || '网络错误'));
@ -352,18 +367,24 @@ const App = (() => {
setTimeout(async () => {
await LocationModule.initPickerMap('drop-map', (point) => {
mapSelectedPoint = point;
// 更新UI显示
const nameEl = document.getElementById('drop-selected-name');
const addrEl = document.getElementById('drop-selected-address');
const coordEl = document.getElementById('drop-selected-coords');
if (nameEl) nameEl.textContent = point.name;
if (addrEl) addrEl.textContent = point.address;
if (coordEl) coordEl.textContent = `${point.lat.toFixed(6)}, ${point.lng.toFixed(6)}`;
showToast('📍 已选择:' + point.name);
// 显示选中位置卡片
const selectedCard = document.getElementById('selected-location-card');
if (selectedCard) {
selectedCard.style.display = 'block';
// 更新卡片内容
const nameEl = document.getElementById('mini-selected-name');
const addrEl = document.getElementById('mini-selected-address');
if (nameEl) nameEl.textContent = point.name;
if (addrEl) addrEl.textContent = point.address || `${point.lat.toFixed(6)}, ${point.lng.toFixed(6)}`;
showToast('📍 已选择:' + point.name);
}
});
}, 300);
// 加载推荐列表
// 加载推荐列表(小卡片形式)
const list = document.getElementById('drop-point-list');
list.innerHTML = '<div style="text-align:center;color:#999;padding:20px;">加载中...</div>';
@ -374,19 +395,17 @@ const App = (() => {
return;
}
// 渲染为小卡片形式
list.innerHTML = points.map((p, i) => {
const isSafe = p.safety_score >= 70;
return `
<div class="card drop-card ${isSafe ? 'safe' : 'danger'}" onclick="App.selectDropPoint(${i})" style="cursor:pointer;">
<div style="font-size:14px;color:#333;margin-bottom:5px;">📍 ${p.name}</div>
<div class="drop-info">
<span>安全系数: ${p.safety_score}%</span>
<span>距离: ${p.distance}m</span>
</div>
<div style="font-size:12px;color:#666;margin-bottom:10px;">${p.reason}</div>
<div style="font-size:12px;color:${isSafe ? '#52c41a' : '#ff4d4f'};">
${isSafe ? '✅ 推荐投放' : '❌ 危险区域'}
<div class="mini-drop-card ${isSafe ? 'safe' : 'danger'}" onclick="App.selectDropPointFromList(${i})">
<div class="mini-drop-icon">${isSafe ? '✅' : '⚠️'}</div>
<div class="mini-drop-content">
<div class="mini-drop-name">${p.name}</div>
<div class="mini-drop-address">安全系数: ${p.safety_score}% · 距离: ${p.distance}m</div>
</div>
<div class="mini-drop-check"></div>
</div>
`;
}).join('');
@ -459,35 +478,54 @@ const App = (() => {
showToast('📍 已定位:' + p.name);
}
// ===== 选择投放点(从列表) =====
function selectDropPoint(index) {
API.getDropPoints().then(async points => {
// ===== 从列表选择投放点 =====
async function selectDropPointFromList(index) {
try {
const points = await API.getDropPoints();
const p = points[index];
if (!p) return;
if (p.safety_score < 70) {
showToast('⚠️ 该区域危险,建议选择其他投放点');
return;
}
selectedDropPoint = p;
// 同时在地图上标记
// 在地图上标记
await LocationModule.setPickerPosition(p.lat, p.lng, p.name, p.address);
// 更新选中显示
// 更新选中状态
mapSelectedPoint = {
lat: p.lat,
lng: p.lng,
name: p.name,
address: p.address || p.name
};
const nameEl = document.getElementById('drop-selected-name');
const addrEl = document.getElementById('drop-selected-address');
const coordEl = document.getElementById('drop-selected-coords');
if (nameEl) nameEl.textContent = p.name;
if (addrEl) addrEl.textContent = p.address || '安全系数 ' + p.safety_score + '%';
if (coordEl) coordEl.textContent = `${p.lat.toFixed(6)}, ${p.lng.toFixed(6)}`;
// 显示选中位置卡片
const selectedCard = document.getElementById('selected-location-card');
if (selectedCard) {
selectedCard.style.display = 'block';
const nameEl = document.getElementById('mini-selected-name');
const addrEl = document.getElementById('mini-selected-address');
if (nameEl) nameEl.textContent = p.name;
if (addrEl) addrEl.textContent = p.address || `安全系数 ${p.safety_score}%`;
}
showToast('已选择:' + p.name);
});
} catch (e) {
showToast('选择失败');
}
}
// ===== 从地图选择投放点(点击选中的卡片) =====
function selectDropPointFromMap() {
if (!mapSelectedPoint) {
showToast('请先在地图上选择一个位置');
return;
}
showToast('📍 已确认:' + mapSelectedPoint.name);
}
function confirmDropPoint() {
@ -495,18 +533,48 @@ const App = (() => {
if (mapSelectedPoint) {
selectedDropPoint = mapSelectedPoint;
router('demand');
const display = document.getElementById('demand-drop-display');
if (display) display.textContent = mapSelectedPoint.name;
// 更新填写物资信息页面的显示
const selectedCard = document.getElementById('selected-drop-card');
const dropDisplay = document.getElementById('demand-drop-display');
if (selectedCard && dropDisplay) {
// 隐藏默认显示,显示选中卡片
dropDisplay.style.display = 'none';
selectedCard.style.display = 'block';
// 更新卡片内容
const nameEl = document.getElementById('selected-drop-name');
const coordsEl = document.getElementById('selected-drop-coords');
if (nameEl) nameEl.textContent = mapSelectedPoint.name;
if (coordsEl) coordsEl.textContent = `${mapSelectedPoint.lat.toFixed(6)}, ${mapSelectedPoint.lng.toFixed(6)}`;
}
showToast('✅ 已确认投放点:' + mapSelectedPoint.name);
return;
}
// fallback到列表选中的点
if (selectedDropPoint) {
router('demand');
const display = document.getElementById('demand-drop-display');
if (display) display.textContent = selectedDropPoint.name;
const selectedCard = document.getElementById('selected-drop-card');
const dropDisplay = document.getElementById('demand-drop-display');
if (selectedCard && dropDisplay) {
dropDisplay.style.display = 'none';
selectedCard.style.display = 'block';
const nameEl = document.getElementById('selected-drop-name');
const coordsEl = document.getElementById('selected-drop-coords');
if (nameEl) nameEl.textContent = selectedDropPoint.name;
if (coordsEl) coordsEl.textContent = `${selectedDropPoint.lat.toFixed(6)}, ${selectedDropPoint.lng.toFixed(6)}`;
}
showToast('✅ 已确认投放点:' + selectedDropPoint.name);
return;
}
showToast('请先点击地图或列表选择一个投放点');
}
@ -549,7 +617,11 @@ const App = (() => {
if (tstart) tstart.textContent = task.start_name || '后方阵地';
const ttarget = document.getElementById('task-target');
if (ttarget) ttarget.textContent = task.target_name || '目标位置';
if (ttarget) {
// 优先使用选中的投放点名称,其次使用后端返回的 target_name
const targetName = selectedDropPoint ? selectedDropPoint.name : (task.target_name || '目标位置');
ttarget.textContent = targetName;
}
const trisk = document.getElementById('task-risk');
if (trisk) trisk.textContent = '安全系数: ' + (task.safety_score || 0) + '%';
@ -692,9 +764,38 @@ const App = (() => {
}
}
function updateDropPoint() {
showToast('投放点已更新');
setTimeout(() => router('task'), 500);
async function updateDropPoint() {
try {
showToast('正在获取当前位置...');
// 获取当前位置
const pos = await LocationModule.getCurrentPosition();
// 构建投放点对象
const newDropPoint = {
name: '当前位置 (' + pos.lat.toFixed(6) + ', ' + pos.lng.toFixed(6) + ')',
lat: pos.lat,
lng: pos.lng,
safety_score: 90, // 默认安全系数
address: 'GPS定位位置'
};
// 更新选中的投放点
selectedDropPoint = newDropPoint;
mapSelectedPoint = newDropPoint;
showToast('✅ 投放点已更新为当前位置');
// 跳转到任务页面
setTimeout(() => {
router('task');
// 强制刷新任务信息
loadTaskInfo();
}, 500);
} catch (e) {
showToast('❌ 获取位置失败:' + (e.message || '未知错误'));
console.error('updateDropPoint错误:', e);
}
}
// ===== 标注 =====
@ -731,6 +832,446 @@ const App = (() => {
}
}
// ===== 主题切换 =====
function initTheme() {
const theme = CONFIG.theme || 'dark';
applyTheme(theme);
updateThemeDisplay();
// 如果是自动模式,监听系统主题变化
if (theme === 'auto') {
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
mediaQuery.addEventListener('change', handleSystemThemeChange);
}
}
function applyTheme(theme) {
if (theme === 'auto') {
const isDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
document.documentElement.setAttribute('data-theme', isDark ? 'dark' : 'light');
} else {
document.documentElement.setAttribute('data-theme', theme);
}
}
function handleSystemThemeChange(e) {
if (CONFIG.theme === 'auto') {
applyTheme('auto');
const themeName = e.matches ? '深色' : '浅色';
showToast('系统主题已切换为:' + themeName + '模式');
}
}
function toggleTheme() {
// 创建自定义选择弹窗
const modal = document.createElement('div');
modal.style.cssText = `
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0,0,0,0.5);
display: flex;
align-items: center;
justify-content: center;
z-index: 10000;
`;
const content = document.createElement('div');
content.style.cssText = `
background: white;
border-radius: 12px;
padding: 20px;
min-width: 280px;
max-width: 90%;
`;
const title = document.createElement('div');
title.textContent = '选择主题模式';
title.style.cssText = `
font-size: 16px;
font-weight: 600;
color: #333;
margin-bottom: 16px;
text-align: center;
`;
const options = [
{ value: 'dark', label: '🌙 深色模式', desc: '始终使用深色主题' },
{ value: 'light', label: '☀️ 浅色模式', desc: '始终使用浅色主题' },
{ value: 'auto', label: '🔄 跟随系统', desc: '自动跟随系统主题' }
];
options.forEach((opt, index) => {
const optionDiv = document.createElement('div');
const isSelected = CONFIG.theme === opt.value;
optionDiv.style.cssText = `
padding: 12px 16px;
margin-bottom: ${index < options.length - 1 ? '8px' : '0'};
border-radius: 8px;
cursor: pointer;
background: ${isSelected ? '#E6F7FF' : '#f5f5f5'};
border: ${isSelected ? '2px solid #007AFF' : '2px solid transparent'};
transition: all 0.2s;
`;
optionDiv.innerHTML = `
<div style="font-size: 14px; font-weight: ${isSelected ? '600' : '400'}; color: #333; margin-bottom: 4px;">
${opt.label}
</div>
<div style="font-size: 12px; color: #666;">
${opt.desc}
</div>
`;
optionDiv.addEventListener('click', () => {
// 应用选择的主题
CONFIG.theme = opt.value;
localStorage.setItem('app_theme', CONFIG.theme);
applyTheme(CONFIG.theme);
updateThemeDisplay();
// 关闭弹窗
document.body.removeChild(modal);
const themeNames = {
'dark': '深色模式',
'light': '浅色模式',
'auto': '环境跟随'
};
showToast('已切换到:' + themeNames[CONFIG.theme]);
// 如果切换到自动模式,开始监听系统主题
if (CONFIG.theme === 'auto') {
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
mediaQuery.addEventListener('change', handleSystemThemeChange);
}
});
content.appendChild(optionDiv);
});
// 添加取消按钮
const cancelBtn = document.createElement('div');
cancelBtn.textContent = '取消';
cancelBtn.style.cssText = `
margin-top: 16px;
padding: 12px;
text-align: center;
color: #007AFF;
font-size: 14px;
cursor: pointer;
border-top: 1px solid #e0e0e0;
`;
cancelBtn.addEventListener('click', () => {
document.body.removeChild(modal);
});
content.appendChild(cancelBtn);
modal.appendChild(content);
document.body.appendChild(modal);
// 点击背景关闭
modal.addEventListener('click', (e) => {
if (e.target === modal) {
document.body.removeChild(modal);
}
});
}
function updateThemeDisplay() {
const themeEl = document.getElementById('theme-value');
if (!themeEl) return;
const themeIcons = {
'dark': '◉ 深色',
'light': '○ 浅色',
'auto': '◎ 跟随系统'
};
themeEl.textContent = themeIcons[CONFIG.theme] + ' →';
}
// ===== 修改密码 =====
function showChangePasswordModal() {
// 获取当前主题
const currentTheme = document.documentElement.getAttribute('data-theme') || 'dark';
const isDark = currentTheme === 'dark';
// 主题颜色配置
const themeColors = {
bg: isDark ? '#1a1a2e' : 'white',
text: isDark ? '#e0e0e0' : '#333',
border: isDark ? '#2a2a3e' : '#e0e0e0',
inputBg: isDark ? '#16213e' : 'white',
cancelBg: isDark ? '#2a2a3e' : '#f5f5f5',
cancelText: isDark ? '#e0e0e0' : '#333'
};
// 创建弹窗
const modal = document.createElement('div');
modal.style.cssText = `
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0,0,0,0.5);
display: flex;
align-items: center;
justify-content: center;
z-index: 10000;
`;
const content = document.createElement('div');
content.style.cssText = `
background: ${themeColors.bg};
border-radius: 12px;
padding: 24px;
min-width: 320px;
max-width: 90%;
`;
const title = document.createElement('div');
title.textContent = '修改登录密码';
title.style.cssText = `
font-size: 18px;
font-weight: 600;
color: ${themeColors.text};
margin-bottom: 20px;
text-align: center;
`;
// 输入框配置
const inputs = [
{ id: 'old-pwd', label: '原密码', type: 'password', placeholder: '请输入原密码' },
{ id: 'new-pwd', label: '新密码', type: 'password', placeholder: '请输入新密码' },
{ id: 'confirm-pwd', label: '确认新密码', type: 'password', placeholder: '请再次输入新密码' }
];
inputs.forEach((input, index) => {
const group = document.createElement('div');
group.style.cssText = 'margin-bottom: 16px;';
const label = document.createElement('label');
label.textContent = input.label;
label.style.cssText = `
display: block;
font-size: 14px;
color: ${themeColors.text};
margin-bottom: 6px;
font-weight: 500;
`;
const inputWrapper = document.createElement('div');
inputWrapper.style.cssText = 'position: relative;';
const inputEl = document.createElement('input');
inputEl.type = input.type;
inputEl.id = input.id;
inputEl.placeholder = input.placeholder;
inputEl.style.cssText = `
width: 100%;
padding: 12px 40px 12px 12px;
border: 1px solid ${themeColors.border};
border-radius: 8px;
font-size: 14px;
outline: none;
box-sizing: border-box;
background: ${themeColors.inputBg};
color: ${themeColors.text};
`;
// 眼睛图标(显示/隐藏密码)
const eyeIcon = document.createElement('span');
eyeIcon.innerHTML = '🙈'; // 默认隐藏密码,显示捂眼
eyeIcon.style.cssText = `
position: absolute;
right: 12px;
top: 50%;
transform: translateY(-50%);
cursor: pointer;
font-size: 18px;
user-select: none;
`;
let isPasswordVisible = false;
eyeIcon.addEventListener('click', () => {
isPasswordVisible = !isPasswordVisible;
inputEl.type = isPasswordVisible ? 'text' : 'password';
// 显示密码时用睁开的眼睛,隐藏时用捂眼
eyeIcon.innerHTML = isPasswordVisible ? '👁️' : '🙈';
});
inputWrapper.appendChild(inputEl);
inputWrapper.appendChild(eyeIcon);
group.appendChild(label);
group.appendChild(inputWrapper);
content.appendChild(group);
});
// 按钮区域
const btnGroup = document.createElement('div');
btnGroup.style.cssText = `
display: flex;
gap: 12px;
margin-top: 24px;
`;
// 取消按钮
const cancelBtn = document.createElement('button');
cancelBtn.textContent = '取消';
cancelBtn.style.cssText = `
flex: 1;
padding: 12px;
background: ${themeColors.cancelBg};
color: ${themeColors.cancelText};
border: none;
border-radius: 8px;
font-size: 14px;
cursor: pointer;
`;
cancelBtn.addEventListener('click', () => {
document.body.removeChild(modal);
});
// 确认按钮
const confirmBtn = document.createElement('button');
confirmBtn.textContent = '确认修改';
confirmBtn.style.cssText = `
flex: 1;
padding: 12px;
background: linear-gradient(135deg, #007AFF 0%, #0056b3 100%);
color: white;
border: none;
border-radius: 8px;
font-size: 14px;
font-weight: 600;
cursor: pointer;
`;
// 显示结果状态的函数
function showResult(success, message) {
content.innerHTML = '';
content.style.textAlign = 'center';
content.style.padding = '40px 24px';
const icon = document.createElement('div');
icon.textContent = success ? '✅' : '❌';
icon.style.cssText = `
font-size: 48px;
margin-bottom: 16px;
`;
const msg = document.createElement('div');
msg.textContent = message;
msg.style.cssText = `
font-size: 16px;
color: ${themeColors.text};
margin-bottom: 24px;
`;
const closeBtn = document.createElement('button');
closeBtn.textContent = '关闭';
closeBtn.style.cssText = `
padding: 12px 48px;
background: ${success ? 'linear-gradient(135deg, #28a745 0%, #1e7e34 100%)' : 'linear-gradient(135deg, #007AFF 0%, #0056b3 100%)'};
color: white;
border: none;
border-radius: 8px;
font-size: 14px;
font-weight: 600;
cursor: pointer;
`;
closeBtn.addEventListener('click', () => {
document.body.removeChild(modal);
});
content.appendChild(icon);
content.appendChild(msg);
content.appendChild(closeBtn);
// 成功时2秒后自动关闭
if (success) {
setTimeout(() => {
if (document.body.contains(modal)) {
document.body.removeChild(modal);
}
}, 2000);
}
}
confirmBtn.addEventListener('click', async () => {
// 防止重复点击
if (confirmBtn.disabled) return;
const oldPwd = document.getElementById('old-pwd').value.trim();
const newPwd = document.getElementById('new-pwd').value.trim();
const confirmPwd = document.getElementById('confirm-pwd').value.trim();
// 验证
if (!oldPwd || !newPwd || !confirmPwd) {
showToast('请填写所有字段');
return;
}
if (newPwd !== confirmPwd) {
showToast('两次输入的新密码不一致');
return;
}
if (newPwd.length < 6) {
showToast('新密码长度不能少于6位');
return;
}
// 立即禁用按钮并显示加载状态
confirmBtn.disabled = true;
confirmBtn.textContent = '处理中...';
confirmBtn.style.opacity = '0.7';
cancelBtn.disabled = true;
try {
const result = await API.changePassword(CONFIG.soldierId, oldPwd, newPwd);
if (result.ok) {
showResult(true, '密码修改成功');
} else {
showResult(false, result.error || '修改失败');
}
} catch (e) {
// 如果后端不可用,使用离线模式
const demoAccounts = {
'soldier_001': '123456',
'soldier_002': '123456',
'soldier_003': '123456'
};
const currentPwd = demoAccounts[CONFIG.soldierId];
if (!currentPwd || oldPwd !== currentPwd) {
showResult(false, '原密码错误');
return;
}
showResult(true, '密码修改成功');
}
});
btnGroup.appendChild(cancelBtn);
btnGroup.appendChild(confirmBtn);
content.appendChild(btnGroup);
modal.appendChild(content);
document.body.appendChild(modal);
// 点击背景关闭
modal.addEventListener('click', (e) => {
if (e.target === modal) {
document.body.removeChild(modal);
}
});
}
// ===== 轮询 =====
function startPolling() {
if (pollTimer) clearInterval(pollTimer);
@ -758,7 +1299,8 @@ const App = (() => {
router,
back,
submitDemand,
selectDropPoint,
selectDropPointFromList,
selectDropPointFromMap,
confirmDropPoint,
searchDropPoint,
selectSearchResult,
@ -770,6 +1312,8 @@ const App = (() => {
showToast,
showServerConfig,
toggleSwitch,
toggleTheme,
showChangePasswordModal,
doLogin,
doRegister,
fillLogin,

@ -9,9 +9,43 @@ from datetime import datetime
from flask import Flask, send_from_directory, request, jsonify
from flask_cors import CORS
# 项目根目录server 的上级目录)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
import json
import os
# 数据文件路径
DATA_FILE = os.path.join(os.path.dirname(__file__), 'accounts.json')
# 加载账号数据
def load_accounts():
if os.path.exists(DATA_FILE):
try:
with open(DATA_FILE, 'r', encoding='utf-8') as f:
return json.load(f)
except:
pass
# 默认账号
return {
"soldier_001": { "password": "123456", "name": "张三", "unit": "第3步兵师/1连", "role": "狙击手" },
"soldier_002": { "password": "123456", "name": "李四", "unit": "第3步兵师/2连", "role": "机枪手" },
"soldier_003": { "password": "123456", "name": "王五", "unit": "第3步兵师/3连", "role": "通讯员" }
}
# 保存账号数据
def save_accounts():
try:
with open(DATA_FILE, 'w', encoding='utf-8') as f:
json.dump(_accounts, f, ensure_ascii=False, indent=2)
print("✅ 账号数据已保存")
except Exception as e:
print(f"❌ 保存账号数据失败: {e}")
# 初始化账号数据
_accounts = load_accounts()
app = Flask(__name__, static_folder=BASE_DIR)
CORS(app) # 允许跨域请求支持单兵APP访问
@ -46,11 +80,11 @@ _drone_logs = [ # 无人机动态日志
{"time": "12:10:00", "message": "任务分配"}
]
_sos_alerts = [] # 求救记录
_accounts = { # 士兵账号 { soldier_id: { password, name, unit, role } }
"soldier_001": { "password": "123456", "name": "张三", "unit": "第3步兵师/1连", "role": "狙击手" },
"soldier_002": { "password": "123456", "name": "李四", "unit": "第3步兵师/2连", "role": "机枪手" },
"soldier_003": { "password": "123456", "name": "王五", "unit": "第3步兵师/3连", "role": "通讯员" }
}
# _accounts = { # 士兵账号 { soldier_id: { password, name, unit, role } }
# "soldier_001": { "password": "123456", "name": "张三", "unit": "第3步兵师/1连", "role": "狙击手" },
# "soldier_002": { "password": "123456", "name": "李四", "unit": "第3步兵师/2连", "role": "机枪手" },
# "soldier_003": { "password": "123456", "name": "王五", "unit": "第3步兵师/3连", "role": "通讯员" }
# }
_tasks = {} # { soldier_id: { id, status, progress, eta, ... } }
_task_id_counter = 0
_danger_id_counter = 0

@ -0,0 +1,8 @@
{
"permissions": {
"allow": [
"Bash(curl -sL \"https://unpkg.com/roslib@2.1.0/dist/\")",
"Bash(curl -sL \"https://unpkg.com/roslib@1.3.0/build/roslib.min.js\" -o \"d:/29578/Documents/Study/computer/S_E/软件体系结构与设计/软件前端/js/roslib.min.js\" -w \"%{http_code} %{size_download}\")"
]
}
}

@ -0,0 +1,383 @@
/* ===== 全局样式 ===== */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;
background: #f0f2f5;
height: 100vh;
display: flex;
flex-direction: column;
overflow: hidden;
color: #333;
}
/* ===== 顶部状态栏 ===== */
.top-bar {
display: flex;
justify-content: space-between;
align-items: center;
height: 48px;
padding: 0 16px;
background: #1a1a2e;
color: #e0e0e0;
flex-shrink: 0;
z-index: 1000;
}
.top-bar-left {
display: flex;
align-items: center;
gap: 16px;
}
.logo {
font-size: 15px;
font-weight: 700;
color: #fff;
letter-spacing: 1px;
}
.status-item {
font-size: 13px;
color: #aaa;
}
.status-item strong {
color: #e0e0e0;
}
.top-bar-right {
display: flex;
align-items: center;
gap: 8px;
}
.top-bar-right input {
width: 220px;
padding: 5px 10px;
border: 1px solid #444;
border-radius: 4px;
background: #2a2a3e;
color: #e0e0e0;
font-size: 13px;
}
/* ===== 连接模式切换 ===== */
.conn-mode-group {
display: flex;
border-radius: 4px;
overflow: hidden;
border: 1px solid #444;
}
.mode-btn {
padding: 4px 12px;
background: #2a2a3e;
color: #aaa;
border: none;
cursor: pointer;
font-size: 12px;
font-weight: 600;
transition: all 0.2s;
}
.mode-btn:hover { color: #ddd; }
.mode-btn.active {
background: #007aff;
color: #fff;
}
.conn-mode-tag {
font-size: 11px;
padding: 2px 8px;
border-radius: 3px;
background: #2a2a3e;
color: #888;
white-space: nowrap;
}
/* ===== 标签 ===== */
.tag {
display: inline-block;
padding: 2px 10px;
border-radius: 10px;
font-size: 12px;
font-weight: 600;
}
.tag-success { background: #f6ffed; color: #52c41a; }
.tag-danger { background: #fff1f0; color: #ff4d4f; }
.tag-warning { background: #fffbe6; color: #faad14; }
.tag-info { background: #e6f7ff; color: #007aff; }
/* ===== 按钮 ===== */
.btn {
padding: 7px 14px;
border: none;
border-radius: 6px;
cursor: pointer;
font-size: 13px;
font-weight: 600;
transition: opacity 0.2s;
}
.btn:disabled {
opacity: 0.4;
cursor: not-allowed;
}
.btn:not(:disabled):hover { opacity: 0.85; }
.btn-primary { background: #007aff; color: #fff; }
.btn-success { background: #52c41a; color: #fff; }
.btn-warning { background: #faad14; color: #fff; }
.btn-danger { background: #ff4d4f; color: #fff; }
.btn-secondary { background: #e0e0e0; color: #333; }
.btn.wide { width: 100%; }
.btn-link {
background: none;
border: none;
color: #999;
cursor: pointer;
font-size: 12px;
}
.btn-link:hover { color: #007aff; }
.btn-group {
display: flex;
gap: 8px;
margin-bottom: 8px;
}
.btn-group .btn { flex: 1; }
/* ===== 主内容区 ===== */
.main-content {
display: flex;
flex: 1;
min-height: 0;
}
/* ===== 地图 ===== */
.map-container {
flex: 1;
min-width: 0;
z-index: 1;
}
/* ===== 右侧控制面板 ===== */
.control-panel {
width: 300px;
flex-shrink: 0;
background: #fff;
border-left: 1px solid #e0e0e0;
overflow-y: auto;
display: flex;
flex-direction: column;
}
.panel-section {
padding: 12px;
border-bottom: 1px solid #f0f0f0;
}
.panel-header {
font-size: 14px;
font-weight: 700;
color: #333;
margin-bottom: 10px;
display: flex;
justify-content: space-between;
align-items: center;
}
.panel-header span:last-child {
font-weight: 400;
font-size: 12px;
color: #999;
}
/* ===== 航点列表 ===== */
.waypoint-list {
max-height: 220px;
overflow-y: auto;
margin-bottom: 8px;
}
.empty-hint {
text-align: center;
color: #bbb;
font-size: 13px;
padding: 20px 0;
}
.wp-item {
display: flex;
align-items: center;
padding: 6px 8px;
border-radius: 6px;
margin-bottom: 4px;
background: #f8f9fa;
cursor: pointer;
font-size: 13px;
transition: background 0.15s;
}
.wp-item:hover { background: #e6f7ff; }
.wp-item.active { background: #e6f7ff; border: 1px solid #91d5ff; }
.wp-index {
width: 22px;
height: 22px;
border-radius: 50%;
background: #007aff;
color: #fff;
display: flex;
align-items: center;
justify-content: center;
font-size: 11px;
font-weight: 700;
margin-right: 8px;
flex-shrink: 0;
}
.wp-info {
flex: 1;
min-width: 0;
}
.wp-coord {
font-size: 11px;
color: #666;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.wp-alt {
font-size: 11px;
color: #999;
}
.wp-delete {
width: 20px;
height: 20px;
border: none;
background: none;
color: #ccc;
cursor: pointer;
font-size: 16px;
line-height: 1;
flex-shrink: 0;
}
.wp-delete:hover { color: #ff4d4f; }
.wp-params {
display: flex;
gap: 10px;
font-size: 12px;
color: #666;
}
.wp-params input {
width: 60px;
padding: 3px 6px;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 12px;
text-align: center;
}
/* ===== 数据面板 ===== */
.data-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 8px;
}
.data-item {
background: #f8f9fa;
border-radius: 6px;
padding: 8px;
text-align: center;
}
.data-label {
display: block;
font-size: 11px;
color: #999;
margin-bottom: 2px;
}
.data-value {
font-size: 13px;
font-weight: 600;
color: #333;
}
/* ===== 底部日志栏 ===== */
.log-bar {
height: 120px;
flex-shrink: 0;
background: #1e1e1e;
display: flex;
flex-direction: column;
}
.log-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 4px 12px;
font-size: 12px;
color: #888;
background: #2a2a2a;
border-bottom: 1px solid #333;
}
.log-content {
flex: 1;
overflow-y: auto;
padding: 4px 12px;
font-family: 'Consolas', 'Monaco', monospace;
font-size: 12px;
line-height: 1.6;
}
.log-entry {
white-space: nowrap;
}
.log-entry .time { color: #666; margin-right: 8px; }
.log-entry.success { color: #52c41a; }
.log-entry.error { color: #ff4d4f; }
.log-entry.warning { color: #faad14; }
.log-entry.info { color: #aaa; }
/* ===== Leaflet 自定义 ===== */
.drone-icon {
width: 24px;
height: 24px;
position: relative;
}
.drone-icon-inner {
width: 0;
height: 0;
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-bottom: 20px solid #007aff;
position: absolute;
top: 2px;
left: 2px;
transform-origin: center 60%;
}

@ -0,0 +1,145 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>P600 无人机定点巡航控制系统</title>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<link rel="stylesheet" href="/css/style.css" />
</head>
<body>
<!-- 顶部状态栏 -->
<header class="top-bar">
<div class="top-bar-left">
<span class="logo">P600 定点巡航控制系统</span>
<span id="conn-status" class="tag tag-danger">未连接</span>
<span class="status-item">模式: <strong id="flight-mode">--</strong></span>
<span class="status-item">电量: <strong id="battery">--%</strong></span>
<span class="status-item">GPS: <strong id="gps-status">--</strong></span>
<span class="status-item">速度: <strong id="speed">-- m/s</strong></span>
<span class="status-item">高度: <strong id="altitude">-- m</strong></span>
</div>
<div class="top-bar-right">
<div class="conn-mode-group">
<button id="btn-mode-sim" class="mode-btn active" title="Prometheus SITL 仿真 (rosbridge WebSocket)">仿真模式</button>
<button id="btn-mode-real" class="mode-btn" title="P600 实机 WiFi 数传 (rosbridge WebSocket)">实机模式</button>
</div>
<input type="text" id="drone-url" value="ws://localhost:9090" placeholder="rosbridge 地址" />
<button id="btn-connect" class="btn btn-primary">连接无人机</button>
<span id="conn-mode-tag" class="conn-mode-tag">rosbridge</span>
</div>
</header>
<!-- 主内容区 -->
<div class="main-content">
<!-- 地图区域 -->
<div id="map" class="map-container"></div>
<!-- 右侧控制面板 -->
<aside class="control-panel">
<!-- 航点列表 -->
<div class="panel-section">
<div class="panel-header">
<span>航点列表</span>
<span id="wp-count">0 个航点</span>
</div>
<div id="waypoint-list" class="waypoint-list">
<div class="empty-hint">在地图上点击以添加航点</div>
</div>
<div class="wp-params">
<label>默认高度: <input type="number" id="default-alt" value="15" min="1" max="100" /></label>
<label>默认悬停: <input type="number" id="default-hold" value="0" min="0" max="60" /></label>
</div>
</div>
<!-- 任务操作 -->
<div class="panel-section">
<div class="panel-header">任务操作</div>
<div class="btn-group">
<button id="btn-upload" class="btn btn-primary wide" disabled>上传任务</button>
</div>
<div class="btn-group">
<button id="btn-start" class="btn btn-success wide" disabled>开始任务</button>
</div>
<div class="btn-group">
<button id="btn-pause" class="btn btn-warning" disabled>暂停</button>
<button id="btn-resume" class="btn btn-success" disabled>继续</button>
</div>
<div class="btn-group">
<button id="btn-rth" class="btn btn-danger" disabled>返航</button>
<button id="btn-land" class="btn btn-danger" disabled>降落</button>
</div>
<div class="btn-group">
<button id="btn-clear" class="btn btn-secondary wide">清除所有航点</button>
</div>
</div>
<!-- 实时数据 -->
<div class="panel-section">
<div class="panel-header">实时数据</div>
<div class="data-grid">
<div class="data-item">
<span class="data-label">纬度</span>
<span class="data-value" id="data-lat">--</span>
</div>
<div class="data-item">
<span class="data-label">经度</span>
<span class="data-value" id="data-lng">--</span>
</div>
<div class="data-item">
<span class="data-label">航向</span>
<span class="data-value" id="data-heading">--</span>
</div>
<div class="data-item">
<span class="data-label">当前航点</span>
<span class="data-value" id="data-wp">--</span>
</div>
</div>
</div>
<!-- 光斑检测 -->
<div class="panel-section">
<div class="panel-header">
<span>光斑检测</span>
<span id="flash-status" class="tag tag-secondary">未启用</span>
</div>
<div class="btn-group">
<button id="btn-flash-enable" class="btn btn-secondary wide" disabled>启用光斑检测</button>
</div>
<div class="data-grid">
<div class="data-item">
<span class="data-label">光斑位置</span>
<span class="data-value" id="flash-position">--</span>
</div>
<div class="data-item">
<span class="data-label">检测面积</span>
<span class="data-value" id="flash-area">--</span>
</div>
</div>
<div class="btn-group">
<button id="btn-avoidance-enable" class="btn btn-warning wide" disabled>启用避光斑</button>
<button id="btn-avoidance-disable" class="btn btn-secondary" disabled>禁用避光斑</button>
</div>
</div>
</aside>
</div>
<!-- 底部日志栏 -->
<footer class="log-bar">
<div class="log-header">
<span>操作日志</span>
<button id="btn-clear-log" class="btn-link">清空</button>
</div>
<div id="log-content" class="log-content"></div>
</footer>
<!-- JS 依赖 -->
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script src="/js/roslib.min.js"></script>
<script src="/js/map.js"></script>
<script src="/js/websocket.js"></script>
<script src="/js/flash_detector.js"></script>
<script src="/js/flash_avoidance.js"></script>
<script src="/js/ui.js"></script>
</body>
</html>

@ -0,0 +1,269 @@
/**
* Flash Avoidance Module - 避光斑决策模块
* 基于光斑检测结果执行垂直结合避光斑策略
*
* 避光斑策略:
* - 水平躲避: 根据光斑相对相机的左右位置反向水平移动
* - 垂直躲避: 根据光斑相对相机的上下位置反向垂直移动
*
* 触发条件:
* - 光斑被检测到且面积超过阈值
*/
const FlashAvoidanceModule = (() => {
// 配置参数
const config = {
// 避光斑参数
enabled: false, // 是否启用避光斑
avoidanceDistance: 3.0, // 避光斑移动距离 (米)
avoidanceHoldTime: 2000, // 避光斑后悬停时间 (毫秒)
minDetectionArea: 100, // 最小检测面积阈值
// 图像尺寸 (需要根据实际相机调整)
imageWidth: 640,
imageHeight: 480,
// 阈值
horizontalThreshold: 0.2, // 水平方向检测阈值 (-1 ~ 1)
verticalThreshold: 0.2, // 垂直方向检测阈值 (-1 ~ 1)
// 防抖
debounceCount: 3, // 需要连续检测N帧才触发避光斑
debounceCooldown: 5000, // 避光斑冷却时间 (毫秒)
};
// 状态
let state = {
isAvoiding: false, // 是否正在执行避光斑
debounceCounter: 0, // 防抖计数器
lastAvoidanceTime: 0, // 上次避光斑时间
detectionCount: 0, // 连续检测计数
};
// 回调函数
let onStatusUpdate = null;
let onAvoidanceStart = null;
let onAvoidanceEnd = null;
// 外部依赖 (由主模块注入)
let wsModule = null;
/**
* 初始化模块
* @param {Object} options - 配置选项
* - wsModule: WsModule 实例 (用于获取无人机位置)
* - onStatusUpdate: 状态更新回调
* - onAvoidanceStart: 避光斑开始回调
* - onAvoidanceEnd: 避光斑结束回调
*/
function init(options = {}) {
wsModule = options.wsModule || null;
onStatusUpdate = options.onStatusUpdate || null;
onAvoidanceStart = options.onAvoidanceStart || null;
onAvoidanceEnd = options.onAvoidanceEnd || null;
if (options.config) {
Object.assign(config, options.config);
}
console.log('[Flash Avoidance] 模块初始化完成');
console.log('[Flash Avoidance] 避光斑距离:', config.avoidanceDistance, 'm');
console.log('[Flash Avoidance] 最小检测面积:', config.minDetectionArea);
}
/**
* 更新配置
*/
function updateConfig(newConfig) {
Object.assign(config, newConfig);
}
/**
* 启用/禁用避光斑
*/
function setEnabled(enabled) {
config.enabled = enabled;
if (statusCallback) {
statusCallback({
type: 'info',
message: `避光斑模块 ${enabled ? '已启用' : '已禁用'}`
});
}
}
/**
* 状态回调
*/
let statusCallback = null;
function setStatusCallback(callback) {
statusCallback = callback;
}
/**
* 处理光斑检测数据
* @param {Object} detectionData - 检测数据 {cx, cy, area, sightX, sightY}
* @returns {Object|null} - 避光斑指令或null
*/
function processDetection(detectionData) {
if (!config.enabled) {
return null;
}
if (state.isAvoiding) {
return null; // 正在执行避光斑,忽略新检测
}
// 检查冷却时间
const now = Date.now();
if (now - state.lastAvoidanceTime < config.debounceCooldown) {
return null; // 冷却中
}
// 检查面积阈值
if (detectionData.area < config.minDetectionArea) {
state.detectionCount = 0;
return null;
}
// 防抖计数
state.detectionCount++;
if (state.detectionCount < config.debounceCount) {
return null; // 还未达到连续检测阈值
}
// 计算相对位置
const centerX = config.imageWidth / 2;
const centerY = config.imageHeight / 2;
const relativeX = (detectionData.cx - centerX) / centerX;
const relativeY = (detectionData.cy - centerY) / centerY;
// 判断是否需要避光斑
let needAvoidance = false;
let avoidX = 0, avoidY = 0, avoidZ = 0;
// 水平避光斑 (X方向)
if (Math.abs(relativeX) > config.horizontalThreshold) {
// 光斑在右侧,无人机向左移动
// 光斑在左侧,无人机向右移动
avoidX = -relativeX * config.avoidanceDistance;
needAvoidance = true;
}
// 垂直避光斑 (Z方向)
if (Math.abs(relativeY) > config.verticalThreshold) {
// 光斑在下方(cy > centerY),无人机向上移动
// 光斑在上方(cy < centerY),无人机向下移动
avoidZ = relativeY * config.avoidanceDistance;
needAvoidance = true;
}
if (needAvoidance) {
state.isAvoiding = true;
state.lastAvoidanceTime = now;
state.detectionCount = 0;
const avoidanceCmd = {
type: 'flash_avoidance',
avoidX: avoidX,
avoidY: avoidY,
avoidZ: avoidZ,
detectionData: {
cx: detectionData.cx,
cy: detectionData.cy,
area: detectionData.area,
relativeX: relativeX,
relativeY: relativeY
}
};
if (onAvoidanceStart) {
onAvoidanceStart(avoidanceCmd);
}
if (statusCallback) {
statusCallback({
type: 'warning',
message: `检测到光斑,执行避光斑! 偏移: X=${avoidX.toFixed(1)}m, Z=${avoidZ.toFixed(1)}m`
});
}
return avoidanceCmd;
}
return null;
}
/**
* 结束避光斑
*/
function endAvoidance() {
if (state.isAvoiding) {
state.isAvoiding = false;
if (onAvoidanceEnd) {
onAvoidanceEnd();
}
if (statusCallback) {
statusCallback({
type: 'info',
message: '避光斑完成,返回正常控制'
});
}
}
}
/**
* 检查是否正在执行避光斑
*/
function isAvoiding() {
return state.isAvoiding;
}
/**
* 计算避光斑目标位置
* @param {Object} currentPos - 当前无人机位置 {x, y, z}
* @param {Object} avoidanceCmd - 避光斑指令
* @returns {Object} - 目标位置 {x, y, z}
*/
function calculateAvoidanceTarget(currentPos, avoidanceCmd) {
return {
x: currentPos.x + avoidanceCmd.avoidX,
y: currentPos.y + avoidanceCmd.avoidY,
z: currentPos.z + avoidanceCmd.avoidZ
};
}
/**
* 获取当前状态
*/
function getState() {
return { ...state };
}
/**
* 重置状态
*/
function reset() {
state = {
isAvoiding: false,
debounceCounter: 0,
lastAvoidanceTime: 0,
detectionCount: 0
};
}
return {
init,
updateConfig,
setEnabled,
setStatusCallback,
processDetection,
endAvoidance,
isAvoiding,
calculateAvoidanceTarget,
getState,
reset
};
})();

@ -0,0 +1,174 @@
/**
* Flash Detector Module - 光斑检测订阅模块
* 通过 rosbridge_server 订阅光斑检测结果
*
* 订阅的话题:
* /flash_detector/flash_detected (std_msgs/Bool) -
* /flash_detector/detection (std_msgs/Float32MultiArray) - [cx, cy, area, sight_x, sight_y]
*/
const FlashDetectorModule = (() => {
let ros = null;
let flashDetectedSub = null;
let detectionSub = null;
// 回调函数
let onFlashDetected = null;
let onDetectionData = null;
// 检测状态
let flashDetected = false;
let detectionData = {
cx: 0,
cy: 0,
area: 0,
sightX: 0,
sightY: 0
};
// 图像尺寸 (默认 640x480需要根据实际相机调整)
let imageWidth = 640;
let imageHeight = 480;
/**
* 初始化模块
* @param {ROSLIB.Ros} rosInstance - ROS 连接实例
* @param {Object} callbacks - 回调函数对象
* - onFlashDetected: (detected: boolean) => void
* - onDetectionData: (data: DetectionData) => void
*/
function init(rosInstance, callbacks = {}) {
ros = rosInstance;
onFlashDetected = callbacks.onFlashDetected || null;
onDetectionData = callbacks.onDetectionData || null;
// 设置图像尺寸 (可选)
if (callbacks.imageWidth) imageWidth = callbacks.imageWidth;
if (callbacks.imageHeight) imageHeight = callbacks.imageHeight;
setupSubscriptions();
console.log('[Flash Detector] 模块初始化完成');
console.log('[Flash Detector] 订阅话题: /flash_detector/flash_detected');
console.log('[Flash Detector] 订阅话题: /flash_detector/detection');
}
/**
* 设置订阅
*/
function setupSubscriptions() {
// 订阅闪光检测标志
flashDetectedSub = new ROSLIB.Topic({
ros: ros,
name: '/flash_detector/flash_detected',
messageType: 'std_msgs/Bool'
});
flashDetectedSub.subscribe((msg) => {
flashDetected = msg.data;
if (onFlashDetected) {
onFlashDetected(msg.data);
}
});
// 订阅检测数据
detectionSub = new ROSLIB.Topic({
ros: ros,
name: '/flash_detector/detection',
messageType: 'std_msgs/Float32MultiArray'
});
detectionSub.subscribe((msg) => {
if (msg.data && msg.data.length >= 5) {
detectionData = {
cx: msg.data[0],
cy: msg.data[1],
area: msg.data[2],
sightX: msg.data[3],
sightY: msg.data[4]
};
if (onDetectionData) {
onDetectionData(detectionData);
}
}
});
}
/**
* 获取当前检测状态
*/
function isFlashDetected() {
return flashDetected;
}
/**
* 获取当前检测数据
*/
function getDetectionData() {
return { ...detectionData };
}
/**
* 计算相对位置 (相对于图像中心)
* @returns {Object} {x: -1~1 (负值=左侧), y: -1~1 (负值=上方)}
*/
function getRelativePosition() {
if (imageWidth === 0 || imageHeight === 0) {
return { x: 0, y: 0 };
}
const centerX = imageWidth / 2;
const centerY = imageHeight / 2;
return {
x: (detectionData.cx - centerX) / centerX, // -1 (左) ~ 1 (右)
y: (detectionData.cy - centerY) / centerY // -1 (上) ~ 1 (下)
};
}
/**
* 计算视线偏移角度 (弧度)
* @returns {Object} {x: radians, y: radians}
*/
function getSightAngles() {
return {
x: detectionData.sightX,
y: detectionData.sightY
};
}
/**
* 设置图像尺寸 (用于计算相对位置)
*/
function setImageSize(width, height) {
imageWidth = width;
imageHeight = height;
}
/**
* 关闭模块
*/
function shutdown() {
if (flashDetectedSub) {
flashDetectedSub.unsubscribe();
flashDetectedSub = null;
}
if (detectionSub) {
detectionSub.unsubscribe();
detectionSub = null;
}
console.log('[Flash Detector] 模块已关闭');
}
return {
init,
isFlashDetected,
getDetectionData,
getRelativePosition,
getSightAngles,
setImageSize,
shutdown
};
})();

@ -0,0 +1,202 @@
/**
* 地图模块 - 基于 Leaflet.js
* 负责: 地图初始化航点管理航线绘制无人机位置显示
*/
const MapModule = (() => {
let map = null;
let waypoints = []; // 航点数据数组
let markers = []; // 航点 Leaflet Marker 对象
let polyline = null; // 航线折线
let droneMarker = null; // 无人机位置标记
let trailLine = null; // 飞行轨迹
let trailCoords = []; // 轨迹坐标历史
const DEFAULT_LAT = 30.0;
const DEFAULT_LNG = 120.0;
const DEFAULT_ZOOM = 16;
function init() {
map = L.map('map', {
center: [DEFAULT_LAT, DEFAULT_LNG],
zoom: DEFAULT_ZOOM,
zoomControl: true
});
// OpenStreetMap 底图(免费,无需 Key
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '&copy; OpenStreetMap',
maxZoom: 19
}).addTo(map);
// 点击地图添加航点
map.on('click', onMapClick);
// 初始化航线(空折线)
polyline = L.polyline([], {
color: '#007aff',
weight: 2,
opacity: 0.7,
dashArray: '8, 6'
}).addTo(map);
// 初始化飞行轨迹
trailLine = L.polyline([], {
color: '#ff4d4f',
weight: 2,
opacity: 0.6
}).addTo(map);
// 创建无人机图标
const droneIcon = L.divIcon({
className: 'drone-icon',
html: '<div class="drone-icon-inner" id="drone-arrow"></div>',
iconSize: [24, 24],
iconAnchor: [12, 12]
});
droneMarker = L.marker([DEFAULT_LAT, DEFAULT_LNG], {
icon: droneIcon,
visible: false
}).addTo(map);
}
function onMapClick(e) {
addWaypoint(e.latlng.lat, e.latlng.lng);
}
function addWaypoint(lat, lng) {
const defaultAlt = parseInt(document.getElementById('default-alt').value) || 15;
const defaultHold = parseInt(document.getElementById('default-hold').value) || 0;
const index = waypoints.length + 1;
const wp = {
id: Date.now(),
lat: parseFloat(lat.toFixed(6)),
lng: parseFloat(lng.toFixed(6)),
alt: defaultAlt,
hold_time: defaultHold
};
waypoints.push(wp);
// 添加地图标记
const marker = L.marker([wp.lat, wp.lng], {
draggable: true
}).addTo(map);
marker.bindPopup(`<b>航点 ${index}</b><br>高度: ${wp.alt}m<br>悬停: ${wp.hold_time}s`);
// 拖拽更新航点坐标
marker.on('dragend', function () {
const pos = marker.getLatLng();
const wpIdx = markers.indexOf(marker);
if (wpIdx >= 0) {
waypoints[wpIdx].lat = parseFloat(pos.lat.toFixed(6));
waypoints[wpIdx].lng = parseFloat(pos.lng.toFixed(6));
marker.setPopupContent(`<b>航点 ${wpIdx + 1}</b><br>高度: ${waypoints[wpIdx].alt}m`);
updatePolyline();
UIModule.updateWaypointList();
}
});
markers.push(marker);
updatePolyline();
UIModule.updateWaypointList();
UIModule.updateButtons();
}
function removeWaypoint(index) {
if (index < 0 || index >= waypoints.length) return;
waypoints.splice(index, 1);
const marker = markers.splice(index, 1)[0];
map.removeLayer(marker);
// 重新编号弹窗
markers.forEach((m, i) => {
m.setPopupContent(`<b>航点 ${i + 1}</b><br>高度: ${waypoints[i].alt}m`);
});
updatePolyline();
UIModule.updateWaypointList();
UIModule.updateButtons();
}
function clearWaypoints() {
markers.forEach(m => map.removeLayer(m));
waypoints = [];
markers = [];
updatePolyline();
UIModule.updateWaypointList();
UIModule.updateButtons();
}
function updatePolyline() {
const coords = waypoints.map(wp => [wp.lat, wp.lng]);
polyline.setLatLngs(coords);
}
function updateDronePosition(lat, lng, heading) {
if (!droneMarker) return;
droneMarker.setLatLng([lat, lng]);
if (!droneMarker.visible) {
droneMarker.visible = true;
}
// 旋转无人机图标(航向)
const arrow = document.getElementById('drone-arrow');
if (arrow) {
arrow.style.transform = `rotate(${heading}deg)`;
}
// 记录轨迹
trailCoords.push([lat, lng]);
if (trailCoords.length > 500) trailCoords.shift();
trailLine.setLatLngs(trailCoords);
}
function centerOnDrone(lat, lng) {
map.setView([lat, lng], map.getZoom());
}
function panTo(lat, lng) {
map.panTo([lat, lng]);
}
function getWaypoints() {
return waypoints.map(wp => ({
lat: wp.lat,
lng: wp.lng,
alt: wp.alt,
hold_time: wp.hold_time
}));
}
function getWaypointCount() {
return waypoints.length;
}
function updateWaypointAlt(index, alt) {
if (index >= 0 && index < waypoints.length) {
waypoints[index].alt = alt;
markers[index].setPopupContent(
`<b>航点 ${index + 1}</b><br>高度: ${alt}m<br>悬停: ${waypoints[index].hold_time}s`
);
}
}
return {
init,
addWaypoint,
removeWaypoint,
clearWaypoints,
updateDronePosition,
centerOnDrone,
panTo,
getWaypoints,
getWaypointCount,
updateWaypointAlt,
DEFAULT_LAT,
DEFAULT_LNG
};
})();

File diff suppressed because one or more lines are too long

@ -0,0 +1,466 @@
/**
* UI 交互模块
* 负责: 按钮事件绑定状态管理航点列表渲染日志输出光斑检测与避光斑集成
*/
const UIModule = (() => {
// 应用状态
let droneConnected = false;
let missionUploaded = false;
let missionRunning = false;
let missionPaused = false;
let flashDetectionEnabled = false;
let flashAvoidanceEnabled = false;
let connectionMode = 'sim'; // 'sim' 仿真 | 'real' 实机
// 连接预设 (rosbridge WebSocket 地址)
const PRESETS = {
sim: { url: 'ws://localhost:9090', label: '仿真 rosbridge', desc: 'Prometheus SITL 仿真 (本地 rosbridge 端口 9090)' },
real: { url: 'ws://192.168.1.31:9090', label: '实机 rosbridge', desc: 'P600 实机 WiFi 数传 (rosbridge 192.168.1.31:9090)' }
};
function init() {
// 初始化地图
MapModule.init();
// 初始化 WebSocket
WsModule.init();
// 绑定按钮事件
document.getElementById('btn-connect').addEventListener('click', onConnect);
document.getElementById('btn-upload').addEventListener('click', onUpload);
document.getElementById('btn-start').addEventListener('click', onStart);
document.getElementById('btn-pause').addEventListener('click', onPause);
document.getElementById('btn-resume').addEventListener('click', onResume);
document.getElementById('btn-rth').addEventListener('click', onReturnHome);
document.getElementById('btn-land').addEventListener('click', onLand);
document.getElementById('btn-clear').addEventListener('click', onClear);
document.getElementById('btn-clear-log').addEventListener('click', onClearLog);
// 绑定光斑检测按钮
document.getElementById('btn-flash-enable').addEventListener('click', onEnableFlashDetection);
document.getElementById('btn-avoidance-enable').addEventListener('click', onEnableFlashAvoidance);
document.getElementById('btn-avoidance-disable').addEventListener('click', onDisableFlashAvoidance);
// 绑定连接模式切换
document.getElementById('btn-mode-sim').addEventListener('click', () => switchMode('sim'));
document.getElementById('btn-mode-real').addEventListener('click', () => switchMode('real'));
// 连接地址输入框变化时更新标签
document.getElementById('drone-url').addEventListener('input', onUrlInput);
updateButtons();
addLog('info', '系统就绪,当前模式: 仿真 (rosbridge)');
addLog('info', '提示: 浏览器通过 roslibjs 直接连接 rosbridge_server无需 MAVSDK 后端');
}
// ---------- 连接模式切换 ----------
function switchMode(mode) {
if (droneConnected) {
addLog('warning', '请先断开当前连接再切换模式');
return;
}
connectionMode = mode;
const preset = PRESETS[mode];
// 更新按钮状态
document.getElementById('btn-mode-sim').classList.toggle('active', mode === 'sim');
document.getElementById('btn-mode-real').classList.toggle('active', mode === 'real');
// 自动填入预设地址
document.getElementById('drone-url').value = preset.url;
document.getElementById('conn-mode-tag').textContent = preset.label;
addLog('info', `已切换到${preset.label}模式: ${preset.desc}`);
if (mode === 'sim') {
addLog('info', '仿真模式说明: 先启动 Prometheus SITL (roslaunch prometheus_gazebo sitl.launch),再启动 rosbridge (roslaunch rosbridge_server rosbridge_websocket.launch)');
} else {
addLog('info', '实机模式说明: 请确保电脑已连接 P600 的 WiFi 数传rosbridge 需在机载电脑上运行');
}
}
function onUrlInput() {
const url = document.getElementById('drone-url').value.trim();
const tag = document.getElementById('conn-mode-tag');
if (url.startsWith('ws://')) {
tag.textContent = 'rosbridge';
} else if (url.startsWith('wss://')) {
tag.textContent = 'rosbridge (SSL)';
} else {
tag.textContent = '未知';
}
}
// ---------- 按钮事件处理 ----------
function onConnect() {
const url = document.getElementById('drone-url').value.trim();
if (!url) {
addLog('error', '请输入 rosbridge 连接地址');
return;
}
if (!url.startsWith('ws://') && !url.startsWith('wss://')) {
addLog('error', '地址格式错误,应以 ws:// 开头 (例如 ws://localhost:9090)');
return;
}
WsModule.connectDrone(url);
}
function onUpload() {
const waypoints = MapModule.getWaypoints();
if (waypoints.length === 0) {
addLog('error', '请先在地图上添加航点');
return;
}
WsModule.uploadMission(waypoints);
}
function onStart() {
WsModule.startMission();
}
function onPause() {
WsModule.pauseMission();
}
function onResume() {
WsModule.resumeMission();
}
function onReturnHome() {
WsModule.returnHome();
}
function onLand() {
WsModule.land();
}
function onClear() {
MapModule.clearWaypoints();
missionUploaded = false;
updateButtons();
addLog('info', '已清除所有航点');
}
function onClearLog() {
document.getElementById('log-content').innerHTML = '';
}
// ---------- 光斑检测事件 ----------
function onEnableFlashDetection() {
if (!droneConnected) {
addLog('warning', '请先连接无人机');
return;
}
// 初始化光斑检测模块
if (typeof FlashDetectorModule !== 'undefined') {
FlashDetectorModule.init(WsModule.getRos(), {
onFlashDetected: (detected) => {
const statusEl = document.getElementById('flash-status');
if (detected) {
statusEl.className = 'tag tag-danger';
statusEl.textContent = '检测到光斑';
}
},
onDetectionData: (data) => {
// 更新光斑位置显示
document.getElementById('flash-position').textContent = `(${data.cx.toFixed(0)}, ${data.cy.toFixed(0)})`;
document.getElementById('flash-area').textContent = data.area.toFixed(0);
// 如果启用了避光斑,处理检测数据
if (flashAvoidanceEnabled && typeof FlashAvoidanceModule !== 'undefined') {
const avoidanceCmd = FlashAvoidanceModule.processDetection(data);
if (avoidanceCmd) {
// 计算目标位置并执行避光斑
executeFlashAvoidance(avoidanceCmd);
}
}
}
});
flashDetectionEnabled = true;
document.getElementById('btn-flash-enable').classList.add('hidden');
document.getElementById('flash-status').className = 'tag tag-success';
document.getElementById('flash-status').textContent = '已启用';
document.getElementById('btn-avoidance-enable').disabled = false;
addLog('success', '光斑检测已启用');
} else {
addLog('error', '光斑检测模块未加载');
}
}
function onEnableFlashAvoidance() {
if (!flashDetectionEnabled) {
addLog('warning', '请先启用光斑检测');
return;
}
if (typeof FlashAvoidanceModule !== 'undefined') {
FlashAvoidanceModule.init({
wsModule: WsModule,
onStatusUpdate: (data) => addLog(data.type, data.message)
});
FlashAvoidanceModule.setStatusCallback((data) => addLog(data.type, data.message));
FlashAvoidanceModule.setEnabled(true);
flashAvoidanceEnabled = true;
document.getElementById('btn-avoidance-enable').classList.add('hidden');
document.getElementById('btn-avoidance-disable').disabled = false;
addLog('success', '避光斑已启用');
}
}
function onDisableFlashAvoidance() {
if (typeof FlashAvoidanceModule !== 'undefined') {
FlashAvoidanceModule.setEnabled(false);
flashAvoidanceEnabled = false;
document.getElementById('btn-avoidance-enable').classList.remove('hidden');
document.getElementById('btn-avoidance-disable').disabled = true;
addLog('info', '避光斑已禁用');
}
}
function executeFlashAvoidance(avoidanceCmd) {
// 获取当前无人机位置
const currentPos = WsModule.getLocalPosition ? WsModule.getLocalPosition() : { x: 0, y: 0, z: 0 };
// 计算避光斑目标位置
const targetPos = {
x: currentPos.x + avoidanceCmd.avoidX,
y: currentPos.y + avoidanceCmd.avoidY,
z: currentPos.z + avoidanceCmd.avoidZ
};
// 发布新的位置设定值
WsModule.publishSetpoint(targetPos.x, targetPos.y, targetPos.z);
addLog('warning', `执行避光斑: 移动到 (${targetPos.x.toFixed(1)}, ${targetPos.y.toFixed(1)}, ${targetPos.z.toFixed(1)})`);
// 2秒后返回原位置或继续任务
setTimeout(() => {
FlashAvoidanceModule.endAvoidance();
addLog('info', '避光斑完成,返回正常控制');
}, 2000);
}
// ---------- 状态回调(由 WsModule 触发) ----------
function onTelemetry(data) {
if (data.type === 'telemetry') {
// 更新顶栏数据
document.getElementById('battery').textContent = data.battery.toFixed(0) + '%';
document.getElementById('speed').textContent = data.speed.toFixed(1) + ' m/s';
document.getElementById('altitude').textContent = data.alt.toFixed(1) + ' m';
document.getElementById('gps-status').textContent = data.gps_status;
document.getElementById('flight-mode').textContent = data.flight_mode;
// 更新右侧数据面板
document.getElementById('data-lat').textContent = data.lat.toFixed(6);
document.getElementById('data-lng').textContent = data.lng.toFixed(6);
document.getElementById('data-heading').textContent = data.heading.toFixed(0) + '°';
document.getElementById('data-wp').textContent = data.current_wp;
// 更新无人机位置 — 只要坐标有效就更新
if (droneConnected && (data.lat !== 0 || data.alt > 0.1)) {
MapModule.updateDronePosition(data.lat, data.lng, data.heading);
}
}
if (data.type === 'mission_progress') {
document.getElementById('data-wp').textContent =
data.current + ' / ' + data.total;
}
}
function onStatus(data) {
addLog(data.type, data.message);
// 根据状态消息更新应用状态
const msg = data.message;
if (msg.includes('连接成功') || msg.includes('已连接')) {
droneConnected = true;
document.getElementById('conn-status').className = 'tag tag-success';
document.getElementById('conn-status').textContent = '已连接';
document.getElementById('btn-connect').textContent = '已连接';
document.getElementById('btn-connect').disabled = true;
document.getElementById('btn-flash-enable').disabled = false;
updateButtons();
}
if (msg.includes('上传成功')) {
missionUploaded = true;
updateButtons();
}
if (msg.includes('任务已开始')) {
missionRunning = true;
missionPaused = false;
updateButtons();
}
if (msg.includes('已暂停')) {
missionRunning = false;
missionPaused = true;
updateButtons();
}
if (msg.includes('已继续')) {
missionRunning = true;
missionPaused = false;
updateButtons();
}
if (msg.includes('返航') || msg.includes('降落') || msg.includes('失败')) {
if (msg.includes('返航') || msg.includes('降落')) {
missionRunning = false;
missionPaused = false;
updateButtons();
}
}
if (msg.includes('任务完成')) {
missionRunning = false;
missionPaused = false;
missionUploaded = false;
updateButtons();
}
}
function onDroneDisconnected() {
droneConnected = false;
missionUploaded = false;
missionRunning = false;
missionPaused = false;
flashDetectionEnabled = false;
flashAvoidanceEnabled = false;
document.getElementById('conn-status').className = 'tag tag-danger';
document.getElementById('conn-status').textContent = '未连接';
document.getElementById('btn-connect').textContent = '连接无人机';
document.getElementById('btn-connect').disabled = false;
document.getElementById('btn-flash-enable').disabled = true;
document.getElementById('btn-flash-enable').classList.remove('hidden');
document.getElementById('btn-avoidance-enable').disabled = true;
document.getElementById('btn-avoidance-enable').classList.remove('hidden');
document.getElementById('btn-avoidance-disable').disabled = true;
document.getElementById('flash-status').className = 'tag tag-secondary';
document.getElementById('flash-status').textContent = '未启用';
document.getElementById('flash-position').textContent = '--';
document.getElementById('flash-area').textContent = '--';
// 关闭光斑检测模块
if (typeof FlashDetectorModule !== 'undefined') {
FlashDetectorModule.shutdown();
}
if (typeof FlashAvoidanceModule !== 'undefined') {
FlashAvoidanceModule.reset();
}
updateButtons();
addLog('error', '无人机连接断开');
}
// ---------- 按钮状态管理 ----------
function updateButtons() {
const wpCount = MapModule.getWaypointCount();
setBtn('btn-upload', droneConnected && wpCount > 0 && !missionRunning && !missionPaused);
setBtn('btn-start', droneConnected && missionUploaded && !missionRunning && !missionPaused);
setBtn('btn-pause', droneConnected && missionRunning);
setBtn('btn-resume', droneConnected && missionPaused);
setBtn('btn-rth', droneConnected);
setBtn('btn-land', droneConnected);
}
function setBtn(id, enabled) {
document.getElementById(id).disabled = !enabled;
}
// ---------- 航点列表渲染 ----------
function updateWaypointList() {
const container = document.getElementById('waypoint-list');
const waypoints = MapModule.getWaypoints();
document.getElementById('wp-count').textContent = waypoints.length + ' 个航点';
if (waypoints.length === 0) {
container.innerHTML = '<div class="empty-hint">在地图上点击以添加航点</div>';
return;
}
container.innerHTML = waypoints.map((wp, i) => `
<div class="wp-item" data-index="${i}">
<span class="wp-index">${i + 1}</span>
<div class="wp-info">
<div class="wp-coord">${wp.lat}, ${wp.lng}</div>
<div class="wp-alt">${wp.alt}m | 悬停 ${wp.hold_time}s</div>
</div>
<button class="wp-delete" data-index="${i}" title="删除">&times;</button>
</div>
`).join('');
// 绑定点击定位事件
container.querySelectorAll('.wp-item').forEach(item => {
item.addEventListener('click', (e) => {
if (e.target.classList.contains('wp-delete')) return;
const idx = parseInt(item.dataset.index);
const wps = MapModule.getWaypoints();
if (wps[idx]) {
MapModule.panTo(wps[idx].lat, wps[idx].lng);
}
});
});
// 绑定删除事件
container.querySelectorAll('.wp-delete').forEach(btn => {
btn.addEventListener('click', () => {
MapModule.removeWaypoint(parseInt(btn.dataset.index));
});
});
}
// ---------- 日志输出 ----------
function addLog(type, message) {
const container = document.getElementById('log-content');
const now = new Date();
const time = now.toTimeString().split(' ')[0];
const entry = document.createElement('div');
entry.className = 'log-entry ' + type;
entry.innerHTML = `<span class="time">[${time}]</span>${message}`;
container.appendChild(entry);
// 自动滚动到底部
container.scrollTop = container.scrollHeight;
// 限制日志条数
while (container.children.length > 200) {
container.removeChild(container.firstChild);
}
}
return {
init,
onTelemetry,
onStatus,
onDroneDisconnected,
updateWaypointList,
updateButtons
};
})();
// 页面加载完成后初始化
document.addEventListener('DOMContentLoaded', () => {
UIModule.init();
});

@ -0,0 +1,696 @@
/**
* MAVROS 通信模块 - 基于 roslibjs
* 直接通过 MAVROS 话题和服务控制无人机
*
* 架构: 浏览器 roslibjs rosbridge_server ROS话题 MAVROS MAVLink PX4
*
* 使用的话题:
* 订阅: /uav1/mavros/state (mavros_msgs/State)
* 订阅: /uav1/mavros/local_position/pose (geometry_msgs/PoseStamped)
* 订阅: /uav1/mavros/global_position/raw/fix (sensor_msgs/NavSatFix)
* 订阅: /uav1/mavros/battery (sensor_msgs/BatteryState)
* 发布: /uav1/mavros/setpoint_position/local (geometry_msgs/PoseStamped)
* 服务: /uav1/mavros/cmd/arming (mavros_msgs/CommandBool)
* 服务: /uav1/mavros/set_mode (mavros_msgs/SetMode)
*/
const WsModule = (() => {
let ros = null;
let rosConnected = false;
let droneConnected = false;
let fcuReady = false; // true when MAVROS reports valid mode (FCU connection established)
// ========== 配置: UAV 命名空间 ==========
// 仿真环境默认: '/uav1' 实机可能: '' 或 '/uav1'
// 如果话题不对,改这里
let uavNS = '/uav1';
function topicName(name) { return uavNS + name; }
function serviceName(name) { return uavNS + name; }
// ROS handles
let stateSub = null;
let localPosSub = null;
let gpsSub = null;
let batterySub = null;
let setpointPub = null;
// Telemetry state
let telemetry = {
lat: 0, lng: 0, alt: 0,
speed: 0, battery: 100, heading: 0,
flightMode: 'UNKNOWN', gpsStatus: 'No Fix',
armed: false,
localPos: { x: 0, y: 0, z: 0 } // ENU: x=East, y=North, z=Up
};
// Origin for lat/lng <-> ENU conversion
let origin = { lat: null, lng: null };
let originSet = false;
let originFromGps = false; // true if origin was set from real GPS
// Navigation state
let rawWaypoints = []; // Original lat/lng waypoints
let navWaypoints = []; // Converted ENU waypoints
let currentWPIndex = 0;
let navActive = false;
let navPaused = false;
let publishTimer = null;
let wpCheckTimer = null;
let telemetryTimer = null; // Throttled UI update timer
const WP_REACH_DIST = 2.0; // meters
const PUBLISH_INTERVAL = 100; // ms (10 Hz, OFFBOARD needs >= 2Hz)
// ---- Coordinate conversion ----
function latLngToENU(lat, lng, alt) {
if (!originSet) return { x: 0, y: 0, z: alt };
const latRad = origin.lat * Math.PI / 180;
const x = (lng - origin.lng) * Math.cos(latRad) * 111319.488; // East
const y = (lat - origin.lat) * 111319.488; // North
return { x, y, z: alt }; // Up
}
function enuToLatLng(x, y) {
if (!originSet) return { lat: 0, lng: 0 };
const latRad = origin.lat * Math.PI / 180;
const lat = origin.lat + y / 111319.488;
const lng = origin.lng + x / (111319.488 * Math.cos(latRad));
return { lat, lng };
}
// Quaternion to yaw (degrees, ENU: 0=East, CCW+)
function quatToYawDeg(qx, qy, qz, qw) {
const siny = 2 * (qw * qz + qx * qy);
const cosy = 1 - 2 * (qy * qy + qz * qz);
let yaw = Math.atan2(siny, cosy) * 180 / Math.PI;
// Convert to compass heading: 0=North, CW+
return (90 - yaw + 360) % 360;
}
// ---- Init & Connection ----
function init() {}
function isConnected() { return rosConnected; }
function connectDrone(url) {
try {
if (typeof ROSLIB === 'undefined') {
UIModule.onStatus({ type: 'error', message: 'roslibjs 库未加载' });
return;
}
if (ros) {
try { ros.close(); } catch (e) { /* ignore */ }
}
UIModule.onStatus({ type: 'info', message: `正在连接 rosbridge: ${url} ...` });
ros = new ROSLIB.Ros({ url: url });
ros.on('connection', () => {
rosConnected = true;
UIModule.onStatus({ type: 'info', message: 'rosbridge 已连接,正在检测 MAVROS 话题...' });
setupSubscriptions();
});
ros.on('error', (error) => {
UIModule.onStatus({ type: 'error', message: `rosbridge 连接错误: ${error || '未知'}` });
});
ros.on('close', () => {
const wasConnected = rosConnected;
rosConnected = false;
droneConnected = false;
stopAll();
if (wasConnected) {
UIModule.onDroneDisconnected();
}
});
} catch (e) {
UIModule.onStatus({ type: 'error', message: `连接失败: ${e.message || e}` });
}
}
// ---- Topic subscriptions ----
function setupSubscriptions() {
// Try to detect which namespace has MAVROS
trySubscribesWithFallback();
}
// Set a default origin for coordinate conversion (no GPS needed)
function setDefaultOrigin() {
if (originSet) return;
// Use map default center as origin - simulation doesn't need real GPS
origin.lat = MapModule.DEFAULT_LAT || 30.0;
origin.lng = MapModule.DEFAULT_LNG || 120.0;
originSet = true;
originFromGps = false;
UIModule.onStatus({ type: 'info', message: `仿真模式: 使用默认坐标原点 (${origin.lat}, ${origin.lng})无需GPS` });
}
function trySubscribesWithFallback() {
let gotState = false;
const tryNS = uavNS;
// Subscribe to MAVROS state
stateSub = new ROSLIB.Topic({
ros: ros,
name: topicName('/mavros/state'),
messageType: 'mavros_msgs/State'
});
const stateTimeout = setTimeout(() => {
if (!gotState) {
// Try without namespace
if (tryNS !== '') {
uavNS = '';
UIModule.onStatus({ type: 'warning', message: `未收到 ${tryNS}/mavros/state尝试无命名空间...` });
trySubscribesWithFallback();
} else {
UIModule.onStatus({ type: 'error', message: '未检测到 MAVROS 话题,请确认仿真/实机已启动' });
}
}
}, 5000);
stateSub.subscribe((msg) => {
clearTimeout(stateTimeout);
gotState = true;
telemetry.armed = msg.armed || false;
telemetry.flightMode = msg.mode || 'UNKNOWN';
// Check if FCU is truly connected (has valid mode)
const modeValid = msg.connected && msg.mode && msg.mode.length > 0;
if (!droneConnected) {
droneConnected = true;
if (modeValid) {
fcuReady = true;
UIModule.onStatus({ type: 'success', message: `无人机已连接 (模式: ${msg.mode}, ${msg.armed ? '已解锁' : '未解锁'})` });
} else {
UIModule.onStatus({ type: 'warning', message: `MAVROS 已连接,但飞控未就绪 (mode=空)。等待 PX4 初始化...` });
}
setDefaultOrigin();
}
// Detect when FCU becomes ready
if (!fcuReady && modeValid) {
fcuReady = true;
UIModule.onStatus({ type: 'success', message: `飞控已就绪! 当前模式: ${msg.mode}, 状态: ${msg.armed ? '已解锁' : '未解锁'}` });
}
});
// Local position (ENU: x=East, y=North, z=Up)
localPosSub = new ROSLIB.Topic({
ros: ros,
name: topicName('/mavros/local_position/pose'),
messageType: 'geometry_msgs/PoseStamped'
});
localPosSub.subscribe((msg) => {
if (msg.pose && msg.pose.position) {
telemetry.localPos = {
x: msg.pose.position.x, // East
y: msg.pose.position.y, // North
z: msg.pose.position.z // Up
};
}
if (msg.pose && msg.pose.orientation) {
const o = msg.pose.orientation;
telemetry.heading = quatToYawDeg(o.x, o.y, o.z, o.w);
}
});
// GPS (for lat/lng display and origin)
gpsSub = new ROSLIB.Topic({
ros: ros,
name: topicName('/mavros/global_position/raw/fix'),
messageType: 'sensor_msgs/NavSatFix'
});
gpsSub.subscribe((msg) => {
telemetry.lat = msg.latitude || 0;
telemetry.lng = msg.longitude || 0;
if (msg.status) {
telemetry.gpsStatus = msg.status.status >= 0 ? '3D Fix' : 'No Fix';
}
// Update origin from real GPS (overrides default origin)
if (msg.latitude !== 0 && Math.abs(msg.latitude) > 1) {
if (!originFromGps) {
origin.lat = msg.latitude;
origin.lng = msg.longitude;
originSet = true;
originFromGps = true;
UIModule.onStatus({ type: 'info', message: `GPS 坐标已更新: ${origin.lat.toFixed(6)}, ${origin.lng.toFixed(6)}` });
MapModule.centerOnDrone(msg.latitude, msg.longitude);
}
}
});
// Battery
batterySub = new ROSLIB.Topic({
ros: ros,
name: topicName('/mavros/battery'),
messageType: 'sensor_msgs/BatteryState'
});
batterySub.subscribe((msg) => {
telemetry.battery = (msg.percentage != null) ? msg.percentage * 100 : 100;
});
// Setpoint publisher — PoseStamped is the standard MAVROS position control interface
setpointPub = new ROSLIB.Topic({
ros: ros,
name: topicName('/mavros/setpoint_position/local'),
messageType: 'geometry_msgs/PoseStamped'
});
// Start throttled telemetry loop (5Hz, decoupled from subscription rate)
startTelemetryLoop();
}
function pushTelemetry() {
let displayLat = telemetry.lat;
let displayLng = telemetry.lng;
if ((!displayLat || displayLat === 0) && originSet) {
const ll = enuToLatLng(telemetry.localPos.x, telemetry.localPos.y);
displayLat = ll.lat;
displayLng = ll.lng;
}
UIModule.onTelemetry({
type: 'telemetry',
lat: displayLat,
lng: displayLng,
alt: telemetry.localPos.z,
speed: telemetry.speed,
battery: telemetry.battery,
heading: telemetry.heading,
flight_mode: telemetry.flightMode,
gps_status: telemetry.gpsStatus,
current_wp: (currentWPIndex + 1) + '/' + navWaypoints.length
});
}
function startTelemetryLoop() {
if (telemetryTimer) clearInterval(telemetryTimer);
pushTelemetry();
telemetryTimer = setInterval(pushTelemetry, 200); // 5Hz UI update
}
function stopTelemetryLoop() {
if (telemetryTimer) { clearInterval(telemetryTimer); telemetryTimer = null; }
}
// ---- Setpoint publishing ----
let spSeq = 0;
function publishSetpoint(east, north, up) {
if (!setpointPub || !rosConnected) return;
const msg = new ROSLIB.Message({
header: {
seq: spSeq++,
stamp: { secs: Math.floor(Date.now() / 1000), nsecs: 0 },
frame_id: 'map'
},
pose: {
position: { x: east, y: north, z: up },
orientation: { x: 0, y: 0, z: 0, w: 1 }
}
});
setpointPub.publish(msg);
}
function startPublishLoop(east, north, up) {
stopPublishing();
publishSetpoint(east, north, up);
publishTimer = setInterval(() => {
publishSetpoint(east, north, up);
}, PUBLISH_INTERVAL);
}
function stopPublishing() {
if (publishTimer) { clearInterval(publishTimer); publishTimer = null; }
if (wpCheckTimer) { clearInterval(wpCheckTimer); wpCheckTimer = null; }
}
function stopAll() {
stopPublishing();
stopTelemetryLoop();
}
// ---- ROS Service calls ----
// Simple one-shot versions for arm/disarm/land buttons
// ---- Mission operations ----
function uploadMission(waypoints) {
if (waypoints.length === 0) {
UIModule.onStatus({ type: 'error', message: '航点列表为空' });
return;
}
// Store raw waypoints
rawWaypoints = waypoints;
currentWPIndex = 0;
// Convert to ENU (origin should always be set by now)
if (originSet) {
convertWaypoints();
UIModule.onStatus({ type: 'success', message: `任务上传成功,共 ${navWaypoints.length} 个航点` });
} else {
// Fallback (shouldn't happen, but just in case)
UIModule.onStatus({ type: 'success', message: `已暂存 ${waypoints.length} 个航点` });
}
}
function convertWaypoints() {
if (!originSet || !rawWaypoints || rawWaypoints.length === 0) return false;
navWaypoints = rawWaypoints.map(wp => {
const enu = latLngToENU(wp.lat, wp.lng, wp.alt);
return { ...enu, hold_time: wp.hold_time || 0 };
});
return true;
}
function startMission() {
if (!rosConnected || !droneConnected) {
UIModule.onStatus({ type: 'error', message: '未连接无人机' });
return;
}
if (!fcuReady) {
UIModule.onStatus({ type: 'error', message: '飞控未就绪 (MAVROS 模式为空)。请等待 PX4 完全启动后重试。也可尝试在终端执行: rosservice call ' + serviceName('/mavros/set_mode') + ' "{base_mode: 0, custom_mode: \'OFFBOARD\'}" 验证模式切换是否正常' });
return;
}
if (rawWaypoints.length === 0) {
UIModule.onStatus({ type: 'error', message: '请先上传任务' });
return;
}
// Convert waypoints
if (navWaypoints.length === 0 && rawWaypoints.length > 0) {
if (!originSet) setDefaultOrigin();
convertWaypoints();
}
if (navWaypoints.length === 0) {
UIModule.onStatus({ type: 'error', message: '航点转换失败,请重新上传任务' });
return;
}
// Step 1: Start sending takeoff setpoints at target altitude
// PX4 requires setpoints BEFORE switching OFFBOARD, and altitude must be positive
const firstWP = navWaypoints[0];
const startX = telemetry.localPos.x || 0;
const startY = telemetry.localPos.y || 0;
const takeoffAlt = firstWP.z;
startPublishLoop(startX, startY, takeoffAlt);
UIModule.onStatus({ type: 'info', message: '正在发送位置设定值 (10Hz)...' });
// Step 2: Wait for setpoints to flow, then switch OFFBOARD
setTimeout(() => {
callSetModeWithRetry('OFFBOARD', 3, (ok) => {
if (!ok) {
stopPublishing();
UIModule.onStatus({ type: 'error', message: 'OFFBOARD 模式切换失败,任务中止。请在终端验证: rosservice call ' + serviceName('/mavros/set_mode') + ' "{base_mode: 0, custom_mode: \'OFFBOARD\'}"' });
return;
}
// Step 3: Arm
setTimeout(() => {
callArmingWithRetry(true, 3, (ok) => {
if (!ok) {
stopPublishing();
UIModule.onStatus({ type: 'error', message: '电机解锁失败,任务中止。请检查: 1) 传感器是否校准 2) GPS是否定位 3) 安全检查是否通过' });
return;
}
// Step 4: Wait for takeoff, then navigate
setTimeout(() => {
UIModule.onStatus({ type: 'info', message: '正在起飞...' });
// Check if drone reached takeoff altitude
let takeoffDone = false;
const takeoffCheck = setInterval(() => {
const curZ = telemetry.localPos.z || 0;
if (curZ > takeoffAlt - 1.0 && curZ > 0.5) {
clearInterval(takeoffCheck);
takeoffDone = true;
navActive = true;
navPaused = false;
UIModule.onStatus({ type: 'success', message: '起飞完成,开始巡航' });
navigateToWaypoint(0);
}
}, 500);
// Fallback: start navigation after 15s regardless
setTimeout(() => {
clearInterval(takeoffCheck);
if (!takeoffDone) {
navActive = true;
navPaused = false;
UIModule.onStatus({ type: 'info', message: '任务已开始执行' });
navigateToWaypoint(0);
}
}, 15000);
}, 1000);
});
}, 500);
});
}, 3000);
}
// Retry wrappers for service calls
function callSetModeWithRetry(mode, retries, callback) {
UIModule.onStatus({ type: 'info', message: `正在切换 ${mode} 模式...` });
const service = new ROSLIB.Service({
ros: ros,
name: serviceName('/mavros/set_mode'),
serviceType: 'mavros_msgs/SetMode'
});
service.callService(
new ROSLIB.ServiceRequest({ base_mode: 0, custom_mode: mode }),
(result) => {
if (result && result.mode_sent) {
UIModule.onStatus({ type: 'success', message: `模式已切换: ${mode}` });
callback(true);
} else if (retries > 0) {
UIModule.onStatus({ type: 'warning', message: `模式切换未成功,剩余重试 ${retries} 次...` });
setTimeout(() => callSetModeWithRetry(mode, retries - 1, callback), 2000);
} else {
UIModule.onStatus({ type: 'error', message: `模式切换失败: ${JSON.stringify(result)}` });
callback(false);
}
},
(error) => {
if (retries > 0) {
UIModule.onStatus({ type: 'warning', message: `模式切换服务错误,重试中...` });
setTimeout(() => callSetModeWithRetry(mode, retries - 1, callback), 2000);
} else {
UIModule.onStatus({ type: 'error', message: `模式切换服务失败: ${error || '不可用'}` });
callback(false);
}
}
);
}
function callArmingWithRetry(arm, retries, callback) {
UIModule.onStatus({ type: 'info', message: arm ? '正在解锁电机...' : '正在上锁电机...' });
const service = new ROSLIB.Service({
ros: ros,
name: serviceName('/mavros/cmd/arming'),
serviceType: 'mavros_msgs/CommandBool'
});
service.callService(
new ROSLIB.ServiceRequest({ value: arm }),
(result) => {
if (result && result.success) {
UIModule.onStatus({ type: 'success', message: arm ? '电机已解锁' : '电机已上锁' });
callback(true);
} else if (retries > 0) {
UIModule.onStatus({ type: 'warning', message: `${arm ? '解锁' : '上锁'}未成功 (result=${result.result}),剩余重试 ${retries} 次...` });
setTimeout(() => callArmingWithRetry(arm, retries - 1, callback), 2000);
} else {
UIModule.onStatus({ type: 'error', message: `${arm ? '解锁' : '上锁'}失败: result=${result ? result.result : 'N/A'}` });
callback(false);
}
},
(error) => {
if (retries > 0) {
UIModule.onStatus({ type: 'warning', message: `${arm ? '解锁' : '上锁'}服务错误,重试中...` });
setTimeout(() => callArmingWithRetry(arm, retries - 1, callback), 2000);
} else {
UIModule.onStatus({ type: 'error', message: `${arm ? '解锁' : '上锁'}服务失败` });
callback(false);
}
}
);
}
// Simple one-shot mode switch (no retry, used by returnHome/land)
function callSetMode(mode) {
callSetModeWithRetry(mode, 1, () => {});
}
function navigateToWaypoint(index) {
if (!navActive || navPaused) return;
if (index >= navWaypoints.length) {
UIModule.onStatus({ type: 'success', message: '所有航点已到达,任务完成' });
const p = telemetry.localPos;
startPublishLoop(p.x, p.y, p.z);
navActive = false;
return;
}
currentWPIndex = index;
const wp = navWaypoints[index];
UIModule.onStatus({ type: 'info', message: `飞往航点 ${index + 1}/${navWaypoints.length} (${wp.x.toFixed(1)}, ${wp.y.toFixed(1)}, ${wp.z.toFixed(1)}m)` });
startPublishLoop(wp.x, wp.y, wp.z);
checkWaypointReached(index);
}
function checkWaypointReached(index) {
if (wpCheckTimer) clearInterval(wpCheckTimer);
const wpTimeout = setTimeout(() => {
// Fallback: if waypoint not reached in 30s, advance anyway
if (navActive && !navPaused) {
UIModule.onStatus({ type: 'warning', message: `航点 ${index + 1} 到达超时,跳至下一航点` });
navigateToWaypoint(index + 1);
}
}, 30000);
wpCheckTimer = setInterval(() => {
if (!navActive || navPaused) {
clearInterval(wpCheckTimer);
clearTimeout(wpTimeout);
return;
}
const wp = navWaypoints[index];
if (!wp) { clearTimeout(wpTimeout); return; }
const p = telemetry.localPos;
const dx = p.x - wp.x;
const dy = p.y - wp.y;
const dz = p.z - wp.z;
const dist = Math.sqrt(dx * dx + dy * dy + dz * dz);
if (dist < WP_REACH_DIST) {
clearInterval(wpCheckTimer);
clearTimeout(wpTimeout);
wpCheckTimer = null;
UIModule.onTelemetry({
type: 'mission_progress',
current: index + 1,
total: navWaypoints.length
});
const holdTime = wp.hold_time || 0;
if (holdTime > 0) {
UIModule.onStatus({ type: 'info', message: `航点 ${index + 1} 已到达,悬停 ${holdTime}` });
setTimeout(() => {
if (navActive && !navPaused) navigateToWaypoint(index + 1);
}, holdTime * 1000);
} else {
navigateToWaypoint(index + 1);
}
}
}, 500);
}
function pauseMission() {
if (!navActive || navPaused) return;
navPaused = true;
if (wpCheckTimer) { clearInterval(wpCheckTimer); wpCheckTimer = null; }
const p = telemetry.localPos;
startPublishLoop(p.x, p.y, p.z);
UIModule.onStatus({ type: 'info', message: '任务已暂停(悬停中)' });
}
function resumeMission() {
if (!navActive || !navPaused) return;
navPaused = false;
navigateToWaypoint(currentWPIndex);
UIModule.onStatus({ type: 'info', message: '任务已继续' });
}
function returnHome() {
stopPublishing();
navActive = false;
navPaused = false;
UIModule.onStatus({ type: 'warning', message: '正在返航...' });
// Fly to origin at current altitude
startPublishLoop(0, 0, telemetry.localPos.z);
const homeCheck = setInterval(() => {
const p = telemetry.localPos;
const dist = Math.sqrt(p.x * p.x + p.y * p.y);
if (dist < WP_REACH_DIST) {
clearInterval(homeCheck);
// Switch to AUTO.LAND for safe landing
callSetMode('AUTO.LAND');
setTimeout(() => stopPublishing(), 3000);
UIModule.onStatus({ type: 'info', message: '已到达起飞点上方,正在降落...' });
}
}, 500);
}
function land() {
stopPublishing();
navActive = false;
navPaused = false;
// Use PX4 AUTO.LAND mode (safest)
callSetMode('AUTO.LAND');
UIModule.onStatus({ type: 'warning', message: '正在降落 (AUTO.LAND)...' });
}
function arm() {
callArmingWithRetry(true, 2, () => {});
}
function disarm() {
callArmingWithRetry(false, 2, () => {});
}
// ---- Public getters for external modules ----
function getRos() {
return ros;
}
function getLocalPosition() {
return { ...telemetry.localPos };
}
return {
init,
isConnected,
connectDrone,
uploadMission,
startMission,
pauseMission,
resumeMission,
returnHome,
land,
arm,
disarm,
getRos,
getLocalPosition,
publishSetpoint
};
})();

@ -0,0 +1,39 @@
"""
Flask 静态文件服务器 - 托管前端页面
浏览器通过 roslibjs 直接连接 rosbridge_server无需 Python 后端处理无人机逻辑
"""
import os
from flask import Flask, send_from_directory
# 项目根目录server 的上级目录)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
app = Flask(__name__, static_folder=BASE_DIR)
@app.route("/")
def index():
return send_from_directory(BASE_DIR, "index.html")
@app.route("/css/<path:filename>")
def css_files(filename):
return send_from_directory(os.path.join(BASE_DIR, "css"), filename)
@app.route("/js/<path:filename>")
def js_files(filename):
return send_from_directory(os.path.join(BASE_DIR, "js"), filename)
if __name__ == "__main__":
print("=" * 50)
print(" P600 无人机定点巡航控制系统")
print(" 打开浏览器访问: http://localhost:5000")
print()
print(" 架构: 浏览器 ──roslibjs──► rosbridge_server ──ROS──► PX4")
print(" rosbridge 地址默认: ws://localhost:9090 (仿真)")
print(" ws://192.168.1.31:9090 (实机)")
print("=" * 50)
app.run(host="0.0.0.0", port=5000, debug=False)

@ -0,0 +1,7 @@
# 此文件已弃用 - 新架构通过 roslibjs + rosbridge_server 直接在浏览器端控制无人机
# 无需 Python 后端处理无人机逻辑
#
# 新架构:
# 浏览器 (roslibjs) ──WebSocket──► rosbridge_server ──ROS话题──► Prometheus/MAVROS ──► PX4
#
# 如需参考旧版 MAVSDK 实现,请查看 git 历史

@ -0,0 +1,253 @@
# P600 无人机定点巡航控制系统 - 使用说明
## 目录
1. [系统架构](#系统架构)
2. [功能模块](#功能模块)
3. [快速开始](#快速开始)
4. [光斑检测与避光斑](#光斑检测与避光斑)
5. [启动命令](#启动命令)
6. [配置参数](#配置参数)
7. [常见问题](#常见问题)
---
## 系统架构
```
┌─────────────────────────────────────────────────────────────────────┐
│ 前端浏览器 │
│ ┌─────────┐ ┌─────────┐ ┌──────────┐ ┌────────────┐ ┌───────┐ │
│ │ Leaflet │ │ roslib │ │ MapModule│ │WsModule │ │UI模块 │ │
│ │ 地图 │ │ JS │ │ 航点管理 │ │ MAVROS通信│ │ │ │
│ └─────────┘ └─────────┘ └──────────┘ └────────────┘ └───────┘ │
│ │ │ │ │ │
│ └────────────┴────────────┴──────────────┘ │
│ │ WebSocket │
└──────────────────────────┼──────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ rosbridge_server │
│ (ROS-WebSocket 网桥) │
└──────────────────────────┼──────────────────────────────────────────┘
┌───────────────┼───────────────┐
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────┐ ┌─────────────┐
│ MAVROS │ │flash_detector│ │ │
│ (PX4通信) │ │ (光斑检测) │ │ 其他节点 │
└─────────────────┘ └─────────────┘ └─────────────┘
│ │
▼ ▼
┌─────────────────┐ ┌─────────────┐
│ PX4 │ │ 相机 │
│ 飞控 │ │ (D435i) │
└─────────────────┘ └─────────────┘
```
---
## 功能模块
### 1. 航点巡航模块
- 在地图上点击添加航点
- 上传任务到无人机
- 开始/暂停/继续任务执行
- 返航/降落控制
### 2. 光斑检测模块
- 通过相机图像检测高亮光斑
- 使用 HSV 颜色空间阈值分割算法
- 支持动态调参 (rqt_reconfigure)
- 发布检测结果到前端
### 3. 避光斑模块
- 基于光斑位置计算躲避方向
- 水平+垂直结合避让
- 防抖机制防止误触发
- 自动发布躲避位置指令
---
## 快速开始
### 1. 编译 ROS 包
```bash
cd /home/mc/ZhiTu/flash_detector_ws
source /opt/ros/noetic/setup.bash
source devel/setup.bash
```
### 2. 启动 rosbridge_server
```bash
roslaunch rosbridge_server rosbridge_websocket.launch
```
### 3. 启动光斑检测节点
```bash
# 使用默认相机话题
roslaunch flash_detector flash_detector.launch
# 指定相机话题 (适配不同无人机)
roslaunch flash_detector flash_detector.launch camera_topic:=/uav1/camera/color/image_raw
```
### 4. 启动前端
```bash
cd /home/mc/ZhiTu/FrontEnd
python3 server/app.py
# 打开浏览器访问 http://localhost:5000
```
---
## 光斑检测与避光斑
### 工作流程
```
相机图像 → flash_detector_node.py → 检测结果
前端浏览器 ← /flash_detector/detection ←─┘
FlashDetectorModule → FlashAvoidanceModule → 避光斑指令
无人机执行躲避
```
### 检测话题
| 话题名 | 类型 | 说明 |
|--------|------|------|
| `/flash_detector/flash_detected` | std_msgs/Bool | 是否检测到光斑 |
| `/flash_detector/detection` | std_msgs/Float32MultiArray | [cx, cy, area, sight_x, sight_y] |
### 避光斑策略
- **水平躲避**: 光斑在右侧 → 无人机向左移动
- **垂直躲避**: 光斑在下方 → 无人机向上移动
- **触发条件**: 连续 3 帧检测到光斑且面积 > 100
- **冷却时间**: 5 秒内不重复触发
---
## 启动命令
### 完整启动顺序 (推荐)
```bash
# 终端1: 启动 ROS Master
roscore
# 终端2: 启动 rosbridge_server
roslaunch rosbridge_server rosbridge_websocket.launch
# 终端3: 编译并启动光斑检测节点
cd /home/mc/ZhiTu/flash_detector_ws
source /opt/ros/noetic/setup.bash
source devel/setup.bash
roslaunch flash_detector flash_detector.launch camera_topic:=/uav1/camera/color/image_raw
# 终端4: 启动前端
cd /home/mc/ZhiTu/FrontEnd
python3 server/app.py
```
### 参数说明
| 参数 | 默认值 | 说明 |
|------|--------|------|
| `camera_topic` | `/camera/color/image_raw` | 相机图像话题 |
| `camera_info_topic` | `/camera/color/camera_info` | 相机内参话题 |
| `debug_mode` | `false` | 是否显示调试窗口 |
| `hsv_v_min` | `200` | HSV 亮度最小值 |
---
## 配置参数
### HSV 阈值参数
```yaml
# 适合检测明亮的枪口闪光
hsv_h_min: 0
hsv_h_max: 30
hsv_s_min: 100
hsv_s_max: 255
hsv_v_min: 200 # 高亮度阈值
hsv_v_max: 255
```
### 避光斑参数 (flash_avoidance.js)
```javascript
const config = {
avoidanceDistance: 3.0, // 躲避移动距离 (米)
minDetectionArea: 100, // 最小检测面积
horizontalThreshold: 0.2, // 水平方向阈值
verticalThreshold: 0.2, // 垂直方向阈值
debounceCount: 3, // 防抖帧数
debounceCooldown: 5000 // 冷却时间 (毫秒)
};
```
---
## 常见问题
### Q: 连接失败怎么办?
1. 检查 rosbridge_server 是否启动
2. 检查 WebSocket 地址是否正确
3. 确认防火墙未阻止 9090 端口
### Q: 光斑检测不准确?
1. 使用 `rqt_reconfigure` 调整 HSV 参数
2. 增加 `min_area` 过滤噪点
3. 调整 `kernel_size` 改善形态学效果
### Q: 避光斑不生效?
1. 确认已启用避光斑模块
2. 检查检测面积是否超过阈值
3. 确认无人机处于 OFFBOARD 模式
### Q: 如何调整避光斑灵敏度?
修改 `flash_avoidance.js` 中的参数:
- 降低 `minDetectionArea` 增加灵敏度
- 降低 `horizontalThreshold` / `verticalThreshold` 增加灵敏度
- 减少 `debounceCount` 减少防抖延迟
---
## 文件结构
```
/home/mc/ZhiTu/ # 项目根目录
├── flash_detector/ # ROS 包源码
│ ├── package.xml
│ ├── CMakeLists.txt
│ ├── cfg/FlashDetector.cfg
│ ├── config/param.yaml
│ ├── launch/flash_detector.launch
│ └── scripts/flash_detector_node.py
├── flash_detector_ws/ # 编译的工作空间
│ ├── src/flash_detector/ # 已编译的包
│ ├── build/
│ ├── devel/
│ └── logs/
└── FrontEnd/ # 前端项目
├── index.html
├── 使用说明.md
├── css/style.css
├── js/
│ ├── flash_detector.js # 光斑检测订阅
│ ├── flash_avoidance.js # 避光斑决策
│ ├── websocket.js # MAVROS 通信
│ ├── map.js # 地图模块
│ └── ui.js # UI 交互
└── server/
└── app.py # Flask 服务器
```
---
## 联系方式
- 开发者: mc
- Email: mc@example.com

File diff suppressed because it is too large Load Diff

@ -0,0 +1,13 @@
# Catkin Tools Metadata
This directory was generated by catkin_tools and it contains persistent
configuration information used by the `catkin` command and its sub-commands.
Each subdirectory of the `profiles` directory contains a set of persistent
configuration options for separate profiles. The default profile is called
`default`. If another profile is desired, it can be described in the
`profiles.yaml` file in this directory.
Please see the catkin_tools documentation before editing any files in this
directory. Most actions can be performed with the `catkin` command-line
program.

@ -0,0 +1,22 @@
authors: []
blacklist: []
build_space: build
catkin_make_args: []
cmake_args: []
devel_layout: linked
devel_space: devel
extend_path: null
extends: null
install: false
install_space: install
isolate_install: false
jobs_args: []
licenses:
- TODO
log_space: logs
maintainers: []
make_args: []
source_space: src
use_env_cache: false
use_internal_make_jobserver: true
whitelist: []

@ -0,0 +1,14 @@
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild
/home/mc/ZhiTu/flash_detector_ws/devel/.private/catkin_tools_prebuild/local_setup.sh /home/mc/ZhiTu/flash_detector_ws/devel/./local_setup.sh
/home/mc/ZhiTu/flash_detector_ws/devel/.private/catkin_tools_prebuild/_setup_util.py /home/mc/ZhiTu/flash_detector_ws/devel/./_setup_util.py
/home/mc/ZhiTu/flash_detector_ws/devel/.private/catkin_tools_prebuild/local_setup.zsh /home/mc/ZhiTu/flash_detector_ws/devel/./local_setup.zsh
/home/mc/ZhiTu/flash_detector_ws/devel/.private/catkin_tools_prebuild/env.sh /home/mc/ZhiTu/flash_detector_ws/devel/./env.sh
/home/mc/ZhiTu/flash_detector_ws/devel/.private/catkin_tools_prebuild/setup.zsh /home/mc/ZhiTu/flash_detector_ws/devel/./setup.zsh
/home/mc/ZhiTu/flash_detector_ws/devel/.private/catkin_tools_prebuild/setup.sh /home/mc/ZhiTu/flash_detector_ws/devel/./setup.sh
/home/mc/ZhiTu/flash_detector_ws/devel/.private/catkin_tools_prebuild/setup.fish /home/mc/ZhiTu/flash_detector_ws/devel/./setup.fish
/home/mc/ZhiTu/flash_detector_ws/devel/.private/catkin_tools_prebuild/local_setup.fish /home/mc/ZhiTu/flash_detector_ws/devel/./local_setup.fish
/home/mc/ZhiTu/flash_detector_ws/devel/.private/catkin_tools_prebuild/setup.bash /home/mc/ZhiTu/flash_detector_ws/devel/./setup.bash
/home/mc/ZhiTu/flash_detector_ws/devel/.private/catkin_tools_prebuild/local_setup.bash /home/mc/ZhiTu/flash_detector_ws/devel/./local_setup.bash
/home/mc/ZhiTu/flash_detector_ws/devel/.private/catkin_tools_prebuild/share/catkin_tools_prebuild/cmake/catkin_tools_prebuildConfig-version.cmake /home/mc/ZhiTu/flash_detector_ws/devel/share/catkin_tools_prebuild/cmake/catkin_tools_prebuildConfig-version.cmake
/home/mc/ZhiTu/flash_detector_ws/devel/.private/catkin_tools_prebuild/share/catkin_tools_prebuild/cmake/catkin_tools_prebuildConfig.cmake /home/mc/ZhiTu/flash_detector_ws/devel/share/catkin_tools_prebuild/cmake/catkin_tools_prebuildConfig.cmake
/home/mc/ZhiTu/flash_detector_ws/devel/.private/catkin_tools_prebuild/lib/pkgconfig/catkin_tools_prebuild.pc /home/mc/ZhiTu/flash_detector_ws/devel/lib/pkgconfig/catkin_tools_prebuild.pc

@ -0,0 +1,10 @@
<package>
<name>catkin_tools_prebuild</name>
<description>
This package is used to generate catkin setup files.
</description>
<version>0.0.0</version>
<license>BSD</license>
<maintainer email="jbo@jhu.edu">jbohren</maintainer>
<buildtool_depend>catkin</buildtool_depend>
</package>

@ -0,0 +1,12 @@
flash_detector
/home/mc/ZhiTu/flash_detector_ws/devel/.private/flash_detector/share/flash_detector/docs/FlashDetectorConfig.wikidoc /home/mc/ZhiTu/flash_detector_ws/devel/share/flash_detector/docs/FlashDetectorConfig.wikidoc
/home/mc/ZhiTu/flash_detector_ws/devel/.private/flash_detector/share/flash_detector/docs/FlashDetectorConfig-usage.dox /home/mc/ZhiTu/flash_detector_ws/devel/share/flash_detector/docs/FlashDetectorConfig-usage.dox
/home/mc/ZhiTu/flash_detector_ws/devel/.private/flash_detector/share/flash_detector/docs/FlashDetectorConfig.dox /home/mc/ZhiTu/flash_detector_ws/devel/share/flash_detector/docs/FlashDetectorConfig.dox
/home/mc/ZhiTu/flash_detector_ws/devel/.private/flash_detector/share/flash_detector/cmake/flash_detectorConfig-version.cmake /home/mc/ZhiTu/flash_detector_ws/devel/share/flash_detector/cmake/flash_detectorConfig-version.cmake
/home/mc/ZhiTu/flash_detector_ws/devel/.private/flash_detector/share/flash_detector/cmake/flash_detectorConfig.cmake /home/mc/ZhiTu/flash_detector_ws/devel/share/flash_detector/cmake/flash_detectorConfig.cmake
/home/mc/ZhiTu/flash_detector_ws/devel/.private/flash_detector/include/flash_detector/FlashDetectorConfig.h /home/mc/ZhiTu/flash_detector_ws/devel/include/flash_detector/FlashDetectorConfig.h
/home/mc/ZhiTu/flash_detector_ws/devel/.private/flash_detector/lib/python3/dist-packages/flash_detector/__init__.py /home/mc/ZhiTu/flash_detector_ws/devel/lib/python3/dist-packages/flash_detector/__init__.py
/home/mc/ZhiTu/flash_detector_ws/devel/.private/flash_detector/lib/python3/dist-packages/flash_detector/cfg/__init__.py /home/mc/ZhiTu/flash_detector_ws/devel/lib/python3/dist-packages/flash_detector/cfg/__init__.py
/home/mc/ZhiTu/flash_detector_ws/devel/.private/flash_detector/lib/python3/dist-packages/flash_detector/cfg/FlashDetectorConfig.py /home/mc/ZhiTu/flash_detector_ws/devel/lib/python3/dist-packages/flash_detector/cfg/FlashDetectorConfig.py
/home/mc/ZhiTu/flash_detector_ws/devel/.private/flash_detector/lib/flash_detector/flash_detector_node /home/mc/ZhiTu/flash_detector_ws/devel/lib/flash_detector/flash_detector_node
/home/mc/ZhiTu/flash_detector_ws/devel/.private/flash_detector/lib/pkgconfig/flash_detector.pc /home/mc/ZhiTu/flash_detector_ws/devel/lib/pkgconfig/flash_detector.pc

@ -0,0 +1,40 @@
<?xml version="1.0"?>
<package format="2">
<name>flash_detector</name>
<version>0.1.0</version>
<description>Flash Detection Module for UAV - Detects muzzle flash using HSV thresholding</description>
<!-- One maintainer tag required -->
<maintainer email="mc@example.com">mc</maintainer>
<!-- One license tag required -->
<license>MIT</license>
<!-- Url tags are optional -->
<url type="website">https://github.com/amovlab/Prometheus</url>
<!-- Author tags are optional -->
<author email="mc@example.com">mc</author>
<!-- Build tool dependencies -->
<buildtool_depend>catkin</buildtool_depend>
<!-- ROS dependencies -->
<build_depend>cv_bridge</build_depend>
<build_depend>roscpp</build_depend>
<build_depend>sensor_msgs</build_depend>
<build_depend>std_msgs</build_depend>
<build_depend>dynamic_reconfigure</build_depend>
<build_depend>image_transport</build_depend>
<exec_depend>cv_bridge</exec_depend>
<exec_depend>roscpp</exec_depend>
<exec_depend>sensor_msgs</exec_depend>
<exec_depend>std_msgs</exec_depend>
<exec_depend>dynamic_reconfigure</exec_depend>
<exec_depend>image_transport</exec_depend>
<!-- Export tag -->
<export>
</export>
</package>

@ -0,0 +1,6 @@
devel_space: /home/mc/ZhiTu/flash_detector_ws/devel
install: false
install_space: /home/mc/ZhiTu/flash_detector_ws/install
profile: default
source_space: /home/mc/ZhiTu/flash_detector_ws/src
workspace: /home/mc/ZhiTu/flash_detector_ws

@ -0,0 +1,688 @@
# This is the CMakeCache file.
# For build in directory: /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild
# It was generated by CMake: /usr/bin/cmake
# You can edit this file to change values found and used by cmake.
# If you do not want to change any of the values, simply exit the editor.
# If you do want to change a value, simply edit, save, and exit the editor.
# The syntax for the file is as follows:
# KEY:TYPE=VALUE
# KEY is the name of a variable in the cache.
# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!.
# VALUE is the current value for the KEY.
########################
# EXTERNAL cache entries
########################
//Builds the googlemock subproject
BUILD_GMOCK:BOOL=ON
//Build dynamically-linked binaries
BUILD_SHARED_LIBS:BOOL=ON
//catkin devel space
CATKIN_DEVEL_PREFIX:PATH=/home/mc/ZhiTu/flash_detector_ws/devel/.private/catkin_tools_prebuild
//Catkin enable testing
CATKIN_ENABLE_TESTING:BOOL=ON
//Prefix to apply to package generated via gendebian
CATKIN_PACKAGE_PREFIX:STRING=
//Catkin skip testing
CATKIN_SKIP_TESTING:BOOL=OFF
//Replace the CMake install command with a custom implementation
// using symlinks instead of copying resources
CATKIN_SYMLINK_INSTALL:BOOL=OFF
//Path to a program.
CMAKE_ADDR2LINE:FILEPATH=/usr/bin/addr2line
//Path to a program.
CMAKE_AR:FILEPATH=/usr/bin/ar
//Choose the type of build, options are: None Debug Release RelWithDebInfo
// MinSizeRel ...
CMAKE_BUILD_TYPE:STRING=
//Enable/Disable color output during build.
CMAKE_COLOR_MAKEFILE:BOOL=ON
//CXX compiler
CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/c++
//A wrapper around 'ar' adding the appropriate '--plugin' option
// for the GCC compiler
CMAKE_CXX_COMPILER_AR:FILEPATH=/usr/bin/gcc-ar-9
//A wrapper around 'ranlib' adding the appropriate '--plugin' option
// for the GCC compiler
CMAKE_CXX_COMPILER_RANLIB:FILEPATH=/usr/bin/gcc-ranlib-9
//Flags used by the CXX compiler during all build types.
CMAKE_CXX_FLAGS:STRING=
//Flags used by the CXX compiler during DEBUG builds.
CMAKE_CXX_FLAGS_DEBUG:STRING=-g
//Flags used by the CXX compiler during MINSIZEREL builds.
CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG
//Flags used by the CXX compiler during RELEASE builds.
CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG
//Flags used by the CXX compiler during RELWITHDEBINFO builds.
CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG
//C compiler
CMAKE_C_COMPILER:FILEPATH=/usr/bin/cc
//A wrapper around 'ar' adding the appropriate '--plugin' option
// for the GCC compiler
CMAKE_C_COMPILER_AR:FILEPATH=/usr/bin/gcc-ar-9
//A wrapper around 'ranlib' adding the appropriate '--plugin' option
// for the GCC compiler
CMAKE_C_COMPILER_RANLIB:FILEPATH=/usr/bin/gcc-ranlib-9
//Flags used by the C compiler during all build types.
CMAKE_C_FLAGS:STRING=
//Flags used by the C compiler during DEBUG builds.
CMAKE_C_FLAGS_DEBUG:STRING=-g
//Flags used by the C compiler during MINSIZEREL builds.
CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG
//Flags used by the C compiler during RELEASE builds.
CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG
//Flags used by the C compiler during RELWITHDEBINFO builds.
CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG
//Path to a program.
CMAKE_DLLTOOL:FILEPATH=CMAKE_DLLTOOL-NOTFOUND
//Flags used by the linker during all build types.
CMAKE_EXE_LINKER_FLAGS:STRING=
//Flags used by the linker during DEBUG builds.
CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING=
//Flags used by the linker during MINSIZEREL builds.
CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING=
//Flags used by the linker during RELEASE builds.
CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING=
//Flags used by the linker during RELWITHDEBINFO builds.
CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING=
//Enable/Disable output of compile commands during generation.
CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=OFF
//User executables (bin)
CMAKE_INSTALL_BINDIR:PATH=bin
//Read-only architecture-independent data (DATAROOTDIR)
CMAKE_INSTALL_DATADIR:PATH=
//Read-only architecture-independent data root (share)
CMAKE_INSTALL_DATAROOTDIR:PATH=share
//Documentation root (DATAROOTDIR/doc/PROJECT_NAME)
CMAKE_INSTALL_DOCDIR:PATH=
//C header files (include)
CMAKE_INSTALL_INCLUDEDIR:PATH=include
//Info documentation (DATAROOTDIR/info)
CMAKE_INSTALL_INFODIR:PATH=
//Object code libraries (lib)
CMAKE_INSTALL_LIBDIR:PATH=lib
//Program executables (libexec)
CMAKE_INSTALL_LIBEXECDIR:PATH=libexec
//Locale-dependent data (DATAROOTDIR/locale)
CMAKE_INSTALL_LOCALEDIR:PATH=
//Modifiable single-machine data (var)
CMAKE_INSTALL_LOCALSTATEDIR:PATH=var
//Man documentation (DATAROOTDIR/man)
CMAKE_INSTALL_MANDIR:PATH=
//C header files for non-gcc (/usr/include)
CMAKE_INSTALL_OLDINCLUDEDIR:PATH=/usr/include
//Install path prefix, prepended onto install directories.
CMAKE_INSTALL_PREFIX:PATH=/home/mc/ZhiTu/flash_detector_ws/install
//Run-time variable data (LOCALSTATEDIR/run)
CMAKE_INSTALL_RUNSTATEDIR:PATH=
//System admin executables (sbin)
CMAKE_INSTALL_SBINDIR:PATH=sbin
//Modifiable architecture-independent data (com)
CMAKE_INSTALL_SHAREDSTATEDIR:PATH=com
//Read-only single-machine data (etc)
CMAKE_INSTALL_SYSCONFDIR:PATH=etc
//Path to a program.
CMAKE_LINKER:FILEPATH=/usr/bin/ld
//Path to a program.
CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/make
//Flags used by the linker during the creation of modules during
// all build types.
CMAKE_MODULE_LINKER_FLAGS:STRING=
//Flags used by the linker during the creation of modules during
// DEBUG builds.
CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING=
//Flags used by the linker during the creation of modules during
// MINSIZEREL builds.
CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING=
//Flags used by the linker during the creation of modules during
// RELEASE builds.
CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING=
//Flags used by the linker during the creation of modules during
// RELWITHDEBINFO builds.
CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING=
//Path to a program.
CMAKE_NM:FILEPATH=/usr/bin/nm
//Path to a program.
CMAKE_OBJCOPY:FILEPATH=/usr/bin/objcopy
//Path to a program.
CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump
//Value Computed by CMake
CMAKE_PROJECT_DESCRIPTION:STATIC=
//Value Computed by CMake
CMAKE_PROJECT_HOMEPAGE_URL:STATIC=
//Value Computed by CMake
CMAKE_PROJECT_NAME:STATIC=catkin_tools_prebuild
//Value Computed by CMake
CMAKE_PROJECT_VERSION:STATIC=1.10.0
//Value Computed by CMake
CMAKE_PROJECT_VERSION_MAJOR:STATIC=1
//Value Computed by CMake
CMAKE_PROJECT_VERSION_MINOR:STATIC=10
//Value Computed by CMake
CMAKE_PROJECT_VERSION_PATCH:STATIC=0
//Value Computed by CMake
CMAKE_PROJECT_VERSION_TWEAK:STATIC=
//Path to a program.
CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib
//Path to a program.
CMAKE_READELF:FILEPATH=/usr/bin/readelf
//Flags used by the linker during the creation of shared libraries
// during all build types.
CMAKE_SHARED_LINKER_FLAGS:STRING=
//Flags used by the linker during the creation of shared libraries
// during DEBUG builds.
CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING=
//Flags used by the linker during the creation of shared libraries
// during MINSIZEREL builds.
CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING=
//Flags used by the linker during the creation of shared libraries
// during RELEASE builds.
CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING=
//Flags used by the linker during the creation of shared libraries
// during RELWITHDEBINFO builds.
CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING=
//If set, runtime paths are not added when installing shared libraries,
// but are added when building.
CMAKE_SKIP_INSTALL_RPATH:BOOL=NO
//If set, runtime paths are not added when using shared libraries.
CMAKE_SKIP_RPATH:BOOL=NO
//Flags used by the linker during the creation of static libraries
// during all build types.
CMAKE_STATIC_LINKER_FLAGS:STRING=
//Flags used by the linker during the creation of static libraries
// during DEBUG builds.
CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING=
//Flags used by the linker during the creation of static libraries
// during MINSIZEREL builds.
CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING=
//Flags used by the linker during the creation of static libraries
// during RELEASE builds.
CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING=
//Flags used by the linker during the creation of static libraries
// during RELWITHDEBINFO builds.
CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING=
//Path to a program.
CMAKE_STRIP:FILEPATH=/usr/bin/strip
//If this value is on, makefiles will be generated without the
// .SILENT directive, and all commands will be echoed to the console
// during the make. This is useful for debugging only. With Visual
// Studio IDE projects all commands are done without /nologo.
CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE
//Path to a program.
DOXYGEN_EXECUTABLE:FILEPATH=DOXYGEN_EXECUTABLE-NOTFOUND
//Path to a program.
EMPY_EXECUTABLE:FILEPATH=EMPY_EXECUTABLE-NOTFOUND
//Empy script
EMPY_SCRIPT:STRING=/usr/lib/python3/dist-packages/em.py
//Path to a library.
GMOCK_LIBRARY:FILEPATH=GMOCK_LIBRARY-NOTFOUND
//Path to a library.
GMOCK_LIBRARY_DEBUG:FILEPATH=GMOCK_LIBRARY_DEBUG-NOTFOUND
//Path to a library.
GMOCK_MAIN_LIBRARY:FILEPATH=GMOCK_MAIN_LIBRARY-NOTFOUND
//Path to a library.
GMOCK_MAIN_LIBRARY_DEBUG:FILEPATH=GMOCK_MAIN_LIBRARY_DEBUG-NOTFOUND
//The directory containing a CMake configuration file for GMock.
GMock_DIR:PATH=GMock_DIR-NOTFOUND
//Path to a file.
GTEST_INCLUDE_DIR:PATH=/usr/include
//Path to a library.
GTEST_LIBRARY:FILEPATH=/usr/lib/x86_64-linux-gnu/libgtest.a
//Path to a library.
GTEST_LIBRARY_DEBUG:FILEPATH=GTEST_LIBRARY_DEBUG-NOTFOUND
//Path to a library.
GTEST_MAIN_LIBRARY:FILEPATH=/usr/lib/x86_64-linux-gnu/libgtest_main.a
//Path to a library.
GTEST_MAIN_LIBRARY_DEBUG:FILEPATH=GTEST_MAIN_LIBRARY_DEBUG-NOTFOUND
//The directory containing a CMake configuration file for GTest.
GTest_DIR:PATH=GTest_DIR-NOTFOUND
//Enable installation of googletest. (Projects embedding googletest
// may want to turn this OFF.)
INSTALL_GTEST:BOOL=OFF
//lsb_release executable was found
LSB_FOUND:BOOL=TRUE
//Path to a program.
LSB_RELEASE_EXECUTABLE:FILEPATH=/usr/bin/lsb_release
//Path to a program.
NOSETESTS:FILEPATH=/usr/bin/nosetests3
//Path to a program.
PYTHON_EXECUTABLE:FILEPATH=/usr/bin/python3
//Specify specific Python version to use ('major.minor' or 'major')
PYTHON_VERSION:STRING=3
//Location of Python module em
PY_EM:STRING=/usr/lib/python3/dist-packages/em.py
//Path to a library.
RT_LIBRARY:FILEPATH=/usr/lib/x86_64-linux-gnu/librt.so
//Enable debian style python package layout
SETUPTOOLS_DEB_LAYOUT:BOOL=ON
//Name of the computer/site where compile is being run
SITE:STRING=mc
//LSB Distrib tag
UBUNTU:BOOL=TRUE
//LSB Distrib - codename tag
UBUNTU_FOCAL:BOOL=TRUE
//Path to a file.
_gmock_INCLUDES:FILEPATH=/usr/src/googletest/googlemock/include/gmock/gmock.h
//Path to a file.
_gmock_SOURCES:FILEPATH=/usr/src/gmock/src/gmock.cc
//Path to a file.
_gtest_INCLUDES:FILEPATH=/usr/include/gtest/gtest.h
//Path to a file.
_gtest_SOURCES:FILEPATH=/usr/src/gtest/src/gtest.cc
//The directory containing a CMake configuration file for catkin.
catkin_DIR:PATH=/opt/ros/noetic/share/catkin/cmake
//Value Computed by CMake
catkin_tools_prebuild_BINARY_DIR:STATIC=/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild
//Value Computed by CMake
catkin_tools_prebuild_SOURCE_DIR:STATIC=/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild
//Value Computed by CMake
gmock_BINARY_DIR:STATIC=/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest/googlemock
//Dependencies for the target
gmock_LIB_DEPENDS:STATIC=general;gtest;
//Value Computed by CMake
gmock_SOURCE_DIR:STATIC=/usr/src/googletest/googlemock
//Build all of Google Mock's own tests.
gmock_build_tests:BOOL=OFF
//Dependencies for the target
gmock_main_LIB_DEPENDS:STATIC=general;gmock;
//Value Computed by CMake
googletest-distribution_BINARY_DIR:STATIC=/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest
//Value Computed by CMake
googletest-distribution_SOURCE_DIR:STATIC=/usr/src/googletest
//Value Computed by CMake
gtest_BINARY_DIR:STATIC=/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest/googletest
//Value Computed by CMake
gtest_SOURCE_DIR:STATIC=/usr/src/googletest/googletest
//Build gtest's sample programs.
gtest_build_samples:BOOL=OFF
//Build all of gtest's own tests.
gtest_build_tests:BOOL=OFF
//Disable uses of pthreads in gtest.
gtest_disable_pthreads:BOOL=OFF
//Use shared (DLL) run-time lib even when Google Test is built
// as static lib.
gtest_force_shared_crt:BOOL=OFF
//Build gtest with internal symbols hidden in shared libraries.
gtest_hide_internal_symbols:BOOL=OFF
//Dependencies for the target
gtest_main_LIB_DEPENDS:STATIC=general;gtest;
########################
# INTERNAL cache entries
########################
//catkin environment
CATKIN_ENV:INTERNAL=/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/catkin_generated/env_cached.sh
CATKIN_TEST_RESULTS_DIR:INTERNAL=/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/test_results
//ADVANCED property for variable: CMAKE_ADDR2LINE
CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_AR
CMAKE_AR-ADVANCED:INTERNAL=1
//This is the directory where this CMakeCache.txt was created
CMAKE_CACHEFILE_DIR:INTERNAL=/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild
//Major version of cmake used to create the current loaded cache
CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3
//Minor version of cmake used to create the current loaded cache
CMAKE_CACHE_MINOR_VERSION:INTERNAL=16
//Patch version of cmake used to create the current loaded cache
CMAKE_CACHE_PATCH_VERSION:INTERNAL=3
//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE
CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1
//Path to CMake executable.
CMAKE_COMMAND:INTERNAL=/usr/bin/cmake
//Path to cpack program executable.
CMAKE_CPACK_COMMAND:INTERNAL=/usr/bin/cpack
//Path to ctest program executable.
CMAKE_CTEST_COMMAND:INTERNAL=/usr/bin/ctest
//ADVANCED property for variable: CMAKE_CXX_COMPILER
CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR
CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB
CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_CXX_FLAGS
CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL
CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO
CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_C_COMPILER
CMAKE_C_COMPILER-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_C_COMPILER_AR
CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB
CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_C_FLAGS
CMAKE_C_FLAGS-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG
CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL
CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO
CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_DLLTOOL
CMAKE_DLLTOOL-ADVANCED:INTERNAL=1
//Executable file format
CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF
//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS
CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG
CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL
CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE
CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO
CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS
CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1
//Name of external makefile project generator.
CMAKE_EXTRA_GENERATOR:INTERNAL=
//Name of generator.
CMAKE_GENERATOR:INTERNAL=Unix Makefiles
//Generator instance identifier.
CMAKE_GENERATOR_INSTANCE:INTERNAL=
//Name of generator platform.
CMAKE_GENERATOR_PLATFORM:INTERNAL=
//Name of generator toolset.
CMAKE_GENERATOR_TOOLSET:INTERNAL=
//Test CMAKE_HAVE_LIBC_PTHREAD
CMAKE_HAVE_LIBC_PTHREAD:INTERNAL=
//Have library pthreads
CMAKE_HAVE_PTHREADS_CREATE:INTERNAL=
//Have library pthread
CMAKE_HAVE_PTHREAD_CREATE:INTERNAL=1
//Have include pthread.h
CMAKE_HAVE_PTHREAD_H:INTERNAL=1
//Source directory with the top level CMakeLists.txt file for this
// project
CMAKE_HOME_DIRECTORY:INTERNAL=/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild
//ADVANCED property for variable: CMAKE_INSTALL_BINDIR
CMAKE_INSTALL_BINDIR-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_INSTALL_DATADIR
CMAKE_INSTALL_DATADIR-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_INSTALL_DATAROOTDIR
CMAKE_INSTALL_DATAROOTDIR-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_INSTALL_DOCDIR
CMAKE_INSTALL_DOCDIR-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_INSTALL_INCLUDEDIR
CMAKE_INSTALL_INCLUDEDIR-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_INSTALL_INFODIR
CMAKE_INSTALL_INFODIR-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_INSTALL_LIBDIR
CMAKE_INSTALL_LIBDIR-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_INSTALL_LIBEXECDIR
CMAKE_INSTALL_LIBEXECDIR-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_INSTALL_LOCALEDIR
CMAKE_INSTALL_LOCALEDIR-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_INSTALL_LOCALSTATEDIR
CMAKE_INSTALL_LOCALSTATEDIR-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_INSTALL_MANDIR
CMAKE_INSTALL_MANDIR-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_INSTALL_OLDINCLUDEDIR
CMAKE_INSTALL_OLDINCLUDEDIR-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_INSTALL_RUNSTATEDIR
CMAKE_INSTALL_RUNSTATEDIR-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_INSTALL_SBINDIR
CMAKE_INSTALL_SBINDIR-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_INSTALL_SHAREDSTATEDIR
CMAKE_INSTALL_SHAREDSTATEDIR-ADVANCED:INTERNAL=1
//Install .so files without execute permission.
CMAKE_INSTALL_SO_NO_EXE:INTERNAL=1
//ADVANCED property for variable: CMAKE_INSTALL_SYSCONFDIR
CMAKE_INSTALL_SYSCONFDIR-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_LINKER
CMAKE_LINKER-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_MAKE_PROGRAM
CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS
CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG
CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL
CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE
CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO
CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_NM
CMAKE_NM-ADVANCED:INTERNAL=1
//number of local generators
CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=4
//ADVANCED property for variable: CMAKE_OBJCOPY
CMAKE_OBJCOPY-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_OBJDUMP
CMAKE_OBJDUMP-ADVANCED:INTERNAL=1
//Platform information initialized
CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1
//ADVANCED property for variable: CMAKE_RANLIB
CMAKE_RANLIB-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_READELF
CMAKE_READELF-ADVANCED:INTERNAL=1
//Path to CMake installation.
CMAKE_ROOT:INTERNAL=/usr/share/cmake-3.16
//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS
CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG
CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL
CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE
CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO
CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH
CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_SKIP_RPATH
CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS
CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG
CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL
CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE
CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO
CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
//ADVANCED property for variable: CMAKE_STRIP
CMAKE_STRIP-ADVANCED:INTERNAL=1
//uname command
CMAKE_UNAME:INTERNAL=/usr/bin/uname
//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE
CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1
//Details about finding PY_em
FIND_PACKAGE_MESSAGE_DETAILS_PY_em:INTERNAL=[/usr/lib/python3/dist-packages/em.py][v()]
//Details about finding PythonInterp
FIND_PACKAGE_MESSAGE_DETAILS_PythonInterp:INTERNAL=[/usr/bin/python3][v3.8.10()]
//Details about finding Threads
FIND_PACKAGE_MESSAGE_DETAILS_Threads:INTERNAL=[TRUE][v()]
GMOCK_FROM_SOURCE_FOUND:INTERNAL=TRUE
GMOCK_FROM_SOURCE_INCLUDE_DIRS:INTERNAL=/usr/src/googletest/googlemock/include
GMOCK_FROM_SOURCE_LIBRARIES:INTERNAL=gmock
GMOCK_FROM_SOURCE_LIBRARY_DIRS:INTERNAL=/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gmock
GMOCK_FROM_SOURCE_MAIN_LIBRARIES:INTERNAL=gmock_main
//ADVANCED property for variable: GMOCK_LIBRARY
GMOCK_LIBRARY-ADVANCED:INTERNAL=1
//ADVANCED property for variable: GMOCK_LIBRARY_DEBUG
GMOCK_LIBRARY_DEBUG-ADVANCED:INTERNAL=1
//ADVANCED property for variable: GMOCK_MAIN_LIBRARY
GMOCK_MAIN_LIBRARY-ADVANCED:INTERNAL=1
//ADVANCED property for variable: GMOCK_MAIN_LIBRARY_DEBUG
GMOCK_MAIN_LIBRARY_DEBUG-ADVANCED:INTERNAL=1
GTEST_FROM_SOURCE_FOUND:INTERNAL=TRUE
GTEST_FROM_SOURCE_INCLUDE_DIRS:INTERNAL=/usr/include
GTEST_FROM_SOURCE_LIBRARIES:INTERNAL=gtest
GTEST_FROM_SOURCE_LIBRARY_DIRS:INTERNAL=/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest
GTEST_FROM_SOURCE_MAIN_LIBRARIES:INTERNAL=gtest_main
//ADVANCED property for variable: GTEST_INCLUDE_DIR
GTEST_INCLUDE_DIR-ADVANCED:INTERNAL=1
//ADVANCED property for variable: GTEST_LIBRARY
GTEST_LIBRARY-ADVANCED:INTERNAL=1
//ADVANCED property for variable: GTEST_LIBRARY_DEBUG
GTEST_LIBRARY_DEBUG-ADVANCED:INTERNAL=1
//ADVANCED property for variable: GTEST_MAIN_LIBRARY
GTEST_MAIN_LIBRARY-ADVANCED:INTERNAL=1
//ADVANCED property for variable: GTEST_MAIN_LIBRARY_DEBUG
GTEST_MAIN_LIBRARY_DEBUG-ADVANCED:INTERNAL=1
//ADVANCED property for variable: PYTHON_EXECUTABLE
PYTHON_EXECUTABLE-ADVANCED:INTERNAL=1
//This needs to be in PYTHONPATH when 'setup.py install' is called.
// And it needs to match. But setuptools won't tell us where
// it will install things.
PYTHON_INSTALL_DIR:INTERNAL=lib/python3/dist-packages
//CMAKE_INSTALL_PREFIX during last run
_GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX:INTERNAL=/home/mc/ZhiTu/flash_detector_ws/install
//ADVANCED property for variable: gmock_build_tests
gmock_build_tests-ADVANCED:INTERNAL=1
//ADVANCED property for variable: gtest_build_samples
gtest_build_samples-ADVANCED:INTERNAL=1
//ADVANCED property for variable: gtest_build_tests
gtest_build_tests-ADVANCED:INTERNAL=1
//ADVANCED property for variable: gtest_disable_pthreads
gtest_disable_pthreads-ADVANCED:INTERNAL=1
//ADVANCED property for variable: gtest_force_shared_crt
gtest_force_shared_crt-ADVANCED:INTERNAL=1
//ADVANCED property for variable: gtest_hide_internal_symbols
gtest_hide_internal_symbols-ADVANCED:INTERNAL=1

@ -0,0 +1,76 @@
set(CMAKE_C_COMPILER "/usr/bin/cc")
set(CMAKE_C_COMPILER_ARG1 "")
set(CMAKE_C_COMPILER_ID "GNU")
set(CMAKE_C_COMPILER_VERSION "9.4.0")
set(CMAKE_C_COMPILER_VERSION_INTERNAL "")
set(CMAKE_C_COMPILER_WRAPPER "")
set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "11")
set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert")
set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes")
set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros")
set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert")
set(CMAKE_C_PLATFORM_ID "Linux")
set(CMAKE_C_SIMULATE_ID "")
set(CMAKE_C_COMPILER_FRONTEND_VARIANT "")
set(CMAKE_C_SIMULATE_VERSION "")
set(CMAKE_AR "/usr/bin/ar")
set(CMAKE_C_COMPILER_AR "/usr/bin/gcc-ar-9")
set(CMAKE_RANLIB "/usr/bin/ranlib")
set(CMAKE_C_COMPILER_RANLIB "/usr/bin/gcc-ranlib-9")
set(CMAKE_LINKER "/usr/bin/ld")
set(CMAKE_MT "")
set(CMAKE_COMPILER_IS_GNUCC 1)
set(CMAKE_C_COMPILER_LOADED 1)
set(CMAKE_C_COMPILER_WORKS TRUE)
set(CMAKE_C_ABI_COMPILED TRUE)
set(CMAKE_COMPILER_IS_MINGW )
set(CMAKE_COMPILER_IS_CYGWIN )
if(CMAKE_COMPILER_IS_CYGWIN)
set(CYGWIN 1)
set(UNIX 1)
endif()
set(CMAKE_C_COMPILER_ENV_VAR "CC")
if(CMAKE_COMPILER_IS_MINGW)
set(MINGW 1)
endif()
set(CMAKE_C_COMPILER_ID_RUN 1)
set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m)
set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC)
set(CMAKE_C_LINKER_PREFERENCE 10)
# Save compiler ABI information.
set(CMAKE_C_SIZEOF_DATA_PTR "8")
set(CMAKE_C_COMPILER_ABI "ELF")
set(CMAKE_C_LIBRARY_ARCHITECTURE "x86_64-linux-gnu")
if(CMAKE_C_SIZEOF_DATA_PTR)
set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}")
endif()
if(CMAKE_C_COMPILER_ABI)
set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}")
endif()
if(CMAKE_C_LIBRARY_ARCHITECTURE)
set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu")
endif()
set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "")
if(CMAKE_C_CL_SHOWINCLUDES_PREFIX)
set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}")
endif()
set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/9/include;/usr/local/include;/usr/include/x86_64-linux-gnu;/usr/include")
set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "gcc;gcc_s;c;gcc;gcc_s")
set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/9;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib")
set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "")

@ -0,0 +1,88 @@
set(CMAKE_CXX_COMPILER "/usr/bin/c++")
set(CMAKE_CXX_COMPILER_ARG1 "")
set(CMAKE_CXX_COMPILER_ID "GNU")
set(CMAKE_CXX_COMPILER_VERSION "9.4.0")
set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "")
set(CMAKE_CXX_COMPILER_WRAPPER "")
set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "14")
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")
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_CXX_PLATFORM_ID "Linux")
set(CMAKE_CXX_SIMULATE_ID "")
set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "")
set(CMAKE_CXX_SIMULATE_VERSION "")
set(CMAKE_AR "/usr/bin/ar")
set(CMAKE_CXX_COMPILER_AR "/usr/bin/gcc-ar-9")
set(CMAKE_RANLIB "/usr/bin/ranlib")
set(CMAKE_CXX_COMPILER_RANLIB "/usr/bin/gcc-ranlib-9")
set(CMAKE_LINKER "/usr/bin/ld")
set(CMAKE_MT "")
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_COMPILER_IS_MINGW )
set(CMAKE_COMPILER_IS_CYGWIN )
if(CMAKE_COMPILER_IS_CYGWIN)
set(CYGWIN 1)
set(UNIX 1)
endif()
set(CMAKE_CXX_COMPILER_ENV_VAR "CXX")
if(CMAKE_COMPILER_IS_MINGW)
set(MINGW 1)
endif()
set(CMAKE_CXX_COMPILER_ID_RUN 1)
set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;CPP)
set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC)
foreach (lang 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)
# Save compiler ABI information.
set(CMAKE_CXX_SIZEOF_DATA_PTR "8")
set(CMAKE_CXX_COMPILER_ABI "ELF")
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++/9;/usr/include/x86_64-linux-gnu/c++/9;/usr/include/c++/9/backward;/usr/lib/gcc/x86_64-linux-gnu/9/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/9;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib")
set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "")

@ -0,0 +1,15 @@
set(CMAKE_HOST_SYSTEM "Linux-5.15.0-139-generic")
set(CMAKE_HOST_SYSTEM_NAME "Linux")
set(CMAKE_HOST_SYSTEM_VERSION "5.15.0-139-generic")
set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64")
set(CMAKE_SYSTEM "Linux-5.15.0-139-generic")
set(CMAKE_SYSTEM_NAME "Linux")
set(CMAKE_SYSTEM_VERSION "5.15.0-139-generic")
set(CMAKE_SYSTEM_PROCESSOR "x86_64")
set(CMAKE_CROSSCOMPILING "FALSE")
set(CMAKE_SYSTEM_LOADED 1)

@ -0,0 +1,671 @@
#ifdef __cplusplus
# error "A C++ compiler has been selected for C."
#endif
#if defined(__18CXX)
# define ID_VOID_MAIN
#endif
#if defined(__CLASSIC_C__)
/* cv-qualifiers did not exist in K&R C */
# define const
# define volatile
#endif
/* Version number components: V=Version, R=Revision, P=Patch
Version date components: YYYY=Year, MM=Month, DD=Day */
#if defined(__INTEL_COMPILER) || defined(__ICC)
# define COMPILER_ID "Intel"
# if defined(_MSC_VER)
# define SIMULATE_ID "MSVC"
# endif
# if defined(__GNUC__)
# define SIMULATE_ID "GNU"
# endif
/* __INTEL_COMPILER = VRP */
# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100)
# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10)
# if defined(__INTEL_COMPILER_UPDATE)
# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE)
# else
# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10)
# endif
# if defined(__INTEL_COMPILER_BUILD_DATE)
/* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */
# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE)
# endif
# if defined(_MSC_VER)
/* _MSC_VER = VVRR */
# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
# endif
# if defined(__GNUC__)
# define SIMULATE_VERSION_MAJOR DEC(__GNUC__)
# elif defined(__GNUG__)
# define SIMULATE_VERSION_MAJOR DEC(__GNUG__)
# endif
# if defined(__GNUC_MINOR__)
# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__)
# endif
# if defined(__GNUC_PATCHLEVEL__)
# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
# endif
#elif defined(__PATHCC__)
# define COMPILER_ID "PathScale"
# define COMPILER_VERSION_MAJOR DEC(__PATHCC__)
# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__)
# if defined(__PATHCC_PATCHLEVEL__)
# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__)
# endif
#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__)
# define COMPILER_ID "Embarcadero"
# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF)
# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF)
# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF)
#elif defined(__BORLANDC__)
# define COMPILER_ID "Borland"
/* __BORLANDC__ = 0xVRR */
# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8)
# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF)
#elif defined(__WATCOMC__) && __WATCOMC__ < 1200
# define COMPILER_ID "Watcom"
/* __WATCOMC__ = VVRR */
# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100)
# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
# if (__WATCOMC__ % 10) > 0
# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
# endif
#elif defined(__WATCOMC__)
# define COMPILER_ID "OpenWatcom"
/* __WATCOMC__ = VVRP + 1100 */
# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100)
# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
# if (__WATCOMC__ % 10) > 0
# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
# endif
#elif defined(__SUNPRO_C)
# define COMPILER_ID "SunPro"
# if __SUNPRO_C >= 0x5100
/* __SUNPRO_C = 0xVRRP */
# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12)
# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF)
# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF)
# else
/* __SUNPRO_CC = 0xVRP */
# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8)
# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF)
# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF)
# endif
#elif defined(__HP_cc)
# define COMPILER_ID "HP"
/* __HP_cc = VVRRPP */
# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000)
# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100)
# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100)
#elif defined(__DECC)
# define COMPILER_ID "Compaq"
/* __DECC_VER = VVRRTPPPP */
# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000)
# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100)
# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000)
#elif defined(__IBMC__) && defined(__COMPILER_VER__)
# define COMPILER_ID "zOS"
/* __IBMC__ = VRP */
# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100)
# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10)
# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10)
#elif defined(__ibmxl__) && defined(__clang__)
# define COMPILER_ID "XLClang"
# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800
# define COMPILER_ID "XL"
/* __IBMC__ = VRP */
# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100)
# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10)
# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10)
#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800
# define COMPILER_ID "VisualAge"
/* __IBMC__ = VRP */
# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100)
# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10)
# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10)
#elif defined(__PGI)
# define COMPILER_ID "PGI"
# define COMPILER_VERSION_MAJOR DEC(__PGIC__)
# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__)
# if defined(__PGIC_PATCHLEVEL__)
# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__)
# endif
#elif defined(_CRAYC)
# define COMPILER_ID "Cray"
# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR)
# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR)
#elif defined(__TI_COMPILER_VERSION__)
# define COMPILER_ID "TI"
/* __TI_COMPILER_VERSION__ = VVVRRRPPP */
# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000)
# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000)
# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000)
#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version)
# define COMPILER_ID "Fujitsu"
#elif defined(__ghs__)
# define COMPILER_ID "GHS"
/* __GHS_VERSION_NUMBER = VVVVRP */
# ifdef __GHS_VERSION_NUMBER
# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100)
# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10)
# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10)
# endif
#elif defined(__TINYC__)
# define COMPILER_ID "TinyCC"
#elif defined(__BCC__)
# define COMPILER_ID "Bruce"
#elif defined(__SCO_VERSION__)
# define COMPILER_ID "SCO"
#elif defined(__ARMCC_VERSION) && !defined(__clang__)
# define COMPILER_ID "ARMCC"
#if __ARMCC_VERSION >= 1000000
/* __ARMCC_VERSION = VRRPPPP */
# define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000)
# define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100)
# define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
#else
/* __ARMCC_VERSION = VRPPPP */
# define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000)
# define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10)
# define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
#endif
#elif defined(__clang__) && defined(__apple_build_version__)
# define COMPILER_ID "AppleClang"
# if defined(_MSC_VER)
# define SIMULATE_ID "MSVC"
# endif
# define COMPILER_VERSION_MAJOR DEC(__clang_major__)
# define COMPILER_VERSION_MINOR DEC(__clang_minor__)
# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
# if defined(_MSC_VER)
/* _MSC_VER = VVRR */
# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
# endif
# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__)
#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION)
# define COMPILER_ID "ARMClang"
# define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000)
# define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100)
# define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000)
# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION)
#elif defined(__clang__)
# define COMPILER_ID "Clang"
# if defined(_MSC_VER)
# define SIMULATE_ID "MSVC"
# endif
# define COMPILER_VERSION_MAJOR DEC(__clang_major__)
# define COMPILER_VERSION_MINOR DEC(__clang_minor__)
# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
# if defined(_MSC_VER)
/* _MSC_VER = VVRR */
# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
# endif
#elif defined(__GNUC__)
# define COMPILER_ID "GNU"
# define COMPILER_VERSION_MAJOR DEC(__GNUC__)
# if defined(__GNUC_MINOR__)
# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__)
# endif
# if defined(__GNUC_PATCHLEVEL__)
# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
# endif
#elif defined(_MSC_VER)
# define COMPILER_ID "MSVC"
/* _MSC_VER = VVRR */
# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100)
# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100)
# if defined(_MSC_FULL_VER)
# if _MSC_VER >= 1400
/* _MSC_FULL_VER = VVRRPPPPP */
# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000)
# else
/* _MSC_FULL_VER = VVRRPPPP */
# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000)
# endif
# endif
# if defined(_MSC_BUILD)
# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD)
# endif
#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
# define COMPILER_ID "ADSP"
#if defined(__VISUALDSPVERSION__)
/* __VISUALDSPVERSION__ = 0xVVRRPP00 */
# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24)
# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF)
# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF)
#endif
#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
# define COMPILER_ID "IAR"
# if defined(__VER__) && defined(__ICCARM__)
# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000)
# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000)
# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000)
# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__))
# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100)
# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100))
# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__)
# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
# endif
#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC)
# define COMPILER_ID "SDCC"
# if defined(__SDCC_VERSION_MAJOR)
# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR)
# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR)
# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH)
# else
/* SDCC = VRP */
# define COMPILER_VERSION_MAJOR DEC(SDCC/100)
# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10)
# define COMPILER_VERSION_PATCH DEC(SDCC % 10)
# endif
/* These compilers are either not known or too old to define an
identification macro. Try to identify the platform and guess that
it is the native compiler. */
#elif defined(__hpux) || defined(__hpua)
# define COMPILER_ID "HP"
#else /* unknown compiler */
# define COMPILER_ID ""
#endif
/* Construct the string literal in pieces to prevent the source from
getting matched. Store it in a pointer rather than an array
because some compilers will just produce instructions to fill the
array rather than assigning a pointer to a static array. */
char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]";
#ifdef SIMULATE_ID
char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]";
#endif
#ifdef __QNXNTO__
char const* qnxnto = "INFO" ":" "qnxnto[]";
#endif
#if defined(__CRAYXE) || defined(__CRAYXC)
char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]";
#endif
#define STRINGIFY_HELPER(X) #X
#define STRINGIFY(X) STRINGIFY_HELPER(X)
/* Identify known platforms by name. */
#if defined(__linux) || defined(__linux__) || defined(linux)
# define PLATFORM_ID "Linux"
#elif defined(__CYGWIN__)
# define PLATFORM_ID "Cygwin"
#elif defined(__MINGW32__)
# define PLATFORM_ID "MinGW"
#elif defined(__APPLE__)
# define PLATFORM_ID "Darwin"
#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
# define PLATFORM_ID "Windows"
#elif defined(__FreeBSD__) || defined(__FreeBSD)
# define PLATFORM_ID "FreeBSD"
#elif defined(__NetBSD__) || defined(__NetBSD)
# define PLATFORM_ID "NetBSD"
#elif defined(__OpenBSD__) || defined(__OPENBSD)
# define PLATFORM_ID "OpenBSD"
#elif defined(__sun) || defined(sun)
# define PLATFORM_ID "SunOS"
#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__)
# define PLATFORM_ID "AIX"
#elif defined(__hpux) || defined(__hpux__)
# define PLATFORM_ID "HP-UX"
#elif defined(__HAIKU__)
# define PLATFORM_ID "Haiku"
#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS)
# define PLATFORM_ID "BeOS"
#elif defined(__QNX__) || defined(__QNXNTO__)
# define PLATFORM_ID "QNX"
#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__)
# define PLATFORM_ID "Tru64"
#elif defined(__riscos) || defined(__riscos__)
# define PLATFORM_ID "RISCos"
#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__)
# define PLATFORM_ID "SINIX"
#elif defined(__UNIX_SV__)
# define PLATFORM_ID "UNIX_SV"
#elif defined(__bsdos__)
# define PLATFORM_ID "BSDOS"
#elif defined(_MPRAS) || defined(MPRAS)
# define PLATFORM_ID "MP-RAS"
#elif defined(__osf) || defined(__osf__)
# define PLATFORM_ID "OSF1"
#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv)
# define PLATFORM_ID "SCO_SV"
#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX)
# define PLATFORM_ID "ULTRIX"
#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX)
# define PLATFORM_ID "Xenix"
#elif defined(__WATCOMC__)
# if defined(__LINUX__)
# define PLATFORM_ID "Linux"
# elif defined(__DOS__)
# define PLATFORM_ID "DOS"
# elif defined(__OS2__)
# define PLATFORM_ID "OS2"
# elif defined(__WINDOWS__)
# define PLATFORM_ID "Windows3x"
# else /* unknown platform */
# define PLATFORM_ID
# endif
#elif defined(__INTEGRITY)
# if defined(INT_178B)
# define PLATFORM_ID "Integrity178"
# else /* regular Integrity */
# define PLATFORM_ID "Integrity"
# endif
#else /* unknown platform */
# define PLATFORM_ID
#endif
/* For windows compilers MSVC and Intel we can determine
the architecture of the compiler being used. This is because
the compilers do not have flags that can change the architecture,
but rather depend on which compiler is being used
*/
#if defined(_WIN32) && defined(_MSC_VER)
# if defined(_M_IA64)
# define ARCHITECTURE_ID "IA64"
# elif defined(_M_X64) || defined(_M_AMD64)
# define ARCHITECTURE_ID "x64"
# elif defined(_M_IX86)
# define ARCHITECTURE_ID "X86"
# elif defined(_M_ARM64)
# define ARCHITECTURE_ID "ARM64"
# elif defined(_M_ARM)
# if _M_ARM == 4
# define ARCHITECTURE_ID "ARMV4I"
# elif _M_ARM == 5
# define ARCHITECTURE_ID "ARMV5I"
# else
# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM)
# endif
# elif defined(_M_MIPS)
# define ARCHITECTURE_ID "MIPS"
# elif defined(_M_SH)
# define ARCHITECTURE_ID "SHx"
# else /* unknown architecture */
# define ARCHITECTURE_ID ""
# endif
#elif defined(__WATCOMC__)
# if defined(_M_I86)
# define ARCHITECTURE_ID "I86"
# elif defined(_M_IX86)
# define ARCHITECTURE_ID "X86"
# else /* unknown architecture */
# define ARCHITECTURE_ID ""
# endif
#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
# if defined(__ICCARM__)
# define ARCHITECTURE_ID "ARM"
# elif defined(__ICCRX__)
# define ARCHITECTURE_ID "RX"
# elif defined(__ICCRH850__)
# define ARCHITECTURE_ID "RH850"
# elif defined(__ICCRL78__)
# define ARCHITECTURE_ID "RL78"
# elif defined(__ICCRISCV__)
# define ARCHITECTURE_ID "RISCV"
# elif defined(__ICCAVR__)
# define ARCHITECTURE_ID "AVR"
# elif defined(__ICC430__)
# define ARCHITECTURE_ID "MSP430"
# elif defined(__ICCV850__)
# define ARCHITECTURE_ID "V850"
# elif defined(__ICC8051__)
# define ARCHITECTURE_ID "8051"
# else /* unknown architecture */
# define ARCHITECTURE_ID ""
# endif
#elif defined(__ghs__)
# if defined(__PPC64__)
# define ARCHITECTURE_ID "PPC64"
# elif defined(__ppc__)
# define ARCHITECTURE_ID "PPC"
# elif defined(__ARM__)
# define ARCHITECTURE_ID "ARM"
# elif defined(__x86_64__)
# define ARCHITECTURE_ID "x64"
# elif defined(__i386__)
# define ARCHITECTURE_ID "X86"
# else /* unknown architecture */
# define ARCHITECTURE_ID ""
# endif
#else
# define ARCHITECTURE_ID
#endif
/* Convert integer to decimal digit literals. */
#define DEC(n) \
('0' + (((n) / 10000000)%10)), \
('0' + (((n) / 1000000)%10)), \
('0' + (((n) / 100000)%10)), \
('0' + (((n) / 10000)%10)), \
('0' + (((n) / 1000)%10)), \
('0' + (((n) / 100)%10)), \
('0' + (((n) / 10)%10)), \
('0' + ((n) % 10))
/* Convert integer to hex digit literals. */
#define HEX(n) \
('0' + ((n)>>28 & 0xF)), \
('0' + ((n)>>24 & 0xF)), \
('0' + ((n)>>20 & 0xF)), \
('0' + ((n)>>16 & 0xF)), \
('0' + ((n)>>12 & 0xF)), \
('0' + ((n)>>8 & 0xF)), \
('0' + ((n)>>4 & 0xF)), \
('0' + ((n) & 0xF))
/* Construct a string literal encoding the version number components. */
#ifdef COMPILER_VERSION_MAJOR
char const info_version[] = {
'I', 'N', 'F', 'O', ':',
'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[',
COMPILER_VERSION_MAJOR,
# ifdef COMPILER_VERSION_MINOR
'.', COMPILER_VERSION_MINOR,
# ifdef COMPILER_VERSION_PATCH
'.', COMPILER_VERSION_PATCH,
# ifdef COMPILER_VERSION_TWEAK
'.', COMPILER_VERSION_TWEAK,
# endif
# endif
# endif
']','\0'};
#endif
/* Construct a string literal encoding the internal version number. */
#ifdef COMPILER_VERSION_INTERNAL
char const info_version_internal[] = {
'I', 'N', 'F', 'O', ':',
'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_',
'i','n','t','e','r','n','a','l','[',
COMPILER_VERSION_INTERNAL,']','\0'};
#endif
/* Construct a string literal encoding the version number components. */
#ifdef SIMULATE_VERSION_MAJOR
char const info_simulate_version[] = {
'I', 'N', 'F', 'O', ':',
's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[',
SIMULATE_VERSION_MAJOR,
# ifdef SIMULATE_VERSION_MINOR
'.', SIMULATE_VERSION_MINOR,
# ifdef SIMULATE_VERSION_PATCH
'.', SIMULATE_VERSION_PATCH,
# ifdef SIMULATE_VERSION_TWEAK
'.', SIMULATE_VERSION_TWEAK,
# endif
# endif
# endif
']','\0'};
#endif
/* Construct the string literal in pieces to prevent the source from
getting matched. Store it in a pointer rather than an array
because some compilers will just produce instructions to fill the
array rather than assigning a pointer to a static array. */
char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]";
char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]";
#if !defined(__STDC__)
# if (defined(_MSC_VER) && !defined(__clang__)) \
|| (defined(__ibmxl__) || defined(__IBMC__))
# define C_DIALECT "90"
# else
# define C_DIALECT
# endif
#elif __STDC_VERSION__ >= 201000L
# define C_DIALECT "11"
#elif __STDC_VERSION__ >= 199901L
# define C_DIALECT "99"
#else
# define C_DIALECT "90"
#endif
const char* info_language_dialect_default =
"INFO" ":" "dialect_default[" C_DIALECT "]";
/*--------------------------------------------------------------------------*/
#ifdef ID_VOID_MAIN
void main() {}
#else
# if defined(__CLASSIC_C__)
int main(argc, argv) int argc; char *argv[];
# else
int main(int argc, char* argv[])
# endif
{
int require = 0;
require += info_compiler[argc];
require += info_platform[argc];
require += info_arch[argc];
#ifdef COMPILER_VERSION_MAJOR
require += info_version[argc];
#endif
#ifdef COMPILER_VERSION_INTERNAL
require += info_version_internal[argc];
#endif
#ifdef SIMULATE_ID
require += info_simulate[argc];
#endif
#ifdef SIMULATE_VERSION_MAJOR
require += info_simulate_version[argc];
#endif
#if defined(__CRAYXE) || defined(__CRAYXC)
require += info_cray[argc];
#endif
require += info_language_dialect_default[argc];
(void)argv;
return require;
}
#endif

@ -0,0 +1,660 @@
/* This source file must have a .cpp extension so that all C++ compilers
recognize the extension without flags. Borland does not know .cxx for
example. */
#ifndef __cplusplus
# error "A C compiler has been selected for C++."
#endif
/* Version number components: V=Version, R=Revision, P=Patch
Version date components: YYYY=Year, MM=Month, DD=Day */
#if defined(__COMO__)
# define COMPILER_ID "Comeau"
/* __COMO_VERSION__ = VRR */
# define COMPILER_VERSION_MAJOR DEC(__COMO_VERSION__ / 100)
# define COMPILER_VERSION_MINOR DEC(__COMO_VERSION__ % 100)
#elif defined(__INTEL_COMPILER) || defined(__ICC)
# define COMPILER_ID "Intel"
# if defined(_MSC_VER)
# define SIMULATE_ID "MSVC"
# endif
# if defined(__GNUC__)
# define SIMULATE_ID "GNU"
# endif
/* __INTEL_COMPILER = VRP */
# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100)
# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10)
# if defined(__INTEL_COMPILER_UPDATE)
# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE)
# else
# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10)
# endif
# if defined(__INTEL_COMPILER_BUILD_DATE)
/* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */
# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE)
# endif
# if defined(_MSC_VER)
/* _MSC_VER = VVRR */
# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
# endif
# if defined(__GNUC__)
# define SIMULATE_VERSION_MAJOR DEC(__GNUC__)
# elif defined(__GNUG__)
# define SIMULATE_VERSION_MAJOR DEC(__GNUG__)
# endif
# if defined(__GNUC_MINOR__)
# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__)
# endif
# if defined(__GNUC_PATCHLEVEL__)
# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
# endif
#elif defined(__PATHCC__)
# define COMPILER_ID "PathScale"
# define COMPILER_VERSION_MAJOR DEC(__PATHCC__)
# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__)
# if defined(__PATHCC_PATCHLEVEL__)
# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__)
# endif
#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__)
# define COMPILER_ID "Embarcadero"
# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF)
# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF)
# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF)
#elif defined(__BORLANDC__)
# define COMPILER_ID "Borland"
/* __BORLANDC__ = 0xVRR */
# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8)
# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF)
#elif defined(__WATCOMC__) && __WATCOMC__ < 1200
# define COMPILER_ID "Watcom"
/* __WATCOMC__ = VVRR */
# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100)
# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
# if (__WATCOMC__ % 10) > 0
# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
# endif
#elif defined(__WATCOMC__)
# define COMPILER_ID "OpenWatcom"
/* __WATCOMC__ = VVRP + 1100 */
# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100)
# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10)
# if (__WATCOMC__ % 10) > 0
# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10)
# endif
#elif defined(__SUNPRO_CC)
# define COMPILER_ID "SunPro"
# if __SUNPRO_CC >= 0x5100
/* __SUNPRO_CC = 0xVRRP */
# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12)
# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF)
# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF)
# else
/* __SUNPRO_CC = 0xVRP */
# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8)
# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF)
# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF)
# endif
#elif defined(__HP_aCC)
# define COMPILER_ID "HP"
/* __HP_aCC = VVRRPP */
# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000)
# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100)
# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100)
#elif defined(__DECCXX)
# define COMPILER_ID "Compaq"
/* __DECCXX_VER = VVRRTPPPP */
# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000)
# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100)
# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000)
#elif defined(__IBMCPP__) && defined(__COMPILER_VER__)
# define COMPILER_ID "zOS"
/* __IBMCPP__ = VRP */
# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
#elif defined(__ibmxl__) && defined(__clang__)
# define COMPILER_ID "XLClang"
# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__)
# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__)
# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__)
# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__)
#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800
# define COMPILER_ID "XL"
/* __IBMCPP__ = VRP */
# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800
# define COMPILER_ID "VisualAge"
/* __IBMCPP__ = VRP */
# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100)
# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10)
# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10)
#elif defined(__PGI)
# define COMPILER_ID "PGI"
# define COMPILER_VERSION_MAJOR DEC(__PGIC__)
# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__)
# if defined(__PGIC_PATCHLEVEL__)
# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__)
# endif
#elif defined(_CRAYC)
# define COMPILER_ID "Cray"
# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR)
# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR)
#elif defined(__TI_COMPILER_VERSION__)
# define COMPILER_ID "TI"
/* __TI_COMPILER_VERSION__ = VVVRRRPPP */
# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000)
# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000)
# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000)
#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version)
# define COMPILER_ID "Fujitsu"
#elif defined(__ghs__)
# define COMPILER_ID "GHS"
/* __GHS_VERSION_NUMBER = VVVVRP */
# ifdef __GHS_VERSION_NUMBER
# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100)
# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10)
# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10)
# endif
#elif defined(__SCO_VERSION__)
# define COMPILER_ID "SCO"
#elif defined(__ARMCC_VERSION) && !defined(__clang__)
# define COMPILER_ID "ARMCC"
#if __ARMCC_VERSION >= 1000000
/* __ARMCC_VERSION = VRRPPPP */
# define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000)
# define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100)
# define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
#else
/* __ARMCC_VERSION = VRPPPP */
# define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000)
# define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10)
# define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000)
#endif
#elif defined(__clang__) && defined(__apple_build_version__)
# define COMPILER_ID "AppleClang"
# if defined(_MSC_VER)
# define SIMULATE_ID "MSVC"
# endif
# define COMPILER_VERSION_MAJOR DEC(__clang_major__)
# define COMPILER_VERSION_MINOR DEC(__clang_minor__)
# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
# if defined(_MSC_VER)
/* _MSC_VER = VVRR */
# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
# endif
# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__)
#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION)
# define COMPILER_ID "ARMClang"
# define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000)
# define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100)
# define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000)
# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION)
#elif defined(__clang__)
# define COMPILER_ID "Clang"
# if defined(_MSC_VER)
# define SIMULATE_ID "MSVC"
# endif
# define COMPILER_VERSION_MAJOR DEC(__clang_major__)
# define COMPILER_VERSION_MINOR DEC(__clang_minor__)
# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__)
# if defined(_MSC_VER)
/* _MSC_VER = VVRR */
# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100)
# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100)
# endif
#elif defined(__GNUC__) || defined(__GNUG__)
# define COMPILER_ID "GNU"
# if defined(__GNUC__)
# define COMPILER_VERSION_MAJOR DEC(__GNUC__)
# else
# define COMPILER_VERSION_MAJOR DEC(__GNUG__)
# endif
# if defined(__GNUC_MINOR__)
# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__)
# endif
# if defined(__GNUC_PATCHLEVEL__)
# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__)
# endif
#elif defined(_MSC_VER)
# define COMPILER_ID "MSVC"
/* _MSC_VER = VVRR */
# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100)
# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100)
# if defined(_MSC_FULL_VER)
# if _MSC_VER >= 1400
/* _MSC_FULL_VER = VVRRPPPPP */
# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000)
# else
/* _MSC_FULL_VER = VVRRPPPP */
# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000)
# endif
# endif
# if defined(_MSC_BUILD)
# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD)
# endif
#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
# define COMPILER_ID "ADSP"
#if defined(__VISUALDSPVERSION__)
/* __VISUALDSPVERSION__ = 0xVVRRPP00 */
# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24)
# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF)
# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF)
#endif
#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
# define COMPILER_ID "IAR"
# if defined(__VER__) && defined(__ICCARM__)
# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000)
# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000)
# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000)
# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__))
# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100)
# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100))
# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__)
# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__)
# endif
/* These compilers are either not known or too old to define an
identification macro. Try to identify the platform and guess that
it is the native compiler. */
#elif defined(__hpux) || defined(__hpua)
# define COMPILER_ID "HP"
#else /* unknown compiler */
# define COMPILER_ID ""
#endif
/* Construct the string literal in pieces to prevent the source from
getting matched. Store it in a pointer rather than an array
because some compilers will just produce instructions to fill the
array rather than assigning a pointer to a static array. */
char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]";
#ifdef SIMULATE_ID
char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]";
#endif
#ifdef __QNXNTO__
char const* qnxnto = "INFO" ":" "qnxnto[]";
#endif
#if defined(__CRAYXE) || defined(__CRAYXC)
char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]";
#endif
#define STRINGIFY_HELPER(X) #X
#define STRINGIFY(X) STRINGIFY_HELPER(X)
/* Identify known platforms by name. */
#if defined(__linux) || defined(__linux__) || defined(linux)
# define PLATFORM_ID "Linux"
#elif defined(__CYGWIN__)
# define PLATFORM_ID "Cygwin"
#elif defined(__MINGW32__)
# define PLATFORM_ID "MinGW"
#elif defined(__APPLE__)
# define PLATFORM_ID "Darwin"
#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
# define PLATFORM_ID "Windows"
#elif defined(__FreeBSD__) || defined(__FreeBSD)
# define PLATFORM_ID "FreeBSD"
#elif defined(__NetBSD__) || defined(__NetBSD)
# define PLATFORM_ID "NetBSD"
#elif defined(__OpenBSD__) || defined(__OPENBSD)
# define PLATFORM_ID "OpenBSD"
#elif defined(__sun) || defined(sun)
# define PLATFORM_ID "SunOS"
#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__)
# define PLATFORM_ID "AIX"
#elif defined(__hpux) || defined(__hpux__)
# define PLATFORM_ID "HP-UX"
#elif defined(__HAIKU__)
# define PLATFORM_ID "Haiku"
#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS)
# define PLATFORM_ID "BeOS"
#elif defined(__QNX__) || defined(__QNXNTO__)
# define PLATFORM_ID "QNX"
#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__)
# define PLATFORM_ID "Tru64"
#elif defined(__riscos) || defined(__riscos__)
# define PLATFORM_ID "RISCos"
#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__)
# define PLATFORM_ID "SINIX"
#elif defined(__UNIX_SV__)
# define PLATFORM_ID "UNIX_SV"
#elif defined(__bsdos__)
# define PLATFORM_ID "BSDOS"
#elif defined(_MPRAS) || defined(MPRAS)
# define PLATFORM_ID "MP-RAS"
#elif defined(__osf) || defined(__osf__)
# define PLATFORM_ID "OSF1"
#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv)
# define PLATFORM_ID "SCO_SV"
#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX)
# define PLATFORM_ID "ULTRIX"
#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX)
# define PLATFORM_ID "Xenix"
#elif defined(__WATCOMC__)
# if defined(__LINUX__)
# define PLATFORM_ID "Linux"
# elif defined(__DOS__)
# define PLATFORM_ID "DOS"
# elif defined(__OS2__)
# define PLATFORM_ID "OS2"
# elif defined(__WINDOWS__)
# define PLATFORM_ID "Windows3x"
# else /* unknown platform */
# define PLATFORM_ID
# endif
#elif defined(__INTEGRITY)
# if defined(INT_178B)
# define PLATFORM_ID "Integrity178"
# else /* regular Integrity */
# define PLATFORM_ID "Integrity"
# endif
#else /* unknown platform */
# define PLATFORM_ID
#endif
/* For windows compilers MSVC and Intel we can determine
the architecture of the compiler being used. This is because
the compilers do not have flags that can change the architecture,
but rather depend on which compiler is being used
*/
#if defined(_WIN32) && defined(_MSC_VER)
# if defined(_M_IA64)
# define ARCHITECTURE_ID "IA64"
# elif defined(_M_X64) || defined(_M_AMD64)
# define ARCHITECTURE_ID "x64"
# elif defined(_M_IX86)
# define ARCHITECTURE_ID "X86"
# elif defined(_M_ARM64)
# define ARCHITECTURE_ID "ARM64"
# elif defined(_M_ARM)
# if _M_ARM == 4
# define ARCHITECTURE_ID "ARMV4I"
# elif _M_ARM == 5
# define ARCHITECTURE_ID "ARMV5I"
# else
# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM)
# endif
# elif defined(_M_MIPS)
# define ARCHITECTURE_ID "MIPS"
# elif defined(_M_SH)
# define ARCHITECTURE_ID "SHx"
# else /* unknown architecture */
# define ARCHITECTURE_ID ""
# endif
#elif defined(__WATCOMC__)
# if defined(_M_I86)
# define ARCHITECTURE_ID "I86"
# elif defined(_M_IX86)
# define ARCHITECTURE_ID "X86"
# else /* unknown architecture */
# define ARCHITECTURE_ID ""
# endif
#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC)
# if defined(__ICCARM__)
# define ARCHITECTURE_ID "ARM"
# elif defined(__ICCRX__)
# define ARCHITECTURE_ID "RX"
# elif defined(__ICCRH850__)
# define ARCHITECTURE_ID "RH850"
# elif defined(__ICCRL78__)
# define ARCHITECTURE_ID "RL78"
# elif defined(__ICCRISCV__)
# define ARCHITECTURE_ID "RISCV"
# elif defined(__ICCAVR__)
# define ARCHITECTURE_ID "AVR"
# elif defined(__ICC430__)
# define ARCHITECTURE_ID "MSP430"
# elif defined(__ICCV850__)
# define ARCHITECTURE_ID "V850"
# elif defined(__ICC8051__)
# define ARCHITECTURE_ID "8051"
# else /* unknown architecture */
# define ARCHITECTURE_ID ""
# endif
#elif defined(__ghs__)
# if defined(__PPC64__)
# define ARCHITECTURE_ID "PPC64"
# elif defined(__ppc__)
# define ARCHITECTURE_ID "PPC"
# elif defined(__ARM__)
# define ARCHITECTURE_ID "ARM"
# elif defined(__x86_64__)
# define ARCHITECTURE_ID "x64"
# elif defined(__i386__)
# define ARCHITECTURE_ID "X86"
# else /* unknown architecture */
# define ARCHITECTURE_ID ""
# endif
#else
# define ARCHITECTURE_ID
#endif
/* Convert integer to decimal digit literals. */
#define DEC(n) \
('0' + (((n) / 10000000)%10)), \
('0' + (((n) / 1000000)%10)), \
('0' + (((n) / 100000)%10)), \
('0' + (((n) / 10000)%10)), \
('0' + (((n) / 1000)%10)), \
('0' + (((n) / 100)%10)), \
('0' + (((n) / 10)%10)), \
('0' + ((n) % 10))
/* Convert integer to hex digit literals. */
#define HEX(n) \
('0' + ((n)>>28 & 0xF)), \
('0' + ((n)>>24 & 0xF)), \
('0' + ((n)>>20 & 0xF)), \
('0' + ((n)>>16 & 0xF)), \
('0' + ((n)>>12 & 0xF)), \
('0' + ((n)>>8 & 0xF)), \
('0' + ((n)>>4 & 0xF)), \
('0' + ((n) & 0xF))
/* Construct a string literal encoding the version number components. */
#ifdef COMPILER_VERSION_MAJOR
char const info_version[] = {
'I', 'N', 'F', 'O', ':',
'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[',
COMPILER_VERSION_MAJOR,
# ifdef COMPILER_VERSION_MINOR
'.', COMPILER_VERSION_MINOR,
# ifdef COMPILER_VERSION_PATCH
'.', COMPILER_VERSION_PATCH,
# ifdef COMPILER_VERSION_TWEAK
'.', COMPILER_VERSION_TWEAK,
# endif
# endif
# endif
']','\0'};
#endif
/* Construct a string literal encoding the internal version number. */
#ifdef COMPILER_VERSION_INTERNAL
char const info_version_internal[] = {
'I', 'N', 'F', 'O', ':',
'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_',
'i','n','t','e','r','n','a','l','[',
COMPILER_VERSION_INTERNAL,']','\0'};
#endif
/* Construct a string literal encoding the version number components. */
#ifdef SIMULATE_VERSION_MAJOR
char const info_simulate_version[] = {
'I', 'N', 'F', 'O', ':',
's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[',
SIMULATE_VERSION_MAJOR,
# ifdef SIMULATE_VERSION_MINOR
'.', SIMULATE_VERSION_MINOR,
# ifdef SIMULATE_VERSION_PATCH
'.', SIMULATE_VERSION_PATCH,
# ifdef SIMULATE_VERSION_TWEAK
'.', SIMULATE_VERSION_TWEAK,
# endif
# endif
# endif
']','\0'};
#endif
/* Construct the string literal in pieces to prevent the source from
getting matched. Store it in a pointer rather than an array
because some compilers will just produce instructions to fill the
array rather than assigning a pointer to a static array. */
char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]";
char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]";
#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) && _MSVC_LANG < 201403L
# if defined(__INTEL_CXX11_MODE__)
# if defined(__cpp_aggregate_nsdmi)
# define CXX_STD 201402L
# else
# define CXX_STD 201103L
# endif
# else
# define CXX_STD 199711L
# endif
#elif defined(_MSC_VER) && defined(_MSVC_LANG)
# define CXX_STD _MSVC_LANG
#else
# define CXX_STD __cplusplus
#endif
const char* info_language_dialect_default = "INFO" ":" "dialect_default["
#if CXX_STD > 201703L
"20"
#elif CXX_STD >= 201703L
"17"
#elif CXX_STD >= 201402L
"14"
#elif CXX_STD >= 201103L
"11"
#else
"98"
#endif
"]";
/*--------------------------------------------------------------------------*/
int main(int argc, char* argv[])
{
int require = 0;
require += info_compiler[argc];
require += info_platform[argc];
#ifdef COMPILER_VERSION_MAJOR
require += info_version[argc];
#endif
#ifdef COMPILER_VERSION_INTERNAL
require += info_version_internal[argc];
#endif
#ifdef SIMULATE_ID
require += info_simulate[argc];
#endif
#ifdef SIMULATE_VERSION_MAJOR
require += info_simulate_version[argc];
#endif
#if defined(__CRAYXE) || defined(__CRAYXC)
require += info_cray[argc];
#endif
require += info_language_dialect_default[argc];
(void)argv;
return require;
}

@ -0,0 +1,16 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.16
# Relative path conversion top directories.
set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild")
set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild")
# Force unix paths in dependencies.
set(CMAKE_FORCE_UNIX_PATHS 1)
# The C and CXX include file regular expressions for this directory.
set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$")
set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$")
set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN})
set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN})

@ -0,0 +1,58 @@
Performing C SOURCE FILE Test CMAKE_HAVE_LIBC_PTHREAD failed with the following output:
Change Dir: /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp
Run Build Command(s):/usr/bin/make cmTC_68c3f/fast && /usr/bin/make -f CMakeFiles/cmTC_68c3f.dir/build.make CMakeFiles/cmTC_68c3f.dir/build
make[1]: 进入目录“/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp”
Building C object CMakeFiles/cmTC_68c3f.dir/src.c.o
/usr/bin/cc -DCMAKE_HAVE_LIBC_PTHREAD -o CMakeFiles/cmTC_68c3f.dir/src.c.o -c /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp/src.c
Linking C executable cmTC_68c3f
/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_68c3f.dir/link.txt --verbose=1
/usr/bin/cc -DCMAKE_HAVE_LIBC_PTHREAD CMakeFiles/cmTC_68c3f.dir/src.c.o -o cmTC_68c3f
/usr/bin/ld: CMakeFiles/cmTC_68c3f.dir/src.c.o: in function `main':
src.c:(.text+0x46): undefined reference to `pthread_create'
/usr/bin/ld: src.c:(.text+0x52): undefined reference to `pthread_detach'
/usr/bin/ld: src.c:(.text+0x63): undefined reference to `pthread_join'
collect2: error: ld returned 1 exit status
make[1]: *** [CMakeFiles/cmTC_68c3f.dir/build.make:87cmTC_68c3f] 错误 1
make[1]: 离开目录“/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp”
make: *** [Makefile:121cmTC_68c3f/fast] 错误 2
Source file was:
#include <pthread.h>
void* test_func(void* data)
{
return data;
}
int main(void)
{
pthread_t thread;
pthread_create(&thread, NULL, test_func, NULL);
pthread_detach(thread);
pthread_join(thread, NULL);
pthread_atfork(NULL, NULL, NULL);
pthread_exit(NULL);
return 0;
}
Determining if the function pthread_create exists in the pthreads failed with the following output:
Change Dir: /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp
Run Build Command(s):/usr/bin/make cmTC_0275e/fast && /usr/bin/make -f CMakeFiles/cmTC_0275e.dir/build.make CMakeFiles/cmTC_0275e.dir/build
make[1]: 进入目录“/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp”
Building C object CMakeFiles/cmTC_0275e.dir/CheckFunctionExists.c.o
/usr/bin/cc -DCHECK_FUNCTION_EXISTS=pthread_create -o CMakeFiles/cmTC_0275e.dir/CheckFunctionExists.c.o -c /usr/share/cmake-3.16/Modules/CheckFunctionExists.c
Linking C executable cmTC_0275e
/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_0275e.dir/link.txt --verbose=1
/usr/bin/cc -DCHECK_FUNCTION_EXISTS=pthread_create CMakeFiles/cmTC_0275e.dir/CheckFunctionExists.c.o -o cmTC_0275e -lpthreads
/usr/bin/ld: 找不到 -lpthreads
collect2: error: ld returned 1 exit status
make[1]: *** [CMakeFiles/cmTC_0275e.dir/build.make:87cmTC_0275e] 错误 1
make[1]: 离开目录“/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp”
make: *** [Makefile:121cmTC_0275e/fast] 错误 2

@ -0,0 +1,489 @@
The system is: Linux - 5.15.0-139-generic - x86_64
Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded.
Compiler: /usr/bin/cc
Build flags:
Id flags:
The output was:
0
Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "a.out"
The C compiler identification is GNU, found in "/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/3.16.3/CompilerIdC/a.out"
Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded.
Compiler: /usr/bin/c++
Build flags:
Id flags:
The output was:
0
Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "a.out"
The CXX compiler identification is GNU, found in "/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/3.16.3/CompilerIdCXX/a.out"
Determining if the C compiler works passed with the following output:
Change Dir: /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp
Run Build Command(s):/usr/bin/make cmTC_b2262/fast && /usr/bin/make -f CMakeFiles/cmTC_b2262.dir/build.make CMakeFiles/cmTC_b2262.dir/build
make[1]: 进入目录“/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp”
Building C object CMakeFiles/cmTC_b2262.dir/testCCompiler.c.o
/usr/bin/cc -o CMakeFiles/cmTC_b2262.dir/testCCompiler.c.o -c /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp/testCCompiler.c
Linking C executable cmTC_b2262
/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_b2262.dir/link.txt --verbose=1
/usr/bin/cc CMakeFiles/cmTC_b2262.dir/testCCompiler.c.o -o cmTC_b2262
make[1]: 离开目录“/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp”
Detecting C compiler ABI info compiled with the following output:
Change Dir: /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp
Run Build Command(s):/usr/bin/make cmTC_bd38e/fast && /usr/bin/make -f CMakeFiles/cmTC_bd38e.dir/build.make CMakeFiles/cmTC_bd38e.dir/build
make[1]: Entering directory '/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp'
Building C object CMakeFiles/cmTC_bd38e.dir/CMakeCCompilerABI.c.o
/usr/bin/cc -v -o CMakeFiles/cmTC_bd38e.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake-3.16/Modules/CMakeCCompilerABI.c
Using built-in specs.
COLLECT_GCC=/usr/bin/cc
OFFLOAD_TARGET_NAMES=nvptx-none:hsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04.2' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-9QDOt0/gcc-9-9.4.0/debian/tmp-nvptx/usr,hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)
COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_bd38e.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64'
/usr/lib/gcc/x86_64-linux-gnu/9/cc1 -quiet -v -imultiarch x86_64-linux-gnu /usr/share/cmake-3.16/Modules/CMakeCCompilerABI.c -quiet -dumpbase CMakeCCompilerABI.c -mtune=generic -march=x86-64 -auxbase-strip CMakeFiles/cmTC_bd38e.dir/CMakeCCompilerABI.c.o -version -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/ccuM6Has.s
GNU C17 (Ubuntu 9.4.0-1ubuntu1~20.04.2) version 9.4.0 (x86_64-linux-gnu)
compiled by GNU C version 9.4.0, GMP version 6.2.0, MPFR version 4.0.2, MPC version 1.1.0, isl version isl-0.22.1-GMP
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/9/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/x86_64-linux-gnu/9/include
/usr/local/include
/usr/include/x86_64-linux-gnu
/usr/include
End of search list.
GNU C17 (Ubuntu 9.4.0-1ubuntu1~20.04.2) version 9.4.0 (x86_64-linux-gnu)
compiled by GNU C version 9.4.0, GMP version 6.2.0, MPFR version 4.0.2, MPC version 1.1.0, isl version isl-0.22.1-GMP
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 01da938ff5dc2163489aa33cb3b747a7
COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_bd38e.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64'
as -v --64 -o CMakeFiles/cmTC_bd38e.dir/CMakeCCompilerABI.c.o /tmp/ccuM6Has.s
GNU assembler version 2.34 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.34
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_bd38e.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64'
Linking C executable cmTC_bd38e
/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_bd38e.dir/link.txt --verbose=1
/usr/bin/cc -v CMakeFiles/cmTC_bd38e.dir/CMakeCCompilerABI.c.o -o cmTC_bd38e
Using built-in specs.
COLLECT_GCC=/usr/bin/cc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:hsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04.2' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-9QDOt0/gcc-9-9.4.0/debian/tmp-nvptx/usr,hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_bd38e' '-mtune=generic' '-march=x86-64'
/usr/lib/gcc/x86_64-linux-gnu/9/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/9/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper -plugin-opt=-fresolution=/tmp/ccmd6p6Q.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_bd38e /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/9/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/9 -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/9/../../.. CMakeFiles/cmTC_bd38e.dir/CMakeCCompilerABI.c.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-linux-gnu/9/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crtn.o
COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_bd38e' '-mtune=generic' '-march=x86-64'
make[1]: Leaving directory '/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp'
Parsed C implicit include dir info from above output: rv=done
found start of include info
found start of implicit include info
add: [/usr/lib/gcc/x86_64-linux-gnu/9/include]
add: [/usr/local/include]
add: [/usr/include/x86_64-linux-gnu]
add: [/usr/include]
end of search list found
collapse include dir [/usr/lib/gcc/x86_64-linux-gnu/9/include] ==> [/usr/lib/gcc/x86_64-linux-gnu/9/include]
collapse include dir [/usr/local/include] ==> [/usr/local/include]
collapse include dir [/usr/include/x86_64-linux-gnu] ==> [/usr/include/x86_64-linux-gnu]
collapse include dir [/usr/include] ==> [/usr/include]
implicit include dirs: [/usr/lib/gcc/x86_64-linux-gnu/9/include;/usr/local/include;/usr/include/x86_64-linux-gnu;/usr/include]
Parsed C implicit link information from above output:
link line regex: [^( *|.*[/\])(ld|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\]+-)?ld|collect2)[^/\]*( |$)]
ignore line: [Change Dir: /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp]
ignore line: []
ignore line: [Run Build Command(s):/usr/bin/make cmTC_bd38e/fast && /usr/bin/make -f CMakeFiles/cmTC_bd38e.dir/build.make CMakeFiles/cmTC_bd38e.dir/build]
ignore line: [make[1]: Entering directory '/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp']
ignore line: [Building C object CMakeFiles/cmTC_bd38e.dir/CMakeCCompilerABI.c.o]
ignore line: [/usr/bin/cc -v -o CMakeFiles/cmTC_bd38e.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake-3.16/Modules/CMakeCCompilerABI.c]
ignore line: [Using built-in specs.]
ignore line: [COLLECT_GCC=/usr/bin/cc]
ignore line: [OFFLOAD_TARGET_NAMES=nvptx-none:hsa]
ignore line: [OFFLOAD_TARGET_DEFAULT=1]
ignore line: [Target: x86_64-linux-gnu]
ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04.2' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c ada c++ go brig d fortran objc obj-c++ gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32 m64 mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-9QDOt0/gcc-9-9.4.0/debian/tmp-nvptx/usr hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu]
ignore line: [Thread model: posix]
ignore line: [gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2) ]
ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_bd38e.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64']
ignore line: [ /usr/lib/gcc/x86_64-linux-gnu/9/cc1 -quiet -v -imultiarch x86_64-linux-gnu /usr/share/cmake-3.16/Modules/CMakeCCompilerABI.c -quiet -dumpbase CMakeCCompilerABI.c -mtune=generic -march=x86-64 -auxbase-strip CMakeFiles/cmTC_bd38e.dir/CMakeCCompilerABI.c.o -version -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/ccuM6Has.s]
ignore line: [GNU C17 (Ubuntu 9.4.0-1ubuntu1~20.04.2) version 9.4.0 (x86_64-linux-gnu)]
ignore line: [ compiled by GNU C version 9.4.0 GMP version 6.2.0 MPFR version 4.0.2 MPC version 1.1.0 isl version isl-0.22.1-GMP]
ignore line: []
ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072]
ignore line: [ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"]
ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed"]
ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/9/../../../../x86_64-linux-gnu/include"]
ignore line: [#include "..." search starts here:]
ignore line: [#include <...> search starts here:]
ignore line: [ /usr/lib/gcc/x86_64-linux-gnu/9/include]
ignore line: [ /usr/local/include]
ignore line: [ /usr/include/x86_64-linux-gnu]
ignore line: [ /usr/include]
ignore line: [End of search list.]
ignore line: [GNU C17 (Ubuntu 9.4.0-1ubuntu1~20.04.2) version 9.4.0 (x86_64-linux-gnu)]
ignore line: [ compiled by GNU C version 9.4.0 GMP version 6.2.0 MPFR version 4.0.2 MPC version 1.1.0 isl version isl-0.22.1-GMP]
ignore line: []
ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072]
ignore line: [Compiler executable checksum: 01da938ff5dc2163489aa33cb3b747a7]
ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_bd38e.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64']
ignore line: [ as -v --64 -o CMakeFiles/cmTC_bd38e.dir/CMakeCCompilerABI.c.o /tmp/ccuM6Has.s]
ignore line: [GNU assembler version 2.34 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.34]
ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/]
ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../:/lib/:/usr/lib/]
ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_bd38e.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64']
ignore line: [Linking C executable cmTC_bd38e]
ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_bd38e.dir/link.txt --verbose=1]
ignore line: [/usr/bin/cc -v CMakeFiles/cmTC_bd38e.dir/CMakeCCompilerABI.c.o -o cmTC_bd38e ]
ignore line: [Using built-in specs.]
ignore line: [COLLECT_GCC=/usr/bin/cc]
ignore line: [COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper]
ignore line: [OFFLOAD_TARGET_NAMES=nvptx-none:hsa]
ignore line: [OFFLOAD_TARGET_DEFAULT=1]
ignore line: [Target: x86_64-linux-gnu]
ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04.2' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c ada c++ go brig d fortran objc obj-c++ gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32 m64 mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-9QDOt0/gcc-9-9.4.0/debian/tmp-nvptx/usr hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu]
ignore line: [Thread model: posix]
ignore line: [gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2) ]
ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/]
ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../:/lib/:/usr/lib/]
ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_bd38e' '-mtune=generic' '-march=x86-64']
link line: [ /usr/lib/gcc/x86_64-linux-gnu/9/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/9/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper -plugin-opt=-fresolution=/tmp/ccmd6p6Q.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_bd38e /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/9/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/9 -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/9/../../.. CMakeFiles/cmTC_bd38e.dir/CMakeCCompilerABI.c.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-linux-gnu/9/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crtn.o]
arg [/usr/lib/gcc/x86_64-linux-gnu/9/collect2] ==> ignore
arg [-plugin] ==> ignore
arg [/usr/lib/gcc/x86_64-linux-gnu/9/liblto_plugin.so] ==> ignore
arg [-plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper] ==> ignore
arg [-plugin-opt=-fresolution=/tmp/ccmd6p6Q.res] ==> ignore
arg [-plugin-opt=-pass-through=-lgcc] ==> ignore
arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore
arg [-plugin-opt=-pass-through=-lc] ==> ignore
arg [-plugin-opt=-pass-through=-lgcc] ==> ignore
arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore
arg [--build-id] ==> ignore
arg [--eh-frame-hdr] ==> ignore
arg [-m] ==> ignore
arg [elf_x86_64] ==> ignore
arg [--hash-style=gnu] ==> ignore
arg [--as-needed] ==> ignore
arg [-dynamic-linker] ==> ignore
arg [/lib64/ld-linux-x86-64.so.2] ==> ignore
arg [-pie] ==> ignore
arg [-znow] ==> ignore
arg [-zrelro] ==> ignore
arg [-o] ==> ignore
arg [cmTC_bd38e] ==> ignore
arg [/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o] ==> ignore
arg [/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crti.o] ==> ignore
arg [/usr/lib/gcc/x86_64-linux-gnu/9/crtbeginS.o] ==> ignore
arg [-L/usr/lib/gcc/x86_64-linux-gnu/9] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/9]
arg [-L/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu]
arg [-L/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib]
arg [-L/lib/x86_64-linux-gnu] ==> dir [/lib/x86_64-linux-gnu]
arg [-L/lib/../lib] ==> dir [/lib/../lib]
arg [-L/usr/lib/x86_64-linux-gnu] ==> dir [/usr/lib/x86_64-linux-gnu]
arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib]
arg [-L/usr/lib/gcc/x86_64-linux-gnu/9/../../..] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/9/../../..]
arg [CMakeFiles/cmTC_bd38e.dir/CMakeCCompilerABI.c.o] ==> ignore
arg [-lgcc] ==> lib [gcc]
arg [--push-state] ==> ignore
arg [--as-needed] ==> ignore
arg [-lgcc_s] ==> lib [gcc_s]
arg [--pop-state] ==> ignore
arg [-lc] ==> lib [c]
arg [-lgcc] ==> lib [gcc]
arg [--push-state] ==> ignore
arg [--as-needed] ==> ignore
arg [-lgcc_s] ==> lib [gcc_s]
arg [--pop-state] ==> ignore
arg [/usr/lib/gcc/x86_64-linux-gnu/9/crtendS.o] ==> ignore
arg [/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crtn.o] ==> ignore
collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/9] ==> [/usr/lib/gcc/x86_64-linux-gnu/9]
collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu]
collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib] ==> [/usr/lib]
collapse library dir [/lib/x86_64-linux-gnu] ==> [/lib/x86_64-linux-gnu]
collapse library dir [/lib/../lib] ==> [/lib]
collapse library dir [/usr/lib/x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu]
collapse library dir [/usr/lib/../lib] ==> [/usr/lib]
collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/9/../../..] ==> [/usr/lib]
implicit libs: [gcc;gcc_s;c;gcc;gcc_s]
implicit dirs: [/usr/lib/gcc/x86_64-linux-gnu/9;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib]
implicit fwks: []
Determining if the CXX compiler works passed with the following output:
Change Dir: /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp
Run Build Command(s):/usr/bin/make cmTC_d9cc3/fast && /usr/bin/make -f CMakeFiles/cmTC_d9cc3.dir/build.make CMakeFiles/cmTC_d9cc3.dir/build
make[1]: 进入目录“/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp”
Building CXX object CMakeFiles/cmTC_d9cc3.dir/testCXXCompiler.cxx.o
/usr/bin/c++ -o CMakeFiles/cmTC_d9cc3.dir/testCXXCompiler.cxx.o -c /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp/testCXXCompiler.cxx
Linking CXX executable cmTC_d9cc3
/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_d9cc3.dir/link.txt --verbose=1
/usr/bin/c++ CMakeFiles/cmTC_d9cc3.dir/testCXXCompiler.cxx.o -o cmTC_d9cc3
make[1]: 离开目录“/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp”
Detecting CXX compiler ABI info compiled with the following output:
Change Dir: /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp
Run Build Command(s):/usr/bin/make cmTC_a390d/fast && /usr/bin/make -f CMakeFiles/cmTC_a390d.dir/build.make CMakeFiles/cmTC_a390d.dir/build
make[1]: Entering directory '/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp'
Building CXX object CMakeFiles/cmTC_a390d.dir/CMakeCXXCompilerABI.cpp.o
/usr/bin/c++ -v -o CMakeFiles/cmTC_a390d.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-3.16/Modules/CMakeCXXCompilerABI.cpp
Using built-in specs.
COLLECT_GCC=/usr/bin/c++
OFFLOAD_TARGET_NAMES=nvptx-none:hsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04.2' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-9QDOt0/gcc-9-9.4.0/debian/tmp-nvptx/usr,hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)
COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_a390d.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
/usr/lib/gcc/x86_64-linux-gnu/9/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE /usr/share/cmake-3.16/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpbase CMakeCXXCompilerABI.cpp -mtune=generic -march=x86-64 -auxbase-strip CMakeFiles/cmTC_a390d.dir/CMakeCXXCompilerABI.cpp.o -version -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/cc9GDHsn.s
GNU C++14 (Ubuntu 9.4.0-1ubuntu1~20.04.2) version 9.4.0 (x86_64-linux-gnu)
compiled by GNU C version 9.4.0, GMP version 6.2.0, MPFR version 4.0.2, MPC version 1.1.0, isl version isl-0.22.1-GMP
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring duplicate directory "/usr/include/x86_64-linux-gnu/c++/9"
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/9/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/include/c++/9
/usr/include/x86_64-linux-gnu/c++/9
/usr/include/c++/9/backward
/usr/lib/gcc/x86_64-linux-gnu/9/include
/usr/local/include
/usr/include/x86_64-linux-gnu
/usr/include
End of search list.
GNU C++14 (Ubuntu 9.4.0-1ubuntu1~20.04.2) version 9.4.0 (x86_64-linux-gnu)
compiled by GNU C version 9.4.0, GMP version 6.2.0, MPFR version 4.0.2, MPC version 1.1.0, isl version isl-0.22.1-GMP
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 3d1eba838554fa2348dba760e4770469
COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_a390d.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
as -v --64 -o CMakeFiles/cmTC_a390d.dir/CMakeCXXCompilerABI.cpp.o /tmp/cc9GDHsn.s
GNU assembler version 2.34 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.34
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_a390d.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
Linking CXX executable cmTC_a390d
/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_a390d.dir/link.txt --verbose=1
/usr/bin/c++ -v CMakeFiles/cmTC_a390d.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_a390d
Using built-in specs.
COLLECT_GCC=/usr/bin/c++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:hsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04.2' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-9QDOt0/gcc-9-9.4.0/debian/tmp-nvptx/usr,hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_a390d' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
/usr/lib/gcc/x86_64-linux-gnu/9/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/9/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper -plugin-opt=-fresolution=/tmp/ccQZGpfR.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_a390d /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/9/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/9 -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/9/../../.. CMakeFiles/cmTC_a390d.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/9/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crtn.o
COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_a390d' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
make[1]: Leaving directory '/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp'
Parsed CXX implicit include dir info from above output: rv=done
found start of include info
found start of implicit include info
add: [/usr/include/c++/9]
add: [/usr/include/x86_64-linux-gnu/c++/9]
add: [/usr/include/c++/9/backward]
add: [/usr/lib/gcc/x86_64-linux-gnu/9/include]
add: [/usr/local/include]
add: [/usr/include/x86_64-linux-gnu]
add: [/usr/include]
end of search list found
collapse include dir [/usr/include/c++/9] ==> [/usr/include/c++/9]
collapse include dir [/usr/include/x86_64-linux-gnu/c++/9] ==> [/usr/include/x86_64-linux-gnu/c++/9]
collapse include dir [/usr/include/c++/9/backward] ==> [/usr/include/c++/9/backward]
collapse include dir [/usr/lib/gcc/x86_64-linux-gnu/9/include] ==> [/usr/lib/gcc/x86_64-linux-gnu/9/include]
collapse include dir [/usr/local/include] ==> [/usr/local/include]
collapse include dir [/usr/include/x86_64-linux-gnu] ==> [/usr/include/x86_64-linux-gnu]
collapse include dir [/usr/include] ==> [/usr/include]
implicit include dirs: [/usr/include/c++/9;/usr/include/x86_64-linux-gnu/c++/9;/usr/include/c++/9/backward;/usr/lib/gcc/x86_64-linux-gnu/9/include;/usr/local/include;/usr/include/x86_64-linux-gnu;/usr/include]
Parsed CXX implicit link information from above output:
link line regex: [^( *|.*[/\])(ld|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\]+-)?ld|collect2)[^/\]*( |$)]
ignore line: [Change Dir: /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp]
ignore line: []
ignore line: [Run Build Command(s):/usr/bin/make cmTC_a390d/fast && /usr/bin/make -f CMakeFiles/cmTC_a390d.dir/build.make CMakeFiles/cmTC_a390d.dir/build]
ignore line: [make[1]: Entering directory '/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp']
ignore line: [Building CXX object CMakeFiles/cmTC_a390d.dir/CMakeCXXCompilerABI.cpp.o]
ignore line: [/usr/bin/c++ -v -o CMakeFiles/cmTC_a390d.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-3.16/Modules/CMakeCXXCompilerABI.cpp]
ignore line: [Using built-in specs.]
ignore line: [COLLECT_GCC=/usr/bin/c++]
ignore line: [OFFLOAD_TARGET_NAMES=nvptx-none:hsa]
ignore line: [OFFLOAD_TARGET_DEFAULT=1]
ignore line: [Target: x86_64-linux-gnu]
ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04.2' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c ada c++ go brig d fortran objc obj-c++ gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32 m64 mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-9QDOt0/gcc-9-9.4.0/debian/tmp-nvptx/usr hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu]
ignore line: [Thread model: posix]
ignore line: [gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2) ]
ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_a390d.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64']
ignore line: [ /usr/lib/gcc/x86_64-linux-gnu/9/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE /usr/share/cmake-3.16/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpbase CMakeCXXCompilerABI.cpp -mtune=generic -march=x86-64 -auxbase-strip CMakeFiles/cmTC_a390d.dir/CMakeCXXCompilerABI.cpp.o -version -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/cc9GDHsn.s]
ignore line: [GNU C++14 (Ubuntu 9.4.0-1ubuntu1~20.04.2) version 9.4.0 (x86_64-linux-gnu)]
ignore line: [ compiled by GNU C version 9.4.0 GMP version 6.2.0 MPFR version 4.0.2 MPC version 1.1.0 isl version isl-0.22.1-GMP]
ignore line: []
ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072]
ignore line: [ignoring duplicate directory "/usr/include/x86_64-linux-gnu/c++/9"]
ignore line: [ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"]
ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed"]
ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/9/../../../../x86_64-linux-gnu/include"]
ignore line: [#include "..." search starts here:]
ignore line: [#include <...> search starts here:]
ignore line: [ /usr/include/c++/9]
ignore line: [ /usr/include/x86_64-linux-gnu/c++/9]
ignore line: [ /usr/include/c++/9/backward]
ignore line: [ /usr/lib/gcc/x86_64-linux-gnu/9/include]
ignore line: [ /usr/local/include]
ignore line: [ /usr/include/x86_64-linux-gnu]
ignore line: [ /usr/include]
ignore line: [End of search list.]
ignore line: [GNU C++14 (Ubuntu 9.4.0-1ubuntu1~20.04.2) version 9.4.0 (x86_64-linux-gnu)]
ignore line: [ compiled by GNU C version 9.4.0 GMP version 6.2.0 MPFR version 4.0.2 MPC version 1.1.0 isl version isl-0.22.1-GMP]
ignore line: []
ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072]
ignore line: [Compiler executable checksum: 3d1eba838554fa2348dba760e4770469]
ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_a390d.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64']
ignore line: [ as -v --64 -o CMakeFiles/cmTC_a390d.dir/CMakeCXXCompilerABI.cpp.o /tmp/cc9GDHsn.s]
ignore line: [GNU assembler version 2.34 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.34]
ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/]
ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../:/lib/:/usr/lib/]
ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_a390d.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64']
ignore line: [Linking CXX executable cmTC_a390d]
ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_a390d.dir/link.txt --verbose=1]
ignore line: [/usr/bin/c++ -v CMakeFiles/cmTC_a390d.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_a390d ]
ignore line: [Using built-in specs.]
ignore line: [COLLECT_GCC=/usr/bin/c++]
ignore line: [COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper]
ignore line: [OFFLOAD_TARGET_NAMES=nvptx-none:hsa]
ignore line: [OFFLOAD_TARGET_DEFAULT=1]
ignore line: [Target: x86_64-linux-gnu]
ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04.2' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c ada c++ go brig d fortran objc obj-c++ gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32 m64 mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-9QDOt0/gcc-9-9.4.0/debian/tmp-nvptx/usr hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu]
ignore line: [Thread model: posix]
ignore line: [gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2) ]
ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/]
ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/9/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/9/../../../:/lib/:/usr/lib/]
ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_a390d' '-shared-libgcc' '-mtune=generic' '-march=x86-64']
link line: [ /usr/lib/gcc/x86_64-linux-gnu/9/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/9/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper -plugin-opt=-fresolution=/tmp/ccQZGpfR.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_a390d /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/9/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/9 -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/9/../../.. CMakeFiles/cmTC_a390d.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/9/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crtn.o]
arg [/usr/lib/gcc/x86_64-linux-gnu/9/collect2] ==> ignore
arg [-plugin] ==> ignore
arg [/usr/lib/gcc/x86_64-linux-gnu/9/liblto_plugin.so] ==> ignore
arg [-plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper] ==> ignore
arg [-plugin-opt=-fresolution=/tmp/ccQZGpfR.res] ==> ignore
arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore
arg [-plugin-opt=-pass-through=-lgcc] ==> ignore
arg [-plugin-opt=-pass-through=-lc] ==> ignore
arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore
arg [-plugin-opt=-pass-through=-lgcc] ==> ignore
arg [--build-id] ==> ignore
arg [--eh-frame-hdr] ==> ignore
arg [-m] ==> ignore
arg [elf_x86_64] ==> ignore
arg [--hash-style=gnu] ==> ignore
arg [--as-needed] ==> ignore
arg [-dynamic-linker] ==> ignore
arg [/lib64/ld-linux-x86-64.so.2] ==> ignore
arg [-pie] ==> ignore
arg [-znow] ==> ignore
arg [-zrelro] ==> ignore
arg [-o] ==> ignore
arg [cmTC_a390d] ==> ignore
arg [/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o] ==> ignore
arg [/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crti.o] ==> ignore
arg [/usr/lib/gcc/x86_64-linux-gnu/9/crtbeginS.o] ==> ignore
arg [-L/usr/lib/gcc/x86_64-linux-gnu/9] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/9]
arg [-L/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu]
arg [-L/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib]
arg [-L/lib/x86_64-linux-gnu] ==> dir [/lib/x86_64-linux-gnu]
arg [-L/lib/../lib] ==> dir [/lib/../lib]
arg [-L/usr/lib/x86_64-linux-gnu] ==> dir [/usr/lib/x86_64-linux-gnu]
arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib]
arg [-L/usr/lib/gcc/x86_64-linux-gnu/9/../../..] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/9/../../..]
arg [CMakeFiles/cmTC_a390d.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore
arg [-lstdc++] ==> lib [stdc++]
arg [-lm] ==> lib [m]
arg [-lgcc_s] ==> lib [gcc_s]
arg [-lgcc] ==> lib [gcc]
arg [-lc] ==> lib [c]
arg [-lgcc_s] ==> lib [gcc_s]
arg [-lgcc] ==> lib [gcc]
arg [/usr/lib/gcc/x86_64-linux-gnu/9/crtendS.o] ==> ignore
arg [/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/crtn.o] ==> ignore
collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/9] ==> [/usr/lib/gcc/x86_64-linux-gnu/9]
collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu]
collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib] ==> [/usr/lib]
collapse library dir [/lib/x86_64-linux-gnu] ==> [/lib/x86_64-linux-gnu]
collapse library dir [/lib/../lib] ==> [/lib]
collapse library dir [/usr/lib/x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu]
collapse library dir [/usr/lib/../lib] ==> [/usr/lib]
collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/9/../../..] ==> [/usr/lib]
implicit libs: [stdc++;m;gcc_s;gcc;c;gcc_s;gcc]
implicit dirs: [/usr/lib/gcc/x86_64-linux-gnu/9;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib]
implicit fwks: []
Determining if the include file pthread.h exists passed with the following output:
Change Dir: /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp
Run Build Command(s):/usr/bin/make cmTC_563c8/fast && /usr/bin/make -f CMakeFiles/cmTC_563c8.dir/build.make CMakeFiles/cmTC_563c8.dir/build
make[1]: 进入目录“/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp”
Building C object CMakeFiles/cmTC_563c8.dir/CheckIncludeFile.c.o
/usr/bin/cc -o CMakeFiles/cmTC_563c8.dir/CheckIncludeFile.c.o -c /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp/CheckIncludeFile.c
Linking C executable cmTC_563c8
/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_563c8.dir/link.txt --verbose=1
/usr/bin/cc CMakeFiles/cmTC_563c8.dir/CheckIncludeFile.c.o -o cmTC_563c8
make[1]: 离开目录“/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp”
Determining if the function pthread_create exists in the pthread passed with the following output:
Change Dir: /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp
Run Build Command(s):/usr/bin/make cmTC_225ee/fast && /usr/bin/make -f CMakeFiles/cmTC_225ee.dir/build.make CMakeFiles/cmTC_225ee.dir/build
make[1]: 进入目录“/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp”
Building C object CMakeFiles/cmTC_225ee.dir/CheckFunctionExists.c.o
/usr/bin/cc -DCHECK_FUNCTION_EXISTS=pthread_create -o CMakeFiles/cmTC_225ee.dir/CheckFunctionExists.c.o -c /usr/share/cmake-3.16/Modules/CheckFunctionExists.c
Linking C executable cmTC_225ee
/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_225ee.dir/link.txt --verbose=1
/usr/bin/cc -DCHECK_FUNCTION_EXISTS=pthread_create CMakeFiles/cmTC_225ee.dir/CheckFunctionExists.c.o -o cmTC_225ee -lpthread
make[1]: 离开目录“/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/CMakeTmp”

@ -0,0 +1,2 @@
# Hashes of file build rules.
1518310fb919f63527edc05b17edc129 CMakeFiles/clean_test_results

@ -0,0 +1,250 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.16
# The generator used is:
set(CMAKE_DEPENDS_GENERATOR "Unix Makefiles")
# The top level Makefile was generated from the following files:
set(CMAKE_MAKEFILE_DEPENDS
"CMakeCache.txt"
"CMakeFiles/3.16.3/CMakeCCompiler.cmake"
"CMakeFiles/3.16.3/CMakeCXXCompiler.cmake"
"CMakeFiles/3.16.3/CMakeSystem.cmake"
"CMakeLists.txt"
"catkin/catkin_generated/version/package.cmake"
"catkin_generated/installspace/_setup_util.py"
"catkin_generated/package.cmake"
"package.xml"
"/opt/ros/noetic/share/catkin/cmake/all.cmake"
"/opt/ros/noetic/share/catkin/cmake/assert.cmake"
"/opt/ros/noetic/share/catkin/cmake/atomic_configure_file.cmake"
"/opt/ros/noetic/share/catkin/cmake/catkinConfig-version.cmake"
"/opt/ros/noetic/share/catkin/cmake/catkinConfig.cmake"
"/opt/ros/noetic/share/catkin/cmake/catkin_add_env_hooks.cmake"
"/opt/ros/noetic/share/catkin/cmake/catkin_destinations.cmake"
"/opt/ros/noetic/share/catkin/cmake/catkin_download.cmake"
"/opt/ros/noetic/share/catkin/cmake/catkin_generate_environment.cmake"
"/opt/ros/noetic/share/catkin/cmake/catkin_install_python.cmake"
"/opt/ros/noetic/share/catkin/cmake/catkin_libraries.cmake"
"/opt/ros/noetic/share/catkin/cmake/catkin_metapackage.cmake"
"/opt/ros/noetic/share/catkin/cmake/catkin_package.cmake"
"/opt/ros/noetic/share/catkin/cmake/catkin_package_xml.cmake"
"/opt/ros/noetic/share/catkin/cmake/catkin_python_setup.cmake"
"/opt/ros/noetic/share/catkin/cmake/catkin_symlink_install.cmake"
"/opt/ros/noetic/share/catkin/cmake/catkin_workspace.cmake"
"/opt/ros/noetic/share/catkin/cmake/custom_install.cmake"
"/opt/ros/noetic/share/catkin/cmake/debug_message.cmake"
"/opt/ros/noetic/share/catkin/cmake/em/pkg.pc.em"
"/opt/ros/noetic/share/catkin/cmake/em_expand.cmake"
"/opt/ros/noetic/share/catkin/cmake/empy.cmake"
"/opt/ros/noetic/share/catkin/cmake/find_program_required.cmake"
"/opt/ros/noetic/share/catkin/cmake/interrogate_setup_dot_py.py"
"/opt/ros/noetic/share/catkin/cmake/legacy.cmake"
"/opt/ros/noetic/share/catkin/cmake/list_append_deduplicate.cmake"
"/opt/ros/noetic/share/catkin/cmake/list_append_unique.cmake"
"/opt/ros/noetic/share/catkin/cmake/list_insert_in_workspace_order.cmake"
"/opt/ros/noetic/share/catkin/cmake/platform/lsb.cmake"
"/opt/ros/noetic/share/catkin/cmake/platform/ubuntu.cmake"
"/opt/ros/noetic/share/catkin/cmake/platform/windows.cmake"
"/opt/ros/noetic/share/catkin/cmake/python.cmake"
"/opt/ros/noetic/share/catkin/cmake/safe_execute_process.cmake"
"/opt/ros/noetic/share/catkin/cmake/stamp.cmake"
"/opt/ros/noetic/share/catkin/cmake/string_starts_with.cmake"
"/opt/ros/noetic/share/catkin/cmake/templates/_setup_util.py.in"
"/opt/ros/noetic/share/catkin/cmake/templates/env.sh.in"
"/opt/ros/noetic/share/catkin/cmake/templates/generate_cached_setup.py.in"
"/opt/ros/noetic/share/catkin/cmake/templates/local_setup.bash.in"
"/opt/ros/noetic/share/catkin/cmake/templates/local_setup.fish.in"
"/opt/ros/noetic/share/catkin/cmake/templates/local_setup.sh.in"
"/opt/ros/noetic/share/catkin/cmake/templates/local_setup.zsh.in"
"/opt/ros/noetic/share/catkin/cmake/templates/pkg.context.pc.in"
"/opt/ros/noetic/share/catkin/cmake/templates/pkgConfig-version.cmake.in"
"/opt/ros/noetic/share/catkin/cmake/templates/pkgConfig.cmake.in"
"/opt/ros/noetic/share/catkin/cmake/templates/rosinstall.in"
"/opt/ros/noetic/share/catkin/cmake/templates/setup.bash.in"
"/opt/ros/noetic/share/catkin/cmake/templates/setup.fish.in"
"/opt/ros/noetic/share/catkin/cmake/templates/setup.sh.in"
"/opt/ros/noetic/share/catkin/cmake/templates/setup.zsh.in"
"/opt/ros/noetic/share/catkin/cmake/test/catkin_download_test_data.cmake"
"/opt/ros/noetic/share/catkin/cmake/test/gtest.cmake"
"/opt/ros/noetic/share/catkin/cmake/test/nosetests.cmake"
"/opt/ros/noetic/share/catkin/cmake/test/tests.cmake"
"/opt/ros/noetic/share/catkin/cmake/tools/doxygen.cmake"
"/opt/ros/noetic/share/catkin/cmake/tools/libraries.cmake"
"/opt/ros/noetic/share/catkin/cmake/tools/rt.cmake"
"/opt/ros/noetic/share/catkin/package.xml"
"/usr/share/cmake-3.16/Modules/CMakeCCompiler.cmake.in"
"/usr/share/cmake-3.16/Modules/CMakeCCompilerABI.c"
"/usr/share/cmake-3.16/Modules/CMakeCInformation.cmake"
"/usr/share/cmake-3.16/Modules/CMakeCXXCompiler.cmake.in"
"/usr/share/cmake-3.16/Modules/CMakeCXXCompilerABI.cpp"
"/usr/share/cmake-3.16/Modules/CMakeCXXInformation.cmake"
"/usr/share/cmake-3.16/Modules/CMakeCheckCompilerFlagCommonPatterns.cmake"
"/usr/share/cmake-3.16/Modules/CMakeCommonLanguageInclude.cmake"
"/usr/share/cmake-3.16/Modules/CMakeCompilerIdDetection.cmake"
"/usr/share/cmake-3.16/Modules/CMakeDependentOption.cmake"
"/usr/share/cmake-3.16/Modules/CMakeDetermineCCompiler.cmake"
"/usr/share/cmake-3.16/Modules/CMakeDetermineCXXCompiler.cmake"
"/usr/share/cmake-3.16/Modules/CMakeDetermineCompileFeatures.cmake"
"/usr/share/cmake-3.16/Modules/CMakeDetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/CMakeDetermineCompilerABI.cmake"
"/usr/share/cmake-3.16/Modules/CMakeDetermineCompilerId.cmake"
"/usr/share/cmake-3.16/Modules/CMakeDetermineSystem.cmake"
"/usr/share/cmake-3.16/Modules/CMakeFindBinUtils.cmake"
"/usr/share/cmake-3.16/Modules/CMakeGenericSystem.cmake"
"/usr/share/cmake-3.16/Modules/CMakeInitializeConfigs.cmake"
"/usr/share/cmake-3.16/Modules/CMakeLanguageInformation.cmake"
"/usr/share/cmake-3.16/Modules/CMakeParseArguments.cmake"
"/usr/share/cmake-3.16/Modules/CMakeParseImplicitIncludeInfo.cmake"
"/usr/share/cmake-3.16/Modules/CMakeParseImplicitLinkInfo.cmake"
"/usr/share/cmake-3.16/Modules/CMakeSystem.cmake.in"
"/usr/share/cmake-3.16/Modules/CMakeSystemSpecificInformation.cmake"
"/usr/share/cmake-3.16/Modules/CMakeSystemSpecificInitialize.cmake"
"/usr/share/cmake-3.16/Modules/CMakeTestCCompiler.cmake"
"/usr/share/cmake-3.16/Modules/CMakeTestCXXCompiler.cmake"
"/usr/share/cmake-3.16/Modules/CMakeTestCompilerCommon.cmake"
"/usr/share/cmake-3.16/Modules/CMakeUnixFindMake.cmake"
"/usr/share/cmake-3.16/Modules/CheckCSourceCompiles.cmake"
"/usr/share/cmake-3.16/Modules/CheckFunctionExists.c"
"/usr/share/cmake-3.16/Modules/CheckIncludeFile.c.in"
"/usr/share/cmake-3.16/Modules/CheckIncludeFile.cmake"
"/usr/share/cmake-3.16/Modules/CheckLibraryExists.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/ADSP-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/ARMCC-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/ARMClang-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/AppleClang-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/Borland-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/Bruce-C-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/CMakeCommonCompilerMacros.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/Clang-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/Clang-DetermineCompilerInternal.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/Compaq-C-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/Cray-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/Embarcadero-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/Fujitsu-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/GHS-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/GNU-C-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/GNU-C.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/GNU-CXX.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/GNU-FindBinUtils.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/GNU.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/HP-C-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/HP-CXX-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/IAR-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/Intel-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/MSVC-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/NVIDIA-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/PGI-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/PathScale-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/SCO-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/SDCC-C-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/SunPro-C-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/TI-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/Watcom-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/XL-C-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/XL-CXX-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/XLClang-C-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/zOS-C-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake"
"/usr/share/cmake-3.16/Modules/DartConfiguration.tcl.in"
"/usr/share/cmake-3.16/Modules/FindGTest.cmake"
"/usr/share/cmake-3.16/Modules/FindPackageHandleStandardArgs.cmake"
"/usr/share/cmake-3.16/Modules/FindPackageMessage.cmake"
"/usr/share/cmake-3.16/Modules/FindPythonInterp.cmake"
"/usr/share/cmake-3.16/Modules/FindThreads.cmake"
"/usr/share/cmake-3.16/Modules/GNUInstallDirs.cmake"
"/usr/share/cmake-3.16/Modules/GoogleTest.cmake"
"/usr/share/cmake-3.16/Modules/Internal/CMakeCheckCompilerFlag.cmake"
"/usr/share/cmake-3.16/Modules/Internal/FeatureTesting.cmake"
"/usr/share/cmake-3.16/Modules/Platform/Linux-Determine-CXX.cmake"
"/usr/share/cmake-3.16/Modules/Platform/Linux-GNU-C.cmake"
"/usr/share/cmake-3.16/Modules/Platform/Linux-GNU-CXX.cmake"
"/usr/share/cmake-3.16/Modules/Platform/Linux-GNU.cmake"
"/usr/share/cmake-3.16/Modules/Platform/Linux.cmake"
"/usr/share/cmake-3.16/Modules/Platform/UnixPaths.cmake"
"/usr/src/googletest/CMakeLists.txt"
"/usr/src/googletest/googlemock/CMakeLists.txt"
"/usr/src/googletest/googletest/CMakeLists.txt"
"/usr/src/googletest/googletest/cmake/internal_utils.cmake"
)
# The corresponding makefile is:
set(CMAKE_MAKEFILE_OUTPUTS
"Makefile"
"CMakeFiles/cmake.check_cache"
)
# Byproducts of CMake generate step:
set(CMAKE_MAKEFILE_PRODUCTS
"CMakeFiles/3.16.3/CMakeSystem.cmake"
"CMakeFiles/3.16.3/CMakeCCompiler.cmake"
"CMakeFiles/3.16.3/CMakeCXXCompiler.cmake"
"CMakeFiles/3.16.3/CMakeCCompiler.cmake"
"CMakeFiles/3.16.3/CMakeCXXCompiler.cmake"
"CTestConfiguration.ini"
"catkin_generated/stamps/catkin_tools_prebuild/package.xml.stamp"
"atomic_configure/_setup_util.py.4bscr"
"atomic_configure/env.sh.HvqFl"
"atomic_configure/setup.bash.ae6J6"
"atomic_configure/local_setup.bash.hFOEf"
"atomic_configure/setup.sh.B68Do"
"atomic_configure/local_setup.sh.H97kj"
"atomic_configure/setup.zsh.odGzO"
"atomic_configure/local_setup.zsh.K94LD"
"atomic_configure/setup.fish.f2GaO"
"atomic_configure/local_setup.fish.SQsa2"
"atomic_configure/.rosinstall.n8MbA"
"catkin_generated/installspace/_setup_util.py"
"catkin_generated/stamps/catkin_tools_prebuild/_setup_util.py.stamp"
"catkin_generated/installspace/env.sh"
"catkin_generated/installspace/setup.bash"
"catkin_generated/installspace/local_setup.bash"
"catkin_generated/installspace/setup.sh"
"catkin_generated/installspace/local_setup.sh"
"catkin_generated/installspace/setup.zsh"
"catkin_generated/installspace/local_setup.zsh"
"catkin_generated/installspace/setup.fish"
"catkin_generated/installspace/local_setup.fish"
"catkin_generated/installspace/.rosinstall"
"catkin_generated/generate_cached_setup.py"
"catkin_generated/env_cached.sh"
"catkin_generated/stamps/catkin_tools_prebuild/interrogate_setup_dot_py.py.stamp"
"catkin_generated/stamps/catkin_tools_prebuild/package.xml.stamp"
"catkin_generated/pkg.develspace.context.pc.py"
"catkin_generated/stamps/catkin_tools_prebuild/pkg.pc.em.stamp"
"/home/mc/ZhiTu/flash_detector_ws/devel/.private/catkin_tools_prebuild/share/catkin_tools_prebuild/cmake/catkin_tools_prebuildConfig.cmake"
"/home/mc/ZhiTu/flash_detector_ws/devel/.private/catkin_tools_prebuild/share/catkin_tools_prebuild/cmake/catkin_tools_prebuildConfig-version.cmake"
"catkin_generated/pkg.installspace.context.pc.py"
"catkin_generated/stamps/catkin_tools_prebuild/pkg.pc.em.stamp"
"catkin_generated/installspace/catkin_tools_prebuildConfig.cmake"
"catkin_generated/installspace/catkin_tools_prebuildConfig-version.cmake"
"CMakeFiles/CMakeDirectoryInformation.cmake"
"gtest/CMakeFiles/CMakeDirectoryInformation.cmake"
"gtest/googlemock/CMakeFiles/CMakeDirectoryInformation.cmake"
"gtest/googletest/CMakeFiles/CMakeDirectoryInformation.cmake"
)
# Dependency information for all targets:
set(CMAKE_DEPEND_INFO_FILES
"CMakeFiles/_catkin_empty_exported_target.dir/DependInfo.cmake"
"CMakeFiles/doxygen.dir/DependInfo.cmake"
"CMakeFiles/run_tests.dir/DependInfo.cmake"
"CMakeFiles/clean_test_results.dir/DependInfo.cmake"
"CMakeFiles/tests.dir/DependInfo.cmake"
"CMakeFiles/download_extra_data.dir/DependInfo.cmake"
"gtest/googlemock/CMakeFiles/gmock_main.dir/DependInfo.cmake"
"gtest/googlemock/CMakeFiles/gmock.dir/DependInfo.cmake"
"gtest/googletest/CMakeFiles/gtest_main.dir/DependInfo.cmake"
"gtest/googletest/CMakeFiles/gtest.dir/DependInfo.cmake"
)

@ -0,0 +1,413 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.16
# Default target executed when no arguments are given to make.
default_target: all
.PHONY : default_target
#=============================================================================
# Special targets provided by cmake.
# Disable implicit rules so canonical targets will work.
.SUFFIXES:
# Remove some rules from gmake that .SUFFIXES does not remove.
SUFFIXES =
.SUFFIXES: .hpux_make_needs_suffix_list
# Suppress display of executed commands.
$(VERBOSE).SILENT:
# A target that is always out of date.
cmake_force:
.PHONY : cmake_force
#=============================================================================
# Set environment variables for the build.
# The shell in which to execute make rules.
SHELL = /bin/sh
# The CMake executable.
CMAKE_COMMAND = /usr/bin/cmake
# The command to remove a file.
RM = /usr/bin/cmake -E remove -f
# Escaping for special characters.
EQUALS = =
# The top-level source directory on which CMake was run.
CMAKE_SOURCE_DIR = /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild
# The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild
#=============================================================================
# Directory level rules for the build root directory
# The main recursive "all" target.
all: gtest/all
.PHONY : all
# The main recursive "preinstall" target.
preinstall: gtest/preinstall
.PHONY : preinstall
# The main recursive "clean" target.
clean: CMakeFiles/_catkin_empty_exported_target.dir/clean
clean: CMakeFiles/doxygen.dir/clean
clean: CMakeFiles/run_tests.dir/clean
clean: CMakeFiles/clean_test_results.dir/clean
clean: CMakeFiles/tests.dir/clean
clean: CMakeFiles/download_extra_data.dir/clean
clean: gtest/clean
.PHONY : clean
#=============================================================================
# Directory level rules for directory gtest
# Recursive "all" directory target.
gtest/all: gtest/googlemock/all
.PHONY : gtest/all
# Recursive "preinstall" directory target.
gtest/preinstall: gtest/googlemock/preinstall
.PHONY : gtest/preinstall
# Recursive "clean" directory target.
gtest/clean: gtest/googlemock/clean
.PHONY : gtest/clean
#=============================================================================
# Directory level rules for directory gtest/googlemock
# Recursive "all" directory target.
gtest/googlemock/all: gtest/googletest/all
.PHONY : gtest/googlemock/all
# Recursive "preinstall" directory target.
gtest/googlemock/preinstall: gtest/googletest/preinstall
.PHONY : gtest/googlemock/preinstall
# Recursive "clean" directory target.
gtest/googlemock/clean: gtest/googlemock/CMakeFiles/gmock_main.dir/clean
gtest/googlemock/clean: gtest/googlemock/CMakeFiles/gmock.dir/clean
gtest/googlemock/clean: gtest/googletest/clean
.PHONY : gtest/googlemock/clean
#=============================================================================
# Directory level rules for directory gtest/googletest
# Recursive "all" directory target.
gtest/googletest/all:
.PHONY : gtest/googletest/all
# Recursive "preinstall" directory target.
gtest/googletest/preinstall:
.PHONY : gtest/googletest/preinstall
# Recursive "clean" directory target.
gtest/googletest/clean: gtest/googletest/CMakeFiles/gtest_main.dir/clean
gtest/googletest/clean: gtest/googletest/CMakeFiles/gtest.dir/clean
.PHONY : gtest/googletest/clean
#=============================================================================
# Target rules for target CMakeFiles/_catkin_empty_exported_target.dir
# All Build rule for target.
CMakeFiles/_catkin_empty_exported_target.dir/all:
$(MAKE) -f CMakeFiles/_catkin_empty_exported_target.dir/build.make CMakeFiles/_catkin_empty_exported_target.dir/depend
$(MAKE) -f CMakeFiles/_catkin_empty_exported_target.dir/build.make CMakeFiles/_catkin_empty_exported_target.dir/build
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles --progress-num= "Built target _catkin_empty_exported_target"
.PHONY : CMakeFiles/_catkin_empty_exported_target.dir/all
# Build rule for subdir invocation for target.
CMakeFiles/_catkin_empty_exported_target.dir/rule: cmake_check_build_system
$(CMAKE_COMMAND) -E cmake_progress_start /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles 0
$(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/_catkin_empty_exported_target.dir/all
$(CMAKE_COMMAND) -E cmake_progress_start /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles 0
.PHONY : CMakeFiles/_catkin_empty_exported_target.dir/rule
# Convenience name for target.
_catkin_empty_exported_target: CMakeFiles/_catkin_empty_exported_target.dir/rule
.PHONY : _catkin_empty_exported_target
# clean rule for target.
CMakeFiles/_catkin_empty_exported_target.dir/clean:
$(MAKE) -f CMakeFiles/_catkin_empty_exported_target.dir/build.make CMakeFiles/_catkin_empty_exported_target.dir/clean
.PHONY : CMakeFiles/_catkin_empty_exported_target.dir/clean
#=============================================================================
# Target rules for target CMakeFiles/doxygen.dir
# All Build rule for target.
CMakeFiles/doxygen.dir/all:
$(MAKE) -f CMakeFiles/doxygen.dir/build.make CMakeFiles/doxygen.dir/depend
$(MAKE) -f CMakeFiles/doxygen.dir/build.make CMakeFiles/doxygen.dir/build
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles --progress-num= "Built target doxygen"
.PHONY : CMakeFiles/doxygen.dir/all
# Build rule for subdir invocation for target.
CMakeFiles/doxygen.dir/rule: cmake_check_build_system
$(CMAKE_COMMAND) -E cmake_progress_start /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles 0
$(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/doxygen.dir/all
$(CMAKE_COMMAND) -E cmake_progress_start /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles 0
.PHONY : CMakeFiles/doxygen.dir/rule
# Convenience name for target.
doxygen: CMakeFiles/doxygen.dir/rule
.PHONY : doxygen
# clean rule for target.
CMakeFiles/doxygen.dir/clean:
$(MAKE) -f CMakeFiles/doxygen.dir/build.make CMakeFiles/doxygen.dir/clean
.PHONY : CMakeFiles/doxygen.dir/clean
#=============================================================================
# Target rules for target CMakeFiles/run_tests.dir
# All Build rule for target.
CMakeFiles/run_tests.dir/all:
$(MAKE) -f CMakeFiles/run_tests.dir/build.make CMakeFiles/run_tests.dir/depend
$(MAKE) -f CMakeFiles/run_tests.dir/build.make CMakeFiles/run_tests.dir/build
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles --progress-num= "Built target run_tests"
.PHONY : CMakeFiles/run_tests.dir/all
# Build rule for subdir invocation for target.
CMakeFiles/run_tests.dir/rule: cmake_check_build_system
$(CMAKE_COMMAND) -E cmake_progress_start /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles 0
$(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/run_tests.dir/all
$(CMAKE_COMMAND) -E cmake_progress_start /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles 0
.PHONY : CMakeFiles/run_tests.dir/rule
# Convenience name for target.
run_tests: CMakeFiles/run_tests.dir/rule
.PHONY : run_tests
# clean rule for target.
CMakeFiles/run_tests.dir/clean:
$(MAKE) -f CMakeFiles/run_tests.dir/build.make CMakeFiles/run_tests.dir/clean
.PHONY : CMakeFiles/run_tests.dir/clean
#=============================================================================
# Target rules for target CMakeFiles/clean_test_results.dir
# All Build rule for target.
CMakeFiles/clean_test_results.dir/all:
$(MAKE) -f CMakeFiles/clean_test_results.dir/build.make CMakeFiles/clean_test_results.dir/depend
$(MAKE) -f CMakeFiles/clean_test_results.dir/build.make CMakeFiles/clean_test_results.dir/build
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles --progress-num= "Built target clean_test_results"
.PHONY : CMakeFiles/clean_test_results.dir/all
# Build rule for subdir invocation for target.
CMakeFiles/clean_test_results.dir/rule: cmake_check_build_system
$(CMAKE_COMMAND) -E cmake_progress_start /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles 0
$(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/clean_test_results.dir/all
$(CMAKE_COMMAND) -E cmake_progress_start /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles 0
.PHONY : CMakeFiles/clean_test_results.dir/rule
# Convenience name for target.
clean_test_results: CMakeFiles/clean_test_results.dir/rule
.PHONY : clean_test_results
# clean rule for target.
CMakeFiles/clean_test_results.dir/clean:
$(MAKE) -f CMakeFiles/clean_test_results.dir/build.make CMakeFiles/clean_test_results.dir/clean
.PHONY : CMakeFiles/clean_test_results.dir/clean
#=============================================================================
# Target rules for target CMakeFiles/tests.dir
# All Build rule for target.
CMakeFiles/tests.dir/all:
$(MAKE) -f CMakeFiles/tests.dir/build.make CMakeFiles/tests.dir/depend
$(MAKE) -f CMakeFiles/tests.dir/build.make CMakeFiles/tests.dir/build
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles --progress-num= "Built target tests"
.PHONY : CMakeFiles/tests.dir/all
# Build rule for subdir invocation for target.
CMakeFiles/tests.dir/rule: cmake_check_build_system
$(CMAKE_COMMAND) -E cmake_progress_start /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles 0
$(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/tests.dir/all
$(CMAKE_COMMAND) -E cmake_progress_start /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles 0
.PHONY : CMakeFiles/tests.dir/rule
# Convenience name for target.
tests: CMakeFiles/tests.dir/rule
.PHONY : tests
# clean rule for target.
CMakeFiles/tests.dir/clean:
$(MAKE) -f CMakeFiles/tests.dir/build.make CMakeFiles/tests.dir/clean
.PHONY : CMakeFiles/tests.dir/clean
#=============================================================================
# Target rules for target CMakeFiles/download_extra_data.dir
# All Build rule for target.
CMakeFiles/download_extra_data.dir/all:
$(MAKE) -f CMakeFiles/download_extra_data.dir/build.make CMakeFiles/download_extra_data.dir/depend
$(MAKE) -f CMakeFiles/download_extra_data.dir/build.make CMakeFiles/download_extra_data.dir/build
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles --progress-num= "Built target download_extra_data"
.PHONY : CMakeFiles/download_extra_data.dir/all
# Build rule for subdir invocation for target.
CMakeFiles/download_extra_data.dir/rule: cmake_check_build_system
$(CMAKE_COMMAND) -E cmake_progress_start /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles 0
$(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/download_extra_data.dir/all
$(CMAKE_COMMAND) -E cmake_progress_start /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles 0
.PHONY : CMakeFiles/download_extra_data.dir/rule
# Convenience name for target.
download_extra_data: CMakeFiles/download_extra_data.dir/rule
.PHONY : download_extra_data
# clean rule for target.
CMakeFiles/download_extra_data.dir/clean:
$(MAKE) -f CMakeFiles/download_extra_data.dir/build.make CMakeFiles/download_extra_data.dir/clean
.PHONY : CMakeFiles/download_extra_data.dir/clean
#=============================================================================
# Target rules for target gtest/googlemock/CMakeFiles/gmock_main.dir
# All Build rule for target.
gtest/googlemock/CMakeFiles/gmock_main.dir/all: gtest/googlemock/CMakeFiles/gmock.dir/all
gtest/googlemock/CMakeFiles/gmock_main.dir/all: gtest/googletest/CMakeFiles/gtest.dir/all
$(MAKE) -f gtest/googlemock/CMakeFiles/gmock_main.dir/build.make gtest/googlemock/CMakeFiles/gmock_main.dir/depend
$(MAKE) -f gtest/googlemock/CMakeFiles/gmock_main.dir/build.make gtest/googlemock/CMakeFiles/gmock_main.dir/build
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles --progress-num=3,4 "Built target gmock_main"
.PHONY : gtest/googlemock/CMakeFiles/gmock_main.dir/all
# Build rule for subdir invocation for target.
gtest/googlemock/CMakeFiles/gmock_main.dir/rule: cmake_check_build_system
$(CMAKE_COMMAND) -E cmake_progress_start /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles 6
$(MAKE) -f CMakeFiles/Makefile2 gtest/googlemock/CMakeFiles/gmock_main.dir/all
$(CMAKE_COMMAND) -E cmake_progress_start /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles 0
.PHONY : gtest/googlemock/CMakeFiles/gmock_main.dir/rule
# Convenience name for target.
gmock_main: gtest/googlemock/CMakeFiles/gmock_main.dir/rule
.PHONY : gmock_main
# clean rule for target.
gtest/googlemock/CMakeFiles/gmock_main.dir/clean:
$(MAKE) -f gtest/googlemock/CMakeFiles/gmock_main.dir/build.make gtest/googlemock/CMakeFiles/gmock_main.dir/clean
.PHONY : gtest/googlemock/CMakeFiles/gmock_main.dir/clean
#=============================================================================
# Target rules for target gtest/googlemock/CMakeFiles/gmock.dir
# All Build rule for target.
gtest/googlemock/CMakeFiles/gmock.dir/all: gtest/googletest/CMakeFiles/gtest.dir/all
$(MAKE) -f gtest/googlemock/CMakeFiles/gmock.dir/build.make gtest/googlemock/CMakeFiles/gmock.dir/depend
$(MAKE) -f gtest/googlemock/CMakeFiles/gmock.dir/build.make gtest/googlemock/CMakeFiles/gmock.dir/build
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles --progress-num=1,2 "Built target gmock"
.PHONY : gtest/googlemock/CMakeFiles/gmock.dir/all
# Build rule for subdir invocation for target.
gtest/googlemock/CMakeFiles/gmock.dir/rule: cmake_check_build_system
$(CMAKE_COMMAND) -E cmake_progress_start /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles 4
$(MAKE) -f CMakeFiles/Makefile2 gtest/googlemock/CMakeFiles/gmock.dir/all
$(CMAKE_COMMAND) -E cmake_progress_start /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles 0
.PHONY : gtest/googlemock/CMakeFiles/gmock.dir/rule
# Convenience name for target.
gmock: gtest/googlemock/CMakeFiles/gmock.dir/rule
.PHONY : gmock
# clean rule for target.
gtest/googlemock/CMakeFiles/gmock.dir/clean:
$(MAKE) -f gtest/googlemock/CMakeFiles/gmock.dir/build.make gtest/googlemock/CMakeFiles/gmock.dir/clean
.PHONY : gtest/googlemock/CMakeFiles/gmock.dir/clean
#=============================================================================
# Target rules for target gtest/googletest/CMakeFiles/gtest_main.dir
# All Build rule for target.
gtest/googletest/CMakeFiles/gtest_main.dir/all: gtest/googletest/CMakeFiles/gtest.dir/all
$(MAKE) -f gtest/googletest/CMakeFiles/gtest_main.dir/build.make gtest/googletest/CMakeFiles/gtest_main.dir/depend
$(MAKE) -f gtest/googletest/CMakeFiles/gtest_main.dir/build.make gtest/googletest/CMakeFiles/gtest_main.dir/build
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles --progress-num=7,8 "Built target gtest_main"
.PHONY : gtest/googletest/CMakeFiles/gtest_main.dir/all
# Build rule for subdir invocation for target.
gtest/googletest/CMakeFiles/gtest_main.dir/rule: cmake_check_build_system
$(CMAKE_COMMAND) -E cmake_progress_start /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles 4
$(MAKE) -f CMakeFiles/Makefile2 gtest/googletest/CMakeFiles/gtest_main.dir/all
$(CMAKE_COMMAND) -E cmake_progress_start /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles 0
.PHONY : gtest/googletest/CMakeFiles/gtest_main.dir/rule
# Convenience name for target.
gtest_main: gtest/googletest/CMakeFiles/gtest_main.dir/rule
.PHONY : gtest_main
# clean rule for target.
gtest/googletest/CMakeFiles/gtest_main.dir/clean:
$(MAKE) -f gtest/googletest/CMakeFiles/gtest_main.dir/build.make gtest/googletest/CMakeFiles/gtest_main.dir/clean
.PHONY : gtest/googletest/CMakeFiles/gtest_main.dir/clean
#=============================================================================
# Target rules for target gtest/googletest/CMakeFiles/gtest.dir
# All Build rule for target.
gtest/googletest/CMakeFiles/gtest.dir/all:
$(MAKE) -f gtest/googletest/CMakeFiles/gtest.dir/build.make gtest/googletest/CMakeFiles/gtest.dir/depend
$(MAKE) -f gtest/googletest/CMakeFiles/gtest.dir/build.make gtest/googletest/CMakeFiles/gtest.dir/build
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles --progress-num=5,6 "Built target gtest"
.PHONY : gtest/googletest/CMakeFiles/gtest.dir/all
# Build rule for subdir invocation for target.
gtest/googletest/CMakeFiles/gtest.dir/rule: cmake_check_build_system
$(CMAKE_COMMAND) -E cmake_progress_start /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles 2
$(MAKE) -f CMakeFiles/Makefile2 gtest/googletest/CMakeFiles/gtest.dir/all
$(CMAKE_COMMAND) -E cmake_progress_start /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles 0
.PHONY : gtest/googletest/CMakeFiles/gtest.dir/rule
# Convenience name for target.
gtest: gtest/googletest/CMakeFiles/gtest.dir/rule
.PHONY : gtest
# clean rule for target.
gtest/googletest/CMakeFiles/gtest.dir/clean:
$(MAKE) -f gtest/googletest/CMakeFiles/gtest.dir/build.make gtest/googletest/CMakeFiles/gtest.dir/clean
.PHONY : gtest/googletest/CMakeFiles/gtest.dir/clean
#=============================================================================
# Special targets to cleanup operation of make.
# Special rule to run CMake to check the build system integrity.
# No rule that depends on this can have commands that come from listfiles
# because they might be regenerated.
cmake_check_build_system:
$(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
.PHONY : cmake_check_build_system

@ -0,0 +1,38 @@
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/install/strip.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/install/local.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/install.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/list_install_components.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/rebuild_cache.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/edit_cache.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/test.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/_catkin_empty_exported_target.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/doxygen.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/run_tests.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/clean_test_results.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/tests.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/download_extra_data.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest/CMakeFiles/install/strip.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest/CMakeFiles/install/local.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest/CMakeFiles/install.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest/CMakeFiles/list_install_components.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest/CMakeFiles/rebuild_cache.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest/CMakeFiles/edit_cache.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest/CMakeFiles/test.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest/googlemock/CMakeFiles/install/strip.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest/googlemock/CMakeFiles/install/local.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest/googlemock/CMakeFiles/install.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest/googlemock/CMakeFiles/list_install_components.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest/googlemock/CMakeFiles/rebuild_cache.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest/googlemock/CMakeFiles/edit_cache.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest/googlemock/CMakeFiles/test.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest/googlemock/CMakeFiles/gmock_main.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest/googlemock/CMakeFiles/gmock.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest/googletest/CMakeFiles/install/strip.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest/googletest/CMakeFiles/install/local.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest/googletest/CMakeFiles/install.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest/googletest/CMakeFiles/list_install_components.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest/googletest/CMakeFiles/rebuild_cache.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest/googletest/CMakeFiles/edit_cache.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest/googletest/CMakeFiles/test.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest/googletest/CMakeFiles/gtest_main.dir
/home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/gtest/googletest/CMakeFiles/gtest.dir

@ -0,0 +1,11 @@
# The set of languages for which implicit dependencies are needed:
set(CMAKE_DEPENDS_LANGUAGES
)
# The set of files for implicit dependencies of each language:
# Targets to which this target links.
set(CMAKE_TARGET_LINKED_INFO_FILES
)
# Fortran module output directory.
set(CMAKE_Fortran_TARGET_MODULE_DIR "")

@ -0,0 +1,72 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.16
# Delete rule output on recipe failure.
.DELETE_ON_ERROR:
#=============================================================================
# Special targets provided by cmake.
# Disable implicit rules so canonical targets will work.
.SUFFIXES:
# Remove some rules from gmake that .SUFFIXES does not remove.
SUFFIXES =
.SUFFIXES: .hpux_make_needs_suffix_list
# Suppress display of executed commands.
$(VERBOSE).SILENT:
# A target that is always out of date.
cmake_force:
.PHONY : cmake_force
#=============================================================================
# Set environment variables for the build.
# The shell in which to execute make rules.
SHELL = /bin/sh
# The CMake executable.
CMAKE_COMMAND = /usr/bin/cmake
# The command to remove a file.
RM = /usr/bin/cmake -E remove -f
# Escaping for special characters.
EQUALS = =
# The top-level source directory on which CMake was run.
CMAKE_SOURCE_DIR = /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild
# The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild
# Utility rule file for _catkin_empty_exported_target.
# Include the progress variables for this target.
include CMakeFiles/_catkin_empty_exported_target.dir/progress.make
_catkin_empty_exported_target: CMakeFiles/_catkin_empty_exported_target.dir/build.make
.PHONY : _catkin_empty_exported_target
# Rule to build all files generated by this target.
CMakeFiles/_catkin_empty_exported_target.dir/build: _catkin_empty_exported_target
.PHONY : CMakeFiles/_catkin_empty_exported_target.dir/build
CMakeFiles/_catkin_empty_exported_target.dir/clean:
$(CMAKE_COMMAND) -P CMakeFiles/_catkin_empty_exported_target.dir/cmake_clean.cmake
.PHONY : CMakeFiles/_catkin_empty_exported_target.dir/clean
CMakeFiles/_catkin_empty_exported_target.dir/depend:
cd /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/_catkin_empty_exported_target.dir/DependInfo.cmake --color=$(COLOR)
.PHONY : CMakeFiles/_catkin_empty_exported_target.dir/depend

@ -0,0 +1,5 @@
# Per-language clean rules from dependency scanning.
foreach(lang )
include(CMakeFiles/_catkin_empty_exported_target.dir/cmake_clean_${lang}.cmake OPTIONAL)
endforeach()

@ -0,0 +1,11 @@
# The set of languages for which implicit dependencies are needed:
set(CMAKE_DEPENDS_LANGUAGES
)
# The set of files for implicit dependencies of each language:
# Targets to which this target links.
set(CMAKE_TARGET_LINKED_INFO_FILES
)
# Fortran module output directory.
set(CMAKE_Fortran_TARGET_MODULE_DIR "")

@ -0,0 +1,76 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.16
# Delete rule output on recipe failure.
.DELETE_ON_ERROR:
#=============================================================================
# Special targets provided by cmake.
# Disable implicit rules so canonical targets will work.
.SUFFIXES:
# Remove some rules from gmake that .SUFFIXES does not remove.
SUFFIXES =
.SUFFIXES: .hpux_make_needs_suffix_list
# Suppress display of executed commands.
$(VERBOSE).SILENT:
# A target that is always out of date.
cmake_force:
.PHONY : cmake_force
#=============================================================================
# Set environment variables for the build.
# The shell in which to execute make rules.
SHELL = /bin/sh
# The CMake executable.
CMAKE_COMMAND = /usr/bin/cmake
# The command to remove a file.
RM = /usr/bin/cmake -E remove -f
# Escaping for special characters.
EQUALS = =
# The top-level source directory on which CMake was run.
CMAKE_SOURCE_DIR = /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild
# The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild
# Utility rule file for clean_test_results.
# Include the progress variables for this target.
include CMakeFiles/clean_test_results.dir/progress.make
CMakeFiles/clean_test_results:
/usr/bin/python3 /opt/ros/noetic/share/catkin/cmake/test/remove_test_results.py /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/test_results
clean_test_results: CMakeFiles/clean_test_results
clean_test_results: CMakeFiles/clean_test_results.dir/build.make
.PHONY : clean_test_results
# Rule to build all files generated by this target.
CMakeFiles/clean_test_results.dir/build: clean_test_results
.PHONY : CMakeFiles/clean_test_results.dir/build
CMakeFiles/clean_test_results.dir/clean:
$(CMAKE_COMMAND) -P CMakeFiles/clean_test_results.dir/cmake_clean.cmake
.PHONY : CMakeFiles/clean_test_results.dir/clean
CMakeFiles/clean_test_results.dir/depend:
cd /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/clean_test_results.dir/DependInfo.cmake --color=$(COLOR)
.PHONY : CMakeFiles/clean_test_results.dir/depend

@ -0,0 +1,8 @@
file(REMOVE_RECURSE
"CMakeFiles/clean_test_results"
)
# Per-language clean rules from dependency scanning.
foreach(lang )
include(CMakeFiles/clean_test_results.dir/cmake_clean_${lang}.cmake OPTIONAL)
endforeach()

@ -0,0 +1 @@
# This file is generated by cmake for dependency checking of the CMakeCache.txt file

@ -0,0 +1,11 @@
# The set of languages for which implicit dependencies are needed:
set(CMAKE_DEPENDS_LANGUAGES
)
# The set of files for implicit dependencies of each language:
# Targets to which this target links.
set(CMAKE_TARGET_LINKED_INFO_FILES
)
# Fortran module output directory.
set(CMAKE_Fortran_TARGET_MODULE_DIR "")

@ -0,0 +1,72 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.16
# Delete rule output on recipe failure.
.DELETE_ON_ERROR:
#=============================================================================
# Special targets provided by cmake.
# Disable implicit rules so canonical targets will work.
.SUFFIXES:
# Remove some rules from gmake that .SUFFIXES does not remove.
SUFFIXES =
.SUFFIXES: .hpux_make_needs_suffix_list
# Suppress display of executed commands.
$(VERBOSE).SILENT:
# A target that is always out of date.
cmake_force:
.PHONY : cmake_force
#=============================================================================
# Set environment variables for the build.
# The shell in which to execute make rules.
SHELL = /bin/sh
# The CMake executable.
CMAKE_COMMAND = /usr/bin/cmake
# The command to remove a file.
RM = /usr/bin/cmake -E remove -f
# Escaping for special characters.
EQUALS = =
# The top-level source directory on which CMake was run.
CMAKE_SOURCE_DIR = /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild
# The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild
# Utility rule file for download_extra_data.
# Include the progress variables for this target.
include CMakeFiles/download_extra_data.dir/progress.make
download_extra_data: CMakeFiles/download_extra_data.dir/build.make
.PHONY : download_extra_data
# Rule to build all files generated by this target.
CMakeFiles/download_extra_data.dir/build: download_extra_data
.PHONY : CMakeFiles/download_extra_data.dir/build
CMakeFiles/download_extra_data.dir/clean:
$(CMAKE_COMMAND) -P CMakeFiles/download_extra_data.dir/cmake_clean.cmake
.PHONY : CMakeFiles/download_extra_data.dir/clean
CMakeFiles/download_extra_data.dir/depend:
cd /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild /home/mc/ZhiTu/flash_detector_ws/build/catkin_tools_prebuild/CMakeFiles/download_extra_data.dir/DependInfo.cmake --color=$(COLOR)
.PHONY : CMakeFiles/download_extra_data.dir/depend

@ -0,0 +1,5 @@
# Per-language clean rules from dependency scanning.
foreach(lang )
include(CMakeFiles/download_extra_data.dir/cmake_clean_${lang}.cmake OPTIONAL)
endforeach()

@ -0,0 +1,11 @@
# The set of languages for which implicit dependencies are needed:
set(CMAKE_DEPENDS_LANGUAGES
)
# The set of files for implicit dependencies of each language:
# Targets to which this target links.
set(CMAKE_TARGET_LINKED_INFO_FILES
)
# Fortran module output directory.
set(CMAKE_Fortran_TARGET_MODULE_DIR "")

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save