@@ -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 ) ;
0 commit comments