/************************TRICK HEADER*************************
PURPOSE:
    (This comment lists out the other object files that are not included from c++ headers)
LIBRARY DEPENDENCIES:
    (
     (cannon/aero/src/cannon_collect_forces.c)
     (cannon/aero/src/cannon_force_cross.c)
     (cannon/aero/src/cannon_force_drag.c)
     (cannon/aero/src/cannon_force_jet.c)
     (cannon/aero/src/cannon_force_gravity.c)
     (cannon/aero/src/cannon_force_lift.c)
     (cannon/aero/src/cannon_jet_control.c)
     (cannon/aero/src/cannon_impact_monte.c)
     (cannon/aero/src/cannon_monte_default_data.c)
     (cannon/aero/src/cannon_init_aero.c)
     (cannon/aero/src/cannon_integ_aero.c)
     (cannon/optim/src/cannon_init_amoeba.c)
     (cannon/optim/src/cannon_post_master.c)
     (cannon/optim/src/cannon_pre_master.c)
     (cannon/optim/src/cannon_post_slave.c)
     (cannon/optim/src/cannon_pre_slave.c)
     (cannon/optim/src/amoeba.c)              
    )
*************************************************************/

#include "sim_objects/default_trick_sys.sm"


##include "cannon/aero/include/cannon_aero.h"
##include "cannon/aero/include/cannon_monte_proto.h"
##include "cannon/optim/include/amoeba.h"
##include "cannon/optim/include/amoeba_proto.h"

class CannonSimObject : public Trick::SimObject {

    public:
        CANNON_AERO baseball ;

        CannonSimObject() {
            ("default_data") cannon_monte_default_data( &baseball ) ;

            ("initialization") cannon_init_aero( &baseball ) ;

            ("derivative") cannon_force_gravity( &baseball ) ;
            ("derivative") cannon_force_drag( &baseball ) ;
            ("derivative") cannon_force_lift( &baseball ) ;
            ("derivative") cannon_force_cross( &baseball ) ;
            ("derivative") cannon_collect_forces( &baseball ) ;
            ("integration") trick_ret = cannon_integ_aero( &baseball ) ;

            ("dynamic_event") cannon_impact_monte( &baseball ) ;

            (0.1, "scheduled") cannon_jet_control( &baseball ) ;

            (0.1, "effector") trick_ret = cannon_force_jet( &baseball ) ;
        }

} ;

// Instantiation
CannonSimObject dyn ;

class OptimSimObject : public Trick::SimObject {

    public:
        AMOEBA      amoeba ;
        CANNON_AERO *dyn_ptr ;


        OptimSimObject() {
             ("monte_master_init") cannon_init_amoeba( &amoeba ) ;
             ("monte_master_pre")  cannon_pre_master( dyn_ptr, &amoeba ) ;
             ("monte_slave_pre")   cannon_pre_slave( dyn_ptr ) ;
             ("monte_master_post") cannon_post_master( dyn_ptr, &amoeba ) ;
             ("monte_slave_post")  cannon_post_slave( dyn_ptr ) ;
        }

} ;

// Instantiation
OptimSimObject optimizer ;

collect dyn.baseball.force_collect = {
        dyn.baseball.force_gravity[0],
        dyn.baseball.force_drag[0],
        dyn.baseball.force_magnus[0],
        dyn.baseball.force_cross[0],
        dyn.baseball.force_jet[0] } ;

IntegLoop dyn_integloop (0.01) dyn;

void create_connections() {
    optimizer.dyn_ptr = &dyn.baseball;
}
