zsh_root
2025-12-10 8d662de2fd262b3a485f16e197cb4d0ca2a61cdf
src/home/PanelFieldUpdater.java
@@ -6,14 +6,65 @@
import PublicPannel.AntiCollisionPanel;
import PublicPannel.UpgradePanel;
import jiexi.DellTag55AA03;
import java.util.Locale;
import java.util.ResourceBundle;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.PropertyResourceBundle;
/**
 * 面板字段更新工具类 - 统一管理各个面板的字段更新逻辑
 * 面板字段更新工具类 - 统一管理各个面板的字段更新逻辑
 */
public class PanelFieldUpdater {
   /**
    * 获取资源包
    */
   private static ResourceBundle getResourceBundle() {
      try {
         // 尝试从MainFrame获取当前语言设置
         Locale locale = Locale.SIMPLIFIED_CHINESE; // 默认中文
         // 尝试检测当前语言
         String fileName = locale.equals(Locale.ENGLISH) ?
               "Messages_en.properties" : "Messages_zh.properties";
         File langFile = new File("systemfile/" + fileName);
         if (langFile.exists()) {
            try (InputStream inputStream = new FileInputStream(langFile)) {
               return new PropertyResourceBundle(inputStream);
            }
         }
      } catch (Exception e) {
         // 如果加载失败,使用默认中文
      }
      // 返回空ResourceBundle,将使用默认中文字符串
      return null;
   }
   /**
    * 获取国际化字符串
    */
   private static String getString(String key) {
      ResourceBundle bundle = getResourceBundle();
      if (bundle != null) {
         try {
            return bundle.getString(key);
         } catch (Exception e) {
            // 如果找不到键,返回默认值
         }
      }
      // 默认中文值
      switch (key) {
         case "panel.not.initialized": return "面板未正确初始化";
         case "save.parameters.failed": return "保存参数失败";
         case "field.cannot.empty": return "{0}不能为空";
         case "parameter.error": return "参数错误";
         default: return key;
      }
   }
   /**
    * 更新所有面板的字段
    * 更新所有面板的字段
    */
   public static void updateAllPanels(DellTag55AA03.ParseResult result, 
         BaseParameterPanel baseParamPanel,
@@ -24,27 +75,33 @@
      if (result == null) {
         return;
      }
      // 更新基础参数面板
      // 更新基础参数面板
      updateBaseParameterPanel(result, baseParamPanel);
      // 更新基站面板
      // 更新基站面板
      updateBaseStationPanel(result, baseStationPanel);
      // 更新标签面板
      // 更新标签面板
      updateTagPanel(result, tagPanel);
      // 更新防碰撞面板
      // 更新防碰撞面板
      updateAntiCollisionPanel(result, antiCollisionPanel);
      // 更新升级面板
      // 更新升级面板
      updateUpgradePanel(result, upgradePanel);
   }
   public static void updateAllPanels2(DellTag55AA03.ParseResult result,
         AntiCollisionPanel antiCollisionPanel) {
      if (result == null) {
         return;
      }
      //更新防撞面板继电器
      updateAntiCollisionPanel2(result,antiCollisionPanel);
   }
   /**
    * 更新基础参数面板字段
    * 更新基础参数面板字段
    */
   private static void updateBaseParameterPanel(DellTag55AA03.ParseResult result, BaseParameterPanel panel) {
      if (panel == null) {
@@ -56,12 +113,12 @@
         
         panel.updateFields(result);
      } catch (Exception e) {
         System.err.println("PanelFieldUpdater: 更新基础参数面板失败: " + e.getMessage());
         System.err.println("PanelFieldUpdater: 更新基础参数面板失败: " + e.getMessage());
         e.printStackTrace();
      }
   }
   /**
    * 更新基站面板字段
    * 更新基站面板字段
    */
   private static void updateBaseStationPanel(DellTag55AA03.ParseResult result, BaseStationPanel panel) {
      if (panel == null) {       
@@ -72,13 +129,13 @@
         
         panel.updateFields(result);
      } catch (Exception e) {
         System.err.println("PanelFieldUpdater: 更新基站面板失败: " + e.getMessage());
         System.err.println("PanelFieldUpdater: 更新基站面板失败: " + e.getMessage());
         e.printStackTrace();
      }
   }
   /**
    * 更新标签面板字段
    * 更新标签面板字段
    */
   private static void updateTagPanel(DellTag55AA03.ParseResult result, TagPanel panel) {
      if (panel == null) {
@@ -90,13 +147,13 @@
         System.out.println("PanelFieldUpdater: Calling updateFields on TagPanel");
         panel.updateFields(result);
      } catch (Exception e) {
         System.err.println("PanelFieldUpdater: 更新标签面板失败: " + e.getMessage());
         System.err.println("PanelFieldUpdater: 更新标签面板失败: " + e.getMessage());
         e.printStackTrace();
      }
   }
   /**
    * 更新防碰撞面板字段
    * 更新防碰撞面板字段
    */
   private static void updateAntiCollisionPanel(DellTag55AA03.ParseResult result, AntiCollisionPanel panel) {
      if (panel == null) {
@@ -105,15 +162,29 @@
      }
      try {
         panel.updateFields(result);
      } catch (Exception e) {
         System.err.println("PanelFieldUpdater: 更新防碰撞面板失败: " + e.getMessage());
         System.err.println("PanelFieldUpdater: 更新防碰撞面板失败: " + e.getMessage());
         e.printStackTrace();
      }
   }
   /**
    * 更新防碰撞继电器控制面板字段
    */
   private static void updateAntiCollisionPanel2(DellTag55AA03.ParseResult result, AntiCollisionPanel panel) {
      if (panel == null) {
         return;
      }
      try {
         panel.updateFields2(result);
      } catch (Exception e) {
         System.err.println("PanelFieldUpdater: 更新防碰撞面板失败: " + e.getMessage());
         e.printStackTrace();
      }
   }
   /**
    * 更新升级面板字段
    * 更新升级面板字段
    */
   private static void updateUpgradePanel(DellTag55AA03.ParseResult result, UpgradePanel panel) {
      if (panel == null) {       
@@ -121,18 +192,18 @@
      }
      try {
         // 更新升级相关参数
         // 更新升级相关参数
         if (result.dizhi0x2 != null) {
            // panel.setFirmwareVersion(result.dizhi0x2);
         }
         
      } catch (Exception e) {
         System.err.println("PanelFieldUpdater: 更新升级面板失败: " + e.getMessage());
         System.err.println("PanelFieldUpdater: 更新升级面板失败: " + e.getMessage());
      }
   }
   /**
    * 从所有面板收集参数并构建配置数据
    * 从所有面板收集参数并构建配置数据
    */
   public static byte[] collectParametersToConfig(BaseParameterPanel baseParamPanel,
           BaseStationPanel baseStationPanel,
@@ -141,99 +212,101 @@
           UpgradePanel upgradePanel) {
       
       try {
           // 检查面板是否初始化
           // 检查面板是否初始化
           if (baseParamPanel == null || baseStationPanel == null || 
               tagPanel == null || antiCollisionPanel == null) {
               showErrorDialog("面板未正确初始化");
               showErrorDialog(getString("panel.not.initialized"));
               return null;
           }
           // BaseParameterPanel 参数
           String dizhi0x4 = safeCheckAndTrim(baseParamPanel.getdizhi0x4(), "模块编号", "0000");
           String dizhi0x6 = safeCheckAndTrim(baseParamPanel.getdizhi0x6(), "通信频率", "0000");
           String dizhi0x8 = safeCheckAndTrim(baseParamPanel.getdizhi0x8(), "最多通信基站", "0000");
           String dizhi0xA = safeCheckAndTrim(baseParamPanel.getdizhi0xA(), "最少通信基站、小组编号", "0000");
           String dizhi0xC = safeCheckAndTrim(baseParamPanel.getdizhi0xC(), "校准距离", "0000");
           String dizhi0xE = safeCheckAndTrim(baseParamPanel.getdizhi0xE(), "模块类型", "0000");
           String dizhi0x10 = safeCheckAndTrim(baseParamPanel.getdizhi0x10(), "基站主动测距", "0000");
           String dizhi0x12 = safeCheckAndTrim(baseParamPanel.getdizhi0x12(), "报警设备", "0000");
           String dizhi0x1A = safeCheckAndTrim(baseParamPanel.getdizhi0x1A(), "配对ID", "0000");
           String dizhi0x1C = safeCheckAndTrim(baseParamPanel.getdizhi0x1C(), "心跳包、UWB开关状态", "0000");
           String dizhi0x1E = safeCheckAndTrim(baseParamPanel.getdizhi0x1E(), "MODBUSģʽ", "0000");
           String dizhi0x36 = safeCheckAndTrim(baseParamPanel.getdizhi0x36(), "功率", "0000");
           // BaseParameterPanel 参数
           String dizhi0x4 = safeCheckAndTrim(baseParamPanel.getdizhi0x4(), "模块编号", "0000");
           String dizhi0x6 = safeCheckAndTrim(baseParamPanel.getdizhi0x6(), "通信频率", "0000");
           String dizhi0x8 = safeCheckAndTrim(baseParamPanel.getdizhi0x8(), "最多通信基站", "0000");
           String dizhi0xA = safeCheckAndTrim(baseParamPanel.getdizhi0xA(), "最少通信基站、小组编号", "0000");
           String dizhi0xC = safeCheckAndTrim(baseParamPanel.getdizhi0xC(), "校准距离", "0000");
           String dizhi0xE = safeCheckAndTrim(baseParamPanel.getdizhi0xE(), "模块类型", "0000");
           String dizhi0x10 = safeCheckAndTrim(baseParamPanel.getdizhi0x10(), "基站主动测距", "0000");
           String dizhi0x12 = safeCheckAndTrim(baseParamPanel.getdizhi0x12(), "报警设备", "0000");
           String dizhi0x1A = safeCheckAndTrim(baseParamPanel.getdizhi0x1A(), "配对ID", "0000");
           String dizhi0x1C = safeCheckAndTrim(baseParamPanel.getdizhi0x1C(), "心跳包、UWB开关状态", "0000");
           String dizhi0x1E = safeCheckAndTrim(baseParamPanel.getdizhi0x1E(), "MODBUS模式", "0000");
           String dizhi0x36 = safeCheckAndTrim(baseParamPanel.getdizhi0x36(), "功率", "0000");
           // BaseStationPanel 参数 - 新增部分
           String dizhi0x18 = safeCheckAndTrim(baseStationPanel.getdizhi0x18(), "外设控制", "0000");
           String dizhi0x20 = safeCheckAndTrim(baseStationPanel.getdizhi0x20(), "临近基站数量", "0000");
           String dizhi0x22 = safeCheckAndTrim(baseStationPanel.getdizhi0x22(), "临近基站1", "0000");
           String dizhi0x24 = safeCheckAndTrim(baseStationPanel.getdizhi0x24(), "临近基站2", "0000");
           String dizhi0x26 = safeCheckAndTrim(baseStationPanel.getdizhi0x26(), "临近基站3", "0000");
           String dizhi0x28 = safeCheckAndTrim(baseStationPanel.getdizhi0x28(), "临近基站4", "0000");
           String dizhi0x2A = safeCheckAndTrim(baseStationPanel.getdizhi0x2A(), "临近基站5", "0000");
           String dizhi0x2C = safeCheckAndTrim(baseStationPanel.getdizhi0x2C(), "临近基站6", "0000");
           String dizhi0x2E = safeCheckAndTrim(baseStationPanel.getdizhi0x2E(), "临近基站7", "0000");
           String dizhi0x30 = safeCheckAndTrim(baseStationPanel.getdizhi0x30(), "临近基站8", "0000");
           String dizhi0x32 = safeCheckAndTrim(baseStationPanel.getdizhi0x32(), "临近基站9", "0000");
           String dizhi0x34 = safeCheckAndTrim(baseStationPanel.getdizhi0x34(), "临近基站10", "0000");
           String dizhi0x44 = safeCheckAndTrim(baseStationPanel.getdizhi0x44(), "同步基站ID", "0000");
           String dizhi0x46 = safeCheckAndTrim(baseStationPanel.getdizhi0x46(), "同步基站类型", "0000");
           // BaseStationPanel 参数 - 新增部分
           String dizhi0x18 = safeCheckAndTrim(baseStationPanel.getdizhi0x18(), "外设控制", "0000");
           String dizhi0x20 = safeCheckAndTrim(baseStationPanel.getdizhi0x20(), "临近基站数量", "0000");
           String dizhi0x22 = safeCheckAndTrim(baseStationPanel.getdizhi0x22(), "临近基站1", "0000");
           String dizhi0x24 = safeCheckAndTrim(baseStationPanel.getdizhi0x24(), "临近基站2", "0000");
           String dizhi0x26 = safeCheckAndTrim(baseStationPanel.getdizhi0x26(), "临近基站3", "0000");
           String dizhi0x28 = safeCheckAndTrim(baseStationPanel.getdizhi0x28(), "临近基站4", "0000");
           String dizhi0x2A = safeCheckAndTrim(baseStationPanel.getdizhi0x2A(), "临近基站5", "0000");
           String dizhi0x2C = safeCheckAndTrim(baseStationPanel.getdizhi0x2C(), "临近基站6", "0000");
           String dizhi0x2E = safeCheckAndTrim(baseStationPanel.getdizhi0x2E(), "临近基站7", "0000");
           String dizhi0x30 = safeCheckAndTrim(baseStationPanel.getdizhi0x30(), "临近基站8", "0000");
           String dizhi0x32 = safeCheckAndTrim(baseStationPanel.getdizhi0x32(), "临近基站9", "0000");
           String dizhi0x34 = safeCheckAndTrim(baseStationPanel.getdizhi0x34(), "临近基站10", "0000");
           String dizhi0x44 = safeCheckAndTrim(baseStationPanel.getdizhi0x44(), "同步基站ID", "0000");
           String dizhi0x46 = safeCheckAndTrim(baseStationPanel.getdizhi0x46(), "同步基站类型", "0000");
           // TagPanel 参数 - 新增部分
           String dizhi0x14 = safeCheckAndTrim(tagPanel.getdizhi0x14(), "IMU静止时间", "0000");
           String dizhi0x1C_tag = safeCheckAndTrim(tagPanel.getdizhi0x1C(), "UWB开关状态", "0000");
           String dizhi0x20_tag = safeCheckAndTrim(tagPanel.getdizhi0x20(), "振动时长", "0000");
           String dizhi0x38 = safeCheckAndTrim(tagPanel.getdizhi0x38(), "加速度计阈值", "0000");
           String dizhi0x3A = safeCheckAndTrim(tagPanel.getdizhi0x3A(), "空闲休眠时间", "0000");
           String dizhi0x3C = safeCheckAndTrim(tagPanel.getdizhi0x3C(), "振动使能", "0000");
           String dizhi0x3E = safeCheckAndTrim(tagPanel.getdizhi0x3E(), "加速度计使能", "0000");
           String dizhi0x40 = safeCheckAndTrim(tagPanel.getdizhi0x40(), "标签配置状态", "0000");
           String dizhi0x42 = safeCheckAndTrim(tagPanel.getdizhi0x42(), "加速度计时长", "0000");
           String dizhi0x44_tag = safeCheckAndTrim(tagPanel.getdizhi0x44(), "设备激活状态", "0000");
           String dizhi0x48 = safeCheckAndTrim(tagPanel.getdizhi0x48(), "速度滤波限值", "0000");
           String dizhi0x50 = safeCheckAndTrim(tagPanel.getdizhi0x50(), "压力校准", "0000");
           // TagPanel 参数 - 新增部分
           String dizhi0x14 = safeCheckAndTrim(tagPanel.getdizhi0x14(), "IMU静止时间", "0000");
           String dizhi0x1C_tag = safeCheckAndTrim(tagPanel.getdizhi0x1C(), "UWB开关状态", "0000");
           String dizhi0x20_tag = safeCheckAndTrim(tagPanel.getdizhi0x20(), "振动时长", "0000");
           String dizhi0x38 = safeCheckAndTrim(tagPanel.getdizhi0x38(), "加速度计阈值", "0000");
           String dizhi0x3A = safeCheckAndTrim(tagPanel.getdizhi0x3A(), "空闲休眠时间", "0000");
           String dizhi0x3C = safeCheckAndTrim(tagPanel.getdizhi0x3C(), "振动使能", "0000");
           String dizhi0x3E = safeCheckAndTrim(tagPanel.getdizhi0x3E(), "加速度计使能", "0000");
           String dizhi0x40 = safeCheckAndTrim(tagPanel.getdizhi0x40(), "标签配置状态", "0000");
           String dizhi0x42 = safeCheckAndTrim(tagPanel.getdizhi0x42(), "加速度计时长", "0000");
           String dizhi0x44_tag = safeCheckAndTrim(tagPanel.getdizhi0x44(), "设备激活状态", "0000");
           String dizhi0x48 = safeCheckAndTrim(tagPanel.getdizhi0x48(), "速度滤波限值", "0000");
           String dizhi0x50 = safeCheckAndTrim(tagPanel.getdizhi0x50(), "压力校准", "0000");
           // AntiCollisionPanel 参数 - 新增部分
           String dizhi0x14_anti = safeCheckAndTrim(antiCollisionPanel.getdizhi0x14(), "继电器1报警距离1", "0000");
           String dizhi0x16 = safeCheckAndTrim(antiCollisionPanel.getdizhi0x16(), "继电器1报警距离2", "0000");
           String dizhi0x18_anti = safeCheckAndTrim(antiCollisionPanel.getdizhi0x18(), "继电器1报警距离3", "0000");
           String dizhi0x20_anti = safeCheckAndTrim(antiCollisionPanel.getdizhi0x20(), "Modbus地址", "0000");
           String dizhi0x4A = safeCheckAndTrim(antiCollisionPanel.getdizhi0x4A(), "白名单起始", "0000");
           String dizhi0x4C = safeCheckAndTrim(antiCollisionPanel.getdizhi0x4C(), "白名单结束", "0000");
           String dizhi0x50_anti = safeCheckAndTrim(antiCollisionPanel.getdizhi0x50(), "继电器持续时间", "0000");
           String dizhi0x52 = safeCheckAndTrim(antiCollisionPanel.getdizhi0x52(), "测距输出格式", "0000");
           String dizhi0x54 = safeCheckAndTrim(antiCollisionPanel.getdizhi0x54(), "天线电缆长度", "0000");
           // AntiCollisionPanel 参数 - 新增部分
           String dizhi0x14_anti = safeCheckAndTrim(antiCollisionPanel.getdizhi0x14(), "继电器1报警距离1", "0000");
           String dizhi0x16 = safeCheckAndTrim(antiCollisionPanel.getdizhi0x16(), "继电器1报警距离2", "0000");
           String dizhi0x18_anti = safeCheckAndTrim(antiCollisionPanel.getdizhi0x18(), "继电器1报警距离3", "0000");
           String dizhi0x20_anti = safeCheckAndTrim(antiCollisionPanel.getdizhi0x20(), "Modbus地址", "0000");
           String dizhi0x4A = safeCheckAndTrim(antiCollisionPanel.getdizhi0x4A(), "白名单起始", "0000");
           String dizhi0x4C = safeCheckAndTrim(antiCollisionPanel.getdizhi0x4C(), "白名单结束", "0000");
           String dizhi0x4E = antiCollisionPanel.getdizhi0x4E();
           String dizhi0x50_anti = safeCheckAndTrim(antiCollisionPanel.getdizhi0x50(), "继电器持续时间", "0000");
           String dizhi0x52 = safeCheckAndTrim(antiCollisionPanel.getdizhi0x52(), "测距输出格式", "0000");
           String dizhi0x54 = safeCheckAndTrim(antiCollisionPanel.getdizhi0x54(), "天线电缆长度", "0000");
           String dizhi0x56 = "0000";
           String dizhi0x58 = safeCheckAndTrim(antiCollisionPanel.getdizhi0x58(), "馈线长度", "0000");
           String dizhi0x58 = safeCheckAndTrim(antiCollisionPanel.getdizhi0x58(), "馈线长度", "0000");
           String dizhi0x5A = "0000";
           String dizhi0x5C = "0000";
           String dizhi0x5E = "0000";
           String dizhi0xF0 = safeCheckAndTrim(antiCollisionPanel.getdizhi0xF0(), "继电器1控制", "0000");
           String dizhi0xF2 = safeCheckAndTrim(antiCollisionPanel.getdizhi0xF2(), "继电器2控制", "0000");
           String dizhi0xF4 = safeCheckAndTrim(antiCollisionPanel.getdizhi0xF4(), "继电器2报警距离1", "0000");
           String dizhi0xF6 = safeCheckAndTrim(antiCollisionPanel.getdizhi0xF6(), "继电器2报警距离2", "0000");
           String dizhi0xF8 = safeCheckAndTrim(antiCollisionPanel.getdizhi0xF8(), "继电器2报警距离3", "0000");
           String dizhi0xF0 = safeCheckAndTrim(antiCollisionPanel.getdizhi0xF0(), "继电器1控制", "0000");
           String dizhi0xF2 = safeCheckAndTrim(antiCollisionPanel.getdizhi0xF2(), "继电器2控制", "0000");
           String dizhi0xF4 = safeCheckAndTrim(antiCollisionPanel.getdizhi0xF4(), "继电器2报警距离1", "0000");
           String dizhi0xF6 = safeCheckAndTrim(antiCollisionPanel.getdizhi0xF6(), "继电器2报警距离2", "0000");
           String dizhi0xF8 = safeCheckAndTrim(antiCollisionPanel.getdizhi0xF8(), "继电器2报警距离3", "0000");
           
           // ========== 新增:根据选项卡确定使用哪个字段值 ==========
           // ========== 新增:根据选项卡确定使用哪个字段值 ==========
           
           // 获取当前选中的选项卡类型当前选中的面板索引 (0-基站, 1-标签, 2-防撞, 3-升级)
           // 获取当前选中的选项卡类型当前选中的面板索引 (0-基站, 1-标签, 2-防撞, 3-升级)
           int selectedTab = 0;
           try {
               selectedTab = SerialCommunicationPanel.getCurrentSelectedPanelIndex();
               // 确保索引在有效范围内
               // 确保索引在有效范围内
               if (selectedTab < 0 || selectedTab > 3) {
                   selectedTab = 0;
                   System.err.println("选项卡索引超出范围,使用默认值: 0");
                   System.err.println("选项卡索引超出范围,使用默认值: 0");
               }
           } catch (Exception e) {
               selectedTab = 0; // 默认使用基站选项卡
               System.err.println("获取选项卡索引失败,使用默认值: " + e.getMessage());
               selectedTab = 0; // 默认使用基站选项卡
               System.err.println("获取选项卡索引失败,使用默认值: " + e.getMessage());
           }
          
           System.out.println("当前选中的选项卡索引: " + selectedTab);
           System.out.println("当前选中的选项卡索引: " + selectedTab);
           
           // 根据选项卡确定使用哪个字段值
           // 根据选项卡确定使用哪个字段值
           String finalDizhi0x1C;
           String finalDizhi0x20;
           String finalDizhi0x44;
@@ -242,35 +315,35 @@
           String finalDizhi0x50;
           
           if (selectedTab == 1) {
               // 标签选项卡选中时,使用标签面板的值
               // 标签选项卡选中时,使用标签面板的值
               finalDizhi0x1C = dizhi0x1C_tag;
               finalDizhi0x20 = dizhi0x20_tag;
               finalDizhi0x44 = dizhi0x44_tag;
               finalDizhi0x14 = dizhi0x14; // 使用标签面板的0x14
               finalDizhi0x18 = dizhi0x18; // 使用基站面板的0x18
               finalDizhi0x50 = dizhi0x50; // 使用标签面板的0x50
               System.out.println("使用标签面板的字段值");
               finalDizhi0x14 = dizhi0x14; // 使用标签面板的0x14
               finalDizhi0x18 = dizhi0x18; // 使用基站面板的0x18
               finalDizhi0x50 = dizhi0x50; // 使用标签面板的0x50
               System.out.println("使用标签面板的字段值");
           } else if (selectedTab == 2) {
               // 防撞选项卡选中时,使用防撞面板的值
               finalDizhi0x1C = dizhi0x1C; // 使用基础参数面板的0x1C
               // 防撞选项卡选中时,使用防撞面板的值
               finalDizhi0x1C = dizhi0x1C; // 使用基础参数面板的0x1C
               finalDizhi0x20 = dizhi0x20_anti;
               finalDizhi0x44 = dizhi0x44; // 使用基站面板的0x44
               finalDizhi0x44 = dizhi0x44; // 使用基站面板的0x44
               finalDizhi0x14 = dizhi0x14_anti;
               finalDizhi0x18 = dizhi0x18_anti;
               finalDizhi0x50 = dizhi0x50_anti;
               System.out.println("使用防撞面板的字段值");
               System.out.println("使用防撞面板的字段值");
           } else {
               // 默认情况(基础参数、基站等选项卡)
               finalDizhi0x1C = dizhi0x1C; // 使用基础参数面板的0x1C
               finalDizhi0x20 = dizhi0x20; // 使用基站面板的0x20
               finalDizhi0x44 = dizhi0x44; // 使用基站面板的0x44
               finalDizhi0x14 = dizhi0x14; // 使用标签面板的0x14
               finalDizhi0x18 = dizhi0x18; // 使用基站面板的0x18
               finalDizhi0x50 = dizhi0x50; // 使用标签面板的0x50
               System.out.println("使用默认面板的字段值");
               // 默认情况(基础参数、基站等选项卡)
               finalDizhi0x1C = dizhi0x1C; // 使用基础参数面板的0x1C
               finalDizhi0x20 = dizhi0x20; // 使用基站面板的0x20
               finalDizhi0x44 = dizhi0x44; // 使用基站面板的0x44
               finalDizhi0x14 = dizhi0x14; // 使用标签面板的0x14
               finalDizhi0x18 = dizhi0x18; // 使用基站面板的0x18
               finalDizhi0x50 = dizhi0x50; // 使用标签面板的0x50
               System.out.println("使用默认面板的字段值");
           }
           
           // 安全转换整数,添加异常处理
           // 安全转换整数,添加异常处理
           int intdizhi0x6 = safeParseInt(dizhi0x6, 0);
           int intdizhi0x8 = safeParseInt(dizhi0x8, 0);
           int intdizhi0xA = safeParseInt(dizhi0xA, 0);
@@ -290,52 +363,49 @@
           int intdizhi0x50 = safeParseInt(finalDizhi0x50, 0);
           int intdizhi0x54 = safeParseInt(dizhi0x54, 0);
           int intdizhi0x58 = safeParseInt(dizhi0x58, 0);
           int intdizhi0xF4 = safeParseInt(dizhi0xF4, 0);
           int intdizhi0xF6 = safeParseInt(dizhi0xF6, 0);
           int intdizhi0xF8 = safeParseInt(dizhi0xF8, 0);
           
           System.out.println("参数转换完成,开始设置配置数据...");
           System.out.println("参数转换完成,开始设置配置数据...");
           
           // 设置配置数据
           DellTag55AA03.hexAA03.setDizhi0x4(getStringToHex(dizhi0x4)); // 设置设备ID
           DellTag55AA03.hexAA03.setDizhi0x6(getIntToHex(intdizhi0x6)); // 设置通信频率
           DellTag55AA03.hexAA03.setDizhi0x8(getIntToHex(intdizhi0x8)); // 设置最大基站数
           DellTag55AA03.hexAA03.setDizhi0xA(getIntToHex(intdizhi0xA)); // 设置最小基站数
           DellTag55AA03.hexAA03.setDizhi0xC(getIntToHex(intdizhi0xC)); // 设置距离校准值
           DellTag55AA03.hexAA03.setDizhi0xE(getIntToHex(intdizhi0xE)); // 设置设备类型
           DellTag55AA03.hexAA03.setDizhi0x10(getIntToHex(intdizhi0x10)); // 设置基站主动测距
           DellTag55AA03.hexAA03.setDizhi0x12(getIntToHex(intdizhi0x12)); // 设置报警设备
           DellTag55AA03.hexAA03.setDizhi0x14(getIntToHex(intdizhi0x14)); // 设置IMU空闲时间或继电器1报警距离1
           DellTag55AA03.hexAA03.setDizhi0x16(getStringToHex(dizhi0x16)); // 设置压力基站ID
           DellTag55AA03.hexAA03.setDizhi0x18(getIntToHex(intdizhi0x18)); // 设置外设控制或继电器1报警距离3
           DellTag55AA03.hexAA03.setDizhi0x1A(getStringToHex(dizhi0x1A)); // 设置配对ID
           DellTag55AA03.hexAA03.setDizhi0x1C(getStringToHex(finalDizhi0x1C)); // 设置UWB开关状态
           DellTag55AA03.hexAA03.setDizhi0x1E(getStringToHex(dizhi0x1E)); // 设置Modbus模式
           DellTag55AA03.hexAA03.setDizhi0x20(getIntToHex(intdizhi0x20)); // 设置振动时长或Modbus地址
           DellTag55AA03.hexAA03.setDizhi0x22(getStringToHex(dizhi0x22)); // 设置附近基站1ID
           DellTag55AA03.hexAA03.setDizhi0x24(getStringToHex(dizhi0x24)); // 设置附近基站2ID
           DellTag55AA03.hexAA03.setDizhi0x26(getStringToHex(dizhi0x26)); // 设置附近基站3ID
           DellTag55AA03.hexAA03.setDizhi0x28(getStringToHex(dizhi0x28)); // 设置附近基站4ID
           DellTag55AA03.hexAA03.setDizhi0x2A(getStringToHex(dizhi0x2A)); // 设置附近基站5ID
           DellTag55AA03.hexAA03.setDizhi0x2C(getStringToHex(dizhi0x2C)); // 设置附近基站6ID
           DellTag55AA03.hexAA03.setDizhi0x2E(getStringToHex(dizhi0x2E)); // 设置附近基站7ID
           DellTag55AA03.hexAA03.setDizhi0x30(getStringToHex(dizhi0x30)); // 设置附近基站8ID
           DellTag55AA03.hexAA03.setDizhi0x32(getStringToHex(dizhi0x32)); // 设置附近基站9ID
           DellTag55AA03.hexAA03.setDizhi0x34(getStringToHex(dizhi0x34)); // 设置附近基站10ID
           DellTag55AA03.hexAA03.setDizhi0x36(getIntToHex(intdizhi0x36)); // 设置功率
           DellTag55AA03.hexAA03.setDizhi0x38(getIntToHex(intdizhi0x38)); // 设置加速度计阈值
           DellTag55AA03.hexAA03.setDizhi0x3A(getIntToHex(intdizhi0x3A)); // 设置空闲休眠时间
           DellTag55AA03.hexAA03.setDizhi0x3C(getStringToHex(dizhi0x3C)); // 设置振动使能
           DellTag55AA03.hexAA03.setDizhi0x3E(getStringToHex(dizhi0x3E)); // 设置加速度计使能
           DellTag55AA03.hexAA03.setDizhi0x40(getStringToHex(dizhi0x40)); // 设置标签配置状态
           DellTag55AA03.hexAA03.setDizhi0x42(getIntToHex(intdizhi0x42)); // 设置加速度计时长
           DellTag55AA03.hexAA03.setDizhi0x44(getStringToHex(finalDizhi0x44)); // 设置设备激活状态或同步基站ID
           DellTag55AA03.hexAA03.setDizhi0x46(getStringToHex(dizhi0x46)); // 设置同步基站类型
           DellTag55AA03.hexAA03.setDizhi0x48(getIntToHex(intdizhi0x48)); // 设置速度滤波限制
           DellTag55AA03.hexAA03.setDizhi0x4A(getStringToHex(dizhi0x4A));//白名单起始ID
           DellTag55AA03.hexAA03.setDizhi0x4C(getStringToHex(dizhi0x4C));//白名单终止ID
           DellTag55AA03.hexAA03.setDizhi0x50(getIntToHex(intdizhi0x50)); // 设置压力高度校准或继电器持续时间
           // 设置配置数据
           DellTag55AA03.hexAA03.setDizhi0x4(getStringToHex(dizhi0x4)); // 设置设备ID
           DellTag55AA03.hexAA03.setDizhi0x6(getIntToHex(intdizhi0x6)); // 设置通信频率
           DellTag55AA03.hexAA03.setDizhi0x8(getIntToHex(intdizhi0x8)); // 设置最大基站数
           DellTag55AA03.hexAA03.setDizhi0xA(getIntToHex(intdizhi0xA)); // 设置最小基站数
           DellTag55AA03.hexAA03.setDizhi0xC(getIntToHex(intdizhi0xC)); // 设置距离校准值
           DellTag55AA03.hexAA03.setDizhi0xE(getIntToHex(intdizhi0xE)); // 设置设备类型
           DellTag55AA03.hexAA03.setDizhi0x10(getIntToHex(intdizhi0x10)); // 设置基站主动测距
           DellTag55AA03.hexAA03.setDizhi0x12(getIntToHex(intdizhi0x12)); // 设置报警设备
           DellTag55AA03.hexAA03.setDizhi0x14(getIntToHex(intdizhi0x14)); // 设置IMU空闲时间或继电器1报警距离1
           DellTag55AA03.hexAA03.setDizhi0x16(getStringToHex(dizhi0x16)); // 设置压力基站ID
           DellTag55AA03.hexAA03.setDizhi0x18(getIntToHex(intdizhi0x18)); // 设置外设控制或继电器1报警距离3
           DellTag55AA03.hexAA03.setDizhi0x1A(getStringToHex(dizhi0x1A)); // 设置配对ID
           DellTag55AA03.hexAA03.setDizhi0x1C(getStringToHex(finalDizhi0x1C)); // 设置UWB开关状态
           DellTag55AA03.hexAA03.setDizhi0x1E(getStringToHex(dizhi0x1E)); // 设置Modbus模式
           DellTag55AA03.hexAA03.setDizhi0x20(getIntToHex(intdizhi0x20)); // 设置振动时长或Modbus地址
           DellTag55AA03.hexAA03.setDizhi0x22(getStringToHex(dizhi0x22)); // 设置附近基站1ID
           DellTag55AA03.hexAA03.setDizhi0x24(getStringToHex(dizhi0x24)); // 设置附近基站2ID
           DellTag55AA03.hexAA03.setDizhi0x26(getStringToHex(dizhi0x26)); // 设置附近基站3ID
           DellTag55AA03.hexAA03.setDizhi0x28(getStringToHex(dizhi0x28)); // 设置附近基站4ID
           DellTag55AA03.hexAA03.setDizhi0x2A(getStringToHex(dizhi0x2A)); // 设置附近基站5ID
           DellTag55AA03.hexAA03.setDizhi0x2C(getStringToHex(dizhi0x2C)); // 设置附近基站6ID
           DellTag55AA03.hexAA03.setDizhi0x2E(getStringToHex(dizhi0x2E)); // 设置附近基站7ID
           DellTag55AA03.hexAA03.setDizhi0x30(getStringToHex(dizhi0x30)); // 设置附近基站8ID
           DellTag55AA03.hexAA03.setDizhi0x32(getStringToHex(dizhi0x32)); // 设置附近基站9ID
           DellTag55AA03.hexAA03.setDizhi0x34(getStringToHex(dizhi0x34)); // 设置附近基站10ID
           DellTag55AA03.hexAA03.setDizhi0x36(getIntToHex(intdizhi0x36)); // 设置功率
           DellTag55AA03.hexAA03.setDizhi0x38(getIntToHex(intdizhi0x38)); // 设置加速度计阈值
           DellTag55AA03.hexAA03.setDizhi0x3A(getIntToHex(intdizhi0x3A)); // 设置空闲休眠时间
           DellTag55AA03.hexAA03.setDizhi0x3C(getStringToHex(dizhi0x3C)); // 设置振动使能
           DellTag55AA03.hexAA03.setDizhi0x3E(getStringToHex(dizhi0x3E)); // 设置加速度计使能
           DellTag55AA03.hexAA03.setDizhi0x40(getStringToHex(dizhi0x40)); // 设置标签配置状态
           DellTag55AA03.hexAA03.setDizhi0x42(getIntToHex(intdizhi0x42)); // 设置加速度计时长
           DellTag55AA03.hexAA03.setDizhi0x44(getStringToHex(finalDizhi0x44)); // 设置设备激活状态或同步基站ID
           DellTag55AA03.hexAA03.setDizhi0x46(getStringToHex(dizhi0x46)); // 设置同步基站类型
           DellTag55AA03.hexAA03.setDizhi0x48(getIntToHex(intdizhi0x48)); // 设置速度滤波限制
           DellTag55AA03.hexAA03.setDizhi0x4A(getStringToHex(dizhi0x4A));//白名单起始ID
           DellTag55AA03.hexAA03.setDizhi0x4C(getStringToHex(dizhi0x4C));//白名单终止ID
           DellTag55AA03.hexAA03.setDizhi0x4E(getStringToHex(dizhi0x4E));//白名单终止ID
           DellTag55AA03.hexAA03.setDizhi0x50(getIntToHex(intdizhi0x50)); // 设置压力高度校准或继电器持续时间
           DellTag55AA03.hexAA03.setDizhi0x52(getStringToHex(dizhi0x52)); // 
           DellTag55AA03.hexAA03.setDizhi0x54(getIntToHex(intdizhi0x54)); // 
           DellTag55AA03.hexAA03.setDizhi0x56(getStringToHex(dizhi0x56)); // 
@@ -345,31 +415,113 @@
           DellTag55AA03.hexAA03.setDizhi0x5E(getStringToHex(dizhi0x5E)); //        
           byte[] peizhiinfo = DellTag55AA03.getpeizhihex(DellTag55AA03.hexAA03);
           
           System.out.println("配置数据生成完成,长度: " + (peizhiinfo != null ? peizhiinfo.length : 0));
           System.out.println("配置数据生成完成,长度: " + (peizhiinfo != null ? peizhiinfo.length : 0));
           
           // 临时使用示例配置数据
           // 临时使用示例配置数据
           return peizhiinfo;
           
       } catch (Exception e) {
           System.err.println("收集参数配置时发生错误: " + e.getMessage());
           System.err.println("收集参数配置时发生错误: " + e.getMessage());
           e.printStackTrace();
           showErrorDialog("保存参数失败: " + e.getMessage());
           showErrorDialog(getString("save.parameters.failed") + ": " + e.getMessage());
           return null;
       }
   }
   /**
    * 安全的空值检查和trim处理,提供默认值
    * 收集继电器面板的参数构建配置数据
    */
   public static byte[] collectParametersToConfig2(AntiCollisionPanel antiCollisionPanel) {
      try {
         // 检查面板是否初始化
         if (antiCollisionPanel == null ) {
            showErrorDialog("面板未正确初始化");
            return null;
         }
         String dizhi0xF0="0000";
         String dizhi0xF2="0000";
         String dizhi0xF4="0000";
         String dizhi0xF6="0000";
         String dizhi0xF8="0000";
         // ========== 新增:根据选项卡确定使用哪个字段值 ==========
         // 获取当前选中的选项卡类型当前选中的面板索引 (0-基站, 1-标签, 2-防撞, 3-升级)
         int selectedTab = 0;
         try {
            selectedTab = SerialCommunicationPanel.getCurrentSelectedPanelIndex();
            // 确保索引在有效范围内
            if (selectedTab < 0 || selectedTab > 3) {
               selectedTab = 0;
               System.err.println("选项卡索引超出范围,使用默认值: 0");
            }
         } catch (Exception e) {
            selectedTab = 0; // 默认使用基站选项卡
            System.err.println("获取选项卡索引失败,使用默认值: " + e.getMessage());
         }
         System.out.println("当前选中的选项卡索引: " + selectedTab);
         if (selectedTab == 2) {
             dizhi0xF0= safeCheckAndTrim(antiCollisionPanel.getdizhi0xF0(), "继电器1控制", "0000");
             dizhi0xF2= safeCheckAndTrim(antiCollisionPanel.getdizhi0xF2(), "继电器2控制", "0000");
             dizhi0xF4= safeCheckAndTrim(antiCollisionPanel.getdizhi0xF4(), "继电器2报警距离1", "0000");
             dizhi0xF6= safeCheckAndTrim(antiCollisionPanel.getdizhi0xF6(), "继电器2报警距离2", "0000");
             dizhi0xF8= safeCheckAndTrim(antiCollisionPanel.getdizhi0xF8(), "继电器2报警距离3", "0000");
            System.out.println("使用防撞面板的字段值");
         } else {
            return null;
         }
         // 安全转换整数,添加异常处理
         int intdizhi0xF0= safeParseInt(dizhi0xF0, 0);
         int intdizhi0xF2= safeParseInt(dizhi0xF2, 0);
         int intdizhi0xF4= safeParseInt(dizhi0xF4, 0);
         int intdizhi0xF6= safeParseInt(dizhi0xF6, 0);
         int intdizhi0xF8= safeParseInt(dizhi0xF8, 0);
         System.out.println("参数转换完成,开始设置配置数据...");
         // 设置配置数据
         DellTag55AA03.hexAA03.setDizhi0xF0(getIntToHex(intdizhi0xF0)); //
         DellTag55AA03.hexAA03.setDizhi0xF2(getIntToHex(intdizhi0xF2)); //
         DellTag55AA03.hexAA03.setDizhi0xF4(getIntToHex(intdizhi0xF4)); //
         DellTag55AA03.hexAA03.setDizhi0xF6(getIntToHex(intdizhi0xF6)); //
         DellTag55AA03.hexAA03.setDizhi0xF8(getIntToHex(intdizhi0xF8)); //
         byte[] peizhiinfo = DellTag55AA03.getpeizhihex2(DellTag55AA03.hexAA03);
         System.out.println("配置数据生成完成,长度: " + (peizhiinfo != null ? peizhiinfo.length : 0));
         // 临时使用示例配置数据
         return peizhiinfo;
      } catch (Exception e) {
         System.err.println("收集参数配置时发生错误: " + e.getMessage());
         e.printStackTrace();
         showErrorDialog("保存参数失败: " + e.getMessage());
         return null;
      }
   }
   /**
    * 安全的空值检查和trim处理,提供默认值
    */
   private static String safeCheckAndTrim(String value, String fieldName, String defaultValue) {
       if (value == null) {
           System.err.println(fieldName + " 为null,使用默认值: " + defaultValue);
           System.err.println(fieldName + " 为null,使用默认值: " + defaultValue);
           return defaultValue;
       }
       
       String trimmed = value.trim();
       if (trimmed.isEmpty()) {
           System.err.println(fieldName + " 为空,使用默认值: " + defaultValue);
           System.err.println(fieldName + " 为空,使用默认值: " + defaultValue);
           return defaultValue;
       }
       
@@ -377,7 +529,7 @@
   }
   /**
    * 安全转换字符串为整数
    * 安全转换字符串为整数
    */
   private static int safeParseInt(String value, int defaultValue) {
       if (value == null || value.trim().isEmpty()) {
@@ -387,8 +539,12 @@
       try {
           return Integer.parseInt(value.trim());
       } catch (NumberFormatException e) {
           System.err.println("数字格式错误: " + value + ",使用默认值: " + defaultValue);
           return defaultValue;
         try {
            return Integer.parseInt(value.trim(),16);
         } catch (NumberFormatException ex) {
            System.err.println("数字格式错误: " + value + ",使用默认值: " + defaultValue);
            return defaultValue;
         }
       }
   }
@@ -399,7 +555,7 @@
      String va=bytesToHex(buf);           
      return va;
   }
   /**10进制转字节数组*/
   /**10进制转字节数组*/
   public static byte[] intToRegisters(int v) {
      byte[] registers = new byte[4];
      registers[0] = (byte) (0xff & (v >> 24));
@@ -411,70 +567,121 @@
   public static String bytesToHex(byte[] bytes) {
      StringBuilder sb = new StringBuilder();
      for (byte b : bytes) {
         sb.append(String.format("%02X", b)); // 去掉格式字符串中的空格
         sb.append(String.format("%02X", b)); // 去掉格式字符串中的空格
      }
      return sb.toString(); // 此时已无需trim()
      return sb.toString(); // 此时已无需trim()
   }
   
   /**
    * 检查字符串是否为null或空,并去除空格
    * @param value 要检查的字符串
    * @param fieldName 字段名称(用于错误提示)
    * @return 处理后的字符串
    * 检查字符串是否为null或空,并去除空格
    * @param value 要检查的字符串
    * @param fieldName 字段名称(用于错误提示)
    * @return 处理后的字符串
    */
   private static String checkAndTrim(String value, String fieldName) {
       if (value == null) {
           showErrorDialog(fieldName + "不能为空");
           throw new IllegalArgumentException(fieldName + "不能为空");
           showErrorDialog(getString("field.cannot.empty").replace("{0}", fieldName));
           throw new IllegalArgumentException(fieldName + "不能为空");
       }
       
       String trimmed = value.trim();
       if (trimmed.isEmpty()) {
           showErrorDialog(fieldName + "不能为空");
           throw new IllegalArgumentException(fieldName + "不能为空");
           showErrorDialog(getString("field.cannot.empty").replace("{0}", fieldName));
           throw new IllegalArgumentException(fieldName + "不能为空");
       }
       
       return trimmed;
   }
   /**
    * 显示错误弹窗
    * @param message 错误信息
    * 显示错误弹窗
    * @param message 错误信息
    */
   private static void showErrorDialog(String message) {
       // 使用Swing显示错误对话框
       // 使用Swing显示错误对话框
       javax.swing.JOptionPane.showMessageDialog(null, 
           message, 
           "参数错误",
           getString("parameter.error"),
           javax.swing.JOptionPane.ERROR_MESSAGE);
   }
   /**获取设备编号*/
   /**获取设备编号*/
   public static String getStringToHex(String tagid) {
      byte[] buf =new byte[2];
      buf[0] = toByteArray(tagid)[1];
      buf[1] = toByteArray(tagid)[0];
      String va=bytesToHex(buf);
      // 添加空值和长度检查
      if (tagid == null || tagid.trim().isEmpty()) {
         System.err.println("警告: 参数 为空,使用默认值 0000");
         return "0000";
      }
      byte[] byteArray = toByteArray(tagid);
      // 检查转换后的字节数组长度
      if (byteArray == null || byteArray.length == 0) {
         System.err.println("警告: 参数 '" + tagid + "' 转换后的字节数组为空,使用默认值 0000");
         return "0000";
      }
      // 处理长度不足的情况
      byte[] buf = new byte[2];
      if (byteArray.length >= 2) {
         // 正常情况:交换字节顺序
         buf[0] = byteArray[1];
         buf[1] = byteArray[0];
      } else if (byteArray.length == 1) {
         // 只有一个字节的情况:高位补0
         buf[0] = byteArray[0];
         buf[1] = 0;
      } else {
         // 其他情况:全部补0
         buf[0] = 0;
         buf[1] = 0;
      }
      String va = bytesToHex(buf);
      System.out.println("getStringToHex: 输入='" + tagid + "', 输出='" + va + "'");
      return va;
   }
   /**
    * 16进制的字符串表示转成字节数组
    * 16进制的字符串表示转成字节数组
    *
    * @param hexString 16进制格式的字符串
    * @return 转换后的字节数组
    * @param hexString 16进制格式的字符串
    * @return 转换后的字节数组
    **/
   public static byte[] toByteArray(String hexString) {
      byte[] byteArray = null;
      if (hexString != null || hexString != "") {
         hexString = hexString.replaceAll(" ", "");
         byteArray = new byte[hexString.length() / 2];
         int k = 0;
         for (int i = 0; i < byteArray.length; i++) {//因为是16进制,最多只会占用4位,转换成字节需要两个16进制的字符,高位在先
            byte high = (byte) (Character.digit(hexString.charAt(k), 16) & 0xff);
            byte low = (byte) (Character.digit(hexString.charAt(k + 1), 16) & 0xff);
            byteArray[i] = (byte) (high << 4 | low);
            k += 2;
      // 添加更严格的输入验证
      if (hexString == null || hexString.trim().isEmpty()) {
         System.err.println("警告: toByteArray 输入为空");
         return new byte[0];
      }
      String cleanedHex = hexString.replaceAll(" ", "").toUpperCase();
      // 检查是否为有效的16进制字符串
      if (!cleanedHex.matches("[0-9A-F]+")) {
         System.err.println("警告: '" + hexString + "' 不是有效的16进制字符串");
         return new byte[0];
      }
      // 确保长度为偶数(补齐前导0)
      if (cleanedHex.length() % 2 != 0) {
         cleanedHex = "0" + cleanedHex;
         System.out.println("警告: 补齐16进制字符串为偶数长度: " + cleanedHex);
      }
      int length = cleanedHex.length();
      byte[] byteArray = new byte[length / 2];
      try {
         for (int i = 0; i < length; i += 2) {
            String byteStr = cleanedHex.substring(i, i + 2);
            byteArray[i / 2] = (byte) Integer.parseInt(byteStr, 16);
         }
      }
      } catch (Exception e) {
         System.err.println("toByteArray 转换错误: " + e.getMessage());
         return new byte[0];
      }
      return byteArray;
   }
}