diff --git a/CapMachine.Wpf/Services/PPCService.cs b/CapMachine.Wpf/Services/PPCService.cs index 89d1707..140aa52 100644 --- a/CapMachine.Wpf/Services/PPCService.cs +++ b/CapMachine.Wpf/Services/PPCService.cs @@ -127,6 +127,18 @@ namespace CapMachine.Wpf.Services ReloadTherdyH3TempOffset(); + // 订阅 ConfigService.CurExpInfo 属性变化,实验切换时自动刷新排量缓存 + ConfigService.PropertyChanged += (sender, e) => + { + if (e.PropertyName == nameof(ConfigService.CurExpInfo)) + { + RefreshDisplacementCache(); + } + }; + + // 首次初始化排量缓存 + RefreshDisplacementCache(); + RtScanDeviceStart(); } @@ -291,6 +303,16 @@ namespace CapMachine.Wpf.Services /// private bool DebugLog { get; set; } = false; + /// + /// 缓存的压缩机排量值(cc),在实验切换时自动刷新 + /// + private double _cachedDisplacement_cc = double.NaN; + + /// + /// 缓存数据来源标识(用于调试):ExpInfo=实验信息, Config=配置文件, Default=默认值 + /// + private string _cachedSource = string.Empty; + private int _CurDisplacementCc; /// /// 当前的排量信息(供 UI 展示) @@ -683,60 +705,98 @@ namespace CapMachine.Wpf.Services /// - /// 获取压缩机排量。 + /// 获取压缩机排量(使用缓存机制,避免每次计算周期实时读取) /// /// 排量输出,单位 cc(cm³/rev)。 - /// 失败原因(未配置、解析失败、数值不合法)。 - /// 是否获取成功。 + /// 失败原因(仅在缓存异常时返回)。 + /// 始终返回 true(因为默认回退 35cc 保证缓存始终有效)。 private bool TryGetCompressorDisplacement_cc(out double displacement_cc, out string error) { - displacement_cc = double.NaN; + displacement_cc = _cachedDisplacement_cc; error = string.Empty; + return true; + } + /// + /// 刷新压缩机排量缓存,按优先级读取:实验信息 > 配置文件 > 默认值 + /// 实验切换时自动调用,保证缓存与当前实验信息一致 + /// + private void RefreshDisplacementCache() + { const double defaultDisplacementCc = 35d; - const string key = "CompressorDisplacementCc"; + double displacementCc = defaultDisplacementCc; + string source = "Default"; - static bool TryParseDisplacementCc(string? text, out double displacementCc) + // 优先1:从当前实验信息读取 + if (ConfigService?.CurExpInfo != null && + TryParseCompressorDisplacementTextToCc(ConfigService.CurExpInfo.CapDisplacement, out var expCc) && + expCc > 0) { - displacementCc = double.NaN; - if (string.IsNullOrWhiteSpace(text)) + displacementCc = expCc; + source = "ExpInfo"; + } + // 优先2:从 App.config 配置读取 + else + { + string configValue = ConfigHelper.GetValue("CompressorDisplacementCc"); + if (!string.IsNullOrWhiteSpace(configValue) && + TryParseCompressorDisplacementTextToCc(configValue, out var cfgCc) && + cfgCc > 0) { - return false; + displacementCc = cfgCc; + source = "Config"; } - - var normalized = text.Trim().ToLowerInvariant(); - normalized = normalized.Replace(',', '.'); - - var match = Regex.Match(normalized, @"[-+]?\d+(\.\d+)?"); - if (!match.Success) - { - return false; - } - - if (!double.TryParse(match.Value, NumberStyles.Float, CultureInfo.InvariantCulture, out var v)) - { - return false; - } - - displacementCc = v; - return true; + // 优先3:使用默认值(已在初始化时设置) } - try + // 更新缓存字段 + _cachedDisplacement_cc = displacementCc; + _cachedSource = source; + + // 同步更新 UI 展示属性 + CurDisplacementCc = (int)displacementCc; + + // 记录日志(便于调试) + Logger?.Info($"压缩机排量缓存已刷新: {displacementCc}cc (来源: {source})"); + } + + /// + /// 强制刷新压缩机排量缓存(供外部主动调用,用于调试或特殊情况如 App.config 配置修改后) + /// + public void ForceRefreshDisplacementCache() + { + RefreshDisplacementCache(); + } + + /// + /// 解析压缩机排量文本,支持多种格式(如 34.5cc、34,5 cm3 等) + /// + /// 排量文本 + /// 解析出的排量值(cc) + /// 是否解析成功 + private static bool TryParseCompressorDisplacementTextToCc(string? text, out double displacementCc) + { + displacementCc = double.NaN; + if (string.IsNullOrWhiteSpace(text)) { - string raw = ConfigHelper.GetValue(key); - if (TryParseDisplacementCc(raw, out var cfgCc) && cfgCc > 0) - { - displacement_cc = cfgCc; - return true; - } - } - catch - { - // 忽略配置读取异常,走默认回退值 + return false; } - displacement_cc = defaultDisplacementCc; + var normalized = text.Trim().ToLowerInvariant(); + normalized = normalized.Replace(',', '.'); + + var match = Regex.Match(normalized, @"[-+]?\d+(\.\d+)?"); + if (!match.Success) + { + return false; + } + + if (!double.TryParse(match.Value, NumberStyles.Float, CultureInfo.InvariantCulture, out var v)) + { + return false; + } + + displacementCc = v; return true; } diff --git a/temp_ppc_hasco.cs b/temp_ppc_hasco.cs new file mode 100644 index 0000000..68e1321 Binary files /dev/null and b/temp_ppc_hasco.cs differ