From df0228e019c03f43403f3c46067cf3af4bc08ef8 Mon Sep 17 00:00:00 2001 From: curt Date: Thu, 12 Oct 2000 01:08:09 +0000 Subject: [PATCH] Tweaks and massaging relative to the new waypoint route management system. You can now specify waypoint on the command line with --wp=ID[,alt] --- src/Main/bfi.cxx | 25 ---------------- src/Main/bfi.hxx | 4 --- src/Main/fg_init.cxx | 67 +++++++++++++++++++++++-------------------- src/Main/fg_init.hxx | 6 ++++ src/Main/globals.hxx | 7 +++++ src/Main/keyboard.cxx | 1 + src/Main/main.cxx | 2 ++ src/Main/options.cxx | 45 +++++++++++++++++++++++++++-- src/Main/options.hxx | 1 + 9 files changed, 96 insertions(+), 62 deletions(-) diff --git a/src/Main/bfi.cxx b/src/Main/bfi.cxx index 351792f90..886d7d3a8 100644 --- a/src/Main/bfi.cxx +++ b/src/Main/bfi.cxx @@ -314,9 +314,6 @@ FGBFI::reinit () setAPAltitude(apAltitude); setTargetAirport(targetAirport); setGPSLock(gpsLock); - // setGPSTargetLatitude(gpsLatitude); - // setGPSTargetLongitude(gpsLongitude); - setGPSTargetWayPoint(gpsLatitude, gpsLongitude); _needReinit = false; @@ -1557,28 +1554,6 @@ FGBFI::getGPSTargetLatitude () } -/** - * Set the GPS target waypoint - */ -void -FGBFI::setGPSTargetWayPoint (double latitude, double longitude) -{ - current_autopilot->set_WayPoint( longitude, latitude, "reload" ); -} - - -#if 0 -/** - * Set the GPS target latitude in degrees (negative for south). - */ -void -FGBFI::setGPSTargetLatitude (double latitude) -{ - current_autopilot->set_TargetLatitude( latitude ); -} -#endif - - /** * Get the GPS target longitude in degrees (negative for west). */ diff --git a/src/Main/bfi.hxx b/src/Main/bfi.hxx index 8f26d8855..6c086f676 100644 --- a/src/Main/bfi.hxx +++ b/src/Main/bfi.hxx @@ -197,10 +197,6 @@ public: static void setTargetAirport (const string &targetAirport); static void setGPSLock (bool lock); - // static void setGPSTargetLatitude (double latitude); - // static void setGPSTargetLongitude (double longitude); - static void setGPSTargetWayPoint (double latitude, double longitude); - // Weather static double getVisibility (); diff --git a/src/Main/fg_init.cxx b/src/Main/fg_init.cxx index d6659673d..018e18d4d 100644 --- a/src/Main/fg_init.cxx +++ b/src/Main/fg_init.cxx @@ -161,44 +161,20 @@ bool fgInitConfig ( int argc, char **argv ) { } -// Set current_options lon/lat given an airport id -bool fgSetPosFromAirportID( const string& id ) { - FGAirport a; - double lon, lat; - +// find basic airport location info from airport database +bool fgFindAirportID( const string& id, FGAirport *a ) { if ( id.length() ) { - // set initial position from airport id - FGPath path( current_options.get_fg_root() ); path.append( "Airports" ); path.append( "simple.mk4" ); FGAirports airports( path.c_str() ); - FG_LOG( FG_GENERAL, FG_INFO, - "Attempting to set starting position from airport code " - << id ); - - // FGPath inpath( current_options.get_fg_root() ); - // inpath.append( "Airports" ); - // inpath.append( "apt_simple" ); - // airports.load( inpath.c_str() ); - - // FGPath outpath( current_options.get_fg_root() ); - // outpath.append( "Airports" ); - // outpath.append( "simple.gdbm" ); - // airports.dump_gdbm( outpath.c_str() ); + FG_LOG( FG_GENERAL, FG_INFO, "Searching for airport code = " << id ); - if ( ! airports.search( id, &a ) ) { + if ( ! airports.search( id, a ) ) { FG_LOG( FG_GENERAL, FG_ALERT, - "Failed to find " << id << " in database." ); + "Failed to find " << id << " in " << path.str() ); return false; - } else { - current_options.set_lon( a.longitude ); - current_options.set_lat( a.latitude ); - current_properties.setDoubleValue("/position/longitude", - a.longitude); - current_properties.setDoubleValue("/position/latitude", - a.latitude); } } else { return false; @@ -206,13 +182,42 @@ bool fgSetPosFromAirportID( const string& id ) { FG_LOG( FG_GENERAL, FG_INFO, "Position for " << id << " is (" - << a.longitude << ", " - << a.latitude << ")" ); + << a->longitude << ", " + << a->latitude << ")" ); return true; } +// Set current_options lon/lat given an airport id +bool fgSetPosFromAirportID( const string& id ) { + FGAirport a; + double lon, lat; + + FG_LOG( FG_GENERAL, FG_INFO, + "Attempting to set starting position from airport code " << id ); + + if ( fgFindAirportID( id, &a ) ) { + current_options.set_lon( a.longitude ); + current_options.set_lat( a.latitude ); + current_properties.setDoubleValue("/position/longitude", + a.longitude); + current_properties.setDoubleValue("/position/latitude", + a.latitude); + + FG_LOG( FG_GENERAL, FG_INFO, + "Position for " << id << " is (" + << a.longitude << ", " + << a.latitude << ")" ); + + return true; + } else { + return false; + } + +} + + // Set current_options lon/lat given an airport id and heading (degrees) bool fgSetPosFromAirportIDandHdg( const string& id, double tgt_hdg ) { FGRunway r; diff --git a/src/Main/fg_init.hxx b/src/Main/fg_init.hxx index 75bdf100b..df407856a 100644 --- a/src/Main/fg_init.hxx +++ b/src/Main/fg_init.hxx @@ -31,6 +31,9 @@ #endif +#include + + // Read in configuration (file and command line) and just set fg_root bool fgInitFGRoot ( int argc, char **argv ); @@ -53,6 +56,9 @@ bool fgInitSubsystems( void ); void fgReInitSubsystems( void ); +// find basic airport location info from airport database +bool fgFindAirportID( const string& id, FGAirport *a ); + // Set current_options lon/lat given an airport id bool fgSetPosFromAirportID( const string& id ); diff --git a/src/Main/globals.hxx b/src/Main/globals.hxx index ebe8a8262..66fdc7131 100644 --- a/src/Main/globals.hxx +++ b/src/Main/globals.hxx @@ -27,6 +27,7 @@ #include #include +#include #include @@ -54,6 +55,9 @@ private: // Magnetic Variation SGMagVar *mag; + // Global autopilot "route" + SGRoute *route; + public: FGGlobals(); @@ -78,6 +82,9 @@ public: inline SGMagVar *get_mag() const { return mag; } inline void set_mag( SGMagVar *m ) { mag = m; } + + inline SGRoute *get_route() const { return route; } + inline void set_route( SGRoute *r ) { route = r; } }; diff --git a/src/Main/keyboard.cxx b/src/Main/keyboard.cxx index ba0702c82..624a087b9 100644 --- a/src/Main/keyboard.cxx +++ b/src/Main/keyboard.cxx @@ -552,6 +552,7 @@ void GLUTspecialkey(int k, int x, int y) { FGAutopilot::FG_HEADING_WAYPOINT ) { current_autopilot->set_HeadingMode( FGAutopilot::FG_HEADING_WAYPOINT ); + current_autopilot->set_HeadingEnabled( true ); } else { current_autopilot->set_HeadingMode( FGAutopilot::FG_HEADING_LOCK ); diff --git a/src/Main/main.cxx b/src/Main/main.cxx index 7ef6ab223..f15de3610 100644 --- a/src/Main/main.cxx +++ b/src/Main/main.cxx @@ -1302,6 +1302,8 @@ int main( int argc, char **argv ) { // needs to happen before we parse command line options globals = new FGGlobals; + SGRoute *route = new SGRoute; + globals->set_route( route ); // Load the configuration parameters if ( !fgInitConfig(argc, argv) ) { diff --git a/src/Main/options.cxx b/src/Main/options.cxx index 30edd121c..1903391e2 100644 --- a/src/Main/options.cxx +++ b/src/Main/options.cxx @@ -45,6 +45,7 @@ bool global_fullscreen = true; #include #include +#include #include #include #include @@ -52,6 +53,7 @@ bool global_fullscreen = true; # include #endif +#include "fg_init.hxx" #include "globals.hxx" #include "options.hxx" #include "views.hxx" @@ -589,6 +591,36 @@ fgOPTIONS::parse_channel( const string& type, const string& channel_str ) { } +// Parse --wp=ID[,alt] +bool fgOPTIONS::parse_wp( const string& arg ) { + string id, alt_str; + double alt = 0.0; + + int pos = arg.find( "," ); + if ( pos != string::npos ) { + id = arg.substr( 0, pos ); + alt_str = arg.substr( pos + 1 ); + // cout << "id str = " << id << " alt str = " << alt_str << endl; + alt = atof( alt_str.c_str() ); + if ( units == FG_UNITS_FEET ) { + alt *= FEET_TO_METER; + } + } else { + id = arg; + } + + FGAirport a; + if ( fgFindAirportID( id, &a ) ) { + SGWayPoint wp( a.longitude, a.latitude, alt, SGWayPoint::WGS84, id ); + globals->get_route()->add_waypoint( wp ); + + return true; + } else { + return false; + } +} + + // Parse a single option int fgOPTIONS::parse_option( const string& arg ) { // General Options @@ -864,6 +896,8 @@ int fgOPTIONS::parse_option( const string& arg ) { current_properties.setStringValue(name.c_str(), value); FG_LOG(FG_GENERAL, FG_INFO, "Setting default value of property " << name << " to \"" << value << '"'); + } else if ( arg.find( "--wp=" ) != string::npos ) { + parse_wp( arg.substr( 5 ) ); } else { FG_LOG( FG_GENERAL, FG_ALERT, "Unknown option '" << arg << "'" ); return FG_OPTIONS_ERROR; @@ -1043,7 +1077,7 @@ void fgOPTIONS::usage ( void ) { cout << "\t--notrim: Do NOT attempt to trim the model when initializing JSBsim" << endl; cout << endl; //(UIUC) - cout <<"Aircraft model directory" << endl; + cout <<"Aircraft model directory:" << endl; cout <<"\t--aircraft-dir= path is relative to the path of the executable" << endl; cout << endl; @@ -1119,7 +1153,7 @@ void fgOPTIONS::usage ( void ) { cout << "\t--start-date-lat=yyyy:mm:dd:hh:mm:ss: specify a starting" << endl << "\t\tdate/time. Uses Local Aircraft Time" << endl; #ifdef FG_NETWORK_OLK - cout << "" << endl; + cout << endl; cout << "Network Options:" << endl; cout << "\t--enable-network-olk: enable Multipilot mode" << endl; @@ -1127,6 +1161,13 @@ void fgOPTIONS::usage ( void ) { cout << "\t--net-hud: Hud displays network info" << endl; cout << "\t--net-id=name: specify your own callsign" << endl; #endif + + cout << endl; + cout << "Route/Way Point Options:" << endl; + cout << "\t--wp=ID[,alt]: specify a waypoint for the GC autopilot" << endl; + cout << "\t\tYou can specify multiple waypoints (a route) with multiple" + << endl; + cout << "\t\tinstances of --wp=" << endl; } diff --git a/src/Main/options.hxx b/src/Main/options.hxx index 3bef864d9..cf1df366c 100644 --- a/src/Main/options.hxx +++ b/src/Main/options.hxx @@ -384,6 +384,7 @@ private: int parse_fdm( const string& fm ); double parse_fov( const string& arg ); bool parse_channel( const string& type, const string& channel_str ); + bool parse_wp( const string& arg ); }; -- 2.39.5