]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/FGOutput.cpp
Updates 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. Some machines may not support the ncurses console output. Borland is one
32 of those environments which does not, so the ncurses stuff is commented out.
33
34 HISTORY
35 --------------------------------------------------------------------------------
36 12/02/98   JSB   Created
37
38 ********************************************************************************
39 INCLUDES
40 *******************************************************************************/
41
42 #include "FGOutput.h"
43 #include "FGState.h"
44 #include "FGFDMExec.h"
45 #include "FGAtmosphere.h"
46 #include "FGFCS.h"
47 #include "FGAircraft.h"
48 #include "FGTranslation.h"
49 #include "FGRotation.h"
50 #include "FGPosition.h"
51 #include "FGAuxiliary.h"
52
53 /*******************************************************************************
54 ************************************ CODE **************************************
55 *******************************************************************************/
56
57 FGOutput::FGOutput(FGFDMExec* fdmex) : FGModel(fdmex)
58 {
59   Name = "FGOutput";
60   sFirstPass = dFirstPass = true;
61   socket = 0;
62 //#ifdef FG_WITH_JSBSIM_SOCKET
63   socket = new FGfdmSocket("localhost",1138);
64 //#endif
65 }
66
67
68 FGOutput::~FGOutput(void)
69 {
70   if (socket) delete socket;
71 }
72
73
74 bool FGOutput::Run(void)
75 {
76   if (!FGModel::Run()) {
77 //    SocketOutput();
78 //    DelimitedOutput("JSBSimData.csv");
79 //    DelimitedOutput();
80   } else {
81   }
82   return false;
83 }
84
85
86 void FGOutput::DelimitedOutput(void)
87 {
88   if (dFirstPass) {
89     cout << "Time,";
90     cout << "Altitude,";
91     cout << "Phi,";
92     cout << "Tht,";
93     cout << "Psi,";
94     cout << "Rho,";
95     cout << "Vtotal,";
96     cout << "U,";
97     cout << "V,";
98     cout << "W,";
99     cout << "Vn,";
100     cout << "Ve,";
101     cout << "Vd,";
102     cout << "Udot,";
103     cout << "Vdot,";
104     cout << "Wdot,";
105     cout << "P,";
106     cout << "Q,";
107     cout << "R,";
108     cout << "PDot,";
109     cout << "QDot,";
110     cout << "RDot,";
111     cout << "Fx,";
112     cout << "Fy,";
113     cout << "Fz,";
114     cout << "Latitude,";
115     cout << "Longitude,";
116     cout << "QBar,";
117     cout << "Alpha,";
118     cout << "L,";
119     cout << "M,";
120     cout << "N,";
121     cout << "Throttle,";
122     cout << "Aileron,";
123     cout << "Elevator,";
124     cout << "Rudder,";
125     cout << "Ixx,";
126     cout << "Iyy,";
127     cout << "Izz,";
128     cout << "Ixz,";
129     cout << "Mass,";
130     cout << "X CG";
131     cout << endl;
132     dFirstPass = false;
133   }
134
135   cout << State->Getsim_time() << ",";
136   cout << State->Geth() << ",";
137   cout << Rotation->Getphi() << ",";
138   cout << Rotation->Gettht() << ",";
139   cout << Rotation->Getpsi() << ",";
140   cout << Atmosphere->GetDensity() << ",";
141   cout << State->GetVt() << ",";
142   cout << Translation->GetU() << ",";
143   cout << Translation->GetV() << ",";
144   cout << Translation->GetW() << ",";
145   cout << Position->GetVn() << ",";
146   cout << Position->GetVe() << ",";
147   cout << Position->GetVd() << ",";
148   cout << Translation->GetUdot() << ",";
149   cout << Translation->GetVdot() << ",";
150   cout << Translation->GetWdot() << ",";
151   cout << Rotation->GetP() << ",";
152   cout << Rotation->GetQ() << ",";
153   cout << Rotation->GetR() << ",";
154   cout << Rotation->GetPdot() << ",";
155   cout << Rotation->GetQdot() << ",";
156   cout << Rotation->GetRdot() << ",";
157   cout << Aircraft->GetFx() << ",";
158   cout << Aircraft->GetFy() << ",";
159   cout << Aircraft->GetFz() << ",";
160   cout << State->Getlatitude() << ",";
161   cout << State->Getlongitude() << ",";
162   cout << State->Getqbar() << ",";
163   cout << Translation->Getalpha() << ",";
164   cout << Aircraft->GetL() << ",";
165   cout << Aircraft->GetM() << ",";
166   cout << Aircraft->GetN() << ",";
167   cout << FCS->GetThrottle(0) << ",";
168   cout << FCS->GetDa() << ",";
169   cout << FCS->GetDe() << ",";
170   cout << FCS->GetDr() << ",";
171   cout << Aircraft->GetIxx() << ",";
172   cout << Aircraft->GetIyy() << ",";
173   cout << Aircraft->GetIzz() << ",";
174   cout << Aircraft->GetIxz() << ",";
175   cout << Aircraft->GetMass() << ",";
176   cout << Aircraft->GetXcg() << "";
177   cout << endl;
178
179 }
180
181
182 void FGOutput::DelimitedOutput(string fname)
183 {
184   if (sFirstPass) {
185     datafile.open(fname.c_str());
186     datafile << "Time,";
187     datafile << "Altitude,";
188     datafile << "Phi,";
189     datafile << "Tht,";
190     datafile << "Psi,";
191     datafile << "Rho,";
192     datafile << "Vtotal,";
193     datafile << "U,";
194     datafile << "V,";
195     datafile << "W,";
196     datafile << "Vn,";
197     datafile << "Ve,";
198     datafile << "Vd,";
199     datafile << "Udot,";
200     datafile << "Vdot,";
201     datafile << "Wdot,";
202     datafile << "P,";
203     datafile << "Q,";
204     datafile << "R,";
205     datafile << "PDot,";
206     datafile << "QDot,";
207     datafile << "RDot,";
208     datafile << "Fx,";
209     datafile << "Fy,";
210     datafile << "Fz,";
211     datafile << "Latitude,";
212     datafile << "Longitude,";
213     datafile << "QBar,";
214     datafile << "Alpha,";
215     datafile << "L,";
216     datafile << "M,";
217     datafile << "N,";
218     datafile << "Throttle,";
219     datafile << "Aileron,";
220     datafile << "Elevator,";
221     datafile << "Rudder,";
222     datafile << "Ixx,";
223     datafile << "Iyy,";
224     datafile << "Izz,";
225     datafile << "Ixz,";
226     datafile << "Mass,";
227     datafile << "X CG";
228     datafile << endl;
229     sFirstPass = false;
230   }
231
232   datafile << State->Getsim_time() << ",";
233   datafile << State->Geth() << ",";
234   datafile << Rotation->Getphi() << ",";
235   datafile << Rotation->Gettht() << ",";
236   datafile << Rotation->Getpsi() << ",";
237   datafile << Atmosphere->GetDensity() << ",";
238   datafile << State->GetVt() << ",";
239   datafile << Translation->GetU() << ",";
240   datafile << Translation->GetV() << ",";
241   datafile << Translation->GetW() << ",";
242   datafile << Position->GetVn() << ",";
243   datafile << Position->GetVe() << ",";
244   datafile << Position->GetVd() << ",";
245   datafile << Translation->GetUdot() << ",";
246   datafile << Translation->GetVdot() << ",";
247   datafile << Translation->GetWdot() << ",";
248   datafile << Rotation->GetP() << ",";
249   datafile << Rotation->GetQ() << ",";
250   datafile << Rotation->GetR() << ",";
251   datafile << Rotation->GetPdot() << ",";
252   datafile << Rotation->GetQdot() << ",";
253   datafile << Rotation->GetRdot() << ",";
254   datafile << Aircraft->GetFx() << ",";
255   datafile << Aircraft->GetFy() << ",";
256   datafile << Aircraft->GetFz() << ",";
257   datafile << State->Getlatitude() << ",";
258   datafile << State->Getlongitude() << ",";
259   datafile << State->Getqbar() << ",";
260   datafile << Translation->Getalpha() << ",";
261   datafile << Aircraft->GetL() << ",";
262   datafile << Aircraft->GetM() << ",";
263   datafile << Aircraft->GetN() << ",";
264   datafile << FCS->GetThrottle(0) << ",";
265   datafile << FCS->GetDa() << ",";
266   datafile << FCS->GetDe() << ",";
267   datafile << FCS->GetDr() << ",";
268   datafile << Aircraft->GetIxx() << ",";
269   datafile << Aircraft->GetIyy() << ",";
270   datafile << Aircraft->GetIzz() << ",";
271   datafile << Aircraft->GetIxz() << ",";
272   datafile << Aircraft->GetMass() << ",";
273   datafile << Aircraft->GetXcg() << "";
274   datafile << endl;
275   datafile.flush();
276 }
277
278 void FGOutput::SocketOutput(void)
279 {
280   string asciiData;
281
282   if (socket <= 0) return;
283
284   socket->Clear();
285   if (sFirstPass) {
286     socket->Append("<LABELS>");
287     socket->Append("Time");
288     socket->Append("Altitude");
289     socket->Append("Phi");
290     socket->Append("Tht");
291     socket->Append("Psi");
292     socket->Append("Rho");
293     socket->Append("Vtotal");
294     socket->Append("U");
295     socket->Append("V");
296     socket->Append("W");
297     socket->Append("Vn");
298     socket->Append("Ve");
299     socket->Append("Vd");
300     socket->Append("Udot");
301     socket->Append("Vdot");
302     socket->Append("Wdot");
303     socket->Append("P");
304     socket->Append("Q");
305     socket->Append("R");
306     socket->Append("PDot");
307     socket->Append("QDot");
308     socket->Append("RDot");
309     socket->Append("Fx");
310     socket->Append("Fy");
311     socket->Append("Fz");
312     socket->Append("Latitude");
313     socket->Append("Longitude");
314     socket->Append("QBar");
315     socket->Append("Alpha");
316     socket->Append("L");
317     socket->Append("M");
318     socket->Append("N");
319     socket->Append("Throttle");
320     socket->Append("Aileron");
321     socket->Append("Elevator");
322     socket->Append("Rudder");
323     sFirstPass = false;
324     socket->Send();
325   }
326
327   socket->Clear();
328   socket->Append(State->Getsim_time());
329   socket->Append(State->Geth());
330   socket->Append(Rotation->Getphi());
331   socket->Append(Rotation->Gettht());
332   socket->Append(Rotation->Getpsi());
333   socket->Append(Atmosphere->GetDensity());
334   socket->Append(State->GetVt());
335   socket->Append(Translation->GetU());
336   socket->Append(Translation->GetV());
337   socket->Append(Translation->GetW());
338   socket->Append(Position->GetVn());
339   socket->Append(Position->GetVe());
340   socket->Append(Position->GetVd());
341   socket->Append(Translation->GetUdot());
342   socket->Append(Translation->GetVdot());
343   socket->Append(Translation->GetWdot());
344   socket->Append(Rotation->GetP());
345   socket->Append(Rotation->GetQ());
346   socket->Append(Rotation->GetR());
347   socket->Append(Rotation->GetPdot());
348   socket->Append(Rotation->GetQdot());
349   socket->Append(Rotation->GetRdot());
350   socket->Append(Aircraft->GetFx());
351   socket->Append(Aircraft->GetFy());
352   socket->Append(Aircraft->GetFz());
353   socket->Append(State->Getlatitude());
354   socket->Append(State->Getlongitude());
355   socket->Append(State->Getqbar());
356   socket->Append(Translation->Getalpha());
357   socket->Append(Aircraft->GetL());
358   socket->Append(Aircraft->GetM());
359   socket->Append(Aircraft->GetN());
360   socket->Append(FCS->GetThrottle(0));
361   socket->Append(FCS->GetDa());
362   socket->Append(FCS->GetDe());
363   socket->Append(FCS->GetDr());
364   socket->Send();
365 }
366
367
368 void FGOutput::SocketStatusOutput(string out_str)
369 {
370   string asciiData;
371
372   if (socket <= 0) return;
373
374   socket->Clear();
375   asciiData = string("<STATUS>") + out_str;
376   socket->Append(asciiData.c_str());
377   socket->Send();
378 }
379