- 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;
-
- // FIXME: the panel should handle this
- // don't worry about overhead for now,
- // since this is handled only periodically
- int dme_switch_pos = fgGetInt("/radios/dme/switch-position");
- if (dme_switch_pos == 0) {
- dme_freq = 0;
- dme_inrange = false;
- } else if (dme_switch_pos == 1) {
- if (dme_freq != nav1_freq) {
- dme_freq = nav1_freq;
- need_update = true;
- }
- } else if (dme_switch_pos == 3) {
- if (dme_freq != nav2_freq) {
- dme_freq = nav2_freq;
- need_update = true;
- }
- }
-
- FGILS ils;
- FGNav nav;
-
- static string last_nav1_ident = "";
- static string last_nav2_ident = "";
- static string last_adf_ident = "";
- static bool last_nav1_vor = false;
- static bool last_nav2_vor = false;
-
- ////////////////////////////////////////////////////////////////////////
- // Nav1.
- ////////////////////////////////////////////////////////////////////////
-
- if ( current_ilslist->query( lon, lat, elev, nav1_freq, &ils ) ) {
- nav1_ident = ils.get_locident();
- nav1_valid = true;
- if ( last_nav1_ident != nav1_ident || last_nav1_vor ) {
- nav1_trans_ident = ils.get_trans_ident();
- last_nav1_ident = nav1_ident;
- last_nav1_vor = false;
- nav1_loc = true;
- nav1_has_dme = ils.get_has_dme();
- nav1_has_gs = ils.get_has_gs();
-
- nav1_loclon = ils.get_loclon();
- nav1_loclat = ils.get_loclat();
- nav1_gslon = ils.get_gslon();
- nav1_gslat = ils.get_gslat();
- nav1_elev = ils.get_gselev();
- nav1_magvar = 0;
- nav1_range = FG_ILS_DEFAULT_RANGE;
- nav1_effective_range = nav1_range;
- nav1_target_gs = ils.get_gsangle();
- nav1_radial = ils.get_locheading();
- while ( nav1_radial < 0.0 ) { nav1_radial += 360.0; }
- while ( nav1_radial > 360.0 ) { nav1_radial -= 360.0; }
- nav1_x = ils.get_x();
- nav1_y = ils.get_y();
- nav1_z = ils.get_z();
- nav1_gs_x = ils.get_gs_x();
- nav1_gs_y = ils.get_gs_y();
- nav1_gs_z = ils.get_gs_z();
-
-#ifdef ENABLE_AUDIO_SUPPORT
- if ( globals->get_soundmgr()->exists( "nav1-vor-ident" ) ) {
- globals->get_soundmgr()->remove( "nav1-vor-ident" );
- }
- FGSimpleSound *sound;
- sound = morse.make_ident( nav1_trans_ident, LO_FREQUENCY );
- sound->set_volume( 0.3 );
- globals->get_soundmgr()->add( sound, "nav1-vor-ident" );
-
- if ( globals->get_soundmgr()->exists( "nav1-dme-ident" ) ) {
- globals->get_soundmgr()->remove( "nav1-dme-ident" );
- }
- sound = morse.make_ident( nav1_trans_ident, HI_FREQUENCY );
- sound->set_volume( 0.3 );
- globals->get_soundmgr()->add( sound, "nav1-dme-ident" );
-
- int offset = (int)(sg_random() * 30.0);
- nav1_play_count = offset / 4;
- nav1_last_time = globals->get_time_params()->get_cur_time() -
- offset;
- // cout << "offset = " << offset << " play_count = "
- // << nav1_play_count
- // << " nav1_last_time = " << nav1_last_time
- // << " current time = "
- // << globals->get_time_params()->get_cur_time() << endl;
-#endif
-
- // cout << "Found an ils station in range" << endl;
- // cout << " id = " << ils.get_locident() << endl;
- }
- } else if ( current_navlist->query( lon, lat, elev, nav1_freq, &nav ) ) {
- nav1_ident = nav.get_ident();
- nav1_valid = true;
- if ( last_nav1_ident != nav1_ident || !last_nav1_vor ) {
- last_nav1_ident = nav1_ident;
- last_nav1_vor = true;
- nav1_trans_ident = nav.get_trans_ident();
- nav1_loc = false;
- nav1_has_dme = nav.get_has_dme();
- nav1_has_gs = false;
- nav1_loclon = nav.get_lon();
- nav1_loclat = nav.get_lat();
- nav1_elev = nav.get_elev();
- nav1_magvar = nav.get_magvar();
- nav1_range = nav.get_range();
- nav1_effective_range = adjustNavRange(nav1_elev, elev, nav1_range);
- nav1_target_gs = 0.0;
- nav1_radial = nav1_sel_radial;
- nav1_x = nav.get_x();
- nav1_y = nav.get_y();
- nav1_z = nav.get_z();
-
-#ifdef ENABLE_AUDIO_SUPPORT
- if ( globals->get_soundmgr()->exists( "nav1-vor-ident" ) ) {
- globals->get_soundmgr()->remove( "nav1-vor-ident" );
- }
- FGSimpleSound *sound;
- sound = morse.make_ident( nav1_trans_ident, LO_FREQUENCY );
- sound->set_volume( 0.3 );
- if ( globals->get_soundmgr()->add( sound, "nav1-vor-ident" ) ) {
- // cout << "Added nav1-vor-ident sound" << endl;
- } else {
- // cout << "Failed to add v1-vor-ident sound" << endl;
- }
-
- if ( globals->get_soundmgr()->exists( "nav1-dme-ident" ) ) {
- globals->get_soundmgr()->remove( "nav1-dme-ident" );
- }
- sound = morse.make_ident( nav1_trans_ident, HI_FREQUENCY );
- sound->set_volume( 0.3 );
- globals->get_soundmgr()->add( sound, "nav1-dme-ident" );
-
- int offset = (int)(sg_random() * 30.0);
- nav1_play_count = offset / 4;
- nav1_last_time = globals->get_time_params()->get_cur_time() -
- offset;
- // cout << "offset = " << offset << " play_count = "
- // << nav1_play_count << " nav1_last_time = "
- // << nav1_last_time << " current time = "
- // << globals->get_time_params()->get_cur_time() << endl;
-#endif
-
- // cout << "Found a vor station in range" << endl;
- // cout << " id = " << nav.get_ident() << endl;
- }
- } else {
- nav1_valid = false;
- nav1_ident = "";
- nav1_radial = 0;
- nav1_trans_ident = "";
- last_nav1_ident = "";
-#ifdef ENABLE_AUDIO_SUPPORT
- if ( ! globals->get_soundmgr()->remove( "nav1-vor-ident" ) ) {
- // cout << "Failed to remove nav1-vor-ident sound" << endl;
- }
- globals->get_soundmgr()->remove( "nav1-dme-ident" );
-#endif
- // cout << "not picking up vor1. :-(" << endl;
- }
-
-
- ////////////////////////////////////////////////////////////////////////
- // Nav2.
- ////////////////////////////////////////////////////////////////////////
-
- if ( current_ilslist->query( lon, lat, elev, nav2_freq, &ils ) ) {
- nav2_ident = ils.get_locident();
- nav2_valid = true;
- if ( last_nav2_ident != nav2_ident || last_nav2_vor ) {
- last_nav2_ident = nav2_ident;
- last_nav2_vor = false;
- nav2_trans_ident = ils.get_trans_ident();
- nav2_loc = true;
- nav2_has_dme = ils.get_has_dme();
- nav2_has_gs = ils.get_has_gs();
-
- nav2_loclon = ils.get_loclon();
- nav2_loclat = ils.get_loclat();
- nav2_elev = ils.get_gselev();
- nav2_magvar = 0;
- nav2_range = FG_ILS_DEFAULT_RANGE;
- nav2_effective_range = nav2_range;
- nav2_target_gs = ils.get_gsangle();
- nav2_radial = ils.get_locheading();
- while ( nav2_radial < 0.0 ) { nav2_radial += 360.0; }
- while ( nav2_radial > 360.0 ) { nav2_radial -= 360.0; }
- nav2_x = ils.get_x();
- nav2_y = ils.get_y();
- nav2_z = ils.get_z();
- nav2_gs_x = ils.get_gs_x();
- nav2_gs_y = ils.get_gs_y();
- nav2_gs_z = ils.get_gs_z();
-
-#ifdef ENABLE_AUDIO_SUPPORT
- if ( globals->get_soundmgr()->exists( "nav2-vor-ident" ) ) {
- globals->get_soundmgr()->remove( "nav2-vor-ident" );
- }
- FGSimpleSound *sound;
- sound = morse.make_ident( nav2_trans_ident, LO_FREQUENCY );
- sound->set_volume( 0.3 );
- globals->get_soundmgr()->add( sound, "nav2-vor-ident" );
-
- if ( globals->get_soundmgr()->exists( "nav2-dme-ident" ) ) {
- globals->get_soundmgr()->remove( "nav2-dme-ident" );
- }
- sound = morse.make_ident( nav2_trans_ident, HI_FREQUENCY );
- sound->set_volume( 0.3 );
- globals->get_soundmgr()->add( sound, "nav2-dme-ident" );
-
- int offset = (int)(sg_random() * 30.0);
- nav2_play_count = offset / 4;
- nav2_last_time = globals->get_time_params()->get_cur_time() -
- offset;
- // cout << "offset = " << offset << " play_count = "
- // << nav2_play_count << " nav2_last_time = "
- // << nav2_last_time << " current time = "
- // << globals->get_time_params()->get_cur_time() << endl;
-#endif
-
- // cout << "Found an ils station in range" << endl;
- // cout << " id = " << ils.get_locident() << endl;
- }
- } else if ( current_navlist->query( lon, lat, elev, nav2_freq, &nav ) ) {
- nav2_ident = nav.get_ident();
- nav2_valid = true;
- if ( last_nav2_ident != nav2_ident || !last_nav2_vor ) {
- last_nav2_ident = nav2_ident;
- last_nav2_vor = true;
- nav2_trans_ident = nav.get_trans_ident();
- nav2_loc = false;
- nav2_has_dme = nav.get_has_dme();
- nav2_has_dme = false;
- nav2_loclon = nav.get_lon();
- nav2_loclat = nav.get_lat();
- nav2_elev = nav.get_elev();
- nav2_magvar = nav.get_magvar();
- nav2_range = nav.get_range();
- nav2_effective_range = adjustNavRange(nav2_elev, elev, nav2_range);
- nav2_target_gs = 0.0;
- nav2_radial = nav2_sel_radial;
- nav2_x = nav.get_x();
- nav2_y = nav.get_y();
- nav2_z = nav.get_z();
-
-#ifdef ENABLE_AUDIO_SUPPORT
- if ( globals->get_soundmgr()->exists( "nav2-vor-ident" ) ) {
- globals->get_soundmgr()->remove( "nav2-vor-ident" );
- }
- FGSimpleSound *sound;
- sound = morse.make_ident( nav2_trans_ident, LO_FREQUENCY );
- sound->set_volume( 0.3 );
- globals->get_soundmgr()->add( sound, "nav2-vor-ident" );
-
- if ( globals->get_soundmgr()->exists( "nav2-dme-ident" ) ) {
- globals->get_soundmgr()->remove( "nav2-dme-ident" );
- }
- sound = morse.make_ident( nav2_trans_ident, HI_FREQUENCY );
- sound->set_volume( 0.3 );
- globals->get_soundmgr()->add( sound, "nav2-dme-ident" );
-
- int offset = (int)(sg_random() * 30.0);
- nav2_play_count = offset / 4;
- nav2_last_time = globals->get_time_params()->get_cur_time() -
- offset;
- // cout << "offset = " << offset << " play_count = "
- // << nav2_play_count << " nav2_last_time = "
- // << nav2_last_time << " current time = "
- // << globals->get_time_params()->get_cur_time() << endl;
-#endif
-
- // cout << "Found a vor station in range" << endl;
- // cout << " id = " << nav.get_ident() << endl;
- }
- } else {
- nav2_valid = false;
- nav2_ident = "";
- nav2_radial = 0;
- nav2_trans_ident = "";
- last_nav2_ident = "";
-#ifdef ENABLE_AUDIO_SUPPORT
- globals->get_soundmgr()->remove( "nav2-vor-ident" );
- globals->get_soundmgr()->remove( "nav2-dme-ident" );
-#endif
- // cout << "not picking up vor1. :-(" << endl;
- }
-
-
- ////////////////////////////////////////////////////////////////////////
- // DME
- ////////////////////////////////////////////////////////////////////////
-
- if ( current_ilslist->query( lon, lat, elev, dme_freq, &ils ) ) {
- if (ils.get_has_dme()) {
- dme_valid = true;
- dme_lon = ils.get_loclon();
- dme_lat = ils.get_loclat();
- dme_elev = ils.get_gselev();
- dme_range = FG_ILS_DEFAULT_RANGE;
- dme_effective_range = kludgeRange(dme_elev, elev, dme_range);
- dme_x = ils.get_dme_x();
- dme_y = ils.get_dme_y();
- dme_z = ils.get_dme_z();
- }
- } else if ( current_navlist->query( lon, lat, elev, dme_freq, &nav ) ) {
- if (nav.get_has_dme()) {
- dme_valid = true;
- dme_lon = nav.get_lon();
- dme_lat = nav.get_lat();
- dme_elev = nav.get_elev();
- dme_range = nav.get_range();
- dme_effective_range = kludgeRange(dme_elev, elev, dme_range);
- dme_x = nav.get_x();
- dme_y = nav.get_y();
- dme_z = nav.get_z();
- }
- } else {
- dme_valid = false;
- dme_dist = 0;
- }
-
-
- ////////////////////////////////////////////////////////////////////////
- // 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;
-
-
- ////////////////////////////////////////////////////////////////////////
- // ADF.
- ////////////////////////////////////////////////////////////////////////
-
- if ( current_navlist->query( lon, lat, elev, adf_freq, &nav ) ) {
- char freq[128];
-#if defined( _MSC_VER ) || defined(__MINGW32__)
- _snprintf( freq, 10, "%.0f", adf_freq );
-#else
- snprintf( freq, 10, "%.0f", adf_freq );
-#endif
- adf_ident = freq;
- adf_ident += nav.get_ident();
- // cout << "adf ident = " << adf_ident << endl;
- adf_valid = true;
- if ( last_adf_ident != adf_ident ) {
- last_adf_ident = adf_ident;
-
- adf_trans_ident = nav.get_trans_ident();
- adf_lon = nav.get_lon();
- adf_lat = nav.get_lat();
- adf_elev = nav.get_elev();
- adf_range = nav.get_range();
- adf_effective_range = kludgeRange(adf_elev, elev, adf_range);
- adf_x = nav.get_x();
- adf_y = nav.get_y();
- adf_z = nav.get_z();
-
-#ifdef ENABLE_AUDIO_SUPPORT
- if ( globals->get_soundmgr()->exists( "adf-ident" ) ) {
- globals->get_soundmgr()->remove( "adf-ident" );
- }
- FGSimpleSound *sound;
- sound = morse.make_ident( adf_trans_ident, LO_FREQUENCY );
- sound->set_volume( 0.3 );
- globals->get_soundmgr()->add( sound, "adf-ident" );
-
- int offset = (int)(sg_random() * 30.0);
- adf_play_count = offset / 4;
- adf_last_time = globals->get_time_params()->get_cur_time() -
- offset;
- // cout << "offset = " << offset << " play_count = "
- // << adf_play_count << " adf_last_time = "
- // << adf_last_time << " current time = "
- // << globals->get_time_params()->get_cur_time() << endl;
-#endif
-
- // cout << "Found an adf station in range" << endl;
- // cout << " id = " << nav.get_ident() << endl;
- }
- } else {
- adf_valid = false;
- adf_ident = "";
- adf_trans_ident = "";
-#ifdef ENABLE_AUDIO_SUPPORT
- globals->get_soundmgr()->remove( "adf-ident" );
-#endif
- last_adf_ident = "";
- // cout << "not picking up adf. :-(" << endl;
- }
-}
-
-
-// return the amount of heading needle deflection, returns a value
-// clamped to the range of ( -10 , 10 )
-double FGRadioStack::get_nav1_heading_needle_deflection() const {
- double r;
-
- if ( nav1_inrange ) {
- r = nav1_heading - nav1_radial;
- // cout << "Radial = " << nav1_radial
- // << " Bearing = " << nav1_heading << endl;
-
- while ( r > 180.0 ) { r -= 360.0;}
- while ( r < -180.0 ) { r += 360.0;}
- if ( fabs(r) > 90.0 ) {
- r = ( r<0.0 ? -r-180.0 : -r+180.0 );
- if ( nav1_loc ) {
- r = -r;
- }
- }
-
- // According to Robin Peel, the ILS is 4x more sensitive than a vor
- if ( nav1_loc ) { r *= 4.0; }
- if ( r < -10.0 ) { r = -10.0; }
- if ( r > 10.0 ) { r = 10.0; }
- } else {
- r = 0.0;
- }
-
- return r;
-}
-
-// return the amount of heading needle deflection, returns a value
-// clamped to the range of ( -10 , 10 )
-double FGRadioStack::get_nav2_heading_needle_deflection() const {
- double r;
-
- if ( nav2_inrange ) {
- r = nav2_heading - nav2_radial;
- // cout << "Radial = " << nav2_radial
- // << " Bearing = " << nav2_heading << endl;
-
- while (r> 180.0) r-=360.0;
- while (r<-180.0) r+=360.0;
- if ( fabs(r) > 90.0 )
- r = ( r<0.0 ? -r-180.0 : -r+180.0 );
- // According to Robin Peel, the ILS is 4x more sensitive than a vor
- if ( nav2_loc ) r *= 4.0;
- if ( r < -10.0 ) r = -10.0;
- if ( r > 10.0 ) r = 10.0;
- } else {
- r = 0.0;
- }
-
- return r;
-}
-
-// return the amount of glide slope needle deflection (.i.e. the
-// number of degrees we are off the glide slope * 5.0
-double FGRadioStack::get_nav1_gs_needle_deflection() const {
- if ( nav1_inrange && nav1_has_gs ) {
- double x = nav1_gs_dist;
- double y = (fgGetDouble("/position/altitude-ft") - nav1_elev)
- * SG_FEET_TO_METER;
- double angle = atan2( y, x ) * SGD_RADIANS_TO_DEGREES;
- return (nav1_target_gs - angle) * 5.0;
- } else {
- return 0.0;
- }
-}
-
-
-// return the amount of glide slope needle deflection (.i.e. the
-// number of degrees we are off the glide slope * 5.0
-double FGRadioStack::get_nav2_gs_needle_deflection() const {
- if ( nav2_inrange && nav2_has_gs ) {
- double x = nav2_gs_dist;
- double y = (fgGetDouble("/position/altitude-ft") - nav2_elev)
- * SG_FEET_TO_METER;
- double angle = atan2( y, x ) * SGD_RADIANS_TO_DEGREES;
- return (nav2_target_gs - angle) * 5.0;
- } else {
- return 0.0;
- }
-}
-
-
-/**
- * Return true if the NAV1 TO flag should be active.
- */
-bool
-FGRadioStack::get_nav1_to_flag () const
-{
- if (nav1_inrange) {
- double offset = fabs(nav1_heading - nav1_radial);
- if (nav1_loc)
- return true;
- else
- return (offset <= 90.0 || offset >= 270.0);
- } else {
- return false;
- }
-}
-
-
-/**
- * Return true if the NAV1 FROM flag should be active.
- */
-bool
-FGRadioStack::get_nav1_from_flag () const
-{
- if (nav1_inrange) {
- double offset = fabs(nav1_heading - nav1_radial);
- if (nav1_loc)
- return false;
- else
- return (offset > 90.0 && offset < 270.0);
- } else {
- return false;
- }
-}
-
-
-/**
- * Return true if the NAV2 TO flag should be active.
- */
-bool
-FGRadioStack::get_nav2_to_flag () const
-{
- if (nav2_inrange) {
- double offset = fabs(nav2_heading - nav2_radial);
- if (nav2_loc)
- return true;
- else
- return (offset <= 90.0 || offset >= 270.0);
- } else {
- return false;
- }
-}
-
-
-/**
- * Return true if the NAV2 FROM flag should be active.
- */
-bool
-FGRadioStack::get_nav2_from_flag () const
-{
- if (nav2_inrange) {
- double offset = fabs(nav2_heading - nav2_radial);
- if (nav2_loc)
- return false;
- else
- return (offset > 90.0 && offset < 270.0);
- } else {
- return false;
- }