TgtAptDialogInput->getValue(&s);
string tmp = s;
- double alt = 0.0;
unsigned int pos = tmp.find( "@" );
if ( pos != string::npos ) {
TgtAptId = tmp.substr( 0, pos );
- string alt_str = tmp.substr( pos + 1 );
- alt = atof( alt_str.c_str() );
- if ( !strcmp(fgGetString("/sim/startup/units"), "feet") ) {
- alt *= SG_FEET_TO_METER;
- }
} else {
TgtAptId = tmp;
}
TgtAptDialog_Cancel( NULL );
- FGAirport a;
- FGFix f;
- double t1, t2;
- if ( fgFindAirportID( TgtAptId, &a ) ) {
+ /* s = input string, either 'FIX' or FIX@4000' */
+ /* TgtAptId is name of fix only; may get appended to below */
- SG_LOG( SG_GENERAL, SG_INFO,
- "Adding waypoint (airport) = " << TgtAptId );
-
- sprintf( NewTgtAirportId, "%s", TgtAptId.c_str() );
+ if ( NewWaypoint( TgtAptId ) == 0)
+ {
+ TgtAptId += " not in database.";
+ mkDialog(TgtAptId.c_str());
+ }
+}
+
+/* add new waypoint (either from above popup window 'ok button or telnet session) */
+
+int NewWaypoint( string Tgt_Alt )
+{
+ string TgtAptId;
+ FGAirport a;
+ FGFix f;
+
+ double alt = 0.0;
+ unsigned int pos = Tgt_Alt.find( "@" );
+ if ( pos != string::npos ) {
+ TgtAptId = Tgt_Alt.substr( 0, pos );
+ string alt_str = Tgt_Alt.substr( pos + 1 );
+ alt = atof( alt_str.c_str() );
+ if ( !strcmp(fgGetString("/sim/startup/units"), "feet") ) {
+ alt *= SG_FEET_TO_METER;
+ }
+ } else {
+ TgtAptId = Tgt_Alt;
+ }
+
+ if ( fgFindAirportID( TgtAptId, &a ) ) {
+
+ SG_LOG( SG_GENERAL, SG_INFO,
+ "Adding waypoint (airport) = " << TgtAptId );
- SGWayPoint wp( a.longitude, a.latitude, alt,
- SGWayPoint::WGS84, TgtAptId );
- globals->get_route()->add_waypoint( wp );
+ sprintf( NewTgtAirportId, "%s", TgtAptId.c_str() );
+
+ SGWayPoint wp( a.longitude, a.latitude, alt,
+ SGWayPoint::WGS84, TgtAptId );
+ globals->get_route()->add_waypoint( wp );
/* and turn on the autopilot */
- globals->get_autopilot()->set_HeadingEnabled( true );
- globals->get_autopilot()->set_HeadingMode( FGAutopilot::FG_HEADING_WAYPOINT );
+ globals->get_autopilot()->set_HeadingEnabled( true );
+ globals->get_autopilot()->set_HeadingMode( FGAutopilot::FG_HEADING_WAYPOINT
+);
- } else if ( current_fixlist->query( TgtAptId, &f ) )
- {
- SG_LOG( SG_GENERAL, SG_INFO,
- "Adding waypoint (fix) = " << TgtAptId );
-
- sprintf( NewTgtAirportId, "%s", TgtAptId.c_str() );
+ return 1;
+
+ } else if ( current_fixlist->query( TgtAptId, &f ) )
+ {
+ SG_LOG( SG_GENERAL, SG_INFO,
+ "Adding waypoint (fix) = " << TgtAptId );
+
+ sprintf( NewTgtAirportId, "%s", TgtAptId.c_str() );
- SGWayPoint wp( f.get_lon(), f.get_lat(), alt,
- SGWayPoint::WGS84, TgtAptId );
- globals->get_route()->add_waypoint( wp );
+ SGWayPoint wp( f.get_lon(), f.get_lat(), alt,
+ SGWayPoint::WGS84, TgtAptId );
+ globals->get_route()->add_waypoint( wp );
/* and turn on the autopilot */
- globals->get_autopilot()->set_HeadingEnabled( true );
- globals->get_autopilot()->set_HeadingMode( FGAutopilot::FG_HEADING_WAYPOINT );
- } else {
- TgtAptId += " not in database.";
- mkDialog(TgtAptId.c_str());
- }
+ globals->get_autopilot()->set_HeadingEnabled( true );
+ globals->get_autopilot()->set_HeadingMode( FGAutopilot::FG_HEADING_WAYPOINT );
+ return 2;
+
+ }
+ else return 0;
}
+
void TgtAptDialog_Reset(puObject *)
{
sprintf( NewTgtAirportId, "%s", fgGetString("/sim/presets/airport-id") );
// Contributions by Jeff Goeke-Smith <jgoeke@voyager.net>
// Norman Vine <nhv@cape.com>
// Curtis Olson <curt@flightgear.org>
+// Wendell Turner <wendell@adsi-m4.com>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
#include <Scenery/scenery.hxx>
#include "newauto.hxx"
+#include "auto_gui.hxx"
/// These statics will eventually go into the class
fgTie("/autopilot/locks/heading", this,
&FGAutopilot::getAPHeadingLock, &FGAutopilot::setAPHeadingLock);
fgSetArchivable("/autopilot/locks/heading");
+
fgTie("/autopilot/settings/heading-bug-deg", this,
&FGAutopilot::getAPHeadingBug, &FGAutopilot::setAPHeadingBug);
fgSetArchivable("/autopilot/settings/heading-bug-deg");
fgSetDouble("/autopilot/settings/heading-bug-deg", 0.0f);
+
+ fgTie("/autopilot/settings/waypoint", this,
+ &FGAutopilot::getAPwaypoint, &FGAutopilot::setAPwaypoint);
+ fgSetArchivable("/autopilot/settings/waypoint");
+ fgSetString("/autopilot/settings/waypoint", "");
+
fgTie("/autopilot/locks/wing-leveler", this,
&FGAutopilot::getAPWingLeveler, &FGAutopilot::setAPWingLeveler);
fgSetArchivable("/autopilot/locks/wing-leveler");
}
+/**
+ * return blank-separated string of waypoints
+ */
+const char *
+FGAutopilot::getAPwaypoint () const
+{
+ static char wplist[500];
+ char *p = wplist;
+ int WPListsize, i;
+
+ // FIXME: This can cause a possible buffer overflow, EMH
+ if ( globals->get_route()->size() > 0 ) {
+ WPListsize = globals->get_route()->size();
+
+ for (i = 0; i < globals->get_route()->size(); i++ ) {
+ p += sprintf(p, "%5s ",
+ globals->get_route()->get_waypoint(i).get_id().c_str() );
+ }
+ return wplist;
+
+ } else {
+ return "none specified";
+ }
+}
+
+
+/**
+ * set next waypoint (if str='0', then delete next(first) waypoint)
+ */
+void
+FGAutopilot::setAPwaypoint (const char * apt)
+{
+ if (strcmp(apt, "0")==0)
+ {
+ SG_LOG( SG_AUTOPILOT, SG_INFO, "delete of first wp" );
+ if ( globals->get_route()->size() )
+ globals->get_route()->delete_first();
+ return;
+ }
+
+ if ( NewWaypoint( apt ) == 0)
+ SG_LOG( SG_AUTOPILOT, SG_INFO, "Waypoint " << apt << "not in d.b." );
+ else
+ {
+ /* SG_LOG( SG_AUTOPILOT, SG_INFO, "GOOD!" ); */
+ }
+}
+
/**
* Get the autopilot wing leveler lock (true=on).
*/