]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/FGOutput.cpp
Sync. with JSBSim CVS.
[flightgear.git] / src / FDM / JSBSim / FGOutput.cpp
1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
2 \r
3  Module:       FGOutput.cpp\r
4  Author:       Jon Berndt\r
5  Date started: 12/02/98\r
6  Purpose:      Manage output of sim parameters to file or stdout\r
7  Called by:    FGSimExec\r
8 \r
9  ------------- Copyright (C) 1999  Jon S. Berndt (jsb@hal-pc.org) -------------\r
10 \r
11  This program is free software; you can redistribute it and/or modify it under\r
12  the terms of the GNU General Public License as published by the Free Software\r
13  Foundation; either version 2 of the License, or (at your option) any later\r
14  version.\r
15 \r
16  This program is distributed in the hope that it will be useful, but WITHOUT\r
17  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
18  FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more\r
19  details.\r
20 \r
21  You should have received a copy of the GNU General Public License along with\r
22  this program; if not, write to the Free Software Foundation, Inc., 59 Temple\r
23  Place - Suite 330, Boston, MA  02111-1307, USA.\r
24 \r
25  Further information about the GNU General Public License can also be found on\r
26  the world wide web at http://www.gnu.org.\r
27 \r
28 FUNCTIONAL DESCRIPTION\r
29 --------------------------------------------------------------------------------\r
30 This is the place where you create output routines to dump data for perusal\r
31 later.\r
32 \r
33 HISTORY\r
34 --------------------------------------------------------------------------------\r
35 12/02/98   JSB   Created\r
36 \r
37 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
38 INCLUDES\r
39 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
40 \r
41 #include "FGOutput.h"\r
42 #include "FGState.h"\r
43 #include "FGFDMExec.h"\r
44 #include "FGAtmosphere.h"\r
45 #include "FGFCS.h"\r
46 #include "FGAerodynamics.h"\r
47 #include "FGGroundReactions.h"\r
48 #include "FGAircraft.h"\r
49 #include "FGMassBalance.h"\r
50 #include "FGTranslation.h"\r
51 #include "FGRotation.h"\r
52 #include "FGPosition.h"\r
53 #include "FGAuxiliary.h"\r
54 #include "FGInertial.h"\r
55 \r
56 namespace JSBSim {\r
57 \r
58 static const char *IdSrc = "$Id$";\r
59 static const char *IdHdr = ID_OUTPUT;\r
60 \r
61 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
62 CLASS IMPLEMENTATION\r
63 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/\r
64 \r
65 FGOutput::FGOutput(FGFDMExec* fdmex) : FGModel(fdmex)\r
66 {\r
67   Name = "FGOutput";\r
68   sFirstPass = dFirstPass = true;\r
69   socket = 0;\r
70   Type = otNone;\r
71   Filename = "";\r
72   SubSystems = 0;\r
73   enabled = true;\r
74   outputInFileName = "";\r
75 \r
76   Debug(0);\r
77 }\r
78 \r
79 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
80 \r
81 FGOutput::~FGOutput()\r
82 {\r
83   if (socket) delete socket;\r
84   for (unsigned int i=0; i<OutputProperties.size(); i++) delete OutputProperties[i];\r
85 \r
86   Debug(1);\r
87 }\r
88 \r
89 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
90 \r
91 bool FGOutput::Run(void)\r
92 {\r
93   if (enabled) {\r
94     if (!FGModel::Run()) {\r
95 \r
96       if (Type == otSocket) {\r
97         SocketOutput();\r
98       } else if (Type == otCSV) {\r
99         DelimitedOutput(Filename);\r
100       } else if (Type == otTerminal) {\r
101         // Not done yet\r
102       } else if (Type == otNone) {\r
103         // Do nothing\r
104       } else {\r
105         // Not a valid type of output\r
106       }\r
107     return false;\r
108     } else {\r
109     return true;\r
110     }\r
111   }\r
112   return false;\r
113 }\r
114 \r
115 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
116 \r
117 void FGOutput::SetType(string type)\r
118 {\r
119   if (type == "CSV") {\r
120     Type = otCSV;\r
121   } else if (type == "TABULAR") {\r
122     Type = otTab;\r
123   } else if (type == "SOCKET") {\r
124     Type = otSocket;\r
125   } else if (type == "TERMINAL") {\r
126     Type = otTerminal;\r
127   } else if (type != string("NONE")) {\r
128     Type = otUnknown;\r
129     cerr << "Unknown type of output specified in config file" << endl;\r
130   }\r
131 }\r
132 \r
133 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
134 \r
135 void FGOutput::DelimitedOutput(string fname)\r
136 {\r
137   streambuf* buffer;\r
138   string scratch = "";\r
139 \r
140   if (fname == "COUT" || fname == "cout") {\r
141     buffer = cout.rdbuf();\r
142   } else {\r
143     datafile.open(fname.c_str());\r
144     buffer = datafile.rdbuf();\r
145   }\r
146 \r
147   ostream outstream(buffer);\r
148 \r
149   if (dFirstPass) {\r
150     outstream << "Time";\r
151     if (SubSystems & ssSimulation) {\r
152       // Nothing here, yet\r
153     }\r
154     if (SubSystems & ssAerosurfaces) {\r
155       outstream << ", ";\r
156       outstream << "Aileron Cmd, ";\r
157       outstream << "Elevator Cmd, ";\r
158       outstream << "Rudder Cmd, ";\r
159       outstream << "Flap Cmd, ";\r
160       outstream << "Left Aileron Pos, ";\r
161       outstream << "Right Aileron Pos, ";\r
162       outstream << "Elevator Pos, ";\r
163       outstream << "Rudder Pos, ";\r
164       outstream << "Flap Pos";\r
165     }\r
166     if (SubSystems & ssRates) {\r
167       outstream << ", ";\r
168       outstream << "P, Q, R, ";\r
169       outstream << "Pdot, Qdot, Rdot";\r
170     }\r
171     if (SubSystems & ssVelocities) {\r
172       outstream << ", ";\r
173       outstream << "QBar, ";\r
174       outstream << "Vtotal, ";\r
175       outstream << "UBody, VBody, WBody, ";\r
176       outstream << "UAero, VAero, WAero, ";\r
177       outstream << "Vn, Ve, Vd";\r
178     }\r
179     if (SubSystems & ssForces) {\r
180       outstream << ", ";\r
181       outstream << "Drag, Side, Lift, ";\r
182       outstream << "L/D, ";\r
183       outstream << "Xforce, Yforce, Zforce, ";\r
184       outstream << "xGravity, yGravity, zGravity, ";\r
185       outstream << "xCoriolis, yCoriolis, zCoriolis, ";\r
186       outstream << "xCentrifugal, yCentrifugal, zCentrifugal";\r
187     }\r
188     if (SubSystems & ssMoments) {\r
189       outstream << ", ";\r
190       outstream << "L, M, N";\r
191     }\r
192     if (SubSystems & ssAtmosphere) {\r
193       outstream << ", ";\r
194       outstream << "Rho, ";\r
195       outstream << "NWind, EWind, DWind";\r
196     }\r
197     if (SubSystems & ssMassProps) {\r
198       outstream << ", ";\r
199       outstream << "Ixx, ";\r
200       outstream << "Ixy, ";\r
201       outstream << "Ixz, ";\r
202       outstream << "Iyx, ";\r
203       outstream << "Iyy, ";\r
204       outstream << "Iyz, ";\r
205       outstream << "Izx, ";\r
206       outstream << "Izy, ";\r
207       outstream << "Izz, ";\r
208       outstream << "Mass, ";\r
209       outstream << "Xcg, Ycg, Zcg";\r
210     }\r
211     if (SubSystems & ssPosition) {\r
212       outstream << ", ";\r
213       outstream << "Altitude, ";\r
214       outstream << "Phi, Tht, Psi, ";\r
215       outstream << "Alpha, ";\r
216       outstream << "Beta, ";\r
217       outstream << "Latitude, ";\r
218       outstream << "Longitude, ";\r
219       outstream << "Distance AGL, ";\r
220       outstream << "Runway Radius";\r
221     }\r
222     if (SubSystems & ssCoefficients) {\r
223       scratch = Aerodynamics->GetCoefficientStrings();\r
224       if (scratch.length() != 0) outstream << ", " << scratch;\r
225     }\r
226     if (SubSystems & ssFCS) {\r
227       scratch = FCS->GetComponentStrings();\r
228       if (scratch.length() != 0) outstream << ", " << scratch;\r
229     }\r
230     if (SubSystems & ssGroundReactions) {\r
231       outstream << ", ";\r
232       outstream << GroundReactions->GetGroundReactionStrings();\r
233     }\r
234     if (SubSystems & ssPropulsion && Propulsion->GetNumEngines() > 0) {\r
235       outstream << ", ";\r
236       outstream << Propulsion->GetPropulsionStrings();\r
237     }\r
238     if (OutputProperties.size() > 0) {\r
239       for (unsigned int i=0;i<OutputProperties.size();i++) {\r
240         outstream << ", " << OutputProperties[i]->GetName();\r
241       }\r
242     }\r
243 \r
244     outstream << endl;\r
245     dFirstPass = false;\r
246   }\r
247 \r
248   outstream << State->Getsim_time();\r
249   if (SubSystems & ssSimulation) {\r
250   }\r
251   if (SubSystems & ssAerosurfaces) {\r
252     outstream << ", ";\r
253     outstream << FCS->GetDaCmd() << ", ";\r
254     outstream << FCS->GetDeCmd() << ", ";\r
255     outstream << FCS->GetDrCmd() << ", ";\r
256     outstream << FCS->GetDfCmd() << ", ";\r
257     outstream << FCS->GetDaLPos() << ", ";\r
258     outstream << FCS->GetDaRPos() << ", ";\r
259     outstream << FCS->GetDePos() << ", ";\r
260     outstream << FCS->GetDrPos() << ", ";\r
261     outstream << FCS->GetDfPos();\r
262   }\r
263   if (SubSystems & ssRates) {\r
264     outstream << ", ";\r
265     outstream << Rotation->GetPQR() << ", ";\r
266     outstream << Rotation->GetPQRdot();\r
267   }\r
268   if (SubSystems & ssVelocities) {\r
269     outstream << ", ";\r
270     outstream << Translation->Getqbar() << ", ";\r
271     outstream << Translation->GetVt() << ", ";\r
272     outstream << Translation->GetUVW() << ", ";\r
273     outstream << Translation->GetAeroUVW() << ", ";\r
274     outstream << Position->GetVel();\r
275   }\r
276   if (SubSystems & ssForces) {\r
277     outstream << ", ";\r
278     outstream << Aerodynamics->GetvFs() << ", ";\r
279     outstream << Aerodynamics->GetLoD() << ", ";\r
280     outstream << Aircraft->GetForces() << ", ";\r
281     outstream << Inertial->GetGravity() << ", ";\r
282     outstream << Inertial->GetCoriolis() << ", ";\r
283     outstream << Inertial->GetCentrifugal();\r
284   }\r
285   if (SubSystems & ssMoments) {\r
286     outstream << ", ";\r
287     outstream << Aircraft->GetMoments();\r
288   }\r
289   if (SubSystems & ssAtmosphere) {\r
290     outstream << ", ";\r
291     outstream << Atmosphere->GetDensity() << ", ";\r
292     outstream << Atmosphere->GetWindNED();\r
293   }\r
294   if (SubSystems & ssMassProps) {\r
295     outstream << ", ";\r
296     outstream << MassBalance->GetJ() << ", ";\r
297     outstream << MassBalance->GetMass() << ", ";\r
298     outstream << MassBalance->GetXYZcg();\r
299   }\r
300   if (SubSystems & ssPosition) {\r
301     outstream << ", ";\r
302     outstream << Position->Geth() << ", ";\r
303     outstream << Rotation->GetEuler() << ", ";\r
304     outstream << Translation->Getalpha() << ", ";\r
305     outstream << Translation->Getbeta() << ", ";\r
306     outstream << Position->GetLatitude() << ", ";\r
307     outstream << Position->GetLongitude() << ", ";\r
308     outstream << Position->GetDistanceAGL() << ", ";\r
309     outstream << Position->GetRunwayRadius();\r
310   }\r
311   if (SubSystems & ssCoefficients) {\r
312     scratch = Aerodynamics->GetCoefficientValues();\r
313     if (scratch.length() != 0) outstream << ", " << scratch;\r
314   }\r
315   if (SubSystems & ssFCS) {\r
316     scratch = FCS->GetComponentValues();\r
317     if (scratch.length() != 0) outstream << ", " << scratch;\r
318   }\r
319   if (SubSystems & ssGroundReactions) {\r
320     outstream << ", ";\r
321     outstream << GroundReactions->GetGroundReactionValues();\r
322   }\r
323   if (SubSystems & ssPropulsion && Propulsion->GetNumEngines() > 0) {\r
324     outstream << ", ";\r
325     outstream << Propulsion->GetPropulsionValues();\r
326   }\r
327 \r
328   for (unsigned int i=0;i<OutputProperties.size();i++) {\r
329     outstream << ", " << OutputProperties[i]->getDoubleValue();\r
330   }\r
331 \r
332   outstream << endl;\r
333   outstream.flush();\r
334 }\r
335 \r
336 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
337 \r
338 void FGOutput::SocketOutput(void)\r
339 {\r
340   string asciiData;\r
341 \r
342   if (socket == NULL) return;\r
343   if (!socket->GetConnectStatus()) return;\r
344 \r
345   socket->Clear();\r
346   if (sFirstPass) {\r
347     socket->Append("<LABELS>");\r
348     socket->Append("Time");\r
349     socket->Append("Altitude");\r
350     socket->Append("Phi");\r
351     socket->Append("Tht");\r
352     socket->Append("Psi");\r
353     socket->Append("Rho");\r
354     socket->Append("Vtotal");\r
355     socket->Append("UBody");\r
356     socket->Append("VBody");\r
357     socket->Append("WBody");\r
358     socket->Append("UAero");\r
359     socket->Append("VAero");\r
360     socket->Append("WAero");\r
361     socket->Append("Vn");\r
362     socket->Append("Ve");\r
363     socket->Append("Vd");\r
364     socket->Append("Udot");\r
365     socket->Append("Vdot");\r
366     socket->Append("Wdot");\r
367     socket->Append("P");\r
368     socket->Append("Q");\r
369     socket->Append("R");\r
370     socket->Append("PDot");\r
371     socket->Append("QDot");\r
372     socket->Append("RDot");\r
373     socket->Append("Fx");\r
374     socket->Append("Fy");\r
375     socket->Append("Fz");\r
376     socket->Append("Latitude");\r
377     socket->Append("Longitude");\r
378     socket->Append("QBar");\r
379     socket->Append("Alpha");\r
380     socket->Append("L");\r
381     socket->Append("M");\r
382     socket->Append("N");\r
383     socket->Append("Throttle Position");\r
384     socket->Append("Left Aileron Position");\r
385     socket->Append("Right Aileron Position");\r
386     socket->Append("Elevator Position");\r
387     socket->Append("Rudder Position");\r
388     sFirstPass = false;\r
389     socket->Send();\r
390   }\r
391 \r
392   socket->Clear();\r
393   socket->Append(State->Getsim_time());\r
394   socket->Append(Position->Geth());\r
395   socket->Append(Rotation->Getphi());\r
396   socket->Append(Rotation->Gettht());\r
397   socket->Append(Rotation->Getpsi());\r
398   socket->Append(Atmosphere->GetDensity());\r
399   socket->Append(Translation->GetVt());\r
400   socket->Append(Translation->GetUVW(eU));\r
401   socket->Append(Translation->GetUVW(eV));\r
402   socket->Append(Translation->GetUVW(eW));\r
403   socket->Append(Translation->GetAeroUVW(eU));\r
404   socket->Append(Translation->GetAeroUVW(eV));\r
405   socket->Append(Translation->GetAeroUVW(eW));\r
406   socket->Append(Position->GetVn());\r
407   socket->Append(Position->GetVe());\r
408   socket->Append(Position->GetVd());\r
409   socket->Append(Translation->GetUVWdot(eU));\r
410   socket->Append(Translation->GetUVWdot(eV));\r
411   socket->Append(Translation->GetUVWdot(eW));\r
412   socket->Append(Rotation->GetPQR(eP));\r
413   socket->Append(Rotation->GetPQR(eQ));\r
414   socket->Append(Rotation->GetPQR(eR));\r
415   socket->Append(Rotation->GetPQRdot(eP));\r
416   socket->Append(Rotation->GetPQRdot(eQ));\r
417   socket->Append(Rotation->GetPQRdot(eR));\r
418   socket->Append(Aircraft->GetForces(eX));\r
419   socket->Append(Aircraft->GetForces(eY));\r
420   socket->Append(Aircraft->GetForces(eZ));\r
421   socket->Append(Position->GetLatitude());\r
422   socket->Append(Position->GetLongitude());\r
423   socket->Append(Translation->Getqbar());\r
424   socket->Append(Translation->Getalpha());\r
425   socket->Append(Aircraft->GetMoments(eL));\r
426   socket->Append(Aircraft->GetMoments(eM));\r
427   socket->Append(Aircraft->GetMoments(eN));\r
428   socket->Append(FCS->GetThrottlePos(0));\r
429   socket->Append(FCS->GetDaLPos());\r
430   socket->Append(FCS->GetDaRPos());\r
431   socket->Append(FCS->GetDePos());\r
432   socket->Append(FCS->GetDrPos());\r
433   socket->Send();\r
434 }\r
435 \r
436 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
437 \r
438 void FGOutput::SocketStatusOutput(string out_str)\r
439 {\r
440   string asciiData;\r
441 \r
442   if (socket == NULL) return;\r
443 \r
444   socket->Clear();\r
445   asciiData = string("<STATUS>") + out_str;\r
446   socket->Append(asciiData.c_str());\r
447   socket->Send();\r
448 }\r
449 \r
450 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
451 \r
452 bool FGOutput::Load(FGConfigFile* AC_cfg)\r
453 {\r
454   string token="", parameter="", separator="";\r
455   string name="", fname="";\r
456   int OutRate = 0;\r
457   FGConfigFile* Output_cfg;\r
458   string property;\r
459 \r
460 # ifndef macintosh\r
461     separator = "/";\r
462 # else\r
463     separator = ";";\r
464 # endif\r
465 \r
466   name = AC_cfg->GetValue("NAME");\r
467   fname = AC_cfg->GetValue("FILE");\r
468   token = AC_cfg->GetValue("TYPE");\r
469   Output->SetType(token);\r
470 \r
471 #if defined( FG_WITH_JSBSIM_SOCKET ) || !defined( FGFS )\r
472   if (token == "SOCKET") {\r
473     socket = new FGfdmSocket("localhost",1138);\r
474   }\r
475 #endif\r
476 \r
477   if (!fname.empty()) {\r
478     outputInFileName = FDMExec->GetAircraftPath() + separator\r
479                         + FDMExec->GetModelName() + separator + fname + ".xml";\r
480     Output_cfg = new FGConfigFile(outputInFileName);\r
481     if (!Output_cfg->IsOpen()) {\r
482       cerr << "Could not open file: " << outputInFileName << endl;\r
483       return false;\r
484     }\r
485   } else {\r
486     Output_cfg = AC_cfg;\r
487   }\r
488   Output->SetFilename(name);\r
489 \r
490   while ((token = Output_cfg->GetValue()) != string("/OUTPUT")) {\r
491     *Output_cfg >> parameter;\r
492     if (parameter == "RATE_IN_HZ") {\r
493       *Output_cfg >> OutRate;\r
494     }\r
495     if (parameter == "SIMULATION") {\r
496       *Output_cfg >> parameter;\r
497       if (parameter == "ON") SubSystems += ssSimulation;\r
498     }\r
499     if (parameter == "AEROSURFACES") {\r
500       *Output_cfg >> parameter;\r
501       if (parameter == "ON") SubSystems += ssAerosurfaces;\r
502     }\r
503     if (parameter == "RATES") {\r
504       *Output_cfg >> parameter;\r
505       if (parameter == "ON") SubSystems += ssRates;\r
506     }\r
507     if (parameter == "VELOCITIES") {\r
508       *Output_cfg >> parameter;\r
509       if (parameter == "ON") SubSystems += ssVelocities;\r
510     }\r
511     if (parameter == "FORCES") {\r
512       *Output_cfg >> parameter;\r
513       if (parameter == "ON") SubSystems += ssForces;\r
514     }\r
515     if (parameter == "MOMENTS") {\r
516       *Output_cfg >> parameter;\r
517       if (parameter == "ON") SubSystems += ssMoments;\r
518     }\r
519     if (parameter == "ATMOSPHERE") {\r
520       *Output_cfg >> parameter;\r
521       if (parameter == "ON") SubSystems += ssAtmosphere;\r
522     }\r
523     if (parameter == "MASSPROPS") {\r
524       *Output_cfg >> parameter;\r
525       if (parameter == "ON") SubSystems += ssMassProps;\r
526     }\r
527     if (parameter == "POSITION") {\r
528       *Output_cfg >> parameter;\r
529       if (parameter == "ON") SubSystems += ssPosition;\r
530     }\r
531     if (parameter == "COEFFICIENTS") {\r
532       *Output_cfg >> parameter;\r
533       if (parameter == "ON") SubSystems += ssCoefficients;\r
534     }\r
535     if (parameter == "GROUND_REACTIONS") {\r
536       *Output_cfg >> parameter;\r
537       if (parameter == "ON") SubSystems += ssGroundReactions;\r
538     }\r
539     if (parameter == "FCS") {\r
540       *Output_cfg >> parameter;\r
541       if (parameter == "ON") SubSystems += ssFCS;\r
542     }\r
543     if (parameter == "PROPULSION") {\r
544       *Output_cfg >> parameter;\r
545       if (parameter == "ON") SubSystems += ssPropulsion;\r
546     }\r
547     if (parameter == "PROPERTY") {\r
548       *Output_cfg >> property;\r
549       OutputProperties.push_back(PropertyManager->GetNode(property));\r
550     }\r
551 \r
552     if (parameter == "EOF") break;\r
553   }\r
554 \r
555   OutRate = OutRate>120?120:(OutRate<0?0:OutRate);\r
556   rate = (int)(0.5 + 1.0/(State->Getdt()*OutRate));\r
557 \r
558   Debug(2);\r
559 \r
560   return true;\r
561 }\r
562 \r
563 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\r
564 //    The bitmasked value choices are as follows:\r
565 //    unset: In this case (the default) JSBSim would only print\r
566 //       out the normally expected messages, essentially echoing\r
567 //       the config files as they are read. If the environment\r
568 //       variable is not set, debug_lvl is set to 1 internally\r
569 //    0: This requests JSBSim not to output any messages\r
570 //       whatsoever.\r
571 //    1: This value explicity requests the normal JSBSim\r
572 //       startup messages\r
573 //    2: This value asks for a message to be printed out when\r
574 //       a class is instantiated\r
575 //    4: When this value is set, a message is displayed when a\r
576 //       FGModel object executes its Run() method\r
577 //    8: When this value is set, various runtime state variables\r
578 //       are printed out periodically\r
579 //    16: When set various parameters are sanity checked and\r
580 //       a message is printed out when they go out of bounds\r
581 \r
582 void FGOutput::Debug(int from)\r
583 {\r
584   string scratch="";\r
585 \r
586   if (debug_lvl <= 0) return;\r
587 \r
588   if (debug_lvl & 1) { // Standard console startup message output\r
589     if (from == 0) { // Constructor\r
590 \r
591     }\r
592     if (from == 2) {\r
593       if (outputInFileName.empty())\r
594         cout << "  " << "Output parameters read inline" << endl;\r
595       else\r
596         cout << "    Output parameters read from file: " << outputInFileName << endl;\r
597 \r
598       if (Filename == "cout" || Filename == "COUT") {\r
599         scratch = "    Log output goes to screen console";\r
600       } else if (!Filename.empty()) {\r
601         scratch = "    Log output goes to file: " + Filename;\r
602       }\r
603       switch (Type) {\r
604       case otCSV:\r
605         cout << scratch << " in CSV format output at rate " << 120/rate << " Hz" << endl;\r
606         break;\r
607       case otNone:\r
608         cout << "  No log output" << endl;\r
609         break;\r
610       }\r
611 \r
612       if (SubSystems & ssSimulation)      cout << "    Simulation parameters logged" << endl;\r
613       if (SubSystems & ssAerosurfaces)    cout << "    Aerosurface parameters logged" << endl;\r
614       if (SubSystems & ssRates)           cout << "    Rate parameters logged" << endl;\r
615       if (SubSystems & ssVelocities)      cout << "    Velocity parameters logged" << endl;\r
616       if (SubSystems & ssForces)          cout << "    Force parameters logged" << endl;\r
617       if (SubSystems & ssMoments)         cout << "    Moments parameters logged" << endl;\r
618       if (SubSystems & ssAtmosphere)      cout << "    Atmosphere parameters logged" << endl;\r
619       if (SubSystems & ssMassProps)       cout << "    Mass parameters logged" << endl;\r
620       if (SubSystems & ssCoefficients)    cout << "    Coefficient parameters logged" << endl;\r
621       if (SubSystems & ssPosition)        cout << "    Position parameters logged" << endl;\r
622       if (SubSystems & ssGroundReactions) cout << "    Ground parameters logged" << endl;\r
623       if (SubSystems & ssFCS)             cout << "    FCS parameters logged" << endl;\r
624       if (SubSystems & ssPropulsion)      cout << "    Propulsion parameters logged" << endl;\r
625     }\r
626   }\r
627   if (debug_lvl & 2 ) { // Instantiation/Destruction notification\r
628     if (from == 0) cout << "Instantiated: FGOutput" << endl;\r
629     if (from == 1) cout << "Destroyed:    FGOutput" << endl;\r
630   }\r
631   if (debug_lvl & 4 ) { // Run() method entry print for FGModel-derived objects\r
632   }\r
633   if (debug_lvl & 8 ) { // Runtime state variables\r
634   }\r
635   if (debug_lvl & 16) { // Sanity checking\r
636   }\r
637   if (debug_lvl & 64) {\r
638     if (from == 0) { // Constructor\r
639       cout << IdSrc << endl;\r
640       cout << IdHdr << endl;\r
641     }\r
642   }\r
643 }\r
644 }\r