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
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.
35 --------------------------------------------------------------------------------
38 ********************************************************************************
40 *******************************************************************************/
44 #include "FGFDMExec.h"
45 #include "FGAtmosphere.h"
47 #include "FGAircraft.h"
48 #include "FGTranslation.h"
49 #include "FGRotation.h"
50 #include "FGPosition.h"
51 #include "FGAuxiliary.h"
53 /*******************************************************************************
54 ************************************ CODE **************************************
55 *******************************************************************************/
57 FGOutput::FGOutput(FGFDMExec* fdmex) : FGModel(fdmex)
60 sFirstPass = dFirstPass = true;
62 #ifdef FG_WITH_JSBSIM_SOCKET
63 socket = new FGfdmSocket("localhost",1138);
68 FGOutput::~FGOutput(void)
70 if (socket) delete socket;
74 bool FGOutput::Run(void)
76 if (!FGModel::Run()) {
78 // DelimitedOutput("JSBSimData.csv");
86 void FGOutput::DelimitedOutput(void)
115 cout << "Longitude,";
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() << "";
182 void FGOutput::DelimitedOutput(string fname)
185 datafile.open(fname.c_str());
187 datafile << "Altitude,";
192 datafile << "Vtotal,";
211 datafile << "Latitude,";
212 datafile << "Longitude,";
214 datafile << "Alpha,";
218 datafile << "Throttle,";
219 datafile << "Aileron,";
220 datafile << "Elevator,";
221 datafile << "Rudder,";
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() << "";
278 void FGOutput::SocketOutput(void)
282 if (socket <= 0) return;
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");
297 socket->Append("Vn");
298 socket->Append("Ve");
299 socket->Append("Vd");
300 socket->Append("Udot");
301 socket->Append("Vdot");
302 socket->Append("Wdot");
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");
319 socket->Append("Throttle");
320 socket->Append("Aileron");
321 socket->Append("Elevator");
322 socket->Append("Rudder");
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());
368 void FGOutput::SocketStatusOutput(string out_str)
372 if (socket <= 0) return;
375 asciiData = string("<STATUS>") + out_str;
376 socket->Append(asciiData.c_str());