JSBSim Flight Dynamics Model  1.1.11 (13 Feb 2022)
An Open Source Flight Dynamics and Control Software Library in C++
FGFCSFunction.cpp
1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2 
3  Module: FGFCSFunction.cpp
4  Author: Jon S. Berndt
5  Date started: 6/2005
6 
7  ------------- Copyright (C) 2005 -------------
8 
9  This program is free software; you can redistribute it and/or modify it under
10  the terms of the GNU Lesser General Public License as published by the Free
11  Software Foundation; either version 2 of the License, or (at your option) any
12  later 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 Lesser General Public License for more
17  details.
18 
19  You should have received a copy of the GNU Lesser General Public License along
20  with this program; if not, write to the Free Software Foundation, Inc., 59
21  Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 
23  Further information about the GNU Lesser General Public License can also be
24  found on 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 "FGFCSFunction.h"
41 #include "models/FGFCS.h"
42 #include "input_output/FGXMLElement.h"
43 
44 using namespace std;
45 
46 namespace JSBSim {
47 
48 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
49 CLASS IMPLEMENTATION
50 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
51 
52 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
53 
54 FGFCSFunction::FGFCSFunction(FGFCS* fcs, Element* element)
55  : FGFCSComponent(fcs, element)
56 {
57  Element *function_element = element->FindElement("function");
58 
59  if (function_element)
60  function = new FGFunction(fcs->GetExec(), function_element);
61  else {
62  cerr << element->ReadFrom()
63  << "FCS Function should contain a \"function\" element" << endl;
64  throw("Malformed FCS function specification.");
65  }
66 
67  bind(element);
68  Debug(0);
69 }
70 
71 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
72 
73 FGFCSFunction::~FGFCSFunction()
74 {
75  delete function;
76  Debug(1);
77 }
78 
79 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
80 
81 bool FGFCSFunction::Run(void )
82 {
83  Output = function->GetValue();
84 
85  if (!InputNodes.empty()) {
86  Input = InputNodes[0]->getDoubleValue();
87  Output *= Input;
88  }
89 
90  Clip();
91  SetOutput();
92 
93  return true;
94 }
95 
96 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
97 // The bitmasked value choices are as follows:
98 // unset: In this case (the default) JSBSim would only print
99 // out the normally expected messages, essentially echoing
100 // the config files as they are read. If the environment
101 // variable is not set, debug_lvl is set to 1 internally
102 // 0: This requests JSBSim not to output any messages
103 // whatsoever.
104 // 1: This value explicity requests the normal JSBSim
105 // startup messages
106 // 2: This value asks for a message to be printed out when
107 // a class is instantiated
108 // 4: When this value is set, a message is displayed when a
109 // FGModel object executes its Run() method
110 // 8: When this value is set, various runtime state variables
111 // are printed out periodically
112 // 16: When set various parameters are sanity checked and
113 // a message is printed out when they go out of bounds
114 
115 void FGFCSFunction::Debug(int from)
116 {
117  if (debug_lvl <= 0) return;
118 
119  if (debug_lvl & 1) { // Standard console startup message output
120  if (from == 0) { // Constructor
121  if (!InputNodes.empty())
122  cout << " INPUT: " << InputNodes[0]->GetName() << endl;
123  for (auto node: OutputNodes)
124  cout << " OUTPUT: " << node->getNameString() << endl;
125  }
126  }
127  if (debug_lvl & 2 ) { // Instantiation/Destruction notification
128  if (from == 0) cout << "Instantiated: FGFCSFunction" << endl;
129  if (from == 1) cout << "Destroyed: FGFCSFunction" << endl;
130  }
131  if (debug_lvl & 4 ) { // Run() method entry print for FGModel-derived objects
132  }
133  if (debug_lvl & 8 ) { // Runtime state variables
134  }
135  if (debug_lvl & 16) { // Sanity checking
136  }
137  if (debug_lvl & 64) {
138  if (from == 0) { // Constructor
139  }
140  }
141 }
142 }