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