]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/FGFDMExec.h
Updated to match changes in radiostack.[ch]xx
[flightgear.git] / src / FDM / JSBSim / FGFDMExec.h
1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2  Header:       FGFDMExec.h
3  Author:       Jon Berndt
4  Date started: 11/17/98
5
6  ------------- Copyright (C) 1999  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 11/17/98   JSB   Created
28 7/31/99     TP   Added RunIC function that runs the sim so that every frame
29                  begins with the IC values from the given FGInitialCondition
30                                    object and dt=0.
31
32 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33 SENTRY
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
35
36 #ifndef FGFDMEXEC_HEADER_H
37 #define FGFDMEXEC_HEADER_H
38
39 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
40 INCLUDES
41 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
42
43 #include "FGModel.h"
44 #include "FGInitialCondition.h"
45 #include "FGJSBBase.h"
46 #include "FGPropertyManager.h"
47
48 #include <vector>
49 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
50 DEFINITIONS
51 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
52
53 #define ID_FDMEXEC "$Id$"
54
55 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
56 FORWARD DECLARATIONS
57 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
58
59 class FGInitialCondition;
60
61 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
62 COMMENTS, REFERENCES, and NOTES [use "class documentation" below for API docs]
63 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
64
65 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
66 CLASS DOCUMENTATION
67 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
68
69 /** Encapsulates the JSBSim simulation executive.
70     @author Jon S. Berndt
71     @version $Id$
72     @see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGFDMExec.h?rev=HEAD&content-type=text/vnd.viewcvs-markup">
73          Header File </a>
74     @see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGFDMExec.cpp?rev=HEAD&content-type=text/vnd.viewcvs-markup">
75          Source File </a>
76
77     @doc This class is the interface class through which all other simulation classes
78     are instantiated, initialized, and run. When integrated with FlightGear (or
79     other flight simulator) this class is typically instantiated by an interface
80     class on the simulator side.
81
82     When an aircraft model is loaded the config file is parsed and for each of the
83     sections of the config file (propulsion, flight control, etc.) the
84     corresponding "ReadXXX()" method is called. From within this method the 
85     "Load()" method of that system is called (e.g. LoadFCS).
86
87     <h4>JSBSim Debugging Directives</h4>
88
89     This describes to any interested entity the debug level
90     requested by setting the JSBSIM_DEBUG environment variable.
91     The bitmasked value choices are as follows:<ol>
92     <li><b>unset</b>: In this case (the default) JSBSim would only print
93        out the normally expected messages, essentially echoing
94        the config files as they are read. If the environment
95        variable is not set, debug_lvl is set to 1 internally</li>
96     <li><b>0</b>: This requests JSBSim not to output any messages
97        whatsoever.</li>
98     <li><b>1</b>: This value explicity requests the normal JSBSim
99        startup messages</li>
100     <li><b>2</b>: This value asks for a message to be printed out when
101        a class is instantiated</li>
102     <li><b>4</b>: When this value is set, a message is displayed when a
103        FGModel object executes its Run() method</li>
104     <li><b>8</b>: When this value is set, various runtime state variables
105        are printed out periodically</li>
106     <li><b>16</b>: When set various parameters are sanity checked and
107        a message is printed out when they go out of bounds</li>
108     </ol>
109
110 */
111
112 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
113 CLASS DECLARATION
114 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
115
116 class FGFDMExec : public FGJSBBase
117 {
118 public:
119
120   /// Default constructor
121   FGFDMExec(FGPropertyManager* root = 0);
122   
123   /// Default destructor
124   ~FGFDMExec();
125
126   /** This routine places a model into the runlist at the specified rate. The
127       "rate" is not really a clock rate. It represents how many calls to the
128       FGFDMExec::Run() method must be made before the model is executed. A
129       value of 1 means that the model will be executed for each call to the
130       exec's Run() method. A value of 5 means that the model will only be
131       executed every 5th call to the exec's Run() method.
132       @param model A pointer to the model being scheduled.
133       @param rate The rate at which to execute the model as described above.
134       @return Currently returns 0 always. */
135   int  Schedule(FGModel* model, int rate);
136
137   /** This executes each scheduled model in succession.
138       @return true if successful, false if sim should be ended  */
139   bool Run(void);
140
141   /** Initializes the sim with a set of initial conditions.
142       @param fgic A pointer to a filled out initial conditions class which
143       describes the desired initial conditions.
144       @return true if successful
145        */
146   bool RunIC(FGInitialCondition *fgic);
147
148   /// Freezes the sim
149   void Freeze(void) {frozen = true;}
150
151   /// Resumes the sim
152   void Resume(void) {frozen = false;}
153
154   /** Loads an aircraft model.
155       @param AircraftPath path to the aircraft directory. For instance:
156       "aircraft". Under aircraft, then, would be directories for various
157       modeled aircraft such as C172/, x15/, etc.
158       @param EnginePath path to the directory under which engine config
159       files are kept, for instance "engine"
160       @param model the name of the aircraft model itself. This file will
161       be looked for in the directory specified in the AircraftPath variable,
162       and in turn under the directory with the same name as the model. For
163       instance: "aircraft/x15/x15.xml"
164       @return true if successful*/
165   bool LoadModel(string AircraftPath, string EnginePath, string model);
166
167   bool SetEnginePath(string path)   {EnginePath = path; return true;}
168   bool SetAircraftPath(string path) {AircraftPath = path; return true;}
169
170   /// @name Top-level executive State and Model retrieval mechanism
171   //@{
172   /// Returns the FGState pointer.
173   inline FGState* GetState(void)              {return State;}
174   /// Returns the FGAtmosphere pointer.
175   inline FGAtmosphere* GetAtmosphere(void)    {return Atmosphere;}
176   /// Returns the FGFCS pointer.
177   inline FGFCS* GetFCS(void)                  {return FCS;}
178   /// Returns the FGPropulsion pointer.
179   inline FGPropulsion* GetPropulsion(void)    {return Propulsion;}
180   /// Returns the FGAircraft pointer.
181   inline FGMassBalance* GetMassBalance(void)  {return MassBalance;}
182   /// Returns the FGAerodynamics pointer
183   inline FGAerodynamics* GetAerodynamics(void){return Aerodynamics;}
184   /// Returns the FGInertial pointer.
185   inline FGInertial* GetInertial(void)        {return Inertial;}
186   /// Returns the FGGroundReactions pointer.
187   inline FGGroundReactions* GetGroundReactions(void) {return GroundReactions;}
188   /// Returns the FGAircraft pointer.
189   inline FGAircraft* GetAircraft(void)        {return Aircraft;}
190   /// Returns the FGTranslation pointer.
191   inline FGTranslation* GetTranslation(void)  {return Translation;}
192   /// Returns the FGRotation pointer.
193   inline FGRotation* GetRotation(void)        {return Rotation;}
194   /// Returns the FGPosition pointer.
195   inline FGPosition* GetPosition(void)        {return Position;}
196   /// Returns the FGAuxiliary pointer.
197   inline FGAuxiliary* GetAuxiliary(void)      {return Auxiliary;}
198   /// Returns the FGOutput pointer.
199   inline FGOutput* GetOutput(void)            {return Output;}
200   //@}
201
202   /// Retrieves the engine path.
203   inline string GetEnginePath(void)          {return EnginePath;}
204   /// Retrieves the aircraft path.
205   inline string GetAircraftPath(void)        {return AircraftPath;}
206   
207   FGPropertyManager* GetPropertyManager(void);
208   vector <string> EnumerateFDMs(void);
209   void SetSlave(void) {IsSlave = true;}
210   
211 private:
212   FGModel* FirstModel;
213
214   bool frozen;
215   bool terminate;
216   int  Error;
217   unsigned int Frame;
218   unsigned int IdFDM;
219   static unsigned int FDMctr;
220   bool modelLoaded;
221   bool IsSlave;
222   static FGPropertyManager *master;
223   FGPropertyManager *instance;
224   
225   struct slaveData {
226     FGFDMExec* exec;
227     string info;
228     double x, y, z;
229     double roll, pitch, yaw;
230     bool mated;
231
232     slaveData(void) {
233       info = "";
234       x = y = z = 0.0;
235       roll = pitch = yaw = 0.0;
236       mated = true;
237     }
238
239     ~slaveData(void) {
240       delete exec;
241     }
242   };
243
244   string AircraftPath;
245   string EnginePath;
246   string CFGVersion;
247
248   FGState*           State;
249   FGAtmosphere*      Atmosphere;
250   FGFCS*             FCS;
251   FGPropulsion*      Propulsion;
252   FGMassBalance*     MassBalance;
253   FGAerodynamics*    Aerodynamics;
254   FGInertial*        Inertial;
255   FGGroundReactions* GroundReactions;
256   FGAircraft*        Aircraft;
257   FGTranslation*     Translation;
258   FGRotation*        Rotation;
259   FGPosition*        Position;
260   FGAuxiliary*       Auxiliary;
261   FGOutput*          Output;
262
263   vector <slaveData*> SlaveFDMList;
264
265   bool ReadMetrics(FGConfigFile*);
266   bool ReadSlave(FGConfigFile*);
267   bool ReadPropulsion(FGConfigFile*);
268   bool ReadFlightControls(FGConfigFile*);
269   bool ReadAerodynamics(FGConfigFile*);
270   bool ReadUndercarriage(FGConfigFile*);
271   bool ReadPrologue(FGConfigFile*);
272   bool ReadOutput(FGConfigFile*);
273
274   bool Allocate(void);
275   bool DeAllocate(void);
276   void Debug(int from);
277 };
278
279 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
280 #endif
281