拍照version

This commit is contained in:
flower
2026-02-02 17:06:20 +08:00
parent 47016c00a6
commit d2b7b833b6
111 changed files with 19371 additions and 997 deletions

View File

@@ -98,7 +98,7 @@ SkyLink 是一个多平台实时视频传输系统的通信协议,设计用于
3. 检查魔数是否为 0xAA55
✗ 否 → 丢弃该包
是 → 继续
是 → 继续
4. 根据 frame_id 找到对应的帧缓冲区
如果不存在 → 创建新的缓冲区

View File

@@ -165,6 +165,7 @@ data class DecodedFrame(
val lat: Double,
val lon: Double,
val alt: Double,
val photoNumber: Int = 0, // 照片编号从reserve字段提取
val receivedTime: Long = System.currentTimeMillis()
) {
override fun equals(other: Any?): Boolean {
@@ -207,6 +208,7 @@ data class FrameBuffer(
val lat: Double = 0.0,
val lon: Double = 0.0,
val alt: Double = 0.0,
val photoNumber: Int = 0, // 照片编号从reserve字段提取
val receiveTimestamp: Long = System.currentTimeMillis()
) {
/**

View File

@@ -89,7 +89,7 @@ class UdpReceiver(
Log.i(TAG, "UDP 接收缓冲区大小已设置为: ${socket!!.receiveBufferSize}")
}
Log.i(TAG, " UDP 接收器启动,监听端口 $listenPort")
Log.i(TAG, " UDP 接收器启动,监听端口 $listenPort")
startReceiving()
} catch (e: Exception) {
@@ -185,7 +185,8 @@ class UdpReceiver(
timestamp = header.timestamp,
lat = header.lat,
lon = header.lon,
alt = header.alt
alt = header.alt,
photoNumber = header.reserve // 从reserve字段提取照片编号
)
}
@@ -228,7 +229,8 @@ class UdpReceiver(
timestamp = frame.timestamp,
lat = frame.lat,
lon = frame.lon,
alt = frame.alt
alt = frame.alt,
photoNumber = frame.photoNumber // 传递照片编号
)
totalFrames++

View File

@@ -11,6 +11,9 @@
package com.skylink.app.ui
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.Color
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
@@ -19,6 +22,9 @@ import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import android.widget.EditText
import android.widget.ArrayAdapter
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import com.skylink.app.R
@@ -31,6 +37,10 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.text.SimpleDateFormat
import java.util.*
import okhttp3.*
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.RequestBody.Companion.toRequestBody
import org.json.JSONObject
class HomeFragment : Fragment(), UdpReceiverListener {
@@ -48,6 +58,16 @@ class HomeFragment : Fragment(), UdpReceiverListener {
private var statusTextView: TextView? = null
private var saveButton: Button? = null
private var recordButton: Button? = null
private var triggerCaptureButton: Button? = null
private var triggerCaptureOriginalButton: Button? = null
private var triggerCaptureThumbnailButton: Button? = null
// HTTP客户端用于调用ROS2服务
private val httpClient = OkHttpClient()
// ROS2节点配置
private var ros2NodeIp = "192.168.1.100" // 默认IP需要配置
private var ros2HttpPort = 8080
// ========================================================================
// 业务逻辑
@@ -56,6 +76,7 @@ class HomeFragment : Fragment(), UdpReceiverListener {
private var udpReceiver: UdpReceiver? = null
private var currentFrame: DecodedFrame? = null
private var isRecording = false
private var totalPhotosReceived = 0 // 接收到的总照片数
// ========================================================================
// 生命周期方法
@@ -92,6 +113,9 @@ class HomeFragment : Fragment(), UdpReceiverListener {
statusTextView = view.findViewById(R.id.status_text)
saveButton = view.findViewById(R.id.save_button)
recordButton = view.findViewById(R.id.record_button)
triggerCaptureButton = view.findViewById(R.id.trigger_capture_button)
triggerCaptureOriginalButton = view.findViewById(R.id.trigger_capture_original_button)
triggerCaptureThumbnailButton = view.findViewById(R.id.trigger_capture_thumbnail_button)
// 设置按钮点击监听
saveButton?.setOnClickListener {
@@ -101,6 +125,18 @@ class HomeFragment : Fragment(), UdpReceiverListener {
recordButton?.setOnClickListener {
onRecordToggled()
}
triggerCaptureButton?.setOnClickListener {
showTriggerCaptureDialog()
}
triggerCaptureOriginalButton?.setOnClickListener {
triggerCapture(0) // 原图模式
}
triggerCaptureThumbnailButton?.setOnClickListener {
triggerCapture(1) // 缩略图模式
}
}
// ========================================================================
@@ -126,6 +162,11 @@ class HomeFragment : Fragment(), UdpReceiverListener {
override fun onFrameDecoded(frame: DecodedFrame) {
currentFrame = frame
// 更新照片计数
if (frame.photoNumber > 0) {
totalPhotosReceived++
}
// 移到后台线程执行解码,避免阻塞 UI 线程,进而影响 UDP 接收协程(如果是单核或高负载)
lifecycleScope.launch(Dispatchers.Default) {
@@ -133,7 +174,13 @@ class HomeFragment : Fragment(), UdpReceiverListener {
if (bitmap != null) {
withContext(Dispatchers.Main) {
view?.let {
videoImageView?.setImageBitmap(bitmap)
// 在图像上叠加显示照片编号
val bitmapWithText = if (frame.photoNumber > 0) {
addPhotoNumberToBitmap(bitmap, frame.photoNumber)
} else {
bitmap
}
videoImageView?.setImageBitmap(bitmapWithText)
updateGpsInfo(frame)
}
}
@@ -142,10 +189,12 @@ class HomeFragment : Fragment(), UdpReceiverListener {
}
override fun onStatsUpdated(fps: Int, kbps: Int, packetLoss: Double) {
statsTextView?.text = String.format(
"FPS: %d\nSpeed: %d KB/s\nPacket Loss: %.1f%%",
fps, kbps, packetLoss
)
val statsText = StringBuilder()
statsText.append(String.format("FPS: %d\nSpeed: %d KB/s\nPacket Loss: %.1f%%", fps, kbps, packetLoss))
if (totalPhotosReceived > 0) {
statsText.append(String.format("\nTotal Photos: %d", totalPhotosReceived))
}
statsTextView?.text = statsText.toString()
}
override fun onError(message: String, exception: Exception?) {
@@ -201,4 +250,217 @@ class HomeFragment : Fragment(), UdpReceiverListener {
val formatter = SimpleDateFormat("HH:mm:ss", Locale.getDefault())
return formatter.format(Date(millis))
}
/**
* 在图像上叠加显示照片编号
*/
private fun addPhotoNumberToBitmap(bitmap: Bitmap, photoNumber: Int): Bitmap {
val mutableBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true)
val canvas = Canvas(mutableBitmap)
val text = "Photo #$photoNumber"
val paint = Paint().apply {
color = Color.WHITE
textSize = 48f
isAntiAlias = true
style = Paint.Style.FILL
}
val textPaint = Paint(paint)
val textBounds = android.graphics.Rect()
textPaint.getTextBounds(text, 0, text.length, textBounds)
// 绘制半透明背景
val bgPaint = Paint().apply {
color = Color.argb(180, 0, 0, 0)
style = Paint.Style.FILL
}
val padding = 10
canvas.drawRect(
10f, 10f,
(textBounds.width() + padding * 2).toFloat(),
(textBounds.height() + padding * 2).toFloat(),
bgPaint
)
// 绘制文字
canvas.drawText(text, (10 + padding).toFloat(), (10 + padding + textBounds.height()).toFloat(), textPaint)
return mutableBitmap
}
/**
* 显示触发拍照参数输入对话框
*/
private fun showTriggerCaptureDialog() {
val view = layoutInflater.inflate(R.layout.dialog_trigger_capture, null)
val durationEdit = view.findViewById<EditText>(R.id.duration_edit)
val countEdit = view.findViewById<EditText>(R.id.count_edit)
val intervalEdit = view.findViewById<EditText>(R.id.interval_edit)
val modeSpinner = view.findViewById<android.widget.Spinner>(R.id.mode_spinner)
// 设置Spinner适配器
val modes = arrayOf("原图", "缩略图")
val adapter = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_item, modes)
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
modeSpinner.adapter = adapter
// 设置默认值
durationEdit.setText("5.0")
countEdit.setText("10")
intervalEdit.setText("0.5")
AlertDialog.Builder(requireContext())
.setTitle("触发拍照")
.setView(view)
.setPositiveButton("确定") { _, _ ->
val duration = durationEdit.text.toString().toDoubleOrNull() ?: 5.0
val count = countEdit.text.toString().toIntOrNull() ?: 10
val interval = intervalEdit.text.toString().toDoubleOrNull() ?: 0.5
val mode = modeSpinner.selectedItemPosition // 0=原图, 1=缩略图
triggerCaptureWithParams(duration, count, interval, mode)
}
.setNegativeButton("取消", null)
.setNeutralButton("设置") { _, _ ->
// 显示IP和端口配置对话框
showConfigDialog()
}
.show()
}
/**
* 显示配置对话框IP和端口
*/
private fun showConfigDialog() {
val view = layoutInflater.inflate(android.R.layout.simple_list_item_2, null)
val ipEdit = EditText(requireContext())
ipEdit.hint = "ROS2节点IP地址"
ipEdit.setText(ros2NodeIp)
val portEdit = EditText(requireContext())
portEdit.hint = "HTTP端口"
portEdit.inputType = android.text.InputType.TYPE_CLASS_NUMBER
portEdit.setText(ros2HttpPort.toString())
val layout = android.widget.LinearLayout(requireContext()).apply {
orientation = android.widget.LinearLayout.VERTICAL
setPadding(50, 40, 50, 10)
addView(ipEdit)
addView(portEdit)
}
AlertDialog.Builder(requireContext())
.setTitle("ROS2节点配置")
.setView(layout)
.setPositiveButton("确定") { _, _ ->
ros2NodeIp = ipEdit.text.toString().ifEmpty { "192.168.1.100" }
ros2HttpPort = portEdit.text.toString().toIntOrNull() ?: 8080
Toast.makeText(context, "配置已保存: $ros2NodeIp:$ros2HttpPort", Toast.LENGTH_SHORT).show()
}
.setNegativeButton("取消", null)
.show()
}
/**
* 快速触发拍照(使用默认参数)
*/
private fun triggerCapture(mode: Int) {
triggerCaptureWithParams(5.0, 10, 0.5, mode)
}
/**
* 使用参数触发拍照
*/
private fun triggerCaptureWithParams(duration: Double, count: Int, interval: Double, mode: Int) {
val modeStr = if (mode == 0) "原图" else "缩略图"
lifecycleScope.launch(Dispatchers.IO) {
try {
// 构建JSON请求
val json = JSONObject().apply {
put("duration", duration)
put("count", count)
put("interval", interval)
put("transmission_mode", mode)
}
val requestBody = json.toString().toRequestBody("application/json".toMediaType())
val url = "http://$ros2NodeIp:$ros2HttpPort/api/v1/trigger_capture"
val request = Request.Builder()
.url(url)
.post(requestBody)
.addHeader("User-Agent", "SkyLink-Android/1.0")
.build()
val response = httpClient.newCall(request).execute()
withContext(Dispatchers.Main) {
if (response.isSuccessful) {
val responseBody = response.body?.string()
if (responseBody != null) {
try {
val responseJson = JSONObject(responseBody)
val success = responseJson.optBoolean("success", false)
val message = responseJson.optString("message", "")
val totalPhotos = responseJson.optInt("total_photos", 0)
if (success) {
Toast.makeText(context,
"拍照任务已启动!\n$message\n总照片数: $totalPhotos",
Toast.LENGTH_LONG).show()
updateStatus("拍照任务已启动 ($modeStr)")
} else {
Toast.makeText(context,
"请求失败: $message",
Toast.LENGTH_LONG).show()
updateStatus("请求失败: $message")
}
} catch (e: Exception) {
Toast.makeText(context,
"响应解析失败: ${e.message}",
Toast.LENGTH_SHORT).show()
updateStatus("响应解析失败")
}
} else {
Toast.makeText(context, "服务器返回空响应", Toast.LENGTH_SHORT).show()
updateStatus("服务器返回空响应")
}
} else {
val errorMsg = when (response.code) {
400 -> "请求参数错误"
404 -> "API端点不存在"
500 -> "服务器内部错误"
else -> "HTTP错误: ${response.code}"
}
Toast.makeText(context, errorMsg, Toast.LENGTH_LONG).show()
updateStatus(errorMsg)
}
}
} catch (e: java.net.SocketTimeoutException) {
withContext(Dispatchers.Main) {
Toast.makeText(context,
"请求超时请检查网络连接和ROS2节点IP地址 ($ros2NodeIp:$ros2HttpPort)",
Toast.LENGTH_LONG).show()
updateStatus("请求超时")
}
} catch (e: java.net.ConnectException) {
withContext(Dispatchers.Main) {
Toast.makeText(context,
"无法连接到ROS2节点 ($ros2NodeIp:$ros2HttpPort)\n请确认HTTP服务器正在运行",
Toast.LENGTH_LONG).show()
updateStatus("连接失败")
}
} catch (e: Exception) {
withContext(Dispatchers.Main) {
Toast.makeText(context,
"调用失败: ${e.message}",
Toast.LENGTH_LONG).show()
updateStatus("调用失败: ${e.message}")
}
}
}
}
}

