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