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