]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/filtersjb/FGSwitch.h
Update to the latest version of JSBSim
[flightgear.git] / src / FDM / JSBSim / filtersjb / FGSwitch.h
1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2
3  Header:       FGSwitch.h
4  Author:       Jon S. Berndt
5  Date started: 12/23/2002
6
7  ------------- Copyright (C)  -------------
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
29 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
30 SENTRY
31 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
32
33 #ifndef FGSWITCH_H
34 #define FGSWITCH_H
35
36 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
37 INCLUDES
38 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
39
40 #include "FGFCSComponent.h"
41 #include "../FGConfigFile.h"
42 #include "FGCondition.h"
43
44 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
45 DEFINITIONS
46 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
47
48 #define ID_SWITCH "$Id$"
49
50 namespace JSBSim {
51
52 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
53 COMMENTS, REFERENCES, and NOTES [use "class documentation" below for API docs]
54 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
55
56 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
57 CLASS DOCUMENTATION
58 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
59
60 /** Encapsulates a switch for the flight control system.
61
62 The SWITCH component models a switch - either on/off or a multi-choice rotary
63 switch. The switch can represent a physical cockpit switch, or can represent a
64 logical switch, where several conditions might need to be satisfied before a
65 particular state is reached. The VALUE of the switch - the output value - is
66 chosen depending on the state of the switch. Each switch is comprised of two or
67 more TESTs. Each TEST has a VALUE associated with it. The first TEST that
68 evaluates to TRUE will set the output value of the switch according to the VALUE
69 parameter belonging to that TEST. Each TEST contains one or more CONDITIONS, which
70 each must be logically related (if there are more than one) given the value of
71 the LOGIC parameter, and which takes the form:
72
73   property conditional property|value
74
75 e.g.
76
77   qbar GE 21.0
78
79 or,
80
81   roll_rate < pitch_rate
82
83 Within a TEST, a CONDITION_GROUP can be specified. A CONDITION_GROUP allows for
84 complex groupings of logical comparisons. Each CONDITION_GROUP contains
85 additional conditions, as well as possibly additional CONDITION_GROUPs.
86
87 <pre>
88 \<COMPONENT NAME="switch1" TYPE="SWITCH"\><BR>
89   \<TEST LOGIC="{AND|OR|DEFAULT}" OUTPUT="{property|value}"\><BR>
90     {property} {conditional} {property|value}<BR>
91     \<CONDITION_GROUP LOGIC="{AND|OR}"\><BR>
92       {property} {conditional} {property|value}<BR>
93       ...<BR>
94     \</CONDITION_GROUP\><BR>
95     ...<BR>
96   \</TEST><BR>
97   \<TEST LOGIC="{AND|OR}" OUTPUT="{property|value}"\><BR>
98     {property} {conditional} {property|value}<BR>
99     ...<BR>
100   \</TEST\><BR>
101   ...<BR>
102 \</COMPONENT\>
103 </pre>
104 */
105    
106 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
107 CLASS DECLARATION
108 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
109
110 class FGSwitch  : public FGFCSComponent
111 {
112 public:
113   FGSwitch(FGFCS* fcs, FGConfigFile* AC_cfg);
114   ~FGSwitch();
115
116   bool Run(void);
117
118 private:
119   FGFCS* fcs;
120   FGConfigFile* AC_cfg;
121
122   enum eLogic {elUndef=0, eAND, eOR, eDefault};
123   enum eComparison {ecUndef=0, eEQ, eNE, eGT, eGE, eLT, eLE};
124
125   struct test {
126     vector <FGCondition> conditions;
127     eLogic Logic;
128     double OutputVal;
129     FGPropertyManager *OutputProp;
130     float sign;
131     
132     double GetValue(void) {
133       if (OutputProp == 0L) return OutputVal;
134       else                  return OutputProp->getDoubleValue()*sign;
135     }
136
137     test(void) { // constructor for the test structure
138       Logic      = elUndef;
139       OutputVal  = 0.0;
140       OutputProp = 0L;
141       sign       = 1.0;
142     }
143
144   };
145
146   vector <test> tests;
147   
148   void Debug(int from);
149 };
150 }
151 #endif