1
0
Fork 0

Three Nasal properties of waypoint objects now accessible: airport, runway, navaid

Waypoint objects used in Nasal code can now return their airport,
runway or navaid object (Nasal ghost). More precisely:
  - if waypoint 'wpt' was made from an airport object[1], then
    'wpt.airport' is this airport object;
  - if waypoint 'wpt' was made from a runway object[2], then
    'wpt.runway' is this runway object, and 'wpt.airport' is the
    airport containing that runway;
  - if waypoint 'wpt' was made from a navaid object[3], then
    'wpt.navaid' is this navaid object.

When one of the three properties 'airport', 'runway', and 'navaid' is
not applicable to a given waypoint due to the type of the underlying
FGPositioned, its value is nil.

The code for these properties was already mostly there, but
unreachable from Nasal.

[1] For instance, with createWPFrom(airportinfo("LOWI"))

[2] For instance, with createWPFrom(airportinfo("LOWI").runway("26"))

[3] For instance, with:

      var apt = airportinfo("LOWI");
      var navaid = findNavaidByFrequencyMHz(apt, 109.7);
      var navaidWpt = createWPFrom(navaid);
This commit is contained in:
Florent Rougon 2017-11-15 22:14:12 +01:00
parent 91470cbc54
commit 0dbb0dff9e

View file

@ -22,7 +22,7 @@
# include "config.h" # include "config.h"
#endif #endif
#include <string.h> #include <cstring>
#include "NasalPositioned.hxx" #include "NasalPositioned.hxx"
@ -429,6 +429,45 @@ static const char* airportGhostGetMember(naContext c, void* g, naRef field, naRe
return ""; return "";
} }
// Return the navaid ghost associated with a waypoint of navaid type.
static naRef waypointNavaid(naContext c, Waypt* wpt)
{
FGPositioned* pos = wpt->source();
if (!FGPositioned::isNavaidType(pos)) {
return naNil();
}
return ghostForNavaid(c, static_cast<FGNavRecord*>(pos));
}
// Return the airport ghost associated with a waypoint of airport or runway
// type.
static naRef waypointAirport(naContext c, Waypt* wpt)
{
FGPositioned* pos = wpt->source();
if (FGPositioned::isRunwayType(pos)) {
pos = static_cast<FGRunway*>(pos) -> airport();
} else if (!FGPositioned::isAirportType(pos)) {
return naNil();
}
return ghostForAirport(c, static_cast<FGAirport*>(pos));
}
// Return the runway ghost associated with a waypoint of runway type.
static naRef waypointRunway(naContext c, Waypt* wpt)
{
FGPositioned* pos = wpt->source();
if (!FGPositioned::isRunwayType(pos)) {
return naNil();
}
return ghostForRunway(c, static_cast<FGRunway*>(pos));
}
static const char* waypointCommonGetMember(naContext c, Waypt* wpt, const char* fieldName, naRef* out) static const char* waypointCommonGetMember(naContext c, Waypt* wpt, const char* fieldName, naRef* out)
{ {
if (!strcmp(fieldName, "wp_name") || !strcmp(fieldName, "id")) *out = stringToNasal(c, wpt->ident()); if (!strcmp(fieldName, "wp_name") || !strcmp(fieldName, "id")) *out = stringToNasal(c, wpt->ident());
@ -450,8 +489,14 @@ static const char* waypointCommonGetMember(naContext c, Waypt* wpt, const char*
} }
} else if (!strcmp(fieldName, "heading_course")) { } else if (!strcmp(fieldName, "heading_course")) {
*out = naNum(wpt->headingRadialDeg()); *out = naNum(wpt->headingRadialDeg());
} else if (!strcmp(fieldName, "navaid")) {
*out = waypointNavaid(c, wpt);
} else if (!strcmp(fieldName, "airport")) {
*out = waypointAirport(c, wpt);
} else if (!strcmp(fieldName, "runway")) {
*out = waypointRunway(c, wpt);
} else { } else {
return NULL; // member not found return nullptr; // member not found
} }
return ""; return "";
@ -2636,65 +2681,6 @@ static naRef f_leg_courseAndDistanceFrom(naContext c, naRef me, int argc, naRef*
return result; return result;
} }
static naRef f_waypoint_navaid(naContext c, naRef me, int argc, naRef* args)
{
flightgear::Waypt* w = wayptGhost(me);
if (!w) {
naRuntimeError(c, "waypoint.navaid called on non-waypoint object");
}
FGPositioned* pos = w->source();
if (!pos) {
return naNil();
}
switch (pos->type()) {
case FGPositioned::VOR:
case FGPositioned::NDB:
case FGPositioned::ILS:
case FGPositioned::LOC:
case FGPositioned::GS:
case FGPositioned::DME:
case FGPositioned::TACAN: {
FGNavRecord* nav = (FGNavRecord*) pos;
return ghostForNavaid(c, nav);
}
default:
return naNil();
}
}
static naRef f_waypoint_airport(naContext c, naRef me, int argc, naRef* args)
{
flightgear::Waypt* w = wayptGhost(me);
if (!w) {
naRuntimeError(c, "waypoint.navaid called on non-waypoint object");
}
FGPositioned* pos = w->source();
if (!pos || FGAirport::isAirportType(pos)) {
return naNil();
}
return ghostForAirport(c, (FGAirport*) pos);
}
static naRef f_waypoint_runway(naContext c, naRef me, int argc, naRef* args)
{
flightgear::Waypt* w = wayptGhost(me);
if (!w) {
naRuntimeError(c, "waypoint.navaid called on non-waypoint object");
}
FGPositioned* pos = w->source();
if (!pos || (pos->type() != FGPositioned::RUNWAY)) {
return naNil();
}
return ghostForRunway(c, (FGRunway*) pos);
}
static naRef f_procedure_transition(naContext c, naRef me, int argc, naRef* args) static naRef f_procedure_transition(naContext c, naRef me, int argc, naRef* args)
{ {
Procedure* proc = procedureGhost(me); Procedure* proc = procedureGhost(me);
@ -2840,11 +2826,7 @@ naRef initNasalPositioned(naRef globals, naContext c)
waypointPrototype = naNewHash(c); waypointPrototype = naNewHash(c);
naSave(c, waypointPrototype); naSave(c, waypointPrototype);
hashset(c, waypointPrototype, "navaid", naNewFunc(c, naNewCCode(c, f_waypoint_navaid)));
hashset(c, waypointPrototype, "runway", naNewFunc(c, naNewCCode(c, f_waypoint_runway)));
hashset(c, waypointPrototype, "airport", naNewFunc(c, naNewCCode(c, f_waypoint_airport)));
procedurePrototype = naNewHash(c); procedurePrototype = naNewHash(c);
naSave(c, procedurePrototype); naSave(c, procedurePrototype);
hashset(c, procedurePrototype, "transition", naNewFunc(c, naNewCCode(c, f_procedure_transition))); hashset(c, procedurePrototype, "transition", naNewFunc(c, naNewCCode(c, f_procedure_transition)));