2000-11-03 23:02:47 +00:00
|
|
|
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1999-02-11 21:05:34 +00:00
|
|
|
|
1999-02-05 21:26:01 +00:00
|
|
|
Module: FGState.cpp
|
|
|
|
Author: Jon Berndt
|
|
|
|
Date started: 11/17/98
|
|
|
|
Called by: FGFDMExec and accessed by all models.
|
Updates from the Jon and Tony show.
Tony submitted:
JSBsim:
Added trimming routine, it is longitudinal & in-air only at this point
Added support for taking wind & weather data from external source
Added support for flaps.
Added independently settable pitch trim
Added alphamin and max to config file, stall modeling and warning to
follow
c172.cfg:
Flaps!
Adjusted Cmo, model should be speed stable now
FG:
Hooked up Christian's weather code, should be using it soon.
Hooked up the trimming routine. Note that the X-15 will not trim.
This is not a model or trimming routine deficiency, just the
nature of the X-15
The trimming routine sets the pitch trim and and throttle at startup.
The throttle is set using Norman's code for the autothrottle so the
autothrottle is on by default. --notrim will turn it off.
Added --vc, --mach, and --notrim switches
(vc is airspeed in knots)
uBody, vBody, and wBody are still supported, last one entered
on the command line counts, i.e. you can set vc or mach or u,v,
and w but any combination will be ignored.
2000-05-16 21:35:11 +00:00
|
|
|
|
1999-02-05 21:26:01 +00:00
|
|
|
------------- Copyright (C) 1999 Jon S. Berndt (jsb@hal-pc.org) -------------
|
Updates from the Jon and Tony show.
Tony submitted:
JSBsim:
Added trimming routine, it is longitudinal & in-air only at this point
Added support for taking wind & weather data from external source
Added support for flaps.
Added independently settable pitch trim
Added alphamin and max to config file, stall modeling and warning to
follow
c172.cfg:
Flaps!
Adjusted Cmo, model should be speed stable now
FG:
Hooked up Christian's weather code, should be using it soon.
Hooked up the trimming routine. Note that the X-15 will not trim.
This is not a model or trimming routine deficiency, just the
nature of the X-15
The trimming routine sets the pitch trim and and throttle at startup.
The throttle is set using Norman's code for the autothrottle so the
autothrottle is on by default. --notrim will turn it off.
Added --vc, --mach, and --notrim switches
(vc is airspeed in knots)
uBody, vBody, and wBody are still supported, last one entered
on the command line counts, i.e. you can set vc or mach or u,v,
and w but any combination will be ignored.
2000-05-16 21:35:11 +00:00
|
|
|
|
1999-02-05 21:26:01 +00:00
|
|
|
This program is free software; you can redistribute it and/or modify it under
|
|
|
|
the terms of the GNU General Public License as published by the Free Software
|
|
|
|
Foundation; either version 2 of the License, or (at your option) any later
|
|
|
|
version.
|
Updates from the Jon and Tony show.
Tony submitted:
JSBsim:
Added trimming routine, it is longitudinal & in-air only at this point
Added support for taking wind & weather data from external source
Added support for flaps.
Added independently settable pitch trim
Added alphamin and max to config file, stall modeling and warning to
follow
c172.cfg:
Flaps!
Adjusted Cmo, model should be speed stable now
FG:
Hooked up Christian's weather code, should be using it soon.
Hooked up the trimming routine. Note that the X-15 will not trim.
This is not a model or trimming routine deficiency, just the
nature of the X-15
The trimming routine sets the pitch trim and and throttle at startup.
The throttle is set using Norman's code for the autothrottle so the
autothrottle is on by default. --notrim will turn it off.
Added --vc, --mach, and --notrim switches
(vc is airspeed in knots)
uBody, vBody, and wBody are still supported, last one entered
on the command line counts, i.e. you can set vc or mach or u,v,
and w but any combination will be ignored.
2000-05-16 21:35:11 +00:00
|
|
|
|
1999-02-05 21:26:01 +00:00
|
|
|
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
|
|
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
|
|
details.
|
Updates from the Jon and Tony show.
Tony submitted:
JSBsim:
Added trimming routine, it is longitudinal & in-air only at this point
Added support for taking wind & weather data from external source
Added support for flaps.
Added independently settable pitch trim
Added alphamin and max to config file, stall modeling and warning to
follow
c172.cfg:
Flaps!
Adjusted Cmo, model should be speed stable now
FG:
Hooked up Christian's weather code, should be using it soon.
Hooked up the trimming routine. Note that the X-15 will not trim.
This is not a model or trimming routine deficiency, just the
nature of the X-15
The trimming routine sets the pitch trim and and throttle at startup.
The throttle is set using Norman's code for the autothrottle so the
autothrottle is on by default. --notrim will turn it off.
Added --vc, --mach, and --notrim switches
(vc is airspeed in knots)
uBody, vBody, and wBody are still supported, last one entered
on the command line counts, i.e. you can set vc or mach or u,v,
and w but any combination will be ignored.
2000-05-16 21:35:11 +00:00
|
|
|
|
1999-02-05 21:26:01 +00:00
|
|
|
You should have received a copy of the GNU General Public License along with
|
|
|
|
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
|
|
|
Place - Suite 330, Boston, MA 02111-1307, USA.
|
Updates from the Jon and Tony show.
Tony submitted:
JSBsim:
Added trimming routine, it is longitudinal & in-air only at this point
Added support for taking wind & weather data from external source
Added support for flaps.
Added independently settable pitch trim
Added alphamin and max to config file, stall modeling and warning to
follow
c172.cfg:
Flaps!
Adjusted Cmo, model should be speed stable now
FG:
Hooked up Christian's weather code, should be using it soon.
Hooked up the trimming routine. Note that the X-15 will not trim.
This is not a model or trimming routine deficiency, just the
nature of the X-15
The trimming routine sets the pitch trim and and throttle at startup.
The throttle is set using Norman's code for the autothrottle so the
autothrottle is on by default. --notrim will turn it off.
Added --vc, --mach, and --notrim switches
(vc is airspeed in knots)
uBody, vBody, and wBody are still supported, last one entered
on the command line counts, i.e. you can set vc or mach or u,v,
and w but any combination will be ignored.
2000-05-16 21:35:11 +00:00
|
|
|
|
1999-02-05 21:26:01 +00:00
|
|
|
Further information about the GNU General Public License can also be found on
|
|
|
|
the world wide web at http://www.gnu.org.
|
Updates from the Jon and Tony show.
Tony submitted:
JSBsim:
Added trimming routine, it is longitudinal & in-air only at this point
Added support for taking wind & weather data from external source
Added support for flaps.
Added independently settable pitch trim
Added alphamin and max to config file, stall modeling and warning to
follow
c172.cfg:
Flaps!
Adjusted Cmo, model should be speed stable now
FG:
Hooked up Christian's weather code, should be using it soon.
Hooked up the trimming routine. Note that the X-15 will not trim.
This is not a model or trimming routine deficiency, just the
nature of the X-15
The trimming routine sets the pitch trim and and throttle at startup.
The throttle is set using Norman's code for the autothrottle so the
autothrottle is on by default. --notrim will turn it off.
Added --vc, --mach, and --notrim switches
(vc is airspeed in knots)
uBody, vBody, and wBody are still supported, last one entered
on the command line counts, i.e. you can set vc or mach or u,v,
and w but any combination will be ignored.
2000-05-16 21:35:11 +00:00
|
|
|
|
1999-02-05 21:26:01 +00:00
|
|
|
FUNCTIONAL DESCRIPTION
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
See header file.
|
Updates from the Jon and Tony show.
Tony submitted:
JSBsim:
Added trimming routine, it is longitudinal & in-air only at this point
Added support for taking wind & weather data from external source
Added support for flaps.
Added independently settable pitch trim
Added alphamin and max to config file, stall modeling and warning to
follow
c172.cfg:
Flaps!
Adjusted Cmo, model should be speed stable now
FG:
Hooked up Christian's weather code, should be using it soon.
Hooked up the trimming routine. Note that the X-15 will not trim.
This is not a model or trimming routine deficiency, just the
nature of the X-15
The trimming routine sets the pitch trim and and throttle at startup.
The throttle is set using Norman's code for the autothrottle so the
autothrottle is on by default. --notrim will turn it off.
Added --vc, --mach, and --notrim switches
(vc is airspeed in knots)
uBody, vBody, and wBody are still supported, last one entered
on the command line counts, i.e. you can set vc or mach or u,v,
and w but any combination will be ignored.
2000-05-16 21:35:11 +00:00
|
|
|
|
1999-02-05 21:26:01 +00:00
|
|
|
HISTORY
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
11/17/98 JSB Created
|
Updates from the Jon and Tony show.
Tony submitted:
JSBsim:
Added trimming routine, it is longitudinal & in-air only at this point
Added support for taking wind & weather data from external source
Added support for flaps.
Added independently settable pitch trim
Added alphamin and max to config file, stall modeling and warning to
follow
c172.cfg:
Flaps!
Adjusted Cmo, model should be speed stable now
FG:
Hooked up Christian's weather code, should be using it soon.
Hooked up the trimming routine. Note that the X-15 will not trim.
This is not a model or trimming routine deficiency, just the
nature of the X-15
The trimming routine sets the pitch trim and and throttle at startup.
The throttle is set using Norman's code for the autothrottle so the
autothrottle is on by default. --notrim will turn it off.
Added --vc, --mach, and --notrim switches
(vc is airspeed in knots)
uBody, vBody, and wBody are still supported, last one entered
on the command line counts, i.e. you can set vc or mach or u,v,
and w but any combination will be ignored.
2000-05-16 21:35:11 +00:00
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1999-02-05 21:26:01 +00:00
|
|
|
INCLUDES
|
2000-11-03 23:02:47 +00:00
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
1999-02-05 21:26:01 +00:00
|
|
|
|
1999-02-26 22:09:10 +00:00
|
|
|
#ifdef FGFS
|
2000-02-15 03:30:01 +00:00
|
|
|
# include <simgear/compiler.h>
|
2001-06-05 20:58:48 +00:00
|
|
|
# include <math.h>
|
1999-02-26 22:09:10 +00:00
|
|
|
#else
|
2001-10-05 20:19:59 +00:00
|
|
|
# if defined(sgi) && !defined(__GNUC__)
|
|
|
|
# include <math.h>
|
|
|
|
# else
|
|
|
|
# include <cmath>
|
|
|
|
# endif
|
2000-10-02 23:07:30 +00:00
|
|
|
#endif
|
2000-07-06 21:02:46 +00:00
|
|
|
|
2001-11-24 22:13:04 +00:00
|
|
|
#ifdef _MSC_VER
|
|
|
|
#define snprintf _snprintf
|
|
|
|
#endif
|
|
|
|
|
1999-02-05 21:26:01 +00:00
|
|
|
#include "FGState.h"
|
|
|
|
|
2001-03-30 01:04:50 +00:00
|
|
|
static const char *IdSrc = "$Id$";
|
2000-10-14 02:10:10 +00:00
|
|
|
static const char *IdHdr = ID_STATE;
|
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2000-10-02 23:07:30 +00:00
|
|
|
MACROS
|
2000-11-03 23:02:47 +00:00
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
2000-10-02 23:07:30 +00:00
|
|
|
|
|
|
|
#define RegisterVariable(ID,DEF) coeffdef[#ID] = ID; paramdef[ID] = DEF
|
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
CLASS IMPLEMENTATION
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
1999-02-05 21:26:01 +00:00
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2000-10-02 23:07:30 +00:00
|
|
|
//
|
|
|
|
// For every term registered here there must be a corresponding handler in
|
|
|
|
// GetParameter() below that retrieves that parameter. Also, there must be an
|
2001-11-12 16:06:29 +00:00
|
|
|
// entry in the enum eParam definition in FGJSBBase.h. The ID is what must be used
|
2000-10-02 23:07:30 +00:00
|
|
|
// in any config file entry which references that item.
|
1999-02-05 21:26:01 +00:00
|
|
|
|
2001-12-07 17:10:17 +00:00
|
|
|
FGState::FGState(FGFDMExec* fdex)
|
2000-05-27 05:48:14 +00:00
|
|
|
{
|
1999-02-11 21:05:34 +00:00
|
|
|
FDMExec = fdex;
|
|
|
|
|
1999-02-05 21:26:01 +00:00
|
|
|
a = 1000.0;
|
2000-01-10 21:07:00 +00:00
|
|
|
sim_time = 0.0;
|
|
|
|
dt = 1.0/120.0;
|
2001-03-30 01:04:50 +00:00
|
|
|
ActiveEngine = -1;
|
2001-04-17 21:19:54 +00:00
|
|
|
|
2001-06-05 20:58:48 +00:00
|
|
|
Aircraft = FDMExec->GetAircraft();
|
|
|
|
Translation = FDMExec->GetTranslation();
|
|
|
|
Rotation = FDMExec->GetRotation();
|
|
|
|
Position = FDMExec->GetPosition();
|
|
|
|
FCS = FDMExec->GetFCS();
|
|
|
|
Output = FDMExec->GetOutput();
|
|
|
|
Atmosphere = FDMExec->GetAtmosphere();
|
|
|
|
Aerodynamics = FDMExec->GetAerodynamics();
|
2001-10-29 19:00:24 +00:00
|
|
|
GroundReactions = FDMExec->GetGroundReactions();
|
2001-10-30 02:51:13 +00:00
|
|
|
Propulsion = FDMExec->GetPropulsion();
|
2001-04-17 21:19:54 +00:00
|
|
|
|
2001-03-30 01:04:50 +00:00
|
|
|
RegisterVariable(FG_TIME, " time " );
|
2000-10-02 23:07:30 +00:00
|
|
|
RegisterVariable(FG_QBAR, " qbar " );
|
|
|
|
RegisterVariable(FG_WINGAREA, " wing_area " );
|
|
|
|
RegisterVariable(FG_WINGSPAN, " wingspan " );
|
|
|
|
RegisterVariable(FG_CBAR, " cbar " );
|
|
|
|
RegisterVariable(FG_ALPHA, " alpha " );
|
|
|
|
RegisterVariable(FG_ALPHADOT, " alphadot " );
|
|
|
|
RegisterVariable(FG_BETA, " beta " );
|
2001-11-12 16:06:29 +00:00
|
|
|
RegisterVariable(FG_ABETA, " |beta| " );
|
2000-10-02 23:07:30 +00:00
|
|
|
RegisterVariable(FG_BETADOT, " betadot " );
|
2001-04-17 21:19:54 +00:00
|
|
|
RegisterVariable(FG_PHI, " roll_angle " );
|
|
|
|
RegisterVariable(FG_THT, " pitch_angle " );
|
|
|
|
RegisterVariable(FG_PSI, " heading_angle " );
|
2001-03-30 01:04:50 +00:00
|
|
|
RegisterVariable(FG_PITCHRATE, " pitch_rate " );
|
2000-10-02 23:07:30 +00:00
|
|
|
RegisterVariable(FG_ROLLRATE, " roll_rate " );
|
|
|
|
RegisterVariable(FG_YAWRATE, " yaw_rate " );
|
2001-11-24 22:13:04 +00:00
|
|
|
RegisterVariable(FG_AEROQ, " aero_pitch_rate ");
|
|
|
|
RegisterVariable(FG_AEROP, " aero_roll_rate " );
|
|
|
|
RegisterVariable(FG_AEROR, " aero_yaw_rate " );
|
2001-04-17 21:19:54 +00:00
|
|
|
RegisterVariable(FG_CL_SQRD, " Clift_sqrd " );
|
2000-10-02 23:07:30 +00:00
|
|
|
RegisterVariable(FG_MACH, " mach " );
|
|
|
|
RegisterVariable(FG_ALTITUDE, " altitude " );
|
|
|
|
RegisterVariable(FG_BI2VEL, " BI2Vel " );
|
|
|
|
RegisterVariable(FG_CI2VEL, " CI2Vel " );
|
|
|
|
RegisterVariable(FG_ELEVATOR_POS, " elevator_pos " );
|
|
|
|
RegisterVariable(FG_AILERON_POS, " aileron_pos " );
|
|
|
|
RegisterVariable(FG_RUDDER_POS, " rudder_pos " );
|
|
|
|
RegisterVariable(FG_SPDBRAKE_POS, " speedbrake_pos " );
|
|
|
|
RegisterVariable(FG_SPOILERS_POS, " spoiler_pos " );
|
|
|
|
RegisterVariable(FG_FLAPS_POS, " flaps_pos " );
|
2001-12-03 22:24:40 +00:00
|
|
|
RegisterVariable(FG_GEAR_POS, " gear_pos " );
|
2000-10-02 23:07:30 +00:00
|
|
|
RegisterVariable(FG_ELEVATOR_CMD, " elevator_cmd " );
|
|
|
|
RegisterVariable(FG_AILERON_CMD, " aileron_cmd " );
|
|
|
|
RegisterVariable(FG_RUDDER_CMD, " rudder_cmd " );
|
|
|
|
RegisterVariable(FG_SPDBRAKE_CMD, " speedbrake_cmd " );
|
|
|
|
RegisterVariable(FG_SPOILERS_CMD, " spoiler_cmd " );
|
|
|
|
RegisterVariable(FG_FLAPS_CMD, " flaps_cmd " );
|
|
|
|
RegisterVariable(FG_THROTTLE_CMD, " throttle_cmd " );
|
2001-12-03 22:24:40 +00:00
|
|
|
RegisterVariable(FG_GEAR_CMD, " gear_cmd " );
|
2000-10-02 23:07:30 +00:00
|
|
|
RegisterVariable(FG_THROTTLE_POS, " throttle_pos " );
|
2001-12-03 22:24:40 +00:00
|
|
|
RegisterVariable(FG_MIXTURE_CMD, " mixture_cmd " );
|
|
|
|
RegisterVariable(FG_MIXTURE_POS, " mixture_pos " );
|
|
|
|
RegisterVariable(FG_MAGNETO_CMD, " magneto_cmd " );
|
|
|
|
RegisterVariable(FG_STARTER_CMD, " starter_cmd " );
|
2001-03-30 01:04:50 +00:00
|
|
|
RegisterVariable(FG_ACTIVE_ENGINE, " active_engine " );
|
2000-10-02 23:07:30 +00:00
|
|
|
RegisterVariable(FG_HOVERB, " height/span " );
|
2001-03-30 01:04:50 +00:00
|
|
|
RegisterVariable(FG_PITCH_TRIM_CMD, " pitch_trim_cmd " );
|
2001-04-05 21:14:37 +00:00
|
|
|
RegisterVariable(FG_LEFT_BRAKE_CMD, " left_brake_cmd " );
|
|
|
|
RegisterVariable(FG_RIGHT_BRAKE_CMD," right_brake_cmd ");
|
|
|
|
RegisterVariable(FG_CENTER_BRAKE_CMD," center_brake_cmd ");
|
2001-10-05 20:19:59 +00:00
|
|
|
RegisterVariable(FG_ALPHAH, " h-tail alpha " );
|
|
|
|
RegisterVariable(FG_ALPHAW, " wing alpha " );
|
|
|
|
RegisterVariable(FG_LBARH, " h-tail arm " );
|
|
|
|
RegisterVariable(FG_LBARV, " v-tail arm " );
|
|
|
|
RegisterVariable(FG_HTAILAREA, " h-tail area " );
|
|
|
|
RegisterVariable(FG_VTAILAREA, " v-tail area " );
|
|
|
|
RegisterVariable(FG_VBARH, " h-tail volume " );
|
|
|
|
RegisterVariable(FG_VBARV, " v-tail volume " );
|
2001-04-06 22:59:31 +00:00
|
|
|
RegisterVariable(FG_SET_LOGGING, " data_logging " );
|
2001-03-30 01:04:50 +00:00
|
|
|
|
|
|
|
if (debug_lvl & 2) cout << "Instantiated: FGState" << endl;
|
1999-02-05 21:26:01 +00:00
|
|
|
}
|
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1999-02-05 21:26:01 +00:00
|
|
|
|
2001-03-30 01:04:50 +00:00
|
|
|
FGState::~FGState()
|
|
|
|
{
|
|
|
|
if (debug_lvl & 2) cout << "Destroyed: FGState" << endl;
|
|
|
|
}
|
1999-02-05 21:26:01 +00:00
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2000-10-02 23:07:30 +00:00
|
|
|
|
2001-11-20 22:34:24 +00:00
|
|
|
double FGState::GetParameter(eParam val_idx) {
|
|
|
|
double scratch;
|
2001-04-17 21:19:54 +00:00
|
|
|
|
2000-10-02 23:07:30 +00:00
|
|
|
switch(val_idx) {
|
2001-03-30 01:04:50 +00:00
|
|
|
case FG_TIME:
|
|
|
|
return sim_time;
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_QBAR:
|
2001-04-17 21:19:54 +00:00
|
|
|
return Translation->Getqbar();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_WINGAREA:
|
2001-04-17 21:19:54 +00:00
|
|
|
return Aircraft->GetWingArea();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_WINGSPAN:
|
2001-04-17 21:19:54 +00:00
|
|
|
return Aircraft->GetWingSpan();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_CBAR:
|
2001-04-17 21:19:54 +00:00
|
|
|
return Aircraft->Getcbar();
|
2001-10-05 20:19:59 +00:00
|
|
|
case FG_LBARH:
|
|
|
|
return Aircraft->Getlbarh();
|
|
|
|
case FG_LBARV:
|
|
|
|
return Aircraft->Getvbarh();
|
|
|
|
case FG_HTAILAREA:
|
|
|
|
return Aircraft->GetHTailArea();
|
|
|
|
case FG_VTAILAREA:
|
|
|
|
return Aircraft->GetVTailArea();
|
|
|
|
case FG_VBARH:
|
|
|
|
return Aircraft->Getvbarh();
|
|
|
|
case FG_VBARV:
|
|
|
|
return Aircraft->Getvbarv();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_ALPHA:
|
2001-04-17 21:19:54 +00:00
|
|
|
return Translation->Getalpha();
|
2001-10-05 20:19:59 +00:00
|
|
|
case FG_ALPHAW:
|
|
|
|
return Translation->Getalpha() + Aircraft->GetWingIncidence();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_ALPHADOT:
|
2001-04-17 21:19:54 +00:00
|
|
|
return Translation->Getadot();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_BETA:
|
2001-04-17 21:19:54 +00:00
|
|
|
return Translation->Getbeta();
|
2001-11-12 16:06:29 +00:00
|
|
|
case FG_ABETA:
|
|
|
|
return fabs(Translation->Getbeta());
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_BETADOT:
|
2001-04-17 21:19:54 +00:00
|
|
|
return Translation->Getbdot();
|
|
|
|
case FG_PHI:
|
|
|
|
return Rotation->Getphi();
|
|
|
|
case FG_THT:
|
|
|
|
return Rotation->Gettht();
|
|
|
|
case FG_PSI:
|
|
|
|
return Rotation->Getpsi();
|
2001-03-30 01:04:50 +00:00
|
|
|
case FG_PITCHRATE:
|
2001-04-17 21:19:54 +00:00
|
|
|
return Rotation->GetPQR(eQ);
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_ROLLRATE:
|
2001-04-17 21:19:54 +00:00
|
|
|
return Rotation->GetPQR(eP);
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_YAWRATE:
|
2001-04-17 21:19:54 +00:00
|
|
|
return Rotation->GetPQR(eR);
|
2001-11-24 22:13:04 +00:00
|
|
|
case FG_AEROP:
|
2001-11-30 17:49:37 +00:00
|
|
|
return Rotation->GetAeroPQR(eP);
|
|
|
|
case FG_AEROQ:
|
|
|
|
return Rotation->GetAeroPQR(eQ);
|
2001-11-24 22:13:04 +00:00
|
|
|
case FG_AEROR:
|
2001-11-30 17:49:37 +00:00
|
|
|
return Rotation->GetAeroPQR(eR);
|
2001-04-17 21:19:54 +00:00
|
|
|
case FG_CL_SQRD:
|
|
|
|
if (Translation->Getqbar() > 0.00)
|
2001-06-05 20:58:48 +00:00
|
|
|
scratch = Aerodynamics->GetvLastFs(eLift)/(Aircraft->GetWingArea()*Translation->Getqbar());
|
2001-04-17 21:19:54 +00:00
|
|
|
else
|
|
|
|
scratch = 0.0;
|
|
|
|
return scratch*scratch;
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_ELEVATOR_POS:
|
2001-04-17 21:19:54 +00:00
|
|
|
return FCS->GetDePos();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_AILERON_POS:
|
2001-04-17 21:19:54 +00:00
|
|
|
return FCS->GetDaPos();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_RUDDER_POS:
|
2001-04-17 21:19:54 +00:00
|
|
|
return FCS->GetDrPos();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_SPDBRAKE_POS:
|
2001-04-17 21:19:54 +00:00
|
|
|
return FCS->GetDsbPos();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_SPOILERS_POS:
|
2001-04-17 21:19:54 +00:00
|
|
|
return FCS->GetDspPos();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_FLAPS_POS:
|
2001-04-17 21:19:54 +00:00
|
|
|
return FCS->GetDfPos();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_ELEVATOR_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
return FCS->GetDeCmd();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_AILERON_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
return FCS->GetDaCmd();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_RUDDER_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
return FCS->GetDrCmd();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_SPDBRAKE_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
return FCS->GetDsbCmd();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_SPOILERS_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
return FCS->GetDspCmd();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_FLAPS_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
return FCS->GetDfCmd();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_MACH:
|
2001-04-17 21:19:54 +00:00
|
|
|
return Translation->GetMach();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_ALTITUDE:
|
2001-04-17 21:19:54 +00:00
|
|
|
return Position->Geth();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_BI2VEL:
|
2001-04-17 21:19:54 +00:00
|
|
|
if(Translation->GetVt() > 0)
|
|
|
|
return Aircraft->GetWingSpan()/(2.0 * Translation->GetVt());
|
2000-10-02 23:07:30 +00:00
|
|
|
else
|
|
|
|
return 0;
|
|
|
|
case FG_CI2VEL:
|
2001-04-17 21:19:54 +00:00
|
|
|
if(Translation->GetVt() > 0)
|
|
|
|
return Aircraft->Getcbar()/(2.0 * Translation->GetVt());
|
2000-10-02 23:07:30 +00:00
|
|
|
else
|
|
|
|
return 0;
|
|
|
|
case FG_THROTTLE_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
if (ActiveEngine < 0) return FCS->GetThrottleCmd(0);
|
|
|
|
else return FCS->GetThrottleCmd(ActiveEngine);
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_THROTTLE_POS:
|
2001-04-17 21:19:54 +00:00
|
|
|
if (ActiveEngine < 0) return FCS->GetThrottlePos(0);
|
|
|
|
else return FCS->GetThrottlePos(ActiveEngine);
|
2001-10-30 02:51:13 +00:00
|
|
|
case FG_MAGNETO_CMD:
|
|
|
|
if (ActiveEngine < 0) return Propulsion->GetEngine(0)->GetMagnetos();
|
|
|
|
else return Propulsion->GetEngine(ActiveEngine)->GetMagnetos();
|
|
|
|
case FG_STARTER_CMD:
|
|
|
|
if (ActiveEngine < 0) {
|
|
|
|
if (Propulsion->GetEngine(0)->GetStarter()) return 1.0;
|
|
|
|
else return 0.0;
|
|
|
|
} else {
|
|
|
|
if (Propulsion->GetEngine(ActiveEngine)->GetStarter()) return 1.0;
|
|
|
|
else return 0.0;
|
|
|
|
}
|
|
|
|
case FG_MIXTURE_CMD:
|
|
|
|
if (ActiveEngine < 0) return FCS->GetMixtureCmd(0);
|
|
|
|
else return FCS->GetMixtureCmd(ActiveEngine);
|
|
|
|
case FG_MIXTURE_POS:
|
|
|
|
if (ActiveEngine < 0) return FCS->GetMixturePos(0);
|
|
|
|
else return FCS->GetMixturePos(ActiveEngine);
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_HOVERB:
|
2001-11-30 17:49:37 +00:00
|
|
|
return Position->GetHOverBMAC();
|
2001-03-30 01:04:50 +00:00
|
|
|
case FG_PITCH_TRIM_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
return FCS->GetPitchTrimCmd();
|
2001-12-03 22:24:40 +00:00
|
|
|
case FG_GEAR_CMD:
|
|
|
|
return FCS->GetGearCmd();
|
|
|
|
case FG_GEAR_POS:
|
|
|
|
return FCS->GetGearPos();
|
2000-10-02 23:07:30 +00:00
|
|
|
default:
|
2001-10-30 02:51:13 +00:00
|
|
|
cerr << "FGState::GetParameter() - No handler for parameter " << paramdef[val_idx] << endl;
|
2000-10-02 23:07:30 +00:00
|
|
|
return 0.0;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2000-10-02 23:07:30 +00:00
|
|
|
|
2001-11-20 22:34:24 +00:00
|
|
|
double FGState::GetParameter(string val_string) {
|
2000-10-02 23:07:30 +00:00
|
|
|
return GetParameter(coeffdef[val_string]);
|
|
|
|
}
|
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2000-10-02 23:07:30 +00:00
|
|
|
|
2001-12-07 17:10:17 +00:00
|
|
|
eParam FGState::GetParameterIndex(string val_string)
|
|
|
|
{
|
2000-10-02 23:07:30 +00:00
|
|
|
return coeffdef[val_string];
|
|
|
|
}
|
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2000-10-02 23:07:30 +00:00
|
|
|
|
2001-12-07 17:10:17 +00:00
|
|
|
void FGState::SetParameter(eParam val_idx, double val)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
2000-10-02 23:07:30 +00:00
|
|
|
switch(val_idx) {
|
|
|
|
case FG_ELEVATOR_POS:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetDePos(val);
|
2000-10-02 23:07:30 +00:00
|
|
|
break;
|
|
|
|
case FG_AILERON_POS:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetDaPos(val);
|
2000-10-02 23:07:30 +00:00
|
|
|
break;
|
|
|
|
case FG_RUDDER_POS:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetDrPos(val);
|
2000-10-02 23:07:30 +00:00
|
|
|
break;
|
|
|
|
case FG_SPDBRAKE_POS:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetDsbPos(val);
|
2000-10-02 23:07:30 +00:00
|
|
|
break;
|
|
|
|
case FG_SPOILERS_POS:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetDspPos(val);
|
2000-10-02 23:07:30 +00:00
|
|
|
break;
|
|
|
|
case FG_FLAPS_POS:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetDfPos(val);
|
2000-10-02 23:07:30 +00:00
|
|
|
break;
|
|
|
|
case FG_THROTTLE_POS:
|
2001-12-07 17:10:17 +00:00
|
|
|
if (ActiveEngine == -1) {
|
|
|
|
for (i=0; i<Propulsion->GetNumEngines(); i++) {
|
|
|
|
FCS->SetThrottlePos(i,val);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
FCS->SetThrottlePos(ActiveEngine,val);
|
|
|
|
}
|
2001-03-30 01:04:50 +00:00
|
|
|
break;
|
2001-10-30 02:51:13 +00:00
|
|
|
case FG_MIXTURE_POS:
|
2001-12-07 17:10:17 +00:00
|
|
|
if (ActiveEngine == -1) {
|
|
|
|
for (i=0; i<Propulsion->GetNumEngines(); i++) {
|
|
|
|
FCS->SetMixturePos(i,val);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
FCS->SetMixturePos(ActiveEngine,val);
|
|
|
|
}
|
2001-10-30 02:51:13 +00:00
|
|
|
break;
|
2001-03-30 01:04:50 +00:00
|
|
|
|
|
|
|
case FG_ELEVATOR_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetDeCmd(val);
|
2001-03-30 01:04:50 +00:00
|
|
|
break;
|
|
|
|
case FG_AILERON_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetDaCmd(val);
|
2001-03-30 01:04:50 +00:00
|
|
|
break;
|
|
|
|
case FG_RUDDER_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetDrCmd(val);
|
2001-03-30 01:04:50 +00:00
|
|
|
break;
|
|
|
|
case FG_SPDBRAKE_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetDsbCmd(val);
|
2001-03-30 01:04:50 +00:00
|
|
|
break;
|
|
|
|
case FG_SPOILERS_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetDspCmd(val);
|
2001-03-30 01:04:50 +00:00
|
|
|
break;
|
|
|
|
case FG_FLAPS_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetDfCmd(val);
|
2001-03-30 01:04:50 +00:00
|
|
|
break;
|
|
|
|
case FG_THROTTLE_CMD:
|
2001-12-07 17:10:17 +00:00
|
|
|
if (ActiveEngine == -1) {
|
|
|
|
for (i=0; i<Propulsion->GetNumEngines(); i++) {
|
|
|
|
FCS->SetThrottleCmd(i,val);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
FCS->SetThrottleCmd(ActiveEngine,val);
|
|
|
|
}
|
2001-03-30 01:04:50 +00:00
|
|
|
break;
|
2001-10-30 02:51:13 +00:00
|
|
|
case FG_MIXTURE_CMD:
|
2001-12-07 17:10:17 +00:00
|
|
|
if (ActiveEngine == -1) {
|
|
|
|
for (i=0; i<Propulsion->GetNumEngines(); i++) {
|
|
|
|
FCS->SetMixtureCmd(i,val);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
FCS->SetMixtureCmd(ActiveEngine,val);
|
|
|
|
}
|
2001-10-30 02:51:13 +00:00
|
|
|
break;
|
|
|
|
case FG_MAGNETO_CMD:
|
2001-12-07 17:10:17 +00:00
|
|
|
if (ActiveEngine == -1) {
|
|
|
|
for (i=0; i<Propulsion->GetNumEngines(); i++) {
|
|
|
|
Propulsion->GetEngine(i)->SetMagnetos((int)val);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
Propulsion->GetEngine(ActiveEngine)->SetMagnetos((int)val);
|
|
|
|
}
|
2001-10-30 02:51:13 +00:00
|
|
|
break;
|
|
|
|
case FG_STARTER_CMD:
|
2001-12-07 17:10:17 +00:00
|
|
|
if (ActiveEngine == -1) {
|
|
|
|
for (i=0; i<Propulsion->GetNumEngines(); i++) {
|
|
|
|
if (val < 0.001)
|
|
|
|
Propulsion->GetEngine(i)->SetStarter(false);
|
|
|
|
else if (val >= 0.001)
|
|
|
|
Propulsion->GetEngine(i)->SetStarter(true);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
Propulsion->GetEngine(ActiveEngine)->SetStarter(true);
|
|
|
|
}
|
2001-10-30 02:51:13 +00:00
|
|
|
break;
|
2001-03-30 01:04:50 +00:00
|
|
|
case FG_ACTIVE_ENGINE:
|
|
|
|
ActiveEngine = (int)val;
|
|
|
|
break;
|
|
|
|
|
2001-04-05 21:14:37 +00:00
|
|
|
case FG_LEFT_BRAKE_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetLBrake(val);
|
2001-04-05 21:14:37 +00:00
|
|
|
break;
|
|
|
|
case FG_CENTER_BRAKE_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetCBrake(val);
|
2001-04-05 21:14:37 +00:00
|
|
|
break;
|
|
|
|
case FG_RIGHT_BRAKE_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetRBrake(val);
|
2001-04-05 21:14:37 +00:00
|
|
|
break;
|
2001-12-03 22:24:40 +00:00
|
|
|
case FG_GEAR_CMD:
|
|
|
|
FCS->SetGearCmd(val);
|
|
|
|
break;
|
|
|
|
case FG_GEAR_POS:
|
|
|
|
FCS->SetGearPos(val);
|
|
|
|
break;
|
2001-04-06 22:59:31 +00:00
|
|
|
case FG_SET_LOGGING:
|
2001-04-17 21:19:54 +00:00
|
|
|
if (val < -0.01) Output->Disable();
|
|
|
|
else if (val > 0.01) Output->Enable();
|
|
|
|
else Output->Toggle();
|
2001-04-06 22:59:31 +00:00
|
|
|
break;
|
|
|
|
|
2001-03-30 01:04:50 +00:00
|
|
|
default:
|
|
|
|
cerr << "Parameter '" << val_idx << "' (" << paramdef[val_idx] << ") not handled" << endl;
|
2000-10-02 23:07:30 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1999-08-17 21:18:11 +00:00
|
|
|
//***************************************************************************
|
|
|
|
//
|
|
|
|
// Reset: Assume all angles READ FROM FILE IN DEGREES !!
|
|
|
|
//
|
|
|
|
|
2001-10-05 20:19:59 +00:00
|
|
|
bool FGState::Reset(string path, string acname, string fname)
|
|
|
|
{
|
1999-02-13 01:12:03 +00:00
|
|
|
string resetDef;
|
2001-10-05 20:19:59 +00:00
|
|
|
string token="";
|
|
|
|
|
2001-11-20 22:34:24 +00:00
|
|
|
double U, V, W;
|
|
|
|
double phi, tht, psi;
|
|
|
|
double latitude, longitude, h;
|
|
|
|
double wdir, wmag, wnorth, weast;
|
1999-02-05 21:26:01 +00:00
|
|
|
|
2001-10-05 20:19:59 +00:00
|
|
|
# ifndef macintosh
|
2000-11-14 20:31:58 +00:00
|
|
|
resetDef = path + "/" + acname + "/" + fname + ".xml";
|
2001-10-05 20:19:59 +00:00
|
|
|
# else
|
|
|
|
resetDef = path + ";" + acname + ";" + fname + ".xml";
|
|
|
|
# endif
|
|
|
|
|
|
|
|
FGConfigFile resetfile(resetDef);
|
|
|
|
if (!resetfile.IsOpen()) return false;
|
|
|
|
|
|
|
|
resetfile.GetNextConfigLine();
|
|
|
|
token = resetfile.GetValue();
|
2001-11-30 17:49:37 +00:00
|
|
|
if (token != string("initialize")) {
|
2001-10-05 20:19:59 +00:00
|
|
|
cerr << "The reset file " << resetDef
|
|
|
|
<< " does not appear to be a reset file" << endl;
|
1999-02-05 21:26:01 +00:00
|
|
|
return false;
|
|
|
|
}
|
2001-10-05 20:19:59 +00:00
|
|
|
|
|
|
|
resetfile.GetNextConfigLine();
|
|
|
|
resetfile >> token;
|
2001-11-30 17:49:37 +00:00
|
|
|
while (token != string("/initialize") && token != string("EOF")) {
|
2001-10-05 20:19:59 +00:00
|
|
|
if (token == "UBODY") resetfile >> U;
|
|
|
|
if (token == "VBODY") resetfile >> V;
|
|
|
|
if (token == "WBODY") resetfile >> W;
|
|
|
|
if (token == "LATITUDE") resetfile >> latitude;
|
|
|
|
if (token == "LONGITUDE") resetfile >> longitude;
|
|
|
|
if (token == "PHI") resetfile >> phi;
|
|
|
|
if (token == "THETA") resetfile >> tht;
|
|
|
|
if (token == "PSI") resetfile >> psi;
|
|
|
|
if (token == "ALTITUDE") resetfile >> h;
|
|
|
|
if (token == "WINDDIR") resetfile >> wdir;
|
|
|
|
if (token == "VWIND") resetfile >> wmag;
|
|
|
|
|
|
|
|
resetfile >> token;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-11-12 16:06:29 +00:00
|
|
|
Position->SetLatitude(latitude*degtorad);
|
|
|
|
Position->SetLongitude(longitude*degtorad);
|
2001-10-05 20:19:59 +00:00
|
|
|
Position->Seth(h);
|
|
|
|
|
2001-11-12 16:06:29 +00:00
|
|
|
wnorth = wmag*ktstofps*cos(wdir*degtorad);
|
|
|
|
weast = wmag*ktstofps*sin(wdir*degtorad);
|
2001-10-05 20:19:59 +00:00
|
|
|
|
2001-11-12 16:06:29 +00:00
|
|
|
Initialize(U, V, W, phi*degtorad, tht*degtorad, psi*degtorad,
|
|
|
|
latitude*degtorad, longitude*degtorad, h, wnorth, weast, 0.0);
|
2001-10-05 20:19:59 +00:00
|
|
|
|
|
|
|
return true;
|
1999-02-05 21:26:01 +00:00
|
|
|
}
|
|
|
|
|
1999-08-17 21:18:11 +00:00
|
|
|
//***************************************************************************
|
|
|
|
//
|
|
|
|
// Initialize: Assume all angles GIVEN IN RADIANS !!
|
|
|
|
//
|
1999-02-05 21:26:01 +00:00
|
|
|
|
2001-11-20 22:34:24 +00:00
|
|
|
void FGState::Initialize(double U, double V, double W,
|
|
|
|
double phi, double tht, double psi,
|
|
|
|
double Latitude, double Longitude, double H,
|
|
|
|
double wnorth, double weast, double wdown)
|
2001-10-05 20:19:59 +00:00
|
|
|
{
|
2001-11-20 22:34:24 +00:00
|
|
|
double alpha, beta;
|
|
|
|
double qbar, Vt;
|
2001-11-30 17:49:37 +00:00
|
|
|
FGColumnVector3 vAeroUVW;
|
2000-04-28 19:59:46 +00:00
|
|
|
|
2001-04-17 21:19:54 +00:00
|
|
|
Position->SetLatitude(Latitude);
|
|
|
|
Position->SetLongitude(Longitude);
|
|
|
|
Position->Seth(H);
|
1999-07-31 04:55:23 +00:00
|
|
|
|
2001-04-17 21:19:54 +00:00
|
|
|
Atmosphere->Run();
|
2001-10-05 20:19:59 +00:00
|
|
|
|
|
|
|
vLocalEuler << phi << tht << psi;
|
|
|
|
Rotation->SetEuler(vLocalEuler);
|
1999-07-31 04:55:23 +00:00
|
|
|
|
2001-10-05 20:19:59 +00:00
|
|
|
InitMatrices(phi, tht, psi);
|
|
|
|
|
|
|
|
vUVW << U << V << W;
|
|
|
|
Translation->SetUVW(vUVW);
|
|
|
|
|
|
|
|
Atmosphere->SetWindNED(wnorth, weast, wdown);
|
|
|
|
|
2001-11-30 17:49:37 +00:00
|
|
|
vAeroUVW = vUVW + mTl2b*Atmosphere->GetWindNED();
|
2001-10-05 20:19:59 +00:00
|
|
|
|
2001-11-30 17:49:37 +00:00
|
|
|
if (vAeroUVW(eW) != 0.0)
|
|
|
|
alpha = vAeroUVW(eU)*vAeroUVW(eU) > 0.0 ? atan2(vAeroUVW(eW), vAeroUVW(eU)) : 0.0;
|
1999-07-31 04:55:23 +00:00
|
|
|
else
|
|
|
|
alpha = 0.0;
|
2001-11-30 17:49:37 +00:00
|
|
|
if (vAeroUVW(eV) != 0.0)
|
|
|
|
beta = vAeroUVW(eU)*vAeroUVW(eU)+vAeroUVW(eW)*vAeroUVW(eW) > 0.0 ? atan2(vAeroUVW(eV), (fabs(vAeroUVW(eU))/vAeroUVW(eU))*sqrt(vAeroUVW(eU)*vAeroUVW(eU) + vAeroUVW(eW)*vAeroUVW(eW))) : 0.0;
|
1999-07-31 04:55:23 +00:00
|
|
|
else
|
|
|
|
beta = 0.0;
|
|
|
|
|
2001-04-17 21:19:54 +00:00
|
|
|
Translation->SetAB(alpha, beta);
|
1999-07-31 04:55:23 +00:00
|
|
|
|
|
|
|
Vt = sqrt(U*U + V*V + W*W);
|
2001-04-17 21:19:54 +00:00
|
|
|
Translation->SetVt(Vt);
|
2000-04-28 19:59:46 +00:00
|
|
|
|
2001-04-17 21:19:54 +00:00
|
|
|
Translation->SetMach(Vt/Atmosphere->GetSoundSpeed());
|
2000-10-02 23:07:30 +00:00
|
|
|
|
2001-04-17 21:19:54 +00:00
|
|
|
qbar = 0.5*(U*U + V*V + W*W)*Atmosphere->GetDensity();
|
|
|
|
Translation->Setqbar(qbar);
|
2000-04-24 23:49:06 +00:00
|
|
|
|
2000-04-28 19:59:46 +00:00
|
|
|
vLocalVelNED = mTb2l*vUVW;
|
2001-04-17 21:19:54 +00:00
|
|
|
Position->SetvVel(vLocalVelNED);
|
1999-07-31 04:55:23 +00:00
|
|
|
}
|
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1999-07-31 04:55:23 +00:00
|
|
|
|
Updates from the Jon and Tony show.
Tony submitted:
JSBsim:
Added trimming routine, it is longitudinal & in-air only at this point
Added support for taking wind & weather data from external source
Added support for flaps.
Added independently settable pitch trim
Added alphamin and max to config file, stall modeling and warning to
follow
c172.cfg:
Flaps!
Adjusted Cmo, model should be speed stable now
FG:
Hooked up Christian's weather code, should be using it soon.
Hooked up the trimming routine. Note that the X-15 will not trim.
This is not a model or trimming routine deficiency, just the
nature of the X-15
The trimming routine sets the pitch trim and and throttle at startup.
The throttle is set using Norman's code for the autothrottle so the
autothrottle is on by default. --notrim will turn it off.
Added --vc, --mach, and --notrim switches
(vc is airspeed in knots)
uBody, vBody, and wBody are still supported, last one entered
on the command line counts, i.e. you can set vc or mach or u,v,
and w but any combination will be ignored.
2000-05-16 21:35:11 +00:00
|
|
|
void FGState::Initialize(FGInitialCondition *FGIC) {
|
1999-12-20 20:24:49 +00:00
|
|
|
|
2001-11-20 22:34:24 +00:00
|
|
|
double tht,psi,phi;
|
|
|
|
double U, V, W, h;
|
|
|
|
double latitude, longitude;
|
|
|
|
double wnorth,weast, wdown;
|
2001-10-05 20:19:59 +00:00
|
|
|
|
1999-08-17 21:18:11 +00:00
|
|
|
latitude = FGIC->GetLatitudeRadIC();
|
|
|
|
longitude = FGIC->GetLongitudeRadIC();
|
|
|
|
h = FGIC->GetAltitudeFtIC();
|
|
|
|
U = FGIC->GetUBodyFpsIC();
|
|
|
|
V = FGIC->GetVBodyFpsIC();
|
|
|
|
W = FGIC->GetWBodyFpsIC();
|
|
|
|
tht = FGIC->GetThetaRadIC();
|
|
|
|
phi = FGIC->GetPhiRadIC();
|
|
|
|
psi = FGIC->GetPsiRadIC();
|
2001-10-05 20:19:59 +00:00
|
|
|
wnorth = FGIC->GetWindNFpsIC();
|
|
|
|
weast = FGIC->GetWindEFpsIC();
|
|
|
|
wdown = FGIC->GetWindDFpsIC();
|
2000-10-28 16:30:30 +00:00
|
|
|
|
2001-04-17 21:19:54 +00:00
|
|
|
Position->SetSeaLevelRadius( FGIC->GetSeaLevelRadiusFtIC() );
|
|
|
|
Position->SetRunwayRadius( FGIC->GetSeaLevelRadiusFtIC() +
|
2000-10-28 16:30:30 +00:00
|
|
|
FGIC->GetTerrainAltitudeFtIC() );
|
2000-11-03 23:02:47 +00:00
|
|
|
|
2001-10-05 20:19:59 +00:00
|
|
|
// need to fix the wind speed args, here.
|
|
|
|
Initialize(U, V, W, phi, tht, psi, latitude, longitude, h, wnorth, weast, wdown);
|
1999-08-17 21:18:11 +00:00
|
|
|
}
|
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1999-08-17 21:18:11 +00:00
|
|
|
|
Updates from the Jon and Tony show.
Tony submitted:
JSBsim:
Added trimming routine, it is longitudinal & in-air only at this point
Added support for taking wind & weather data from external source
Added support for flaps.
Added independently settable pitch trim
Added alphamin and max to config file, stall modeling and warning to
follow
c172.cfg:
Flaps!
Adjusted Cmo, model should be speed stable now
FG:
Hooked up Christian's weather code, should be using it soon.
Hooked up the trimming routine. Note that the X-15 will not trim.
This is not a model or trimming routine deficiency, just the
nature of the X-15
The trimming routine sets the pitch trim and and throttle at startup.
The throttle is set using Norman's code for the autothrottle so the
autothrottle is on by default. --notrim will turn it off.
Added --vc, --mach, and --notrim switches
(vc is airspeed in knots)
uBody, vBody, and wBody are still supported, last one entered
on the command line counts, i.e. you can set vc or mach or u,v,
and w but any combination will be ignored.
2000-05-16 21:35:11 +00:00
|
|
|
bool FGState::StoreData(string fname) {
|
1999-02-26 22:09:10 +00:00
|
|
|
ofstream datafile(fname.c_str());
|
1999-02-05 21:26:01 +00:00
|
|
|
|
|
|
|
if (datafile) {
|
2001-04-17 21:19:54 +00:00
|
|
|
datafile << Translation->GetUVW(eU);
|
|
|
|
datafile << Translation->GetUVW(eV);
|
|
|
|
datafile << Translation->GetUVW(eW);
|
|
|
|
datafile << Position->GetLatitude();
|
|
|
|
datafile << Position->GetLongitude();
|
|
|
|
datafile << Rotation->GetEuler(ePhi);
|
|
|
|
datafile << Rotation->GetEuler(eTht);
|
|
|
|
datafile << Rotation->GetEuler(ePsi);
|
|
|
|
datafile << Position->Geth();
|
1999-02-05 21:26:01 +00:00
|
|
|
datafile.close();
|
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
cerr << "Could not open dump file " << fname << endl;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1999-02-05 21:26:01 +00:00
|
|
|
|
2001-11-20 22:34:24 +00:00
|
|
|
void FGState::InitMatrices(double phi, double tht, double psi) {
|
|
|
|
double thtd2, psid2, phid2;
|
|
|
|
double Sthtd2, Spsid2, Sphid2;
|
|
|
|
double Cthtd2, Cpsid2, Cphid2;
|
|
|
|
double Cphid2Cthtd2;
|
|
|
|
double Cphid2Sthtd2;
|
|
|
|
double Sphid2Sthtd2;
|
|
|
|
double Sphid2Cthtd2;
|
2000-04-24 23:49:06 +00:00
|
|
|
|
|
|
|
thtd2 = tht/2.0;
|
|
|
|
psid2 = psi/2.0;
|
|
|
|
phid2 = phi/2.0;
|
|
|
|
|
|
|
|
Sthtd2 = sin(thtd2);
|
|
|
|
Spsid2 = sin(psid2);
|
|
|
|
Sphid2 = sin(phid2);
|
|
|
|
|
|
|
|
Cthtd2 = cos(thtd2);
|
|
|
|
Cpsid2 = cos(psid2);
|
|
|
|
Cphid2 = cos(phid2);
|
|
|
|
|
|
|
|
Cphid2Cthtd2 = Cphid2*Cthtd2;
|
|
|
|
Cphid2Sthtd2 = Cphid2*Sthtd2;
|
|
|
|
Sphid2Sthtd2 = Sphid2*Sthtd2;
|
|
|
|
Sphid2Cthtd2 = Sphid2*Cthtd2;
|
|
|
|
|
|
|
|
vQtrn(1) = Cphid2Cthtd2*Cpsid2 + Sphid2Sthtd2*Spsid2;
|
|
|
|
vQtrn(2) = Sphid2Cthtd2*Cpsid2 - Cphid2Sthtd2*Spsid2;
|
|
|
|
vQtrn(3) = Cphid2Sthtd2*Cpsid2 + Sphid2Cthtd2*Spsid2;
|
|
|
|
vQtrn(4) = Cphid2Cthtd2*Spsid2 - Sphid2Sthtd2*Cpsid2;
|
|
|
|
|
|
|
|
CalcMatrices();
|
1999-02-05 21:26:01 +00:00
|
|
|
}
|
2000-04-24 23:49:06 +00:00
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2000-04-24 23:49:06 +00:00
|
|
|
|
Updates from the Jon and Tony show.
Tony submitted:
JSBsim:
Added trimming routine, it is longitudinal & in-air only at this point
Added support for taking wind & weather data from external source
Added support for flaps.
Added independently settable pitch trim
Added alphamin and max to config file, stall modeling and warning to
follow
c172.cfg:
Flaps!
Adjusted Cmo, model should be speed stable now
FG:
Hooked up Christian's weather code, should be using it soon.
Hooked up the trimming routine. Note that the X-15 will not trim.
This is not a model or trimming routine deficiency, just the
nature of the X-15
The trimming routine sets the pitch trim and and throttle at startup.
The throttle is set using Norman's code for the autothrottle so the
autothrottle is on by default. --notrim will turn it off.
Added --vc, --mach, and --notrim switches
(vc is airspeed in knots)
uBody, vBody, and wBody are still supported, last one entered
on the command line counts, i.e. you can set vc or mach or u,v,
and w but any combination will be ignored.
2000-05-16 21:35:11 +00:00
|
|
|
void FGState::CalcMatrices(void) {
|
2001-11-20 22:34:24 +00:00
|
|
|
double Q0Q0, Q1Q1, Q2Q2, Q3Q3;
|
|
|
|
double Q0Q1, Q0Q2, Q0Q3, Q1Q2;
|
|
|
|
double Q1Q3, Q2Q3;
|
2000-04-24 23:49:06 +00:00
|
|
|
|
|
|
|
Q0Q0 = vQtrn(1)*vQtrn(1);
|
|
|
|
Q1Q1 = vQtrn(2)*vQtrn(2);
|
|
|
|
Q2Q2 = vQtrn(3)*vQtrn(3);
|
|
|
|
Q3Q3 = vQtrn(4)*vQtrn(4);
|
|
|
|
Q0Q1 = vQtrn(1)*vQtrn(2);
|
|
|
|
Q0Q2 = vQtrn(1)*vQtrn(3);
|
|
|
|
Q0Q3 = vQtrn(1)*vQtrn(4);
|
|
|
|
Q1Q2 = vQtrn(2)*vQtrn(3);
|
|
|
|
Q1Q3 = vQtrn(2)*vQtrn(4);
|
|
|
|
Q2Q3 = vQtrn(3)*vQtrn(4);
|
|
|
|
|
2000-05-27 05:48:14 +00:00
|
|
|
mTl2b(1,1) = Q0Q0 + Q1Q1 - Q2Q2 - Q3Q3;
|
|
|
|
mTl2b(1,2) = 2*(Q1Q2 + Q0Q3);
|
|
|
|
mTl2b(1,3) = 2*(Q1Q3 - Q0Q2);
|
|
|
|
mTl2b(2,1) = 2*(Q1Q2 - Q0Q3);
|
|
|
|
mTl2b(2,2) = Q0Q0 - Q1Q1 + Q2Q2 - Q3Q3;
|
|
|
|
mTl2b(2,3) = 2*(Q2Q3 + Q0Q1);
|
|
|
|
mTl2b(3,1) = 2*(Q1Q3 + Q0Q2);
|
|
|
|
mTl2b(3,2) = 2*(Q2Q3 - Q0Q1);
|
|
|
|
mTl2b(3,3) = Q0Q0 - Q1Q1 - Q2Q2 + Q3Q3;
|
|
|
|
|
|
|
|
mTb2l = mTl2b;
|
|
|
|
mTb2l.T();
|
2000-04-24 23:49:06 +00:00
|
|
|
}
|
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2000-04-24 23:49:06 +00:00
|
|
|
|
2001-10-05 20:19:59 +00:00
|
|
|
void FGState::IntegrateQuat(FGColumnVector3 vPQR, int rate) {
|
2000-04-24 23:49:06 +00:00
|
|
|
vQdot(1) = -0.5*(vQtrn(2)*vPQR(eP) + vQtrn(3)*vPQR(eQ) + vQtrn(4)*vPQR(eR));
|
|
|
|
vQdot(2) = 0.5*(vQtrn(1)*vPQR(eP) + vQtrn(3)*vPQR(eR) - vQtrn(4)*vPQR(eQ));
|
|
|
|
vQdot(3) = 0.5*(vQtrn(1)*vPQR(eQ) + vQtrn(4)*vPQR(eP) - vQtrn(2)*vPQR(eR));
|
|
|
|
vQdot(4) = 0.5*(vQtrn(1)*vPQR(eR) + vQtrn(2)*vPQR(eQ) - vQtrn(3)*vPQR(eP));
|
|
|
|
vQtrn += 0.5*dt*rate*(vlastQdot + vQdot);
|
|
|
|
|
|
|
|
vQtrn.Normalize();
|
|
|
|
|
|
|
|
vlastQdot = vQdot;
|
|
|
|
}
|
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2000-04-24 23:49:06 +00:00
|
|
|
|
2001-10-05 20:19:59 +00:00
|
|
|
FGColumnVector3& FGState::CalcEuler(void) {
|
2000-07-06 21:02:46 +00:00
|
|
|
if (mTl2b(3,3) == 0.0) mTl2b(3,3) = 0.0000001;
|
|
|
|
if (mTl2b(1,1) == 0.0) mTl2b(1,1) = 0.0000001;
|
2000-04-24 23:49:06 +00:00
|
|
|
|
2000-07-06 21:02:46 +00:00
|
|
|
vEuler(ePhi) = atan2(mTl2b(2,3), mTl2b(3,3));
|
2000-05-27 05:48:14 +00:00
|
|
|
vEuler(eTht) = asin(-mTl2b(1,3));
|
2000-07-06 21:02:46 +00:00
|
|
|
vEuler(ePsi) = atan2(mTl2b(1,2), mTl2b(1,1));
|
2000-04-24 23:49:06 +00:00
|
|
|
|
|
|
|
if (vEuler(ePsi) < 0.0) vEuler(ePsi) += 2*M_PI;
|
|
|
|
|
|
|
|
return vEuler;
|
|
|
|
}
|
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2000-04-24 23:49:06 +00:00
|
|
|
|
2001-11-20 22:34:24 +00:00
|
|
|
FGMatrix33& FGState::GetTs2b(void)
|
2001-10-05 20:19:59 +00:00
|
|
|
{
|
2001-11-20 22:34:24 +00:00
|
|
|
double ca, cb, sa, sb;
|
|
|
|
|
|
|
|
double alpha = Translation->Getalpha();
|
|
|
|
double beta = Translation->Getbeta();
|
2000-04-24 23:49:06 +00:00
|
|
|
|
|
|
|
ca = cos(alpha);
|
|
|
|
sa = sin(alpha);
|
|
|
|
cb = cos(beta);
|
|
|
|
sb = sin(beta);
|
|
|
|
|
2001-11-30 17:49:37 +00:00
|
|
|
mTs2b(1,1) = ca*cb;
|
2000-04-24 23:49:06 +00:00
|
|
|
mTs2b(1,2) = -ca*sb;
|
2001-11-30 17:49:37 +00:00
|
|
|
mTs2b(1,3) = -sa;
|
|
|
|
mTs2b(2,1) = sb;
|
2000-04-24 23:49:06 +00:00
|
|
|
mTs2b(2,2) = cb;
|
|
|
|
mTs2b(2,3) = 0.0;
|
2001-11-30 17:49:37 +00:00
|
|
|
mTs2b(3,1) = sa*cb;
|
2000-04-24 23:49:06 +00:00
|
|
|
mTs2b(3,2) = -sa*sb;
|
2001-11-30 17:49:37 +00:00
|
|
|
mTs2b(3,3) = ca;
|
2000-04-24 23:49:06 +00:00
|
|
|
|
|
|
|
return mTs2b;
|
|
|
|
}
|
|
|
|
|
2001-11-30 17:49:37 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
|
|
|
|
FGMatrix33& FGState::GetTb2s(void)
|
|
|
|
{
|
|
|
|
float alpha,beta;
|
|
|
|
float ca, cb, sa, sb;
|
|
|
|
|
|
|
|
alpha = Translation->Getalpha();
|
|
|
|
beta = Translation->Getbeta();
|
|
|
|
|
|
|
|
ca = cos(alpha);
|
|
|
|
sa = sin(alpha);
|
|
|
|
cb = cos(beta);
|
|
|
|
sb = sin(beta);
|
|
|
|
|
|
|
|
mTb2s(1,1) = ca*cb;
|
|
|
|
mTb2s(1,2) = sb;
|
|
|
|
mTb2s(1,3) = sa*cb;
|
|
|
|
mTb2s(2,1) = -ca*sb;
|
|
|
|
mTb2s(2,2) = cb;
|
|
|
|
mTb2s(2,3) = -sa*sb;
|
|
|
|
mTb2s(3,1) = -sa;
|
|
|
|
mTb2s(3,2) = 0.0;
|
|
|
|
mTb2s(3,3) = ca;
|
|
|
|
|
|
|
|
return mTb2s;
|
|
|
|
}
|
2001-10-05 20:19:59 +00:00
|
|
|
|
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
|
|
|
|
void FGState::ReportState(void) {
|
2001-12-03 22:24:40 +00:00
|
|
|
char out[80], flap[10], gear[12];
|
2001-10-05 20:19:59 +00:00
|
|
|
|
|
|
|
cout << endl << " JSBSim State" << endl;
|
|
|
|
snprintf(out,80," Weight: %7.0f lbs. CG: %5.1f, %5.1f, %5.1f inches\n",
|
|
|
|
FDMExec->GetMassBalance()->GetWeight(),
|
|
|
|
FDMExec->GetMassBalance()->GetXYZcg(1),
|
|
|
|
FDMExec->GetMassBalance()->GetXYZcg(2),
|
|
|
|
FDMExec->GetMassBalance()->GetXYZcg(3));
|
|
|
|
cout << out;
|
|
|
|
if( FCS->GetDfPos() <= 0.01)
|
|
|
|
snprintf(flap,10,"Up");
|
|
|
|
else
|
|
|
|
snprintf(flap,10,"%2.0f",FCS->GetDfPos());
|
2001-12-03 22:24:40 +00:00
|
|
|
if(FCS->GetGearPos() < 0.01)
|
|
|
|
snprintf(gear,12,"Up");
|
|
|
|
else if(FCS->GetGearPos() > 0.99)
|
|
|
|
snprintf(gear,12,"Down");
|
2001-10-05 20:19:59 +00:00
|
|
|
else
|
2001-12-03 22:24:40 +00:00
|
|
|
snprintf(gear,12,"In Transit");
|
|
|
|
snprintf(out,80, " Flaps: %3s Gear: %12s\n",flap,gear);
|
2001-10-05 20:19:59 +00:00
|
|
|
cout << out;
|
|
|
|
snprintf(out,80, " Speed: %4.0f KCAS Mach: %5.2f\n",
|
|
|
|
FDMExec->GetAuxiliary()->GetVcalibratedKTS(),
|
|
|
|
GetParameter(FG_MACH) );
|
|
|
|
cout << out;
|
|
|
|
snprintf(out,80, " Altitude: %7.0f ft. AGL Altitude: %7.0f ft.\n",
|
|
|
|
Position->Geth(),
|
|
|
|
Position->GetDistanceAGL() );
|
|
|
|
cout << out;
|
|
|
|
snprintf(out,80, " Angle of Attack: %6.2f deg Pitch Angle: %6.2f deg\n",
|
2001-11-12 16:06:29 +00:00
|
|
|
GetParameter(FG_ALPHA)*radtodeg,
|
|
|
|
Rotation->Gettht()*radtodeg );
|
2001-10-05 20:19:59 +00:00
|
|
|
cout << out;
|
|
|
|
snprintf(out,80, " Flight Path Angle: %6.2f deg Climb Rate: %5.0f ft/min\n",
|
2001-11-12 16:06:29 +00:00
|
|
|
Position->GetGamma()*radtodeg,
|
2001-10-05 20:19:59 +00:00
|
|
|
Position->Gethdot()*60 );
|
|
|
|
cout << out;
|
|
|
|
snprintf(out,80, " Normal Load Factor: %4.2f g's Pitch Rate: %5.2f deg/s\n",
|
2001-11-30 17:49:37 +00:00
|
|
|
Aircraft->GetNlf(),
|
2001-11-12 16:06:29 +00:00
|
|
|
GetParameter(FG_PITCHRATE)*radtodeg );
|
2001-10-05 20:19:59 +00:00
|
|
|
cout << out;
|
|
|
|
snprintf(out,80, " Heading: %3.0f deg true Sideslip: %5.2f deg\n",
|
2001-11-12 16:06:29 +00:00
|
|
|
Rotation->Getpsi()*radtodeg,
|
|
|
|
GetParameter(FG_BETA)*radtodeg );
|
2001-10-05 20:19:59 +00:00
|
|
|
cout << out;
|
|
|
|
snprintf(out,80, " Bank Angle: %5.2f deg\n",
|
2001-11-12 16:06:29 +00:00
|
|
|
Rotation->Getphi()*radtodeg );
|
2001-10-05 20:19:59 +00:00
|
|
|
cout << out;
|
|
|
|
snprintf(out,80, " Elevator: %5.2f deg Left Aileron: %5.2f deg Rudder: %5.2f deg\n",
|
2001-11-12 16:06:29 +00:00
|
|
|
GetParameter(FG_ELEVATOR_POS)*radtodeg,
|
|
|
|
GetParameter(FG_AILERON_POS)*radtodeg,
|
|
|
|
GetParameter(FG_RUDDER_POS)*radtodeg );
|
2001-10-05 20:19:59 +00:00
|
|
|
cout << out;
|
|
|
|
snprintf(out,80, " Throttle: %5.2f%c\n",
|
2001-11-06 22:33:05 +00:00
|
|
|
FCS->GetThrottlePos(0)*100,'%' );
|
2001-10-05 20:19:59 +00:00
|
|
|
cout << out;
|
|
|
|
|
|
|
|
snprintf(out,80, " Wind Components: %5.2f kts head wind, %5.2f kts cross wind\n",
|
2001-11-12 16:06:29 +00:00
|
|
|
FDMExec->GetAuxiliary()->GetHeadWind()*fpstokts,
|
|
|
|
FDMExec->GetAuxiliary()->GetCrossWind()*fpstokts );
|
2001-10-05 20:19:59 +00:00
|
|
|
cout << out;
|
|
|
|
|
|
|
|
snprintf(out,80, " Ground Speed: %4.0f knots , Ground Track: %3.0f deg true\n",
|
2001-11-12 16:06:29 +00:00
|
|
|
Position->GetVground()*fpstokts,
|
|
|
|
Position->GetGroundTrack()*radtodeg );
|
2001-10-05 20:19:59 +00:00
|
|
|
cout << out;
|
|
|
|
|
|
|
|
}
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2000-04-24 23:49:06 +00:00
|
|
|
|
2001-03-30 01:04:50 +00:00
|
|
|
void FGState::Debug(void)
|
|
|
|
{
|
|
|
|
//TODO: Add your source code here
|
|
|
|
}
|
|
|
|
|