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