| | |
| | | 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, |
| | |
| | | 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) { |
| | |
| | | |
| | | 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) { |
| | |
| | | |
| | | 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) { |
| | |
| | | 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) { |
| | |
| | | } |
| | | |
| | | 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) { |
| | |
| | | } |
| | | |
| | | 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, |
| | |
| | | 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"); |
| | | // 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 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; |
| | |
| | | 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); |
| | |
| | | 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)); // |
| | |
| | | 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; |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 收集继电器面板的参数构建配置数据 |
| | | */ |
| | | 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处理,提供默认值 |
| | | * 安全的空值检查和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; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | /** |
| | | * 安全转换字符串为整数 |
| | | * 安全转换字符串为整数 |
| | | */ |
| | | private static int safeParseInt(String value, int defaultValue) { |
| | | if (value == null || value.trim().isEmpty()) { |
| | |
| | | try { |
| | | return Integer.parseInt(value.trim()); |
| | | } catch (NumberFormatException e) { |
| | | System.err.println("数字格式错误: " + value + ",使用默认值: " + defaultValue); |
| | | try { |
| | | return Integer.parseInt(value.trim(),16); |
| | | } catch (NumberFormatException ex) { |
| | | System.err.println("数字格式错误: " + value + ",使用默认值: " + defaultValue); |
| | | return defaultValue; |
| | | } |
| | | } |
| | | } |
| | | |
| | | public static String getIntToHex(int value) { |
| | | byte[] buf =new byte[2]; |
| | |
| | | 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)); |
| | |
| | | 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) { |
| | | // 添加空值和长度检查 |
| | | 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]; |
| | | buf[0] = toByteArray(tagid)[1]; |
| | | buf[1] = toByteArray(tagid)[0]; |
| | | 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; |
| | | } |
| | | } |