]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/filtersjb/FGDeadBand.cpp
Initial revision.
[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 //    The bitmasked value choices are as follows:
126 //    unset: In this case (the default) JSBSim would only print
127 //       out the normally expected messages, essentially echoing
128 //       the config files as they are read. If the environment
129 //       variable is not set, debug_lvl is set to 1 internally
130 //    0: This requests JSBSim not to output any messages
131 //       whatsoever.
132 //    1: This value explicity requests the normal JSBSim
133 //       startup messages
134 //    2: This value asks for a message to be printed out when
135 //       a class is instantiated
136 //    4: When this value is set, a message is displayed when a
137 //       FGModel object executes its Run() method
138 //    8: When this value is set, various runtime state variables
139 //       are printed out periodically
140 //    16: When set various parameters are sanity checked and
141 //       a message is printed out when they go out of bounds
142
143 void FGDeadBand::Debug(int from)
144 {
145   if (debug_lvl <= 0) return;
146
147   if (debug_lvl & 1) { // Standard console startup message output
148     if (from == 0) { // Constructor
149       cout << "      INPUT: " << InputNodes[0]->getName() << endl;
150       cout << "      DEADBAND WIDTH: " << width << endl;
151       cout << "      GAIN: " << gain << endl;
152       if (clip) cout << "      CLIPTO: " << clipmin 
153                                   << ", " << clipmax << endl;
154       if (IsOutput) cout << "      OUTPUT: " << OutputNode->getName() << endl;
155     }
156   }
157   if (debug_lvl & 2 ) { // Instantiation/Destruction notification
158     if (from == 0) cout << "Instantiated: FGDeadBand" << endl;
159     if (from == 1) cout << "Destroyed:    FGDeadBand" << endl;
160   }
161   if (debug_lvl & 4 ) { // Run() method entry print for FGModel-derived objects
162   }
163   if (debug_lvl & 8 ) { // Runtime state variables
164   }
165   if (debug_lvl & 16) { // Sanity checking
166   }
167   if (debug_lvl & 64) {
168     if (from == 0) { // Constructor
169       cout << IdSrc << endl;
170       cout << IdHdr << endl;
171     }
172   }
173 }
174 }