1
0
Fork 0

Sync with latest JSBSim

This commit is contained in:
curt 2001-11-09 04:38:53 +00:00
parent 8ff6965f98
commit fee8c33799
10 changed files with 1596 additions and 1591 deletions

View file

@ -1,131 +1,131 @@
/******************************************************************************* /*******************************************************************************
Header: FGDefs.h Header: FGDefs.h
Author: Jon S. Berndt Author: Jon S. Berndt
Date started: 02/01/99 Date started: 02/01/99
------------- Copyright (C) 1999 Jon S. Berndt (jsb@hal-pc.org) ------------- ------------- Copyright (C) 1999 Jon S. Berndt (jsb@hal-pc.org) -------------
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later Foundation; either version 2 of the License, or (at your option) any later
version. version.
This program is distributed in the hope that it will be useful, but WITHOUT This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
details. details.
You should have received a copy of the GNU General Public License along with You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place - Suite 330, Boston, MA 02111-1307, USA. Place - Suite 330, Boston, MA 02111-1307, USA.
Further information about the GNU General Public License can also be found on Further information about the GNU General Public License can also be found on
the world wide web at http://www.gnu.org. the world wide web at http://www.gnu.org.
HISTORY HISTORY
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
02/01/99 JSB Created 02/01/99 JSB Created
******************************************************************************** ********************************************************************************
SENTRY SENTRY
*******************************************************************************/ *******************************************************************************/
#ifndef FGDEFS_H #ifndef FGDEFS_H
#define FGDEFS_H #define FGDEFS_H
#define GRAVITY 32.174 #define GRAVITY 32.174
#define INVGRAVITY 0.031081 #define INVGRAVITY 0.031081
#define EARTHRAD 20925650.00 // feet, equatorial #define EARTHRAD 20925650.00 // feet, equatorial
#define EARTHRADSQRD 437882827922500.0 #define EARTHRADSQRD 437882827922500.0
#define ONESECOND 4.848136811E-6 #define ONESECOND 4.848136811E-6
#define Reng 1716 //Specific Gas Constant,ft^2/(sec^2*R) #define Reng 1716 //Specific Gas Constant,ft^2/(sec^2*R)
#define SHRATIO 1.4 //Specific Heat Ratio #define SHRATIO 1.4 //Specific Heat Ratio
#define RADTODEG 57.29578 #define RADTODEG 57.29578
#define DEGTORAD 1.745329E-2 #define DEGTORAD 1.745329E-2
#define KTSTOFPS 1.68781 #define KTSTOFPS 1.68781
#define FPSTOKTS 0.592484 #define FPSTOKTS 0.592484
#define INCHTOFT 0.08333333 #define INCHTOFT 0.08333333
#define OMEGA_EARTH .00007272205217 #define OMEGA_EARTH .00007272205217
#define NEEDED_CFG_VERSION "1.50" #define NEEDED_CFG_VERSION "1.50"
#define JSBSIM_VERSION "0.9.0" #define JSBSIM_VERSION "0.9.0"
#define HPTOFTLBSSEC 550 #define HPTOFTLBSSEC 550
#define METERS_TO_FEET 3.2808 #define METERS_TO_FEET 3.2808
#if defined ( sgi ) && !defined( __GNUC__ ) #if defined ( sgi ) && !defined( __GNUC__ )
#define __STL_FUNCTION_TMPL_PARTIAL_ORDER #define __STL_FUNCTION_TMPL_PARTIAL_ORDER
#endif #endif
enum eParam { enum eParam {
FG_UNDEF = 0, FG_UNDEF = 0,
FG_TIME, FG_TIME,
FG_QBAR, FG_QBAR,
FG_WINGAREA, FG_WINGAREA,
FG_WINGSPAN, FG_WINGSPAN,
FG_CBAR, FG_CBAR,
FG_ALPHA, FG_ALPHA,
FG_ALPHADOT, FG_ALPHADOT,
FG_BETA, FG_BETA,
FG_BETADOT, FG_BETADOT,
FG_PHI, FG_PHI,
FG_THT, FG_THT,
FG_PSI, FG_PSI,
FG_PITCHRATE, FG_PITCHRATE,
FG_ROLLRATE, FG_ROLLRATE,
FG_YAWRATE, FG_YAWRATE,
FG_CL_SQRD, FG_CL_SQRD,
FG_MACH, FG_MACH,
FG_ALTITUDE, FG_ALTITUDE,
FG_BI2VEL, FG_BI2VEL,
FG_CI2VEL, FG_CI2VEL,
FG_ELEVATOR_POS, FG_ELEVATOR_POS,
FG_AILERON_POS, FG_AILERON_POS,
FG_RUDDER_POS, FG_RUDDER_POS,
FG_SPDBRAKE_POS, FG_SPDBRAKE_POS,
FG_SPOILERS_POS, FG_SPOILERS_POS,
FG_FLAPS_POS, FG_FLAPS_POS,
FG_ELEVATOR_CMD, FG_ELEVATOR_CMD,
FG_AILERON_CMD, FG_AILERON_CMD,
FG_RUDDER_CMD, FG_RUDDER_CMD,
FG_SPDBRAKE_CMD, FG_SPDBRAKE_CMD,
FG_SPOILERS_CMD, FG_SPOILERS_CMD,
FG_FLAPS_CMD, FG_FLAPS_CMD,
FG_THROTTLE_CMD, FG_THROTTLE_CMD,
FG_THROTTLE_POS, FG_THROTTLE_POS,
FG_MIXTURE_CMD, FG_MIXTURE_CMD,
FG_MIXTURE_POS, FG_MIXTURE_POS,
FG_MAGNETO_CMD, FG_MAGNETO_CMD,
FG_STARTER_CMD, FG_STARTER_CMD,
FG_ACTIVE_ENGINE, FG_ACTIVE_ENGINE,
FG_HOVERB, FG_HOVERB,
FG_PITCH_TRIM_CMD, FG_PITCH_TRIM_CMD,
FG_LEFT_BRAKE_CMD, FG_LEFT_BRAKE_CMD,
FG_CENTER_BRAKE_CMD, FG_CENTER_BRAKE_CMD,
FG_RIGHT_BRAKE_CMD, FG_RIGHT_BRAKE_CMD,
FG_SET_LOGGING, FG_SET_LOGGING,
FG_ALPHAH, FG_ALPHAH,
FG_ALPHAW, FG_ALPHAW,
FG_LBARH, //normalized horizontal tail arm FG_LBARH, //normalized horizontal tail arm
FG_LBARV, //normalized vertical tail arm FG_LBARV, //normalized vertical tail arm
FG_HTAILAREA, FG_HTAILAREA,
FG_VTAILAREA, FG_VTAILAREA,
FG_VBARH, //horizontal tail volume FG_VBARH, //horizontal tail volume
FG_VBARV //vertical tail volume FG_VBARV //vertical tail volume
}; };
enum eAction { enum eAction {
FG_RAMP = 1, FG_RAMP = 1,
FG_STEP = 2, FG_STEP = 2,
FG_EXP = 3 FG_EXP = 3
}; };
enum eType { enum eType {
FG_VALUE = 1, FG_VALUE = 1,
FG_DELTA = 2, FG_DELTA = 2,
FG_BOOL = 3 FG_BOOL = 3
}; };
/******************************************************************************/ /******************************************************************************/
#endif #endif

