Open glopesdev opened 1 year ago
Draft of possible implementation:
public override IObservable<Unit> Generate()
{
return Observable.Using(
() => new Task(),
task => Observable.Create<Unit>(observer =>
{
task.COChannels.CreatePulseChannelFrequency(
counterChannel,
"",
COPulseFrequencyUnits.Hertz,
COPulseIdleState.Low,
0, frequency, dutyCycle);
if (numberOfSamples.HasValue)
{
task.Timing.ConfigureImplicit(SampleQuantityMode.FiniteSamples, numberOfSamples.Value);
}
else
{
task.Timing.ConfigureImplicit(SampleQuantityMode.ContinuousSamples);
}
task.Control(TaskAction.Verify);
task.Control(TaskAction.Commit);
task.Start();
task.Done += (sender, e) =>
{
if (e.Error != null) observer.OnError(e.Error);
else observer.OnCompleted();
};
return Disposable.Create(task.Stop);
}
)
);
}
The DAQmx counter output API is very useful for generating digital trains for experimental control. It is essentially a self-contained task which requires no input buffer to be provided, so it can be implemented as an observable source returning
Unit
.