]> git.mxchange.org Git - flightgear.git/blobdiff - src/FDM/JSBSim/models/FGPropulsion.cpp
Merge branch 'next' of http://git.gitorious.org/fg/flightgear into next
[flightgear.git] / src / FDM / JSBSim / models / FGPropulsion.cpp
index e71dfeaf03d11cc9dcb0fb8e017801a3a6b075a1..da82acf5103aac6884c20e1e9e7da87428b59565 100644 (file)
@@ -45,7 +45,6 @@ INCLUDES
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
 #include "FGPropulsion.h"
-#include "FGState.h"
 #include "models/FGFCS.h"
 #include "models/FGMassBalance.h"
 #include "models/propulsion/FGThruster.h"
@@ -66,7 +65,7 @@ using namespace std;
 
 namespace JSBSim {
 
-static const char *IdSrc = "$Id$";
+static const char *IdSrc = "$Id: FGPropulsion.cpp,v 1.45 2011/02/13 00:42:45 jberndt Exp $";
 static const char *IdHdr = ID_PROPULSION;
 
 extern short debug_lvl;
@@ -116,6 +115,8 @@ FGPropulsion::~FGPropulsion()
 
 bool FGPropulsion::InitModel(void)
 {
+  bool result = true;
+
   if (!FGModel::InitModel()) return false;
 
   for (unsigned int i=0; i<numTanks; i++) Tanks[i]->ResetToIC();
@@ -124,18 +125,28 @@ bool FGPropulsion::InitModel(void)
     switch (Engines[i]->GetType()) {
       case FGEngine::etPiston:
         ((FGPiston*)Engines[i])->ResetToIC();
-        if (HasInitializedEngines && (InitializedEngines & i)) InitRunning(i);
+        try {
+          if (HasInitializedEngines && (InitializedEngines & i)) InitRunning(i);
+        } catch (string str) {
+          cerr << str << endl;
+          result = false;
+        }
         break;
       case FGEngine::etTurbine:
         ((FGTurbine*)Engines[i])->ResetToIC();
-        if (HasInitializedEngines && (InitializedEngines & i)) InitRunning(i);
+        try {
+          if (HasInitializedEngines && (InitializedEngines & i)) InitRunning(i);
+        } catch (string str) {
+          cerr << str << endl;
+          result = false;
+        }
         break;
       default:
         break;
     }
   }
 
-  return true;
+  return result;
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -149,7 +160,7 @@ bool FGPropulsion::Run(void)
 
   RunPreFunctions();
 
-  double dt = State->Getdt();
+  double dt = FDMExec->GetDeltaT();
 
   vForces.InitMatrix();
   vMoments.InitMatrix();
@@ -183,14 +194,16 @@ bool FGPropulsion::GetSteadyState(void)
   double currentThrust = 0, lastThrust = -1;
   int steady_count = 0, j = 0;
   bool steady = false;
+  bool TrimMode = FDMExec->GetTrimStatus();
 
   vForces.InitMatrix();
   vMoments.InitMatrix();
 
   if (!FGModel::Run()) {
+    FDMExec->SetTrimStatus(true);
+
     for (unsigned int i=0; i<numEngines; i++) {
 //      cout << "  Finding steady state for engine " << i << endl;
-      Engines[i]->SetTrimMode(true);
       steady=false;
       steady_count=0;
       j=0;
@@ -214,9 +227,10 @@ bool FGPropulsion::GetSteadyState(void)
 //      }
       vForces  += Engines[i]->GetBodyForces();  // sum body frame forces
       vMoments += Engines[i]->GetMoments();     // sum body frame moments
-      Engines[i]->SetTrimMode(false);
     }
 
+    FDMExec->SetTrimStatus(TrimMode);
+
     return false;
   } else {
     return true;
@@ -227,14 +241,13 @@ bool FGPropulsion::GetSteadyState(void)
 
 void FGPropulsion::InitRunning(int n)
 {
-  if (n > 0) { // A specific engine is supposed to be initialized
+  if (n >= 0) { // A specific engine is supposed to be initialized
 
     if (n >= (int)GetNumEngines() ) {
-      cerr << "Tried to initialize a non-existent engine!" << endl;
-      throw;
+      throw(string("Tried to initialize a non-existent engine!"));
     }
-    FCS->SetThrottleCmd(n,1);
-    FCS->SetMixtureCmd(n,1);
+    FDMExec->GetFCS()->SetThrottleCmd(n,1);
+    FDMExec->GetFCS()->SetMixtureCmd(n,1);
     GetEngine(n)->InitRunning();
     GetSteadyState();
 
@@ -244,16 +257,14 @@ void FGPropulsion::InitRunning(int n)
   } else if (n < 0) { // -1 refers to "All Engines"
 
     for (unsigned int i=0; i<GetNumEngines(); i++) {
-      FCS->SetThrottleCmd(i,1);
-      FCS->SetMixtureCmd(i,1);
+      FDMExec->GetFCS()->SetThrottleCmd(i,1);
+      FDMExec->GetFCS()->SetMixtureCmd(i,1);
       GetEngine(i)->InitRunning();
     }
     GetSteadyState();
     InitializedEngines = -1;
     HasInitializedEngines = true;
 
-  } else if (n == 0) { // No engines are to be initialized
-    // Do nothing
   }
 }
 
@@ -296,32 +307,37 @@ bool FGPropulsion::Load(Element* el)
     document->SetParent(engine_element);
 
     type = document->GetName();
-    if (type == "piston_engine") {
-      HavePistonEngine = true;
-      if (!IsBound) bind();
-      Engines.push_back(new FGPiston(FDMExec, document, numEngines));
-    } else if (type == "turbine_engine") {
-      HaveTurbineEngine = true;
-      if (!IsBound) bind();
-      Engines.push_back(new FGTurbine(FDMExec, document, numEngines));
-    } else if (type == "turboprop_engine") {
-      HaveTurboPropEngine = true;
-      if (!IsBound) bind();
-      Engines.push_back(new FGTurboProp(FDMExec, document, numEngines));
-    } else if (type == "rocket_engine") {
-      HaveRocketEngine = true;
-      if (!IsBound) bind();
-      Engines.push_back(new FGRocket(FDMExec, document, numEngines));
-    } else if (type == "electric_engine") {
-      HaveElectricEngine = true;
-      if (!IsBound) bind();
-      Engines.push_back(new FGElectric(FDMExec, document, numEngines));
-    } else {
-      cerr << "Unknown engine type: " << type << endl;
-      exit(-5);
+    try {
+      if (type == "piston_engine") {
+        HavePistonEngine = true;
+        if (!IsBound) bind();
+        Engines.push_back(new FGPiston(FDMExec, document, numEngines));
+      } else if (type == "turbine_engine") {
+        HaveTurbineEngine = true;
+        if (!IsBound) bind();
+        Engines.push_back(new FGTurbine(FDMExec, document, numEngines));
+      } else if (type == "turboprop_engine") {
+        HaveTurboPropEngine = true;
+        if (!IsBound) bind();
+        Engines.push_back(new FGTurboProp(FDMExec, document, numEngines));
+      } else if (type == "rocket_engine") {
+        HaveRocketEngine = true;
+        if (!IsBound) bind();
+        Engines.push_back(new FGRocket(FDMExec, document, numEngines));
+      } else if (type == "electric_engine") {
+        HaveElectricEngine = true;
+        if (!IsBound) bind();
+        Engines.push_back(new FGElectric(FDMExec, document, numEngines));
+      } else {
+        cerr << "Unknown engine type: " << type << endl;
+        exit(-5);
+      }
+    } catch (std::string str) {
+      cerr << endl << fgred << str << reset << endl;
+      return false;
     }
 
-    FCS->AddThrottle();
+    FDMExec->GetFCS()->AddThrottle();
     ThrottleAdded = true;
 
     numEngines++;
@@ -331,13 +347,13 @@ bool FGPropulsion::Load(Element* el)
   }
 
   CalculateTankInertias();
-  if (!ThrottleAdded) FCS->AddThrottle(); // need to have at least one throttle
+  if (!ThrottleAdded) FDMExec->GetFCS()->AddThrottle(); // need to have at least one throttle
 
   // Process fuel dump rate
   if (el->FindElement("dump-rate"))
     DumpRate = el->FindElementValueAsNumberConvertTo("dump-rate", "LBS/MIN");
 
-  FGModel::PostLoad(el);
+  PostLoad(el, PropertyManager);
 
   return true;
 }
@@ -397,7 +413,7 @@ ifstream* FGPropulsion::FindEngineFile(const string& engine_filename)
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-string FGPropulsion::GetPropulsionStrings(const string& delimiter)
+string FGPropulsion::GetPropulsionStrings(const string& delimiter) const
 {
   unsigned int i;
 
@@ -421,7 +437,7 @@ string FGPropulsion::GetPropulsionStrings(const string& delimiter)
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-string FGPropulsion::GetPropulsionValues(const string& delimiter)
+string FGPropulsion::GetPropulsionValues(const string& delimiter) const
 {
   unsigned int i;
 
@@ -479,7 +495,7 @@ FGMatrix33& FGPropulsion::CalculateTankInertias(void)
   tankJ = FGMatrix33();
 
   for (unsigned int i=0; i<size; i++) {
-    tankJ += MassBalance->GetPointmassInertia( lbtoslug * Tanks[i]->GetContents(),
+    tankJ += FDMExec->GetMassBalance()->GetPointmassInertia( lbtoslug * Tanks[i]->GetContents(),
                                                Tanks[i]->GetXYZ() );
     tankJ(1,1) += Tanks[i]->GetIxx();
     tankJ(2,2) += Tanks[i]->GetIyy();
@@ -633,15 +649,15 @@ void FGPropulsion::bind(void)
   typedef int (FGPropulsion::*iPMF)(void) const;
 
   IsBound = true;
-  PropertyManager->Tie("propulsion/set-running", this, (iPMF)0, &FGPropulsion::InitRunning, true);
+  PropertyManager->Tie("propulsion/set-running", this, (iPMF)0, &FGPropulsion::InitRunning, false);
   if (HaveTurbineEngine) {
-    PropertyManager->Tie("propulsion/starter_cmd", this, (iPMF)0, &FGPropulsion::SetStarter,  true);
-    PropertyManager->Tie("propulsion/cutoff_cmd", this,  (iPMF)0, &FGPropulsion::SetCutoff,   true);
+    PropertyManager->Tie("propulsion/starter_cmd", this, (iPMF)0, &FGPropulsion::SetStarter,  false);
+    PropertyManager->Tie("propulsion/cutoff_cmd", this,  (iPMF)0, &FGPropulsion::SetCutoff,   false);
   }
 
   if (HavePistonEngine) {
-    PropertyManager->Tie("propulsion/starter_cmd", this, (iPMF)0, &FGPropulsion::SetStarter,  true);
-    PropertyManager->Tie("propulsion/magneto_cmd", this, (iPMF)0, &FGPropulsion::SetMagnetos, true);
+    PropertyManager->Tie("propulsion/starter_cmd", this, (iPMF)0, &FGPropulsion::SetStarter,  false);
+    PropertyManager->Tie("propulsion/magneto_cmd", this, (iPMF)0, &FGPropulsion::SetMagnetos, false);
   }
 
   PropertyManager->Tie("propulsion/active_engine", this, (iPMF)&FGPropulsion::GetActiveEngine,