/** \file
 *
 *  Contains the LcmSlateRequest class definition.
 *
 *  Copyright (c) 2007,2008,2009,2020 MBARI
 *  MBARI Proprietary Information.  All Rights Reserved
 *
 */

#ifndef LCMSLATEREQUEST_H_
#define LCMSLATEREQUEST_H_

#include "data/Slate.h"
#include "data/SlateBridge.h"
#include "data/LcmListener.h"
#include "logger/LcmUniversalReporter.h"

/**
 * LcmSlateRequest
 * Provides a flexible interface to the Slate's data request functionality.
 *
 *  \ingroup supervisor
 */
class LcmSlateRequest: public SlateBridge, public LcmListener
{
public:

    LcmSlateRequest( Component* owner, const Str& channel, lcm::LCM* lcm = NULL, short sourceID = ANY_SOURCE );

    /// Destructor
    virtual ~LcmSlateRequest();

    void handleMessage( const lcm::ReceiveBuffer *rbuf,
                        const std::string &chan,
                        const TethysLcmTypes::LrauvLcmMessage *msg );

    int unsubscribe( void );

protected:

    bool slateRequest( const TethysLcmTypes::IntArray *array );

    bool slateRequest( const TethysLcmTypes::FloatArray *array );

    bool slateRequest( const TethysLcmTypes::DoubleArray *array );

    bool slateRequest( const TethysLcmTypes::ByteArray *array );

private:

    template<class T>
    bool slateRequestT( const T *array )
    {
        if( array != NULL )
        {
            bool request = array->data[0] != 0;

            // Request data from the named Slate element.
            unsigned short int code = requestSlate( array->name.c_str(), array->unit.c_str(), request );

            if( code != ElementURI::NO_CODE )
            {
                // Data request was succesful. Toggle Universal broadcast if applicable.
                if( request )
                {
                    LcmUniversalReporter::AddReport( code );
                }
                else
                {
                    LcmUniversalReporter::RemoveReport( code );
                }
                return true;
            }
        }
        return false;
    }

    bool debug_;
};


#endif /*SLATEREQUEST_H_*/