View file

@ -1,161 +1,161 @@
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Module: FGEngine.cpp Module: FGEngine.cpp
Author: Jon Berndt Author: Jon Berndt
Date started: 01/21/99 Date started: 01/21/99
Called by: FGAircraft Called by: FGAircraft
------------- Copyright (C) 1999 Jon S. Berndt (jsb@hal-pc.org) ------------- ------------- Copyright (C) 1999 Jon S. Berndt (jsb@hal-pc.org) -------------
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later Foundation; either version 2 of the License, or (at your option) any later
version. version.
This program is distributed in the hope that it will be useful, but WITHOUT This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
details. details.
You should have received a copy of the GNU General Public License along with You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place - Suite 330, Boston, MA 02111-1307, USA. Place - Suite 330, Boston, MA 02111-1307, USA.
Further information about the GNU General Public License can also be found on Further information about the GNU General Public License can also be found on
the world wide web at http://www.gnu.org. the world wide web at http://www.gnu.org.
FUNCTIONAL DESCRIPTION FUNCTIONAL DESCRIPTION
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
See header file. See header file.
HISTORY HISTORY
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
01/21/99 JSB Created 01/21/99 JSB Created
09/03/99 JSB Changed Rocket thrust equation to correct -= Thrust instead of 09/03/99 JSB Changed Rocket thrust equation to correct -= Thrust instead of
+= Thrust (thanks to Tony Peden) += Thrust (thanks to Tony Peden)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#ifdef FGFS #ifdef FGFS
# include <simgear/compiler.h> # include <simgear/compiler.h>
# ifdef SG_HAVE_STD_INCLUDES # ifdef SG_HAVE_STD_INCLUDES
# include <fstream> # include <fstream>
# else # else
# include <fstream.h> # include <fstream.h>
# endif # endif
#else #else
# if defined(sgi) && !defined(__GNUC__) # if defined(sgi) && !defined(__GNUC__)
# include <fstream.h> # include <fstream.h>
# else # else
# include <fstream> # include <fstream>
# endif # endif
#endif #endif
#include "FGEngine.h" #include "FGEngine.h"
#include "FGTank.h" #include "FGTank.h"
static const char *IdSrc = "$Id$"; static const char *IdSrc = "$Id$";
static const char *IdHdr = ID_ENGINE; static const char *IdHdr = ID_ENGINE;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS IMPLEMENTATION CLASS IMPLEMENTATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
FGEngine::FGEngine(FGFDMExec* exec) { FGEngine::FGEngine(FGFDMExec* exec) {
FDMExec = exec; FDMExec = exec;
State = FDMExec->GetState(); State = FDMExec->GetState();
Atmosphere = FDMExec->GetAtmosphere(); Atmosphere = FDMExec->GetAtmosphere();
FCS = FDMExec->GetFCS(); FCS = FDMExec->GetFCS();
Propulsion = FDMExec->GetPropulsion(); Propulsion = FDMExec->GetPropulsion();
Aircraft = FDMExec->GetAircraft(); Aircraft = FDMExec->GetAircraft();
Translation = FDMExec->GetTranslation(); Translation = FDMExec->GetTranslation();
Rotation = FDMExec->GetRotation(); Rotation = FDMExec->GetRotation();
Position = FDMExec->GetPosition(); Position = FDMExec->GetPosition();
Auxiliary = FDMExec->GetAuxiliary(); Auxiliary = FDMExec->GetAuxiliary();
Output = FDMExec->GetOutput(); Output = FDMExec->GetOutput();
Mixture = 1.0; // FIXME: get actual value Mixture = 1.0; // FIXME: get actual value
Thrust = PctPower = 0.0; Thrust = PctPower = 0.0;
Starved = Flameout = false; Starved = Flameout = false;
Running = false; Running = false;
Cranking = Starter = false; Cranking = Starter = false;
if (debug_lvl & 2) cout << "Instantiated: FGEngine" << endl; if (debug_lvl & 2) cout << "Instantiated: FGEngine" << endl;
TrimMode = false; TrimMode = false;
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FGEngine::~FGEngine() FGEngine::~FGEngine()
{ {
if (debug_lvl & 2) cout << "Destroyed: FGEngine" << endl; if (debug_lvl & 2) cout << "Destroyed: FGEngine" << endl;
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// This base class function should be called from within the // This base class function should be called from within the
// derived class' Calculate() function before any other calculations are done. // derived class' Calculate() function before any other calculations are done.
// This base class method removes fuel from the fuel tanks as appropriate, // This base class method removes fuel from the fuel tanks as appropriate,
// and sets the starved flag if necessary. // and sets the starved flag if necessary.
void FGEngine::ConsumeFuel(void) { void FGEngine::ConsumeFuel(void) {
float Fshortage, Oshortage; float Fshortage, Oshortage;
FGTank* Tank; FGTank* Tank;
if (TrimMode) return; if (TrimMode) return;
Fshortage = Oshortage = 0.0; Fshortage = Oshortage = 0.0;
for (unsigned int i=0; i<SourceTanks.size(); i++) { for (unsigned int i=0; i<SourceTanks.size(); i++) {
Tank = Propulsion->GetTank(i); Tank = Propulsion->GetTank(i);
if (Tank->GetType() == FGTank::ttFUEL) { if (Tank->GetType() == FGTank::ttFUEL) {
Fshortage += Tank->Reduce(CalcFuelNeed()/Propulsion->GetnumSelectedFuelTanks()); Fshortage += Tank->Reduce(CalcFuelNeed()/Propulsion->GetnumSelectedFuelTanks());
} else { } else {
Oshortage += Tank->Reduce(CalcOxidizerNeed()/Propulsion->GetnumSelectedOxiTanks()); Oshortage += Tank->Reduce(CalcOxidizerNeed()/Propulsion->GetnumSelectedOxiTanks());
} }
} }
if (Fshortage < 0.00 || Oshortage < 0.00) Starved = true; if (Fshortage < 0.00 || Oshortage < 0.00) Starved = true;
else Starved = false; else Starved = false;
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
float FGEngine::CalcFuelNeed(void) { float FGEngine::CalcFuelNeed(void) {
FuelNeed = SLFuelFlowMax*PctPower*State->Getdt()*Propulsion->GetRate(); FuelNeed = SLFuelFlowMax*PctPower*State->Getdt()*Propulsion->GetRate();
return FuelNeed; return FuelNeed;
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
float FGEngine::CalcOxidizerNeed(void) { float FGEngine::CalcOxidizerNeed(void) {
OxidizerNeed = SLOxiFlowMax*PctPower*State->Getdt()*Propulsion->GetRate(); OxidizerNeed = SLOxiFlowMax*PctPower*State->Getdt()*Propulsion->GetRate();
return OxidizerNeed; return OxidizerNeed;
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGEngine::SetPlacement(float x, float y, float z, float pitch, float yaw) { void FGEngine::SetPlacement(float x, float y, float z, float pitch, float yaw) {
X = x; X = x;
Y = y; Y = y;
Z = z; Z = z;
EnginePitch = pitch; EnginePitch = pitch;
EngineYaw = yaw; EngineYaw = yaw;
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGEngine::AddFeedTank(int tkID) void FGEngine::AddFeedTank(int tkID)
{ {
SourceTanks.push_back(tkID); SourceTanks.push_back(tkID);
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGEngine::Debug(void) void FGEngine::Debug(void)
{ {
//TODO: Add your source code here //TODO: Add your source code here
} }

View file

@ -1,252 +1,252 @@
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Header: FGEngine.h Header: FGEngine.h
Author: Jon S. Berndt Author: Jon S. Berndt
Date started: 01/21/99 Date started: 01/21/99
------------- Copyright (C) 1999 Jon S. Berndt (jsb@hal-pc.org) ------------- ------------- Copyright (C) 1999 Jon S. Berndt (jsb@hal-pc.org) -------------
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later Foundation; either version 2 of the License, or (at your option) any later
version. version.
This program is distributed in the hope that it will be useful, but WITHOUT This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
details. details.
You should have received a copy of the GNU General Public License along with You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place - Suite 330, Boston, MA 02111-1307, USA. Place - Suite 330, Boston, MA 02111-1307, USA.
Further information about the GNU General Public License can also be found on Further information about the GNU General Public License can also be found on
the world wide web at http://www.gnu.org. the world wide web at http://www.gnu.org.
FUNCTIONAL DESCRIPTION FUNCTIONAL DESCRIPTION
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
Based on Flightgear code, which is based on LaRCSim. This class simulates Based on Flightgear code, which is based on LaRCSim. This class simulates
a generic engine. a generic engine.
HISTORY HISTORY
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
01/21/99 JSB Created 01/21/99 JSB Created
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SENTRY SENTRY
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#ifndef FGENGINE_H #ifndef FGENGINE_H
#define FGENGINE_H #define FGENGINE_H
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#ifdef FGFS #ifdef FGFS
# include <simgear/compiler.h> # include <simgear/compiler.h>
# include STL_STRING # include STL_STRING
SG_USING_STD(string); SG_USING_STD(string);
# ifdef SG_HAVE_STD_INCLUDES # ifdef SG_HAVE_STD_INCLUDES
# include <vector> # include <vector>
# else # else
# include <vector.h> # include <vector.h>
# endif # endif
#else #else
# include <vector> # include <vector>
# include <string> # include <string>
#endif #endif
#include "FGJSBBase.h" #include "FGJSBBase.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#define ID_ENGINE "$Id$" #define ID_ENGINE "$Id$"
using std::string; using std::string;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FORWARD DECLARATIONS FORWARD DECLARATIONS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
class FGFDMExec; class FGFDMExec;
class FGState; class FGState;
class FGAtmosphere; class FGAtmosphere;
class FGFCS; class FGFCS;
class FGAircraft; class FGAircraft;
class FGTranslation; class FGTranslation;
class FGRotation; class FGRotation;
class FGPropulsion; class FGPropulsion;
class FGPosition; class FGPosition;
class FGAuxiliary; class FGAuxiliary;
class FGOutput; class FGOutput;
using std::vector; using std::vector;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
COMMENTS, REFERENCES, and NOTES [use "class documentation" below for API docs] COMMENTS, REFERENCES, and NOTES [use "class documentation" below for API docs]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS DOCUMENTATION CLASS DOCUMENTATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
/** Base class for all engines. /** Base class for all engines.
This base class contains methods and members common to all engines, such as This base class contains methods and members common to all engines, such as
logic to drain fuel from the appropriate tank, etc. logic to drain fuel from the appropriate tank, etc.
@author Jon S. Berndt @author Jon S. Berndt
@version $Id$ @version $Id$
*/ */
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS DECLARATION CLASS DECLARATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
class FGEngine : public FGJSBBase class FGEngine : public FGJSBBase
{ {
public: public:
FGEngine(FGFDMExec* exec); FGEngine(FGFDMExec* exec);
virtual ~FGEngine(); virtual ~FGEngine();
enum EngineType {etUnknown, etRocket, etPiston, etTurboProp, etTurboJet, etTurboShaft}; enum EngineType {etUnknown, etRocket, etPiston, etTurboProp, etTurboJet, etTurboShaft};
virtual float GetThrottleMin(void) { return MinThrottle; } virtual float GetThrottleMin(void) { return MinThrottle; }
virtual float GetThrottleMax(void) { return MaxThrottle; } virtual float GetThrottleMax(void) { return MaxThrottle; }
float GetThrottle(void) { return Throttle; } float GetThrottle(void) { return Throttle; }
float GetMixture(void) { return Mixture; } float GetMixture(void) { return Mixture; }
int GetMagnetos(void) { return Magnetos; } int GetMagnetos(void) { return Magnetos; }
bool GetStarter(void) { return Starter; } bool GetStarter(void) { return Starter; }
float GetThrust(void) { return Thrust; } float GetThrust(void) { return Thrust; }
bool GetStarved(void) { return Starved; } bool GetStarved(void) { return Starved; }
bool GetFlameout(void) { return Flameout; } bool GetFlameout(void) { return Flameout; }
bool GetRunning(void) { return Running; } bool GetRunning(void) { return Running; }
bool GetCranking(void) { return Cranking; } bool GetCranking(void) { return Cranking; }
int GetType(void) { return Type; } int GetType(void) { return Type; }
string GetName(void) { return Name; } string GetName(void) { return Name; }
virtual float getManifoldPressure_inHg () const { virtual float getManifoldPressure_inHg () const {
return ManifoldPressure_inHg; return ManifoldPressure_inHg;
} }
virtual float getExhaustGasTemp_degF () const { virtual float getExhaustGasTemp_degF () const {
return (ExhaustGasTemp_degK - 273) * (9.0 / 5.0) + 32.0; return (ExhaustGasTemp_degK - 273) * (9.0 / 5.0) + 32.0;
} }
virtual float getCylinderHeadTemp_degF () const { virtual float getCylinderHeadTemp_degF () const {
return (CylinderHeadTemp_degK - 273) * (9.0 / 5.0) + 32.0; return (CylinderHeadTemp_degK - 273) * (9.0 / 5.0) + 32.0;
} }
virtual float getOilPressure_psi () const { virtual float getOilPressure_psi () const {
return OilPressure_psi; return OilPressure_psi;
} }
virtual float getOilTemp_degF () const { virtual float getOilTemp_degF () const {
return (OilTemp_degK - 273.0) * (9.0 / 5.0) + 32.0; return (OilTemp_degK - 273.0) * (9.0 / 5.0) + 32.0;
} }
void SetStarved(bool tt) {Starved = tt;} void SetStarved(bool tt) {Starved = tt;}
void SetStarved(void) {Starved = true;} void SetStarved(void) {Starved = true;}
void SetRunning(bool bb) { Running=bb; } void SetRunning(bool bb) { Running=bb; }
void SetName(string name) {Name = name;} void SetName(string name) {Name = name;}
void AddFeedTank(int tkID); void AddFeedTank(int tkID);
void SetMagnetos(int m) { Magnetos = m; } void SetMagnetos(int m) { Magnetos = m; }
void SetStarter(bool s) { Starter = s;} void SetStarter(bool s) { Starter = s;}
/** Calculates the thrust of the engine, and other engine functions. /** Calculates the thrust of the engine, and other engine functions.
@param PowerRequired this is the power required to run the thrusting device @param PowerRequired this is the power required to run the thrusting device
such as a propeller. This resisting effect must be provided to the such as a propeller. This resisting effect must be provided to the
engine model. engine model.
@return Thrust in pounds */ @return Thrust in pounds */
virtual float Calculate(float PowerRequired) {return 0.0;}; virtual float Calculate(float PowerRequired) {return 0.0;};
/** Reduces the fuel in the active tanks by the amount required. /** Reduces the fuel in the active tanks by the amount required.
This function should be called from within the This function should be called from within the
derived class' Calculate() function before any other calculations are derived class' Calculate() function before any other calculations are
done. This base class method removes fuel from the fuel tanks as done. This base class method removes fuel from the fuel tanks as
appropriate, and sets the starved flag if necessary. */ appropriate, and sets the starved flag if necessary. */
void ConsumeFuel(void); void ConsumeFuel(void);
/** The fuel need is calculated based on power levels and flow rate for that /** The fuel need is calculated based on power levels and flow rate for that
power level. It is also turned from a rate into an actual amount (pounds) power level. It is also turned from a rate into an actual amount (pounds)
by multiplying it by the delta T and the rate. by multiplying it by the delta T and the rate.
@return Total fuel requirement for this engine in pounds. */ @return Total fuel requirement for this engine in pounds. */
float CalcFuelNeed(void); float CalcFuelNeed(void);
/** The oxidizer need is calculated based on power levels and flow rate for that /** The oxidizer need is calculated based on power levels and flow rate for that
power level. It is also turned from a rate into an actual amount (pounds) power level. It is also turned from a rate into an actual amount (pounds)
by multiplying it by the delta T and the rate. by multiplying it by the delta T and the rate.
@return Total oxidizer requirement for this engine in pounds. */ @return Total oxidizer requirement for this engine in pounds. */
float CalcOxidizerNeed(void); float CalcOxidizerNeed(void);
/// Sets engine placement information /// Sets engine placement information
void SetPlacement(float x, float y, float z, float pitch, float yaw); void SetPlacement(float x, float y, float z, float pitch, float yaw);
virtual float GetPowerAvailable(void) {return 0.0;}; virtual float GetPowerAvailable(void) {return 0.0;};
bool GetTrimMode(void) {return TrimMode;} bool GetTrimMode(void) {return TrimMode;}
void SetTrimMode(bool state) {TrimMode = state;} void SetTrimMode(bool state) {TrimMode = state;}
protected: protected:
string Name; string Name;
EngineType Type; EngineType Type;
float X, Y, Z; float X, Y, Z;
float EnginePitch; float EnginePitch;
float EngineYaw; float EngineYaw;
float SLFuelFlowMax; float SLFuelFlowMax;
float SLOxiFlowMax; float SLOxiFlowMax;
float MaxThrottle; float MaxThrottle;
float MinThrottle; float MinThrottle;
float Thrust; float Thrust;
float Throttle; float Throttle;
float Mixture; float Mixture;
int Magnetos; int Magnetos;
bool Starter; bool Starter;
float FuelNeed, OxidizerNeed; float FuelNeed, OxidizerNeed;
bool Starved; bool Starved;
bool Flameout; bool Flameout;
bool Running; bool Running;
bool Cranking; bool Cranking;
float PctPower; float PctPower;
int EngineNumber; int EngineNumber;
bool TrimMode; bool TrimMode;
float ManifoldPressure_inHg; float ManifoldPressure_inHg;
float ExhaustGasTemp_degK; float ExhaustGasTemp_degK;
float CylinderHeadTemp_degK; float CylinderHeadTemp_degK;
float OilPressure_psi; float OilPressure_psi;
float OilTemp_degK; float OilTemp_degK;
FGFDMExec* FDMExec; FGFDMExec* FDMExec;
FGState* State; FGState* State;
FGAtmosphere* Atmosphere; FGAtmosphere* Atmosphere;
FGFCS* FCS; FGFCS* FCS;
FGPropulsion* Propulsion; FGPropulsion* Propulsion;
FGAircraft* Aircraft; FGAircraft* Aircraft;
FGTranslation* Translation; FGTranslation* Translation;
FGRotation* Rotation; FGRotation* Rotation;
FGPosition* Position; FGPosition* Position;
FGAuxiliary* Auxiliary; FGAuxiliary* Auxiliary;
FGOutput* Output; FGOutput* Output;
vector <int> SourceTanks; vector <int> SourceTanks;
void Debug(void); void Debug(void);
}; };
#include "FGState.h" #include "FGState.h"
#include "FGFDMExec.h" #include "FGFDMExec.h"
#include "FGAtmosphere.h" #include "FGAtmosphere.h"
#include "FGFCS.h" #include "FGFCS.h"
#include "FGAircraft.h" #include "FGAircraft.h"
#include "FGTranslation.h" #include "FGTranslation.h"
#include "FGRotation.h" #include "FGRotation.h"
#include "FGPropulsion.h" #include "FGPropulsion.h"
#include "FGPosition.h" #include "FGPosition.h"
#include "FGAuxiliary.h" #include "FGAuxiliary.h"
#include "FGOutput.h" #include "FGOutput.h"
#include "FGDefs.h" #include "FGDefs.h"
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#endif #endif

View file

@ -1,339 +1,339 @@
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Module: FGFCS.cpp Module: FGFCS.cpp
Author: Jon Berndt Author: Jon Berndt
Date started: 12/12/98 Date started: 12/12/98
Purpose: Model the flight controls Purpose: Model the flight controls
Called by: FDMExec Called by: FDMExec
------------- Copyright (C) 1999 Jon S. Berndt (jsb@hal-pc.org) ------------- ------------- Copyright (C) 1999 Jon S. Berndt (jsb@hal-pc.org) -------------
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later Foundation; either version 2 of the License, or (at your option) any later
version. version.
This program is distributed in the hope that it will be useful, but WITHOUT This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
details. details.
You should have received a copy of the GNU General Public License along with You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place - Suite 330, Boston, MA 02111-1307, USA. Place - Suite 330, Boston, MA 02111-1307, USA.
Further information about the GNU General Public License can also be found on Further information about the GNU General Public License can also be found on
the world wide web at http://www.gnu.org. the world wide web at http://www.gnu.org.
FUNCTIONAL DESCRIPTION FUNCTIONAL DESCRIPTION
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
This class models the flight controls for a specific airplane This class models the flight controls for a specific airplane
HISTORY HISTORY
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
12/12/98 JSB Created 12/12/98 JSB Created
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGDefs.h" #include "FGDefs.h"
#include "FGFCS.h" #include "FGFCS.h"
#include "FGState.h" #include "FGState.h"
#include "FGFDMExec.h" #include "FGFDMExec.h"
#include "FGAtmosphere.h" #include "FGAtmosphere.h"
#include "FGAircraft.h" #include "FGAircraft.h"
#include "FGTranslation.h" #include "FGTranslation.h"
#include "FGRotation.h" #include "FGRotation.h"
#include "FGPosition.h" #include "FGPosition.h"
#include "FGAuxiliary.h" #include "FGAuxiliary.h"
#include "FGOutput.h" #include "FGOutput.h"
#include "filtersjb/FGFilter.h" #include "filtersjb/FGFilter.h"
#include "filtersjb/FGDeadBand.h" #include "filtersjb/FGDeadBand.h"
#include "filtersjb/FGGain.h" #include "filtersjb/FGGain.h"
#include "filtersjb/FGGradient.h" #include "filtersjb/FGGradient.h"
#include "filtersjb/FGSwitch.h" #include "filtersjb/FGSwitch.h"
#include "filtersjb/FGSummer.h" #include "filtersjb/FGSummer.h"
#include "filtersjb/FGFlaps.h" #include "filtersjb/FGFlaps.h"
static const char *IdSrc = "$Id$"; static const char *IdSrc = "$Id$";
static const char *IdHdr = ID_FCS; static const char *IdHdr = ID_FCS;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS IMPLEMENTATION CLASS IMPLEMENTATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
FGFCS::FGFCS(FGFDMExec* fdmex) : FGModel(fdmex) FGFCS::FGFCS(FGFDMExec* fdmex) : FGModel(fdmex)
{ {
Name = "FGFCS"; Name = "FGFCS";
DaCmd = DeCmd = DrCmd = DfCmd = DsbCmd = DspCmd = PTrimCmd = 0.0; DaCmd = DeCmd = DrCmd = DfCmd = DsbCmd = DspCmd = PTrimCmd = 0.0;
DaPos = DePos = DrPos = DfPos = DsbPos = DspPos = 0.0; DaPos = DePos = DrPos = DfPos = DsbPos = DspPos = 0.0;
LeftBrake = RightBrake = CenterBrake = 0.0; LeftBrake = RightBrake = CenterBrake = 0.0;
if (debug_lvl & 2) cout << "Instantiated: " << Name << endl; if (debug_lvl & 2) cout << "Instantiated: " << Name << endl;
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FGFCS::~FGFCS() FGFCS::~FGFCS()
{ {
ThrottleCmd.clear(); ThrottleCmd.clear();
ThrottlePos.clear(); ThrottlePos.clear();
MixtureCmd.clear(); MixtureCmd.clear();
MixturePos.clear(); MixturePos.clear();
unsigned int i; unsigned int i;
for(i=0;i<Components.size();i++) delete Components[i]; for(i=0;i<Components.size();i++) delete Components[i];
if (debug_lvl & 2) cout << "Destroyed: FGFCS" << endl; if (debug_lvl & 2) cout << "Destroyed: FGFCS" << endl;
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
bool FGFCS::Run(void) bool FGFCS::Run(void)
{ {
unsigned int i; unsigned int i;
if (!FGModel::Run()) { if (!FGModel::Run()) {
for (i=0; i<ThrottlePos.size(); i++) ThrottlePos[i] = ThrottleCmd[i]; for (i=0; i<ThrottlePos.size(); i++) ThrottlePos[i] = ThrottleCmd[i];
for (i=0; i<MixturePos.size(); i++) MixturePos[i] = MixtureCmd[i]; for (i=0; i<MixturePos.size(); i++) MixturePos[i] = MixtureCmd[i];
for (i=0; i<Components.size(); i++) Components[i]->Run(); for (i=0; i<Components.size(); i++) Components[i]->Run();
} else { } else {
} }
return false; return false;
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGFCS::SetThrottleCmd(int engineNum, float setting) void FGFCS::SetThrottleCmd(int engineNum, float setting)
{ {
unsigned int ctr; unsigned int ctr;
if ((int)ThrottleCmd.size() > engineNum) { if ((int)ThrottleCmd.size() > engineNum) {
if (engineNum < 0) { if (engineNum < 0) {
for (ctr=0;ctr<=ThrottleCmd.size();ctr++) ThrottleCmd[ctr] = setting; for (ctr=0;ctr<=ThrottleCmd.size();ctr++) ThrottleCmd[ctr] = setting;
} else { } else {
ThrottleCmd[engineNum] = setting; ThrottleCmd[engineNum] = setting;
} }
} else { } else {
cerr << "Throttle " << engineNum << " does not exist! " << ThrottleCmd.size() cerr << "Throttle " << engineNum << " does not exist! " << ThrottleCmd.size()
<< " engines exist, but attempted throttle command is for engine " << " engines exist, but attempted throttle command is for engine "
<< engineNum << endl; << engineNum << endl;
} }
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGFCS::SetThrottlePos(int engineNum, float setting) void FGFCS::SetThrottlePos(int engineNum, float setting)
{ {
unsigned int ctr; unsigned int ctr;
if ((int)ThrottlePos.size() > engineNum) { if ((int)ThrottlePos.size() > engineNum) {
if (engineNum < 0) { if (engineNum < 0) {
for (ctr=0;ctr<=ThrottlePos.size();ctr++) ThrottlePos[ctr] = setting; for (ctr=0;ctr<=ThrottlePos.size();ctr++) ThrottlePos[ctr] = setting;
} else { } else {
ThrottlePos[engineNum] = setting; ThrottlePos[engineNum] = setting;
} }
} else { } else {
cerr << "Throttle " << engineNum << " does not exist! " << ThrottlePos.size() cerr << "Throttle " << engineNum << " does not exist! " << ThrottlePos.size()
<< " engines exist, but attempted throttle position setting is for engine " << " engines exist, but attempted throttle position setting is for engine "
<< engineNum << endl; << engineNum << endl;
} }
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
float FGFCS::GetThrottleCmd(int engineNum) float FGFCS::GetThrottleCmd(int engineNum)
{ {
if ((int)ThrottleCmd.size() > engineNum) { if ((int)ThrottleCmd.size() > engineNum) {
if (engineNum < 0) { if (engineNum < 0) {
cerr << "Cannot get throttle value for ALL engines" << endl; cerr << "Cannot get throttle value for ALL engines" << endl;
} else { } else {
return ThrottleCmd[engineNum]; return ThrottleCmd[engineNum];
} }
} else { } else {
cerr << "Throttle " << engineNum << " does not exist! " << ThrottleCmd.size() cerr << "Throttle " << engineNum << " does not exist! " << ThrottleCmd.size()
<< " engines exist, but throttle setting for engine " << engineNum << " engines exist, but throttle setting for engine " << engineNum
<< " is selected" << endl; << " is selected" << endl;
} }
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
float FGFCS::GetThrottlePos(int engineNum) float FGFCS::GetThrottlePos(int engineNum)
{ {
if ((int)ThrottlePos.size() > engineNum) { if ((int)ThrottlePos.size() > engineNum) {
if (engineNum < 0) { if (engineNum < 0) {
cerr << "Cannot get throttle value for ALL engines" << endl; cerr << "Cannot get throttle value for ALL engines" << endl;
} else { } else {
return ThrottlePos[engineNum]; return ThrottlePos[engineNum];
} }
} else { } else {
cerr << "Throttle " << engineNum << " does not exist! " << ThrottlePos.size() cerr << "Throttle " << engineNum << " does not exist! " << ThrottlePos.size()
<< " engines exist, but attempted throttle position setting is for engine " << " engines exist, but attempted throttle position setting is for engine "
<< engineNum << endl; << engineNum << endl;
} }
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGFCS::SetMixtureCmd(int engineNum, float setting) void FGFCS::SetMixtureCmd(int engineNum, float setting)
{ {
unsigned int ctr; unsigned int ctr;
if (engineNum < 0) { if (engineNum < 0) {
for (ctr=0;ctr<MixtureCmd.size();ctr++) MixtureCmd[ctr] = setting; for (ctr=0;ctr<MixtureCmd.size();ctr++) MixtureCmd[ctr] = setting;
} else { } else {
MixtureCmd[engineNum] = setting; MixtureCmd[engineNum] = setting;
} }
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGFCS::SetMixturePos(int engineNum, float setting) void FGFCS::SetMixturePos(int engineNum, float setting)
{ {
unsigned int ctr; unsigned int ctr;
if (engineNum < 0) { if (engineNum < 0) {
for (ctr=0;ctr<=MixtureCmd.size();ctr++) MixturePos[ctr] = MixtureCmd[ctr]; for (ctr=0;ctr<=MixtureCmd.size();ctr++) MixturePos[ctr] = MixtureCmd[ctr];
} else { } else {
MixturePos[engineNum] = setting; MixturePos[engineNum] = setting;
} }
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
bool FGFCS::Load(FGConfigFile* AC_cfg) bool FGFCS::Load(FGConfigFile* AC_cfg)
{ {
string token; string token;
Name = Name + ":" + AC_cfg->GetValue("NAME"); Name = Name + ":" + AC_cfg->GetValue("NAME");
if (debug_lvl > 0) cout << " Control System Name: " << Name << endl; if (debug_lvl > 0) cout << " Control System Name: " << Name << endl;
AC_cfg->GetNextConfigLine(); AC_cfg->GetNextConfigLine();
while ((token = AC_cfg->GetValue()) != "/FLIGHT_CONTROL") { while ((token = AC_cfg->GetValue()) != "/FLIGHT_CONTROL") {
if (token == "COMPONENT") { if (token == "COMPONENT") {
token = AC_cfg->GetValue("TYPE"); token = AC_cfg->GetValue("TYPE");
if (debug_lvl > 0) cout << " Loading Component \"" if (debug_lvl > 0) cout << " Loading Component \""
<< AC_cfg->GetValue("NAME") << AC_cfg->GetValue("NAME")
<< "\" of type: " << token << endl; << "\" of type: " << token << endl;
if ((token == "LAG_FILTER") || if ((token == "LAG_FILTER") ||
(token == "LEAD_LAG_FILTER") || (token == "LEAD_LAG_FILTER") ||
(token == "SECOND_ORDER_FILTER") || (token == "SECOND_ORDER_FILTER") ||
(token == "WASHOUT_FILTER") || (token == "WASHOUT_FILTER") ||
(token == "INTEGRATOR") ) { (token == "INTEGRATOR") ) {
Components.push_back(new FGFilter(this, AC_cfg)); Components.push_back(new FGFilter(this, AC_cfg));
} else if ((token == "PURE_GAIN") || } else if ((token == "PURE_GAIN") ||
(token == "SCHEDULED_GAIN") || (token == "SCHEDULED_GAIN") ||
(token == "AEROSURFACE_SCALE") ) { (token == "AEROSURFACE_SCALE") ) {
Components.push_back(new FGGain(this, AC_cfg)); Components.push_back(new FGGain(this, AC_cfg));
} else if (token == "SUMMER") { } else if (token == "SUMMER") {
Components.push_back(new FGSummer(this, AC_cfg)); Components.push_back(new FGSummer(this, AC_cfg));
} else if (token == "DEADBAND") { } else if (token == "DEADBAND") {
Components.push_back(new FGDeadBand(this, AC_cfg)); Components.push_back(new FGDeadBand(this, AC_cfg));
} else if (token == "GRADIENT") { } else if (token == "GRADIENT") {
Components.push_back(new FGGradient(this, AC_cfg)); Components.push_back(new FGGradient(this, AC_cfg));
} else if (token == "SWITCH") { } else if (token == "SWITCH") {
Components.push_back(new FGSwitch(this, AC_cfg)); Components.push_back(new FGSwitch(this, AC_cfg));
} else if (token == "FLAPS") { } else if (token == "FLAPS") {
Components.push_back(new FGFlaps(this, AC_cfg)); Components.push_back(new FGFlaps(this, AC_cfg));
} else { } else {
cerr << "Unknown token [" << token << "] in FCS portion of config file" << endl; cerr << "Unknown token [" << token << "] in FCS portion of config file" << endl;
return false; return false;
} }
AC_cfg->GetNextConfigLine(); AC_cfg->GetNextConfigLine();
} }
} }
return true; return true;
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
float FGFCS::GetComponentOutput(eParam idx) { float FGFCS::GetComponentOutput(eParam idx) {
return Components[idx]->GetOutput(); return Components[idx]->GetOutput();
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
string FGFCS::GetComponentName(int idx) { string FGFCS::GetComponentName(int idx) {
return Components[idx]->GetName(); return Components[idx]->GetName();
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
float FGFCS::GetBrake(FGLGear::BrakeGroup bg) { float FGFCS::GetBrake(FGLGear::BrakeGroup bg) {
switch (bg) { switch (bg) {
case FGLGear::bgLeft: case FGLGear::bgLeft:
return LeftBrake; return LeftBrake;
case FGLGear::bgRight: case FGLGear::bgRight:
return RightBrake; return RightBrake;
case FGLGear::bgCenter: case FGLGear::bgCenter:
return CenterBrake; return CenterBrake;
default: default:
cerr << "GetBrake asked to return a bogus brake value" << endl; cerr << "GetBrake asked to return a bogus brake value" << endl;
} }
return 0.0; return 0.0;
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
string FGFCS::GetComponentStrings(void) string FGFCS::GetComponentStrings(void)
{ {
unsigned int comp; unsigned int comp;
string CompStrings = ""; string CompStrings = "";
bool firstime = true; bool firstime = true;
for (comp = 0; comp < Components.size(); comp++) { for (comp = 0; comp < Components.size(); comp++) {
if (firstime) firstime = false; if (firstime) firstime = false;
else CompStrings += ", "; else CompStrings += ", ";
CompStrings += Components[comp]->GetName(); CompStrings += Components[comp]->GetName();
} }
return CompStrings; return CompStrings;
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
string FGFCS::GetComponentValues(void) string FGFCS::GetComponentValues(void)
{ {
unsigned int comp; unsigned int comp;
string CompValues = ""; string CompValues = "";
char buffer[10]; char buffer[10];
bool firstime = true; bool firstime = true;
for (comp = 0; comp < Components.size(); comp++) { for (comp = 0; comp < Components.size(); comp++) {
if (firstime) firstime = false; if (firstime) firstime = false;
else CompValues += ", "; else CompValues += ", ";
sprintf(buffer, "%9.6f", Components[comp]->GetOutput()); sprintf(buffer, "%9.6f", Components[comp]->GetOutput());
CompValues += string(buffer); CompValues += string(buffer);
} }
return CompValues; return CompValues;
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGFCS::AddThrottle(void) void FGFCS::AddThrottle(void)
{ {
ThrottleCmd.push_back(0.0); ThrottleCmd.push_back(0.0);
ThrottlePos.push_back(0.0); ThrottlePos.push_back(0.0);
MixtureCmd.push_back(0.0); // assume throttle and mixture are coupled MixtureCmd.push_back(0.0); // assume throttle and mixture are coupled
MixturePos.push_back(0.0); MixturePos.push_back(0.0);
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGFCS::Debug(void) void FGFCS::Debug(void)
{ {
//TODO: Add your source code here //TODO: Add your source code here
} }

View file

@ -93,9 +93,7 @@ FGColumnVector3& FGForce::GetBodyForces(void) {
vDXYZ(2) = (vXYZn(2) - fdmex->GetMassBalance()->GetXYZcg(2))*INCHTOFT; //cg and rp values are in inches 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(3) = -(vXYZn(3) - fdmex->GetMassBalance()->GetXYZcg(3))*INCHTOFT;
// include rotational effects. vH will be set in descendent class such as vM = vMn + vDXYZ*vFb;
// FGPropeller, and in most other cases will be zero.
vM = vMn + vDXYZ*vFb + fdmex->GetRotation()->GetPQR()*vH;
return vFb; return vFb;
} }

File diff suppressed because it is too large Load diff

View file

@ -1,161 +1,161 @@
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Header: FGPiston.h Header: FGPiston.h
Author: Jon S. Berndt Author: Jon S. Berndt
Date started: 09/12/2000 Date started: 09/12/2000
------------- Copyright (C) 2000 Jon S. Berndt (jsb@hal-pc.org) -------------- ------------- Copyright (C) 2000 Jon S. Berndt (jsb@hal-pc.org) --------------
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later Foundation; either version 2 of the License, or (at your option) any later
version. version.
This program is distributed in the hope that it will be useful, but WITHOUT This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
details. details.
You should have received a copy of the GNU General Public License along with You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place - Suite 330, Boston, MA 02111-1307, USA. Place - Suite 330, Boston, MA 02111-1307, USA.
Further information about the GNU General Public License can also be found on Further information about the GNU General Public License can also be found on
the world wide web at http://www.gnu.org. the world wide web at http://www.gnu.org.
HISTORY HISTORY
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
09/12/2000 JSB Created 09/12/2000 JSB Created
10/01/2001 DPM Modified to use equations from Dave Luff's piston model. 10/01/2001 DPM Modified to use equations from Dave Luff's piston model.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
COMMENTS, REFERENCES, and NOTES COMMENTS, REFERENCES, and NOTES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SENTRY SENTRY
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#ifndef FGPISTON_H #ifndef FGPISTON_H
#define FGPISTON_H #define FGPISTON_H
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGEngine.h" #include "FGEngine.h"
#include "FGConfigFile.h" #include "FGConfigFile.h"
#include "FGTable.h" #include "FGTable.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#define ID_PISTON "$Id$"; #define ID_PISTON "$Id$";
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FORWARD DECLARATIONS FORWARD DECLARATIONS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
COMMENTS, REFERENCES, and NOTES COMMENTS, REFERENCES, and NOTES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DOCUMENTATION DOCUMENTATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
/** Models Dave Luff's engine model as ported into JSBSim by David Megginson. /** Models Dave Luff's engine model as ported into JSBSim by David Megginson.
@author Jon S. Berndt (Engine framework code and framework-related mods) @author Jon S. Berndt (Engine framework code and framework-related mods)
@author Dave Luff (engine operational code) @author Dave Luff (engine operational code)
@author David Megginson (porting and additional code) @author David Megginson (porting and additional code)
@version $Id$ @version $Id$
*/ */
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS DECLARATION CLASS DECLARATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
class FGPiston : public FGEngine class FGPiston : public FGEngine
{ {
public: public:
/// Constructor /// Constructor
FGPiston(FGFDMExec* exec, FGConfigFile* Eng_cfg); FGPiston(FGFDMExec* exec, FGConfigFile* Eng_cfg);
/// Destructor /// Destructor
~FGPiston(); ~FGPiston();
float Calculate(float PowerRequired); float Calculate(float PowerRequired);
float GetPowerAvailable(void) {return PowerAvailable;} float GetPowerAvailable(void) {return PowerAvailable;}
private: private:
float BrakeHorsePower; float BrakeHorsePower;
float SpeedSlope; float SpeedSlope;
float SpeedIntercept; float SpeedIntercept;
float AltitudeSlope; float AltitudeSlope;
float PowerAvailable; float PowerAvailable;
// timestep // timestep
float dt; float dt;
void doEngineStartup(void); void doEngineStartup(void);
void doManifoldPressure(void); void doManifoldPressure(void);
void doAirFlow(void); void doAirFlow(void);
void doFuelFlow(void); void doFuelFlow(void);
void doEnginePower(void); void doEnginePower(void);
void doEGT(void); void doEGT(void);
void doCHT(void); void doCHT(void);
void doOilPressure(void); void doOilPressure(void);
void doOilTemperature(void); void doOilTemperature(void);
// //
// constants // constants
// //
const float CONVERT_CUBIC_INCHES_TO_METERS_CUBED; const float CONVERT_CUBIC_INCHES_TO_METERS_CUBED;
const float R_air; const float R_air;
const float rho_fuel; // kg/m^3 const float rho_fuel; // kg/m^3
const float calorific_value_fuel; // W/Kg (approximate) const float calorific_value_fuel; // W/Kg (approximate)
const float Cp_air; // J/KgK const float Cp_air; // J/KgK
const float Cp_fuel; // J/KgK const float Cp_fuel; // J/KgK
FGTable *Lookup_Combustion_Efficiency; FGTable *Lookup_Combustion_Efficiency;
FGTable *Power_Mixture_Correlation; FGTable *Power_Mixture_Correlation;
// //
// Configuration // Configuration
// //
float MinManifoldPressure_inHg; // Inches Hg float MinManifoldPressure_inHg; // Inches Hg
float MaxManifoldPressure_inHg; // Inches Hg float MaxManifoldPressure_inHg; // Inches Hg
float Displacement; // cubic inches float Displacement; // cubic inches
float MaxHP; // horsepower float MaxHP; // horsepower
float Cycles; // cycles/power stroke float Cycles; // cycles/power stroke
float IdleRPM; // revolutions per minute float IdleRPM; // revolutions per minute
// //
// Inputs (in addition to those in FGEngine). // Inputs (in addition to those in FGEngine).
// //
float p_amb; // Pascals float p_amb; // Pascals
float p_amb_sea_level; // Pascals float p_amb_sea_level; // Pascals
float T_amb; // degrees Kelvin float T_amb; // degrees Kelvin
float RPM; // revolutions per minute float RPM; // revolutions per minute
float IAS; // knots float IAS; // knots
// //
// Outputs (in addition to those in FGEngine). // Outputs (in addition to those in FGEngine).
// //
bool Magneto_Left; bool Magneto_Left;
bool Magneto_Right; bool Magneto_Right;
float rho_air; float rho_air;
float volumetric_efficiency; float volumetric_efficiency;
float m_dot_air; float m_dot_air;
float equivalence_ratio; float equivalence_ratio;
float m_dot_fuel; float m_dot_fuel;
float Percentage_Power; float Percentage_Power;
float HP; float HP;
float combustion_efficiency; float combustion_efficiency;
void Debug(void); void Debug(void);
}; };
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#endif #endif

View file

@ -67,10 +67,6 @@ FGPropeller::FGPropeller(FGFDMExec* exec, FGConfigFile* Prop_cfg) : FGThruster(e
*Prop_cfg >> MinPitch; *Prop_cfg >> MinPitch;
} else if (token == "MAXPITCH") { } else if (token == "MAXPITCH") {
*Prop_cfg >> MaxPitch; *Prop_cfg >> MaxPitch;
} else if (token == "P_FACTOR") {
*Prop_cfg >> P_Factor;
} else if (token == "SENSE") {
*Prop_cfg >> Sense;
} else if (token == "EFFICIENCY") { } else if (token == "EFFICIENCY") {
*Prop_cfg >> rows >> cols; *Prop_cfg >> rows >> cols;
if (cols == 1) Efficiency = new FGTable(rows); if (cols == 1) Efficiency = new FGTable(rows);
@ -101,14 +97,6 @@ FGPropeller::FGPropeller(FGFDMExec* exec, FGConfigFile* Prop_cfg) : FGThruster(e
cout << " Number of Blades = " << numBlades << endl; cout << " Number of Blades = " << numBlades << endl;
cout << " Minimum Pitch = " << MinPitch << endl; cout << " Minimum Pitch = " << MinPitch << endl;
cout << " Maximum Pitch = " << MaxPitch << endl; cout << " Maximum Pitch = " << MaxPitch << endl;
if (P_Factor > 0.0) cout << " P-Factor = " << P_Factor << endl;
if (Sense > 0.0) {
cout << " Rotation Sense = CW (viewed from pilot looking forward)" << endl;
} else if (Sense < 0.0) {
cout << " Rotation Sense = CCW (viewed from pilot looking forward)" << endl;
} else {
cout << " Rotation Sense = indeterminate" << endl;
}
cout << " Efficiency: " << endl; cout << " Efficiency: " << endl;
Efficiency->Print(); Efficiency->Print();
cout << " Thrust Coefficient: " << endl; cout << " Thrust Coefficient: " << endl;
@ -180,8 +168,10 @@ float FGPropeller::Calculate(float PowerAvailable)
vFn(1) = Thrust; vFn(1) = Thrust;
omega = RPS*2.0*M_PI; omega = RPS*2.0*M_PI;
// Must consider rotated axis for propeller (V-22, helicopter case) // The Ixx value and rotation speed given below are for rotation about the
// FIX THIS !! // natural axis of the engine. The transform takes place in the base class
// FGForce::GetBodyForces() function.
vH(eX) = Ixx*omega*fabs(Sense)/Sense; vH(eX) = Ixx*omega*fabs(Sense)/Sense;
vH(eY) = 0.0; vH(eY) = 0.0;
vH(eZ) = 0.0; vH(eZ) = 0.0;
@ -190,6 +180,9 @@ float FGPropeller::Calculate(float PowerAvailable)
Torque = PowerAvailable / omega; Torque = PowerAvailable / omega;
RPM = (RPS + ((Torque / Ixx) / (2.0 * M_PI)) * deltaT) * 60.0; RPM = (RPS + ((Torque / Ixx) / (2.0 * M_PI)) * deltaT) * 60.0;
vMn = fdmex->GetRotation()->GetPQR()*vH + Torque*Sense;
return Thrust; // return thrust in pounds return Thrust; // return thrust in pounds
} }

View file

@ -41,6 +41,7 @@ INCLUDES
#include "FGThruster.h" #include "FGThruster.h"
#include "FGTable.h" #include "FGTable.h"
#include "FGTranslation.h" #include "FGTranslation.h"
#include "FGRotation.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS
@ -114,6 +115,10 @@ public:
propellers. propellers.
@param pitch the pitch of the blade in degrees. */ @param pitch the pitch of the blade in degrees. */
void SetPitch(float pitch) {Pitch = pitch;} void SetPitch(float pitch) {Pitch = pitch;}
void SetPFactor(double pf) {P_Factor = pf;}
void SetSense(double s) { Sense = s;}
/// Retrieves the pitch of the propeller in degrees. /// Retrieves the pitch of the propeller in degrees.
float GetPitch(void) { return Pitch; } float GetPitch(void) { return Pitch; }

View file

@ -185,7 +185,8 @@ bool FGPropulsion::Load(FGConfigFile* AC_cfg)
string thrusterFileName, thrType; string thrusterFileName, thrType;
string parameter; string parameter;
string enginePath = FDMExec->GetEnginePath(); string enginePath = FDMExec->GetEnginePath();
float xLoc, yLoc, zLoc, Pitch, Yaw; double xLoc, yLoc, zLoc, Pitch, Yaw;
double P_Factor = 0, Sense = 0.0;
int Feed; int Feed;
bool ThrottleAdded = false; bool ThrottleAdded = false;
@ -305,12 +306,20 @@ bool FGPropulsion::Load(FGConfigFile* AC_cfg)
else if (token == "ZLOC") *AC_cfg >> zLoc; else if (token == "ZLOC") *AC_cfg >> zLoc;
else if (token == "PITCH") *AC_cfg >> Pitch; else if (token == "PITCH") *AC_cfg >> Pitch;
else if (token == "YAW") *AC_cfg >> Yaw; else if (token == "YAW") *AC_cfg >> Yaw;
else if (token == "P_FACTOR") *AC_cfg >> P_Factor;
else if (token == "SENSE") *AC_cfg >> Sense;
else cerr << "Unknown identifier: " << token << " in engine file: " else cerr << "Unknown identifier: " << token << " in engine file: "
<< engineFileName << endl; << engineFileName << endl;
} }
Thrusters[numThrusters]->SetLocation(xLoc, yLoc, zLoc); Thrusters[numThrusters]->SetLocation(xLoc, yLoc, zLoc);
Thrusters[numThrusters]->SetAnglesToBody(0, Pitch, Yaw); Thrusters[numThrusters]->SetAnglesToBody(0, Pitch, Yaw);
if (thrType == "FG_PROPELLER" && P_Factor > 0.001) {
((FGPropeller*)Thrusters[numThrusters])->SetPFactor(P_Factor);
cout << " P-Factor: " << P_Factor << endl;
((FGPropeller*)Thrusters[numThrusters])->SetSense(Sense);
cout << " Sense: " << Sense << endl;
}
Thrusters[numThrusters]->SetdeltaT(dt*rate); Thrusters[numThrusters]->SetdeltaT(dt*rate);
numThrusters++; numThrusters++;