FlightGear next
FGInput.cpp
Go to the documentation of this file.
1/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2
3 Module: FGInput.cpp
4 Author: Jon Berndt
5 Date started: 12/02/98
6 Purpose: Manage input of sim parameters from socket
7 Called by: FGSimExec
8
9 ------------- Copyright (C) 1999 Jon S. Berndt (jon@jsbsim.org) -------------
10
11 This program is free software; you can redistribute it and/or modify it under
12 the terms of the GNU Lesser General Public License as published by the Free
13 Software Foundation; either version 2 of the License, or (at your option) any
14 later version.
15
16 This program is distributed in the hope that it will be useful, but WITHOUT
17 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
18 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
19 details.
20
21 You should have received a copy of the GNU Lesser General Public License along
22 with this program; if not, write to the Free Software Foundation, Inc., 59
23 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24
25 Further information about the GNU Lesser General Public License can also be
26 found on the world wide web at http://www.gnu.org.
27
28FUNCTIONAL DESCRIPTION
29--------------------------------------------------------------------------------
30This is the place where you create output routines to dump data for perusal
31later.
32
33HISTORY
34--------------------------------------------------------------------------------
3512/02/98 JSB Created
36
37%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
38INCLUDES
39%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
40
41#include "FGInput.h"
42#include "FGFDMExec.h"
46
47using namespace std;
48
49namespace JSBSim {
50
51/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
52CLASS IMPLEMENTATION
53%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
54
56{
57 Name = "FGInput";
58 enabled = true;
59
60 Debug(0);
61}
62
63//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
64
66{
67 vector<FGInputType*>::iterator it;
68 for (it = InputTypes.begin(); it != InputTypes.end(); ++it)
69 delete (*it);
70
71 Debug(1);
72}
73
74//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
75
77{
78 // Unlike the other FGModel classes, properties listed in the <input> section
79 // are not intended to create new properties. For that reason, FGInput
80 // cannot load its XML directives with FGModel::Load().
81 // Instead FGModelLoader::Open() and FGModel::PreLoad() must be explicitely
82 // called.
83 FGModelLoader ModelLoader(this);
84 Element* element = ModelLoader.Open(el);
85
86 if (!element) return false;
87
88 FGModel::PreLoad(element, FDMExec);
89
90 size_t idx = InputTypes.size();
91 string type = element->GetAttributeValue("type");
92 FGInputType* Input = 0;
93
94 if (debug_lvl > 0) cout << endl << " Input data set: " << idx << " " << endl;
95
96 type = to_upper(type);
97
98 if (type.empty() || type == "SOCKET") {
99 Input = new FGInputSocket(FDMExec);
100 } else if (type == "QTJSBSIM") {
101 Input = new FGUDPInputSocket(FDMExec);
102 } else if (type != string("NONE")) {
103 cerr << element->ReadFrom()
104 << "Unknown type of input specified in config file" << endl;
105 }
106
107 if (!Input) return false;
108
109 Input->SetIdx(idx);
110 Input->Load(element);
111 PostLoad(element, FDMExec);
112
113 InputTypes.push_back(Input);
114
115 Debug(2);
116 return true;
117}
118
119//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
120
122{
123 bool ret = false;
124
125 if (!FGModel::InitModel()) return false;
126
127 vector<FGInputType*>::iterator it;
128 for (it = InputTypes.begin(); it != InputTypes.end(); ++it)
129 ret &= (*it)->InitModel();
130
131 return ret;
132}
133
134//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
135
136bool FGInput::Run(bool Holding)
137{
138 if (FDMExec->GetTrimStatus()) return true;
139 if (FGModel::Run(Holding)) return true;
140 if (!enabled) return true;
141
142 vector<FGInputType*>::iterator it;
143 for (it = InputTypes.begin(); it != InputTypes.end(); ++it)
144 (*it)->Run(Holding);
145
146 return false;
147}
148
149//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
150
151bool FGInput::SetDirectivesFile(const SGPath& fname)
152{
154 Element* document = XMLFile.LoadXMLDocument(fname);
155 if (!document) {
156 stringstream s;
157 s << "Could not read directive file: " << fname;
158 throw BaseException(s.str());
159 }
160 bool result = Load(document);
161
162 if (!result)
163 cerr << endl << "Aircraft input element has problems in file " << fname << endl;
164
165 return result;
166}
167
168//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
169
170bool FGInput::Toggle(int idx)
171{
172 if (idx >= (int)0 && idx < (int)InputTypes.size())
173 return InputTypes[idx]->Toggle();
174
175 return false;
176}
177
178//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
179
180bool FGInput::SetInputName(unsigned int idx, const std::string& name)
181{
182 if (idx >= InputTypes.size()) return false;
183
184 InputTypes[idx]->SetInputName(name);
185 return true;
186}
187
188//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
189
190string FGInput::GetInputName(unsigned int idx) const
191{
192 string name;
193
194 if (idx < InputTypes.size())
195 name = InputTypes[idx]->GetInputName();
196 return name;
197}
198
199
200//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
201// The bitmasked value choices are as follows:
202// unset: In this case (the default) JSBSim would only print
203// out the normally expected messages, essentially echoing
204// the config files as they are read. If the environment
205// variable is not set, debug_lvl is set to 1 internally
206// 0: This requests JSBSim not to output any messages
207// whatsoever.
208// 1: This value explicity requests the normal JSBSim
209// startup messages
210// 2: This value asks for a message to be printed out when
211// a class is instantiated
212// 4: When this value is set, a message is displayed when a
213// FGModel object executes its Run() method
214// 8: When this value is set, various runtime state variables
215// are printed out periodically
216// 16: When set various parameters are sanity checked and
217// a message is printed out when they go out of bounds
218
219void FGInput::Debug(int from)
220{
221 string scratch="";
222
223 if (debug_lvl <= 0) return;
224
225 if (debug_lvl & 1) { // Standard console startup message output
226 if (from == 0) { // Constructor
227 }
228 if (from == 2) {
229 }
230 }
231 if (debug_lvl & 2 ) { // Instantiation/Destruction notification
232 if (from == 0) cout << "Instantiated: FGInput" << endl;
233 if (from == 1) cout << "Destroyed: FGInput" << endl;
234 }
235 if (debug_lvl & 4 ) { // Run() method entry print for FGModel-derived objects
236 }
237 if (debug_lvl & 8 ) { // Runtime state variables
238 }
239 if (debug_lvl & 16) { // Sanity checking
240 }
241 if (debug_lvl & 64) {
242 if (from == 0) { // Constructor
243 }
244 }
245}
246}
FGInput()
Default constructor.
Definition input.cxx:61
std::string ReadFrom(void) const
Return a string that contains a description of the location where the current XML element was read fr...
std::string GetAttributeValue(const std::string &key)
Retrieves an attribute.
Implements the input from a socket.
Abstract class to provide functions generic to all the input directives.
Definition FGInputType.h:74
bool Load(Element *el) override
Init the input directives from an XML file (implement the FGModel interface).
void SetIdx(unsigned int idx)
Set the idx for this input instance.
bool Toggle(int idx)
Toggles the input generation of each input instance.
Definition FGInput.cpp:170
bool Load(Element *el) override
Load the input directives and adds a new input instance to the Input Manager list.
Definition FGInput.cpp:76
~FGInput() override
Definition FGInput.cpp:65
bool InitModel(void) override
Initializes the instance.
Definition FGInput.cpp:121
std::string GetInputName(unsigned int idx) const
Get the name identifier to which the input will be directed.
Definition FGInput.cpp:190
bool Run(bool Holding) override
Runs the Input model; called by the Executive Can pass in a value indicating if the executive is dire...
Definition FGInput.cpp:136
bool SetDirectivesFile(const SGPath &fname)
Adds a new input instance to the Input Manager.
Definition FGInput.cpp:151
bool SetInputName(unsigned int idx, const std::string &name)
Overwrites the name identifier under which the input will be logged.
Definition FGInput.cpp:180
static short debug_lvl
Definition FGJSBBase.h:190
void PostLoad(Element *el, FGFDMExec *fdmex, std::string prefix="")
void PreLoad(Element *el, FGFDMExec *fdmex, std::string prefix="")
Element_ptr Open(Element *el)
bool InitModel(void) override
Definition FGModel.cpp:81
FGFDMExec * FDMExec
Definition FGModel.h:116
FGModel(FGFDMExec *)
Constructor.
Definition FGModel.cpp:57
std::string Name
Definition FGModel.h:103
virtual bool Run(bool Holding)
Runs the model; called by the Executive.
Definition FGModel.cpp:89
Implements a UDP input socket.
Element * LoadXMLDocument(const SGPath &XML_filename, bool verbose=true)
This class is solely for the purpose of determining what type of file is given on the command line.
Definition JSBSim.cpp:146
const char * name
short debug_lvl
std::string & to_upper(std::string &str)