using System; using UnityEngine; public class SystemSettingsService : ISystemSettingsService { private SystemSettings _settings; private IDataPersistenceService _persistence; public SystemSettingsService() { // 获取数据持久化服务 _persistence = ServiceLocator.Get(); // 加载保存的设置,如果没有则使用默认值 LoadSettings(); ApplyPersistedSettingsOnStartup(); } public float Brightness { get => _settings.brightness; set { float oldValue = _settings.brightness; _settings.brightness = Mathf.Clamp(value, 10f, 100f); SaveSettings(); // 应用实际的亮度控制 ApplyBrightnessChange(_settings.brightness); // 记录亮度调整日志 LogSettingChange("调整屏幕亮度", $"从 {oldValue:F0}% 调整到 {_settings.brightness:F0}%"); } } public int Volume { get => _settings.volume; set { int oldValue = _settings.volume; _settings.volume = Mathf.Clamp(value, 10, 100); SaveSettings(); // 应用实际的音量控制 ApplyVolumeChange(_settings.volume); // 记录音量调整日志 LogSettingChange("调整系统音量", $"从 {oldValue}% 调整到 {_settings.volume}%"); } } public int MuteDurationMinutes { get => _settings.muteDurationMinutes; set { _settings.muteDurationMinutes = Mathf.Clamp(value, 1, 10); SaveSettings(); } } public DateTime SystemTime { get { if (_settings != null && _settings.useCustomSystemTime) { try { return DateTime.Now.AddTicks(_settings.customTimeOffsetTicks); } catch { return DateTime.Now; } } return DateTime.Now; } set { DateTime oldValue = SystemTime; DateTime now = DateTime.Now; TimeSpan offset = value - now; // 选择当前时间(或接近当前时间)时,恢复跟随系统时钟,避免关机后时间漂移。 if (Mathf.Abs((float)offset.TotalSeconds) <= 2f) { _settings.useCustomSystemTime = false; _settings.customTimeOffsetTicks = 0; _settings.systemTime = DateTime.MinValue; SaveSettings(); LogSettingChange("调整UI显示时间", $"恢复跟随系统时间(旧显示时间: {oldValue:yyyy-MM-dd HH:mm:ss})"); return; } _settings.useCustomSystemTime = true; _settings.customTimeOffsetTicks = offset.Ticks; _settings.systemTime = value; SaveSettings(); // 注意:仅更新应用显示时间,不修改系统时间。 LogSettingChange("调整UI显示时间", $"从 {oldValue:yyyy-MM-dd HH:mm:ss} 调整到 {value:yyyy-MM-dd HH:mm:ss}(仅UI显示)"); } } public NetworkConfig Network { get => _settings.network; set { _settings.network = value; SaveSettings(); // 应用网络配置变化 ApplyNetworkConfigChange(value); // 记录网络配置日志 LogSettingChange("修改网络配置", $"模式: {value.Mode}, IP: {value.IPv4}, 网关: {value.Gateway}"); } } public string VersionShort => _settings.version; public string VersionFull => $"{_settings.version}+2025.09.17"; // 串口通信相关属性 public string SerialPortName { get => _settings.serialPortName ?? "COM1"; set { string oldValue = _settings.serialPortName; _settings.serialPortName = value; SaveSettings(); ApplySerialPortChange(value); // 记录串口名称调整日志 LogSettingChange("修改串口名称", $"从 {oldValue} 修改为 {value}"); } } public int SerialBaudRate { get => _settings.serialBaudRate > 0 ? _settings.serialBaudRate : 115200; set { int oldValue = _settings.serialBaudRate; _settings.serialBaudRate = value; SaveSettings(); ApplySerialBaudRateChange(value); // 记录波特率调整日志 LogSettingChange("修改串口波特率", $"从 {oldValue} 修改为 {value}"); } } public bool EnableSerialCommunication { get => _settings.enableSerialCommunication; set { _settings.enableSerialCommunication = value; SaveSettings(); ApplySerialCommunicationToggle(value); } } // BFI阈值设置实现 public float BFILowThreshold { get => _settings.bfiLowThreshold; set { _settings.bfiLowThreshold = Mathf.Clamp(value, 0f, 200f); SaveSettings(); ApplyBFIThresholdChange(); } } public float BFIHighThreshold { get => _settings.bfiHighThreshold; set { _settings.bfiHighThreshold = Mathf.Clamp(value, 0f, 200f); SaveSettings(); ApplyBFIThresholdChange(); } } public int BFIAlarmPriority { get => _settings.bfiAlarmPriority; set { _settings.bfiAlarmPriority = Mathf.Clamp(value, 0, 2); // 0=低, 1=中, 2=高 SaveSettings(); // ApplyBFIThresholdChange(); } } public bool EnableBFIAlarm { get => _settings.enableBFIAlarm; set { _settings.enableBFIAlarm = value; SaveSettings(); // ApplyBFIThresholdChange(); } } public void SetBFIAlarmSettings(float lowThreshold, float highThreshold, int priority, bool enabled) { _settings.bfiLowThreshold = Mathf.Clamp(lowThreshold, 0f, 200f); _settings.bfiHighThreshold = Mathf.Clamp(highThreshold, 0f, 200f); if (_settings.bfiHighThreshold < _settings.bfiLowThreshold) { _settings.bfiHighThreshold = _settings.bfiLowThreshold; } _settings.bfiAlarmPriority = Mathf.Clamp(priority, 0, 2); _settings.enableBFIAlarm = enabled; SaveSettings(); ApplyBFIThresholdChange(); } private void LoadSettings() { if (_persistence != null) { _settings = _persistence.LoadSettings(); } else { // 如果持久化服务不可用,使用默认设置 _settings = new SystemSettings(); } NormalizeLoadedSettings(); SaveSettings(); Debug.Log($"系统设置已加载 - 亮度:{_settings.brightness:F1}%, 音量:{_settings.volume}%, 静音:{_settings.muteDurationMinutes}分钟, BFI:{_settings.bfiLowThreshold:F1}-{_settings.bfiHighThreshold:F1}, 优先级:{_settings.bfiAlarmPriority}, 启用:{_settings.enableBFIAlarm}"); } private void NormalizeLoadedSettings() { if (_settings == null) { _settings = new SystemSettings(); return; } _settings.brightness = Mathf.Clamp(_settings.brightness, 10f, 100f); _settings.volume = Mathf.Clamp(_settings.volume, 10, 100); _settings.muteDurationMinutes = Mathf.Clamp(_settings.muteDurationMinutes, 1, 10); _settings.bfiLowThreshold = Mathf.Clamp(_settings.bfiLowThreshold, 0f, 200f); _settings.bfiHighThreshold = Mathf.Clamp(_settings.bfiHighThreshold, 0f, 200f); _settings.bfiAlarmPriority = Mathf.Clamp(_settings.bfiAlarmPriority, 0, 2); // 旧版本没有useCustomSystemTime字段时默认false,统一按系统时钟显示。 if (!_settings.useCustomSystemTime) { _settings.customTimeOffsetTicks = 0; _settings.systemTime = DateTime.MinValue; } } private void ApplyPersistedSettingsOnStartup() { if (_settings == null) { return; } ApplyBrightnessChange(_settings.brightness); ApplyVolumeChange(_settings.volume); ApplyBFIThresholdChange(); Debug.Log($"启动应用已恢复系统设置 - 亮度:{_settings.brightness:F1}%, 音量:{_settings.volume}%, BFI:{_settings.bfiLowThreshold:F1}-{_settings.bfiHighThreshold:F1}"); } private bool SaveSettings() { if (_persistence == null) { return false; } return _persistence.SaveSettings(_settings); } private void ApplyBrightnessChange(float brightness) { try { int brightnessInt = Mathf.RoundToInt(brightness); Screen.brightness = brightness / 100f; bool success = WindowsSystemController.SetMonitorBrightness(brightnessInt); if (success) { Debug.Log($"应用亮度变化成功: {brightness}%"); } else { Debug.LogWarning($"应用亮度变化失败: {brightness}% - 可能需要管理员权限或不支持的硬件"); } } catch (System.Exception ex) { Debug.LogError($"应用亮度设置失败: {ex.Message}"); } } private void ApplyVolumeChange(int volume) { try { // 使用 WindowsSystemController 进行真实的音量控制 bool success = WindowsSystemController.SetSystemVolume(volume); if (success) { Debug.Log($"应用音量变化成功: {volume}%"); } else { Debug.LogWarning($"应用音量变化失败: {volume}% - 尝试使用现有SoundManager"); // 备用方案:使用现有的SoundManager #if UNITY_STANDALONE_WIN && !UNITY_EDITOR var soundManager = GeneralTools.SoundManager.Instance; if (soundManager != null) { // 这是一个简化的音量调整,实际效果可能不够精确 Debug.Log($"使用SoundManager模拟音量变化: {volume}%"); } #endif } } catch (System.Exception ex) { Debug.LogError($"应用音量设置失败: {ex.Message}"); } } private void ApplySystemTimeChange(DateTime dateTime) { try { // 首先检查时间设置权限 if (!TimeSettingsPermissionManager.HasTimeSettingsPermission()) { Debug.LogWarning($"缺少时间设置权限: {TimeSettingsPermissionManager.GetTimeSettingsLimitations()}"); // 尝试请求权限或引导用户 bool permissionResult = TimeSettingsPermissionManager.RequestTimeSettingsPermission(); if (!permissionResult) { Debug.Log("时间设置需要用户手动操作,请按照系统提示进行"); return; } } // 使用 WindowsSystemController 进行真实的系统时间设置 bool success = WindowsSystemController.SetSystemTime(dateTime); if (success) { Debug.Log($"应用系统时间变化成功: {dateTime:yyyy-MM-dd HH:mm:ss}"); // 验证时间是否设置成功 if (TimeSettingsPermissionManager.VerifyTimeSet(dateTime)) { Debug.Log("系统时间设置已验证成功"); } else { Debug.LogWarning("系统时间设置验证失败,可能存在时间差异"); } } else { Debug.LogWarning($"应用系统时间变化失败: {dateTime:yyyy-MM-dd HH:mm:ss}"); #if UNITY_STANDALONE_WIN && !UNITY_EDITOR Debug.LogWarning("Windows: 可能需要管理员权限来修改系统时间"); Debug.Log($"推荐操作流程: {TimeSettingsPermissionManager.GetRecommendedTimeSetupProcess()}"); #elif UNITY_ANDROID && !UNITY_EDITOR Debug.LogWarning("Android: 普通应用无法直接修改系统时间,已引导用户到系统设置"); Debug.Log($"请按照以下流程操作: {TimeSettingsPermissionManager.GetRecommendedTimeSetupProcess()}"); #endif } } catch (System.Exception ex) { Debug.LogError($"应用系统时间设置失败: {ex.Message}"); } } private void ApplyNetworkConfigChange(NetworkConfig config) { try { bool applied = NetworkConfigurator.Apply(config); } catch (System.Exception ex) { Debug.LogError($"应用网络配置失败: {ex.Message}"); } } private void ApplySerialPortChange(string portName) { try { var serialService = ServiceLocator.Get(); if (serialService != null && serialService.IsConnected) { // 重新连接串口 serialService.Disconnect(); serialService.Connect(portName, SerialBaudRate); } Debug.Log($"串口设置变更: {portName}"); } catch (System.Exception ex) { Debug.LogError($"应用串口设置失败: {ex.Message}"); } } private void ApplySerialBaudRateChange(int baudRate) { try { var serialService = ServiceLocator.Get(); if (serialService != null && serialService.IsConnected) { // 重新连接串口 serialService.Disconnect(); serialService.Connect(SerialPortName, baudRate); } Debug.Log($"串口波特率变更: {baudRate}"); } catch (System.Exception ex) { Debug.LogError($"应用串口波特率设置失败: {ex.Message}"); } } private void ApplySerialCommunicationToggle(bool enabled) { try { var serialService = ServiceLocator.Get(); if (serialService != null) { if (enabled && !serialService.IsConnected) { serialService.Connect(SerialPortName, SerialBaudRate); } else if (!enabled && serialService.IsConnected) { serialService.Disconnect(); } } Debug.Log($"串口通信 {(enabled ? "启用" : "禁用")}"); } catch (System.Exception ex) { Debug.LogError($"切换串口通信状态失败: {ex.Message}"); } } /// /// 记录系统设置变更日志 /// private void LogSettingChange(string settingName, string details) { try { var authService = ServiceLocator.Get(); var logService = ServiceLocator.Get(); logService?.LogUserOperation( authService?.CurrentUsername ?? "system", settingName, details, true); } catch (Exception ex) { Debug.LogError($"记录设置变更日志失败: {ex.Message}"); } } private void ApplyBFIThresholdChange() { try { // 通知DCSAlarmManager更新BFI阈值配置 if (DCSAlarmManager.Instance != null) { DCSAlarmManager.Instance.UpdateBFIThresholds( BFILowThreshold, BFIHighThreshold, BFIAlarmPriority, EnableBFIAlarm ); } // 记录BFI阈值调整日志 var authService = ServiceLocator.Get(); var logService = ServiceLocator.Get(); logService?.LogUserOperation( authService?.CurrentUsername ?? "system", "调整BFI阈值", $"下限: {BFILowThreshold:F1}, 上限: {BFIHighThreshold:F1}, 优先级: {BFIAlarmPriority}, 启用: {EnableBFIAlarm}", true); Debug.Log($"DCSAlarmManager: BFI阈值已更新 - 下限:{BFILowThreshold}, 上限:{BFIHighThreshold}, 优先级:{BFIAlarmPriority}, 启用:{EnableBFIAlarm}"); } catch (System.Exception ex) { Debug.LogError($"应用BFI阈值设置失败: {ex.Message}"); } } }