using Microsoft.Extensions.Logging; using SSPCTester.Devices.Interfaces; namespace SSPCTester.Devices.Drivers.Mock; /// /// 模拟可编程负载。 /// public sealed class MockLoad : MockDeviceBase, ILoad { private readonly Random _rng = new(4096); private LoadMode _mode = LoadMode.CC; private double _value = 1.0; private bool _input = true; public MockLoad(ILogger logger) : base(logger, "负载:IT8702P+IT8733P (Mock)") { } public async Task SetModeAsync(LoadMode mode, CancellationToken ct = default) { await Task.Delay(10, ct).ConfigureAwait(false); _mode = mode; } public async Task SetValueAsync(double value, CancellationToken ct = default) { await Task.Delay(10, ct).ConfigureAwait(false); _value = value; } public async Task InputAsync(bool on, CancellationToken ct = default) { await Task.Delay(10, ct).ConfigureAwait(false); _input = on; } public Task GetInputStateAsync(CancellationToken ct = default) => Task.FromResult(_input); public async Task ResetAsync(CancellationToken ct = default) { await Task.Delay(10, ct).ConfigureAwait(false); _mode = LoadMode.CC; _value = 0; _input = false; } public Task<(double volts, double amps)> ReadAsync(CancellationToken ct = default) { if (!_input) return Task.FromResult((0.0, 0.0)); // CC 模式下电流接近设定值;其他模式简化处理 double i = _mode == LoadMode.CC ? _value : 1.0; double v = 27.4 + (_rng.NextDouble() - 0.5) * 0.1; i *= 1 + (_rng.NextDouble() - 0.5) * 0.01; return Task.FromResult((v, i)); } public Task ReadPowerAsync(CancellationToken ct = default) { if (!_input) return Task.FromResult(new PowerReading(0.0, 0.0, 0.0)); double i = _mode == LoadMode.CC ? _value : 1.0; double v = 27.4 + (_rng.NextDouble() - 0.5) * 0.1; i *= 1 + (_rng.NextDouble() - 0.5) * 0.01; return Task.FromResult(new PowerReading(v, i, v * i)); } public Task QueryIdentityAsync(CancellationToken ct = default) => Task.FromResult("ITECH,IT8702P,MOCK,1.0"); public Task QueryErrorAsync(CancellationToken ct = default) => Task.FromResult("0,\"No error\""); }