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