From d805a0b8d5bd4793182b853cabef66a46d5e4140 Mon Sep 17 00:00:00 2001
From: jsiegle <jsiegle@mit.edu>
Date: Thu, 5 Apr 2012 13:55:57 -0400
Subject: [PATCH] Updated Parameter class

---
 Source/Audio/AudioComponent.cpp        |   2 +-
 Source/MainWindow.cpp                  |  26 ++---
 Source/Processors/GenericProcessor.cpp |  30 ++++--
 Source/Processors/GenericProcessor.h   |  14 ++-
 Source/Processors/Parameter.cpp        | 125 ++++++++++++++++++++++++-
 Source/Processors/Parameter.h          |  76 ++++++---------
 Source/UI/UIComponent.cpp              |  13 ++-
 7 files changed, 206 insertions(+), 80 deletions(-)

diff --git a/Source/Audio/AudioComponent.cpp b/Source/Audio/AudioComponent.cpp
index 93119a912..f393750c1 100644
--- a/Source/Audio/AudioComponent.cpp
+++ b/Source/Audio/AudioComponent.cpp
@@ -68,7 +68,7 @@ AudioComponent::AudioComponent() : isPlaying(false)
 	std::cout << "Audio device sample rate: " <<  sr << std::endl;
 	std::cout << "Audio device buffer size: " << buffSize << std::endl << std::endl;
 
-	graphPlayer = new AudioProcessorPlayer();
+	 graphPlayer = new AudioProcessorPlayer();
 
 }
 
diff --git a/Source/MainWindow.cpp b/Source/MainWindow.cpp
index 31ed94a0a..f741aa3d6 100644
--- a/Source/MainWindow.cpp
+++ b/Source/MainWindow.cpp
@@ -34,17 +34,19 @@ MainWindow::MainWindow()
 
     setResizable (true,     // isResizable
                   false);   // useBottomCornerRisizer -- doesn't work very well
-    
+   // centreWithSize(500,400);
+
     // Constraining the window's size doesn't seem to work:
     //setResizeLimits(500, 400, 10000, 10000);
 
     // Create ProcessorGraph and AudioComponent, and connect them.
     // Callbacks will be set by the play button in the control panel
-    processorGraph = new ProcessorGraph();
-    audioComponent = new AudioComponent();
-    audioComponent->connectToProcessorGraph(processorGraph);
 
-    setContentComponent (new UIComponent(this, processorGraph, audioComponent), true, true);
+     processorGraph = new ProcessorGraph();
+     audioComponent = new AudioComponent();
+     audioComponent->connectToProcessorGraph(processorGraph);
+
+     setContentComponent (new UIComponent(this, processorGraph, audioComponent), true, true);
 
     // commandManager.registerAllCommandsForTarget (getContentComponent());
     // commandManager.registerAllCommandsForTarget (JUCEApplication::getInstance());
@@ -61,16 +63,16 @@ MainWindow::MainWindow()
 MainWindow::~MainWindow()
 {
 
-  saveWindowBounds();
-  processorGraph->saveState();
+   saveWindowBounds();
+   processorGraph->saveState();
 
-  audioComponent->disconnectProcessorGraph();
+   audioComponent->disconnectProcessorGraph();
 
-  deleteAndZero(processorGraph);
-  deleteAndZero(audioComponent);
+   deleteAndZero(processorGraph);
+   deleteAndZero(audioComponent);
 
-  setContentComponent (0);
-  setMenuBar(0);
+   setContentComponent (0);
+  // setMenuBar(0);
 
 }
 
diff --git a/Source/Processors/GenericProcessor.cpp b/Source/Processors/GenericProcessor.cpp
index 03a3c7059..3969860a3 100644
--- a/Source/Processors/GenericProcessor.cpp
+++ b/Source/Processors/GenericProcessor.cpp
@@ -47,10 +47,24 @@ AudioProcessorEditor* GenericProcessor::createEditor()
 
 void GenericProcessor::setParameter (int parameterIndex, float newValue)
 {
+	if (currentChannel > 0)
+	{
+		parameters[parameterIndex]->setValue((double) newValue, currentChannel);
+	}
 
+}
 
