X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FFDM%2FJSBSim%2FFGEngine.cpp;h=bc73911a8630af43e1d3871c2a41b003d6adbb72;hb=fbee3d10f0aafd4178fc1313edb8593c156b2874;hp=5e673eabf22cdfbac597c6c62d6fc0643db45159;hpb=972bf2263094c9ff25ced601b0d6aac200916443;p=flightgear.git diff --git a/src/FDM/JSBSim/FGEngine.cpp b/src/FDM/JSBSim/FGEngine.cpp index 5e673eabf..bc73911a8 100644 --- a/src/FDM/JSBSim/FGEngine.cpp +++ b/src/FDM/JSBSim/FGEngine.cpp @@ -1,4 +1,4 @@ -/******************************************************************************* +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Module: FGEngine.cpp Author: Jon Berndt @@ -34,204 +34,186 @@ HISTORY 09/03/99 JSB Changed Rocket thrust equation to correct -= Thrust instead of += Thrust (thanks to Tony Peden) -******************************************************************************** +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% INCLUDES -*******************************************************************************/ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ #ifdef FGFS # include -# ifdef FG_HAVE_STD_INCLUDES +# ifdef SG_HAVE_STD_INCLUDES # include # else # include # endif #else -# include +# if defined(sgi) && !defined(__GNUC__) && (_COMPILER_VERSION < 740) +# include +# else +# include +# endif #endif #include "FGEngine.h" -#include "FGState.h" -#include "FGFDMExec.h" -#include "FGAtmosphere.h" -#include "FGFCS.h" -#include "FGAircraft.h" -#include "FGTranslation.h" -#include "FGRotation.h" -#include "FGPosition.h" -#include "FGAuxiliary.h" -#include "FGOutput.h" -#include "FGDefs.h" - -static const char *IdSrc = "$Header$"; -static const char *IdHdr = "ID_ENGINE"; - -/******************************************************************************* -************************************ CODE ************************************** -*******************************************************************************/ - - -FGEngine::FGEngine(FGFDMExec* fdex, string enginePath, string engineName, int num) { - string fullpath; - string tag; - - FDMExec = fdex; - - State = FDMExec->GetState(); - Atmosphere = FDMExec->GetAtmosphere(); - FCS = FDMExec->GetFCS(); - Aircraft = FDMExec->GetAircraft(); +#include "FGTank.h" + +namespace JSBSim { + +static const char *IdSrc = "$Id$"; +static const char *IdHdr = ID_ENGINE; + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +CLASS IMPLEMENTATION +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + + +FGEngine::FGEngine(FGFDMExec* exec) +{ + Name = ""; + Type = etUnknown; + X = Y = Z = 0.0; + EnginePitch = EngineYaw = 0.0; + SLFuelFlowMax = SLOxiFlowMax = 0.0; + MaxThrottle = 1.0; + MinThrottle = 0.0; + Thrust = 0.0; + Throttle = 0.0; + Mixture = 1.0; + Starter = false; + FuelNeed = OxidizerNeed = 0.0; + Starved = Running = Cranking = false; + PctPower = 0.0; + EngineNumber = -1; + TrimMode = false; + FuelFlow_gph = 0.0; + FuelFlow_pph = 0.0; + + FDMExec = exec; + State = FDMExec->GetState(); + Atmosphere = FDMExec->GetAtmosphere(); + FCS = FDMExec->GetFCS(); + Propulsion = FDMExec->GetPropulsion(); + Aircraft = FDMExec->GetAircraft(); Translation = FDMExec->GetTranslation(); - Rotation = FDMExec->GetRotation(); - Position = FDMExec->GetPosition(); - Auxiliary = FDMExec->GetAuxiliary(); - Output = FDMExec->GetOutput(); - - Name = engineName; - -# ifndef macintosh - fullpath = enginePath + "/" + engineName + ".xml"; -# else - fullpath = enginePath + ";" + engineName + ".xml"; -# endif - - cout << " Reading engine: " << engineName << " from file: " << fullpath << endl; - ifstream enginefile(fullpath.c_str()); - - if (enginefile) { - enginefile >> tag; - - if (tag == "ROCKET") Type = etRocket; - else if (tag == "PISTON") Type = etPiston; - else if (tag == "TURBOPROP") Type = etTurboProp; - else if (tag == "TURBOJET") Type = etTurboJet; - else Type = etUnknown; - - switch(Type) { - case etTurboProp: - case etTurboJet: - cerr << "Unsupported Engine type" << tag << endl; - break; - case etUnknown: - cerr << "Unknown engine type: " << tag << endl; - break; - case etPiston: - enginefile >> X; - enginefile >> Y; - enginefile >> Z; - enginefile >> EnginePitch; - enginefile >> EngineYaw; - enginefile >> BrakeHorsePower; - enginefile >> MaxThrottle; - enginefile >> MinThrottle; - enginefile >> SLFuelFlowMax; - enginefile >> SpeedSlope; - enginefile >> SpeedIntercept; - enginefile >> AltitudeSlope; - - break; - case etRocket: - enginefile >> X; - enginefile >> Y; - enginefile >> Z; - enginefile >> EnginePitch; - enginefile >> EngineYaw; - enginefile >> SLThrustMax; - enginefile >> VacThrustMax; - enginefile >> MaxThrottle; - enginefile >> MinThrottle; - enginefile >> SLFuelFlowMax; - enginefile >> SLOxiFlowMax; - break; - } - - enginefile.close(); - } else { - cerr << "Unable to open engine definition file " << fullpath.c_str() << endl; - } - - EngineNumber = num; - Thrust = PctPower = 0.0; - Starved = Flameout = false; - Running = true; + Rotation = FDMExec->GetRotation(); + Position = FDMExec->GetPosition(); + Auxiliary = FDMExec->GetAuxiliary(); + Output = FDMExec->GetOutput(); + + PropertyManager = FDMExec->GetPropertyManager(); + + Debug(0); } +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -FGEngine::~FGEngine(void) {} - - -float FGEngine::CalcRocketThrust(void) { - float lastThrust; - - Throttle = FCS->GetThrottlePos(EngineNumber); - lastThrust = Thrust; // last actual thrust - - if (Throttle < MinThrottle || Starved) { - PctPower = Thrust = 0.0; // desired thrust - Flameout = true; - } else { - PctPower = Throttle / MaxThrottle; - Thrust = PctPower*((1.0 - Atmosphere->GetDensityRatio())*(VacThrustMax - SLThrustMax) + - SLThrustMax); // desired thrust - Flameout = false; - } - +FGEngine::~FGEngine() +{ + Debug(1); +} - if(State->Getdt() > 0.0) { - Thrust -= 0.8*(Thrust - lastThrust); // actual thrust +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// This base class function should be called from within the +// derived class' Calculate() function before any other calculations are done. +// This base class method removes fuel from the fuel tanks as appropriate, +// and sets the starved flag if necessary. + +void FGEngine::ConsumeFuel(void) +{ + double Fshortage, Oshortage; + FGTank* Tank; + + if (TrimMode) return; + Fshortage = Oshortage = 0.0; + for (unsigned int i=0; iGetTank(SourceTanks[i]); + if (Tank->GetType() == FGTank::ttFUEL) { + Fshortage += Tank->Reduce(CalcFuelNeed()/Propulsion->GetnumSelectedFuelTanks()); + } else { + Oshortage += Tank->Reduce(CalcOxidizerNeed()/Propulsion->GetnumSelectedOxiTanks()); + } } - return Thrust; + if (Fshortage < 0.00 || Oshortage < 0.00) Starved = true; + else Starved = false; } +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -float FGEngine::CalcPistonThrust(void) { - float v,h,pa; +double FGEngine::CalcFuelNeed(void) +{ + FuelNeed = SLFuelFlowMax*PctPower*State->Getdt()*Propulsion->GetRate(); + return FuelNeed; +} - Throttle = FCS->GetThrottlePos(EngineNumber); - Throttle /= 100; +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - v = Translation->GetVt(); - h = Position->Geth(); +double FGEngine::CalcOxidizerNeed(void) +{ + OxidizerNeed = SLOxiFlowMax*PctPower*State->Getdt()*Propulsion->GetRate(); + return OxidizerNeed; +} - if (v < 10) - v = 10; - if (h < 0) - h = 0; +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - pa=(SpeedSlope*v + SpeedIntercept)*(1 +AltitudeSlope*h)*BrakeHorsePower; +void FGEngine::SetPlacement(double x, double y, double z, double pitch, double yaw) +{ + X = x; + Y = y; + Z = z; + EnginePitch = pitch; + EngineYaw = yaw; +} - Thrust = Throttle*(pa*HPTOFTLBSSEC)/v; +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - return Thrust; +void FGEngine::AddFeedTank(int tkID) +{ + SourceTanks.push_back(tkID); } +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// The bitmasked value choices are as follows: +// unset: In this case (the default) JSBSim would only print +// out the normally expected messages, essentially echoing +// the config files as they are read. If the environment +// variable is not set, debug_lvl is set to 1 internally +// 0: This requests JSBSim not to output any messages +// whatsoever. +// 1: This value explicity requests the normal JSBSim +// startup messages +// 2: This value asks for a message to be printed out when +// a class is instantiated +// 4: When this value is set, a message is displayed when a +// FGModel object executes its Run() method +// 8: When this value is set, various runtime state variables +// are printed out periodically +// 16: When set various parameters are sanity checked and +// a message is printed out when they go out of bounds + +void FGEngine::Debug(int from) +{ + if (debug_lvl <= 0) return; + + if (debug_lvl & 1) { // Standard console startup message output + if (from == 0) { // Constructor -float FGEngine::CalcThrust(void) { - if(Running) { - switch(Type) { - case etRocket: - return CalcRocketThrust(); - // break; - case etPiston: - return CalcPistonThrust(); - // break; - default: - return 9999.0; - // break; } - } else { - return 0; + } + if (debug_lvl & 2 ) { // Instantiation/Destruction notification + if (from == 0) cout << "Instantiated: FGEngine" << endl; + if (from == 1) cout << "Destroyed: FGEngine" << endl; + } + if (debug_lvl & 4 ) { // Run() method entry print for FGModel-derived objects + } + if (debug_lvl & 8 ) { // Runtime state variables + } + if (debug_lvl & 16) { // Sanity checking + } + if (debug_lvl & 64) { + if (from == 0) { // Constructor + cout << IdSrc << endl; + cout << IdHdr << endl; + } } } - -float FGEngine::CalcFuelNeed() { - FuelNeed = SLFuelFlowMax*PctPower; - return FuelNeed; -} - - -float FGEngine::CalcOxidizerNeed() { - OxidizerNeed = SLOxiFlowMax*PctPower; - return OxidizerNeed; } -