using SSPCTester.Logic.Models;
namespace SSPCTester.Logic.Testing;
/// 基础测试模块:24 路依次开 → 读值 → 关 → 校验归零。
public sealed class BasicTest : ITestModule
{
public string Name => "基础测试";
public async Task RunAsync(TestContext ctx, IProgress progress, CancellationToken ct)
{
int n = ctx.Sspc.ChannelCount;
if (!ctx.Sspc.IsConnected)
await ctx.Sspc.ConnectAsync(ct).ConfigureAwait(false);
ctx.Project.BasicResults.Clear();
for (int ch = 1; ch <= n; ch++)
{
ct.ThrowIfCancellationRequested();
var row = new ChannelResult { Channel = ch, Status = TestStatus.Running };
ctx.Project.BasicResults.Add(row);
progress.Report(new TestProgress { ModuleName = Name, Step = ch - 1, TotalSteps = n, Message = $"测试通道 CH{ch}" });
try
{
await ctx.Sspc.TurnOnAsync(ch, ct).ConfigureAwait(false);
await Task.Delay(BasicTestCriteria.SwitchSettleDelayMs, ct).ConfigureAwait(false);
var on = await ctx.Sspc.ReadMeasurementAsync(ch, ct).ConfigureAwait(false);
row.VoltageOn = on.Voltage;
row.CurrentOn = Math.Abs(on.Current);
await ctx.Sspc.TurnOffAsync(ch, ct).ConfigureAwait(false);
await Task.Delay(BasicTestCriteria.SwitchSettleDelayMs, ct).ConfigureAwait(false);
var offResult = await BasicTestCriteria
.WaitForStableOffAsync(ctx.Sspc, ch, ct)
.ConfigureAwait(false);
row.VoltageOff = offResult.Measurement.Voltage;
row.Status = BasicTestCriteria.IsOn(row.VoltageOn) && offResult.IsStableOff
? TestStatus.Pass : TestStatus.Fail;
}
catch (Exception ex)
{
row.Status = TestStatus.Fail;
try { await ctx.Sspc.TurnOffAsync(ch, CancellationToken.None).ConfigureAwait(false); } catch { }
progress.Report(new TestProgress
{
ModuleName = Name,
Step = ch,
TotalSteps = n,
StepStatus = row.Status,
Message = $"CH{ch} 通讯失败:{ex.Message}"
});
continue;
}
progress.Report(new TestProgress { ModuleName = Name, Step = ch, TotalSteps = n, StepStatus = row.Status, Message = $"CH{ch} {row.Status}" });
}
}
}