//
// Written by Curtis Olson, started April 2000.
//
-// Copyright (C) 2000 - 2002 Curtis L. Olson - curt@flightgear.org
+// Copyright (C) 2000 - 2002 Curtis L. Olson - http://www.flightgear.org/~curt
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
#include <simgear/math/vector.hxx>
#include <Aircraft/aircraft.hxx>
-#include <Navaids/ilslist.hxx>
#include <Navaids/navlist.hxx>
#include "navcom.hxx"
// model standard ILS service volumes as per AIM 1-1-9
double FGNavCom::adjustILSRange( double stationElev, double aircraftElev,
- double offsetDegrees, double distance )
+ double offsetDegrees, double distance )
{
// assumptions we model the standard service volume, plus
// } else {
// return 0;
// }
- return FG_ILS_DEFAULT_RANGE;
+ return FG_LOC_DEFAULT_RANGE;
}
double dist = sgdClosestPointToLineDistSquared( p, p0,
gs_base_vec );
nav_gs_dist = sqrt( dist );
- // cout << nav_gs_dist;
+ // cout << "nav_gs_dist = " << nav_gs_dist << endl;
- // Point3D tmp( nav_gs_x, nav_gs_y, nav_gs_z );
+ Point3D tmp( nav_gs_x, nav_gs_y, nav_gs_z );
// cout << " (" << aircraft.distance3D( tmp ) << ")" << endl;
// wgs84 heading to glide slope (to determine sign of distance)
while ( offset < -180.0 ) { offset += 360.0; }
while ( offset > 180.0 ) { offset -= 360.0; }
// cout << "ils offset = " << offset << endl;
- nav_effective_range = adjustILSRange(nav_elev, elev, offset,
- nav_loc_dist * SG_METER_TO_NM );
+ nav_effective_range
+ = adjustILSRange( nav_elev, elev, offset,
+ nav_loc_dist * SG_METER_TO_NM );
} else {
- nav_effective_range = adjustNavRange(nav_elev, elev, nav_range);
+ nav_effective_range = adjustNavRange( nav_elev, elev, nav_range );
}
// cout << "nav range = " << nav_effective_range
// << " (" << nav_range << ")" << endl;
if ( power_btn && (bus_power->getDoubleValue() > 1.0)
&& nav_ident_btn && audio_btn )
{
- SGSimpleSound *sound;
+ SGSoundSample *sound;
sound = globals->get_soundmgr()->find( nav_fx_name );
if ( sound != NULL ) {
sound->set_volume( nav_vol_btn );
double lat = lat_node->getDoubleValue() * SGD_DEGREES_TO_RADIANS;
double elev = alt_node->getDoubleValue() * SG_FEET_TO_METER;
- FGILS *ils;
- FGNav *nav;
+ FGNavRecord *nav = NULL;
+ FGNavRecord *loc = NULL;
+ FGNavRecord *dme = NULL;
+ FGNavRecord *gs = NULL;
////////////////////////////////////////////////////////////////////////
// Nav.
////////////////////////////////////////////////////////////////////////
- if ( (ils = current_ilslist->findByFreq(nav_freq, lon, lat, elev)) != NULL ) {
- nav_id = ils->get_locident();
+ nav = globals->get_navlist()->findByFreq(nav_freq, lon, lat, elev);
+ dme = globals->get_dmelist()->findByFreq(nav_freq, lon, lat, elev);
+ if ( nav == NULL ) {
+ loc = globals->get_loclist()->findByFreq(nav_freq, lon, lat, elev);
+ gs = globals->get_gslist()->findByFreq(nav_freq, lon, lat, elev);
+ }
+
+ if ( loc != NULL ) {
+ nav_id = loc->get_ident();
+ // cout << "localizer = " << nav_id << endl;
nav_valid = true;
if ( last_nav_id != nav_id || last_nav_vor ) {
- nav_trans_ident = ils->get_trans_ident();
+ nav_trans_ident = loc->get_trans_ident();
+ nav_target_radial = loc->get_multiuse();
+ while ( nav_target_radial < 0.0 ) { nav_target_radial += 360.0; }
+ while ( nav_target_radial > 360.0 ) { nav_target_radial -= 360.0; }
+ nav_loclon = loc->get_lon();
+ nav_loclat = loc->get_lat();
+ nav_x = loc->get_x();
+ nav_y = loc->get_y();
+ nav_z = loc->get_z();
last_nav_id = nav_id;
last_nav_vor = false;
nav_loc = true;
- nav_has_dme = ils->get_has_dme();
- nav_has_gs = ils->get_has_gs();
-
- nav_loclon = ils->get_loclon();
- nav_loclat = ils->get_loclat();
- nav_gslon = ils->get_gslon();
- nav_gslat = ils->get_gslat();
- nav_elev = ils->get_gselev();
+ nav_has_dme = (dme != NULL);
+ nav_has_gs = (gs != NULL);
+ if ( nav_has_gs ) {
+ nav_gslon = gs->get_lon();
+ nav_gslat = gs->get_lat();
+ nav_elev = gs->get_elev_ft();
+ int tmp = (int)(gs->get_multiuse() / 1000.0);
+ nav_target_gs = (double)tmp / 100.0;
+ nav_gs_x = gs->get_x();
+ nav_gs_y = gs->get_y();
+ nav_gs_z = gs->get_z();
+
+ // derive GS baseline (perpendicular to the runay
+ // along the ground)
+ double tlon, tlat, taz;
+ geo_direct_wgs_84 ( 0.0, nav_gslat, nav_gslon,
+ nav_target_radial + 90,
+ 100.0, &tlat, &tlon, &taz );
+ // cout << "nav_target_radial = " << nav_target_radial << endl;
+ // cout << "nav_loc = " << nav_loc << endl;
+ // cout << nav_gslon << "," << nav_gslat << " "
+ // << tlon << "," << tlat << " (" << nav_elev << ")"
+ // << endl;
+ Point3D p1 = sgGeodToCart( Point3D(tlon*SGD_DEGREES_TO_RADIANS,
+ tlat*SGD_DEGREES_TO_RADIANS,
+ nav_elev*SG_FEET_TO_METER)
+ );
+ // cout << nav_gs_x << "," << nav_gs_y << "," << nav_gs_z
+ // << endl;
+ // cout << p1 << endl;
+ sgdSetVec3( gs_base_vec,
+ p1.x()-nav_gs_x, p1.y()-nav_gs_y, p1.z()-nav_gs_z );
+ // cout << gs_base_vec[0] << "," << gs_base_vec[1] << ","
+ // << gs_base_vec[2] << endl;
+ } else {
+ nav_elev = loc->get_elev_ft();
+ }
nav_twist = 0;
- nav_range = FG_ILS_DEFAULT_RANGE;
+ nav_range = FG_LOC_DEFAULT_RANGE;
nav_effective_range = nav_range;
- nav_target_gs = ils->get_gsangle();
- nav_target_radial = ils->get_locheading();
- while ( nav_target_radial < 0.0 ) { nav_target_radial += 360.0; }
- while ( nav_target_radial > 360.0 ) { nav_target_radial -= 360.0; }
- nav_x = ils->get_x();
- nav_y = ils->get_y();
- nav_z = ils->get_z();
- nav_gs_x = ils->get_gs_x();
- nav_gs_y = ils->get_gs_y();
- nav_gs_z = ils->get_gs_z();
-
- // derive GS baseline
- double tlon, tlat, taz;
- geo_direct_wgs_84 ( 0.0, nav_gslat, nav_gslon, nav_target_radial + 90,
- 100.0, &tlat, &tlon, &taz );
- // cout << nav_gslon << "," << nav_gslat << " "
- // << tlon << "," << tlat << " (" << nav_elev << ")" << endl;
- Point3D p1 = sgGeodToCart( Point3D(tlon*SGD_DEGREES_TO_RADIANS,
- tlat*SGD_DEGREES_TO_RADIANS,
- nav_elev*SG_FEET_TO_METER) );
- // cout << nav_gs_x << "," << nav_gs_y << "," << nav_gs_z << endl;
- // cout << p1 << endl;
- sgdSetVec3( gs_base_vec,
- p1.x()-nav_gs_x, p1.y()-nav_gs_y, p1.z()-nav_gs_z );
- // cout << gs_base_vec[0] << "," << gs_base_vec[1] << ","
- // << gs_base_vec[2] << endl;
if ( globals->get_soundmgr()->exists( nav_fx_name ) ) {
globals->get_soundmgr()->remove( nav_fx_name );
}
- SGSimpleSound *sound;
+ SGSoundSample *sound;
sound = morse.make_ident( nav_trans_ident, LO_FREQUENCY );
sound->set_volume( 0.3 );
globals->get_soundmgr()->add( sound, nav_fx_name );
// << " current time = "
// << globals->get_time_params()->get_cur_time() << endl;
- // cout << "Found an ils station in range" << endl;
- // cout << " id = " << ils->get_locident() << endl;
+ // cout << "Found an loc station in range" << endl;
+ // cout << " id = " << loc->get_locident() << endl;
}
- } else if ( (nav = current_navlist->findByFreq(nav_freq, lon, lat, elev)) != NULL ) {
+ } else if ( nav != NULL ) {
nav_id = nav->get_ident();
- nav_valid = (nav->get_type() == 'V');
+ // cout << "nav = " << nav_id << endl;
+ nav_valid = true;
if ( last_nav_id != nav_id || !last_nav_vor ) {
last_nav_id = nav_id;
last_nav_vor = true;
nav_trans_ident = nav->get_trans_ident();
nav_loc = false;
- nav_has_dme = nav->get_has_dme();
+ nav_has_dme = (dme != NULL);
nav_has_gs = false;
nav_loclon = nav->get_lon();
nav_loclat = nav->get_lat();
nav_elev = nav->get_elev_ft();
- nav_twist = nav->get_magvar();
+ nav_twist = nav->get_multiuse();
nav_range = nav->get_range();
nav_effective_range = adjustNavRange(nav_elev, elev, nav_range);
nav_target_gs = 0.0;
if ( globals->get_soundmgr()->exists( nav_fx_name ) ) {
globals->get_soundmgr()->remove( nav_fx_name );
}
- SGSimpleSound *sound;
+ SGSoundSample *sound;
sound = morse.make_ident( nav_trans_ident, LO_FREQUENCY );
sound->set_volume( 0.3 );
if ( globals->get_soundmgr()->add( sound, nav_fx_name ) ) {