// Destructor
FGNavRadio::~FGNavRadio()
{
+ gps_course_node->removeChangeListener(this);
+ nav_slaved_to_gps_node->removeChangeListener(this);
+
delete term_tbl;
delete low_tbl;
delete high_tbl;
// gps slaving support
nav_slaved_to_gps_node = node->getChild("slaved-to-gps", 0, true);
+ nav_slaved_to_gps_node->addChangeListener(this);
+
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);
- gps_course_node = fgGetNode("/instrumentation/gps/selected-course-deg", true);
+ gps_course_node = fgGetNode("/instrumentation/gps/desired-course-deg", true);
+ gps_course_node->addChangeListener(this);
+
gps_xtrack_error_nm_node = fgGetNode("/instrumentation/gps/wp/wp[1]/course-error-nm", true);
_magvarNode = fgGetNode("/environment/magnetic-variation-deg", true);
gs_deflection_deg_node->setDoubleValue(0.0);
gs_deflection_norm_node->setDoubleValue(0.0);
gs_inrange_node->setBoolValue( false );
+ loc_node->setBoolValue( false );
+ has_gs_node->setBoolValue(false);
to_flag_node->setBoolValue( false );
from_flag_node->setBoolValue( false );
_dmeInRange = (dme_distance < _dme->get_range() * SG_NM_TO_METER);
}
+ void FGNavRadio::valueChanged (SGPropertyNode* prop)
+ {
+ if (prop == gps_course_node) {
+ if (!nav_slaved_to_gps_node->getBoolValue()) {
+ return;
+ }
+
+ // GPS desired course has changed, sync up our selected-course
+ double v = prop->getDoubleValue();
+ if (v != sel_radial_node->getDoubleValue()) {
+ sel_radial_node->setDoubleValue(v);
+ }
+ } else if (prop == nav_slaved_to_gps_node) {
+ if (prop->getBoolValue()) {
+ // slaved-to-GPS activated, sync up selected course
+ sel_radial_node->setDoubleValue(gps_course_node->getDoubleValue());
+ }
+ }
+ }
+
void FGNavRadio::updateGPSSlaved()
{
has_gs_node->setBoolValue(gps_has_gs_node->getBoolValue());
_gs = NULL;
_dme = NULL;
nav_id_node->setStringValue("");
-
+ loc_node->setBoolValue(false);
+ has_gs_node->setBoolValue(false);
+
_sgr->remove( nav_fx_name );
_sgr->remove( dme_fx_name );
}
double FGNavRadio::localizerWidth(FGNavRecord* aLOC)
{
FGRunway* rwy = aLOC->runway();
- assert(rwy);
+ if (!rwy) {
+ return 6.0; // no runway associated, return default value
+ }
+
SGVec3d thresholdCart(SGVec3d::fromGeod(rwy->threshold()));
double axisLength = dist(aLOC->cart(), thresholdCart);