Author: Jon S. Berndt
Date started: 08/20/00
- ------------- Copyright (C) 1999 Jon S. Berndt (jsb@hal-pc.org) -------------
+ ------------- Copyright (C) 1999 Jon S. Berndt (jon@jsbsim.org) -------------
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the Free Software
INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-#ifdef FGFS
-# include <simgear/compiler.h>
-# ifdef SG_HAVE_STD_INCLUDES
-# include <vector>
-# include <iterator>
-# include <fstream>
-# else
-# include <vector.h>
-# include <iterator.h>
-# include <fstream.h>
-# endif
-#else
-# include <vector>
-# include <iterator>
-# include <fstream>
-#endif
+#include <vector>
+#include <iosfwd>
#include "FGModel.h"
-#include <models/propulsion/FGEngine.h>
-#include <models/propulsion/FGTank.h>
-#include <math/FGMatrix33.h>
-#include <input_output/FGXMLFileRead.h>
+#include "propulsion/FGEngine.h"
+#include "math/FGMatrix33.h"
+#include "input_output/FGXMLFileRead.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-#define ID_PROPULSION "$Id$"
+#define ID_PROPULSION "$Id: FGPropulsion.h,v 1.31 2011/10/31 14:54:41 bcoconni Exp $"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FORWARD DECLARATIONS
namespace JSBSim {
+class FGTank;
+class FGEngine;
+
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS DOCUMENTATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
/** Propulsion management class.
The Propulsion class is the container for the entire propulsion system, which is
comprised of engines, and tanks. Once the Propulsion class gets the config file,
- it reads in information which is specific to a type of engine. Then:
+ it reads in the \<propulsion> section. Then:
-# The appropriate engine type instance is created
-# At least one tank object is created, and is linked to an engine.
- At Run time each engines Calculate() method is called.
+ At Run time each engine's Calculate() method is called.
+
+ <h3>Configuration File Format:</h3>
+
+ @code
+ <propulsion>
+ <engine file="{string}">
+ ... see FGEngine, FGThruster, and class for engine type ...
+ </engine>
+ ... more engines ...
+ <tank type="{FUEL | OXIDIZER}">
+ ... see FGTank ...
+ </tank>
+ ... more tanks ...
+ <dump-rate unit="{LBS/MIN | KG/MIN}"> {number} </dump-rate>
+ </propulsion>
+ @endcode
+
@author Jon S. Berndt
- @version $Id$
+ @version $Id: FGPropulsion.h,v 1.31 2011/10/31 14:54:41 bcoconni Exp $
@see
FGEngine
FGTank
/** Executes the propulsion model.
The initial plan for the FGPropulsion class calls for Run() to be executed,
calculating the power available from the engine.
+ Can pass in a value indicating if the executive is directing the simulation to Hold.
+ @param Holding if true, the executive has been directed to hold the sim from
+ advancing time. Some models may ignore this flag, such as the Input
+ model, which may need to be active to listen on a socket for the
+ "Resume" command to be given.
+ @return false if no error */
+ bool Run(bool Holding);
- [Note: Should we be checking the Starved flag here?] */
- bool Run(void);
+ bool InitModel(void);
/** Loads the propulsion system (engine[s] and tank[s]).
Characteristics of the propulsion system are read in from the config file.
bool Load(Element* el);
/// Retrieves the number of engines defined for the aircraft.
- inline unsigned int GetNumEngines(void) const {return (unsigned int)Engines.size();}
+ unsigned int GetNumEngines(void) const {return (unsigned int)Engines.size();}
/** Retrieves an engine object pointer from the list of engines.
@param index the engine index within the vector container
@return the address of the specific engine, or zero if no such engine is
available */
- inline FGEngine* GetEngine(unsigned int index) {
- if (index <= Engines.size()-1) return Engines[index];
- else return 0L; }
+ FGEngine* GetEngine(unsigned int index) const {
+ if (index < Engines.size()) return Engines[index];
+ else return 0L; }
/// Retrieves the number of tanks defined for the aircraft.
- inline unsigned int GetNumTanks(void) const {return (unsigned int)Tanks.size();}
+ unsigned int GetNumTanks(void) const {return (unsigned int)Tanks.size();}
/** Retrieves a tank object pointer from the list of tanks.
@param index the tank index within the vector container
@return the address of the specific tank, or zero if no such tank is
available */
- inline FGTank* GetTank(unsigned int index) {
- if (index <= Tanks.size()-1) return Tanks[index];
- else return 0L; }
+ FGTank* GetTank(unsigned int index) const {
+ if (index < Tanks.size()) return Tanks[index];
+ else return 0L; }
/** Returns the number of fuel tanks currently actively supplying fuel */
- inline int GetnumSelectedFuelTanks(void) const {return numSelectedFuelTanks;}
+ int GetnumSelectedFuelTanks(void) const {return numSelectedFuelTanks;}
/** Returns the number of oxidizer tanks currently actively supplying oxidizer */
- inline int GetnumSelectedOxiTanks(void) const {return numSelectedOxiTanks;}
+ int GetnumSelectedOxiTanks(void) const {return numSelectedOxiTanks;}
/** Loops the engines until thrust output steady (used for trimming) */
bool GetSteadyState(void);
- /** starts the engines in IC mode (dt=0). All engine-specific setup must
- be done before calling this (i.e. magnetos, starter engage, etc.) */
- bool ICEngineStart(void);
+ /** Sets up the engines as running */
+ void InitRunning(int n);
- std::string GetPropulsionStrings(std::string delimeter);
- std::string GetPropulsionValues(std::string delimeter);
+ std::string GetPropulsionStrings(const std::string& delimiter) const;
+ std::string GetPropulsionValues(const std::string& delimiter) const;
+ std::string GetPropulsionTankReport();
- inline FGColumnVector3& GetForces(void) {return vForces; }
- inline double GetForces(int n) const { return vForces(n);}
- inline FGColumnVector3& GetMoments(void) {return vMoments;}
- inline double GetMoments(int n) const {return vMoments(n);}
+ const FGColumnVector3& GetForces(void) const {return vForces; }
+ double GetForces(int n) const { return vForces(n);}
+ const FGColumnVector3& GetMoments(void) const {return vMoments;}
+ double GetMoments(int n) const {return vMoments(n);}
- inline bool GetRefuel(void) {return refuel;}
- inline void SetRefuel(bool setting) {refuel = setting;}
+ bool GetRefuel(void) const {return refuel;}
+ void SetRefuel(bool setting) {refuel = setting;}
+ bool GetFuelDump(void) const {return dump;}
+ void SetFuelDump(bool setting) {dump = setting;}
double Transfer(int source, int target, double amount);
void DoRefuel(double time_slice);
+ void DumpFuel(double time_slice);
- FGColumnVector3& GetTanksMoment(void);
- double GetTanksWeight(void);
+ const FGColumnVector3& GetTanksMoment(void);
+ double GetTanksWeight(void) const;
- std::ifstream* FindEngineFile(std::string filename);
- std::string FindEngineFullPathname(std::string engine_filename);
+ std::ifstream* FindEngineFile(const std::string& filename);
+ std::string FindEngineFullPathname(const std::string& engine_filename);
inline int GetActiveEngine(void) const {return ActiveEngine;}
- inline bool GetFuelFreeze(void) {return fuel_freeze;}
+ inline bool GetFuelFreeze(void) const {return FuelFreeze;}
double GetTotalFuelQuantity(void) const {return TotalFuelQuantity;}
void SetMagnetos(int setting);
void SetCutoff(int setting=0);
void SetActiveEngine(int engine);
void SetFuelFreeze(bool f);
- FGMatrix33& CalculateTankInertias(void);
+ const FGMatrix33& CalculateTankInertias(void);
- void bind();
- void unbind();
+ struct FGEngine::Inputs in;
private:
std::vector <FGEngine*> Engines;
std::vector <FGTank*> Tanks;
- std::vector <FGTank*>::iterator iTank;
unsigned int numSelectedFuelTanks;
unsigned int numSelectedOxiTanks;
unsigned int numFuelTanks;
FGColumnVector3 vXYZtank_arm;
FGMatrix33 tankJ;
bool refuel;
- bool fuel_freeze;
+ bool dump;
+ bool FuelFreeze;
double TotalFuelQuantity;
+ double DumpRate;
bool IsBound;
bool HavePistonEngine;
bool HaveTurbineEngine;
bool HaveTurboPropEngine;
bool HaveRocketEngine;
bool HaveElectricEngine;
+ void ConsumeFuel(FGEngine* engine);
+ int InitializedEngines;
+ bool HasInitializedEngines;
+
+ void bind();
void Debug(int from);
};
}