]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/FGOutput.cpp
Check return value of FDM::init().
[flightgear.git] / src / FDM / JSBSim / FGOutput.cpp
1 /*******************************************************************************
2
3  Module:       FGOutput.cpp
4  Author:       Jon Berndt
5  Date started: 12/02/98
6  Purpose:      Manage output of sim parameters to file or stdout
7  Called by:    FGSimExec
8
9  ------------- Copyright (C) 1999  Jon S. Berndt (jsb@hal-pc.org) -------------
10
11  This program is free software; you can redistribute it and/or modify it under
12  the terms of the GNU General Public License as published by the Free Software
13  Foundation; either version 2 of the License, or (at your option) any later
14  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 General Public License for more
19  details.
20
21  You should have received a copy of the GNU General Public License along with
22  this program; if not, write to the Free Software Foundation, Inc., 59 Temple
23  Place - Suite 330, Boston, MA  02111-1307, USA.
24
25  Further information about the GNU General Public License can also be found on
26  the world wide web at http://www.gnu.org.
27
28 FUNCTIONAL DESCRIPTION
29 --------------------------------------------------------------------------------
30 This is the place where you create output routines to dump data for perusal
31 later. 
32
33 HISTORY
34 --------------------------------------------------------------------------------
35 12/02/98   JSB   Created
36
37 ********************************************************************************
38 INCLUDES
39 *******************************************************************************/
40
41 #include "FGOutput.h"
42 #include "FGState.h"
43 #include "FGFDMExec.h"
44 #include "FGAtmosphere.h"
45 #include "FGFCS.h"
46 #include "FGAircraft.h"
47 #include "FGTranslation.h"
48 #include "FGRotation.h"
49 #include "FGPosition.h"
50 #include "FGAuxiliary.h"
51
52 static const char *IdSrc = "$Header$";
53 static const char *IdHdr = ID_OUTPUT;
54
55 /*******************************************************************************
56 ************************************ CODE **************************************
57 *******************************************************************************/
58
59 FGOutput::FGOutput(FGFDMExec* fdmex) : FGModel(fdmex)
60 {
61   Name = "FGOutput";
62   sFirstPass = dFirstPass = true;
63   socket = 0;
64   Type = otNone;
65   Filename = "JSBSim.out";
66   SubSystems = 0;
67   enabled = true;
68   
69 #ifdef FG_WITH_JSBSIM_SOCKET
70   socket = new FGfdmSocket("localhost",1138);
71 #endif
72 }
73
74 /******************************************************************************/
75
76 FGOutput::~FGOutput(void)
77 {
78   if (socket) delete socket;
79 }
80
81 /******************************************************************************/
82
83 bool FGOutput::Run(void)
84 {
85   if (enabled) {
86     if (!FGModel::Run()) {
87
88       if (Type == otSocket) {
89         SocketOutput();
90       } else if (Type == otCSV) {
91         if (Filename != "COUT" && Filename != "cout" && Filename.size() > 0) {
92           DelimitedOutput(Filename);
93         } else {
94           DelimitedOutput();
95         }
96       } else if (Type == otTerminal) {
97         // Not done yet
98       } else if (Type == otNone) {
99         // Do nothing
100       } else {
101         // Not a valid type of output
102       }
103
104     } else {
105     }
106   }
107   return false;
108 }
109
110 /******************************************************************************/
111
112 void FGOutput::SetType(string type)
113 {
114   if (type == "CSV") {
115     Type = otCSV;
116   } else if (type == "TABULAR") {
117     Type = otTab;
118   } else if (type == "SOCKET") {
119     Type = otSocket;
120   } else if (type == "TERMINAL") {
121     Type = otTerminal;
122   } else if (type != "NONE"){
123     Type = otUnknown;
124     cerr << "Unknown type of output specified in config file" << endl;
125   }
126 }
127
128 /******************************************************************************/
129
130 void FGOutput::DelimitedOutput(void)
131 {
132   if (dFirstPass) {
133     cout << "Time";
134     if (SubSystems & FGAircraft::ssSimulation) {
135       // Nothing here, yet
136     }
137     if (SubSystems & FGAircraft::ssAerosurfaces) {
138       cout << ", ";
139       cout << "Throttle, ";
140       cout << "Aileron Cmd, ";
141       cout << "Elevator Cmd, ";
142       cout << "Rudder Cmd, ";
143       cout << "Aileron Pos, ";
144       cout << "Elevator Pos, ";
145       cout << "Rudder Pos";
146     }
147     if (SubSystems & FGAircraft::ssRates) {
148       cout << ", ";
149       cout << "P, Q, R";
150     }
151     if (SubSystems & FGAircraft::ssVelocities) {
152       cout << ", ";
153       cout << "QBar, ";
154       cout << "Vtotal, ";
155       cout << "U, V, W, ";
156       cout << "Vn, Ve, Vd";
157     }
158     if (SubSystems & FGAircraft::ssForces) {
159       cout << ", ";
160       cout << "XsForce, YsForce, ZsForce, ";
161       cout << "Xforce, Yforce, Zforce";
162     }
163     if (SubSystems & FGAircraft::ssMoments) {
164       cout << ", ";
165       cout << "L, M, N";
166     }
167     if (SubSystems & FGAircraft::ssAtmosphere) {
168       cout << ", ";
169       cout << "Rho";
170     }
171     if (SubSystems & FGAircraft::ssMassProps) {
172       cout << ", ";
173       cout << "Ixx, ";
174       cout << "Iyy, ";
175       cout << "Izz, ";
176       cout << "Ixz, ";
177       cout << "Mass, ";
178       cout << "Xcg, Ycg, Zcg";
179     }
180     if (SubSystems & FGAircraft::ssPosition) {
181       cout << ", ";
182       cout << "Altitude, ";
183       cout << "Phi, Tht, Psi, ";
184       cout << "Alpha, ";
185       cout << "Latitude, ";
186       cout << "Longitude, ";
187       cout << "Distance AGL, ";
188       cout << "Runway Radius";
189     }
190     if (SubSystems & FGAircraft::ssCoefficients) {
191       cout << ", ";
192       cout << Aircraft->GetCoefficientStrings();
193     }
194     if (SubSystems & FGAircraft::ssGroundReactions) {
195       cout << ", ";
196       cout << Aircraft->GetGroundReactionStrings();
197     }
198
199     cout << endl;
200     dFirstPass = false;
201   }
202
203   cout << State->Getsim_time();
204   if (SubSystems & FGAircraft::ssSimulation) {
205   }
206   if (SubSystems & FGAircraft::ssAerosurfaces) {
207     cout << ", ";
208     cout << FCS->GetThrottlePos(0) << ", ";
209     cout << FCS->GetDaCmd() << ", ";
210     cout << FCS->GetDeCmd() << ", ";
211     cout << FCS->GetDrCmd() << ", ";
212     cout << FCS->GetDaPos() << ", ";
213     cout << FCS->GetDePos() << ", ";
214     cout << FCS->GetDrPos();
215   }
216   if (SubSystems & FGAircraft::ssRates) {
217     cout << ", ";
218     cout << Rotation->GetPQR();
219   }
220   if (SubSystems & FGAircraft::ssVelocities) {
221     cout << ", ";
222     cout << Translation->Getqbar() << ", ";
223     cout << Translation->GetVt() << ", ";
224     cout << Translation->GetUVW() << ", ";
225     cout << Position->GetVel();
226   }
227   if (SubSystems & FGAircraft::ssForces) {
228     cout << ", ";
229     cout << Aircraft->GetvFs() << ", ";
230     cout << Aircraft->GetForces();
231   }
232   if (SubSystems & FGAircraft::ssMoments) {
233     cout << ", ";
234     cout << Aircraft->GetMoments();
235   }
236   if (SubSystems & FGAircraft::ssAtmosphere) {
237     cout << ", ";
238     cout << Atmosphere->GetDensity();
239   }
240   if (SubSystems & FGAircraft::ssMassProps) {
241     cout << ", ";
242     cout << Aircraft->GetIxx() << ", ";
243     cout << Aircraft->GetIyy() << ", ";
244     cout << Aircraft->GetIzz() << ", ";
245     cout << Aircraft->GetIxz() << ", ";
246     cout << Aircraft->GetMass() << ", ";
247     cout << Aircraft->GetXYZcg();
248   }
249   if (SubSystems & FGAircraft::ssPosition) {
250     cout << ", ";
251     cout << Position->Geth() << ", ";
252     cout << Rotation->GetEuler() << ", ";
253     cout << Translation->Getalpha() << ", ";
254     cout << Position->GetLatitude() << ", ";
255     cout << Position->GetLongitude() << ", ";
256     cout << Position->GetDistanceAGL() << ", ";
257     cout << Position->GetRunwayRadius();
258   }
259   if (SubSystems & FGAircraft::ssCoefficients) {
260     cout << ", ";
261     cout << Aircraft->GetCoefficientValues();
262   }
263   if (SubSystems & FGAircraft::ssGroundReactions) {
264     cout << ", ";
265     cout << Aircraft->GetGroundReactionValues();
266   }
267   cout << endl;
268 }
269
270 /******************************************************************************/
271
272 void FGOutput::DelimitedOutput(string fname)
273 {
274   if (sFirstPass) {
275     datafile.open(fname.c_str());
276     datafile << "Time";
277     if (SubSystems & FGAircraft::ssSimulation) {
278       // Nothing here, yet
279     }
280     if (SubSystems & FGAircraft::ssAerosurfaces) {
281       datafile << ", ";
282       datafile << "Throttle, ";
283       datafile << "Aileron Cmd, ";
284       datafile << "Elevator Cmd, ";
285       datafile << "Rudder Cmd, ";
286       datafile << "Aileron Pos, ";
287       datafile << "Elevator Pos, ";
288       datafile << "Rudder Pos";
289     }
290     if (SubSystems & FGAircraft::ssRates) {
291       datafile << ", ";
292       datafile << "P, Q, R";
293     }
294     if (SubSystems & FGAircraft::ssVelocities) {
295       datafile << ", ";
296       datafile << "QBar, ";
297       datafile << "Vtotal, ";
298       datafile << "U, V, W, ";
299       datafile << "Vn, Ve, Vd";
300     }
301     if (SubSystems & FGAircraft::ssForces) {
302       datafile << ", ";
303       datafile << "XsForce, YsForce, ZsForce, ";
304       datafile << "Xforce, Yforce, Zforce";
305     }
306     if (SubSystems & FGAircraft::ssMoments) {
307       datafile << ", ";
308       datafile << "L, M, N";
309     }
310     if (SubSystems & FGAircraft::ssAtmosphere) {
311       datafile << ", ";
312       datafile << "Rho";
313     }
314     if (SubSystems & FGAircraft::ssMassProps) {
315       datafile << ", ";
316       datafile << "Ixx, ";
317       datafile << "Iyy, ";
318       datafile << "Izz, ";
319       datafile << "Ixz, ";
320       datafile << "Mass, ";
321       datafile << "Xcg, Ycg, Zcg";
322     }
323     if (SubSystems & FGAircraft::ssPosition) {
324       datafile << ", ";
325       datafile << "Altitude, ";
326       datafile << "Phi, Tht, Psi, ";
327       datafile << "Alpha, ";
328       datafile << "Latitude, ";
329       datafile << "Longitude, ";
330       datafile << "Distance AGL, ";
331       datafile << "Runway Radius";
332     }
333     if (SubSystems & FGAircraft::ssCoefficients) {
334       datafile << ", ";
335       datafile << Aircraft->GetCoefficientStrings();
336     }
337     if (SubSystems & FGAircraft::ssGroundReactions) {
338       datafile << ", ";
339       datafile << Aircraft->GetGroundReactionStrings();
340     }
341     datafile << endl;
342     sFirstPass = false;
343   }
344
345   datafile << State->Getsim_time();
346   if (SubSystems & FGAircraft::ssSimulation) {
347   }
348   if (SubSystems & FGAircraft::ssAerosurfaces) {
349     datafile << ", ";
350     datafile << FCS->GetThrottlePos(0) << ", ";
351     datafile << FCS->GetDaCmd() << ", ";
352     datafile << FCS->GetDeCmd() << ", ";
353     datafile << FCS->GetDrCmd() << ", ";
354     datafile << FCS->GetDaPos() << ", ";
355     datafile << FCS->GetDePos() << ", ";
356     datafile << FCS->GetDrPos();
357   }
358   if (SubSystems & FGAircraft::ssRates) {
359     datafile << ", ";
360     datafile << Rotation->GetPQR();
361   }
362   if (SubSystems & FGAircraft::ssVelocities) {
363     datafile << ", ";
364     datafile << Translation->Getqbar() << ", ";
365     datafile << Translation->GetVt() << ", ";
366     datafile << Translation->GetUVW() << ", ";
367     datafile << Position->GetVel();
368   }
369   if (SubSystems & FGAircraft::ssForces) {
370     datafile << ", ";
371     datafile << Aircraft->GetvFs() << ", ";
372     datafile << Aircraft->GetForces();
373   }
374   if (SubSystems & FGAircraft::ssMoments) {
375     datafile << ", ";
376     datafile << Aircraft->GetMoments();
377   }
378   if (SubSystems & FGAircraft::ssAtmosphere) {
379     datafile << ", ";
380     datafile << Atmosphere->GetDensity();
381   }
382   if (SubSystems & FGAircraft::ssMassProps) {
383     datafile << ", ";
384     datafile << Aircraft->GetIxx() << ", ";
385     datafile << Aircraft->GetIyy() << ", ";
386     datafile << Aircraft->GetIzz() << ", ";
387     datafile << Aircraft->GetIxz() << ", ";
388     datafile << Aircraft->GetMass() << ", ";
389     datafile << Aircraft->GetXYZcg();
390   }
391   if (SubSystems & FGAircraft::ssPosition) {
392     datafile << ", ";
393     datafile << Position->Geth() << ", ";
394     datafile << Rotation->GetEuler() << ", ";
395     datafile << Translation->Getalpha() << ", ";
396     datafile << Position->GetLatitude() << ", ";
397     datafile << Position->GetLongitude() << ", ";
398     datafile << Position->GetDistanceAGL() << ", ";
399     datafile << Position->GetRunwayRadius();
400   }
401   if (SubSystems & FGAircraft::ssCoefficients) {
402     datafile << ", ";
403     datafile << Aircraft->GetCoefficientValues();
404   }
405   if (SubSystems & FGAircraft::ssGroundReactions) {
406     datafile << ", ";
407     datafile << Aircraft->GetGroundReactionValues();
408   }
409   datafile << endl;
410   datafile.flush();
411 }
412
413 /******************************************************************************/
414
415 void FGOutput::SocketOutput(void)
416 {
417   string asciiData;
418   /*
419   if (socket == NULL) return;
420
421   socket->Clear();
422   if (sFirstPass) {
423     socket->Append("<LABELS>");
424     socket->Append("Time");
425     socket->Append("Altitude");
426     socket->Append("Phi");
427     socket->Append("Tht");
428     socket->Append("Psi");
429     socket->Append("Rho");
430     socket->Append("Vtotal");
431     socket->Append("U");
432     socket->Append("V");
433     socket->Append("W");
434     socket->Append("Vn");
435     socket->Append("Ve");
436     socket->Append("Vd");
437     socket->Append("Udot");
438     socket->Append("Vdot");
439     socket->Append("Wdot");
440     socket->Append("P");
441     socket->Append("Q");
442     socket->Append("R");
443     socket->Append("PDot");
444     socket->Append("QDot");
445     socket->Append("RDot");
446     socket->Append("Fx");
447     socket->Append("Fy");
448     socket->Append("Fz");
449     socket->Append("Latitude");
450     socket->Append("Longitude");
451     socket->Append("QBar");
452     socket->Append("Alpha");
453     socket->Append("L");
454     socket->Append("M");
455     socket->Append("N");
456     socket->Append("Throttle");
457     socket->Append("Aileron");
458     socket->Append("Elevator");
459     socket->Append("Rudder");
460     sFirstPass = false;
461     socket->Send();
462   }
463
464   socket->Clear();
465   socket->Append(State->Getsim_time());
466   socket->Append(Position->Geth());
467   socket->Append(Rotation->Getphi());
468   socket->Append(Rotation->Gettht());
469   socket->Append(Rotation->Getpsi());
470   socket->Append(Atmosphere->GetDensity());
471   socket->Append(Translation->GetVt());
472   socket->Append(Translation->GetU());
473   socket->Append(Translation->GetV());
474   socket->Append(Translation->GetW());
475   socket->Append(Position->GetVn());
476   socket->Append(Position->GetVe());
477   socket->Append(Position->GetVd());
478   socket->Append(Translation->GetUdot());
479   socket->Append(Translation->GetVdot());
480   socket->Append(Translation->GetWdot());
481   socket->Append(Rotation->GetP());
482   socket->Append(Rotation->GetQ());
483   socket->Append(Rotation->GetR());
484   socket->Append(Rotation->GetPdot());
485   socket->Append(Rotation->GetQdot());
486   socket->Append(Rotation->GetRdot());
487   socket->Append(Aircraft->GetFx());
488   socket->Append(Aircraft->GetFy());
489   socket->Append(Aircraft->GetFz());
490   socket->Append(Position->GetLatitude());
491   socket->Append(Position->GetLongitude());
492   socket->Append(Translation->Getqbar());
493   socket->Append(Translation->Getalpha());
494   socket->Append(Aircraft->GetL());
495   socket->Append(Aircraft->GetM());
496   socket->Append(Aircraft->GetN());
497   socket->Append(FCS->GetThrottle(0));
498   socket->Append(FCS->GetDa());
499   socket->Append(FCS->GetDe());
500   socket->Append(FCS->GetDr());
501   socket->Send(); */
502 }
503
504 /******************************************************************************/
505
506 void FGOutput::SocketStatusOutput(string out_str)
507 {
508   string asciiData;
509
510   if (socket == NULL) return;
511
512   socket->Clear();
513   asciiData = string("<STATUS>") + out_str;
514   socket->Append(asciiData.c_str());
515   socket->Send();
516 }
517
518 /******************************************************************************/
519