Sync with latest JSBSim
This commit is contained in:
parent
8ff6965f98
commit
fee8c33799
10 changed files with 1596 additions and 1591 deletions
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
|
@ -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++;
|
||||||
|
|
Loading…
Add table
Reference in a new issue