Merge branch 'next' of http://git.gitorious.org/fg/flightgear into next
This commit is contained in:
commit
08af76412e
8 changed files with 99 additions and 28 deletions
|
@ -310,6 +310,8 @@ void FGRouteMgr::update( double dt )
|
||||||
if (w->flag(WPT_DYNAMIC)) continue;
|
if (w->flag(WPT_DYNAMIC)) continue;
|
||||||
totalDistanceRemaining += SGGeodesy::distanceM(prev->position(), w->position());
|
totalDistanceRemaining += SGGeodesy::distanceM(prev->position(), w->position());
|
||||||
prev = w;
|
prev = w;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
wpn->setDoubleValue("dist", totalDistanceRemaining * SG_METER_TO_NM);
|
wpn->setDoubleValue("dist", totalDistanceRemaining * SG_METER_TO_NM);
|
||||||
|
@ -801,7 +803,9 @@ WayptRef FGRouteMgr::waypointFromString(const string& tgt )
|
||||||
void FGRouteMgr::update_mirror()
|
void FGRouteMgr::update_mirror()
|
||||||
{
|
{
|
||||||
mirror->removeChildren("wp");
|
mirror->removeChildren("wp");
|
||||||
for (int i = 0; i < numWaypts(); i++) {
|
|
||||||
|
int num = numWaypts();
|
||||||
|
for (int i = 0; i < num; i++) {
|
||||||
Waypt* wp = _route[i];
|
Waypt* wp = _route[i];
|
||||||
SGPropertyNode *prop = mirror->getChild("wp", i, 1);
|
SGPropertyNode *prop = mirror->getChild("wp", i, 1);
|
||||||
|
|
||||||
|
@ -811,6 +815,15 @@ void FGRouteMgr::update_mirror()
|
||||||
prop->setDoubleValue("longitude-deg", pos.getLongitudeDeg());
|
prop->setDoubleValue("longitude-deg", pos.getLongitudeDeg());
|
||||||
prop->setDoubleValue("latitude-deg",pos.getLatitudeDeg());
|
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) {
|
if (wp->altitudeRestriction() != RESTRICT_NONE) {
|
||||||
double ft = wp->altitudeFt();
|
double ft = wp->altitudeFt();
|
||||||
prop->setDoubleValue("altitude-m", ft * SG_FEET_TO_METER);
|
prop->setDoubleValue("altitude-m", ft * SG_FEET_TO_METER);
|
||||||
|
@ -820,7 +833,9 @@ void FGRouteMgr::update_mirror()
|
||||||
prop->setDoubleValue("altitude-ft", -9999.9);
|
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());
|
prop->setDoubleValue("speed-kts", wp->speedKts());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -924,13 +939,22 @@ void FGRouteMgr::initAtPosition()
|
||||||
}
|
}
|
||||||
|
|
||||||
// on the ground
|
// on the ground
|
||||||
SGGeod pos = SGGeod::fromDegFt(lon->getDoubleValue(), lat->getDoubleValue(), alt->getDoubleValue());
|
SGGeod pos = SGGeod::fromDegFt(lon->getDoubleValue(),
|
||||||
|
lat->getDoubleValue(), alt->getDoubleValue());
|
||||||
|
if (!_departure) {
|
||||||
_departure = FGAirport::findClosest(pos, 20.0);
|
_departure = FGAirport::findClosest(pos, 20.0);
|
||||||
if (!_departure) {
|
if (!_departure) {
|
||||||
SG_LOG(SG_AUTOPILOT, SG_INFO, "initAtPosition: couldn't find an airport within 20nm");
|
SG_LOG(SG_AUTOPILOT, SG_INFO, "initAtPosition: couldn't find an airport within 20nm");
|
||||||
departure->setStringValue("runway", "");
|
departure->setStringValue("runway", "");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string rwy = departure->getStringValue("runway");
|
||||||
|
if (!rwy.empty()) {
|
||||||
|
// runway already set, fine
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
FGRunway* r = _departure->findBestRunwayForPos(pos);
|
FGRunway* r = _departure->findBestRunwayForPos(pos);
|
||||||
if (!r) {
|
if (!r) {
|
||||||
|
|
|
@ -17,6 +17,6 @@ libEnvironment_a_SOURCES = \
|
||||||
ridge_lift.cxx ridge_lift.hxx \
|
ridge_lift.cxx ridge_lift.hxx \
|
||||||
ephemeris.cxx ephemeris.hxx \
|
ephemeris.cxx ephemeris.hxx \
|
||||||
terrainsampler.cxx terrainsampler.cxx \
|
terrainsampler.cxx terrainsampler.cxx \
|
||||||
presets.cxx presets.cxx
|
presets.cxx presets.hxx
|
||||||
|
|
||||||
INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src
|
INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src
|
||||||
|
|
|
@ -27,14 +27,9 @@
|
||||||
|
|
||||||
#include <boost/tuple/tuple.hpp>
|
#include <boost/tuple/tuple.hpp>
|
||||||
|
|
||||||
#include <simgear/constants.h>
|
|
||||||
#include <simgear/debug/logstream.hxx>
|
|
||||||
#include <simgear/math/interpolater.hxx>
|
|
||||||
#include <simgear/props/props.hxx>
|
#include <simgear/props/props.hxx>
|
||||||
#include <simgear/environment/visual_enviro.hxx>
|
|
||||||
|
|
||||||
#include <Main/fg_props.hxx>
|
#include <Main/fg_props.hxx>
|
||||||
#include <signal.h>
|
|
||||||
|
|
||||||
#include "environment.hxx"
|
#include "environment.hxx"
|
||||||
#include "atmosphere.hxx"
|
#include "atmosphere.hxx"
|
||||||
|
@ -472,9 +467,6 @@ FGEnvironment::get_wind_from_down_fps () const
|
||||||
double
|
double
|
||||||
FGEnvironment::get_turbulence_magnitude_norm () const
|
FGEnvironment::get_turbulence_magnitude_norm () const
|
||||||
{
|
{
|
||||||
if( sgEnviro.get_turbulence_enable_state() )
|
|
||||||
if (fgGetBool("/environment/realwx/enabled")||fgGetBool("/environment/metar/valid"))
|
|
||||||
return sgEnviro.get_cloud_turbulence();
|
|
||||||
return turbulence_magnitude_norm;
|
return turbulence_magnitude_norm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -714,7 +714,9 @@ void MapWidget::paintRoute()
|
||||||
legend << '\n' << SGMiscd::roundToInt(wpt->altitudeFt()) << '\'';
|
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";
|
legend << '\n' << SGMiscd::roundToInt(wpt->speedKts()) << "Kts";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -467,7 +467,10 @@ void WaypointList::drawRow(int dx, int dy, int rowIndex, int y)
|
||||||
} // of valid wp altitude
|
} // of valid wp altitude
|
||||||
x += 60 + PUSTR_LGAP;
|
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());
|
count = ::snprintf(buffer, 126, "%dKts", (int) wp->speedKts());
|
||||||
f->drawString(buffer, x, yy);
|
f->drawString(buffer, x, yy);
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,8 +36,11 @@
|
||||||
#include <simgear/structure/exception.hxx>
|
#include <simgear/structure/exception.hxx>
|
||||||
#include <simgear/xml/easyxml.hxx>
|
#include <simgear/xml/easyxml.hxx>
|
||||||
#include <simgear/misc/sg_path.hxx>
|
#include <simgear/misc/sg_path.hxx>
|
||||||
|
#include <simgear/magvar/magvar.hxx>
|
||||||
|
#include <simgear/timing/sg_time.hxx>
|
||||||
|
|
||||||
// FlightGear
|
// FlightGear
|
||||||
|
#include <Main/globals.hxx>
|
||||||
#include <Navaids/procedure.hxx>
|
#include <Navaids/procedure.hxx>
|
||||||
#include <Navaids/waypoint.hxx>
|
#include <Navaids/waypoint.hxx>
|
||||||
#include <Airports/simple.hxx>
|
#include <Airports/simple.hxx>
|
||||||
|
@ -49,13 +52,16 @@ using std::fstream;
|
||||||
|
|
||||||
namespace flightgear {
|
namespace flightgear {
|
||||||
|
|
||||||
|
const double NO_MAG_VAR = -1000.0; // an impossible mag-var value
|
||||||
|
|
||||||
Waypt::Waypt(Route* aOwner) :
|
Waypt::Waypt(Route* aOwner) :
|
||||||
_altitudeFt(0.0),
|
_altitudeFt(0.0),
|
||||||
_speedKts(0.0),
|
_speed(0.0),
|
||||||
_altRestrict(RESTRICT_NONE),
|
_altRestrict(RESTRICT_NONE),
|
||||||
_speedRestrict(RESTRICT_NONE),
|
_speedRestrict(RESTRICT_NONE),
|
||||||
_owner(aOwner),
|
_owner(aOwner),
|
||||||
_flags(0)
|
_flags(0),
|
||||||
|
_magVarDeg(NO_MAG_VAR)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,10 +106,22 @@ void Waypt::setAltitude(double aAlt, RouteRestriction aRestrict)
|
||||||
|
|
||||||
void Waypt::setSpeed(double aSpeed, RouteRestriction aRestrict)
|
void Waypt::setSpeed(double aSpeed, RouteRestriction aRestrict)
|
||||||
{
|
{
|
||||||
_speedKts = aSpeed;
|
_speed = aSpeed;
|
||||||
_speedRestrict = aRestrict;
|
_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>
|
std::pair<double, double>
|
||||||
Waypt::courseAndDistanceFrom(const SGGeod& aPos) const
|
Waypt::courseAndDistanceFrom(const SGGeod& aPos) const
|
||||||
{
|
{
|
||||||
|
@ -116,6 +134,19 @@ Waypt::courseAndDistanceFrom(const SGGeod& aPos) const
|
||||||
return std::make_pair(course, distance);
|
return std::make_pair(course, distance);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double Waypt::magvarDeg() const
|
||||||
|
{
|
||||||
|
if (_magVarDeg == NO_MAG_VAR) {
|
||||||
|
// derived classes with a default pos must override this method
|
||||||
|
assert(!(position() == SGGeod()));
|
||||||
|
|
||||||
|
double jd = globals->get_time_params()->getJD();
|
||||||
|
_magVarDeg = sgGetMagVar(position(), jd);
|
||||||
|
}
|
||||||
|
|
||||||
|
return _magVarDeg;
|
||||||
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
// persistence
|
// persistence
|
||||||
|
|
||||||
|
@ -127,6 +158,7 @@ static RouteRestriction restrictionFromString(const char* aStr)
|
||||||
if (l == "above") return RESTRICT_ABOVE;
|
if (l == "above") return RESTRICT_ABOVE;
|
||||||
if (l == "below") return RESTRICT_BELOW;
|
if (l == "below") return RESTRICT_BELOW;
|
||||||
if (l == "none") return RESTRICT_NONE;
|
if (l == "none") return RESTRICT_NONE;
|
||||||
|
if (l == "mach") return SPEED_RESTRICT_MACH;
|
||||||
|
|
||||||
if (l.empty()) return RESTRICT_NONE;
|
if (l.empty()) return RESTRICT_NONE;
|
||||||
throw sg_io_exception("unknown restriction specification:" + l,
|
throw sg_io_exception("unknown restriction specification:" + l,
|
||||||
|
@ -140,6 +172,8 @@ static const char* restrictionToString(RouteRestriction aRestrict)
|
||||||
case RESTRICT_BELOW: return "below";
|
case RESTRICT_BELOW: return "below";
|
||||||
case RESTRICT_ABOVE: return "above";
|
case RESTRICT_ABOVE: return "above";
|
||||||
case RESTRICT_NONE: return "none";
|
case RESTRICT_NONE: return "none";
|
||||||
|
case SPEED_RESTRICT_MACH: return "mach";
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw sg_exception("invalid route restriction",
|
throw sg_exception("invalid route restriction",
|
||||||
"Route restrictToString");
|
"Route restrictToString");
|
||||||
|
@ -224,7 +258,7 @@ void Waypt::initFromProperties(SGPropertyNode_ptr aProp)
|
||||||
|
|
||||||
if (aProp->hasChild("speed-restrict")) {
|
if (aProp->hasChild("speed-restrict")) {
|
||||||
_speedRestrict = restrictionFromString(aProp->getStringValue("speed-restrict"));
|
_speedRestrict = restrictionFromString(aProp->getStringValue("speed-restrict"));
|
||||||
_speedKts = aProp->getDoubleValue("speed-kts");
|
_speed = aProp->getDoubleValue("speed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -259,7 +293,7 @@ void Waypt::writeToProperties(SGPropertyNode_ptr aProp) const
|
||||||
|
|
||||||
if (_speedRestrict != RESTRICT_NONE) {
|
if (_speedRestrict != RESTRICT_NONE) {
|
||||||
aProp->setStringValue("speed-restrict", restrictionToString(_speedRestrict));
|
aProp->setStringValue("speed-restrict", restrictionToString(_speedRestrict));
|
||||||
aProp->setDoubleValue("speed-kts", _speedKts);
|
aProp->setDoubleValue("speed", _speed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -74,7 +74,8 @@ typedef enum {
|
||||||
RESTRICT_NONE,
|
RESTRICT_NONE,
|
||||||
RESTRICT_AT,
|
RESTRICT_AT,
|
||||||
RESTRICT_ABOVE,
|
RESTRICT_ABOVE,
|
||||||
RESTRICT_BELOW
|
RESTRICT_BELOW,
|
||||||
|
SPEED_RESTRICT_MACH
|
||||||
} RouteRestriction;
|
} RouteRestriction;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -104,8 +105,14 @@ public:
|
||||||
virtual double altitudeFt() const
|
virtual double altitudeFt() const
|
||||||
{ return _altitudeFt; }
|
{ return _altitudeFt; }
|
||||||
|
|
||||||
virtual double speedKts() const
|
virtual double speed() const
|
||||||
{ return _speedKts; }
|
{ 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
|
virtual RouteRestriction altitudeRestriction() const
|
||||||
{ return _altRestrict; }
|
{ return _altRestrict; }
|
||||||
|
@ -149,6 +156,12 @@ public:
|
||||||
bool matches(const SGGeod& aPos) const;
|
bool matches(const SGGeod& aPos) const;
|
||||||
|
|
||||||
virtual std::string type() const = 0;
|
virtual std::string type() const = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Magentic variation at/in the vicinity of the waypoint.
|
||||||
|
* For some waypoint types this will always return 0.
|
||||||
|
*/
|
||||||
|
virtual double magvarDeg() const;
|
||||||
protected:
|
protected:
|
||||||
friend class NavdataVisitor;
|
friend class NavdataVisitor;
|
||||||
|
|
||||||
|
@ -168,7 +181,7 @@ protected:
|
||||||
static void registerFactory(const std::string aNodeType, FactoryFunction* aFactory);
|
static void registerFactory(const std::string aNodeType, FactoryFunction* aFactory);
|
||||||
|
|
||||||
double _altitudeFt;
|
double _altitudeFt;
|
||||||
double _speedKts;
|
double _speed; // knots IAS or mach
|
||||||
RouteRestriction _altRestrict;
|
RouteRestriction _altRestrict;
|
||||||
RouteRestriction _speedRestrict;
|
RouteRestriction _speedRestrict;
|
||||||
private:
|
private:
|
||||||
|
@ -180,7 +193,7 @@ private:
|
||||||
|
|
||||||
Route* _owner;
|
Route* _owner;
|
||||||
unsigned short _flags;
|
unsigned short _flags;
|
||||||
|
mutable double _magVarDeg;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::vector<WayptRef> WayptVec;
|
typedef std::vector<WayptRef> WayptVec;
|
||||||
|
|
|
@ -206,6 +206,9 @@ public:
|
||||||
double headingDegMagnetic() const
|
double headingDegMagnetic() const
|
||||||
{ return _magHeading; }
|
{ return _magHeading; }
|
||||||
|
|
||||||
|
virtual double magvarDeg() const
|
||||||
|
{ return 0.0; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string _ident;
|
std::string _ident;
|
||||||
double _magHeading;
|
double _magHeading;
|
||||||
|
|
Loading…
Reference in a new issue