From 3b20b6b615f0cfe2429fd62e178dde025dcaf21c Mon Sep 17 00:00:00 2001
From: jsiegle <joshs@alleninstitute.org>
Date: Wed, 14 Jan 2015 16:18:15 -0800
Subject: [PATCH] Add more options to ArduinoOutputEditor

---
 .../ArduinoOutput/ArduinoOutput.cpp           | 129 +++++++++++-------
 .../Processors/ArduinoOutput/ArduinoOutput.h  |   5 +-
 .../ArduinoOutput/ArduinoOutputEditor.cpp     |  86 ++++++++++--
 .../ArduinoOutput/ArduinoOutputEditor.h       |  17 ++-
 4 files changed, 176 insertions(+), 61 deletions(-)

diff --git a/Source/Processors/ArduinoOutput/ArduinoOutput.cpp b/Source/Processors/ArduinoOutput/ArduinoOutput.cpp
index b2829f78f..8caabddeb 100755
--- a/Source/Processors/ArduinoOutput/ArduinoOutput.cpp
+++ b/Source/Processors/ArduinoOutput/ArduinoOutput.cpp
@@ -22,28 +22,14 @@
 */
 
 #include "ArduinoOutput.h"
+#include "ArduinoOutputEditor.h"
 
 #include <stdio.h>
 
 ArduinoOutput::ArduinoOutput()
-    : GenericProcessor("Arduino Output"), state(false), outputChannel(13), inputChannel(-1)
+    : GenericProcessor("Arduino Output"), state(true), deviceSelected(false), outputChannel(13), inputChannel(-1)
 {
 
-
-    // FIXME: Remove hard-coded serial port paths. These aren't always
-    // right, and in some cases (JUCE_MAC) are almost certainly wrong.
-    std::cout << "Warning: using hard-coded path to Arduino." << std::endl;
-
-    #if JUCE_LINUX
-        setDevice("/dev/ttyACM0");
-    #endif
-    #if JUCE_WIN32
-        setDevice("COM1");
-    #endif
-    #if JUCE_MAC
-        setDevice("tty.usbmodemfd121");
-    #endif
-
 }
 
 ArduinoOutput::~ArduinoOutput()
@@ -63,40 +49,52 @@ AudioProcessorEditor* ArduinoOutput::createEditor()
 void ArduinoOutput::setDevice(String devName)
 {
 
-    Time timer;
+    if (!acquisitionIsActive)
+    {
 
-    arduino.connect(devName.toStdString());
+        Time timer;
 
-    if (arduino.isArduinoReady())
-    {
+        arduino.connect(devName.toStdString());
 
-        uint32 currentTime = timer.getMillisecondCounter();
+        if (arduino.isArduinoReady())
+        {
 
-        arduino.sendProtocolVersionRequest();
-        timer.waitForMillisecondCounter(currentTime + 2000);
-        arduino.update();
-        arduino.sendFirmwareVersionRequest();
+            uint32 currentTime = timer.getMillisecondCounter();
 
-        timer.waitForMillisecondCounter(currentTime + 4000);
-        arduino.update();
+            arduino.sendProtocolVersionRequest();
+            timer.waitForMillisecondCounter(currentTime + 2000);
+            arduino.update();
+            arduino.sendFirmwareVersionRequest();
 
-        std::cout << "firmata v" << arduino.getMajorFirmwareVersion()
-                  << "." << arduino.getMinorFirmwareVersion() << std::endl;
+            timer.waitForMillisecondCounter(currentTime + 4000);
+            arduino.update();
 
-    }
+            std::cout << "firmata v" << arduino.getMajorFirmwareVersion()
+                      << "." << arduino.getMinorFirmwareVersion() << std::endl;
 
-    if (arduino.isInitialized())
-    {
+        }
 
-        std::cout << "Arduino is initialized." << std::endl;
-        arduino.sendDigitalPinMode(outputChannel, ARD_OUTPUT);
-    }
-    else
-    {
-        std::cout << "Arduino is NOT initialized." << std::endl;
+        if (arduino.isInitialized())
+        {
+
+            std::cout << "Arduino is initialized." << std::endl;
+            arduino.sendDigitalPinMode(outputChannel, ARD_OUTPUT);
+            sendActionMessage("Arduino initialized at" + devName);
+            deviceSelected = true;
+        }
+        else
+        {
+            std::cout << "Arduino is NOT initialized." << std::endl;
+            sendActionMessage("Arduino could not be initialized at" + devName);
+        }
+    } else {
+        sendActionMessage("Cannot change device while acquisition is active.");
     }
+
+
 }
 
+
 void ArduinoOutput::handleEvent(int eventType, MidiMessage& event, int sampleNum)
 {
     if (eventType == TTL)
@@ -111,22 +109,31 @@ void ArduinoOutput::handleEvent(int eventType, MidiMessage& event, int sampleNum
         //          " on channel " << eventChannel <<
         //          " with value " << eventId << std::endl;
 
-        if (inputChannel == -1 || eventChannel == inputChannel)
+        if (eventChannel == gateChannel)
         {
-            if (eventId == 0)
+            if (eventId == 1)
             {
-                arduino.sendDigital(outputChannel, ARD_LOW);
+                state = true;
+            } else {
                 state = false;
             }
-            else
+        }
+
+        if (state)
+        {
+            if (inputChannel == -1 || eventChannel == inputChannel)
             {
-                arduino.sendDigital(outputChannel, ARD_HIGH);
-                state = true;
+                if (eventId == 0)
+                {
+                    arduino.sendDigital(outputChannel, ARD_LOW);
+                }
+                else
+                {
+                    arduino.sendDigital(outputChannel, ARD_HIGH);
+                }
             }
         }
 
-
-
         //ArduinoOutputEditor* ed = (ArduinoOutputEditor*) getEditor();
         //ed->receivedEvent();
     }
@@ -135,28 +142,50 @@ void ArduinoOutput::handleEvent(int eventType, MidiMessage& event, int sampleNum
 
 void ArduinoOutput::setParameter(int parameterIndex, float newValue)
 {
-    editor->updateParameterButtons(parameterIndex);
+    // make sure current output channel is off:
+    arduino.sendDigital(outputChannel, ARD_LOW);
 
+    if (parameterIndex == 0)
+    {
+        outputChannel = (int) newValue;
+    } else if (parameterIndex == 1)
+    {
+        inputChannel = (int) newValue;
+    } else if (parameterIndex == 2)
+    {
+        gateChannel = (int) newValue;
+        if (gateChannel == -1)
+            state = true;
+        else
+            state = false;
+    }
 }
 
 void ArduinoOutput::setOutputChannel(int chan)
 {
-    outputChannel = chan;
+    setParameter(0, chan);
 }
 
 void ArduinoOutput::setInputChannel(int chan)
 {
-    inputChannel = chan;
+    setParameter(1, chan-1);
 }
 
-bool ArduinoOutput::enable()
+void ArduinoOutput::setGateChannel(int chan)
 {
+    setParameter(2, chan-1);
+}
 
+bool ArduinoOutput::enable()
+{
+    return deviceSelected;
+    acquisitionIsActive = true;
 }
 
 bool ArduinoOutput::disable()
 {
     arduino.sendDigital(outputChannel, ARD_LOW);
+    acquisitionIsActive = false;
 }
 
 void ArduinoOutput::process(AudioSampleBuffer& buffer,
diff --git a/Source/Processors/ArduinoOutput/ArduinoOutput.h b/Source/Processors/ArduinoOutput/ArduinoOutput.h
index 9b5e08642..211e5cb99 100755
--- a/Source/Processors/ArduinoOutput/ArduinoOutput.h
+++ b/Source/Processors/ArduinoOutput/ArduinoOutput.h
@@ -26,7 +26,6 @@
 
 #include "../../../JuceLibraryCode/JuceHeader.h"
 
-#include "ArduinoOutputEditor.h"
 #include "../Serial/ofArduino.h"
 #include "../GenericProcessor/GenericProcessor.h"
 
@@ -77,10 +76,12 @@ public:
 
     void setOutputChannel(int);
     void setInputChannel(int);
+    void setGateChannel(int);
     void setDevice(String deviceString);
 
     int outputChannel;
     int inputChannel;
+    int gateChannel;
 
 private:
 
@@ -88,6 +89,8 @@ private:
     ofArduino arduino;
 
     bool state;
+    bool acquisitionIsActive;
+    bool deviceSelected;
 
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ArduinoOutput);
 
diff --git a/Source/Processors/ArduinoOutput/ArduinoOutputEditor.cpp b/Source/Processors/ArduinoOutput/ArduinoOutputEditor.cpp
index 90d38ef1a..266c4d1b4 100644
--- a/Source/Processors/ArduinoOutput/ArduinoOutputEditor.cpp
+++ b/Source/Processors/ArduinoOutput/ArduinoOutputEditor.cpp
@@ -30,25 +30,76 @@ ArduinoOutputEditor::ArduinoOutputEditor(GenericProcessor* parentNode, bool useD
 
 {
 
-    accumulator = 0;
+    // accumulator = 0;
 
     desiredWidth = 150;
 
-    Image im;
-    im = ImageCache::getFromMemory(BinaryData::ArduinoIcon_png,
-                                   BinaryData::ArduinoIcon_pngSize);
+    arduino = (ArduinoOutput*) parentNode;
 
-    icon = new ImageIcon(im);
-    addAndMakeVisible(icon);
-    icon->setBounds(15,15,120,120);
+    vector <ofSerialDeviceInfo> devices = serial.getDeviceList();
 
-    icon->setOpacity(0.3f);
+    // Image im;
+    // im = ImageCache::getFromMemory(BinaryData::ArduinoIcon_png,
+    //                                BinaryData::ArduinoIcon_pngSize);
+
+    // icon = new ImageIcon(im);
+    // addAndMakeVisible(icon);
+    // icon->setBounds(75,15,50,50);
+
+    // icon->setOpacity(0.3f);
+
+    deviceSelector = new ComboBox();
+    deviceSelector->setBounds(10,105,125,20);
+    deviceSelector->addListener(this);
+    deviceSelector->addItem("Device",1);
+    
+    for (int i = 0; i < devices.size(); i++)
+    {
+        deviceSelector->addItem(devices[i].getDevicePath(),i+2);
+    }
+
+    deviceSelector->setSelectedId(1, dontSendNotification);
+    addAndMakeVisible(deviceSelector);
+
+    inputChannelSelector = new ComboBox();
+    inputChannelSelector->setBounds(10,30,55,20);
+    inputChannelSelector->addListener(this);
+    inputChannelSelector->addItem("Trig",1);
+
+    for (int i = 0; i < 16; i++)
+        inputChannelSelector->addItem(String(i+1),i+2); // start numbering at one for
+    // user-visible channels
+
+    inputChannelSelector->setSelectedId(1, dontSendNotification);
+    addAndMakeVisible(inputChannelSelector);
+
+    outputChannelSelector = new ComboBox();
+    outputChannelSelector->setBounds(10,80,80,20);
+    outputChannelSelector->addListener(this);
+    outputChannelSelector->addItem("Output CH",1);
+
+    for (int i = 1; i < 13; i++)
+        outputChannelSelector->addItem(String(i+1),i+2);
+
+    outputChannelSelector->setSelectedId(14, dontSendNotification);
+    addAndMakeVisible(outputChannelSelector);
+
+    gateChannelSelector = new ComboBox();
+    gateChannelSelector->setBounds(10,55,55,20);
+    gateChannelSelector->addListener(this);
+    gateChannelSelector->addItem("Gate",1);
+
+    for (int i = 0; i < 16; i++)
+        gateChannelSelector->addItem(String(i+1),i+2); // start numbering at one for
+    // user-visible channels
+
+    gateChannelSelector->setSelectedId(1, dontSendNotification);
+    addAndMakeVisible(gateChannelSelector);
 
 }
 
 ArduinoOutputEditor::~ArduinoOutputEditor()
 {
-    deleteAllChildren();
 }
 
 void ArduinoOutputEditor::receivedEvent()
@@ -59,6 +110,23 @@ void ArduinoOutputEditor::receivedEvent()
 
 }
 
+void ArduinoOutputEditor::comboBoxChanged(ComboBox* comboBoxThatHasChanged)
+{
+    if (comboBoxThatHasChanged == deviceSelector)
+    {
+        arduino->setDevice(deviceSelector->getText());
+    } else if (comboBoxThatHasChanged == outputChannelSelector)
+    {
+        arduino->setOutputChannel(outputChannelSelector->getSelectedId()-1);
+    } else if (comboBoxThatHasChanged == inputChannelSelector)
+    {
+        arduino->setInputChannel(inputChannelSelector->getSelectedId()-1);
+    } else if (comboBoxThatHasChanged == gateChannelSelector)
+    {
+        arduino->setGateChannel(gateChannelSelector->getSelectedId()-1);
+    }
+}
+
 void ArduinoOutputEditor::timerCallback()
 {
 
diff --git a/Source/Processors/ArduinoOutput/ArduinoOutputEditor.h b/Source/Processors/ArduinoOutput/ArduinoOutputEditor.h
index ab99d8beb..f6f497ba2 100644
--- a/Source/Processors/ArduinoOutput/ArduinoOutputEditor.h
+++ b/Source/Processors/ArduinoOutput/ArduinoOutputEditor.h
@@ -28,6 +28,8 @@
 #include "../../../JuceLibraryCode/JuceHeader.h"
 #include "../Editors/GenericEditor.h"
 #include "../Editors/ImageIcon.h"
+#include "ArduinoOutput.h"
+#include "../Serial/ofSerial.h"
 
 class ImageIcon;
 
@@ -39,7 +41,8 @@ class ImageIcon;
 
 */
 
-class ArduinoOutputEditor : public GenericEditor
+class ArduinoOutputEditor : public GenericEditor,
+                            public ComboBox::Listener
 
 {
 public:
@@ -50,8 +53,20 @@ public:
 
     ImageIcon* icon;
 
+    void comboBoxChanged(ComboBox* comboBoxThatHasChanged);
+
+    ArduinoOutput* arduino;
+
+    ofSerial serial;
+
 private:
 
+   // ScopedPointer<UtilityButton> triggerButton;
+    ScopedPointer<ComboBox> inputChannelSelector;
+    ScopedPointer<ComboBox> outputChannelSelector;
+    ScopedPointer<ComboBox> gateChannelSelector;
+    ScopedPointer<ComboBox> deviceSelector;
+
     void timerCallback();
 
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ArduinoOutputEditor);
-- 
GitLab