package set; import java.io.*; import java.util.Properties; public class Setsys { public static final int DEFAULT_IDLE_TRAIL_DURATION_SECONDS = 60; private String mowerId; private String cuttingWidth; private String simCardNumber; private String handheldMarkerId; private String firmwareVersion; private String appVersion; private int idleTrailDurationSeconds = DEFAULT_IDLE_TRAIL_DURATION_SECONDS; private boolean boundaryLengthVisible = false; // 默认关闭显示边界距离 private boolean measurementModeEnabled = false; // 默认关闭测量模式 private boolean manualBoundaryDrawingMode = false; // 默认关闭手动绘制边界模式 private static final String PROPERTIES_FILE = "set.properties"; // 无参构造方法 public Setsys() { } // 带参构造方法 public Setsys(String mowerId, String cuttingWidth, String simCardNumber, String handheldMarkerId, String firmwareVersion, String appVersion) { this.mowerId = mowerId; this.cuttingWidth = cuttingWidth; this.simCardNumber = simCardNumber; this.handheldMarkerId = handheldMarkerId; this.firmwareVersion = firmwareVersion; this.appVersion = appVersion; } // Getter和Setter方法 public String getMowerId() { return mowerId; } public void setMowerId(String mowerId) { this.mowerId = mowerId; } public String getCuttingWidth() { return cuttingWidth; } public void setCuttingWidth(String cuttingWidth) { this.cuttingWidth = cuttingWidth; } public String getSimCardNumber() { return simCardNumber; } public void setSimCardNumber(String simCardNumber) { this.simCardNumber = simCardNumber; } public String getHandheldMarkerId() { return handheldMarkerId; } public void setHandheldMarkerId(String handheldMarkerId) { this.handheldMarkerId = handheldMarkerId; } public String getFirmwareVersion() { return firmwareVersion; } public void setFirmwareVersion(String firmwareVersion) { this.firmwareVersion = firmwareVersion; } public String getAppVersion() { return appVersion; } public void setAppVersion(String appVersion) { this.appVersion = appVersion; } public int getIdleTrailDurationSeconds() { return idleTrailDurationSeconds; } public void setIdleTrailDurationSeconds(int seconds) { this.idleTrailDurationSeconds = sanitizeIdleTrailDuration(String.valueOf(seconds)); } public boolean isBoundaryLengthVisible() { return boundaryLengthVisible; } public void setBoundaryLengthVisible(boolean visible) { this.boundaryLengthVisible = visible; } public boolean isMeasurementModeEnabled() { return measurementModeEnabled; } public void setMeasurementModeEnabled(boolean enabled) { this.measurementModeEnabled = enabled; } public boolean isManualBoundaryDrawingMode() { return manualBoundaryDrawingMode; } public void setManualBoundaryDrawingMode(boolean enabled) { this.manualBoundaryDrawingMode = enabled; } /** * 初始化方法 - 从properties文件读取数据 * 如果属性值为-1,表示没有值,设置为null */ public void initializeFromProperties() { Properties props = new Properties(); try (FileInputStream input = new FileInputStream(PROPERTIES_FILE)) { props.load(input); // 读取属性值,如果为-1则设置为null this.mowerId = "-1".equals(props.getProperty("mowerId")) ? null : props.getProperty("mowerId"); this.cuttingWidth = "-1".equals(props.getProperty("cuttingWidth")) ? null : props.getProperty("cuttingWidth"); this.simCardNumber = "-1".equals(props.getProperty("simCardNumber")) ? null : props.getProperty("simCardNumber"); this.handheldMarkerId = "-1".equals(props.getProperty("handheldMarkerId")) ? null : props.getProperty("handheldMarkerId"); this.firmwareVersion = "-1".equals(props.getProperty("firmwareVersion")) ? null : props.getProperty("firmwareVersion"); this.appVersion = "-1".equals(props.getProperty("appVersion")) ? null : props.getProperty("appVersion"); this.idleTrailDurationSeconds = sanitizeIdleTrailDuration(props.getProperty("idleTrailDurationSeconds")); String boundaryLengthVisibleStr = props.getProperty("boundaryLengthVisible"); this.boundaryLengthVisible = "true".equalsIgnoreCase(boundaryLengthVisibleStr); String measurementModeEnabledStr = props.getProperty("measurementModeEnabled"); this.measurementModeEnabled = "true".equalsIgnoreCase(measurementModeEnabledStr); String manualBoundaryDrawingModeStr = props.getProperty("manualBoundaryDrawingMode"); this.manualBoundaryDrawingMode = "true".equalsIgnoreCase(manualBoundaryDrawingModeStr); } catch (FileNotFoundException e) { // 文件不存在时,设置所有属性为null setAllPropertiesToNull(); } catch (IOException e) { setAllPropertiesToNull(); } } /** * 更新属性值并同步到properties文件 * @param propertyName 属性名 * @param value 属性值 * @return 是否更新成功 */ public boolean updateProperty(String propertyName, String value) { // 更新内存中的属性值 switch (propertyName) { case "mowerId": this.mowerId = value; break; case "cuttingWidth": this.cuttingWidth = value; break; case "simCardNumber": this.simCardNumber = value; break; case "handheldMarkerId": this.handheldMarkerId = value; break; case "firmwareVersion": this.firmwareVersion = value; break; case "appVersion": this.appVersion = value; break; case "idleTrailDurationSeconds": int durationSeconds = sanitizeIdleTrailDuration(value); this.idleTrailDurationSeconds = durationSeconds; value = String.valueOf(durationSeconds); break; case "boundaryLengthVisible": this.boundaryLengthVisible = "true".equalsIgnoreCase(value); break; case "measurementModeEnabled": this.measurementModeEnabled = "true".equalsIgnoreCase(value); break; case "manualBoundaryDrawingMode": this.manualBoundaryDrawingMode = "true".equalsIgnoreCase(value); break; case "mapScale": // mapScale不需要在内存中存储,直接更新到文件 break; default: // 对于其他属性,也允许直接更新到文件(不打印错误) break; } // 更新properties文件 return updatePropertiesFile(propertyName, value); } /** * 更新properties文件中的属性值 */ private boolean updatePropertiesFile(String propertyName, String value) { Properties props = new Properties(); try (FileInputStream input = new FileInputStream(PROPERTIES_FILE)) { // 先加载现有属性 props.load(input); } catch (IOException e) { System.err.println("读取属性文件失败: " + e.getMessage()); } // 设置新值 props.setProperty(propertyName, value); // 写回文件 try (FileOutputStream output = new FileOutputStream(PROPERTIES_FILE)) { props.store(output, "Mower Configuration Properties - Updated"); return true; } catch (IOException e) { System.err.println("更新属性文件失败: " + e.getMessage()); return false; } } private int sanitizeIdleTrailDuration(String raw) { if (raw == null) { return DEFAULT_IDLE_TRAIL_DURATION_SECONDS; } String trimmed = raw.trim(); if (trimmed.isEmpty() || "-1".equals(trimmed)) { return DEFAULT_IDLE_TRAIL_DURATION_SECONDS; } try { int value = Integer.parseInt(trimmed); if (value < 5 || value > 600) { return DEFAULT_IDLE_TRAIL_DURATION_SECONDS; } return value; } catch (NumberFormatException ex) { return DEFAULT_IDLE_TRAIL_DURATION_SECONDS; } } /** * 设置所有属性为null */ private void setAllPropertiesToNull() { this.mowerId = null; this.cuttingWidth = null; this.simCardNumber = null; this.handheldMarkerId = null; this.firmwareVersion = null; this.appVersion = null; this.idleTrailDurationSeconds = DEFAULT_IDLE_TRAIL_DURATION_SECONDS; this.boundaryLengthVisible = false; // 默认关闭 this.measurementModeEnabled = false; // 默认关闭测量模式 this.manualBoundaryDrawingMode = false; // 默认关闭手动绘制边界模式 } /** * 显示当前所有属性值 */ public void displayProperties() { System.out.println("当前属性值:"); System.out.println("mowerId: " + (mowerId != null ? mowerId : "未设置")); System.out.println("cuttingWidth: " + (cuttingWidth != null ? cuttingWidth : "未设置")); System.out.println("simCardNumber: " + (simCardNumber != null ? simCardNumber : "未设置")); System.out.println("handheldMarkerId: " + (handheldMarkerId != null ? handheldMarkerId : "未设置")); System.out.println("firmwareVersion: " + (firmwareVersion != null ? firmwareVersion : "未设置")); System.out.println("appVersion: " + (appVersion != null ? appVersion : "未设置")); System.out.println("idleTrailDurationSeconds: " + idleTrailDurationSeconds); } // 根据set.properties中的键名获取对应的值,没有或为-1时返回null public static String getPropertyValue(String key) { if (key == null || key.trim().isEmpty()) { return null; } Properties props = new Properties(); try (FileInputStream input = new FileInputStream(PROPERTIES_FILE)) { props.load(input); String value = props.getProperty(key); if (value == null || "-1".equals(value)) { return null; } return value; } catch (FileNotFoundException e) { System.err.println("属性文件未找到: " + PROPERTIES_FILE); } catch (IOException e) { System.err.println("读取属性文件时出错: " + e.getMessage()); } return null; } @Override public String toString() { return "Set{" + "mowerId='" + mowerId + '\'' + ", cuttingWidth='" + cuttingWidth + '\'' + ", simCardNumber='" + simCardNumber + '\'' + ", handheldMarkerId='" + handheldMarkerId + '\'' + ", firmwareVersion='" + firmwareVersion + '\'' + ", appVersion='" + appVersion + '\'' + ", idleTrailDurationSeconds=" + idleTrailDurationSeconds + '}'; } }