X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCockpit%2Fradiostack.cxx;h=9b93cc8bc296bbfe95a274629f3803a090076823;hb=29275ce1ecf9c4ea302aacca8c5ae5d4d3319a17;hp=9010a79db4723cdce0fcf35e0775b87f58ea629f;hpb=576432ec75ce0c8f860e5df503cab37e3b8d9024;p=flightgear.git diff --git a/src/Cockpit/radiostack.cxx b/src/Cockpit/radiostack.cxx index 9010a79db..9b93cc8bc 100644 --- a/src/Cockpit/radiostack.cxx +++ b/src/Cockpit/radiostack.cxx @@ -113,6 +113,10 @@ FGRadioStack::bind () 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, + &FGRadioStack::get_nav1_heading_needle_deflection); + fgTie("/radios/nav1/gs-needle-deflection", this, + &FGRadioStack::get_nav1_gs_needle_deflection); // User inputs fgTie("/radios/nav2/frequencies/selected", this, @@ -131,6 +135,10 @@ FGRadioStack::bind () 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, + &FGRadioStack::get_nav2_heading_needle_deflection); + fgTie("/radios/nav2/gs-needle-deflection", this, + &FGRadioStack::get_nav2_gs_needle_deflection); // User inputs fgTie("/radios/adf/frequencies/selected", this, @@ -153,6 +161,8 @@ FGRadioStack::unbind () 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"); @@ -163,6 +173,8 @@ FGRadioStack::unbind () 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"); @@ -209,7 +221,8 @@ FGRadioStack::update() geo_inverse_wgs_84( elev, lat * RAD_TO_DEG, lon * RAD_TO_DEG, nav1_loclat, nav1_loclon, &az1, &az2, &s ); - nav1_heading = az1 - nav1_offset; + // cout << "az1 = " << az1 << " magvar = " << nav1_magvar << endl; + nav1_heading = az1 - nav1_magvar; // Alex: nav1_heading = - (az1 - FGBFI::getMagVar() / RAD_TO_DEG); // cout << " heading = " << nav1_heading @@ -254,7 +267,7 @@ FGRadioStack::update() geo_inverse_wgs_84( elev, lat * RAD_TO_DEG, lon * RAD_TO_DEG, nav2_loclat, nav2_loclon, &az1, &az2, &s ); - nav2_heading = az1 - nav2_offset; + nav2_heading = az1 - nav2_magvar; // Alex: nav2_heading = - (az1 - FGBFI::getMagVar() / RAD_TO_DEG); // cout << " heading = " << nav2_heading @@ -321,7 +334,7 @@ void FGRadioStack::search () nav1_dmelon = ils.get_dmelon(); nav1_dmelat = ils.get_dmelat(); nav1_elev = ils.get_gselev(); - nav1_offset = 0; + nav1_magvar = 0; nav1_effective_range = FG_ILS_DEFAULT_RANGE; nav1_target_gs = ils.get_gsangle(); nav1_radial = ils.get_locheading(); @@ -346,7 +359,7 @@ void FGRadioStack::search () nav1_loclon = nav.get_lon(); nav1_loclat = nav.get_lat(); nav1_elev = nav.get_elev(); - nav1_offset = nav.get_offset(); + nav1_magvar = nav.get_magvar(); nav1_effective_range = kludgeRange(nav1_elev, elev, nav.get_range()); nav1_target_gs = 0.0; nav1_radial = nav1_sel_radial; @@ -371,7 +384,7 @@ void FGRadioStack::search () nav2_loclon = ils.get_loclon(); nav2_loclat = ils.get_loclat(); nav2_elev = ils.get_gselev(); - nav2_offset = 0; + nav2_magvar = 0; nav2_effective_range = FG_ILS_DEFAULT_RANGE; nav2_target_gs = ils.get_gsangle(); nav2_radial = ils.get_locheading(); @@ -396,7 +409,7 @@ void FGRadioStack::search () nav2_loclon = nav.get_lon(); nav2_loclat = nav.get_lat(); nav2_elev = nav.get_elev(); - nav2_offset = nav.get_offset(); + nav2_magvar = nav.get_magvar(); nav2_effective_range = kludgeRange(nav2_elev, elev, nav.get_range()); nav2_target_gs = 0.0; nav2_radial = nav2_sel_radial; @@ -432,6 +445,89 @@ void FGRadioStack::search () } +// 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 = (FGBFI::getAltitude() - nav1_elev) * FEET_TO_METER; + double angle = atan2( y, x ) * RAD_TO_DEG; + 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 = (FGBFI::getAltitude() - nav2_elev) * FEET_TO_METER; + double angle = atan2( y, x ) * RAD_TO_DEG; + return (nav2_target_gs - angle) * 5.0; + } else { + return 0.0; + } +} + + /** * Return true if the NAV1 TO flag should be active. */ @@ -441,9 +537,9 @@ FGRadioStack::get_nav1_to_flag () const if (nav1_inrange) { double offset = fabs(nav1_heading - nav1_radial); if (nav1_loc) - return (offset <= 8.0 || offset >= 352.0); + return true; else - return (offset <= 20.0 || offset >= 340.0); + return (offset <= 90.0 || offset >= 270.0); } else { return false; } @@ -459,9 +555,9 @@ FGRadioStack::get_nav1_from_flag () const if (nav1_inrange) { double offset = fabs(nav1_heading - nav1_radial); if (nav1_loc) - return (offset >= 172.0 && offset <= 188.0); + return false; else - return (offset >= 160.0 && offset <= 200.0); + return (offset > 90.0 && offset < 270.0); } else { return false; } @@ -477,9 +573,9 @@ FGRadioStack::get_nav2_to_flag () const if (nav2_inrange) { double offset = fabs(nav2_heading - nav2_radial); if (nav2_loc) - return (offset <= 8.0 || offset >= 352.0); + return true; else - return (offset <= 20.0 || offset >= 340.0); + return (offset <= 90.0 || offset >= 270.0); } else { return false; } @@ -495,12 +591,11 @@ FGRadioStack::get_nav2_from_flag () const if (nav2_inrange) { double offset = fabs(nav2_heading - nav2_radial); if (nav2_loc) - return (offset >= 172.0 && offset <= 188.0); + return false; else - return (offset >= 160.0 && offset <= 200.0); + return (offset > 90.0 && offset < 270.0); } else { return false; } } -