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

#include "Execute.h"
#include "ExecuteIF.h"

#include "data/Slate.h"
#include "data/StrValue.h"
#include "supervisor/CommandExec.h"
#include "units/Units.h"

Execute::Execute( const Str& prefix, const Module* module )
    : Behavior( prefix + ExecuteIF::NAME, module, true, true ),
      commandSetting_( Str::EMPTY_STR ),
      satisfied_( false )
{

    logger_.syslog( "Construct Execute." );

    // Slate input measurements
    commandSettingReader_ = newSettingReader( ExecuteIF::COMMAND_SETTING );
}

Execute::~Execute()
{}

/// Initialize function
void Execute::initialize( void )
{
    commandSetting_ = commandSettingReader_->asString( Units::NONE );
    satisfied_ = false;
}

/// Just do the run: ignore the results of the satisfied
void Execute::run()
{
    runIfUnsatisfied();
}

/// Just do the satisfied: return true if envelope "satisfied"
bool Execute::isSatisfied()
{
    return satisfied_;
}

/// Do the run, and return true if envelope "satisfied"
bool Execute::runIfUnsatisfied()
{
    if( !satisfied_ )
    {
        if( commandSetting_.length() > 0 )
        {
            logger_.syslog( "Executing command " + commandSetting_, Syslog::INFO );
            CommandExec::DoCommand( commandSetting_.cStr(), false );
        }
        else
        {
            logger_.syslog( "Command is empty!", Syslog::ERROR );
        }
        satisfied_ = true;
    }
    return satisfied_;
}

/// Called when the mission component becomes preempted.
void Execute::preempted()
{
}

/// Uninit function
void Execute::uninitialize( void )
{
}

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