From ed6936545d20cc490145d2936cee4387be2afd53 Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期一, 22 十二月 2025 19:04:34 +0800
Subject: [PATCH] 优化了导航预览模式

---
 src/gecaoji/Device.java |  184 ++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 154 insertions(+), 30 deletions(-)

diff --git a/src/gecaoji/Device.java b/src/gecaoji/Device.java
index aa4b77d..9e26eff 100644
--- a/src/gecaoji/Device.java
+++ b/src/gecaoji/Device.java
@@ -1,6 +1,7 @@
 package gecaoji;
 import baseStation.BaseStation;
 import set.Setsys;
+import zhuye.MowerLocationData;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -83,6 +84,12 @@
     // 鍓茶崏鏈虹伅寮�鍏崇姸鎬侊細1寮�鍚紝0鍏抽棴锛�-1鏈煡
     private String mowerBladeHeight = "-1";
     // 鍓茶崏鏈哄垁鐩橀珮搴︼細-1鏈煡
+    private String mowerWidth;
+    // 鍓茶崏鏈哄搴︼紝鍗曚綅绫�
+    private String mowerLength;
+    // 鍓茶崏鏈洪暱搴︼紝鍗曚綅绫�
+    private String mowingSafetyDistance;
+    // 鍓茶崏瀹夊叏璺濈锛屽崟浣嶇背
 
     private static final double METERS_PER_DEGREE_LAT = 111320.0d;
     
@@ -155,6 +162,9 @@
         if (mowerStartStatus != null) properties.setProperty("mowerStartStatus", mowerStartStatus);
         if (mowerLightStatus != null) properties.setProperty("mowerLightStatus", mowerLightStatus);
         if (mowerBladeHeight != null) properties.setProperty("mowerBladeHeight", mowerBladeHeight);
+        if (mowerWidth != null) properties.setProperty("mowerWidth", mowerWidth);
+        if (mowerLength != null) properties.setProperty("mowerLength", mowerLength);
+        if (mowingSafetyDistance != null) properties.setProperty("mowingSafetyDistance", mowingSafetyDistance);
         
         // 淇濆瓨鍒版枃浠�
         try (FileOutputStream output = new FileOutputStream("device.properties");
@@ -198,6 +208,9 @@
         target.mowerStartStatus = properties.getProperty("mowerStartStatus", "-1");
         target.mowerLightStatus = properties.getProperty("mowerLightStatus", "-1");
         target.mowerBladeHeight = properties.getProperty("mowerBladeHeight", "-1");
+        target.mowerWidth = properties.getProperty("mowerWidth", "-1");
+        target.mowerLength = properties.getProperty("mowerLength", "-1");
+        target.mowingSafetyDistance = properties.getProperty("mowingSafetyDistance", "-1");
     }
 
     private void applyDefaults(Device target) {
@@ -233,6 +246,9 @@
         target.mowerStartStatus = "-1";
         target.mowerLightStatus = "-1";
         target.mowerBladeHeight = "-1";
+        target.mowerWidth = "-1";
+        target.mowerLength = "-1";
+        target.mowingSafetyDistance = "-1";
     }
 
     public static synchronized Device initializeActiveDevice(String mowerId) { // 鏍规嵁璁惧ID鍒濆鍖栨椿璺冭澶�
@@ -343,6 +359,15 @@
             case "mowerBladeHeight":
                 this.mowerBladeHeight = value;
                 return true;
+            case "mowerWidth":
+                this.mowerWidth = value;
+                return true;
+            case "mowerLength":
+                this.mowerLength = value;
+                return true;
+            case "mowingSafetyDistance":
+                this.mowingSafetyDistance = value;
+                return true;
             default:
                 System.err.println("鏈煡瀛楁: " + fieldName);
                 return false;
@@ -392,35 +417,51 @@
             mowerNumber = incomingDeviceId;
         }
 
+        // 妫�鏌ユ槸鍚︽鍦ㄥ鑸瑙堟ā寮�
+        boolean isNavigating = checkIfNavigating();
+
         String latitudeValue = sanitizeField(fields, 2);
         String latitudeHemisphere = sanitizeField(fields, 3);
         String longitudeValue = sanitizeField(fields, 4);
         String longitudeHemisphere = sanitizeField(fields, 5);
 
