1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5 Date started: 12/23/2002
7 ------------- Copyright (C) -------------
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
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
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.
23 Further information about the GNU 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 "../FGConfigFile.h"
42 #include "FGCondition.h"
44 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
46 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
48 #define ID_SWITCH "$Id$"
52 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
53 COMMENTS, REFERENCES, and NOTES [use "class documentation" below for API docs]
54 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
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 - 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:
73 property conditional property|value
81 roll_rate < pitch_rate
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.
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>
94 \</CONDITION_GROUP\><BR>
97 \<TEST LOGIC="{AND|OR}" OUTPUT="{property|value}"\><BR>
98 {property} {conditional} {property|value}<BR>
106 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
108 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
110 class FGSwitch : public FGFCSComponent
113 FGSwitch(FGFCS* fcs, FGConfigFile* AC_cfg);
120 FGConfigFile* AC_cfg;
122 enum eLogic {elUndef=0, eAND, eOR, eDefault};
123 enum eComparison {ecUndef=0, eEQ, eNE, eGT, eGE, eLT, eLE};
126 vector <FGCondition> conditions;
129 FGPropertyManager *OutputProp;
132 double GetValue(void) {
133 if (OutputProp == 0L) return OutputVal;
134 else return OutputProp->getDoubleValue()*sign;
137 test(void) { // constructor for the test structure
148 void Debug(int from);