View File

@@ -44,7 +44,7 @@ object BitmapUtils {
// 实际解码
val bitmap = BitmapFactory.decodeByteArray(jpegData, 0, jpegData.size, options)
// Log.i(TAG, " Bitmap 解码成功: ${bitmap?.width}x${bitmap?.height}") // 移除高频日志
// Log.i(TAG, " Bitmap 解码成功: ${bitmap?.width}x${bitmap?.height}") // 移除高频日志
bitmap
} catch (e: Exception) {
Log.e(TAG, "Bitmap 解码失败", e)

View File

@@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="总时间 (秒, 0=默认):"
android:textSize="14sp"
android:layout_marginBottom="4dp" />
<EditText
android:id="@+id/duration_edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="numberDecimal"
android:hint="5.0"
android:layout_marginBottom="16dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="拍照数量 (0=默认):"
android:textSize="14sp"
android:layout_marginBottom="4dp" />
<EditText
android:id="@+id/count_edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"
android:hint="10"
android:layout_marginBottom="16dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="时间间隔 (秒, 0=自动):"
android:textSize="14sp"
android:layout_marginBottom="4dp" />
<EditText
android:id="@+id/interval_edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="numberDecimal"
android:hint="0.5"
android:layout_marginBottom="16dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="传输模式:"
android:textSize="14sp"
android:layout_marginBottom="4dp" />
<Spinner
android:id="@+id/mode_spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/transmission_modes" />
</LinearLayout>

View File

@@ -68,8 +68,44 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginStart="4dp"
android:layout_marginEnd="4dp"
android:text="⏺ 开始录制" />
<Button
android:id="@+id/trigger_capture_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginStart="4dp"
android:text="📷 触发拍照" />
</LinearLayout>
<!-- 第二行按钮 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_horizontal"
android:layout_marginTop="8dp"
android:baselineAligned="false">
<Button
android:id="@+id/trigger_capture_original_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginEnd="4dp"
android:text="📷 原图拍照" />
<Button
android:id="@+id/trigger_capture_thumbnail_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginStart="4dp"
android:text="📷 缩略图拍照" />
</LinearLayout>
</LinearLayout>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="transmission_modes">
<item>原图</item>
<item>缩略图</item>
</string-array>
</resources>

View File

@@ -1,27 +1,40 @@
# ninja log v6
1 237 1768965744018577716 skylink_station_autogen/timestamp 67b8a88a4f836678
1 237 1768965744018577716 /home/flower/code/camera/flyLink/skylink_qt_station/build/Desktop_Qt_6_5_3_GCC_64bit-Debug/skylink_station_autogen/mocs_compilation.cpp 67b8a88a4f836678
1 237 1768965744018577716 skylink_station_autogen/mocs_compilation.cpp 67b8a88a4f836678
1 237 1768965744018577716 /home/flower/code/camera/flyLink/skylink_qt_station/build/Desktop_Qt_6_5_3_GCC_64bit-Debug/skylink_station_autogen/timestamp 67b8a88a4f836678
237 246 1768965744032578704 skylink_station_autogen/EWIEGA46WW/qrc_resources.cpp e63e0a667a42556f
237 246 1768965744032578704 /home/flower/code/camera/flyLink/skylink_qt_station/build/Desktop_Qt_6_5_3_GCC_64bit-Debug/skylink_station_autogen/EWIEGA46WW/qrc_resources.cpp e63e0a667a42556f
247 259 1768965744034578845 CMakeFiles/skylink_station.dir/skylink_station_autogen/EWIEGA46WW/qrc_resources.cpp.o b144aef3415b71b2
247 1139 1768965744034578845 CMakeFiles/skylink_station.dir/src/main.cpp.o 7a56a74093adf479
247 2179 1768965744034578845 CMakeFiles/skylink_station.dir/src/GroundReceiver.cpp.o 6c56ad0b07b7bab9
247 1231 1768965744034578845 CMakeFiles/skylink_station.dir/src/DataLogger.cpp.o 3aaa238c7e188637
2 233 1768965948743624643 skylink_station_autogen/timestamp 67b8a88a4f836678
2 233 1768965948743624643 skylink_station_autogen/mocs_compilation.cpp 67b8a88a4f836678
2 233 1768965948743624643 /home/flower/code/camera/flyLink/skylink_qt_station/build/Desktop_Qt_6_5_3_GCC_64bit-Debug/skylink_station_autogen/timestamp 67b8a88a4f836678
2 233 1768965948743624643 /home/flower/code/camera/flyLink/skylink_qt_station/build/Desktop_Qt_6_5_3_GCC_64bit-Debug/skylink_station_autogen/mocs_compilation.cpp 67b8a88a4f836678
235 246 1768965948751625104 CMakeFiles/skylink_station.dir/skylink_station_autogen/EWIEGA46WW/qrc_resources.cpp.o af974169bd9ed7a4
234 1112 1768965948750625047 CMakeFiles/skylink_station.dir/src/DataLogger.cpp.o b87ed818438f6507
2 234 1768966062311868601 skylink_station_autogen/timestamp 67b8a88a4f836678
2 234 1768966062311868601 skylink_station_autogen/mocs_compilation.cpp 67b8a88a4f836678
2 234 1768966062311868601 /home/flower/code/camera/flyLink/skylink_qt_station/build/Desktop_Qt_6_5_3_GCC_64bit-Debug/skylink_station_autogen/timestamp 67b8a88a4f836678
2 234 1768966062311868601 /home/flower/code/camera/flyLink/skylink_qt_station/build/Desktop_Qt_6_5_3_GCC_64bit-Debug/skylink_station_autogen/mocs_compilation.cpp 67b8a88a4f836678
235 1024 1768966062321869125 CMakeFiles/skylink_station.dir/src/DeviceInfoReceiver.cpp.o a36de3bc6879b4b2
234 1120 1768966062320869073 CMakeFiles/skylink_station.dir/src/main.cpp.o a2b53bd089c5d0a9
234 2045 1768966062320869073 CMakeFiles/skylink_station.dir/skylink_station_autogen/mocs_compilation.cpp.o ef5337e928a073c4
234 2159 1768966062320869073 CMakeFiles/skylink_station.dir/src/GroundReceiver.cpp.o 161e05dd02078224
234 2219 1768966062320869073 CMakeFiles/skylink_station.dir/src/MainWindow.cpp.o fd43d8ab38120043
234 1120 1768966062320869073 CMakeFiles/skylink_station.dir/src/main.cpp.o a2b53bd089c5d0a9
2219 2440 1768966064305973131 skylink_station 1a20341c5a20a204
234 2045 1768966062320869073 CMakeFiles/skylink_station.dir/skylink_station_autogen/mocs_compilation.cpp.o ef5337e928a073c4
2 234 1768966062311868601 skylink_station_autogen/timestamp 67b8a88a4f836678
2 234 1768966062311868601 /home/flower/code/camera/flyLink/skylink_qt_station/build/Desktop_Qt_6_5_3_GCC_64bit-Debug/skylink_station_autogen/mocs_compilation.cpp 67b8a88a4f836678
2 234 1768966062311868601 /home/flower/code/camera/flyLink/skylink_qt_station/build/Desktop_Qt_6_5_3_GCC_64bit-Debug/skylink_station_autogen/timestamp 67b8a88a4f836678
237 246 1768965744032578704 skylink_station_autogen/EWIEGA46WW/qrc_resources.cpp e63e0a667a42556f
235 1024 1768966062321869125 CMakeFiles/skylink_station.dir/src/DeviceInfoReceiver.cpp.o a36de3bc6879b4b2
234 2219 1768966062320869073 CMakeFiles/skylink_station.dir/src/MainWindow.cpp.o fd43d8ab38120043
237 246 1768965744032578704 /home/flower/code/camera/flyLink/skylink_qt_station/build/Desktop_Qt_6_5_3_GCC_64bit-Debug/skylink_station_autogen/EWIEGA46WW/qrc_resources.cpp e63e0a667a42556f
2 234 1768966062311868601 skylink_station_autogen/mocs_compilation.cpp 67b8a88a4f836678
235 246 1768965948751625104 CMakeFiles/skylink_station.dir/skylink_station_autogen/EWIEGA46WW/qrc_resources.cpp.o af974169bd9ed7a4
2 233 1770021668864715294 skylink_station_autogen/timestamp 67b8a88a4f836678
2 233 1770021668864715294 skylink_station_autogen/mocs_compilation.cpp 67b8a88a4f836678
2 233 1770021668864715294 /home/flower/code/camera/flyLink/skylink_qt_station/build/Desktop_Qt_6_5_3_GCC_64bit-Debug/skylink_station_autogen/timestamp 67b8a88a4f836678
2 233 1770021668864715294 /home/flower/code/camera/flyLink/skylink_qt_station/build/Desktop_Qt_6_5_3_GCC_64bit-Debug/skylink_station_autogen/mocs_compilation.cpp 67b8a88a4f836678
234 1013 1770021668872715450 CMakeFiles/skylink_station.dir/src/DeviceInfoReceiver.cpp.o a36de3bc6879b4b2
233 1127 1770021668871715431 CMakeFiles/skylink_station.dir/src/main.cpp.o a2b53bd089c5d0a9
233 2068 1770021668871715431 CMakeFiles/skylink_station.dir/skylink_station_autogen/mocs_compilation.cpp.o ef5337e928a073c4
233 2156 1770021668871715431 CMakeFiles/skylink_station.dir/src/GroundReceiver.cpp.o 161e05dd02078224
233 2264 1770021668871715431 CMakeFiles/skylink_station.dir/src/MainWindow.cpp.o fd43d8ab38120043
2264 2520 1770021670902755003 skylink_station 1a20341c5a20a204
2 139 1770022201333131084 skylink_station_autogen/timestamp 67b8a88a4f836678
2 139 1770022201333131084 skylink_station_autogen/mocs_compilation.cpp 67b8a88a4f836678
2 139 1770022201333131084 /home/flower/code/camera/flyLink/skylink_qt_station/build/Desktop_Qt_6_5_3_GCC_64bit-Debug/skylink_station_autogen/timestamp 67b8a88a4f836678
2 139 1770022201333131084 /home/flower/code/camera/flyLink/skylink_qt_station/build/Desktop_Qt_6_5_3_GCC_64bit-Debug/skylink_station_autogen/mocs_compilation.cpp 67b8a88a4f836678
139 1010 1770022201341131292 CMakeFiles/skylink_station.dir/src/main.cpp.o a2b53bd089c5d0a9
139 1948 1770022201341131292 CMakeFiles/skylink_station.dir/skylink_station_autogen/mocs_compilation.cpp.o ef5337e928a073c4
140 2054 1770022201341131292 CMakeFiles/skylink_station.dir/src/GroundReceiver.cpp.o 161e05dd02078224
140 2461 1770022201341131292 CMakeFiles/skylink_station.dir/src/MainWindow.cpp.o fd43d8ab38120043
2461 2682 1770022203662191772 skylink_station 1a20341c5a20a204
1 22 1770022435693402494 skylink_station_autogen/timestamp 67b8a88a4f836678
1 22 1770022435693402494 skylink_station_autogen/mocs_compilation.cpp 67b8a88a4f836678
1 22 1770022435693402494 /home/flower/code/camera/flyLink/skylink_qt_station/build/Desktop_Qt_6_5_3_GCC_64bit-Debug/skylink_station_autogen/timestamp 67b8a88a4f836678
1 22 1770022435693402494 /home/flower/code/camera/flyLink/skylink_qt_station/build/Desktop_Qt_6_5_3_GCC_64bit-Debug/skylink_station_autogen/mocs_compilation.cpp 67b8a88a4f836678
22 2151 1770022435714403069 CMakeFiles/skylink_station.dir/src/MainWindow.cpp.o fd43d8ab38120043
2151 2376 1770022437843461352 skylink_station 1a20341c5a20a204

View File

@@ -1,15 +1,14 @@
# Generated by CMake. Changes will be overwritten.
/home/flower/code/camera/flyLink/skylink_qt_station/src/DataLogger.h
/home/flower/code/camera/flyLink/skylink_qt_station/src/DataLogger.cpp
/home/flower/code/camera/flyLink/skylink_qt_station/src/DeviceInfo.h
/home/flower/code/camera/flyLink/skylink_qt_station/src/DeviceInfoReceiver.cpp
/home/flower/code/camera/flyLink/skylink_qt_station/src/DeviceInfoReceiver.h
/home/flower/code/camera/flyLink/skylink_qt_station/src/main.cpp
/home/flower/code/camera/flyLink/skylink_qt_station/src/GroundReceiver.cpp
/home/flower/code/camera/flyLink/skylink_qt_station/src/MainWindow.h
mmc:Q_OBJECT
mdp:/home/flower/code/camera/flyLink/skylink_qt_station/src/DeviceInfoReceiver.h
mdp:/home/flower/code/camera/flyLink/skylink_qt_station/src/MainWindow.h
mdp:/home/flower/code/camera/flyLink/skylink_qt_station/build/Desktop_Qt_6_5_3_GCC_64bit-Debug/skylink_station_autogen/moc_predefs.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/QDateTime
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/QObject
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/QString
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/QTimer
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/q20memory.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/q20type_traits.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qalgorithms.h
@@ -21,6 +20,7 @@
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qatomic.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qatomic_cxx11.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qbasicatomic.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qbasictimer.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qbindingstorage.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qbytearray.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qbytearrayalgorithms.h
@@ -55,11 +55,13 @@
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qiodevicebase.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qiterable.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qiterator.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qline.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qlist.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qlocale.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qlogging.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qmalloc.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qmap.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qmargins.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qmath.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qmetacontainer.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qmetatype.h
@@ -72,7 +74,9 @@
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qobjectdefs_impl.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qoverload.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qpair.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qpoint.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qprocessordetection.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qrect.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qrefcount.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qscopedpointer.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qscopeguard.h
@@ -81,6 +85,7 @@
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qshareddata_impl.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qsharedpointer.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qsharedpointer_impl.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qsize.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qstring.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qstringalgorithms.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qstringbuilder.h
@@ -102,6 +107,7 @@
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qtdeprecationmarkers.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qtenvironmentvariables.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qtextstream.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qtimer.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qtmetamacros.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qtnoop.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qtpreprocessorsupport.h
@@ -112,21 +118,66 @@
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qtversionchecks.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qtypeinfo.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qtypes.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qurl.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qutf8stringview.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qvariant.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qvarlengtharray.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qversiontagging.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qxptype_traits.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/QImage
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qaction.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qbitmap.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qbrush.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qcolor.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qcursor.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qfont.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qfontinfo.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qfontmetrics.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qicon.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qimage.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qkeysequence.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qpaintdevice.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qpalette.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qpicture.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qpixelformat.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qpixmap.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qpolygon.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qregion.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qrgb.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qrgba64.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qtextdocument.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qtgui-config.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qtguiexports.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qtguiglobal.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qtransform.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qwindowdefs.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtNetwork/QHostAddress
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtNetwork/QTcpSocket
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtNetwork/QUdpSocket
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtNetwork/qabstractsocket.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtNetwork/qhostaddress.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtNetwork/qtcpsocket.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtNetwork/qtnetwork-config.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtNetwork/qtnetworkexports.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtNetwork/qtnetworkglobal.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtNetwork/qudpsocket.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/QLabel
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/QMainWindow
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/QPushButton
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/qabstractbutton.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/qframe.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/qlabel.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/qmainwindow.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/qpushbutton.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/qsizepolicy.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/qtabwidget.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/qtwidgets-config.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/qtwidgetsexports.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/qtwidgetsglobal.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/qwidget.h
mdp:/home/flower/code/camera/flyLink/skylink_qt_station/protocol/protocol.h
mdp:/home/flower/code/camera/flyLink/skylink_qt_station/src/DeviceInfo.h
mdp:/home/flower/code/camera/flyLink/skylink_qt_station/src/DeviceInfoReceiver.h
mdp:/usr/include/alloca.h
mdp:/usr/include/asm-generic/errno-base.h
mdp:/usr/include/asm-generic/errno.h
@@ -382,6 +433,7 @@
mdp:/usr/lib/gcc/x86_64-linux-gnu/12/include/stdarg.h
mdp:/usr/lib/gcc/x86_64-linux-gnu/12/include/stdbool.h
mdp:/usr/lib/gcc/x86_64-linux-gnu/12/include/stddef.h
/home/flower/code/camera/flyLink/skylink_qt_station/src/MainWindow.cpp
/home/flower/code/camera/flyLink/skylink_qt_station/src/GroundReceiver.h
mmc:Q_OBJECT
mdp:/home/flower/code/camera/flyLink/skylink_qt_station/src/GroundReceiver.h
@@ -938,15 +990,13 @@
mdp:/usr/lib/gcc/x86_64-linux-gnu/12/include/stdbool.h
mdp:/usr/lib/gcc/x86_64-linux-gnu/12/include/stddef.h
mdp:/usr/lib/gcc/x86_64-linux-gnu/12/include/xmmintrin.h
/home/flower/code/camera/flyLink/skylink_qt_station/src/MainWindow.cpp
/home/flower/code/camera/flyLink/skylink_qt_station/src/MainWindow.h
/home/flower/code/camera/flyLink/skylink_qt_station/src/DeviceInfoReceiver.h
mmc:Q_OBJECT
mdp:/home/flower/code/camera/flyLink/skylink_qt_station/src/MainWindow.h
mdp:/home/flower/code/camera/flyLink/skylink_qt_station/src/DeviceInfoReceiver.h
mdp:/home/flower/code/camera/flyLink/skylink_qt_station/build/Desktop_Qt_6_5_3_GCC_64bit-Debug/skylink_station_autogen/moc_predefs.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/QDateTime
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/QObject
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/QString
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/QTimer
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/q20memory.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/q20type_traits.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qalgorithms.h
@@ -958,7 +1008,6 @@
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qatomic.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qatomic_cxx11.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qbasicatomic.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qbasictimer.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qbindingstorage.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qbytearray.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qbytearrayalgorithms.h
@@ -993,13 +1042,11 @@
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qiodevicebase.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qiterable.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qiterator.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qline.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qlist.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qlocale.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qlogging.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qmalloc.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qmap.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qmargins.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qmath.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qmetacontainer.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qmetatype.h
@@ -1012,9 +1059,7 @@
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qobjectdefs_impl.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qoverload.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qpair.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qpoint.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qprocessordetection.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qrect.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qrefcount.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qscopedpointer.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qscopeguard.h
@@ -1023,7 +1068,6 @@
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qshareddata_impl.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qsharedpointer.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qsharedpointer_impl.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qsize.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qstring.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qstringalgorithms.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qstringbuilder.h
@@ -1045,7 +1089,6 @@
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qtdeprecationmarkers.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qtenvironmentvariables.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qtextstream.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qtimer.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qtmetamacros.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qtnoop.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qtpreprocessorsupport.h
@@ -1056,66 +1099,21 @@
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qtversionchecks.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qtypeinfo.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qtypes.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qurl.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qutf8stringview.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qvariant.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qvarlengtharray.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qversiontagging.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qxptype_traits.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/QImage
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qaction.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qbitmap.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qbrush.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qcolor.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qcursor.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qfont.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qfontinfo.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qfontmetrics.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qicon.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qimage.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qkeysequence.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qpaintdevice.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qpalette.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qpicture.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qpixelformat.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qpixmap.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qpolygon.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qregion.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qrgb.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qrgba64.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qtextdocument.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qtgui-config.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qtguiexports.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qtguiglobal.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qtransform.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtGui/qwindowdefs.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtNetwork/QHostAddress
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtNetwork/QTcpSocket
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtNetwork/QUdpSocket
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtNetwork/qabstractsocket.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtNetwork/qhostaddress.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtNetwork/qtcpsocket.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtNetwork/qtnetwork-config.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtNetwork/qtnetworkexports.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtNetwork/qtnetworkglobal.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtNetwork/qudpsocket.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/QLabel
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/QMainWindow
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/QPushButton
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/qabstractbutton.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/qframe.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/qlabel.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/qmainwindow.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/qpushbutton.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/qsizepolicy.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/qtabwidget.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/qtwidgets-config.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/qtwidgetsexports.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/qtwidgetsglobal.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtWidgets/qwidget.h
mdp:/home/flower/code/camera/flyLink/skylink_qt_station/protocol/protocol.h
mdp:/home/flower/code/camera/flyLink/skylink_qt_station/src/DeviceInfo.h
mdp:/home/flower/code/camera/flyLink/skylink_qt_station/src/DeviceInfoReceiver.h
mdp:/usr/include/alloca.h
mdp:/usr/include/asm-generic/errno-base.h
mdp:/usr/include/asm-generic/errno.h
@@ -1371,5 +1369,7 @@
mdp:/usr/lib/gcc/x86_64-linux-gnu/12/include/stdarg.h
mdp:/usr/lib/gcc/x86_64-linux-gnu/12/include/stdbool.h
mdp:/usr/lib/gcc/x86_64-linux-gnu/12/include/stddef.h
/home/flower/code/camera/flyLink/skylink_qt_station/src/GroundReceiver.cpp
/home/flower/code/camera/flyLink/skylink_qt_station/src/main.cpp
/home/flower/code/camera/flyLink/skylink_qt_station/src/DeviceInfoReceiver.cpp
/home/flower/code/camera/flyLink/skylink_qt_station/src/DeviceInfo.h
/home/flower/code/camera/flyLink/skylink_qt_station/src/DataLogger.cpp
/home/flower/code/camera/flyLink/skylink_qt_station/src/DataLogger.h

View File

@@ -1,3 +1,3 @@
Start testing: Jan 21 11:24 CST
Start testing: Feb 02 16:41 CST
----------------------------------------------------------
End testing: Jan 21 11:24 CST
End testing: Feb 02 16:41 CST

View File

@@ -45,6 +45,8 @@ static constexpr auto qt_meta_stringdata_CLASSGroundReceiverENDCLASS = QtMocHelp
"lat",
"lon",
"alt",
"uint32_t",
"photo_number",
"statsUpdated",
"fps",
"kbs",
@@ -56,7 +58,7 @@ static constexpr auto qt_meta_stringdata_CLASSGroundReceiverENDCLASS = QtMocHelp
);
#else // !QT_MOC_HAS_STRING_DATA
struct qt_meta_stringdata_CLASSGroundReceiverENDCLASS_t {
uint offsetsAndSizes[30];
uint offsetsAndSizes[34];
char stringdata0[15];
char stringdata1[13];
char stringdata2[1];
@@ -64,14 +66,16 @@ struct qt_meta_stringdata_CLASSGroundReceiverENDCLASS_t {
char stringdata4[4];
char stringdata5[4];
char stringdata6[4];
char stringdata7[13];
char stringdata8[4];
char stringdata9[4];
char stringdata10[6];
char stringdata11[10];
char stringdata12[18];
char stringdata13[13];
char stringdata14[19];
char stringdata7[9];
char stringdata8[13];
char stringdata9[13];
char stringdata10[4];
char stringdata11[4];
char stringdata12[6];
char stringdata13[10];
char stringdata14[18];
char stringdata15[13];
char stringdata16[19];
};
#define QT_MOC_LITERAL(ofs, len) \
uint(sizeof(qt_meta_stringdata_CLASSGroundReceiverENDCLASS_t::offsetsAndSizes) + ofs), len
@@ -84,14 +88,16 @@ Q_CONSTINIT static const qt_meta_stringdata_CLASSGroundReceiverENDCLASS_t qt_met
QT_MOC_LITERAL(33, 3), // "lat"
QT_MOC_LITERAL(37, 3), // "lon"
QT_MOC_LITERAL(41, 3), // "alt"
QT_MOC_LITERAL(45, 12), // "statsUpdated"
QT_MOC_LITERAL(58, 3), // "fps"
QT_MOC_LITERAL(62, 3), // "kbs"
QT_MOC_LITERAL(66, 5), // "error"
QT_MOC_LITERAL(72, 9), // "error_msg"
QT_MOC_LITERAL(82, 17), // "on_udp_read_ready"
QT_MOC_LITERAL(100, 12), // "on_udp_error"
QT_MOC_LITERAL(113, 18) // "on_cleanup_timeout"
QT_MOC_LITERAL(45, 8), // "uint32_t"
QT_MOC_LITERAL(54, 12), // "photo_number"
QT_MOC_LITERAL(67, 12), // "statsUpdated"
QT_MOC_LITERAL(80, 3), // "fps"
QT_MOC_LITERAL(84, 3), // "kbs"
QT_MOC_LITERAL(88, 5), // "error"
QT_MOC_LITERAL(94, 9), // "error_msg"
QT_MOC_LITERAL(104, 17), // "on_udp_read_ready"
QT_MOC_LITERAL(122, 12), // "on_udp_error"
QT_MOC_LITERAL(135, 18) // "on_cleanup_timeout"
},
"GroundReceiver",
"frameDecoded",
@@ -100,6 +106,8 @@ Q_CONSTINIT static const qt_meta_stringdata_CLASSGroundReceiverENDCLASS_t qt_met
"lat",
"lon",
"alt",
"uint32_t",
"photo_number",
"statsUpdated",
"fps",
"kbs",
@@ -127,19 +135,19 @@ Q_CONSTINIT static const uint qt_meta_data_CLASSGroundReceiverENDCLASS[] = {
3, // signalCount
// signals: name, argc, parameters, tag, flags, initial metatype offsets
1, 4, 50, 2, 0x06, 1 /* Public */,
7, 2, 59, 2, 0x06, 6 /* Public */,
10, 1, 64, 2, 0x06, 9 /* Public */,
1, 5, 50, 2, 0x06, 1 /* Public */,
9, 2, 61, 2, 0x06, 7 /* Public */,
12, 1, 66, 2, 0x06, 10 /* Public */,
// slots: name, argc, parameters, tag, flags, initial metatype offsets
12, 0, 67, 2, 0x08, 11 /* Private */,
13, 0, 68, 2, 0x08, 12 /* Private */,
14, 0, 69, 2, 0x08, 13 /* Private */,
14, 0, 69, 2, 0x08, 12 /* Private */,
15, 0, 70, 2, 0x08, 13 /* Private */,
16, 0, 71, 2, 0x08, 14 /* Private */,
// signals: parameters
QMetaType::Void, QMetaType::QImage, QMetaType::Double, QMetaType::Double, QMetaType::Double, 3, 4, 5, 6,
QMetaType::Void, QMetaType::Int, QMetaType::Int, 8, 9,
QMetaType::Void, QMetaType::QString, 11,
QMetaType::Void, QMetaType::QImage, QMetaType::Double, QMetaType::Double, QMetaType::Double, 0x80000000 | 7, 3, 4, 5, 6, 8,
QMetaType::Void, QMetaType::Int, QMetaType::Int, 10, 11,
QMetaType::Void, QMetaType::QString, 13,
// slots: parameters
QMetaType::Void,
@@ -164,6 +172,7 @@ Q_CONSTINIT const QMetaObject GroundReceiver::staticMetaObject = { {
QtPrivate::TypeAndForceComplete<double, std::false_type>,
QtPrivate::TypeAndForceComplete<double, std::false_type>,
QtPrivate::TypeAndForceComplete<double, std::false_type>,
QtPrivate::TypeAndForceComplete<uint32_t, std::false_type>,
// method 'statsUpdated'
QtPrivate::TypeAndForceComplete<void, std::false_type>,
QtPrivate::TypeAndForceComplete<int, std::false_type>,
@@ -187,7 +196,7 @@ void GroundReceiver::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _
auto *_t = static_cast<GroundReceiver *>(_o);
(void)_t;
switch (_id) {
case 0: _t->frameDecoded((*reinterpret_cast< std::add_pointer_t<QImage>>(_a[1])),(*reinterpret_cast< std::add_pointer_t<double>>(_a[2])),(*reinterpret_cast< std::add_pointer_t<double>>(_a[3])),(*reinterpret_cast< std::add_pointer_t<double>>(_a[4]))); break;
case 0: _t->frameDecoded((*reinterpret_cast< std::add_pointer_t<QImage>>(_a[1])),(*reinterpret_cast< std::add_pointer_t<double>>(_a[2])),(*reinterpret_cast< std::add_pointer_t<double>>(_a[3])),(*reinterpret_cast< std::add_pointer_t<double>>(_a[4])),(*reinterpret_cast< std::add_pointer_t<uint32_t>>(_a[5]))); break;
case 1: _t->statsUpdated((*reinterpret_cast< std::add_pointer_t<int>>(_a[1])),(*reinterpret_cast< std::add_pointer_t<int>>(_a[2]))); break;
case 2: _t->error((*reinterpret_cast< std::add_pointer_t<QString>>(_a[1]))); break;
case 3: _t->on_udp_read_ready(); break;
@@ -198,7 +207,7 @@ void GroundReceiver::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _
} else if (_c == QMetaObject::IndexOfMethod) {
int *result = reinterpret_cast<int *>(_a[0]);
{
using _t = void (GroundReceiver::*)(const QImage & , double , double , double );
using _t = void (GroundReceiver::*)(const QImage & , double , double , double , uint32_t );
if (_t _q_method = &GroundReceiver::frameDecoded; *reinterpret_cast<_t *>(_a[1]) == _q_method) {
*result = 0;
return;
@@ -252,9 +261,9 @@ int GroundReceiver::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
}
// SIGNAL 0
void GroundReceiver::frameDecoded(const QImage & _t1, double _t2, double _t3, double _t4)
void GroundReceiver::frameDecoded(const QImage & _t1, double _t2, double _t3, double _t4, uint32_t _t5)
{
void *_a[] = { nullptr, const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t1))), const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t2))), const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t3))), const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t4))) };
void *_a[] = { nullptr, const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t1))), const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t2))), const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t3))), const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t4))), const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t5))) };
QMetaObject::activate(this, &staticMetaObject, 0, _a);
}

