From: curt Date: Mon, 2 Apr 2001 03:12:38 +0000 (+0000) Subject: Latest jsbsim updates. X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=94034c30815a66ec0746a1bdc7887dd65e274da8;p=flightgear.git Latest jsbsim updates. --- diff --git a/src/FDM/JSBSim/FGAircraft.cpp b/src/FDM/JSBSim/FGAircraft.cpp index ed10a42db..1ff7e5951 100644 --- a/src/FDM/JSBSim/FGAircraft.cpp +++ b/src/FDM/JSBSim/FGAircraft.cpp @@ -225,8 +225,8 @@ bool FGAircraft::LoadAircraft(string aircraft_path, string engine_path, string f ReadPrologue(&AC_cfg); - while ((AC_cfg.GetNextConfigLine() != "EOF") && - (token = AC_cfg.GetValue()) != "/FDM_CONFIG") { + while ((AC_cfg.GetNextConfigLine() != string("EOF")) && + (token = AC_cfg.GetValue()) != string("/FDM_CONFIG")) { if (token == "METRICS") { cout << fgcyan << "\n Reading Metrics" << fgdef << endl; ReadMetrics(&AC_cfg); @@ -455,9 +455,9 @@ void FGAircraft::ReadMetrics(FGConfigFile* AC_cfg) { AC_cfg->GetNextConfigLine(); - while ((token = AC_cfg->GetValue()) != "/METRICS") { + while ((token = AC_cfg->GetValue()) != string("/METRICS")) { *AC_cfg >> parameter; - if (parameter == "AC_WINGAREA") { + if (parameter == string("AC_WINGAREA")) { *AC_cfg >> WingArea; cout << " WingArea: " << WingArea << endl; } else if (parameter == "AC_WINGSPAN") { @@ -522,12 +522,12 @@ void FGAircraft::ReadAerodynamics(FGConfigFile* AC_cfg) { AC_cfg->GetNextConfigLine(); - while ((token = AC_cfg->GetValue()) != "/AERODYNAMICS") { + while ((token = AC_cfg->GetValue()) != string("/AERODYNAMICS")) { if (token == "AXIS") { CoeffArray ca; axis = AC_cfg->GetValue("NAME"); AC_cfg->GetNextConfigLine(); - while ((token = AC_cfg->GetValue()) != "/AXIS") { + while ((token = AC_cfg->GetValue()) != string("/AXIS")) { ca.push_back(new FGCoefficient(FDMExec, AC_cfg)); DisplayCoeffFactors(ca.back()->Getmultipliers()); } @@ -544,7 +544,7 @@ void FGAircraft::ReadUndercarriage(FGConfigFile* AC_cfg) { AC_cfg->GetNextConfigLine(); - while ((token = AC_cfg->GetValue()) != "/UNDERCARRIAGE") { + while ((token = AC_cfg->GetValue()) != string("/UNDERCARRIAGE")) { lGear.push_back(FGLGear(AC_cfg, FDMExec)); } } @@ -562,7 +562,7 @@ void FGAircraft::ReadOutput(FGConfigFile* AC_cfg) { Output->SetType(token); AC_cfg->GetNextConfigLine(); - while ((token = AC_cfg->GetValue()) != "/OUTPUT") { + while ((token = AC_cfg->GetValue()) != string("/OUTPUT")) { *AC_cfg >> parameter; if (parameter == "RATE_IN_HZ") *AC_cfg >> OutRate; if (parameter == "SIMULATION") { @@ -634,7 +634,7 @@ void FGAircraft::ReadPrologue(FGConfigFile* AC_cfg) { CFGVersion = AC_cfg->GetValue("VERSION"); cout << " Version: " << highint << CFGVersion << normint << endl; - if (CFGVersion != NEEDED_CFG_VERSION) { + if (CFGVersion != string(NEEDED_CFG_VERSION)) { cout << endl << fgred << "YOU HAVE AN INCOMPATIBLE CFG FILE FOR THIS AIRCRAFT." " RESULTS WILL BE UNPREDICTABLE !!" << endl; cout << "Current version needed is: " << NEEDED_CFG_VERSION << endl; diff --git a/src/FDM/JSBSim/FGCoefficient.cpp b/src/FDM/JSBSim/FGCoefficient.cpp index f3c7bd1be..449a83593 100644 --- a/src/FDM/JSBSim/FGCoefficient.cpp +++ b/src/FDM/JSBSim/FGCoefficient.cpp @@ -48,7 +48,11 @@ INCLUDES #include "FGState.h" #include "FGFDMExec.h" -#include +#ifndef FGFS +# include +#else +# include STL_IOMANIP +#endif static const char *IdSrc = "$Id$"; static const char *IdHdr = "ID_COEFFICIENT"; diff --git a/src/FDM/JSBSim/FGControls.cpp b/src/FDM/JSBSim/FGControls.cpp index 586651538..88bfba511 100644 --- a/src/FDM/JSBSim/FGControls.cpp +++ b/src/FDM/JSBSim/FGControls.cpp @@ -53,8 +53,8 @@ FGControls::~FGControls() { // $Log$ -// Revision 1.22 2001/03/29 23:04:51 curt -// Latest round of JSBSim updates. +// Revision 1.23 2001/04/02 01:12:38 curt +// Latest jsbsim updates. // // Revision 1.7 2001/03/22 14:10:24 jberndt // Fixed ID comment diff --git a/src/FDM/JSBSim/FGControls.h b/src/FDM/JSBSim/FGControls.h index ea9078356..94a5ab77f 100644 --- a/src/FDM/JSBSim/FGControls.h +++ b/src/FDM/JSBSim/FGControls.h @@ -178,8 +178,8 @@ extern FGControls controls; // $Log$ -// Revision 1.21 2001/03/29 23:04:51 curt -// Latest round of JSBSim updates. +// Revision 1.22 2001/04/02 01:12:38 curt +// Latest jsbsim updates. // // Revision 1.10 2001/03/22 14:10:24 jberndt // Fixed ID comment diff --git a/src/FDM/JSBSim/FGFDMExec.cpp b/src/FDM/JSBSim/FGFDMExec.cpp index d98f24038..f3098ef8a 100644 --- a/src/FDM/JSBSim/FGFDMExec.cpp +++ b/src/FDM/JSBSim/FGFDMExec.cpp @@ -117,6 +117,7 @@ CLASS IMPLEMENTATION FGFDMExec::FGFDMExec(void) { + Frame = 0; FirstModel = 0; Error = 0; State = 0; @@ -304,13 +305,16 @@ bool FGFDMExec::Run(void) if (State->Getsim_time() >= EndTime) return false; } - if (debug_lvl & 4) cout << "=========================" << endl; + if (debug_lvl & 4) + cout << "================== Frame: " << Frame << " Time: " + << State->Getsim_time() << endl; while (!model_iterator->Run()) { model_iterator = model_iterator->NextModel; if (model_iterator == 0L) break; } + Frame++; State->IncrTime(); return true; diff --git a/src/FDM/JSBSim/FGFDMExec.h b/src/FDM/JSBSim/FGFDMExec.h index 046b2403f..973bc37b3 100644 --- a/src/FDM/JSBSim/FGFDMExec.h +++ b/src/FDM/JSBSim/FGFDMExec.h @@ -1,331 +1,332 @@ -/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - 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 -# ifdef FG_HAVE_STD_INCLUDES -# include -# else -# include -# endif -#else -# include -#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 TestParam; - vector SetParam; - vector TestValue; - vector SetValue; - vector Comparison; - vector TC; - vector Persistent; - vector Action; - vector Type; - vector Triggered; - vector newValue; - vector OriginalValue; - vector StartTime; - vector 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. - -

Scripting support provided in the Executive

- -

There is simple scripting support provided in the FGFDMExec - class. Commands are specified using the Simple Scripting - Directives for JSBSim (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 persistent, - 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:

- -
<?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>
- -

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.

- -

JSBSim Debugging Directives

- - This describes to any interested entity the debug level - requested by setting the JSBSIM_DEBUG environment variable. - The bitmasked value choices are as follows:
    -
  1. unset: 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
  2. -
  3. 0: This requests JSBSim not to output any messages - whatsoever.
  4. -
  5. 1: This value explicity requests the normal JSBSim - startup messages
  6. -
  7. 2: This value asks for a message to be printed out when - a class is instantiated
  8. -
  9. 4: When this value is set, a message is displayed when a - FGModel object executes its Run() method
  10. -
  11. 8: When this value is set, various runtime state variables - are printed out periodically
  12. -
- -*/ - -/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -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; - bool modelLoaded; - bool Scripted; - - string AircraftPath; - string EnginePath; - string ScriptPath; - string ScriptName; - float StartTime; - float EndTime; - vector 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 - +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + 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 +# ifdef FG_HAVE_STD_INCLUDES +# include +# else +# include +# endif +#else +# include +#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 TestParam; + vector SetParam; + vector TestValue; + vector SetValue; + vector Comparison; + vector TC; + vector Persistent; + vector Action; + vector Type; + vector Triggered; + vector newValue; + vector OriginalValue; + vector StartTime; + vector 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. + +

Scripting support provided in the Executive

+ +

There is simple scripting support provided in the FGFDMExec + class. Commands are specified using the Simple Scripting + Directives for JSBSim (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 persistent, + 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:

+ +
<?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>
+ +

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.

+ +

JSBSim Debugging Directives

+ + This describes to any interested entity the debug level + requested by setting the JSBSIM_DEBUG environment variable. + The bitmasked value choices are as follows:
    +
  1. unset: 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
  2. +
  3. 0: This requests JSBSim not to output any messages + whatsoever.
  4. +
  5. 1: This value explicity requests the normal JSBSim + startup messages
  6. +
  7. 2: This value asks for a message to be printed out when + a class is instantiated
  8. +
  9. 4: When this value is set, a message is displayed when a + FGModel object executes its Run() method
  10. +
  11. 8: When this value is set, various runtime state variables + are printed out periodically
  12. +
+ +*/ + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +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 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 + diff --git a/src/FDM/JSBSim/FGLGear.cpp b/src/FDM/JSBSim/FGLGear.cpp index 1f044a548..5aa1c9d38 100644 --- a/src/FDM/JSBSim/FGLGear.cpp +++ b/src/FDM/JSBSim/FGLGear.cpp @@ -186,7 +186,7 @@ FGColumnVector FGLGear::Force(void) FGColumnVector vLocalForce(3); //FGColumnVector vLocalGear(3); // Vector: CG to this wheel (Local) FGColumnVector vWhlVelVec(3); // Velocity of this wheel (Local) - + vWhlBodyVec = (vXYZ - Aircraft->GetXYZcg()) / 12.0; vWhlBodyVec(eX) = -vWhlBodyVec(eX); vWhlBodyVec(eZ) = -vWhlBodyVec(eZ); @@ -259,7 +259,7 @@ FGColumnVector FGLGear::Force(void) switch (eSteerType) { case stSteer: - SteerAngle = SteerGain*RudderPedal; + SteerAngle = SteerGain*FCS->GetDrCmd(); break; case stFixed: SteerAngle = 0.0; @@ -322,7 +322,10 @@ FGColumnVector FGLGear::Force(void) // Compute the forces in the wheel ground plane. - RollingForce = vLocalForce(eZ) * BrakeFCoeff * fabs(RollingWhlVel)/RollingWhlVel; + RollingForce = 0; + if(fabs(RollingWhlVel) > 1E-3) { + RollingForce = vLocalForce(eZ) * BrakeFCoeff * fabs(RollingWhlVel)/RollingWhlVel; + } SideForce = vLocalForce(eZ) * FCoeff; // Transform these forces back to the local reference frame. diff --git a/src/FDM/JSBSim/FGMatrix.h b/src/FDM/JSBSim/FGMatrix.h index 068be0fff..c34dac64d 100644 --- a/src/FDM/JSBSim/FGMatrix.h +++ b/src/FDM/JSBSim/FGMatrix.h @@ -23,6 +23,12 @@ INCLUDES #include #ifdef FGFS # include +# include STL_STRING + SG_USING_STD(string); + SG_USING_STD(ostream); + SG_USING_STD(istream); + SG_USING_STD(cerr); + SG_USING_STD(endl); # ifdef FG_HAVE_STD_INCLUDES # include # include @@ -36,9 +42,14 @@ INCLUDES # include # include # include +# include + using std::string; + using std::ostream; + using std::istream; + using std::cerr; + using std::endl; #endif -#include /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% DEFINITIONS @@ -46,12 +57,6 @@ DEFINITIONS #define ID_MATRIX "$Id$" -using std::string; -using std::ostream; -using std::istream; -using std::cerr; -using std::endl; - /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% FORWARD DECLARATIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ @@ -148,45 +153,12 @@ public: friend FGColumnVector operator*(const FGMatrix& M, const FGColumnVector& V); double& operator()(int m) const; - + FGColumnVector& multElementWise(const FGColumnVector& V); private: void Debug(void); }; -/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -DECLARATION: FGMatrix3x3 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ - -class FGMatrix3x3 : public FGMatrix -{ -public: - FGMatrix3x3(void) {FGMatrix(3,3);} -// ~FGMatrix3x3(void) {~FGMatrix();} -}; - -/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -DECLARATION: FGColumnVector4 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ - -class FGColumnVector4 : public FGColumnVector -{ -public: - FGColumnVector4(void) {FGColumnVector(4);} -// ~FGColumnVector4(void) {~FGColumnVector();} -}; - -/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -DECLARATION: FGColumnVector3 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ - -class FGColumnVector3 : public FGColumnVector -{ -public: - FGColumnVector3(void) {FGColumnVector(3);} -// ~FGColumnVector3(void) {~FGColumnVector();} -}; - //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #endif diff --git a/src/FDM/JSBSim/FGNozzle.cpp b/src/FDM/JSBSim/FGNozzle.cpp index c5faef38b..7d4db6af3 100644 --- a/src/FDM/JSBSim/FGNozzle.cpp +++ b/src/FDM/JSBSim/FGNozzle.cpp @@ -73,6 +73,8 @@ FGNozzle::FGNozzle(FGFDMExec* FDMExec, FGConfigFile* Nzl_cfg) : FGThruster(FDMEx } } + Thrust = 0; + if (debug_lvl & 2) cout << "Instantiated: FGNozzle" << endl; } @@ -87,7 +89,6 @@ FGNozzle::~FGNozzle() float FGNozzle::Calculate(float CfPc) { - float Thrust; float pAtm = fdmex->GetAtmosphere()->GetPressure(); Thrust = (CfPc + (PE - pAtm)*ExpR) * (Diameter / ExpR) * nzlEff; diff --git a/src/FDM/JSBSim/FGPropeller.cpp b/src/FDM/JSBSim/FGPropeller.cpp index 96176e0f5..27ea9266d 100644 --- a/src/FDM/JSBSim/FGPropeller.cpp +++ b/src/FDM/JSBSim/FGPropeller.cpp @@ -52,8 +52,8 @@ FGPropeller::FGPropeller(FGFDMExec* exec, FGConfigFile* Prop_cfg) : FGThruster(e string token; int rows, cols; - PropName = Prop_cfg->GetValue("NAME"); - cout << "\n Propeller Name: " << PropName << endl; + Name = Prop_cfg->GetValue("NAME"); + cout << "\n Propeller Name: " << Name << endl; Prop_cfg->GetNextConfigLine(); while (Prop_cfg->GetValue() != "/FG_PROPELLER") { *Prop_cfg >> token; diff --git a/src/FDM/JSBSim/FGPropeller.h b/src/FDM/JSBSim/FGPropeller.h index aaabfea56..cd014c76f 100644 --- a/src/FDM/JSBSim/FGPropeller.h +++ b/src/FDM/JSBSim/FGPropeller.h @@ -124,9 +124,6 @@ public: /// Retrieves the propeller moment of inertia float GetIxx(void) { return Ixx; } - /// Retrieves the Thrust in pounds - float GetThrust(void) { return Thrust; } - /// Retrieves the Torque in foot-pounds (Don't you love the English system?) float GetTorque(void) { return Torque; } @@ -147,7 +144,6 @@ public: float Calculate(float PowerAvailable); private: - string PropName; int numBlades; float RPM; float Ixx; @@ -155,7 +151,6 @@ private: float MaxPitch; float MinPitch; float Pitch; - float Thrust; float Torque; FGTable *Efficiency; FGTable *cThrust; diff --git a/src/FDM/JSBSim/FGPropulsion.cpp b/src/FDM/JSBSim/FGPropulsion.cpp index 2530429a3..68335b4a6 100644 --- a/src/FDM/JSBSim/FGPropulsion.cpp +++ b/src/FDM/JSBSim/FGPropulsion.cpp @@ -206,12 +206,12 @@ bool FGPropulsion::LoadPropulsion(FGConfigFile* AC_cfg) } else cerr << "Unknown identifier: " << token << " in engine file: " << engineFileName << endl; } - + Engines[numEngines]->SetPlacement(xLoc, yLoc, zLoc, Pitch, Yaw); numEngines++; } else { - + cerr << "Could not read engine config file: " << fullpath + engineFileName + ".xml" << endl; return false; @@ -231,7 +231,7 @@ bool FGPropulsion::LoadPropulsion(FGConfigFile* AC_cfg) numOxiTanks++; break; } - + numTanks++; } else if (token == "AC_THRUSTER") { // ========== READING THRUSTERS @@ -285,6 +285,87 @@ bool FGPropulsion::LoadPropulsion(FGConfigFile* AC_cfg) //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +string FGPropulsion::GetPropulsionStrings(void) +{ + string PropulsionStrings = ""; + bool firstime = true; + + for (unsigned int i=0;i +# include STL_STRING + SG_USING_STD(cout); + SG_USING_STD(endl); # ifdef FG_HAVE_STD_INCLUDES # include # include @@ -56,9 +59,11 @@ INCLUDES #else # include # include +# include + using std::cout; + using std::endl; #endif -#include #include #if defined(__BORLANDC__) || defined(_MSC_VER) @@ -76,9 +81,6 @@ DEFINITIONS #define ID_FDMSOCKET "$Id$" -using std::cout; -using std::endl; - /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CLASS DECLARATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/