X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FFDM%2FJSBSim%2FFGPropulsion.cpp;h=7596fa538b59a1aea6037efa9027b3383eac0aff;hb=95440173caef3ce92ee7308fd58a24dabe4c5f8a;hp=645ff44db978db1116b86f0d6da018ecf1489640;hpb=d2156b5649fdad7f825f9cbb8a789215d5c11c72;p=flightgear.git diff --git a/src/FDM/JSBSim/FGPropulsion.cpp b/src/FDM/JSBSim/FGPropulsion.cpp index 645ff44db..7596fa538 100644 --- a/src/FDM/JSBSim/FGPropulsion.cpp +++ b/src/FDM/JSBSim/FGPropulsion.cpp @@ -55,10 +55,23 @@ 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 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ @@ -66,10 +79,15 @@ CLASS IMPLEMENTATION 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(); + Debug(0); } @@ -130,13 +148,13 @@ bool FGPropulsion::GetSteadyState(void) PowerAvailable = Engines[i]->Calculate(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++; } vForces += Thrusters[i]->GetBodyForces(); // sum body frame forces vMoments += Thrusters[i]->GetMoments(); // sum body frame moments @@ -159,7 +177,7 @@ bool FGPropulsion::ICEngineStart(void) vForces.InitMatrix(); vMoments.InitMatrix(); - + for (unsigned int i=0; iSetTrimMode(true); Thrusters[i]->SetdeltaT(dt*rate); @@ -167,7 +185,7 @@ bool FGPropulsion::ICEngineStart(void) while (!Engines[i]->GetRunning() && j < 2000) { PowerAvailable = Engines[i]->Calculate(Thrusters[i]->GetPowerRequired()); Thrusters[i]->Calculate(PowerAvailable); - j++; + j++; } vForces += Thrusters[i]->GetBodyForces(); // sum body frame forces vMoments += Thrusters[i]->GetMoments(); // sum body frame moments @@ -219,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; @@ -298,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")) { @@ -363,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"; @@ -391,10 +411,13 @@ string FGPropulsion::GetPropulsionStrings(void) 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; @@ -419,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; } @@ -433,6 +458,9 @@ 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: FGPropeller* Propeller = (FGPropeller*)Thrusters[i]; FGColumnVector3 vPFactor = Propeller->GetPFactor(); @@ -453,7 +481,7 @@ string FGPropulsion::GetPropulsionValues(void) //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -FGColumnVector3& FGPropulsion::GetTanksCG(void) +FGColumnVector3& FGPropulsion::GetTanksMoment(void) { iTank = Tanks.begin(); vXYZtank.InitMatrix(); @@ -547,45 +575,110 @@ double FGPropulsion::GetTanksIxy(const FGColumnVector3& vXYZcg) //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -void FGPropulsion::bind(void){ - /* PropertyManager->Tie("propulsion/num-engines", this, - &FGPropulsion::GetNumEngines); - PropertyManager->Tie("propulsion/num-tanks", this, - &FGPropulsion::GetNumTanks); */ - PropertyManager->Tie("propulsion/num-sel-fuel-tanks", this, - &FGPropulsion::GetnumSelectedFuelTanks); - PropertyManager->Tie("propulsion/num-sel-ox-tanks", this, - &FGPropulsion::GetnumSelectedOxiTanks); +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) +{ + 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, - &FGPropulsion::GetForces); + (PMF)&FGPropulsion::GetForces); PropertyManager->Tie("forces/fby-prop-lbs", this,2, - &FGPropulsion::GetForces); + (PMF)&FGPropulsion::GetForces); PropertyManager->Tie("forces/fbz-prop-lbs", this,3, - &FGPropulsion::GetForces); + (PMF)&FGPropulsion::GetForces); PropertyManager->Tie("moments/l-prop-lbsft", this,1, - &FGPropulsion::GetMoments); + (PMF)&FGPropulsion::GetMoments); PropertyManager->Tie("moments/m-prop-lbsft", this,2, - &FGPropulsion::GetMoments); + (PMF)&FGPropulsion::GetMoments); PropertyManager->Tie("moments/n-prop-lbsft", this,3, - &FGPropulsion::GetMoments); - //PropertyManager->Tie("propulsion/tanks-weight-lbs", this, - // &FGPropulsion::GetTanksWeight); + (PMF)&FGPropulsion::GetMoments); + + PropertyManager->Tie("propulsion/active_engine", this, + &FGPropulsion::GetActiveEngine, &FGPropulsion::SetActiveEngine, true); } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -void FGPropulsion::unbind(void){ - /* PropertyManager->Untie("propulsion/num-engines"); - PropertyManager->Untie("propulsion/num-tanks"); */ - PropertyManager->Untie("propulsion/num-sel-fuel-tanks"); - PropertyManager->Untie("propulsion/num-sel-ox-tanks"); +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"); - //PropertyManager->Untie("propulsion/tanks-weight-lbs"); } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -633,4 +726,4 @@ void FGPropulsion::Debug(int from) } } } - +}