diff --git a/projects/VC7.1/FlightGear.vcproj b/projects/VC7.1/FlightGear.vcproj index 85cc1dcff..f4f252542 100755 --- a/projects/VC7.1/FlightGear.vcproj +++ b/projects/VC7.1/FlightGear.vcproj @@ -2223,12 +2223,6 @@ <Filter Name="Lib_Time" Filter=""> - <File - RelativePath="..\..\src\Time\fg_timer.cxx"> - </File> - <File - RelativePath="..\..\src\Time\fg_timer.hxx"> - </File> <File RelativePath="..\..\src\Time\light.cxx"> </File> diff --git a/projects/VC8/FlightGearLib.vcproj b/projects/VC8/FlightGearLib.vcproj index 58e0ba086..9e46a281f 100755 --- a/projects/VC8/FlightGearLib.vcproj +++ b/projects/VC8/FlightGearLib.vcproj @@ -488,10 +488,6 @@ RelativePath="..\..\src\include\fg_stl_config.h" > </File> - <File - RelativePath="..\..\src\time\fg_timer.hxx" - > - </File> <File RelativePath="..\..\src\include\fg_typedefs.h" > @@ -2198,10 +2194,6 @@ RelativePath="..\..\src\main\fg_props.cxx" > </File> - <File - RelativePath="..\..\src\time\fg_timer.cxx" - > - </File> <File RelativePath="..\..\src\FDM\JSBSim\models\flight_control\FGActuator.cpp" > diff --git a/src/Cockpit/cockpit.cxx b/src/Cockpit/cockpit.cxx index 3865ce718..4e7651f7c 100644 --- a/src/Cockpit/cockpit.cxx +++ b/src/Cockpit/cockpit.cxx @@ -45,7 +45,6 @@ #include <Main/fg_props.hxx> #include <Main/viewmgr.hxx> #include <Scenery/scenery.hxx> -#include <Time/fg_timer.hxx> #include <GUI/gui.h> #include "cockpit.hxx" diff --git a/src/FDM/flight.cxx b/src/FDM/flight.cxx index 0e4ff912a..bc5b3059a 100644 --- a/src/FDM/flight.cxx +++ b/src/FDM/flight.cxx @@ -44,23 +44,15 @@ static inline void assign(double* ptr, const SGVec3d& vec) ptr[2] = vec[2]; } -// base_fdm_state is the internal state that is updated in integer -// multiples of "dt". This leads to "jitter" with respect to the real -// world time, so we introduce cur_fdm_state which is extrapolated by -// the difference between sim time and real world time - FGInterface *cur_fdm_state = 0; -FGInterface base_fdm_state; // Constructor FGInterface::FGInterface() - : remainder(0) { _setup(); } FGInterface::FGInterface( double dt ) - : remainder(0) { _setup(); } @@ -70,33 +62,18 @@ FGInterface::~FGInterface() { // unbind(); // FIXME: should be called explicitly } - int FGInterface::_calc_multiloop (double dt) { + // Since some time the simulation time increments we get here are + // already a multiple of the basic update freqency. + // So, there is no need to do our own multiloop rounding with all bad + // roundoff problems when we already have nearly accurate values. + // Only the speedup thing must be still handled here int hz = fgGetInt("/sim/model-hz"); + int multiloop = SGMiscd::roundToInt(dt*hz); int speedup = fgGetInt("/sim/speed-up"); - - dt += remainder; - remainder = 0; - double ml = dt * hz; - // Avoid roundoff problems by adding the roundoff itself. - // ... ok, two times the roundoff to have enough room. - int multiloop = int(floor(ml * (1.0 + 2.0*DBL_EPSILON))); - remainder = (ml - multiloop) / hz; - - // If we artificially inflate ml above by a tiny amount to get the - // closest integer, then subtract the integer from the original - // slightly smaller value, we can get a negative remainder. - // Logically this should never happen, and we definitely don't want - // to carry a negative remainder over to the next iteration, so - // never let the remainder go below zero. - // - // Note: this fixes a problem where we run 1, 3, 1, 3, 1, 3... loops - // of the FDM when in fact we want to run 2, 2, 2, 2, 2... - if ( remainder < 0 ) { remainder = 0; } - - return (multiloop * speedup); + return multiloop * speedup; } @@ -165,9 +142,6 @@ FGInterface::common_init () ground_cache.set_cache_time_offset(globals->get_sim_time_sec()); -// stamp(); -// set_remainder( 0 ); - // Set initial position SG_LOG( SG_FLIGHT, SG_INFO, "...initializing position..." ); double lon = fgGetDouble("/sim/presets/longitude-deg") @@ -261,16 +235,6 @@ FGInterface::bind () { bound = true; - // Time management (read-only) -// fgTie("/fdm/time/delta_t", this, -// &FGInterface::get_delta_t); // read-only -// fgTie("/fdm/time/elapsed", this, -// &FGInterface::get_elapsed); // read-only -// fgTie("/fdm/time/remainder", this, -// &FGInterface::get_remainder); // read-only -// fgTie("/fdm/time/multi_loop", this, -// &FGInterface::get_multi_loop); // read-only - // Aircraft position fgTie("/position/latitude-deg", this, &FGInterface::get_Latitude_deg, @@ -429,10 +393,6 @@ FGInterface::unbind () { bound = false; - // fgUntie("/fdm/time/delta_t"); - // fgUntie("/fdm/time/elapsed"); - // fgUntie("/fdm/time/remainder"); - // fgUntie("/fdm/time/multi_loop"); fgUntie("/position/latitude-deg"); fgUntie("/position/longitude-deg"); fgUntie("/position/altitude-ft"); diff --git a/src/FDM/flight.hxx b/src/FDM/flight.hxx index 1ce5ab5d5..ba9551456 100644 --- a/src/FDM/flight.hxx +++ b/src/FDM/flight.hxx @@ -111,8 +111,6 @@ private: // next elapsed time. This yields a small amount of temporal // jitter ( < dt ) but in practice seems to work well. - double remainder; // remainder time from last run - // CG position w.r.t. ref. point SGVec3d d_cg_rp_body_v; diff --git a/src/Main/main.cxx b/src/Main/main.cxx index 10fc58ce1..ecc0b88ac 100644 --- a/src/Main/main.cxx +++ b/src/Main/main.cxx @@ -67,7 +67,6 @@ #include <ATCDCL/ATCmgr.hxx> #include <ATCDCL/AIMgr.hxx> #include <Time/tmp.hxx> -#include <Time/fg_timer.hxx> #include <Environment/environment_mgr.hxx> #include <GUI/new_gui.hxx> #include <MultiPlayer/multiplaymgr.hxx> @@ -304,15 +303,12 @@ static void fgMainLoop( void ) { // round the real time down to a multiple of 1/model-hz. // this way all systems are updated the _same_ amount of dt. - { - static double rem = 0.0; - real_delta_time_sec += rem; - double hz = model_hz; - double nit = floor(real_delta_time_sec*hz); - rem = real_delta_time_sec - nit/hz; - real_delta_time_sec = nit/hz; - } - + static double reminder = 0.0; + real_delta_time_sec += reminder; + global_multi_loop = long(floor(real_delta_time_sec*model_hz)); + global_multi_loop = SGMisc<long>::max(0, global_multi_loop); + reminder = real_delta_time_sec - double(global_multi_loop)/double(model_hz); + real_delta_time_sec = double(global_multi_loop)/double(model_hz); if (clock_freeze->getBoolValue() || wait_for_scenery) { delta_time_sec = 0; @@ -326,8 +322,6 @@ static void fgMainLoop( void ) { fgSetDouble("/sim/time/delta-realtime-sec", real_delta_time_sec); fgSetDouble("/sim/time/delta-sec", delta_time_sec); - static long remainder = 0; - long elapsed; #ifdef FANCY_FRAME_COUNTER int i; double accum; @@ -400,12 +394,6 @@ static void fgMainLoop( void ) { altitude->getDoubleValue() * SG_FEET_TO_METER, globals->get_time_params()->getJD() ); - // Get elapsed time (in usec) for this past frame - elapsed = fgGetTimeInterval(); - SG_LOG( SG_ALL, SG_DEBUG, - "Elapsed time interval is = " << elapsed - << ", previous remainder is = " << remainder ); - // Calculate frame rate average #ifdef FANCY_FRAME_COUNTER /* old fps calculation */ @@ -452,27 +440,10 @@ static void fgMainLoop( void ) { globals->get_AI_mgr()->update(delta_time_sec); // Run flight model - - // Calculate model iterations needed for next frame - elapsed += remainder; - - global_multi_loop = (long)(((double)elapsed * 0.000001) * model_hz ); - remainder = elapsed - ( (global_multi_loop*1000000) / model_hz ); - SG_LOG( SG_ALL, SG_DEBUG, - "Model iterations needed = " << global_multi_loop - << ", new remainder = " << remainder ); - - // chop max iterations to something reasonable if the sim was - // delayed for an excessive amount of time - if ( global_multi_loop > 2.0 * model_hz ) { - global_multi_loop = (int)(2.0 * model_hz ); - remainder = 0; - } - - // flight model - if ( global_multi_loop > 0) { + if (0 < global_multi_loop) { // first run the flight model each frame until it is initialized - // then continue running each frame only after initial scenery load is complete. + // then continue running each frame only after initial scenery + // load is complete. fgUpdateTimeDepCalcs(); } else { SG_LOG( SG_ALL, SG_DEBUG, diff --git a/src/Time/Makefile.am b/src/Time/Makefile.am index 98f634176..7c824d8d0 100644 --- a/src/Time/Makefile.am +++ b/src/Time/Makefile.am @@ -1,7 +1,6 @@ noinst_LIBRARIES = libTime.a libTime_a_SOURCES = \ - fg_timer.cxx fg_timer.hxx \ light.cxx light.hxx \ sunsolver.cxx sunsolver.hxx \ tmp.cxx tmp.hxx diff --git a/src/Time/fg_timer.cxx b/src/Time/fg_timer.cxx deleted file mode 100644 index 7f6fef851..000000000 --- a/src/Time/fg_timer.cxx +++ /dev/null @@ -1,120 +0,0 @@ -// fg_timer.cxx -- time handling routines -// -// Written by Curtis Olson, started June 1997. -// -// Copyright (C) 1997 Curtis L. Olson - http://www.flightgear.org/~curt -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -// -// $Id$ - - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#include <signal.h> // for timer routines -#include <stdio.h> // for printf() - -#ifdef HAVE_STDLIB_H -# include <stdlib.h> -#endif - -#ifdef HAVE_SYS_TIME_H -# include <sys/time.h> // for get/setitimer, gettimeofday, struct timeval -#endif - -#include <simgear/timing/timestamp.hxx> - -#include "fg_timer.hxx" - - -unsigned long int fgSimTime; - -#ifdef HAVE_SETITIMER - static struct itimerval t, ot; - static void (*callbackfunc)(int multi_loop); - - -// This routine catches the SIGALRM -void fgTimerCatch( int dummy ) { - int warning_avoider; - - // get past a compiler warning - warning_avoider = dummy; - - // ignore any SIGALRM's until we come back from our EOM iteration - signal(SIGALRM, SIG_IGN); - - // printf("In fgTimerCatch()\n"); - - // -1 tells the routine to use default interval rather than - // something dynamically calculated based on frame rate - callbackfunc(-1); - - signal(SIGALRM, fgTimerCatch); -} - - -// this routine initializes the interval timer to generate a SIGALRM -// after the specified interval (dt) -void fgTimerInit(float dt, void (*f)( int )) { - int terr; - int isec; - int usec; - - callbackfunc = f; - - isec = (int) dt; - usec = 1000000 * ((int)dt - isec); - - t.it_interval.tv_sec = isec; - t.it_interval.tv_usec = usec; - t.it_value.tv_sec = isec; - t.it_value.tv_usec = usec; - // printf("fgTimerInit() called\n"); - fgTimerCatch(0); // set up for SIGALRM signal catch - terr = setitimer( ITIMER_REAL, &t, &ot ); - if (terr) { - printf("Error returned from setitimer"); - exit(0); - } -} -#endif // HAVE_SETITIMER - - -// This function returns the number of microseconds since the last -// time it was called. -int fgGetTimeInterval( void ) { - int interval; - static int inited = 0; - static SGTimeStamp last; - SGTimeStamp current; - - - if ( ! inited ) { - inited = 1; - last.stamp(); - interval = 0; - } else { - current.stamp(); - interval = (current - last).toUSecs(); - last = current; - } - - return interval; -} - - diff --git a/src/Time/fg_timer.hxx b/src/Time/fg_timer.hxx deleted file mode 100644 index dd37fb6e2..000000000 --- a/src/Time/fg_timer.hxx +++ /dev/null @@ -1,47 +0,0 @@ -// fg_timer.hxx -- time handling routines -// -// Written by Curtis Olson, started June 1997. -// -// Copyright (C) 1997 Curtis L. Olson - http://www.flightgear.org/~curt -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -// -// $Id$ - - -#ifndef _FG_TIMER_HXX -#define _FG_TIMER_HXX - - -#ifndef __cplusplus -# error This library requires C++ -#endif - - -extern unsigned long int fgSimTime; - -// this routine initializes the interval timer to generate a SIGALRM -// after the specified interval (dt) the function f() will be called -// at each signal -void fgTimerInit( float dt, void (*f)( int ) ); - -// This function returns the number of milleseconds since the last -// time it was called. -int fgGetTimeInterval( void ); - - -#endif // _FG_TIMER_HXX - -