/*****************************************************************************
PURPOSE: ( This is Zach's test simulation )
LIBRARY_DEPENDENCIES:
    (
      (target/src/target_data_default_data.c)
      (target/src/target_delta_v.c)
      (target/src/target_earth_default_data.c)
      (target/src/target_eom.c)
      (target/src/target_integ.c)
      (target/src/target_iterate_default_data.c)
      (target/src/target_master_init.c)
      (target/src/target_master_post.c)
      (target/src/target_master_pre.c)
      (target/src/target_master_shutdown.c)
      (target/src/target_print.c)
      (target/src/target_slave_init.c)
      (target/src/target_slave_post.c)
      (target/src/target_slave_pre.c)
      (target/src/target_slave_shutdown.c)
      (target/src/target_state_init.c)
    )
 ****************************************************************************/
#include "sim_objects/default_trick_sys.sm"

##include "target/include/target_body.h"
##include "target/include/target_proto.h"

#define DYNAMICS  0.1


/*****************************************************************************
 * SIM_OBJECT: target - The simple targeting algorithm.                      *
 *****************************************************************************/
class TargetSimObject : public Trick::SimObject {

    public:

        TargetBodyInit   target_init;
        TargetBodyPlanet target_planet;
        TargetBodyState  target_state;
        TargetBodyData   target_data;
        TargetBodyIteration *iterate_data ;

    TargetSimObject() {

        /*=====================================================================
         = Target Default Data Routines:                                      =
         = These are the default data routines to set the default data for    =
         = the target.data.                                                   =
         =====================================================================*/
         ("default_data") target_earth_default_data(&target_planet);
         ("default_data") target_data_default_data(&target_data);

       /*=====================================================================
        = Target Initialization Routine:                                     =
        = This is an initialization routine that computes the initial state  =
        = of the target.data.                                                =
        =====================================================================*/
        ("initialization") target_state_init( &target_init, &target_planet, &target_state );

       /*=====================================================================
        = Orbital Dynamics Docking/Grapple Transition Routine:               =
        = This is a derviative class routine that processes any pending      =
        = dockings, separations, grapples or releases.                       =
        =====================================================================*/
       ("derivative") target_eom( &target_planet, &target_state, &target_data );

       /*=====================================================================
        = Target Body Integration Routine:                                   =
        = This routine propagates the state of the target.data using the     =
        = accelerations and time derivative of the state transition matrix   =
        = computed in the preceeding derivative class routines.  The         =
        = integator type (Euler, RK4 ...) is selected through data input.    =
        =====================================================================*/
        ("integration") trick_ret = target_integ( &target_state, &target_data ) ;

       /*=====================================================================
        = Target Delta V Computation Routine:                                =
        = This is a shutdown routine that computes the final targeting end   =
        = point conditions and the required change in intial state.          =
        =====================================================================*/
        ("shutdown") target_delta_v( &target_state, &target_data, iterate_data ) ;

       /*=====================================================================
        = Target Print Routine:                                =
        = This is an initialization routine that computes the initial state  =
        = of the target.data and the state transition matrix.                =
        =====================================================================*/
        ("shutdown") target_print( exec_get_sim_time(), &target_init, &target_state, iterate_data );
    }
} ;

TargetSimObject target;

/*****************************************************************************
 * SIM_OBJECT: iterate - The simple iteration algorithm.                     *
 *****************************************************************************/
class IterateSimObject : public Trick::SimObject {

    public:

       TargetBodyIteration iterate_data;
       TargetBodyInit   *target_init;
       TargetBodyPlanet *target_planet;
       TargetBodyState  *target_state;
       TargetBodyData   *target_data;

    IterateSimObject() {

       ("default_data") target_iterate_default_data( &iterate_data ) ;

       ("monte_master_init") target_master_init( &iterate_data ) ;

       ("monte_slave_init") target_slave_init( &iterate_data ) ;

       ("monte_master_pre") target_master_pre( target_init, 
                                               target_state,
                                               target_data, 
                                               &iterate_data ); 

       ("monte_slave_pre") target_slave_pre( target_init, 
                                             target_state,
                                             target_data, 
                                             &iterate_data ); 

       ("monte_slave_post") target_slave_post( mc_get_connection_device(),
                                               target_init,
                                               target_state,
                                               target_data,
                                               &iterate_data ); 

       ("monte_master_post") target_master_post( mc_get_connection_device(), 
                                                 target_init,
                                                 target_state,
                                                 target_data, 
                                                 &iterate_data ); 

       ("monte_master_shutdown") target_master_shutdown( mc_get_connection_device(), 
                                                         target_data, 
                                                         &iterate_data ); 

       ("monte_slave_shutdown") target_slave_shutdown( mc_get_connection_device(), 
                                                       target_data );

    }
} ;

IterateSimObject iterate ;
/*****************************************************************************
 * INTEGRATE: List the sim_objects with orbtial dynamics derviative and      *
 *            integration class routines.                                    *
 *****************************************************************************/
IntegLoop target_integloop (DYNAMICS) target;

void create_connections() {

   target.iterate_data   = &iterate.iterate_data;

   iterate.target_init   = &target.target_init; 
   iterate.target_planet = &target.target_planet; 
   iterate.target_state  = &target.target_state; 
   iterate.target_data   = &target.target_data; 
}
