From aa7da6b301f54566a252f7c98b5a7e219e7101d3 Mon Sep 17 00:00:00 2001 From: Tyrone CT Date: Fri, 8 May 2026 17:19:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=92=E9=87=8F=E5=B1=95=E7=A4=BA=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CapMachine.Wpf/Services/PPCService.cs | 136 +++++++++++++++++++------- temp_ppc_hasco.cs | Bin 0 -> 72210 bytes 2 files changed, 98 insertions(+), 38 deletions(-) create mode 100644 temp_ppc_hasco.cs 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 0000000000000000000000000000000000000000..68e132198525167d7873c755f55ac914278a56e7 GIT binary patch literal 72210 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 literal 0 HcmV?d00001