| | |
| | | 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; |
| | |
| | | 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(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 读取参数 |
| | | */ |
| | |
| | | |
| | | // 新增:在数据日志窗口显示发送的指令 |
| | | if (dataLogPanel != null) { |
| | | dataLogPanel.addLogData(data, "发送读取配置指令"); |
| | | dataLogPanel.addLogData(data, getString("send.read.config.command")); |
| | | } |
| | | |
| | | AtomicBoolean responseReceived = new AtomicBoolean(false); |
| | |
| | | tagPanel, antiCollisionPanel, upgradePanel); |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 更新参数字段到界面 - 使用新的工具类 |
| | | */ |
| | | private void updateParameterFields2(DellTag55AA03.ParseResult result) { |
| | | PanelFieldUpdater.updateAllPanels2(result, antiCollisionPanel); |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 保存参数 - 修复后的方法 |
| | |
| | | |
| | | // 新增:在数据日志窗口显示发送的配置数据 |
| | | if (dataLogPanel != null) { |
| | | dataLogPanel.addLogData(configData, "发送保存配置指令"); |
| | | dataLogPanel.addLogData(configData, getString("send.save.config.command")); |
| | | } |
| | | |
| | | boolean success = serialService.send(configData); |
| | |
| | | |
| | | // 新增:在数据日志窗口显示发送的指令 |
| | | if (dataLogPanel != null) { |
| | | dataLogPanel.addLogData(data, "发送重启设备指令"); |
| | | dataLogPanel.addLogData(data, getString("send.restart.command")); |
| | | } |
| | | |
| | | boolean success = serialService.send(data); |
| | |
| | | |
| | | // 新增:在数据日志窗口显示发送的指令 |
| | | if (dataLogPanel != null) { |
| | | dataLogPanel.addLogData(data, "发送恢复出厂设置指令"); |
| | | dataLogPanel.addLogData(data, getString("send.reset.factory.command")); |
| | | } |
| | | |
| | | boolean success = serialService.send(data); |
| | |
| | | |
| | | 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; |
| | | } |
| | | |
| | |
| | | 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) { |
| | |
| | | * 获取串口服务实例 |
| | | * @return 串口服务实例 |
| | | */ |
| | | public SerialPortService getSerialService() { |
| | | public static SerialPortService getSerialService() { |
| | | return serialService; |
| | | } |
| | | |