From: James Turner Date: Thu, 21 Feb 2013 11:32:02 +0000 (+0000) Subject: Give the FGAirport class a sane filename. X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=1eb8ae1fbf43359eec09b99885a9280f529c86fb;p=flightgear.git Give the FGAirport class a sane filename. simple.[cxx|hxx] -> airport.[cxx|hxx] --- diff --git a/src/AIModel/AIAircraft.cxx b/src/AIModel/AIAircraft.cxx index b5ef24187..d8f07ba7f 100644 --- a/src/AIModel/AIAircraft.cxx +++ b/src/AIModel/AIAircraft.cxx @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include
#include diff --git a/src/AIModel/AIFlightPlan.cxx b/src/AIModel/AIFlightPlan.cxx index 5699a620c..ce20ea2b3 100644 --- a/src/AIModel/AIFlightPlan.cxx +++ b/src/AIModel/AIFlightPlan.cxx @@ -33,7 +33,7 @@ #include
#include
#include
-#include +#include #include #include #include diff --git a/src/AIModel/AIFlightPlanCreate.cxx b/src/AIModel/AIFlightPlanCreate.cxx index e9851862a..caad321e2 100644 --- a/src/AIModel/AIFlightPlanCreate.cxx +++ b/src/AIModel/AIFlightPlanCreate.cxx @@ -30,7 +30,7 @@ #include #include -#include +#include #include #include #include "AIAircraft.hxx" diff --git a/src/AIModel/AIFlightPlanCreateCruise.cxx b/src/AIModel/AIFlightPlanCreateCruise.cxx index 15c3d643f..beecef8eb 100644 --- a/src/AIModel/AIFlightPlanCreateCruise.cxx +++ b/src/AIModel/AIFlightPlanCreateCruise.cxx @@ -26,7 +26,7 @@ #include #include -#include +#include #include #include diff --git a/src/AIModel/AIFlightPlanCreatePushBack.cxx b/src/AIModel/AIFlightPlanCreatePushBack.cxx index d774f3b51..cb5ade5cc 100644 --- a/src/AIModel/AIFlightPlanCreatePushBack.cxx +++ b/src/AIModel/AIFlightPlanCreatePushBack.cxx @@ -27,7 +27,7 @@ #include -#include +#include #include #include diff --git a/src/AIModel/AIManager.cxx b/src/AIModel/AIManager.cxx index 3c5617247..3e28cd0be 100644 --- a/src/AIModel/AIManager.cxx +++ b/src/AIModel/AIManager.cxx @@ -29,7 +29,7 @@ #include #include
-#include +#include #include "AIManager.hxx" #include "AIAircraft.hxx" diff --git a/src/ATC/atc_mgr.cxx b/src/ATC/atc_mgr.cxx index 67d53c9fc..980e9df80 100644 --- a/src/ATC/atc_mgr.cxx +++ b/src/ATC/atc_mgr.cxx @@ -27,7 +27,7 @@ #include #include -#include +#include #include #include "atc_mgr.hxx" diff --git a/src/ATC/atcdialog.cxx b/src/ATC/atcdialog.cxx index 1bf0c9cdd..ad75f3001 100644 --- a/src/ATC/atcdialog.cxx +++ b/src/ATC/atcdialog.cxx @@ -41,7 +41,7 @@ #include
#include // mkDialog #include -#include +#include #include using std::string; diff --git a/src/ATC/trafficcontrol.cxx b/src/ATC/trafficcontrol.cxx index f35a02e88..137c68aeb 100644 --- a/src/ATC/trafficcontrol.cxx +++ b/src/ATC/trafficcontrol.cxx @@ -48,7 +48,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/ATCDCL/ATC.cxx b/src/ATCDCL/ATC.cxx index 9e868017b..223661974 100644 --- a/src/ATCDCL/ATC.cxx +++ b/src/ATCDCL/ATC.cxx @@ -33,7 +33,7 @@ #include
#include
#include -#include +#include FGATC::FGATC() : freq(0), diff --git a/src/ATCDCL/ATCutils.hxx b/src/ATCDCL/ATCutils.hxx index 38f0bda59..478ba7e9d 100644 --- a/src/ATCDCL/ATCutils.hxx +++ b/src/ATCDCL/ATCutils.hxx @@ -18,7 +18,7 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -#include +#include #include #include diff --git a/src/Airports/CMakeLists.txt b/src/Airports/CMakeLists.txt index 43f2a999f..f0cde69e7 100644 --- a/src/Airports/CMakeLists.txt +++ b/src/Airports/CMakeLists.txt @@ -13,7 +13,7 @@ set(SOURCES runwayprefs.cxx runways.cxx sidstar.cxx - simple.cxx + airport.cxx xmlloader.cxx ) @@ -30,7 +30,7 @@ set(HEADERS runwayprefs.hxx runways.hxx sidstar.hxx - simple.hxx + airport.hxx xmlloader.hxx ) diff --git a/src/Airports/airport.cxx b/src/Airports/airport.cxx new file mode 100644 index 000000000..ba85516dd --- /dev/null +++ b/src/Airports/airport.cxx @@ -0,0 +1,732 @@ +// +// simple.cxx -- a really simplistic class to manage airport ID, +// lat, lon of the center of one of it's runways, and +// elevation in feet. +// +// Written by Curtis Olson, started April 1998. +// Updated by Durk Talsma, started December, 2004. +// +// Copyright (C) 1998 Curtis L. Olson - http://www.flightgear.org/~curt +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +// $Id$ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "airport.hxx" + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include
+#include +#include +#include +#include +#include +#include +#include +#include + +using std::vector; +using std::pair; + +using namespace flightgear; + + +/*************************************************************************** + * FGAirport + ***************************************************************************/ + +AirportCache FGAirport::airportCache; + +FGAirport::FGAirport(PositionedID aGuid, const string &id, const SGGeod& location, + const string &name, bool has_metar, Type aType) : + FGPositioned(aGuid, aType, id, location), + _name(name), + _has_metar(has_metar), + _dynamics(0), + mTowerDataLoaded(false), + mRunwaysLoaded(false), + mTaxiwaysLoaded(false), + mProceduresLoaded(false), + mILSDataLoaded(false) +{ +} + + +FGAirport::~FGAirport() +{ + delete _dynamics; +} + +bool FGAirport::isAirport() const +{ + return type() == AIRPORT; +} + +bool FGAirport::isSeaport() const +{ + return type() == SEAPORT; +} + +bool FGAirport::isHeliport() const +{ + return type() == HELIPORT; +} + +bool FGAirport::isAirportType(FGPositioned* pos) +{ + if (!pos) { + return false; + } + + return (pos->type() >= AIRPORT) && (pos->type() <= SEAPORT); +} + +FGAirportDynamics * FGAirport::getDynamics() +{ + if (_dynamics) { + return _dynamics; + } + + _dynamics = new FGAirportDynamics(this); + XMLLoader::load(_dynamics); + _dynamics->init(); + + FGRunwayPreference rwyPrefs(this); + XMLLoader::load(&rwyPrefs); + _dynamics->setRwyUse(rwyPrefs); + + return _dynamics; +} + +unsigned int FGAirport::numRunways() const +{ + loadRunways(); + return mRunways.size(); +} + +unsigned int FGAirport::numHelipads() const +{ + loadHelipads(); + return mHelipads.size(); +} + +FGRunway* FGAirport::getRunwayByIndex(unsigned int aIndex) const +{ + loadRunways(); + + assert(aIndex >= 0 && aIndex < mRunways.size()); + return (FGRunway*) flightgear::NavDataCache::instance()->loadById(mRunways[aIndex]); +} + +FGHelipad* FGAirport::getHelipadByIndex(unsigned int aIndex) const +{ + loadHelipads(); + + assert(aIndex >= 0 && aIndex < mHelipads.size()); + return (FGHelipad*) flightgear::NavDataCache::instance()->loadById(mHelipads[aIndex]); +} + +bool FGAirport::hasRunwayWithIdent(const string& aIdent) const +{ + return flightgear::NavDataCache::instance()->airportItemWithIdent(guid(), FGPositioned::RUNWAY, aIdent) != 0; +} + +FGRunway* FGAirport::getRunwayByIdent(const string& aIdent) const +{ + PositionedID id = flightgear::NavDataCache::instance()->airportItemWithIdent(guid(), FGPositioned::RUNWAY, aIdent); + if (id == 0) { + SG_LOG(SG_GENERAL, SG_ALERT, "no such runway '" << aIdent << "' at airport " << ident()); + throw sg_range_exception("unknown runway " + aIdent + " at airport:" + ident(), "FGAirport::getRunwayByIdent"); + } + + return (FGRunway*) flightgear::NavDataCache::instance()->loadById(id); +} + + +FGRunway* FGAirport::findBestRunwayForHeading(double aHeading) const +{ + loadRunways(); + + FGRunway* result = NULL; + double currentBestQuality = 0.0; + + SGPropertyNode *param = fgGetNode("/sim/airport/runways/search", true); + double lengthWeight = param->getDoubleValue("length-weight", 0.01); + double widthWeight = param->getDoubleValue("width-weight", 0.01); + double surfaceWeight = param->getDoubleValue("surface-weight", 10); + double deviationWeight = param->getDoubleValue("deviation-weight", 1); + + BOOST_FOREACH(PositionedID id, mRunways) { + FGRunway* rwy = (FGRunway*) flightgear::NavDataCache::instance()->loadById(id); + double good = rwy->score(lengthWeight, widthWeight, surfaceWeight); + double dev = aHeading - rwy->headingDeg(); + SG_NORMALIZE_RANGE(dev, -180.0, 180.0); + double bad = fabs(deviationWeight * dev) + 1e-20; + double quality = good / bad; + + if (quality > currentBestQuality) { + currentBestQuality = quality; + result = rwy; + } + } + + return result; +} + +FGRunway* FGAirport::findBestRunwayForPos(const SGGeod& aPos) const +{ + loadRunways(); + + FGRunway* result = NULL; + double currentLowestDev = 180.0; + + BOOST_FOREACH(PositionedID id, mRunways) { + FGRunway* rwy = (FGRunway*) flightgear::NavDataCache::instance()->loadById(id); + + double inboundCourse = SGGeodesy::courseDeg(aPos, rwy->end()); + double dev = inboundCourse - rwy->headingDeg(); + SG_NORMALIZE_RANGE(dev, -180.0, 180.0); + + dev = fabs(dev); + if (dev < currentLowestDev) { // new best match + currentLowestDev = dev; + result = rwy; + } + } // of runway iteration + + return result; + +} + +bool FGAirport::hasHardRunwayOfLengthFt(double aLengthFt) const +{ + loadRunways(); + + BOOST_FOREACH(PositionedID id, mRunways) { + FGRunway* rwy = (FGRunway*) flightgear::NavDataCache::instance()->loadById(id); + + if (rwy->isReciprocal()) { + continue; // we only care about lengths, so don't do work twice + } + + if (rwy->isHardSurface() && (rwy->lengthFt() >= aLengthFt)) { + return true; // we're done! + } + } // of runways iteration + + return false; +} + +unsigned int FGAirport::numTaxiways() const +{ + loadTaxiways(); + return mTaxiways.size(); +} + +FGTaxiway* FGAirport::getTaxiwayByIndex(unsigned int aIndex) const +{ + loadTaxiways(); + + assert(aIndex >= 0 && aIndex < mTaxiways.size()); + return (FGTaxiway*) flightgear::NavDataCache::instance()->loadById(mTaxiways[aIndex]); +} + +unsigned int FGAirport::numPavements() const +{ + loadTaxiways(); + return mPavements.size(); +} + +FGPavement* FGAirport::getPavementByIndex(unsigned int aIndex) const +{ + loadTaxiways(); + assert(aIndex >= 0 && aIndex < mPavements.size()); + return (FGPavement*) flightgear::NavDataCache::instance()->loadById(mPavements[aIndex]); +} + +FGRunway* FGAirport::getActiveRunwayForUsage() const +{ + FGEnvironmentMgr* envMgr = (FGEnvironmentMgr *) globals->get_subsystem("environment"); + + // This forces West-facing rwys to be used in no-wind situations + // which is consistent with Flightgear's initial setup. + double hdg = 270; + + if (envMgr) { + FGEnvironment stationWeather(envMgr->getEnvironment(mPosition)); + + double windSpeed = stationWeather.get_wind_speed_kt(); + if (windSpeed > 0.0) { + hdg = stationWeather.get_wind_from_heading_deg(); + } + } + + return findBestRunwayForHeading(hdg); +} + +FGAirport* FGAirport::findClosest(const SGGeod& aPos, double aCuttofNm, Filter* filter) +{ + AirportFilter aptFilter; + if (filter == NULL) { + filter = &aptFilter; + } + + FGPositionedRef r = FGPositioned::findClosest(aPos, aCuttofNm, filter); + if (!r) { + return NULL; + } + + return static_cast(r.ptr()); +} + +FGAirport::HardSurfaceFilter::HardSurfaceFilter(double minLengthFt) : + mMinLengthFt(minLengthFt) +{ + if (minLengthFt < 0.0) { + mMinLengthFt = fgGetDouble("/sim/navdb/min-runway-length-ft", 0.0); + } +} + +bool FGAirport::HardSurfaceFilter::passAirport(FGAirport* aApt) const +{ + return aApt->hasHardRunwayOfLengthFt(mMinLengthFt); +} + +FGAirport* FGAirport::findByIdent(const std::string& aIdent) +{ + AirportCache::iterator it = airportCache.find(aIdent); + if (it != airportCache.end()) + return it->second; + + PortsFilter filter; + FGAirport* r = static_cast (FGPositioned::findFirstWithIdent(aIdent, &filter).get()); + + // add airport to the cache (even when it's NULL, so we don't need to search in vain again) + airportCache[aIdent] = r; + + // we don't warn here when r==NULL, let the caller do that + return r; +} + +FGAirport* FGAirport::getByIdent(const std::string& aIdent) +{ + FGAirport* r = findByIdent(aIdent); + if (!r) + throw sg_range_exception("No such airport with ident: " + aIdent); + return r; +} + +char** FGAirport::searchNamesAndIdents(const std::string& aFilter) +{ + return NavDataCache::instance()->searchAirportNamesAndIdents(aFilter); +} + +// find basic airport location info from airport database +const FGAirport *fgFindAirportID( const string& id) +{ + if ( id.empty() ) { + return NULL; + } + + return FGAirport::findByIdent(id); +} + +void FGAirport::loadRunways() const +{ + if (mRunwaysLoaded) { + return; // already loaded, great + } + + loadSceneryDefinitions(); + + mRunwaysLoaded = true; + mRunways = flightgear::NavDataCache::instance()->airportItemsOfType(guid(), FGPositioned::RUNWAY); +} + +void FGAirport::loadHelipads() const +{ + if (mHelipadsLoaded) { + return; // already loaded, great + } + + loadSceneryDefinitions(); + + mHelipadsLoaded = true; + mHelipads = flightgear::NavDataCache::instance()->airportItemsOfType(guid(), FGPositioned::HELIPAD); +} + +void FGAirport::loadTaxiways() const +{ + if (mTaxiwaysLoaded) { + return; // already loaded, great + } + + mTaxiwaysLoaded = true; + mTaxiways = flightgear::NavDataCache::instance()->airportItemsOfType(guid(), FGPositioned::TAXIWAY); +} + +void FGAirport::loadProcedures() const +{ + if (mProceduresLoaded) { + return; + } + + mProceduresLoaded = true; + SGPath path; + if (!XMLLoader::findAirportData(ident(), "procedures", path)) { + SG_LOG(SG_GENERAL, SG_INFO, "no procedures data available for " << ident()); + return; + } + + SG_LOG(SG_GENERAL, SG_INFO, ident() << ": loading procedures from " << path.str()); + RouteBase::loadAirportProcedures(path, const_cast(this)); +} + +void FGAirport::loadSceneryDefinitions() const +{ + NavDataCache* cache = NavDataCache::instance(); + SGPath path; + if (!XMLLoader::findAirportData(ident(), "threshold", path)) { + return; // no XML threshold data + } + + if (!cache->isCachedFileModified(path)) { + // cached values are correct, we're all done + return; + } + + flightgear::NavDataCache::Transaction txn(cache); + SGPropertyNode_ptr rootNode = new SGPropertyNode; + readProperties(path.str(), rootNode); + const_cast(this)->readThresholdData(rootNode); + cache->stampCacheFile(path); + txn.commit(); +} + +void FGAirport::readThresholdData(SGPropertyNode* aRoot) +{ + SGPropertyNode* runway; + int runwayIndex = 0; + for (; (runway = aRoot->getChild("runway", runwayIndex)) != NULL; ++runwayIndex) { + SGPropertyNode* t0 = runway->getChild("threshold", 0), + *t1 = runway->getChild("threshold", 1); + assert(t0); + assert(t1); // too strict? maybe we should finally allow single-ended runways + + processThreshold(t0); + processThreshold(t1); + } // of runways iteration +} + +void FGAirport::processThreshold(SGPropertyNode* aThreshold) +{ + // first, let's identify the current runway + string rwyIdent(aThreshold->getStringValue("rwy")); + NavDataCache* cache = NavDataCache::instance(); + PositionedID id = cache->airportItemWithIdent(guid(), FGPositioned::RUNWAY, rwyIdent); + if (id == 0) { + SG_LOG(SG_GENERAL, SG_DEBUG, "FGAirport::processThreshold: " + "found runway not defined in the global data:" << ident() << "/" << rwyIdent); + return; + } + + double lon = aThreshold->getDoubleValue("lon"), + lat = aThreshold->getDoubleValue("lat"); + SGGeod newThreshold(SGGeod::fromDegM(lon, lat, mPosition.getElevationM())); + + double newHeading = aThreshold->getDoubleValue("hdg-deg"); + double newDisplacedThreshold = aThreshold->getDoubleValue("displ-m") * SG_METER_TO_FEET; + double newStopway = aThreshold->getDoubleValue("stopw-m") * SG_METER_TO_FEET; + + cache->updateRunwayThreshold(id, newThreshold, + newHeading, newDisplacedThreshold, newStopway); +} + +SGGeod FGAirport::getTowerLocation() const +{ + validateTowerData(); + + NavDataCache* cache = NavDataCache::instance(); + PositionedIDVec towers = cache->airportItemsOfType(guid(), FGPositioned::TOWER); + if (towers.empty()) { + SG_LOG(SG_GENERAL, SG_ALERT, "No towers defined for:" <loadById(towers.front()); + return tower->geod(); +} + +void FGAirport::validateTowerData() const +{ + if (mTowerDataLoaded) { + return; + } + + mTowerDataLoaded = true; + NavDataCache* cache = NavDataCache::instance(); + SGPath path; + if (!XMLLoader::findAirportData(ident(), "twr", path)) { + return; // no XML tower data + } + + if (!cache->isCachedFileModified(path)) { + // cached values are correct, we're all done + return; + } + + flightgear::NavDataCache::Transaction txn(cache); + SGPropertyNode_ptr rootNode = new SGPropertyNode; + readProperties(path.str(), rootNode); + const_cast(this)->readTowerData(rootNode); + cache->stampCacheFile(path); + txn.commit(); +} + +void FGAirport::readTowerData(SGPropertyNode* aRoot) +{ + SGPropertyNode* twrNode = aRoot->getChild("tower")->getChild("twr"); + double lat = twrNode->getDoubleValue("lat"), + lon = twrNode->getDoubleValue("lon"), + elevM = twrNode->getDoubleValue("elev-m"); +// tower elevation is AGL, not AMSL. Since we don't want to depend on the +// scenery for a precise terrain elevation, we use the field elevation +// (this is also what the apt.dat code does) + double fieldElevationM = geod().getElevationM(); + SGGeod towerLocation(SGGeod::fromDegM(lon, lat, fieldElevationM + elevM)); + + NavDataCache* cache = NavDataCache::instance(); + PositionedIDVec towers = cache->airportItemsOfType(guid(), FGPositioned::TOWER); + if (towers.empty()) { + cache->insertTower(guid(), towerLocation); + } else { + // update the position + cache->updatePosition(towers.front(), towerLocation); + } +} + +bool FGAirport::validateILSData() +{ + if (mILSDataLoaded) { + return false; + } + + mILSDataLoaded = true; + NavDataCache* cache = NavDataCache::instance(); + SGPath path; + if (!XMLLoader::findAirportData(ident(), "ils", path)) { + return false; // no XML tower data + } + + if (!cache->isCachedFileModified(path)) { + // cached values are correct, we're all done + return false; + } + + SGPropertyNode_ptr rootNode = new SGPropertyNode; + readProperties(path.str(), rootNode); + + flightgear::NavDataCache::Transaction txn(cache); + readILSData(rootNode); + cache->stampCacheFile(path); + txn.commit(); + +// we loaded data, tell the caller it might need to reload things + return true; +} + +void FGAirport::readILSData(SGPropertyNode* aRoot) +{ + NavDataCache* cache = NavDataCache::instance(); + + // find the entry matching the runway + SGPropertyNode* runwayNode, *ilsNode; + for (int i=0; (runwayNode = aRoot->getChild("runway", i)) != NULL; ++i) { + for (int j=0; (ilsNode = runwayNode->getChild("ils", j)) != NULL; ++j) { + // must match on both nav-ident and runway ident, to support the following: + // - runways with multiple distinct ILS installations (KEWD, for example) + // - runways where both ends share the same nav ident (LFAT, for example) + PositionedID ils = cache->findILS(guid(), ilsNode->getStringValue("rwy"), + ilsNode->getStringValue("nav-id")); + if (ils == 0) { + SG_LOG(SG_GENERAL, SG_INFO, "reading ILS data for " << ident() << + ", couldn;t find runway/navaid for:" << + ilsNode->getStringValue("rwy") << "/" << + ilsNode->getStringValue("nav-id")); + continue; + } + + double hdgDeg = ilsNode->getDoubleValue("hdg-deg"), + lon = ilsNode->getDoubleValue("lon"), + lat = ilsNode->getDoubleValue("lat"), + elevM = ilsNode->getDoubleValue("elev-m"); + + cache->updateILS(ils, SGGeod::fromDegM(lon, lat, elevM), hdgDeg); + } // of ILS iteration + } // of runway iteration +} + +void FGAirport::addSID(flightgear::SID* aSid) +{ + mSIDs.push_back(aSid); +} + +void FGAirport::addSTAR(STAR* aStar) +{ + mSTARs.push_back(aStar); +} + +void FGAirport::addApproach(Approach* aApp) +{ + mApproaches.push_back(aApp); +} + +unsigned int FGAirport::numSIDs() const +{ + loadProcedures(); + return mSIDs.size(); +} + +flightgear::SID* FGAirport::getSIDByIndex(unsigned int aIndex) const +{ + loadProcedures(); + return mSIDs[aIndex]; +} + +flightgear::SID* FGAirport::findSIDWithIdent(const std::string& aIdent) const +{ + loadProcedures(); + for (unsigned int i=0; iident() == aIdent) { + return mSIDs[i]; + } + } + + return NULL; +} + +unsigned int FGAirport::numSTARs() const +{ + loadProcedures(); + return mSTARs.size(); +} + +STAR* FGAirport::getSTARByIndex(unsigned int aIndex) const +{ + loadProcedures(); + return mSTARs[aIndex]; +} + +STAR* FGAirport::findSTARWithIdent(const std::string& aIdent) const +{ + loadProcedures(); + for (unsigned int i=0; iident() == aIdent) { + return mSTARs[i]; + } + } + + return NULL; +} + +unsigned int FGAirport::numApproaches() const +{ + loadProcedures(); + return mApproaches.size(); +} + +Approach* FGAirport::getApproachByIndex(unsigned int aIndex) const +{ + loadProcedures(); + return mApproaches[aIndex]; +} + +Approach* FGAirport::findApproachWithIdent(const std::string& aIdent) const +{ + loadProcedures(); + for (unsigned int i=0; iident() == aIdent) { + return mApproaches[i]; + } + } + + return NULL; +} + +CommStationList +FGAirport::commStations() const +{ + NavDataCache* cache = NavDataCache::instance(); + CommStationList result; + BOOST_FOREACH(PositionedID pos, cache->airportItemsOfType(guid(), + FGPositioned::FREQ_GROUND, + FGPositioned::FREQ_UNICOM)) + { + result.push_back((CommStation*) cache->loadById(pos)); + } + + return result; +} + +CommStationList +FGAirport::commStationsOfType(FGPositioned::Type aTy) const +{ + NavDataCache* cache = NavDataCache::instance(); + CommStationList result; + BOOST_FOREACH(PositionedID pos, cache->airportItemsOfType(guid(), aTy)) { + result.push_back((CommStation*) cache->loadById(pos)); + } + + return result; +} + +// get airport elevation +double fgGetAirportElev( const string& id ) +{ + const FGAirport *a=fgFindAirportID( id); + if (a) { + return a->getElevation(); + } else { + return -9999.0; + } +} + + +// get airport position +SGGeod fgGetAirportPos( const string& id ) +{ + const FGAirport *a = fgFindAirportID( id); + + if (a) { + return SGGeod::fromDegM(a->getLongitude(), a->getLatitude(), a->getElevation()); + } else { + return SGGeod::fromDegM(0.0, 0.0, -9999.0); + } +} diff --git a/src/Airports/airport.hxx b/src/Airports/airport.hxx new file mode 100644 index 000000000..b58b2f345 --- /dev/null +++ b/src/Airports/airport.hxx @@ -0,0 +1,293 @@ +// airport.hxx -- a really simplistic class to manage airport ID, +// lat, lon of the center of one of it's runways, and +// elevation in feet. +// +// Written by Curtis Olson, started April 1998. +// Updated by Durk Talsma, started December 2004. +// +// Copyright (C) 1998 Curtis L. Olson - http://www.flightgear.org/~curt +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +// $Id$ + + +#ifndef _FG_SIMPLE_HXX +#define _FG_SIMPLE_HXX + +#include + +#include +#include +#include + +#include + +// forward decls +class FGAirportDynamics; +class FGRunway; +class FGHelipad; +class FGTaxiway; +class FGPavement; +class SGPropertyNode; +class FGAirport; + +namespace flightgear { + class SID; + class STAR; + class Approach; + class Waypt; + class CommStation; + + typedef SGSharedPtr WayptRef; + typedef std::vector WayptVec; + + typedef std::vector CommStationList; + typedef std::map AirportCache; +} + + + +/*************************************************************************************** + * + **************************************************************************************/ +class FGAirport : public FGPositioned +{ +public: + FGAirport(PositionedID aGuid, const std::string& id, const SGGeod& location, + const std::string& name, bool has_metar, Type aType); + ~FGAirport(); + + const std::string& getId() const { return ident(); } + const std::string& getName() const { return _name; } + double getLongitude() const { return longitude(); } + // Returns degrees + double getLatitude() const { return latitude(); } + // Returns ft + double getElevation() const { return elevation(); } + bool getMetar() const { return _has_metar; } + bool isAirport() const; + bool isSeaport() const; + bool isHeliport() const; + + static bool isAirportType(FGPositioned* pos); + + virtual const std::string& name() const + { return _name; } + + /** + * reload the ILS data from XML if required. + * @result true if the data was refreshed, false if no data was loaded + * or previously cached data is still correct. + */ + bool validateILSData(); + + SGGeod getTowerLocation() const; + + void setMetar(bool value) { _has_metar = value; } + + FGRunway* getActiveRunwayForUsage() const; + + FGAirportDynamics *getDynamics(); + + unsigned int numRunways() const; + unsigned int numHelipads() const; + FGRunway* getRunwayByIndex(unsigned int aIndex) const; + FGHelipad* getHelipadByIndex(unsigned int aIndex) const; + + bool hasRunwayWithIdent(const std::string& aIdent) const; + FGRunway* getRunwayByIdent(const std::string& aIdent) const; + FGRunway* findBestRunwayForHeading(double aHeading) const; + + /** + * return the most likely target runway based on a position. + * Specifically, return the runway for which the course from aPos + * to the runway end, mostly closely matches the runway heading. + * This is a good approximation of which runway the position is on or + * aiming towards. + */ + FGRunway* findBestRunwayForPos(const SGGeod& aPos) const; + + /** + * Useful predicate for FMS/GPS/NAV displays and similar - check if this + * aiport has a hard-surfaced runway of at least the specified length. + */ + bool hasHardRunwayOfLengthFt(double aLengthFt) const; + + unsigned int numTaxiways() const; + FGTaxiway* getTaxiwayByIndex(unsigned int aIndex) const; + + unsigned int numPavements() const; + FGPavement* getPavementByIndex(unsigned int aIndex) const; + + class AirportFilter : public Filter + { + public: + virtual bool pass(FGPositioned* aPos) const { + return passAirport(static_cast(aPos)); + } + + virtual Type minType() const { + return AIRPORT; + } + + virtual Type maxType() const { + return AIRPORT; + } + + virtual bool passAirport(FGAirport* aApt) const { + return true; + } + }; + + /** + * Filter which passes heliports and seaports in addition to airports + */ + class PortsFilter : public AirportFilter + { + public: + virtual Type maxType() const { + return SEAPORT; + } + }; + + class HardSurfaceFilter : public AirportFilter + { + public: + HardSurfaceFilter(double minLengthFt = -1); + + virtual bool passAirport(FGAirport* aApt) const; + + private: + double mMinLengthFt; + }; + + + void setProcedures(const std::vector& aSids, + const std::vector& aStars, + const std::vector& aApproaches); + + void addSID(flightgear::SID* aSid); + void addSTAR(flightgear::STAR* aStar); + void addApproach(flightgear::Approach* aApp); + + unsigned int numSIDs() const; + flightgear::SID* getSIDByIndex(unsigned int aIndex) const; + flightgear::SID* findSIDWithIdent(const std::string& aIdent) const; + + unsigned int numSTARs() const; + flightgear::STAR* getSTARByIndex(unsigned int aIndex) const; + flightgear::STAR* findSTARWithIdent(const std::string& aIdent) const; + + unsigned int numApproaches() const; + flightgear::Approach* getApproachByIndex(unsigned int aIndex) const; + flightgear::Approach* findApproachWithIdent(const std::string& aIdent) const; + + /** + * Syntactic wrapper around FGPositioned::findClosest - find the closest + * match for filter, and return it cast to FGAirport. The default filter + * passes airports, but not seaports or heliports + */ + static FGAirport* findClosest(const SGGeod& aPos, double aCuttofNm, Filter* filter = NULL); + + /** + * Helper to look up an FGAirport instance by unique ident. Throws an + * exception if the airport could not be found - so callers can assume + * the result is non-NULL. + */ + static FGAirport* getByIdent(const std::string& aIdent); + + /** + * Helper to look up an FGAirport instance by unique ident. Returns NULL + * if the airport could not be found. + */ + static FGAirport* findByIdent(const std::string& aIdent); + + /** + * Specialised helper to implement the AirportList dialog. Performs a + * case-insensitive search on airport names and ICAO codes, and returns + * matches in a format suitable for use by a puaList. + */ + static char** searchNamesAndIdents(const std::string& aFilter); + + flightgear::CommStationList commStationsOfType(FGPositioned::Type aTy) const; + + flightgear::CommStationList commStations() const; +private: + static flightgear::AirportCache airportCache; + + // disable these + FGAirport operator=(FGAirport &other); + FGAirport(const FGAirport&); + + /** + * helper to read airport data from the scenery XML files. + */ + void loadSceneryDefinitions() const; + + /** + * Helpers to process property data loaded from an ICAO.threshold.xml file + */ + void readThresholdData(SGPropertyNode* aRoot); + void processThreshold(SGPropertyNode* aThreshold); + + void readILSData(SGPropertyNode* aRoot); + + void validateTowerData() const; + + /** + * Helper to parse property data loaded from an ICAO.twr.xml file + */ + void readTowerData(SGPropertyNode* aRoot); + + std::string _name; + bool _has_metar; + FGAirportDynamics *_dynamics; + + void loadRunways() const; + void loadHelipads() const; + void loadTaxiways() const; + void loadProcedures() const; + + mutable bool mTowerDataLoaded; + mutable bool mRunwaysLoaded; + mutable bool mHelipadsLoaded; + mutable bool mTaxiwaysLoaded; + mutable bool mProceduresLoaded; + bool mILSDataLoaded; + + mutable PositionedIDVec mRunways; + mutable PositionedIDVec mHelipads; + mutable PositionedIDVec mTaxiways; + PositionedIDVec mPavements; + + typedef SGSharedPtr SIDRef; + typedef SGSharedPtr STARRef; + typedef SGSharedPtr ApproachRef; + + std::vector mSIDs; + std::vector mSTARs; + std::vector mApproaches; + }; + +// find basic airport location info from airport database +const FGAirport *fgFindAirportID( const std::string& id); + +// get airport elevation +double fgGetAirportElev( const std::string& id ); + +#endif // _FG_SIMPLE_HXX + + diff --git a/src/Airports/apt_loader.cxx b/src/Airports/apt_loader.cxx index c223890fc..f4ad7793a 100644 --- a/src/Airports/apt_loader.cxx +++ b/src/Airports/apt_loader.cxx @@ -43,7 +43,7 @@ #include -#include "simple.hxx" +#include "airport.hxx" #include "runways.hxx" #include "pavement.hxx" #include diff --git a/src/Airports/dynamicloader.cxx b/src/Airports/dynamicloader.cxx index bf9335ae3..d35891b0d 100644 --- a/src/Airports/dynamicloader.cxx +++ b/src/Airports/dynamicloader.cxx @@ -25,7 +25,7 @@ #include #include -#include +#include /***************************************************************************** * Helper function for parsing position string diff --git a/src/Airports/dynamics.cxx b/src/Airports/dynamics.cxx index d505d580c..3c45a1c45 100644 --- a/src/Airports/dynamics.cxx +++ b/src/Airports/dynamics.cxx @@ -42,7 +42,7 @@ #include #include -#include "simple.hxx" +#include "airport.hxx" #include "dynamics.hxx" using std::string; diff --git a/src/Airports/groundnetwork.cxx b/src/Airports/groundnetwork.cxx index 62d229f68..3ea86f979 100644 --- a/src/Airports/groundnetwork.cxx +++ b/src/Airports/groundnetwork.cxx @@ -43,7 +43,7 @@ #include #include -#include +#include #include #include diff --git a/src/Airports/runwayprefs.cxx b/src/Airports/runwayprefs.cxx index fac1807fb..2a2fceb0f 100644 --- a/src/Airports/runwayprefs.cxx +++ b/src/Airports/runwayprefs.cxx @@ -36,7 +36,7 @@ #include #include "runwayprefs.hxx" -#include "simple.hxx" +#include "airport.hxx" /****************************************************************************** * ScheduleTime diff --git a/src/Airports/runways.cxx b/src/Airports/runways.cxx index 753eaf0d5..72fb1609d 100644 --- a/src/Airports/runways.cxx +++ b/src/Airports/runways.cxx @@ -37,7 +37,7 @@ #include "runways.hxx" -#include +#include #include #include #include diff --git a/src/Airports/sidstar.cxx b/src/Airports/sidstar.cxx index e19ff1925..93360b432 100644 --- a/src/Airports/sidstar.cxx +++ b/src/Airports/sidstar.cxx @@ -30,7 +30,7 @@ -#include +#include #include "sidstar.hxx" diff --git a/src/Airports/simple.cxx b/src/Airports/simple.cxx deleted file mode 100644 index 1ed7e9934..000000000 --- a/src/Airports/simple.cxx +++ /dev/null @@ -1,732 +0,0 @@ -// -// simple.cxx -- a really simplistic class to manage airport ID, -// lat, lon of the center of one of it's runways, and -// elevation in feet. -// -// Written by Curtis Olson, started April 1998. -// Updated by Durk Talsma, started December, 2004. -// -// Copyright (C) 1998 Curtis L. Olson - http://www.flightgear.org/~curt -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -// -// $Id$ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include "simple.hxx" - -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include
-#include -#include -#include -#include -#include -#include -#include -#include - -using std::vector; -using std::pair; - -using namespace flightgear; - - -/*************************************************************************** - * FGAirport - ***************************************************************************/ - -AirportCache FGAirport::airportCache; - -FGAirport::FGAirport(PositionedID aGuid, const string &id, const SGGeod& location, - const string &name, bool has_metar, Type aType) : - FGPositioned(aGuid, aType, id, location), - _name(name), - _has_metar(has_metar), - _dynamics(0), - mTowerDataLoaded(false), - mRunwaysLoaded(false), - mTaxiwaysLoaded(false), - mProceduresLoaded(false), - mILSDataLoaded(false) -{ -} - - -FGAirport::~FGAirport() -{ - delete _dynamics; -} - -bool FGAirport::isAirport() const -{ - return type() == AIRPORT; -} - -bool FGAirport::isSeaport() const -{ - return type() == SEAPORT; -} - -bool FGAirport::isHeliport() const -{ - return type() == HELIPORT; -} - -bool FGAirport::isAirportType(FGPositioned* pos) -{ - if (!pos) { - return false; - } - - return (pos->type() >= AIRPORT) && (pos->type() <= SEAPORT); -} - -FGAirportDynamics * FGAirport::getDynamics() -{ - if (_dynamics) { - return _dynamics; - } - - _dynamics = new FGAirportDynamics(this); - XMLLoader::load(_dynamics); - _dynamics->init(); - - FGRunwayPreference rwyPrefs(this); - XMLLoader::load(&rwyPrefs); - _dynamics->setRwyUse(rwyPrefs); - - return _dynamics; -} - -unsigned int FGAirport::numRunways() const -{ - loadRunways(); - return mRunways.size(); -} - -unsigned int FGAirport::numHelipads() const -{ - loadHelipads(); - return mHelipads.size(); -} - -FGRunway* FGAirport::getRunwayByIndex(unsigned int aIndex) const -{ - loadRunways(); - - assert(aIndex >= 0 && aIndex < mRunways.size()); - return (FGRunway*) flightgear::NavDataCache::instance()->loadById(mRunways[aIndex]); -} - -FGHelipad* FGAirport::getHelipadByIndex(unsigned int aIndex) const -{ - loadHelipads(); - - assert(aIndex >= 0 && aIndex < mHelipads.size()); - return (FGHelipad*) flightgear::NavDataCache::instance()->loadById(mHelipads[aIndex]); -} - -bool FGAirport::hasRunwayWithIdent(const string& aIdent) const -{ - return flightgear::NavDataCache::instance()->airportItemWithIdent(guid(), FGPositioned::RUNWAY, aIdent) != 0; -} - -FGRunway* FGAirport::getRunwayByIdent(const string& aIdent) const -{ - PositionedID id = flightgear::NavDataCache::instance()->airportItemWithIdent(guid(), FGPositioned::RUNWAY, aIdent); - if (id == 0) { - SG_LOG(SG_GENERAL, SG_ALERT, "no such runway '" << aIdent << "' at airport " << ident()); - throw sg_range_exception("unknown runway " + aIdent + " at airport:" + ident(), "FGAirport::getRunwayByIdent"); - } - - return (FGRunway*) flightgear::NavDataCache::instance()->loadById(id); -} - - -FGRunway* FGAirport::findBestRunwayForHeading(double aHeading) const -{ - loadRunways(); - - FGRunway* result = NULL; - double currentBestQuality = 0.0; - - SGPropertyNode *param = fgGetNode("/sim/airport/runways/search", true); - double lengthWeight = param->getDoubleValue("length-weight", 0.01); - double widthWeight = param->getDoubleValue("width-weight", 0.01); - double surfaceWeight = param->getDoubleValue("surface-weight", 10); - double deviationWeight = param->getDoubleValue("deviation-weight", 1); - - BOOST_FOREACH(PositionedID id, mRunways) { - FGRunway* rwy = (FGRunway*) flightgear::NavDataCache::instance()->loadById(id); - double good = rwy->score(lengthWeight, widthWeight, surfaceWeight); - double dev = aHeading - rwy->headingDeg(); - SG_NORMALIZE_RANGE(dev, -180.0, 180.0); - double bad = fabs(deviationWeight * dev) + 1e-20; - double quality = good / bad; - - if (quality > currentBestQuality) { - currentBestQuality = quality; - result = rwy; - } - } - - return result; -} - -FGRunway* FGAirport::findBestRunwayForPos(const SGGeod& aPos) const -{ - loadRunways(); - - FGRunway* result = NULL; - double currentLowestDev = 180.0; - - BOOST_FOREACH(PositionedID id, mRunways) { - FGRunway* rwy = (FGRunway*) flightgear::NavDataCache::instance()->loadById(id); - - double inboundCourse = SGGeodesy::courseDeg(aPos, rwy->end()); - double dev = inboundCourse - rwy->headingDeg(); - SG_NORMALIZE_RANGE(dev, -180.0, 180.0); - - dev = fabs(dev); - if (dev < currentLowestDev) { // new best match - currentLowestDev = dev; - result = rwy; - } - } // of runway iteration - - return result; - -} - -bool FGAirport::hasHardRunwayOfLengthFt(double aLengthFt) const -{ - loadRunways(); - - BOOST_FOREACH(PositionedID id, mRunways) { - FGRunway* rwy = (FGRunway*) flightgear::NavDataCache::instance()->loadById(id); - - if (rwy->isReciprocal()) { - continue; // we only care about lengths, so don't do work twice - } - - if (rwy->isHardSurface() && (rwy->lengthFt() >= aLengthFt)) { - return true; // we're done! - } - } // of runways iteration - - return false; -} - -unsigned int FGAirport::numTaxiways() const -{ - loadTaxiways(); - return mTaxiways.size(); -} - -FGTaxiway* FGAirport::getTaxiwayByIndex(unsigned int aIndex) const -{ - loadTaxiways(); - - assert(aIndex >= 0 && aIndex < mTaxiways.size()); - return (FGTaxiway*) flightgear::NavDataCache::instance()->loadById(mTaxiways[aIndex]); -} - -unsigned int FGAirport::numPavements() const -{ - loadTaxiways(); - return mPavements.size(); -} - -FGPavement* FGAirport::getPavementByIndex(unsigned int aIndex) const -{ - loadTaxiways(); - assert(aIndex >= 0 && aIndex < mPavements.size()); - return (FGPavement*) flightgear::NavDataCache::instance()->loadById(mPavements[aIndex]); -} - -FGRunway* FGAirport::getActiveRunwayForUsage() const -{ - FGEnvironmentMgr* envMgr = (FGEnvironmentMgr *) globals->get_subsystem("environment"); - - // This forces West-facing rwys to be used in no-wind situations - // which is consistent with Flightgear's initial setup. - double hdg = 270; - - if (envMgr) { - FGEnvironment stationWeather(envMgr->getEnvironment(mPosition)); - - double windSpeed = stationWeather.get_wind_speed_kt(); - if (windSpeed > 0.0) { - hdg = stationWeather.get_wind_from_heading_deg(); - } - } - - return findBestRunwayForHeading(hdg); -} - -FGAirport* FGAirport::findClosest(const SGGeod& aPos, double aCuttofNm, Filter* filter) -{ - AirportFilter aptFilter; - if (filter == NULL) { - filter = &aptFilter; - } - - FGPositionedRef r = FGPositioned::findClosest(aPos, aCuttofNm, filter); - if (!r) { - return NULL; - } - - return static_cast(r.ptr()); -} - -FGAirport::HardSurfaceFilter::HardSurfaceFilter(double minLengthFt) : - mMinLengthFt(minLengthFt) -{ - if (minLengthFt < 0.0) { - mMinLengthFt = fgGetDouble("/sim/navdb/min-runway-length-ft", 0.0); - } -} - -bool FGAirport::HardSurfaceFilter::passAirport(FGAirport* aApt) const -{ - return aApt->hasHardRunwayOfLengthFt(mMinLengthFt); -} - -FGAirport* FGAirport::findByIdent(const std::string& aIdent) -{ - AirportCache::iterator it = airportCache.find(aIdent); - if (it != airportCache.end()) - return it->second; - - PortsFilter filter; - FGAirport* r = static_cast (FGPositioned::findFirstWithIdent(aIdent, &filter).get()); - - // add airport to the cache (even when it's NULL, so we don't need to search in vain again) - airportCache[aIdent] = r; - - // we don't warn here when r==NULL, let the caller do that - return r; -} - -FGAirport* FGAirport::getByIdent(const std::string& aIdent) -{ - FGAirport* r = findByIdent(aIdent); - if (!r) - throw sg_range_exception("No such airport with ident: " + aIdent); - return r; -} - -char** FGAirport::searchNamesAndIdents(const std::string& aFilter) -{ - return NavDataCache::instance()->searchAirportNamesAndIdents(aFilter); -} - -// find basic airport location info from airport database -const FGAirport *fgFindAirportID( const string& id) -{ - if ( id.empty() ) { - return NULL; - } - - return FGAirport::findByIdent(id); -} - -void FGAirport::loadRunways() const -{ - if (mRunwaysLoaded) { - return; // already loaded, great - } - - loadSceneryDefinitions(); - - mRunwaysLoaded = true; - mRunways = flightgear::NavDataCache::instance()->airportItemsOfType(guid(), FGPositioned::RUNWAY); -} - -void FGAirport::loadHelipads() const -{ - if (mHelipadsLoaded) { - return; // already loaded, great - } - - loadSceneryDefinitions(); - - mHelipadsLoaded = true; - mHelipads = flightgear::NavDataCache::instance()->airportItemsOfType(guid(), FGPositioned::HELIPAD); -} - -void FGAirport::loadTaxiways() const -{ - if (mTaxiwaysLoaded) { - return; // already loaded, great - } - - mTaxiwaysLoaded = true; - mTaxiways = flightgear::NavDataCache::instance()->airportItemsOfType(guid(), FGPositioned::TAXIWAY); -} - -void FGAirport::loadProcedures() const -{ - if (mProceduresLoaded) { - return; - } - - mProceduresLoaded = true; - SGPath path; - if (!XMLLoader::findAirportData(ident(), "procedures", path)) { - SG_LOG(SG_GENERAL, SG_INFO, "no procedures data available for " << ident()); - return; - } - - SG_LOG(SG_GENERAL, SG_INFO, ident() << ": loading procedures from " << path.str()); - RouteBase::loadAirportProcedures(path, const_cast(this)); -} - -void FGAirport::loadSceneryDefinitions() const -{ - NavDataCache* cache = NavDataCache::instance(); - SGPath path; - if (!XMLLoader::findAirportData(ident(), "threshold", path)) { - return; // no XML threshold data - } - - if (!cache->isCachedFileModified(path)) { - // cached values are correct, we're all done - return; - } - - flightgear::NavDataCache::Transaction txn(cache); - SGPropertyNode_ptr rootNode = new SGPropertyNode; - readProperties(path.str(), rootNode); - const_cast(this)->readThresholdData(rootNode); - cache->stampCacheFile(path); - txn.commit(); -} - -void FGAirport::readThresholdData(SGPropertyNode* aRoot) -{ - SGPropertyNode* runway; - int runwayIndex = 0; - for (; (runway = aRoot->getChild("runway", runwayIndex)) != NULL; ++runwayIndex) { - SGPropertyNode* t0 = runway->getChild("threshold", 0), - *t1 = runway->getChild("threshold", 1); - assert(t0); - assert(t1); // too strict? maybe we should finally allow single-ended runways - - processThreshold(t0); - processThreshold(t1); - } // of runways iteration -} - -void FGAirport::processThreshold(SGPropertyNode* aThreshold) -{ - // first, let's identify the current runway - string rwyIdent(aThreshold->getStringValue("rwy")); - NavDataCache* cache = NavDataCache::instance(); - PositionedID id = cache->airportItemWithIdent(guid(), FGPositioned::RUNWAY, rwyIdent); - if (id == 0) { - SG_LOG(SG_GENERAL, SG_DEBUG, "FGAirport::processThreshold: " - "found runway not defined in the global data:" << ident() << "/" << rwyIdent); - return; - } - - double lon = aThreshold->getDoubleValue("lon"), - lat = aThreshold->getDoubleValue("lat"); - SGGeod newThreshold(SGGeod::fromDegM(lon, lat, mPosition.getElevationM())); - - double newHeading = aThreshold->getDoubleValue("hdg-deg"); - double newDisplacedThreshold = aThreshold->getDoubleValue("displ-m") * SG_METER_TO_FEET; - double newStopway = aThreshold->getDoubleValue("stopw-m") * SG_METER_TO_FEET; - - cache->updateRunwayThreshold(id, newThreshold, - newHeading, newDisplacedThreshold, newStopway); -} - -SGGeod FGAirport::getTowerLocation() const -{ - validateTowerData(); - - NavDataCache* cache = NavDataCache::instance(); - PositionedIDVec towers = cache->airportItemsOfType(guid(), FGPositioned::TOWER); - if (towers.empty()) { - SG_LOG(SG_GENERAL, SG_ALERT, "No towers defined for:" <loadById(towers.front()); - return tower->geod(); -} - -void FGAirport::validateTowerData() const -{ - if (mTowerDataLoaded) { - return; - } - - mTowerDataLoaded = true; - NavDataCache* cache = NavDataCache::instance(); - SGPath path; - if (!XMLLoader::findAirportData(ident(), "twr", path)) { - return; // no XML tower data - } - - if (!cache->isCachedFileModified(path)) { - // cached values are correct, we're all done - return; - } - - flightgear::NavDataCache::Transaction txn(cache); - SGPropertyNode_ptr rootNode = new SGPropertyNode; - readProperties(path.str(), rootNode); - const_cast(this)->readTowerData(rootNode); - cache->stampCacheFile(path); - txn.commit(); -} - -void FGAirport::readTowerData(SGPropertyNode* aRoot) -{ - SGPropertyNode* twrNode = aRoot->getChild("tower")->getChild("twr"); - double lat = twrNode->getDoubleValue("lat"), - lon = twrNode->getDoubleValue("lon"), - elevM = twrNode->getDoubleValue("elev-m"); -// tower elevation is AGL, not AMSL. Since we don't want to depend on the -// scenery for a precise terrain elevation, we use the field elevation -// (this is also what the apt.dat code does) - double fieldElevationM = geod().getElevationM(); - SGGeod towerLocation(SGGeod::fromDegM(lon, lat, fieldElevationM + elevM)); - - NavDataCache* cache = NavDataCache::instance(); - PositionedIDVec towers = cache->airportItemsOfType(guid(), FGPositioned::TOWER); - if (towers.empty()) { - cache->insertTower(guid(), towerLocation); - } else { - // update the position - cache->updatePosition(towers.front(), towerLocation); - } -} - -bool FGAirport::validateILSData() -{ - if (mILSDataLoaded) { - return false; - } - - mILSDataLoaded = true; - NavDataCache* cache = NavDataCache::instance(); - SGPath path; - if (!XMLLoader::findAirportData(ident(), "ils", path)) { - return false; // no XML tower data - } - - if (!cache->isCachedFileModified(path)) { - // cached values are correct, we're all done - return false; - } - - SGPropertyNode_ptr rootNode = new SGPropertyNode; - readProperties(path.str(), rootNode); - - flightgear::NavDataCache::Transaction txn(cache); - readILSData(rootNode); - cache->stampCacheFile(path); - txn.commit(); - -// we loaded data, tell the caller it might need to reload things - return true; -} - -void FGAirport::readILSData(SGPropertyNode* aRoot) -{ - NavDataCache* cache = NavDataCache::instance(); - - // find the entry matching the runway - SGPropertyNode* runwayNode, *ilsNode; - for (int i=0; (runwayNode = aRoot->getChild("runway", i)) != NULL; ++i) { - for (int j=0; (ilsNode = runwayNode->getChild("ils", j)) != NULL; ++j) { - // must match on both nav-ident and runway ident, to support the following: - // - runways with multiple distinct ILS installations (KEWD, for example) - // - runways where both ends share the same nav ident (LFAT, for example) - PositionedID ils = cache->findILS(guid(), ilsNode->getStringValue("rwy"), - ilsNode->getStringValue("nav-id")); - if (ils == 0) { - SG_LOG(SG_GENERAL, SG_INFO, "reading ILS data for " << ident() << - ", couldn;t find runway/navaid for:" << - ilsNode->getStringValue("rwy") << "/" << - ilsNode->getStringValue("nav-id")); - continue; - } - - double hdgDeg = ilsNode->getDoubleValue("hdg-deg"), - lon = ilsNode->getDoubleValue("lon"), - lat = ilsNode->getDoubleValue("lat"), - elevM = ilsNode->getDoubleValue("elev-m"); - - cache->updateILS(ils, SGGeod::fromDegM(lon, lat, elevM), hdgDeg); - } // of ILS iteration - } // of runway iteration -} - -void FGAirport::addSID(flightgear::SID* aSid) -{ - mSIDs.push_back(aSid); -} - -void FGAirport::addSTAR(STAR* aStar) -{ - mSTARs.push_back(aStar); -} - -void FGAirport::addApproach(Approach* aApp) -{ - mApproaches.push_back(aApp); -} - -unsigned int FGAirport::numSIDs() const -{ - loadProcedures(); - return mSIDs.size(); -} - -flightgear::SID* FGAirport::getSIDByIndex(unsigned int aIndex) const -{ - loadProcedures(); - return mSIDs[aIndex]; -} - -flightgear::SID* FGAirport::findSIDWithIdent(const std::string& aIdent) const -{ - loadProcedures(); - for (unsigned int i=0; iident() == aIdent) { - return mSIDs[i]; - } - } - - return NULL; -} - -unsigned int FGAirport::numSTARs() const -{ - loadProcedures(); - return mSTARs.size(); -} - -STAR* FGAirport::getSTARByIndex(unsigned int aIndex) const -{ - loadProcedures(); - return mSTARs[aIndex]; -} - -STAR* FGAirport::findSTARWithIdent(const std::string& aIdent) const -{ - loadProcedures(); - for (unsigned int i=0; iident() == aIdent) { - return mSTARs[i]; - } - } - - return NULL; -} - -unsigned int FGAirport::numApproaches() const -{ - loadProcedures(); - return mApproaches.size(); -} - -Approach* FGAirport::getApproachByIndex(unsigned int aIndex) const -{ - loadProcedures(); - return mApproaches[aIndex]; -} - -Approach* FGAirport::findApproachWithIdent(const std::string& aIdent) const -{ - loadProcedures(); - for (unsigned int i=0; iident() == aIdent) { - return mApproaches[i]; - } - } - - return NULL; -} - -CommStationList -FGAirport::commStations() const -{ - NavDataCache* cache = NavDataCache::instance(); - CommStationList result; - BOOST_FOREACH(PositionedID pos, cache->airportItemsOfType(guid(), - FGPositioned::FREQ_GROUND, - FGPositioned::FREQ_UNICOM)) - { - result.push_back((CommStation*) cache->loadById(pos)); - } - - return result; -} - -CommStationList -FGAirport::commStationsOfType(FGPositioned::Type aTy) const -{ - NavDataCache* cache = NavDataCache::instance(); - CommStationList result; - BOOST_FOREACH(PositionedID pos, cache->airportItemsOfType(guid(), aTy)) { - result.push_back((CommStation*) cache->loadById(pos)); - } - - return result; -} - -// get airport elevation -double fgGetAirportElev( const string& id ) -{ - const FGAirport *a=fgFindAirportID( id); - if (a) { - return a->getElevation(); - } else { - return -9999.0; - } -} - - -// get airport position -SGGeod fgGetAirportPos( const string& id ) -{ - const FGAirport *a = fgFindAirportID( id); - - if (a) { - return SGGeod::fromDegM(a->getLongitude(), a->getLatitude(), a->getElevation()); - } else { - return SGGeod::fromDegM(0.0, 0.0, -9999.0); - } -} diff --git a/src/Airports/simple.hxx b/src/Airports/simple.hxx deleted file mode 100644 index a628712b0..000000000 --- a/src/Airports/simple.hxx +++ /dev/null @@ -1,293 +0,0 @@ -// simple.hxx -- a really simplistic class to manage airport ID, -// lat, lon of the center of one of it's runways, and -// elevation in feet. -// -// Written by Curtis Olson, started April 1998. -// Updated by Durk Talsma, started December 2004. -// -// Copyright (C) 1998 Curtis L. Olson - http://www.flightgear.org/~curt -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -// -// $Id$ - - -#ifndef _FG_SIMPLE_HXX -#define _FG_SIMPLE_HXX - -#include - -#include -#include -#include - -#include - -// forward decls -class FGAirportDynamics; -class FGRunway; -class FGHelipad; -class FGTaxiway; -class FGPavement; -class SGPropertyNode; -class FGAirport; - -namespace flightgear { - class SID; - class STAR; - class Approach; - class Waypt; - class CommStation; - - typedef SGSharedPtr WayptRef; - typedef std::vector WayptVec; - - typedef std::vector CommStationList; - typedef std::map AirportCache; -} - - - -/*************************************************************************************** - * - **************************************************************************************/ -class FGAirport : public FGPositioned -{ -public: - FGAirport(PositionedID aGuid, const std::string& id, const SGGeod& location, - const std::string& name, bool has_metar, Type aType); - ~FGAirport(); - - const std::string& getId() const { return ident(); } - const std::string& getName() const { return _name; } - double getLongitude() const { return longitude(); } - // Returns degrees - double getLatitude() const { return latitude(); } - // Returns ft - double getElevation() const { return elevation(); } - bool getMetar() const { return _has_metar; } - bool isAirport() const; - bool isSeaport() const; - bool isHeliport() const; - - static bool isAirportType(FGPositioned* pos); - - virtual const std::string& name() const - { return _name; } - - /** - * reload the ILS data from XML if required. - * @result true if the data was refreshed, false if no data was loaded - * or previously cached data is still correct. - */ - bool validateILSData(); - - SGGeod getTowerLocation() const; - - void setMetar(bool value) { _has_metar = value; } - - FGRunway* getActiveRunwayForUsage() const; - - FGAirportDynamics *getDynamics(); - - unsigned int numRunways() const; - unsigned int numHelipads() const; - FGRunway* getRunwayByIndex(unsigned int aIndex) const; - FGHelipad* getHelipadByIndex(unsigned int aIndex) const; - - bool hasRunwayWithIdent(const std::string& aIdent) const; - FGRunway* getRunwayByIdent(const std::string& aIdent) const; - FGRunway* findBestRunwayForHeading(double aHeading) const; - - /** - * return the most likely target runway based on a position. - * Specifically, return the runway for which the course from aPos - * to the runway end, mostly closely matches the runway heading. - * This is a good approximation of which runway the position is on or - * aiming towards. - */ - FGRunway* findBestRunwayForPos(const SGGeod& aPos) const; - - /** - * Useful predicate for FMS/GPS/NAV displays and similar - check if this - * aiport has a hard-surfaced runway of at least the specified length. - */ - bool hasHardRunwayOfLengthFt(double aLengthFt) const; - - unsigned int numTaxiways() const; - FGTaxiway* getTaxiwayByIndex(unsigned int aIndex) const; - - unsigned int numPavements() const; - FGPavement* getPavementByIndex(unsigned int aIndex) const; - - class AirportFilter : public Filter - { - public: - virtual bool pass(FGPositioned* aPos) const { - return passAirport(static_cast(aPos)); - } - - virtual Type minType() const { - return AIRPORT; - } - - virtual Type maxType() const { - return AIRPORT; - } - - virtual bool passAirport(FGAirport* aApt) const { - return true; - } - }; - - /** - * Filter which passes heliports and seaports in addition to airports - */ - class PortsFilter : public AirportFilter - { - public: - virtual Type maxType() const { - return SEAPORT; - } - }; - - class HardSurfaceFilter : public AirportFilter - { - public: - HardSurfaceFilter(double minLengthFt = -1); - - virtual bool passAirport(FGAirport* aApt) const; - - private: - double mMinLengthFt; - }; - - - void setProcedures(const std::vector& aSids, - const std::vector& aStars, - const std::vector& aApproaches); - - void addSID(flightgear::SID* aSid); - void addSTAR(flightgear::STAR* aStar); - void addApproach(flightgear::Approach* aApp); - - unsigned int numSIDs() const; - flightgear::SID* getSIDByIndex(unsigned int aIndex) const; - flightgear::SID* findSIDWithIdent(const std::string& aIdent) const; - - unsigned int numSTARs() const; - flightgear::STAR* getSTARByIndex(unsigned int aIndex) const; - flightgear::STAR* findSTARWithIdent(const std::string& aIdent) const; - - unsigned int numApproaches() const; - flightgear::Approach* getApproachByIndex(unsigned int aIndex) const; - flightgear::Approach* findApproachWithIdent(const std::string& aIdent) const; - - /** - * Syntactic wrapper around FGPositioned::findClosest - find the closest - * match for filter, and return it cast to FGAirport. The default filter - * passes airports, but not seaports or heliports - */ - static FGAirport* findClosest(const SGGeod& aPos, double aCuttofNm, Filter* filter = NULL); - - /** - * Helper to look up an FGAirport instance by unique ident. Throws an - * exception if the airport could not be found - so callers can assume - * the result is non-NULL. - */ - static FGAirport* getByIdent(const std::string& aIdent); - - /** - * Helper to look up an FGAirport instance by unique ident. Returns NULL - * if the airport could not be found. - */ - static FGAirport* findByIdent(const std::string& aIdent); - - /** - * Specialised helper to implement the AirportList dialog. Performs a - * case-insensitive search on airport names and ICAO codes, and returns - * matches in a format suitable for use by a puaList. - */ - static char** searchNamesAndIdents(const std::string& aFilter); - - flightgear::CommStationList commStationsOfType(FGPositioned::Type aTy) const; - - flightgear::CommStationList commStations() const; -private: - static flightgear::AirportCache airportCache; - - // disable these - FGAirport operator=(FGAirport &other); - FGAirport(const FGAirport&); - - /** - * helper to read airport data from the scenery XML files. - */ - void loadSceneryDefinitions() const; - - /** - * Helpers to process property data loaded from an ICAO.threshold.xml file - */ - void readThresholdData(SGPropertyNode* aRoot); - void processThreshold(SGPropertyNode* aThreshold); - - void readILSData(SGPropertyNode* aRoot); - - void validateTowerData() const; - - /** - * Helper to parse property data loaded from an ICAO.twr.xml file - */ - void readTowerData(SGPropertyNode* aRoot); - - std::string _name; - bool _has_metar; - FGAirportDynamics *_dynamics; - - void loadRunways() const; - void loadHelipads() const; - void loadTaxiways() const; - void loadProcedures() const; - - mutable bool mTowerDataLoaded; - mutable bool mRunwaysLoaded; - mutable bool mHelipadsLoaded; - mutable bool mTaxiwaysLoaded; - mutable bool mProceduresLoaded; - bool mILSDataLoaded; - - mutable PositionedIDVec mRunways; - mutable PositionedIDVec mHelipads; - mutable PositionedIDVec mTaxiways; - PositionedIDVec mPavements; - - typedef SGSharedPtr SIDRef; - typedef SGSharedPtr STARRef; - typedef SGSharedPtr ApproachRef; - - std::vector mSIDs; - std::vector mSTARs; - std::vector mApproaches; - }; - -// find basic airport location info from airport database -const FGAirport *fgFindAirportID( const std::string& id); - -// get airport elevation -double fgGetAirportElev( const std::string& id ); - -#endif // _FG_SIMPLE_HXX - - diff --git a/src/Airports/xmlloader.cxx b/src/Airports/xmlloader.cxx index 8ff3eb1fd..59a9ca969 100644 --- a/src/Airports/xmlloader.cxx +++ b/src/Airports/xmlloader.cxx @@ -32,7 +32,7 @@ #include "runwayprefloader.hxx" #include "dynamics.hxx" -#include "simple.hxx" +#include "airport.hxx" #include "runwayprefs.hxx" #include diff --git a/src/Autopilot/route_mgr.cxx b/src/Autopilot/route_mgr.cxx index 4c41ebe7f..96f76325d 100644 --- a/src/Autopilot/route_mgr.cxx +++ b/src/Autopilot/route_mgr.cxx @@ -51,7 +51,7 @@ #include "Navaids/positioned.hxx" #include #include -#include "Airports/simple.hxx" +#include "Airports/airport.hxx" #include "Airports/runways.hxx" #include #include diff --git a/src/Cockpit/NavDisplay.cxx b/src/Cockpit/NavDisplay.cxx index 26720404a..4c96c3dde 100644 --- a/src/Cockpit/NavDisplay.cxx +++ b/src/Cockpit/NavDisplay.cxx @@ -70,7 +70,7 @@ using std::string; #include #include #include -#include +#include #include #include "od_gauge.hxx" diff --git a/src/Cockpit/groundradar.cxx b/src/Cockpit/groundradar.cxx index b7d283413..7a2af9b62 100644 --- a/src/Cockpit/groundradar.cxx +++ b/src/Cockpit/groundradar.cxx @@ -38,7 +38,7 @@ #include
#include #include -#include +#include #include #include #include diff --git a/src/Environment/environment_mgr.cxx b/src/Environment/environment_mgr.cxx index b4e62bc15..9aca5b0b5 100644 --- a/src/Environment/environment_mgr.cxx +++ b/src/Environment/environment_mgr.cxx @@ -43,7 +43,7 @@ #include "precipitation_mgr.hxx" #include "ridge_lift.hxx" #include "terrainsampler.hxx" -#include "Airports/simple.hxx" +#include "Airports/airport.hxx" #include "gravity.hxx" #include "magvarmanager.hxx" diff --git a/src/Environment/fgclouds.cxx b/src/Environment/fgclouds.cxx index 2374cd236..f19d9d6fc 100644 --- a/src/Environment/fgclouds.cxx +++ b/src/Environment/fgclouds.cxx @@ -40,7 +40,7 @@ #include
#include
#include -#include +#include #include "fgclouds.hxx" diff --git a/src/Environment/metarairportfilter.hxx b/src/Environment/metarairportfilter.hxx index f31eb64f5..b20ac0a7e 100644 --- a/src/Environment/metarairportfilter.hxx +++ b/src/Environment/metarairportfilter.hxx @@ -22,7 +22,7 @@ #ifndef __METARAIRPORTFILTER_HXX #define __METARAIRPORTFILTER_HXX -#include +#include #include namespace Environment { diff --git a/src/Environment/metarproperties.hxx b/src/Environment/metarproperties.hxx index 7d108100d..eac1af780 100644 --- a/src/Environment/metarproperties.hxx +++ b/src/Environment/metarproperties.hxx @@ -23,7 +23,7 @@ #ifndef __METARPROPERTIES_HXX #define __METARPROPERTIES_HXX -#include +#include #include #include diff --git a/src/GUI/AirportList.cxx b/src/GUI/AirportList.cxx index da25a861d..5bff4f899 100644 --- a/src/GUI/AirportList.cxx +++ b/src/GUI/AirportList.cxx @@ -3,7 +3,7 @@ #endif #include
-#include +#include #include "AirportList.hxx" diff --git a/src/GUI/MapWidget.cxx b/src/GUI/MapWidget.cxx index 778cd72a7..b8bac7236 100644 --- a/src/GUI/MapWidget.cxx +++ b/src/GUI/MapWidget.cxx @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include #include
// fgGetKeyModifiers() #include diff --git a/src/Instrumentation/KLN89/kln89.cxx b/src/Instrumentation/KLN89/kln89.cxx index 4cb507441..a084fea50 100644 --- a/src/Instrumentation/KLN89/kln89.cxx +++ b/src/Instrumentation/KLN89/kln89.cxx @@ -48,7 +48,7 @@ #include
#include -#include +#include #include diff --git a/src/Instrumentation/KLN89/kln89_page_apt.cxx b/src/Instrumentation/KLN89/kln89_page_apt.cxx index c89c0f299..52a0778c3 100644 --- a/src/Instrumentation/KLN89/kln89_page_apt.cxx +++ b/src/Instrumentation/KLN89/kln89_page_apt.cxx @@ -34,7 +34,7 @@ #include #include
#include -#include +#include using std::string; diff --git a/src/Instrumentation/dclgps.cxx b/src/Instrumentation/dclgps.cxx index aeeb54fdc..24fba0040 100644 --- a/src/Instrumentation/dclgps.cxx +++ b/src/Instrumentation/dclgps.cxx @@ -34,7 +34,7 @@ #include
#include #include -#include +#include #include #include diff --git a/src/Instrumentation/gps.cxx b/src/Instrumentation/gps.cxx index 3c26a539b..22094602b 100644 --- a/src/Instrumentation/gps.cxx +++ b/src/Instrumentation/gps.cxx @@ -22,7 +22,7 @@ #include "Navaids/positioned.hxx" #include #include "Navaids/navrecord.hxx" -#include "Airports/simple.hxx" +#include "Airports/airport.hxx" #include "Airports/runways.hxx" #include "Autopilot/route_mgr.hxx" diff --git a/src/Instrumentation/mk_viii.cxx b/src/Instrumentation/mk_viii.cxx index 9b0ee2b48..eb40aee4d 100644 --- a/src/Instrumentation/mk_viii.cxx +++ b/src/Instrumentation/mk_viii.cxx @@ -76,7 +76,7 @@ using std::string; #include -#include +#include #if defined( HAVE_VERSION_H ) && HAVE_VERSION_H # include diff --git a/src/Instrumentation/mk_viii.hxx b/src/Instrumentation/mk_viii.hxx index 25b50c3e4..81a33580b 100644 --- a/src/Instrumentation/mk_viii.hxx +++ b/src/Instrumentation/mk_viii.hxx @@ -38,7 +38,7 @@ using std::map; class SGSampleGroup; #include -#include +#include #include
#include diff --git a/src/Main/fg_init.cxx b/src/Main/fg_init.cxx index 58bd9aeba..729301c24 100644 --- a/src/Main/fg_init.cxx +++ b/src/Main/fg_init.cxx @@ -59,7 +59,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/Main/positioninit.cxx b/src/Main/positioninit.cxx index 777709ccf..eb3579967 100644 --- a/src/Main/positioninit.cxx +++ b/src/Main/positioninit.cxx @@ -32,7 +32,7 @@ #include #include -#include +#include #include #include diff --git a/src/Navaids/FlightPlan.hxx b/src/Navaids/FlightPlan.hxx index 84944069a..d00c4860f 100644 --- a/src/Navaids/FlightPlan.hxx +++ b/src/Navaids/FlightPlan.hxx @@ -25,7 +25,7 @@ #define FG_FLIGHTPLAN_HXX #include -#include +#include typedef SGSharedPtr FGAirportRef; diff --git a/src/Navaids/LevelDXML.cxx b/src/Navaids/LevelDXML.cxx index 41866cb71..73b8f78f2 100644 --- a/src/Navaids/LevelDXML.cxx +++ b/src/Navaids/LevelDXML.cxx @@ -10,7 +10,7 @@ #include #include -#include +#include using std::string; using std::vector; diff --git a/src/Navaids/NavDataCache.cxx b/src/Navaids/NavDataCache.cxx index 3cc8a255e..1f1dc251a 100644 --- a/src/Navaids/NavDataCache.cxx +++ b/src/Navaids/NavDataCache.cxx @@ -51,7 +51,7 @@ #include
#include "markerbeacon.hxx" #include "navrecord.hxx" -#include +#include #include #include #include "fix.hxx" diff --git a/src/Navaids/navdb.cxx b/src/Navaids/navdb.cxx index 42e0c2381..9cc1654a9 100644 --- a/src/Navaids/navdb.cxx +++ b/src/Navaids/navdb.cxx @@ -40,7 +40,7 @@ #include "navlist.hxx" #include
#include -#include +#include #include #include #include
diff --git a/src/Navaids/navrecord.cxx b/src/Navaids/navrecord.cxx index c73e04b8f..dc5cf7ab2 100644 --- a/src/Navaids/navrecord.cxx +++ b/src/Navaids/navrecord.cxx @@ -37,7 +37,7 @@ #include #include #include -#include +#include #include #include
#include diff --git a/src/Navaids/route.cxx b/src/Navaids/route.cxx index 9123d24c3..6d6558a69 100644 --- a/src/Navaids/route.cxx +++ b/src/Navaids/route.cxx @@ -48,7 +48,7 @@ #include #include #include -#include +#include using std::string; using std::vector; diff --git a/src/Navaids/waypoint.cxx b/src/Navaids/waypoint.cxx index 81e2c5c82..aaeedd53c 100644 --- a/src/Navaids/waypoint.cxx +++ b/src/Navaids/waypoint.cxx @@ -25,7 +25,7 @@ #include -#include +#include #include using std::string; diff --git a/src/Scripting/NasalPositioned.cxx b/src/Scripting/NasalPositioned.cxx index 4e10bd7d8..a01bf0c86 100644 --- a/src/Scripting/NasalPositioned.cxx +++ b/src/Scripting/NasalPositioned.cxx @@ -37,7 +37,7 @@ #include #include -#include +#include #include #include #include diff --git a/src/Traffic/SchedFlight.cxx b/src/Traffic/SchedFlight.cxx index 784c1443a..4dc29b519 100644 --- a/src/Traffic/SchedFlight.cxx +++ b/src/Traffic/SchedFlight.cxx @@ -57,7 +57,7 @@ #include #include -#include +#include #include
// That's pretty ugly, but I need fgFindAirportID diff --git a/src/Traffic/Schedule.cxx b/src/Traffic/Schedule.cxx index ea1ef0480..4ad1ed778 100644 --- a/src/Traffic/Schedule.cxx +++ b/src/Traffic/Schedule.cxx @@ -47,7 +47,7 @@ #include #include #include -#include +#include #include
// That's pretty ugly, but I need fgFindAirportID diff --git a/src/Traffic/TrafficMgr.cxx b/src/Traffic/TrafficMgr.cxx index 5c56d5451..a9ab6e794 100644 --- a/src/Traffic/TrafficMgr.cxx +++ b/src/Traffic/TrafficMgr.cxx @@ -64,7 +64,7 @@ #include #include #include -#include +#include #include
#include "TrafficMgr.hxx"