Autopilot cleanup:
- implement the standard FGSubsystem interface, for consistency - eliminate current_autopilot and add get/set_autopilot to FGGlobals, for consistency - use private methods rather than static functions for tying properties There should be no change in functionality.
This commit is contained in:
parent
fd21788c45
commit
36876decf3
9 changed files with 493 additions and 522 deletions
|
@ -206,10 +206,10 @@ void ApHeadingDialog_OK (puObject *me)
|
||||||
double NewHeading;
|
double NewHeading;
|
||||||
if( scan_number( c, &NewHeading ) )
|
if( scan_number( c, &NewHeading ) )
|
||||||
{
|
{
|
||||||
if ( !current_autopilot->get_HeadingEnabled() ) {
|
if ( !globals->get_autopilot()->get_HeadingEnabled() ) {
|
||||||
current_autopilot->set_HeadingEnabled( true );
|
globals->get_autopilot()->set_HeadingEnabled( true );
|
||||||
}
|
}
|
||||||
current_autopilot->HeadingSet( NewHeading );
|
globals->get_autopilot()->HeadingSet( NewHeading );
|
||||||
} else {
|
} else {
|
||||||
error = 1;
|
error = 1;
|
||||||
s = c;
|
s = c;
|
||||||
|
@ -224,7 +224,7 @@ void NewHeading(puObject *cb)
|
||||||
{
|
{
|
||||||
// string ApHeadingLabel( "Enter New Heading" );
|
// string ApHeadingLabel( "Enter New Heading" );
|
||||||
// ApHeadingDialogMessage -> setLabel(ApHeadingLabel.c_str());
|
// ApHeadingDialogMessage -> setLabel(ApHeadingLabel.c_str());
|
||||||
float heading = current_autopilot->get_DGTargetHeading();
|
float heading = globals->get_autopilot()->get_DGTargetHeading();
|
||||||
while ( heading < 0.0 ) { heading += 360.0; }
|
while ( heading < 0.0 ) { heading += 360.0; }
|
||||||
ApHeadingDialogInput -> setValue ( heading );
|
ApHeadingDialogInput -> setValue ( heading );
|
||||||
ApHeadingDialogInput -> acceptInput();
|
ApHeadingDialogInput -> acceptInput();
|
||||||
|
@ -283,10 +283,10 @@ void ApAltitudeDialog_OK (puObject *me)
|
||||||
double NewAltitude;
|
double NewAltitude;
|
||||||
if( scan_number( c, &NewAltitude) )
|
if( scan_number( c, &NewAltitude) )
|
||||||
{
|
{
|
||||||
if ( !current_autopilot->get_AltitudeEnabled() ) {
|
if ( !globals->get_autopilot()->get_AltitudeEnabled() ) {
|
||||||
current_autopilot->set_AltitudeEnabled( true );
|
globals->get_autopilot()->set_AltitudeEnabled( true );
|
||||||
}
|
}
|
||||||
current_autopilot->AltitudeSet( NewAltitude );
|
globals->get_autopilot()->AltitudeSet( NewAltitude );
|
||||||
} else {
|
} else {
|
||||||
error = 1;
|
error = 1;
|
||||||
s = c;
|
s = c;
|
||||||
|
@ -299,7 +299,7 @@ void ApAltitudeDialog_OK (puObject *me)
|
||||||
|
|
||||||
void NewAltitude(puObject *cb)
|
void NewAltitude(puObject *cb)
|
||||||
{
|
{
|
||||||
float altitude = current_autopilot->get_TargetAltitude() * SG_METER_TO_FEET;
|
float altitude = globals->get_autopilot()->get_TargetAltitude() * SG_METER_TO_FEET;
|
||||||
ApAltitudeDialogInput -> setValue( altitude );
|
ApAltitudeDialogInput -> setValue( altitude );
|
||||||
ApAltitudeDialogInput -> acceptInput();
|
ApAltitudeDialogInput -> acceptInput();
|
||||||
FG_PUSH_PUI_DIALOG( ApAltitudeDialog );
|
FG_PUSH_PUI_DIALOG( ApAltitudeDialog );
|
||||||
|
@ -359,8 +359,8 @@ static void maxroll_adj( puObject *hs ) {
|
||||||
hs-> getValue ( &val ) ;
|
hs-> getValue ( &val ) ;
|
||||||
SG_CLAMP_RANGE ( val, 0.1f, 1.0f ) ;
|
SG_CLAMP_RANGE ( val, 0.1f, 1.0f ) ;
|
||||||
// printf ( "maxroll_adj( %p ) %f %f\n", hs, val, MaxRollAdjust * val ) ;
|
// printf ( "maxroll_adj( %p ) %f %f\n", hs, val, MaxRollAdjust * val ) ;
|
||||||
current_autopilot->set_MaxRoll( MaxRollAdjust * val );
|
globals->get_autopilot()->set_MaxRoll( MaxRollAdjust * val );
|
||||||
sprintf( SliderText[ 0 ], "%05.2f", current_autopilot->get_MaxRoll() );
|
sprintf( SliderText[ 0 ], "%05.2f", globals->get_autopilot()->get_MaxRoll() );
|
||||||
APAdjustMaxRollText -> setLabel ( SliderText[ 0 ] ) ;
|
APAdjustMaxRollText -> setLabel ( SliderText[ 0 ] ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -370,8 +370,8 @@ static void rollout_adj( puObject *hs ) {
|
||||||
hs-> getValue ( &val ) ;
|
hs-> getValue ( &val ) ;
|
||||||
SG_CLAMP_RANGE ( val, 0.1f, 1.0f ) ;
|
SG_CLAMP_RANGE ( val, 0.1f, 1.0f ) ;
|
||||||
// printf ( "rollout_adj( %p ) %f %f\n", hs, val, RollOutAdjust * val ) ;
|
// printf ( "rollout_adj( %p ) %f %f\n", hs, val, RollOutAdjust * val ) ;
|
||||||
current_autopilot->set_RollOut( RollOutAdjust * val );
|
globals->get_autopilot()->set_RollOut( RollOutAdjust * val );
|
||||||
sprintf( SliderText[ 1 ], "%05.2f", current_autopilot->get_RollOut() );
|
sprintf( SliderText[ 1 ], "%05.2f", globals->get_autopilot()->get_RollOut() );
|
||||||
APAdjustRollOutText -> setLabel ( SliderText[ 1 ] );
|
APAdjustRollOutText -> setLabel ( SliderText[ 1 ] );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -381,8 +381,8 @@ static void maxaileron_adj( puObject *hs ) {
|
||||||
hs-> getValue ( &val ) ;
|
hs-> getValue ( &val ) ;
|
||||||
SG_CLAMP_RANGE ( val, 0.1f, 1.0f ) ;
|
SG_CLAMP_RANGE ( val, 0.1f, 1.0f ) ;
|
||||||
// printf ( "maxaileron_adj( %p ) %f %f\n", hs, val, MaxAileronAdjust * val ) ;
|
// printf ( "maxaileron_adj( %p ) %f %f\n", hs, val, MaxAileronAdjust * val ) ;
|
||||||
current_autopilot->set_MaxAileron( MaxAileronAdjust * val );
|
globals->get_autopilot()->set_MaxAileron( MaxAileronAdjust * val );
|
||||||
sprintf( SliderText[ 3 ], "%05.2f", current_autopilot->get_MaxAileron() );
|
sprintf( SliderText[ 3 ], "%05.2f", globals->get_autopilot()->get_MaxAileron() );
|
||||||
APAdjustMaxAileronText -> setLabel ( SliderText[ 3 ] );
|
APAdjustMaxAileronText -> setLabel ( SliderText[ 3 ] );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -392,8 +392,8 @@ static void rolloutsmooth_adj( puObject *hs ) {
|
||||||
hs -> getValue ( &val ) ;
|
hs -> getValue ( &val ) ;
|
||||||
SG_CLAMP_RANGE ( val, 0.1f, 1.0f ) ;
|
SG_CLAMP_RANGE ( val, 0.1f, 1.0f ) ;
|
||||||
// printf ( "rolloutsmooth_adj( %p ) %f %f\n", hs, val, RollOutSmoothAdjust * val ) ;
|
// printf ( "rolloutsmooth_adj( %p ) %f %f\n", hs, val, RollOutSmoothAdjust * val ) ;
|
||||||
current_autopilot->set_RollOutSmooth( RollOutSmoothAdjust * val );
|
globals->get_autopilot()->set_RollOutSmooth( RollOutSmoothAdjust * val );
|
||||||
sprintf( SliderText[ 2 ], "%5.2f", current_autopilot->get_RollOutSmooth() );
|
sprintf( SliderText[ 2 ], "%5.2f", globals->get_autopilot()->get_RollOutSmooth() );
|
||||||
APAdjustRollOutSmoothText-> setLabel ( SliderText[ 2 ] );
|
APAdjustRollOutSmoothText-> setLabel ( SliderText[ 2 ] );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -404,19 +404,19 @@ static void goAwayAPAdjust (puObject *)
|
||||||
}
|
}
|
||||||
|
|
||||||
void cancelAPAdjust( puObject *self ) {
|
void cancelAPAdjust( puObject *self ) {
|
||||||
current_autopilot->set_MaxRoll( TmpMaxRollValue );
|
globals->get_autopilot()->set_MaxRoll( TmpMaxRollValue );
|
||||||
current_autopilot->set_RollOut( TmpRollOutValue );
|
globals->get_autopilot()->set_RollOut( TmpRollOutValue );
|
||||||
current_autopilot->set_MaxAileron( TmpMaxAileronValue );
|
globals->get_autopilot()->set_MaxAileron( TmpMaxAileronValue );
|
||||||
current_autopilot->set_RollOutSmooth( TmpRollOutSmoothValue );
|
globals->get_autopilot()->set_RollOutSmooth( TmpRollOutSmoothValue );
|
||||||
|
|
||||||
goAwayAPAdjust(self);
|
goAwayAPAdjust(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
void resetAPAdjust( puObject *self ) {
|
void resetAPAdjust( puObject *self ) {
|
||||||
current_autopilot->set_MaxRoll( MaxRollAdjust / 2 );
|
globals->get_autopilot()->set_MaxRoll( MaxRollAdjust / 2 );
|
||||||
current_autopilot->set_RollOut( RollOutAdjust / 2 );
|
globals->get_autopilot()->set_RollOut( RollOutAdjust / 2 );
|
||||||
current_autopilot->set_MaxAileron( MaxAileronAdjust / 2 );
|
globals->get_autopilot()->set_MaxAileron( MaxAileronAdjust / 2 );
|
||||||
current_autopilot->set_RollOutSmooth( RollOutSmoothAdjust / 2 );
|
globals->get_autopilot()->set_RollOutSmooth( RollOutSmoothAdjust / 2 );
|
||||||
|
|
||||||
FG_POP_PUI_DIALOG( APAdjustDialog );
|
FG_POP_PUI_DIALOG( APAdjustDialog );
|
||||||
|
|
||||||
|
@ -424,15 +424,15 @@ void resetAPAdjust( puObject *self ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void fgAPAdjust( puObject *self ) {
|
void fgAPAdjust( puObject *self ) {
|
||||||
TmpMaxRollValue = current_autopilot->get_MaxRoll();
|
TmpMaxRollValue = globals->get_autopilot()->get_MaxRoll();
|
||||||
TmpRollOutValue = current_autopilot->get_RollOut();
|
TmpRollOutValue = globals->get_autopilot()->get_RollOut();
|
||||||
TmpMaxAileronValue = current_autopilot->get_MaxAileron();
|
TmpMaxAileronValue = globals->get_autopilot()->get_MaxAileron();
|
||||||
TmpRollOutSmoothValue = current_autopilot->get_RollOutSmooth();
|
TmpRollOutSmoothValue = globals->get_autopilot()->get_RollOutSmooth();
|
||||||
|
|
||||||
MaxRollValue = current_autopilot->get_MaxRoll() / MaxRollAdjust;
|
MaxRollValue = globals->get_autopilot()->get_MaxRoll() / MaxRollAdjust;
|
||||||
RollOutValue = current_autopilot->get_RollOut() / RollOutAdjust;
|
RollOutValue = globals->get_autopilot()->get_RollOut() / RollOutAdjust;
|
||||||
MaxAileronValue = current_autopilot->get_MaxAileron() / MaxAileronAdjust;
|
MaxAileronValue = globals->get_autopilot()->get_MaxAileron() / MaxAileronAdjust;
|
||||||
RollOutSmoothValue = current_autopilot->get_RollOutSmooth()
|
RollOutSmoothValue = globals->get_autopilot()->get_RollOutSmooth()
|
||||||
/ RollOutSmoothAdjust;
|
/ RollOutSmoothAdjust;
|
||||||
|
|
||||||
APAdjustHS0-> setValue ( MaxRollValue ) ;
|
APAdjustHS0-> setValue ( MaxRollValue ) ;
|
||||||
|
@ -468,20 +468,20 @@ void fgAPAdjustInit() {
|
||||||
int slider_value_x = 160;
|
int slider_value_x = 160;
|
||||||
float slider_delta = 0.1f;
|
float slider_delta = 0.1f;
|
||||||
|
|
||||||
TmpMaxRollValue = current_autopilot->get_MaxRoll();
|
TmpMaxRollValue = globals->get_autopilot()->get_MaxRoll();
|
||||||
TmpRollOutValue = current_autopilot->get_RollOut();
|
TmpRollOutValue = globals->get_autopilot()->get_RollOut();
|
||||||
TmpMaxAileronValue = current_autopilot->get_MaxAileron();
|
TmpMaxAileronValue = globals->get_autopilot()->get_MaxAileron();
|
||||||
TmpRollOutSmoothValue = current_autopilot->get_RollOutSmooth();
|
TmpRollOutSmoothValue = globals->get_autopilot()->get_RollOutSmooth();
|
||||||
|
|
||||||
MaxRollAdjust = 2 * current_autopilot->get_MaxRoll();
|
MaxRollAdjust = 2 * globals->get_autopilot()->get_MaxRoll();
|
||||||
RollOutAdjust = 2 * current_autopilot->get_RollOut();
|
RollOutAdjust = 2 * globals->get_autopilot()->get_RollOut();
|
||||||
MaxAileronAdjust = 2 * current_autopilot->get_MaxAileron();
|
MaxAileronAdjust = 2 * globals->get_autopilot()->get_MaxAileron();
|
||||||
RollOutSmoothAdjust = 2 * current_autopilot->get_RollOutSmooth();
|
RollOutSmoothAdjust = 2 * globals->get_autopilot()->get_RollOutSmooth();
|
||||||
|
|
||||||
MaxRollValue = current_autopilot->get_MaxRoll() / MaxRollAdjust;
|
MaxRollValue = globals->get_autopilot()->get_MaxRoll() / MaxRollAdjust;
|
||||||
RollOutValue = current_autopilot->get_RollOut() / RollOutAdjust;
|
RollOutValue = globals->get_autopilot()->get_RollOut() / RollOutAdjust;
|
||||||
MaxAileronValue = current_autopilot->get_MaxAileron() / MaxAileronAdjust;
|
MaxAileronValue = globals->get_autopilot()->get_MaxAileron() / MaxAileronAdjust;
|
||||||
RollOutSmoothValue = current_autopilot->get_RollOutSmooth()
|
RollOutSmoothValue = globals->get_autopilot()->get_RollOutSmooth()
|
||||||
/ RollOutSmoothAdjust;
|
/ RollOutSmoothAdjust;
|
||||||
|
|
||||||
puGetDefaultFonts ( &APAdjustLegendFont, &APAdjustLabelFont );
|
puGetDefaultFonts ( &APAdjustLegendFont, &APAdjustLabelFont );
|
||||||
|
@ -508,7 +508,7 @@ void fgAPAdjustInit() {
|
||||||
APAdjustHS0-> setCBMode ( PUSLIDER_DELTA ) ;
|
APAdjustHS0-> setCBMode ( PUSLIDER_DELTA ) ;
|
||||||
APAdjustHS0-> setCallback ( maxroll_adj ) ;
|
APAdjustHS0-> setCallback ( maxroll_adj ) ;
|
||||||
|
|
||||||
sprintf( SliderText[ 0 ], "%05.2f", current_autopilot->get_MaxRoll() );
|
sprintf( SliderText[ 0 ], "%05.2f", globals->get_autopilot()->get_MaxRoll() );
|
||||||
APAdjustMaxRollTitle = new puText ( slider_title_x, slider_y ) ;
|
APAdjustMaxRollTitle = new puText ( slider_title_x, slider_y ) ;
|
||||||
APAdjustMaxRollTitle-> setDefaultValue ( "MaxRoll" ) ;
|
APAdjustMaxRollTitle-> setDefaultValue ( "MaxRoll" ) ;
|
||||||
APAdjustMaxRollTitle-> getDefaultValue ( &s ) ;
|
APAdjustMaxRollTitle-> getDefaultValue ( &s ) ;
|
||||||
|
@ -525,7 +525,7 @@ void fgAPAdjustInit() {
|
||||||
APAdjustHS1-> setCBMode ( PUSLIDER_DELTA ) ;
|
APAdjustHS1-> setCBMode ( PUSLIDER_DELTA ) ;
|
||||||
APAdjustHS1-> setCallback ( rollout_adj ) ;
|
APAdjustHS1-> setCallback ( rollout_adj ) ;
|
||||||
|
|
||||||
sprintf( SliderText[ 1 ], "%05.2f", current_autopilot->get_RollOut() );
|
sprintf( SliderText[ 1 ], "%05.2f", globals->get_autopilot()->get_RollOut() );
|
||||||
APAdjustRollOutTitle = new puText ( slider_title_x, slider_y ) ;
|
APAdjustRollOutTitle = new puText ( slider_title_x, slider_y ) ;
|
||||||
APAdjustRollOutTitle-> setDefaultValue ( "AdjustRollOut" ) ;
|
APAdjustRollOutTitle-> setDefaultValue ( "AdjustRollOut" ) ;
|
||||||
APAdjustRollOutTitle-> getDefaultValue ( &s ) ;
|
APAdjustRollOutTitle-> getDefaultValue ( &s ) ;
|
||||||
|
@ -543,7 +543,7 @@ void fgAPAdjustInit() {
|
||||||
APAdjustHS2-> setCallback ( rolloutsmooth_adj ) ;
|
APAdjustHS2-> setCallback ( rolloutsmooth_adj ) ;
|
||||||
|
|
||||||
sprintf( SliderText[ 2 ], "%5.2f",
|
sprintf( SliderText[ 2 ], "%5.2f",
|
||||||
current_autopilot->get_RollOutSmooth() );
|
globals->get_autopilot()->get_RollOutSmooth() );
|
||||||
APAdjustRollOutSmoothTitle = new puText ( slider_title_x, slider_y ) ;
|
APAdjustRollOutSmoothTitle = new puText ( slider_title_x, slider_y ) ;
|
||||||
APAdjustRollOutSmoothTitle-> setDefaultValue ( "RollOutSmooth" ) ;
|
APAdjustRollOutSmoothTitle-> setDefaultValue ( "RollOutSmooth" ) ;
|
||||||
APAdjustRollOutSmoothTitle-> getDefaultValue ( &s ) ;
|
APAdjustRollOutSmoothTitle-> getDefaultValue ( &s ) ;
|
||||||
|
@ -561,7 +561,7 @@ void fgAPAdjustInit() {
|
||||||
APAdjustHS3-> setCallback ( maxaileron_adj ) ;
|
APAdjustHS3-> setCallback ( maxaileron_adj ) ;
|
||||||
|
|
||||||
sprintf( SliderText[ 3 ], "%05.2f",
|
sprintf( SliderText[ 3 ], "%05.2f",
|
||||||
current_autopilot->get_MaxAileron() );
|
globals->get_autopilot()->get_MaxAileron() );
|
||||||
APAdjustMaxAileronTitle = new puText ( slider_title_x, slider_y ) ;
|
APAdjustMaxAileronTitle = new puText ( slider_title_x, slider_y ) ;
|
||||||
APAdjustMaxAileronTitle-> setDefaultValue ( "MaxAileron" ) ;
|
APAdjustMaxAileronTitle-> setDefaultValue ( "MaxAileron" ) ;
|
||||||
APAdjustMaxAileronTitle-> getDefaultValue ( &s ) ;
|
APAdjustMaxAileronTitle-> getDefaultValue ( &s ) ;
|
||||||
|
@ -636,8 +636,8 @@ void TgtAptDialog_OK (puObject *)
|
||||||
globals->get_route()->add_waypoint( wp );
|
globals->get_route()->add_waypoint( wp );
|
||||||
|
|
||||||
/* and turn on the autopilot */
|
/* and turn on the autopilot */
|
||||||
current_autopilot->set_HeadingEnabled( true );
|
globals->get_autopilot()->set_HeadingEnabled( true );
|
||||||
current_autopilot->set_HeadingMode( FGAutopilot::FG_HEADING_WAYPOINT );
|
globals->get_autopilot()->set_HeadingMode( FGAutopilot::FG_HEADING_WAYPOINT );
|
||||||
|
|
||||||
} else if ( current_fixlist->query( TgtAptId, 0.0, 0.0, 0.0,
|
} else if ( current_fixlist->query( TgtAptId, 0.0, 0.0, 0.0,
|
||||||
&f, &t1, &t2 ) )
|
&f, &t1, &t2 ) )
|
||||||
|
@ -652,8 +652,8 @@ void TgtAptDialog_OK (puObject *)
|
||||||
globals->get_route()->add_waypoint( wp );
|
globals->get_route()->add_waypoint( wp );
|
||||||
|
|
||||||
/* and turn on the autopilot */
|
/* and turn on the autopilot */
|
||||||
current_autopilot->set_HeadingEnabled( true );
|
globals->get_autopilot()->set_HeadingEnabled( true );
|
||||||
current_autopilot->set_HeadingMode( FGAutopilot::FG_HEADING_WAYPOINT );
|
globals->get_autopilot()->set_HeadingMode( FGAutopilot::FG_HEADING_WAYPOINT );
|
||||||
} else {
|
} else {
|
||||||
TgtAptId += " not in database.";
|
TgtAptId += " not in database.";
|
||||||
mkDialog(TgtAptId.c_str());
|
mkDialog(TgtAptId.c_str());
|
||||||
|
@ -755,13 +755,13 @@ void PopWayPoint(puObject *cb)
|
||||||
// see if there are more waypoints on the list
|
// see if there are more waypoints on the list
|
||||||
if ( globals->get_route()->size() ) {
|
if ( globals->get_route()->size() ) {
|
||||||
// more waypoints
|
// more waypoints
|
||||||
current_autopilot->set_HeadingMode( FGAutopilot::FG_HEADING_WAYPOINT );
|
globals->get_autopilot()->set_HeadingMode( FGAutopilot::FG_HEADING_WAYPOINT );
|
||||||
} else {
|
} else {
|
||||||
// end of the line
|
// end of the line
|
||||||
current_autopilot->set_HeadingMode( FGAutopilot::FG_TC_HEADING_LOCK );
|
globals->get_autopilot()->set_HeadingMode( FGAutopilot::FG_TC_HEADING_LOCK );
|
||||||
|
|
||||||
// use current heading
|
// use current heading
|
||||||
current_autopilot
|
globals->get_autopilot()
|
||||||
->set_TargetHeading(fgGetDouble("/orientation/heading-deg"));
|
->set_TargetHeading(fgGetDouble("/orientation/heading-deg"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,9 +45,6 @@
|
||||||
#include "newauto.hxx"
|
#include "newauto.hxx"
|
||||||
|
|
||||||
|
|
||||||
FGAutopilot *current_autopilot;
|
|
||||||
|
|
||||||
|
|
||||||
/// These statics will eventually go into the class
|
/// These statics will eventually go into the class
|
||||||
/// they are just here while I am experimenting -- NHV :-)
|
/// they are just here while I am experimenting -- NHV :-)
|
||||||
// AutoPilot Gain Adjuster members
|
// AutoPilot Gain Adjuster members
|
||||||
|
@ -148,12 +145,6 @@ void FGAutopilot::MakeTargetWPStr( double distance ) {
|
||||||
sprintf( TargetWP1Str, "%s %.2f NM ETA %d:%02d",
|
sprintf( TargetWP1Str, "%s %.2f NM ETA %d:%02d",
|
||||||
wp1.get_id().c_str(),
|
wp1.get_id().c_str(),
|
||||||
accum*SG_METER_TO_NM, major, minor );
|
accum*SG_METER_TO_NM, major, minor );
|
||||||
// cout << "distance = " << distance*SG_METER_TO_NM
|
|
||||||
// << " gndsp = " << get_ground_speed()
|
|
||||||
// << " time = " << eta
|
|
||||||
// << " major = " << major
|
|
||||||
// << " minor = " << minor
|
|
||||||
// << endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// next route
|
// next route
|
||||||
|
@ -208,45 +199,11 @@ void FGAutopilot::update_old_control_values() {
|
||||||
|
|
||||||
|
|
||||||
// Initialize autopilot subsystem
|
// Initialize autopilot subsystem
|
||||||
void FGAutopilot::init() {
|
|
||||||
|
void FGAutopilot::init ()
|
||||||
|
{
|
||||||
SG_LOG( SG_AUTOPILOT, SG_INFO, "Init AutoPilot Subsystem" );
|
SG_LOG( SG_AUTOPILOT, SG_INFO, "Init AutoPilot Subsystem" );
|
||||||
|
|
||||||
// Autopilot control property static get/set bindings
|
|
||||||
fgTie("/autopilot/locks/altitude", getAPAltitudeLock, setAPAltitudeLock);
|
|
||||||
fgSetArchivable("/autopilot/locks/altitude");
|
|
||||||
fgTie("/autopilot/settings/altitude-ft", getAPAltitude, setAPAltitude);
|
|
||||||
fgSetArchivable("/autopilot/settings/altitude-ft");
|
|
||||||
fgTie("/autopilot/locks/glide-slope", getAPGSLock, setAPGSLock);
|
|
||||||
fgSetDouble("/autopilot/settings/altitude-ft", 3000.0f);
|
|
||||||
fgSetArchivable("/autopilot/locks/glide-slope");
|
|
||||||
fgTie("/autopilot/locks/terrain", getAPTerrainLock, setAPTerrainLock);
|
|
||||||
fgSetArchivable("/autopilot/locks/terrain");
|
|
||||||
fgTie("/autopilot/settings/climb-rate-fpm", getAPClimb, setAPClimb, false);
|
|
||||||
fgSetArchivable("/autopilot/settings/climb-rate-fpm");
|
|
||||||
fgTie("/autopilot/locks/heading", getAPHeadingLock, setAPHeadingLock);
|
|
||||||
fgSetArchivable("/autopilot/locks/heading");
|
|
||||||
fgTie("/autopilot/settings/heading-bug-deg",
|
|
||||||
getAPHeadingBug, setAPHeadingBug);
|
|
||||||
fgSetArchivable("/autopilot/settings/heading-bug-deg");
|
|
||||||
fgSetDouble("/autopilot/settings/heading-bug-deg", 0.0f);
|
|
||||||
fgTie("/autopilot/locks/wing-leveler", getAPWingLeveler, setAPWingLeveler);
|
|
||||||
fgSetArchivable("/autopilot/locks/wing-leveler");
|
|
||||||
fgTie("/autopilot/locks/nav[0]", getAPNAV1Lock, setAPNAV1Lock);
|
|
||||||
fgSetArchivable("/autopilot/locks/nav[0]");
|
|
||||||
fgTie("/autopilot/locks/auto-throttle",
|
|
||||||
getAPAutoThrottleLock, setAPAutoThrottleLock);
|
|
||||||
fgSetArchivable("/autopilot/locks/auto-throttle");
|
|
||||||
fgTie("/autopilot/control-overrides/rudder",
|
|
||||||
getAPRudderControl, setAPRudderControl);
|
|
||||||
fgSetArchivable("/autopilot/control-overrides/rudder");
|
|
||||||
fgTie("/autopilot/control-overrides/elevator",
|
|
||||||
getAPElevatorControl, setAPElevatorControl);
|
|
||||||
fgSetArchivable("/autopilot/control-overrides/elevator");
|
|
||||||
fgTie("/autopilot/control-overrides/throttle",
|
|
||||||
getAPThrottleControl, setAPThrottleControl);
|
|
||||||
fgSetArchivable("/autopilot/control-overrides/throttle");
|
|
||||||
|
|
||||||
|
|
||||||
// bind data input property nodes...
|
// bind data input property nodes...
|
||||||
latitude_node = fgGetNode("/position/latitude-deg", true);
|
latitude_node = fgGetNode("/position/latitude-deg", true);
|
||||||
longitude_node = fgGetNode("/position/longitude-deg", true);
|
longitude_node = fgGetNode("/position/longitude-deg", true);
|
||||||
|
@ -341,9 +298,63 @@ void FGAutopilot::init() {
|
||||||
#endif // !defined( USING_SLIDER_CLASS )
|
#endif // !defined( USING_SLIDER_CLASS )
|
||||||
|
|
||||||
update_old_control_values();
|
update_old_control_values();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
FGAutopilot::bind ()
|
||||||
|
{
|
||||||
|
// Autopilot control property get/set bindings
|
||||||
|
fgTie("/autopilot/locks/altitude", this,
|
||||||
|
&FGAutopilot::getAPAltitudeLock, &FGAutopilot::setAPAltitudeLock);
|
||||||
|
fgSetArchivable("/autopilot/locks/altitude");
|
||||||
|
fgTie("/autopilot/settings/altitude-ft", this,
|
||||||
|
&FGAutopilot::getAPAltitude, &FGAutopilot::setAPAltitude);
|
||||||
|
fgSetArchivable("/autopilot/settings/altitude-ft");
|
||||||
|
fgTie("/autopilot/locks/glide-slope", this,
|
||||||
|
&FGAutopilot::getAPGSLock, &FGAutopilot::setAPGSLock);
|
||||||
|
fgSetArchivable("/autopilot/locks/glide-slope");
|
||||||
|
fgSetDouble("/autopilot/settings/altitude-ft", 3000.0f);
|
||||||
|
fgTie("/autopilot/locks/terrain", this,
|
||||||
|
&FGAutopilot::getAPTerrainLock, &FGAutopilot::setAPTerrainLock);
|
||||||
|
fgSetArchivable("/autopilot/locks/terrain");
|
||||||
|
fgTie("/autopilot/settings/climb-rate-fpm", this,
|
||||||
|
&FGAutopilot::getAPClimb, &FGAutopilot::setAPClimb, false);
|
||||||
|
fgSetArchivable("/autopilot/settings/climb-rate-fpm");
|
||||||
|
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/locks/wing-leveler", this,
|
||||||
|
&FGAutopilot::getAPWingLeveler, &FGAutopilot::setAPWingLeveler);
|
||||||
|
fgSetArchivable("/autopilot/locks/wing-leveler");
|
||||||
|
fgTie("/autopilot/locks/nav[0]", this,
|
||||||
|
&FGAutopilot::getAPNAV1Lock, &FGAutopilot::setAPNAV1Lock);
|
||||||
|
fgSetArchivable("/autopilot/locks/nav[0]");
|
||||||
|
fgTie("/autopilot/locks/auto-throttle", this,
|
||||||
|
&FGAutopilot::getAPAutoThrottleLock,
|
||||||
|
&FGAutopilot::setAPAutoThrottleLock);
|
||||||
|
fgSetArchivable("/autopilot/locks/auto-throttle");
|
||||||
|
fgTie("/autopilot/control-overrides/rudder", this,
|
||||||
|
&FGAutopilot::getAPRudderControl,
|
||||||
|
&FGAutopilot::setAPRudderControl);
|
||||||
|
fgSetArchivable("/autopilot/control-overrides/rudder");
|
||||||
|
fgTie("/autopilot/control-overrides/elevator", this,
|
||||||
|
&FGAutopilot::getAPElevatorControl,
|
||||||
|
&FGAutopilot::setAPElevatorControl);
|
||||||
|
fgSetArchivable("/autopilot/control-overrides/elevator");
|
||||||
|
fgTie("/autopilot/control-overrides/throttle", this,
|
||||||
|
&FGAutopilot::getAPThrottleControl,
|
||||||
|
&FGAutopilot::setAPThrottleControl);
|
||||||
|
fgSetArchivable("/autopilot/control-overrides/throttle");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
FGAutopilot::unbind ()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
// Reset the autopilot system
|
// Reset the autopilot system
|
||||||
void FGAutopilot::reset() {
|
void FGAutopilot::reset() {
|
||||||
|
@ -406,7 +417,9 @@ static double LinearExtrapolate( double x, double x1, double y1, double x2, doub
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
int FGAutopilot::run() {
|
void
|
||||||
|
FGAutopilot::update (int dt)
|
||||||
|
{
|
||||||
// Remove the following lines when the calling funcitons start
|
// Remove the following lines when the calling funcitons start
|
||||||
// passing in the data pointer
|
// passing in the data pointer
|
||||||
|
|
||||||
|
@ -447,9 +460,6 @@ int FGAutopilot::run() {
|
||||||
// heading hold
|
// heading hold
|
||||||
if ( heading_hold == true ) {
|
if ( heading_hold == true ) {
|
||||||
if ( heading_mode == FG_DG_HEADING_LOCK ) {
|
if ( heading_mode == FG_DG_HEADING_LOCK ) {
|
||||||
// cout << "DG heading = " << FGSteam::get_DG_deg()
|
|
||||||
// << " DG error = " << FGSteam::get_DG_err() << endl;
|
|
||||||
|
|
||||||
TargetHeading = DGTargetHeading + FGSteam::get_DG_err();
|
TargetHeading = DGTargetHeading + FGSteam::get_DG_err();
|
||||||
while ( TargetHeading < 0.0 ) { TargetHeading += 360.0; }
|
while ( TargetHeading < 0.0 ) { TargetHeading += 360.0; }
|
||||||
while ( TargetHeading > 360.0 ) { TargetHeading -= 360.0; }
|
while ( TargetHeading > 360.0 ) { TargetHeading -= 360.0; }
|
||||||
|
@ -503,7 +513,6 @@ int FGAutopilot::run() {
|
||||||
while ( TargetHeading > 360.0 ) { TargetHeading -= 360.0; }
|
while ( TargetHeading > 360.0 ) { TargetHeading -= 360.0; }
|
||||||
|
|
||||||
MakeTargetHeadingStr( TargetHeading );
|
MakeTargetHeadingStr( TargetHeading );
|
||||||
// cout << "target course (true) = " << TargetHeading << endl;
|
|
||||||
} else if ( heading_mode == FG_HEADING_WAYPOINT ) {
|
} else if ( heading_mode == FG_HEADING_WAYPOINT ) {
|
||||||
// update target heading to waypoint
|
// update target heading to waypoint
|
||||||
|
|
||||||
|
@ -542,9 +551,6 @@ int FGAutopilot::run() {
|
||||||
// corrected_course = course - wp_course;
|
// corrected_course = course - wp_course;
|
||||||
TargetHeading = NormalizeDegrees(wp_course);
|
TargetHeading = NormalizeDegrees(wp_course);
|
||||||
} else {
|
} else {
|
||||||
cout << "Reached waypoint within " << wp_distance << "meters"
|
|
||||||
<< endl;
|
|
||||||
|
|
||||||
// pop off this waypoint from the list
|
// pop off this waypoint from the list
|
||||||
if ( globals->get_route()->size() ) {
|
if ( globals->get_route()->size() ) {
|
||||||
globals->get_route()->delete_first();
|
globals->get_route()->delete_first();
|
||||||
|
@ -570,7 +576,6 @@ int FGAutopilot::run() {
|
||||||
if ( heading_mode == FG_TC_HEADING_LOCK ) {
|
if ( heading_mode == FG_TC_HEADING_LOCK ) {
|
||||||
// drive the turn coordinator to zero
|
// drive the turn coordinator to zero
|
||||||
double turn = FGSteam::get_TC_std();
|
double turn = FGSteam::get_TC_std();
|
||||||
// cout << "turn rate = " << turn << endl;
|
|
||||||
double AileronSet = -turn / 2.0;
|
double AileronSet = -turn / 2.0;
|
||||||
SG_CLAMP_RANGE( AileronSet, -1.0, 1.0 );
|
SG_CLAMP_RANGE( AileronSet, -1.0, 1.0 );
|
||||||
globals->get_controls()->set_aileron( AileronSet );
|
globals->get_controls()->set_aileron( AileronSet );
|
||||||
|
@ -660,25 +665,18 @@ int FGAutopilot::run() {
|
||||||
double y = (altitude_node->getDoubleValue()
|
double y = (altitude_node->getDoubleValue()
|
||||||
- current_radiostack->get_nav1_elev()) * SG_FEET_TO_METER;
|
- current_radiostack->get_nav1_elev()) * SG_FEET_TO_METER;
|
||||||
double current_angle = atan2( y, x ) * SGD_RADIANS_TO_DEGREES;
|
double current_angle = atan2( y, x ) * SGD_RADIANS_TO_DEGREES;
|
||||||
// cout << "current angle = " << current_angle << endl;
|
|
||||||
|
|
||||||
double target_angle = current_radiostack->get_nav1_target_gs();
|
double target_angle = current_radiostack->get_nav1_target_gs();
|
||||||
// cout << "target angle = " << target_angle << endl;
|
|
||||||
|
|
||||||
double gs_diff = target_angle - current_angle;
|
double gs_diff = target_angle - current_angle;
|
||||||
// cout << "difference from desired = " << gs_diff << endl;
|
|
||||||
|
|
||||||
// convert desired vertical path angle into a climb rate
|
// convert desired vertical path angle into a climb rate
|
||||||
double des_angle = current_angle - 10 * gs_diff;
|
double des_angle = current_angle - 10 * gs_diff;
|
||||||
// cout << "desired angle = " << des_angle << endl;
|
|
||||||
|
|
||||||
// convert to meter/min
|
// convert to meter/min
|
||||||
// cout << "raw ground speed = " << cur_fdm_state->get_V_ground_speed() << endl;
|
|
||||||
double horiz_vel = cur_fdm_state->get_V_ground_speed()
|
double horiz_vel = cur_fdm_state->get_V_ground_speed()
|
||||||
* SG_FEET_TO_METER * 60.0;
|
* SG_FEET_TO_METER * 60.0;
|
||||||
// cout << "Horizontal vel = " << horiz_vel << endl;
|
|
||||||
climb_rate = -sin( des_angle * SGD_DEGREES_TO_RADIANS ) * horiz_vel;
|
climb_rate = -sin( des_angle * SGD_DEGREES_TO_RADIANS ) * horiz_vel;
|
||||||
// cout << "climb_rate = " << climb_rate << endl;
|
|
||||||
/* climb_error_accum += gs_diff * 2.0; */
|
/* climb_error_accum += gs_diff * 2.0; */
|
||||||
/* climb_rate = gs_diff * 200.0 + climb_error_accum; */
|
/* climb_rate = gs_diff * 200.0 + climb_error_accum; */
|
||||||
} else if ( altitude_mode == FG_ALTITUDE_TERRAIN ) {
|
} else if ( altitude_mode == FG_ALTITUDE_TERRAIN ) {
|
||||||
|
@ -686,10 +684,6 @@ int FGAutopilot::run() {
|
||||||
climb_rate =
|
climb_rate =
|
||||||
( TargetAGL - altitude_agl_node->getDoubleValue()
|
( TargetAGL - altitude_agl_node->getDoubleValue()
|
||||||
* SG_FEET_TO_METER ) * 16.0;
|
* SG_FEET_TO_METER ) * 16.0;
|
||||||
// cout << "target agl = " << TargetAGL
|
|
||||||
// << " current agl = " << fgAPget_agl()
|
|
||||||
// << " target climb rate = " << climb_rate
|
|
||||||
// << endl;
|
|
||||||
} else {
|
} else {
|
||||||
// just try to zero out rate of climb ...
|
// just try to zero out rate of climb ...
|
||||||
climb_rate = 0.0;
|
climb_rate = 0.0;
|
||||||
|
@ -729,13 +723,6 @@ int FGAutopilot::run() {
|
||||||
= -fabs(TargetDescentRate->getFloatValue() * SG_FEET_TO_METER);
|
= -fabs(TargetDescentRate->getFloatValue() * SG_FEET_TO_METER);
|
||||||
}
|
}
|
||||||
|
|
||||||
// cout << "Target climb rate = " << TargetClimbRate->getFloatValue() << endl;
|
|
||||||
// cout << "given our speed, modified desired climb rate = "
|
|
||||||
// << climb_rate * SG_METER_TO_FEET
|
|
||||||
// << " fpm" << endl;
|
|
||||||
// cout << "Current climb rate = "
|
|
||||||
// << vertical_speed_node->getDoubleValue() * 60 << " fpm" << endl;
|
|
||||||
|
|
||||||
error = vertical_speed_node->getDoubleValue() * 60
|
error = vertical_speed_node->getDoubleValue() * 60
|
||||||
- climb_rate * SG_METER_TO_FEET;
|
- climb_rate * SG_METER_TO_FEET;
|
||||||
|
|
||||||
|
@ -752,11 +739,6 @@ int FGAutopilot::run() {
|
||||||
prop_error = error;
|
prop_error = error;
|
||||||
prop_adj = prop_error / elevator_adj_factor->getDoubleValue();
|
prop_adj = prop_error / elevator_adj_factor->getDoubleValue();
|
||||||
|
|
||||||
// cout << "Error=" << error << endl;
|
|
||||||
// cout << "integral_error=" << int_error << endl;
|
|
||||||
// cout << "integral_contrib=" << integral_contrib->getFloatValue() << endl;
|
|
||||||
// cout << "Proportional Adj=" << prop_adj << endl;
|
|
||||||
// cout << "Integral Adj" << int_adj << endl;
|
|
||||||
total_adj = ((double) 1.0 - (double) integral_contrib->getFloatValue()) * prop_adj
|
total_adj = ((double) 1.0 - (double) integral_contrib->getFloatValue()) * prop_adj
|
||||||
+ (double) integral_contrib->getFloatValue() * int_adj;
|
+ (double) integral_contrib->getFloatValue() * int_adj;
|
||||||
|
|
||||||
|
@ -772,8 +754,6 @@ int FGAutopilot::run() {
|
||||||
/ (1 - zero_pitch_throttle->getFloatValue()))
|
/ (1 - zero_pitch_throttle->getFloatValue()))
|
||||||
* zero_pitch_trim_full_throttle->getFloatValue();
|
* zero_pitch_trim_full_throttle->getFloatValue();
|
||||||
|
|
||||||
// cout << "Total Adj" << total_adj << endl;
|
|
||||||
|
|
||||||
globals->get_controls()->set_elevator_trim( total_adj );
|
globals->get_controls()->set_elevator_trim( total_adj );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -857,8 +837,6 @@ int FGAutopilot::run() {
|
||||||
|
|
||||||
// Ok, we are done
|
// Ok, we are done
|
||||||
SG_LOG( SG_ALL, SG_DEBUG, "FGAutopilot::run( returns )" );
|
SG_LOG( SG_ALL, SG_DEBUG, "FGAutopilot::run( returns )" );
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -950,60 +928,9 @@ void FGAutopilot::set_AltitudeMode( fgAutoAltitudeMode mode ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
static inline double get_aoa( void ) {
|
|
||||||
return( cur_fdm_state->get_Gamma_vert_rad() * SGD_RADIANS_TO_DEGREES );
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline double fgAPget_latitude( void ) {
|
|
||||||
return( cur_fdm_state->get_Latitude() * SGD_RADIANS_TO_DEGREES );
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline double fgAPget_longitude( void ) {
|
|
||||||
return( cur_fdm_state->get_Longitude() * SGD_RADIANS_TO_DEGREES );
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline double fgAPget_roll( void ) {
|
|
||||||
return( cur_fdm_state->get_Phi() * SGD_RADIANS_TO_DEGREES );
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline double get_pitch( void ) {
|
|
||||||
return( cur_fdm_state->get_Theta() );
|
|
||||||
}
|
|
||||||
|
|
||||||
double fgAPget_heading( void ) {
|
|
||||||
return( cur_fdm_state->get_Psi() * SGD_RADIANS_TO_DEGREES );
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline double fgAPget_altitude( void ) {
|
|
||||||
return( cur_fdm_state->get_Altitude() * SG_FEET_TO_METER );
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline double fgAPget_climb( void ) {
|
|
||||||
// return in meters per minute
|
|
||||||
return( cur_fdm_state->get_Climb_Rate() * SG_FEET_TO_METER * 60 );
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline double get_sideslip( void ) {
|
|
||||||
return( cur_fdm_state->get_Beta() );
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline double fgAPget_agl( void ) {
|
|
||||||
double agl;
|
|
||||||
|
|
||||||
agl = cur_fdm_state->get_Altitude() * SG_FEET_TO_METER
|
|
||||||
- scenery.get_cur_elev();
|
|
||||||
|
|
||||||
return( agl );
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
void FGAutopilot::AltitudeSet( double new_altitude ) {
|
void FGAutopilot::AltitudeSet( double new_altitude ) {
|
||||||
double target_alt = new_altitude;
|
double target_alt = new_altitude;
|
||||||
|
|
||||||
// cout << "new altitude = " << new_altitude << endl;
|
|
||||||
|
|
||||||
if ( fgGetString("/sim/startup/units") == "feet" ) {
|
if ( fgGetString("/sim/startup/units") == "feet" ) {
|
||||||
target_alt = new_altitude * SG_FEET_TO_METER;
|
target_alt = new_altitude * SG_FEET_TO_METER;
|
||||||
}
|
}
|
||||||
|
@ -1015,8 +942,6 @@ void FGAutopilot::AltitudeSet( double new_altitude ) {
|
||||||
TargetAltitude = target_alt;
|
TargetAltitude = target_alt;
|
||||||
altitude_mode = FG_ALTITUDE_LOCK;
|
altitude_mode = FG_ALTITUDE_LOCK;
|
||||||
|
|
||||||
// cout << "TargetAltitude = " << TargetAltitude << endl;
|
|
||||||
|
|
||||||
if ( fgGetString("/sim/startup/units") == "feet" ) {
|
if ( fgGetString("/sim/startup/units") == "feet" ) {
|
||||||
target_alt *= SG_METER_TO_FEET;
|
target_alt *= SG_METER_TO_FEET;
|
||||||
}
|
}
|
||||||
|
@ -1039,10 +964,6 @@ void FGAutopilot::AltitudeAdjust( double inc )
|
||||||
target_agl = TargetAGL;
|
target_agl = TargetAGL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// cout << "target_agl = " << target_agl << endl;
|
|
||||||
// cout << "target_agl / inc = " << target_agl / inc << endl;
|
|
||||||
// cout << "(int)(target_agl / inc) = " << (int)(target_agl / inc) << endl;
|
|
||||||
|
|
||||||
if ( fabs((int)(target_alt / inc) * inc - target_alt) < SG_EPSILON ) {
|
if ( fabs((int)(target_alt / inc) * inc - target_alt) < SG_EPSILON ) {
|
||||||
target_alt += inc;
|
target_alt += inc;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1133,3 +1054,311 @@ void FGAutopilot::set_AutoThrottleEnabled( bool value ) {
|
||||||
SG_LOG( SG_COCKPIT, SG_INFO, " fgAPSetAutoThrottle: ("
|
SG_LOG( SG_COCKPIT, SG_INFO, " fgAPSetAutoThrottle: ("
|
||||||
<< auto_throttle << ") " << TargetSpeed );
|
<< auto_throttle << ") " << TargetSpeed );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
// Kludged methods for tying to properties.
|
||||||
|
//
|
||||||
|
// These should change eventually; they all used to be static
|
||||||
|
// functions.
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the autopilot altitude lock (true=on).
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
FGAutopilot::getAPAltitudeLock () const
|
||||||
|
{
|
||||||
|
return (get_AltitudeEnabled() &&
|
||||||
|
get_AltitudeMode()
|
||||||
|
== FGAutopilot::FG_ALTITUDE_LOCK);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the autopilot altitude lock (true=on).
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
FGAutopilot::setAPAltitudeLock (bool lock)
|
||||||
|
{
|
||||||
|
if (lock)
|
||||||
|
set_AltitudeMode(FGAutopilot::FG_ALTITUDE_LOCK);
|
||||||
|
if (get_AltitudeMode() == FGAutopilot::FG_ALTITUDE_LOCK)
|
||||||
|
set_AltitudeEnabled(lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the autopilot target altitude in feet.
|
||||||
|
*/
|
||||||
|
double
|
||||||
|
FGAutopilot::getAPAltitude () const
|
||||||
|
{
|
||||||
|
return get_TargetAltitude() * SG_METER_TO_FEET;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the autopilot target altitude in feet.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
FGAutopilot::setAPAltitude (double altitude)
|
||||||
|
{
|
||||||
|
set_TargetAltitude( altitude * SG_FEET_TO_METER );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the autopilot altitude lock (true=on).
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
FGAutopilot::getAPGSLock () const
|
||||||
|
{
|
||||||
|
return (get_AltitudeEnabled() &&
|
||||||
|
(get_AltitudeMode()
|
||||||
|
== FGAutopilot::FG_ALTITUDE_GS1));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the autopilot altitude lock (true=on).
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
FGAutopilot::setAPGSLock (bool lock)
|
||||||
|
{
|
||||||
|
if (lock)
|
||||||
|
set_AltitudeMode(FGAutopilot::FG_ALTITUDE_GS1);
|
||||||
|
if (get_AltitudeMode() == FGAutopilot::FG_ALTITUDE_GS1)
|
||||||
|
set_AltitudeEnabled(lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the autopilot terrain lock (true=on).
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
FGAutopilot::getAPTerrainLock () const
|
||||||
|
{
|
||||||
|
return (get_AltitudeEnabled() &&
|
||||||
|
(get_AltitudeMode()
|
||||||
|
== FGAutopilot::FG_ALTITUDE_TERRAIN));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the autopilot terrain lock (true=on).
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
FGAutopilot::setAPTerrainLock (bool lock)
|
||||||
|
{
|
||||||
|
if (lock) {
|
||||||
|
set_AltitudeMode(FGAutopilot::FG_ALTITUDE_TERRAIN);
|
||||||
|
set_TargetAGL(fgGetFloat("/position/altitude-agl-ft") *
|
||||||
|
SG_FEET_TO_METER);
|
||||||
|
}
|
||||||
|
if (get_AltitudeMode() == FGAutopilot::FG_ALTITUDE_TERRAIN)
|
||||||
|
set_AltitudeEnabled(lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the autopilot target altitude in feet.
|
||||||
|
*/
|
||||||
|
double
|
||||||
|
FGAutopilot::getAPClimb () const
|
||||||
|
{
|
||||||
|
return get_TargetClimbRate() * SG_METER_TO_FEET;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the autopilot target altitude in feet.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
FGAutopilot::setAPClimb (double rate)
|
||||||
|
{
|
||||||
|
set_TargetClimbRate( rate * SG_FEET_TO_METER );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the autopilot heading lock (true=on).
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
FGAutopilot::getAPHeadingLock () const
|
||||||
|
{
|
||||||
|
return
|
||||||
|
(get_HeadingEnabled() &&
|
||||||
|
get_HeadingMode() == DEFAULT_AP_HEADING_LOCK);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the autopilot heading lock (true=on).
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
FGAutopilot::setAPHeadingLock (bool lock)
|
||||||
|
{
|
||||||
|
if (lock)
|
||||||
|
set_HeadingMode(DEFAULT_AP_HEADING_LOCK);
|
||||||
|
if (get_HeadingMode() == DEFAULT_AP_HEADING_LOCK)
|
||||||
|
set_HeadingEnabled(lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the autopilot heading bug in degrees.
|
||||||
|
*/
|
||||||
|
double
|
||||||
|
FGAutopilot::getAPHeadingBug () const
|
||||||
|
{
|
||||||
|
return get_DGTargetHeading();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the autopilot heading bug in degrees.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
FGAutopilot::setAPHeadingBug (double heading)
|
||||||
|
{
|
||||||
|
set_DGTargetHeading( heading );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the autopilot wing leveler lock (true=on).
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
FGAutopilot::getAPWingLeveler () const
|
||||||
|
{
|
||||||
|
return
|
||||||
|
(get_HeadingEnabled() &&
|
||||||
|
get_HeadingMode() == FGAutopilot::FG_TC_HEADING_LOCK);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the autopilot wing leveler lock (true=on).
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
FGAutopilot::setAPWingLeveler (bool lock)
|
||||||
|
{
|
||||||
|
if (lock)
|
||||||
|
set_HeadingMode(FGAutopilot::FG_TC_HEADING_LOCK);
|
||||||
|
if (get_HeadingMode() == FGAutopilot::FG_TC_HEADING_LOCK)
|
||||||
|
set_HeadingEnabled(lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return true if the autopilot is locked to NAV1.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
FGAutopilot::getAPNAV1Lock () const
|
||||||
|
{
|
||||||
|
return
|
||||||
|
(get_HeadingEnabled() &&
|
||||||
|
get_HeadingMode() == FGAutopilot::FG_HEADING_NAV1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the autopilot NAV1 lock.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
FGAutopilot::setAPNAV1Lock (bool lock)
|
||||||
|
{
|
||||||
|
if (lock)
|
||||||
|
set_HeadingMode(FGAutopilot::FG_HEADING_NAV1);
|
||||||
|
if (get_HeadingMode() == FGAutopilot::FG_HEADING_NAV1)
|
||||||
|
set_HeadingEnabled(lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the autopilot autothrottle lock.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
FGAutopilot::getAPAutoThrottleLock () const
|
||||||
|
{
|
||||||
|
return get_AutoThrottleEnabled();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the autothrottle lock.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
FGAutopilot::setAPAutoThrottleLock (bool lock)
|
||||||
|
{
|
||||||
|
set_AutoThrottleEnabled(lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// kludge
|
||||||
|
double
|
||||||
|
FGAutopilot::getAPRudderControl () const
|
||||||
|
{
|
||||||
|
if (getAPHeadingLock())
|
||||||
|
return get_TargetHeading();
|
||||||
|
else
|
||||||
|
return globals->get_controls()->get_rudder();
|
||||||
|
}
|
||||||
|
|
||||||
|
// kludge
|
||||||
|
void
|
||||||
|
FGAutopilot::setAPRudderControl (double value)
|
||||||
|
{
|
||||||
|
if (getAPHeadingLock()) {
|
||||||
|
SG_LOG(SG_GENERAL, SG_DEBUG, "setAPRudderControl " << value );
|
||||||
|
value -= get_TargetHeading();
|
||||||
|
HeadingAdjust(value < 0.0 ? -1.0 : 1.0);
|
||||||
|
} else {
|
||||||
|
globals->get_controls()->set_rudder(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// kludge
|
||||||
|
double
|
||||||
|
FGAutopilot::getAPElevatorControl () const
|
||||||
|
{
|
||||||
|
if (getAPAltitudeLock())
|
||||||
|
return get_TargetAltitude();
|
||||||
|
else
|
||||||
|
return globals->get_controls()->get_elevator();
|
||||||
|
}
|
||||||
|
|
||||||
|
// kludge
|
||||||
|
void
|
||||||
|
FGAutopilot::setAPElevatorControl (double value)
|
||||||
|
{
|
||||||
|
if (value != 0 && getAPAltitudeLock()) {
|
||||||
|
SG_LOG(SG_GENERAL, SG_DEBUG, "setAPElevatorControl " << value );
|
||||||
|
value -= get_TargetAltitude();
|
||||||
|
AltitudeAdjust(value < 0.0 ? 100.0 : -100.0);
|
||||||
|
} else {
|
||||||
|
globals->get_controls()->set_elevator(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// kludge
|
||||||
|
double
|
||||||
|
FGAutopilot::getAPThrottleControl () const
|
||||||
|
{
|
||||||
|
if (getAPAutoThrottleLock())
|
||||||
|
return 0.0; // always resets
|
||||||
|
else
|
||||||
|
return globals->get_controls()->get_throttle(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// kludge
|
||||||
|
void
|
||||||
|
FGAutopilot::setAPThrottleControl (double value)
|
||||||
|
{
|
||||||
|
if (getAPAutoThrottleLock())
|
||||||
|
AutoThrottleAdjust(value < 0.0 ? -0.01 : 0.01);
|
||||||
|
else
|
||||||
|
globals->get_controls()->set_throttle(FGControls::ALL_ENGINES, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// end of newauto.cxx
|
||||||
|
|
|
@ -30,10 +30,12 @@
|
||||||
#include <simgear/misc/props.hxx>
|
#include <simgear/misc/props.hxx>
|
||||||
#include <simgear/route/waypoint.hxx>
|
#include <simgear/route/waypoint.hxx>
|
||||||
|
|
||||||
|
#include <Main/fgfs.hxx>
|
||||||
#include <Main/fg_props.hxx>
|
#include <Main/fg_props.hxx>
|
||||||
|
|
||||||
// Structures
|
// Structures
|
||||||
class FGAutopilot {
|
class FGAutopilot : public FGSubsystem
|
||||||
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -142,15 +144,19 @@ public:
|
||||||
// destructor
|
// destructor
|
||||||
~FGAutopilot();
|
~FGAutopilot();
|
||||||
|
|
||||||
// Initialize autopilot system
|
|
||||||
void init();
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Implementation of FGSubsystem.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void init ();
|
||||||
|
void bind ();
|
||||||
|
void unbind ();
|
||||||
|
void update (int dt);
|
||||||
|
|
||||||
// Reset the autopilot system
|
// Reset the autopilot system
|
||||||
void reset(void);
|
void reset(void);
|
||||||
|
|
||||||
// run an interation of the autopilot (updates control positions)
|
|
||||||
int run();
|
|
||||||
|
|
||||||
void AltitudeSet( double new_altitude );
|
void AltitudeSet( double new_altitude );
|
||||||
void AltitudeAdjust( double inc );
|
void AltitudeAdjust( double inc );
|
||||||
void HeadingAdjust( double inc );
|
void HeadingAdjust( double inc );
|
||||||
|
@ -227,11 +233,38 @@ public:
|
||||||
inline double get_RollOutSmooth() const { return RollOutSmooth; }
|
inline double get_RollOutSmooth() const { return RollOutSmooth; }
|
||||||
inline void set_RollOutSmooth( double val ) { RollOutSmooth = val; }
|
inline void set_RollOutSmooth( double val ) { RollOutSmooth = val; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
bool getAPAltitudeLock () const;
|
||||||
|
void setAPAltitudeLock (bool lock);
|
||||||
|
double getAPAltitude () const;
|
||||||
|
void setAPAltitude (double altitude);
|
||||||
|
bool getAPGSLock () const;
|
||||||
|
void setAPGSLock (bool lock);
|
||||||
|
bool getAPTerrainLock () const;
|
||||||
|
void setAPTerrainLock (bool lock);
|
||||||
|
double getAPClimb () const;
|
||||||
|
void setAPClimb (double rate);
|
||||||
|
bool getAPHeadingLock () const;
|
||||||
|
void setAPHeadingLock (bool lock);
|
||||||
|
double getAPHeadingBug () const;
|
||||||
|
void setAPHeadingBug (double heading);
|
||||||
|
bool getAPWingLeveler () const;
|
||||||
|
void setAPWingLeveler (bool lock);
|
||||||
|
bool getAPNAV1Lock () const;
|
||||||
|
void setAPNAV1Lock (bool lock);
|
||||||
|
bool getAPAutoThrottleLock () const;
|
||||||
|
void setAPAutoThrottleLock (bool lock);
|
||||||
|
double getAPRudderControl () const;
|
||||||
|
void setAPRudderControl (double value);
|
||||||
|
double getAPElevatorControl () const;
|
||||||
|
void setAPElevatorControl (double value);
|
||||||
|
double getAPThrottleControl () const;
|
||||||
|
void setAPThrottleControl (double value);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
extern FGAutopilot *current_autopilot;
|
|
||||||
|
|
||||||
#define DEFAULT_AP_HEADING_LOCK FGAutopilot::FG_DG_HEADING_LOCK
|
#define DEFAULT_AP_HEADING_LOCK FGAutopilot::FG_DG_HEADING_LOCK
|
||||||
// #define DEFAULT_AP_HEADING_LOCK FGAutopilot::FG_TRUE_HEADING_LOCK
|
// #define DEFAULT_AP_HEADING_LOCK FGAutopilot::FG_TRUE_HEADING_LOCK
|
||||||
|
|
||||||
|
@ -240,304 +273,4 @@ extern FGAutopilot *current_autopilot;
|
||||||
* static functions for autopilot properties
|
* static functions for autopilot properties
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the autopilot altitude lock (true=on).
|
|
||||||
*/
|
|
||||||
static bool
|
|
||||||
getAPAltitudeLock ()
|
|
||||||
{
|
|
||||||
return (current_autopilot->get_AltitudeEnabled() &&
|
|
||||||
current_autopilot->get_AltitudeMode()
|
|
||||||
== FGAutopilot::FG_ALTITUDE_LOCK);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the autopilot altitude lock (true=on).
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
setAPAltitudeLock (bool lock)
|
|
||||||
{
|
|
||||||
if (lock)
|
|
||||||
current_autopilot->set_AltitudeMode(FGAutopilot::FG_ALTITUDE_LOCK);
|
|
||||||
if (current_autopilot->get_AltitudeMode() == FGAutopilot::FG_ALTITUDE_LOCK)
|
|
||||||
current_autopilot->set_AltitudeEnabled(lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the autopilot target altitude in feet.
|
|
||||||
*/
|
|
||||||
static double
|
|
||||||
getAPAltitude ()
|
|
||||||
{
|
|
||||||
return current_autopilot->get_TargetAltitude() * SG_METER_TO_FEET;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the autopilot target altitude in feet.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
setAPAltitude (double altitude)
|
|
||||||
{
|
|
||||||
current_autopilot->set_TargetAltitude( altitude * SG_FEET_TO_METER );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the autopilot altitude lock (true=on).
|
|
||||||
*/
|
|
||||||
static bool
|
|
||||||
getAPGSLock ()
|
|
||||||
{
|
|
||||||
return (current_autopilot->get_AltitudeEnabled() &&
|
|
||||||
(current_autopilot->get_AltitudeMode()
|
|
||||||
== FGAutopilot::FG_ALTITUDE_GS1));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the autopilot altitude lock (true=on).
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
setAPGSLock (bool lock)
|
|
||||||
{
|
|
||||||
if (lock)
|
|
||||||
current_autopilot->set_AltitudeMode(FGAutopilot::FG_ALTITUDE_GS1);
|
|
||||||
if (current_autopilot->get_AltitudeMode() == FGAutopilot::FG_ALTITUDE_GS1)
|
|
||||||
current_autopilot->set_AltitudeEnabled(lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the autopilot terrain lock (true=on).
|
|
||||||
*/
|
|
||||||
static bool
|
|
||||||
getAPTerrainLock ()
|
|
||||||
{
|
|
||||||
return (current_autopilot->get_AltitudeEnabled() &&
|
|
||||||
(current_autopilot->get_AltitudeMode()
|
|
||||||
== FGAutopilot::FG_ALTITUDE_TERRAIN));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the autopilot terrain lock (true=on).
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
setAPTerrainLock (bool lock)
|
|
||||||
{
|
|
||||||
if (lock) {
|
|
||||||
current_autopilot->set_AltitudeMode(FGAutopilot::FG_ALTITUDE_TERRAIN);
|
|
||||||
current_autopilot
|
|
||||||
->set_TargetAGL(fgGetFloat("/position/altitude-agl-ft") *
|
|
||||||
SG_FEET_TO_METER);
|
|
||||||
cout << "Target AGL = "
|
|
||||||
<< fgGetFloat("/position/altitude-agl-ft") * SG_FEET_TO_METER
|
|
||||||
<< endl;
|
|
||||||
}
|
|
||||||
if (current_autopilot->get_AltitudeMode() == FGAutopilot::FG_ALTITUDE_TERRAIN)
|
|
||||||
current_autopilot->set_AltitudeEnabled(lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the autopilot target altitude in feet.
|
|
||||||
*/
|
|
||||||
static double
|
|
||||||
getAPClimb ()
|
|
||||||
{
|
|
||||||
return current_autopilot->get_TargetClimbRate() * SG_METER_TO_FEET;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the autopilot target altitude in feet.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
setAPClimb (double rate)
|
|
||||||
{
|
|
||||||
current_autopilot->set_TargetClimbRate( rate * SG_FEET_TO_METER );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the autopilot heading lock (true=on).
|
|
||||||
*/
|
|
||||||
static bool
|
|
||||||
getAPHeadingLock ()
|
|
||||||
{
|
|
||||||
return
|
|
||||||
(current_autopilot->get_HeadingEnabled() &&
|
|
||||||
current_autopilot->get_HeadingMode() == DEFAULT_AP_HEADING_LOCK);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the autopilot heading lock (true=on).
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
setAPHeadingLock (bool lock)
|
|
||||||
{
|
|
||||||
if (lock)
|
|
||||||
current_autopilot->set_HeadingMode(DEFAULT_AP_HEADING_LOCK);
|
|
||||||
if (current_autopilot->get_HeadingMode() == DEFAULT_AP_HEADING_LOCK)
|
|
||||||
current_autopilot->set_HeadingEnabled(lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the autopilot heading bug in degrees.
|
|
||||||
*/
|
|
||||||
static double
|
|
||||||
getAPHeadingBug ()
|
|
||||||
{
|
|
||||||
return current_autopilot->get_DGTargetHeading();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the autopilot heading bug in degrees.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
setAPHeadingBug (double heading)
|
|
||||||
{
|
|
||||||
current_autopilot->set_DGTargetHeading( heading );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the autopilot wing leveler lock (true=on).
|
|
||||||
*/
|
|
||||||
static bool
|
|
||||||
getAPWingLeveler ()
|
|
||||||
{
|
|
||||||
return
|
|
||||||
(current_autopilot->get_HeadingEnabled() &&
|
|
||||||
current_autopilot->get_HeadingMode() == FGAutopilot::FG_TC_HEADING_LOCK);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the autopilot wing leveler lock (true=on).
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
setAPWingLeveler (bool lock)
|
|
||||||
{
|
|
||||||
if (lock)
|
|
||||||
current_autopilot->set_HeadingMode(FGAutopilot::FG_TC_HEADING_LOCK);
|
|
||||||
if (current_autopilot->get_HeadingMode() == FGAutopilot::FG_TC_HEADING_LOCK)
|
|
||||||
current_autopilot->set_HeadingEnabled(lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return true if the autopilot is locked to NAV1.
|
|
||||||
*/
|
|
||||||
static bool
|
|
||||||
getAPNAV1Lock ()
|
|
||||||
{
|
|
||||||
return
|
|
||||||
(current_autopilot->get_HeadingEnabled() &&
|
|
||||||
current_autopilot->get_HeadingMode() == FGAutopilot::FG_HEADING_NAV1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the autopilot NAV1 lock.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
setAPNAV1Lock (bool lock)
|
|
||||||
{
|
|
||||||
if (lock)
|
|
||||||
current_autopilot->set_HeadingMode(FGAutopilot::FG_HEADING_NAV1);
|
|
||||||
if (current_autopilot->get_HeadingMode() == FGAutopilot::FG_HEADING_NAV1)
|
|
||||||
current_autopilot->set_HeadingEnabled(lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the autopilot autothrottle lock.
|
|
||||||
*/
|
|
||||||
static bool
|
|
||||||
getAPAutoThrottleLock ()
|
|
||||||
{
|
|
||||||
return current_autopilot->get_AutoThrottleEnabled();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the autothrottle lock.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
setAPAutoThrottleLock (bool lock)
|
|
||||||
{
|
|
||||||
current_autopilot->set_AutoThrottleEnabled(lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// kludge
|
|
||||||
static double
|
|
||||||
getAPRudderControl ()
|
|
||||||
{
|
|
||||||
if (getAPHeadingLock())
|
|
||||||
return current_autopilot->get_TargetHeading();
|
|
||||||
else
|
|
||||||
return globals->get_controls()->get_rudder();
|
|
||||||
}
|
|
||||||
|
|
||||||
// kludge
|
|
||||||
static void
|
|
||||||
setAPRudderControl (double value)
|
|
||||||
{
|
|
||||||
if (getAPHeadingLock()) {
|
|
||||||
SG_LOG(SG_GENERAL, SG_DEBUG, "setAPRudderControl " << value );
|
|
||||||
value -= current_autopilot->get_TargetHeading();
|
|
||||||
current_autopilot->HeadingAdjust(value < 0.0 ? -1.0 : 1.0);
|
|
||||||
} else {
|
|
||||||
globals->get_controls()->set_rudder(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// kludge
|
|
||||||
static double
|
|
||||||
getAPElevatorControl ()
|
|
||||||
{
|
|
||||||
if (getAPAltitudeLock())
|
|
||||||
return current_autopilot->get_TargetAltitude();
|
|
||||||
else
|
|
||||||
return globals->get_controls()->get_elevator();
|
|
||||||
}
|
|
||||||
|
|
||||||
// kludge
|
|
||||||
static void
|
|
||||||
setAPElevatorControl (double value)
|
|
||||||
{
|
|
||||||
if (value != 0 && getAPAltitudeLock()) {
|
|
||||||
SG_LOG(SG_GENERAL, SG_DEBUG, "setAPElevatorControl " << value );
|
|
||||||
value -= current_autopilot->get_TargetAltitude();
|
|
||||||
current_autopilot->AltitudeAdjust(value < 0.0 ? 100.0 : -100.0);
|
|
||||||
} else {
|
|
||||||
globals->get_controls()->set_elevator(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// kludge
|
|
||||||
static double
|
|
||||||
getAPThrottleControl ()
|
|
||||||
{
|
|
||||||
if (getAPAutoThrottleLock())
|
|
||||||
return 0.0; // always resets
|
|
||||||
else
|
|
||||||
return globals->get_controls()->get_throttle(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// kludge
|
|
||||||
static void
|
|
||||||
setAPThrottleControl (double value)
|
|
||||||
{
|
|
||||||
if (getAPAutoThrottleLock())
|
|
||||||
current_autopilot->AutoThrottleAdjust(value < 0.0 ? -0.01 : 0.01);
|
|
||||||
else
|
|
||||||
globals->get_controls()->set_throttle(FGControls::ALL_ENGINES, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // _NEWAUTO_HXX
|
#endif // _NEWAUTO_HXX
|
||||||
|
|
|
@ -1181,31 +1181,31 @@ void fgUpdateHUD( GLfloat x_start, GLfloat y_start,
|
||||||
// char scratch[128];
|
// char scratch[128];
|
||||||
// HUD_TextList.add( fgText( "AUTOPILOT", 20, apY) );
|
// HUD_TextList.add( fgText( "AUTOPILOT", 20, apY) );
|
||||||
// apY -= 15;
|
// apY -= 15;
|
||||||
if( current_autopilot->get_HeadingEnabled() ) {
|
if( globals->get_autopilot()->get_HeadingEnabled() ) {
|
||||||
HUD_TextList.add( fgText( 40, apY,
|
HUD_TextList.add( fgText( 40, apY,
|
||||||
current_autopilot->get_TargetHeadingStr()) );
|
globals->get_autopilot()->get_TargetHeadingStr()) );
|
||||||
apY -= 15;
|
apY -= 15;
|
||||||
}
|
}
|
||||||
if( current_autopilot->get_AltitudeEnabled() ) {
|
if( globals->get_autopilot()->get_AltitudeEnabled() ) {
|
||||||
HUD_TextList.add( fgText( 40, apY,
|
HUD_TextList.add( fgText( 40, apY,
|
||||||
current_autopilot->get_TargetAltitudeStr()) );
|
globals->get_autopilot()->get_TargetAltitudeStr()) );
|
||||||
apY -= 15;
|
apY -= 15;
|
||||||
}
|
}
|
||||||
if( current_autopilot->get_HeadingMode() ==
|
if( globals->get_autopilot()->get_HeadingMode() ==
|
||||||
FGAutopilot::FG_HEADING_WAYPOINT )
|
FGAutopilot::FG_HEADING_WAYPOINT )
|
||||||
{
|
{
|
||||||
char *wpstr;
|
char *wpstr;
|
||||||
wpstr = current_autopilot->get_TargetWP1Str();
|
wpstr = globals->get_autopilot()->get_TargetWP1Str();
|
||||||
if ( strlen( wpstr ) ) {
|
if ( strlen( wpstr ) ) {
|
||||||
HUD_TextList.add( fgText( 40, apY, wpstr ) );
|
HUD_TextList.add( fgText( 40, apY, wpstr ) );
|
||||||
apY -= 15;
|
apY -= 15;
|
||||||
}
|
}
|
||||||
wpstr = current_autopilot->get_TargetWP2Str();
|
wpstr = globals->get_autopilot()->get_TargetWP2Str();
|
||||||
if ( strlen( wpstr ) ) {
|
if ( strlen( wpstr ) ) {
|
||||||
HUD_TextList.add( fgText( 40, apY, wpstr ) );
|
HUD_TextList.add( fgText( 40, apY, wpstr ) );
|
||||||
apY -= 15;
|
apY -= 15;
|
||||||
}
|
}
|
||||||
wpstr = current_autopilot->get_TargetWP3Str();
|
wpstr = globals->get_autopilot()->get_TargetWP3Str();
|
||||||
if ( strlen( wpstr ) ) {
|
if ( strlen( wpstr ) ) {
|
||||||
HUD_TextList.add( fgText( 40, apY, wpstr ) );
|
HUD_TextList.add( fgText( 40, apY, wpstr ) );
|
||||||
apY -= 15;
|
apY -= 15;
|
||||||
|
|
|
@ -224,11 +224,11 @@ static inline float get_elevator() {
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool AP_HeadingEnabled() {
|
static inline bool AP_HeadingEnabled() {
|
||||||
return current_autopilot->get_HeadingEnabled();
|
return globals->get_autopilot()->get_HeadingEnabled();
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool AP_AltitudeEnabled() {
|
static inline bool AP_AltitudeEnabled() {
|
||||||
return current_autopilot->get_AltitudeEnabled();
|
return globals->get_autopilot()->get_AltitudeEnabled();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TurnCursorOn( void )
|
void TurnCursorOn( void )
|
||||||
|
|
|
@ -283,13 +283,13 @@ FGInput::doKey (int k, int modifiers, int x, int y)
|
||||||
// START SPECIALS
|
// START SPECIALS
|
||||||
|
|
||||||
case 256+GLUT_KEY_F6: // F6 toggles Autopilot target location
|
case 256+GLUT_KEY_F6: // F6 toggles Autopilot target location
|
||||||
if ( current_autopilot->get_HeadingMode() !=
|
if ( globals->get_autopilot()->get_HeadingMode() !=
|
||||||
FGAutopilot::FG_HEADING_WAYPOINT ) {
|
FGAutopilot::FG_HEADING_WAYPOINT ) {
|
||||||
current_autopilot->set_HeadingMode(
|
globals->get_autopilot()->set_HeadingMode(
|
||||||
FGAutopilot::FG_HEADING_WAYPOINT );
|
FGAutopilot::FG_HEADING_WAYPOINT );
|
||||||
current_autopilot->set_HeadingEnabled( true );
|
globals->get_autopilot()->set_HeadingEnabled( true );
|
||||||
} else {
|
} else {
|
||||||
current_autopilot->set_HeadingMode(
|
globals->get_autopilot()->set_HeadingMode(
|
||||||
FGAutopilot::FG_TC_HEADING_LOCK );
|
FGAutopilot::FG_TC_HEADING_LOCK );
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -964,10 +964,12 @@ bool fgInitSubsystems( void ) {
|
||||||
// Initialize the autopilot subsystem.
|
// Initialize the autopilot subsystem.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
current_autopilot = new FGAutopilot;
|
globals->set_autopilot(new FGAutopilot);
|
||||||
current_autopilot->init();
|
globals->get_autopilot()->init();
|
||||||
|
globals->get_autopilot()->bind();
|
||||||
|
|
||||||
// initialize the gui parts of the autopilot
|
// FIXME: these should go in the
|
||||||
|
// GUI initialization code, not here.
|
||||||
fgAPAdjustInit();
|
fgAPAdjustInit();
|
||||||
NewTgtAirportInit();
|
NewTgtAirportInit();
|
||||||
NewHeadingInit();
|
NewHeadingInit();
|
||||||
|
@ -1074,7 +1076,7 @@ void fgReInitSubsystems( void )
|
||||||
fgInitView();
|
fgInitView();
|
||||||
|
|
||||||
globals->get_controls()->reset_all();
|
globals->get_controls()->reset_all();
|
||||||
current_autopilot->reset();
|
globals->get_autopilot()->reset();
|
||||||
|
|
||||||
fgUpdateSunPos();
|
fgUpdateSunPos();
|
||||||
fgUpdateMoonPos();
|
fgUpdateMoonPos();
|
||||||
|
|
|
@ -49,6 +49,7 @@ class FGEnvironmentMgr;
|
||||||
class FGEnvironment;
|
class FGEnvironment;
|
||||||
class FGControls;
|
class FGControls;
|
||||||
class FGSoundMgr;
|
class FGSoundMgr;
|
||||||
|
class FGAutopilot;
|
||||||
class FGFX;
|
class FGFX;
|
||||||
class FGViewMgr;
|
class FGViewMgr;
|
||||||
class FGViewer;
|
class FGViewer;
|
||||||
|
@ -98,6 +99,9 @@ private:
|
||||||
// Magnetic Variation
|
// Magnetic Variation
|
||||||
SGMagVar *mag;
|
SGMagVar *mag;
|
||||||
|
|
||||||
|
// Current autopilot
|
||||||
|
FGAutopilot *autopilot;
|
||||||
|
|
||||||
// Global autopilot "route"
|
// Global autopilot "route"
|
||||||
SGRoute *route;
|
SGRoute *route;
|
||||||
|
|
||||||
|
@ -178,6 +182,9 @@ public:
|
||||||
inline SGMagVar *get_mag() const { return mag; }
|
inline SGMagVar *get_mag() const { return mag; }
|
||||||
inline void set_mag( SGMagVar *m ) { mag = m; }
|
inline void set_mag( SGMagVar *m ) { mag = m; }
|
||||||
|
|
||||||
|
inline FGAutopilot *get_autopilot() const { return autopilot; }
|
||||||
|
inline void set_autopilot( FGAutopilot *ap) { autopilot = ap; }
|
||||||
|
|
||||||
inline SGRoute *get_route() const { return route; }
|
inline SGRoute *get_route() const { return route; }
|
||||||
inline void set_route( SGRoute *r ) { route = r; }
|
inline void set_route( SGRoute *r ) { route = r; }
|
||||||
|
|
||||||
|
|
|
@ -868,7 +868,7 @@ void fgUpdateTimeDepCalcs() {
|
||||||
// cout << "multi_loop = " << multi_loop << endl;
|
// cout << "multi_loop = " << multi_loop << endl;
|
||||||
for ( i = 0; i < multi_loop * fgGetInt("/sim/speed-up"); ++i ) {
|
for ( i = 0; i < multi_loop * fgGetInt("/sim/speed-up"); ++i ) {
|
||||||
// run Autopilot system
|
// run Autopilot system
|
||||||
current_autopilot->run();
|
globals->get_autopilot()->update(0); // FIXME: use real dt
|
||||||
|
|
||||||
// update FDM
|
// update FDM
|
||||||
cur_fdm_state->update( 1 );
|
cur_fdm_state->update( 1 );
|
||||||
|
|
Loading…
Add table
Reference in a new issue