namespace SSPCTester.Devices.Interfaces; /// /// 一段高速采集得到的电压波形。 /// public sealed class CurveData { /// 采样率(Hz)。 public int SampleRateHz { get; init; } /// 触发时刻(相对于采样起点,单位:秒)。 public double TriggerTimeSec { get; init; } public int TriggerSampleIndex { get; init; } /// 电压样点数组(V)。索引 i 对应时间 i / SampleRateHz。 public required double[] Voltage { get; init; } /// 电流样点数组(A),可选。 public double[]? Current { get; init; } public IReadOnlyList EngineeringChannels { get; init; } = Array.Empty(); /// 样点数。 public int Length => Voltage.Length; /// 总时长(s)。 public double DurationSec => SampleRateHz > 0 ? (double)Voltage.Length / SampleRateHz : 0; /// 给定索引对应的时间(s)。 public double TimeAt(int index) => SampleRateHz > 0 ? (double)index / SampleRateHz : 0; } public sealed record CurveChannelData( int PhysicalChannel, DaqChannelRole Role, string Name, string Unit, double Scale, double Offset, double[] Samples); public enum DaqChannelRole { Unconfigured, OutputVoltage, OutputCurrent, InputVoltage, InputCurrent, Auxiliary } public sealed record DaqDeviceDescriptor( int LogicalId, int? PhysicalId, string Description, bool IsSimulated) { public override string ToString() => PhysicalId.HasValue ? $"{Description}(逻辑 {LogicalId} / 物理 {PhysicalId})" : $"{Description}(逻辑 {LogicalId})"; } public sealed record DaqActionCaptureRequest(double PreTriggerMs, double PostTriggerMs, bool IsRising); /// /// 单个采样点(流式推送时使用)。 /// public readonly record struct CurveSample(double TimeSec, double Voltage, double Current);