/************************TRICK HEADER*************************
PURPOSE:
    (This comment lists out the other object files that are not included from c++ headers)
LIBRARY DEPENDENCIES:
    (
    )
*************************************************************/

#include "sim_objects/default_trick_sys.sm"

##include "test_ip/include/Ball_test.hh"

/* base ball... get it? :) */
class ballSimObject : public Trick::SimObject {

    public:
        Ball_alex obj ;
        TEST_STRUCT t ;
        my_ns::AA ns_test ;

        ballSimObject() {
            ("default_data") obj.force.default_data() ;
            ("default_data") obj.state.default_data() ;

            ("initialization") obj.state_init() ;

            ("derivative") obj.force_field() ;
            ("derivative") obj.state_deriv() ;
            ("integration") trick_ret = obj.state_integ() ;

            (10.0, "scheduled") trick_ret = obj.state_print() ;

            ("freeze") obj.state_print() ;
        }

    private:
        ballSimObject (const ballSimObject &);
        ballSimObject & operator= (const ballSimObject &);

} ;

class disabledSimObject : public Trick::SimObject {
    public:
        void print_me() {
            message_publish( 7 , "\033[31mThis statement in disabledSimObject should not print because the sim object is disabled!!!\033[0m\n" ) ;
            add_test_result( "IPtest" , "Disable sim_object" , "job not disabled\n") ;
        }
        disabledSimObject() {
            ("initialization") print_me() ;
            (10.0 , "scheduled") print_me() ;
        }
} ;

class emptySimObject : public Trick::SimObject {

    public:
        Ball_alex obj ;

    private:
        emptySimObject (const emptySimObject &);
        emptySimObject & operator= (const emptySimObject &);

} ;

class reallyemptySimObject : public Trick::SimObject {
    public:
        int ii ;
} ;

class plainClass {
    public:
        double d ;
        float f ;
        plainClass() : d() , f() {} ;
}

// Instantiations
ballSimObject ball ;
disabledSimObject disabled_obj ;

// This collect can now be done in create_connections or the input file.
//collect ball.obj.state.work.external_force = {ball.obj.force.output.force[0]};

IntegLoop my_integ_loop (0.01) ball;

// Connect objects
void create_connections() {

    // Set the default termination time
    trick_sys.sched.set_terminate_time(300.0) ;
    trick_sys.sched.set_freeze_frame(0.10) ;


    my_integ_loop.getIntegrator( Runge_Kutta_2, 4 );

    // Example of adding a collect in create_connections.
    ball.obj.state.add_external_force( ball.obj.force.output.force ) ;

}

