2626using namespace OnixSourcePlugin ;
2727
2828DigitalIO::DigitalIO (std::string name, std::string hubName, const oni_dev_idx_t deviceIdx_, std::shared_ptr<Onix1> oni_ctx)
29- : OnixDevice(name, hubName, DigitalIO::getDeviceType(), deviceIdx_, oni_ctx), eventWords( 64 )
29+ : OnixDevice(name, hubName, DigitalIO::getDeviceType(), deviceIdx_, oni_ctx)
3030{
31+ StreamInfo digitalInputStream = StreamInfo (
32+ OnixDevice::createStreamName ({ getHubName (), name, " DigitalInputs" }),
33+ " Digital Inputs data" ,
34+ getStreamIdentifier (),
35+ NumDigitalInputs,
36+ AnalogIO::getSampleRate (),
37+ " CH" ,
38+ ContinuousChannel::Type::AUX,
39+ 1.0 ,
40+ " u" , // NB: Digital data is unitless by definition
41+ {},
42+ { " input" });
43+ streamInfos.add (digitalInputStream);
44+
45+ StreamInfo digitalButtonStream = StreamInfo (
46+ OnixDevice::createStreamName ({ getHubName (), name, " DigitalButtons" }),
47+ " Digital Buttons data" ,
48+ getStreamIdentifier (),
49+ NumButtons,
50+ AnalogIO::getSampleRate (),
51+ " " ,
52+ ContinuousChannel::Type::AUX,
53+ 1.0 ,
54+ " u" , // NB: Digital data is unitless by definition
55+ { " Moon" , " Triangle" , " X" , " Check" , " Circle" , " Square" },
56+ { " input" });
57+ streamInfos.add (digitalButtonStream);
58+
59+ eventCodes.fill (0 );
3160}
3261
3362OnixDeviceType DigitalIO::getDeviceType ()
@@ -64,10 +93,16 @@ bool DigitalIO::updateSettings()
6493
6594void DigitalIO::startAcquisition ()
6695{
96+ currentFrame = 0 ;
97+ sampleNumber = 0 ;
98+
99+ digitalSamples.fill (0 );
67100}
68101
69102void DigitalIO::addSourceBuffers (OwnedArray<DataBuffer>& sourceBuffers)
70103{
104+ sourceBuffers.add (new DataBuffer (NumChannels, (int )streamInfos.getFirst ().getSampleRate () * bufferSizeInSeconds));
105+ digitalBuffer = sourceBuffers.getLast ();
71106}
72107
73108EventChannel::Settings DigitalIO::getEventChannelSettings (DataStream* stream)
@@ -78,48 +113,54 @@ EventChannel::Settings DigitalIO::getEventChannelSettings(DataStream* stream)
78113 " Digital inputs and breakout button states coming from a DigitalIO device" ,
79114 getStreamIdentifier () + " .event.digital" ,
80115 stream,
81- numButtons + numDigitalInputs
116+ NumChannels
82117 };
83118
84119 return settings;
85120}
86121
87- int DigitalIO::getNumberOfWords ( )
122+ float DigitalIO::getChannelState ( uint8_t state, int channel )
88123{
89- return eventWords. size_approx ();
90- }
124+ return (state & ( 1 << channel)) >> channel; // NB: Return the state of the specified channel
125+ };
91126
92127void DigitalIO::processFrames ()
93128{
94129 oni_frame_t * frame;
95130 while (frameQueue.try_dequeue (frame))
96131 {
132+ size_t offset = 0 ;
97133
98134 uint16_t * dataPtr = (uint16_t *)frame->data ;
99- uint64_t timestamp = deviceContext->convertTimestampToSeconds (frame->time );
100135
101- int dataOffset = 4 ;
136+ timestamps[currentFrame] = deviceContext->convertTimestampToSeconds (frame->time );
137+ sampleNumbers[currentFrame] = sampleNumber++;
102138
103- uint64_t portState = *(dataPtr + dataOffset) ;
104- uint64_t buttonState = *(dataPtr + dataOffset + 1 ) ;
139+ constexpr int inputDataOffset = 4 ;
140+ constexpr int buttonDataOffset = inputDataOffset + 1 ;
105141
106- uint64_t ttlEventWord = (buttonState & 0x3F ) << 8 | (portState & 0xFF );
107- eventWords. enqueue (ttlEventWord );
142+ uint64_t inputState = *(dataPtr + inputDataOffset );
143+ uint64_t buttonState = *(dataPtr + buttonDataOffset );
108144
109- oni_destroy_frame (frame);
110- }
111- }
145+ for (int i = 0 ; i < NumDigitalInputs; i++)
146+ {
147+ digitalSamples[currentFrame + offset++ * NumFrames] = getChannelState (inputState, i);
148+ }
112149
113- uint64_t DigitalIO::getEventWord ()
114- {
115- uint64_t eventWord;
116- if (eventWords.try_dequeue (eventWord))
117- return eventWord;
150+ for (int i = 0 ; i < NumButtons; i++)
151+ {
152+ digitalSamples[currentFrame + offset++ * NumFrames] = getChannelState (buttonState, i);
153+ }
118154
119- return 0 ;
120- }
155+ eventCodes[currentFrame] = (buttonState & 0x3F ) << 8 | (inputState & 0xFF );
121156
122- bool DigitalIO::hasEventWord ()
123- {
124- return eventWords.peek () != nullptr ;
157+ oni_destroy_frame (frame);
158+
159+ if (++currentFrame >= NumFrames)
160+ {
161+ digitalBuffer->addToBuffer (digitalSamples.data (), sampleNumbers.data (), timestamps.data (), eventCodes.data (), NumFrames);
162+
163+ currentFrame = 0 ;
164+ }
165+ }
125166}
0 commit comments