拍照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 3. 检查魔数是否为 0xAA55
✗ 否 → 丢弃该包 ✗ 否 → 丢弃该包
是 → 继续 是 → 继续
4. 根据 frame_id 找到对应的帧缓冲区 4. 根据 frame_id 找到对应的帧缓冲区
如果不存在 → 创建新的缓冲区 如果不存在 → 创建新的缓冲区

View File

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

View File

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

View File

@@ -11,6 +11,9 @@
package com.skylink.app.ui package com.skylink.app.ui
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
@@ -19,6 +22,9 @@ import android.widget.Button
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import android.widget.Toast import android.widget.Toast
import android.widget.EditText
import android.widget.ArrayAdapter
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.skylink.app.R import com.skylink.app.R
@@ -31,6 +37,10 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.*
import okhttp3.*
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.RequestBody.Companion.toRequestBody
import org.json.JSONObject
class HomeFragment : Fragment(), UdpReceiverListener { class HomeFragment : Fragment(), UdpReceiverListener {
@@ -48,6 +58,16 @@ class HomeFragment : Fragment(), UdpReceiverListener {
private var statusTextView: TextView? = null private var statusTextView: TextView? = null
private var saveButton: Button? = null private var saveButton: Button? = null
private var recordButton: 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 udpReceiver: UdpReceiver? = null
private var currentFrame: DecodedFrame? = null private var currentFrame: DecodedFrame? = null
private var isRecording = false private var isRecording = false
private var totalPhotosReceived = 0 // 接收到的总照片数
// ======================================================================== // ========================================================================
// 生命周期方法 // 生命周期方法
@@ -92,6 +113,9 @@ class HomeFragment : Fragment(), UdpReceiverListener {
statusTextView = view.findViewById(R.id.status_text) statusTextView = view.findViewById(R.id.status_text)
saveButton = view.findViewById(R.id.save_button) saveButton = view.findViewById(R.id.save_button)
recordButton = view.findViewById(R.id.record_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 { saveButton?.setOnClickListener {
@@ -101,6 +125,18 @@ class HomeFragment : Fragment(), UdpReceiverListener {
recordButton?.setOnClickListener { recordButton?.setOnClickListener {
onRecordToggled() 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) { override fun onFrameDecoded(frame: DecodedFrame) {
currentFrame = frame currentFrame = frame
// 更新照片计数
if (frame.photoNumber > 0) {
totalPhotosReceived++
}
// 移到后台线程执行解码,避免阻塞 UI 线程,进而影响 UDP 接收协程(如果是单核或高负载) // 移到后台线程执行解码,避免阻塞 UI 线程,进而影响 UDP 接收协程(如果是单核或高负载)
lifecycleScope.launch(Dispatchers.Default) { lifecycleScope.launch(Dispatchers.Default) {
@@ -133,7 +174,13 @@ class HomeFragment : Fragment(), UdpReceiverListener {
if (bitmap != null) { if (bitmap != null) {
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
view?.let { view?.let {
videoImageView?.setImageBitmap(bitmap) // 在图像上叠加显示照片编号
val bitmapWithText = if (frame.photoNumber > 0) {
addPhotoNumberToBitmap(bitmap, frame.photoNumber)
} else {
bitmap
}
videoImageView?.setImageBitmap(bitmapWithText)
updateGpsInfo(frame) updateGpsInfo(frame)
} }
} }
@@ -142,10 +189,12 @@ class HomeFragment : Fragment(), UdpReceiverListener {
} }
override fun onStatsUpdated(fps: Int, kbps: Int, packetLoss: Double) { override fun onStatsUpdated(fps: Int, kbps: Int, packetLoss: Double) {
statsTextView?.text = String.format( val statsText = StringBuilder()
"FPS: %d\nSpeed: %d KB/s\nPacket Loss: %.1f%%", statsText.append(String.format("FPS: %d\nSpeed: %d KB/s\nPacket Loss: %.1f%%", fps, kbps, packetLoss))
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?) { override fun onError(message: String, exception: Exception?) {
@@ -201,4 +250,217 @@ class HomeFragment : Fragment(), UdpReceiverListener {
val formatter = SimpleDateFormat("HH:mm:ss", Locale.getDefault()) val formatter = SimpleDateFormat("HH:mm:ss", Locale.getDefault())
return formatter.format(Date(millis)) 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) 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 bitmap
} catch (e: Exception) { } catch (e: Exception) {
Log.e(TAG, "Bitmap 解码失败", e) 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_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:layout_marginStart="4dp" android:layout_marginStart="4dp"
android:layout_marginEnd="4dp"
android:text="⏺ 开始录制" /> 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>
</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 # 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 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 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 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. # 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/main.cpp
/home/flower/code/camera/flyLink/skylink_qt_station/src/DataLogger.cpp /home/flower/code/camera/flyLink/skylink_qt_station/src/GroundReceiver.cpp
/home/flower/code/camera/flyLink/skylink_qt_station/src/DeviceInfo.h /home/flower/code/camera/flyLink/skylink_qt_station/src/MainWindow.h
/home/flower/code/camera/flyLink/skylink_qt_station/src/DeviceInfoReceiver.cpp
/home/flower/code/camera/flyLink/skylink_qt_station/src/DeviceInfoReceiver.h
mmc:Q_OBJECT 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/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/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/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/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/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/q20type_traits.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qalgorithms.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.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/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/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/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/qbytearray.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qbytearrayalgorithms.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/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/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/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/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/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/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/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/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/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/qmetacontainer.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qmetatype.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/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/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/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/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/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/qscopedpointer.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qscopeguard.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/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.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/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/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/qstringalgorithms.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qstringbuilder.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/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/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/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/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/qtnoop.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qtpreprocessorsupport.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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/DeviceInfo.h
mdp:/home/flower/code/camera/flyLink/skylink_qt_station/src/DeviceInfoReceiver.h
mdp:/usr/include/alloca.h mdp:/usr/include/alloca.h
mdp:/usr/include/asm-generic/errno-base.h mdp:/usr/include/asm-generic/errno-base.h
mdp:/usr/include/asm-generic/errno.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/stdarg.h
mdp:/usr/lib/gcc/x86_64-linux-gnu/12/include/stdbool.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 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 /home/flower/code/camera/flyLink/skylink_qt_station/src/GroundReceiver.h
mmc:Q_OBJECT mmc:Q_OBJECT
mdp:/home/flower/code/camera/flyLink/skylink_qt_station/src/GroundReceiver.h 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/stdbool.h
mdp:/usr/lib/gcc/x86_64-linux-gnu/12/include/stddef.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 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/DeviceInfoReceiver.h
/home/flower/code/camera/flyLink/skylink_qt_station/src/MainWindow.h
mmc:Q_OBJECT 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/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/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/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/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/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/q20type_traits.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qalgorithms.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.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/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/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/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/qbytearray.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qbytearrayalgorithms.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/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/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/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/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/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/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/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/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/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/qmetacontainer.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qmetatype.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/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/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/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/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/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/qscopedpointer.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qscopeguard.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/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.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/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/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/qstringalgorithms.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qstringbuilder.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/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/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/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/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/qtnoop.h
mdp:/home/flower/app/Qt/6.5.3/gcc_64/include/QtCore/qtpreprocessorsupport.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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/DeviceInfo.h
mdp:/home/flower/code/camera/flyLink/skylink_qt_station/src/DeviceInfoReceiver.h
mdp:/usr/include/alloca.h mdp:/usr/include/alloca.h
mdp:/usr/include/asm-generic/errno-base.h mdp:/usr/include/asm-generic/errno-base.h
mdp:/usr/include/asm-generic/errno.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/stdarg.h
mdp:/usr/lib/gcc/x86_64-linux-gnu/12/include/stdbool.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 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/DeviceInfoReceiver.cpp
/home/flower/code/camera/flyLink/skylink_qt_station/src/main.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", "lat",
"lon", "lon",
"alt", "alt",
"uint32_t",
"photo_number",
"statsUpdated", "statsUpdated",
"fps", "fps",
"kbs", "kbs",
@@ -56,7 +58,7 @@ static constexpr auto qt_meta_stringdata_CLASSGroundReceiverENDCLASS = QtMocHelp
); );
#else // !QT_MOC_HAS_STRING_DATA #else // !QT_MOC_HAS_STRING_DATA
struct qt_meta_stringdata_CLASSGroundReceiverENDCLASS_t { struct qt_meta_stringdata_CLASSGroundReceiverENDCLASS_t {
uint offsetsAndSizes[30]; uint offsetsAndSizes[34];
char stringdata0[15]; char stringdata0[15];
char stringdata1[13]; char stringdata1[13];
char stringdata2[1]; char stringdata2[1];
@@ -64,14 +66,16 @@ struct qt_meta_stringdata_CLASSGroundReceiverENDCLASS_t {
char stringdata4[4]; char stringdata4[4];
char stringdata5[4]; char stringdata5[4];
char stringdata6[4]; char stringdata6[4];
char stringdata7[13]; char stringdata7[9];
char stringdata8[4]; char stringdata8[13];
char stringdata9[4]; char stringdata9[13];
char stringdata10[6]; char stringdata10[4];
char stringdata11[10]; char stringdata11[4];
char stringdata12[18]; char stringdata12[6];
char stringdata13[13]; char stringdata13[10];
char stringdata14[19]; char stringdata14[18];
char stringdata15[13];
char stringdata16[19];
}; };
#define QT_MOC_LITERAL(ofs, len) \ #define QT_MOC_LITERAL(ofs, len) \
uint(sizeof(qt_meta_stringdata_CLASSGroundReceiverENDCLASS_t::offsetsAndSizes) + 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(33, 3), // "lat"
QT_MOC_LITERAL(37, 3), // "lon" QT_MOC_LITERAL(37, 3), // "lon"
QT_MOC_LITERAL(41, 3), // "alt" QT_MOC_LITERAL(41, 3), // "alt"
QT_MOC_LITERAL(45, 12), // "statsUpdated" QT_MOC_LITERAL(45, 8), // "uint32_t"
QT_MOC_LITERAL(58, 3), // "fps" QT_MOC_LITERAL(54, 12), // "photo_number"
QT_MOC_LITERAL(62, 3), // "kbs" QT_MOC_LITERAL(67, 12), // "statsUpdated"
QT_MOC_LITERAL(66, 5), // "error" QT_MOC_LITERAL(80, 3), // "fps"
QT_MOC_LITERAL(72, 9), // "error_msg" QT_MOC_LITERAL(84, 3), // "kbs"
QT_MOC_LITERAL(82, 17), // "on_udp_read_ready" QT_MOC_LITERAL(88, 5), // "error"
QT_MOC_LITERAL(100, 12), // "on_udp_error" QT_MOC_LITERAL(94, 9), // "error_msg"
QT_MOC_LITERAL(113, 18) // "on_cleanup_timeout" 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", "GroundReceiver",
"frameDecoded", "frameDecoded",
@@ -100,6 +106,8 @@ Q_CONSTINIT static const qt_meta_stringdata_CLASSGroundReceiverENDCLASS_t qt_met
"lat", "lat",
"lon", "lon",
"alt", "alt",
"uint32_t",
"photo_number",
"statsUpdated", "statsUpdated",
"fps", "fps",
"kbs", "kbs",
@@ -127,19 +135,19 @@ Q_CONSTINIT static const uint qt_meta_data_CLASSGroundReceiverENDCLASS[] = {
3, // signalCount 3, // signalCount
// signals: name, argc, parameters, tag, flags, initial metatype offsets // signals: name, argc, parameters, tag, flags, initial metatype offsets
1, 4, 50, 2, 0x06, 1 /* Public */, 1, 5, 50, 2, 0x06, 1 /* Public */,
7, 2, 59, 2, 0x06, 6 /* Public */, 9, 2, 61, 2, 0x06, 7 /* Public */,
10, 1, 64, 2, 0x06, 9 /* Public */, 12, 1, 66, 2, 0x06, 10 /* Public */,
// slots: name, argc, parameters, tag, flags, initial metatype offsets // slots: name, argc, parameters, tag, flags, initial metatype offsets
12, 0, 67, 2, 0x08, 11 /* Private */, 14, 0, 69, 2, 0x08, 12 /* Private */,
13, 0, 68, 2, 0x08, 12 /* Private */, 15, 0, 70, 2, 0x08, 13 /* Private */,
14, 0, 69, 2, 0x08, 13 /* Private */, 16, 0, 71, 2, 0x08, 14 /* Private */,
// signals: parameters // signals: parameters
QMetaType::Void, QMetaType::QImage, QMetaType::Double, QMetaType::Double, QMetaType::Double, 3, 4, 5, 6, QMetaType::Void, QMetaType::QImage, QMetaType::Double, QMetaType::Double, QMetaType::Double, 0x80000000 | 7, 3, 4, 5, 6, 8,
QMetaType::Void, QMetaType::Int, QMetaType::Int, 8, 9, QMetaType::Void, QMetaType::Int, QMetaType::Int, 10, 11,
QMetaType::Void, QMetaType::QString, 11, QMetaType::Void, QMetaType::QString, 13,
// slots: parameters // slots: parameters
QMetaType::Void, 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<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' // method 'statsUpdated'
QtPrivate::TypeAndForceComplete<void, std::false_type>, QtPrivate::TypeAndForceComplete<void, std::false_type>,
QtPrivate::TypeAndForceComplete<int, 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); auto *_t = static_cast<GroundReceiver *>(_o);
(void)_t; (void)_t;
switch (_id) { 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 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 2: _t->error((*reinterpret_cast< std::add_pointer_t<QString>>(_a[1]))); break;
case 3: _t->on_udp_read_ready(); 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) { } else if (_c == QMetaObject::IndexOfMethod) {
int *result = reinterpret_cast<int *>(_a[0]); 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) { if (_t _q_method = &GroundReceiver::frameDecoded; *reinterpret_cast<_t *>(_a[1]) == _q_method) {
*result = 0; *result = 0;
return; return;
@@ -252,9 +261,9 @@ int GroundReceiver::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
} }
// SIGNAL 0 // 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); QMetaObject::activate(this, &staticMetaObject, 0, _a);
} }

View File

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

View File

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

View File

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

View File

@@ -23,6 +23,21 @@
#include <QMessageBox> #include <QMessageBox>
#include <QDebug> #include <QDebug>
#include <QPixmap> #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 <iomanip>
#include <sstream> #include <sstream>
@@ -60,9 +75,14 @@ MainWindow::MainWindow(QWidget* parent)
// 创建记录器 // 创建记录器
logger_ = std::make_shared<DataLogger>("./skylink_data"); 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, bool connected1 = connect(receiver_.get(), qOverload<const QImage&, double, double, double, uint32_t>(&GroundReceiver::frameDecoded),
this, &MainWindow::on_frame_received); this, &MainWindow::on_frame_received);
bool connected2 = connect(receiver_.get(), &GroundReceiver::statsUpdated, bool connected2 = connect(receiver_.get(), &GroundReceiver::statsUpdated,
this, &MainWindow::on_stats_updated); this, &MainWindow::on_stats_updated);
@@ -155,12 +175,14 @@ void MainWindow::init_ui() {
save_frame_btn_ = new QPushButton("📸 保存帧", this); save_frame_btn_ = new QPushButton("📸 保存帧", this);
record_btn_ = new QPushButton("⏺ 开始录制", this); record_btn_ = new QPushButton("⏺ 开始录制", this);
trigger_capture_btn_ = new QPushButton("📷 触发拍照", this);
settings_btn_ = new QPushButton("⚙ 设置", this); settings_btn_ = new QPushButton("⚙ 设置", this);
record_btn_->setCheckable(true); record_btn_->setCheckable(true);
btn_layout->addWidget(save_frame_btn_); btn_layout->addWidget(save_frame_btn_);
btn_layout->addWidget(record_btn_); btn_layout->addWidget(record_btn_);
btn_layout->addWidget(trigger_capture_btn_);
btn_layout->addWidget(settings_btn_); btn_layout->addWidget(settings_btn_);
btn_layout->addStretch(); btn_layout->addStretch();
@@ -177,6 +199,9 @@ void MainWindow::init_connections() {
connect(settings_btn_, &QPushButton::clicked, connect(settings_btn_, &QPushButton::clicked,
this, &MainWindow::on_settings_clicked); this, &MainWindow::on_settings_clicked);
connect(trigger_capture_btn_, &QPushButton::clicked,
this, &MainWindow::on_trigger_capture_clicked);
} }
void MainWindow::create_menus() { 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; static int frame_count = 0;
frame_count++; 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() qDebug() << "收到图像,帧" << frame_count << "大小:" << img.width() << "x" << img.height()
<< "格式:" << img.format(); << "格式:" << img.format() << "照片编号:" << photo_number;
current_image_ = img; current_image_ = img;
current_lat_ = lat; current_lat_ = lat;
current_lon_ = lon; current_lon_ = lon;
current_alt_ = alt; current_alt_ = alt;
current_photo_number_ = photo_number;
if (photo_number > 0) {
total_photos_received_++;
}
// 显示图像 // 显示图像
QPixmap pixmap = QPixmap::fromImage(img); QPixmap pixmap = QPixmap::fromImage(img);
@@ -240,14 +270,29 @@ void MainWindow::on_frame_received(const QImage& img, double lat, double lon, do
return; 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_->setPixmap(scaled_pixmap);
video_label_->setText(""); // 清除文本,显示图片 video_label_->setText(""); // 清除文本,显示图片
// 更新状态栏 // 更新状态栏
statusBar()->showMessage(QString("已接收 %1 帧 | 图像: %2x%3") QString status_text = QString("已接收 %1 帧 | 图像: %2x%3")
.arg(frame_count) .arg(frame_count)
.arg(img.width()) .arg(img.width())
.arg(img.height()), 1000); .arg(img.height());
if (photo_number > 0) {
status_text += QString(" | 照片编号: %1").arg(photo_number);
}
statusBar()->showMessage(status_text, 1000);
// 更新 GPS 标签 // 更新 GPS 标签
std::ostringstream oss; std::ostringstream oss;
@@ -268,6 +313,9 @@ void MainWindow::on_stats_updated(int fps, int kbs) {
oss << "FPS: " << fps << "\n"; oss << "FPS: " << fps << "\n";
oss << "速率: " << kbs << " KB/s\n"; oss << "速率: " << kbs << " KB/s\n";
oss << "丢包率: " << "计算中..." << "%"; oss << "丢包率: " << "计算中..." << "%";
if (total_photos_received_ > 0) {
oss << "\n总照片数: " << total_photos_received_;
}
stats_label_->setText(QString::fromStdString(oss.str())); 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) { 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") QString text = QString("分辨率: %1 x %2\n帧率: %3\n格式: %4\n设备: %5 (%6)\n当前FPS: %7\n总帧: %8")
.arg(info.width) .arg(info.width)

View File

@@ -17,6 +17,8 @@
#include <QUdpSocket> #include <QUdpSocket>
#include <QTimer> #include <QTimer>
#include <QImage> #include <QImage>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include "DeviceInfo.h" #include "DeviceInfo.h"
#include "DeviceInfoReceiver.h" #include "DeviceInfoReceiver.h"
#include <memory> #include <memory>
@@ -47,7 +49,7 @@ private slots:
/** /**
* @brief 处理接收到的完整帧 * @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 处理统计信息更新 * @brief 处理统计信息更新
@@ -68,6 +70,11 @@ private slots:
* @brief 设置按钮点击 * @brief 设置按钮点击
*/ */
void on_settings_clicked(); void on_settings_clicked();
/**
* @brief 触发拍照按钮点击
*/
void on_trigger_capture_clicked();
/** /**
* @brief 收到设备信息 * @brief 收到设备信息
@@ -87,6 +94,7 @@ private:
QPushButton* save_frame_btn_; ///< 保存帧按钮 QPushButton* save_frame_btn_; ///< 保存帧按钮
QPushButton* record_btn_; ///< 录制按钮 QPushButton* record_btn_; ///< 录制按钮
QPushButton* settings_btn_; ///< 设置按钮 QPushButton* settings_btn_; ///< 设置按钮
QPushButton* trigger_capture_btn_; ///< 触发拍照按钮
// ======================================================================== // ========================================================================
// 业务逻辑对象 // 业务逻辑对象
@@ -95,6 +103,7 @@ private:
std::shared_ptr<GroundReceiver> receiver_; ///< UDP 接收器 std::shared_ptr<GroundReceiver> receiver_; ///< UDP 接收器
std::shared_ptr<DeviceInfoReceiver> device_info_receiver_; ///< 设备信息接收器 std::shared_ptr<DeviceInfoReceiver> device_info_receiver_; ///< 设备信息接收器
std::shared_ptr<DataLogger> logger_; ///< 数据记录器 std::shared_ptr<DataLogger> logger_; ///< 数据记录器
QNetworkAccessManager* network_manager_; ///< HTTP 网络管理器
// ======================================================================== // ========================================================================
// 状态变量 // 状态变量
@@ -105,6 +114,10 @@ private:
double current_lon_ = 0.0; ///< 当前经度 double current_lon_ = 0.0; ///< 当前经度
double current_alt_ = 0.0; ///< 当前海拔 double current_alt_ = 0.0; ///< 当前海拔
bool is_recording_ = false; ///< 是否正在录制 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 创建菜单栏 * @brief 创建菜单栏
*/ */
void create_menus(); 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