View File

@@ -46,6 +46,8 @@ static constexpr auto qt_meta_stringdata_CLASSMainWindowENDCLASS = QtMocHelpers:
"lat",
"lon",
"alt",
"uint32_t",
"photo_number",
"on_stats_updated",
"fps",
"kbs",
@@ -53,13 +55,14 @@ static constexpr auto qt_meta_stringdata_CLASSMainWindowENDCLASS = QtMocHelpers:
"on_record_toggled",
"checked",
"on_settings_clicked",
"on_trigger_capture_clicked",
"on_device_info_received",
"DeviceInfo",
"info"
);
#else // !QT_MOC_HAS_STRING_DATA
struct qt_meta_stringdata_CLASSMainWindowENDCLASS_t {
uint offsetsAndSizes[34];
uint offsetsAndSizes[40];
char stringdata0[11];
char stringdata1[18];
char stringdata2[1];
@@ -67,16 +70,19 @@ struct qt_meta_stringdata_CLASSMainWindowENDCLASS_t {
char stringdata4[4];
char stringdata5[4];
char stringdata6[4];
char stringdata7[17];
char stringdata8[4];
char stringdata9[4];
char stringdata10[22];
char stringdata11[18];
char stringdata12[8];
char stringdata13[20];
char stringdata14[24];
char stringdata15[11];
char stringdata16[5];
char stringdata7[9];
char stringdata8[13];
char stringdata9[17];
char stringdata10[4];
char stringdata11[4];
char stringdata12[22];
char stringdata13[18];
char stringdata14[8];
char stringdata15[20];
char stringdata16[27];
char stringdata17[24];
char stringdata18[11];
char stringdata19[5];
};
#define QT_MOC_LITERAL(ofs, len) \
uint(sizeof(qt_meta_stringdata_CLASSMainWindowENDCLASS_t::offsetsAndSizes) + ofs), len
@@ -89,16 +95,19 @@ Q_CONSTINIT static const qt_meta_stringdata_CLASSMainWindowENDCLASS_t qt_meta_st
QT_MOC_LITERAL(34, 3), // "lat"
QT_MOC_LITERAL(38, 3), // "lon"
QT_MOC_LITERAL(42, 3), // "alt"
QT_MOC_LITERAL(46, 16), // "on_stats_updated"
QT_MOC_LITERAL(63, 3), // "fps"
QT_MOC_LITERAL(67, 3), // "kbs"
QT_MOC_LITERAL(71, 21), // "on_save_frame_clicked"
QT_MOC_LITERAL(93, 17), // "on_record_toggled"
QT_MOC_LITERAL(111, 7), // "checked"
QT_MOC_LITERAL(119, 19), // "on_settings_clicked"
QT_MOC_LITERAL(139, 23), // "on_device_info_received"
QT_MOC_LITERAL(163, 10), // "DeviceInfo"
QT_MOC_LITERAL(174, 4) // "info"
QT_MOC_LITERAL(46, 8), // "uint32_t"
QT_MOC_LITERAL(55, 12), // "photo_number"
QT_MOC_LITERAL(68, 16), // "on_stats_updated"
QT_MOC_LITERAL(85, 3), // "fps"
QT_MOC_LITERAL(89, 3), // "kbs"
QT_MOC_LITERAL(93, 21), // "on_save_frame_clicked"
QT_MOC_LITERAL(115, 17), // "on_record_toggled"
QT_MOC_LITERAL(133, 7), // "checked"
QT_MOC_LITERAL(141, 19), // "on_settings_clicked"
QT_MOC_LITERAL(161, 26), // "on_trigger_capture_clicked"
QT_MOC_LITERAL(188, 23), // "on_device_info_received"
QT_MOC_LITERAL(212, 10), // "DeviceInfo"
QT_MOC_LITERAL(223, 4) // "info"
},
"MainWindow",
"on_frame_received",
@@ -107,6 +116,8 @@ Q_CONSTINIT static const qt_meta_stringdata_CLASSMainWindowENDCLASS_t qt_meta_st
"lat",
"lon",
"alt",
"uint32_t",
"photo_number",
"on_stats_updated",
"fps",
"kbs",
@@ -114,6 +125,7 @@ Q_CONSTINIT static const qt_meta_stringdata_CLASSMainWindowENDCLASS_t qt_meta_st
"on_record_toggled",
"checked",
"on_settings_clicked",
"on_trigger_capture_clicked",
"on_device_info_received",
"DeviceInfo",
"info"
@@ -128,7 +140,7 @@ Q_CONSTINIT static const uint qt_meta_data_CLASSMainWindowENDCLASS[] = {
11, // revision
0, // classname
0, 0, // classinfo
6, 14, // methods
7, 14, // methods
0, 0, // properties
0, 0, // enums/sets
0, 0, // constructors
@@ -136,20 +148,22 @@ Q_CONSTINIT static const uint qt_meta_data_CLASSMainWindowENDCLASS[] = {
0, // signalCount
// slots: name, argc, parameters, tag, flags, initial metatype offsets
1, 4, 50, 2, 0x08, 1 /* Private */,
7, 2, 59, 2, 0x08, 6 /* Private */,
10, 0, 64, 2, 0x08, 9 /* Private */,
11, 1, 65, 2, 0x08, 10 /* Private */,
13, 0, 68, 2, 0x08, 12 /* Private */,
14, 1, 69, 2, 0x08, 13 /* Private */,
1, 5, 56, 2, 0x08, 1 /* Private */,
9, 2, 67, 2, 0x08, 7 /* Private */,
12, 0, 72, 2, 0x08, 10 /* Private */,
13, 1, 73, 2, 0x08, 11 /* Private */,
15, 0, 76, 2, 0x08, 13 /* Private */,
16, 0, 77, 2, 0x08, 14 /* Private */,
17, 1, 78, 2, 0x08, 15 /* Private */,
// slots: parameters
QMetaType::Void, QMetaType::QImage, QMetaType::Double, QMetaType::Double, QMetaType::Double, 3, 4, 5, 6,
QMetaType::Void, QMetaType::Int, QMetaType::Int, 8, 9,
QMetaType::Void, QMetaType::QImage, QMetaType::Double, QMetaType::Double, QMetaType::Double, 0x80000000 | 7, 3, 4, 5, 6, 8,
QMetaType::Void, QMetaType::Int, QMetaType::Int, 10, 11,
QMetaType::Void,
QMetaType::Void, QMetaType::Bool, 12,
QMetaType::Void, QMetaType::Bool, 14,
QMetaType::Void,
QMetaType::Void, 0x80000000 | 15, 16,
QMetaType::Void,
QMetaType::Void, 0x80000000 | 18, 19,
0 // eod
};
@@ -169,6 +183,7 @@ Q_CONSTINIT const QMetaObject MainWindow::staticMetaObject = { {
QtPrivate::TypeAndForceComplete<double, std::false_type>,
QtPrivate::TypeAndForceComplete<double, std::false_type>,
QtPrivate::TypeAndForceComplete<double, std::false_type>,
QtPrivate::TypeAndForceComplete<uint32_t, std::false_type>,
// method 'on_stats_updated'
QtPrivate::TypeAndForceComplete<void, std::false_type>,
QtPrivate::TypeAndForceComplete<int, std::false_type>,
@@ -180,6 +195,8 @@ Q_CONSTINIT const QMetaObject MainWindow::staticMetaObject = { {
QtPrivate::TypeAndForceComplete<bool, std::false_type>,
// method 'on_settings_clicked'
QtPrivate::TypeAndForceComplete<void, std::false_type>,
// method 'on_trigger_capture_clicked'
QtPrivate::TypeAndForceComplete<void, std::false_type>,
// method 'on_device_info_received'
QtPrivate::TypeAndForceComplete<void, std::false_type>,
QtPrivate::TypeAndForceComplete<const DeviceInfo &, std::false_type>
@@ -193,12 +210,13 @@ void MainWindow::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id,
auto *_t = static_cast<MainWindow *>(_o);
(void)_t;
switch (_id) {
case 0: _t->on_frame_received((*reinterpret_cast< std::add_pointer_t<QImage>>(_a[1])),(*reinterpret_cast< std::add_pointer_t<double>>(_a[2])),(*reinterpret_cast< std::add_pointer_t<double>>(_a[3])),(*reinterpret_cast< std::add_pointer_t<double>>(_a[4]))); break;
case 0: _t->on_frame_received((*reinterpret_cast< std::add_pointer_t<QImage>>(_a[1])),(*reinterpret_cast< std::add_pointer_t<double>>(_a[2])),(*reinterpret_cast< std::add_pointer_t<double>>(_a[3])),(*reinterpret_cast< std::add_pointer_t<double>>(_a[4])),(*reinterpret_cast< std::add_pointer_t<uint32_t>>(_a[5]))); break;
case 1: _t->on_stats_updated((*reinterpret_cast< std::add_pointer_t<int>>(_a[1])),(*reinterpret_cast< std::add_pointer_t<int>>(_a[2]))); break;
case 2: _t->on_save_frame_clicked(); break;
case 3: _t->on_record_toggled((*reinterpret_cast< std::add_pointer_t<bool>>(_a[1]))); break;
case 4: _t->on_settings_clicked(); break;
case 5: _t->on_device_info_received((*reinterpret_cast< std::add_pointer_t<DeviceInfo>>(_a[1]))); break;
case 5: _t->on_trigger_capture_clicked(); break;
case 6: _t->on_device_info_received((*reinterpret_cast< std::add_pointer_t<DeviceInfo>>(_a[1]))); break;
default: ;
}
}
@@ -223,13 +241,13 @@ int MainWindow::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
if (_id < 0)
return _id;
if (_c == QMetaObject::InvokeMetaMethod) {
if (_id < 6)
if (_id < 7)
qt_static_metacall(this, _c, _id, _a);
_id -= 6;
_id -= 7;
} else if (_c == QMetaObject::RegisterMethodArgumentMetaType) {
if (_id < 6)
if (_id < 7)
*reinterpret_cast<QMetaType *>(_a[0]) = QMetaType();
_id -= 6;
_id -= 7;
}
return _id;
}

View File

@@ -47,7 +47,7 @@ void GroundReceiver::start() {
return;
}
std::cout << " UDP 接收器已启动,监听端口: " << listen_port_ << std::endl;
std::cout << " UDP 接收器已启动,监听端口: " << listen_port_ << std::endl;
}
void GroundReceiver::stop() {
@@ -147,6 +147,7 @@ void GroundReceiver::process_packet(const uint8_t* data, size_t len) {
fb.lon = header->lon;
fb.alt = header->alt;
fb.receive_time_ms = QDateTime::currentMSecsSinceEpoch();
fb.photo_number = header->reserve; // 从reserve字段提取照片编号
it = frame_buffers_.insert({header->frame_id, fb}).first;
}
@@ -343,10 +344,10 @@ void GroundReceiver::handle_complete_frame(const FrameBuffer& frame) {
last_complete_frame_id_ = frame.frame_id;
}
// 发出信号
// 发出信号(包含照片编号)
qDebug() << "" << frame.frame_id << "解码成功,图像大小:" << image.width() << "x" << image.height()
<< "格式:" << image.format() << "准备发出frameDecoded信号";
emit frameDecoded(image, frame.lat, frame.lon, frame.alt);
<< "格式:" << image.format() << "照片编号:" << frame.photo_number << "准备发出frameDecoded信号";
emit frameDecoded(image, frame.lat, frame.lon, frame.alt, frame.photo_number);
qDebug() << "frameDecoded信号已发出";
}

View File

@@ -44,6 +44,7 @@ struct FrameBuffer {
double timestamp;
double lat, lon, alt;
uint64_t receive_time_ms;
uint32_t photo_number = 0; // 照片编号从reserve字段提取
/**
* @brief 检查是否所有分片都已接收
@@ -139,8 +140,9 @@ signals:
* @param lat 纬度
* @param lon 经度
* @param alt 海拔
* @param photo_number 照片编号
*/
void frameDecoded(const QImage& img, double lat, double lon, double alt);
void frameDecoded(const QImage& img, double lat, double lon, double alt, uint32_t photo_number);
/**
* @brief 统计信息更新信号

View File

@@ -23,6 +23,21 @@
#include <QMessageBox>
#include <QDebug>
#include <QPixmap>
#include <QPainter>
#include <QDialog>
#include <QDialogButtonBox>
#include <QFormLayout>
#include <QDoubleSpinBox>
#include <QSpinBox>
#include <QComboBox>
#include <QProcess>
#include <QLineEdit>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonParseError>
#include <iomanip>
#include <sstream>
@@ -60,9 +75,14 @@ MainWindow::MainWindow(QWidget* parent)
// 创建记录器
logger_ = std::make_shared<DataLogger>("./skylink_data");
// 创建网络管理器
network_manager_ = new QNetworkAccessManager(this);
connect(network_manager_, &QNetworkAccessManager::finished,
this, &MainWindow::onHttpReply);
// 连接信号
bool connected1 = connect(receiver_.get(), &GroundReceiver::frameDecoded,
this, &MainWindow::on_frame_received);
bool connected1 = connect(receiver_.get(), qOverload<const QImage&, double, double, double, uint32_t>(&GroundReceiver::frameDecoded),
this, &MainWindow::on_frame_received);
bool connected2 = connect(receiver_.get(), &GroundReceiver::statsUpdated,
this, &MainWindow::on_stats_updated);
@@ -155,12 +175,14 @@ void MainWindow::init_ui() {
save_frame_btn_ = new QPushButton("📸 保存帧", this);
record_btn_ = new QPushButton("⏺ 开始录制", this);
trigger_capture_btn_ = new QPushButton("📷 触发拍照", this);
settings_btn_ = new QPushButton("⚙ 设置", this);
record_btn_->setCheckable(true);
btn_layout->addWidget(save_frame_btn_);
btn_layout->addWidget(record_btn_);
btn_layout->addWidget(trigger_capture_btn_);
btn_layout->addWidget(settings_btn_);
btn_layout->addStretch();
@@ -177,6 +199,9 @@ void MainWindow::init_connections() {
connect(settings_btn_, &QPushButton::clicked,
this, &MainWindow::on_settings_clicked);
connect(trigger_capture_btn_, &QPushButton::clicked,
this, &MainWindow::on_trigger_capture_clicked);
}
void MainWindow::create_menus() {
@@ -199,7 +224,7 @@ void MainWindow::create_menus() {
});
}
void MainWindow::on_frame_received(const QImage& img, double lat, double lon, double alt) {
void MainWindow::on_frame_received(const QImage& img, double lat, double lon, double alt, uint32_t photo_number) {
// 调试信息
static int frame_count = 0;
frame_count++;
@@ -211,12 +236,17 @@ void MainWindow::on_frame_received(const QImage& img, double lat, double lon, do
}
qDebug() << "收到图像,帧" << frame_count << "大小:" << img.width() << "x" << img.height()
<< "格式:" << img.format();
<< "格式:" << img.format() << "照片编号:" << photo_number;
current_image_ = img;
current_lat_ = lat;
current_lon_ = lon;
current_alt_ = alt;
current_photo_number_ = photo_number;
if (photo_number > 0) {
total_photos_received_++;
}
// 显示图像
QPixmap pixmap = QPixmap::fromImage(img);
@@ -240,14 +270,29 @@ void MainWindow::on_frame_received(const QImage& img, double lat, double lon, do
return;
}
// 在图像上叠加显示照片编号
if (photo_number > 0) {
QPainter painter(&scaled_pixmap);
painter.setPen(QPen(Qt::white, 2));
painter.setFont(QFont("Arial", 16, QFont::Bold));
QString photo_text = QString("Photo #%1").arg(photo_number);
QRect textRect = painter.fontMetrics().boundingRect(photo_text);
painter.fillRect(10, 10, textRect.width() + 10, textRect.height() + 5, QColor(0, 0, 0, 180));
painter.drawText(15, 10 + textRect.height(), photo_text);
}
video_label_->setPixmap(scaled_pixmap);
video_label_->setText(""); // 清除文本,显示图片
// 更新状态栏
statusBar()->showMessage(QString("已接收 %1 帧 | 图像: %2x%3")
.arg(frame_count)
.arg(img.width())
.arg(img.height()), 1000);
QString status_text = QString("已接收 %1 帧 | 图像: %2x%3")
.arg(frame_count)
.arg(img.width())
.arg(img.height());
if (photo_number > 0) {
status_text += QString(" | 照片编号: %1").arg(photo_number);
}
statusBar()->showMessage(status_text, 1000);
// 更新 GPS 标签
std::ostringstream oss;
@@ -268,6 +313,9 @@ void MainWindow::on_stats_updated(int fps, int kbs) {
oss << "FPS: " << fps << "\n";
oss << "速率: " << kbs << " KB/s\n";
oss << "丢包率: " << "计算中..." << "%";
if (total_photos_received_ > 0) {
oss << "\n总照片数: " << total_photos_received_;
}
stats_label_->setText(QString::fromStdString(oss.str()));
}
@@ -310,6 +358,169 @@ void MainWindow::on_settings_clicked() {
);
}
void MainWindow::on_trigger_capture_clicked() {
// 创建参数输入对话框
QDialog dialog(this);
dialog.setWindowTitle("触发拍照");
dialog.setModal(true);
QFormLayout* form = new QFormLayout(&dialog);
// 总时间
QDoubleSpinBox* duration_spin = new QDoubleSpinBox(&dialog);
duration_spin->setRange(0.0, 3600.0);
duration_spin->setValue(5.0);
duration_spin->setSuffix("");
duration_spin->setDecimals(1);
form->addRow("总时间 (0=默认):", duration_spin);
// 拍照数量
QSpinBox* count_spin = new QSpinBox(&dialog);
count_spin->setRange(0, 1000);
count_spin->setValue(10);
count_spin->setSuffix("");
form->addRow("拍照数量 (0=默认):", count_spin);
// 时间间隔
QDoubleSpinBox* interval_spin = new QDoubleSpinBox(&dialog);
interval_spin->setRange(0.0, 60.0);
interval_spin->setValue(0.5);
interval_spin->setSuffix("");
interval_spin->setDecimals(2);
form->addRow("时间间隔 (0=自动):", interval_spin);
// 传输模式
QComboBox* mode_combo = new QComboBox(&dialog);
mode_combo->addItem("原图", 0);
mode_combo->addItem("缩略图", 1);
form->addRow("传输模式:", mode_combo);
// ROS2节点IP地址
QLineEdit* ip_edit = new QLineEdit(&dialog);
ip_edit->setText(ros2_node_ip_);
form->addRow("ROS2节点IP地址:", ip_edit);
// HTTP端口
QSpinBox* port_spin = new QSpinBox(&dialog);
port_spin->setRange(1, 65535);
port_spin->setValue(ros2_http_port_);
form->addRow("HTTP端口:", port_spin);
QDialogButtonBox* buttonBox = new QDialogButtonBox(
QDialogButtonBox::Ok | QDialogButtonBox::Cancel,
Qt::Horizontal, &dialog);
form->addRow(buttonBox);
connect(buttonBox, &QDialogButtonBox::accepted, &dialog, &QDialog::accept);
connect(buttonBox, &QDialogButtonBox::rejected, &dialog, &QDialog::reject);
if (dialog.exec() == QDialog::Accepted) {
double duration = duration_spin->value();
int count = count_spin->value();
double interval = interval_spin->value();
int mode = mode_combo->currentData().toInt();
// 保存IP和端口配置
ros2_node_ip_ = ip_edit->text();
ros2_http_port_ = port_spin->value();
// 通过HTTP调用
triggerCaptureViaHttp(duration, count, interval, mode);
}
}
void MainWindow::triggerCaptureViaHttp(double duration, int count, double interval, int mode) {
// 构建JSON请求
QJsonObject json;
json["duration"] = duration;
json["count"] = count;
json["interval"] = interval;
json["transmission_mode"] = mode;
QJsonDocument doc(json);
QByteArray json_data = doc.toJson();
// 构建URL
QString url_str = QString("http://%1:%2/api/v1/trigger_capture")
.arg(ros2_node_ip_)
.arg(ros2_http_port_);
QUrl url(url_str);
// 创建请求
QNetworkRequest request(url);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
request.setRawHeader("User-Agent", "SkyLink-Qt-Station/1.0");
// 发送POST请求
QNetworkReply* reply = network_manager_->post(request, json_data);
// 设置超时5秒
QTimer::singleShot(5000, reply, &QNetworkReply::abort);
statusBar()->showMessage(QString("正在发送拍照请求到 %1:%2...").arg(ros2_node_ip_).arg(ros2_http_port_), 2000);
}
void MainWindow::onHttpReply(QNetworkReply* reply) {
if (!reply) {
return;
}
// 检查错误
if (reply->error() != QNetworkReply::NoError) {
QString error_msg;
if (reply->error() == QNetworkReply::TimeoutError) {
error_msg = "请求超时请检查网络连接和ROS2节点IP地址";
} else if (reply->error() == QNetworkReply::ConnectionRefusedError) {
error_msg = QString("连接被拒绝请确认ROS2节点HTTP服务器正在运行 (http://%1:%2)")
.arg(ros2_node_ip_).arg(ros2_http_port_);
} else {
error_msg = QString("网络错误: %1").arg(reply->errorString());
}
QMessageBox::warning(this, "HTTP请求失败", error_msg);
statusBar()->showMessage("HTTP请求失败", 3000);
reply->deleteLater();
return;
}
// 读取响应
QByteArray response_data = reply->readAll();
int status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
// 解析JSON响应
QJsonParseError parse_error;
QJsonDocument doc = QJsonDocument::fromJson(response_data, &parse_error);
if (parse_error.error != QJsonParseError::NoError) {
QMessageBox::warning(this, "响应解析错误",
QString("无法解析服务器响应:\n%1").arg(QString::fromUtf8(response_data)));
statusBar()->showMessage("响应解析失败", 3000);
reply->deleteLater();
return;
}
QJsonObject json = doc.object();
bool success = json["success"].toBool();
QString message = json["message"].toString();
int total_photos = json["total_photos"].toInt();
if (status_code == 200 && success) {
QMessageBox::information(this, "成功",
QString("拍照任务已启动!\n\n%1\n\n总照片数: %2")
.arg(message)
.arg(total_photos));
statusBar()->showMessage(QString("拍照任务已启动 - %1").arg(message), 3000);
} else {
QMessageBox::warning(this, "请求失败",
QString("服务器返回错误:\n%1\n\n状态码: %2")
.arg(message)
.arg(status_code));
statusBar()->showMessage(QString("请求失败: %1").arg(message), 3000);
}
reply->deleteLater();
}
void MainWindow::on_device_info_received(const DeviceInfo& info) {
QString text = QString("分辨率: %1 x %2\n帧率: %3\n格式: %4\n设备: %5 (%6)\n当前FPS: %7\n总帧: %8")
.arg(info.width)

View File

@@ -17,6 +17,8 @@
#include <QUdpSocket>
#include <QTimer>
#include <QImage>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include "DeviceInfo.h"
#include "DeviceInfoReceiver.h"
#include <memory>
@@ -47,7 +49,7 @@ private slots:
/**
* @brief 处理接收到的完整帧
*/
void on_frame_received(const QImage& img, double lat, double lon, double alt);
void on_frame_received(const QImage& img, double lat, double lon, double alt, uint32_t photo_number);
/**
* @brief 处理统计信息更新
@@ -68,6 +70,11 @@ private slots:
* @brief 设置按钮点击
*/
void on_settings_clicked();
/**
* @brief 触发拍照按钮点击
*/
void on_trigger_capture_clicked();
/**
* @brief 收到设备信息
@@ -87,6 +94,7 @@ private:
QPushButton* save_frame_btn_; ///< 保存帧按钮
QPushButton* record_btn_; ///< 录制按钮
QPushButton* settings_btn_; ///< 设置按钮
QPushButton* trigger_capture_btn_; ///< 触发拍照按钮
// ========================================================================
// 业务逻辑对象
@@ -95,6 +103,7 @@ private:
std::shared_ptr<GroundReceiver> receiver_; ///< UDP 接收器
std::shared_ptr<DeviceInfoReceiver> device_info_receiver_; ///< 设备信息接收器
std::shared_ptr<DataLogger> logger_; ///< 数据记录器
QNetworkAccessManager* network_manager_; ///< HTTP 网络管理器
// ========================================================================
// 状态变量
@@ -105,6 +114,10 @@ private:
double current_lon_ = 0.0; ///< 当前经度
double current_alt_ = 0.0; ///< 当前海拔
bool is_recording_ = false; ///< 是否正在录制
uint32_t total_photos_received_ = 0; ///< 接收到的总照片数
uint32_t current_photo_number_ = 0; ///< 当前照片编号
QString ros2_node_ip_ = "localhost"; ///< ROS2 节点 IP 地址
int ros2_http_port_ = 8080; ///< ROS2 HTTP API 端口
// ========================================================================
// 初始化函数
@@ -124,4 +137,19 @@ private:
* @brief 创建菜单栏
*/
void create_menus();
/**
* @brief 通过 HTTP 触发拍照
* @param duration 总时间(秒)
* @param count 拍照数量
* @param interval 时间间隔(秒)
* @param mode 传输模式0=原图1=缩略图)
*/
void triggerCaptureViaHttp(double duration, int count, double interval, int mode);
/**
* @brief HTTP 请求响应处理
* @param reply 网络响应
*/
void onHttpReply(QNetworkReply* reply);
};

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