1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7 ------------- Copyright (C) 2000 -------------
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.
26 FUNCTIONAL DESCRIPTION
27 --------------------------------------------------------------------------------
30 --------------------------------------------------------------------------------
32 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33 COMMENTS, REFERENCES, and NOTES
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
36 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
38 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
42 static const char *IdSrc = "$Id$";
43 static const char *IdHdr = ID_GAIN;
45 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
47 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
50 FGGain::FGGain(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
54 string strScheduledBy;
56 State = fcs->GetState();
63 ScheduledBy = FG_UNDEF;
65 Type = AC_cfg->GetValue("TYPE");
66 Name = AC_cfg->GetValue("NAME");
67 AC_cfg->GetNextConfigLine();
69 while ((token = AC_cfg->GetValue()) != string("/COMPONENT")) {
73 } else if (token == "INPUT") {
74 token = AC_cfg->GetValue("INPUT");
75 if (token.find("FG_") != token.npos) {
77 InputIdx = State->GetParameterIndex(token);
78 InputType = itPilotAC;
83 } else if (token == "GAIN") {
85 } else if (token == "MIN") {
87 } else if (token == "MAX") {
89 } else if (token == "INVERT") {
91 } else if (token == "ROWS") {
93 Table = new FGTable(Rows);
94 } else if (token == "SCHEDULED_BY") {
95 token = AC_cfg->GetValue("SCHEDULED_BY");
96 if (token.find("FG_") != token.npos) {
97 *AC_cfg >> strScheduledBy;
98 ScheduledBy = State->GetParameterIndex(strScheduledBy);
100 *AC_cfg >> ScheduledBy;
102 } else if (token == "OUTPUT") {
104 *AC_cfg >> sOutputIdx;
105 OutputIdx = State->GetParameterIndex(sOutputIdx);
107 AC_cfg->ResetLineIndexToZero();
114 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
121 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
123 bool FGGain::Run(void )
125 double SchedGain = 1.0;
126 double LookupVal = 0;
128 FGFCSComponent::Run(); // call the base class for initialization of Input
130 if (Type == "PURE_GAIN") {
131 Output = Gain * Input;
132 } else if (Type == "SCHEDULED_GAIN") {
133 LookupVal = State->GetParameter(ScheduledBy);
134 SchedGain = Table->GetValue(LookupVal);
135 Output = Gain * SchedGain * Input;
136 } else if (Type == "AEROSURFACE_SCALE") {
139 if (Input >= 0.0) Output = Input * Max;
140 else Output = Input * -Min;
143 if (Input <= 0.0) Output = Input * -Max;
144 else Output = Input * Min;
149 if (IsOutput) SetOutput();
154 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
155 // The bitmasked value choices are as follows:
156 // unset: In this case (the default) JSBSim would only print
157 // out the normally expected messages, essentially echoing
158 // the config files as they are read. If the environment
159 // variable is not set, debug_lvl is set to 1 internally
160 // 0: This requests JSBSim not to output any messages
162 // 1: This value explicity requests the normal JSBSim
164 // 2: This value asks for a message to be printed out when
165 // a class is instantiated
166 // 4: When this value is set, a message is displayed when a
167 // FGModel object executes its Run() method
168 // 8: When this value is set, various runtime state variables
169 // are printed out periodically
170 // 16: When set various parameters are sanity checked and
171 // a message is printed out when they go out of bounds
173 void FGGain::Debug(int from)
175 if (debug_lvl <= 0) return;
177 if (debug_lvl & 1) { // Standard console startup message output
178 if (from == 0) { // Constructor
179 cout << " ID: " << ID << endl;
182 cout << " INPUT: " << State->GetParameterName(InputIdx) << endl;
185 cout << " INPUT: FCS Component " << InputIdx << " (" <<
186 fcs->GetComponentName(InputIdx) << ")" << endl;
189 cout << " GAIN: " << Gain << endl;
190 if (IsOutput) cout << " OUTPUT: " << sOutputIdx << endl;
191 cout << " MIN: " << Min << endl;
192 cout << " MAX: " << Max << endl;
193 if(invert) cout << " Invert mapping" << endl;
194 if (ScheduledBy != FG_UNDEF) {
195 cout << " Scheduled by parameter: " << ScheduledBy << endl;
200 if (debug_lvl & 2 ) { // Instantiation/Destruction notification
201 if (from == 0) cout << "Instantiated: FGGain" << endl;
202 if (from == 1) cout << "Destroyed: FGGain" << endl;
204 if (debug_lvl & 4 ) { // Run() method entry print for FGModel-derived objects
206 if (debug_lvl & 8 ) { // Runtime state variables
208 if (debug_lvl & 16) { // Sanity checking
210 if (debug_lvl & 64) {
211 if (from == 0) { // Constructor
212 cout << IdSrc << endl;
213 cout << IdHdr << endl;