#include <simgear/sg_inlines.h>
#include <simgear/math/sg_geodesy.hxx>
#include <simgear/structure/exception.hxx>
+#include <simgear/scene/util/OsgMath.hxx>
using std::auto_ptr;
using std::string;
{
double lon = _lon->getDoubleValue(),
lat = _lat->getDoubleValue();
+
+ if (osg::isNaN(lon) || osg::isNaN(lat)) {
+ SG_LOG(SG_INSTR, SG_WARN, "read NaN for lon/lat:" << _lon->getPath()
+ << ", " << _lat->getPath());
+ return SGGeod();
+ }
+
if (_alt) {
return SGGeod::fromDegFt(lon, lat, _alt->getDoubleValue());
} else {
GPS::bind()
{
_config.bind(this, _gpsNode->getChild("config", 0, true));
+
// basic GPS outputs
tie(_gpsNode, "selected-course-deg", SGRawValueMethods<GPS, double>
(*this, &GPS::getSelectedCourse, &GPS::setSelectedCourse));
-
+
tie(_gpsNode, "desired-course-deg", SGRawValueMethods<GPS, double>
(*this, &GPS::getDesiredCourse, NULL));
_desiredCourseNode = _gpsNode->getChild("desired-course-deg", 0, true);
tie(_gpsNode, "indicated-ground-speed-kt", SGRawValueMethods<GPS, double>
(*this, &GPS::getGroundspeedKts, NULL));
-// command system
+// command system
tie(_gpsNode, "mode", SGRawValueMethods<GPS, const char*>(*this, &GPS::getMode, NULL));
tie(_gpsNode, "command", SGRawValueMethods<GPS, const char*>(*this, &GPS::getCommand, &GPS::setCommand));
void
GPS::unbind()
{
- for (unsigned int t=0; t<_tiedNodes.size(); ++t) {
- _tiedNodes[t]->untie();
- }
- _tiedNodes.clear();
+ _tiedProperties.Untie();
}
void
} // of init mode check
_last_pos = _indicated_pos;
- _lastPosValid = true;
+ _lastPosValid = !(_last_pos == SGGeod());
}
///////////////////////////////////////////////////////////////////////////
if (!_ref_navaid_set) {
_ref_navaid_elapsed += dt;
if (_ref_navaid_elapsed > 5.0) {
- _ref_navaid_elapsed = 0.0;
FGPositioned::TypeFilter vorFilter(FGPositioned::VOR);
FGPositionedRef nav = FGPositioned::findClosest(_indicated_pos, 400.0, &vorFilter);
if (!nav) {
- SG_LOG(SG_INSTR, SG_INFO, "GPS couldn't find a reference navid");
+ SG_LOG(SG_INSTR, SG_INFO, "GPS couldn't find a reference navaid");
_ref_navaid_id_node->setStringValue("");
_ref_navaid_name_node->setStringValue("");
_ref_navaid_bearing_node->setDoubleValue(0.0);
}
_ref_navaid = nav;
+ // reset elapsed time (do not do that before updating the properties above, since their
+ // listeners may request another update (_ref_navaid_elapsed = 9999), which results in
+ // excessive load (FGPositioned::findClosest called in every update loop...)
+ _ref_navaid_elapsed = 0.0;
}
}
int index = _routeMgr->currentIndex(),
count = _routeMgr->numWaypts();
if ((index < 0) || (index >= count)) {
+ _currentWaypt=NULL;
+ _prevWaypt=NULL;
SG_LOG(SG_INSTR, SG_ALERT, "GPS: malformed route, index=" << index);
return;
}
void GPS::wp1Changed()
{
+ if (!_currentWaypt)
+ return;
if (_mode == "leg") {
_wayptController.reset(WayptController::createForWaypt(this, _currentWaypt));
} else if (_mode == "obs") {
const char* GPS::getWP0Ident() const
{
- if (!_dataValid || (_mode != "leg")) {
+ if (!_dataValid || (_mode != "leg") || (!_prevWaypt)) {
return "";
}
const char* GPS::getWP1Ident() const
{
- if (!_dataValid) {
+ if ((!_dataValid)||(!_currentWaypt)) {
return "";
}
double GPS::getWP1MagBearing() const
{
- if (!_dataValid) {
+ if (!_dataValid || !_wayptController.get()) {
return -9999.0;
}