using System.Windows;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using SSPCTester.Devices.Config;
using SSPCTester.Devices.Interfaces;
using SSPCTester.Logic.Models;
using SSPCTester.Logic.Testing;
using SSPCTester.UI.Services;
namespace SSPCTester.UI.ViewModels;
///
/// 一次测试会话:包装 TestRunner + CancellationToken + 进度上报。
///
public sealed class TestSessionViewModel
{
private readonly IServiceProvider _sp;
private readonly Project _project;
private readonly ISspc _sspc;
private readonly IPowerSupply _power;
private readonly ILoad _load;
private readonly IDaq _daq;
private readonly UiLogSink _logSink;
private readonly CancellationTokenSource _cts = new();
public event Action? CurveReady;
public event Action? ProtectResultsChanged;
public TestSessionViewModel(IServiceProvider sp, Project project,
ISspc sspc, IPowerSupply power, ILoad load, IDaq daq, UiLogSink logSink)
{
_sp = sp; _project = project;
_sspc = sspc; _power = power; _load = load; _daq = daq;
_logSink = logSink;
}
public CancellationToken Token => _cts.Token;
public void Cancel() => _cts.Cancel();
public async Task RunAllAsync()
{
var ctx = new TestContext(_project, _sspc, _power, _load, _daq);
var runner = _sp.GetRequiredService();
var modules = new List
{
_sp.GetRequiredService(),
new CurveTest(_sp.GetRequiredService>(), (ch, r, f) => CurveReady?.Invoke(ch, r, f)),
_sp.GetRequiredService(),
_sp.GetRequiredService(),
};
IProgress progress = new Progress(p =>
{
if (p.ModuleName == ProtectTest.ModuleName)
ProtectResultsChanged?.Invoke();
if (!string.IsNullOrEmpty(p.Message))
{
var lvl = p.StepStatus switch
{
TestStatus.Fail => UiLogLevel.Error,
TestStatus.Pass => UiLogLevel.Success,
TestStatus.Measured => UiLogLevel.Success,
_ => UiLogLevel.Info
};
_logSink.Add(lvl, $"[{p.ModuleName}] {p.Message}");
}
});
await runner.RunAllAsync(ctx, modules, progress, _cts.Token);
}
}