]> git.mxchange.org Git - flightgear.git/blobdiff - src/FDM/JSBSim/models/FGOutput.h
Merge branch 'next' of gitorious.org:fg/flightgear into next
[flightgear.git] / src / FDM / JSBSim / models / FGOutput.h
index 8d3f00b9ed44aec2ac682c547840aa095cd7b60e..fe8ac1137e618010c9f3ebf7c2653c16a15a3d02 100644 (file)
@@ -4,7 +4,7 @@
  Author:       Jon Berndt
  Date started: 12/2/98
 
- ------------- Copyright (C) 1999  Jon S. Berndt (jsb@hal-pc.org) -------------
+ ------------- Copyright (C) 1999  Jon S. Berndt (jon@jsbsim.org) -------------
 
  This program is free software; you can redistribute it and/or modify it under
  the terms of the GNU Lesser General Public License as published by the Free Software
@@ -26,6 +26,7 @@
 HISTORY
 --------------------------------------------------------------------------------
 12/02/98   JSB   Created
+11/09/07   HDW   Added FlightGear Socket Interface
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 SENTRY
@@ -40,28 +41,17 @@ INCLUDES
 
 #include "FGModel.h"
 
-#ifdef FGFS
-#  include <simgear/compiler.h>
-#  include STL_IOSTREAM
-#  include STL_FSTREAM
-#else
-#  if defined(sgi) && !defined(__GNUC__) && (_COMPILER_VERSION < 740)
-#    include <iostream.h>
-#    include <fstream.h>
-#  else
-#    include <iostream>
-#    include <fstream>
-#  endif
-#endif
+#include <fstream>
 
-#include <input_output/FGfdmSocket.h>
-#include <input_output/FGXMLFileRead.h>
+#include "input_output/FGXMLFileRead.h"
+#include "input_output/net_fdm.hxx"
+#include "input_output/FGfdmSocket.h"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_OUTPUT "$Id$"
+#define ID_OUTPUT "$Id: FGOutput.h,v 1.25 2012/02/07 23:15:37 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -69,6 +59,8 @@ FORWARD DECLARATIONS
 
 namespace JSBSim {
 
+class FGfdmSocket;
+
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 CLASS DOCUMENTATION
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
@@ -77,23 +69,39 @@ CLASS DOCUMENTATION
     OUTPUT section definition
 
     The following specifies the way that JSBSim writes out data.
-
+<pre>
     NAME is the filename you want the output to go to
 
     TYPE can be:
-      CSV       Comma separated data. If a filename is supplied then the data
-                goes to that file. If COUT or cout is specified, the data goes
-                to stdout. If the filename is a null filename the data goes to
-                stdout, as well.
-      SOCKET    Will eventually send data to a socket output, where NAME
-                would then be the IP address of the machine the data should be
-                sent to. DON'T USE THIS YET!
-      TABULAR   Columnar data. NOT IMPLEMENTED YET!
-      TERMINAL  Output to terminal. NOT IMPLEMENTED YET!
-      NONE      Specifies to do nothing. THis setting makes it easy to turn on and
-                off the data output without having to mess with anything else.
-
-    The arguments that can be supplied, currently, are
+      CSV         Comma separated data. If a filename is supplied then the
+                  data goes to that file. If "COUT" or "cout" is specified, the
+                  data goes to stdout. If the filename is a null filename the
+                  data goes to stdout, as well.
+      SOCKET      Will eventually send data to a socket output, where NAME
+                  would then be the IP address of the machine the data should
+                  be sent to. DON'T USE THIS YET!
+      FLIGHTGEAR  A socket is created for sending binary data packets to
+                  an external instance of FlightGear for visuals.  Parameters
+                  defining the socket are given on the \<output> line.
+      TABULAR     Columnar data.
+      TERMINAL    Output to terminal. NOT IMPLEMENTED YET!
+      NONE        Specifies to do nothing. This setting makes it easy to turn on and
+                  off the data output without having to mess with anything else.
+
+      Examples:
+</pre>
+@code
+<output name="localhost" type="FLIGHTGEAR" port="5500" protocol="tcp" rate="10"/>
+@endcode
+@code
+<output name="B737_datalog.csv" type="CSV" rate="20">
+   <property> velocities/vc-kts </property>
+   <velocities> ON </velocities>
+</output>
+@endcode
+<br>
+<pre>
+    The arguments that can be supplied, currently, are:
 
     RATE_IN_HZ  An integer rate in times-per-second that the data is output. This
                 value may not be *exactly* what you want, due to the dependence
@@ -101,22 +109,22 @@ CLASS DOCUMENTATION
 
     The following parameters tell which subsystems of data to output:
 
-    SIMULATION       ON|OFF
-    ATMOSPHERE       ON|OFF
-    MASSPROPS        ON|OFF
-    AEROSURFACES     ON|OFF
-    RATES            ON|OFF
-    VELOCITIES       ON|OFF
-    FORCES           ON|OFF
-    MOMENTS          ON|OFF
-    POSITION         ON|OFF
-    COEFFICIENTS     ON|OFF
-    GROUND_REACTIONS ON|OFF
-    FCS              ON|OFF
-    PROPULSION       ON|OFF
-
+    simulation       ON|OFF
+    atmosphere       ON|OFF
+    massprops        ON|OFF
+    aerosurfaces     ON|OFF
+    rates            ON|OFF
+    velocities       ON|OFF
+    forces           ON|OFF
+    moments          ON|OFF
+    position         ON|OFF
+    coefficients     ON|OFF
+    ground_reactions ON|OFF
+    fcs              ON|OFF
+    propulsion       ON|OFF
+</pre>
     NOTE that Time is always output with the data.
-    @version $Id$
+    @version $Id: FGOutput.h,v 1.25 2012/02/07 23:15:37 bcoconni Exp $
  */
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -129,19 +137,39 @@ public:
   FGOutput(FGFDMExec*);
   ~FGOutput();
 
-  bool Run(void);
-
-  void DelimitedOutput(string);
+  bool InitModel(void);
+  /** Runs the Output model; called by the Executive
+      Can pass in a value indicating if the executive is directing the simulation to Hold.
+      @param Holding if true, the executive has been directed to hold the sim from 
+                     advancing time. Some models may ignore this flag, such as the Input
+                     model, which may need to be active to listen on a socket for the
+                     "Resume" command to be given.
+      @return false if no error */
+  bool Run(bool Holding);
+
+  void Print(void);
+  void DelimitedOutput(const std::string&);
   void SocketOutput(void);
-  void SocketStatusOutput(string);
-  void SetType(string);
+  void FlightGearSocketOutput(void);
+  void SocketStatusOutput(const std::string&);
+  void SocketDataFill(FGNetFDM* net);
+
+  void SetType(const std::string& type);
+  void SetProtocol(const std::string& protocol);
+  void SetPort(const std::string& port);
+  void SetStartNewFile(bool tt) {StartNewFile = tt;}
   void SetSubsystems(int tt) {SubSystems = tt;}
-  inline void Enable(void) { enabled = true; }
-  inline void Disable(void) { enabled = false; }
-  inline bool Toggle(void) {enabled = !enabled; return enabled;}
+  void SetOutputFileName(const std::string& fname) {Filename = fname;}
+  void SetDirectivesFile(const std::string& fname) {DirectivesFile = fname;}
+  void SetRate(double rt);
+  void Enable(void) { enabled = true; }
+  void Disable(void) { enabled = false; }
+  bool Toggle(void) {enabled = !enabled; return enabled;}
+
   bool Load(Element* el);
-  void SetOutputFileName(string fname) {Filename = fname;}
-  void SetDirectivesFile(string fname) {DirectivesFile = fname;}
+  bool Load(int subSystems, std::string protocol, std::string type, std::string port, 
+                            std::string name, double outRate,
+                            std::vector<FGPropertyManager *> & outputProperties);
   string GetOutputFileName(void) const {return Filename;}
 
   /// Subsystem types for specifying which will be output in the FDM data logging
@@ -154,21 +182,27 @@ public:
     /** Subsystem: Moments (= 32)            */ ssMoments         = 32,
     /** Subsystem: Atmosphere (= 64)         */ ssAtmosphere      = 64,
     /** Subsystem: Mass Properties (= 128)   */ ssMassProps       = 128,
-    /** Subsystem: Coefficients (= 256)      */ ssCoefficients    = 256,
+    /** Subsystem: Coefficients (= 256)      */ ssAeroFunctions    = 256,
     /** Subsystem: Propagate (= 512)         */ ssPropagate       = 512,
     /** Subsystem: Ground Reactions (= 1024) */ ssGroundReactions = 1024,
     /** Subsystem: FCS (= 2048)              */ ssFCS             = 2048,
     /** Subsystem: Propulsion (= 4096)       */ ssPropulsion      = 4096
   } subsystems;
 
+  FGNetFDM fgSockBuf;
+
 private:
-  enum {otNone, otCSV, otTab, otSocket, otTerminal, otUnknown} Type;
+  enum {otNone, otCSV, otTab, otSocket, otTerminal, otFlightGear, otUnknown} Type;
+  FGfdmSocket::ProtocolType Protocol;
   bool sFirstPass, dFirstPass, enabled;
   int SubSystems;
-  string output_file_name, delimeter, Filename, DirectivesFile;
-  ofstream datafile;
+  int runID_postfix;
+  bool StartNewFile;
+  std::string output_file_name, delimeter, BaseFilename, Filename, DirectivesFile;
+  std::string Port;
+  std::ofstream datafile;
   FGfdmSocket* socket;
-  vector <FGPropertyManager*> OutputProperties;
+  std::vector <FGPropertyManager*> OutputProperties;
 
   void Debug(int from);
 };