From f2c909e42b81bb7b589c956bfcf90dba3e16d0a8 Mon Sep 17 00:00:00 2001
From: zhaowenyu <35589726@qq.com>
Date: Wed, 26 Nov 2025 10:12:42 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev

---
 ard-work/src/main/java/com/ard/work/component/websocket/handler/UavAllManager.java         |    8 ++++
 ard-work/src/main/java/com/ard/work/domain/dto/manual/FlyRoundControlDTO.java              |    4 ++
 ard-work/src/main/java/com/ard/work/service/impl/TyServiceImpl.java                        |   22 +++++++----
 ard-work/src/main/java/com/ard/work/domain/dto/wayline/WaylineInfo.java                    |   19 +++++++++
 ard-work/src/main/java/com/ard/work/component/netty/command/manual/FlyRoundControlCmd.java |    5 ++
 ard-work/src/main/java/com/ard/work/domain/cache/UavWaylineCache.java                      |   42 +++++++++++++++++++++
 6 files changed, 91 insertions(+), 9 deletions(-)

diff --git a/ard-work/src/main/java/com/ard/work/component/netty/command/manual/FlyRoundControlCmd.java b/ard-work/src/main/java/com/ard/work/component/netty/command/manual/FlyRoundControlCmd.java
index 3684c57..dc9c434 100644
--- a/ard-work/src/main/java/com/ard/work/component/netty/command/manual/FlyRoundControlCmd.java
+++ b/ard-work/src/main/java/com/ard/work/component/netty/command/manual/FlyRoundControlCmd.java
@@ -15,18 +15,20 @@
     private final double longitude;                  // 兴趣点经度
     private final double latitude;                   // 兴趣点纬度
     private final float altitude;                    // 兴趣点高度
