- SG_LOG(SG_GENERAL, SG_INFO, "Loading Airport Database ...");
-
- SGPath aptdb( globals->get_fg_root() );
- aptdb.append( "Airports/apt.dat" );
-
- SGPath p_metar( globals->get_fg_root() );
- p_metar.append( "Airports/metar.dat" );
-
- fgAirportDBLoad( aptdb.str(), p_metar.str() );
- FGAirport::installPropertyListener();
- FGPositioned::installCommands();
-
- FGNavList *navlist = new FGNavList;
- FGNavList *loclist = new FGNavList;
- FGNavList *gslist = new FGNavList;
- FGNavList *dmelist = new FGNavList;
- FGNavList *tacanlist = new FGNavList;
- FGNavList *carrierlist = new FGNavList;
- FGTACANList *channellist = new FGTACANList;
-
- globals->set_navlist( navlist );
- globals->set_loclist( loclist );
- globals->set_gslist( gslist );
- globals->set_dmelist( dmelist );
- globals->set_tacanlist( tacanlist );
- globals->set_carrierlist( carrierlist );
- globals->set_channellist( channellist );
-
- if ( !fgNavDBInit(navlist, loclist, gslist, dmelist, tacanlist, carrierlist, channellist) ) {
- SG_LOG( SG_GENERAL, SG_ALERT,
- "Problems loading one or more navigational database" );
- }
-
- SG_LOG(SG_GENERAL, SG_INFO, " Fixes");
- SGPath p_fix( globals->get_fg_root() );
- p_fix.append( "Navaids/fix.dat" );
- FGFixList fixlist;
- fixlist.init( p_fix ); // adds fixes to the DB in positioned.cxx
-
- SG_LOG(SG_GENERAL, SG_INFO, " Airways");
- flightgear::Airway::load();
-
- return true;
-}
-
-
-// Set the initial position based on presets (or defaults)
-bool fgInitPosition() {
- // cout << "fgInitPosition()" << endl;
- double gs = fgGetDouble("/sim/presets/glideslope-deg")
- * SG_DEGREES_TO_RADIANS ;
- double od = fgGetDouble("/sim/presets/offset-distance-nm");
- double alt = fgGetDouble("/sim/presets/altitude-ft");
-
- bool set_pos = false;
-
- // If glideslope is specified, then calculate offset-distance or
- // altitude relative to glide slope if either of those was not
- // specified.
- if ( fabs( gs ) > 0.01 ) {
- fgSetDistOrAltFromGlideSlope();
- }
-
-
- // If we have an explicit, in-range lon/lat, don't change it, just use it.
- // If not, check for an airport-id and use that.
- // If not, default to the middle of the KSFO field.
- // The default values for lon/lat are deliberately out of range
- // so that the airport-id can take effect; valid lon/lat will
- // override airport-id, however.
- double lon_deg = fgGetDouble("/sim/presets/longitude-deg");
- double lat_deg = fgGetDouble("/sim/presets/latitude-deg");
- if ( lon_deg >= -180.0 && lon_deg <= 180.0
- && lat_deg >= -90.0 && lat_deg <= 90.0 )
- {
- set_pos = true;
- }
-
- string apt = fgGetString("/sim/presets/airport-id");
- string rwy_no = fgGetString("/sim/presets/runway");
- bool rwy_req = fgGetBool("/sim/presets/runway-requested");
- string vor = fgGetString("/sim/presets/vor-id");
- double vor_freq = fgGetDouble("/sim/presets/vor-freq");
- string ndb = fgGetString("/sim/presets/ndb-id");
- double ndb_freq = fgGetDouble("/sim/presets/ndb-freq");
- string carrier = fgGetString("/sim/presets/carrier");
- string parkpos = fgGetString("/sim/presets/parkpos");
- string fix = fgGetString("/sim/presets/fix");
- SGPropertyNode *hdg_preset = fgGetNode("/sim/presets/heading-deg", true);
- double hdg = hdg_preset->getDoubleValue();
-
- // save some start parameters, so that we can later say what the
- // user really requested. TODO generalize that and move it to options.cxx
- static bool start_options_saved = false;
- if (!start_options_saved) {
- start_options_saved = true;
- SGPropertyNode *opt = fgGetNode("/sim/startup/options", true);
-
- opt->setDoubleValue("latitude-deg", lat_deg);
- opt->setDoubleValue("longitude-deg", lon_deg);
- opt->setDoubleValue("heading-deg", hdg);
- opt->setStringValue("airport", apt.c_str());
- opt->setStringValue("runway", rwy_no.c_str());
- }
-
- if (hdg > 9990.0)
- hdg = fgGetDouble("/environment/config/boundary/entry/wind-from-heading-deg", 270);
-
- if ( !set_pos && !apt.empty() && !parkpos.empty() ) {
- // An airport + parking position is requested
- if ( fgSetPosFromAirportIDandParkpos( apt, parkpos ) ) {
- // set tower position
- fgSetString("/sim/airport/closest-airport-id", apt.c_str());
- fgSetString("/sim/tower/airport-id", apt.c_str());
- set_pos = true;
- }
- }
-
- if ( !set_pos && !apt.empty() && !rwy_no.empty() ) {
- // An airport + runway is requested
- if ( fgSetPosFromAirportIDandRwy( apt, rwy_no, rwy_req ) ) {
- // set tower position (a little off the heading for single
- // runway airports)
- fgSetString("/sim/airport/closest-airport-id", apt.c_str());
- fgSetString("/sim/tower/airport-id", apt.c_str());
- set_pos = true;
- }
- }
-
- if ( !set_pos && !apt.empty() ) {
- // An airport is requested (find runway closest to hdg)
- if ( fgSetPosFromAirportIDandHdg( apt, hdg ) ) {
- // set tower position (a little off the heading for single
- // runway airports)
- fgSetString("/sim/airport/closest-airport-id", apt.c_str());
- fgSetString("/sim/tower/airport-id", apt.c_str());
- set_pos = true;
- }
- }
-
- if (hdg_preset->getDoubleValue() > 9990.0)
- hdg_preset->setDoubleValue(hdg);
-
- if ( !set_pos && !vor.empty() ) {
- // a VOR is requested
- if ( fgSetPosFromNAV( vor, vor_freq, FGPositioned::VOR ) ) {
- set_pos = true;
- }
- }
-
- if ( !set_pos && !ndb.empty() ) {
- // an NDB is requested
- if ( fgSetPosFromNAV( ndb, ndb_freq, FGPositioned::NDB ) ) {
- set_pos = true;
- }
- }
-
- if ( !set_pos && !carrier.empty() ) {
- // an aircraft carrier is requested
- if ( fgSetPosFromCarrier( carrier, parkpos ) ) {
- set_pos = true;
- }
- }
-
- if ( !set_pos && !fix.empty() ) {
- // a Fix is requested
- if ( fgSetPosFromFix( fix ) ) {
- set_pos = true;
- }
- }
-
- if ( !set_pos ) {
- // No lon/lat specified, no airport specified, default to
- // middle of KSFO field.
- fgSetDouble("/sim/presets/longitude-deg", -122.374843);
- fgSetDouble("/sim/presets/latitude-deg", 37.619002);
- }
-
- fgSetDouble( "/position/longitude-deg",
- fgGetDouble("/sim/presets/longitude-deg") );
- fgSetDouble( "/position/latitude-deg",
- fgGetDouble("/sim/presets/latitude-deg") );
- fgSetDouble( "/orientation/heading-deg", hdg_preset->getDoubleValue());
-
- // determine if this should be an on-ground or in-air start
- if ((fabs(gs) > 0.01 || fabs(od) > 0.1 || alt > 0.1) && carrier.empty()) {
- fgSetBool("/sim/presets/onground", false);
- } else {
- fgSetBool("/sim/presets/onground", true);