]> git.mxchange.org Git - flightgear.git/blobdiff - src/FDM/JSBSim/FGFDMExec.cpp
Fix stall widths for the "auxilliary" (reverse flow) stalls so they
[flightgear.git] / src / FDM / JSBSim / FGFDMExec.cpp
index b8231016cf71f250d0e1d0e17a43d9acd2b32864..2110fb0d9559006bbc2933875c7568e1de163b5d 100644 (file)
@@ -58,15 +58,14 @@ INCLUDES
 #include "FGState.h"
 #include "FGAtmosphere.h"
 #include "FGFCS.h"
+#include "FGGroundCallback.h"
 #include "FGPropulsion.h"
 #include "FGMassBalance.h"
 #include "FGGroundReactions.h"
 #include "FGAerodynamics.h"
 #include "FGInertial.h"
 #include "FGAircraft.h"
-#include "FGTranslation.h"
-#include "FGRotation.h"
-#include "FGPosition.h"
+#include "FGPropagate.h"
 #include "FGAuxiliary.h"
 #include "FGOutput.h"
 #include "FGConfigFile.h"
@@ -100,16 +99,16 @@ void checkTied ( FGPropertyManager *node )
     } else if ( node->getChild(i)->isTied() ) {
       name = ((FGPropertyManager*)node->getChild(i))->GetFullyQualifiedName();
       cerr << name << " is tied" << endl;
-    } 
+    }
   }
-}        
+}
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 // Constructor
 
 FGFDMExec::FGFDMExec(FGPropertyManager* root)
 {
-  
+
   Frame           = 0;
   FirstModel      = 0;
   Error           = 0;
@@ -122,9 +121,8 @@ FGFDMExec::FGFDMExec(FGPropertyManager* root)
   Inertial        = 0;
   GroundReactions = 0;
   Aircraft        = 0;
-  Translation     = 0;
-  Rotation        = 0;
-  Position        = 0;
+  GroundCallback  = 0;
+  Propagate       = 0;
   Auxiliary       = 0;
   Output          = 0;
   IC              = 0;
@@ -135,8 +133,12 @@ FGFDMExec::FGFDMExec(FGPropertyManager* root)
   modelLoaded = false;
   IsSlave = false;
 
+  // Multiple FDM's are stopped for now.  We need to ensure that
+  // the "user" instance always gets the zeroeth instance number,
+  // because there may be instruments or scripts tied to properties
+  // in the jsbsim[0] node.
   IdFDM = FDMctr;
-  FDMctr++;
+  //FDMctr++;
 
   try {
     char* num = getenv("JSBSIM_DEBUG");
@@ -150,9 +152,9 @@ FGFDMExec::FGFDMExec(FGPropertyManager* root)
 
   instance = master->GetNode("/fdm/jsbsim",IdFDM,true);
 
-  
+
   Debug(0);
-  
+
   // this is here to catch errors in binding member functions
   // to the property tree.
   try {
@@ -160,7 +162,7 @@ FGFDMExec::FGFDMExec(FGPropertyManager* root)
   } catch ( string msg ) {
     cout << "Caught error: " << msg << endl;
     exit(1);
-  }    
+  }
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -172,11 +174,11 @@ FGFDMExec::~FGFDMExec()
     checkTied( instance );
   } catch ( string msg ) {
     cout << "Caught error: " << msg << endl;
-  }    
-  
+  }
+
   for (unsigned int i=1; i<SlaveFDMList.size(); i++) delete SlaveFDMList[i]->exec;
   SlaveFDMList.clear();
-  
+
   Debug(1);
 }
 
@@ -194,16 +196,15 @@ bool FGFDMExec::Allocate(void)
   Inertial        = new FGInertial(this);
   GroundReactions = new FGGroundReactions(this);
   Aircraft        = new FGAircraft(this);
