diff --git a/Source/Processors/LfpDisplayNode.cpp b/Source/Processors/LfpDisplayNode.cpp index a25e21fc38f0fd5114b3c7bcdf3e2452b013becf..e56c434f27c746b32fed15081a9ea9ac7a9ffc7f 100755 --- a/Source/Processors/LfpDisplayNode.cpp +++ b/Source/Processors/LfpDisplayNode.cpp @@ -34,21 +34,21 @@ LfpDisplayNode::LfpDisplayNode() displayBuffer = new AudioSampleBuffer(8, 100); eventBuffer = new MidiBuffer(); - Array<var> timeBaseValues; - timeBaseValues.add(1); - timeBaseValues.add(2); - timeBaseValues.add(5); - timeBaseValues.add(10); + // Array<var> timeBaseValues; + // timeBaseValues.add(1); + // timeBaseValues.add(2); + // timeBaseValues.add(5); + // timeBaseValues.add(10); - parameters.add(Parameter("timebase",timeBaseValues, 1, 0));//true);//a,0); + // parameters.add(Parameter("timebase",timeBaseValues, 1, 0));//true);//a,0); - Array<var> displayGainValues; - displayGainValues.add(1); - displayGainValues.add(2); - displayGainValues.add(4); - displayGainValues.add(8); + // Array<var> displayGainValues; + // displayGainValues.add(1); + // displayGainValues.add(2); + // displayGainValues.add(4); + // displayGainValues.add(8); - parameters.add(Parameter("display gain",displayGainValues, 1, 1));//true);//a,0); + // parameters.add(Parameter("display gain",displayGainValues, 1, 1));//true);//a,0); arrayOfOnes = new float[5000]; diff --git a/Source/Processors/Visualization/LfpDisplayCanvas.cpp b/Source/Processors/Visualization/LfpDisplayCanvas.cpp index 6e2487015013d0a8d5f3803233c71c50d51e5281..a56a32c119f4f228ea5ebb709d6b11ccce13ad80 100755 --- a/Source/Processors/Visualization/LfpDisplayCanvas.cpp +++ b/Source/Processors/Visualization/LfpDisplayCanvas.cpp @@ -44,6 +44,8 @@ LfpDisplayCanvas::LfpDisplayCanvas(LfpDisplayNode* processor_) : lfpDisplay = new LfpDisplay(this, viewport); timescale = new LfpTimescale(this); + timescale->setTimebase(timebase); + viewport->setViewedComponent(lfpDisplay, false); viewport->setScrollBarsShown(true, false); @@ -52,6 +54,31 @@ LfpDisplayCanvas::LfpDisplayCanvas(LfpDisplayNode* processor_) : addAndMakeVisible(viewport); addAndMakeVisible(timescale); + voltageRanges.add("100"); + voltageRanges.add("500"); + voltageRanges.add("1000"); + voltageRanges.add("2000"); + voltageRanges.add("5000"); + + timebases.add("0.2"); + timebases.add("0.5"); + timebases.add("1.0"); + timebases.add("2.0"); + timebases.add("5.0"); + timebases.add("10.0"); + + rangeSelection = new ComboBox("Voltage range"); + rangeSelection->addItemList(voltageRanges, 1); + rangeSelection->setSelectedId(3,false); + rangeSelection->addListener(this); + addAndMakeVisible(rangeSelection); + + timebaseSelection = new ComboBox("Timebase"); + timebaseSelection->addItemList(timebases, 1); + timebaseSelection->setSelectedId(3,false); + timebaseSelection->addListener(this); + addAndMakeVisible(timebaseSelection); + lfpDisplay->setNumChannels(nChans); } @@ -65,13 +92,14 @@ LfpDisplayCanvas::~LfpDisplayCanvas() void LfpDisplayCanvas::resized() { - - timescale->setBounds(0,0,getWidth()-scrollBarThickness,30); viewport->setBounds(0,30,getWidth(),getHeight()-90); lfpDisplay->setBounds(0,0,getWidth()-scrollBarThickness, lfpDisplay->getTotalHeight()); + rangeSelection->setBounds(100,getHeight()-50,100,25); + timebaseSelection->setBounds(300,getHeight()-50,100,25); + } void LfpDisplayCanvas::beginAnimation() @@ -109,6 +137,20 @@ void LfpDisplayCanvas::update() } +void LfpDisplayCanvas::comboBoxChanged(ComboBox* cb) +{ + + if (cb == timebaseSelection) + { + timebase = timebases[cb->getSelectedId()-1].getFloatValue(); + } else if (cb == rangeSelection) + { + displayGain = 150.0f / voltageRanges[cb->getSelectedId()-1].getFloatValue(); // not sure this is right. + } + + timescale->setTimebase(timebase); +} + void LfpDisplayCanvas::setParameter(int param, float val) { @@ -261,10 +303,24 @@ void LfpDisplayCanvas::paint(Graphics& g) { //std::cout << "Painting" << std::endl; - g.setColour(Colours::grey); + g.setColour(Colour(25,25,25)); g.fillRect(0, 0, getWidth(), getHeight()); + g.setColour(Colour(40,40,40)); + + int w = getWidth()-scrollBarThickness; + + for (int i = 1; i < 10; i++) + { + if (i == 5) + g.drawLine(w/10*i,0,w/10*i,getHeight()-60,3.0f); + else + g.drawLine(w/10*i,0,w/10*i,getHeight()-60,1.0f); + } + + g.drawLine(0,getHeight()-60,getWidth(),getHeight()-60,3.0f); + // g.setColour(Colours::yellow); // g.drawLine(screenBufferIndex, 0, screenBufferIndex, getHeight()); @@ -286,6 +342,7 @@ void LfpDisplayCanvas::refresh() LfpTimescale::LfpTimescale(LfpDisplayCanvas* c) : canvas(c) { + font = Font("Default", 16, Font::plain); } LfpTimescale::~LfpTimescale() @@ -296,7 +353,46 @@ LfpTimescale::~LfpTimescale() void LfpTimescale::paint(Graphics& g) { - g.fillAll(Colours::black); + g.setGradientFill(ColourGradient(Colour(50,50,50),0,0, + Colour(25,25,25),0,getHeight(), + false)); + + g.fillAll(); + + g.setColour(Colours::black); + + g.drawLine(0,getHeight(),getWidth(),getHeight()); + + g.setFont(font); + + g.setColour(Colour(100,100,100)); + + for (int i = 1; i < 10; i++) + { + if (i == 5) + g.drawLine(getWidth()/10*i,0,getWidth()/10*i,getHeight(),3.0f); + else + g.drawLine(getWidth()/10*i,0,getWidth()/10*i,getHeight(),1.0f); + + g.drawText(labels[i-1],getWidth()/10*i+1,0,100,getHeight(),Justification::left, false); + } + +} + +void LfpTimescale::setTimebase(float t) +{ + timebase = t; + + labels.clear(); + + for (float i = 1.0f; i < 10.0; i++) + { + String labelString = String(timebase/10.0f*i); + + labels.add(labelString.substring(1,4)); + } + + repaint(); } @@ -310,6 +406,17 @@ LfpDisplay::LfpDisplay(LfpDisplayCanvas* c, Viewport* v) : totalHeight = 0; addMouseListener(this, true); + + for (int i = 0; i < 10; i++) + { + channelColours.add(Colour(200,200,255-i*25)); + } + + for (int i = 10; i > -1; i--) + { + channelColours.add(Colour(200,200,255-i*25)); + } + } LfpDisplay::~LfpDisplay() @@ -334,6 +441,8 @@ void LfpDisplay::setNumChannels(int numChannels) LfpChannelDisplay* lfpChan = new LfpChannelDisplay(canvas, i); + lfpChan->setColour(channelColours[i % channelColours.size()]); + addAndMakeVisible(lfpChan); channels.add(lfpChan); @@ -397,7 +506,7 @@ void LfpDisplay::mouseDown(const MouseEvent& event) int x = event.getMouseDownX(); int y = event.getMouseDownY(); - std::cout << "Mouse down at " << x << ", " << y << std::endl; + //std::cout << "Mouse down at " << x << ", " << y << std::endl; for (int n = 0; n < numChans; n++) @@ -421,6 +530,8 @@ LfpChannelDisplay::LfpChannelDisplay(LfpDisplayCanvas* c, int channelNumber) : channelFont = Font("Default", 50, Font::plain); + lineColour = Colour(255,255,255); + } LfpChannelDisplay::~LfpChannelDisplay() @@ -431,22 +542,34 @@ LfpChannelDisplay::~LfpChannelDisplay() void LfpChannelDisplay::paint(Graphics& g) { - g.fillAll(Colours::grey); + //g.fillAll(Colours::grey); g.setColour(Colours::yellow); g.drawLine(canvas->screenBufferIndex, 0, canvas->screenBufferIndex, getHeight()); + int center = getHeight()/2; + if (isSelected) - g.setColour(Colours::lightgrey); - else - g.setColour(Colours::black); + { + g.setColour(Colours::lightgrey); + g.fillRect(0,center-50,10,100); + g.drawLine(0,center+50,getWidth(),center+50); + g.drawLine(0,center-50,getWidth(),center-50); + + g.setColour(Colour(25,25,25)); + g.drawLine(0,center+25,10,center+25); + g.drawLine(0,center-25,10,center-25); + + } + + g.setColour(Colour(40,40,40)); g.drawLine(0, getHeight()/2, getWidth(), getHeight()/2); int stepSize = 1; - + g.setColour(lineColour); for (int i = 0; i < getWidth()-stepSize; i += stepSize) { @@ -457,7 +580,7 @@ void LfpChannelDisplay::paint(Graphics& g) (canvas->getYCoord(chan, i+stepSize)+0.5f)*getHeight()); } - g.setColour(Colours::black.withAlpha(0.3f)); + g.setColour(lineColour.withAlpha(0.7f)); g.setFont(channelFont); g.drawText(String(chan+1), 10, 50, 200, 50, Justification::left, false); @@ -474,3 +597,8 @@ void LfpChannelDisplay::deselect() { isSelected = false; } + +void LfpChannelDisplay::setColour(Colour c) +{ + lineColour = c; +} diff --git a/Source/Processors/Visualization/LfpDisplayCanvas.h b/Source/Processors/Visualization/LfpDisplayCanvas.h index 567fe72b861d00f61ebfac63a965621ff57fc7ff..93335a9f0ad96831adb7c3939d8a7ae7d0e6239b 100755 --- a/Source/Processors/Visualization/LfpDisplayCanvas.h +++ b/Source/Processors/Visualization/LfpDisplayCanvas.h @@ -41,7 +41,8 @@ class LfpChannelDisplay; */ -class LfpDisplayCanvas : public Visualizer +class LfpDisplayCanvas : public Visualizer, + public ComboBox::Listener { public: @@ -70,6 +71,8 @@ public: int screenBufferIndex; int lastScreenBufferIndex; + void comboBoxChanged(ComboBox* cb); + private: float sampleRate; @@ -90,6 +93,12 @@ private: ScopedPointer<LfpDisplay> lfpDisplay; ScopedPointer<Viewport> viewport; + ScopedPointer<ComboBox> timebaseSelection; + ScopedPointer<ComboBox> rangeSelection; + + StringArray voltageRanges; + StringArray timebases; + void refreshScreenBuffer(); void updateScreenBuffer(); @@ -112,10 +121,18 @@ public: void paint(Graphics& g); + void setTimebase(float t); + private: LfpDisplayCanvas* canvas; + float timebase; + + Font font; + + StringArray labels; + }; class LfpDisplay : public Component @@ -147,6 +164,7 @@ private: Viewport* viewport; Array<LfpChannelDisplay*> channels; + Array<Colour> channelColours; }; @@ -161,6 +179,8 @@ public: void select(); void deselect(); + void setColour(Colour c); + private: @@ -172,6 +192,8 @@ private: Font channelFont; + Colour lineColour; + };