From 38e76a175e310984da6eced54a0ad9bb7ad8c35f Mon Sep 17 00:00:00 2001 From: jmt Date: Sat, 26 Dec 2009 14:08:37 +0000 Subject: [PATCH] Navradio: constructor cleanup, tie/untie helper, and a new 'operable' property to make it clear when the radio is functioning. --- src/Instrumentation/navradio.cxx | 73 ++++++-------------------------- src/Instrumentation/navradio.hxx | 18 ++++++++ 2 files changed, 32 insertions(+), 59 deletions(-) diff --git a/src/Instrumentation/navradio.cxx b/src/Instrumentation/navradio.cxx index c8c959937..7a8215f3e 100644 --- a/src/Instrumentation/navradio.cxx +++ b/src/Instrumentation/navradio.cxx @@ -94,56 +94,6 @@ FGNavRadio::FGNavRadio(SGPropertyNode *node) : lon_node(fgGetNode("/position/longitude-deg", true)), lat_node(fgGetNode("/position/latitude-deg", true)), alt_node(fgGetNode("/position/altitude-ft", true)), - is_valid_node(NULL), - power_btn_node(NULL), - freq_node(NULL), - alt_freq_node(NULL), - sel_radial_node(NULL), - vol_btn_node(NULL), - ident_btn_node(NULL), - audio_btn_node(NULL), - backcourse_node(NULL), - nav_serviceable_node(NULL), - cdi_serviceable_node(NULL), - gs_serviceable_node(NULL), - tofrom_serviceable_node(NULL), - dme_serviceable_node(NULL), - fmt_freq_node(NULL), - fmt_alt_freq_node(NULL), - heading_node(NULL), - radial_node(NULL), - recip_radial_node(NULL), - target_radial_true_node(NULL), - target_auto_hdg_node(NULL), - time_to_intercept(NULL), - to_flag_node(NULL), - from_flag_node(NULL), - inrange_node(NULL), - signal_quality_norm_node(NULL), - cdi_deflection_node(NULL), - cdi_deflection_norm_node(NULL), - cdi_xtrack_error_node(NULL), - cdi_xtrack_hdg_err_node(NULL), - has_gs_node(NULL), - loc_node(NULL), - loc_dist_node(NULL), - gs_deflection_node(NULL), - gs_deflection_deg_node(NULL), - gs_deflection_norm_node(NULL), - gs_rate_of_climb_node(NULL), - gs_dist_node(NULL), - gs_inrange_node(NULL), - nav_id_node(NULL), - id_c1_node(NULL), - id_c2_node(NULL), - id_c3_node(NULL), - id_c4_node(NULL), - nav_slaved_to_gps_node(NULL), - gps_cdi_deflection_node(NULL), - gps_to_flag_node(NULL), - gps_from_flag_node(NULL), - gps_has_gs_node(NULL), - gps_xtrack_error_nm_node(NULL), play_count(0), last_time(0), target_radial(0.0), @@ -169,6 +119,10 @@ FGNavRadio::FGNavRadio(SGPropertyNode *node) : term_tbl = new SGInterpTable( term.str() ); low_tbl = new SGInterpTable( low.str() ); high_tbl = new SGInterpTable( high.str() ); + + + string branch("/instrumentation/" + _name); + _radio_node = fgGetNode(branch.c_str(), _num, true); } @@ -190,11 +144,7 @@ FGNavRadio::init () morse.init(); - string branch; - branch = "/instrumentation/" + _name; - - SGPropertyNode *node = fgGetNode(branch.c_str(), _num, true ); - + SGPropertyNode* node = _radio_node.get(); bus_power_node = fgGetNode(("/systems/electrical/outputs/" + _name).c_str(), true); @@ -267,8 +217,6 @@ FGNavRadio::init () id_c3_node = node->getChild("nav-id_asc3", 0, true); id_c4_node = node->getChild("nav-id_asc4", 0, true); - node->tie("dme-in-range", SGRawValuePointer(&_dmeInRange)); - // gps slaving support nav_slaved_to_gps_node = node->getChild("slaved-to-gps", 0, true); gps_cdi_deflection_node = fgGetNode("/instrumentation/gps/cdi-deflection", true); @@ -289,13 +237,18 @@ FGNavRadio::init () void FGNavRadio::bind () { - + tie("dme-in-range", SGRawValuePointer(&_dmeInRange)); + tie("operable", SGRawValueMethods(*this, &FGNavRadio::isOperable, NULL)); } void FGNavRadio::unbind () { + for (unsigned int t=0; t<_tiedNodes.size(); ++t) { + _tiedNodes[t]->untie(); + } + _tiedNodes.clear(); } @@ -387,7 +340,8 @@ FGNavRadio::update(double dt) if (power_btn_node->getBoolValue() && (bus_power_node->getDoubleValue() > 1.0) && nav_serviceable_node->getBoolValue() ) - { + { + _operable = true; if (nav_slaved_to_gps_node->getBoolValue()) { updateGPSSlaved(); } else { @@ -419,6 +373,7 @@ void FGNavRadio::clearOutputs() from_flag_node->setBoolValue( false ); _dmeInRange = false; + _operable = false; } void FGNavRadio::updateReceiver(double dt) diff --git a/src/Instrumentation/navradio.hxx b/src/Instrumentation/navradio.hxx index 82e1498bd..fe724a3bd 100644 --- a/src/Instrumentation/navradio.hxx +++ b/src/Instrumentation/navradio.hxx @@ -47,6 +47,7 @@ class FGNavRadio : public SGSubsystem SGInterpTable *low_tbl; SGInterpTable *high_tbl; + SGPropertyNode_ptr _radio_node; SGPropertyNode_ptr lon_node; SGPropertyNode_ptr lat_node; SGPropertyNode_ptr alt_node; @@ -125,6 +126,7 @@ class FGNavRadio : public SGSubsystem // internal (private) values + bool _operable; ///< is the unit serviceable, on, powered, etc int play_count; time_t last_time; FGNavRecordPtr _navaid; @@ -165,6 +167,7 @@ class FGNavRadio : public SGSubsystem double _gsNeedleDeflectionNorm; SGSharedPtr _sgr; + std::vector _tiedNodes; bool updateWithPower(double aDt); @@ -193,6 +196,21 @@ class FGNavRadio : public SGSubsystem */ double localizerWidth(FGNavRecord* aLOC); FGNavRecord* findPrimaryNavaid(const SGGeod& aPos, double aFreqMHz); + + /// accessor for tied, read-only 'operable' property + bool isOperable() const + { return _operable; } + + /** + * Tied-properties helper, record nodes which are tied for easy un-tie-ing + */ + template + void tie(const char* aRelPath, const SGRawValue& aRawValue) + { + SGPropertyNode* nd = _radio_node->getNode(aRelPath, true); + _tiedNodes.push_back(nd); + nd->tie(aRawValue); + } public: FGNavRadio(SGPropertyNode *node);