- //
- currRunwayGroup->setActive(_ap->getId(),
- windSpeed,
- windHeading,
- maxTail,
- maxCross,
- currentlyActive);
-
- // Note that I SHOULD keep multiple lists in memory, one for
- // general aviation, one for commercial and one for military
- // traffic.
- currentlyActive->clear();
- nrActiveRunways = currRunwayGroup->getNrActiveRunways();
- //cerr << "Choosing runway for " << trafficType << endl;
- for (int i = 0; i < nrActiveRunways; i++)
- {
- type = "unknown"; // initialize to something other than landing or takeoff
- currRunwayGroup->getActive(i, name, type);
- if (type == "landing")
- {
- landing.push_back(name);
- currentlyActive->push_back(name);
- //cerr << "Landing " << name << endl;
- }
- if (type == "takeoff")
- {
- takeoff.push_back(name);
- currentlyActive->push_back(name);
- //cerr << "takeoff " << name << endl;
- }
- }
- //cerr << endl;
- }
- if (action == 1) // takeoff
- {
- int nr = takeoff.size();
- if (nr)
- {
- // Note that the randomization below, is just a placeholder to choose between
- // multiple active runways for this action. This should be
- // under ATC control.
- runway = takeoff[(rand() % nr)];
- }
- else
- { // Fallback
- runway = chooseRunwayFallback();
- }
- }
- if (action == 2) // landing
- {
- int nr = landing.size();
- if (nr)
- {
- runway = landing[(rand() % nr)];
- }
- else
- { //fallback
- runway = chooseRunwayFallback();
- }
- }
- //runway = globals->get_runways()->search(_ap->getId(), int(windHeading));
- //cerr << "Seleceted runway: " << runway << endl;
+
+ //cerr << "Durrently active selection for " << trafficType << ": ";
+ for (stringVecIterator it = currentlyActive->begin();
+ it != currentlyActive->end(); it++) {
+ //cerr << (*it) << " ";
+ }
+ //cerr << endl;
+
+ currRunwayGroup->setActive(_ap,
+ windSpeed,
+ windHeading,
+ maxTail, maxCross, currentlyActive);
+
+ // Note that I SHOULD keep multiple lists in memory, one for
+ // general aviation, one for commercial and one for military
+ // traffic.
+ currentlyActive->clear();
+ nrActiveRunways = currRunwayGroup->getNrActiveRunways();
+ //cerr << "Choosing runway for " << trafficType << endl;
+ for (int i = 0; i < nrActiveRunways; i++) {
+ type = "unknown"; // initialize to something other than landing or takeoff
+ currRunwayGroup->getActive(i, name, type);
+ if (type == "landing") {
+ landing.push_back(name);
+ currentlyActive->push_back(name);
+ //cerr << "Landing " << name << endl;
+ }
+ if (type == "takeoff") {
+ takeoff.push_back(name);
+ currentlyActive->push_back(name);
+ //cerr << "takeoff " << name << endl;
+ }
+ }
+ //cerr << endl;
+ }
+
+ if (action == 1) // takeoff
+ {
+ int nr = takeoff.size();
+ if (nr) {
+ // Note that the randomization below, is just a placeholder to choose between
+ // multiple active runways for this action. This should be
+ // under ATC control.
+ runway = chooseRwyByHeading(takeoff, heading);
+ } else { // Fallback
+ runway = chooseRunwayFallback();
+ }
+ }
+
+ if (action == 2) // landing
+ {
+ int nr = landing.size();
+ if (nr) {
+ runway = chooseRwyByHeading(landing, heading);
+ } else { //fallback
+ runway = chooseRunwayFallback();
+ }
+ }
+
+ return true;
+}
+
+string FGAirportDynamics::chooseRwyByHeading(stringVec rwys,
+ double heading)
+{
+ double bestError = 360.0;
+ double rwyHeading, headingError;
+ string runway;
+ for (stringVecIterator i = rwys.begin(); i != rwys.end(); i++) {
+ if (!_ap->hasRunwayWithIdent(*i)) {
+ SG_LOG(SG_ATC, SG_WARN, "chooseRwyByHeading: runway " << *i <<
+ " not found at " << _ap->ident());
+ continue;
+ }
+
+ FGRunway *rwy = _ap->getRunwayByIdent((*i));
+ rwyHeading = rwy->headingDeg();
+ headingError = fabs(heading - rwyHeading);
+ if (headingError > 180)
+ headingError = fabs(headingError - 360);
+ if (headingError < bestError) {
+ runway = (*i);
+ bestError = headingError;
+ }
+ }
+ //cerr << "Using active runway " << runway << " for heading " << heading << endl;
+ return runway;
+}
+
+void FGAirportDynamics::getActiveRunway(const string & trafficType,
+ int action, string & runway,
+ double heading)
+{
+ bool ok = innerGetActiveRunway(trafficType, action, runway, heading);
+ if (!ok) {
+ runway = chooseRunwayFallback();