+const String GenericProcessor::getParameterName (int parameterIndex)
+{
+	return parameters[parameterIndex]->getName();
 }
 
+const String GenericProcessor::getParameterText (int parameterIndex)
+{
+	return parameters[parameterIndex]->getDescription();
+}
+	
+
 void GenericProcessor::prepareToPlay (double sampleRate_, int estimatedSamplesPerBlock)
 {
 	// use the enable() function instead
@@ -88,29 +102,29 @@ void GenericProcessor::resetConnections()
 	wasConnected = false;
 }
 
-void GenericProcessor::setNumSamples(MidiBuffer& midiMessages, int sampleIndex) {
+void GenericProcessor::setNumSamples(MidiBuffer& events, int sampleIndex) {
 
 	uint8 data[2];
 
 	data[0] = BUFFER_SIZE; 	// most-significant byte
     data[1] = nodeId; 		// least-significant byte
 
-    midiMessages.addEvent(data, 		// spike data
-                          2, 			// total bytes
-                          sampleIndex); // sample index
+    events.addEvent(data, 		// spike data
+                    2, 			// total bytes
+                    sampleIndex); // sample index
 
 }
 
-int GenericProcessor::getNumSamples(MidiBuffer& midiMessages) {
+int GenericProcessor::getNumSamples(MidiBuffer& events) {
 
 	int numRead = 0;
 
-	if (midiMessages.getNumEvents() > 0) 
+	if (events.getNumEvents() > 0) 
 	{
 			
-		int m = midiMessages.getNumEvents();
+		int m = events.getNumEvents();
 
-		MidiBuffer::Iterator i (midiMessages);
+		MidiBuffer::Iterator i (events);
 		MidiMessage message(0xf4);
 
 		int samplePosition = -5;
diff --git a/Source/Processors/GenericProcessor.h b/Source/Processors/GenericProcessor.h
index d32ed3f96..ff1e382e6 100644
--- a/Source/Processors/GenericProcessor.h
+++ b/Source/Processors/GenericProcessor.h
@@ -27,7 +27,9 @@
 
 #include "../../JuceLibraryCode/JuceHeader.h"
 #include "Editors/GenericEditor.h"
+#include "Parameter.h"
 #include "../AccessClass.h"
+
 #include <time.h>
 #include <stdio.h>
 
@@ -49,6 +51,7 @@ class EditorViewport;
 class DataViewport;
 class UIComponent;
 class GenericEditor;
+class Parameter;
 
 class GenericProcessor : public AudioProcessor,
 						 public AccessClass
@@ -82,9 +85,9 @@ public:
 
 	const String getInputChannelName (int channelIndex) const {return settings.inputChannelNames[channelIndex];}
 	const String getOutputChannelName (int channelIndex) const {return settings.outputChannelNames[channelIndex];}
-	const String getParameterName (int parameterIndex) {return T(" ");}
-	const String getParameterText (int parameterIndex) {return T(" ");}
-	const String getProgramName (int index) {return T(" ");}
+	const String getParameterName (int parameterIndex); //{return parameters[parameterIndex]->getName();}
+	const String getParameterText (int parameterIndex); //{return parameters[parameterIndex]->getDescription();}
+	const String getProgramName (int index) {return "";}
 	
 	bool isInputChannelStereoPair (int index) const {return true;}
 	bool isOutputChannelStereoPair (int index) const {return true;}
@@ -94,7 +97,7 @@ public:
 	bool isParameterAutomatable(int parameterIndex) {return false;}
 	bool isMetaParameter(int parameterIndex) {return false;}
 	
-	int getNumParameters() {return 0;}
+	int getNumParameters() {return parameters.size();}
 	int getNumPrograms() {return 0;}
 	int getCurrentProgram() {return 0;}
 	
@@ -226,6 +229,9 @@ public:
 
 	int nodeId;
 
+	// parameters:
+	OwnedArray<Parameter> parameters;
+
 private:
 
 	void processBlock (AudioSampleBuffer &buffer, MidiBuffer &midiMessages);
diff --git a/Source/Processors/Parameter.cpp b/Source/Processors/Parameter.cpp
index 2003b48bb..2df56830e 100644
--- a/Source/Processors/Parameter.cpp
+++ b/Source/Processors/Parameter.cpp
@@ -1,10 +1,125 @@
 /*
-  ==============================================================================
+    ------------------------------------------------------------------
 
-    Parameter.cpp
-    Created: 5 Apr 2012 11:39:25am
-    Author:  jsiegle
+    This file is part of the Open Ephys GUI
+    Copyright (C) 2012 Open Ephys
+
+    ------------------------------------------------------------------
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-  ==============================================================================
 */
 
+#include "Parameter.h"
+
+bool Parameter::setValue(var val, int chan)
+{
+	if (isBoolean())
+	{
+		if (val.isBool()) {
+			values.set(chan, val);
+
+		} else if (val.isInt()) {
+
+			if (int(val) > 0)
+				values.set(chan, true);
+			else
+				values.set(chan, false);
+
+		} else if (val.isDouble()) {
+
+			if (double(val) > 0.0f)
+				values.set(chan, true);
+			else
+				values.set(chan, false);
+
+		} else {
+			return false;
+		}
+
+	} else if (isContinuous()) {
+		
+		if (val.isDouble())
+		{
+			if (double(val) < double(possibleValues[0]))
+			{
+				values.set(chan, possibleValues[0]);
+			} else if (double(val) > double(possibleValues[1]))
+			{
+				values.set(chan, possibleValues[1]);
+			} else {
+				values.set(chan, val);
+			}
+		} else {
+			return false;
+		}
+
+	} else if (isDiscrete()) {
+
+		if (val.isInt())
+		{
+			if (int(val) >= 0 && int(val) < possibleValues.size())
+			{
+				values.set(chan, possibleValues[val]);
+			} else {
+				return false;
+			}
+		} else {
+			return false;
+		}
+
+	}
+
+	return true;
+
+}
+
+const var& Parameter::getValue(int chan)
+{
+	return values[chan];
+}
+
+const var& Parameter::operator[](int chan)
+{
+	return values[chan];
+}
+
+BooleanParameter::BooleanParameter(const String& name_, bool& defaultVal) : Parameter(name_)
+{
+	possibleValues.add(true);
+	possibleValues.add(false);
+
+	defaultValue = defaultVal;
+}
+
+ContinuousParameter::ContinuousParameter(const String& name_,
+										 double low, double high, double& defaultVal)
+										 : Parameter(name_)
+{
+	possibleValues.add(low);
+	possibleValues.add(high);
+
+	defaultValue = defaultVal;
+
+}
+
+DiscreteParameter::DiscreteParameter(const String& name_,
+									 Array<var> a, int defaultVal)
+										 : Parameter(name_)
+{
+	possibleValues = a;
+
+	defaultValue = possibleValues[defaultVal];
+}
+
diff --git a/Source/Processors/Parameter.h b/Source/Processors/Parameter.h
index 1f391bc46..e069567f6 100644
--- a/Source/Processors/Parameter.h
+++ b/Source/Processors/Parameter.h
@@ -26,6 +26,7 @@
 
 #include "../../JuceLibraryCode/JuceHeader.h"
 #include "Editors/GenericEditor.h"
+#include "GenericProcessor.h"
 #include "../AccessClass.h"
 
 #include <stdio.h>
@@ -38,53 +39,54 @@
 
 */
 
-class Parameter :
+class GenericProcessor;
+class GenericEditor;
+
+class Parameter
 {
 public:
 
-	Parameter(const String name_);
-	~Parameter();
+	Parameter(const String& name_) : name(name_), description("") {}
+	~Parameter() {}
+
+	const String& getName() {return name;}
+	const String& getDescription() {return description;}
 
-	const String getName() {return name;}
+	void addDescription(const String& desc) {description = desc;}
 
-	virtual Array<var> getPossibleValues() {return possibleValues}
-	virtual void setValue(var val, int chan);
+	Array<var> getPossibleValues() {return possibleValues;}
+	var getDefaultValue() {return defaultValue;}
 
-	var getValue(int chan);
-	var operator[](int chan);
+	bool setValue(var val, int chan);
+
+	const var& getValue(int chan);
+	const var& operator[](int chan);
 
 	virtual bool isBoolean() {return false;}
 	virtual bool isContinuous() {return false;}
 	virtual bool isDiscrete() {return false;}
-	virtual bool isString() {return false;}
 
 protected:
 
 	const String name;
+	String description;
 
 	GenericProcessor* processor;
 	GenericEditor* editor;
-	Array<Channel*> channels;
+	//Array<Channel*> channels;
 
 	Array<var> possibleValues;
 	Array<var> values;
 
+	var defaultValue;
+
 };
 
 class BooleanParameter : public Parameter
 {
 public:
-	BooleanParameter(const String name_);
-	~BooleanParameter();
-
-	Array<var> getPossibleValues()
-	{
-		Array<var> possibleValues;
-		possibleValues.add(true);
-		possibleValues.add(false);
-
-		return possibleValues;
-	}
+	BooleanParameter(const String& name_, bool& defaultVal);
+	~BooleanParameter() {}
 
 	bool isBoolean() {return true;}
 
@@ -93,43 +95,21 @@ public:
 class ContinuousParameter : public Parameter
 {
 public:
-	ContinuousParameter(const String name_, double low, double high);
-	~ContinuousParameter();
-
-	Array<var> getPossibleValues()
-	{
-		Array<var> possibleValues;
-		possibleValues.add(low);
-		possibleValues.add(high);
-
-		return possibleValues;
-	}
+	ContinuousParameter(const String& name_, double low, double high, double& defaultVal);
+	~ContinuousParameter() {}
 
 	bool isContinuous() {return true;}
 
-private:
-	double low, high;
-
 };
 
 
 class DiscreteParameter : public Parameter
 {
 public:
-	DiscreteParameter(const String name_, Array<var> possibleValues);
-	~DiscreteParameter();
-
-	Array<var> getPossibleValues()
-	{
-		return possibleValues;
-	}
-
-	bool isContinuous() {return true;}
-
-private:
-	
-	Array<var> possibleValues;
+	DiscreteParameter(const String& name_, Array<var> a, int defaultVal);
+	~DiscreteParameter() {}
 
+	bool isDiscrete() {return true;}
 };
 
 #endif  // __PARAMETER_H_62922AE5__
diff --git a/Source/UI/UIComponent.cpp b/Source/UI/UIComponent.cpp
index 25a7d09d3..48d126c1e 100644
--- a/Source/UI/UIComponent.cpp
+++ b/Source/UI/UIComponent.cpp
@@ -139,6 +139,17 @@ void UIComponent::resized()
 	if (messageCenter != 0)
 		messageCenter->setBounds(6,h-35,w-241,30);
 
+	// for debugging purposes:
+	if (false) {
+		dataViewport->setVisible(false);
+		editorViewport->setVisible(false);
+		processorList->setVisible(false);
+		messageCenter->setVisible(false);
+		controlPanel->setVisible(false);
+		editorViewportButton->setVisible(false);
+	}
+
+
 }
 
 void UIComponent::disableCallbacks()
@@ -251,8 +262,6 @@ void EditorViewportButton::drawName()
 	font->FaceSize(23);
 	font->Render("SIGNAL CHAIN");
 	
-
-	
 }
 
 void EditorViewportButton::drawButton()
-- 
GitLab