-  Translation     = new FGTranslation(this);
-  Rotation        = new FGRotation(this);
-  Position        = new FGPosition(this);
+  GroundCallback  = new FGGroundCallback();
+  Propagate       = new FGPropagate(this);
   Auxiliary       = new FGAuxiliary(this);
   Output          = new FGOutput(this);
 
   State        = new FGState(this); // This must be done here, as the FGState
                                     // class needs valid pointers to the above
                                     // model classes
-  
+
   // Initialize models so they can communicate with each other
 
   if (!Atmosphere->InitModel()) {
@@ -230,15 +231,9 @@ bool FGFDMExec::Allocate(void)
   if (!Aircraft->InitModel())   {
     cerr << fgred << "Aircraft model init failed" << fgdef << endl;
     Error+=128;}
-  if (!Translation->InitModel()) {
-    cerr << fgred << "Translation model init failed" << fgdef << endl;
-    Error+=256;}
-  if (!Rotation->InitModel())   {
-    cerr << fgred << "Rotation model init failed" << fgdef << endl;
+  if (!Propagate->InitModel())   {
+    cerr << fgred << "Propagate model init failed" << fgdef << endl;
     Error+=512;}
-  if (!Position->InitModel())   {
-    cerr << fgred << "Position model init failed" << fgdef << endl;
-    Error+=1024;}
   if (!Auxiliary->InitModel())  {
     cerr << fgred << "Auxiliary model init failed" << fgdef << endl;
     Error+=2058;}
@@ -247,9 +242,9 @@ bool FGFDMExec::Allocate(void)
     Error+=4096;}
 
   if (Error > 0) result = false;
-  
-  IC = new FGInitialCondition(this); 
-  
+
+  IC = new FGInitialCondition(this);
+
   // Schedule a model. The second arg (the integer) is the pass number. For
   // instance, the atmosphere model gets executed every fifth pass it is called
   // by the executive. Everything else here gets executed each pass.
@@ -263,9 +258,7 @@ bool FGFDMExec::Allocate(void)
   Schedule(Inertial,        1);
   Schedule(GroundReactions, 1);
   Schedule(Aircraft,        1);
-  Schedule(Rotation,        1);
-  Schedule(Translation,     1);
-  Schedule(Position,        1);
+  Schedule(Propagate,       1);
   Schedule(Auxiliary,       1);
   Schedule(Output,          1);
 
@@ -286,16 +279,16 @@ bool FGFDMExec::DeAllocate(void)
   delete Inertial;
   delete GroundReactions;
   delete Aircraft;
-  delete Translation;
-  delete Rotation;
-  delete Position;
+  delete Propagate;
   delete Auxiliary;
   delete Output;
   delete State;
-  
+
   delete IC;
   delete Trim;
-    
+
+  delete GroundCallback;
+
   FirstModel  = 0L;
   Error       = 0;
 
@@ -308,9 +301,7 @@ bool FGFDMExec::DeAllocate(void)
   Inertial        = 0;
   GroundReactions = 0;
   Aircraft        = 0;
-  Translation     = 0;
-  Rotation        = 0;
-  Position        = 0;
+  Propagate       = 0;
   Auxiliary       = 0;
   Output          = 0;
 
@@ -341,7 +332,7 @@ int FGFDMExec::Schedule(FGModel* model, int rate)
     model_iterator->NextModel->SetRate(rate);
 
   }
-  
+
   return 0;
 }
 
