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

#include "ESPCartridgeSelect.h"
#include "ESPCartridgeSelectIF.h"

#include "units/Units.h"
#include "scienceModule/ESPComponentIF.h"

ESPCartridgeSelect::ESPCartridgeSelect( const Str& prefix,  const Module* module )
    : Behavior( prefix + ESPCartridgeSelectIF::NAME, module, true, true ),
      cartridgeSetting_( 0 ),
      initialized_( false )
{
    logger_.syslog( "Construct." );

    // Settings
    cartridgeSettingReader_ = newSettingReader( ESPCartridgeSelectIF::ESP_CARTRIDGE_SELECT );

    // Slate outputs
    cartridgeSelectWriter_ = newDataWriter( ESPComponentIF::CARTRIDGE );
}

ESPCartridgeSelect::~ESPCartridgeSelect()
{}

/// Initialize function
void ESPCartridgeSelect::initialize( void )
{
    logger_.syslog( "Initializing ESPCartridgeSelect.", Syslog::INFO );

    // Start with a float and cast to int if the cartridge value checks out
    float cartridgeSetting( nanf( "" ) );
    if( cartridgeSettingReader_->read( Units::COUNT, cartridgeSetting ) && !isnan( cartridgeSetting ) )
    {
        cartridgeSetting_ = ( int )cartridgeSetting;
        initialized_ = true;
    }
}

/// Uninit function
void ESPCartridgeSelect::uninitialize()
{
    logger_.syslog( "Uninitializing ESPCartridgeSelect.", Syslog::INFO );

    initialized_ = false;
}

/// The actual "payload" of the component
void ESPCartridgeSelect::run()
{
    runIfUnsatisfied();
}

/// Runs and returns true if acoustic timer has expired, otherwise returns false
bool ESPCartridgeSelect::runIfUnsatisfied()
{
    if( !initialized_ )
    {
        initialize();
    }
    logger_.syslog( "Issuing request for ESP cartridge type: " + Str( cartridgeSetting_, 0 ) + ".", Syslog::INFO );
    return initialized_ && cartridgeSelectWriter_->write( Units::COUNT, cartridgeSetting_ );
}

/// isSatisfied will return false to prevent inserting multipule stop commands
bool ESPCartridgeSelect::isSatisfied()
{
    if( !initialized_ )
    {
        initialize();
    }

    return false;
}

/// Mission Component factory interface
Behavior* ESPCartridgeSelect::CreateBehavior( const Str& prefix, const Module* module )
{
    return new ESPCartridgeSelect( prefix, module );
}
