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

#include "sim_objects/default_trick_sys.sm"


##include "test/sched/include/sched.h"
##include "test/sched/include/sched_proto.h"

//=============================================================================
// SIM_OBJECT: parent
// This sim object models scheduling test.
//=============================================================================
class ParentSimObject : public Trick::SimObject {

    public:
        SCHEDULE    sched ;

        ParentSimObject() {
            ("default_data") sched_default_data( &sched ) ;

            ("initialization") sched_init( &sched ) ;

            ("integration") trick_ret = sched_integ( &sched ) ;
            ("derivative") sched_deriv( &sched ) ;

            ("dynamic_event") sched_dyn_event( &sched ) ;

            (0.1, "scheduled")         sched_scheduled( &sched ) ;
            (0.2, "environment")       sched_environment( &sched ) ;
            (0.3, "sensor")            sched_sensor( &sched ) ;
            (0.4, "sensor_reflector")  sched_sensor_reflector( &sched ) ;
            (0.4, "sensor_receiver")   sched_sensor_receiver( &sched ) ;
            (0.5, "sensor_emitter")    sched_sensor_emitter( &sched ) ;
            (0.6, "effector_receiver") sched_effector_receiver( &sched ) ;
            (0.7, "effector_emitter")  sched_effector_emitter( &sched ) ;
            (0.8, "effector")          sched_effector( &sched ) ;
            (0.9, "logging")           sched_logging( &sched ) ;
        }

} ;


//=============================================================================
// SIM_OBJECT: children
// This sim object models scheduling test.
//=============================================================================
class ChildSimObject : public Trick::SimObject {

    public:
        ParentSimObject* ptr2parent ;

        ChildSimObject() {

            /*----- INIT ----------*/
            C1 (0.9, "logging") sched_logging( &ptr2parent->sched ) ;
            C2 (0.8, "scheduled") sched_amf( &ptr2parent->sched ) ;
            C3 (0.5, "scheduled") sched_async( &ptr2parent->sched ) ;
        }

} ;

// Instantiations
ParentSimObject parent ;
ChildSimObject children ;

IntegLoop my_integ_loop (0.1) parent;


// Connect objects
void create_connections() {

    children.ptr2parent = &parent ;

    /* Set child threads */
    exec_set_thread_process_type( 1 , Trick::PROCESS_TYPE_SCHEDULED ) ;
    exec_set_thread_process_type( 2 , Trick::PROCESS_TYPE_AMF_CHILD ) ;
    exec_set_thread_process_type( 3 , Trick::PROCESS_TYPE_ASYNC_CHILD ) ;

    exec_set_thread_amf_cycle_time(2, 0.8);

    exec_add_depends_on_job( "children.sched_logging" , 1 , "parent.sched_logging" , 1 ) ;
    exec_add_depends_on_job( "children.sched_amf" , 1 , "parent.sched_effector" , 1 ) ;
}
