/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Header: FGScript.h Author: Jon Berndt Date started: 12/21/2001 ------------- Copyright (C) 2001 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 -------------------------------------------------------------------------------- 12/21/01 JSB Created %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% SENTRY %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ #ifndef FGSCRIPT_HEADER_H #define FGSCRIPT_HEADER_H /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% INCLUDES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ #include "FGJSBBase.h" #include "FGState.h" #include "FGFDMExec.h" #include /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% DEFINITIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ #define ID_FGSCRIPT "$Id$" /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% FORWARD DECLARATIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% COMMENTS, REFERENCES, and NOTES [use "class documentation" below for API docs] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CLASS DOCUMENTATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ /** Encapsulates the JSBSim scripting capability. @author Jon S. Berndt @version $Id$ @see Header File @see Source File

Scripting support provided via FGScript.

There is simple scripting support provided in the FGScript 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.

*/ /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CLASS DECLARATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ class FGScript : public FGJSBBase { public: /// Default constructor FGScript(FGFDMExec* exec); /// Default destructor ~FGScript(); /** 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. @return false if script should exit (i.e. if time limits are violated */ bool RunScript(void); private: enum eAction { FG_RAMP = 1, FG_STEP = 2, FG_EXP = 3 }; enum eType { FG_VALUE = 1, FG_DELTA = 2, FG_BOOL = 3 }; 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() { } }; bool Scripted; string ScriptName; double StartTime; double EndTime; vector Conditions; FGFDMExec* FDMExec; FGState* State; FGPropertyManager* PropertyManager; void Debug(int from); }; //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #endif