#include <Navaids/ilslist.hxx>
#include <Navaids/mkrbeacons.hxx>
#include <Navaids/navlist.hxx>
-#include <Time/FGEventMgr.hxx>
#include "radiostack.hxx"
FGRadioStack *current_radiostack;
-/**
- * Boy, this is ugly! Make the VOR range vary by altitude difference.
- */
-static double kludgeRange ( double stationElev, double aircraftElev,
- double nominalRange)
-{
- // Assume that the nominal range (usually
- // 50nm) applies at a 5,000 ft difference.
- // Just a wild guess!
- double factor = ((aircraftElev*SG_METER_TO_FEET) - stationElev) / 5000.0;
- double range = fabs(nominalRange * factor);
-
- // Clamp the range to keep it sane; for
- // now, never less than 25% or more than
- // 500% of nominal range.
- if (range < nominalRange/4.0) {
- range = nominalRange/4.0;
- } else if (range > nominalRange*5.0) {
- range = nominalRange*5.0;
- }
-
- return range;
-}
-
-
// Constructor
-FGRadioStack::FGRadioStack() :
- lon_node(fgGetNode("/position/longitude-deg", true)),
- lat_node(fgGetNode("/position/latitude-deg", true)),
- alt_node(fgGetNode("/position/altitude-ft", true)),
- need_update(true),
- outer_blink(false),
- middle_blink(false),
- inner_blink(false)
-{
- SGPath path( globals->get_fg_root() );
- SGPath term = path;
- term.append( "Navaids/range.term" );
- SGPath low = path;
- low.append( "Navaids/range.low" );
- SGPath high = path;
- high.append( "Navaids/range.high" );
-
- term_tbl = new SGInterpTable( term.str() );
- low_tbl = new SGInterpTable( low.str() );
- high_tbl = new SGInterpTable( high.str() );
+FGRadioStack::FGRadioStack() {
}
// Destructor
FGRadioStack::~FGRadioStack()
{
+ adf.unbind();
+ beacon.unbind();
navcom1.unbind();
navcom2.unbind();
- adf.unbind();
xponder.unbind();
- unbind(); // FIXME: should be called externally
-
- delete term_tbl;
- delete low_tbl;
- delete high_tbl;
}
navcom2.init();
adf.init();
- xponder.init();
-
- morse.init();
beacon.init();
- blink.stamp();
+ xponder.init();
search();
- navcom1.search();
- navcom2.search();
- adf.search();
- xponder.search();
-
update(0); // FIXME: use dt
- navcom1.update(0);
- navcom2.update(0);
- adf.update(0);
- xponder.update(0);
// Search radio database once per second
- global_events.Register( "fgRadioSearch()",
- current_radiostack, &FGRadioStack::search,
- 1000 );
+ globals->get_event_mgr()->add( "fgRadioSearch()", current_radiostack,
+ &FGRadioStack::search, 1000 );
}
void
FGRadioStack::bind ()
{
-
- fgTie("/radios/marker-beacon/inner", this,
- &FGRadioStack::get_inner_blink);
-
- fgTie("/radios/marker-beacon/middle", this,
- &FGRadioStack::get_middle_blink);
-
- fgTie("/radios/marker-beacon/outer", this,
- &FGRadioStack::get_outer_blink);
-
adf.bind();
+ beacon.bind();
dme.bind();
navcom1.set_bind_index( 0 );
navcom1.bind();
void
FGRadioStack::unbind ()
{
- fgUntie("/radios/marker-beacon/inner");
- fgUntie("/radios/marker-beacon/middle");
- fgUntie("/radios/marker-beacon/outer");
-
adf.unbind();
+ beacon.unbind();
dme.unbind();
navcom1.unbind();
navcom2.unbind();
void
FGRadioStack::update(double dt)
{
- need_update = false;
-
adf.update( dt );
+ beacon.update( dt );
navcom1.update( dt );
navcom2.update( dt );
dme.update( dt ); // dme is updated after the navcom's
xponder.update( dt );
-
- // marker beacon blinking
- bool light_on = ( outer_blink || middle_blink || inner_blink );
- SGTimeStamp current;
- current.stamp();
-
- if ( light_on && (current - blink > 400000) ) {
- light_on = false;
- blink.stamp();
- } else if ( !light_on && (current - blink > 100000) ) {
- light_on = true;
- blink.stamp();
- }
-
- if ( outer_marker ) {
- outer_blink = light_on;
- } else {
- outer_blink = false;
- }
-
- if ( middle_marker ) {
- middle_blink = light_on;
- } else {
- middle_blink = false;
- }
-
- if ( inner_marker ) {
- inner_blink = light_on;
- } else {
- inner_blink = false;
- }
-
- // cout << outer_blink << " " << middle_blink << " " << inner_blink << endl;
}
// Update current nav/adf radio stations based on current postition
void FGRadioStack::search()
{
- static FGMkrBeacon::fgMkrBeacType last_beacon = FGMkrBeacon::NOBEACON;
-
- 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;
-
adf.search();
+ beacon.search();
navcom1.search();
navcom2.search();
dme.search();
xponder.search();
-
- ////////////////////////////////////////////////////////////////////////
- // Beacons.
- ////////////////////////////////////////////////////////////////////////
-
- FGMkrBeacon::fgMkrBeacType beacon_type
- = current_beacons->query( lon * SGD_RADIANS_TO_DEGREES,
- lat * SGD_RADIANS_TO_DEGREES, elev );
-
- outer_marker = middle_marker = inner_marker = false;
-
- if ( beacon_type == FGMkrBeacon::OUTER ) {
- outer_marker = true;
- // cout << "OUTER MARKER" << endl;
-#ifdef ENABLE_AUDIO_SUPPORT
- if ( last_beacon != FGMkrBeacon::OUTER ) {
- if ( ! globals->get_soundmgr()->exists( "outer-marker" ) ) {
- FGSimpleSound *sound = beacon.get_outer();
- sound->set_volume( 0.3 );
- globals->get_soundmgr()->add( sound, "outer-marker" );
- }
- if ( !globals->get_soundmgr()->is_playing("outer-marker") ) {
- globals->get_soundmgr()->play_looped( "outer-marker" );
- }
- }
-#endif
- } else if ( beacon_type == FGMkrBeacon::MIDDLE ) {
- middle_marker = true;
- // cout << "MIDDLE MARKER" << endl;
-#ifdef ENABLE_AUDIO_SUPPORT
- if ( last_beacon != FGMkrBeacon::MIDDLE ) {
- if ( ! globals->get_soundmgr()->exists( "middle-marker" ) ) {
- FGSimpleSound *sound = beacon.get_middle();
- sound->set_volume( 0.3 );
- globals->get_soundmgr()->add( sound, "middle-marker" );
- }
- if ( !globals->get_soundmgr()->is_playing("middle-marker") ) {
- globals->get_soundmgr()->play_looped( "middle-marker" );
- }
- }
-#endif
- } else if ( beacon_type == FGMkrBeacon::INNER ) {
- inner_marker = true;
- // cout << "INNER MARKER" << endl;
-#ifdef ENABLE_AUDIO_SUPPORT
- if ( last_beacon != FGMkrBeacon::INNER ) {
- if ( ! globals->get_soundmgr()->exists( "inner-marker" ) ) {
- FGSimpleSound *sound = beacon.get_inner();
- sound->set_volume( 0.3 );
- globals->get_soundmgr()->add( sound, "inner-marker" );
- }
- if ( !globals->get_soundmgr()->is_playing("inner-marker") ) {
- globals->get_soundmgr()->play_looped( "inner-marker" );
- }
- }
-#endif
- } else {
- // cout << "no marker" << endl;
-#ifdef ENABLE_AUDIO_SUPPORT
- globals->get_soundmgr()->stop( "outer-marker" );
- globals->get_soundmgr()->stop( "middle-marker" );
- globals->get_soundmgr()->stop( "inner-marker" );
-#endif
- }
- last_beacon = beacon_type;
}