// localizers radials are "true"
tgt_radial = current_radiostack->get_nav1_radial();
} else {
- tgt_radial = current_radiostack->get_nav1_radial()
- + FGBFI::getMagVar();
+ tgt_radial = current_radiostack->get_nav1_radial() +
+ current_radiostack->get_nav1_magvar();
}
- cur_radial = current_radiostack->get_nav1_heading();
+ cur_radial = current_radiostack->get_nav1_heading() +
+ current_radiostack->get_nav1_magvar();
// cout << "target rad (true) = " << tgt_radial
// << " current rad (true) = " << cur_radial
// << endl;
TargetHeading = cur_radial - diff;
while ( TargetHeading < 0.0 ) { TargetHeading += 360.0; }
while ( TargetHeading > 360.0 ) { TargetHeading -= 360.0; }
+ MakeTargetHeadingStr( TargetHeading );
// cout << "target course (true) = " << TargetHeading << endl;
} else if ( heading_mode == FG_HEADING_WAYPOINT ) {
// update target heading to waypoint
geo_inverse_wgs_84( elev, lat * RAD_TO_DEG, lon * RAD_TO_DEG,
nav1_loclat, nav1_loclon,
&az1, &az2, &s );
- cout << "az1 = " << az1 << " magvar = " << nav1_magvar << endl;
+ // cout << "az1 = " << az1 << " magvar = " << nav1_magvar << endl;
nav1_heading = az1 - nav1_magvar;
// Alex: nav1_heading = - (az1 - FGBFI::getMagVar() / RAD_TO_DEG);
inline double get_nav1_heading() const { return nav1_heading; }
inline double get_nav1_radial() const { return nav1_radial; }
inline double get_nav1_target_gs() const { return nav1_target_gs; }
+ inline double get_nav1_magvar() const { return nav1_magvar; }
inline bool get_nav2_inrange() const { return nav2_inrange; }
bool get_nav2_to_flag () const;
inline double get_nav2_heading() const { return nav2_heading; }
inline double get_nav2_radial() const { return nav2_radial; }
inline double get_nav2_target_gs() const { return nav2_target_gs; }
+ inline double get_nav2_magvar() const { return nav2_magvar; }
inline bool get_adf_inrange() const { return adf_inrange; }
inline double get_adf_lon() const { return adf_lon; }
_UpdatesPending += timesteps;
}
-#undef DF1
-#undef DF2
-
/* tc should be (elapsed_time_between_updates / desired_smoothing_time) */
void FGSteam::set_lowpass ( double *outthe, double inthe, double tc )
double pressInHgToAltFt(double p_inhg)
{
// Ref. Aviation Formulary, Ed Williams, www.best.com/~williams/avform.htm
- const double P_0 = 29.92126; // Std. MSL pressure, inHg. (=10135.25 mb)
+ const double P_0 = 29.92126; // Std. MSL pressure, inHg. (=1013.25 mb)
const double p_Tr = 0.2233609 * P_0; // Pressure at tropopause, same units.
const double h_Tr = 36089.24; // Alt of tropopause, ft. (=11.0 km)
- // return (P_0 - p_inhg) * 1000.0; // ### crude approx. for low alt's
if (p_inhg > p_Tr) // 0.0 to 11.0 km
return (1.0 - pow((p_inhg / P_0), 1.0 / 5.2558797)) / 6.8755856e-6;
return h_Tr + log10(p_inhg / p_Tr) / -4.806346e-5; // 11.0 to 20.0 km
}
+// Convert altitude to air pressure by ICAO Standard Atmosphere
+double altFtToPressInHg(double alt_ft)
+{
+ // Ref. Aviation Formulary, Ed Williams, www.best.com/~williams/avform.htm
+ const double P_0 = 29.92126; // Std. MSL pressure, inHg. (=1013.25 mb)
+ const double p_Tr = 0.2233609 * P_0; // Pressure at tropopause, same units.
+ const double h_Tr = 36089.24; // Alt of tropopause, ft. (=11.0 km)
+
+ if (alt_ft < h_Tr) // 0.0 to 11.0 km
+ return P_0 * pow(1.0 - 6.8755856e-6 * alt_ft, 5.2558797);
+ return p_Tr * exp(-4.806346e-5 * (alt_ft - h_Tr)); // 11.0 to 20.0 km
+ // We could put more code for higher altitudes here.
+}
+
+
\f
////////////////////////////////////////////////////////////////////////
// Here the fun really begins
We filter the actual value by one second to
account for the line impedance of the plumbing.
*/
- double static_inhg = 29.92;
- i = (int) FGBFI::getAltitude();
- while ( i > 9000 )
- { static_inhg *= 0.707;
- i -= 9000;
- }
- static_inhg *= ( 1.0 - 0.293 * i / 9000.0 );
+ double static_inhg = altFtToPressInHg(FGBFI::getAltitude());
set_lowpass ( & the_STATIC_inhg, static_inhg, dt );
/*
if ( current_radiostack->get_nav1_inrange() ) {
r = current_radiostack->get_nav1_heading()
- current_radiostack->get_nav1_radial();
- cout << "Radial = " << current_radiostack->get_nav1_radial()
- << " Bearing = " << current_radiostack->get_nav1_heading()
- << endl;
+ // cout << "Radial = " << current_radiostack->get_nav1_radial()
+ // << " Bearing = " << current_radiostack->get_nav1_heading()
+ // << endl;
if (r> 180.0) r-=360.0; else
if (r<-180.0) r+=360.0;
nav.hxx navlist.hxx navlist.cxx
testnavs_SOURCES = testnavs.cxx
-testnavs_LDADD = libNavaids.a -lsgmath -lsgmisc -lsgdebug -lsgmagvar -lz
+testnavs_LDADD = \
+ libNavaids.a \
+ -lsgtiming -lsgmath -lsgmisc -lsgdebug -lsgmagvar \
+ -lz
INCLUDES += -I$(top_srcdir) -I$(top_srcdir)/src
#include <simgear/math/sg_geodesy.hxx>
#include <simgear/misc/fgstream.hxx>
#include <simgear/magvar/magvar.hxx>
+#include <simgear/timing/sg_time.hxx>
#ifdef FG_HAVE_STD_INCLUDES
# include <istream>
double f;
char c /* , magvar_dir */ ;
string magvar_s;
-
+
+ static SGTime time_params;
+ static bool first_time = true;
+ static double julian_date = 0;
+ if ( first_time ) {
+ time_params.update( 0.0, 0.0, 0 );
+ julian_date = time_params.getJD();
+ first_time = false;
+ }
+
in >> n.type >> n.lat >> n.lon >> n.elev >> f >> n.range
>> c >> n.ident >> magvar_s;
// cout << "Calculating magvar for navaid " << n.ident << endl;
if (magvar_s == "XXX") {
// default to mag var as of 1990-01-01 (Julian 2447892.5)
- n.magvar = -sgGetMagVar(n.lon * DEG_TO_RAD, n.lat * DEG_TO_RAD,
+ // cout << "lat = " << n.lat << " lon = " << n.lon << " elev = "
+ // << n.elev << " JD = "
+ // << julian_date << endl;
+ n.magvar = sgGetMagVar(n.lon * DEG_TO_RAD, n.lat * DEG_TO_RAD,
n.elev * FEET_TO_METER,
- 2447892.5) * RAD_TO_DEG;
+ julian_date) * RAD_TO_DEG;
// cout << "Default variation at " << n.lon << ',' << n.lat
// << " is " << var << endl;
#if 0
n.magvar = 0 - n.magvar;
// cout << "Explicit magvar of " << n.magvar << endl;
}
- cout << n.ident << " " << n.magvar << endl;
+ // cout << n.ident << " " << n.magvar << endl;
// generate cartesian coordinates
Point3D geod( n.lon * DEG_TO_RAD, n.lat * DEG_TO_RAD, n.elev );
bool FGNavList::init( FGPath path ) {
FGNav n;
- SGTime time_params;
- time_params.update( 0.0, 0.0, 0 );
-
navaids.erase( navaids.begin(), navaids.end() );
fg_gzifstream in( path.str() );