1
0
Fork 0

replay system: protect from recording multiple records for identical time

And avoid div by zero when dt==0 for recorded data.
This commit is contained in:
ThorstenB 2012-11-11 17:36:10 +01:00
parent 1d99401c04
commit 25138930e3
2 changed files with 22 additions and 10 deletions

View file

@ -462,16 +462,20 @@ FGFlightRecorder::replay(double SimTime, const FGReplayData* _pNextBuffer, const
return; return;
int Offset = 0; int Offset = 0;
double ratio; double ratio = 1.0;
if (pLastBuffer) if (pLastBuffer)
{ {
double NextSimTime = _pNextBuffer->sim_time; double NextSimTime = _pNextBuffer->sim_time;
double LastSimTime = _pLastBuffer->sim_time; double LastSimTime = _pLastBuffer->sim_time;
ratio = (SimTime - LastSimTime) / (NextSimTime - LastSimTime); double Numerator = SimTime - LastSimTime;
} double dt = NextSimTime - LastSimTime;
else // avoid divide by zero and other quirks
{ if ((Numerator > 0.0)&&(dt != 0.0))
ratio = 1.0; {
ratio = Numerator / dt;
if (ratio > 1.0)
ratio = 1.0;
}
} }
Offset += sizeof(double); Offset += sizeof(double);

View file

@ -472,11 +472,19 @@ FGReplay::update( double dt )
// flight recording // flight recording
sim_time += dt * speed_up->getDoubleValue();
// sanity check, don't collect data if FDM data isn't good // sanity check, don't collect data if FDM data isn't good
if (!fgGetBool("/sim/fdm-initialized", false)) { if ((!fgGetBool("/sim/fdm-initialized", false))||(dt==0.0))
return; return;
{
double new_sim_time = sim_time + dt * speed_up->getDoubleValue();
// don't record multiple records with the same timestamp (or go backwards in time)
if (new_sim_time <= sim_time)
{
SG_LOG(SG_SYSTEMS, SG_ALERT, "ReplaySystem: Time warp detected!");
return;
}
sim_time = new_sim_time;
} }
FGReplayData* r = record(sim_time); FGReplayData* r = record(sim_time);
@ -870,7 +878,7 @@ FGReplay::saveTape(const SGPropertyNode* ConfigData)
meta->setStringValue("closest-airport-id", fgGetString("/sim/airport/closest-airport-id", "")); meta->setStringValue("closest-airport-id", fgGetString("/sim/airport/closest-airport-id", ""));
const char* aircraft_version = fgGetString("/sim/aircraft-version", ""); const char* aircraft_version = fgGetString("/sim/aircraft-version", "");
if (aircraft_version[0]==0) if (aircraft_version[0]==0)
aircraft_version = "(unknown aircraft version)"; aircraft_version = "(undefined)";
meta->setStringValue("aircraft-version", aircraft_version); meta->setStringValue("aircraft-version", aircraft_version);
// add information on the tape's recording duration // add information on the tape's recording duration