From 8d662de2fd262b3a485f16e197cb4d0ca2a61cdf Mon Sep 17 00:00:00 2001
From: zsh_root <979909237@qq.com>
Date: 星期三, 10 十二月 2025 17:03:47 +0800
Subject: [PATCH] 发布版V1.0

---
 src/home/SerialCommunicationPanel.java |  193 +++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 182 insertions(+), 11 deletions(-)

diff --git a/src/home/SerialCommunicationPanel.java b/src/home/SerialCommunicationPanel.java
index b754d77..30e41ae 100644
--- a/src/home/SerialCommunicationPanel.java
+++ b/src/home/SerialCommunicationPanel.java
@@ -32,12 +32,14 @@
     private UpgradePanel upgradePanel;
     private JButton readParamsBtn, saveParamsBtn, restartDeviceBtn, resetFactoryBtn;
     private boolean isOpen = false;
+    // 鍦ㄧ被鍙橀噺澹版槑閮ㄥ垎娣诲姞鏂版寜閽�
+    private JButton readRelayParamsBtn, saveRelayParamsBtn;
     
     // 鏂板锛氫繚瀛樻爣绛惧紩鐢ㄧ敤浜庤瑷�鍒囨崲
     private JLabel selectSerialLabel, baudRateLabel;
     
     // 鏂板锛氫覆鍙f湇鍔″疄渚�
-    private SerialPortService serialService;
+    private static SerialPortService serialService;
     
     // 鏂板锛氭暟鎹棩蹇楅潰鏉垮紩鐢�
     private DataLogPanel dataLogPanel;
@@ -90,8 +92,160 @@
         saveParamsBtn.addActionListener(e -> saveParameters());
         restartDeviceBtn.addActionListener(e -> restartDevice());
         resetFactoryBtn.addActionListener(e -> resetFactory());
+        // 鏂板缁х數鍣ㄥ弬鏁版寜閽洃鍚櫒
+        readRelayParamsBtn.addActionListener(e -> readRelayParameters());
+        saveRelayParamsBtn.addActionListener(e -> saveRelayParameters());
     }
