/*
    ------------------------------------------------------------------

    This file is part of the Open Ephys GUI
    Copyright (C) 2013 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/>.

*/

#ifndef __LFPTRIGAVGNODE_H_D969A379__
#define __LFPTRIGAVGNODE_H_D969A379__

#include "../../JuceLibraryCode/JuceHeader.h"
#include "Editors/LfpTriggeredAverageEditor.h"
#include "Editors/VisualizerEditor.h"
#include "GenericProcessor.h"

class DataViewport;

/**

  Displays the average of a continuous signal, triggered on a certain event channel.

  @see GenericProcessor, LfpTriggeredAverageEditor, LfpDisplayCanvas

*/

class LfpTriggeredAverageNode :  public GenericProcessor

{
public:

    LfpTriggeredAverageNode();
    ~LfpTriggeredAverageNode();

    AudioProcessorEditor* createEditor();

    bool isSink()
    {
        return true;
    }

    void process(AudioSampleBuffer& buffer, MidiBuffer& midiMessages, int& nSamples);

    void setParameter(int, float);

    void updateSettings();

    bool enable();
    bool disable();

    void handleEvent(int, MidiMessage&, int);

    AudioSampleBuffer* getDisplayBufferAddress()
    {
        return displayBuffer;
    }
    int getDisplayBufferIndex()
    {
        return displayBufferIndex;
    }

private:

    void initializeEventChannel();

    ScopedPointer<AudioSampleBuffer> displayBuffer;
    ScopedPointer<MidiBuffer> eventBuffer;

    int displayBufferIndex;
    int displayBufferIndexEvents;

    float displayGain; //
    float bufferLength; // s

    AbstractFifo abstractFifo;

    int64 bufferTimestamp;
    int ttlState;
    float* arrayOfOnes;
    int totalSamples;

    //Time timer;

    bool resizeBuffer();

    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(LfpTriggeredAverageNode);

};




#endif  // __LFPTRIGAVGNODE_H_D969A379__