From 25138930e3164ae6b9fe360e891d0bcce9706df1 Mon Sep 17 00:00:00 2001 From: ThorstenB Date: Sun, 11 Nov 2012 17:36:10 +0100 Subject: [PATCH] replay system: protect from recording multiple records for identical time And avoid div by zero when dt==0 for recorded data. --- src/Aircraft/flightrecorder.cxx | 16 ++++++++++------ src/Aircraft/replay.cxx | 16 ++++++++++++---- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/Aircraft/flightrecorder.cxx b/src/Aircraft/flightrecorder.cxx index a229f6814..5e37b2c36 100644 --- a/src/Aircraft/flightrecorder.cxx +++ b/src/Aircraft/flightrecorder.cxx @@ -462,16 +462,20 @@ FGFlightRecorder::replay(double SimTime, const FGReplayData* _pNextBuffer, const return; int Offset = 0; - double ratio; + double ratio = 1.0; if (pLastBuffer) { double NextSimTime = _pNextBuffer->sim_time; double LastSimTime = _pLastBuffer->sim_time; - ratio = (SimTime - LastSimTime) / (NextSimTime - LastSimTime); - } - else - { - ratio = 1.0; + double Numerator = SimTime - LastSimTime; + double dt = NextSimTime - LastSimTime; + // avoid divide by zero and other quirks + if ((Numerator > 0.0)&&(dt != 0.0)) + { + ratio = Numerator / dt; + if (ratio > 1.0) + ratio = 1.0; + } } Offset += sizeof(double); diff --git a/src/Aircraft/replay.cxx b/src/Aircraft/replay.cxx index 959437ef9..cea3bf263 100644 --- a/src/Aircraft/replay.cxx +++ b/src/Aircraft/replay.cxx @@ -472,11 +472,19 @@ FGReplay::update( double dt ) // flight recording - sim_time += dt * speed_up->getDoubleValue(); - // 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; + + { + 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); @@ -870,7 +878,7 @@ FGReplay::saveTape(const SGPropertyNode* ConfigData) meta->setStringValue("closest-airport-id", fgGetString("/sim/airport/closest-airport-id", "")); const char* aircraft_version = fgGetString("/sim/aircraft-version", ""); if (aircraft_version[0]==0) - aircraft_version = "(unknown aircraft version)"; + aircraft_version = "(undefined)"; meta->setStringValue("aircraft-version", aircraft_version); // add information on the tape's recording duration -- 2.39.5