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);
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
{
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);
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) {
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);
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)
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)));