X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNavaids%2Fnavrecord.cxx;h=2689f3d3bc4a3fb4065574c1718509b09d487ec3;hb=86d1e4ea9dc56ae811337c326b7f83b820221663;hp=e85c43c4fcd6b5e1ad790ffc71fedf60ff0076fb;hpb=7d5d75609533c98fa5ea93829cdd3bb06ee6ebe8;p=flightgear.git diff --git a/src/Navaids/navrecord.cxx b/src/Navaids/navrecord.cxx index e85c43c4f..2689f3d3b 100644 --- a/src/Navaids/navrecord.cxx +++ b/src/Navaids/navrecord.cxx @@ -28,13 +28,13 @@ #include #include -#include #include +#include -#include "Navaids/navrecord.hxx" -#include "Airports/simple.hxx" -#include "Airports/runways.hxx" -#include "Main/fg_props.hxx" +#include +#include +#include +#include
FGNavRecord::FGNavRecord(Type aTy, const std::string& aIdent, const std::string& aName, const SGGeod& aPos, @@ -43,7 +43,8 @@ FGNavRecord::FGNavRecord(Type aTy, const std::string& aIdent, freq(aFreq), range(aRange), multiuse(aMultiuse), - name(aName), + _name(aName), + mRunway(NULL), serviceable(true), trans_ident(aIdent) { @@ -77,81 +78,20 @@ FGNavRecord::FGNavRecord(Type aTy, const std::string& aIdent, } -SGVec3d FGNavRecord::get_cart() const -{ - return SGVec3d::fromGeod(geod()); -} - - -static FGPositioned::Type -mapRobinTypeToFGPType(int aTy) -{ - switch (aTy) { - // case 1: - case 2: return FGPositioned::NDB; - case 3: return FGPositioned::VOR; - case 4: return FGPositioned::LOC; - case 5: return FGPositioned::ILS; - case 6: return FGPositioned::GS; - case 7: return FGPositioned::OM; - case 8: return FGPositioned::MM; - case 9: return FGPositioned::IM; - case 12: - case 13: return FGPositioned::DME; - case 99: return FGPositioned::INVALID; // end-of-file code - default: - throw sg_range_exception("Got a nav.dat type we don't recgonize", "FGNavRecord::createFromStream"); - } -} - -FGNavRecord* FGNavRecord::createFromStream(std::istream& aStream) -{ - int rawType; - aStream >> rawType; - if (aStream.eof()) { - return NULL; // happens with, eg, carrier_nav.dat - } - - Type type = mapRobinTypeToFGPType(rawType); - if (type == INVALID) return NULL; - - double lat, lon, elev_ft, multiuse; - int freq, range; - std::string apt_id, name, ident; - aStream >> lat >> lon >> elev_ft >> freq >> range >> multiuse >> ident; - getline(aStream, name); - - // silently multiply adf frequencies by 100 so that adf - // vs. nav/loc frequency lookups can use the same code. - if (type == NDB) { - freq *= 100; - } - - FGNavRecord* result = new FGNavRecord(type, ident, - simgear::strutils::strip(name), SGGeod::fromDegFt(lon, lat, elev_ft), - freq, range, multiuse); - - return result; -} - void FGNavRecord::initAirportRelation() { - if (type() < ILS || type() > IM) { + if ((type() < ILS) || (type() > GS)) { return; // not airport-located } - vector parts = simgear::strutils::split(name); - apt_id = parts[0]; - const FGAirport* apt = fgFindAirportID(apt_id); - - if (!apt) { - SG_LOG(SG_GENERAL, SG_WARN, "navaid " << ident() << " associated with bogus airport ID:" << apt_id); - return; + mRunway = getRunwayFromName(_name); + // fudge elevation to the runway elevation if it's not specified + if (fabs(elevation()) < 0.01) { + mPosition.setElevationFt(mRunway->elevation()); } - // fudge elevation to the field elevation if it's not specified - if (fabs(elevation()) < 0.01) { - mPosition.setElevationFt(apt->getElevation()); + if (type() == ILS) { + mRunway->setILS(this); } // align localizers with their runway @@ -160,45 +100,31 @@ void FGNavRecord::initAirportRelation() return; } - if (parts.size() < 2) { - SG_LOG(SG_GENERAL, SG_ALERT, "can't parse navaid " << ident() - << " name for airport/runway:" << name); - return; - } - - double threshold - = fgGetDouble( "/sim/navdb/localizers/auto-align-threshold-deg", - 5.0 ); - FGRunway* runway = apt->getRunwayByIdent(parts[1]); - alignLocaliserWithRunway(runway, threshold); + double threshold + = fgGetDouble( "/sim/navdb/localizers/auto-align-threshold-deg", 5.0 ); + alignLocaliserWithRunway(threshold); } } -void FGNavRecord::alignLocaliserWithRunway(FGRunway* aRunway, double aThreshold) +void FGNavRecord::alignLocaliserWithRunway(double aThreshold) { // find the distance from the threshold to the localizer - SGGeod runwayThreshold(aRunway->threshold()); + SGGeod runwayThreshold(mRunway->threshold()); double dist, az1, az2; SGGeodesy::inverse(mPosition, runwayThreshold, az1, az2, dist); // back project that distance along the runway center line - SGGeod newPos = aRunway->pointOnCenterline(dist); - - double hdg_diff = get_multiuse() - aRunway->headingDeg(); + SGGeod newPos = mRunway->pointOnCenterline(dist); - // clamp to [-180.0 ... 180.0] - if ( hdg_diff < -180.0 ) { - hdg_diff += 360.0; - } else if ( hdg_diff > 180.0 ) { - hdg_diff -= 360.0; - } + double hdg_diff = get_multiuse() - mRunway->headingDeg(); + SG_NORMALIZE_RANGE(hdg_diff, -180.0, 180.0); if ( fabs(hdg_diff) <= aThreshold ) { mPosition = newPos; - set_multiuse( aRunway->headingDeg() ); + set_multiuse( mRunway->headingDeg() ); } else { SG_LOG(SG_GENERAL, SG_WARN, "localizer:" << ident() << ", aligning with runway " - << aRunway->ident() << " exceeded heading threshold"); + << mRunway->ident() << " exceeded heading threshold"); } }