X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAirports%2Frunwayprefs.cxx;h=fac1807fb1820daed60be9f78eb696d81b2e5058;hb=afcdbd3158503773644aa07dd86cd92d67946bd4;hp=af715ac3552b98a791d8486f522b98968be44ae7;hpb=a99ea1c7b5fb0ba69810bbad9b6aca8b4cdc116b;p=flightgear.git diff --git a/src/Airports/runwayprefs.cxx b/src/Airports/runwayprefs.cxx index af715ac35..fac1807fb 100644 --- a/src/Airports/runwayprefs.cxx +++ b/src/Airports/runwayprefs.cxx @@ -26,6 +26,8 @@ #endif #include +#include +#include #include @@ -40,369 +42,372 @@ * ScheduleTime ***************e*************************************************************/ void ScheduleTime::clear() -{ - start.clear(); - end.clear(); - scheduleNames.clear(); +{ + start.clear(); + end.clear(); + scheduleNames.clear(); } -ScheduleTime::ScheduleTime(const ScheduleTime &other) +ScheduleTime::ScheduleTime(const ScheduleTime & other) { - //timeVec start; - timeVecConstIterator i; - for (i = other.start.begin(); i != other.start.end(); i++) - start.push_back(*i); - for (i = other.end.begin(); i != other.end.end(); i++) - end.push_back(*i); - stringVecConstIterator k; - for (k = other.scheduleNames.begin(); k != other.scheduleNames.end(); k++) - scheduleNames.push_back(*k); - - //timeVec end; - //stringVec scheduleNames; - tailWind = other.tailWind; - crssWind = other.tailWind; + //timeVec start; + timeVecConstIterator i; + for (i = other.start.begin(); i != other.start.end(); i++) + start.push_back(*i); + for (i = other.end.begin(); i != other.end.end(); i++) + end.push_back(*i); + stringVecConstIterator k; + for (k = other.scheduleNames.begin(); k != other.scheduleNames.end(); + k++) + scheduleNames.push_back(*k); + + //timeVec end; + //stringVec scheduleNames; + tailWind = other.tailWind; + crssWind = other.tailWind; } -ScheduleTime & ScheduleTime::operator= (const ScheduleTime &other) +ScheduleTime & ScheduleTime::operator=(const ScheduleTime & other) { - //timeVec start; - clear(); - timeVecConstIterator i; - for (i = other.start.begin(); i != other.start.end(); i++) - start.push_back(*i); - for (i = other.end.begin(); i != other.end.end(); i++) - end.push_back(*i); - stringVecConstIterator k; - for (k = other.scheduleNames.begin(); k != other.scheduleNames.end(); k++) - scheduleNames.push_back(*k); - - //timeVec end; - //stringVec scheduleNames; - tailWind = other.tailWind; - crssWind = other.tailWind; - return *this; + //timeVec start; + clear(); + timeVecConstIterator i; + for (i = other.start.begin(); i != other.start.end(); i++) + start.push_back(*i); + for (i = other.end.begin(); i != other.end.end(); i++) + end.push_back(*i); + stringVecConstIterator k; + for (k = other.scheduleNames.begin(); k != other.scheduleNames.end(); + k++) + scheduleNames.push_back(*k); + + //timeVec end; + //stringVec scheduleNames; + tailWind = other.tailWind; + crssWind = other.tailWind; + return *this; } + string ScheduleTime::getName(time_t dayStart) { - if ((start.size() != end.size()) || (start.size() != scheduleNames.size())) - { - SG_LOG( SG_GENERAL, SG_INFO, "Unable to parse schedule times" ); - exit(1); - } - else - { - int nrItems = start.size(); - //cerr << "Nr of items to process: " << nrItems << endl; - if (nrItems > 0) - { - for (unsigned int i = 0; i < start.size(); i++) - { - //cerr << i << endl; - if ((dayStart >= start[i]) && (dayStart <= end[i])) - return scheduleNames[i]; - } - } - //couldn't find one so return 0; - //cerr << "Returning 0 " << endl; + if ((start.size() != end.size()) + || (start.size() != scheduleNames.size())) { + SG_LOG(SG_GENERAL, SG_INFO, "Unable to parse schedule times"); + exit(1); + } else { + int nrItems = start.size(); + //cerr << "Nr of items to process: " << nrItems << endl; + if (nrItems > 0) { + for (unsigned int i = 0; i < start.size(); i++) { + //cerr << i << endl; + if ((dayStart >= start[i]) && (dayStart <= end[i])) + return scheduleNames[i]; + } + } + //couldn't find one so return 0; + //cerr << "Returning 0 " << endl; } return string(""); -} +} + /****************************************************************************** * RunwayList *****************************************************************************/ -RunwayList::RunwayList(const RunwayList &other) +RunwayList::RunwayList(const RunwayList & other) { - type = other.type; - stringVecConstIterator i; - for (i = other.preferredRunways.begin(); i != other.preferredRunways.end(); i++) - preferredRunways.push_back(*i); + type = other.type; + stringVecConstIterator i; + for (i = other.preferredRunways.begin(); + i != other.preferredRunways.end(); i++) + preferredRunways.push_back(*i); } -RunwayList& RunwayList::operator= (const RunwayList &other) + +RunwayList & RunwayList::operator=(const RunwayList & other) { - type = other.type; - preferredRunways.clear(); - stringVecConstIterator i; - for (i = other.preferredRunways.begin(); i != other.preferredRunways.end(); i++) - preferredRunways.push_back(*i); - return *this; + type = other.type; + preferredRunways.clear(); + stringVecConstIterator i; + for (i = other.preferredRunways.begin(); + i != other.preferredRunways.end(); i++) + preferredRunways.push_back(*i); + return *this; } -void RunwayList::set(const string &tp, const string &lst) + +void RunwayList::set(const string & tp, const string & lst) { - //weekday = atoi(timeCopy.substr(0,1).c_str()); - // timeOffsetInDays = weekday - currTimeDate->getGmt()->tm_wday; - // timeCopy = timeCopy.substr(2,timeCopy.length()); - type = tp; - string rwys = lst; - string rwy; - while (rwys.find(",") != string::npos) - { - rwy = rwys.substr(0, rwys.find(",",0)); - //cerr << "adding runway [" << rwy << "] to the list " << endl; - preferredRunways.push_back(rwy); - rwys.erase(0, rwys.find(",",0)+1); // erase until after the first whitspace - while (rwys[0] == ' ') - rwys.erase(0, 1); // Erase any leading whitespaces. - //cerr << "Remaining runway list " << rwys; - } - preferredRunways.push_back(rwys); - //exit(1); + //weekday = atoi(timeCopy.substr(0,1).c_str()); + // timeOffsetInDays = weekday - currTimeDate->getGmt()->tm_wday; + // timeCopy = timeCopy.substr(2,timeCopy.length()); + type = tp; + string rwys = lst; + string rwy; + while (rwys.find(",") != string::npos) { + rwy = rwys.substr(0, rwys.find(",", 0)); + //cerr << "adding runway [" << rwy << "] to the list " << endl; + preferredRunways.push_back(rwy); + rwys.erase(0, rwys.find(",", 0) + 1); // erase until after the first whitspace + while (rwys[0] == ' ') + rwys.erase(0, 1); // Erase any leading whitespaces. + //cerr << "Remaining runway list " << rwys; + } + preferredRunways.push_back(rwys); + //exit(1); } -void RunwayList::clear() +void RunwayList::clear() { - type = ""; - preferredRunways.clear(); + type = ""; + preferredRunways.clear(); } + /**************************************************************************** * ***************************************************************************/ -RunwayGroup::RunwayGroup(const RunwayGroup &other) +RunwayGroup::RunwayGroup(const RunwayGroup & other) { - name = other.name; - RunwayListVecConstIterator i; - for (i = other.rwyList.begin(); i != other.rwyList.end(); i++) - rwyList.push_back(*i); - choice[0] = other.choice[0]; - choice[1] = other.choice[1]; - nrActive = other.nrActive; + name = other.name; + RunwayListVecConstIterator i; + for (i = other.rwyList.begin(); i != other.rwyList.end(); i++) + rwyList.push_back(*i); + choice[0] = other.choice[0]; + choice[1] = other.choice[1]; + nrActive = other.nrActive; } -RunwayGroup& RunwayGroup:: operator= (const RunwayGroup &other) -{ - rwyList.clear(); - name = other.name; - RunwayListVecConstIterator i; - for (i = other.rwyList.begin(); i != other.rwyList.end(); i++) - rwyList.push_back(*i); - choice[0] = other.choice[0]; - choice[1] = other.choice[1]; - nrActive = other.nrActive; - return *this; + +RunwayGroup & RunwayGroup::operator=(const RunwayGroup & other) +{ + rwyList.clear(); + name = other.name; + RunwayListVecConstIterator i; + for (i = other.rwyList.begin(); i != other.rwyList.end(); i++) + rwyList.push_back(*i); + choice[0] = other.choice[0]; + choice[1] = other.choice[1]; + nrActive = other.nrActive; + return *this; } -void RunwayGroup::setActive(const FGAirport* airport, - double windSpeed, - double windHeading, - double maxTail, - double maxCross, - stringVec *currentlyActive) +void RunwayGroup::setActive(const FGAirport * airport, + double windSpeed, + double windHeading, + double maxTail, + double maxCross, stringVec * currentlyActive) { - FGRunway* rwy; - int activeRwys = rwyList.size(); // get the number of runways active - int nrOfPreferences; - // bool found = true; - // double heading; - double hdgDiff; - double crossWind; - double tailWind; - string name; - //stringVec names; - int bestMatch = 0, bestChoice = 0; - - if (activeRwys > 0) - { - // Now downward iterate across all the possible preferences - // starting by the least preferred choice working toward the most preferred choice - - nrOfPreferences = rwyList[0].getRwyList()->size(); - bool validSelection = true; - bool foundValidSelection = false; - for (int i = nrOfPreferences-1; i >= 0; i--) - { - int match = 0; - - - // Test each runway listed in the preference to see if it's possible to use - // If one runway of the selection isn't allowed, we need to exclude this - // preference, however, we don't want to stop right there, because we also - // don't want to randomly swap runway preferences, unless there is a need to. - // - validSelection = true; - for (int j = 0; j < activeRwys; j++) - { - rwy = airport->getRunwayByIdent(rwyList[j].getRwyList(i)); - - //cerr << "Succes" << endl; - hdgDiff = fabs(windHeading - rwy->headingDeg()); - //cerr << "Wind Heading: " << windHeading << "Runway Heading: " < 180) - hdgDiff = 360 - hdgDiff; - //cerr << "Heading diff: " << hdgDiff << endl; - hdgDiff *= ((2*M_PI)/360.0); // convert to radians - crossWind = windSpeed * sin(hdgDiff); - tailWind = -windSpeed * cos(hdgDiff); - //cerr << ". Tailwind : " << tailWind; - //cerr << ". Crosswnd : " << crossWind; - if ((tailWind > maxTail) || (crossWind > maxCross)) - { - //cerr << ". [Invalid] " << endl; - validSelection = false; - } - else - { - //cerr << ". [Valid] "; - } - //cerr << endl; - } // of active runways iteration - - if (validSelection) - { - //cerr << "Valid selection : " << i << endl;; - foundValidSelection = true; - for (stringVecIterator it = currentlyActive->begin(); - it != currentlyActive->end(); it++) - { - if ((*it) == name) - match++; - } - if (match >= bestMatch) { - bestMatch = match; - bestChoice = i; - } - } - //cerr << "Preference " << i << " bestMatch " << bestMatch << " choice " << bestChoice << endl; - } - if (foundValidSelection) - { - //cerr << "Valid runay selection : " << bestChoice << endl; - nrActive = activeRwys; - active = bestChoice; - return; - } - // If this didn't work, due to heavy winds, try again - // but select only one landing and one takeoff runway. - choice[0] = 0; - choice[1] = 0; - for (int i = activeRwys-1; i; i--) - { - if (rwyList[i].getType() == string("landing")) - choice[0] = i; - if (rwyList[i].getType() == string("takeoff")) - choice[1] = i; - } - //cerr << "Choosing " << choice[0] << " for landing and " << choice[1] << "for takeoff" << endl; - nrOfPreferences = rwyList[0].getRwyList()->size(); - for (int i = 0; i < nrOfPreferences; i++) - { - bool validSelection = true; - for (int j = 0; j < 2; j++) - { - name = rwyList[choice[j]].getRwyList(i); - rwy = airport->getRunwayByIdent(name); - - //cerr << "Succes" << endl; - hdgDiff = fabs(windHeading - rwy->headingDeg()); - if (hdgDiff > 180) - hdgDiff = 360 - hdgDiff; - hdgDiff *= ((2*M_PI)/360.0); // convert to radians - crossWind = windSpeed * sin(hdgDiff); - tailWind = -windSpeed * cos(hdgDiff); - if ((tailWind > maxTail) || (crossWind > maxCross)) - validSelection = false; - - - } - if (validSelection) - { - //cerr << "Valid runay selection : " << i << endl; - active = i; - nrActive = 2; - return; - } - } + FGRunway *rwy; + int activeRwys = rwyList.size(); // get the number of runways active + int nrOfPreferences; + // bool found = true; + // double heading; + double hdgDiff; + double crossWind; + double tailWind; + string name; + //stringVec names; + int bestMatch = 0, bestChoice = 0; + + if (activeRwys > 0) { + // Now downward iterate across all the possible preferences + // starting by the least preferred choice working toward the most preferred choice + + nrOfPreferences = rwyList[0].getRwyList()->size(); + bool validSelection = true; + bool foundValidSelection = false; + for (int i = nrOfPreferences - 1; i >= 0; i--) { + int match = 0; + + + // Test each runway listed in the preference to see if it's possible to use + // If one runway of the selection isn't allowed, we need to exclude this + // preference, however, we don't want to stop right there, because we also + // don't want to randomly swap runway preferences, unless there is a need to. + // + validSelection = true; + + for (int j = 0; j < activeRwys; j++) { + string ident(rwyList[j].getRwyList(i)); + if (!airport->hasRunwayWithIdent(ident)) { + SG_LOG(SG_GENERAL, SG_WARN, + "no such runway:" << ident << " at " << + airport->ident()); + continue; + } + + rwy = airport->getRunwayByIdent(ident); + + //cerr << "Succes" << endl; + hdgDiff = fabs(windHeading - rwy->headingDeg()); + name = rwy->name(); + + + if (hdgDiff > 180) + hdgDiff = 360 - hdgDiff; + //cerr << "Heading diff: " << hdgDiff << endl; + hdgDiff *= ((2 * M_PI) / 360.0); // convert to radians + crossWind = windSpeed * sin(hdgDiff); + tailWind = -windSpeed * cos(hdgDiff); + //cerr << "Runway : " << rwy->name() << ": " << rwy->headingDeg() << endl; + //cerr << ". Tailwind : " << tailWind; + //cerr << ". Crosswnd : " << crossWind; + if ((tailWind > maxTail) || (crossWind > maxCross)) { + //cerr << ". [Invalid] " << endl; + validSelection = false; + } else { + //cerr << ". [Valid] "; + } + //cerr << endl; + for (stringVecIterator it = currentlyActive->begin(); + it != currentlyActive->end(); it++) { + //cerr << "Checking : \"" << (*it) << "\". vs \"" << name << "\"" << endl; + if ((*it) == name) { + match++; + } + } + } // of active runways iteration + + if (validSelection) { + //cerr << "Valid selection : " << i << endl;; + foundValidSelection = true; + if (match >= bestMatch) { + bestMatch = match; + bestChoice = i; + } + } + //cerr << "Preference " << i << "Match " << match << " bestMatch " << bestMatch << " choice " << bestChoice << " valid selection " << validSelection << endl; + } + if (foundValidSelection) { + //cerr << "Valid runay selection : " << bestChoice << endl; + nrActive = activeRwys; + active = bestChoice; + return; + } + // If this didn't work, due to heavy winds, try again + // but select only one landing and one takeoff runway. + choice[0] = 0; + choice[1] = 0; + for (int i = activeRwys - 1; i; i--) { + if (rwyList[i].getType() == string("landing")) + choice[0] = i; + if (rwyList[i].getType() == string("takeoff")) + choice[1] = i; + } + //cerr << "Choosing " << choice[0] << " for landing and " << choice[1] << "for takeoff" << endl; + nrOfPreferences = rwyList[0].getRwyList()->size(); + for (int i = 0; i < nrOfPreferences; i++) { + bool validSelection = true; + for (int j = 0; j < 2; j++) { + name = rwyList[choice[j]].getRwyList(i); + rwy = airport->getRunwayByIdent(name); + + //cerr << "Succes" << endl; + hdgDiff = fabs(windHeading - rwy->headingDeg()); + if (hdgDiff > 180) + hdgDiff = 360 - hdgDiff; + hdgDiff *= ((2 * M_PI) / 360.0); // convert to radians + crossWind = windSpeed * sin(hdgDiff); + tailWind = -windSpeed * cos(hdgDiff); + if ((tailWind > maxTail) || (crossWind > maxCross)) + validSelection = false; + + + } + if (validSelection) { + //cerr << "Valid runay selection : " << i << endl; + active = i; + nrActive = 2; + return; + } + } } - active = -1; - nrActive = 0; + active = -1; + nrActive = 0; } -void RunwayGroup::getActive(int i, string &name, string &type) +void RunwayGroup::getActive(int i, string & name, string & type) { - if (i == -1) - { - return; - } - if (nrActive == (int)rwyList.size()) - { - name = rwyList[i].getRwyList(active); - type = rwyList[i].getType(); + if (i == -1) { + return; } - else - { - name = rwyList[choice[i]].getRwyList(active); - type = rwyList[choice[i]].getType(); + if (nrActive == (int) rwyList.size()) { + name = rwyList[i].getRwyList(active); + type = rwyList[i].getType(); + } else { + name = rwyList[choice[i]].getRwyList(active); + type = rwyList[choice[i]].getType(); } } + /***************************************************************************** * FGRunway preference ****************************************************************************/ -FGRunwayPreference::FGRunwayPreference(FGAirport* ap) : - _ap(ap) +FGRunwayPreference::FGRunwayPreference(FGAirport * ap): +_ap(ap) { - //cerr << "Running default Constructor" << endl; - initialized = false; + //cerr << "Running default Constructor" << endl; + initialized = false; } -FGRunwayPreference::FGRunwayPreference(const FGRunwayPreference &other) +FGRunwayPreference::FGRunwayPreference(const FGRunwayPreference & other) { - initialized = other.initialized; + initialized = other.initialized; - comTimes = other.comTimes; // Commercial Traffic; - genTimes = other.genTimes; // General Aviation; - milTimes = other.milTimes; // Military Traffic; + comTimes = other.comTimes; // Commercial Traffic; + genTimes = other.genTimes; // General Aviation; + milTimes = other.milTimes; // Military Traffic; - PreferenceListConstIterator i; - for (i = other.preferences.begin(); i != other.preferences.end(); i++) - preferences.push_back(*i); + PreferenceListConstIterator i; + for (i = other.preferences.begin(); i != other.preferences.end(); i++) + preferences.push_back(*i); } - -FGRunwayPreference & FGRunwayPreference::operator= (const FGRunwayPreference &other) + +FGRunwayPreference & FGRunwayPreference::operator=(const FGRunwayPreference + & other) { - initialized = other.initialized; - - comTimes = other.comTimes; // Commercial Traffic; - genTimes = other.genTimes; // General Aviation; - milTimes = other.milTimes; // Military Traffic; - - PreferenceListConstIterator i; - preferences.clear(); - for (i = other.preferences.begin(); i != other.preferences.end(); i++) - preferences.push_back(*i); - return *this; + initialized = other.initialized; + + comTimes = other.comTimes; // Commercial Traffic; + genTimes = other.genTimes; // General Aviation; + milTimes = other.milTimes; // Military Traffic; + + PreferenceListConstIterator i; + preferences.clear(); + for (i = other.preferences.begin(); i != other.preferences.end(); i++) + preferences.push_back(*i); + return *this; } ScheduleTime *FGRunwayPreference::getSchedule(const char *trafficType) { - if (!(strcmp(trafficType, "com"))) { - return &comTimes; - } - if (!(strcmp(trafficType, "gen"))) { - return &genTimes; - } - if (!(strcmp(trafficType, "mil"))) { - return &milTimes; - } - return 0; + if (!(strcmp(trafficType, "com"))) { + return &comTimes; + } + if (!(strcmp(trafficType, "gen"))) { + return &genTimes; + } + if (!(strcmp(trafficType, "mil"))) { + return &milTimes; + } + return 0; } -RunwayGroup *FGRunwayPreference::getGroup(const string &groupName) +RunwayGroup *FGRunwayPreference::getGroup(const string & groupName) { - PreferenceListIterator i = preferences.begin(); - if (preferences.begin() == preferences.end()) - return 0; - while (!(i == preferences.end() || i->getName() == groupName)) - i++; - if (i != preferences.end()) - return &(*i); - else - return 0; + PreferenceListIterator i = preferences.begin(); + if (preferences.begin() == preferences.end()) + return 0; + while (!(i == preferences.end() || i->getName() == groupName)) + i++; + if (i != preferences.end()) + return &(*i); + else + return 0; } - string FGRunwayPreference::getId() { - return _ap->getId(); - }; +string FGRunwayPreference::getId() +{ + return _ap->getId(); +};