zsh_root
2025-12-10 8d662de2fd262b3a485f16e197cb4d0ca2a61cdf
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;
    
    // 新增:串口服务实例
    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;
        }
        // 在数据日志窗口显示发送的指令
        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")) {
                // 使用解析器解析继电器响应数据
                // 注意:这里需要根据实际的继电器响应格式来调用相应的解析方法
                // 如果继电器响应格式与普通配置不同,可能需要专门的解析方法
                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;
            }
            // 在数据日志窗口显示发送的配置数据
            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;
    }