]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/FGScript.h
Latest JSBSim changes, including a kludge from Tony to keep the
[flightgear.git] / src / FDM / JSBSim / FGScript.h
1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2  Header:       FGScript.h
3  Author:       Jon Berndt
4  Date started: 12/21/2001
5
6  ------------- Copyright (C) 2001  Jon S. Berndt (jsb@hal-pc.org) -------------
7
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
11  version.
12
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
16  details.
17
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.
21
22  Further information about the GNU General Public License can also be found on
23  the world wide web at http://www.gnu.org.
24
25 HISTORY
26 --------------------------------------------------------------------------------
27 12/21/01   JSB   Created
28
29 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
30 SENTRY
31 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
32
33 #ifndef FGSCRIPT_HEADER_H
34 #define FGSCRIPT_HEADER_H
35
36 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
37 INCLUDES
38 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
39
40 #include "FGJSBBase.h"
41 #include "FGState.h"
42 #include "FGFDMExec.h"
43 #include <vector>
44
45 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
46 DEFINITIONS
47 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
48
49 #define ID_FGSCRIPT "$Id$"
50
51 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
52 FORWARD DECLARATIONS
53 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
54
55 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
56 COMMENTS, REFERENCES, and NOTES [use "class documentation" below for API docs]
57 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
58
59 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
60 CLASS DOCUMENTATION
61 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
62
63 /** Encapsulates the JSBSim scripting capability.
64     @author Jon S. Berndt
65     @version $Id$
66
67     <h4>Scripting support provided via FGScript.</h4>
68
69     <p>There is simple scripting support provided in the FGScript
70     class. Commands are specified using the <u>Simple Scripting
71     Directives for JSBSim</u> (SSDJ). The script file is in XML
72     format. A test condition (or conditions) can be set up in the
73     script and when the condition evaluates to true, the specified
74     action[s] is/are taken. A test condition can be <em>persistent</em>,
75     meaning that if a test condition evaluates to true, then passes
76     and evaluates to false, the condition is reset and may again be
77     triggered. When the set of tests evaluates to true for a given
78     condition, an item may be set to another value. This value might
79     be a boolean, a value, or a delta value, and the change from the
80     current value to the new value can be either via a step function,
81     a ramp, or an exponential approach. The speed of a ramp or
82     approach is specified via the time constant. Here is the format
83     of the script file:</p>
84
85     <pre><strong>&lt;?xml version=&quot;1.0&quot;?&gt;
86     &lt;runscript name=&quot;C172-01A&quot;&gt;
87
88     &lt;!--
89     This run is for testing C172 runs
90     --&gt;
91
92     &lt;use aircraft=&quot;c172&quot;&gt;
93     &lt;use initialize=&quot;reset00&quot;&gt;
94
95     &lt;run start=&quot;0.0&quot; end=&quot;4.5&quot; dt=&quot;0.05&quot;&gt;
96       &lt;when&gt;
97         &lt;parameter name=&quot;FG_TIME&quot; comparison=&quot;ge&quot; value=&quot;0.25&quot;&gt;
98         &lt;parameter name=&quot;FG_TIME&quot; comparison=&quot;le&quot; value=&quot;0.50&quot;&gt;
99         &lt;set name=&quot;FG_AILERON_CMD&quot; type=&quot;FG_VALUE&quot; value=&quot;0.25&quot;
100         action=&quot;FG_STEP&quot; persistent=&quot;false&quot; tc =&quot;0.25&quot;&gt;
101       &lt;/when&gt;
102       &lt;when&gt;
103         &lt;parameter name=&quot;FG_TIME&quot; comparison=&quot;ge&quot; value=&quot;0.5&quot;&gt;
104         &lt;parameter name=&quot;FG_TIME&quot; comparison=&quot;le&quot; value=&quot;1.5&quot;&gt;
105         &lt;set name=&quot;FG_AILERON_CMD&quot; type=&quot;FG_DELTA&quot; value=&quot;0.5&quot;
106         action=&quot;FG_EXP&quot; persistent=&quot;false&quot; tc =&quot;0.5&quot;&gt;
107       &lt;/when&gt;
108       &lt;when&gt;
109         &lt;parameter name=&quot;FG_TIME&quot; comparison=&quot;ge&quot; value=&quot;1.5&quot;&gt;
110         &lt;parameter name=&quot;FG_TIME&quot; comparison=&quot;le&quot; value=&quot;2.5&quot;&gt;
111         &lt;set name=&quot;FG_RUDDER_CMD&quot; type=&quot;FG_DELTA&quot; value=&quot;0.5&quot;
112         action=&quot;FG_RAMP&quot; persistent=&quot;false&quot; tc =&quot;0.5&quot;&gt;
113       &lt;/when&gt;
114     &lt;/run&gt;
115
116     &lt;/runscript&gt;</strong></pre>
117
118     <p>The first line must always be present. The second line
119     identifies this file as a script file, and gives a descriptive
120     name to the script file. Comments are next, delineated by the
121     &lt;!-- and --&gt; symbols. The aircraft and initialization files
122     to be used are specified in the &quot;use&quot; lines. Next,
123     comes the &quot;run&quot; section, where the conditions are
124     described in &quot;when&quot; clauses.</p>
125
126 */
127
128 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
129 CLASS DECLARATION
130 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
131
132 class FGScript : public FGJSBBase
133 {
134 public:
135   /// Default constructor
136   FGScript(FGFDMExec* exec);
137
138   /// Default destructor
139   ~FGScript();
140
141   /** Loads a script to drive JSBSim (usually in standalone mode).
142       The language is the Simple Script Directives for JSBSim (SSDJ).
143       @param script the filename (including path name, if any) for the script.
144       @return true if successful */
145   bool LoadScript(string script);
146
147   /** This function is called each pass through the executive Run() method IF
148       scripting is enabled. 
149       @return false if script should exit (i.e. if time limits are violated */
150   bool RunScript(void);
151
152 private:
153   enum eAction {
154     FG_RAMP  = 1,
155     FG_STEP  = 2,
156     FG_EXP   = 3
157   };
158
159   enum eType {
160     FG_VALUE = 1,
161     FG_DELTA = 2,
162     FG_BOOL  = 3
163   };
164
165   struct condition {
166     vector <eParam>  TestParam;
167     vector <eParam>  SetParam;
168     vector <double>  TestValue;
169     vector <double>  SetValue;
170     vector <string>  Comparison;
171     vector <double>  TC;
172     vector <bool>    Persistent;
173     vector <eAction> Action;
174     vector <eType>   Type;
175     vector <bool>    Triggered;
176     vector <double>  newValue;
177     vector <double>  OriginalValue;
178     vector <double>  StartTime;
179     vector <double>  EndTime;
180
181     condition() {
182     }
183   };
184
185   bool Scripted;
186
187   string  ScriptName;
188   double  StartTime;
189   double  EndTime;
190   vector <struct condition> Conditions;
191
192   FGFDMExec* FDMExec;
193   FGState* State;
194   void Debug(int from);
195 };
196
197 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
198 #endif
199