-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
#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>
#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
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
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
vBodyAccel = vForces/MassBalance->GetMass();
- vNcg = vBodyAccel*INVGRAVITY;
+ vNcg = vBodyAccel/Inertial->gravity();
if (alphaclmax != 0) {
if (Translation->Getalpha() > 0.85*alphaclmax) {
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;
}
}
#include "FGPosition.h"
#include "FGAuxiliary.h"
#include "FGOutput.h"
-#include "FGDefs.h"
#include "FGMatrix33.h"
#include "FGColumnVector3.h"
#include "FGColumnVector4.h"
htab[6]=200131.234;
htab[7]=259186.352; //ft.
+ if (debug_lvl & 2) cout << "Instantiated: " << Name << endl;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+FGAtmosphere::~FGAtmosphere()
+{
+ if (debug_lvl & 2) cout << "Destroyed: FGAtmosphere" << endl;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+bool FGAtmosphere::InitModel(void)
+{
+ FGModel::InitModel();
+
Calculate(h);
SLtemperature = temperature;
SLpressure = pressure;
SLdensity = density;
- SLsoundspeed = sqrt(SHRATIO*Reng*temperature);
+ 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;
-}
-
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-FGAtmosphere::~FGAtmosphere()
-{
- if (debug_lvl & 2) cout << "Destroyed: FGAtmosphere" << endl;
+
+ return true;
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if (psiw < 0) psiw += 2*M_PI;
- soundspeed = sqrt(SHRATIO*Reng*temperature);
+ soundspeed = sqrt(SHRatio*Reng*temperature);
State->Seta(soundspeed);
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;
@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.
+ Rotation->GetPQR() * (Rotation->GetPQR() * vToEyePt)
+ Inertial->GetGravity();
- earthPosAngle += State->Getdt()*OMEGA_EARTH;
+ earthPosAngle += State->Getdt()*Inertial->omega();
return false;
} else {
return true;
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+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();
// 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; }
INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-#include "FGDefs.h"
#include "FGCoefficient.h"
#include "FGState.h"
#include "FGFDMExec.h"
#include <vector>
#include <string>
#include "FGConfigFile.h"
-#include "FGDefs.h"
#include "FGTable.h"
#include "FGJSBBase.h"
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 = "";
if (CommentsOn) CommentString += CurrentLine + "\r\n";
- } while (IsCommentLine());
+ } while (CommentsOn);
if (CurrentLine.length() == 0) GetNextConfigLine();
CurrentIndex = 0;
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-bool FGConfigFile::IsCommentLine(void)
-{
- if (CurrentLine[0] == '/' && CurrentLine[1] == '/') return true;
- if (CommentsOn) return true;
-
- return false;
-}
-
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
string FGConfigFile::GetLine(void)
{
string scratch = "";
using std::string;
#endif
-#include "FGDefs.h"
#include "FGJSBBase.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
string GetValue(string);
string GetValue(void);
string GetCommentString(void);
- bool IsCommentLine(void);
bool IsOpen(void) {return Opened;}
FGConfigFile& operator>>(double&);
FGConfigFile& operator>>(float&);
#include "FGPosition.h"
#include "FGAuxiliary.h"
#include "FGOutput.h"
-#include "FGDefs.h"
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#endif
INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-#include "FGDefs.h"
-
#include "FGFCS.h"
#include "FGState.h"
#include "FGFDMExec.h"
/** Gets the throttle command.
@param engine engine ID number
@return throttle command in percent ( 0 - 100) for the given engine */
- float GetThrottleCmd(int engine);\r
-\r
- /** Gets the mixture command.\r
- @param engine engine ID number\r
- @return mixture command in percent ( 0 - 100) for the given engine */\r
- inline float GetMixtureCmd(int engine) { return MixtureCmd[engine]; }\r
-\r
+ 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; }
/** Gets the throttle position.
@param engine engine ID number
@return throttle position for the given engine in percent ( 0 - 100)*/
- float GetThrottlePos(int engine);\r
-\r
- /** Gets the mixture position.\r
- @param engine engine ID number\r
- @return mixture position for the given engine in percent ( 0 - 100)*/\r
- inline float GetMixturePos(int engine) { return MixturePos[engine]; }\r
+ 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.
@param engine engine ID number
@param cmd throttle command in percent (0 - 100)*/
void SetThrottleCmd(int engine, float cmd);
-\r
- /** Sets the mixture command for the specified engine\r
- @param engine engine ID number\r
- @param cmd mixture command in percent (0 - 100)*/\r
- void SetMixtureCmd(int engine, float cmd);\r
+
+ /** 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
@param engine engine ID number
@param cmd throttle setting in percent (0 - 100)*/
void SetThrottlePos(int engine, float cmd);
-\r
- /** Sets the actual mixture setting for the specified engine\r
- @param engine engine ID number\r
- @param cmd mixture setting in percent (0 - 100)*/\r
- void SetMixturePos(int engine, float cmd);\r
+
+ /** 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
float PTrimCmd;
vector <float> ThrottleCmd;
vector <float> ThrottlePos;
- vector <float> MixtureCmd;\r
- vector <float> MixturePos;\r
+ vector <float> MixtureCmd;
+ vector <float> MixturePos;
float LeftBrake, RightBrake, CenterBrake; // Brake settings
vector <FGFCSComponent*> Components;
// 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
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
modelLoaded = false;
Scripted = false;
+ IdFDM = FDMctr;
+ FDMctr++;
+
try {
char* num = getenv("JSBSIM_DEBUG");
if (!num) debug_lvl = 1;
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";
}
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]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
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;
INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-#include "FGDefs.h"
#include "FGCoefficient.h"
#include "FGFactorGroup.h"
#include "FGState.h"
#include <vector>
#include <string>
#include "FGConfigFile.h"
-#include "FGDefs.h"
#include "FGTable.h"
#include "FGCoefficient.h"
#include "FGAerodynamics.h"
#include "FGMatrix33.h"
#include "FGColumnVector3.h"
#include "FGColumnVector4.h"
-#include "FGDefs.h"
#include "FGForce.h"
static const char *IdSrc = "$Id$";
//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;
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;
}
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();
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);
FGColumnVector3 vForces;
FGColumnVector3 vRadius;
FGColumnVector3 vGravity;
+ double gAccel;
+ double gAccelReference;
+ double RadiusReference;
+ double RotationRate;
+ double GM;
};
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#include "FGPosition.h"
#include "FGAuxiliary.h"
#include "FGOutput.h"
-#include "FGDefs.h"
#include "FGConfigFile.h"
static const char *IdSrc = "$Id$";
//******************************************************************************
-FGInitialCondition::FGInitialCondition(FGFDMExec *FDMExec){
-
+FGInitialCondition::FGInitialCondition(FGFDMExec *FDMExec)
+{
vt=vc=ve=vg=0;
mach=0;
alpha=beta=gamma=0;
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;
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;
//******************************************************************************
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();
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;
}
//******************************************************************************
// positive from left
void FGInitialCondition::SetHeadWindKtsIC(float head){
- whead=head*KTSTOFPS;
+ whead=head*ktstofps;
lastWindSet=setwhc;
calcWindUVW();
if(lastSpeedSet == setvg)
//******************************************************************************
void FGInitialCondition::SetCrossWindKtsIC(float cross){
- wcross=cross*KTSTOFPS;
+ wcross=cross*ktstofps;
lastWindSet=setwhc;
calcWindUVW();
if(lastSpeedSet == setvg)
//******************************************************************************
void FGInitialCondition::SetWindMagKtsIC(float mag) {
- wmag=mag*KTSTOFPS;
+ wmag=mag*ktstofps;
lastWindSet=setwmd;
calcWindUVW();
if(lastSpeedSet == setvg)
//******************************************************************************
void FGInitialCondition::SetWindDirDegIC(float dir) {
- wdir=dir*DEGTORAD;
+ wdir=dir*degtorad;
lastWindSet=setwmd;
calcWindUVW();
if(lastSpeedSet == setvg)
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);
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;
}
*y=x2;
}
- //cout << "Success= " << success << " Vcas: " << vcas*jsbFPSTOKTS << " Mach: " << x2 << endl;
+ //cout << "Success= " << success << " Vcas: " << vcas*fpstokts << " Mach: " << x2 << endl;
return success;
}
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
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#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;
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);
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; }
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;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
#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
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]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
class FGJSBBase {
public:
/// Constructor for FGJSBBase.
- FGJSBBase() {};
+ FGJSBBase();
- /// Destructor for FGJSBBase
+ /// Destructor for FGJSBBase.
virtual ~FGJSBBase() {};
+ /// 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;
};
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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
Weight = EmptyWeight + Propulsion->GetTanksWeight();
- Mass = Weight / GRAVITY;
+ Mass = Weight / Inertial->gravity();
// Calculate new CG here.
INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-#include "FGDefs.h"
#include "FGJSBBase.h"
#ifdef FGFS
INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-#include "FGDefs.h"
#include "FGPiston.h"
#include "FGPropulsion.h"
HP = 0;
}
- PowerAvailable = (HP * HPTOFTLBSSEC) - PowerRequired;
+ PowerAvailable = (HP * hptoftlbssec) - PowerRequired;
return PowerAvailable;
}
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;
}
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;
/// Destructor
~FGPosition();
+ bool InitModel(void);
+
/** Runs the Position model; called by the Executive
@see JSBSim.cpp documentation
@return false if no error */
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;
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;
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;
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;
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;
INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-#include "FGDefs.h"
#include "FGRocket.h"
static const char *IdSrc = "$Id$";
//
// 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),
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 " );
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:
}
- 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;
}
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;
}
#include <string>
#include <map>
-#include "FGDefs.h"
#include "FGJSBBase.h"
#include "FGInitialCondition.h"
#include "FGMatrix33.h"
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.
INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-#include "FGDefs.h"
#include "FGTank.h"
static const char *IdSrc = "$Id$";
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-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;
}
iAxes++;
}
- cout << "Exit FGTrim::EditState(...)" << endl;
return result;
}
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);
*/
void Report(void);
- /** Prints a summary of simulator state (speed, altitude,
- configuration, etc.)
- */
- void ReportState(void);
-
/** Iteration statistics
*/
void TrimStats();
fgic=ic;
state=st;
control=ctrl;
- solver_eps=tolerance;
max_iterations=10;
control_value=0;
its_to_stable_value=0;
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;
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:
case tRudder:
control_min=-1;
control_max=1;
- state_convert=RADTODEG;
+ state_convert=radtodeg;
solver_eps=tolerance/100;
break;
case tAltAGL:
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;
}
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;
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;
#endif
#include <string>
-#include "../FGDefs.h"
#include "../FGJSBBase.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#include <stdio.h>
+#include <plib/sg.h>
+
#include <simgear/constants.h>
#include <simgear/debug/logstream.hxx>
#include <simgear/math/sg_geodesy.hxx>
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);
_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 );
#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>