Sync with latest JSBSim CVS
This commit is contained in:
parent
daabe407aa
commit
6bc2f59572
45 changed files with 585 additions and 335 deletions
2
aclocal.m4
vendored
2
aclocal.m4
vendored
|
@ -1,4 +1,4 @@
|
|||
dnl aclocal.m4 generated automatically by aclocal 1.4
|
||||
dnl aclocal.m4 generated automatically by aclocal 1.4-p4
|
||||
|
||||
dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
|
|
|
@ -49,7 +49,6 @@
|
|||
#include <FDM/JSBSim/FGState.h>
|
||||
#include <FDM/JSBSim/FGTranslation.h>
|
||||
#include <FDM/JSBSim/FGAuxiliary.h>
|
||||
#include <FDM/JSBSim/FGDefs.h>
|
||||
#include <FDM/JSBSim/FGInitialCondition.h>
|
||||
#include <FDM/JSBSim/FGTrim.h>
|
||||
#include <FDM/JSBSim/FGAtmosphere.h>
|
||||
|
|
|
@ -46,6 +46,9 @@ DEFINITIONS
|
|||
|
||||
#define ID_JSBSIMXX "$Header JSBSim.hxx,v 1.4 2000/10/22 14:02:16 jsb Exp $"
|
||||
|
||||
#define METERS_TO_FEET 3.2808398950
|
||||
#define RADTODEG 57.2957795
|
||||
|
||||
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
FORWARD DECLARATIONS
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||||
|
|
|
@ -108,11 +108,11 @@ bool FGAerodynamics::Run(void)
|
|||
vForces = State->GetTs2b(alpha, beta)*vFs;
|
||||
|
||||
vDXYZcg(eX) = -(Aircraft->GetXYZrp(eX)
|
||||
- MassBalance->GetXYZcg(eX))*INCHTOFT;
|
||||
- MassBalance->GetXYZcg(eX))*inchtoft;
|
||||
vDXYZcg(eY) = (Aircraft->GetXYZrp(eY)
|
||||
- MassBalance->GetXYZcg(eY))*INCHTOFT;
|
||||
- MassBalance->GetXYZcg(eY))*inchtoft;
|
||||
vDXYZcg(eZ) = -(Aircraft->GetXYZrp(eZ)
|
||||
- MassBalance->GetXYZcg(eZ))*INCHTOFT;
|
||||
- MassBalance->GetXYZcg(eZ))*inchtoft;
|
||||
|
||||
vMoments = vDXYZcg*vForces; // M = r X F
|
||||
|
||||
|
|
|
@ -178,7 +178,7 @@ bool FGAircraft::Run(void)
|
|||
|
||||
vBodyAccel = vForces/MassBalance->GetMass();
|
||||
|
||||
vNcg = vBodyAccel*INVGRAVITY;
|
||||
vNcg = vBodyAccel/Inertial->gravity();
|
||||
|
||||
if (alphaclmax != 0) {
|
||||
if (Translation->Getalpha() > 0.85*alphaclmax) {
|
||||
|
@ -414,10 +414,10 @@ void FGAircraft::ReadPrologue(FGConfigFile* AC_cfg)
|
|||
if (debug_lvl > 0)
|
||||
cout << " Version: " << highint << CFGVersion
|
||||
<< normint << endl;
|
||||
if (CFGVersion != NEEDED_CFG_VERSION) {
|
||||
if (CFGVersion != needed_cfg_version) {
|
||||
cerr << endl << fgred << "YOU HAVE AN INCOMPATIBLE CFG FILE FOR THIS AIRCRAFT."
|
||||
" RESULTS WILL BE UNPREDICTABLE !!" << endl;
|
||||
cerr << "Current version needed is: " << NEEDED_CFG_VERSION << endl;
|
||||
cerr << "Current version needed is: " << needed_cfg_version << endl;
|
||||
cerr << " You have version: " << CFGVersion << endl << fgdef << endl;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -56,7 +56,6 @@ INCLUDES
|
|||
#include "FGPosition.h"
|
||||
#include "FGAuxiliary.h"
|
||||
#include "FGOutput.h"
|
||||
#include "FGDefs.h"
|
||||
#include "FGMatrix33.h"
|
||||
#include "FGColumnVector3.h"
|
||||
#include "FGColumnVector4.h"
|
||||
|
@ -84,17 +83,6 @@ FGAtmosphere::FGAtmosphere(FGFDMExec* fdmex) : FGModel(fdmex),
|
|||
htab[6]=200131.234;
|
||||
htab[7]=259186.352; //ft.
|
||||
|
||||
Calculate(h);
|
||||
SLtemperature = temperature;
|
||||
SLpressure = pressure;
|
||||
SLdensity = density;
|
||||
SLsoundspeed = sqrt(SHRATIO*Reng*temperature);
|
||||
rSLtemperature = 1.0/temperature;
|
||||
rSLpressure = 1.0/pressure;
|
||||
rSLdensity = 1.0/density;
|
||||
rSLsoundspeed = 1.0/SLsoundspeed;
|
||||
useExternal=false;
|
||||
|
||||
if (debug_lvl & 2) cout << "Instantiated: " << Name << endl;
|
||||
}
|
||||
|
||||
|
@ -107,6 +95,26 @@ FGAtmosphere::~FGAtmosphere()
|
|||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
bool FGAtmosphere::InitModel(void)
|
||||
{
|
||||
FGModel::InitModel();
|
||||
|
||||
Calculate(h);
|
||||
SLtemperature = temperature;
|
||||
SLpressure = pressure;
|
||||
SLdensity = density;
|
||||
SLsoundspeed = sqrt(SHRatio*Reng*temperature);
|
||||
rSLtemperature = 1.0/temperature;
|
||||
rSLpressure = 1.0/pressure;
|
||||
rSLdensity = 1.0/density;
|
||||
rSLsoundspeed = 1.0/SLsoundspeed;
|
||||
useExternal=false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
bool FGAtmosphere::Run(void)
|
||||
{
|
||||
if (!FGModel::Run()) { // if false then execute this Run()
|
||||
|
@ -124,7 +132,7 @@ bool FGAtmosphere::Run(void)
|
|||
|
||||
if (psiw < 0) psiw += 2*M_PI;
|
||||
|
||||
soundspeed = sqrt(SHRATIO*Reng*temperature);
|
||||
soundspeed = sqrt(SHRatio*Reng*temperature);
|
||||
|
||||
State->Seta(soundspeed);
|
||||
|
||||
|
@ -212,13 +220,13 @@ void FGAtmosphere::Calculate(float altitude)
|
|||
|
||||
if (slope == 0) {
|
||||
temperature = reftemp;
|
||||
pressure = refpress*exp(-GRAVITY/(reftemp*Reng)*(altitude-htab[i]));
|
||||
//density = refdens*exp(-GRAVITY/(reftemp*Reng)*(altitude-htab[i]));
|
||||
pressure = refpress*exp(-Inertial->SLgravity()/(reftemp*Reng)*(altitude-htab[i]));
|
||||
//density = refdens*exp(-Inertial->SLgravity()/(reftemp*Reng)*(altitude-htab[i]));
|
||||
density = pressure/(Reng*temperature);
|
||||
} else {
|
||||
temperature = reftemp+slope*(altitude-htab[i]);
|
||||
pressure = refpress*pow(temperature/reftemp,-GRAVITY/(slope*Reng));
|
||||
//density = refdens*pow(temperature/reftemp,-(GRAVITY/(slope*Reng)+1));
|
||||
pressure = refpress*pow(temperature/reftemp,-Inertial->SLgravity()/(slope*Reng));
|
||||
//density = refdens*pow(temperature/reftemp,-(Inertial->SLgravity()/(slope*Reng)+1));
|
||||
density = pressure/(Reng*temperature);
|
||||
}
|
||||
lastIndex=i;
|
||||
|
|
|
@ -88,6 +88,8 @@ public:
|
|||
@return false if no error */
|
||||
bool Run(void);
|
||||
|
||||
bool InitModel(void);
|
||||
|
||||
/// Returns the temperature in degrees Rankine.
|
||||
inline float GetTemperature(void) {return temperature;}
|
||||
/** Returns the density in slugs/ft^3.
|
||||
|
|
|
@ -155,7 +155,7 @@ bool FGAuxiliary::Run()
|
|||
+ Rotation->GetPQR() * (Rotation->GetPQR() * vToEyePt)
|
||||
+ Inertial->GetGravity();
|
||||
|
||||
earthPosAngle += State->Getdt()*OMEGA_EARTH;
|
||||
earthPosAngle += State->Getdt()*Inertial->omega();
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
|
@ -190,6 +190,20 @@ float FGAuxiliary::GetCrossWind(void)
|
|||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
FGColumnVector3 FGAuxiliary::GetNpilot(void)
|
||||
{
|
||||
return vPilotAccel/Inertial->gravity();
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
float FGAuxiliary::GetNpilot(int idx)
|
||||
{
|
||||
return (vPilotAccel/Inertial->gravity())(idx);
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
void FGAuxiliary::GetState(void)
|
||||
{
|
||||
qbar = Translation->Getqbar();
|
||||
|
|
|
@ -86,14 +86,14 @@ public:
|
|||
|
||||
// Use FGInitialCondition to set these speeds
|
||||
inline float GetVcalibratedFPS(void) { return vcas; }
|
||||
inline float GetVcalibratedKTS(void) { return vcas*FPSTOKTS; }
|
||||
inline float GetVcalibratedKTS(void) { return vcas*fpstokts; }
|
||||
inline float GetVequivalentFPS(void) { return veas; }
|
||||
inline float GetVequivalentKTS(void) { return veas*FPSTOKTS; }
|
||||
inline float GetVequivalentKTS(void) { return veas*fpstokts; }
|
||||
|
||||
inline FGColumnVector3& GetPilotAccel(void) { return vPilotAccel; }
|
||||
inline float GetPilotAccel(int idx) { return vPilotAccel(idx); }
|
||||
inline FGColumnVector3 GetNpilot(void) { return vPilotAccel*INVGRAVITY; }
|
||||
inline float GetNpilot(int idx) { return (vPilotAccel*INVGRAVITY)(idx); }
|
||||
FGColumnVector3 GetNpilot(void);
|
||||
float GetNpilot(int idx);
|
||||
|
||||
inline float GetEarthPositionAngle(void) { return earthPosAngle; }
|
||||
|
||||
|
|
|
@ -44,7 +44,6 @@ HISTORY
|
|||
INCLUDES
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||||
|
||||
#include "FGDefs.h"
|
||||
#include "FGCoefficient.h"
|
||||
#include "FGState.h"
|
||||
#include "FGFDMExec.h"
|
||||
|
|
|
@ -45,7 +45,6 @@ INCLUDES
|
|||
#include <vector>
|
||||
#include <string>
|
||||
#include "FGConfigFile.h"
|
||||
#include "FGDefs.h"
|
||||
#include "FGTable.h"
|
||||
#include "FGJSBBase.h"
|
||||
|
||||
|
|
|
@ -64,26 +64,20 @@ string FGConfigFile::GetNextConfigLine(void)
|
|||
|
||||
do {
|
||||
CurrentLine = GetLine();
|
||||
if ((CurrentLine.find("<COMMENT>") != CurrentLine.npos) ||
|
||||
(CurrentLine.find("<!--") != CurrentLine.npos)) {
|
||||
if (CurrentLine.find("<!--") != CurrentLine.npos) {
|
||||
CommentsOn = true;
|
||||
CommentString = "";
|
||||
if (CurrentLine.find("<!--") != CurrentLine.npos)
|
||||
CurrentLine.erase(CurrentLine.find("<!--"),4);
|
||||
else if (CurrentLine.find("<COMMENT>") != CurrentLine.npos)
|
||||
CurrentLine.erase(CurrentLine.find("<COMMENT>"),9);
|
||||
while((deblank = CurrentLine.find(" ")) != CurrentLine.npos) CurrentLine.erase(deblank,1);
|
||||
if (CurrentLine.size() <= 2) CurrentLine = "";
|
||||
}
|
||||
|
||||
if ((CurrentLine.find("</COMMENT>") != CurrentLine.npos) ||
|
||||
(CurrentLine.find("-->") != CurrentLine.npos)) {
|
||||
if (CurrentLine.find("-->") != CurrentLine.npos) {
|
||||
CommentsOn = false;
|
||||
|
||||
if (CurrentLine.find("-->") != CurrentLine.npos)
|
||||
CurrentLine.erase(CurrentLine.find("-->"),4);
|
||||
else if (CurrentLine.find("</COMMENT>") != CurrentLine.npos)
|
||||
CurrentLine.erase(CurrentLine.find("</COMMENT>"),10);
|
||||
|
||||
while((deblank = CurrentLine.find(" ")) != CurrentLine.npos) CurrentLine.erase(deblank,1);
|
||||
if (CurrentLine.size() <= 2) CurrentLine = "";
|
||||
|
@ -94,7 +88,7 @@ string FGConfigFile::GetNextConfigLine(void)
|
|||
|
||||
if (CommentsOn) CommentString += CurrentLine + "\r\n";
|
||||
|
||||
} while (IsCommentLine());
|
||||
} while (CommentsOn);
|
||||
|
||||
if (CurrentLine.length() == 0) GetNextConfigLine();
|
||||
CurrentIndex = 0;
|
||||
|
@ -186,16 +180,6 @@ string FGConfigFile::GetValue(void)
|
|||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
bool FGConfigFile::IsCommentLine(void)
|
||||
{
|
||||
if (CurrentLine[0] == '/' && CurrentLine[1] == '/') return true;
|
||||
if (CommentsOn) return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
string FGConfigFile::GetLine(void)
|
||||
{
|
||||
string scratch = "";
|
||||
|
|
|
@ -72,7 +72,6 @@ INCLUDES
|
|||
using std::string;
|
||||
#endif
|
||||
|
||||
#include "FGDefs.h"
|
||||
#include "FGJSBBase.h"
|
||||
|
||||
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
@ -118,7 +117,6 @@ public:
|
|||
string GetValue(string);
|
||||
string GetValue(void);
|
||||
string GetCommentString(void);
|
||||
bool IsCommentLine(void);
|
||||
bool IsOpen(void) {return Opened;}
|
||||
FGConfigFile& operator>>(double&);
|
||||
FGConfigFile& operator>>(float&);
|
||||
|
|
|
@ -245,7 +245,6 @@ protected:
|
|||
#include "FGPosition.h"
|
||||
#include "FGAuxiliary.h"
|
||||
#include "FGOutput.h"
|
||||
#include "FGDefs.h"
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
#endif
|
||||
|
|
|
@ -37,8 +37,6 @@ HISTORY
|
|||
INCLUDES
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||||
|
||||
#include "FGDefs.h"
|
||||
|
||||
#include "FGFCS.h"
|
||||
#include "FGState.h"
|
||||
#include "FGFDMExec.h"
|
||||
|
|
|
@ -196,13 +196,13 @@ public:
|
|||
/** Gets the throttle command.
|
||||
@param engine engine ID number
|
||||
@return throttle command in percent ( 0 - 100) for the given engine */
|
||||
float GetThrottleCmd(int engine);
|
||||
|
||||
/** Gets the mixture command.
|
||||
@param engine engine ID number
|
||||
@return mixture command in percent ( 0 - 100) for the given engine */
|
||||
inline float GetMixtureCmd(int engine) { return MixtureCmd[engine]; }
|
||||
|
||||
float GetThrottleCmd(int engine);
|
||||
|
||||
/** Gets the mixture command.
|
||||
@param engine engine ID number
|
||||
@return mixture command in percent ( 0 - 100) for the given engine */
|
||||
inline float GetMixtureCmd(int engine) { return MixtureCmd[engine]; }
|
||||
|
||||
/** Gets the pitch trim command.
|
||||
@return pitch trim command in radians */
|
||||
inline float GetPitchTrimCmd(void) { return PTrimCmd; }
|
||||
|
@ -237,12 +237,12 @@ public:
|
|||
/** Gets the throttle position.
|
||||
@param engine engine ID number
|
||||
@return throttle position for the given engine in percent ( 0 - 100)*/
|
||||
float GetThrottlePos(int engine);
|
||||
|
||||
/** Gets the mixture position.
|
||||
@param engine engine ID number
|
||||
@return mixture position for the given engine in percent ( 0 - 100)*/
|
||||
inline float GetMixturePos(int engine) { return MixturePos[engine]; }
|
||||
float GetThrottlePos(int engine);
|
||||
|
||||
/** Gets the mixture position.
|
||||
@param engine engine ID number
|
||||
@return mixture position for the given engine in percent ( 0 - 100)*/
|
||||
inline float GetMixturePos(int engine) { return MixturePos[engine]; }
|
||||
//@}
|
||||
|
||||
/** Retrieves the State object pointer.
|
||||
|
@ -300,11 +300,11 @@ public:
|
|||
@param engine engine ID number
|
||||
@param cmd throttle command in percent (0 - 100)*/
|
||||
void SetThrottleCmd(int engine, float cmd);
|
||||
|
||||
/** Sets the mixture command for the specified engine
|
||||
@param engine engine ID number
|
||||
@param cmd mixture command in percent (0 - 100)*/
|
||||
void SetMixtureCmd(int engine, float cmd);
|
||||
|
||||
/** Sets the mixture command for the specified engine
|
||||
@param engine engine ID number
|
||||
@param cmd mixture command in percent (0 - 100)*/
|
||||
void SetMixtureCmd(int engine, float cmd);
|
||||
//@}
|
||||
|
||||
/// @name Aerosurface position setting
|
||||
|
@ -337,11 +337,11 @@ public:
|
|||
@param engine engine ID number
|
||||
@param cmd throttle setting in percent (0 - 100)*/
|
||||
void SetThrottlePos(int engine, float cmd);
|
||||
|
||||
/** Sets the actual mixture setting for the specified engine
|
||||
@param engine engine ID number
|
||||
@param cmd mixture setting in percent (0 - 100)*/
|
||||
void SetMixturePos(int engine, float cmd);
|
||||
|
||||
/** Sets the actual mixture setting for the specified engine
|
||||
@param engine engine ID number
|
||||
@param cmd mixture setting in percent (0 - 100)*/
|
||||
void SetMixturePos(int engine, float cmd);
|
||||
//@}
|
||||
|
||||
/// @name Landing Gear brakes
|
||||
|
@ -380,8 +380,8 @@ private:
|
|||
float PTrimCmd;
|
||||
vector <float> ThrottleCmd;
|
||||
vector <float> ThrottlePos;
|
||||
vector <float> MixtureCmd;
|
||||
vector <float> MixturePos;
|
||||
vector <float> MixtureCmd;
|
||||
vector <float> MixturePos;
|
||||
float LeftBrake, RightBrake, CenterBrake; // Brake settings
|
||||
|
||||
vector <FGFCSComponent*> Components;
|
||||
|
|
|
@ -102,6 +102,8 @@ short debug_lvl; // This describes to any interested entity the debug level
|
|||
// g) 16: When set various parameters are sanity checked and
|
||||
// a message is printed out when they go out of bounds.
|
||||
|
||||
unsigned int FGFDMExec::FDMctr = 0;
|
||||
|
||||
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
CLASS IMPLEMENTATION
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||||
|
@ -133,6 +135,9 @@ FGFDMExec::FGFDMExec(void)
|
|||
modelLoaded = false;
|
||||
Scripted = false;
|
||||
|
||||
IdFDM = FDMctr;
|
||||
FDMctr++;
|
||||
|
||||
try {
|
||||
char* num = getenv("JSBSIM_DEBUG");
|
||||
if (!num) debug_lvl = 1;
|
||||
|
@ -143,8 +148,8 @@ FGFDMExec::FGFDMExec(void)
|
|||
|
||||
if (debug_lvl > 0) {
|
||||
cout << "\n\n " << highint << underon << "JSBSim Flight Dynamics Model v"
|
||||
<< JSBSIM_VERSION << underoff << normint << endl;
|
||||
cout << halfint << " [cfg file spec v" << NEEDED_CFG_VERSION << "]\n\n";
|
||||
<< JSBSim_version << underoff << normint << endl;
|
||||
cout << halfint << " [cfg file spec v" << needed_cfg_version << "]\n\n";
|
||||
cout << normint << "JSBSim startup beginning ...\n\n";
|
||||
}
|
||||
|
||||
|
|
|
@ -71,26 +71,6 @@ class FGAuxiliary;
|
|||
class FGOutput;
|
||||
class FGInitialCondition;
|
||||
|
||||
struct condition {
|
||||
vector <eParam> TestParam;
|
||||
vector <eParam> SetParam;
|
||||
vector <float> TestValue;
|
||||
vector <float> SetValue;
|
||||
vector <string> Comparison;
|
||||
vector <float> TC;
|
||||
vector <bool> Persistent;
|
||||
vector <eAction> Action;
|
||||
vector <eType> Type;
|
||||
vector <bool> Triggered;
|
||||
vector <float> newValue;
|
||||
vector <float> OriginalValue;
|
||||
vector <float> StartTime;
|
||||
vector <float> EndTime;
|
||||
|
||||
condition() {
|
||||
}
|
||||
};
|
||||
|
||||
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
COMMENTS, REFERENCES, and NOTES [use "class documentation" below for API docs]
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||||
|
@ -299,12 +279,46 @@ public:
|
|||
inline string GetAircraftPath(void) {return AircraftPath;}
|
||||
|
||||
private:
|
||||
enum eAction {
|
||||
FG_RAMP = 1,
|
||||
FG_STEP = 2,
|
||||
FG_EXP = 3
|
||||
};
|
||||
|
||||
enum eType {
|
||||
FG_VALUE = 1,
|
||||
FG_DELTA = 2,
|
||||
FG_BOOL = 3
|
||||
};
|
||||
|
||||
struct condition {
|
||||
vector <eParam> TestParam;
|
||||
vector <eParam> SetParam;
|
||||
vector <float> TestValue;
|
||||
vector <float> SetValue;
|
||||
vector <string> Comparison;
|
||||
vector <float> TC;
|
||||
vector <bool> Persistent;
|
||||
vector <eAction> Action;
|
||||
vector <eType> Type;
|
||||
vector <bool> Triggered;
|
||||
vector <float> newValue;
|
||||
vector <float> OriginalValue;
|
||||
vector <float> StartTime;
|
||||
vector <float> EndTime;
|
||||
|
||||
condition() {
|
||||
}
|
||||
};
|
||||
|
||||
FGModel* FirstModel;
|
||||
|
||||
bool frozen;
|
||||
bool terminate;
|
||||
int Error;
|
||||
int Frame;
|
||||
unsigned int Frame;
|
||||
unsigned int IdFDM;
|
||||
static unsigned int FDMctr;
|
||||
bool modelLoaded;
|
||||
bool Scripted;
|
||||
|
||||
|
|
|
@ -45,7 +45,6 @@ HISTORY
|
|||
INCLUDES
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||||
|
||||
#include "FGDefs.h"
|
||||
#include "FGCoefficient.h"
|
||||
#include "FGFactorGroup.h"
|
||||
#include "FGState.h"
|
||||
|
|
|
@ -45,7 +45,6 @@ INCLUDES
|
|||
#include <vector>
|
||||
#include <string>
|
||||
#include "FGConfigFile.h"
|
||||
#include "FGDefs.h"
|
||||
#include "FGTable.h"
|
||||
#include "FGCoefficient.h"
|
||||
#include "FGAerodynamics.h"
|
||||
|
|
|
@ -46,7 +46,6 @@ and the cg.
|
|||
#include "FGMatrix33.h"
|
||||
#include "FGColumnVector3.h"
|
||||
#include "FGColumnVector4.h"
|
||||
#include "FGDefs.h"
|
||||
#include "FGForce.h"
|
||||
|
||||
static const char *IdSrc = "$Id$";
|
||||
|
@ -89,9 +88,9 @@ FGColumnVector3& FGForce::GetBodyForces(void) {
|
|||
|
||||
//find the distance from this vector's location to the cg
|
||||
//needs to be done like this to convert from structural to body coords
|
||||
vDXYZ(1) = -(vXYZn(1) - fdmex->GetMassBalance()->GetXYZcg(1))*INCHTOFT;
|
||||
vDXYZ(2) = (vXYZn(2) - fdmex->GetMassBalance()->GetXYZcg(2))*INCHTOFT; //cg and rp values are in inches
|
||||
vDXYZ(3) = -(vXYZn(3) - fdmex->GetMassBalance()->GetXYZcg(3))*INCHTOFT;
|
||||
vDXYZ(1) = -(vXYZn(1) - fdmex->GetMassBalance()->GetXYZcg(1))*inchtoft;
|
||||
vDXYZ(2) = (vXYZn(2) - fdmex->GetMassBalance()->GetXYZcg(2))*inchtoft; //cg and rp values are in inches
|
||||
vDXYZ(3) = -(vXYZn(3) - fdmex->GetMassBalance()->GetXYZcg(3))*inchtoft;
|
||||
|
||||
vM = vMn + vDXYZ*vFb;
|
||||
|
||||
|
|
|
@ -56,6 +56,13 @@ FGInertial::FGInertial(FGFDMExec* fgex) : FGModel(fgex),
|
|||
Name = "FGInertial";
|
||||
|
||||
vRadius.InitMatrix();
|
||||
|
||||
// Defaults
|
||||
RotationRate = 0.00007272205217;
|
||||
GM = 14.06252720E15;
|
||||
RadiusReference = 20925650.00;
|
||||
gAccelReference = GM/(RadiusReference*RadiusReference);
|
||||
gAccel = GM/(RadiusReference*RadiusReference);
|
||||
|
||||
if (debug_lvl & 2) cout << "Instantiated: FGInertial" << endl;
|
||||
}
|
||||
|
@ -75,23 +82,25 @@ bool FGInertial::Run(void)
|
|||
|
||||
if (!FGModel::Run()) {
|
||||
|
||||
gAccel = GM / (Position->GetRadius()*Position->GetRadius());
|
||||
|
||||
stht = sin(Rotation->GetEuler(eTht));
|
||||
ctht = cos(Rotation->GetEuler(eTht));
|
||||
sphi = sin(Rotation->GetEuler(ePhi));
|
||||
cphi = cos(Rotation->GetEuler(ePhi));
|
||||
|
||||
vGravity(eX) = vForces(eX) = -GRAVITY*stht;
|
||||
vGravity(eY) = vForces(eY) = GRAVITY*sphi*ctht;
|
||||
vGravity(eZ) = vForces(eZ) = GRAVITY*cphi*ctht;
|
||||
vGravity(eX) = vForces(eX) = -gravity()*stht;
|
||||
vGravity(eY) = vForces(eY) = gravity()*sphi*ctht;
|
||||
vGravity(eZ) = vForces(eZ) = gravity()*cphi*ctht;
|
||||
|
||||
// The following equation for vOmegaLocal terms shows the angular velocity
|
||||
// calculation _for_the_local_frame_ given the earth's rotation (first set)
|
||||
// at the current latitude, and also the component due to the aircraft
|
||||
// motion over the curved surface of the earth (second set).
|
||||
|
||||
vOmegaLocal(eX) = OMEGA_EARTH * cos(Position->GetLatitude());
|
||||
vOmegaLocal(eX) = omega() * cos(Position->GetLatitude());
|
||||
vOmegaLocal(eY) = 0.0;
|
||||
vOmegaLocal(eZ) = OMEGA_EARTH * -sin(Position->GetLatitude());
|
||||
vOmegaLocal(eZ) = omega() * -sin(Position->GetLatitude());
|
||||
|
||||
vOmegaLocal(eX) += Position->GetVe() / Position->GetRadius();
|
||||
vOmegaLocal(eY) += -Position->GetVn() / Position->GetRadius();
|
||||
|
|
|
@ -77,6 +77,10 @@ public:
|
|||
FGColumnVector3& GetGravity(void) {return vGravity;}
|
||||
float GetForces(int n) {return vForces(n);}
|
||||
bool LoadInertial(FGConfigFile* AC_cfg);
|
||||
double SLgravity(void) {return gAccelReference;}
|
||||
double gravity(void) {return gAccel;}
|
||||
double omega(void) {return RotationRate;}
|
||||
double RefRadius(void) {return RadiusReference;}
|
||||
|
||||
private:
|
||||
void Debug(void);
|
||||
|
@ -84,6 +88,11 @@ private:
|
|||
FGColumnVector3 vForces;
|
||||
FGColumnVector3 vRadius;
|
||||
FGColumnVector3 vGravity;
|
||||
double gAccel;
|
||||
double gAccelReference;
|
||||
double RadiusReference;
|
||||
double RotationRate;
|
||||
double GM;
|
||||
};
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
|
|
@ -53,7 +53,6 @@ INCLUDES
|
|||
#include "FGPosition.h"
|
||||
#include "FGAuxiliary.h"
|
||||
#include "FGOutput.h"
|
||||
#include "FGDefs.h"
|
||||
#include "FGConfigFile.h"
|
||||
|
||||
static const char *IdSrc = "$Id$";
|
||||
|
@ -61,8 +60,8 @@ static const char *IdHdr = ID_INITIALCONDITION;
|
|||
|
||||
//******************************************************************************
|
||||
|
||||
FGInitialCondition::FGInitialCondition(FGFDMExec *FDMExec){
|
||||
|
||||
FGInitialCondition::FGInitialCondition(FGFDMExec *FDMExec)
|
||||
{
|
||||
vt=vc=ve=vg=0;
|
||||
mach=0;
|
||||
alpha=beta=gamma=0;
|
||||
|
@ -77,10 +76,9 @@ FGInitialCondition::FGInitialCondition(FGFDMExec *FDMExec){
|
|||
wdir=wmag=0;
|
||||
lastSpeedSet=setvt;
|
||||
lastWindSet=setwned;
|
||||
sea_level_radius = EARTHRAD;
|
||||
radius_to_vehicle = EARTHRAD;
|
||||
sea_level_radius = FDMExec->GetInertial()->RefRadius();
|
||||
radius_to_vehicle = FDMExec->GetInertial()->RefRadius();
|
||||
terrain_altitude = 0;
|
||||
|
||||
|
||||
salpha=sbeta=stheta=sphi=spsi=sgamma=0;
|
||||
calpha=cbeta=ctheta=cphi=cpsi=cgamma=1;
|
||||
|
@ -107,13 +105,13 @@ FGInitialCondition::~FGInitialCondition()
|
|||
|
||||
void FGInitialCondition::SetVcalibratedKtsIC(float tt) {
|
||||
|
||||
if(getMachFromVcas(&mach,tt*jsbKTSTOFPS)) {
|
||||
if(getMachFromVcas(&mach,tt*ktstofps)) {
|
||||
//cout << "Mach: " << mach << endl;
|
||||
lastSpeedSet=setvc;
|
||||
vc=tt*jsbKTSTOFPS;
|
||||
vc=tt*ktstofps;
|
||||
vt=mach*fdmex->GetAtmosphere()->GetSoundSpeed();
|
||||
ve=vt*sqrt(fdmex->GetAtmosphere()->GetDensityRatio());
|
||||
//cout << "Vt: " << vt*jsbFPSTOKTS << " Vc: " << vc*jsbFPSTOKTS << endl;
|
||||
//cout << "Vt: " << vt*fpstokts << " Vc: " << vc*fpstokts << endl;
|
||||
}
|
||||
else {
|
||||
cout << "Failed to get Mach number for given Vc and altitude, Vc unchanged." << endl;
|
||||
|
@ -124,7 +122,7 @@ void FGInitialCondition::SetVcalibratedKtsIC(float tt) {
|
|||
//******************************************************************************
|
||||
|
||||
void FGInitialCondition::SetVequivalentKtsIC(float tt) {
|
||||
ve=tt*jsbKTSTOFPS;
|
||||
ve=tt*ktstofps;
|
||||
lastSpeedSet=setve;
|
||||
vt=ve*1/sqrt(fdmex->GetAtmosphere()->GetDensityRatio());
|
||||
mach=vt/fdmex->GetAtmosphere()->GetSoundSpeed();
|
||||
|
@ -170,7 +168,7 @@ void FGInitialCondition::SetMachIC(float tt) {
|
|||
vt=mach*fdmex->GetAtmosphere()->GetSoundSpeed();
|
||||
vc=calcVcas(mach);
|
||||
ve=vt*sqrt(fdmex->GetAtmosphere()->GetDensityRatio());
|
||||
//cout << "Vt: " << vt*jsbFPSTOKTS << " Vc: " << vc*jsbFPSTOKTS << endl;
|
||||
//cout << "Vt: " << vt*fpstokts << " Vc: " << vc*fpstokts << endl;
|
||||
}
|
||||
|
||||
//******************************************************************************
|
||||
|
@ -306,7 +304,7 @@ void FGInitialCondition::SetWindNEDFpsIC(float wN, float wE, float wD ) {
|
|||
|
||||
// positive from left
|
||||
void FGInitialCondition::SetHeadWindKtsIC(float head){
|
||||
whead=head*KTSTOFPS;
|
||||
whead=head*ktstofps;
|
||||
lastWindSet=setwhc;
|
||||
calcWindUVW();
|
||||
if(lastSpeedSet == setvg)
|
||||
|
@ -317,7 +315,7 @@ void FGInitialCondition::SetHeadWindKtsIC(float head){
|
|||
//******************************************************************************
|
||||
|
||||
void FGInitialCondition::SetCrossWindKtsIC(float cross){
|
||||
wcross=cross*KTSTOFPS;
|
||||
wcross=cross*ktstofps;
|
||||
lastWindSet=setwhc;
|
||||
calcWindUVW();
|
||||
if(lastSpeedSet == setvg)
|
||||
|
@ -337,7 +335,7 @@ void FGInitialCondition::SetWindDownKtsIC(float wD) {
|
|||
//******************************************************************************
|
||||
|
||||
void FGInitialCondition::SetWindMagKtsIC(float mag) {
|
||||
wmag=mag*KTSTOFPS;
|
||||
wmag=mag*ktstofps;
|
||||
lastWindSet=setwmd;
|
||||
calcWindUVW();
|
||||
if(lastSpeedSet == setvg)
|
||||
|
@ -347,7 +345,7 @@ void FGInitialCondition::SetWindMagKtsIC(float mag) {
|
|||
//******************************************************************************
|
||||
|
||||
void FGInitialCondition::SetWindDirDegIC(float dir) {
|
||||
wdir=dir*DEGTORAD;
|
||||
wdir=dir*degtorad;
|
||||
lastWindSet=setwmd;
|
||||
calcWindUVW();
|
||||
if(lastSpeedSet == setvg)
|
||||
|
@ -401,13 +399,13 @@ void FGInitialCondition::SetAltitudeFtIC(float tt) {
|
|||
case setned:
|
||||
case setuvw:
|
||||
case setvt:
|
||||
SetVtrueKtsIC(vt*jsbFPSTOKTS);
|
||||
SetVtrueKtsIC(vt*fpstokts);
|
||||
break;
|
||||
case setvc:
|
||||
SetVcalibratedKtsIC(vc*jsbFPSTOKTS);
|
||||
SetVcalibratedKtsIC(vc*fpstokts);
|
||||
break;
|
||||
case setve:
|
||||
SetVequivalentKtsIC(ve*jsbFPSTOKTS);
|
||||
SetVequivalentKtsIC(ve*fpstokts);
|
||||
break;
|
||||
case setmach:
|
||||
SetMachIC(mach);
|
||||
|
@ -601,7 +599,7 @@ float FGInitialCondition::calcVcas(float Mach) {
|
|||
|
||||
A = pow(((pt-p)/psl+1),0.28571);
|
||||
vcas = sqrt(7*psl/rhosl*(A-1));
|
||||
//cout << "calcVcas: vcas= " << vcas*jsbFPSTOKTS << " mach= " << Mach << " pressure: " << pt << endl;
|
||||
//cout << "calcVcas: vcas= " << vcas*fpstokts << " mach= " << Mach << " pressure: " << pt << endl;
|
||||
return vcas;
|
||||
}
|
||||
|
||||
|
@ -691,7 +689,7 @@ bool FGInitialCondition::solve(float *y,float x)
|
|||
*y=x2;
|
||||
}
|
||||
|
||||
//cout << "Success= " << success << " Vcas: " << vcas*jsbFPSTOKTS << " Mach: " << x2 << endl;
|
||||
//cout << "Success= " << success << " Vcas: " << vcas*fpstokts << " Mach: " << x2 << endl;
|
||||
return success;
|
||||
}
|
||||
|
||||
|
@ -699,7 +697,7 @@ bool FGInitialCondition::solve(float *y,float x)
|
|||
|
||||
float FGInitialCondition::GetWindDirDegIC(void) {
|
||||
if(weast != 0.0)
|
||||
return atan2(weast,wnorth)*RADTODEG;
|
||||
return atan2(weast,wnorth)*radtodeg;
|
||||
else if(wnorth > 0)
|
||||
return 0.0;
|
||||
else
|
||||
|
|
|
@ -59,8 +59,6 @@ DEFINITIONS
|
|||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||||
|
||||
#define ID_INITIALCONDITION "$Id$"
|
||||
#define jsbFPSTOKTS 0.5924838
|
||||
#define jsbKTSTOFPS 1.6878099
|
||||
|
||||
typedef enum { setvt, setvc, setve, setmach, setuvw, setned, setvg } speedset;
|
||||
typedef enum { setwned, setwmd, setwhc } windset;
|
||||
|
@ -144,19 +142,19 @@ public:
|
|||
|
||||
void SetVcalibratedKtsIC(float tt);
|
||||
void SetVequivalentKtsIC(float tt);
|
||||
inline void SetVtrueKtsIC(float tt) { SetVtrueFpsIC(tt*jsbKTSTOFPS); }
|
||||
inline void SetVgroundKtsIC(float tt) { SetVgroundFpsIC(tt*jsbKTSTOFPS); }
|
||||
inline void SetVtrueKtsIC(float tt) { SetVtrueFpsIC(tt*ktstofps); }
|
||||
inline void SetVgroundKtsIC(float tt) { SetVgroundFpsIC(tt*ktstofps); }
|
||||
void SetMachIC(float tt);
|
||||
|
||||
inline void SetAlphaDegIC(float tt) { SetAlphaRadIC(tt*DEGTORAD); }
|
||||
inline void SetBetaDegIC(float tt) { SetBetaRadIC(tt*DEGTORAD);}
|
||||
inline void SetAlphaDegIC(float tt) { SetAlphaRadIC(tt*degtorad); }
|
||||
inline void SetBetaDegIC(float tt) { SetBetaRadIC(tt*degtorad);}
|
||||
|
||||
inline void SetPitchAngleDegIC(float tt) { SetPitchAngleRadIC(tt*DEGTORAD); }
|
||||
inline void SetRollAngleDegIC(float tt) { SetRollAngleRadIC(tt*DEGTORAD);}
|
||||
inline void SetTrueHeadingDegIC(float tt){ SetTrueHeadingRadIC(tt*DEGTORAD); }
|
||||
inline void SetPitchAngleDegIC(float tt) { SetPitchAngleRadIC(tt*degtorad); }
|
||||
inline void SetRollAngleDegIC(float tt) { SetRollAngleRadIC(tt*degtorad);}
|
||||
inline void SetTrueHeadingDegIC(float tt){ SetTrueHeadingRadIC(tt*degtorad); }
|
||||
|
||||
void SetClimbRateFpmIC(float tt);
|
||||
inline void SetFlightPathAngleDegIC(float tt) { SetFlightPathAngleRadIC(tt*DEGTORAD); }
|
||||
inline void SetFlightPathAngleDegIC(float tt) { SetFlightPathAngleRadIC(tt*degtorad); }
|
||||
|
||||
void SetAltitudeFtIC(float tt);
|
||||
void SetAltitudeAGLFtIC(float tt);
|
||||
|
@ -164,28 +162,28 @@ public:
|
|||
void SetSeaLevelRadiusFtIC(double tt);
|
||||
void SetTerrainAltitudeFtIC(double tt);
|
||||
|
||||
inline void SetLatitudeDegIC(float tt) { latitude=tt*DEGTORAD; }
|
||||
inline void SetLongitudeDegIC(float tt) { longitude=tt*DEGTORAD; }
|
||||
inline void SetLatitudeDegIC(float tt) { latitude=tt*degtorad; }
|
||||
inline void SetLongitudeDegIC(float tt) { longitude=tt*degtorad; }
|
||||
|
||||
|
||||
inline float GetVcalibratedKtsIC(void) { return vc*jsbFPSTOKTS; }
|
||||
inline float GetVequivalentKtsIC(void) { return ve*jsbFPSTOKTS; }
|
||||
inline float GetVgroundKtsIC(void) { return vg*jsbFPSTOKTS; }
|
||||
inline float GetVtrueKtsIC(void) { return vt*jsbFPSTOKTS; }
|
||||
inline float GetVcalibratedKtsIC(void) { return vc*fpstokts; }
|
||||
inline float GetVequivalentKtsIC(void) { return ve*fpstokts; }
|
||||
inline float GetVgroundKtsIC(void) { return vg*fpstokts; }
|
||||
inline float GetVtrueKtsIC(void) { return vt*fpstokts; }
|
||||
inline float GetMachIC(void) { return mach; }
|
||||
|
||||
inline float GetClimbRateFpmIC(void) { return hdot*60; }
|
||||
inline float GetFlightPathAngleDegIC(void) { return gamma*RADTODEG; }
|
||||
inline float GetFlightPathAngleDegIC(void) { return gamma*radtodeg; }
|
||||
|
||||
inline float GetAlphaDegIC(void) { return alpha*RADTODEG; }
|
||||
inline float GetBetaDegIC(void) { return beta*RADTODEG; }
|
||||
inline float GetAlphaDegIC(void) { return alpha*radtodeg; }
|
||||
inline float GetBetaDegIC(void) { return beta*radtodeg; }
|
||||
|
||||
inline float GetPitchAngleDegIC(void) { return theta*RADTODEG; }
|
||||
inline float GetRollAngleDegIC(void) { return phi*RADTODEG; }
|
||||
inline float GetHeadingDegIC(void) { return psi*RADTODEG; }
|
||||
inline float GetPitchAngleDegIC(void) { return theta*radtodeg; }
|
||||
inline float GetRollAngleDegIC(void) { return phi*radtodeg; }
|
||||
inline float GetHeadingDegIC(void) { return psi*radtodeg; }
|
||||
|
||||
inline float GetLatitudeDegIC(void) { return latitude*RADTODEG; }
|
||||
inline float GetLongitudeDegIC(void) { return longitude*RADTODEG; }
|
||||
inline float GetLatitudeDegIC(void) { return latitude*radtodeg; }
|
||||
inline float GetLongitudeDegIC(void) { return longitude*radtodeg; }
|
||||
|
||||
inline float GetAltitudeFtIC(void) { return altitude; }
|
||||
inline float GetAltitudeAGLFtIC(void) { return altitude - terrain_altitude; }
|
||||
|
|
|
@ -56,5 +56,111 @@ char FGJSBBase::fgred[6] = {27, '[', '3', '1', 'm', '\0' };
|
|||
char FGJSBBase::fggreen[6] = {27, '[', '3', '2', 'm', '\0' };
|
||||
char FGJSBBase::fgdef[6] = {27, '[', '3', '9', 'm', '\0' };
|
||||
|
||||
const double FGJSBBase::radtodeg = 57.29578;
|
||||
const double FGJSBBase::degtorad = 1.745329E-2;
|
||||
const double FGJSBBase::hptoftlbssec = 550.0;
|
||||
const double FGJSBBase::fpstokts = 0.592484;
|
||||
const double FGJSBBase::ktstofps = 1.68781;
|
||||
const double FGJSBBase::inchtoft = 0.08333333;
|
||||
const double FGJSBBase::Reng = 1716.0;
|
||||
const double FGJSBBase::SHRatio = 1.40;
|
||||
const string FGJSBBase::needed_cfg_version = "1.55";
|
||||
const string FGJSBBase::JSBSim_version = "0.9.1";
|
||||
|
||||
queue <struct FGJSBBase::Message*> FGJSBBase::Messages;
|
||||
struct FGJSBBase::Message FGJSBBase::localMsg;
|
||||
unsigned int FGJSBBase::messageId = 0;
|
||||
|
||||
short FGJSBBase::debug_lvl = 0;
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
FGJSBBase::FGJSBBase()
|
||||
{
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
struct FGJSBBase::Message* FGJSBBase::PutMessage(struct Message* msg)
|
||||
{
|
||||
Messages.push(msg);
|
||||
return msg;
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
struct FGJSBBase::Message* FGJSBBase::PutMessage(string text)
|
||||
{
|
||||
struct Message *msg = new Message();
|
||||
msg->text = text;
|
||||
msg->messageId = messageId++;
|
||||
msg->subsystem = "FDM";
|
||||
msg->type = Message::eText;
|
||||
Messages.push(msg);
|
||||
return msg;
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
struct FGJSBBase::Message* FGJSBBase::PutMessage(string text, bool bVal)
|
||||
{
|
||||
struct Message *msg = new Message();
|
||||
msg->text = text;
|
||||
msg->messageId = messageId++;
|
||||
msg->subsystem = "FDM";
|
||||
msg->type = Message::eBool;
|
||||
msg->bVal = bVal;
|
||||
Messages.push(msg);
|
||||
return msg;
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
struct FGJSBBase::Message* FGJSBBase::PutMessage(string text, int iVal)
|
||||
{
|
||||
struct Message *msg = new Message();
|
||||
msg->text = text;
|
||||
msg->messageId = messageId++;
|
||||
msg->subsystem = "FDM";
|
||||
msg->type = Message::eInteger;
|
||||
msg->bVal = iVal;
|
||||
Messages.push(msg);
|
||||
return msg;
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
struct FGJSBBase::Message* FGJSBBase::PutMessage(string text, double dVal)
|
||||
{
|
||||
struct Message *msg = new Message();
|
||||
msg->text = text;
|
||||
msg->messageId = messageId++;
|
||||
msg->subsystem = "FDM";
|
||||
msg->type = Message::eDouble;
|
||||
msg->bVal = dVal;
|
||||
Messages.push(msg);
|
||||
return msg;
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
struct FGJSBBase::Message* FGJSBBase::ReadMessage(void)
|
||||
{
|
||||
if (!Messages.empty()) return Messages.front();
|
||||
else return NULL;
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
struct FGJSBBase::Message* FGJSBBase::ProcessMessage(void)
|
||||
{
|
||||
if (!Messages.empty())
|
||||
localMsg = *(Messages.front());
|
||||
else
|
||||
return NULL;
|
||||
Messages.pop();
|
||||
return &localMsg;
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
|
|
|
@ -41,11 +41,18 @@ INCLUDES
|
|||
#ifdef FGFS
|
||||
# include <simgear/compiler.h>
|
||||
# include <math.h>
|
||||
# include <queue>
|
||||
# include STL_STRING
|
||||
SG_USING_STD(queue);
|
||||
#else
|
||||
# if defined(sgi) && !defined(__GNUC__)
|
||||
# include <math.h>
|
||||
# include <queue.h>
|
||||
# include <string.h>
|
||||
# else
|
||||
# include <cmath>
|
||||
# include <queue>
|
||||
# include <string>
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
@ -64,6 +71,66 @@ DEFINITIONS
|
|||
FORWARD DECLARATIONS
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||||
|
||||
enum eParam {
|
||||
FG_UNDEF = 0,
|
||||
FG_TIME,
|
||||
FG_QBAR,
|
||||
FG_WINGAREA,
|
||||
FG_WINGSPAN,
|
||||
FG_CBAR,
|
||||
FG_ALPHA,
|
||||
FG_ALPHADOT,
|
||||
FG_BETA,
|
||||
FG_ABETA,
|
||||
FG_BETADOT,
|
||||
FG_PHI,
|
||||
FG_THT,
|
||||
FG_PSI,
|
||||
FG_PITCHRATE,
|
||||
FG_ROLLRATE,
|
||||
FG_YAWRATE,
|
||||
FG_CL_SQRD,
|
||||
FG_MACH,
|
||||
FG_ALTITUDE,
|
||||
FG_BI2VEL,
|
||||
FG_CI2VEL,
|
||||
FG_ELEVATOR_POS,
|
||||
FG_AILERON_POS,
|
||||
FG_RUDDER_POS,
|
||||
FG_SPDBRAKE_POS,
|
||||
FG_SPOILERS_POS,
|
||||
FG_FLAPS_POS,
|
||||
FG_ELEVATOR_CMD,
|
||||
FG_AILERON_CMD,
|
||||
FG_RUDDER_CMD,
|
||||
FG_SPDBRAKE_CMD,
|
||||
FG_SPOILERS_CMD,
|
||||
FG_FLAPS_CMD,
|
||||
FG_THROTTLE_CMD,
|
||||
FG_THROTTLE_POS,
|
||||
FG_MIXTURE_CMD,
|
||||
FG_MIXTURE_POS,
|
||||
FG_MAGNETO_CMD,
|
||||
FG_STARTER_CMD,
|
||||
FG_ACTIVE_ENGINE,
|
||||
FG_HOVERB,
|
||||
FG_PITCH_TRIM_CMD,
|
||||
FG_YAW_TRIM_CMD,
|
||||
FG_ROLL_TRIM_CMD,
|
||||
FG_LEFT_BRAKE_CMD,
|
||||
FG_CENTER_BRAKE_CMD,
|
||||
FG_RIGHT_BRAKE_CMD,
|
||||
FG_SET_LOGGING,
|
||||
FG_ALPHAH,
|
||||
FG_ALPHAW,
|
||||
FG_LBARH, //normalized horizontal tail arm
|
||||
FG_LBARV, //normalized vertical tail arm
|
||||
FG_HTAILAREA,
|
||||
FG_VTAILAREA,
|
||||
FG_VBARH, //horizontal tail volume
|
||||
FG_VBARV //vertical tail volume
|
||||
};
|
||||
|
||||
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
COMMENTS, REFERENCES, and NOTES [use "class documentation" below for API docs]
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||||
|
@ -84,37 +151,123 @@ CLASS DECLARATION
|
|||
class FGJSBBase {
|
||||
public:
|
||||
/// Constructor for FGJSBBase.
|
||||
FGJSBBase() {};
|
||||
FGJSBBase();
|
||||
|
||||
/// Destructor for FGJSBBase
|
||||
/// Destructor for FGJSBBase.
|
||||
virtual ~FGJSBBase() {};
|
||||
|
||||
enum {eL = 1, eM, eN };
|
||||
enum {eP = 1, eQ, eR };
|
||||
enum {eU = 1, eV, eW };
|
||||
enum {eX = 1, eY, eZ };
|
||||
enum {ePhi = 1, eTht, ePsi };
|
||||
enum {eDrag = 1, eSide, eLift };
|
||||
enum {eRoll = 1, ePitch, eYaw };
|
||||
enum {eNorth = 1, eEast, eDown };
|
||||
/// JSBSim Message structure
|
||||
struct Message {
|
||||
unsigned int fdmId;
|
||||
unsigned int messageId;
|
||||
string text;
|
||||
string subsystem;
|
||||
enum mType {eText, eInteger, eDouble, eBool} type;
|
||||
bool bVal;
|
||||
int iVal;
|
||||
double dVal;
|
||||
};
|
||||
|
||||
///@name JSBSim Enums.
|
||||
//@{
|
||||
/// Moments L, M, N
|
||||
enum {eL = 1, eM, eN };
|
||||
/// Rates P, Q, R
|
||||
enum {eP = 1, eQ, eR };
|
||||
/// Velocities U, V, W
|
||||
enum {eU = 1, eV, eW };
|
||||
/// Positions X, Y, Z
|
||||
enum {eX = 1, eY, eZ };
|
||||
/// Euler angles Phi, Theta, Psi
|
||||
enum {ePhi = 1, eTht, ePsi };
|
||||
/// Stability axis forces, Drag, Side force, Lift
|
||||
enum {eDrag = 1, eSide, eLift };
|
||||
/// Local frame orientation Roll, Pitch, Yaw
|
||||
enum {eRoll = 1, ePitch, eYaw };
|
||||
/// Local frame position North, East, Down
|
||||
enum {eNorth = 1, eEast, eDown };
|
||||
//@}
|
||||
|
||||
///@name JSBSim console output highlighting terms.
|
||||
//@{
|
||||
/// highlights text
|
||||
static char highint[5];
|
||||
/// low intensity text
|
||||
static char halfint[5];
|
||||
/// normal intensity text
|
||||
static char normint[6];
|
||||
/// resets text properties
|
||||
static char reset[5];
|
||||
/// underlines text
|
||||
static char underon[5];
|
||||
/// underline off
|
||||
static char underoff[6];
|
||||
/// blue text
|
||||
static char fgblue[6];
|
||||
/// cyan text
|
||||
static char fgcyan[6];
|
||||
/// red text
|
||||
static char fgred[6];
|
||||
/// green text
|
||||
static char fggreen[6];
|
||||
/// default text
|
||||
static char fgdef[6];
|
||||
//@}
|
||||
|
||||
///@name JSBSim Messaging functions
|
||||
//@{
|
||||
/** Places a Message structure on the Message queue.
|
||||
@param msg pointer to a Message structure
|
||||
@return pointer to a Message structure */
|
||||
struct Message* PutMessage(struct Message* msg);
|
||||
/** Creates a message with the given text and places it on the queue.
|
||||
@param text message text
|
||||
@return pointer to a Message structure */
|
||||
struct Message* PutMessage(string text);
|
||||
/** Creates a message with the given text and boolean value and places it on the queue.
|
||||
@param text message text
|
||||
@param bVal boolean value associated with the message
|
||||
@return pointer to a Message structure */
|
||||
struct Message* PutMessage(string text, bool bVal);
|
||||
/** Creates a message with the given text and integer value and places it on the queue.
|
||||
@param text message text
|
||||
@param iVal integer value associated with the message
|
||||
@return pointer to a Message structure */
|
||||
struct Message* PutMessage(string text, int iVal);
|
||||
/** Creates a message with the given text and double value and places it on the queue.
|
||||
@param text message text
|
||||
@param dVal double value associated with the message
|
||||
@return pointer to a Message structure */
|
||||
struct Message* PutMessage(string text, double dVal);
|
||||
/** Reads the message on the queue (but does not delete it).
|
||||
@return pointer to a Message structure (or NULL if no mesage) */
|
||||
struct Message* ReadMessage(void);
|
||||
/** Reads the message on the queue and removes it from the queue.
|
||||
@return pointer to a Message structure (or NULL if no mesage) */
|
||||
struct Message* ProcessMessage(void);
|
||||
//@}
|
||||
|
||||
protected:
|
||||
static struct Message localMsg;
|
||||
|
||||
static queue <struct Message*> Messages;
|
||||
|
||||
virtual void Debug(void) {};
|
||||
|
||||
static short debug_lvl;
|
||||
static int frame;
|
||||
static unsigned int messageId;
|
||||
|
||||
static const double radtodeg;
|
||||
static const double degtorad;
|
||||
static const double hptoftlbssec;
|
||||
static const double fpstokts;
|
||||
static const double ktstofps;
|
||||
static const double inchtoft;
|
||||
static const double Reng; // Specific Gas Constant,ft^2/(sec^2*R)
|
||||
static const double SHRatio;
|
||||
static const string needed_cfg_version;
|
||||
static const string JSBSim_version;
|
||||
};
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
|
|
@ -306,7 +306,7 @@ FGColumnVector3& FGLGear::Force(void)
|
|||
if (RollingWhlVel == 0.0 && SideWhlVel == 0.0) {
|
||||
WheelSlip = 0.0;
|
||||
} else {
|
||||
WheelSlip = RADTODEG*atan2(SideWhlVel, RollingWhlVel);
|
||||
WheelSlip = radtodeg*atan2(SideWhlVel, RollingWhlVel);
|
||||
}
|
||||
|
||||
// The following code normalizes the wheel velocity vector, reverses it, and zeroes out
|
||||
|
|
|
@ -70,7 +70,7 @@ bool FGMassBalance::Run(void)
|
|||
|
||||
Weight = EmptyWeight + Propulsion->GetTanksWeight();
|
||||
|
||||
Mass = Weight / GRAVITY;
|
||||
Mass = Weight / Inertial->gravity();
|
||||
|
||||
// Calculate new CG here.
|
||||
|
||||
|
|
|
@ -38,7 +38,6 @@ SENTRY
|
|||
INCLUDES
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||||
|
||||
#include "FGDefs.h"
|
||||
#include "FGJSBBase.h"
|
||||
|
||||
#ifdef FGFS
|
||||
|
|
|
@ -38,7 +38,6 @@ HISTORY
|
|||
INCLUDES
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||||
|
||||
#include "FGDefs.h"
|
||||
#include "FGPiston.h"
|
||||
#include "FGPropulsion.h"
|
||||
|
||||
|
@ -194,7 +193,7 @@ float FGPiston::Calculate(float PowerRequired)
|
|||
HP = 0;
|
||||
}
|
||||
|
||||
PowerAvailable = (HP * HPTOFTLBSSEC) - PowerRequired;
|
||||
PowerAvailable = (HP * hptoftlbssec) - PowerRequired;
|
||||
return PowerAvailable;
|
||||
}
|
||||
|
||||
|
|
|
@ -105,14 +105,6 @@ FGPosition::FGPosition(FGFDMExec* fdmex) : FGModel(fdmex),
|
|||
lastLongitudeDot = lastLatitudeDot = lastRadiusDot = 0.0;
|
||||
Longitude = Latitude = 0.0;
|
||||
gamma = Vt = Vground = 0.0;
|
||||
h = 3.0; // Est. height of aircraft cg off runway
|
||||
SeaLevelRadius = EARTHRAD; // For initialization ONLY
|
||||
Radius = SeaLevelRadius + h;
|
||||
RunwayRadius = SeaLevelRadius;
|
||||
DistanceAGL = Radius - RunwayRadius; // Geocentric
|
||||
vRunwayNormal(3) = -1.0; // Initialized for standalone mode
|
||||
b =1;
|
||||
|
||||
|
||||
if (debug_lvl & 2) cout << "Instantiated: " << Name << endl;
|
||||
}
|
||||
|
@ -124,16 +116,32 @@ FGPosition::~FGPosition()
|
|||
if (debug_lvl & 2) cout << "Destroyed: FGPosition" << endl;
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
bool FGPosition::InitModel(void)
|
||||
{
|
||||
FGModel::InitModel();
|
||||
|
||||
h = 3.0; // Est. height of aircraft cg off runway
|
||||
SeaLevelRadius = Inertial->RefRadius(); // For initialization ONLY
|
||||
Radius = SeaLevelRadius + h;
|
||||
RunwayRadius = SeaLevelRadius;
|
||||
DistanceAGL = Radius - RunwayRadius; // Geocentric
|
||||
vRunwayNormal(3) = -1.0; // Initialized for standalone mode
|
||||
b = 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
/*
|
||||
Purpose: Called on a schedule to perform Positioning algorithms
|
||||
Notes: [TP] Make sure that -Vt <= hdot <= Vt, which, of course, should always
|
||||
be the case
|
||||
[JB] Run in standalone mode, SeaLevelRadius will be EARTHRAD. In FGFS,
|
||||
SeaLevelRadius is stuffed from FGJSBSim in JSBSim.cxx each pass.
|
||||
[JB] Run in standalone mode, SeaLevelRadius will be reference radius.
|
||||
In FGFS, SeaLevelRadius is stuffed from FGJSBSim in JSBSim.cxx each pass.
|
||||
*/
|
||||
|
||||
bool FGPosition:: Run(void) {
|
||||
bool FGPosition::Run(void) {
|
||||
double cosLat;
|
||||
double hdot_Vt;
|
||||
|
||||
|
|
|
@ -78,6 +78,8 @@ public:
|
|||
/// Destructor
|
||||
~FGPosition();
|
||||
|
||||
bool InitModel(void);
|
||||
|
||||
/** Runs the Position model; called by the Executive
|
||||
@see JSBSim.cpp documentation
|
||||
@return false if no error */
|
||||
|
|
|
@ -472,7 +472,7 @@ float FGPropulsion::GetTanksIxx(const FGColumnVector3& vXYZcg)
|
|||
float I = 0.0;
|
||||
iTank = Tanks.begin();
|
||||
while (iTank < Tanks.end()) {
|
||||
I += ((*iTank)->GetX() - vXYZcg(eX))*((*iTank)->GetX() - vXYZcg(eX)) * (*iTank)->GetContents()/(144.0*GRAVITY);
|
||||
I += ((*iTank)->GetX() - vXYZcg(eX))*((*iTank)->GetX() - vXYZcg(eX)) * (*iTank)->GetContents()/(144.0*Inertial->gravity());
|
||||
iTank++;
|
||||
}
|
||||
return I;
|
||||
|
@ -485,7 +485,7 @@ float FGPropulsion::GetTanksIyy(const FGColumnVector3& vXYZcg)
|
|||
float I = 0.0;
|
||||
iTank = Tanks.begin();
|
||||
while (iTank < Tanks.end()) {
|
||||
I += ((*iTank)->GetY() - vXYZcg(eY))*((*iTank)->GetY() - vXYZcg(eY)) * (*iTank)->GetContents()/(144.0*GRAVITY);
|
||||
I += ((*iTank)->GetY() - vXYZcg(eY))*((*iTank)->GetY() - vXYZcg(eY)) * (*iTank)->GetContents()/(144.0*Inertial->gravity());
|
||||
iTank++;
|
||||
}
|
||||
return I;
|
||||
|
@ -498,7 +498,7 @@ float FGPropulsion::GetTanksIzz(const FGColumnVector3& vXYZcg)
|
|||
float I = 0.0;
|
||||
iTank = Tanks.begin();
|
||||
while (iTank < Tanks.end()) {
|
||||
I += ((*iTank)->GetZ() - vXYZcg(eZ))*((*iTank)->GetZ() - vXYZcg(eZ)) * (*iTank)->GetContents()/(144.0*GRAVITY);
|
||||
I += ((*iTank)->GetZ() - vXYZcg(eZ))*((*iTank)->GetZ() - vXYZcg(eZ)) * (*iTank)->GetContents()/(144.0*Inertial->gravity());
|
||||
iTank++;
|
||||
}
|
||||
return I;
|
||||
|
@ -511,7 +511,7 @@ float FGPropulsion::GetTanksIxz(const FGColumnVector3& vXYZcg)
|
|||
float I = 0.0;
|
||||
iTank = Tanks.begin();
|
||||
while (iTank < Tanks.end()) {
|
||||
I += ((*iTank)->GetX() - vXYZcg(eX))*((*iTank)->GetZ() - vXYZcg(eZ)) * (*iTank)->GetContents()/(144.0*GRAVITY);
|
||||
I += ((*iTank)->GetX() - vXYZcg(eX))*((*iTank)->GetZ() - vXYZcg(eZ)) * (*iTank)->GetContents()/(144.0*Inertial->gravity());
|
||||
iTank++;
|
||||
}
|
||||
return I;
|
||||
|
@ -524,7 +524,7 @@ float FGPropulsion::GetTanksIxy(const FGColumnVector3& vXYZcg)
|
|||
float I = 0.0;
|
||||
iTank = Tanks.begin();
|
||||
while (iTank != Tanks.end()) {
|
||||
I += ((*iTank)->GetX() - vXYZcg(eX))*((*iTank)->GetY() - vXYZcg(eY)) * (*iTank)->GetContents()/(144.0*GRAVITY);
|
||||
I += ((*iTank)->GetX() - vXYZcg(eX))*((*iTank)->GetY() - vXYZcg(eY)) * (*iTank)->GetContents()/(144.0*Inertial->gravity());
|
||||
iTank++;
|
||||
}
|
||||
return I;
|
||||
|
|
|
@ -38,7 +38,6 @@ HISTORY
|
|||
INCLUDES
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||||
|
||||
#include "FGDefs.h"
|
||||
#include "FGRocket.h"
|
||||
|
||||
static const char *IdSrc = "$Id$";
|
||||
|
|
|
@ -66,7 +66,7 @@ CLASS IMPLEMENTATION
|
|||
//
|
||||
// For every term registered here there must be a corresponding handler in
|
||||
// GetParameter() below that retrieves that parameter. Also, there must be an
|
||||
// entry in the enum eParam definition in FGDefs.h. The ID is what must be used
|
||||
// entry in the enum eParam definition in FGJSBBase.h. The ID is what must be used
|
||||
// in any config file entry which references that item.
|
||||
|
||||
FGState::FGState(FGFDMExec* fdex) : mTb2l(3,3),
|
||||
|
@ -107,6 +107,7 @@ FGState::FGState(FGFDMExec* fdex) : mTb2l(3,3),
|
|||
RegisterVariable(FG_ALPHA, " alpha " );
|
||||
RegisterVariable(FG_ALPHADOT, " alphadot " );
|
||||
RegisterVariable(FG_BETA, " beta " );
|
||||
RegisterVariable(FG_ABETA, " |beta| " );
|
||||
RegisterVariable(FG_BETADOT, " betadot " );
|
||||
RegisterVariable(FG_PHI, " roll_angle " );
|
||||
RegisterVariable(FG_THT, " pitch_angle " );
|
||||
|
@ -199,6 +200,8 @@ float FGState::GetParameter(eParam val_idx) {
|
|||
return Translation->Getadot();
|
||||
case FG_BETA:
|
||||
return Translation->Getbeta();
|
||||
case FG_ABETA:
|
||||
return fabs(Translation->Getbeta());
|
||||
case FG_BETADOT:
|
||||
return Translation->Getbdot();
|
||||
case FG_PHI:
|
||||
|
@ -441,15 +444,15 @@ bool FGState::Reset(string path, string acname, string fname)
|
|||
}
|
||||
|
||||
|
||||
Position->SetLatitude(latitude*DEGTORAD);
|
||||
Position->SetLongitude(longitude*DEGTORAD);
|
||||
Position->SetLatitude(latitude*degtorad);
|
||||
Position->SetLongitude(longitude*degtorad);
|
||||
Position->Seth(h);
|
||||
|
||||
wnorth = wmag*KTSTOFPS*cos(wdir*DEGTORAD);
|
||||
weast = wmag*KTSTOFPS*sin(wdir*DEGTORAD);
|
||||
wnorth = wmag*ktstofps*cos(wdir*degtorad);
|
||||
weast = wmag*ktstofps*sin(wdir*degtorad);
|
||||
|
||||
Initialize(U, V, W, phi*DEGTORAD, tht*DEGTORAD, psi*DEGTORAD,
|
||||
latitude*DEGTORAD, longitude*DEGTORAD, h, wnorth, weast, 0.0);
|
||||
Initialize(U, V, W, phi*degtorad, tht*degtorad, psi*degtorad,
|
||||
latitude*degtorad, longitude*degtorad, h, wnorth, weast, 0.0);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -715,41 +718,41 @@ void FGState::ReportState(void) {
|
|||
Position->GetDistanceAGL() );
|
||||
cout << out;
|
||||
snprintf(out,80, " Angle of Attack: %6.2f deg Pitch Angle: %6.2f deg\n",
|
||||
GetParameter(FG_ALPHA)*RADTODEG,
|
||||
Rotation->Gettht()*RADTODEG );
|
||||
GetParameter(FG_ALPHA)*radtodeg,
|
||||
Rotation->Gettht()*radtodeg );
|
||||
cout << out;
|
||||
snprintf(out,80, " Flight Path Angle: %6.2f deg Climb Rate: %5.0f ft/min\n",
|
||||
Position->GetGamma()*RADTODEG,
|
||||
Position->GetGamma()*radtodeg,
|
||||
Position->Gethdot()*60 );
|
||||
cout << out;
|
||||
snprintf(out,80, " Normal Load Factor: %4.2f g's Pitch Rate: %5.2f deg/s\n",
|
||||
Aerodynamics->GetNlf(),
|
||||
GetParameter(FG_PITCHRATE)*RADTODEG );
|
||||
GetParameter(FG_PITCHRATE)*radtodeg );
|
||||
cout << out;
|
||||
snprintf(out,80, " Heading: %3.0f deg true Sideslip: %5.2f deg\n",
|
||||
Rotation->Getpsi()*RADTODEG,
|
||||
GetParameter(FG_BETA)*RADTODEG );
|
||||
Rotation->Getpsi()*radtodeg,
|
||||
GetParameter(FG_BETA)*radtodeg );
|
||||
cout << out;
|
||||
snprintf(out,80, " Bank Angle: %5.2f deg\n",
|
||||
Rotation->Getphi()*RADTODEG );
|
||||
Rotation->Getphi()*radtodeg );
|
||||
cout << out;
|
||||
snprintf(out,80, " Elevator: %5.2f deg Left Aileron: %5.2f deg Rudder: %5.2f deg\n",
|
||||
GetParameter(FG_ELEVATOR_POS)*RADTODEG,
|
||||
GetParameter(FG_AILERON_POS)*RADTODEG,
|
||||
GetParameter(FG_RUDDER_POS)*RADTODEG );
|
||||
GetParameter(FG_ELEVATOR_POS)*radtodeg,
|
||||
GetParameter(FG_AILERON_POS)*radtodeg,
|
||||
GetParameter(FG_RUDDER_POS)*radtodeg );
|
||||
cout << out;
|
||||
snprintf(out,80, " Throttle: %5.2f%c\n",
|
||||
FCS->GetThrottlePos(0)*100,'%' );
|
||||
cout << out;
|
||||
|
||||
snprintf(out,80, " Wind Components: %5.2f kts head wind, %5.2f kts cross wind\n",
|
||||
FDMExec->GetAuxiliary()->GetHeadWind()*jsbFPSTOKTS,
|
||||
FDMExec->GetAuxiliary()->GetCrossWind()*jsbFPSTOKTS );
|
||||
FDMExec->GetAuxiliary()->GetHeadWind()*fpstokts,
|
||||
FDMExec->GetAuxiliary()->GetCrossWind()*fpstokts );
|
||||
cout << out;
|
||||
|
||||
snprintf(out,80, " Ground Speed: %4.0f knots , Ground Track: %3.0f deg true\n",
|
||||
Position->GetVground()*jsbFPSTOKTS,
|
||||
Position->GetGroundTrack()*RADTODEG );
|
||||
Position->GetVground()*fpstokts,
|
||||
Position->GetGroundTrack()*radtodeg );
|
||||
cout << out;
|
||||
|
||||
}
|
||||
|
|
|
@ -58,7 +58,6 @@ INCLUDES
|
|||
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include "FGDefs.h"
|
||||
#include "FGJSBBase.h"
|
||||
#include "FGInitialCondition.h"
|
||||
#include "FGMatrix33.h"
|
||||
|
@ -187,14 +186,14 @@ public:
|
|||
inline void Resume(void) {dt = saved_dt;}
|
||||
|
||||
/** Retrieves a parameter.
|
||||
The parameters that can be retrieved are enumerated in FGDefs.h.
|
||||
The parameters that can be retrieved are enumerated in FGJSBBase.h.
|
||||
@param val_idx one of the enumerated JSBSim parameters.
|
||||
@return the value of the parameter.
|
||||
*/
|
||||
float GetParameter(eParam val_idx);
|
||||
|
||||
/** Retrieves a parameter.
|
||||
The parameters that can be retrieved are enumerated in FGDefs.h.
|
||||
The parameters that can be retrieved are enumerated in FGJSBBase.h.
|
||||
@param val_string a string representing one of the enumerated JSBSim parameters,
|
||||
i.e. "FG_QBAR".
|
||||
@return the value of the parameter.
|
||||
|
|
|
@ -36,7 +36,6 @@ HISTORY
|
|||
INCLUDES
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||||
|
||||
#include "FGDefs.h"
|
||||
#include "FGTank.h"
|
||||
|
||||
static const char *IdSrc = "$Id$";
|
||||
|
|
|
@ -158,76 +158,6 @@ void FGTrim::Report(void) {
|
|||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
void FGTrim::ReportState(void) {
|
||||
char out[80], flap[10], gear[10];
|
||||
|
||||
cout << endl << " JSBSim State" << endl;
|
||||
snprintf(out,80," Weight: %7.0f lbs. CG: %5.1f, %5.1f, %5.1f inches\n",
|
||||
fdmex->GetMassBalance()->GetWeight(),
|
||||
fdmex->GetMassBalance()->GetXYZcg(1),
|
||||
fdmex->GetMassBalance()->GetXYZcg(2),
|
||||
fdmex->GetMassBalance()->GetXYZcg(3));
|
||||
cout << out;
|
||||
if( fdmex->GetFCS()->GetDfPos() <= 0.01)
|
||||
snprintf(flap,10,"Up");
|
||||
else
|
||||
snprintf(flap,10,"%2.0f",fdmex->GetFCS()->GetDfPos());
|
||||
if(fdmex->GetGroundReactions()->GetGearUp() == true)
|
||||
snprintf(gear,10,"Up");
|
||||
else
|
||||
snprintf(gear,10,"Down");
|
||||
snprintf(out,80, " Flaps: %3s Gear: %4s\n",flap,gear);
|
||||
cout << out;
|
||||
snprintf(out,80, " Speed: %4.0f KCAS Mach: %5.2f\n",
|
||||
fdmex->GetAuxiliary()->GetVcalibratedKTS(),
|
||||
fdmex->GetState()->GetParameter(FG_MACH) );
|
||||
cout << out;
|
||||
snprintf(out,80, " Altitude: %7.0f ft. AGL Altitude: %7.0f ft.\n",
|
||||
fdmex->GetPosition()->Geth(),
|
||||
fdmex->GetPosition()->GetDistanceAGL() );
|
||||
cout << out;
|
||||
snprintf(out,80, " Angle of Attack: %6.2f deg Pitch Angle: %6.2f deg\n",
|
||||
fdmex->GetState()->GetParameter(FG_ALPHA)*RADTODEG,
|
||||
fdmex->GetRotation()->Gettht()*RADTODEG );
|
||||
cout << out;
|
||||
snprintf(out,80, " Flight Path Angle: %6.2f deg Climb Rate: %5.0f ft/min\n",
|
||||
fdmex->GetPosition()->GetGamma()*RADTODEG,
|
||||
fdmex->GetPosition()->Gethdot()*60 );
|
||||
cout << out;
|
||||
snprintf(out,80, " Normal Load Factor: %4.2f g's Pitch Rate: %5.2f deg/s\n",
|
||||
fdmex->GetAerodynamics()->GetNlf(),
|
||||
fdmex->GetState()->GetParameter(FG_PITCHRATE)*RADTODEG );
|
||||
cout << out;
|
||||
snprintf(out,80, " Heading: %3.0f deg true Sideslip: %5.2f deg\n",
|
||||
fdmex->GetRotation()->Getpsi()*RADTODEG,
|
||||
fdmex->GetState()->GetParameter(FG_BETA)*RADTODEG );
|
||||
cout << out;
|
||||
snprintf(out,80, " Bank Angle: %5.2f deg\n",
|
||||
fdmex->GetRotation()->Getphi()*RADTODEG );
|
||||
cout << out;
|
||||
snprintf(out,80, " Elevator: %5.2f deg Left Aileron: %5.2f deg Rudder: %5.2f deg\n",
|
||||
fdmex->GetState()->GetParameter(FG_ELEVATOR_POS)*RADTODEG,
|
||||
fdmex->GetState()->GetParameter(FG_AILERON_POS)*RADTODEG,
|
||||
fdmex->GetState()->GetParameter(FG_RUDDER_POS)*RADTODEG );
|
||||
cout << out;
|
||||
snprintf(out,80, " Throttle: %5.2f%c\n",
|
||||
fdmex->GetFCS()->GetThrottlePos(0),'%' );
|
||||
cout << out;
|
||||
|
||||
snprintf(out,80, " Wind Components: %5.2f kts head wind, %5.2f kts cross wind\n",
|
||||
fdmex->GetAuxiliary()->GetHeadWind()*jsbFPSTOKTS,
|
||||
fdmex->GetAuxiliary()->GetCrossWind()*jsbFPSTOKTS );
|
||||
cout << out;
|
||||
|
||||
snprintf(out,80, " Ground Speed: %4.0f knots , Ground Track: %3.0f deg true\n",
|
||||
fdmex->GetPosition()->GetVground()*jsbFPSTOKTS,
|
||||
fdmex->GetPosition()->GetGroundTrack()*RADTODEG );
|
||||
cout << out;
|
||||
|
||||
}
|
||||
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
void FGTrim::ClearStates(void) {
|
||||
FGTrimAxis* ta;
|
||||
|
||||
|
@ -317,7 +247,6 @@ bool FGTrim::EditState( State state, Control new_control ){
|
|||
}
|
||||
iAxes++;
|
||||
}
|
||||
cout << "Exit FGTrim::EditState(...)" << endl;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -452,12 +381,11 @@ bool FGTrim::solve(void) {
|
|||
x1=xhi;f1=ahi;
|
||||
x3=xlo;f3=alo;
|
||||
} */
|
||||
|
||||
d0=fabs(x3-x1);
|
||||
//iterations
|
||||
//max_sub_iterations=TrimAxes[current_axis]->GetIterationLimit();
|
||||
while (!TrimAxes[current_axis]->InTolerance() && (fabs(d) > eps)
|
||||
&& (Nsub < max_sub_iterations)) {
|
||||
while ( (TrimAxes[current_axis]->InTolerance() == false )
|
||||
&& (fabs(d) > eps) && (Nsub < max_sub_iterations)) {
|
||||
Nsub++;
|
||||
d=(x3-x1)/d0;
|
||||
x2=x1-d*d0*f1/(f3-f1);
|
||||
|
|
|
@ -199,11 +199,6 @@ public:
|
|||
*/
|
||||
void Report(void);
|
||||
|
||||
/** Prints a summary of simulator state (speed, altitude,
|
||||
configuration, etc.)
|
||||
*/
|
||||
void ReportState(void);
|
||||
|
||||
/** Iteration statistics
|
||||
*/
|
||||
void TrimStats();
|
||||
|
|
|
@ -54,7 +54,6 @@ FGTrimAxis::FGTrimAxis(FGFDMExec* fdex, FGInitialCondition* ic, State st,
|
|||
fgic=ic;
|
||||
state=st;
|
||||
control=ctrl;
|
||||
solver_eps=tolerance;
|
||||
max_iterations=10;
|
||||
control_value=0;
|
||||
its_to_stable_value=0;
|
||||
|
@ -63,6 +62,17 @@ FGTrimAxis::FGTrimAxis(FGFDMExec* fdex, FGInitialCondition* ic, State st,
|
|||
state_convert=1.0;
|
||||
control_convert=1.0;
|
||||
state_value=0;
|
||||
switch(state) {
|
||||
case tUdot: tolerance = DEFAULT_TOLERANCE; break;
|
||||
case tVdot: tolerance = DEFAULT_TOLERANCE; break;
|
||||
case tWdot: tolerance = DEFAULT_TOLERANCE; break;
|
||||
case tQdot: tolerance = DEFAULT_TOLERANCE / 10; break;
|
||||
case tPdot: tolerance = DEFAULT_TOLERANCE / 10; break;
|
||||
case tRdot: tolerance = DEFAULT_TOLERANCE / 10; break;
|
||||
case tHmgt: tolerance = 0.01; break;
|
||||
}
|
||||
|
||||
solver_eps=tolerance;
|
||||
switch(control) {
|
||||
case tThrottle:
|
||||
control_min=0;
|
||||
|
@ -70,19 +80,19 @@ FGTrimAxis::FGTrimAxis(FGFDMExec* fdex, FGInitialCondition* ic, State st,
|
|||
control_value=0.5;
|
||||
break;
|
||||
case tBeta:
|
||||
control_min=-30*DEGTORAD;
|
||||
control_max=30*DEGTORAD;
|
||||
control_convert=RADTODEG;
|
||||
control_min=-30*degtorad;
|
||||
control_max=30*degtorad;
|
||||
control_convert=radtodeg;
|
||||
break;
|
||||
case tAlpha:
|
||||
control_min=fdmex->GetAircraft()->GetAlphaCLMin();
|
||||
control_max=fdmex->GetAircraft()->GetAlphaCLMax();
|
||||
if(control_max <= control_min) {
|
||||
control_max=20*DEGTORAD;
|
||||
control_min=-5*DEGTORAD;
|
||||
control_max=20*degtorad;
|
||||
control_min=-5*degtorad;
|
||||
}
|
||||
control_value= (control_min+control_max)/2;
|
||||
control_convert=RADTODEG;
|
||||
control_convert=radtodeg;
|
||||
solver_eps=tolerance/100;
|
||||
break;
|
||||
case tPitchTrim:
|
||||
|
@ -93,7 +103,7 @@ FGTrimAxis::FGTrimAxis(FGFDMExec* fdex, FGInitialCondition* ic, State st,
|
|||
case tRudder:
|
||||
control_min=-1;
|
||||
control_max=1;
|
||||
state_convert=RADTODEG;
|
||||
state_convert=radtodeg;
|
||||
solver_eps=tolerance/100;
|
||||
break;
|
||||
case tAltAGL:
|
||||
|
@ -103,38 +113,29 @@ FGTrimAxis::FGTrimAxis(FGFDMExec* fdex, FGInitialCondition* ic, State st,
|
|||
solver_eps=tolerance/100;
|
||||
break;
|
||||
case tTheta:
|
||||
control_min=fdmex->GetRotation()->Gettht() - 5*DEGTORAD;
|
||||
control_max=fdmex->GetRotation()->Gettht() + 5*DEGTORAD;
|
||||
state_convert=RADTODEG;
|
||||
control_min=fdmex->GetRotation()->Gettht() - 5*degtorad;
|
||||
control_max=fdmex->GetRotation()->Gettht() + 5*degtorad;
|
||||
state_convert=radtodeg;
|
||||
break;
|
||||
case tPhi:
|
||||
control_min=fdmex->GetRotation()->Getphi() - 30*DEGTORAD;
|
||||
control_max=fdmex->GetRotation()->Getphi() + 30*DEGTORAD;
|
||||
state_convert=RADTODEG;
|
||||
control_convert=RADTODEG;
|
||||
control_min=fdmex->GetRotation()->Getphi() - 30*degtorad;
|
||||
control_max=fdmex->GetRotation()->Getphi() + 30*degtorad;
|
||||
state_convert=radtodeg;
|
||||
control_convert=radtodeg;
|
||||
break;
|
||||
case tGamma:
|
||||
solver_eps=tolerance/100;
|
||||
control_min=-80*DEGTORAD;
|
||||
control_max=80*DEGTORAD;
|
||||
control_convert=RADTODEG;
|
||||
control_min=-80*degtorad;
|
||||
control_max=80*degtorad;
|
||||
control_convert=radtodeg;
|
||||
break;
|
||||
case tHeading:
|
||||
control_min=fdmex->GetRotation()->Getpsi() - 30*DEGTORAD;
|
||||
control_max=fdmex->GetRotation()->Getpsi() + 30*DEGTORAD;
|
||||
state_convert=RADTODEG;
|
||||
control_min=fdmex->GetRotation()->Getpsi() - 30*degtorad;
|
||||
control_max=fdmex->GetRotation()->Getpsi() + 30*degtorad;
|
||||
state_convert=radtodeg;
|
||||
break;
|
||||
}
|
||||
|
||||
switch(state) {
|
||||
case tUdot: tolerance = DEFAULT_TOLERANCE; break;
|
||||
case tVdot: tolerance = DEFAULT_TOLERANCE; break;
|
||||
case tWdot: tolerance = DEFAULT_TOLERANCE; break;
|
||||
case tQdot: tolerance = DEFAULT_TOLERANCE / 10; break;
|
||||
case tPdot: tolerance = DEFAULT_TOLERANCE / 10; break;
|
||||
case tRdot: tolerance = DEFAULT_TOLERANCE / 10; break;
|
||||
case tHmgt: tolerance = 0.01; break;
|
||||
}
|
||||
|
||||
if (debug_lvl & 2) cout << "Instantiated: FGTrimAxis" << endl;
|
||||
}
|
||||
|
@ -324,9 +325,9 @@ bool FGTrimAxis::initTheta(void) {
|
|||
i++;
|
||||
}
|
||||
//cout << i << endl;
|
||||
cout << " Initial Theta: " << fdmex->GetRotation()->Gettht()*RADTODEG << endl;
|
||||
control_min=(theta+5)*DEGTORAD;
|
||||
control_max=(theta-5)*DEGTORAD;
|
||||
cout << " Initial Theta: " << fdmex->GetRotation()->Gettht()*radtodeg << endl;
|
||||
control_min=(theta+5)*degtorad;
|
||||
control_max=(theta-5)*degtorad;
|
||||
fgic->SetAltitudeAGLFtIC(saveAlt);
|
||||
if(i < 100)
|
||||
return true;
|
||||
|
|
|
@ -148,11 +148,35 @@ int main(int argc, char** argv)
|
|||
cerr << "Aircraft file " << argv[1] << " was not found" << endl;
|
||||
exit(-1);
|
||||
}
|
||||
if ( ! FDMExec->GetState()->Reset("aircraft", string(argv[1]), string(argv[2])))
|
||||
FDMExec->GetState()->Initialize(2000,0,0,0,0,0,0.5,0.5,40000, 0, 0, 0);
|
||||
if ( ! FDMExec->GetState()->Reset("aircraft", string(argv[1]), string(argv[2]))) {
|
||||
cerr << "JSBSim could not be started" << endl;
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
while (FDMExec->Run()) {}
|
||||
struct FGJSBBase::Message* msg;
|
||||
while (FDMExec->Run()) {
|
||||
while (FDMExec->ReadMessage()) {
|
||||
msg = FDMExec->ProcessMessage();
|
||||
switch (msg->type) {
|
||||
case FGJSBBase::Message::eText:
|
||||
cout << msg->messageId << ": " << msg->text << endl;
|
||||
break;
|
||||
case FGJSBBase::Message::eBool:
|
||||
cout << msg->messageId << ": " << msg->text << " " << msg->bVal << endl;
|
||||
break;
|
||||
case FGJSBBase::Message::eInteger:
|
||||
cout << msg->messageId << ": " << msg->text << " " << msg->iVal << endl;
|
||||
break;
|
||||
case FGJSBBase::Message::eDouble:
|
||||
cout << msg->messageId << ": " << msg->text << " " << msg->dVal << endl;
|
||||
break;
|
||||
default:
|
||||
cerr << "Unrecognized message type." << endl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
delete FDMExec;
|
||||
|
||||
|
|
|
@ -42,7 +42,6 @@ INCLUDES
|
|||
#endif
|
||||
|
||||
#include <string>
|
||||
#include "../FGDefs.h"
|
||||
#include "../FGJSBBase.h"
|
||||
|
||||
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
|
|
@ -23,6 +23,8 @@
|
|||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <plib/sg.h>
|
||||
|
||||
#include <simgear/constants.h>
|
||||
#include <simgear/debug/logstream.hxx>
|
||||
#include <simgear/math/sg_geodesy.hxx>
|
||||
|
@ -203,7 +205,7 @@ FGInterface::common_init ()
|
|||
set_Latitude( fgGetDouble("/position/latitude-deg")
|
||||
* SGD_DEGREES_TO_RADIANS );
|
||||
double ground_elev_m = scenery.get_cur_elev();
|
||||
double ground_elev_ft = ground_elev_m * METERS_TO_FEET;
|
||||
double ground_elev_ft = ground_elev_m * SG_METER_TO_FEET;
|
||||
if ( fgGetBool("/sim/startup/onground")
|
||||
|| fgGetDouble("/position/altitude-ft") < ground_elev_ft ) {
|
||||
fgSetDouble("/position/altitude-ft", ground_elev_ft);
|
||||
|
@ -461,7 +463,7 @@ void FGInterface::_updatePosition( double lat_geoc, double lon, double alt ) {
|
|||
_set_Geodetic_Position( lat_geod, lon, alt );
|
||||
|
||||
_set_Sea_level_radius( sl_radius2 * SG_METER_TO_FEET );
|
||||
_set_Runway_altitude( scenery.get_cur_elev()*METERS_TO_FEET );
|
||||
_set_Runway_altitude( scenery.get_cur_elev() * SG_METER_TO_FEET );
|
||||
|
||||
_set_sin_lat_geocentric( lat_geoc );
|
||||
_set_cos_lat_geocentric( lat_geoc );
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#include <simgear/io/sg_file.hxx>
|
||||
#include <simgear/io/sg_serial.hxx>
|
||||
#include <simgear/io/sg_socket.hxx>
|
||||
#include <simgear/io/sg_socket_udp.hxx>
|
||||
#include <simgear/math/sg_types.hxx>
|
||||
#include <simgear/timing/timestamp.hxx>
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue