From fcb991b98695972be55d074e9db0746f5c9d2a14 Mon Sep 17 00:00:00 2001 From: Lovisa Hassler Date: Tue, 27 Nov 2018 16:55:31 -0500 Subject: [PATCH] making the loaded signal data buffer larger --- modules/dsn/managers/signalmanager.cpp | 67 ++++++++++++++++----- modules/dsn/managers/signalmanager.h | 6 +- modules/dsn/rendering/renderablesignals.cpp | 7 +-- modules/dsn/rendering/renderablesignals.h | 3 +- 4 files changed, 62 insertions(+), 21 deletions(-) diff --git a/modules/dsn/managers/signalmanager.cpp b/modules/dsn/managers/signalmanager.cpp index 7255052dcf..ef0ed458ab 100644 --- a/modules/dsn/managers/signalmanager.cpp +++ b/modules/dsn/managers/signalmanager.cpp @@ -36,29 +36,19 @@ namespace openspace { { bool dataFilesSuccess = DataFileHelper::checkFileNames(identifier, dictionary, _dataFiles); _fileStartTimes = DataFileHelper::getDaysFromFileNames(_dataFiles); - SignalManager::signalParser(0); + SignalManager::updateSignalData(0, 0); return dataFilesSuccess; } bool SignalManager::signalParser(int index) { - std::string filename; - if (index == -1 || index > _dataFiles.size()) - return false; - - filename = _dataFiles[index]; + std::string filename = _dataFiles[index]; std::ifstream ifs(filename); nlohmann::json j = nlohmann::json::parse(ifs); - SignalManager::Signal structSignal; - - std::string startTimeString = DataFileHelper::getDayFromFileName(filename); - const double triggerTime = Time::convertTime(startTimeString); + SignalManager::Signal structSignal; - _signalData.sequenceStartTime = triggerTime; - _signalData.signals.clear(); - _signalData.signals.reserve(0); // TODO handle the start time/ end time with regard to light time travel // ie. This has to be different for uplink and downlink // light time travel should extend endtime for uplink, and start time for downlink @@ -74,8 +64,55 @@ namespace openspace { _signalData.signals.push_back(structSignal); } - _signalData.isLoaded = true; - return _signalData.isLoaded; + return true; + } + + /* We load the signals for the current day, as well as a + * buffer for the previous day and the next day. This allows + * us to keep signal data in memory that transmit over midnight, + * as well as signals that have a long light travel time. */ + void SignalManager::updateSignalData(int index, int sizeBuffer) { + + // This will all + int lightTimeTravelBuffer = 1; + + if (index == -1 || index > _dataFiles.size()) + return; + + _signalData.signals.clear(); + _signalData.signals.reserve(sizeBuffer); + + std::string activeTimeFilename = _dataFiles[index]; + std::string startTimeString = DataFileHelper::getDayFromFileName(activeTimeFilename); + const double triggerTime = Time::convertTime(startTimeString); + + _signalData.sequenceStartTime = triggerTime; + //86400 equals 24hrs in seconds + _signalData.sequenceEndTime = triggerTime + 86400; + + if (index < lightTimeTravelBuffer) + { + signalParser(index); + signalParser(index + lightTimeTravelBuffer); + _signalData.isLoaded = true; + _signalData.signals.shrink_to_fit(); + return; + } + else if (index == _dataFiles.size()) { + + signalParser(index- lightTimeTravelBuffer); + signalParser(index); + _signalData.isLoaded = true; + _signalData.signals.shrink_to_fit(); + return; + } + else { + signalParser(index - lightTimeTravelBuffer); + signalParser(index); + signalParser(index + lightTimeTravelBuffer); + _signalData.isLoaded = true; + _signalData.signals.shrink_to_fit(); + } } } diff --git a/modules/dsn/managers/signalmanager.h b/modules/dsn/managers/signalmanager.h index 2567847857..39cd72ee14 100644 --- a/modules/dsn/managers/signalmanager.h +++ b/modules/dsn/managers/signalmanager.h @@ -53,7 +53,9 @@ namespace openspace { //filename is on the format of YYYY-DDDT (excluding '.json') bool isLoaded = false; double sequenceStartTime; - double sequenceEndTime = sequenceStartTime + 86400.0; // 24 hours from startTime + // 24 hours from startTime + double sequenceEndTime; + //The currently loaded signals std::vector signals; }; @@ -67,6 +69,8 @@ namespace openspace { static bool extractMandatoryInfoFromDictionary(const char* identifier, std::unique_ptr &dictionary); /* parses signaldata from a file given an index in our preloaded filename vector */ static bool signalParser(int index); + /* updates the loaded signal data from disk */ + static void updateSignalData(int index, int sizeBuffer); }; } diff --git a/modules/dsn/rendering/renderablesignals.cpp b/modules/dsn/rendering/renderablesignals.cpp index 535e531269..3c218fd3cc 100644 --- a/modules/dsn/rendering/renderablesignals.cpp +++ b/modules/dsn/rendering/renderablesignals.cpp @@ -260,12 +260,10 @@ void RenderableSignals::render(const RenderData& data, RendererTasks&) { void RenderableSignals::update(const UpdateData& data) { double currentTime = data.time.j2000Seconds(); - //Todo: change this magic number. 86400 equals 24hrs in seconds - double endTime = 86400; //Bool if the current time is within the timeframe for the currently loaded data const bool isTimeInFileInterval = (currentTime >= SignalManager::_signalData.sequenceStartTime) && - (currentTime < SignalManager::_signalData.sequenceStartTime + endTime); + (currentTime < SignalManager::_signalData.sequenceEndTime); //Reload data if it is not relevant anymore if (!isTimeInFileInterval) { @@ -275,7 +273,8 @@ void RenderableSignals::update(const UpdateData& data) { //parse data for that file if (!SignalManager::_signalData.isLoaded) { - SignalManager::signalParser(activeFileIndex); + LDEBUG(fmt::format("{}: Reloading SignalData.", _identifier)); + SignalManager::updateSignalData(activeFileIndex, _signalSizeBuffer); } else return; diff --git a/modules/dsn/rendering/renderablesignals.h b/modules/dsn/rendering/renderablesignals.h index 0825fecef1..76e565091f 100644 --- a/modules/dsn/rendering/renderablesignals.h +++ b/modules/dsn/rendering/renderablesignals.h @@ -182,10 +182,11 @@ namespace openspace { UniformCache(modelViewStation, modelViewSpacecraft, projection) _uniformCache; - /*Checks if the current time is within a signal's start and endtime*/ bool isSignalActive(double currentTime, std::string signalStartTime, std::string signalEndTime, double lightTravelTime); + /// Size buffer for signal vector + int _signalSizeBuffer = 10; };