#include <simgear/timing/sg_time.hxx>
#include <simgear/math/vector.hxx>
#include <simgear/math/sg_random.h>
+#include <simgear/misc/sg_path.hxx>
#include <simgear/math/sg_geodesy.hxx>
#include <simgear/structure/exception.hxx>
gps_cdi_deflection_node(NULL),
gps_to_flag_node(NULL),
gps_from_flag_node(NULL),
+ gps_has_gs_node(NULL),
last_nav_id(""),
last_nav_vor(false),
play_count(0),
gps_cdi_deflection_node = fgGetNode("/instrumentation/gps/cdi-deflection", true);
gps_to_flag_node = fgGetNode("/instrumentation/gps/to-flag", true);
gps_from_flag_node = fgGetNode("/instrumentation/gps/from-flag", true);
+ gps_has_gs_node = fgGetNode("/instrumentation/gps/has-gs", true);
std::ostringstream temp;
temp << _name << "nav-ident" << _num;
bool nav_serviceable = nav_serviceable_node->getBoolValue();
bool cdi_serviceable = cdi_serviceable_node->getBoolValue();
bool tofrom_serviceable = tofrom_serviceable_node->getBoolValue();
- bool inrange = inrange_node->getBoolValue();
- bool has_gs = has_gs_node->getBoolValue();
+ bool inrange = false;
+ bool has_gs = false;
+ if ( nav_slaved_to_gps_node->getBoolValue() ) {
+ has_gs = gps_has_gs_node->getBoolValue();
+ has_gs_node->setBoolValue( has_gs );
+ inrange = gps_to_flag_node->getBoolValue()
+ || gps_from_flag_node->getBoolValue();
+ } else {
+ has_gs = has_gs_node->getBoolValue();
+ inrange = inrange_node->getBoolValue();
+ }
bool is_loc = loc_node->getBoolValue();
double loc_dist = loc_dist_node->getDoubleValue();
double effective_range_m;
signal_quality_norm, dt );
}
signal_quality_norm_node->setDoubleValue( signal_quality_norm );
- inrange = signal_quality_norm > 0.2;
+ if ( ! nav_slaved_to_gps_node->getBoolValue() ) {
+ /* not slaved to gps */
+ inrange = signal_quality_norm > 0.2;
+ }
inrange_node->setBoolValue( inrange );
if ( !is_loc ) {
// FIXME/FINISHME, what should be set here?
} else if ( inrange ) {
double x = gs_dist_node->getDoubleValue();
- double y = (fgGetDouble("/position/altitude-ft") - nav_elev)
+ double y = (alt_node->getDoubleValue() - nav_elev)
* SG_FEET_TO_METER;
// cout << "dist = " << x << " height = " << y << endl;
- double angle = asin( y / x ) * SGD_RADIANS_TO_DEGREES;
+ double angle = atan2( y, x ) * SGD_RADIANS_TO_DEGREES;
r = (target_gs - angle) * 5.0;
r *= signal_quality_norm;
}
_time_before_search_sec = 1.0;
// cache values locally for speed
- double lon = lon_node->getDoubleValue() * SGD_DEGREES_TO_RADIANS;
- double lat = lat_node->getDoubleValue() * SGD_DEGREES_TO_RADIANS;
- double elev = alt_node->getDoubleValue() * SG_FEET_TO_METER;
-
+ SGGeod pos = SGGeod::fromDegFt(lon_node->getDoubleValue(),
+ lat_node->getDoubleValue(), alt_node->getDoubleValue());
FGNavRecord *nav = NULL;
FGNavRecord *loc = NULL;
FGNavRecord *dme = NULL;
////////////////////////////////////////////////////////////////////////
double freq = freq_node->getDoubleValue();
- nav = globals->get_navlist()->findByFreq(freq, lon, lat, elev);
- dme = globals->get_dmelist()->findByFreq(freq, lon, lat, elev);
+ nav = globals->get_navlist()->findByFreq(freq, pos);
+ dme = globals->get_dmelist()->findByFreq(freq, pos);
if ( nav == NULL ) {
- loc = globals->get_loclist()->findByFreq(freq, lon, lat, elev);
- gs = globals->get_gslist()->findByFreq(freq, lon, lat, elev);
+ loc = globals->get_loclist()->findByFreq(freq, pos);
+ gs = globals->get_gslist()->findByFreq(freq, pos);
}
string nav_id = "";
while ( target_radial > 360.0 ) { target_radial -= 360.0; }
loc_lon = loc->get_lon();
loc_lat = loc->get_lat();
- nav_xyz = loc->get_cart();
+ nav_xyz = loc->cart();
last_nav_id = nav_id;
last_nav_vor = false;
loc_node->setBoolValue( true );
nav_elev = gs->get_elev_ft();
int tmp = (int)(gs->get_multiuse() / 1000.0);
target_gs = (double)tmp / 100.0;
- gs_xyz = gs->get_cart();
+ gs_xyz = gs->cart();
// derive GS baseline (perpendicular to the runay
// along the ground)
nav_elev = nav->get_elev_ft();
twist = nav->get_multiuse();
range = nav->get_range();
- effective_range = adjustNavRange(nav_elev, elev, range);
+ effective_range = adjustNavRange(nav_elev, pos.getElevationM(), range);
target_gs = 0.0;
target_radial = sel_radial_node->getDoubleValue();
- nav_xyz = nav->get_cart();
+ nav_xyz = nav->cart();
if ( globals->get_soundmgr()->exists( nav_fx_name ) ) {
globals->get_soundmgr()->remove( nav_fx_name );