1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5 Date started: 12/23/2002
7 ------------- Copyright (C) 2002 jon@jsbsim.org -------------
9 This program is free software; you can redistribute it and/or modify it under
10 the terms of the GNU Lesser General Public License as published by the Free Software
11 Foundation; either version 2 of the License, or (at your option) any later
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 Lesser General Public License for more
19 You should have received a copy of the GNU Lesser 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.
23 Further information about the GNU Lesser General Public License can also be found on
24 the world wide web at http://www.gnu.org.
27 --------------------------------------------------------------------------------
29 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
31 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
36 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
38 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
40 #include "FGFCSComponent.h"
41 #include "input_output/FGXMLElement.h"
42 #include "math/FGCondition.h"
44 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
46 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
48 #define ID_SWITCH "$Id$"
50 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
52 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
56 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
58 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
60 /** Encapsulates a switch for the flight control system.
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 for the
66 component - is chosen depending on the state of the switch. Each switch is
67 comprised of one or more tests. Each test has a value associated with it. The
68 first test that evaluates to true will set the output value of the switch
69 according to the value parameter belonging to that test. Each test contains one
70 or more conditions, which each must be logically related (if there are more than
71 one) given the value of the logic attribute, and which takes the form:
73 property conditional property|value
81 roll_rate == pitch_rate
83 Within a test, additional tests can be specified, which allows for
84 complex groupings of logical comparisons. Each test contains
85 additional conditions, as well as possibly additional tests.
88 <switch name="switch1">
89 <default value="{property|value}"/>
90 <test logic="{AND|OR}" value="{property|value}">
91 {property} {conditional} {property|value}
92 <test logic="{AND|OR}">
93 {property} {conditional} {property|value}
98 <test logic="{AND|OR}" value="{property|value}">
99 {property} {conditional} {property|value}
103 [<output> {property} </output>]
110 <switch name="roll a/p autoswitch">
111 <default value="0.0"/>
112 <test value="fcs/roll-ap-error-summer">
113 ap/attitude_hold == 1
118 Note: In the "logic" attribute, "AND" is the default logic, if none is supplied.
120 The above example specifies that the default value of the component (i.e. the
121 output property of the component, addressed by the property, ap/roll-ap-autoswitch)
122 is 0.0. If or when the attitude hold switch is selected (property
123 ap/attitude_hold takes the value 1), the value of the switch component will be
124 whatever value fcs/roll-ap-error-summer is.
126 @author Jon S. Berndt
130 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
132 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
134 class FGSwitch : public FGFCSComponent
138 @param fcs a pointer to the parent FGFCS class
139 @param element a pointer to the Element (from the config file XML tree)
140 that represents this switch component */
141 FGSwitch(FGFCS* fcs, Element* element);
146 /** Executes the switch logic.
147 @return true - always*/
150 enum eLogic {elUndef=0, eAND, eOR, eDefault};
151 enum eComparison {ecUndef=0, eEQ, eNE, eGT, eGE, eLT, eLE};
156 vector <FGCondition*> conditions;
159 FGPropertyManager *OutputProp;
162 double GetValue(void) {
163 if (OutputProp == 0L) return OutputVal;
164 else return OutputProp->getDoubleValue()*sign;
167 test(void) { // constructor for the test structure
176 vector <test*> tests;
178 void Debug(int from);