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