X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCockpit%2Fradiostack.cxx;h=64f6fe43c2478b843f06d5b86c1f6ad77fb9dc8d;hb=470292a4341334820681d6d6e2ecc6039b8d6dd6;hp=842adf82e8f0b6ccad0091d4d772d546d3dac308;hpb=c5bd20c21d0660b6d8a4455d3cc75b08c1919dfc;p=flightgear.git diff --git a/src/Cockpit/radiostack.cxx b/src/Cockpit/radiostack.cxx index 842adf82e..64f6fe43c 100644 --- a/src/Cockpit/radiostack.cxx +++ b/src/Cockpit/radiostack.cxx @@ -29,7 +29,8 @@ #include #include -#include
+#include +//#include #include #include #include @@ -37,6 +38,9 @@ #include "radiostack.hxx" +#include +SG_USING_STD(string); + static int nav1_play_count = 0; static int nav2_play_count = 0; static int adf_play_count = 0; @@ -79,15 +83,41 @@ static void fgRadioSearch( void ) { } // Constructor -FGRadioStack::FGRadioStack() { - nav1_radial = 0.0; - nav1_dme_dist = 0.0; - nav2_radial = 0.0; - nav2_dme_dist = 0.0; - need_update = true; - longitudeVal = fgGetValue("/position/longitude"); - latitudeVal = fgGetValue("/position/latitude"); - altitudeVal = fgGetValue("/position/altitude"); +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), + comm1_freq(0.0), + comm1_alt_freq(0.0), + comm2_freq(0.0), + comm2_alt_freq(0.0), + nav1_freq(0.0), + nav1_alt_freq(0.0), + nav1_radial(0.0), + nav2_freq(0.0), + nav2_alt_freq(0.0), + nav2_radial(0.0), + dme_freq(0.0), + dme_dist(0.0), + dme_prev_dist(0.0), + dme_spd(0.0), + dme_ete(0.0), + adf_freq(0.0), + adf_alt_freq(0.0) +{ + 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() ); + dme_last_time.stamp(); } @@ -95,6 +125,10 @@ FGRadioStack::FGRadioStack() { FGRadioStack::~FGRadioStack() { unbind(); // FIXME: should be called externally + + delete term_tbl; + delete low_tbl; + delete high_tbl; } @@ -108,18 +142,6 @@ FGRadioStack::init () search(); update(); - 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() ); - // Search radio database once per second global_events.Register( "fgRadioSearch()", fgRadioSearch, fgEVENT::FG_EVENT_READY, 1000); @@ -129,74 +151,125 @@ void FGRadioStack::bind () { // User inputs - fgTie("/radios/nav1/frequencies/selected", this, + fgTie("/radios/comm[0]/frequencies/selected-mhz", this, + &FGRadioStack::get_comm1_freq, &FGRadioStack::set_comm1_freq); + fgSetArchivable("/radios/comm[0]/frequencies/selected-mhz"); + fgTie("/radios/comm[0]/frequencies/standby-mhz", this, + &FGRadioStack::get_comm1_alt_freq, &FGRadioStack::set_comm1_alt_freq); + fgSetArchivable("/radios/comm[0]/frequencies/standby-mhz"); + fgTie("/radios/comm[0]/volume", this, + &FGRadioStack::get_comm1_vol_btn, + &FGRadioStack::set_comm1_vol_btn); + fgSetArchivable("/radios/comm[0]/volume"); + fgTie("/radios/comm[0]/ident", this, + &FGRadioStack::get_comm1_ident_btn, + &FGRadioStack::set_comm1_ident_btn); + fgSetArchivable("/radios/comm[0]/ident"); + + fgTie("/radios/comm[1]/frequencies/selected-mhz", this, + &FGRadioStack::get_comm2_freq, &FGRadioStack::set_comm2_freq); + fgSetArchivable("/radios/comm[0]/frequencies/selected-mhz"); + fgTie("/radios/comm[1]/frequencies/standby-mhz", this, + &FGRadioStack::get_comm2_alt_freq, &FGRadioStack::set_comm2_alt_freq); + fgSetArchivable("/radios/comm[0]/frequencies/standby-mhz"); + fgTie("/radios/comm[1]/volume", this, + &FGRadioStack::get_comm2_vol_btn, + &FGRadioStack::set_comm2_vol_btn); + fgSetArchivable("/radios/comm[0]/volume"); + fgTie("/radios/comm[1]/ident", this, + &FGRadioStack::get_comm2_ident_btn, + &FGRadioStack::set_comm2_ident_btn); + fgSetArchivable("/radios/comm[1]/ident"); + + fgTie("/radios/nav[0]/frequencies/selected-mhz", this, &FGRadioStack::get_nav1_freq, &FGRadioStack::set_nav1_freq); - fgTie("/radios/nav1/frequencies/standby", this, + fgSetArchivable("/radios/nav[0]/frequencies/selected-mhz"); + fgTie("/radios/nav[0]/frequencies/standby-mhz", this, &FGRadioStack::get_nav1_alt_freq, &FGRadioStack::set_nav1_alt_freq); - fgTie("/radios/nav1/radials/selected", this, + fgSetArchivable("/radios/nav[0]/frequencies/standby-mhz"); + fgTie("/radios/nav[0]/radials/selected-deg", this, &FGRadioStack::get_nav1_sel_radial, &FGRadioStack::set_nav1_sel_radial); - fgTie("/radios/nav1/volume", this, + fgSetArchivable("/radios/nav[0]/radials/selected-deg"); + fgTie("/radios/nav[0]/volume", this, &FGRadioStack::get_nav1_vol_btn, &FGRadioStack::set_nav1_vol_btn); - fgTie("/radios/nav1/ident", this, + fgSetArchivable("/radios/nav[0]/volume"); + fgTie("/radios/nav[0]/ident", this, &FGRadioStack::get_nav1_ident_btn, &FGRadioStack::set_nav1_ident_btn); + fgSetArchivable("/radios/nav[0]/ident"); // Radio outputs - fgTie("/radios/nav1/radials/actual", this, &FGRadioStack::get_nav1_radial); - fgTie("/radios/nav1/to-flag", this, &FGRadioStack::get_nav1_to_flag); - fgTie("/radios/nav1/from-flag", this, &FGRadioStack::get_nav1_from_flag); - fgTie("/radios/nav1/in-range", this, &FGRadioStack::get_nav1_inrange); - fgTie("/radios/nav1/dme/distance", this, &FGRadioStack::get_nav1_dme_dist); - fgTie("/radios/nav1/dme/in-range", this, - &FGRadioStack::get_nav1_dme_inrange); - fgTie("/radios/nav1/heading-needle-deflection", this, + fgTie("/radios/nav[0]/radials/actual-deg", this, + &FGRadioStack::get_nav1_radial); + fgTie("/radios/nav[0]/to-flag", this, &FGRadioStack::get_nav1_to_flag); + fgTie("/radios/nav[0]/from-flag", this, &FGRadioStack::get_nav1_from_flag); + fgTie("/radios/nav[0]/in-range", this, &FGRadioStack::get_nav1_inrange); + fgTie("/radios/nav[0]/heading-needle-deflection", this, &FGRadioStack::get_nav1_heading_needle_deflection); - fgTie("/radios/nav1/gs-needle-deflection", this, + fgTie("/radios/nav[0]/gs-needle-deflection", this, &FGRadioStack::get_nav1_gs_needle_deflection); // User inputs - fgTie("/radios/nav2/frequencies/selected", this, + fgTie("/radios/nav[1]/frequencies/selected-mhz", this, &FGRadioStack::get_nav2_freq, &FGRadioStack::set_nav2_freq); - fgTie("/radios/nav2/frequencies/standby", this, + fgSetArchivable("/radios/nav[1]/frequencies/selected-mhz"); + fgTie("/radios/nav[1]/frequencies/standby-mhz", this, &FGRadioStack::get_nav2_alt_freq, &FGRadioStack::set_nav2_alt_freq); - fgTie("/radios/nav2/radials/selected", this, + fgSetArchivable("/radios/nav[1]/frequencies/standby-mhz"); + fgTie("/radios/nav[1]/radials/selected-deg", this, &FGRadioStack::get_nav2_sel_radial, &FGRadioStack::set_nav2_sel_radial); - fgTie("/radios/nav2/volume", this, + fgSetArchivable("/radios/nav[1]/radials/selected-deg"); + fgTie("/radios/nav[1]/volume", this, &FGRadioStack::get_nav2_vol_btn, &FGRadioStack::set_nav2_vol_btn); - fgTie("/radios/nav2/ident", this, + fgSetArchivable("/radios/nav[1]/volume"); + fgTie("/radios/nav[1]/ident", this, &FGRadioStack::get_nav2_ident_btn, &FGRadioStack::set_nav2_ident_btn); + fgSetArchivable("/radios/nav[1]/ident"); // Radio outputs - fgTie("/radios/nav2/radials/actual", this, &FGRadioStack::get_nav2_radial); - fgTie("/radios/nav2/to-flag", this, &FGRadioStack::get_nav2_to_flag); - fgTie("/radios/nav2/from-flag", this, &FGRadioStack::get_nav2_from_flag); - fgTie("/radios/nav2/in-range", this, &FGRadioStack::get_nav2_inrange); - fgTie("/radios/nav2/dme/distance", this, &FGRadioStack::get_nav2_dme_dist); - fgTie("/radios/nav2/dme/in-range", this, - &FGRadioStack::get_nav2_dme_inrange); - fgTie("/radios/nav2/heading-needle-deflection", this, + fgTie("/radios/nav[1]/radials/actual-deg", this, + &FGRadioStack::get_nav2_radial); + fgTie("/radios/nav[1]/to-flag", this, &FGRadioStack::get_nav2_to_flag); + fgTie("/radios/nav[1]/from-flag", this, &FGRadioStack::get_nav2_from_flag); + fgTie("/radios/nav[1]/in-range", this, &FGRadioStack::get_nav2_inrange); + fgTie("/radios/nav[1]/heading-needle-deflection", this, &FGRadioStack::get_nav2_heading_needle_deflection); - fgTie("/radios/nav2/gs-needle-deflection", this, + fgTie("/radios/nav[1]/gs-needle-deflection", this, &FGRadioStack::get_nav2_gs_needle_deflection); // User inputs - fgTie("/radios/adf/frequencies/selected", this, + fgTie("/radios/dme/frequencies/selected-khz", this, + &FGRadioStack::get_dme_freq, &FGRadioStack::set_adf_freq); + + // Radio outputs + fgTie("/radios/dme/in-range", this, &FGRadioStack::get_dme_inrange); + fgTie("/radios/dme/distance-nm", this, &FGRadioStack::get_dme_dist); + fgTie("/radios/dme/speed-kt", this, &FGRadioStack::get_dme_spd); + fgTie("/radios/dme/ete-min", this, &FGRadioStack::get_dme_ete); + + // User inputs + fgTie("/radios/adf/frequencies/selected-khz", this, &FGRadioStack::get_adf_freq, &FGRadioStack::set_adf_freq); - fgTie("/radios/adf/frequencies/standby", this, + fgSetArchivable("/radios/adf/frequencies/selected-khz"); + fgTie("/radios/adf/frequencies/standby-khz", this, &FGRadioStack::get_adf_alt_freq, &FGRadioStack::set_adf_alt_freq); - fgTie("/radios/adf/rotation", this, + fgSetArchivable("/radios/adf/frequencies/standby-khz"); + fgTie("/radios/adf/rotation-deg", this, &FGRadioStack::get_adf_rotation, &FGRadioStack::set_adf_rotation); + fgSetArchivable("/radios/adf/rotation-deg"); fgTie("/radios/adf/volume", this, &FGRadioStack::get_adf_vol_btn, &FGRadioStack::set_adf_vol_btn); + fgSetArchivable("/radios/adf/volume"); fgTie("/radios/adf/ident", this, &FGRadioStack::get_adf_ident_btn, &FGRadioStack::set_adf_ident_btn); + fgSetArchivable("/radios/adf/ident"); fgTie("/radios/marker-beacon/inner", this, &FGRadioStack::get_inner_blink); @@ -209,37 +282,51 @@ FGRadioStack::bind () void FGRadioStack::unbind () { - fgUntie("/radios/nav1/frequencies/selected"); - fgUntie("/radios/nav1/frequencies/standby"); - fgUntie("/radios/nav1/radials/actual"); - fgUntie("/radios/nav1/radials/selected"); - fgUntie("/radios/nav1/on"); - fgUntie("/radios/nav1/ident"); - fgUntie("/radios/nav1/to-flag"); - fgUntie("/radios/nav1/from-flag"); - fgUntie("/radios/nav1/in-range"); - fgUntie("/radios/nav1/dme/distance"); - fgUntie("/radios/nav1/dme/in-range"); - fgUntie("/radios/nav1/heading-needle-deflection"); - fgUntie("/radios/nav1/gs-needle-deflection"); - - fgUntie("/radios/nav2/frequencies/selected"); - fgUntie("/radios/nav2/frequencies/standby"); - fgUntie("/radios/nav2/radials/actual"); - fgUntie("/radios/nav2/radials/selected"); - fgUntie("/radios/nav2/on"); - fgUntie("/radios/nav2/ident"); - fgUntie("/radios/nav2/to-flag"); - fgUntie("/radios/nav2/from-flag"); - fgUntie("/radios/nav2/in-range"); - fgUntie("/radios/nav2/dme/distance"); - fgUntie("/radios/nav2/dme/in-range"); - fgUntie("/radios/nav2/heading-needle-deflection"); - fgUntie("/radios/nav2/gs-needle-deflection"); - - fgUntie("/radios/adf/frequencies/selected"); - fgUntie("/radios/adf/frequencies/standby"); - fgUntie("/radios/adf/rotation"); + fgUntie("/radios/comm[0]/frequencies/selected-mhz"); + fgUntie("/radios/comm[0]/frequencies/standby-mhz"); + fgUntie("/radios/comm[0]/on"); + fgUntie("/radios/comm[0]/ident"); + + fgUntie("/radios/comm[1]/frequencies/selected-mhz"); + fgUntie("/radios/comm[1]/frequencies/standby-mhz"); + fgUntie("/radios/comm[1]/on"); + fgUntie("/radios/comm[1]/ident"); + + fgUntie("/radios/nav[0]/frequencies/selected-mhz"); + fgUntie("/radios/nav[0]/frequencies/standby-mhz"); + fgUntie("/radios/nav[0]/radials/actual-deg"); + fgUntie("/radios/nav[0]/radials/selected-deg"); + fgUntie("/radios/nav[0]/on"); + fgUntie("/radios/nav[0]/ident"); + fgUntie("/radios/nav[0]/to-flag"); + fgUntie("/radios/nav[0]/from-flag"); + fgUntie("/radios/nav[0]/in-range"); + fgUntie("/radios/nav[0]/heading-needle-deflection"); + fgUntie("/radios/nav[0]/gs-needle-deflection"); + + fgUntie("/radios/nav[1]/frequencies/selected-mhz"); + fgUntie("/radios/nav[1]/frequencies/standby-mhz"); + fgUntie("/radios/nav[1]/radials/actual-deg"); + fgUntie("/radios/nav[1]/radials/selected-deg"); + fgUntie("/radios/nav[1]/on"); + fgUntie("/radios/nav[1]/ident"); + fgUntie("/radios/nav[1]/to-flag"); + fgUntie("/radios/nav[1]/from-flag"); + fgUntie("/radios/nav[1]/in-range"); + fgUntie("/radios/nav[1]/heading-needle-deflection"); + fgUntie("/radios/nav[1]/gs-needle-deflection"); + + fgUntie("/radios/dme/frequencies/selected-khz"); + + // Radio outputs + fgUntie("/radios/dme/in-range"); + fgUntie("/radios/dme/distance-nm"); + fgUntie("/radios/dme/speed-kt"); + fgUntie("/radios/dme/ete-min"); + + fgUntie("/radios/adf/frequencies/selected-khz"); + fgUntie("/radios/adf/frequencies/standby-khz"); + fgUntie("/radios/adf/rotation-deg"); fgUntie("/radios/adf/on"); fgUntie("/radios/adf/ident"); @@ -299,6 +386,12 @@ double FGRadioStack::adjustILSRange( double stationElev, double aircraftElev, return 10 + (35 - offset) * (FG_ILS_DEFAULT_RANGE - 10) / 25; } else if ( offset < 45 ) { return (45 - offset); + } else if ( offset > 170 ) { + return FG_ILS_DEFAULT_RANGE; + } else if ( offset > 145 ) { + return 10 + (offset - 145) * (FG_ILS_DEFAULT_RANGE - 10) / 25; + } else if ( offset > 135 ) { + return (offset - 135); } else { return 0; } @@ -309,9 +402,12 @@ double FGRadioStack::adjustILSRange( double stationElev, double aircraftElev, void FGRadioStack::update() { - double lon = longitudeVal->getDoubleValue() * SGD_DEGREES_TO_RADIANS; - double lat = latitudeVal->getDoubleValue() * SGD_DEGREES_TO_RADIANS; - double elev = altitudeVal->getDoubleValue() * SG_FEET_TO_METER; + //DCL + string transmission; + + 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; need_update = false; @@ -319,18 +415,56 @@ FGRadioStack::update() Point3D station; double az1, az2, s; + //////////////////////////////////////////////////////////////////////// + // Comm1. + //////////////////////////////////////////////////////////////////////// + + static bool repeating_message_registered = false; + static int dcl_i = 0; //Hack to only call the transmission now and then - should use the event scheduler + if ( comm1_valid ) { + station = Point3D( comm1_x, comm1_y, comm1_z ); + comm1_dist = aircraft.distance3D( station ); + if ( comm1_dist < comm1_effective_range * SG_NM_TO_METER ) { + comm1_inrange = true; + // TODO - only get the transmission and register every now and then + if(dcl_i == 0) { + transmission = atis.get_transmission(); + current_atcdisplay->ChangeRepeatingMessage(transmission); + } + if(!repeating_message_registered) { + current_atcdisplay->RegisterRepeatingMessage(transmission); + repeating_message_registered = true; + } + dcl_i++; + if(dcl_i == 2000) { + dcl_i = 0; + } + } else { + comm1_inrange = false; + if(repeating_message_registered) { + current_atcdisplay->CancelRepeatingMessage(); + repeating_message_registered = false; + } + dcl_i = 0; + } + } else { + comm1_inrange = false; + if(repeating_message_registered) { + current_atcdisplay->CancelRepeatingMessage(); + repeating_message_registered = false; + } + dcl_i = 0; + // cout << "not picking up comm1. :-(" << endl; + } + + //////////////////////////////////////////////////////////////////////// + // Nav1. + //////////////////////////////////////////////////////////////////////// + if ( nav1_valid ) { station = Point3D( nav1_x, nav1_y, nav1_z ); nav1_loc_dist = aircraft.distance3D( station ); - if ( nav1_has_dme ) { - // staightline distance - station = Point3D( nav1_dme_x, nav1_dme_y, nav1_dme_z ); - nav1_dme_dist = aircraft.distance3D( station ); - } else { - nav1_dme_dist = 0.0; - } - if ( nav1_has_gs ) { station = Point3D( nav1_gs_x, nav1_gs_y, nav1_gs_z ); nav1_gs_dist = aircraft.distance3D( station ); @@ -375,10 +509,10 @@ FGRadioStack::update() } } else { nav1_inrange = false; - nav1_dme_dist = 0.0; // cout << "not picking up vor. :-(" << endl; } +#ifdef ENABLE_AUDIO_SUPPORT if ( nav1_valid && nav1_inrange ) { // play station ident via audio system if on + ident, // otherwise turn it off @@ -412,19 +546,17 @@ FGRadioStack::update() globals->get_soundmgr()->stop( "nav1-dme-ident" ); } } +#endif + + + //////////////////////////////////////////////////////////////////////// + // Nav2. + //////////////////////////////////////////////////////////////////////// if ( nav2_valid ) { station = Point3D( nav2_x, nav2_y, nav2_z ); nav2_loc_dist = aircraft.distance3D( station ); - if ( nav2_has_dme ) { - // staightline distance - station = Point3D( nav2_dme_x, nav2_dme_y, nav2_dme_z ); - nav2_dme_dist = aircraft.distance3D( station ); - } else { - nav2_dme_dist = 0.0; - } - if ( nav2_has_gs ) { station = Point3D( nav2_gs_x, nav2_gs_y, nav2_gs_z ); nav2_gs_dist = aircraft.distance3D( station ); @@ -468,10 +600,10 @@ FGRadioStack::update() } } else { nav2_inrange = false; - nav2_dme_dist = 0.0; // cout << "not picking up vor. :-(" << endl; } +#ifdef ENABLE_AUDIO_SUPPORT if ( nav2_valid && nav2_inrange ) { // play station ident via audio system if on + ident, // otherwise turn it off @@ -505,8 +637,60 @@ FGRadioStack::update() globals->get_soundmgr()->stop( "nav2-dme-ident" ); } } +#endif + + + //////////////////////////////////////////////////////////////////////// + // DME. + //////////////////////////////////////////////////////////////////////// + + if (dme_valid) { + station = Point3D( dme_x, dme_y, dme_z ); + dme_dist = aircraft.distance3D( station ) * SG_METER_TO_NM; + dme_effective_range = kludgeRange(dme_elev, elev, dme_range); + if (dme_dist < dme_effective_range * SG_NM_TO_METER) { + dme_inrange = true; + } else if (dme_dist < 2 * dme_effective_range * SG_NM_TO_METER) { + dme_inrange = sg_random() < + (2 * dme_effective_range * SG_NM_TO_METER - dme_dist) / + (dme_effective_range * SG_NM_TO_METER); + } else { + dme_inrange = false; + } + if (dme_inrange) { + SGTimeStamp current_time; + station = Point3D( dme_x, dme_y, dme_z ); + dme_dist = aircraft.distance3D( station ) * SG_METER_TO_NM; + current_time.stamp(); + long dMs = (current_time - dme_last_time) / 1000; + // Update every second + if (dMs >= 1000) { + double dDist = dme_dist - dme_prev_dist; + dme_spd = fabs((dDist/dMs) * 3600000); + // FIXME: the panel should be able to + // handle this!!! + if (dme_spd > 999.0) + dme_spd = 999.0; + dme_ete = fabs((dme_dist/dme_spd) * 60.0); + // FIXME: the panel should be able to + // handle this!!! + if (dme_ete > 99.0) + dme_ete = 99.0; + dme_prev_dist = dme_dist; + dme_last_time.stamp(); + } + } + } else { + dme_inrange = false; + dme_dist = 0.0; + dme_prev_dist = 0.0; + } + + + //////////////////////////////////////////////////////////////////////// + // ADF + //////////////////////////////////////////////////////////////////////// - // adf if ( adf_valid ) { // staightline distance station = Point3D( adf_x, adf_y, adf_z ); @@ -534,6 +718,7 @@ FGRadioStack::update() adf_inrange = false; } +#ifdef ENABLE_AUDIO_SUPPORT if ( adf_valid && adf_inrange ) { // play station ident via audio system if on + ident, // otherwise turn it off @@ -557,6 +742,7 @@ FGRadioStack::update() globals->get_soundmgr()->stop( "adf-ident" ); } } +#endif // marker beacon blinking bool light_on = ( outer_blink || middle_blink || inner_blink ); @@ -598,19 +784,73 @@ void FGRadioStack::search() { static FGMkrBeacon::fgMkrBeacType last_beacon = FGMkrBeacon::NOBEACON; - double lon = longitudeVal->getDoubleValue() * SGD_DEGREES_TO_RADIANS; - double lat = latitudeVal->getDoubleValue() * SGD_DEGREES_TO_RADIANS; - double elev = altitudeVal->getDoubleValue() * SG_FEET_TO_METER; + 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("/panel/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; + } + } - // nav1 FGILS ils; FGNav nav; + static string last_comm1_ident = ""; + static string last_comm2_ident = ""; 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; + + + //////////////////////////////////////////////////////////////////////// + // Comm1. + //////////////////////////////////////////////////////////////////////// + + if ( current_atislist->query( lon, lat, elev, comm1_freq, &atis ) ) { + //cout << "atis found in radiostack search !!!!" << endl; + comm1_ident = atis.get_ident(); + comm1_valid = true; + if ( last_comm1_ident != comm1_ident ) { + //nav1_trans_ident = ils.get_trans_ident(); + last_comm1_ident = comm1_ident; + comm1_elev = atis.get_elev(); + comm1_range = FG_ATIS_DEFAULT_RANGE; + comm1_effective_range = comm1_range; + comm1_x = atis.get_x(); + comm1_y = atis.get_y(); + comm1_z = atis.get_z(); + //cout << "Found a new atis station in range" << endl; + //cout << " id = " << atis.get_ident() << endl; + } + } else { + comm1_valid = false; + comm1_ident = ""; + //comm1_trans_ident = ""; + last_comm1_ident = ""; + // cout << "not picking up atis" << endl; + } + + //////////////////////////////////////////////////////////////////////// + // Nav1. + //////////////////////////////////////////////////////////////////////// + if ( current_ilslist->query( lon, lat, elev, nav1_freq, &ils ) ) { nav1_ident = ils.get_locident(); nav1_valid = true; @@ -626,8 +866,6 @@ void FGRadioStack::search() nav1_loclat = ils.get_loclat(); nav1_gslon = ils.get_gslon(); nav1_gslat = ils.get_gslat(); - nav1_dmelon = ils.get_dmelon(); - nav1_dmelat = ils.get_dmelat(); nav1_elev = ils.get_gselev(); nav1_magvar = 0; nav1_range = FG_ILS_DEFAULT_RANGE; @@ -642,10 +880,8 @@ void FGRadioStack::search() nav1_gs_x = ils.get_gs_x(); nav1_gs_y = ils.get_gs_y(); nav1_gs_z = ils.get_gs_z(); - nav1_dme_x = ils.get_dme_x(); - nav1_dme_y = ils.get_dme_y(); - nav1_dme_z = ils.get_dme_z(); +#ifdef ENABLE_AUDIO_SUPPORT if ( globals->get_soundmgr()->exists( "nav1-vor-ident" ) ) { globals->get_soundmgr()->remove( "nav1-vor-ident" ); } @@ -670,6 +906,7 @@ void FGRadioStack::search() // << " 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; @@ -692,10 +929,11 @@ void FGRadioStack::search() nav1_effective_range = adjustNavRange(nav1_elev, elev, nav1_range); nav1_target_gs = 0.0; nav1_radial = nav1_sel_radial; - nav1_x = nav1_dme_x = nav.get_x(); - nav1_y = nav1_dme_y = nav.get_y(); - nav1_z = nav1_dme_z = nav.get_z(); + 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" ); } @@ -719,6 +957,7 @@ void FGRadioStack::search() // << 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; @@ -727,14 +966,20 @@ void FGRadioStack::search() nav1_valid = false; nav1_ident = ""; nav1_radial = 0; - nav1_dme_dist = 0; nav1_trans_ident = ""; last_nav1_ident = ""; +#ifdef ENABLE_AUDIO_SUPPORT globals->get_soundmgr()->remove( "nav1-vor-ident" ); 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; @@ -762,10 +1007,8 @@ void FGRadioStack::search() nav2_gs_x = ils.get_gs_x(); nav2_gs_y = ils.get_gs_y(); nav2_gs_z = ils.get_gs_z(); - nav2_dme_x = ils.get_dme_x(); - nav2_dme_y = ils.get_dme_y(); - nav2_dme_z = ils.get_dme_z(); +#ifdef ENABLE_AUDIO_SUPPORT if ( globals->get_soundmgr()->exists( "nav2-vor-ident" ) ) { globals->get_soundmgr()->remove( "nav2-vor-ident" ); } @@ -789,6 +1032,7 @@ void FGRadioStack::search() // << 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; @@ -811,10 +1055,11 @@ void FGRadioStack::search() nav2_effective_range = adjustNavRange(nav2_elev, elev, nav2_range); nav2_target_gs = 0.0; nav2_radial = nav2_sel_radial; - nav2_x = nav2_dme_x = nav.get_x(); - nav2_y = nav2_dme_y = nav.get_y(); - nav2_z = nav2_dme_z = nav.get_z(); + 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" ); } @@ -838,6 +1083,7 @@ void FGRadioStack::search() // << 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; @@ -846,14 +1092,54 @@ void FGRadioStack::search() nav2_valid = false; nav2_ident = ""; nav2_radial = 0; - nav2_dme_dist = 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 ); @@ -863,6 +1149,7 @@ void FGRadioStack::search() 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(); @@ -873,9 +1160,11 @@ void FGRadioStack::search() 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(); @@ -886,9 +1175,11 @@ void FGRadioStack::search() 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(); @@ -899,18 +1190,25 @@ void FGRadioStack::search() 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 + + //////////////////////////////////////////////////////////////////////// + // ADF. + //////////////////////////////////////////////////////////////////////// + if ( current_navlist->query( lon, lat, elev, adf_freq, &nav ) ) { char freq[128]; -#if defined( _MSC_VER ) +#if defined( _MSC_VER ) || defined(__MINGW32__) _snprintf( freq, 10, "%.0f", adf_freq ); #else snprintf( freq, 10, "%.0f", adf_freq ); @@ -932,6 +1230,7 @@ void FGRadioStack::search() 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" ); } @@ -948,6 +1247,7 @@ void FGRadioStack::search() // << 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; @@ -956,7 +1256,9 @@ void FGRadioStack::search() 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; } @@ -1023,7 +1325,8 @@ double FGRadioStack::get_nav2_heading_needle_deflection() const { double FGRadioStack::get_nav1_gs_needle_deflection() const { if ( nav1_inrange && nav1_has_gs ) { double x = nav1_gs_dist; - double y = (FGBFI::getAltitude() - nav1_elev) * SG_FEET_TO_METER; + 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 { @@ -1037,7 +1340,8 @@ double FGRadioStack::get_nav1_gs_needle_deflection() const { double FGRadioStack::get_nav2_gs_needle_deflection() const { if ( nav2_inrange && nav2_has_gs ) { double x = nav2_gs_dist; - double y = (FGBFI::getAltitude() - nav2_elev) * SG_FEET_TO_METER; + 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 {