X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=src%2FFDM%2FJSBSim%2FFGPropulsion.cpp;h=7596fa538b59a1aea6037efa9027b3383eac0aff;hb=95440173caef3ce92ee7308fd58a24dabe4c5f8a;hp=33c6594f25c0c1e6b030042fefa833817db9d903;hpb=58aa15ece98b4f822bbc500e4a31a346cb29582d;p=flightgear.git diff --git a/src/FDM/JSBSim/FGPropulsion.cpp b/src/FDM/JSBSim/FGPropulsion.cpp index 33c6594f2..7596fa538 100644 --- a/src/FDM/JSBSim/FGPropulsion.cpp +++ b/src/FDM/JSBSim/FGPropulsion.cpp @@ -53,25 +53,42 @@ INCLUDES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ #include "FGPropulsion.h" +#include "FGPropertyManager.h" + +#if defined (__APPLE__) +/* Not all systems have the gcvt function */ +inline char* gcvt (double value, int ndigits, char *buf) { + /* note that this is not exactly what gcvt is supposed to do! */ + snprintf (buf, ndigits+1, "%f", value); + return buf; +} +#endif + +namespace JSBSim { static const char *IdSrc = "$Id$"; static const char *IdHdr = ID_PROPULSION; +extern short debug_lvl; + + /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CLASS IMPLEMENTATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ - -FGPropulsion::FGPropulsion(FGFDMExec* exec) : FGModel(exec), - Forces(3), - Moments(3) +FGPropulsion::FGPropulsion(FGFDMExec* exec) : FGModel(exec) { Name = "FGPropulsion"; + numSelectedFuelTanks = numSelectedOxiTanks = 0; numTanks = numEngines = numThrusters = 0; numOxiTanks = numFuelTanks = 0; + dt = 0.0; + ActiveEngine = -1; // -1: ALL, 0: Engine 1, 1: Engine 2 ... + + bind(); - if (debug_lvl & 2) cout << "Instantiated: " << Name << endl; + Debug(0); } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -80,7 +97,8 @@ FGPropulsion::~FGPropulsion() { for (unsigned int i=0; iGetdt(); - Forces.InitMatrix(); - Moments.InitMatrix(); + vForces.InitMatrix(); + vMoments.InitMatrix(); if (!FGModel::Run()) { for (unsigned int i=0; iSetdeltaT(dt*rate); PowerAvailable = Engines[i]->Calculate(Thrusters[i]->GetPowerRequired()); Thrusters[i]->Calculate(PowerAvailable); - Forces += Thrusters[i]->GetBodyForces(); // sum body frame forces - Moments += Thrusters[i]->GetMoments(); // sum body frame moments + vForces += Thrusters[i]->GetBodyForces(); // sum body frame forces + vMoments += Thrusters[i]->GetMoments(); // sum body frame moments } return false; } else { @@ -117,8 +135,8 @@ bool FGPropulsion::GetSteadyState(void) int steady_count,j=0; bool steady=false; - Forces.InitMatrix(); - Moments.InitMatrix(); + vForces.InitMatrix(); + vMoments.InitMatrix(); if (!FGModel::Run()) { for (unsigned int i=0; iCalculate(Thrusters[i]->GetPowerRequired()); lastThrust = currentThrust; currentThrust = Thrusters[i]->Calculate(PowerAvailable); - if(fabs(lastThrust-currentThrust) < 0.0001) { + if (fabs(lastThrust-currentThrust) < 0.0001) { steady_count++; - if(steady_count > 120) { steady=true; } + if (steady_count > 120) { steady=true; } } else { steady_count=0; } - j++; + j++; } - Forces += Thrusters[i]->GetBodyForces(); // sum body frame forces - Moments += Thrusters[i]->GetMoments(); // sum body frame moments + vForces += Thrusters[i]->GetBodyForces(); // sum body frame forces + vMoments += Thrusters[i]->GetMoments(); // sum body frame moments Engines[i]->SetTrimMode(false); } @@ -151,16 +169,15 @@ bool FGPropulsion::GetSteadyState(void) //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - bool FGPropulsion::ICEngineStart(void) { double PowerAvailable; int j; dt = State->Getdt(); - Forces.InitMatrix(); - Moments.InitMatrix(); - + vForces.InitMatrix(); + vMoments.InitMatrix(); + for (unsigned int i=0; iSetTrimMode(true); Thrusters[i]->SetdeltaT(dt*rate); @@ -168,10 +185,10 @@ bool FGPropulsion::ICEngineStart(void) while (!Engines[i]->GetRunning() && j < 2000) { PowerAvailable = Engines[i]->Calculate(Thrusters[i]->GetPowerRequired()); Thrusters[i]->Calculate(PowerAvailable); - j++; + j++; } - Forces += Thrusters[i]->GetBodyForces(); // sum body frame forces - Moments += Thrusters[i]->GetMoments(); // sum body frame moments + vForces += Thrusters[i]->GetBodyForces(); // sum body frame forces + vMoments += Thrusters[i]->GetMoments(); // sum body frame moments Engines[i]->SetTrimMode(false); } return true; @@ -220,12 +237,10 @@ bool FGPropulsion::Load(FGConfigFile* AC_cfg) Engines.push_back(new FGRocket(FDMExec, &Eng_cfg)); } else if (engType == "FG_PISTON") { Engines.push_back(new FGPiston(FDMExec, &Eng_cfg)); - } else if (engType == "FG_TURBOJET") { - Engines.push_back(new FGTurboJet(FDMExec, &Eng_cfg)); - } else if (engType == "FG_TURBOSHAFT") { - Engines.push_back(new FGTurboShaft(FDMExec, &Eng_cfg)); - } else if (engType == "FG_TURBOPROP") { - Engines.push_back(new FGTurboProp(FDMExec, &Eng_cfg)); + } else if (engType == "FG_TURBINE") { + Engines.push_back(new FGTurbine(FDMExec, &Eng_cfg)); + } else if (engType == "FG_SIMTURBINE") { + Engines.push_back(new FGSimTurbine(FDMExec, &Eng_cfg)); } else { cerr << fgred << " Unrecognized engine type: " << underon << engType << underoff << " found in config file." << fgdef << endl; @@ -255,7 +270,7 @@ bool FGPropulsion::Load(FGConfigFile* AC_cfg) cout << " Pitch = " << Pitch << endl; cout << " Yaw = " << Yaw << endl; } - + Engines[numEngines]->SetPlacement(xLoc, yLoc, zLoc, Pitch, Yaw); Engines[numEngines]->SetEngineNumber(numEngines); numEngines++; @@ -299,8 +314,10 @@ bool FGPropulsion::Load(FGConfigFile* AC_cfg) if (thrType == "FG_PROPELLER") { Thrusters.push_back(new FGPropeller(FDMExec, &Thruster_cfg)); } else if (thrType == "FG_NOZZLE") { - Thrusters.push_back(new FGNozzle(FDMExec, &Thruster_cfg)); - } + Thrusters.push_back(new FGNozzle(FDMExec, &Thruster_cfg )); + } else if (thrType == "FG_DIRECT") { + Thrusters.push_back(new FGThruster( FDMExec, &Thruster_cfg) ); + } AC_cfg->GetNextConfigLine(); while ((token = AC_cfg->GetValue()) != string("/AC_THRUSTER")) { @@ -320,12 +337,12 @@ bool FGPropulsion::Load(FGConfigFile* AC_cfg) 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; + if (debug_lvl > 0) cout << " P-Factor: " << P_Factor << endl; + ((FGPropeller*)Thrusters[numThrusters])->SetSense(fabs(Sense)/Sense); + if (debug_lvl > 0) cout << " Sense: " << Sense << endl; } Thrusters[numThrusters]->SetdeltaT(dt*rate); - + Thrusters[numThrusters]->SetThrusterNumber(numThrusters); numThrusters++; } else { @@ -364,9 +381,11 @@ string FGPropulsion::GetPropulsionStrings(void) case FGEngine::etRocket: PropulsionStrings += (Engines[i]->GetName() + "_ChamberPress[" + buffer + "]"); break; - case FGEngine::etTurboJet: - case FGEngine::etTurboProp: - case FGEngine::etTurboShaft: + case FGEngine::etTurbine: + break; + case FGEngine::etSimTurbine: + PropulsionStrings += (Engines[i]->GetName() + "_N1[" + buffer + "], "); + PropulsionStrings += (Engines[i]->GetName() + "_N2[" + buffer + "]"); break; default: PropulsionStrings += "INVALID ENGINE TYPE"; @@ -375,6 +394,7 @@ string FGPropulsion::GetPropulsionStrings(void) PropulsionStrings += ", "; + FGPropeller* Propeller = (FGPropeller*)Thrusters[i]; switch(Thrusters[i]->GetType()) { case FGThruster::ttNozzle: PropulsionStrings += (Thrusters[i]->GetName() + "_Thrust[" + buffer + "]"); @@ -383,13 +403,21 @@ string FGPropulsion::GetPropulsionStrings(void) break; case FGThruster::ttPropeller: PropulsionStrings += (Thrusters[i]->GetName() + "_Torque[" + buffer + "], "); + PropulsionStrings += (Thrusters[i]->GetName() + "_PFactor_Roll[" + buffer + "], "); + PropulsionStrings += (Thrusters[i]->GetName() + "_PFactor_Pitch[" + buffer + "], "); + PropulsionStrings += (Thrusters[i]->GetName() + "_PFactor_Yaw[" + buffer + "], "); PropulsionStrings += (Thrusters[i]->GetName() + "_Thrust[" + buffer + "], "); + if (Propeller->IsVPitch()) + PropulsionStrings += (Thrusters[i]->GetName() + "_Pitch[" + buffer + "], "); PropulsionStrings += (Thrusters[i]->GetName() + "_RPM[" + buffer + "]"); break; + case FGThruster::ttDirect: + PropulsionStrings += (Thrusters[i]->GetName() + "_Thrust[" + buffer + "]"); + break; default: PropulsionStrings += "INVALID THRUSTER TYPE"; break; - } + } } return PropulsionStrings; @@ -414,9 +442,11 @@ string FGPropulsion::GetPropulsionValues(void) case FGEngine::etRocket: PropulsionValues += (string(gcvt(((FGRocket*)Engines[i])->GetChamberPressure(), 10, buff))); break; - case FGEngine::etTurboJet: - case FGEngine::etTurboProp: - case FGEngine::etTurboShaft: + case FGEngine::etTurbine: + break; + case FGEngine::etSimTurbine: + PropulsionValues += (string(gcvt(((FGSimTurbine*)Engines[i])->GetN1(), 10, buff))) + ", "; + PropulsionValues += (string(gcvt(((FGSimTurbine*)Engines[i])->GetN2(), 10, buff))); break; } @@ -428,10 +458,20 @@ string FGPropulsion::GetPropulsionValues(void) break; case FGThruster::ttRotor: break; + case FGThruster::ttDirect: + PropulsionValues += (string(gcvt(((FGThruster*)Thrusters[i])->GetThrust(), 10, buff))); + break; case FGThruster::ttPropeller: - PropulsionValues += (string(gcvt(((FGPropeller*)Thrusters[i])->GetTorque(), 10, buff)) + ", "); - PropulsionValues += (string(gcvt(((FGPropeller*)Thrusters[i])->GetThrust(), 10, buff)) + ", "); - PropulsionValues += (string(gcvt(((FGPropeller*)Thrusters[i])->GetRPM(), 10, buff))); + FGPropeller* Propeller = (FGPropeller*)Thrusters[i]; + FGColumnVector3 vPFactor = Propeller->GetPFactor(); + PropulsionValues += string(gcvt(Propeller->GetTorque(), 10, buff)) + ", "; + PropulsionValues += string(gcvt(vPFactor(eRoll), 10, buff)) + ", "; + PropulsionValues += string(gcvt(vPFactor(ePitch), 10, buff)) + ", "; + PropulsionValues += string(gcvt(vPFactor(eYaw), 10, buff)) + ", "; + PropulsionValues += string(gcvt(Propeller->GetThrust(), 10, buff)) + ", "; + if (Propeller->IsVPitch()) + PropulsionValues += string(gcvt(Propeller->GetPitch(), 10, buff)) + ", "; + PropulsionValues += string(gcvt(Propeller->GetRPM(), 10, buff)); break; } } @@ -441,7 +481,7 @@ string FGPropulsion::GetPropulsionValues(void) //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -FGColumnVector3& FGPropulsion::GetTanksCG(void) +FGColumnVector3& FGPropulsion::GetTanksMoment(void) { iTank = Tanks.begin(); vXYZtank.InitMatrix(); @@ -535,8 +575,155 @@ double FGPropulsion::GetTanksIxy(const FGColumnVector3& vXYZcg) //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -void FGPropulsion::Debug(void) +void FGPropulsion::SetMagnetos(int setting) +{ + if (ActiveEngine < 0) { + for (unsigned i=0; iSetMagnetos(setting); + } + } else { + ((FGPiston*)Engines[ActiveEngine])->SetMagnetos(setting); + } +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +void FGPropulsion::SetStarter(int setting) +{ + if (ActiveEngine < 0) { + for (unsigned i=0; iSetStarter(false); + else + Engines[i]->SetStarter(true); + } + } else { + if (setting == 0) + Engines[ActiveEngine]->SetStarter(false); + else + Engines[ActiveEngine]->SetStarter(true); + } +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +void FGPropulsion::SetCutoff(int setting) +{ + if (ActiveEngine < 0) { + for (unsigned i=0; iSetCutoff(false); + else + ((FGSimTurbine*)Engines[i])->SetCutoff(true); + } + } else { + if (setting == 0) + ((FGSimTurbine*)Engines[ActiveEngine])->SetCutoff(false); + else + ((FGSimTurbine*)Engines[ActiveEngine])->SetCutoff(true); + } +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +void FGPropulsion::SetActiveEngine(int engine) { - //TODO: Add your source code here + if (engine >= Engines.size() || engine < 0) + ActiveEngine = -1; + else + ActiveEngine = engine; } +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +void FGPropulsion::bind(void) +{ + typedef double (FGPropulsion::*PMF)(int) const; + typedef int (FGPropulsion::*iPMF)(void) const; + + PropertyManager->Tie("propulsion/magneto_cmd", this, + (iPMF)0, &FGPropulsion::SetMagnetos, true); + PropertyManager->Tie("propulsion/starter_cmd", this, + (iPMF)0, &FGPropulsion::SetStarter, true); + PropertyManager->Tie("propulsion/cutoff_cmd", this, + (iPMF)0, &FGPropulsion::SetCutoff, true); + + PropertyManager->Tie("forces/fbx-prop-lbs", this,1, + (PMF)&FGPropulsion::GetForces); + PropertyManager->Tie("forces/fby-prop-lbs", this,2, + (PMF)&FGPropulsion::GetForces); + PropertyManager->Tie("forces/fbz-prop-lbs", this,3, + (PMF)&FGPropulsion::GetForces); + PropertyManager->Tie("moments/l-prop-lbsft", this,1, + (PMF)&FGPropulsion::GetMoments); + PropertyManager->Tie("moments/m-prop-lbsft", this,2, + (PMF)&FGPropulsion::GetMoments); + PropertyManager->Tie("moments/n-prop-lbsft", this,3, + (PMF)&FGPropulsion::GetMoments); + + PropertyManager->Tie("propulsion/active_engine", this, + &FGPropulsion::GetActiveEngine, &FGPropulsion::SetActiveEngine, true); +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +void FGPropulsion::unbind(void) +{ + PropertyManager->Untie("propulsion/magneto_cmd"); + PropertyManager->Untie("propulsion/starter_cmd"); + PropertyManager->Untie("propulsion/cutoff_cmd"); + PropertyManager->Untie("propulsion/active_engine"); + PropertyManager->Untie("forces/fbx-prop-lbs"); + PropertyManager->Untie("forces/fby-prop-lbs"); + PropertyManager->Untie("forces/fbz-prop-lbs"); + PropertyManager->Untie("moments/l-prop-lbsft"); + PropertyManager->Untie("moments/m-prop-lbsft"); + PropertyManager->Untie("moments/n-prop-lbsft"); +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// 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 FGPropulsion::Debug(int from) +{ + if (debug_lvl <= 0) return; + + if (debug_lvl & 1) { // Standard console startup message output + if (from == 0) { // Constructor + + } + } + if (debug_lvl & 2 ) { // Instantiation/Destruction notification + if (from == 0) cout << "Instantiated: FGPropulsion" << endl; + if (from == 1) cout << "Destroyed: FGPropulsion" << 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; + } + } +} +}