1
0
Fork 0

Wendell Turner writes:

I modified the files in src/Autopilot to add waypoint capabilities to the telnet port.

'set waypoint <WPT>' will set the next waypoint.
'get waypoint' returns one string which is the list of waypoints.
'set waypoint 0' will delete the next waypoint.
This commit is contained in:
ehofman 2003-04-22 09:21:17 +00:00
parent 81a1391ed8
commit ec358a6b16
4 changed files with 126 additions and 39 deletions

View file

@ -608,24 +608,46 @@ void TgtAptDialog_OK (puObject *)
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 );
/* s = input string, either 'FIX' or FIX@4000' */
/* TgtAptId is name of fix only; may get appended to below */
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 t1, t2;
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,
@ -639,7 +661,10 @@ void TgtAptDialog_OK (puObject *)
/* and turn on the autopilot */
globals->get_autopilot()->set_HeadingEnabled( true );
globals->get_autopilot()->set_HeadingMode( FGAutopilot::FG_HEADING_WAYPOINT );
globals->get_autopilot()->set_HeadingMode( FGAutopilot::FG_HEADING_WAYPOINT
);
return 1;
} else if ( current_fixlist->query( TgtAptId, &f ) )
{
@ -655,12 +680,13 @@ void TgtAptDialog_OK (puObject *)
/* 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());
return 2;
}
else return 0;
}
void TgtAptDialog_Reset(puObject *)
{
sprintf( NewTgtAirportId, "%s", fgGetString("/sim/presets/airport-id") );

View file

@ -43,5 +43,7 @@ void fgAPAdjustInit() ;
void NewHeadingInit();
void NewAltitudeInit();
int NewWaypoint( string Tgt_Alt );
#endif // _AUTO_GUI_HXX

View file

@ -5,6 +5,7 @@
// 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
@ -44,6 +45,7 @@
#include <Scenery/scenery.hxx>
#include "newauto.hxx"
#include "auto_gui.hxx"
/// These statics will eventually go into the class
@ -343,10 +345,17 @@ FGAutopilot::bind ()
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");
@ -1273,6 +1282,54 @@ FGAutopilot::setAPHeadingBug (double heading)
}
/**
* 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).
*/

View file

@ -272,6 +272,8 @@ private:
void setAPHeadingLock (bool lock);
double getAPHeadingBug () const;
void setAPHeadingBug (double heading);
const char * getAPwaypoint () const;
void setAPwaypoint (const char * apt);
bool getAPWingLeveler () const;
void setAPWingLeveler (bool lock);
bool getAPNAV1Lock () const;