-    
+
+    // 淇敼鍚庣殑璇诲彇缁х數鍣ㄥ弬鏁版柟娉�
+    private void readRelayParameters() {
+        if (!serialService.isOpen()) {
+            JOptionPane.showMessageDialog(this, getString("open_serial_first"), getString("error"), JOptionPane.ERROR_MESSAGE);
+            return;
+        }
+
+        // 缁х數鍣ㄥ弬鏁拌鍙栧懡浠� - 闇�瑕佹牴鎹疄闄呭崗璁畾涔�
+        String readRelayCommand = "55AA030601F00A00FBFE"; // 绀轰緥鍛戒护锛岄渶瑕佹浛鎹负瀹為檯鐨勭户鐢靛櫒璇诲彇鍛戒护
+        byte[] data = hexStringToByteArray(readRelayCommand);
+
+        if (data == null) {
+            JOptionPane.showMessageDialog(this, getString("invalid_hex_format"), getString("error"), JOptionPane.ERROR_MESSAGE);
+            return;
+        }
+
+        // 鍦ㄦ暟鎹棩蹇楃獥鍙f樉绀哄彂閫佺殑鎸囦护
+        if (dataLogPanel != null) {
+            dataLogPanel.addLogData(data, getString("send.read.relay.command"));
+        }
+
+        AtomicBoolean responseReceived = new AtomicBoolean(false);
+        AtomicBoolean operationCompleted = new AtomicBoolean(false);
+
+        // 鎸夐挳瑙嗚鍙嶉
+        readRelayParamsBtn.setBackground(Color.CYAN);
+        readRelayParamsBtn.setEnabled(false);
+
+        // 璁剧疆鍝嶅簲娑堣垂鑰�
+        Consumer<byte[]> responseConsumer = responseData -> {
+            if (operationCompleted.get()) return;
+
+            serialService.setResponseConsumer(null);
+            operationCompleted.set(true);
+
+            String hexResponse = bytesToHex(responseData);
+
+            if (hexResponse.startsWith("55AA03")) {
+                // 浣跨敤瑙f瀽鍣ㄨВ鏋愮户鐢靛櫒鍝嶅簲鏁版嵁
+                // 娉ㄦ剰锛氳繖閲岄渶瑕佹牴鎹疄闄呯殑缁х數鍣ㄥ搷搴旀牸寮忔潵璋冪敤鐩稿簲鐨勮В鏋愭柟娉�
+                // 濡傛灉缁х數鍣ㄥ搷搴旀牸寮忎笌鏅�氶厤缃笉鍚岋紝鍙兘闇�瑕佷笓闂ㄧ殑瑙f瀽鏂规硶
+                DellTag55AA03.ParseResult result = DellTag55AA03.parse3(hexResponse, "127.0.0.1", 0);
+
+                if (result != null) {
+                    updateParameterFields2(result);
+                    SwingUtilities.invokeLater(() -> {
+                        // 杩欓噷鍙互娣诲姞鏇存柊缁х數鍣ㄥ弬鏁板瓧娈电殑閫昏緫
+                        // 濡傛灉缁х數鍣ㄥ弬鏁伴渶瑕佹洿鏂板埌鐗瑰畾闈㈡澘锛屽彲浠ュ湪杩欓噷璋冪敤鐩稿簲鐨勬柟娉�
+                        responseReceived.set(true);
+                        JOptionPane.showMessageDialog(this, getString("relay_read_success"), getString("info"), JOptionPane.INFORMATION_MESSAGE);
+
+                        // 鎭㈠鎸夐挳鐘舵��
+                        readRelayParamsBtn.setBackground(new Color(70, 130, 180));
+                        readRelayParamsBtn.setEnabled(true);
+                    });
+                    return;
+                }
+            }
+
+            // 鍝嶅簲鏁版嵁涓嶅悎娉�
+            SwingUtilities.invokeLater(() -> {
+                JOptionPane.showMessageDialog(this, getString("invalid_response_data"), getString("error"), JOptionPane.ERROR_MESSAGE);
+                readRelayParamsBtn.setBackground(new Color(70, 130, 180));
+                readRelayParamsBtn.setEnabled(true);
+            });
+        };
+
+        // 鍦ㄧ嫭绔嬬嚎绋嬩腑鎵ц涓插彛鎿嶄綔
+        new Thread(() -> {
+            serialService.setResponseConsumer(responseConsumer);
+
+            boolean success = serialService.send(data);
+            if (!success) {
+                SwingUtilities.invokeLater(() -> {
+                    JOptionPane.showMessageDialog(this, getString("send_data_failed"), getString("error"), JOptionPane.ERROR_MESSAGE);
+                    serialService.setResponseConsumer(null);
+                    readRelayParamsBtn.setBackground(new Color(70, 130, 180));
+                    readRelayParamsBtn.setEnabled(true);
+                });
+                return;
+            }
+
+            // 绛夊緟鍝嶅簲锛屾渶闀�5绉�
+            long startTime = System.currentTimeMillis();
+            while (!operationCompleted.get() && (System.currentTimeMillis() - startTime) < 5000) {
+                try {
+                    Thread.sleep(100);
+                } catch (InterruptedException e) {
+                    Thread.currentThread().interrupt();
+                    break;
+                }
+            }
+
+            // 妫�鏌ユ槸鍚﹁秴鏃�
+            if (!operationCompleted.get()) {
+                operationCompleted.set(true);
+                SwingUtilities.invokeLater(() -> {
+                    JOptionPane.showMessageDialog(this, getString("relay_read_timeout"), getString("error"), JOptionPane.ERROR_MESSAGE);
+                    serialService.setResponseConsumer(null);
+                    readRelayParamsBtn.setBackground(new Color(70, 130, 180));
+                    readRelayParamsBtn.setEnabled(true);
+                });
+            }
+        }).start();
+    }
+
+    // 娣诲姞淇濆瓨缁х數鍣ㄥ弬鏁版柟娉�
+    private void saveRelayParameters() {
+        if (!serialService.isOpen()) {
+            JOptionPane.showMessageDialog(this, getString("open_serial_first"), getString("error"), JOptionPane.ERROR_MESSAGE);
+            return;
+        }
+
+        try {
+            // 杩欓噷闇�瑕佹牴鎹疄闄呯殑鏁版嵁缁撴瀯鏉ユ瀯寤虹户鐢靛櫒鍙傛暟
+            byte[] relayConfigData = PanelFieldUpdater.collectParametersToConfig2(antiCollisionPanel);
+
+            if (relayConfigData == null) {
+                JOptionPane.showMessageDialog(this, getString("invalid_relay_config"), getString("error"), JOptionPane.ERROR_MESSAGE);
+                return;
+            }
+
+            // 鍦ㄦ暟鎹棩蹇楃獥鍙f樉绀哄彂閫佺殑閰嶇疆鏁版嵁
+            if (dataLogPanel != null) {
+                dataLogPanel.addLogData(relayConfigData, getString("send.save.relay.command"));
+            }
+
+            boolean success = serialService.send(relayConfigData);
+            if (success) {
+                JOptionPane.showMessageDialog(this, getString("relay_save_success"), getString("info"), JOptionPane.INFORMATION_MESSAGE);
+            } else {
+                JOptionPane.showMessageDialog(this, getString("send_data_failed"), getString("error"), JOptionPane.ERROR_MESSAGE);
+            }
+
+        } catch (Exception e) {
+            JOptionPane.showMessageDialog(this, getString("relay_save_failed") + ": " + e.getMessage(), getString("error"), JOptionPane.ERROR_MESSAGE);
+            return;
+        }
+
+        // 鎸夐挳瑙嗚鍙嶉
+        saveRelayParamsBtn.setBackground(Color.CYAN);
+        Timer timer = new Timer(500, e -> {
+            saveRelayParamsBtn.setBackground(new Color(70, 130, 180));
+        });
+        timer.setRepeats(false);
+        timer.start();
+    }
+
+
     /**
      * 璇诲彇鍙傛暟
      */
