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);