some download functionality in place

This commit is contained in:
Sovanny Huy
2019-07-09 16:58:57 -04:00
parent 112a0ecb57
commit f72cd1bc02
3 changed files with 81 additions and 35 deletions

View File

@@ -428,7 +428,7 @@ bool RenderableFieldlinesSequence::extractMandatoryInfoFromDictionary(
LERROR(fmt::format("{}: The field {} is missing", _identifier, KeyWebFieldlines));
return false;
}
else if (!webFieldLines) {
else if (!_webFieldlines) {
LERROR(fmt::format("{}: The field {} is missing", _identifier, KeySourceFolder));
return false;
}
@@ -1210,6 +1210,9 @@ void RenderableFieldlinesSequence::update(const UpdateData& data) {
(nextIdx < _nStates && currentTime >= _startTimes[nextIdx]))
{
updateActiveTriggerTimeIndex(currentTime);
// WebfieldlinesManager stuff!
_webFieldlinesManager.update();
computeSequenceEndTime();
if (_loadingStatesDynamically) {
_mustLoadNewStateFromDisk = true;

View File

@@ -41,8 +41,6 @@ namespace {
namespace openspace{
// dowload files specified in _filestodownload
// I'm thinking we can replace the parameters with pointers to the lists that will be
// initialized in the constuctor instead
void WebFieldlinesManager::downloadFieldlines(){
LERROR("starting download");
for (int index : _filesToDownload){
@@ -69,13 +67,13 @@ namespace openspace{
}
}
// Operator ()
void WebFieldlinesManager::initializeWebFieldlinesManager(std::string identifier, std::string fieldLineModelType, int& _activeTriggerTimeIndex, size_t& _nStates, std::vector<std::string>& _sourceFiles, std::vector<double>& _startTimes)
{
_flsType = fieldLineModelType;
_syncDir = initializeSyncDirectory(identifier);
_downloadMargin = 1;
_downloadMargin = 2;
_timeTriggerDelta = 7200;
rfs_activeTriggerTimeIndex = &_activeTriggerTimeIndex;
@@ -100,20 +98,49 @@ namespace openspace{
// this function aint done
void WebFieldlinesManager::update(){
updateTTIndexWeb();
// check how many are left until fieldlinessequence runs out - add direction information later
double nextTheroticalTimeTrigger;
double eps = 100;
double nextTimeTrigger;
double eps = 10.0;
if(*rfs_activeTriggerTimeIndex == static_cast<int>(*rfs_nStates)-1){
// if it's at the last index, definetily start some downloading
LERROR("gonna need some more files");
return;
}
for (int i = *rfs_activeTriggerTimeIndex; i < static_cast<int>(*rfs_nStates); i++){
nextTheroticalTimeTrigger = (*rfs_startTimes)[i] +_timeTriggerDelta;
if((*rfs_startTimes)[i + 1] > (nextTheroticalTimeTrigger + eps)){
// do some downloading
int setsLeftUntilGapOrEnd = 0;
for (int i = *rfs_activeTriggerTimeIndex; i < static_cast<int>(*rfs_nStates)-1; i++){
setsLeftUntilGapOrEnd++;
nextTimeTrigger = _availableTriggertimes[_activeTTIndexWeb + setsLeftUntilGapOrEnd].first;
// if the next file in renderablefieldsequence is further away than the actual next timetrigger, download it
if((*rfs_startTimes)[i + 1] > (nextTimeTrigger + eps)){
break;
}
if(setsLeftUntilGapOrEnd > 2){
//we're all gucci
break;
}
}
if(setsLeftUntilGapOrEnd < 2){
LERROR("gonna need some more files");
setFilesToDownload(setsLeftUntilGapOrEnd);
downloadFieldlines(); // this should be thread with lock
}
}
void WebFieldlinesManager::setFilesToDownload(int setsLeftUntilGapOrEnd){
int startInd = _activeTTIndexWeb + setsLeftUntilGapOrEnd + 1;
int endInd = startInd + _downloadMargin;
if(endInd >= static_cast<int>(_availableTriggertimes.size())){
endInd = static_cast<int>(_availableTriggertimes.size()) - 1;
}
for( int i = startInd; i <= endInd; i++){
_filesToDownload.push_back(i);
}
}
std::string WebFieldlinesManager::downloadOsfls(std::string triggertime){
@@ -170,12 +197,12 @@ namespace openspace{
void WebFieldlinesManager::setInitialSet(double openSpaceTime){
int openspaceindex = -1;
do openspaceindex++;
while (openSpaceTime > _availableTriggertimes[openspaceindex].first);
_activeTTIndexWeb = -1;
do _activeTTIndexWeb++;
while (openSpaceTime > _availableTriggertimes[_activeTTIndexWeb].first);
int startInd = openspaceindex - _downloadMargin;
int endInd = openspaceindex + _downloadMargin;
int startInd = _activeTTIndexWeb - _downloadMargin;
int endInd = _activeTTIndexWeb + _downloadMargin;
if(startInd < 0) startInd = 0;
if(endInd >= static_cast<int>(_availableTriggertimes.size()))
@@ -185,18 +212,28 @@ namespace openspace{
_filesToDownload.push_back(i);
}
// TODO
// Download the initial set of fieldlines
void WebFieldlinesManager::downloadInitialSequence(){
for (int index : _filesToDownload){
// download fieldlines file
std::string filename = _availableTriggertimes[index].second;
std::string destPath = downloadOsfls(filename);
}
_filesToDownload.clear();
}
// TODO
void WebFieldlinesManager::updateStartTimes(){
void WebFieldlinesManager::updateTTIndexWeb(){
double rfs_time = (*rfs_startTimes)[*rfs_activeTriggerTimeIndex];
_activeTTIndexWeb = 0;
double eps = 10.0;
while(true){
if((rfs_time > _availableTriggertimes[_activeTTIndexWeb].first - eps)
&& (rfs_time < _availableTriggertimes[_activeTTIndexWeb].first + eps))
break;
_activeTTIndexWeb++;
}
}
void WebFieldlinesManager::parseTriggerTimesList(std::string s){
@@ -208,26 +245,26 @@ namespace openspace{
{
if (c == '[' || c == ']' || c == '"' ) continue;
else if (c == ','){
double tt = triggerTimeString2Int(sub.substr(6, 23));
double tt = triggerTimeString2Double(sub.substr(6, 23));
_availableTriggertimes.push_back(std::make_pair(tt, sub));
sub.clear();
}
else sub += c;
}
double tt = triggerTimeString2Int(sub.substr(6, 23));
double tt = triggerTimeString2Double(sub.substr(6, 23));
_availableTriggertimes.push_back(std::make_pair(tt, sub));
}
int WebFieldlinesManager::triggerTimeString2Int(std::string s){
double WebFieldlinesManager::triggerTimeString2Double(std::string s){
s.replace(13, 1, ":");
s.replace(16, 1, ":");
Time time = Time();
time.setTime(s);
return static_cast<int> (time.j2000Seconds() - 69.185013294);
return (time.j2000Seconds() /*- 69.185013294*/); // openspace timeconverter gives an error. but we're gonna be consistent with the error
}
void WebFieldlinesManager::triggerTimeInt2String(int i, std::string& s){
double temp = i + 69.185013294;
void WebFieldlinesManager::triggerTimeDouble2String(double i, std::string& s){
double temp = i /*+ 69.185013294*/;
Time time = Time();
time.setTime(temp);
s = time.ISO8601();

View File

@@ -47,6 +47,9 @@ public:
// Returns the sync directory
std::string getDirectory();
// Function to run in FieldLinesSequence's update loop
void update();
private:
@@ -61,6 +64,9 @@ private:
// How long between the timesteps?
double _timeTriggerDelta;
// active time trigger index in the list of the timetriggers that are available online to fetch
int _activeTTIndexWeb;
/******************************************************************************
* Pointers to stuff in RenderableFieldlinesSequence (which own this instance)*
******************************************************************************/
@@ -81,11 +87,9 @@ private:
// Indices for what fieldlines to download
std::vector<int> _filesToDownload;
// Function to run in FieldLinesSequence's update loop
void update();
// Download one file, given what model type and triggertime in J2000
// ***turn into ints later***
std::string downloadOsfls(std::string triggertime);
std::string initializeSyncDirectory(std::string identifier);
@@ -97,19 +101,21 @@ private:
// (can be empty during start up of openspace)
void setInitialSet(double openSpaceTime);
// decide what files to download
void setFilesToDownload(int index);
// Download a sequence
void downloadInitialSequence();
// Update the list of osfls available on disk. Should be in sync with
// _startTimes member var in FieldLinesSequence
void updateStartTimes();
// Update index of _activeTTIndexWeb to match the one in renderablefieldlinessequence
void updateTTIndexWeb();
// Parse the data from http request
void parseTriggerTimesList(std::string s);
// some temporary functions to translate the filenames to ints (doubles?)
int triggerTimeString2Int(std::string s);
void triggerTimeInt2String(int d, std::string& s);
// some temporary functions to translate the filenames to doubles
double triggerTimeString2Double(std::string s);
void triggerTimeDouble2String(double d, std::string& s);
};