diff --git a/Source/Processors/LfpDisplayNode.cpp b/Source/Processors/LfpDisplayNode.cpp index 7ba36e2855dbbb6dac92a01ce23d9dd7ba08daee..445abaa9b239f5d20ae087fbbed38ca6e008cd9a 100755 --- a/Source/Processors/LfpDisplayNode.cpp +++ b/Source/Processors/LfpDisplayNode.cpp @@ -279,8 +279,6 @@ void LfpDisplayNode::process(AudioSampleBuffer &buffer, MidiBuffer &events, int& initializeEventChannel(); - - checkForEvents(events); // update timestamp, see if we got any TTL events int samplesLeft = displayBuffer->getNumSamples() - displayBufferIndex; @@ -324,52 +322,7 @@ void LfpDisplayNode::process(AudioSampleBuffer &buffer, MidiBuffer &events, int& displayBufferIndex = extraSamples; } - //std::cout << *displayBuffer->getSampleData(displayBuffer->getNumChannels()-1, - // displayBufferIndex-1) << std::endl; - - - ///// failed attempt to use abstractFifo: - - // int start1, size1, start2, size2; - - // abstractFifo.prepareToWrite(nSamples, start1, size1, start2, size2); - - // if (size1 > 0) - // { - // for (int chan = 0; chan < buffer.getNumChannels(); chan++) - // { - // displayBuffer->copyFrom(chan, // destChannel - // start1, // destStartSample - // buffer, // source - // chan, // source channel - // 0, // source start sample - // size1); // numSamples - - // } - - // displayBufferIndex += size1; - // } - - // if (size2 > 0) - // { - // for (int chan = 0; chan < buffer.getNumChannels(); chan++) - // { - // displayBuffer->copyFrom(chan, // destChannel - // start2, // destStartSample - // buffer, // source - // chan, // source channel - // size1, // source start sample - // size2); // numSamples - - // } - - // displayBufferIndex = size2; - // } - - // std::cout << displayBufferIndex << std::endl; - - // abstractFifo.finishedWrite(size1 + size2); - + } diff --git a/Source/Processors/Visualization/LfpDisplayCanvas.cpp b/Source/Processors/Visualization/LfpDisplayCanvas.cpp index 07077a67da468495fff63981c652cb04f61cbbfa..7917cd2f799add28105cb823f77e3c4f63eb8ad1 100755 --- a/Source/Processors/Visualization/LfpDisplayCanvas.cpp +++ b/Source/Processors/Visualization/LfpDisplayCanvas.cpp @@ -26,7 +26,7 @@ #include <math.h> LfpDisplayCanvas::LfpDisplayCanvas(LfpDisplayNode* processor_) : - timebase(1.0f), displayGain(2.f), timeOffset(0.0f), processor(processor_), + timebase(1.0f), displayGain(1.0f), timeOffset(0.0f), processor(processor_), screenBufferIndex(0), displayBufferIndex(0) { @@ -38,6 +38,8 @@ LfpDisplayCanvas::LfpDisplayCanvas(LfpDisplayNode* processor_) : displayBufferSize = displayBuffer->getNumSamples(); std::cout << "Setting displayBufferSize on LfpDisplayCanvas to " << displayBufferSize << std::endl; + screenBuffer = new AudioSampleBuffer(MAX_N_CHAN, MAX_N_SAMP); + viewport = new Viewport(); lfpDisplay = new LfpDisplay(this, viewport); timescale = new LfpTimescale(this); @@ -56,6 +58,8 @@ LfpDisplayCanvas::LfpDisplayCanvas(LfpDisplayNode* processor_) : LfpDisplayCanvas::~LfpDisplayCanvas() { + + deleteAndZero(screenBuffer); } void LfpDisplayCanvas::resized() @@ -78,14 +82,14 @@ void LfpDisplayCanvas::beginAnimation() screenBufferIndex = 0; - startCallbacks(); + startTimer(500); } void LfpDisplayCanvas::endAnimation() { std::cout << "Ending animation." << std::endl; - stopCallbacks(); + stopTimer(); } void LfpDisplayCanvas::update() @@ -103,8 +107,6 @@ void LfpDisplayCanvas::update() repaint(); - lfpDisplay->repaint(); - } @@ -133,25 +135,30 @@ void LfpDisplayCanvas::refreshScreenBuffer() screenBufferIndex = 0; - int w = lfpDisplay->getWidth(); - //std::cout << "Refreshing buffer size to " << w << "pixels." << std::endl; + screenBuffer->clear(); - for (int i = 0; i < w; i++) - { - float x = float(i); + // int w = lfpDisplay->getWidth(); + // //std::cout << "Refreshing buffer size to " << w << "pixels." << std::endl; - for (int n = 0; n < nChans; n++) - { - waves[n][i*2] = x; - waves[n][i*2+1] = 0.5f; // line in center of display - } - } + // for (int i = 0; i < w; i++) + // { + // float x = float(i); + + // for (int n = 0; n < nChans; n++) + // { + // waves[n][i*2] = x; + // waves[n][i*2+1] = 0.5f; // line in center of display + // } + // } } void LfpDisplayCanvas::updateScreenBuffer() { // copy new samples from the displayBuffer into the screenBuffer (waves) + + lastScreenBufferIndex = screenBufferIndex; + int maxSamples = lfpDisplay->getWidth(); int index = processor->getDisplayBufferIndex(); @@ -179,16 +186,31 @@ void LfpDisplayCanvas::updateScreenBuffer() float alpha = (float) subSampleOffset; float invAlpha = 1.0f - alpha; + screenBuffer->clear(screenBufferIndex, 1); + for (int channel = 0; channel < nChans; channel++) { - gain = -1.0f / (processor->channels[channel]->bitVolts * float(0x7fff)); - waves[channel][screenBufferIndex*2+1] = - *(displayBuffer->getSampleData(channel, displayBufferIndex))*invAlpha*gain*displayGain; + gain = 1.0f / (processor->channels[channel]->bitVolts * float(0x7fff)); + + screenBuffer->addFrom(channel, // destChannel + screenBufferIndex, // destStartSample + displayBuffer->getSampleData(channel, displayBufferIndex), // source + 1, // numSamples + invAlpha*gain*displayGain); // gain - waves[channel][screenBufferIndex*2+1] += - *(displayBuffer->getSampleData(channel, nextPos))*alpha*gain*displayGain; + screenBuffer->addFrom(channel, // destChannel + screenBufferIndex, // destStartSample + displayBuffer->getSampleData(channel, nextPos), // source + 1, // numSamples + alpha*gain*displayGain); // gain - waves[channel][screenBufferIndex*2+1] += 0.5f; // to center in viewport + //waves[channel][screenBufferIndex*2+1] = + // *(displayBuffer->getSampleData(channel, displayBufferIndex))*invAlpha*gain*displayGain; + + //waves[channel][screenBufferIndex*2+1] += + // *(displayBuffer->getSampleData(channel, nextPos))*alpha*gain*displayGain; + + //waves[channel][screenBufferIndex*2+1] += 0.5f; // to center in viewport } @@ -220,12 +242,12 @@ void LfpDisplayCanvas::updateScreenBuffer() float LfpDisplayCanvas::getXCoord(int chan, int samp) { - return waves[chan][samp*2]; + return samp; } float LfpDisplayCanvas::getYCoord(int chan, int samp) { - return waves[chan][samp*2+1]; + return *screenBuffer->getSampleData(chan, samp); } void LfpDisplayCanvas::paint(Graphics& g) @@ -235,16 +257,13 @@ void LfpDisplayCanvas::paint(Graphics& g) updateScreenBuffer(); - g.fillAll(Colours::grey); - - g.setColour(Colours::yellow); + g.setColour(Colours::grey); - g.drawLine(screenBufferIndex, 0, screenBufferIndex, getHeight()); - - lfpDisplay->repaint(); + g.fillRect(0, 0, getWidth(), getHeight()); + + g.setColour(Colours::yellow); - //g.drawLine(0,0, getWidth(), getHeight()); - //g.drawLine(0,getHeight(),getWidth(), 0); + g.drawLine(screenBufferIndex, 0, screenBufferIndex, getHeight()); } @@ -335,20 +354,23 @@ void LfpDisplay::paint(Graphics& g) int bottomBorder = viewport->getViewHeight() + topBorder; // ensure that only visible channels are redrawn - for (int i = 0; i < numChans; i++) - { + // for (int i = 0; i < numChans; i++) + // { - int componentTop = getChildComponent(i)->getY(); - int componentBottom = getChildComponent(i)->getHeight() + componentTop; + // int componentTop = getChildComponent(i)->getY(); + // int componentBottom = getChildComponent(i)->getHeight() + componentTop; - if ( (topBorder <= componentBottom && bottomBorder >= componentTop) ) - { - getChildComponent(i)->repaint(); + // if ( (topBorder <= componentBottom && bottomBorder >= componentTop) ) + // { + // getChildComponent(i)->repaint(canvas->lastScreenBufferIndex, + // 0, + // canvas->screenBufferIndex, + // getChildComponent(i)->getHeight()); - //std::cout << i << std::endl; - } + // //std::cout << i << std::endl; + // } - } + // } } @@ -396,13 +418,15 @@ void LfpChannelDisplay::paint(Graphics& g) g.drawLine(0, getHeight()/2, getWidth(), getHeight()/2); - for (int i = 0; i < getWidth()-1; i++) + int stepSize = 1; + + for (int i = 0; i < getWidth()-1; i += stepSize) { g.drawLine(i, - canvas->getYCoord(chan, i)*getHeight(), - i+1, - canvas->getYCoord(chan, i+1)*getHeight()); + (canvas->getYCoord(chan, i)+0.5f)*getHeight(), + i+stepSize, + (canvas->getYCoord(chan, i+stepSize)+0.5f)*getHeight()); } } diff --git a/Source/Processors/Visualization/LfpDisplayCanvas.h b/Source/Processors/Visualization/LfpDisplayCanvas.h index 0b6186326f81d9390ca685ce5c5a29c2e7fcd872..8c0ce15eb6d927287dd96ea694a8b3ccb86e07e6 100755 --- a/Source/Processors/Visualization/LfpDisplayCanvas.h +++ b/Source/Processors/Visualization/LfpDisplayCanvas.h @@ -65,6 +65,9 @@ public: float getXCoord(int chan, int samp); float getYCoord(int chan, int samp); + int screenBufferIndex; + int lastScreenBufferIndex; + private: float sampleRate; @@ -74,10 +77,11 @@ private: static const int MAX_N_CHAN = 256; // maximum number of channels static const int MAX_N_SAMP = 5000; // maximum display size in pixels - float waves[MAX_N_CHAN][MAX_N_SAMP*2]; // we need an x and y point for each sample + //float waves[MAX_N_CHAN][MAX_N_SAMP*2]; // we need an x and y point for each sample LfpDisplayNode* processor; AudioSampleBuffer* displayBuffer; + AudioSampleBuffer* screenBuffer; MidiBuffer* eventBuffer; ScopedPointer<LfpTimescale> timescale; @@ -86,7 +90,7 @@ private: void refreshScreenBuffer(); void updateScreenBuffer(); - int screenBufferIndex; + int displayBufferIndex; int displayBufferSize; diff --git a/Source/Processors/Visualization/SpikeDisplayCanvas.cpp b/Source/Processors/Visualization/SpikeDisplayCanvas.cpp index f5ab8cf13adb298c68edfae055b8c56bceb816c3..52572213a8254df45b15367095052558b10924d2 100755 --- a/Source/Processors/Visualization/SpikeDisplayCanvas.cpp +++ b/Source/Processors/Visualization/SpikeDisplayCanvas.cpp @@ -398,8 +398,6 @@ void SpikeDisplay::plotSpike(const SpikeObject& spike) } - - // ---------------------------------------------------------------- SpikePlot::SpikePlot(SpikeDisplayCanvas* sdc, int elecNum, int numChans) : diff --git a/Source/Processors/Visualization/Visualizer.h b/Source/Processors/Visualization/Visualizer.h index 8bf9de790bcadce8150d171369b2adc5db466014..96250ba1095b4a5424c84b0d2494770919fc0a2e 100755 --- a/Source/Processors/Visualization/Visualizer.h +++ b/Source/Processors/Visualization/Visualizer.h @@ -61,7 +61,7 @@ public: virtual void setParameter(int, int, int, float) = 0; /** Starts the timer callbacks. */ - void startCallbacks() { startTimer(1/refreshRate); } + void startCallbacks() { startTimer(100); } /** Stops the timer callbacks. */ void stopCallbacks() { stopTimer(); }