-        String combinedLatitude = combineCoordinate(latitudeValue, latitudeHemisphere);
-        if (hasMeaningfulValue(combinedLatitude)) {
-            realtimeLatitude = combinedLatitude;
-        }
-        String combinedLongitude = combineCoordinate(longitudeValue, longitudeHemisphere);
-        if (hasMeaningfulValue(combinedLongitude)) {
-            realtimeLongitude = combinedLongitude;
+        // 鍙湁鍦ㄩ潪瀵艰埅棰勮妯″紡涓嬫墠鏇存柊浣嶇疆鐩稿叧鏁版嵁
+        if (!isNavigating) {
+            String combinedLatitude = combineCoordinate(latitudeValue, latitudeHemisphere);
+            if (hasMeaningfulValue(combinedLatitude)) {
+                realtimeLatitude = combinedLatitude;
+            }
+            String combinedLongitude = combineCoordinate(longitudeValue, longitudeHemisphere);
+            if (hasMeaningfulValue(combinedLongitude)) {
+                realtimeLongitude = combinedLongitude;
+            }
+
+            String altitudeValue = sanitizeField(fields, 9);
+            if (hasMeaningfulValue(altitudeValue)) {
+                realtimeAltitude = altitudeValue;
+            }
+
+            // 鏇存柊浣嶇疆鍧愭爣
+            updateRelativeCoordinates(latitudeValue, latitudeHemisphere, longitudeValue, longitudeHemisphere);
+            
+            // 鏇存柊鑸悜瑙掞紙浣嶇疆鐩稿叧锛�
+            heading = defaultIfEmpty(sanitizeField(fields, 19));
         }
 
-        String altitudeValue = sanitizeField(fields, 9);
-        if (hasMeaningfulValue(altitudeValue)) {
-            realtimeAltitude = altitudeValue;
-        }
-
+        // 鍏朵粬鏁版嵁锛堢數閲忋�佸崼鏄熸暟绛夛級濮嬬粓鏇存柊
         positioningStatus = defaultIfEmpty(sanitizeField(fields, 6));
+        // 鍚屾鍒扮粯鍒舵ā鍧楃殑鏁版嵁婧愶紝淇濊瘉寰�杩旂粯鍒跺畾鏃跺櫒鑳借瘑鍒畾浣嶈川閲�
+        try {
+            MowerLocationData.updateProperty("positioningQuality", positioningStatus);
+        } catch (Throwable ignored) {
+            // 闃插尽寮忥細鍗充娇鏇存柊澶辫触涔熶笉褰卞搷璁惧鏁版嵁澶勭悊
+        }
         satelliteCount = defaultIfEmpty(sanitizeField(fields, 7));
         differentialAge = defaultIfEmpty(sanitizeField(fields, 13));
         battery = defaultIfEmpty(sanitizeField(fields, 16));
         pitch = defaultIfEmpty(sanitizeField(fields, 17));
         realtimeSpeed = defaultIfEmpty(sanitizeField(fields, 18));
-        heading = defaultIfEmpty(sanitizeField(fields, 19));
         GupdateTime = String.valueOf(System.currentTimeMillis());
-
-        updateRelativeCoordinates(latitudeValue, latitudeHemisphere, longitudeValue, longitudeHemisphere);
     }
     
     /**涓插彛鏇存柊GNGGA鏁版嵁*/
@@ -440,33 +481,86 @@
             return;
         }
 
-        
+        // 妫�鏌ユ槸鍚︽鍦ㄥ鑸瑙堟ā寮�
+        boolean isNavigating = checkIfNavigating();
+
         String latitudeValue = sanitizeField(fields, 2);
         String latitudeHemisphere = sanitizeField(fields, 3);
         String longitudeValue = sanitizeField(fields, 4);
         String longitudeHemisphere = sanitizeField(fields, 5);
 
