排量展示更新问题

This commit is contained in:
2026-05-08 17:19:16 +08:00
parent ebade3b89d
commit aa7da6b301
2 changed files with 98 additions and 38 deletions

View File

@@ -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
/// </summary>
private bool DebugLog { get; set; } = false;
/// <summary>
/// 缓存的压缩机排量值cc在实验切换时自动刷新
/// </summary>
private double _cachedDisplacement_cc = double.NaN;
/// <summary>
/// 缓存数据来源标识用于调试ExpInfo=实验信息, Config=配置文件, Default=默认值
/// </summary>
private string _cachedSource = string.Empty;
private int _CurDisplacementCc;
/// <summary>
/// 当前的排量信息(供 UI 展示)
@@ -683,60 +705,98 @@ namespace CapMachine.Wpf.Services
/// <summary>
/// 获取压缩机排量
/// 获取压缩机排量(使用缓存机制,避免每次计算周期实时读取)
/// </summary>
/// <param name="displacement_cc">排量输出,单位 cccm³/rev。</param>
/// <param name="error">失败原因(未配置、解析失败、数值不合法)。</param>
/// <returns>是否获取成功。</returns>
/// <param name="error">失败原因(仅在缓存异常时返回)。</param>
/// <returns>始终返回 true因为默认回退 35cc 保证缓存始终有效)。</returns>
private bool TryGetCompressorDisplacement_cc(out double displacement_cc, out string error)
{
displacement_cc = double.NaN;
displacement_cc = _cachedDisplacement_cc;
error = string.Empty;
return true;
}
/// <summary>
/// 刷新压缩机排量缓存,按优先级读取:实验信息 > 配置文件 > 默认值
/// 实验切换时自动调用,保证缓存与当前实验信息一致
/// </summary>
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})");
}
/// <summary>
/// 强制刷新压缩机排量缓存(供外部主动调用,用于调试或特殊情况如 App.config 配置修改后)
/// </summary>
public void ForceRefreshDisplacementCache()
{
RefreshDisplacementCache();
}
/// <summary>
/// 解析压缩机排量文本,支持多种格式(如 34.5cc、34,5 cm3 等)
/// </summary>
/// <param name="text">排量文本</param>
/// <param name="displacementCc">解析出的排量值cc</param>
/// <returns>是否解析成功</returns>
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;
}

BIN
temp_ppc_hasco.cs Normal file

Binary file not shown.