@@ -387,6 +378,14 @@ bool FGFDMExec::RunIC(void)
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
+void FGFDMExec::SetGroundCallback(FGGroundCallback* p) {
+  if (GroundCallback)
+    delete GroundCallback;
+  GroundCallback = p;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
 vector <string> FGFDMExec::EnumerateFDMs(void)
 {
   vector <string> FDMList;
@@ -402,18 +401,22 @@ vector <string> FGFDMExec::EnumerateFDMs(void)
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-bool FGFDMExec::LoadModel(string AircraftPath, string EnginePath, string model)
+bool FGFDMExec::LoadModel(string AircraftPath, string EnginePath, string model,
+                bool addModelToPath)
 {
+
   FGFDMExec::AircraftPath = AircraftPath;
   FGFDMExec::EnginePath = EnginePath;
 
-  return LoadModel(model);
-}  
+  return LoadModel(model, addModelToPath);
+}
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-bool FGFDMExec::LoadModel(string model)
+
+bool FGFDMExec::LoadModel(string model, bool addModelToPath)
 {
+  
   bool result = true;
   string token;
   string aircraftCfgFileName;
@@ -423,18 +426,21 @@ bool FGFDMExec::LoadModel(string model)
     cerr << "aircraft and engine paths" << endl;
     return false;
   }
-    
+
+  aircraftCfgFileName = AircraftPath;
 # ifndef macintosh
-  aircraftCfgFileName = AircraftPath + "/" + model + "/" + model + ".xml";
+  if (addModelToPath) aircraftCfgFileName += "/" + model;
+  aircraftCfgFileName += "/" + model + ".xml";
 # else
-  aircraftCfgFileName = AircraftPath + ";" + model + ";" + model + ".xml";
+  if (addModelToPath) aircraftCfgFileName += ";"  + model;
+  aircraftCfgFileName += ";"  + model + ".xml";
 # endif
 
   FGConfigFile AC_cfg(aircraftCfgFileName);
   if (!AC_cfg.IsOpen()) return false;
-  
+
   modelName = model;
-  
+
   if (modelLoaded) {
     DeAllocate();
     Allocate();
@@ -512,18 +518,22 @@ bool FGFDMExec::ReadPrologue(FGConfigFile* AC_cfg)
     cerr << "         You have version: " << CFGVersion << endl << fgdef << endl;
     return false;
   }
-  
-  if (Release == "ALPHA") {
+
+  if (Release == "ALPHA" && debug_lvl > 0) {
+#ifndef _MSC_VER
     system("banner ALPHA");
+#endif
     cout << endl << endl
          << highint << "This aircraft model is an " << fgred << Release
          << reset << highint << " release!!!" << endl << endl << reset
          << "This aircraft model may not even properly load, and probably"
          << " will not fly as expected." << endl << endl
          << fgred << highint << "Use this model for development purposes ONLY!!!"
-         << normint << endl << endl;
-  } else if (Release == "BETA") {
+         << normint << reset << endl << endl;
+  } else if (Release == "BETA" && debug_lvl > 0) {
+#ifndef _MSC_VER
     system("banner BETA");
+#endif
     cout << endl << endl
          << highint << "This aircraft model is a " << fgred << Release
          << reset << highint << " release!!!" << endl << endl << reset
@@ -557,7 +567,7 @@ bool FGFDMExec::ReadSlave(FGConfigFile* AC_cfg)
   string AircraftName = AC_cfg->GetValue("FILE");
 
   debug_lvl = 0;                 // turn off debug output for slave vehicle
-  
+
   SlaveFDMList.back()->exec->SetAircraftPath( AircraftPath );
   SlaveFDMList.back()->exec->SetEnginePath( EnginePath );
   SlaveFDMList.back()->exec->LoadModel(AircraftName);
@@ -655,18 +665,18 @@ bool FGFDMExec::ReadOutput(FGConfigFile* AC_cfg)
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-FGPropertyManager* FGFDMExec::GetPropertyManager(void) { 
+FGPropertyManager* FGFDMExec::GetPropertyManager(void) {
   return instance;
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-FGTrim* FGFDMExec::GetTrim(void) { 
+FGTrim* FGFDMExec::GetTrim(void) {
   delete Trim;
   Trim = new FGTrim(this,tNone);
   return Trim;
 }
-  
+
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 //    The bitmasked value choices are as follows:
 //    unset: In this case (the default) JSBSim would only print