From 265c99a149bc6686e3a36d1e9de9dd878800c202 Mon Sep 17 00:00:00 2001 From: Torsten Dreyer Date: Tue, 3 Mar 2015 17:08:20 +0100 Subject: [PATCH] FlightHistory: add pagedPathForHistory pathForHistory() halts the sim for a few seconds when called on long flights. pagePathForHistory allows to retrieve the complete history in chunks --- src/Aircraft/FlightHistory.cxx | 36 +++++++++++++++++++++++++++++++++- src/Aircraft/FlightHistory.hxx | 12 +++++++++++- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/Aircraft/FlightHistory.cxx b/src/Aircraft/FlightHistory.cxx index c9f6eb528..8d2b6ae82 100644 --- a/src/Aircraft/FlightHistory.cxx +++ b/src/Aircraft/FlightHistory.cxx @@ -137,7 +137,7 @@ void FGFlightHistory::capture() m_lastCaptureTime = globals->get_sim_time_sec(); Sample* sample = m_buckets.back()->samples + m_validSampleCount; - sample->simTimeMSec = static_cast(m_lastCaptureTime * 1000.0); + sample->simTimeMSec = static_cast(m_lastCaptureTime * 1000.0); sample->position = globals->get_aircraft_position(); double heading, pitch, roll; @@ -149,6 +149,40 @@ void FGFlightHistory::capture() ++m_validSampleCount; } +PagedPathForHistory_ptr FGFlightHistory::pagedPathForHistory(size_t max_entries, size_t newerThan ) const +{ + PagedPathForHistory_ptr result = new PagedPathForHistory(); + if (m_buckets.empty()) { + return result; + } + + BOOST_FOREACH(SampleBucket* bucket, m_buckets) { + unsigned int count = (bucket == m_buckets.back() ? m_validSampleCount : SAMPLE_BUCKET_WIDTH); + + // iterate over all the valid samples in the bucket + for (unsigned int index = 0; index < count; ++index) { + // skip older entries + // TODO: bisect! + if( bucket->samples[index].simTimeMSec <= newerThan ) + continue; + + if( max_entries ) { + max_entries--; + SGGeod g = bucket->samples[index].position; + result->path.push_back(g); + result->last_seen = bucket->samples[index].simTimeMSec; + } else { + goto exit; + } + + } // of samples iteration + } // of buckets iteration + +exit: + return result; +} + + SGGeodVec FGFlightHistory::pathForHistory(double minEdgeLengthM) const { SGGeodVec result; diff --git a/src/Aircraft/FlightHistory.hxx b/src/Aircraft/FlightHistory.hxx index 0716321b7..4f23bc933 100644 --- a/src/Aircraft/FlightHistory.hxx +++ b/src/Aircraft/FlightHistory.hxx @@ -32,6 +32,15 @@ typedef std::vector SGGeodVec; +class PagedPathForHistory : public SGReferenced { +public: + PagedPathForHistory() : last_seen(0) {} + virtual ~PagedPathForHistory() {} + SGGeodVec path; + time_t last_seen; +}; +typedef SGSharedPtr PagedPathForHistory_ptr; + const unsigned int SAMPLE_BUCKET_WIDTH = 1024; /** @@ -52,6 +61,7 @@ public: virtual void reinit(); virtual void update(double dt); + PagedPathForHistory_ptr pagedPathForHistory(size_t max_entries, size_t newerThan = 0) const; /** * retrieve the path, collapsing segments shorter than * the specified minimum length @@ -75,7 +85,7 @@ private: /// heading, pitch and roll can be recorded at lower precision /// than a double - actually 16 bits might be sufficient float heading, pitch, roll; - int simTimeMSec; + size_t simTimeMSec; };