+    private final float height;                      // 飞行高度
     private final float speed;                       // 环绕速度
     private final float radius;                      // 环绕半径
     private final byte flyMode;                      // 飞行模式
 
     public FlyRoundControlCmd(FlyRoundControlDTO flyRoundControlDTO) {
         setDataHeader((short) 0x7479);
-        setDataLength((short) 47);
+        setDataLength((short) 51);
         setBoxSn(flyRoundControlDTO.getBoxSn().getBytes());
         setCmdCode((byte) 0xD1);
         this.longitude = flyRoundControlDTO.getLongitude();
         this.latitude = flyRoundControlDTO.getLatitude();
         this.altitude = flyRoundControlDTO.getAltitude();
+        this.height=flyRoundControlDTO.getHeight();
         this.speed = flyRoundControlDTO.getSpeed();
         this.radius= flyRoundControlDTO.getRadius();
         this.flyMode = flyRoundControlDTO.getFlyMode();
@@ -43,6 +45,7 @@
         out.writeDouble(longitude);         // 写入兴趣点经度
         out.writeDouble(latitude);          // 写入兴趣点纬度
         out.writeFloat(altitude);           // 写入兴趣点高度
+        out.writeFloat(height);             // 写入飞行高度
         out.writeFloat(speed);              // 写入环绕速度
         out.writeFloat(radius);             // 写入环绕半径
         out.writeByte(flyMode);             // 写入飞行模式
diff --git a/ard-work/src/main/java/com/ard/work/component/websocket/handler/UavAllManager.java b/ard-work/src/main/java/com/ard/work/component/websocket/handler/UavAllManager.java
index 72c2fe7..ecfee04 100644
--- a/ard-work/src/main/java/com/ard/work/component/websocket/handler/UavAllManager.java
+++ b/ard-work/src/main/java/com/ard/work/component/websocket/handler/UavAllManager.java
@@ -6,9 +6,11 @@
 import com.ard.work.domain.cache.UavSignalInfoCache;
 import com.ard.work.domain.cache.UavStateCache;
 import com.ard.work.domain.cache.UavTelemetryDataCache;
+import com.ard.work.domain.cache.UavWaylineCache;
 import com.ard.work.domain.dto.signal.SignalInfo;
 import com.ard.work.domain.dto.state.UavState;
 import com.ard.work.domain.dto.telemetry.TelemetryData;
+import com.ard.work.domain.dto.wayline.WaylineInfo;
 import com.ard.work.service.control.UavControlService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -33,10 +35,16 @@
         log.debug("获取无人机所有数据");
         Map<String, Object> map = new HashMap<>();
         map.put("boxSn", boxSn);
+
+        WaylineInfo waylineInfo = UavWaylineCache.get(boxSn);
+        map.put("wayline", waylineInfo);
+
         UavState uavState = UavStateCache.get(boxSn);
         map.put("state", uavState);
+
         TelemetryData uavTelemetryData = UavTelemetryDataCache.get(boxSn);
         map.put("telemetry", uavTelemetryData);
+
         SignalInfo uavSignalInfo = UavSignalInfoCache.get(boxSn);
         map.put("signal", uavSignalInfo);
         // 获取当前控制飞行的用户ID
diff --git a/ard-work/src/main/java/com/ard/work/domain/cache/UavWaylineCache.java b/ard-work/src/main/java/com/ard/work/domain/cache/UavWaylineCache.java
new file mode 100644
index 0000000..0c8fefe
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/work/domain/cache/UavWaylineCache.java
@@ -0,0 +1,42 @@
+package com.ard.work.domain.cache;
+
+import com.ard.work.domain.dto.signal.SignalInfo;
+import com.ard.work.domain.dto.wayline.WaylineInfo;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 无人机当前航线缓存
+ *
+ * @author 刘苏义
+ * @date 2024/10/24 8:55
+ */
+public class UavWaylineCache {
+
+    // 使用 ConcurrentHashMap 来缓存无人机信道质量数据,key 是 boxSn(无人机序列号)
+    private static final ConcurrentHashMap<String, WaylineInfo> cache = new ConcurrentHashMap<>();
+
+    // 存储无人机信道质量数据到缓存
+    public static void put(WaylineInfo waylineInfo) {
+        cache.put(waylineInfo.getBoxSn(), waylineInfo);
+    }
+
+    // 从缓存中获取信道质量数据
+    public static WaylineInfo get(String boxSn) {
+        return cache.get(boxSn);
+    }
+
+    // 删除缓存中的信道质量数据
+    public static void remove(String boxSn) {
+        cache.remove(boxSn);
+    }
+
+    // 定时任务使用:判断状遥测数据是否变化,但不更新缓存
+    public static boolean hasChanged(String boxSn, WaylineInfo waylineInfo) {
+        WaylineInfo oldWaylineInfo= cache.get(boxSn);
+        if (oldWaylineInfo == null) {
+            return true; // 没有缓存,算作变化
+        }
+        return !oldWaylineInfo.equals(waylineInfo); // true = 有变化
+    }
+}
diff --git a/ard-work/src/main/java/com/ard/work/domain/dto/manual/FlyRoundControlDTO.java b/ard-work/src/main/java/com/ard/work/domain/dto/manual/FlyRoundControlDTO.java
index 7a10ec4..c2cd1c1 100644
--- a/ard-work/src/main/java/com/ard/work/domain/dto/manual/FlyRoundControlDTO.java
+++ b/ard-work/src/main/java/com/ard/work/domain/dto/manual/FlyRoundControlDTO.java
@@ -33,6 +33,10 @@
     private Float altitude;
 
     /**
+     * 飞行高度
+     */
+    private Float height;
+    /**
      * 环绕速度
      */
     private Float speed;
diff --git a/ard-work/src/main/java/com/ard/work/domain/dto/wayline/WaylineInfo.java b/ard-work/src/main/java/com/ard/work/domain/dto/wayline/WaylineInfo.java
new file mode 100644
index 0000000..e1f9f93
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/work/domain/dto/wayline/WaylineInfo.java
@@ -0,0 +1,19 @@
+package com.ard.work.domain.dto.wayline;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * Description: 当前航线信息
+ * Author: lsy
+ * Date: 2025年11月25日16:29
+ **/
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class WaylineInfo {
+    private String boxSn;
+    private String waylineId;
+}
diff --git a/ard-work/src/main/java/com/ard/work/service/impl/TyServiceImpl.java b/ard-work/src/main/java/com/ard/work/service/impl/TyServiceImpl.java
index 432a475..3d40757 100644
--- a/ard-work/src/main/java/com/ard/work/service/impl/TyServiceImpl.java
+++ b/ard-work/src/main/java/com/ard/work/service/impl/TyServiceImpl.java
@@ -29,6 +29,7 @@
 import com.ard.work.domain.cache.UavSignalInfoCache;
 import com.ard.work.domain.cache.UavStateCache;
 import com.ard.work.domain.cache.UavTelemetryDataCache;
+import com.ard.work.domain.cache.UavWaylineCache;
 import com.ard.work.domain.dto.BoxHistoryDTO;
 import com.ard.work.domain.dto.BoxPhotosDTO;
 import com.ard.work.domain.dto.BoxSettingsDTO;
@@ -123,8 +124,8 @@
         if (ardDroneInfo == null) {
             throw new ControlException("未找到对应的飞行器信息,boxSn:{}" + boxSn);
         }
-        
-        
+
+
         TyHttpCommonReceiver<BoxStreamUrlReceiver> boxLiveUrl = tyClient.getBoxLiveUrl(ardDroneInfo.getServerId(),
                 boxSn);
         return boxLiveUrl == null ? null : boxLiveUrl.getContent();
@@ -596,8 +597,8 @@
         if (ardDroneInfo == null) {
             throw new ControlException("未找到对应的飞行器信息,boxSn:{}" + boxSn);
         }
-        
-        
+
+
         FlyPointControlCancelCmd flyPointControlCancelCmd = new FlyPointControlCancelCmd(flyPointControlCancelDTO);
         this.sendMessage(ardDroneInfo.getServerId(), flyPointControlCancelCmd);
         return true;
@@ -614,8 +615,8 @@
         if (ardDroneInfo == null) {
             throw new ControlException("未找到对应的飞行器信息,boxSn:{}" + boxSn);
         }
-        FlyRoundControlCmd flyPointControlCmd = new FlyRoundControlCmd(flyRoundControlDTO);
-        this.sendMessage(ardDroneInfo.getServerId(), flyPointControlCmd);
+        FlyRoundControlCmd flyRoundControlCmd = new FlyRoundControlCmd(flyRoundControlDTO);
+        this.sendMessage(ardDroneInfo.getServerId(), flyRoundControlCmd);
         return true;
     }
 
@@ -645,8 +646,8 @@
         if (ardDroneInfo == null) {
             throw new ControlException("未找到对应的飞行器信息,boxSn:{}" + boxSn);
         }
-        
-        
+
+
         EmergencyBrakeCmd emergencyBrakeCmd = new EmergencyBrakeCmd(emeragencyBrakeDTO);
         this.sendMessage(ardDroneInfo.getServerId(), emergencyBrakeCmd);
         return true;
@@ -941,6 +942,11 @@
                 // 处理无人机状态消息
                 UavStateCmd uavStateCmd = (UavStateCmd) tyCommand;
                 UavStateCache.put(uavStateCmd.getUavState());
+                int flightMode = uavStateCmd.getUavState().getFlightControllerState().getFlightMode();
+                if (flightMode != 14) {
+                    //不在航线中 移除航线信息
+                    UavWaylineCache.remove(uavStateCmd.getUavState().getBoxSn());
+                }
                 //logPrint("无人机状态", uavStateCmd.getUavState().getBoxSn());
                 // WebSocketUtil.sendMessageAll(uavStateCmd.getUavState());
                 break;

--
Gitblit v1.9.3