if (w->flag(WPT_DYNAMIC)) continue;
totalDistanceRemaining += SGGeodesy::distanceM(prev->position(), w->position());
prev = w;
+
+
}
wpn->setDoubleValue("dist", totalDistanceRemaining * SG_METER_TO_NM);
void FGRouteMgr::update_mirror()
{
mirror->removeChildren("wp");
- for (int i = 0; i < numWaypts(); i++) {
+
+ int num = numWaypts();
+ for (int i = 0; i < num; i++) {
Waypt* wp = _route[i];
SGPropertyNode *prop = mirror->getChild("wp", i, 1);
prop->setDoubleValue("longitude-deg", pos.getLongitudeDeg());
prop->setDoubleValue("latitude-deg",pos.getLatitudeDeg());
+ // leg course+distance
+ if (i < (num - 1)) {
+ Waypt* next = _route[i+1];
+ std::pair<double, double> crsDist =
+ next->courseAndDistanceFrom(pos);
+ prop->setDoubleValue("leg-bearing-true-deg", crsDist.first);
+ prop->setDoubleValue("leg-distance-nm", crsDist.second * SG_METER_TO_NM);
+ }
+
if (wp->altitudeRestriction() != RESTRICT_NONE) {
double ft = wp->altitudeFt();
prop->setDoubleValue("altitude-m", ft * SG_FEET_TO_METER);
prop->setDoubleValue("altitude-ft", -9999.9);
}
- if (wp->speedRestriction() != RESTRICT_NONE) {
+ if (wp->speedRestriction() == SPEED_RESTRICT_MACH) {
+ prop->setDoubleValue("speed-mach", wp->speedMach());
+ } else if (wp->speedRestriction() != RESTRICT_NONE) {
prop->setDoubleValue("speed-kts", wp->speedKts());
}
legend << '\n' << SGMiscd::roundToInt(wpt->altitudeFt()) << '\'';
}
- if (wpt->speedRestriction() != flightgear::RESTRICT_NONE) {
+ if (wpt->speedRestriction() == flightgear::SPEED_RESTRICT_MACH) {
+ legend << '\n' << wpt->speedMach() << "M";
+ } else if (wpt->speedRestriction() != flightgear::RESTRICT_NONE) {
legend << '\n' << SGMiscd::roundToInt(wpt->speedKts()) << "Kts";
}
} // of valid wp altitude
x += 60 + PUSTR_LGAP;
- if (wp->speedRestriction() != RESTRICT_NONE) {
+ if (wp->speedRestriction() == SPEED_RESTRICT_MACH) {
+ count = ::snprintf(buffer, 126, "%03.2fM", wp->speedMach());
+ f->drawString(buffer, x, yy);
+ } else if (wp->speedRestriction() != RESTRICT_NONE) {
count = ::snprintf(buffer, 126, "%dKts", (int) wp->speedKts());
f->drawString(buffer, x, yy);
}
Waypt::Waypt(Route* aOwner) :
_altitudeFt(0.0),
- _speedKts(0.0),
+ _speed(0.0),
_altRestrict(RESTRICT_NONE),
_speedRestrict(RESTRICT_NONE),
_owner(aOwner),
void Waypt::setSpeed(double aSpeed, RouteRestriction aRestrict)
{
- _speedKts = aSpeed;
+ _speed = aSpeed;
_speedRestrict = aRestrict;
}
+double Waypt::speedKts() const
+{
+ assert(_speedRestrict != SPEED_RESTRICT_MACH);
+ return speed();
+}
+
+double Waypt::speedMach() const
+{
+ assert(_speedRestrict == SPEED_RESTRICT_MACH);
+ return speed();
+}
+
std::pair<double, double>
Waypt::courseAndDistanceFrom(const SGGeod& aPos) const
{
if (l == "above") return RESTRICT_ABOVE;
if (l == "below") return RESTRICT_BELOW;
if (l == "none") return RESTRICT_NONE;
+ if (l == "mach") return SPEED_RESTRICT_MACH;
if (l.empty()) return RESTRICT_NONE;
throw sg_io_exception("unknown restriction specification:" + l,
case RESTRICT_BELOW: return "below";
case RESTRICT_ABOVE: return "above";
case RESTRICT_NONE: return "none";
+ case SPEED_RESTRICT_MACH: return "mach";
+
default:
throw sg_exception("invalid route restriction",
"Route restrictToString");
if (aProp->hasChild("speed-restrict")) {
_speedRestrict = restrictionFromString(aProp->getStringValue("speed-restrict"));
- _speedKts = aProp->getDoubleValue("speed-kts");
+ _speed = aProp->getDoubleValue("speed");
}
if (_speedRestrict != RESTRICT_NONE) {
aProp->setStringValue("speed-restrict", restrictionToString(_speedRestrict));
- aProp->setDoubleValue("speed-kts", _speedKts);
+ aProp->setDoubleValue("speed", _speed);
}
}
RESTRICT_NONE,
RESTRICT_AT,
RESTRICT_ABOVE,
- RESTRICT_BELOW
+ RESTRICT_BELOW,
+ SPEED_RESTRICT_MACH
} RouteRestriction;
/**
virtual double altitudeFt() const
{ return _altitudeFt; }
- virtual double speedKts() const
- { return _speedKts; }
-
+ virtual double speed() const
+ { return _speed; }
+
+// wrapper - asserts if restriction type is _MACH
+ double speedKts() const;
+
+// wrapper - asserts if restriction type is not _MACH
+ double speedMach() const;
+
virtual RouteRestriction altitudeRestriction() const
{ return _altRestrict; }
static void registerFactory(const std::string aNodeType, FactoryFunction* aFactory);
double _altitudeFt;
- double _speedKts;
+ double _speed; // knots IAS or mach
RouteRestriction _altRestrict;
RouteRestriction _speedRestrict;
private: