-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
- Header: FGFDMExec.h\r
- Author: Jon Berndt\r
- Date started: 11/17/98\r
-\r
- ------------- Copyright (C) 1999 Jon S. Berndt (jsb@hal-pc.org) -------------\r
-\r
- This program is free software; you can redistribute it and/or modify it under\r
- the terms of the GNU General Public License as published by the Free Software\r
- Foundation; either version 2 of the License, or (at your option) any later\r
- version.\r
-\r
- This program is distributed in the hope that it will be useful, but WITHOUT\r
- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more\r
- details.\r
-\r
- You should have received a copy of the GNU General Public License along with\r
- this program; if not, write to the Free Software Foundation, Inc., 59 Temple\r
- Place - Suite 330, Boston, MA 02111-1307, USA.\r
-\r
- Further information about the GNU General Public License can also be found on\r
- the world wide web at http://www.gnu.org.\r
-\r
-HISTORY\r
---------------------------------------------------------------------------------\r
-11/17/98 JSB Created\r
-7/31/99 TP Added RunIC function that runs the sim so that every frame\r
- begins with the IC values from the given FGInitialCondition\r
- object and dt=0.\r
-\r
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
-SENTRY\r
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
-\r
-#ifndef FGFDMEXEC_HEADER_H\r
-#define FGFDMEXEC_HEADER_H\r
-\r
-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
-INCLUDES\r
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
-\r
-#ifdef FGFS\r
-# include <simgear/compiler.h>\r
-# ifdef FG_HAVE_STD_INCLUDES\r
-# include <vector>\r
-# else\r
-# include <vector.h>\r
-# endif\r
-#else\r
-# include <vector>\r
-#endif\r
-\r
-#include "FGModel.h"\r
-#include "FGInitialCondition.h"\r
-\r
-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
-DEFINITIONS\r
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
-\r
-#define ID_FDMEXEC "$Id$"\r
-\r
-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
-FORWARD DECLARATIONS\r
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
-\r
-class FGState;\r
-class FGAtmosphere;\r
-class FGFCS;\r
-class FGPropulsion;\r
-class FGAircraft;\r
-class FGTranslation;\r
-class FGRotation;\r
-class FGPosition;\r
-class FGAuxiliary;\r
-class FGOutput;\r
-class FGInitialCondition;\r
-\r
-struct condition {\r
- vector <eParam> TestParam;\r
- vector <eParam> SetParam;\r
- vector <float> TestValue;\r
- vector <float> SetValue;\r
- vector <string> Comparison;\r
- vector <float> TC;\r
- vector <bool> Persistent;\r
- vector <eAction> Action;\r
- vector <eType> Type;\r
- vector <bool> Triggered;\r
- vector <float> newValue;\r
- vector <float> OriginalValue;\r
- vector <float> StartTime;\r
- vector <float> EndTime;\r
-\r
- condition() {\r
- }\r
-};\r
-\r
-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
-COMMENTS, REFERENCES, and NOTES [use "class documentation" below for API docs]\r
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
-\r
-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
-CLASS DOCUMENTATION\r
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
-\r
-/** Encapsulates the JSBSim simulation executive.\r
- @author Jon S. Berndt\r
- @version $Id$\r
-\r
- @doc This class is the interface class through which all other simulation classes\r
- are instantiated, initialized, and run. When integrated with FlightGear (or\r
- other flight simulator) this class is typically instantiated by an interface\r
- class on the simulator side.\r
-\r
- <h4>Scripting support provided in the Executive</h4>\r
-\r
- <p>There is simple scripting support provided in the FGFDMExec\r
- class. Commands are specified using the <u>Simple Scripting\r
- Directives for JSBSim</u> (SSDJ). The script file is in XML\r
- format. A test condition (or conditions) can be set up in the\r
- script and when the condition evaluates to true, the specified\r
- action[s] is/are taken. A test condition can be <em>persistent</em>,\r
- meaning that if a test condition evaluates to true, then passes\r
- and evaluates to false, the condition is reset and may again be\r
- triggered. When the set of tests evaluates to true for a given\r
- condition, an item may be set to another value. This value might\r
- be a boolean, a value, or a delta value, and the change from the\r
- current value to the new value can be either via a step function,\r
- a ramp, or an exponential approach. The speed of a ramp or\r
- approach is specified via the time constant. Here is the format\r
- of the script file:</p>\r
-\r
- <pre><strong><?xml version="1.0"?>\r
- <runscript name="C172-01A">\r
-\r
- <!--\r
- This run is for testing C172 runs\r
- -->\r
-\r
- <use aircraft="c172">\r
- <use initialize="reset00">\r
-\r
- <run start="0.0" end="4.5" dt="0.05">\r
- <when>\r
- <parameter name="FG_TIME" comparison="ge" value="0.25">\r
- <parameter name="FG_TIME" comparison="le" value="0.50">\r
- <set name="FG_AILERON_CMD" type="FG_VALUE" value="0.25"\r
- action="FG_STEP" persistent="false" tc ="0.25">\r
- </when>\r
- <when>\r
- <parameter name="FG_TIME" comparison="ge" value="0.5">\r
- <parameter name="FG_TIME" comparison="le" value="1.5">\r
- <set name="FG_AILERON_CMD" type="FG_DELTA" value="0.5"\r
- action="FG_EXP" persistent="false" tc ="0.5">\r
- </when>\r
- <when>\r
- <parameter name="FG_TIME" comparison="ge" value="1.5">\r
- <parameter name="FG_TIME" comparison="le" value="2.5">\r
- <set name="FG_RUDDER_CMD" type="FG_DELTA" value="0.5"\r
- action="FG_RAMP" persistent="false" tc ="0.5">\r
- </when>\r
- </run>\r
-\r
- </runscript></strong></pre>\r
-\r
- <p>The first line must always be present. The second line\r
- identifies this file as a script file, and gives a descriptive\r
- name to the script file. Comments are next, delineated by the\r
- <!-- and --> symbols. The aircraft and initialization files\r
- to be used are specified in the "use" lines. Next,\r
- comes the "run" section, where the conditions are\r
- described in "when" clauses.</p>\r
-\r
- <h4>JSBSim Debugging Directives</h4>\r
-\r
- This describes to any interested entity the debug level\r
- requested by setting the JSBSIM_DEBUG environment variable.\r
- The bitmasked value choices are as follows:<ol>\r
- <li><b>unset</b>: In this case (the default) JSBSim would only print\r
- out the normally expected messages, essentially echoing\r
- the config files as they are read. If the environment\r
- variable is not set, debug_lvl is set to 1 internally</li>\r
- <li><b>0</b>: This requests JSBSim not to output any messages\r
- whatsoever.</li>\r
- <li><b>1</b>: This value explicity requests the normal JSBSim\r
- startup messages</li>\r
- <li><b>2</b>: This value asks for a message to be printed out when\r
- a class is instantiated</li>\r
- <li><b>4</b>: When this value is set, a message is displayed when a\r
- FGModel object executes its Run() method</li>\r
- <li><b>8</b>: When this value is set, various runtime state variables\r
- are printed out periodically</li>\r
- </ol>\r
-\r
-*/\r
-\r
-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
-CLASS DECLARATION\r
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
-\r
-class FGFDMExec\r
-{\r
-public:\r
- /// Default constructor\r
- FGFDMExec(void);\r
-\r
- /// Default destructor\r
- ~FGFDMExec();\r
-\r
- /** This routine places a model into the runlist at the specified rate. The\r
- "rate" is not really a clock rate. It represents how many calls to the\r
- FGFDMExec::Run() method must be made before the model is executed. A\r
- value of 1 means that the model will be executed for each call to the\r
- exec's Run() method. A value of 5 means that the model will only be\r
- executed every 5th call to the exec's Run() method.\r
- @param model A pointer to the model being scheduled.\r
- @param rate The rate at which to execute the model as described above.\r
- @return Currently returns 0 always. */\r
- int Schedule(FGModel* model, int rate);\r
-\r
- /** This executes each scheduled model in succession, as well as running any\r
- scripts which are loaded.\r
- @return true if successful, false if sim should be ended */\r
- bool Run(void);\r
-\r
- /** Initializes the sim with a set of initial conditions.\r
- @param fgic A pointer to a filled out initial conditions class which\r
- describes the desired initial conditions.\r
- @return true if successful\r
- */\r
- bool RunIC(FGInitialCondition *fgic);\r
-\r
- /// Freezes the sim\r
- void Freeze(void) {frozen = true;}\r
-\r
- /// Resumes the sim\r
- void Resume(void) {frozen = false;}\r
-\r
- /** Loads an aircraft model.\r
- @param AircraftPath path to the aircraft directory. For instance:\r
- "aircraft". Under aircraft, then, would be directories for various\r
- modeled aircraft such as C172/, x15/, etc.\r
- @param EnginePath path to the directory under which engine config\r
- files are kept, for instance "engine"\r
- @param model the name of the aircraft model itself. This file will\r
- be looked for in the directory specified in the AircraftPath variable,\r
- and in turn under the directory with the same name as the model. For\r
- instance: "aircraft/x15/x15.xml"\r
- @return true if successful*/\r
- bool LoadModel(string AircraftPath, string EnginePath, string model);\r
-\r
- /** Loads a script to drive JSBSim (usually in standalone mode).\r
- The language is the Simple Script Directives for JSBSim (SSDJ).\r
- @param script the filename (including path name, if any) for the script.\r
- @return true if successful */\r
- bool LoadScript(string script);\r
-\r
- /** This function is called each pass through the executive Run() method IF\r
- scripting is enabled. */\r
- void RunScript(void);\r
-\r
- bool SetEnginePath(string path) {EnginePath = path; return true;}\r
- bool SetAircraftPath(string path) {AircraftPath = path; return true;}\r
- bool SetScriptPath(string path) {ScriptPath = path; return true;}\r
-\r
- /// @name Top-level executive State and Model retrieval mechanism\r
- //@{\r
- /// Returns the FGState pointer.\r
- inline FGState* GetState(void) {return State;}\r
- /// Returns the FGAtmosphere pointer.\r
- inline FGAtmosphere* GetAtmosphere(void) {return Atmosphere;}\r
- /// Returns the FGFCS pointer.\r
- inline FGFCS* GetFCS(void) {return FCS;}\r
- /// Returns the FGPropulsion pointer.\r
- inline FGPropulsion* GetPropulsion(void) {return Propulsion;}\r
- /// Returns the FGAircraft pointer.\r
- inline FGAircraft* GetAircraft(void) {return Aircraft;}\r
- /// Returns the FGTranslation pointer.\r
- inline FGTranslation* GetTranslation(void) {return Translation;}\r
- /// Returns the FGRotation pointer.\r
- inline FGRotation* GetRotation(void) {return Rotation;}\r
- /// Returns the FGPosition pointer.\r
- inline FGPosition* GetPosition(void) {return Position;}\r
- /// Returns the FGAuxiliary pointer.\r
- inline FGAuxiliary* GetAuxiliary(void) {return Auxiliary;}\r
- /// Returns the FGOutput pointer.\r
- inline FGOutput* GetOutput(void) {return Output;}\r
- //@}\r
-\r
- /// Retrieves the engine path.\r
- inline string GetEnginePath(void) {return EnginePath;}\r
- /// Retrieves the aircraft path.\r
- inline string GetAircraftPath(void) {return AircraftPath;}\r
-\r
-private:\r
- FGModel* FirstModel;\r
-\r
- bool frozen;\r
- bool terminate;\r
- int Error;\r
- bool modelLoaded;\r
- bool Scripted;\r
-\r
- string AircraftPath;\r
- string EnginePath;\r
- string ScriptPath;\r
- string ScriptName;\r
- float StartTime;\r
- float EndTime;\r
- vector <struct condition> Conditions;\r
-\r
- FGState* State;\r
- FGAtmosphere* Atmosphere;\r
- FGFCS* FCS;\r
- FGPropulsion* Propulsion;\r
- FGAircraft* Aircraft;\r
- FGTranslation* Translation;\r
- FGRotation* Rotation;\r
- FGPosition* Position;\r
- FGAuxiliary* Auxiliary;\r
- FGOutput* Output;\r
-\r
- bool Allocate(void);\r
- bool DeAllocate(void);\r
- void Debug(void);\r
-};\r
-\r
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
-#endif\r
-\r
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ Header: FGFDMExec.h
+ Author: Jon Berndt
+ Date started: 11/17/98
+
+ ------------- Copyright (C) 1999 Jon S. Berndt (jsb@hal-pc.org) -------------
+
+ This program is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 2 of the License, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ details.
+
+ You should have received a copy of the GNU General Public License along with
+ this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ Further information about the GNU General Public License can also be found on
+ the world wide web at http://www.gnu.org.
+
+HISTORY
+--------------------------------------------------------------------------------
+11/17/98 JSB Created
+7/31/99 TP Added RunIC function that runs the sim so that every frame
+ begins with the IC values from the given FGInitialCondition
+ object and dt=0.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+SENTRY
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+#ifndef FGFDMEXEC_HEADER_H
+#define FGFDMEXEC_HEADER_H
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+INCLUDES
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+#ifdef FGFS
+# include <simgear/compiler.h>
+# ifdef FG_HAVE_STD_INCLUDES
+# include <vector>
+# else
+# include <vector.h>
+# endif
+#else
+# include <vector>
+#endif
+
+#include "FGModel.h"
+#include "FGInitialCondition.h"
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+DEFINITIONS
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+#define ID_FDMEXEC "$Id$"
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+FORWARD DECLARATIONS
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+class FGState;
+class FGAtmosphere;
+class FGFCS;
+class FGPropulsion;
+class FGAircraft;
+class FGTranslation;
+class FGRotation;
+class FGPosition;
+class FGAuxiliary;
+class FGOutput;
+class FGInitialCondition;
+
+struct condition {
+ vector <eParam> TestParam;
+ vector <eParam> SetParam;
+ vector <float> TestValue;
+ vector <float> SetValue;
+ vector <string> Comparison;
+ vector <float> TC;
+ vector <bool> Persistent;
+ vector <eAction> Action;
+ vector <eType> Type;
+ vector <bool> Triggered;
+ vector <float> newValue;
+ vector <float> OriginalValue;
+ vector <float> StartTime;
+ vector <float> EndTime;
+
+ condition() {
+ }
+};
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+COMMENTS, REFERENCES, and NOTES [use "class documentation" below for API docs]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+CLASS DOCUMENTATION
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+/** Encapsulates the JSBSim simulation executive.
+ @author Jon S. Berndt
+ @version $Id$
+
+ @doc This class is the interface class through which all other simulation classes
+ are instantiated, initialized, and run. When integrated with FlightGear (or
+ other flight simulator) this class is typically instantiated by an interface
+ class on the simulator side.
+
+ <h4>Scripting support provided in the Executive</h4>
+
+ <p>There is simple scripting support provided in the FGFDMExec
+ class. Commands are specified using the <u>Simple Scripting
+ Directives for JSBSim</u> (SSDJ). The script file is in XML
+ format. A test condition (or conditions) can be set up in the
+ script and when the condition evaluates to true, the specified
+ action[s] is/are taken. A test condition can be <em>persistent</em>,
+ meaning that if a test condition evaluates to true, then passes
+ and evaluates to false, the condition is reset and may again be
+ triggered. When the set of tests evaluates to true for a given
+ condition, an item may be set to another value. This value might
+ be a boolean, a value, or a delta value, and the change from the
+ current value to the new value can be either via a step function,
+ a ramp, or an exponential approach. The speed of a ramp or
+ approach is specified via the time constant. Here is the format
+ of the script file:</p>
+
+ <pre><strong><?xml version="1.0"?>
+ <runscript name="C172-01A">
+
+ <!--
+ This run is for testing C172 runs
+ -->
+
+ <use aircraft="c172">
+ <use initialize="reset00">
+
+ <run start="0.0" end="4.5" dt="0.05">
+ <when>
+ <parameter name="FG_TIME" comparison="ge" value="0.25">
+ <parameter name="FG_TIME" comparison="le" value="0.50">
+ <set name="FG_AILERON_CMD" type="FG_VALUE" value="0.25"
+ action="FG_STEP" persistent="false" tc ="0.25">
+ </when>
+ <when>
+ <parameter name="FG_TIME" comparison="ge" value="0.5">
+ <parameter name="FG_TIME" comparison="le" value="1.5">
+ <set name="FG_AILERON_CMD" type="FG_DELTA" value="0.5"
+ action="FG_EXP" persistent="false" tc ="0.5">
+ </when>
+ <when>
+ <parameter name="FG_TIME" comparison="ge" value="1.5">
+ <parameter name="FG_TIME" comparison="le" value="2.5">
+ <set name="FG_RUDDER_CMD" type="FG_DELTA" value="0.5"
+ action="FG_RAMP" persistent="false" tc ="0.5">
+ </when>
+ </run>
+
+ </runscript></strong></pre>
+
+ <p>The first line must always be present. The second line
+ identifies this file as a script file, and gives a descriptive
+ name to the script file. Comments are next, delineated by the
+ <!-- and --> symbols. The aircraft and initialization files
+ to be used are specified in the "use" lines. Next,
+ comes the "run" section, where the conditions are
+ described in "when" clauses.</p>
+
+ <h4>JSBSim Debugging Directives</h4>
+
+ This describes to any interested entity the debug level
+ requested by setting the JSBSIM_DEBUG environment variable.
+ The bitmasked value choices are as follows:<ol>
+ <li><b>unset</b>: 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</li>
+ <li><b>0</b>: This requests JSBSim not to output any messages
+ whatsoever.</li>
+ <li><b>1</b>: This value explicity requests the normal JSBSim
+ startup messages</li>
+ <li><b>2</b>: This value asks for a message to be printed out when
+ a class is instantiated</li>
+ <li><b>4</b>: When this value is set, a message is displayed when a
+ FGModel object executes its Run() method</li>
+ <li><b>8</b>: When this value is set, various runtime state variables
+ are printed out periodically</li>
+ </ol>
+
+*/
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+CLASS DECLARATION
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+class FGFDMExec
+{
+public:
+ /// Default constructor
+ FGFDMExec(void);
+
+ /// Default destructor
+ ~FGFDMExec();
+
+ /** This routine places a model into the runlist at the specified rate. The
+ "rate" is not really a clock rate. It represents how many calls to the
+ FGFDMExec::Run() method must be made before the model is executed. A
+ value of 1 means that the model will be executed for each call to the
+ exec's Run() method. A value of 5 means that the model will only be
+ executed every 5th call to the exec's Run() method.
+ @param model A pointer to the model being scheduled.
+ @param rate The rate at which to execute the model as described above.
+ @return Currently returns 0 always. */
+ int Schedule(FGModel* model, int rate);
+
+ /** This executes each scheduled model in succession, as well as running any
+ scripts which are loaded.
+ @return true if successful, false if sim should be ended */
+ bool Run(void);
+
+ /** Initializes the sim with a set of initial conditions.
+ @param fgic A pointer to a filled out initial conditions class which
+ describes the desired initial conditions.
+ @return true if successful
+ */
+ bool RunIC(FGInitialCondition *fgic);
+
+ /// Freezes the sim
+ void Freeze(void) {frozen = true;}
+
+ /// Resumes the sim
+ void Resume(void) {frozen = false;}
+
+ /** Loads an aircraft model.
+ @param AircraftPath path to the aircraft directory. For instance:
+ "aircraft". Under aircraft, then, would be directories for various
+ modeled aircraft such as C172/, x15/, etc.
+ @param EnginePath path to the directory under which engine config
+ files are kept, for instance "engine"
+ @param model the name of the aircraft model itself. This file will
+ be looked for in the directory specified in the AircraftPath variable,
+ and in turn under the directory with the same name as the model. For
+ instance: "aircraft/x15/x15.xml"
+ @return true if successful*/
+ bool LoadModel(string AircraftPath, string EnginePath, string model);
+
+ /** Loads a script to drive JSBSim (usually in standalone mode).
+ The language is the Simple Script Directives for JSBSim (SSDJ).
+ @param script the filename (including path name, if any) for the script.
+ @return true if successful */
+ bool LoadScript(string script);
+
+ /** This function is called each pass through the executive Run() method IF
+ scripting is enabled. */
+ void RunScript(void);
+
+ bool SetEnginePath(string path) {EnginePath = path; return true;}
+ bool SetAircraftPath(string path) {AircraftPath = path; return true;}
+ bool SetScriptPath(string path) {ScriptPath = path; return true;}
+
+ /// @name Top-level executive State and Model retrieval mechanism
+ //@{
+ /// Returns the FGState pointer.
+ inline FGState* GetState(void) {return State;}
+ /// Returns the FGAtmosphere pointer.
+ inline FGAtmosphere* GetAtmosphere(void) {return Atmosphere;}
+ /// Returns the FGFCS pointer.
+ inline FGFCS* GetFCS(void) {return FCS;}
+ /// Returns the FGPropulsion pointer.
+ inline FGPropulsion* GetPropulsion(void) {return Propulsion;}
+ /// Returns the FGAircraft pointer.
+ inline FGAircraft* GetAircraft(void) {return Aircraft;}
+ /// Returns the FGTranslation pointer.
+ inline FGTranslation* GetTranslation(void) {return Translation;}
+ /// Returns the FGRotation pointer.
+ inline FGRotation* GetRotation(void) {return Rotation;}
+ /// Returns the FGPosition pointer.
+ inline FGPosition* GetPosition(void) {return Position;}
+ /// Returns the FGAuxiliary pointer.
+ inline FGAuxiliary* GetAuxiliary(void) {return Auxiliary;}
+ /// Returns the FGOutput pointer.
+ inline FGOutput* GetOutput(void) {return Output;}
+ //@}
+
+ /// Retrieves the engine path.
+ inline string GetEnginePath(void) {return EnginePath;}
+ /// Retrieves the aircraft path.
+ inline string GetAircraftPath(void) {return AircraftPath;}
+
+private:
+ FGModel* FirstModel;
+
+ bool frozen;
+ bool terminate;
+ int Error;
+ int Frame;
+ bool modelLoaded;
+ bool Scripted;
+
+ string AircraftPath;
+ string EnginePath;
+ string ScriptPath;
+ string ScriptName;
+ float StartTime;
+ float EndTime;
+ vector <struct condition> Conditions;
+
+ FGState* State;
+ FGAtmosphere* Atmosphere;
+ FGFCS* FCS;
+ FGPropulsion* Propulsion;
+ FGAircraft* Aircraft;
+ FGTranslation* Translation;
+ FGRotation* Rotation;
+ FGPosition* Position;
+ FGAuxiliary* Auxiliary;
+ FGOutput* Output;
+
+ bool Allocate(void);
+ bool DeAllocate(void);
+ void Debug(void);
+};
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+#endif
+