]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/FGFCS.h
Sync with latest JSBSim CVS
[flightgear.git] / src / FDM / JSBSim / FGFCS.h
1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2
3  Header:       FGGFCS.h
4  Author:       Jon S. Berndt
5  Date started: 12/12/98
6  
7  ------------- Copyright (C) 1999  Jon S. Berndt (jsb@hal-pc.org) -------------
8  
9  This program is free software; you can redistribute it and/or modify it under
10  the terms of the GNU General Public License as published by the Free Software
11  Foundation; either version 2 of the License, or (at your option) any later
12  version.
13  
14  This program is distributed in the hope that it will be useful, but WITHOUT
15  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16  FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
17  details.
18  
19  You should have received a copy of the GNU General Public License along with
20  this program; if not, write to the Free Software Foundation, Inc., 59 Temple
21  Place - Suite 330, Boston, MA  02111-1307, USA.
22  
23  Further information about the GNU General Public License can also be found on
24  the world wide web at http://www.gnu.org.
25  
26 HISTORY
27 --------------------------------------------------------------------------------
28 12/12/98   JSB   Created
29  
30 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
31 SENTRY
32 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
33
34 #ifndef FGFCS_H
35 #define FGFCS_H
36
37 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
38 INCLUDES
39 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
40
41 #ifdef FGFS
42 #  include <simgear/compiler.h>
43 #  ifdef SG_HAVE_STD_INCLUDES
44 #    include <vector>
45 #  else
46 #    include <vector.h>
47 #  endif
48 #else
49 #  include <vector>
50 #endif
51
52 #include <string>
53 #include "filtersjb/FGFCSComponent.h"
54 #include "FGModel.h"
55 #include "FGLGear.h"
56 #include "FGConfigFile.h"
57
58 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
59 DEFINITIONS
60 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
61
62 #define ID_FCS "$Id$"
63
64 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
65 FORWARD DECLARATIONS
66 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
67
68 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
69 COMMENTS, REFERENCES, and NOTES [use "class documentation" below for API docs]
70 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
71
72 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
73 CLASS DOCUMENTATION
74 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
75
76 /** Encapsulates the Flight Control System (FCS) functionality.
77     <ul><li>\URL[Source Code]{FGFCS.cpp.html}</li>
78     <li>\URL[Header File]{FGFCS.h.html}</li></ul>
79     This class owns and contains the list of \URL[components]{FGFCSComponent.html}
80     that define the control system for this aircraft. The config file for the
81     aircraft contains a description of the control path that starts at an input
82     or command and ends at an effector, e.g. an aerosurface. The FCS components
83     which comprise the control laws for an axis are defined sequentially in
84     the configuration file. For instance, for the X-15:
85     
86     <pre>
87     &lt FLIGHT_CONTROL NAME="X-15 SAS"&gt
88
89     &lt COMPONENT NAME="Pitch Trim Sum" TYPE="SUMMER"&gt
90       ID            0
91       INPUT        FG_ELEVATOR_CMD
92       INPUT        FG_PITCH_TRIM_CMD
93       CLIPTO       -1 1
94     &lt/COMPONENT&gt
95
96     &lt COMPONENT NAME="Pitch Command Scale" TYPE="AEROSURFACE_SCALE"&gt
97       ID           1
98       INPUT        0
99       MIN         -50
100       MAX          50
101     &lt/COMPONENT&gt
102
103     &lt COMPONENT NAME="Pitch Gain 1" TYPE="PURE_GAIN"&gt
104       ID           2
105       INPUT        1
106       GAIN         -0.36
107     &lt/COMPONENT&gt
108
109     &lt COMPONENT NAME="Pitch Scheduled Gain 1" TYPE="SCHEDULED_GAIN"&gt
110       ID           3
111       INPUT        2
112       GAIN         0.017
113       SCHEDULED_BY FG_ELEVATOR_POS
114       -0.35  -6.0
115       -0.17  -3.0
116        0.00  -2.0
117        0.09  -3.0
118        0.17  -5.0
119        0.60 -12.0
120     &lt/COMPONENT&gt
121
122     ... etc.
123     </pre>
124     
125     In the above case we can see the first few components of the pitch channel
126     defined. The input to the first component, as can be seen in the "Pitch trim
127     sum" component, is really the sum of two parameters: elevator command (from
128     the stick - a pilot input), and pitch trim. The type of this component is
129     "Summer". Its ID is 0 - the ID is used by other components to reference it.
130     The next component created is an aerosurface scale component - a type of
131     gain (see the LoadFCS() method for insight on how the various types of
132     components map into the actual component classes). You can see the input of
133     the "Pitch Command Scale" component takes "0" as input. When a number is
134     specified as an input, it refers to the ID of another FCS component. In this
135     case, ID 0 refers to the previously defined and discussed "Pitch Trim Sum"
136     component. This continues until the final component for an axis when the
137     OUTPUT keyword specifies where the output is supposed to go. See the
138     individual components for more information on how they are mechanized.
139     
140     @author Jon S. Berndt
141     @version $Id$
142     @see FGFCSComponent
143     @see FGConfigFile
144     @see FGGain
145     @see FGSummer
146     @see FGSwitch
147     @see FGGradient
148     @see FGFilter
149     @see FGFlaps
150     @see FGDeadBand
151 */
152
153 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
154 CLASS DECLARATION
155 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
156
157 class FGFCS : public FGModel {
158
159 public:
160   /** Constructor
161       @param Executive a pointer to the parent executive object */
162   FGFCS(FGFDMExec*);
163   /// Destructor
164   ~FGFCS();
165
166   /** Runs the Flight Controls model; called by the Executive
167       @return false if no error */
168   bool Run(void);
169
170   /// @name Pilot input command retrieval
171   //@{
172   /** Gets the aileron command.
173       @return aileron command in radians */
174   inline float GetDaCmd(void) { return DaCmd; }
175
176   /** Gets the elevator command.
177       @return elevator command in radians */
178   inline float GetDeCmd(void) { return DeCmd; }
179
180   /** Gets the rudder command.
181       @return rudder command in radians */
182   inline float GetDrCmd(void) { return DrCmd; }
183
184   /** Gets the flaps command.
185       @return flaps command in radians */
186   inline float GetDfCmd(void) { return DfCmd; }
187
188   /** Gets the speedbrake command.
189       @return speedbrake command in radians */
190   inline float GetDsbCmd(void) { return DsbCmd; }
191
192   /** Gets the spoiler command.
193       @return spoiler command in radians */
194   inline float GetDspCmd(void) { return DspCmd; }
195
196   /** Gets the throttle command.
197       @param engine engine ID number
198       @return throttle command in percent ( 0 - 100) for the given engine */
199   float GetThrottleCmd(int engine);
200
201   /** Gets the mixture command.
202       @param engine engine ID number
203       @return mixture command in percent ( 0 - 100) for the given engine */
204   inline float GetMixtureCmd(int engine) { return MixtureCmd[engine]; }
205
206   /** Gets the pitch trim command.
207       @return pitch trim command in radians */
208   inline float GetPitchTrimCmd(void) { return PTrimCmd; }
209   //@}
210
211   /// @name Aerosurface position retrieval
212   //@{
213   /** Gets the aileron position.
214       @return aileron position in radians */
215   inline float GetDaPos(void) { return DaPos; }
216
217   /** Gets the elevator position.
218       @return elevator position in radians */
219   inline float GetDePos(void) { return DePos; }
220
221   /** Gets the rudder position.
222       @return rudder position in radians */
223   inline float GetDrPos(void) { return DrPos; }
224
225   /** Gets the flaps position.
226       @return flaps position in radians */
227   inline float GetDfPos(void) { return DfPos; }
228
229   /** Gets the speedbrake position.
230       @return speedbrake position in radians */
231   inline float GetDsbPos(void) { return DsbPos; }
232
233   /** Gets the spoiler position.
234       @return spoiler position in radians */
235   inline float GetDspPos(void) { return DspPos; }
236
237   /** Gets the throttle position.
238       @param engine engine ID number
239       @return throttle position for the given engine in percent ( 0 - 100)*/
240   float GetThrottlePos(int engine);
241
242   /** Gets the mixture position.
243       @param engine engine ID number
244       @return mixture position for the given engine in percent ( 0 - 100)*/
245   inline float GetMixturePos(int engine) { return MixturePos[engine]; }
246   //@}
247
248   /** Retrieves the State object pointer.
249       This is used by the FGFCS-owned components.
250       @return pointer to the State object */
251   inline FGState* GetState(void) { return State; }
252
253   /** Retrieves a components output value
254       @param idx the index of the component (the component ID)
255       @return output value from the component */
256   float GetComponentOutput(eParam idx);
257
258   /** Retrieves the component name
259       @param idx the index of the component (the component ID)
260       @return name of the component */
261   string GetComponentName(int idx);
262
263   /** Retrieves all component names for inclusion in output stream */
264   string GetComponentStrings(void);
265
266   /** Retrieves all component outputs for inclusion in output stream */
267   string GetComponentValues(void);
268
269   /// @name Pilot input command setting
270   //@{
271   /** Sets the aileron command
272       @param cmd aileron command in radians*/
273   inline void SetDaCmd(float cmd) { DaCmd = cmd; }
274
275   /** Sets the elevator command
276       @param cmd elevator command in radians*/
277   inline void SetDeCmd(float cmd) { DeCmd = cmd; }
278
279   /** Sets the rudder command
280       @param cmd rudder command in radians*/
281   inline void SetDrCmd(float cmd) { DrCmd = cmd; }
282
283   /** Sets the flaps command
284       @param cmd flaps command in radians*/
285   inline void SetDfCmd(float cmd) { DfCmd = cmd; }
286
287   /** Sets the speedbrake command
288       @param cmd speedbrake command in radians*/
289   inline void SetDsbCmd(float cmd) { DsbCmd = cmd; }
290
291   /** Sets the spoilers command
292       @param cmd spoilers command in radians*/
293   inline void SetDspCmd(float cmd) { DspCmd = cmd; }
294
295   /** Sets the pitch trim command
296       @param cmd pitch trim command in radians*/
297   inline void SetPitchTrimCmd(float cmd) { PTrimCmd = cmd; }
298
299   /** Sets the throttle command for the specified engine
300       @param engine engine ID number
301       @param cmd throttle command in percent (0 - 100)*/
302   void SetThrottleCmd(int engine, float cmd);
303
304   /** Sets the mixture command for the specified engine
305       @param engine engine ID number
306       @param cmd mixture command in percent (0 - 100)*/
307   void SetMixtureCmd(int engine, float cmd);
308   //@}
309
310   /// @name Aerosurface position setting
311   //@{
312   /** Sets the aileron position
313       @param cmd aileron position in radians*/
314   inline void SetDaPos(float cmd) { DaPos = cmd; }
315
316   /** Sets the elevator position
317       @param cmd elevator position in radians*/
318   inline void SetDePos(float cmd) { DePos = cmd; }
319
320   /** Sets the rudder position
321       @param cmd rudder position in radians*/
322   inline void SetDrPos(float cmd) { DrPos = cmd; }
323
324   /** Sets the flaps position
325       @param cmd flaps position in radians*/
326   inline void SetDfPos(float cmd) { DfPos = cmd; }
327
328   /** Sets the speedbrake position
329       @param cmd speedbrake position in radians*/
330   inline void SetDsbPos(float cmd) { DsbPos = cmd; }
331
332   /** Sets the spoiler position
333       @param cmd spoiler position in radians*/
334   inline void SetDspPos(float cmd) { DspPos = cmd; }
335
336   /** Sets the actual throttle setting for the specified engine
337       @param engine engine ID number
338       @param cmd throttle setting in percent (0 - 100)*/
339   void SetThrottlePos(int engine, float cmd);
340
341   /** Sets the actual mixture setting for the specified engine
342       @param engine engine ID number
343       @param cmd mixture setting in percent (0 - 100)*/
344   void SetMixturePos(int engine, float cmd);
345   //@}
346
347   /// @name Landing Gear brakes
348   //@{
349   /** Sets the left brake group
350       @param cmd brake setting in percent (0.0 - 1.0) */
351   void SetLBrake(float cmd) {LeftBrake = cmd;}
352
353   /** Sets the right brake group
354       @param cmd brake setting in percent (0.0 - 1.0) */
355   void SetRBrake(float cmd) {RightBrake = cmd;}
356
357   /** Sets the center brake group
358       @param cmd brake setting in percent (0.0 - 1.0) */
359   void SetCBrake(float cmd) {CenterBrake = cmd;}
360
361   /** Gets the brake for a specified group.
362       @param bg which brakegroup to retrieve the command for
363       @return the brake setting for the supplied brake group argument */
364   float GetBrake(FGLGear::BrakeGroup bg);
365   //@}
366
367   /** Loads the Flight Control System.
368       The FGAircraft instance is actually responsible for reading the config file
369       and calling the various Loadxx() methods of the other systems, passing in
370       the config file instance pointer. LoadFCS() is called from FGAircraft.
371       @param AC_cfg pointer to the config file instance
372       @return true if succesful */
373   bool Load(FGConfigFile* AC_cfg);
374
375   void AddThrottle(void);
376
377 private:
378   float DaCmd, DeCmd, DrCmd, DfCmd, DsbCmd, DspCmd;
379   float DaPos, DePos, DrPos, DfPos, DsbPos, DspPos;
380   float PTrimCmd;
381   vector <float> ThrottleCmd;
382   vector <float> ThrottlePos;
383   vector <float> MixtureCmd;
384   vector <float> MixturePos;
385   float LeftBrake, RightBrake, CenterBrake; // Brake settings
386
387   vector <FGFCSComponent*> Components;
388   void Debug(void);
389 };
390
391 #include "FGState.h"
392
393 #endif
394