]> git.mxchange.org Git - flightgear.git/blobdiff - src/FDM/JSBSim/FGFDMExec.cpp
FG_HAVE_STD_INCLUDES -> SG_HAVE_STD_INCLUDES
[flightgear.git] / src / FDM / JSBSim / FGFDMExec.cpp
index d5324fdd0d34d5595ee479a41126ad86d02d479f..caf4b9d146d536db458105de57b1100a07593b65 100644 (file)
@@ -1,4 +1,4 @@
-/*******************************************************************************
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
  Module:       FGFDMExec.cpp
  Author:       Jon S. Berndt
@@ -34,13 +34,13 @@ HISTORY
 --------------------------------------------------------------------------------
 11/17/98   JSB   Created
 
-********************************************************************************
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 INCLUDES
-*******************************************************************************/
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
 #ifdef FGFS
 #  include <simgear/compiler.h>
-#  ifdef FG_HAVE_STD_INCLUDES
+#  ifdef SG_HAVE_STD_INCLUDES
 #    include <iostream>
 #    include <ctime>
 #  else
@@ -63,9 +63,12 @@ INCLUDES
 #include "FGAuxiliary.h"
 #include "FGOutput.h"
 
-/*******************************************************************************
-************************************ CODE **************************************
-*******************************************************************************/
+static const char *IdSrc = "$Header$";
+static const char *IdHdr = "ID_FDMEXEC";
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+CLASS IMPLEMENTATION
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
 
 // Constructor
@@ -84,8 +87,24 @@ FGFDMExec::FGFDMExec(void)
   Auxiliary   = 0;
   Output      = 0;
 
-  // Instantiate this FDM Executive's Models
+  terminate = false;
+  frozen = false;
+  modelLoaded = false;
+  
+  Allocate();
+  
+}
 
+FGFDMExec::~FGFDMExec(void){
+  
+  DeAllocate();
+
+}
+
+bool FGFDMExec::Allocate(void) {
+  
+  bool result=true;
+  
   Atmosphere  = new FGAtmosphere(this);
   FCS         = new FGFCS(this);
   Aircraft    = new FGAircraft(this);
@@ -107,7 +126,9 @@ FGFDMExec::FGFDMExec(void)
   if (!Position->InitModel())   {cerr << "Position model init failed"; Error+=32;}
   if (!Auxiliary->InitModel())  {cerr << "Auxiliary model init failed"; Error+=64;}
   if (!Output->InitModel())     {cerr << "Output model init failed"; Error+=128;}
-
+  
+  if(Error > 0) result=false;
+  
   // 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.
@@ -120,14 +141,39 @@ FGFDMExec::FGFDMExec(void)
   Schedule(Position,    1);
   Schedule(Auxiliary,   1);
   Schedule(Output,     1);
+  
+  modelLoaded = false;
+  return result;
 
-  terminate = false;
-  frozen = false;
 }
 
+bool FGFDMExec::DeAllocate(void) {
+  if ( Atmosphere != 0 )  delete Atmosphere;
+  if ( FCS != 0 )         delete FCS;
+  if ( Aircraft != 0 )    delete Aircraft;
+  if ( Translation != 0 ) delete Translation;
+  if ( Rotation != 0 )    delete Rotation;
+  if ( Position != 0 )    delete Position;
+  if ( Auxiliary != 0 )   delete Auxiliary;
+  if ( Output != 0 )      delete Output;
+  if ( State != 0 )       delete State;
+
+  FirstModel  = 0L;
+  Error       = 0;
 
-FGFDMExec::~FGFDMExec(void)
-{
+  State       = 0;
+  Atmosphere  = 0;
+  FCS         = 0;
+  Aircraft    = 0;
+  Translation = 0;
+  Rotation    = 0;
+  Position    = 0;
+  Auxiliary   = 0;
+  Output      = 0;
+
+  modelLoaded = false;
+  
 }
 
 
@@ -179,14 +225,35 @@ bool FGFDMExec::Run(void)
 
 bool FGFDMExec::RunIC(FGInitialCondition *fgic)
 {
-  float save_dt = State->Getdt();
-
-  State->Setdt(0.0);
+  State->Suspend();
   State->Initialize(fgic);
   Run();
-  State->Setdt(save_dt);
-
+  State->Resume();
   return true;
 }
   
 
+bool FGFDMExec::LoadModel(string APath, string EPath, string model)
+{
+       bool result=false;
+  if(modelLoaded) {
+     DeAllocate();
+     Allocate();
+  }   
+  AircraftPath = APath;
+       EnginePath = EPath;
+  result = Aircraft->LoadAircraft(AircraftPath, EnginePath, model);
+
+  if (result) {
+    modelLoaded = true;
+  } else {
+    cerr << "FGFDMExec: Failed to load aircraft and/or engine model" << endl;
+  }
+
+  return result;
+}
+
+
+bool FGFDMExec::RunScript(string script)
+{
+}