diff --git a/Source/Processors/Editors/SpikeDetectorEditor.cpp b/Source/Processors/Editors/SpikeDetectorEditor.cpp index ea81985c1ce16b689c5790860554ddd6ce8aedb0..8c55de045220062ac4c0fe170dc02b1a2aa1d45b 100755 --- a/Source/Processors/Editors/SpikeDetectorEditor.cpp +++ b/Source/Processors/Editors/SpikeDetectorEditor.cpp @@ -121,12 +121,12 @@ SpikeDetectorEditor::SpikeDetectorEditor(GenericProcessor* parentNode, bool useD addAndMakeVisible(thresholdLabel); // create a custom channel selector - deleteAndZero(channelSelector); - - channelSelector = new ChannelSelector(false, font); - addChildComponent(channelSelector); - channelSelector->setVisible(false); + //deleteAndZero(channelSelector); + // channelSelector = new ChannelSelector(false, font); + // addChildComponent(channelSelector); + // channelSelector->setVisible(false); +// // Array<int> a; channelSelector->inactivateButtons(); @@ -238,6 +238,11 @@ void SpikeDetectorEditor::buttonEvent(Button* button) else if (button == plusButton) { // std::cout << "Plus button pressed!" << std::endl; + if (acquisitionIsActive) + { + sendActionMessage("Stop acquisition before adding electrodes."); + return; + } int type = electrodeTypes->getSelectedId(); // std::cout << type << std::endl; @@ -266,6 +271,7 @@ void SpikeDetectorEditor::buttonEvent(Button* button) } } + electrodeEditorButtons[1]->setToggleState(false, false); getEditorViewport()->makeEditorVisible(this, true, true); return; @@ -319,11 +325,49 @@ void SpikeDetectorEditor::buttonEvent(Button* button) } else if (button == electrodeEditorButtons[1]) // MONITOR { + + Button* audioMonitorButton = electrodeEditorButtons[1]; + + channelSelector->clearAudio(); + + SpikeDetector* processor = (SpikeDetector*) getProcessor(); + + Array<Electrode*> electrodes = processor->getElectrodes(); + + for (int i = 0; i < electrodes.size(); i++) + { + Electrode* e = electrodes[i]; + e->isMonitored = false; + } + + Electrode* e = processor->getActiveElectrode(); + + if (e != nullptr) + { + + e->isMonitored = audioMonitorButton->getToggleState(); + + for (int i = 0; i < e->numChannels; i++) + { + std::cout << "Channel " << e->channels[i] << std::endl; + int channelNum = e->channels[i]; + channelSelector->setAudioStatus(channelNum, audioMonitorButton->getToggleState()); + + } + } else { + audioMonitorButton->setToggleState(false, false); + } + return; } else if (button == electrodeEditorButtons[2]) // DELETE { - + if (acquisitionIsActive) + { + sendActionMessage("Stop acquisition before deleting electrodes."); + return; + } + removeElectrode(electrodeList->getSelectedItemIndex()); getEditorViewport()->makeEditorVisible(this, true, true); @@ -478,6 +522,11 @@ void SpikeDetectorEditor::comboBoxChanged(ComboBox* comboBox) lastId = ID; + SpikeDetector* processor = (SpikeDetector*) getProcessor(); + Electrode* e = processor->setCurrentElectrodeIndex(ID-1); + + electrodeEditorButtons[1]->setToggleState(e->isMonitored, false); + drawElectrodeButtons(ID-1); } diff --git a/Source/Processors/SpikeDetector.cpp b/Source/Processors/SpikeDetector.cpp index 663979f59de6745f205942dfc6cc7473660aab4c..ba397d0025b52f765241610b715be81724a6745c 100755 --- a/Source/Processors/SpikeDetector.cpp +++ b/Source/Processors/SpikeDetector.cpp @@ -147,6 +147,7 @@ bool SpikeDetector::addElectrode(int nChans) newElectrode->thresholds = new double[nChans]; newElectrode->isActive = new bool[nChans]; newElectrode->channels = new int[nChans]; + newElectrode->isMonitored = false; for (int i = 0; i < nChans; i++) { @@ -159,6 +160,8 @@ bool SpikeDetector::addElectrode(int nChans) electrodes.add(newElectrode); + currentElectrode = electrodes.size()-1; + return true; } @@ -225,6 +228,25 @@ int SpikeDetector::getChannel(int index, int i) return *(electrodes[index]->channels+i); } +Array<Electrode*> SpikeDetector::getElectrodes() +{ + return electrodes; +} + +Electrode* SpikeDetector::setCurrentElectrodeIndex(int i) +{ + jassert(i >= 0 & i < electrodes.size()); + currentElectrode = i; + return electrodes[i]; +} + +Electrode* SpikeDetector::getActiveElectrode() +{ + if (electrodes.size() == 0) + return nullptr; + + return electrodes[currentElectrode]; +} void SpikeDetector::setChannelActive(int electrodeIndex, int subChannel, bool active) { diff --git a/Source/Processors/SpikeDetector.h b/Source/Processors/SpikeDetector.h index 50a6225b1ace09eecc4b996bd4f00ce0328f92a7..3a5350f0f3432008ca35db220537d86d2bff317c 100755 --- a/Source/Processors/SpikeDetector.h +++ b/Source/Processors/SpikeDetector.h @@ -31,6 +31,22 @@ #include "Visualization/SpikeObject.h" +struct Electrode +{ + + String name; + + int numChannels; + int prePeakSamples, postPeakSamples; + int lastBufferIndex; + bool isMonitored; + + int* channels; + double* thresholds; + bool* isActive; + +}; + class SpikeDetectorEditor; /** @@ -119,6 +135,15 @@ public: /** Returns a StringArray containing the names of all electrodes */ StringArray getElectrodeNames(); + /** Returns array of electrodes. */ + Array<Electrode*> getElectrodes(); + + /** Returns array of electrodes. */ + Electrode* getActiveElectrode(); + + /** Sets the current electrode index */ + Electrode* setCurrentElectrodeIndex(int); + /** Returns a list of possible electrode types (e.g., stereotrode, tetrode). */ StringArray electrodeTypes; @@ -151,21 +176,6 @@ private: int currentChannelIndex; int currentIndex; - struct Electrode - { - - String name; - - int numChannels; - int prePeakSamples, postPeakSamples; - int lastBufferIndex; - - int* channels; - double* thresholds; - bool* isActive; - - }; - uint8_t* spikeBuffer;///[256]; int64 timestamp;