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_SUMMER;
45 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
47 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
50 FGSummer::FGSummer(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
53 string token,sOutputIdx;
58 clipmin = clipmax = 0.0;
62 Type = AC_cfg->GetValue("TYPE");
63 Name = AC_cfg->GetValue("NAME");
64 AC_cfg->GetNextConfigLine();
66 while ((token = AC_cfg->GetValue()) != string("/COMPONENT")) {
71 } else if (token == "INPUT") {
73 token = AC_cfg->GetValue("INPUT");
74 if (token.find("FG_") != token.npos) {
76 input->Node = PropertyManager->GetNode(
77 fcs->GetState()->GetPropertyName(token) );
79 input->Type = itPilotAC;
80 } else if (token.find(".") != token.npos) { // bias
86 *AC_cfg >> tmpInputIndex;
87 input->Idx=tmpInputIndex;
91 Inputs.push_back(input);
92 } else if (token == "CLIPTO") {
93 *AC_cfg >> clipmin >> clipmax;
94 if (clipmax > clipmin) {
97 } else if (token == "OUTPUT") {
99 *AC_cfg >> sOutputIdx;
100 OutputNode = PropertyManager->GetNode(
101 fcs->GetState()->GetPropertyName(sOutputIdx) );
108 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
110 FGSummer::~FGSummer()
113 for (i=0;i<Inputs.size();i++) {
119 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
121 bool FGSummer::Run(void )
125 // The Summer takes several inputs, so do not call the base class Run()
126 // FGFCSComponent::Run();
130 for (idx=0; idx<Inputs.size(); idx++) {
131 switch (Inputs[idx]->Type) {
133 Output += Inputs[idx]->Node->getDoubleValue();
136 Output += fcs->GetComponentOutput(Inputs[idx]->Idx);
145 if (Output > clipmax) Output = clipmax;
146 else if (Output < clipmin) Output = clipmin;
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 FGSummer::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;
180 cout << " INPUTS: " << endl;
181 for (unsigned i=0;i<Inputs.size();i++) {
182 switch (Inputs[i]->Type) {
184 cout << " " << Inputs[i]->Node->getName() << endl;
187 cout << " FCS Component " << Inputs[i]->Idx << " (" <<
188 fcs->GetComponentName(Inputs[i]->Idx) << ")" << endl;
191 cout << " " << "Bias of " << Bias << endl;
195 if (clip) cout << " CLIPTO: " << clipmin
196 << ", " << clipmax << endl;
197 if (IsOutput) cout << " OUTPUT: " <<OutputNode->getName() << endl;
200 if (debug_lvl & 2 ) { // Instantiation/Destruction notification
201 if (from == 0) cout << "Instantiated: FGSummer" << endl;
202 if (from == 1) cout << "Destroyed: FGSummer" << 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;