// N.B. this function is called EVERY VIDEO FRAME!..... so should be as fast as possible... // TODO: the buffer communication should really move to be in a seperate thread!!! void updateBuffer() { if (bufferClient != null && bufferConnectionInitialized) { //int dataTrigger=-1; //if ( storeData ) { // dataTrigger = latestCapturedSample+DATAUPDATEINTERVAL_SAMP; //} SamplesEventsCount count = null; bufferIsConnected = bufferClient.isConnected(); if (!bufferIsConnected) // if we are not connected try to re-connect.. { Debug.LogError("Buffer connection closed..... trying to reconnect!"); bufferClient.reconnect(); return; } try { count = bufferClient.poll(); } catch { // poll failed.... why? Debug.LogError("Poll failed.... waiting for valid response!"); return; } latestNumberOfEventsInBuffer = count.nEvents; latestBufferSample = count.nSamples; // reset if we have been re-awoken if (latestCapturedSample < 0) { latestCapturedSample = latestBufferSample; } if (lastNumberOfEvents < 0) { lastNumberOfEvents = latestNumberOfEventsInBuffer; } if (latestBufferSample < latestCapturedSample) { Debug.LogError("Buffer restart detected .. skipping everything before now..."); bufferTimer.reset(); latestCapturedSample = latestBufferSample; lastNumberOfEvents = latestNumberOfEventsInBuffer; } bufferTimer.addSampleToRegression(latestBufferSample); //Updates the bufferTimer with the new samples. // Loop ot push events to the event stream while (lastNumberOfEvents < latestNumberOfEventsInBuffer) { try { // Watch out can miss events if we are too slow... bufferEvents.Add(bufferClient.getEvents(lastNumberOfEvents, lastNumberOfEvents)[0]); } catch (IOException ex) { } lastNumberOfEvents += 1; if (bufferEvents.Count > bufferEventsMaxCapacity) // Implement a ring-buffer for the events we store... { bufferEvents.RemoveAt(0); } OnNewEventsAdded(EventArgs.Empty); //This notifies anyone who's listening that there had been an extra event added in the buffer } lastNumberOfEvents = latestNumberOfEventsInBuffer; // push new data into the data event stream if (latestBufferSample > latestCapturedSample) { if (storeData) // if we should track and store the data { storedSamples = latestBufferSample - latestCapturedSample; if (storedSamples * nChans > MAXDATASAMPLES) { storedSamples = MAXDATASAMPLES / nChans; } data = bufferClient.getFloatData(latestBufferSample - storedSamples, latestBufferSample - 1); //TO DO: The getFloat needs to change according to the buffers type of data OnNewDataCaptured(EventArgs.Empty); //That notifies anyone who's listening that data have been updated in the buffer if (newDataIn) { dataPacketsLost += 1; } else { newDataIn = true; } } } latestCapturedSample = latestBufferSample; } }
// N.B. this function is called EVERY VIDEO FRAME!..... so should be as fast as possible... // TODO: the buffer communication should really move to be in a seperate thread!!! void Update() { if (bufferIsConnected && bufferClient != null && bufferClient.errorReturned != BufferClient.BUFFER_READ_ERROR && bufferClient.isConnected()) { //int dataTrigger=-1; //if ( storeData ) { // dataTrigger = latestCapturedSample+DATAUPDATEINTERVAL_SAMP; //} SamplesEventsCount count = bufferClient.poll(); latestNumberOfEventsInBuffer = count.nEvents; latestBufferSample = count.nSamples; // reset if we have been re-awoken if (latestCapturedSample < 0) { latestCapturedSample = latestBufferSample; } if (lastNumberOfEvents < 0) { lastNumberOfEvents = latestNumberOfEventsInBuffer; } while (lastNumberOfEvents < latestNumberOfEventsInBuffer) { try { // Watch out can miss events if we are too slow... bufferEvents.Add(bufferClient.getEvents(lastNumberOfEvents, lastNumberOfEvents)[0]); } catch (IOException ex) { } lastNumberOfEvents += 1; if (bufferEvents.Count > bufferEventsMaxCapacity) // Implement a ring-buffer for the events we store... { bufferEvents.RemoveAt(0); } OnNewEventsAdded(EventArgs.Empty); //This notifies anyone who's listening that there had been an extra event added in the buffer } lastNumberOfEvents = latestNumberOfEventsInBuffer; if (latestBufferSample > latestCapturedSample) { if (storeData) // if we should track and store the data { storedSamples = latestBufferSample - latestCapturedSample; if (storedSamples * nChans > MAXDATASAMPLES) { storedSamples = MAXDATASAMPLES / nChans; } data = bufferClient.getFloatData(latestBufferSample - storedSamples, latestBufferSample - 1); //TO DO: The getFloat needs to change according to the buffers type of data OnNewDataCaptured(EventArgs.Empty); //That notifies anyone who's listening that data have been updated in the buffer if (newDataIn) { dataPacketsLost += 1; } else { newDataIn = true; } } } else if (latestBufferSample < latestCapturedSample) { Debug.LogError("Buffer restart detected"); bufferTimer.reset(); } bufferTimer.addSampleToRegression(latestBufferSample); //Updates the bufferTimer with the new samples. latestCapturedSample = latestBufferSample; } }