1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6 Purpose: Manage output of sim parameters to file or stdout
9 ------------- Copyright (C) 1999 Jon S. Berndt (jsb@hal-pc.org) -------------
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
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
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.
25 Further information about the GNU General Public License can also be found on
26 the world wide web at http://www.gnu.org.
28 FUNCTIONAL DESCRIPTION
29 --------------------------------------------------------------------------------
30 This is the place where you create output routines to dump data for perusal
34 --------------------------------------------------------------------------------
37 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
39 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
43 #include "FGFDMExec.h"
44 #include "FGAtmosphere.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"
54 static const char *IdSrc = "$Id$";
55 static const char *IdHdr = ID_OUTPUT;
57 extern short debug_lvl;
59 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
61 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
63 FGOutput::FGOutput(FGFDMExec* fdmex) : FGModel(fdmex)
66 sFirstPass = dFirstPass = true;
69 Filename = "JSBSim.out";
73 #ifdef FG_WITH_JSBSIM_SOCKET
74 socket = new FGfdmSocket("localhost",1138);
76 if (debug_lvl & 2) cout << "Instantiated: " << Name << endl;
79 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
83 if (socket) delete socket;
84 if (debug_lvl & 2) cout << "Destroyed: FGOutput" << endl;
87 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
89 bool FGOutput::Run(void)
92 if (!FGModel::Run()) {
94 if (Type == otSocket) {
96 } else if (Type == otCSV) {
97 if (Filename != "COUT" && Filename != "cout" && Filename.size() > 0) {
98 DelimitedOutput(Filename);
102 } else if (Type == otTerminal) {
104 } else if (Type == otNone) {
107 // Not a valid type of output
116 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
118 void FGOutput::SetType(string type)
122 } else if (type == "TABULAR") {
124 } else if (type == "SOCKET") {
126 } else if (type == "TERMINAL") {
128 } else if (type != "NONE"){
130 cerr << "Unknown type of output specified in config file" << endl;
134 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
136 void FGOutput::DelimitedOutput(void)
140 if (SubSystems & FGAircraft::ssSimulation) {
143 if (SubSystems & FGAircraft::ssAerosurfaces) {
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";
153 if (SubSystems & FGAircraft::ssRates) {
157 if (SubSystems & FGAircraft::ssVelocities) {
161 cout << "UBody, VBody, WBody, ";
162 cout << "UAero, VAero, WAero, ";
163 cout << "Vn, Ve, Vd";
165 if (SubSystems & FGAircraft::ssForces) {
167 cout << "Drag, Side, Lift, ";
169 cout << "Xforce, Yforce, Zforce";
171 if (SubSystems & FGAircraft::ssMoments) {
175 if (SubSystems & FGAircraft::ssAtmosphere) {
179 if (SubSystems & FGAircraft::ssMassProps) {
186 cout << "Xcg, Ycg, Zcg";
188 if (SubSystems & FGAircraft::ssPosition) {
190 cout << "Altitude, ";
191 cout << "Phi, Tht, Psi, ";
193 cout << "Latitude, ";
194 cout << "Longitude, ";
195 cout << "Distance AGL, ";
196 cout << "Runway Radius";
198 if (SubSystems & FGAircraft::ssCoefficients) {
200 cout << Aerodynamics->GetCoefficientStrings();
202 if (SubSystems & FGAircraft::ssGroundReactions) {
204 cout << Aircraft->GetGroundReactionStrings();
206 if (SubSystems & FGAircraft::ssPropulsion) {
208 cout << Propulsion->GetPropulsionStrings();
215 cout << State->Getsim_time();
216 if (SubSystems & FGAircraft::ssSimulation) {
218 if (SubSystems & FGAircraft::ssAerosurfaces) {
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();
228 if (SubSystems & FGAircraft::ssRates) {
230 cout << Rotation->GetPQR();
232 if (SubSystems & FGAircraft::ssVelocities) {
234 cout << Translation->Getqbar() << ", ";
235 cout << Translation->GetVt() << ", ";
236 cout << Translation->GetUVW() << ", ";
237 cout << Translation->GetvAero() << ", ";
238 cout << Position->GetVel();
240 if (SubSystems & FGAircraft::ssForces) {
242 cout << Aerodynamics->GetvFs() << ", ";
243 cout << Aerodynamics->GetLoD() << ", ";
244 cout << Aircraft->GetForces();
246 if (SubSystems & FGAircraft::ssMoments) {
248 cout << Aircraft->GetMoments();
250 if (SubSystems & FGAircraft::ssAtmosphere) {
252 cout << Atmosphere->GetDensity();
254 if (SubSystems & FGAircraft::ssMassProps) {
256 cout << MassBalance->GetIxx() << ", ";
257 cout << MassBalance->GetIyy() << ", ";
258 cout << MassBalance->GetIzz() << ", ";
259 cout << MassBalance->GetIxz() << ", ";
260 cout << MassBalance->GetMass() << ", ";
261 cout << MassBalance->GetXYZcg();
263 if (SubSystems & FGAircraft::ssPosition) {
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();
273 if (SubSystems & FGAircraft::ssCoefficients) {
275 cout << Aerodynamics->GetCoefficientValues();
277 if (SubSystems & FGAircraft::ssGroundReactions) {
279 cout << Aircraft->GetGroundReactionValues();
281 if (SubSystems & FGAircraft::ssPropulsion) {
283 cout << Propulsion->GetPropulsionValues();
289 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
291 void FGOutput::DelimitedOutput(string fname)
294 datafile.open(fname.c_str());
296 if (SubSystems & FGAircraft::ssSimulation) {
299 if (SubSystems & FGAircraft::ssAerosurfaces) {
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";
309 if (SubSystems & FGAircraft::ssRates) {
311 datafile << "P, Q, R";
313 if (SubSystems & FGAircraft::ssVelocities) {
315 datafile << "QBar, ";
316 datafile << "Vtotal, ";
317 datafile << "UBody, VBody, WBody, ";
318 datafile << "UAero, VAero, WAero, ";
319 datafile << "Vn, Ve, Vd";
321 if (SubSystems & FGAircraft::ssForces) {
323 datafile << "Drag, Side, Lift, ";
325 datafile << "Xforce, Yforce, Zforce";
327 if (SubSystems & FGAircraft::ssMoments) {
329 datafile << "L, M, N";
331 if (SubSystems & FGAircraft::ssAtmosphere) {
335 if (SubSystems & FGAircraft::ssMassProps) {
341 datafile << "Mass, ";
342 datafile << "Xcg, Ycg, Zcg";
344 if (SubSystems & FGAircraft::ssPosition) {
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";
354 if (SubSystems & FGAircraft::ssCoefficients) {
356 datafile << Aerodynamics->GetCoefficientStrings();
358 if (SubSystems & FGAircraft::ssGroundReactions) {
360 datafile << Aircraft->GetGroundReactionStrings();
362 if (SubSystems & FGAircraft::ssFCS) {
364 datafile << FCS->GetComponentStrings();
366 if (SubSystems & FGAircraft::ssPropulsion) {
368 datafile << Propulsion->GetPropulsionStrings();
374 datafile << State->Getsim_time();
375 if (SubSystems & FGAircraft::ssSimulation) {
377 if (SubSystems & FGAircraft::ssAerosurfaces) {
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();
387 if (SubSystems & FGAircraft::ssRates) {
389 datafile << Rotation->GetPQR();
391 if (SubSystems & FGAircraft::ssVelocities) {
393 datafile << Translation->Getqbar() << ", ";
394 datafile << Translation->GetVt() << ", ";
395 datafile << Translation->GetUVW() << ", ";
396 datafile << Translation->GetvAero() << ", ";
397 datafile << Position->GetVel();
399 if (SubSystems & FGAircraft::ssForces) {
401 datafile << Aerodynamics->GetvFs() << ", ";
402 datafile << Aerodynamics->GetLoD() << ", ";
403 datafile << Aircraft->GetForces();
405 if (SubSystems & FGAircraft::ssMoments) {
407 datafile << Aircraft->GetMoments();
409 if (SubSystems & FGAircraft::ssAtmosphere) {
411 datafile << Atmosphere->GetDensity();
413 if (SubSystems & FGAircraft::ssMassProps) {
415 datafile << MassBalance->GetIxx() << ", ";
416 datafile << MassBalance->GetIyy() << ", ";
417 datafile << MassBalance->GetIzz() << ", ";
418 datafile << MassBalance->GetIxz() << ", ";
419 datafile << MassBalance->GetMass() << ", ";
420 datafile << MassBalance->GetXYZcg();
422 if (SubSystems & FGAircraft::ssPosition) {
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();
432 if (SubSystems & FGAircraft::ssCoefficients) {
434 datafile << Aerodynamics->GetCoefficientValues();
436 if (SubSystems & FGAircraft::ssGroundReactions) {
438 datafile << Aircraft->GetGroundReactionValues();
440 if (SubSystems & FGAircraft::ssFCS) {
442 datafile << FCS->GetComponentValues();
444 if (SubSystems & FGAircraft::ssPropulsion) {
446 datafile << Propulsion->GetPropulsionValues();
452 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
454 void FGOutput::SocketOutput(void)
458 if (socket == NULL) return;
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");
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");
498 socket->Append("Throttle");
499 socket->Append("Aileron");
500 socket->Append("Elevator");
501 socket->Append("Rudder");
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());
549 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
551 void FGOutput::SocketStatusOutput(string out_str)
555 if (socket == NULL) return;
558 asciiData = string("<STATUS>") + out_str;
559 socket->Append(asciiData.c_str());
563 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
565 void FGOutput::Debug(void)
567 //TODO: Add your source code here