1
0
Fork 0

Sync with latest JSBSim CVS

This commit is contained in:
curt 2001-11-12 16:06:29 +00:00
parent daabe407aa
commit 6bc2f59572
45 changed files with 585 additions and 335 deletions

2
aclocal.m4 vendored
View file

@ -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

View file

@ -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>

View file

@ -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
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

View file

@ -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

View file

@ -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;
}
}

View file

@ -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;

View file

@ -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.

View file

@ -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();

View file

@ -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; }

View file

@ -44,7 +44,6 @@ HISTORY
INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGDefs.h"
#include "FGCoefficient.h"
#include "FGState.h"
#include "FGFDMExec.h"

View file

@ -45,7 +45,6 @@ INCLUDES
#include <vector>
#include <string>
#include "FGConfigFile.h"
#include "FGDefs.h"
#include "FGTable.h"
#include "FGJSBBase.h"

View file

@ -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 = "";

View file

@ -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&);

View file

@ -245,7 +245,6 @@ protected:
#include "FGPosition.h"
#include "FGAuxiliary.h"
#include "FGOutput.h"
#include "FGDefs.h"
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#endif

View file

@ -37,8 +37,6 @@ HISTORY
INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGDefs.h"
#include "FGFCS.h"
#include "FGState.h"
#include "FGFDMExec.h"

View file

@ -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;

View file

@ -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";
}

View file

@ -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;

View file

@ -45,7 +45,6 @@ HISTORY
INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGDefs.h"
#include "FGCoefficient.h"
#include "FGFactorGroup.h"
#include "FGState.h"

View file

@ -45,7 +45,6 @@ INCLUDES
#include <vector>
#include <string>
#include "FGConfigFile.h"
#include "FGDefs.h"
#include "FGTable.h"
#include "FGCoefficient.h"
#include "FGAerodynamics.h"

View file

@ -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;

View file

@ -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();

View file

@ -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;
};
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View file

@ -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

View file

@ -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; }

View file

@ -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;
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View file

@ -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;
};
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View file

@ -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

View file

@ -70,7 +70,7 @@ bool FGMassBalance::Run(void)
Weight = EmptyWeight + Propulsion->GetTanksWeight();
Mass = Weight / GRAVITY;
Mass = Weight / Inertial->gravity();
// Calculate new CG here.

View file

@ -38,7 +38,6 @@ SENTRY
INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGDefs.h"
#include "FGJSBBase.h"
#ifdef FGFS

View file

@ -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;
}

View file

@ -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;

View file

@ -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 */

View file

@ -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;

View file

@ -38,7 +38,6 @@ HISTORY
INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGDefs.h"
#include "FGRocket.h"
static const char *IdSrc = "$Id$";

View file

@ -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;
}

View file

@ -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.

View file

@ -36,7 +36,6 @@ HISTORY
INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGDefs.h"
#include "FGTank.h"
static const char *IdSrc = "$Id$";

View file

@ -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);

View file

@ -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();

View file

@ -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;

View file

@ -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;

View file

@ -42,7 +42,6 @@ INCLUDES
#endif
#include <string>
#include "../FGDefs.h"
#include "../FGJSBBase.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View file

@ -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 );

View file

@ -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>