44 #include "FGOutputSocket.h"
45 #include "FGFDMExec.h"
46 #include "models/FGAerodynamics.h"
47 #include "models/FGAccelerations.h"
48 #include "models/FGAircraft.h"
49 #include "models/FGAtmosphere.h"
50 #include "models/FGAuxiliary.h"
51 #include "models/FGPropulsion.h"
52 #include "models/FGMassBalance.h"
53 #include "models/FGPropagate.h"
54 #include "models/FGGroundReactions.h"
55 #include "models/FGFCS.h"
56 #include "models/atmosphere/FGWinds.h"
57 #include "input_output/FGXMLElement.h"
58 #include "math/FGPropertyValue.h"
86 size_t dot_pos = fname.find(
':', 0);
87 size_t slash_pos = fname.find(
'/', 0);
89 string name = fname.substr(0, dot_pos);
92 if(dot_pos + 1 < slash_pos)
93 proto = fname.substr(dot_pos + 1, slash_pos - dot_pos - 1);
96 if(slash_pos < string::npos)
97 port = fname.substr(slash_pos + 1, string::npos);
100 Name = name +
":" + port +
"/" + proto;
105 SockPort = atoi(port.c_str());
107 if (to_upper(proto) ==
"UDP")
108 SockProtocol = FGfdmSocket::ptUDP;
110 SockProtocol = FGfdmSocket::ptTCP;
139 socket =
new FGfdmSocket(SockName, SockPort, SockProtocol, precision);
141 if (socket == 0)
return false;
142 if (!socket->GetConnectStatus())
return false;
154 void FGOutputSocket::PrintHeaders(
void)
159 socket->Clear(
"<LABELS>");
160 socket->Append(
"Time");
163 socket->Append(
"Aileron Command");
164 socket->Append(
"Elevator Command");
165 socket->Append(
"Rudder Command");
166 socket->Append(
"Flap Command");
167 socket->Append(
"Left Aileron Position");
168 socket->Append(
"Right Aileron Position");
169 socket->Append(
"Elevator Position");
170 socket->Append(
"Rudder Position");
171 socket->Append(
"Flap Position");
178 socket->Append(
"PDot");
179 socket->Append(
"QDot");
180 socket->Append(
"RDot");
184 socket->Append(
"QBar");
185 socket->Append(
"Vtotal");
186 socket->Append(
"UBody");
187 socket->Append(
"VBody");
188 socket->Append(
"WBody");
189 socket->Append(
"UAero");
190 socket->Append(
"VAero");
191 socket->Append(
"WAero");
192 socket->Append(
"Vn");
193 socket->Append(
"Ve");
194 socket->Append(
"Vd");
198 socket->Append(
"F_Drag");
199 socket->Append(
"F_Side");
200 socket->Append(
"F_Lift");
201 socket->Append(
"LoD");
202 socket->Append(
"Fx");
203 socket->Append(
"Fy");
204 socket->Append(
"Fz");
214 socket->Append(
"Rho");
215 socket->Append(
"SL pressure");
216 socket->Append(
"Ambient pressure");
217 socket->Append(
"Turbulence Magnitude");
218 socket->Append(
"Turbulence Direction");
219 socket->Append(
"NWind");
220 socket->Append(
"EWind");
221 socket->Append(
"DWind");
225 socket->Append(
"Ixx");
226 socket->Append(
"Ixy");
227 socket->Append(
"Ixz");
228 socket->Append(
"Iyx");
229 socket->Append(
"Iyy");
230 socket->Append(
"Iyz");
231 socket->Append(
"Izx");
232 socket->Append(
"Izy");
233 socket->Append(
"Izz");
234 socket->Append(
"Mass");
235 socket->Append(
"Xcg");
236 socket->Append(
"Ycg");
237 socket->Append(
"Zcg");
241 socket->Append(
"Altitude");
242 socket->Append(
"Phi (deg)");
243 socket->Append(
"Tht (deg)");
244 socket->Append(
"Psi (deg)");
245 socket->Append(
"Alpha (deg)");
246 socket->Append(
"Beta (deg)");
247 socket->Append(
"Latitude (deg)");
248 socket->Append(
"Longitude (deg)");
253 if (scratch.length() != 0) socket->Append(scratch);
256 if (SubSystems &
ssFCS) {
258 if (scratch.length() != 0) socket->Append(scratch);
262 socket->Append(GroundReactions->GetGroundReactionStrings(
","));
265 socket->Append(Propulsion->GetPropulsionStrings(
","));
267 for (
unsigned int i=0;i<OutputParameters.size();++i) {
268 if (!OutputCaptions[i].empty())
269 socket->Append(OutputCaptions[i]);
271 socket->Append(OutputParameters[i]->GetPrintableName());
281 string asciiData, scratch;
283 if (socket == 0)
return;
284 if (!socket->GetConnectStatus())
return;
301 socket->Append(radtodeg*Propagate->
GetPQR(eP));
302 socket->Append(radtodeg*Propagate->
GetPQR(eQ));
303 socket->Append(radtodeg*Propagate->
GetPQR(eR));
304 socket->Append(radtodeg*Accelerations->
GetPQRdot(eP));
305 socket->Append(radtodeg*Accelerations->
GetPQRdot(eQ));
306 socket->Append(radtodeg*Accelerations->
GetPQRdot(eR));
309 socket->Append(Auxiliary->Getqbar());
310 socket->Append(Auxiliary->
GetVt());
311 socket->Append(Propagate->
GetUVW(eU));
312 socket->Append(Propagate->
GetUVW(eV));
313 socket->Append(Propagate->
GetUVW(eW));
314 socket->Append(Auxiliary->GetAeroUVW(eU));
315 socket->Append(Auxiliary->GetAeroUVW(eV));
316 socket->Append(Auxiliary->GetAeroUVW(eW));
317 socket->Append(Propagate->
GetVel(eNorth));
318 socket->Append(Propagate->
GetVel(eEast));
319 socket->Append(Propagate->
GetVel(eDown));
322 socket->Append(Aerodynamics->
GetvFw()(eDrag));
323 socket->Append(Aerodynamics->
GetvFw()(eSide));
324 socket->Append(Aerodynamics->
GetvFw()(eLift));
325 socket->Append(Aerodynamics->
GetLoD());
326 socket->Append(Aircraft->GetForces(eX));
327 socket->Append(Aircraft->GetForces(eY));
328 socket->Append(Aircraft->GetForces(eZ));
331 socket->Append(Aircraft->GetMoments(eL));
332 socket->Append(Aircraft->GetMoments(eM));
333 socket->Append(Aircraft->GetMoments(eN));
337 socket->Append(Atmosphere->GetPressureSL());
339 socket->Append(Winds->GetTurbMagnitude());
340 socket->Append(Winds->GetTurbDirection());
344 socket->Append(MassBalance->
GetJ()(1,1));
345 socket->Append(MassBalance->
GetJ()(1,2));
346 socket->Append(MassBalance->
GetJ()(1,3));
347 socket->Append(MassBalance->
GetJ()(2,1));
348 socket->Append(MassBalance->
GetJ()(2,2));
349 socket->Append(MassBalance->
GetJ()(2,3));
350 socket->Append(MassBalance->
GetJ()(3,1));
351 socket->Append(MassBalance->
GetJ()(3,2));
352 socket->Append(MassBalance->
GetJ()(3,3));
353 socket->Append(MassBalance->GetMass());
354 socket->Append(MassBalance->
GetXYZcg()(eX));
355 socket->Append(MassBalance->
GetXYZcg()(eY));
356 socket->Append(MassBalance->
GetXYZcg()(eZ));
360 socket->Append(radtodeg*Propagate->
GetEuler(ePhi));
361 socket->Append(radtodeg*Propagate->
GetEuler(eTht));
362 socket->Append(radtodeg*Propagate->
GetEuler(ePsi));
363 socket->Append(Auxiliary->Getalpha(inDegrees));
364 socket->Append(Auxiliary->Getbeta(inDegrees));
370 if (scratch.length() != 0) socket->Append(scratch);
372 if (SubSystems &
ssFCS) {
374 if (scratch.length() != 0) socket->Append(scratch);
377 socket->Append(GroundReactions->GetGroundReactionValues(
","));
380 socket->Append(Propulsion->GetPropulsionValues(
","));
383 for (
unsigned int i=0;i<OutputParameters.size();++i) {
384 socket->Append(OutputParameters[i]->GetValue());
396 if (socket == 0)
return;
399 asciiData = string(
"<STATUS>") + out_str;
400 socket->Append(asciiData.c_str());