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

/** \defgroup modules_simulator Loadable Module: Simulator
 *
 *  The SimulatorModule provides components responsible for providing
 *  dynamic simulation of the vehicle in its environment.  ExternalSim
 *  works with a SimDaemon running on a host to provide "sensor-like"
 *  measurements in a test environment.  ExternalSim works with SimSlate
 *  to provide values to sensors without touching the actual Slate.
 *  NavigationSim and InternalSim both run on the vehicle.  NavigationSim
 *  works with measured values to provide accurate dead-reckoning of the
 *  vehicle while it is in operation, while InternalSim provides a fully
 *  encapsulated simulation of the vehicle's trajectory between
 *  surfacings, with the intent of providing a "reality check" on the
 *  actual performance of the vehicle.
 */

#ifndef SIMULATORMODULE_H_
#define SIMULATORMODULE_H_

#include "module/Module.h"

class LoadedComponent;

/**
 *  The SimulatorModule provides components responsible for providing
 *  dynamic simulation of the vehicle in its environment.  ExternalSim
 *  works with a SimDaemon running on a host to provide "sensor-like"
 *  measurements in a test environment.  ExternalSim works with SimSlate
 *  to provide values to sensors without touching the actual Slate.
 *  NavigationSim and InternalSim both run on the vehicle.  NavigationSim
 *  works with measured values to provide accurate dead-reckoning of the
 *  vehicle while it is in operation, while InternalSim provides a fully
 *  encapsulated simulation of the vehicle's trajectory between
 *  surfacings, with the intent of providing a "reality check" on the
 *  actual performance of the vehicle.
 *
 *  \ingroup modules_simulator
 */
class SimulatorModule : public Module
{
public:
    /// Constructor
    SimulatorModule();

    /// Destructor
    virtual ~SimulatorModule();

    void loadComponents( Logger& logger );

};

/// Class factories

/// create_module must be implemented, following the
/// class implementation:
extern "C" Module* create_module()
{
    return new SimulatorModule();
}

/// destroy_module must be implemented, following the
/// class implementation:
extern "C" void destroy_module( Module* module )
{
    delete module;
}

#endif /*SIMULATORMODULE_H_*/
