1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4 Date started: 12/21/2001
6 ------------- Copyright (C) 2001 Jon S. Berndt (jsb@hal-pc.org) -------------
8 This program is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free Software
10 Foundation; either version 2 of the License, or (at your option) any later
13 This program is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
18 You should have received a copy of the GNU General Public License along with
19 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
20 Place - Suite 330, Boston, MA 02111-1307, USA.
22 Further information about the GNU General Public License can also be found on
23 the world wide web at http://www.gnu.org.
26 --------------------------------------------------------------------------------
29 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
31 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
33 #ifndef FGSCRIPT_HEADER_H
34 #define FGSCRIPT_HEADER_H
36 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
38 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
40 #include "FGJSBBase.h"
42 #include "FGFDMExec.h"
45 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
47 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
49 #define ID_FGSCRIPT "$Id$"
51 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
53 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
57 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
58 COMMENTS, REFERENCES, and NOTES [use "class documentation" below for API docs]
59 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
61 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
63 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
65 /** Encapsulates the JSBSim scripting capability.
68 @see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGScript.h?rev=HEAD&content-type=text/vnd.viewcvs-markup">
70 @see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGScript.cpp?rev=HEAD&content-type=text/vnd.viewcvs-markup">
73 <h4>Scripting support provided via FGScript.</h4>
75 <p>There is simple scripting support provided in the FGScript
76 class. Commands are specified using the <u>Simple Scripting
77 Directives for JSBSim</u> (SSDJ). The script file is in XML
78 format. A test condition (or conditions) can be set up in the
79 script and when the condition evaluates to true, the specified
80 action[s] is/are taken. A test condition can be <em>persistent</em>,
81 meaning that if a test condition evaluates to true, then passes
82 and evaluates to false, the condition is reset and may again be
83 triggered. When the set of tests evaluates to true for a given
84 condition, an item may be set to another value. This value might
85 be a boolean, a value, or a delta value, and the change from the
86 current value to the new value can be either via a step function,
87 a ramp, or an exponential approach. The speed of a ramp or
88 approach is specified via the time constant. Here is the format
89 of the script file:</p>
91 <pre><strong><?xml version="1.0"?>
92 <runscript name="C172-01A">
95 This run is for testing C172 runs
98 <use aircraft="c172">
99 <use initialize="reset00">
101 <run start="0.0" end="4.5" dt="0.05">
103 <parameter name="FG_TIME" comparison="ge" value="0.25">
104 <parameter name="FG_TIME" comparison="le" value="0.50">
105 <set name="FG_AILERON_CMD" type="FG_VALUE" value="0.25"
106 action="FG_STEP" persistent="false" tc ="0.25">
109 <parameter name="FG_TIME" comparison="ge" value="0.5">
110 <parameter name="FG_TIME" comparison="le" value="1.5">
111 <set name="FG_AILERON_CMD" type="FG_DELTA" value="0.5"
112 action="FG_EXP" persistent="false" tc ="0.5">
115 <parameter name="FG_TIME" comparison="ge" value="1.5">
116 <parameter name="FG_TIME" comparison="le" value="2.5">
117 <set name="FG_RUDDER_CMD" type="FG_DELTA" value="0.5"
118 action="FG_RAMP" persistent="false" tc ="0.5">
122 </runscript></strong></pre>
124 <p>The first line must always be present. The second line
125 identifies this file as a script file, and gives a descriptive
126 name to the script file. Comments are next, delineated by the
127 <!-- and --> symbols. The aircraft and initialization files
128 to be used are specified in the "use" lines. Next,
129 comes the "run" section, where the conditions are
130 described in "when" clauses.</p>
134 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
136 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
138 class FGScript : public FGJSBBase
141 /// Default constructor
142 FGScript(FGFDMExec* exec);
144 /// Default destructor
147 /** Loads a script to drive JSBSim (usually in standalone mode).
148 The language is the Simple Script Directives for JSBSim (SSDJ).
149 @param script the filename (including path name, if any) for the script.
150 @return true if successful */
151 bool LoadScript( string script );
153 /** This function is called each pass through the executive Run() method IF
154 scripting is enabled.
155 @return false if script should exit (i.e. if time limits are violated */
156 bool RunScript(void);
172 vector <FGPropertyManager*> TestParam;
173 vector <FGPropertyManager*> SetParam;
174 vector <double> TestValue;
175 vector <double> SetValue;
176 vector <string> Comparison;
178 vector <bool> Persistent;
179 vector <eAction> Action;
181 vector <bool> Triggered;
182 vector <double> newValue;
183 vector <double> OriginalValue;
184 vector <double> StartTime;
185 vector <double> EndTime;
196 vector <struct condition> Conditions;
200 FGPropertyManager* PropertyManager;
201 void Debug(int from);
204 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%