bonsai-rx / daqmx

Bonsai Library for interfacing with NI-DAQmx devices
https://bonsai-rx.org/daqmx
Other
1 stars 4 forks source link

Add support for counter output #15

Open glopesdev opened 1 year ago

glopesdev commented 1 year ago

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.

bruno-f-cruz commented 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);
                }
            )
            );
        }