From 8588eb2e4b035b720202f143587282a978dbc554 Mon Sep 17 00:00:00 2001 From: Christian Schmitt Date: Thu, 21 Feb 2013 16:14:44 +0100 Subject: [PATCH] Expose heliports to Nasal for future use in maps --- src/Airports/airport.cxx | 16 ++++++++++++++++ src/Airports/airport.hxx | 2 ++ src/Scripting/NasalPositioned.cxx | 32 +++++++++++++++++++++++++++---- 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/src/Airports/airport.cxx b/src/Airports/airport.cxx index ba85516dd..56edab20c 100644 --- a/src/Airports/airport.cxx +++ b/src/Airports/airport.cxx @@ -158,6 +158,11 @@ bool FGAirport::hasRunwayWithIdent(const string& aIdent) const return flightgear::NavDataCache::instance()->airportItemWithIdent(guid(), FGPositioned::RUNWAY, aIdent) != 0; } +bool FGAirport::hasHelipadWithIdent(const string& aIdent) const +{ + return flightgear::NavDataCache::instance()->airportItemWithIdent(guid(), FGPositioned::HELIPAD, aIdent) != 0; +} + FGRunway* FGAirport::getRunwayByIdent(const string& aIdent) const { PositionedID id = flightgear::NavDataCache::instance()->airportItemWithIdent(guid(), FGPositioned::RUNWAY, aIdent); @@ -169,6 +174,17 @@ FGRunway* FGAirport::getRunwayByIdent(const string& aIdent) const return (FGRunway*) flightgear::NavDataCache::instance()->loadById(id); } +FGHelipad* FGAirport::getHelipadByIdent(const string& aIdent) const +{ + PositionedID id = flightgear::NavDataCache::instance()->airportItemWithIdent(guid(), FGPositioned::HELIPAD, aIdent); + if (id == 0) { + SG_LOG(SG_GENERAL, SG_ALERT, "no such helipad '" << aIdent << "' at airport " << ident()); + throw sg_range_exception("unknown helipad " + aIdent + " at airport:" + ident(), "FGAirport::getRunwayByIdent"); + } + + return (FGHelipad*) flightgear::NavDataCache::instance()->loadById(id); +} + FGRunway* FGAirport::findBestRunwayForHeading(double aHeading) const { diff --git a/src/Airports/airport.hxx b/src/Airports/airport.hxx index b58b2f345..8c0c49297 100644 --- a/src/Airports/airport.hxx +++ b/src/Airports/airport.hxx @@ -108,7 +108,9 @@ public: FGHelipad* getHelipadByIndex(unsigned int aIndex) const; bool hasRunwayWithIdent(const std::string& aIdent) const; + bool hasHelipadWithIdent(const std::string& aIdent) const; FGRunway* getRunwayByIdent(const std::string& aIdent) const; + FGHelipad* getHelipadByIdent(const std::string& aIdent) const; FGRunway* findBestRunwayForHeading(double aHeading) const; /** diff --git a/src/Scripting/NasalPositioned.cxx b/src/Scripting/NasalPositioned.cxx index a01bf0c86..4ca5d4632 100644 --- a/src/Scripting/NasalPositioned.cxx +++ b/src/Scripting/NasalPositioned.cxx @@ -73,6 +73,7 @@ naGhostType NavaidGhostType = { positionedGhostDestroy, "navaid", navaidGhostGet static const char* runwayGhostGetMember(naContext c, void* g, naRef field, naRef* out); naGhostType RunwayGhostType = { positionedGhostDestroy, "runway", runwayGhostGetMember, 0 }; +naGhostType HelipadGhostType = { positionedGhostDestroy, "helipad", runwayGhostGetMember, 0 }; naGhostType TaxiwayGhostType = { positionedGhostDestroy, "taxiway", runwayGhostGetMember, 0 }; static const char* fixGhostGetMember(naContext c, void* g, naRef field, naRef* out); @@ -289,6 +290,16 @@ naRef ghostForRunway(naContext c, const FGRunway* r) return naNewGhost2(c, &RunwayGhostType, (void*) r); } +naRef ghostForHelipad(naContext c, const FGHelipad* r) +{ + if (!r) { + return naNil(); + } + + FGPositioned::get(r); // take a ref + return naNewGhost2(c, &HelipadGhostType, (void*) r); +} + naRef ghostForTaxiway(naContext c, const FGTaxiway* r) { if (!r) { @@ -378,6 +389,16 @@ static const char* airportGhostGetMember(naContext c, void* g, naRef field, naRe naRef rwydata = ghostForRunway(c, rwy); naHash_set(*out, rwyid, rwydata); } + } else if (!strcmp(fieldName, "helipads")) { + *out = naNewHash(c); + + for(unsigned int r=0; rnumHelipads(); ++r) { + FGHelipad* hp(apt->getHelipadByIndex(r)); + + naRef rwyid = stringToNasal(c, hp->ident()); + naRef rwydata = ghostForHelipad(c, hp); + naHash_set(*out, rwyid, rwydata); + } } else if (!strcmp(fieldName, "taxiways")) { *out = naNewVector(c); @@ -1167,11 +1188,13 @@ static naRef f_airport_runway(naContext c, naRef me, int argc, naRef* args) std::string ident(naStr_data(args[0])); boost::to_upper(ident); - if (!apt->hasRunwayWithIdent(ident)) { - return naNil(); + + if (apt->hasRunwayWithIdent(ident)) { + return ghostForRunway(c, apt->getRunwayByIdent(ident)); + } else if (apt->hasHelipadWithIdent(ident)) { + return ghostForHelipad(c, apt->getHelipadByIdent(ident)); } - - return ghostForRunway(c, apt->getRunwayByIdent(ident)); + return naNil(); } static naRef f_airport_taxiway(naContext c, naRef me, int argc, naRef* args) @@ -2389,6 +2412,7 @@ naRef initNasalPositioned(naRef globals, naContext c, naRef gcSave) hashset(c, gcSave, "airportProto", airportPrototype); hashset(c, airportPrototype, "runway", naNewFunc(c, naNewCCode(c, f_airport_runway))); + hashset(c, airportPrototype, "helipad", naNewFunc(c, naNewCCode(c, f_airport_runway))); hashset(c, airportPrototype, "taxiway", naNewFunc(c, naNewCCode(c, f_airport_taxiway))); hashset(c, airportPrototype, "tower", naNewFunc(c, naNewCCode(c, f_airport_tower))); hashset(c, airportPrototype, "comms", naNewFunc(c, naNewCCode(c, f_airport_comms))); -- 2.39.5