]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/filtersjb/FGDeadBand.cpp
Fix stall widths for the "auxilliary" (reverse flow) stalls so they
[flightgear.git] / src / FDM / JSBSim / filtersjb / FGDeadBand.cpp
1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2
3  Module:       FGDeadBand.cpp
4  Author:       Jon S. Berndt
5  Date started: 11/1999
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 "FGDeadBand.h"
41
42 namespace JSBSim {
43
44 static const char *IdSrc = "$Id$";
45 static const char *IdHdr = ID_DEADBAND;
46
47 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
48 CLASS IMPLEMENTATION
49 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
50
51 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
52
53 FGDeadBand::FGDeadBand(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
54                                                            AC_cfg(AC_cfg)
55 {
56   Type = AC_cfg->GetValue("TYPE");
57   Name = AC_cfg->GetValue("NAME");
58   AC_cfg->GetNextConfigLine();
59   string token;
60
61   clipmax = clipmin = 0.0;
62   clip = false;
63   gain = 1.0;
64   width = 0.0;
65
66   while ((token = AC_cfg->GetValue()) != string("/COMPONENT")) {
67     *AC_cfg >> token;
68     if (token == "INPUT") {
69       if (InputNodes.size() > 0) {
70         cerr << "Deadband can only accept one input" << endl;
71       } else  {
72         *AC_cfg >> token;
73         InputNodes.push_back(resolveSymbol(token));
74       }  
75     } else if (token == "WIDTH") {
76       *AC_cfg >> width;
77     } else if (token == "CLIPTO") {
78       *AC_cfg >> clipmin >> clipmax;
79       if (clipmax > clipmin) clip = true;
80     } else if (token == "GAIN") {
81       *AC_cfg >> gain;
82     } else if (token == "OUTPUT") {
83       *AC_cfg >> token;
84       OutputNode = PropertyManager->GetNode(token);
85     }
86   }
87   FGFCSComponent::bind();
88   Debug(0);
89 }
90
91 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
92
93 FGDeadBand::~FGDeadBand()
94 {
95   Debug(1);
96 }
97
98 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
99
100 bool FGDeadBand::Run(void )
101 {
102   FGFCSComponent::Run(); // call the base class for initialization of Input
103
104   Input = InputNodes[0]->getDoubleValue();
105
106   if (Input < -width/2.0) {
107     Output = (Input + width/2.0)*gain;
108   } else if (Input > width/2.0) {
109     Output = (Input - width/2.0)*gain;
110   } else {
111     Output = 0.0;
112   }
113
114   if (clip) {
115     if (Output > clipmax)      Output = clipmax;
116     else if (Output < clipmin) Output = clipmin;
117   }
118
119   if (IsOutput) SetOutput();
120
121   return true;
122 }
123
124 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
125
126 void FGDeadBand::convert(void)
127 {
128   cout << endl;
129   cout << "        <component name=\"" << Name << "\" type=\"" << Type << "\">" << endl;
130
131   cout << "            <input>" << (InputNodes[0]->GetFullyQualifiedName()).substr(12) << "</input>" << endl;
132
133   if (gain != 1.0)
134     cout << "            <gain>" << gain << "</gain>" << endl;
135
136   cout << "                <width>" << width << "</width>" << endl;
137
138   if (clip) {
139     cout << "            <clip>" << endl;
140     cout << "                <min>" << clipmin << "</min>" << endl;
141     cout << "                <max>" << clipmax << "</max>" << endl;
142     cout << "            </clip>" << endl;
143   }
144
145   if (IsOutput)
146     cout << "            <output>" << (OutputNode->GetFullyQualifiedName()).substr(12) << "</output>" << endl;
147
148   cout << "        </component>" << endl;
149 }
150
151 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
152 //    The bitmasked value choices are as follows:
153 //    unset: In this case (the default) JSBSim would only print
154 //       out the normally expected messages, essentially echoing
155 //       the config files as they are read. If the environment
156 //       variable is not set, debug_lvl is set to 1 internally
157 //    0: This requests JSBSim not to output any messages
158 //       whatsoever.
159 //    1: This value explicity requests the normal JSBSim
160 //       startup messages
161 //    2: This value asks for a message to be printed out when
162 //       a class is instantiated
163 //    4: When this value is set, a message is displayed when a
164 //       FGModel object executes its Run() method
165 //    8: When this value is set, various runtime state variables
166 //       are printed out periodically
167 //    16: When set various parameters are sanity checked and
168 //       a message is printed out when they go out of bounds
169
170 void FGDeadBand::Debug(int from)
171 {
172   if (debug_lvl <= 0) return;
173
174   if (debug_lvl & 1) { // Standard console startup message output
175     if (from == 0) { // Constructor
176       cout << "      INPUT: " << InputNodes[0]->getName() << endl;
177       cout << "      DEADBAND WIDTH: " << width << endl;
178       cout << "      GAIN: " << gain << endl;
179       if (clip) cout << "      CLIPTO: " << clipmin 
180                                   << ", " << clipmax << endl;
181       if (IsOutput) cout << "      OUTPUT: " << OutputNode->getName() << endl;
182     }
183   }
184   if (debug_lvl & 2 ) { // Instantiation/Destruction notification
185     if (from == 0) cout << "Instantiated: FGDeadBand" << endl;
186     if (from == 1) cout << "Destroyed:    FGDeadBand" << endl;
187   }
188   if (debug_lvl & 4 ) { // Run() method entry print for FGModel-derived objects
189   }
190   if (debug_lvl & 8 ) { // Runtime state variables
191   }
192   if (debug_lvl & 16) { // Sanity checking
193   }
194   if (debug_lvl & 64) {
195     if (from == 0) { // Constructor
196       cout << IdSrc << endl;
197       cout << IdHdr << endl;
198     }
199   }
200 }
201 }