@@ -124,7 +278,7 @@
 
         // 鏂板锛氬湪鏁版嵁鏃ュ織绐楀彛鏄剧ず鍙戦�佺殑鎸囦护
         if (dataLogPanel != null) {
-            dataLogPanel.addLogData(data, "鍙戦�佽鍙栭厤缃寚浠�");
+            dataLogPanel.addLogData(data, getString("send.read.config.command"));
         }
 
         AtomicBoolean responseReceived = new AtomicBoolean(false);
@@ -221,6 +375,14 @@
                                          tagPanel, antiCollisionPanel, upgradePanel);
         
     }
+
+    /**
+     * 鏇存柊鍙傛暟瀛楁鍒扮晫闈� - 浣跨敤鏂扮殑宸ュ叿绫�
+     */
+    private void updateParameterFields2(DellTag55AA03.ParseResult result) {
+        PanelFieldUpdater.updateAllPanels2(result, antiCollisionPanel);
+
+    }
     
     /**
      * 淇濆瓨鍙傛暟 - 淇鍚庣殑鏂规硶
@@ -243,7 +405,7 @@
 
             // 鏂板锛氬湪鏁版嵁鏃ュ織绐楀彛鏄剧ず鍙戦�佺殑閰嶇疆鏁版嵁
             if (dataLogPanel != null) {
-                dataLogPanel.addLogData(configData, "鍙戦�佷繚瀛橀厤缃寚浠�");
+                dataLogPanel.addLogData(configData, getString("send.save.config.command"));
             }
 
             boolean success = serialService.send(configData);
@@ -284,7 +446,7 @@
 
         // 鏂板锛氬湪鏁版嵁鏃ュ織绐楀彛鏄剧ず鍙戦�佺殑鎸囦护
         if (dataLogPanel != null) {
-            dataLogPanel.addLogData(data, "鍙戦�侀噸鍚澶囨寚浠�");
+            dataLogPanel.addLogData(data, getString("send.restart.command"));
         }
 
         boolean success = serialService.send(data);
@@ -321,7 +483,7 @@
 
         // 鏂板锛氬湪鏁版嵁鏃ュ織绐楀彛鏄剧ず鍙戦�佺殑鎸囦护
         if (dataLogPanel != null) {
-            dataLogPanel.addLogData(data, "鍙戦�佹仮澶嶅嚭鍘傝缃寚浠�");
+            dataLogPanel.addLogData(data, getString("send.reset.factory.command"));
         }
 
         boolean success = serialService.send(data);
@@ -489,21 +651,27 @@
         
         return panel;
     }
-    
+
     private JPanel createBottomButtonPanel() {
         JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT));
-        
+
         // 浣跨敤ButtonUtils鍒涘缓钃濊壊鏍峰紡鎸夐挳
         readParamsBtn = ButtonUtils.createBlueButton(getString("read.parameters"));
         saveParamsBtn = ButtonUtils.createBlueButton(getString("save.parameters"));
         restartDeviceBtn = ButtonUtils.createBlueButton(getString("restart.device"));
         resetFactoryBtn = ButtonUtils.createBlueButton(getString("reset.factory"));
-        
+        // 鏂板缁х數鍣ㄥ弬鏁版寜閽�
+        readRelayParamsBtn = ButtonUtils.createBlueButton(getString("read.relay.parameters"));
+        saveRelayParamsBtn = ButtonUtils.createBlueButton(getString("save.relay.parameters"));
+
         panel.add(readParamsBtn);
         panel.add(saveParamsBtn);
         panel.add(restartDeviceBtn);
         panel.add(resetFactoryBtn);
-        
+        // 娣诲姞鏂版寜閽�
+        panel.add(readRelayParamsBtn);
+        panel.add(saveRelayParamsBtn);
+
         return panel;
     }
     
@@ -542,6 +710,9 @@
         saveParamsBtn.setText(getString("save.parameters"));
         restartDeviceBtn.setText(getString("restart.device"));
         resetFactoryBtn.setText(getString("reset.factory"));
+        // 鏇存柊鏂版寜閽枃鏈�
+        readRelayParamsBtn.setText(getString("read.relay.parameters"));
+        saveRelayParamsBtn.setText(getString("save.relay.parameters"));
         
         // 鏇存柊閫夐」鍗℃爣棰�
         if (rightTabbedPane != null) {
@@ -587,7 +758,7 @@
      * 鑾峰彇涓插彛鏈嶅姟瀹炰緥
      * @return 涓插彛鏈嶅姟瀹炰緥
      */
-    public SerialPortService getSerialService() {
+    public static SerialPortService getSerialService() {
         return serialService;
     }
     

--
Gitblit v1.10.0