SSPC-Tester/SSPCTester.UI/ViewModels/ProtectViewModel.cs

74 lines
2.1 KiB
C#
Raw Normal View History

using System.Collections.ObjectModel;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
2026-07-02 21:38:25 +08:00
using SSPCTester.Devices.Interfaces;
using SSPCTester.Logic.Models;
using SSPCTester.UI.Services;
namespace SSPCTester.UI.ViewModels;
2026-07-02 21:38:25 +08:00
/// <summary>保护功能页 VM。</summary>
public partial class ProtectViewModel : ObservableObject
{
2026-07-02 21:38:25 +08:00
private readonly IPowerSupply _power;
private readonly UiLogSink _log;
2026-07-02 21:38:25 +08:00
private TestSessionViewModel? _session;
public ObservableCollection<ProtectRow> Rows { get; } = new();
[ObservableProperty] private Project? _project;
2026-07-02 21:38:25 +08:00
public ProtectViewModel(IPowerSupply power, UiLogSink log)
{
_power = power;
_log = log;
}
public void SetProject(Project p)
{
Project = p;
2026-07-02 21:38:25 +08:00
ProtectTestPlan.EnsureRows(p);
2026-07-02 17:43:32 +08:00
SyncRowsFromProject();
}
2026-07-02 21:38:25 +08:00
public void AttachSession(TestSessionViewModel session)
{
if (_session != null)
_session.ProtectResultsChanged -= SyncRowsFromProject;
_session = session;
_session.ProtectResultsChanged += SyncRowsFromProject;
}
2026-07-02 17:43:32 +08:00
private void SyncRowsFromProject()
{
if (Project == null) return;
2026-07-02 21:38:25 +08:00
ProtectTestPlan.RefreshMeasuredValues(Project, overwriteExisting: false);
Rows.Clear();
2026-07-02 17:43:32 +08:00
foreach (var row in Project.ProtectResults) Rows.Add(row);
}
[RelayCommand]
2026-07-02 21:38:25 +08:00
private async Task MeasurePowerAsync(ProtectRow? row)
{
2026-07-02 21:38:25 +08:00
if (row == null || !row.CanMeasureFromPower) return;
try
{
2026-07-02 21:38:25 +08:00
var (volts, amps) = await _power.ReadAsync();
row.MeasuredValue = row.ProtectType switch
2026-07-02 17:43:32 +08:00
{
2026-07-02 21:38:25 +08:00
"过压" or "欠压" => $"{volts:F3} V",
_ => $"{amps:F3} A"
2026-07-02 17:43:32 +08:00
};
2026-07-02 21:38:25 +08:00
if (row.Status is TestStatus.Untested or TestStatus.Running)
row.Status = TestStatus.Measured;
_log.Add(UiLogLevel.Success, $"保护功能 {row.ProtectType} 实测值:{row.MeasuredValue}");
}
catch (Exception ex)
{
_log.Add(UiLogLevel.Error, $"读取电源失败:{ex.Message}");
}
}
}