1
0
Fork 0

Fix ADF bugs ... including still driving the needle when power off.

ADF bug fixes from John Denker.  Changes from current behaviour are:
* Include the power button in the electrical checks
* Raise the required input voltage from 1V to 8V
* Don't reset the heading to 90 degrees when out of range or no power
  (heading is now only reset to 90 in ANT or TEST mode)
This commit is contained in:
John Denker 2009-11-30 03:19:17 -07:00 committed by Dave Luff
parent d0a2fbba99
commit 3dd75394af
2 changed files with 15 additions and 9 deletions

View file

@ -101,6 +101,10 @@ ADF::init ()
_bearing_node = node->getChild("indicated-bearing-deg", 0, true); _bearing_node = node->getChild("indicated-bearing-deg", 0, true);
_ident_node = node->getChild("ident", 0, true); _ident_node = node->getChild("ident", 0, true);
_ident_audible_node = node->getChild("ident-audible", 0, true); _ident_audible_node = node->getChild("ident-audible", 0, true);
_power_btn_node = node->getChild("power-btn", 0, true);
if (_power_btn_node->getType() == simgear::props::NONE)
_power_btn_node->setBoolValue(true); // front end didn't implement a power button
SGSoundMgr *smgr = globals->get_soundmgr(); SGSoundMgr *smgr = globals->get_soundmgr();
_sgr = smgr->find("avionics", true); _sgr = smgr->find("avionics", true);
@ -117,13 +121,19 @@ void
ADF::update (double delta_time_sec) ADF::update (double delta_time_sec)
{ {
// If it's off, don't waste any time. // If it's off, don't waste any time.
if (_electrical_node->getDoubleValue() < 1.0 if (_electrical_node->getDoubleValue() < 8.0
|| !_serviceable_node->getBoolValue()) { || !_serviceable_node->getBoolValue()
set_bearing(delta_time_sec, 90); || !_power_btn_node->getBoolValue() ) {
_ident_node->setStringValue(""); _ident_node->setStringValue("");
return; return;
} }
string mode = _mode_node->getStringValue();
if (mode == "ant" || mode == "test") set_bearing(delta_time_sec, 90);
if (mode != "bfo" && mode != "adf") {
_ident_node->setStringValue("");
return;
}
// Get the frequency // Get the frequency
int frequency_khz = _frequency_node->getIntValue(); int frequency_khz = _frequency_node->getIntValue();
if (frequency_khz != _last_frequency_khz) { if (frequency_khz != _last_frequency_khz) {
@ -144,11 +154,7 @@ ADF::update (double delta_time_sec)
if (_time_before_search_sec < 0) if (_time_before_search_sec < 0)
search(frequency_khz, longitude_rad, latitude_rad, altitude_m); search(frequency_khz, longitude_rad, latitude_rad, altitude_m);
// If it's off, don't bother. if (!_transmitter_valid) {
string mode = _mode_node->getStringValue();
if (!_transmitter_valid || (mode != "bfo" && mode != "adf"))
{
set_bearing(delta_time_sec, 90);
_ident_node->setStringValue(""); _ident_node->setStringValue("");
return; return;
} }
@ -208,7 +214,6 @@ ADF::update (double delta_time_sec)
} }
} else { } else {
_in_range_node->setBoolValue(false); _in_range_node->setBoolValue(false);
set_bearing(delta_time_sec, 90);
_ident_node->setStringValue(""); _ident_node->setStringValue("");
_sgr->stop( _adf_ident ); _sgr->stop( _adf_ident );
} }

View file

@ -82,6 +82,7 @@ private:
SGPropertyNode_ptr _ident_node; SGPropertyNode_ptr _ident_node;
SGPropertyNode_ptr _ident_audible_node; SGPropertyNode_ptr _ident_audible_node;
SGPropertyNode_ptr _volume_node; SGPropertyNode_ptr _volume_node;
SGPropertyNode_ptr _power_btn_node;
double _time_before_search_sec; double _time_before_search_sec;