- // run Autopilot system
- current_autopilot->run();
-
- // printf("updating flight model x %d\n", multi_loop);
- /* fgFDMUpdate( globals->get_options()->get_flight_model(),
- fdm_state,
- multi_loop * globals->get_options()->get_speed_up(),
- remainder ); */
- cur_fdm_state->update( multi_loop *
- globals->get_options()->get_speed_up() );
- FGSteam::update( multi_loop * globals->get_options()->get_speed_up() );
+ // conceptually, this could be done for each fdm instance ...
+
+ if ( !inited ) {
+ cur_fdm_state->stamp();
+ inited = true;
+ }
+
+ SGTimeStamp current;
+ current.stamp();
+ long elapsed = current - cur_fdm_state->get_time_stamp();
+ cur_fdm_state->set_time_stamp( current );
+ elapsed += cur_fdm_state->get_remainder();
+ // cout << "elapsed = " << elapsed << endl;
+ // cout << "dt = " << cur_fdm_state->get_delta_t() << endl;
+ multi_loop = (long)(((double)elapsed * 0.000001) /
+ cur_fdm_state->get_delta_t() );
+ cur_fdm_state->set_multi_loop( multi_loop );
+ long remainder = elapsed - ( (multi_loop*1000000) *
+ cur_fdm_state->get_delta_t() );
+ cur_fdm_state->set_remainder( remainder );
+ // cout << "remainder = " << remainder << endl;
+
+ // chop max interations to something reasonable if the sim was
+ // delayed for an excesive amount of time
+ if ( multi_loop > 2.0 / cur_fdm_state->get_delta_t() ) {
+ multi_loop = (int)(2.0 / cur_fdm_state->get_delta_t());
+ cur_fdm_state->set_remainder( 0 );
+ }
+
+ // cout << "multi_loop = " << multi_loop << endl;
+ for ( i = 0; i < multi_loop * fgGetInt("/sim/speed-up"); ++i ) {
+ // run Autopilot system
+ current_autopilot->run();
+
+ // update autopilot
+ cur_fdm_state->update( 1 );
+ }
+ FGSteam::update( multi_loop * fgGetInt("/sim/speed-up") );