]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/filtersjb/FGGain.cpp
Latest JSBSim changes.
[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 static const char *IdSrc = "$Id$";
43 static const char *IdHdr = ID_GAIN;
44
45 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
46 CLASS IMPLEMENTATION
47 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
48
49
50 FGGain::FGGain(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
51                                                    AC_cfg(AC_cfg)
52 {
53   string token;
54   string strScheduledBy;
55
56   State = fcs->GetState();
57
58   Gain = 1.000;
59   Rows = 0;
60   Min = Max = 0.0;
61   ScheduledBy = FG_UNDEF;
62
63   Type = AC_cfg->GetValue("TYPE");
64   Name = AC_cfg->GetValue("NAME");
65   AC_cfg->GetNextConfigLine();
66
67   while ((token = AC_cfg->GetValue()) != string("/COMPONENT")) {
68     *AC_cfg >> token;
69     if (token == "ID") {
70       *AC_cfg >> ID;
71     } else if (token == "INPUT") {
72       token = AC_cfg->GetValue("INPUT");
73       if (token.find("FG_") != token.npos) {
74         *AC_cfg >> token;
75         InputIdx = State->GetParameterIndex(token);
76         InputType = itPilotAC;
77       } else {
78         *AC_cfg >> InputIdx;
79         InputType = itFCS;
80       }
81     } else if (token == "GAIN") {
82       *AC_cfg >> Gain;
83     } else if (token == "MIN") {
84       *AC_cfg >> Min;
85     } else if (token == "MAX") {
86       *AC_cfg >> Max;
87     } else if (token == "ROWS") {
88       *AC_cfg >> Rows;
89       Table = new FGTable(Rows);
90     } else if (token == "SCHEDULED_BY") {
91       token = AC_cfg->GetValue("SCHEDULED_BY");
92       if (token.find("FG_") != token.npos) {
93         *AC_cfg >> strScheduledBy;
94         ScheduledBy = State->GetParameterIndex(strScheduledBy);
95       } else {
96         *AC_cfg >> ScheduledBy;
97       }
98     } else if (token == "OUTPUT") {
99       IsOutput = true;
100       *AC_cfg >> sOutputIdx;
101       OutputIdx = State->GetParameterIndex(sOutputIdx);
102     } else {
103       AC_cfg->ResetLineIndexToZero();
104       *Table << *AC_cfg;
105     }
106   }
107   Debug(0);
108 }
109
110 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
111
112 FGGain::~FGGain()
113 {
114   Debug(1);
115 }
116
117 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
118
119 bool FGGain::Run(void )
120 {
121   double SchedGain = 1.0;
122   double LookupVal = 0;
123
124   FGFCSComponent::Run(); // call the base class for initialization of Input
125
126   if (Type == "PURE_GAIN") {
127     Output = Gain * Input;
128   } else if (Type == "SCHEDULED_GAIN") {
129     LookupVal = State->GetParameter(ScheduledBy);
130           SchedGain = Table->GetValue(LookupVal);
131     Output = Gain * SchedGain * Input;
132   } else if (Type == "AEROSURFACE_SCALE") {
133     if (Output >= 0.0) Output = Input * Max;
134     else Output = Input * (-Min);
135     Output *= Gain;
136   }
137
138   if (IsOutput) SetOutput();
139
140   return true;
141 }
142
143 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
144 //    The bitmasked value choices are as follows:
145 //    unset: In this case (the default) JSBSim would only print
146 //       out the normally expected messages, essentially echoing
147 //       the config files as they are read. If the environment
148 //       variable is not set, debug_lvl is set to 1 internally
149 //    0: This requests JSBSim not to output any messages
150 //       whatsoever.
151 //    1: This value explicity requests the normal JSBSim
152 //       startup messages
153 //    2: This value asks for a message to be printed out when
154 //       a class is instantiated
155 //    4: When this value is set, a message is displayed when a
156 //       FGModel object executes its Run() method
157 //    8: When this value is set, various runtime state variables
158 //       are printed out periodically
159 //    16: When set various parameters are sanity checked and
160 //       a message is printed out when they go out of bounds
161
162 void FGGain::Debug(int from)
163 {
164   if (debug_lvl <= 0) return;
165
166   if (debug_lvl & 1) { // Standard console startup message output
167     if (from == 0) { // Constructor
168       cout << "      ID: " << ID << endl;
169       switch(InputType) {
170       case itPilotAC:
171         cout << "      INPUT: " << State->GetParameterName(InputIdx) << endl;
172         break;
173       case itFCS:
174         cout << "      INPUT: FCS Component " << InputIdx << " (" << 
175                                         fcs->GetComponentName(InputIdx) << ")" << endl;
176         break;
177       }
178       cout << "      GAIN: " << Gain << endl;
179       if (IsOutput) cout << "      OUTPUT: " << sOutputIdx << endl;
180       cout << "      MIN: " << Min << endl;
181       cout << "      MAX: " << Max << endl;
182       if (ScheduledBy != FG_UNDEF) {
183         cout << "      Scheduled by parameter: " << ScheduledBy << endl;
184         Table->Print();
185       }
186     }
187   }
188   if (debug_lvl & 2 ) { // Instantiation/Destruction notification
189     if (from == 0) cout << "Instantiated: FGGain" << endl;
190     if (from == 1) cout << "Destroyed:    FGGain" << endl;
191   }
192   if (debug_lvl & 4 ) { // Run() method entry print for FGModel-derived objects
193   }
194   if (debug_lvl & 8 ) { // Runtime state variables
195   }
196   if (debug_lvl & 16) { // Sanity checking
197   }
198   if (debug_lvl & 64) {
199     if (from == 0) { // Constructor
200       cout << IdSrc << endl;
201       cout << IdHdr << endl;
202     }
203   }
204 }
205