]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/FGFCS.h
Latest JSBSim changes, including some gear tweaking from Jon and some
[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 FGDeadBand
150 */
151
152 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
153 CLASS DECLARATION
154 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
155
156 class FGFCS : public FGModel {
157
158 public:
159   /** Constructor
160       @param Executive a pointer to the parent executive object */
161   FGFCS(FGFDMExec*);
162   /// Destructor
163   ~FGFCS();
164
165   /** Runs the Flight Controls model; called by the Executive
166       @return false if no error */
167   bool Run(void);
168
169   /// @name Pilot input command retrieval
170   //@{
171   /** Gets the aileron command.
172       @return aileron command in percent */
173   inline double GetDaCmd(void) { return DaCmd; }
174
175   /** Gets the elevator command.
176       @return elevator command in percent */
177   inline double GetDeCmd(void) { return DeCmd; }
178
179   /** Gets the rudder command.
180       @return rudder command in percent */
181   inline double GetDrCmd(void) { return DrCmd; }
182
183   /** Gets the flaps command.
184       @return flaps command in percent */
185   inline double GetDfCmd(void) { return DfCmd; }
186
187   /** Gets the speedbrake command.
188       @return speedbrake command in percent */
189   inline double GetDsbCmd(void) { return DsbCmd; }
190
191   /** Gets the spoiler command.
192       @return spoiler command in percent */
193   inline double GetDspCmd(void) { return DspCmd; }
194
195   /** Gets the throttle command.
196       @param engine engine ID number
197       @return throttle command in percent ( 0 - 100) for the given engine */
198   double GetThrottleCmd(int engine);
199
200   /** Gets the mixture command.
201       @param engine engine ID number
202       @return mixture command in percent ( 0 - 100) for the given engine */
203   inline double GetMixtureCmd(int engine) { return MixtureCmd[engine]; }
204
205   /** Gets the prop pitch command.
206       @param engine engine ID number
207       @return pitch command in percent ( 0.0 - 1.0) for the given engine */
208   inline double GetPropAdvanceCmd(int engine) { return PropAdvanceCmd[engine]; }
209
210   /** Gets the pitch trim command.
211       @return pitch trim command in percent */
212   inline double GetPitchTrimCmd(void) { return PTrimCmd; }
213   
214   /** Gets the rudder trim command.
215       @return rudder trim command in percent */
216   inline double GetYawTrimCmd(void) { return YTrimCmd; }
217   
218   /** Gets the aileron trim command.
219       @return aileron trim command in percent */
220   inline double GetRollTrimCmd(void) { return RTrimCmd; }
221   
222   /** Get the gear extend/retract command. 0 commands gear up, 1 down.
223       defaults to down.
224       @return the current value of the gear extend/retract command*/
225   inline double GetGearCmd(void) { return GearCmd; }    
226   //@}
227
228   /// @name Aerosurface position retrieval
229   //@{
230   /** Gets the aileron position.
231       @return aileron position in radians */
232   inline double GetDaPos(void) { return DaPos; }
233
234   /** Gets the elevator position.
235       @return elevator position in radians */
236   inline double GetDePos(void) { return DePos; }
237
238   /** Gets the rudder position.
239       @return rudder position in radians */
240   inline double GetDrPos(void) { return DrPos; }
241
242   /** Gets the flaps position.
243       @return flaps position in radians */
244   inline double GetDfPos(void) { return DfPos; }
245
246   /** Gets the speedbrake position.
247       @return speedbrake position in radians */
248   inline double GetDsbPos(void) { return DsbPos; }
249
250   /** Gets the spoiler position.
251       @return spoiler position in radians */
252   inline double GetDspPos(void) { return DspPos; }
253
254   /** Gets the throttle position.
255       @param engine engine ID number
256       @return throttle position for the given engine in percent ( 0 - 100)*/
257   double GetThrottlePos(int engine);
258
259   /** Gets the mixture position.
260       @param engine engine ID number
261       @return mixture position for the given engine in percent ( 0 - 100)*/
262   inline double GetMixturePos(int engine) { return MixturePos[engine]; }
263   
264   /** Gets the gear position (0 up, 1 down), defaults to down
265       @return gear position (0 up, 1 down) */
266   inline double GetGearPos(void) { return GearPos; }    
267
268   /** Gets the prop pitch position.
269       @param engine engine ID number
270       @return prop pitch position for the given engine in percent ( 0.0-1.0)*/
271   inline double GetPropAdvance(int engine) { return PropAdvance[engine]; }
272   //@}
273
274   /** Retrieves the State object pointer.
275       This is used by the FGFCS-owned components.
276       @return pointer to the State object */
277   inline FGState* GetState(void) { return State; }
278
279   /** Retrieves a components output value
280       @param idx the index of the component (the component ID)
281       @return output value from the component */
282   double GetComponentOutput(eParam idx);
283
284   /** Retrieves the component name
285       @param idx the index of the component (the component ID)
286       @return name of the component */
287   string GetComponentName(int idx);
288
289   /** Retrieves all component names for inclusion in output stream */
290   string GetComponentStrings(void);
291
292   /** Retrieves all component outputs for inclusion in output stream */
293   string GetComponentValues(void);
294
295   /// @name Pilot input command setting
296   //@{
297   /** Sets the aileron command
298       @param cmd aileron command in percent*/
299   inline void SetDaCmd(double cmd) { DaCmd = cmd; }
300
301   /** Sets the elevator command
302       @param cmd elevator command in percent*/
303   inline void SetDeCmd(double cmd) { DeCmd = cmd; }
304
305   /** Sets the rudder command
306       @param cmd rudder command in percent*/
307   inline void SetDrCmd(double cmd) { DrCmd = cmd; }
308
309   /** Sets the flaps command
310       @param cmd flaps command in percent*/
311   inline void SetDfCmd(double cmd) { DfCmd = cmd; }
312
313   /** Sets the speedbrake command
314       @param cmd speedbrake command in percent*/
315   inline void SetDsbCmd(double cmd) { DsbCmd = cmd; }
316
317   /** Sets the spoilers command
318       @param cmd spoilers command in percent*/
319   inline void SetDspCmd(double cmd) { DspCmd = cmd; }
320
321   /** Sets the pitch trim command
322       @param cmd pitch trim command in percent*/
323   inline void SetPitchTrimCmd(double cmd) { PTrimCmd = cmd; }
324
325   /** Sets the rudder trim command
326       @param cmd rudder trim command in percent*/
327   inline void SetYawTrimCmd(double cmd) { YTrimCmd = cmd; }
328
329   /** Sets the aileron trim command
330       @param cmd aileron trim command in percent*/
331   inline void SetRollTrimCmd(double cmd) { RTrimCmd = cmd; }
332
333   /** Sets the throttle command for the specified engine
334       @param engine engine ID number
335       @param cmd throttle command in percent (0 - 100)*/
336   void SetThrottleCmd(int engine, double cmd);
337
338   /** Sets the mixture command for the specified engine
339       @param engine engine ID number
340       @param cmd mixture command in percent (0 - 100)*/
341   void SetMixtureCmd(int engine, double cmd);
342   
343   /** Set the gear extend/retract command, defaults to down
344       @param gear command 0 for up, 1 for down */
345    void SetGearCmd(double gearcmd) { GearCmd = gearcmd; }   
346
347   /** Sets the propeller pitch command for the specified engine
348       @param engine engine ID number
349       @param cmd mixture command in percent (0.0 - 1.0)*/
350   void SetPropAdvanceCmd(int engine, double cmd);
351   //@}
352
353   /// @name Aerosurface position setting
354   //@{
355   /** Sets the aileron position
356       @param cmd aileron position in radians*/
357   inline void SetDaPos(double cmd) { DaPos = cmd; }
358
359   /** Sets the elevator position
360       @param cmd elevator position in radians*/
361   inline void SetDePos(double cmd) { DePos = cmd; }
362
363   /** Sets the rudder position
364       @param cmd rudder position in radians*/
365   inline void SetDrPos(double cmd) { DrPos = cmd; }
366
367   /** Sets the flaps position
368       @param cmd flaps position in radians*/
369   inline void SetDfPos(double cmd) { DfPos = cmd; }
370
371   /** Sets the speedbrake position
372       @param cmd speedbrake position in radians*/
373   inline void SetDsbPos(double cmd) { DsbPos = cmd; }
374
375   /** Sets the spoiler position
376       @param cmd spoiler position in radians*/
377   inline void SetDspPos(double cmd) { DspPos = cmd; }
378
379   /** Sets the actual throttle setting for the specified engine
380       @param engine engine ID number
381       @param cmd throttle setting in percent (0 - 100)*/
382   void SetThrottlePos(int engine, double cmd);
383
384   /** Sets the actual mixture setting for the specified engine
385       @param engine engine ID number
386       @param cmd mixture setting in percent (0 - 100)*/
387   void SetMixturePos(int engine, double cmd);
388   
389   /** Set the gear extend/retract position, defaults to down
390       @param gear position 0 up, 1 down       */
391    void SetGearPos(double gearpos) { GearPos = gearpos; }   
392
393
394   /** Sets the actual prop pitch setting for the specified engine
395       @param engine engine ID number
396       @param cmd prop pitch setting in percent (0.0 - 1.0)*/
397   void SetPropAdvance(int engine, double cmd);
398   //@}
399
400   /// @name Landing Gear brakes
401   //@{
402   /** Sets the left brake group
403       @param cmd brake setting in percent (0.0 - 1.0) */
404   void SetLBrake(double cmd) {LeftBrake = cmd;}
405
406   /** Sets the right brake group
407       @param cmd brake setting in percent (0.0 - 1.0) */
408   void SetRBrake(double cmd) {RightBrake = cmd;}
409
410   /** Sets the center brake group
411       @param cmd brake setting in percent (0.0 - 1.0) */
412   void SetCBrake(double cmd) {CenterBrake = cmd;}
413
414   /** Gets the brake for a specified group.
415       @param bg which brakegroup to retrieve the command for
416       @return the brake setting for the supplied brake group argument */
417   double GetBrake(FGLGear::BrakeGroup bg);
418   //@}
419
420   /** Loads the Flight Control System.
421       The FGAircraft instance is actually responsible for reading the config file
422       and calling the various Loadxx() methods of the other systems, passing in
423       the config file instance pointer. LoadFCS() is called from FGAircraft.
424       @param AC_cfg pointer to the config file instance
425       @return true if succesful */
426   bool Load(FGConfigFile* AC_cfg);
427
428   void AddThrottle(void);
429
430 private:
431   double DaCmd, DeCmd, DrCmd, DfCmd, DsbCmd, DspCmd;
432   double DaPos, DePos, DrPos, DfPos, DsbPos, DspPos;
433   double PTrimCmd, YTrimCmd, RTrimCmd;
434   vector <double> ThrottleCmd;
435   vector <double> ThrottlePos;
436   vector <double> MixtureCmd;
437   vector <double> MixturePos;
438   vector <double> PropAdvanceCmd;
439   vector <double> PropAdvance;
440   double LeftBrake, RightBrake, CenterBrake; // Brake settings
441   double GearCmd,GearPos;
442
443   vector <FGFCSComponent*> Components;
444   void Debug(int from);
445 };
446
447 #include "FGState.h"
448
449 #endif
450