]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/filtersjb/FGGain.cpp
Update to the latest version of JSBSim
[flightgear.git] / src / FDM / JSBSim / filtersjb / FGGain.cpp
1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2
3  Module:       FGGain.cpp
4  Author:       Jon S. Berndt
5  Date started: 4/2000
6  
7  ------------- Copyright (C) 2000 -------------
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 FUNCTIONAL DESCRIPTION
27 --------------------------------------------------------------------------------
28
29 HISTORY
30 --------------------------------------------------------------------------------
31
32 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33 COMMENTS, REFERENCES,  and NOTES
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
35
36 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
37 INCLUDES
38 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
39
40 #include "FGGain.h" 
41
42 namespace JSBSim {
43
44 static const char *IdSrc = "$Id$";
45 static const char *IdHdr = ID_GAIN;
46
47 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
48 CLASS IMPLEMENTATION
49 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
50
51
52 FGGain::FGGain(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
53                                                    AC_cfg(AC_cfg)
54 {
55   string token;
56   string strScheduledBy;
57   string sOutputIdx;
58
59   State = fcs->GetState();
60
61   Gain = 1.000;
62   Rows = 0;
63   Min = Max = 0.0;
64   OutputPct = 0;
65   invert = false;
66   ScheduledBy = 0;
67
68   Type = AC_cfg->GetValue("TYPE");
69   Name = AC_cfg->GetValue("NAME");
70   AC_cfg->GetNextConfigLine();
71
72   while ((token = AC_cfg->GetValue()) != string("/COMPONENT")) {
73     *AC_cfg >> token;
74     if (token == "INPUT") {
75       token = AC_cfg->GetValue("INPUT");
76
77       if (token[0] == '-') {
78         invert = true;
79         token.erase(0,1);
80       }      
81
82       if (InputNodes.size() > 0) {
83         cerr << "Gains can only accept one input" << endl;
84       } else  {
85         *AC_cfg >> token;
86         InputNodes.push_back( resolveSymbol(token) );
87       }  
88     } else if (token == "GAIN") {
89       *AC_cfg >> Gain;
90     } else if (token == "MIN") {
91       *AC_cfg >> Min;
92     } else if (token == "MAX") {
93       *AC_cfg >> Max;
94     } else if (token == "INVERT") {
95       invert = true;
96       cerr << endl << "The INVERT keyword is being deprecated and will not be "
97                       "supported in the future. Please use a minus sign in front "
98                                   "of an input property in the future." << endl << endl;
99     } else if (token == "ROWS") {
100       *AC_cfg >> Rows;
101       Table = new FGTable(Rows);
102     } else if (token == "SCHEDULED_BY") {
103       token = AC_cfg->GetValue("SCHEDULED_BY");
104       *AC_cfg >> strScheduledBy;
105       ScheduledBy = PropertyManager->GetNode( strScheduledBy ); 
106     } else if (token == "OUTPUT") {
107       IsOutput = true;
108       *AC_cfg >> sOutputIdx;      
109       OutputNode = PropertyManager->GetNode( sOutputIdx );
110
111     } else {
112       AC_cfg->ResetLineIndexToZero();
113       *Table << *AC_cfg;
114     }
115   }
116   
117   FGFCSComponent::bind();
118   if (Type == "AEROSURFACE_SCALE")
119     treenode->Tie( "output-norm", this, &FGGain::GetOutputPct );
120
121   Debug(0);
122 }
123
124 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
125
126 FGGain::~FGGain()
127 {
128   Debug(1);
129 }
130
131 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
132
133 bool FGGain::Run(void )
134 {
135   double SchedGain = 1.0;
136   double LookupVal = 0;
137
138   FGFCSComponent::Run(); // call the base class for initialization of Input
139   Input = InputNodes[0]->getDoubleValue();
140
141   if (invert) Input = -Input;
142
143   if (Type == "PURE_GAIN") {                       // PURE_GAIN
144
145     Output = Gain * Input;
146
147   } else if (Type == "SCHEDULED_GAIN") {           // SCHEDULED_GAIN
148
149     LookupVal = ScheduledBy->getDoubleValue();
150     SchedGain = Table->GetValue(LookupVal);
151     Output = Gain * SchedGain * Input;
152
153   } else if (Type == "AEROSURFACE_SCALE") {        // AEROSURFACE_SCALE
154
155     OutputPct = Input;
156     if (Input >= 0.0) Output = Input * Max;
157     else Output = Input * -Min;
158     Output *= Gain;
159
160   }
161
162   if (IsOutput) SetOutput();
163
164   return true;
165 }
166
167 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
168 //    The bitmasked value choices are as follows:
169 //    unset: In this case (the default) JSBSim would only print
170 //       out the normally expected messages, essentially echoing
171 //       the config files as they are read. If the environment
172 //       variable is not set, debug_lvl is set to 1 internally
173 //    0: This requests JSBSim not to output any messages
174 //       whatsoever.
175 //    1: This value explicity requests the normal JSBSim
176 //       startup messages
177 //    2: This value asks for a message to be printed out when
178 //       a class is instantiated
179 //    4: When this value is set, a message is displayed when a
180 //       FGModel object executes its Run() method
181 //    8: When this value is set, various runtime state variables
182 //       are printed out periodically
183 //    16: When set various parameters are sanity checked and
184 //       a message is printed out when they go out of bounds
185
186 void FGGain::Debug(int from)
187 {
188   if (debug_lvl <= 0) return;
189
190   if (debug_lvl & 1) { // Standard console startup message output
191     if (from == 0) { // Constructor
192       if (invert)
193         cout << "      INPUT: -" << InputNodes[0]->getName() << endl;
194       else
195         cout << "      INPUT: " << InputNodes[0]->getName() << endl;
196
197       cout << "      GAIN: " << Gain << endl;
198       if (IsOutput) cout << "      OUTPUT: " << OutputNode->getName() << endl;
199       cout << "      MIN: " << Min << endl;
200       cout << "      MAX: " << Max << endl;
201       if(invert) cout << "      Invert mapping" << endl;
202       if (ScheduledBy != 0) {
203         cout << "      Scheduled by parameter: " << ScheduledBy->getName() << endl;
204         Table->Print();
205       }
206     }
207   }
208   if (debug_lvl & 2 ) { // Instantiation/Destruction notification
209     if (from == 0) cout << "Instantiated: FGGain" << endl;
210     if (from == 1) cout << "Destroyed:    FGGain" << endl;
211   }
212   if (debug_lvl & 4 ) { // Run() method entry print for FGModel-derived objects
213   }
214   if (debug_lvl & 8 ) { // Runtime state variables
215   }
216   if (debug_lvl & 16) { // Sanity checking
217   }
218   if (debug_lvl & 64) {
219     if (from == 0) { // Constructor
220       cout << IdSrc << endl;
221       cout << IdHdr << endl;
222     }
223   }
224 }
225 }