]> git.mxchange.org Git - flightgear.git/commitdiff
Expose heliports to Nasal for future use in maps
authorChristian Schmitt <chris@ilovelinux.de>
Thu, 21 Feb 2013 15:14:44 +0000 (16:14 +0100)
committerChristian Schmitt <chris@ilovelinux.de>
Tue, 26 Feb 2013 17:20:10 +0000 (18:20 +0100)
src/Airports/airport.cxx
src/Airports/airport.hxx
src/Scripting/NasalPositioned.cxx

index ba85516dd6fee61a7e9b7c5016e4241a1c5e2876..56edab20ce51149ce9528c3ca2a759da0f9e6439 100644 (file)
@@ -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
 {
index b58b2f345ecfd169d888350cd9d591559b59102e..8c0c492977bba348d817ec55b916c789e6399c0e 100644 (file)
@@ -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;
     
     /**
index a01bf0c863c25963ca106af3ed8d4df41c9beba6..4ca5d4632113ef69c7debe2216f9e00ca34213de 100644 (file)
@@ -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; r<apt->numHelipads(); ++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)));