Skip to content

Commit 496951a

Browse files
committed
Apply fixed output voltage transformation
1 parent d983615 commit 496951a

File tree

2 files changed

+27
-37
lines changed

2 files changed

+27
-37
lines changed

OpenEphys.Onix/OpenEphys.Onix/AnalogOutput.cs

Lines changed: 26 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,13 @@ namespace OpenEphys.Onix
99
{
1010
public class AnalogOutput : Sink<Mat>
1111
{
12+
const AnalogIOVoltageRange OutputRange = AnalogIOVoltageRange.TenVolts;
13+
1214
[TypeConverter(typeof(AnalogIO.NameConverter))]
1315
public string DeviceName { get; set; }
1416

1517
public AnalogIODataType DataType { get; set; } = AnalogIODataType.S16;
1618

17-
static float[] GetDivisionsPerVolt(DeviceInfo deviceInfo)
18-
{
19-
var ioDeviceInfo = (AnalogIODeviceInfo)deviceInfo;
20-
return Array.ConvertAll(ioDeviceInfo.VoltsPerDivision, value => 1 / value);
21-
}
22-
23-
static Mat CreateSampleScale(int bufferSize, float[] divisionsPerVolt)
24-
{
25-
using var scaleHeader = Mat.CreateMatHeader(divisionsPerVolt);
26-
var voltageScale = new Mat(bufferSize, scaleHeader.Cols, scaleHeader.Depth, scaleHeader.Channels);
27-
CV.Repeat(scaleHeader, voltageScale);
28-
return voltageScale;
29-
}
30-
3119
public override IObservable<Mat> Process(IObservable<Mat> source)
3220
{
3321
var dataType = DataType;
@@ -36,11 +24,12 @@ public override IObservable<Mat> Process(IObservable<Mat> source)
3624
disposable => disposable.Subject.SelectMany(deviceInfo =>
3725
{
3826
var bufferSize = 0;
39-
var tempBuffer = default(Mat);
40-
var sampleScale = default(Mat);
41-
var inputBuffer = default(Mat);
27+
var scaleBuffer = default(Mat);
28+
var transposeBuffer = default(Mat);
29+
var sampleScale = dataType == AnalogIODataType.Volts
30+
? 1 / AnalogIODeviceInfo.GetVoltsPerDivision(OutputRange)
31+
: 1;
4232
var device = deviceInfo.GetDeviceContext(typeof(AnalogIO));
43-
var divisionsPerVolt = GetDivisionsPerVolt(deviceInfo);
4433
return source.Do(data =>
4534
{
4635
if (dataType == AnalogIODataType.S16 && data.Depth != Depth.S16 ||
@@ -53,28 +42,29 @@ public override IObservable<Mat> Process(IObservable<Mat> source)
5342
if (bufferSize != data.Cols)
5443
{
5544
bufferSize = data.Cols;
56-
sampleScale = dataType == AnalogIODataType.Volts
57-
? CreateSampleScale(bufferSize, divisionsPerVolt)
45+
transposeBuffer = bufferSize > 1
46+
? new Mat(data.Cols, data.Rows, data.Depth, 1)
5847
: null;
59-
if (bufferSize > 1 || sampleScale != null)
48+
if (sampleScale != 1)
6049
{
61-
inputBuffer = new Mat(data.Cols, data.Rows, data.Depth, 1);
62-
tempBuffer = sampleScale != null ? new Mat(data.Cols, data.Rows, Depth.S16, 1) : null;
50+
scaleBuffer = transposeBuffer != null
51+
? new Mat(data.Cols, data.Rows, Depth.S16, 1)
52+
: new Mat(data.Rows, data.Cols, Depth.S16, 1);
6353
}
64-
else inputBuffer = tempBuffer = null;
54+
else scaleBuffer = null;
6555
}
6656

67-
var outputBuffer = inputBuffer;
68-
if (inputBuffer == null) outputBuffer = data;
69-
else
57+
var outputBuffer = data;
58+
if (transposeBuffer != null)
7059
{
71-
CV.Transpose(data, inputBuffer);
72-
if (sampleScale != null)
73-
{
74-
CV.Mul(inputBuffer, sampleScale, inputBuffer);
75-
CV.Convert(inputBuffer, tempBuffer);
76-
outputBuffer = tempBuffer;
77-
}
60+
CV.Transpose(outputBuffer, transposeBuffer);
61+
outputBuffer = transposeBuffer;
62+
}
63+
64+
if (scaleBuffer != null)
65+
{
66+
CV.ConvertScale(outputBuffer, scaleBuffer, sampleScale);
67+
outputBuffer = scaleBuffer;
7868
}
7969

8070
var dataSize = outputBuffer.Step * outputBuffer.Rows;
@@ -111,14 +101,14 @@ public IObservable<float[]> Process(IObservable<float[]> source)
111101
disposable => disposable.Subject.SelectMany(deviceInfo =>
112102
{
113103
var device = deviceInfo.GetDeviceContext(typeof(AnalogIO));
114-
var divisionsPerVolt = GetDivisionsPerVolt(deviceInfo);
104+
var divisionsPerVolt = 1 / AnalogIODeviceInfo.GetVoltsPerDivision(OutputRange);
115105
return source.Do(data =>
116106
{
117107
AssertChannelCount(data.Length);
118108
var samples = new short[data.Length];
119109
for (int i = 0; i < samples.Length; i++)
120110
{
121-
samples[i] = (short)(data[i] * divisionsPerVolt[i]);
111+
samples[i] = (short)(data[i] * divisionsPerVolt);
122112
}
123113

124114
device.Write(samples);

OpenEphys.Onix/OpenEphys.Onix/ConfigureAnalogIO.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ public AnalogIODeviceInfo(DeviceContext device, ConfigureAnalogIO deviceFactory)
230230
};
231231
}
232232

233-
static float GetVoltsPerDivision(AnalogIOVoltageRange voltageRange)
233+
public static float GetVoltsPerDivision(AnalogIOVoltageRange voltageRange)
234234
{
235235
return voltageRange switch
236236
{

0 commit comments

Comments
 (0)