-        String combinedLatitude = combineCoordinate(latitudeValue, latitudeHemisphere);
-        if (hasMeaningfulValue(combinedLatitude)) {
-            realtimeLatitude = combinedLatitude;
-        }
-        String combinedLongitude = combineCoordinate(longitudeValue, longitudeHemisphere);
-        if (hasMeaningfulValue(combinedLongitude)) {
-            realtimeLongitude = combinedLongitude;
+        // 鍙湁鍦ㄩ潪瀵艰埅棰勮妯″紡涓嬫墠鏇存柊浣嶇疆鐩稿叧鏁版嵁
+        if (!isNavigating) {
+            String combinedLatitude = combineCoordinate(latitudeValue, latitudeHemisphere);
+            if (hasMeaningfulValue(combinedLatitude)) {
+                realtimeLatitude = combinedLatitude;
+            }
+            String combinedLongitude = combineCoordinate(longitudeValue, longitudeHemisphere);
+            if (hasMeaningfulValue(combinedLongitude)) {
+                realtimeLongitude = combinedLongitude;
+            }
+
+            String altitudeValue = sanitizeField(fields, 9);
+            if (hasMeaningfulValue(altitudeValue)) {
+                realtimeAltitude = altitudeValue;
+            }
+
+            // 鏇存柊浣嶇疆鍧愭爣
+            updateRelativeCoordinates(latitudeValue, latitudeHemisphere, longitudeValue, longitudeHemisphere);
+            
+            // 涓插彛鏀跺埌GNGGA鏁版嵁鍚庯紝瑙﹀彂鎷栧熬鏇存柊
+            notifyMowerTrailUpdate();
         }
 
-        String altitudeValue = sanitizeField(fields, 9);
-        if (hasMeaningfulValue(altitudeValue)) {
-            realtimeAltitude = altitudeValue;
-        }
-
+        // 鍏朵粬鏁版嵁锛堢數閲忋�佸崼鏄熸暟绛夛級濮嬬粓鏇存柊
         positioningStatus = defaultIfEmpty(sanitizeField(fields, 6));
+        // 鍚屾鍒扮粯鍒舵ā鍧楃殑鏁版嵁婧愶紝淇濊瘉寰�杩旂粯鍒跺畾鏃跺櫒鑳借瘑鍒畾浣嶈川閲�
+        try {
+            MowerLocationData.updateProperty("positioningQuality", positioningStatus);
+        } catch (Throwable ignored) {
+            // 闃插尽寮忥細鍗充娇鏇存柊澶辫触涔熶笉褰卞搷璁惧鏁版嵁澶勭悊
+        }
         satelliteCount = defaultIfEmpty(sanitizeField(fields, 7));
         differentialAge = defaultIfEmpty(sanitizeField(fields, 13));       
         realtimeSpeed ="0";        
         GupdateTime = String.valueOf(System.currentTimeMillis());
-
-        updateRelativeCoordinates(latitudeValue, latitudeHemisphere, longitudeValue, longitudeHemisphere);
+    }
+    
+    /**
+     * 閫氱煡鍦板浘娓叉煋鍣ㄦ洿鏂板壊鑽夋満鎷栧熬
+     * 褰撲覆鍙f敹鍒癎NGGA鏁版嵁骞舵洿鏂颁綅缃悗璋冪敤
+     */
+    /**
+     * 妫�鏌ユ槸鍚︽鍦ㄥ鑸瑙堟ā寮�
+     * @return 濡傛灉姝e湪瀵艰埅棰勮杩斿洖true锛屽惁鍒欒繑鍥瀎alse
+     */
+    private boolean checkIfNavigating() {
+        try {
+            dikuai.daohangyulan nav = dikuai.daohangyulan.getInstance();
+            if (nav != null) {
+                return nav.isNavigating();
+            }
+        } catch (Exception e) {
+            // 濡傛灉鑾峰彇瀵艰埅瀹炰緥澶辫触锛岃繑鍥瀎alse锛堜笉褰卞搷涓昏鍔熻兘锛�
+        }
+        return false;
+    }
+    
+    private void notifyMowerTrailUpdate() {
+        try {
+            // 閫氳繃Shouye.getInstance()鑾峰彇瀹炰緥锛岄伩鍏嶅惊鐜緷璧�
+            zhuye.Shouye shouye = zhuye.Shouye.getInstance();
+            if (shouye != null) {
+                zhuye.MapRenderer mapRenderer = shouye.getMapRenderer();
+                if (mapRenderer != null) {
+                    // 璋冪敤鏇存柊鎷栧熬鏂规硶
+                    mapRenderer.forceUpdateIdleMowerTrail();
+                }
+            }
+        } catch (Exception e) {
+            // 濡傛灉璋冪敤澶辫触锛岄潤榛樺鐞嗭紙涓嶅奖鍝嶄富瑕佸姛鑳斤級
+            // System.err.println("閫氱煡鎷栧熬鏇存柊澶辫触: " + e.getMessage());
+        }
     }
 
     private void updateRelativeCoordinates(String latValue, String latHemisphere,
@@ -498,6 +592,9 @@
         if (Double.isFinite(eastMeters) && Double.isFinite(northMeters)) {
             realtimeX = formatMeters(eastMeters);
             realtimeY = formatMeters(northMeters);
+            
+            // 淇濆瓨鍧愭爣鍒板伐鍏风被
+            lujing.SavaXyZuobiao.addCoordinate(eastMeters, northMeters);
         }
     }
 
@@ -811,6 +908,30 @@
         this.mowerBladeHeight = mowerBladeHeight;
     }
 
+    public String getMowerWidth() { // 鑾峰彇鍓茶崏鏈哄搴�
+        return mowerWidth;
+    }
+
+    public void setMowerWidth(String mowerWidth) { // 璁剧疆鍓茶崏鏈哄搴�
+        this.mowerWidth = mowerWidth;
+    }
+
+    public String getMowerLength() { // 鑾峰彇鍓茶崏鏈洪暱搴�
+        return mowerLength;
+    }
+
+    public void setMowerLength(String mowerLength) { // 璁剧疆鍓茶崏鏈洪暱搴�
+        this.mowerLength = mowerLength;
+    }
+
+    public String getMowingSafetyDistance() { // 鑾峰彇鍓茶崏瀹夊叏璺濈
+        return mowingSafetyDistance;
+    }
+
+    public void setMowingSafetyDistance(String mowingSafetyDistance) { // 璁剧疆鍓茶崏瀹夊叏璺濈
+        this.mowingSafetyDistance = mowingSafetyDistance;
+    }
+
     @Override
     public String toString() { // 杈撳嚭瀵硅薄淇℃伅
         return "Device{" +
@@ -842,6 +963,9 @@
                 ", mowerStartStatus='" + mowerStartStatus + '\'' +
                 ", mowerLightStatus='" + mowerLightStatus + '\'' +
                 ", mowerBladeHeight='" + mowerBladeHeight + '\'' +
+                ", mowerWidth='" + mowerWidth + '\'' +
+                ", mowerLength='" + mowerLength + '\'' +
+                ", mowingSafetyDistance='" + mowingSafetyDistance + '\'' +
                 '}';
     }
 }
\ No newline at end of file

--
Gitblit v1.10.0