]> git.mxchange.org Git - flightgear.git/commitdiff
Sync. with JSBSim just in time for the official JSBSim release.
authorErik Hofman <erik@ehofman.com>
Thu, 2 Apr 2015 13:17:12 +0000 (15:17 +0200)
committerErik Hofman <erik@ehofman.com>
Thu, 2 Apr 2015 13:17:12 +0000 (15:17 +0200)
53 files changed:
src/FDM/JSBSim/CMakeLists.txt
src/FDM/JSBSim/FGFDMExec.cpp
src/FDM/JSBSim/initialization/FGInitialCondition.cpp
src/FDM/JSBSim/initialization/FGInitialCondition.h
src/FDM/JSBSim/initialization/FGSimplexTrim.cpp [changed mode: 0644->0755]
src/FDM/JSBSim/input_output/FGInputSocket.cpp [new file with mode: 0644]
src/FDM/JSBSim/input_output/FGInputSocket.h [new file with mode: 0644]
src/FDM/JSBSim/input_output/FGInputType.cpp [new file with mode: 0644]
src/FDM/JSBSim/input_output/FGInputType.h [new file with mode: 0644]
src/FDM/JSBSim/input_output/FGOutputType.cpp
src/FDM/JSBSim/input_output/FGOutputType.h
src/FDM/JSBSim/input_output/FGPropertyManager.cpp [changed mode: 0644->0755]
src/FDM/JSBSim/input_output/FGUDPInputSocket.cpp [new file with mode: 0644]
src/FDM/JSBSim/input_output/FGUDPInputSocket.h [new file with mode: 0644]
src/FDM/JSBSim/input_output/FGUDPOutputSocket.cpp [new file with mode: 0644]
src/FDM/JSBSim/input_output/FGUDPOutputSocket.h [new file with mode: 0644]
src/FDM/JSBSim/input_output/FGfdmSocket.cpp
src/FDM/JSBSim/input_output/FGfdmSocket.h
src/FDM/JSBSim/input_output/string_utilities.h
src/FDM/JSBSim/math/FGCondition.cpp
src/FDM/JSBSim/math/FGCondition.h
src/FDM/JSBSim/math/FGFunction.cpp [changed mode: 0644->0755]
src/FDM/JSBSim/math/FGModelFunctions.cpp [changed mode: 0644->0755]
src/FDM/JSBSim/math/FGNelderMead.cpp [changed mode: 0644->0755]
src/FDM/JSBSim/math/FGNelderMead.h [changed mode: 0644->0755]
src/FDM/JSBSim/math/FGStateSpace.cpp [changed mode: 0644->0755]
src/FDM/JSBSim/math/FGStateSpace.h [changed mode: 0644->0755]
src/FDM/JSBSim/models/FGAccelerations.cpp
src/FDM/JSBSim/models/FGBuoyantForces.cpp
src/FDM/JSBSim/models/FGExternalReactions.h
src/FDM/JSBSim/models/FGFCS.h
src/FDM/JSBSim/models/FGFCSChannel.h [changed mode: 0644->0755]
src/FDM/JSBSim/models/FGGasCell.cpp
src/FDM/JSBSim/models/FGGasCell.h
src/FDM/JSBSim/models/FGInput.cpp [changed mode: 0644->0755]
src/FDM/JSBSim/models/FGInput.h [changed mode: 0644->0755]
src/FDM/JSBSim/models/FGMassBalance.cpp
src/FDM/JSBSim/models/FGMassBalance.h
src/FDM/JSBSim/models/FGOutput.cpp
src/FDM/JSBSim/models/FGPropulsion.cpp
src/FDM/JSBSim/models/atmosphere/FGWinds.cpp
src/FDM/JSBSim/models/atmosphere/FGWinds.h
src/FDM/JSBSim/models/flight_control/FGAccelerometer.h [changed mode: 0644->0755]
src/FDM/JSBSim/models/flight_control/FGActuator.h
src/FDM/JSBSim/models/flight_control/FGDistributor.cpp [changed mode: 0644->0755]
src/FDM/JSBSim/models/flight_control/FGDistributor.h [changed mode: 0644->0755]
src/FDM/JSBSim/models/flight_control/FGKinemat.h
src/FDM/JSBSim/models/propulsion/FGElectric.h
src/FDM/JSBSim/models/propulsion/FGEngine.cpp
src/FDM/JSBSim/models/propulsion/FGEngine.h
src/FDM/JSBSim/models/propulsion/FGPiston.cpp
src/FDM/JSBSim/models/propulsion/FGPiston.h
src/FDM/JSBSim/models/propulsion/FGTurboProp.h [changed mode: 0644->0755]

index aaa91ec29e7a81c5dda5a2177d35de9d83c49683..32698ebbacd3c095baf08d888102b2e8ea259424 100644 (file)
@@ -20,9 +20,13 @@ set(HEADERS
     input_output/FGXMLElement.h
     input_output/net_fdm.hxx
     input_output/FGGroundCallback.h
+    input_output/FGInputType.h
+    input_output/FGInputSocket.h
+    input_output/FGUDPInputSocket.h
     input_output/FGOutputFG.h
     input_output/FGOutputFile.h
     input_output/FGOutputSocket.h
+    input_output/FGUDPOutputSocket.h
     input_output/FGOutputTextFile.h
     input_output/FGOutputType.h
     input_output/FGModelLoader.h
@@ -115,9 +119,13 @@ set(SOURCES
     input_output/FGXMLElement.cpp
     input_output/FGXMLParse.cpp
     input_output/FGfdmSocket.cpp
+    input_output/FGInputType.cpp
+    input_output/FGInputSocket.cpp
+    input_output/FGUDPInputSocket.cpp
     input_output/FGOutputFG.cpp
     input_output/FGOutputFile.cpp
     input_output/FGOutputSocket.cpp
+    input_output/FGUDPOutputSocket.cpp
     input_output/FGOutputTextFile.cpp
     input_output/FGOutputType.cpp
     input_output/FGModelLoader.cpp
index 0723b299982eb4d251aff56a0b164cd7bd40ceab..29d72e247b15156304434e4fbabf8163bb491974 100644 (file)
@@ -76,7 +76,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGFDMExec.cpp,v 1.170 2015/02/07 17:52:36 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGFDMExec.cpp,v 1.171 2015/02/15 12:03:21 bcoconni Exp $");
 IDENT(IdHdr,ID_FDMEXEC);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -232,7 +232,6 @@ FGFDMExec::~FGFDMExec()
     DeAllocate();
 
     delete instance;
-    SetGroundCallback(0);
 
     if (IdFDM == 0) { // Meaning this is no child FDM
       if(Root != 0) {
@@ -253,6 +252,8 @@ FGFDMExec::~FGFDMExec()
   ChildFDMList.clear();
 
   PropertyCatalog.clear();
+  
+  SetGroundCallback(0);
 
   if (FDMctr > 0) (*FDMctr)--;
 
@@ -315,8 +316,8 @@ bool FGFDMExec::Allocate(void)
 
   // Initialize models
   for (unsigned int i = 0; i < Models.size(); i++) {
-    // The Output model must not be initialized prior to IC loading
-    if (i == eOutput) continue;
+    // The Input/Output models must not be initialized prior to IC loading
+    if (i == eInput || i == eOutput) continue;
 
     LoadInputs(i);
     Models[i]->InitModel();
@@ -602,6 +603,7 @@ bool FGFDMExec::RunIC(void)
 {
   FGPropulsion* propulsion = (FGPropulsion*)Models[ePropulsion];
 
+  Models[eInput]->InitModel();
   Models[eOutput]->InitModel();
 
   SuspendIntegration(); // saves the integration rate, dt, then sets it to 0.0.
@@ -650,8 +652,8 @@ void FGFDMExec::ResetToInitialConditions(int mode)
   if (mode == 1) Output->SetStartNewOutput();
 
   for (unsigned int i = 0; i < Models.size(); i++) {
-    // The Output model will be initialized during the RunIC() execution
-    if (i == eOutput) continue;
+    // The Input/Output models will be initialized during the RunIC() execution
+    if (i == eInput || i == eOutput) continue;
 
     LoadInputs(i);
     Models[i]->InitModel();
@@ -866,14 +868,13 @@ bool FGFDMExec::LoadModel(const string& model, bool addModelToPath)
       cerr << endl << "No expected aerodynamics element was found in the aircraft config file." << endl;
     }
 
-    // Process the input element. This element is OPTIONAL.
+    // Process the input element. This element is OPTIONAL, and there may be more than one.
     element = document->FindElement("input");
-    if (element) {
-      result = ((FGInput*)Models[eInput])->Load(element);
-      if (!result) {
-        cerr << endl << "Aircraft input element has problems in file " << aircraftCfgFileName << endl;
-        return result;
-      }
+    while (element) {
+      if (!static_cast<FGInput*>(Models[eInput])->Load(element))
+        return false;
+
+      element = document->FindNextElement("input");
     }
 
     // Process the output element[s]. This element is OPTIONAL, and there may be
index b1b8f5d6323d4e6f65eb43f5fcbb15c9e7c38224..4fbac6f99f70adce7b46c650c31c72d24668e355 100644 (file)
@@ -66,7 +66,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGInitialCondition.cpp,v 1.98 2014/11/30 12:35:32 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGInitialCondition.cpp,v 1.99 2015/02/19 05:18:45 dpculp Exp $");
 IDENT(IdHdr,ID_INITIALCONDITION);
 
 //******************************************************************************
@@ -151,6 +151,7 @@ void FGInitialCondition::InitializeIC(void)
   lastSpeedSet = setvt;
   lastAltitudeSet = setasl;
   enginesRunning = 0;
+  needTrim = 0;
 }
 
 //******************************************************************************
@@ -990,6 +991,8 @@ bool FGInitialCondition::Load_v1(Element* document)
   {
     SetTargetNlfIC(document->FindElementValueAsNumber("targetNlf"));
   }
+  if (document->FindElement("trim"))
+    needTrim = document->FindElementValueAsNumber("trim");
 
   // Refer to Stevens and Lewis, 1.5-14a, pg. 49.
   // This is the rotation rate of the "Local" frame, expressed in the local frame.
index 273689e99f3f4788d2b524949eaa47253ffe52d8..1a11bf5d2b698a76ef189c0d43f781ca77eecf7e 100644 (file)
@@ -54,7 +54,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_INITIALCONDITION "$Id: FGInitialCondition.h,v 1.41 2014/05/01 18:32:54 bcoconni Exp $"
+#define ID_INITIALCONDITION "$Id: FGInitialCondition.h,v 1.43 2015/03/28 14:49:01 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -167,6 +167,7 @@ CLASS DOCUMENTATION
    - mach (mach)
    - vground (ground speed, ft/sec)
    - running (-1 for all engines, 0 for no engines, 1 ... n for specific engines)
+   - trim (0 for no trim, 1 for ground trim)
 
    <h3>Properties</h3>
    @property ic/vc-kts (read/write) Calibrated airspeed initial condition in knots
@@ -217,7 +218,7 @@ CLASS DOCUMENTATION
    @property ic/r-rad_sec (read/write) Yaw rate initial condition in radians/second
 
    @author Tony Peden
-   @version "$Id: FGInitialCondition.h,v 1.41 2014/05/01 18:32:54 bcoconni Exp $"
+   @version "$Id: FGInitialCondition.h,v 1.43 2015/03/28 14:49:01 bcoconni Exp $"
 */
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -656,7 +657,11 @@ public:
   /** Is an engine running ?
       @param index of the engine to be checked
       @return true if the engine is running. */
-  bool IsEngineRunning(unsigned int n) const { return (enginesRunning & (1 << n)); }
+  bool IsEngineRunning(unsigned int n) const { return (enginesRunning & (1 << n)) != 0; }
+  
+  /** Does initialization file call for trim ?
+      @return true if initialization file (version 1) called for trim. */
+  bool NeedTrim(void) const { return needTrim == 0 ? false : true; }
 
   void bind(FGPropertyManager* pm);
 
@@ -675,6 +680,7 @@ private:
   speedset lastSpeedSet;
   altitudeset lastAltitudeSet;
   unsigned int enginesRunning;
+  int needTrim;
 
   FGFDMExec *fdmex;
   FGAtmosphere* Atmosphere;
old mode 100644 (file)
new mode 100755 (executable)
index e1bec05..5aa104b
@@ -40,7 +40,7 @@ FGSimplexTrim::FGSimplexTrim(FGFDMExec * fdm, TrimMode mode)
     double abstol = node->GetDouble("trim/solver/abstol");
     double speed = node->GetDouble("trim/solver/speed"); // must be > 1, 2 typical
     double random = node->GetDouble("trim/solver/random");
-    int iterMax = node->GetDouble("trim/solver/iterMax");
+    int iterMax = node->GetInt("trim/solver/iterMax");
     bool showConvergence = node->GetBool("trim/solver/showConvergence");
     bool pause = node->GetBool("trim/solver/pause");
     bool showSimplex = node->GetBool("trim/solver/showSimplex");
diff --git a/src/FDM/JSBSim/input_output/FGInputSocket.cpp b/src/FDM/JSBSim/input_output/FGInputSocket.cpp
new file mode 100644 (file)
index 0000000..3eef238
--- /dev/null
@@ -0,0 +1,266 @@
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Module:       FGInputSocket.cpp
+ Author:       Paul Chavent
+ Date started: 01/20/15
+ Purpose:      Manage input of sim parameters to a socket
+ Called by:    FGInput
+
+ ------------- Copyright (C) 2015 Paul Chavent -------------
+
+ 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
+ Foundation; either version 2 of the License, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
+ details.
+
+ You should have received a copy of the GNU Lesser General Public License along with
+ this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ Place - Suite 330, Boston, MA  02111-1307, USA.
+
+ Further information about the GNU Lesser General Public License can also be found on
+ the world wide web at http://www.gnu.org.
+
+FUNCTIONAL DESCRIPTION
+--------------------------------------------------------------------------------
+This is the place where you create input routines to dump data for perusal
+later.
+
+HISTORY
+--------------------------------------------------------------------------------
+01/20/15   PC   Created
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+INCLUDES
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+#include <cstring>
+#include <cstdlib>
+#include <sstream>
+#include <iomanip>
+
+#include "FGInputSocket.h"
+#include "FGFDMExec.h"
+#include "models/FGAircraft.h"
+#include "input_output/FGXMLElement.h"
+
+using namespace std;
+
+namespace JSBSim {
+
+IDENT(IdSrc,"$Id");
+IDENT(IdHdr,ID_INPUTSOCKET);
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+CLASS IMPLEMENTATION
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+FGInputSocket::FGInputSocket(FGFDMExec* fdmex) :
+  FGInputType(fdmex),
+  socket(0)
+{
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+FGInputSocket::~FGInputSocket()
+{
+  delete socket;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+bool FGInputSocket::Load(Element* el)
+{
+  if (!FGInputType::Load(el))
+    return false;
+
+  SockPort = atoi(el->GetAttributeValue("port").c_str());
+
+  if (SockPort == 0) {
+    cerr << endl << "No port assigned in input element" << endl;
+    return false;
+  }
+
+  return true;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+bool FGInputSocket::InitModel(void)
+{
+  if (FGInputType::InitModel()) {
+    delete socket;
+    socket = new FGfdmSocket(SockPort);
+
+    if (socket == 0) return false;
+    if (!socket->GetConnectStatus()) return false;
+
+    return true;
+  }
+
+  return false;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+void FGInputSocket::Read(bool Holding)
+{
+  string line, token;
+  size_t start=0, string_start=0, string_end=0;
+  double value=0;
+  FGPropertyNode* node=0;
+
+  if (socket == 0) return;
+  if (!socket->GetConnectStatus()) return;
+
+  data = socket->Receive(); // get socket transmission if present
+
+  if (data.size() > 0) {
+    // parse lines
+    while (1) {
+      string_start = data.find_first_not_of("\r\n", start);
+      if (string_start == string::npos) break;
+      string_end = data.find_first_of("\r\n", string_start);
+      if (string_end == string::npos) break;
+      line = data.substr(string_start, string_end-string_start);
+      if (line.size() == 0) break;
+
+      // now parse individual line
+      vector <string> tokens = split(line,' ');
+
+      string command="", argument="", str_value="";
+      if (tokens.size() > 0) {
+        command = to_lower(tokens[0]);
+        if (tokens.size() > 1) {
+          argument = trim(tokens[1]);
+          if (tokens.size() > 2) {
+            str_value = trim(tokens[2]);
+          }
+        }
+      }
+
+      if (command == "set") {                   // SET PROPERTY
+
+        if (argument.size() == 0) {
+          socket->Reply("No property argument supplied.\n");
+          break;
+        }
+        try {
+          node = PropertyManager->GetNode(argument);
+        } catch(...) {
+          socket->Reply("Badly formed property query\n");
+          break;
+        }
+
+        if (node == 0) {
+          socket->Reply("Unknown property\n");
+          break;
+        } else if (!node->hasValue()) {
+          socket->Reply("Not a leaf property\n");
+          break;
+        } else {
+          value = atof(str_value.c_str());
+          node->setDoubleValue(value);
+        }
+        socket->Reply("");
+
+      } else if (command == "get") {             // GET PROPERTY
+
+        if (argument.size() == 0) {
+          socket->Reply("No property argument supplied.\n");
+          break;
+        }
+        try {
+          node = PropertyManager->GetNode(argument);
+        } catch(...) {
+          socket->Reply("Badly formed property query\n");
+          break;
+        }
+
+        if (node == 0) {
+          socket->Reply("Unknown property\n");
+          break;
+        } else if (!node->hasValue()) {
+          if (Holding) { // if holding can query property list
+            string query = FDMExec->QueryPropertyCatalog(argument);
+            socket->Reply(query);
+          } else {
+            socket->Reply("Must be in HOLD to search properties\n");
+          }
+        } else if (node > 0) {
+          ostringstream buf;
+          buf << argument << " = " << setw(12) << setprecision(6) << node->getDoubleValue() << endl;
+          socket->Reply(buf.str());
+        }
+
+      } else if (command == "hold") {                  // PAUSE
+
+        FDMExec->Hold();
+        socket->Reply("");
+
+      } else if (command == "resume") {             // RESUME
+
+        FDMExec->Resume();
+        socket->Reply("");
+
+      } else if (command == "iterate") {             // ITERATE
+
+        int argumentInt;
+        istringstream (argument) >> argumentInt;
+        if (argument.size() == 0) {
+          socket->Reply("No argument supplied for number of iterations.\n");
+          break;
+        }
+        if ( !(argumentInt > 0) ){
+          socket->Reply("Required argument must be a positive Integer.\n");
+          break;
+        }
+        FDMExec->EnableIncrementThenHold( argumentInt );
+        FDMExec->Resume();
+        socket->Reply("");
+
+      } else if (command == "quit") {                   // QUIT
+
+        // close the socket connection
+        socket->Reply("");
+        socket->Close();
+
+      } else if (command == "info") {                   // INFO
+
+        // get info about the sim run and/or aircraft, etc.
+        ostringstream info;
+        info << "JSBSim version: " << JSBSim_version << endl;
+        info << "Config File version: " << needed_cfg_version << endl;
+        info << "Aircraft simulated: " << FDMExec->GetAircraft()->GetAircraftName() << endl;
+        info << "Simulation time: " << setw(8) << setprecision(3) << FDMExec->GetSimTime() << endl;
+        socket->Reply(info.str());
+
+      } else if (command == "help") {                   // HELP
+
+        socket->Reply(
+        " JSBSim Server commands:\n\n"
+        "   get {property name}\n"
+        "   set {property name} {value}\n"
+        "   hold\n"
+        "   resume\n"
+        "   iterate {value}\n"
+        "   help\n"
+        "   quit\n"
+        "   info\n\n");
+
+      } else {
+        socket->Reply(string("Unknown command: ") +  token + string("\n"));
+      }
+
+      start = string_end;
+    }
+  }
+
+}
+
+}
diff --git a/src/FDM/JSBSim/input_output/FGInputSocket.h b/src/FDM/JSBSim/input_output/FGInputSocket.h
new file mode 100644 (file)
index 0000000..d079513
--- /dev/null
@@ -0,0 +1,99 @@
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Header:       FGInputSocket.h
+ Author:       Paul Chavent
+ Date started: 01/20/15
+
+ ------------- Copyright (C) 2015 Paul Chavent -------------
+
+ 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
+ Foundation; either version 2 of the License, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
+ details.
+
+ You should have received a copy of the GNU Lesser General Public License along with
+ this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ Place - Suite 330, Boston, MA  02111-1307, USA.
+
+ Further information about the GNU Lesser General Public License can also be found on
+ the world wide web at http://www.gnu.org.
+
+HISTORY
+--------------------------------------------------------------------------------
+20/01/15   PC    Created
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+SENTRY
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+#ifndef FGINPUTSOCKET_H
+#define FGINPUTSOCKET_H
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+INCLUDES
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+#include "FGInputType.h"
+#include "input_output/FGfdmSocket.h"
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+DEFINITIONS
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+#define ID_INPUTSOCKET "$Id: FGInputSocket.h,v 1.1 2015/02/15 12:04:32 bcoconni Exp $"
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+FORWARD DECLARATIONS
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+namespace JSBSim {
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+CLASS DOCUMENTATION
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+/** Implements the input from a socket. This class inputs data from a telnet
+    session. This is a leaf class.
+ */
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+CLASS DECLARATION
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+class FGInputSocket : public FGInputType
+{
+public:
+  /** Constructor. */
+  FGInputSocket(FGFDMExec* fdmex);
+
+  /** Destructor. */
+  ~FGInputSocket();
+
+  /** Init the input directives from an XML file.
+      @param element XML Element that is pointing to the input directives
+  */
+  bool Load(Element* el);
+
+  /** Initializes the instance. This method basically opens the socket to which
+      inputs will be directed.
+      @result true if the execution succeeded.
+   */
+  bool InitModel(void);
+
+  /// Generates the input.
+  void Read(bool Holding);
+
+protected:
+
+  unsigned int SockPort;
+  FGfdmSocket* socket;
+  std::string data;
+};
+}
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+#endif
diff --git a/src/FDM/JSBSim/input_output/FGInputType.cpp b/src/FDM/JSBSim/input_output/FGInputType.cpp
new file mode 100644 (file)
index 0000000..51a31ba
--- /dev/null
@@ -0,0 +1,171 @@
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Module:       FGInputType.cpp
+ Author:       Paul Chavent
+ Date started: 01/20/15
+ Purpose:      Manage input of sim parameters to file or stdout
+
+  ------------- Copyright (C) 2015 Paul Chavent -------------
+
+ 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
+ Foundation; either version 2 of the License, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
+ details.
+
+ You should have received a copy of the GNU Lesser General Public License along with
+ this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ Place - Suite 330, Boston, MA  02111-1307, USA.
+
+ Further information about the GNU Lesser General Public License can also be found on
+ the world wide web at http://www.gnu.org.
+
+FUNCTIONAL DESCRIPTION
+--------------------------------------------------------------------------------
+This is the place where you create input routines to dump data for perusal
+later.
+
+HISTORY
+--------------------------------------------------------------------------------
+01/20/15   PC    Created
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+INCLUDES
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+#include <ostream>
+
+#include "FGFDMExec.h"
+#include "FGInputType.h"
+#include "input_output/FGXMLElement.h"
+#include "input_output/FGPropertyManager.h"
+
+namespace JSBSim {
+
+IDENT(IdSrc,"$Id: FGInputType.cpp,v 1.2 2015/03/28 14:49:01 bcoconni Exp $");
+IDENT(IdHdr,ID_INPUTTYPE);
+
+using namespace std;
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+CLASS IMPLEMENTATION
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+FGInputType::FGInputType(FGFDMExec* fdmex) :
+  FGModel(fdmex),
+  enabled(true)
+{
+  Debug(0);
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+FGInputType::~FGInputType()
+{
+  Debug(1);
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+void FGInputType::SetIdx(unsigned int idx)
+{
+  InputIdx = idx;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+bool FGInputType::Load(Element* element)
+{
+  // Perform base class Load.
+  if(!FGModel::Load(element))
+    return false;
+
+  // no common attributes yet (see FGOutputType for example
+
+  // FIXME : PostLoad should be called in the most derived class ?
+  PostLoad(element, PropertyManager);
+
+  return true;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+bool FGInputType::InitModel(void)
+{
+  bool ret = FGModel::InitModel();
+
+  Debug(2);
+  return ret;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+bool FGInputType::Run(bool Holding)
+{
+  if (!enabled) return true;
+  if (FGModel::Run(Holding)) return true;
+  // if (Holding) return false;
+
+  RunPreFunctions();
+  Read(Holding);
+  RunPostFunctions();
+
+  Debug(4);
+
+  return false;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+//    The bitmasked value choices are as follows:
+//    unset: In this case (the default) JSBSim would only print
+//       out the normally expected messages, essentially echoing
+//       the config files as they are read. If the environment
+//       variable is not set, debug_lvl is set to 1 internally
+//    0: This requests JSBSim not to input any messages
+//       whatsoever.
+//    1: This value explicity requests the normal JSBSim
+//       startup messages
+//    2: This value asks for a message to be printed out when
+//       a class is instantiated
+//    4: When this value is set, a message is displayed when a
+//       FGModel object executes its Run() method
+//    8: When this value is set, various runtime state variables
+//       are printed out periodically
+//    16: When set various parameters are sanity checked and
+//       a message is printed out when they go out of bounds
+
+void FGInputType::Debug(int from)
+{
+  string scratch="";
+
+  if (debug_lvl <= 0) return;
+
+  if (debug_lvl & 1) { // Standard console startup message input
+    if (from == 0) { // Constructor
+
+    }
+    if (from == 2) {
+    }
+  }
+  if (debug_lvl & 2 ) { // Instantiation/Destruction notification
+    if (from == 0) cout << "Instantiated: FGInputType" << endl;
+    if (from == 1) cout << "Destroyed:    FGInputType" << endl;
+  }
+  if (debug_lvl & 4 ) { // Run() method entry print for FGModel-derived objects
+  }
+  if (debug_lvl & 8 ) { // Runtime state variables
+  }
+  if (debug_lvl & 16) { // Sanity checking
+  }
+  if (debug_lvl & 64) {
+    if (from == 0) { // Constructor
+      cout << IdSrc << endl;
+      cout << IdHdr << endl;
+    }
+  }
+}
+}
diff --git a/src/FDM/JSBSim/input_output/FGInputType.h b/src/FDM/JSBSim/input_output/FGInputType.h
new file mode 100644 (file)
index 0000000..40291f7
--- /dev/null
@@ -0,0 +1,145 @@
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Header:       FGInputType.h
+ Author:       Paul Chavent
+ Date started: 01/20/15
+
+ ------------- Copyright (C) 2015 Paul Chavent -------------
+
+ 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
+ Foundation; either version 2 of the License, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
+ details.
+
+ You should have received a copy of the GNU Lesser General Public License along with
+ this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ Place - Suite 330, Boston, MA  02111-1307, USA.
+
+ Further information about the GNU Lesser General Public License can also be found on
+ the world wide web at http://www.gnu.org.
+
+HISTORY
+--------------------------------------------------------------------------------
+01/20/15   PC    Created
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+SENTRY
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+#ifndef FGINPUTTYPE_H
+#define FGINPUTTYPE_H
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+INCLUDES
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+#include "models/FGModel.h"
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+DEFINITIONS
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+#define ID_INPUTTYPE "$Id: FGInputType.h,v 1.2 2015/03/28 14:49:01 bcoconni Exp $"
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+FORWARD DECLARATIONS
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+namespace JSBSim {
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+CLASS DOCUMENTATION
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+/** Abstract class to provide functions generic to all the input directives.
+    This class is used by the input manager FGInput to manage a list of
+    different input classes without needing to know the details of each one of
+    them. It also provides the functions that are common to all the input
+    classes.
+
+    The class inherits from FGModelFunctions so it is possible to define
+    functions that execute before or after the input is generated. Such
+    functions need to be tagged with a "pre" or "post" type attribute to denote
+    the sequence in which they should be executed.
+
+    The class mimics some functionalities of FGModel (methods InitModel(),
+    Run() and SetRate()). However it does not inherit from FGModel since it is
+    conceptually different from the model paradigm.
+ */
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+CLASS DECLARATION
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+class FGInputType : public FGModel
+{
+public:
+  /** Constructor (implement the FGModel interface).
+      @param fdmex a pointer to the parent executive object
+   */
+  FGInputType(FGFDMExec* fdmex);
+
+  /// Destructor
+  virtual ~FGInputType();
+
+  /** Set the idx for this output instance
+      @param idx ID of the output instance that is constructed
+   */
+  void SetIdx(unsigned int idx);
+
+  /** Init the input directives from an XML file (implement the FGModel interface).
+      @param element XML Element that is pointing to the input directives
+  */
+  virtual bool Load(Element* el);
+
+  /// Init the input model according to its configitation.
+  virtual bool InitModel(void);
+
+  /** Executes the input directives (implement the FGModel interface).
+      This method checks that the current time step matches the input
+      rate and calls the registered "pre" functions, the input
+      generation and finally the "post" functions.
+      @result false if no error.
+   */
+  bool Run(bool Holding);
+
+  /** Generate the input. This is a pure method so it must be implemented by
+      the classes that inherits from FGInputType. The Read name may not be
+      relevant to all inputs but it has been kept for backward compatibility.
+   */
+  virtual void Read(bool Holding) = 0;
+
+  /// Enables the output generation.
+  void Enable(void) { enabled = true; }
+  /// Disables the output generation.
+  void Disable(void) { enabled = false; }
+  /** Toggles the output generation.
+      @result the output generation status i.e. true if the output has been
+              enabled, false if the output has been disabled. */
+  bool Toggle(void) {enabled = !enabled; return enabled;}
+
+  /** Overwrites the name identifier under which the input will be read.
+      This method is taken into account if it is called before
+      FGFDMExec::RunIC() otherwise it is ignored until the next call to
+      SetStartNewInput().
+      @param name new name */
+  virtual void SetInputName(const std::string& name) { Name = name; }
+
+  /** Get the name identifier to which the input will be directed.
+      @result the name identifier.*/
+  virtual const std::string& GetInputName(void) const { return Name; }
+
+protected:
+  unsigned int InputIdx;
+  bool enabled;
+
+  void Debug(int from);
+};
+}
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+#endif
index 362f50b4d6275688d031f0479a31d0c153de27d3..67c48ac9be9cc4b182091dd1293b2f520f26b911 100644 (file)
@@ -46,7 +46,7 @@ INCLUDES
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGOutputType.cpp,v 1.11 2014/09/12 20:10:04 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGOutputType.cpp,v 1.12 2015/03/28 14:49:01 bcoconni Exp $");
 IDENT(IdHdr,ID_OUTPUTTYPE);
 
 using namespace std;
@@ -87,7 +87,7 @@ FGOutputType::~FGOutputType()
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-void FGOutputType::SetIdx(int idx)
+void FGOutputType::SetIdx(unsigned int idx)
 {
   typedef double (FGOutputType::*iOPMF)(void) const;
   string outputProp = CreateIndexedPropertyName("simulation/output", idx) + "/log_rate_hz";
index cbc63dc464396cde9ceb0ccbbf7a66eb0b0f1c0d..d9dd5590d4924012eb121d2df87eec2a560c85ef 100644 (file)
@@ -44,7 +44,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_OUTPUTTYPE "$Id: FGOutputType.h,v 1.5 2013/01/26 17:06:49 bcoconni Exp $"
+#define ID_OUTPUTTYPE "$Id: FGOutputType.h,v 1.6 2015/03/28 14:49:01 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -106,7 +106,7 @@ public:
   /** Set the idx for this output instance
       @param idx ID of the output instance that is constructed
    */
-  void SetIdx(int idx);
+  void SetIdx(unsigned int idx);
 
   /** Set the output rate for this output instances.
       @param rtHz new output rate in Hz */
@@ -194,7 +194,7 @@ public:
   } subsystems;
 
 protected:
-  int OutputIdx;
+  unsigned int OutputIdx;
   int SubSystems;
   std::vector <FGPropertyNode_ptr> OutputProperties;
   std::vector <std::string> OutputCaptions;
old mode 100644 (file)
new mode 100755 (executable)
index aed2f32..f35431b
@@ -155,7 +155,7 @@ string FGPropertyNode::GetFullyQualifiedName(void) const
     }
 
     string fqname="";
-    for(unsigned i=stack.size()-1;i>0;i--) {
+    for(size_t i=stack.size()-1;i>0;i--) {
       fqname+= stack[i];
       fqname+= "/";
     }
diff --git a/src/FDM/JSBSim/input_output/FGUDPInputSocket.cpp b/src/FDM/JSBSim/input_output/FGUDPInputSocket.cpp
new file mode 100644 (file)
index 0000000..3b7c8a4
--- /dev/null
@@ -0,0 +1,168 @@
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Module:       FGUDPInputSocket.cpp
+ Author:       Dave Culp
+ Date started: 02/19/15
+ Purpose:      Manage input of data from a UDP socket
+ Called by:    FGInput
+
+ ------------- Copyright (C) 2015 Dave Culp --------------
+
+ 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
+ Foundation; either version 2 of the License, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
+ details.
+
+ You should have received a copy of the GNU Lesser General Public License along with
+ this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ Place - Suite 330, Boston, MA  02111-1307, USA.
+
+ Further information about the GNU Lesser General Public License can also be found on
+ the world wide web at http://www.gnu.org.
+
+FUNCTIONAL DESCRIPTION
+--------------------------------------------------------------------------------
+This class establishes a UDP socket and reads data from it.
+
+HISTORY
+--------------------------------------------------------------------------------
+02/19/15   DC   Created
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+INCLUDES
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+#include <cstring>
+#include <cstdlib>
+#include <sstream>
+
+#include "FGUDPInputSocket.h"
+#include "FGFDMExec.h"
+#include "input_output/FGXMLElement.h"
+
+using namespace std;
+
+namespace JSBSim {
+
+IDENT(IdSrc,"$Id");
+IDENT(IdHdr,ID_UDPINPUTSOCKET);
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+CLASS IMPLEMENTATION
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+FGUDPInputSocket::FGUDPInputSocket(FGFDMExec* fdmex) :
+  FGInputType(fdmex),
+  socket(0)
+{
+  rate = 20;
+  SockPort = 5139;
+  oldTimeStamp = 0.0;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+FGUDPInputSocket::~FGUDPInputSocket()
+{
+  delete socket;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+bool FGUDPInputSocket::Load(Element* el)
+{
+  if (!FGInputType::Load(el))
+    return false;
+   
+  rate = atoi(el->GetAttributeValue("rate").c_str());
+  FGModel::SetRate(0.5 + 1.0/(FDMExec->GetDeltaT()*rate));
+   
+  SockPort = atoi(el->GetAttributeValue("port").c_str());
+  if (SockPort == 0) {
+    cerr << endl << "No port assigned in input element" << endl;
+    return false;
+  }
+  
+  Element *property_element = el->FindElement("property");
+
+  while (property_element) {
+    string property_str = property_element->GetDataLine();
+    FGPropertyNode* node = PropertyManager->GetNode(property_str);
+    if (!node) {
+      cerr << fgred << highint << endl << "  No property by the name "
+           << property_str << " can be found." << reset << endl;
+    } else {
+      InputProperties.push_back(node);
+    }
+    property_element = el->FindNextElement("property");
+  }
+
+  return true;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+bool FGUDPInputSocket::InitModel(void)
+{
+  if (FGInputType::InitModel()) {
+    delete socket;
+    socket = new FGfdmSocket(SockPort, FGfdmSocket::ptUDP, FGfdmSocket::dIN);
+
+    if (socket == 0) return false;
+    cout << "UDP input socket established on port " << SockPort << endl;
+    return true;
+  }
+
+  return false;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+void FGUDPInputSocket::Read(bool Holding)
+{
+
+  if (socket == 0) return;
+    
+  data = socket->Receive();
+  if (data.size() > 0) {
+  
+    vector<string> tokens;
+    stringstream ss(data);
+    string temp;
+    while (getline(ss, temp, ',')) {
+       tokens.push_back(temp);
+    }
+    
+    vector<double> values;
+  
+    for (unsigned int i=0; i<tokens.size(); i++) {
+      values.push_back( atof(tokens[i].c_str()) );
+     }
+     
+    if (values[0] < oldTimeStamp) {
+      return;
+    } else {
+      oldTimeStamp = values[0];
+    }
+     
+    // the zeroeth value is the time stamp 
+    if ((values.size() - 1) != InputProperties.size()) {
+      cerr << endl << "Mismatch between UDP input property and value counts." << endl;
+      return;
+    }
+    
+    for (unsigned int i=1; i<values.size(); i++) {
+      InputProperties[i-1]->setDoubleValue(values[i]);
+    }
+    
+  }
+  
+}
+
+}
diff --git a/src/FDM/JSBSim/input_output/FGUDPInputSocket.h b/src/FDM/JSBSim/input_output/FGUDPInputSocket.h
new file mode 100644 (file)
index 0000000..4cc3246
--- /dev/null
@@ -0,0 +1,101 @@
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Header:       FGUDPInputSocket.h
+ Author:       Dave Culp
+ Date started: 02/19/15
+
+ ------------- Copyright (C) 2015 David Culp -------------
+
+ 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
+ Foundation; either version 2 of the License, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
+ details.
+
+ You should have received a copy of the GNU Lesser General Public License along with
+ this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ Place - Suite 330, Boston, MA  02111-1307, USA.
+
+ Further information about the GNU Lesser General Public License can also be found on
+ the world wide web at http://www.gnu.org.
+
+HISTORY
+--------------------------------------------------------------------------------
+02/19/15   DC    Created
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+SENTRY
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+#ifndef FGUDPINPUTSOCKET_H
+#define FGUDPINPUTSOCKET_H
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+INCLUDES
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+#include "FGInputType.h"
+#include "input_output/FGfdmSocket.h"
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+DEFINITIONS
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+#define ID_UDPINPUTSOCKET ""
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+FORWARD DECLARATIONS
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+namespace JSBSim {
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+CLASS DOCUMENTATION
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+/** Implements a UDP input socket. 
+ */
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+CLASS DECLARATION
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+class FGUDPInputSocket : public FGInputType
+{
+public:
+  /** Constructor. */
+  FGUDPInputSocket(FGFDMExec* fdmex);
+
+  /** Destructor. */
+  ~FGUDPInputSocket();
+
+  /** Reads the property names from an XML file.
+      @param element The root XML Element of the input file.
+  */
+  bool Load(Element* el);
+
+  /** Initializes the instance. This method basically opens the socket to which
+      inputs will be directed.
+      @result true if the execution succeeded.
+   */
+  bool InitModel(void);
+
+  /// Reads the socket and updates properties accordingly.
+  void Read(bool Holding);
+
+protected:
+
+  int rate;
+  double oldTimeStamp;
+  std::vector<FGPropertyNode_ptr> InputProperties;
+  unsigned int SockPort;
+  FGfdmSocket* socket;
+  std::string data;
+};
+}
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+#endif
diff --git a/src/FDM/JSBSim/input_output/FGUDPOutputSocket.cpp b/src/FDM/JSBSim/input_output/FGUDPOutputSocket.cpp
new file mode 100644 (file)
index 0000000..056ea0c
--- /dev/null
@@ -0,0 +1,147 @@
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Module:       FGUDPOutputSocket.cpp
+ Author:       David Culp
+ Date started: 03/31/15
+ Purpose:      Manage output of property values to a UDP socket
+ Called by:    FGOutput
+
+ ------------- Copyright (C) 2015 David Culp ----------------
+
+ 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
+ Foundation; either version 2 of the License, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
+ details.
+
+ You should have received a copy of the GNU Lesser General Public License along with
+ this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ Place - Suite 330, Boston, MA  02111-1307, USA.
+
+ Further information about the GNU Lesser General Public License can also be found on
+ the world wide web at http://www.gnu.org.
+
+FUNCTIONAL DESCRIPTION
+--------------------------------------------------------------------------------
+This class sends comma-separated strings over a UDP socket.  The format is that required
+by the QtJSBSim application.
+
+HISTORY
+--------------------------------------------------------------------------------
+03/31/15   DC    Created
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+INCLUDES
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+#include <cstring>
+#include <cstdlib>
+
+#include "FGUDPOutputSocket.h"
+#include "FGFDMExec.h"
+#include "input_output/FGPropertyManager.h"
+#include "input_output/FGXMLElement.h"
+
+using namespace std;
+
+namespace JSBSim {
+
+IDENT(IdSrc,"$Id: FGUDPOutputSocket.cpp,v 1.1 2015/04/02 02:23:33 dpculp Exp $");
+IDENT(IdHdr,ID_UDPOUTPUTSOCKET);
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+CLASS IMPLEMENTATION
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+FGUDPOutputSocket::FGUDPOutputSocket(FGFDMExec* fdmex) :
+  FGOutputType(fdmex),
+  socket(0)
+{
+  FDMExec = fdmex;
+  PropertyManager = fdmex->GetPropertyManager();
+  root = PropertyManager->GetNode(); 
+  root->SetDouble("simulation/null", 0.0);
+  SockName = "localhost";
+  SockPort = 5138;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+FGUDPOutputSocket::~FGUDPOutputSocket()
+{
+  delete socket;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+bool FGUDPOutputSocket::Load(Element* el)
+{
+
+  Element *property_element = el->FindElement("property");
+
+  while (property_element) {
+    string caption="";
+    string property_str = property_element->GetDataLine();
+    FGPropertyNode* node = PropertyManager->GetNode(property_str);
+    if (!node) {
+      node = PropertyManager->GetNode("simulation/null");
+    }
+    OutputProperties.push_back(node);
+    property_element = el->FindNextElement("property");
+  }
+
+  double outRate = 1.0;
+  if (!el->GetAttributeValue("rate").empty()) {
+    outRate = el->GetAttributeValueAsNumber("rate");
+  }
+  SetRate(outRate);
+  
+  SockPort = atoi(el->GetAttributeValue("port").c_str());
+  if (SockPort == 0) {
+    cerr << endl << "No port assigned for output." << endl;
+    return false;
+  }
+
+  return true;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+bool FGUDPOutputSocket::InitModel(void)
+{
+  if (FGOutputType::InitModel()) {
+    delete socket;
+    socket = new FGfdmSocket(SockName, SockPort, FGfdmSocket::ptUDP);
+
+    if (socket == 0) return false;
+    if (!socket->GetConnectStatus()) return false;
+
+    return true;
+  }
+
+  return false;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+void FGUDPOutputSocket::Print(void)
+{
+
+  if (socket == 0) return;
+  if (!socket->GetConnectStatus()) return;
+
+  socket->Clear();
+  socket->Append(FDMExec->GetSimTime());
+
+  for (unsigned int i=0;i<OutputProperties.size();i++) {
+    socket->Append(OutputProperties[i]->getDoubleValue());
+  }
+
+  socket->Send();
+}
+
+}
diff --git a/src/FDM/JSBSim/input_output/FGUDPOutputSocket.h b/src/FDM/JSBSim/input_output/FGUDPOutputSocket.h
new file mode 100644 (file)
index 0000000..9be951e
--- /dev/null
@@ -0,0 +1,106 @@
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ Header:       FGOutputSocket.h
+ Author:       David Culp
+ Date started: 03/31/15
+
+ ------------- Copyright (C) 2015 David Culp ---------------
+
+ 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
+ Foundation; either version 2 of the License, or (at your option) any later
+ version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
+ details.
+
+ You should have received a copy of the GNU Lesser General Public License along with
+ this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ Place - Suite 330, Boston, MA  02111-1307, USA.
+
+ Further information about the GNU Lesser General Public License can also be found on
+ the world wide web at http://www.gnu.org.
+
+HISTORY
+--------------------------------------------------------------------------------
+03/31/15   DC    Created
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+SENTRY
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+#ifndef FGUDPOUTPUTSOCKET_H
+#define FGUDPOUTPUTSOCKET_H
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+INCLUDES
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+#include "FGOutputType.h"
+#include "input_output/FGPropertyManager.h"
+#include "input_output/FGfdmSocket.h"
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+DEFINITIONS
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+#define ID_UDPOUTPUTSOCKET "$Id: FGUDPOutputSocket.h,v 1.1 2015/04/02 02:23:33 dpculp Exp $"
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+FORWARD DECLARATIONS
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+namespace JSBSim {
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+CLASS DOCUMENTATION
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+/** Implements the output to a UDP socket. This class outputs data to a socket
+    in a comma-separated strings format. The first string represents a time
+    stamp, and each string thereafter is the value of a property.  If a
+    specified property does not exist, then a zero is sent, so that the
+    number of values sent will always equal the number of properties requested. 
+ */
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+CLASS DECLARATION
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+class FGUDPOutputSocket : public FGOutputType
+{
+public:
+  /** Constructor. */
+  FGUDPOutputSocket(FGFDMExec* fdmex);
+
+  /** Destructor. */
+  ~FGUDPOutputSocket();
+
+  /** Init the output directives from an XML file.
+      @param element XML Element that is pointing to the output directives
+  */
+  virtual bool Load(Element* el);
+
+  /** Initializes the instance. This method opens the ouput socket.
+      @result true if the execution succeeded.
+   */
+  bool InitModel(void);
+  
+  /// Generates and sends the output datagram.
+  void Print(void);
+
+protected:
+
+  std::string SockName;
+  unsigned int SockPort;
+  FGfdmSocket* socket;
+  FGPropertyManager* PropertyManager;
+  FGPropertyNode* root;
+  FGFDMExec* FDMExec;
+};
+}
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+#endif
+
index 843fb75d5e7a528b6f690fbb32f9117ec70fcc2d..7ed90af21eb9b5df5e078d0c21d478110cafb16f 100644 (file)
@@ -38,6 +38,11 @@ HISTORY
 INCLUDES
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
+#if defined(_MSC_VER) || defined(__MINGW32__)
+#include <WS2tcpip.h>
+#else
+#include <fcntl.h>
+#endif
 #include <iostream>
 #include <iomanip>
 #include <cstring>
@@ -52,24 +57,35 @@ using std::string;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGfdmSocket.cpp,v 1.29 2014/01/13 10:46:03 ehofman Exp $");
+IDENT(IdSrc,"$Id: FGfdmSocket.cpp,v 1.31 2015/03/22 12:19:31 bcoconni Exp $");
 IDENT(IdHdr,ID_FDMSOCKET);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 CLASS IMPLEMENTATION
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
+#if defined(_MSC_VER) || defined(__MINGW32__)
+static bool LoadWinSockDLL(void)
+{
+  WSADATA wsaData;
+  if (WSAStartup(MAKEWORD(1, 1), &wsaData)) {
+       cout << "Winsock DLL not initialized ..." << endl;
+       return false;
+  }
+
+  cout << "Winsock DLL loaded ..." << endl;
+  return true;
+}
+#endif
+
 FGfdmSocket::FGfdmSocket(const string& address, int port, int protocol)
 {
   sckt = sckt_in = 0;
+  Protocol = (ProtocolType)protocol;
   connected = false;
 
   #if defined(_MSC_VER) || defined(__MINGW32__)
-    WSADATA wsaData;
-    int wsaReturnCode;
-    wsaReturnCode = WSAStartup(MAKEWORD(1,1), &wsaData);
-    if (wsaReturnCode == 0) cout << "Winsock DLL loaded ..." << endl;
-    else cout << "Winsock DLL not initialized ..." << endl;
+  if (!LoadWinSockDLL()) return;
   #endif
 
   if (!is_number(address)) {
@@ -109,23 +125,65 @@ FGfdmSocket::FGfdmSocket(const string& address, int port, int protocol)
     } else {          // unsuccessful
       cout << "Could not create socket for FDM output, error = " << errno << endl;
     }
+
   }
   Debug(0);
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+// assumes UDP socket on localhost, for inbound datagrams
+FGfdmSocket::FGfdmSocket(int port, int protocol, int direction) // assumes UDP
+{
+  sckt = -1;
+  connected = false;
+  Protocol = (ProtocolType)protocol;
+  Direction = (DirectionType) direction;
+#if defined(_MSC_VER) || defined(__MINGW32__)
+  if (!LoadWinSockDLL()) return;
+#endif
 
-FGfdmSocket::FGfdmSocket(const string& address, int port)
+  if (Protocol == ptUDP) {  //use udp protocol
+    sckt = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+#if defined(_MSC_VER) || defined(__MINGW32__)
+       u_long NonBlock = 1; // True
+       ioctlsocket(sckt, FIONBIO, &NonBlock);
+#else
+       fcntl(sckt, F_SETFL, O_NONBLOCK);
+#endif
+    cout << "Creating UDP input socket on port " << port << endl;
+  }
+  
+    if (sckt != -1) { 
+      memset(&scktName, 0, sizeof(struct sockaddr_in));
+      scktName.sin_family = AF_INET;
+      scktName.sin_port = htons(port);
+      scktName.sin_addr.s_addr = htonl(INADDR_ANY);
+      int len = sizeof(struct sockaddr_in);
+      if (bind(sckt, (struct sockaddr*)&scktName, len) != -1) { 
+        cout << "Successfully bound to UDP input socket on port " << port << endl <<endl;
+        connected = true;
+      } else {                // unsuccessful
+        cout << "Could not bind to UDP input socket, error = " << errno << endl;
+      }
+    } else {          // unsuccessful
+      cout << "Could not create socket for UDP input, error = " << errno << endl;
+    }
+    
+  
+  Debug(0);
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+FGfdmSocket::FGfdmSocket(const string& address, int port) // assumes TCP
 {
   sckt = sckt_in = 0;
   connected = false;
+  Protocol = ptTCP;
 
   #if defined(_MSC_VER) || defined(__MINGW32__)
-    WSADATA wsaData;
-    int wsaReturnCode;
-    wsaReturnCode = WSAStartup(MAKEWORD(1,1), &wsaData);
-    if (wsaReturnCode == 0) cout << "Winsock DLL loaded ..." << endl;
-    else cout << "Winsock DLL not initialized ..." << endl;
+  if (!LoadWinSockDLL()) return;
   #endif
 
   cout << "... Socket Configuration Sanity Check ..." << endl;
@@ -167,17 +225,14 @@ FGfdmSocket::FGfdmSocket(const string& address, int port)
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-FGfdmSocket::FGfdmSocket(int port)
+FGfdmSocket::FGfdmSocket(int port) // assumes TCP
 {
   connected = false;
   unsigned long NoBlock = true;
+  Protocol = ptTCP;
 
   #if defined(_MSC_VER) || defined(__MINGW32__)
-    WSADATA wsaData;
-    int wsaReturnCode;
-    wsaReturnCode = WSAStartup(MAKEWORD(1,1), &wsaData);
-    if (wsaReturnCode == 0) cout << "Winsock DLL loaded ..." << endl;
-    else cerr << "Winsock DLL not initialized ..." << endl;
+  if (!LoadWinSockDLL()) return;
   #endif
 
   sckt = socket(AF_INET, SOCK_STREAM, 0);
@@ -231,7 +286,7 @@ string FGfdmSocket::Receive(void)
   string data;      // todo: should allocate this with a standard size as a
                     // class attribute and pass as a reference?
 
-  if (sckt_in <= 0) {
+  if (sckt_in <= 0 && Protocol == ptTCP) {
     #if defined(_MSC_VER) || defined(__MINGW32__)
       sckt_in = accept(sckt, (struct sockaddr*)&scktName, &len);
     #else
@@ -265,7 +320,15 @@ string FGfdmSocket::Receive(void)
     }
 #endif
   }
-
+  
+  // this is for FGUDPInputSocket
+  if (sckt >= 0 && Protocol == ptUDP) {
+    struct sockaddr addr;
+    socklen_t fromlen = sizeof addr;
+    num_chars = recvfrom(sckt, buf, sizeof buf, 0, (struct sockaddr*)&addr, &fromlen);
+    if (num_chars != -1) data.append(buf, num_chars); 
+  }
+  
   return data;
 }
 
index 7090c6fc288eb52d67c9225b50002c47f277b53d..53a1dc641167bd446225f1854bd87df7b284f815 100644 (file)
@@ -65,7 +65,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_FDMSOCKET "$Id: FGfdmSocket.h,v 1.20 2010/10/15 11:30:28 jberndt Exp $"
+#define ID_FDMSOCKET "$Id: FGfdmSocket.h,v 1.23 2015/03/28 15:03:44 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -91,6 +91,7 @@ class FGfdmSocket : public FGJSBBase
 public:
   FGfdmSocket(const std::string&, int);
   FGfdmSocket(const std::string&, int, int);
+  FGfdmSocket(int, int, int);  
   FGfdmSocket(int);
   ~FGfdmSocket();
   void Send(void);
@@ -107,11 +108,15 @@ public:
   void Close(void);
   bool GetConnectStatus(void) {return connected;}
 
-  enum ProtocolType {ptUDP, ptTCP} ;
-
+  enum ProtocolType {ptUDP, ptTCP};
+  enum DirectionType {dIN, dOUT};
 private:
   int sckt;
   int sckt_in;
+  int udpsckt;
+  DirectionType Direction;
+  ProtocolType Protocol;
   struct sockaddr_in scktName;
   struct hostent *host;
   std::ostringstream buffer;
index 0a88f86236512c9eaf64b85617e2098d6e08c9cb..3b263b4c833f4830b1ddf345f3628ffa50622139 100644 (file)
@@ -49,7 +49,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_STRINGUTILS "$Id: string_utilities.h,v 1.21 2015/02/14 14:03:00 bcoconni Exp $"
+#define ID_STRINGUTILS "$Id: string_utilities.h,v 1.22 2015/03/28 14:49:01 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -196,10 +196,9 @@ CLASS DECLARATION
 
   string replace(string str, const string& oldstr, const string& newstr)
   {
-    int old_idx;
     string temp;
-    old_idx = str.find(oldstr);
-    if (old_idx >= 0) {
+    size_t old_idx = str.find(oldstr);
+    if (old_idx != string::npos) {
       temp = str.replace(old_idx, 1, newstr);
     }
     return temp;
index 34b2988270881c27fe26ee85434e20c1ac8bc4c0..0187c3f70c9f2f552ad601ef2451e874188296d9 100644 (file)
@@ -45,7 +45,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGCondition.cpp,v 1.20 2014/01/13 10:46:03 ehofman Exp $");
+IDENT(IdSrc,"$Id: FGCondition.cpp,v 1.21 2015/02/27 20:36:47 bcoconni Exp $");
 IDENT(IdHdr,ID_CONDITION);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -56,7 +56,7 @@ string FGCondition::indent = "        ";
 
 // This constructor is called when tests are inside an element
 FGCondition::FGCondition(Element* element, FGPropertyManager* PropertyManager) :
-  PropertyManager(PropertyManager), isGroup(true)
+  isGroup(true)
 {
   string property1, property2, logic;
   Element* condition_element;
@@ -101,7 +101,7 @@ FGCondition::FGCondition(Element* element, FGPropertyManager* PropertyManager) :
 // condition
 
 FGCondition::FGCondition(const string& test, FGPropertyManager* PropertyManager) :
-  PropertyManager(PropertyManager), isGroup(false)
+  isGroup(false)
 {
   string property1, property2, compare_string;
   vector <string> test_strings;
index 0d776357b5fd90325a260b43dbdc86eff3a463f1..f373b798358e3fd105f9f541d9dc43e82b494f7d 100644 (file)
@@ -44,7 +44,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_CONDITION "$Id: FGCondition.h,v 1.7 2012/10/27 20:29:01 jberndt Exp $"
+#define ID_CONDITION "$Id: FGCondition.h,v 1.8 2015/02/27 20:36:47 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -83,7 +83,7 @@ private:
   std::map <std::string, eComparison> mComparison;
   eLogic Logic;
 
-  FGPropertyManager *PropertyManager;
+  //FGPropertyManager *PropertyManager;
   FGPropertyValue *TestParam1, *TestParam2;
   double TestValue;
   eComparison Comparison;
old mode 100644 (file)
new mode 100755 (executable)
index 2aeef75..0b09b31
@@ -43,7 +43,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGFunction.cpp,v 1.55 2014/01/13 10:46:03 ehofman Exp $");
+IDENT(IdSrc,"$Id: FGFunction.cpp,v 1.57 2015/03/28 14:49:01 bcoconni Exp $");
 IDENT(IdHdr,ID_FUNCTION);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -543,9 +543,9 @@ double FGFunction::GetValue(void) const
     break;
   case eSwitch:
     {
-      unsigned int n = Parameters.size()-1;
+      size_t n = Parameters.size()-1;
       i = int(temp+0.5);
-      if (i >= 0u && i < n) {
+      if (i < n) {
         temp = Parameters[i+1]->GetValue();
       } else {
         throw(string("The switch function index selected a value above the range of supplied values"
@@ -555,7 +555,7 @@ double FGFunction::GetValue(void) const
     break;
   case eInterpolate1D:
     {
-      unsigned int sz = Parameters.size();
+      size_t sz = Parameters.size();
       if (temp <= Parameters[1]->GetValue()) {
         temp = Parameters[2]->GetValue();
       } else if (temp >= Parameters[sz-2]->GetValue()) {
old mode 100644 (file)
new mode 100755 (executable)
index f82ef0c..a3626b4
@@ -49,7 +49,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGModelFunctions.cpp,v 1.14 2014/05/30 17:26:42 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGModelFunctions.cpp,v 1.15 2015/03/28 14:49:01 bcoconni Exp $");
 IDENT(IdHdr,ID_MODELFUNCTIONS);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -123,7 +123,7 @@ void FGModelFunctions::PostLoad(Element* el, FGPropertyManager* PM, string prefi
 
 void FGModelFunctions::RunPreFunctions(void)
 {
-  unsigned int sz = PreFunctions.size();
+  size_t sz = PreFunctions.size();
   for (unsigned int i=0; i<sz; i++) {
     PreFunctions[i]->cacheValue(true);
   }
@@ -137,7 +137,7 @@ void FGModelFunctions::RunPreFunctions(void)
 
 void FGModelFunctions::RunPostFunctions(void)
 {
-  unsigned int sz = PostFunctions.size();
+  size_t sz = PostFunctions.size();
   for (unsigned int i=0; i<sz; i++) {
     PostFunctions[i]->cacheValue(true);
   }
old mode 100644 (file)
new mode 100755 (executable)
index 9484994..12e9860
@@ -85,7 +85,7 @@ void FGNelderMead::update()
         {
             m_cost[vertex] = eval(m_simplex[vertex]);   
         }
-        catch (const std::exception & e)
+        catch (...)
         {
             m_status = -1;
             throw;
@@ -238,7 +238,7 @@ void FGNelderMead::update()
         }
     }
 
-    catch (const std::exception & e)
+    catch (...)
     {
         m_status = -1;
         throw;
old mode 100644 (file)
new mode 100755 (executable)
index 474f1fb..c8db89a
@@ -65,7 +65,8 @@ private:
     double m_randomization;
     const std::vector<double> & m_lowerBound;
     const std::vector<double> & m_upperBound;
-    int m_nDim, m_nVert, m_iMax, m_iNextMax, m_iMin;
+    size_t m_nDim, m_nVert;
+    int m_iMax, m_iNextMax, m_iMin;
     std::vector< std::vector<double> > m_simplex;
     std::vector<double> m_cost;
     std::vector<double> m_elemSum;
old mode 100644 (file)
new mode 100755 (executable)
index 4da4c08..844601f
@@ -50,8 +50,8 @@ void FGStateSpace::linearize(
 void FGStateSpace::numericalJacobian(std::vector< std::vector<double> >  & J, ComponentVector & y,
                                      ComponentVector & x, const std::vector<double> & y0, const std::vector<double> & x0, double h, bool computeYDerivative)
 {
-    int nX = x.getSize();
-    int nY = y.getSize();
+    size_t nX = x.getSize();
+    size_t nY = y.getSize();
     double f1 = 0, f2 = 0, fn1 = 0, fn2 = 0;
     J.resize(nY);
     for (int iY=0;iY<nY;iY++)
@@ -141,13 +141,13 @@ std::ostream &operator<<( std::ostream &out, const FGStateSpace &ss )
 
 std::ostream &operator<<( std::ostream &out, const std::vector< std::vector<double> > &vec2d )
 {
-    int width = out.width();
-    int nI = vec2d.size();
+    std::streamsize width = out.width();
+    size_t nI = vec2d.size();
     out << std::left << std::setw(1) << "[" << std::right;
     for (int i=0;i<nI;i++)
     {
                //std::cout << "i: " << i << std::endl;
-        int nJ = vec2d[i].size();
+        size_t nJ = vec2d[i].size();
         for (int j=0;j<nJ;j++)
         {
                        //std::cout << "j: " << j << std::endl;
@@ -168,8 +168,8 @@ std::ostream &operator<<( std::ostream &out, const std::vector< std::vector<doub
 
 std::ostream &operator<<( std::ostream &out, const std::vector<double> &vec )
 {
-    int width = out.width();
-    int nI = vec.size();
+    std::streamsize width = out.width();
+    size_t nI = vec.size();
     out << std::left << std::setw(1) << "[" << std::right;
     for (int i=0;i<nI;i++)
     {
old mode 100644 (file)
new mode 100755 (executable)
index df4e7bd..c29fdf9
@@ -123,7 +123,7 @@ public:
             comp->setFdm(m_fdm);
             m_components.push_back(comp);
         }
-        int getSize() const
+        size_t getSize() const
         {
             return m_components.size();
         }
index bc5c71196da8b23605a53d3c3a2c7e6ca9ef5d9f..cdb01fcec3ec7cc886d43657757806d306a3ae52 100644 (file)
@@ -60,7 +60,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGAccelerations.cpp,v 1.19 2014/01/13 10:46:03 ehofman Exp $");
+IDENT(IdSrc,"$Id: FGAccelerations.cpp,v 1.22 2015/03/28 14:49:02 bcoconni Exp $");
 IDENT(IdHdr,ID_ACCELERATIONS);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -255,7 +255,7 @@ void FGAccelerations::ResolveFrictionForces(double dt)
   const FGMatrix33& Jinv = in.Jinv;
   FGColumnVector3 vdot, wdot;
   vector<LagrangeMultiplier*>& multipliers = *in.MultipliersList;
-  int n = multipliers.size();
+  size_t n = multipliers.size();
 
   vFrictionForces.InitMatrix();
   vFrictionMoments.InitMatrix();
@@ -267,13 +267,13 @@ void FGAccelerations::ResolveFrictionForces(double dt)
   vector<double> rhs(n);
 
   // Assemble the linear system of equations
-  for (int i=0; i < n; i++) {
+  for (unsigned int i=0; i < n; i++) {
     FGColumnVector3 v1 = invMass * multipliers[i]->ForceJacobian;
     FGColumnVector3 v2 = Jinv * multipliers[i]->MomentJacobian; // Should be J^-T but J is symmetric and so is J^-1
 
-    for (int j=0; j < i; j++)
+    for (unsigned int j=0; j < i; j++)
       a[i*n+j] = a[j*n+i]; // Takes advantage of the symmetry of Jac^T*M^-1*Jac
-    for (int j=i; j < n; j++)
+    for (unsigned int j=i; j < n; j++)
       a[i*n+j] = DotProduct(v1, multipliers[j]->ForceJacobian)
                + DotProduct(v2, multipliers[j]->MomentJacobian);
   }
index c1195b7b5d283eeb1c5b862cf9099c706915ffc8..4bdb6805316f0a72f13a7acab34041b75c2d0ddd 100644 (file)
@@ -47,7 +47,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGBuoyantForces.cpp,v 1.27 2014/06/09 11:52:07 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGBuoyantForces.cpp,v 1.30 2015/03/28 14:49:02 bcoconni Exp $");
 IDENT(IdHdr,ID_BUOYANTFORCES);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -170,7 +170,7 @@ const FGColumnVector3& FGBuoyantForces::GetGasMassMoment(void)
 
 const FGMatrix33& FGBuoyantForces::GetGasMassInertia(void)
 {
-  const unsigned int size = Cells.size();
+  size_t size = Cells.size();
   
   if (size == 0) return gasCellJ;
 
index d322817e878f2a898da8b040d7e456cd915ad74c..f5be3578fb42c32a0d1477a13a062ee6f2a4615a 100755 (executable)
@@ -46,7 +46,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_EXTERNALREACTIONS "$Id: FGExternalReactions.h,v 1.16 2014/11/25 01:42:27 dpculp Exp $"
+#define ID_EXTERNALREACTIONS "$Id: FGExternalReactions.h,v 1.17 2015/02/27 20:36:47 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -163,7 +163,7 @@ public:
 private:
 
   std::vector <FGExternalForce*> Forces;
-  unsigned int numForces;
+  //unsigned int numForces;
   FGColumnVector3 vTotalForces;
   FGColumnVector3 vTotalMoments;
 
index f55fc067e6ca471fb549268df91a49d38c14d681..f86c1d1b24a2c46615d8715e8d91eb44288ff9f8 100644 (file)
@@ -50,7 +50,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_FCS "$Id: FGFCS.h,v 1.46 2014/06/09 11:52:07 bcoconni Exp $"
+#define ID_FCS "$Id: FGFCS.h,v 1.47 2015/02/27 20:36:47 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -168,7 +168,7 @@ CLASS DOCUMENTATION
     @property gear/tailhook-pos-norm
 
     @author Jon S. Berndt
-    @version $Revision: 1.46 $
+    @version $Revision: 1.47 $
     @see FGActuator
     @see FGDeadBand
     @see FGFCSFunction
@@ -583,7 +583,7 @@ private:
   std::vector <bool> PropFeatherCmd;
   std::vector <bool> PropFeather;
   std::vector <double> SteerPosDeg;
-  double LeftBrake, RightBrake, CenterBrake; // Brake settings
+  //double LeftBrake, RightBrake, CenterBrake; // Brake settings
   std::vector <double> BrakePos; // left, center, right - defined by FGLGear:: enum
   double GearCmd,GearPos;
   double TailhookPos, WingFoldPos;
old mode 100644 (file)
new mode 100755 (executable)
index 6d9b440..e469593
@@ -44,7 +44,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_FCSCHANNEL "$Id: FGFCSChannel.h,v 1.4 2013/12/22 15:21:51 bcoconni Exp $"
+#define ID_FCSCHANNEL "$Id: FGFCSChannel.h,v 1.5 2015/03/28 14:49:02 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -85,7 +85,7 @@ public:
   /// Adds a component to a channel
   void Add(FGFCSComponent* comp) {FCSComponents.push_back(comp);}
   /// Returns the number of components in the channel.
-  unsigned int GetNumComponents() {return FCSComponents.size();}
+  size_t GetNumComponents() {return FCSComponents.size();}
   /// Retrieves a specific component.
   FGFCSComponent* GetComponent(unsigned int i) {
     if (i >= GetNumComponents()) {
index d4134464fcf3043f403e3dd025d776e7570b56be..e7f009b68d28043e87907ef7b20207ff53fd0c67 100644 (file)
@@ -50,7 +50,7 @@ using std::max;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGGasCell.cpp,v 1.21 2014/06/29 10:18:16 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGGasCell.cpp,v 1.22 2015/03/28 14:49:02 bcoconni Exp $");
 IDENT(IdHdr,ID_GASCELL);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -62,7 +62,8 @@ const double FGGasCell::M_air = 0.0019186;       // [slug/mol]
 const double FGGasCell::M_hydrogen = 0.00013841; // [slug/mol]
 const double FGGasCell::M_helium = 0.00027409;   // [slug/mol]
 
-FGGasCell::FGGasCell(FGFDMExec* exec, Element* el, int num, const struct Inputs& input)
+FGGasCell::FGGasCell(FGFDMExec* exec, Element* el, unsigned int num,
+                     const struct Inputs& input)
   : FGForce(exec), in(input)
 {
   string token;
@@ -268,7 +269,7 @@ void FGGasCell::Calculate(double dt)
   const double OldTemperature = Temperature;
   const double OldPressure    = Pressure;
   unsigned int i;
-  const unsigned int no_ballonets = Ballonet.size();
+  const size_t no_ballonets = Ballonet.size();
 
   //-- Read ballonet state --
   // NOTE: This model might need a more proper integration technique. 
@@ -504,7 +505,8 @@ const double FGBallonet::R = 3.4071;              // [lbs ft/(mol Rankine)]
 const double FGBallonet::M_air = 0.0019186;       // [slug/mol]
 const double FGBallonet::Cv_air = 5.0/2.0;        // [??]
 
-FGBallonet::FGBallonet(FGFDMExec* exec, Element* el, int num, FGGasCell* parent, const struct FGGasCell::Inputs& input)
+FGBallonet::FGBallonet(FGFDMExec* exec, Element* el, unsigned int num,
+                       FGGasCell* parent, const struct FGGasCell::Inputs& input)
   : in(input)
 {
   string token;
index abffb13fc691f9b0e7c1f1e6a8629f7b402c47c1..1105c4f9592ebf4c68a16b8d242a3a87acc8da82 100644 (file)
@@ -50,7 +50,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_GASCELL "$Id: FGGasCell.h,v 1.15 2014/06/29 10:18:16 bcoconni Exp $"
+#define ID_GASCELL "$Id: FGGasCell.h,v 1.16 2015/03/28 14:49:02 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -183,7 +183,8 @@ public:
       @param exec Executive a pointer to the parent executive object
       @param el   Pointer to configuration file XML node
       @param num  Gas cell index number. */
-  FGGasCell(FGFDMExec* exec, Element* el, int num, const struct Inputs& input);
+  FGGasCell(FGFDMExec* exec, Element* el, unsigned int num,
+            const struct Inputs& input);
   ~FGGasCell();
 
   /** Runs the gas cell model; called by BuoyantForces
@@ -236,7 +237,7 @@ private:
 
   GasType Type;
   std::string type;
-  int CellNum;
+  unsigned int CellNum;
   // Structural constants
   double MaxVolume;                 // [ft^3]
   double MaxOverpressure;           // [lbs/ft^2]
@@ -307,7 +308,8 @@ private:
 class FGBallonet : public FGJSBBase
 {
 public:
-  FGBallonet(FGFDMExec* exec, Element* el, int num, FGGasCell* parent, const struct FGGasCell::Inputs& input);
+  FGBallonet(FGFDMExec* exec, Element* el, unsigned int num, FGGasCell* parent,
+             const struct FGGasCell::Inputs& input);
   ~FGBallonet();
 
   /** Runs the ballonet model; called by FGGasCell
@@ -341,7 +343,7 @@ public:
   const struct FGGasCell::Inputs& in;
 
 private:
-  int CellNum;
+  unsigned int CellNum;
   // Structural constants
   double MaxVolume;                 // [ft^3]
   double MaxOverpressure;           // [lbs/ft^2]
old mode 100644 (file)
new mode 100755 (executable)
index 6b8c961..7994240
@@ -3,7 +3,7 @@
  Module:       FGInput.cpp
  Author:       Jon Berndt
  Date started: 12/02/98
- Purpose:      Manage output of sim parameters to file or stdout
+ Purpose:      Manage input of sim parameters from socket
  Called by:    FGSimExec
 
  ------------- Copyright (C) 1999  Jon S. Berndt (jon@jsbsim.org) -------------
@@ -39,21 +39,18 @@ INCLUDES
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
 #include "FGInput.h"
-#include "FGAircraft.h"
 #include "FGFDMExec.h"
-
-#include "input_output/FGfdmSocket.h"
+#include "input_output/FGInputSocket.h"
+#include "input_output/FGUDPInputSocket.h"
+#include "input_output/FGXMLFileRead.h"
 #include "input_output/FGXMLElement.h"
-
-#include <sstream>
-#include <iomanip>
-#include <cstdlib>
-
+#include "input_output/FGModelLoader.h"
 using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGInput.cpp,v 1.28 2014/01/13 10:46:07 ehofman Exp $");
+IDENT(IdSrc,"$Id: FGInput.cpp,v 1.32 2015/04/02 02:20:50 dpculp Exp $");
 IDENT(IdHdr,ID_INPUT);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -63,8 +60,6 @@ CLASS IMPLEMENTATION
 FGInput::FGInput(FGFDMExec* fdmex) : FGModel(fdmex)
 {
   Name = "FGInput";
-  socket = 0;
-  port = 0;
 
   Debug(0);
 }
@@ -73,210 +68,149 @@ FGInput::FGInput(FGFDMExec* fdmex) : FGModel(fdmex)
 
 FGInput::~FGInput()
 {
-  delete socket;
+  vector<FGInputType*>::iterator it;
+  for (it = InputTypes.begin(); it != InputTypes.end(); ++it)
+    delete (*it);
+
   Debug(1);
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
+bool FGInput::Load(Element* el)
+{
+  // Unlike the other FGModel classes, properties listed in the <input> section
+  // are not intended to create new properties. For that reason, FGInput
+  // cannot load its XML directives with FGModel::Load().
+  // Instead FGModelLoader::Open() and FGModel::PreLoad() must be explicitely
+  // called.
+  FGModelLoader ModelLoader(this);
+  Element* element = ModelLoader.Open(el);
+
+  if (!element) return false;
+  
+  FGModel::PreLoad(element, PropertyManager);
+
+  size_t idx = InputTypes.size();
+  string type = element->GetAttributeValue("type");
+  FGInputType* Input = 0;
+
+  if (debug_lvl > 0) cout << endl << "  Input data set: " << idx << "  " << endl;
+
+  type = to_upper(type);
+
+  if (type.empty() || type == "SOCKET") {
+    Input = new FGInputSocket(FDMExec);
+  } else if (type == "QTJSBSIM") {
+    Input = new FGUDPInputSocket(FDMExec);
+  } else if (type != string("NONE")) {
+    cerr << "Unknown type of input specified in config file" << endl;
+  }
+
+  if (!Input) return false;
+
+  Input->SetIdx(idx);
+  Input->Load(element);
+  PostLoad(element, PropertyManager);
+
+  InputTypes.push_back(Input);
+
+  Debug(2);
+  return true;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
 bool FGInput::InitModel(void)
 {
-  return FGModel::InitModel();
+  bool ret = false;
+
+  if (!FGModel::InitModel()) return false;
+
+  vector<FGInputType*>::iterator it;
+  for (it = InputTypes.begin(); it != InputTypes.end(); ++it)
+    ret &= (*it)->InitModel();
+
+  return ret;
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-//
-// This function handles accepting input commands from the socket interface.
-//
 
 bool FGInput::Run(bool Holding)
 {
-  string line, token;
-  size_t start=0, string_start=0, string_end=0;
-  double value=0;
-  FGPropertyNode* node=0;
-
-  if (FGModel::Run(Holding)) return true; // fast exit if nothing to do
-  if (port == 0) return false;      // Do nothing here if port not defined
-                                    // return false if no error
-  // This model DOES execute if "Exec->Holding"
-
-  RunPreFunctions();
-
-  data = socket->Receive(); // get socket transmission if present
-
-  if (data.size() > 0) {
-    // parse lines
-    while (1) {
-      string_start = data.find_first_not_of("\r\n", start);
-      if (string_start == string::npos) break;
-      string_end = data.find_first_of("\r\n", string_start);
-      if (string_end == string::npos) break;
-      line = data.substr(string_start, string_end-string_start);
-      if (line.size() == 0) break;
-
-      // now parse individual line
-      vector <string> tokens = split(line,' ');
-  
-      string command="", argument="", str_value="";
-      if (tokens.size() > 0) {
-        command = to_lower(tokens[0]);
-        if (tokens.size() > 1) {
-          argument = trim(tokens[1]);
-          if (tokens.size() > 2) {
-            str_value = trim(tokens[2]);
-          }
-        }
-      }
-
-      if (command == "set") {                   // SET PROPERTY
-
-        if (argument.size() == 0) {
-          socket->Reply("No property argument supplied.\n");
-          break;
-        }
-        try {
-          node = PropertyManager->GetNode(argument);
-        } catch(...) {
-          socket->Reply("Badly formed property query\n");
-          break;
-        }
-
-        if (node == 0) {
-          socket->Reply("Unknown property\n");
-          break;
-        } else if (!node->hasValue()) {
-          socket->Reply("Not a leaf property\n");
-          break;
-        } else {
-          value = atof(str_value.c_str());
-          node->setDoubleValue(value);
-        }
-        socket->Reply("");
-
-      } else if (command == "get") {             // GET PROPERTY
-
-        if (argument.size() == 0) {
-          socket->Reply("No property argument supplied.\n");
-          break;
-        }
-        try {
-          node = PropertyManager->GetNode(argument);
-        } catch(...) {
-          socket->Reply("Badly formed property query\n");
-          break;
-        }
-
-        if (node == 0) {
-          socket->Reply("Unknown property\n");
-          break;
-        } else if (!node->hasValue()) {
-          if (Holding) { // if holding can query property list
-            string query = FDMExec->QueryPropertyCatalog(argument);
-            socket->Reply(query);
-          } else {
-            socket->Reply("Must be in HOLD to search properties\n");
-          }
-        } else if (node > 0) {
-          ostringstream buf;
-          buf << argument << " = " << setw(12) << setprecision(6) << node->getDoubleValue() << endl;
-          socket->Reply(buf.str());
-        }
-
-      } else if (command == "hold") {                  // PAUSE
-
-        FDMExec->Hold();
-        socket->Reply("");
-
-      } else if (command == "resume") {             // RESUME
-
-        FDMExec->Resume();
-        socket->Reply("");
-       
-      } else if (command == "iterate") {             // ITERATE
-
-        int argumentInt;
-        istringstream (argument) >> argumentInt;
-        if (argument.size() == 0) {
-          socket->Reply("No argument supplied for number of iterations.\n");
-          break;
-        }
-        if ( !(argumentInt > 0) ){
-          socket->Reply("Required argument must be a positive Integer.\n");
-          break;
-        }
-        FDMExec->EnableIncrementThenHold( argumentInt );
-        FDMExec->Resume();
-        socket->Reply("");
-
-      } else if (command == "quit") {                   // QUIT
-
-        // close the socket connection
-        socket->Reply("");
-        socket->Close();
-
-      } else if (command == "info") {                   // INFO
-
-        // get info about the sim run and/or aircraft, etc.
-        ostringstream info;
-        info << "JSBSim version: " << JSBSim_version << endl;
-        info << "Config File version: " << needed_cfg_version << endl;
-        info << "Aircraft simulated: " << FDMExec->GetAircraft()->GetAircraftName() << endl;
-        info << "Simulation time: " << setw(8) << setprecision(3) << FDMExec->GetSimTime() << endl;
-        socket->Reply(info.str());
-
-      } else if (command == "help") {                   // HELP
-
-        socket->Reply(
-        " JSBSim Server commands:\n\n"
-        "   get {property name}\n"
-        "   set {property name} {value}\n"
-        "   hold\n"
-        "   resume\n"
-        "   iterate {value}\n"
-        "   help\n"
-        "   quit\n"
-        "   info\n\n");
-
-      } else {
-        socket->Reply(string("Unknown command: ") +  token + string("\n"));
-      }
-
-      start = string_end;
-    }
-  }
+  if (FGModel::Run(Holding)) return true;
 
-  RunPostFunctions();
+  vector<FGInputType*>::iterator it;
+  for (it = InputTypes.begin(); it != InputTypes.end(); ++it)
+    (*it)->Run(Holding);
 
   return false;
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-bool FGInput::Load(Element* element)
+bool FGInput::SetDirectivesFile(const std::string& fname)
 {
-  string type="", parameter="";
-  string name="", fname="";
-  string property;
-
-  // if the input has already been set up, print a warning message and return
-  if (port > 0) {
-    cerr << "An input port has already been assigned for this run" << endl;
-    return false;
-  }
+  FGXMLFileRead XMLFile;
+  Element* document = XMLFile.LoadXMLDocument(fname);
+  bool result = Load(document);
 
-  port = int(element->GetAttributeValueAsNumber("port"));
-  if (port == 0) {
-    cerr << endl << "No port assigned in input element" << endl;
-  } else {
-    socket = new FGfdmSocket(port);
-  }
+  if (!result)
+    cerr << endl << "Aircraft input element has problems in file " << fname << endl;
 
-  Debug(2);
+  return result;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+void FGInput::Enable(void)
+{
+  vector<FGInputType*>::iterator it;
+  for (it = InputTypes.begin(); it != InputTypes.end(); ++it)
+    (*it)->Enable();
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+void FGInput::Disable(void)
+{
+  vector<FGInputType*>::iterator it;
+  for (it = InputTypes.begin(); it != InputTypes.end(); ++it)
+    (*it)->Disable();
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+bool FGInput::Toggle(int idx)
+{
+  if (idx >= (int)0 && idx < (int)InputTypes.size())
+    return InputTypes[idx]->Toggle();
 
+  return false;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+bool FGInput::SetInputName(unsigned int idx, const std::string& name)
+{
+  if (idx >= InputTypes.size()) return false;
+
+  InputTypes[idx]->SetInputName(name);
   return true;
 }
 
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+string FGInput::GetInputName(unsigned int idx) const
+{
+  string name;
+
+  if (idx < InputTypes.size())
+    name = InputTypes[idx]->GetInputName();
+  return name;
+}
+
+
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 //    The bitmasked value choices are as follows:
 //    unset: In this case (the default) JSBSim would only print
old mode 100644 (file)
new mode 100755 (executable)
index 2421cda..e127bbe
@@ -26,6 +26,7 @@
 HISTORY
 --------------------------------------------------------------------------------
 12/02/98   JSB   Created
+19/01/15   PCH   Split the code in several classes (see input_output dir)
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 SENTRY
@@ -39,14 +40,13 @@ INCLUDES
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
 #include "FGModel.h"
-
-#include <string>
+#include "input_output/FGInputType.h"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_INPUT "$Id: FGInput.h,v 1.10 2012/11/17 19:42:53 bcoconni Exp $"
+#define ID_INPUT "$Id: FGInput.h,v 1.11 2015/02/15 12:03:21 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -54,15 +54,34 @@ FORWARD DECLARATIONS
 
 namespace JSBSim {
 
-class FGFDMExec;
-class Element;
-class FGfdmSocket;
-
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 CLASS DOCUMENTATION
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-/** Handles simulation socket input.
+/** Handles simulation input.
+    INPUT section definition
+
+    The following specifies the way that JSBSim writes out data.
+<pre>
+    NAME is the filename you want the input to come from
+
+    TYPE can be:
+      SOCKET      Will eventually send data to a socket input, where NAME
+                  would then be the IP address of the machine the data should
+                  be sent to. DON'T USE THIS YET!
+      NONE        Specifies to do nothing. This setting makes it easy to turn on and
+                  off the data input without having to mess with anything else.
+
+      Examples:
+</pre>
+@code
+<input type="SOCKET" port="4321"/>
+@endcode
+<br>
+
+    The class FGInput is the manager of the inputs requested by the user. It
+    manages a list of instances derived from the abstract class FGInputType.
+    @version $Id: FGInput.h,v 1.11 2015/02/15 12:03:21 bcoconni Exp $
  */
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -75,25 +94,67 @@ public:
   FGInput(FGFDMExec*);
   ~FGInput();
 
+  /** Load the input directives and adds a new input instance to the Input
+      Manager list.
+      @param el XMLElement that is pointing to the input directives
+      @result true if the execution succeeded. */
+  bool Load(Element* el);
+
+  /** Initializes the instance. This method is called by FGFDMExec::RunIC().
+      This is were the initialization of all classes derived from FGInputType
+      takes place. It is important that this method is not called prior
+      to FGFDMExec::RunIC() so that the initialization process can be executed
+      properly.
+      @result true if the execution succeeded. */
   bool InitModel(void);
+
   /** Runs the Input 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 
+      @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);
 
-  bool Load(Element* el);
+  /** Adds a new input instance to the Input Manager. The definition of the
+      new input instance is read from a file.
+      @param fname the name of the file from which the ouput directives should
+                   be read.
+      @return true if the execution succeeded. */
+  bool SetDirectivesFile(const std::string& fname);
+
+  /// Enables the input generation for all input instances.
+  void Enable(void);
+  /// Disables the input generation for all input instances.
+  void Disable(void);
+  /** Toggles the input generation for an ouput instances.
+      @param idx ID of the input instance which input generation will be
+                 toggled.
+      @result false if the instance does not exist otherwise returns the status
+              of the input generation (i.e. true if the input has been
+              enabled, false if the input has been disabled) */
+  bool Toggle(int idx);
+
+  /** Overwrites the name identifier under which the input will be logged.
+      This method is taken into account if it is called between Load() and
+      FGFDMExec::RunIC() otherwise it is ignored until the next call to
+      SetStartNewInput().
+      @param idx ID of the instance which name identifier will be changed
+      @param name new name
+      @result false if the instance does not exists. */
+  bool SetInputName(unsigned int idx, const std::string& name);
+  /** Get the name identifier to which the input will be directed.
+      @param idx ID of the input instance from which the name identifier must
+                 be obtained
+      @result the name identifier.*/
+  std::string GetInputName(unsigned int idx) const;
 
 private:
-  unsigned int port;
-  FGfdmSocket* socket;
-  std::string data;
+  std::vector<FGInputType*> InputTypes;
+
   void Debug(int from);
 };
 }
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 #endif
-
index 78e3e18bca1a0dcbe3e9502f6f2466d15316439c..dea17e0a836820515ed6793d7abcaa76414e6c84 100644 (file)
@@ -51,7 +51,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGMassBalance.cpp,v 1.52 2015/02/15 10:14:46 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGMassBalance.cpp,v 1.53 2015/03/28 14:49:02 bcoconni Exp $");
 IDENT(IdHdr,ID_MASSBALANCE);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -337,9 +337,8 @@ const FGColumnVector3& FGMassBalance::GetPointMassMoment(void)
 
 const FGMatrix33& FGMassBalance::CalculatePMInertias(void)
 {
-  unsigned int size;
+  size_t size = PointMasses.size();
 
-  size = PointMasses.size();
   if (size == 0) return pmJ;
 
   pmJ = FGMatrix33();
@@ -411,7 +410,8 @@ void FGMassBalance::bind(void)
 //
 // This function binds properties for each pointmass object created.
 //
-void FGMassBalance::PointMass::bind(FGPropertyManager* PropertyManager, int num) {
+void FGMassBalance::PointMass::bind(FGPropertyManager* PropertyManager,
+                                    unsigned int num) {
   string tmp = CreateIndexedPropertyName("inertia/pointmass-weight-lbs", num);
   PropertyManager->Tie( tmp.c_str(), this, &PointMass::GetPointMassWeight,
                                        &PointMass::SetPointMassWeight);
index d31943a2f38b9d716bf5396fb2ee537c87031d92..ca8f3b16c6659b54804e26f3faa9f88e69b893c1 100644 (file)
@@ -48,7 +48,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_MASSBALANCE "$Id: FGMassBalance.h,v 1.32 2014/11/29 13:47:19 bcoconni Exp $"
+#define ID_MASSBALANCE "$Id: FGMassBalance.h,v 1.35 2015/03/28 14:49:02 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONSS
@@ -270,7 +270,7 @@ private:
     void SetPointMassMoI(const FGMatrix33& MoI) { mPMInertia = MoI; }
     double GetPointMassMoI(int r, int c) {return mPMInertia(r,c);}
 
-    void bind(FGPropertyManager* PropertyManager, int num);
+    void bind(FGPropertyManager* PropertyManager, unsigned int num);
   };
 
   std::vector <struct PointMass*> PointMasses;
index 46a482d3d012c2c833226eb16415cf4afda68924..d5221ca9ecd18cc564c960f5232bdbfa48074a56 100644 (file)
@@ -44,6 +44,7 @@ INCLUDES
 #include "input_output/FGOutputSocket.h"
 #include "input_output/FGOutputTextFile.h"
 #include "input_output/FGOutputFG.h"
+#include "input_output/FGUDPOutputSocket.h"
 #include "input_output/FGXMLFileRead.h"
 #include "input_output/FGXMLElement.h"
 #include "input_output/FGModelLoader.h"
@@ -52,7 +53,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGOutput.cpp,v 1.80 2014/09/12 20:10:05 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGOutput.cpp,v 1.82 2015/04/02 02:20:50 dpculp Exp $");
 IDENT(IdHdr,ID_OUTPUT);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -213,7 +214,7 @@ bool FGOutput::Load(int subSystems, std::string protocol, std::string type,
                     std::string port, std::string name, double outRate,
                     std::vector<FGPropertyNode_ptr> & outputProperties)
 {
-  unsigned int idx = OutputTypes.size();
+  size_t idx = OutputTypes.size();
   FGOutputType* Output = 0;
 
   if (debug_lvl > 0) cout << endl << "  Output data set: " << idx << endl;
@@ -234,6 +235,9 @@ bool FGOutput::Load(int subSystems, std::string protocol, std::string type,
   } else if (type == "FLIGHTGEAR") {
     Output = new FGOutputFG(FDMExec);
     name += ":" + port + "/" + protocol;
+  } else if (type == "QTJSBSIM") {
+    Output = new FGUDPOutputSocket(FDMExec);
+    name += ":" + port + "/" + protocol;
   } else if (type == "TERMINAL") {
     // Not done yet
   } else if (type != string("NONE")) {
@@ -270,7 +274,7 @@ bool FGOutput::Load(Element* el)
 
   FGModel::PreLoad(element, PropertyManager);
 
-  unsigned int idx = OutputTypes.size();
+  size_t idx = OutputTypes.size();
   string type = element->GetAttributeValue("type");
   FGOutputType* Output = 0;
 
@@ -286,6 +290,8 @@ bool FGOutput::Load(Element* el)
     Output = new FGOutputSocket(FDMExec);
   } else if (type == "FLIGHTGEAR") {
     Output = new FGOutputFG(FDMExec);
+  } else if (type == "QTJSBSIM") {
+    Output = new FGUDPOutputSocket(FDMExec);
   } else if (type == "TERMINAL") {
     // Not done yet
   } else if (type != string("NONE")) {
index 0be86364d70e12790ba200ea6862fa1d37f930cb..9cbce745c4d5294bbadb9c5b176e5982e47ba9f0 100644 (file)
@@ -65,7 +65,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGPropulsion.cpp,v 1.83 2015/01/31 14:56:21 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGPropulsion.cpp,v 1.84 2015/03/28 14:49:02 bcoconni Exp $");
 IDENT(IdHdr,ID_PROPULSION);
 
 extern short debug_lvl;
@@ -570,9 +570,8 @@ double FGPropulsion::GetTanksWeight(void) const
 
 const FGMatrix33& FGPropulsion::CalculateTankInertias(void)
 {
-  unsigned int size;
+  size_t size = Tanks.size();
 
-  size = Tanks.size();
   if (size == 0) return tankJ;
 
   tankJ = FGMatrix33();
index dd4d1c2277966d338bd5b85967ea3edbb72166d9..3d4f0d2660792605c342fb47157c77def003381f 100644 (file)
@@ -51,7 +51,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGWinds.cpp,v 1.14 2014/09/03 17:40:59 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGWinds.cpp,v 1.15 2015/02/27 20:49:36 bcoconni Exp $");
 IDENT(IdHdr,ID_WINDS);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -61,6 +61,7 @@ CLASS IMPLEMENTATION
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 // square a value, but preserve the original sign
 
+/*
 static inline double square_signed (double value)
 {
     if (value < 0)
@@ -68,6 +69,7 @@ static inline double square_signed (double value)
     else
         return value * value;
 }
+*/
 
 /// simply square a value
 static inline double sqr(double x) { return x*x; }
index 522c497dc6f761dcdeb2b9177c4e3a5f5d3022e0..d30242c89a5a5223ab1b4f7dcb9ae359f3eb2f19 100644 (file)
@@ -47,7 +47,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_WINDS "$Id: FGWinds.h,v 1.10 2014/02/17 05:02:38 jberndt Exp $"
+#define ID_WINDS "$Id: FGWinds.h,v 1.11 2015/02/27 20:36:47 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -319,7 +319,7 @@ public:
 private:
 
   double MagnitudedAccelDt, MagnitudeAccel, Magnitude, TurbDirection;
-  double h;
+  //double h;
   double TurbGain;
   double TurbRate;
   double Rhythmicity;
old mode 100644 (file)
new mode 100755 (executable)
index 7b59bc1..07af37e
@@ -45,7 +45,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_ACCELEROMETER "$Id: FGAccelerometer.h,v 1.8 2013/12/07 12:21:14 bcoconni Exp $"
+#define ID_ACCELEROMETER "$Id: FGAccelerometer.h,v 1.9 2015/03/07 18:48:22 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -89,6 +89,7 @@ Syntax:
   <drift_rate> number </drift_rate>
   <gain> number </gain>
   <bias> number </bias>
+  <output> { output_property } </output>
 </accelerometer>
 @endcode
 
@@ -110,6 +111,7 @@ Example:
     <max> 400 </max>
   </quantization>
   <bias> 0.5 </bias>
+  <output> aero/accelerometer/right_tip_wing </output>
 </accelerometer>
 @endcode
 
@@ -124,7 +126,7 @@ even varying all the way from 0.95 to 1.05 in adjacent frames - whatever the del
 time.
 
 @author Jon S. Berndt
-@version $Revision: 1.8 $
+@version $Revision: 1.9 $
 */
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
index 9f9df8c494a22ac555a12b3655eae125a9413f4b..a75254c32eab18ec80579bb6639f443303b8b4ab 100644 (file)
@@ -43,7 +43,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_ACTUATOR "$Id: FGActuator.h,v 1.19 2014/08/28 13:44:28 bcoconni Exp $"
+#define ID_ACTUATOR "$Id: FGActuator.h,v 1.20 2015/02/27 20:36:47 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -119,7 +119,7 @@ Example:
 @endcode
 
 @author Jon S. Berndt
-@version $Revision: 1.19 $
+@version $Revision: 1.20 $
 */
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -154,7 +154,7 @@ public:
   bool IsSaturated(void) const {return saturated;}
   
 private:
-  double span;
+  //double span;
   double bias;
   FGParameter* rate_limit_incr;
   FGParameter* rate_limit_decr;
old mode 100644 (file)
new mode 100755 (executable)
index a136fa8..ac1959c
@@ -48,7 +48,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGDistributor.cpp,v 1.6 2014/02/17 05:33:25 jberndt Exp $");
+IDENT(IdSrc,"$Id: FGDistributor.cpp,v 1.7 2015/02/27 20:46:01 bcoconni Exp $");
 IDENT(IdHdr,ID_DISTRIBUTOR);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -75,7 +75,7 @@ FGDistributor::FGDistributor(FGFCS* fcs, Element* element) : FGFCSComponent(fcs,
 
   case_element = element->FindElement("case");
   while (case_element) {
-    current_case = new struct Case;
+    current_case = new Case;
     test_element = case_element->FindElement("test");
     if (test_element) current_case->SetTest(new FGCondition(test_element, PropertyManager));
     prop_val_element = case_element->FindElement("property");
old mode 100644 (file)
new mode 100755 (executable)
index 7946e37..0c4a895
@@ -49,7 +49,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_DISTRIBUTOR "$Id: FGDistributor.h,v 1.6 2014/02/17 05:33:25 jberndt Exp $"
+#define ID_DISTRIBUTOR "$Id: FGDistributor.h,v 1.7 2015/03/28 14:49:02 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -99,7 +99,7 @@ Here's an example:
 Note: In the "logic" attribute, "AND" is the default logic, if none is supplied.
 
 @author Jon S. Berndt
-@version $Id: FGDistributor.h,v 1.6 2014/02/17 05:33:25 jberndt Exp $
+@version $Id: FGDistributor.h,v 1.7 2015/03/28 14:49:02 bcoconni Exp $
 */
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -206,7 +206,7 @@ private:
       for (unsigned int i=0; i<PropValPairs.size(); i++) PropValPairs[i]->SetPropToValue();
     }
     PropValPair* GetPropValPair(unsigned int idx) { return PropValPairs[idx]; }
-    unsigned int GetNumPropValPairs(void) {return PropValPairs.size();}
+    size_t GetNumPropValPairs(void) {return PropValPairs.size();}
     bool HasTest() {return (Test != 0);}
     bool GetTestResult() { return Test->Evaluate(); }
 
index 93ae1ce762c9abafe22c2466042a196e3c0a9206..03b01ab475a3fc274b19ead98fd306299d3463a5 100644 (file)
@@ -44,7 +44,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_FLAPS "$Id: FGKinemat.h,v 1.10 2009/10/24 22:59:30 jberndt Exp $"
+#define ID_FLAPS "$Id: FGKinemat.h,v 1.11 2015/03/28 14:49:02 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -131,7 +131,7 @@ public:
 private:
   std::vector<double> Detents;
   std::vector<double> TransitionTimes;
-  int NumDetents;
+  size_t NumDetents;
   double OutputPct;
   bool  DoScale;
 
index fc4b064df2419eab876aae09f30d1900504bfd65..ec746ef872b83b53225825884c5075a9559b9bbc 100644 (file)
@@ -44,7 +44,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_ELECTRIC "$Id: FGElectric.h,v 1.12 2013/11/24 11:40:57 bcoconni Exp $"
+#define ID_ELECTRIC "$Id: FGElectric.h,v 1.14 2015/02/27 20:36:47 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -64,7 +64,7 @@ CLASS DOCUMENTATION
     there is no battery model available, so this motor does not consume any
     energy.  There is no internal friction.
     @author David Culp
-    @version "$Id: FGElectric.h,v 1.12 2013/11/24 11:40:57 bcoconni Exp $"
+    @version "$Id: FGElectric.h,v 1.14 2015/02/27 20:36:47 bcoconni Exp $"
   */
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -89,7 +89,7 @@ private:
 
   double CalcFuelNeed(void);
 
-  double BrakeHorsePower;
+  //double BrakeHorsePower;
 
   // constants
   double hptowatts;
index 39426dede131e83e7defc1f42f3924f0e55e1e72..b3257d148f8d8e95433150949b04a931e9a8ca52 100644 (file)
@@ -53,7 +53,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGEngine.cpp,v 1.61 2015/01/07 23:22:59 dpculp Exp $");
+IDENT(IdSrc,"$Id: FGEngine.cpp,v 1.62 2015/02/27 20:42:55 bcoconni Exp $");
 IDENT(IdHdr,ID_ENGINE);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -113,7 +113,7 @@ double FGEngine::CalcFuelNeed(void)
 
 unsigned int FGEngine::GetSourceTank(unsigned int i) const
 {
-  if (i >= 0 && i < SourceTanks.size()) {
+  if (i < SourceTanks.size()) {
     return SourceTanks[i];
   } else {
     throw("No such source tank is available for this engine");
index a88a1fc72acd292f5e90a43aa5fecfdb3ab71bfd..472798a254428a3aaf694a80068d212aa949c896 100644 (file)
@@ -53,7 +53,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_ENGINE "$Id: FGEngine.h,v 1.43 2015/01/07 23:22:59 dpculp Exp $"
+#define ID_ENGINE "$Id: FGEngine.h,v 1.44 2015/03/28 14:49:02 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -111,7 +111,7 @@ CLASS DOCUMENTATION
   documentation for engine and thruster classes.
 </pre>     
     @author Jon S. Berndt
-    @version $Id: FGEngine.h,v 1.43 2015/01/07 23:22:59 dpculp Exp $
+    @version $Id: FGEngine.h,v 1.44 2015/03/28 14:49:02 bcoconni Exp $
 */
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -212,7 +212,7 @@ public:
   FGThruster* GetThruster(void) const {return Thruster;}
 
   unsigned int GetSourceTank(unsigned int i) const;
-  unsigned int GetNumSourceTanks() const {return SourceTanks.size();}
+  size_t GetNumSourceTanks() const {return SourceTanks.size();}
 
   virtual std::string GetEngineLabels(const std::string& delimiter) = 0;
   virtual std::string GetEngineValues(const std::string& delimiter) = 0;
index 8a969c5faeb8e4c05deaf567c10859aed48f9f1e..f6de734195882c6624d671d2fc2b33c6002b9bee 100644 (file)
@@ -51,7 +51,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGPiston.cpp,v 1.78 2015/01/07 23:22:59 dpculp Exp $");
+IDENT(IdSrc,"$Id: FGPiston.cpp,v 1.79 2015/02/27 20:36:47 bcoconni Exp $");
 IDENT(IdHdr,ID_PISTON);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -61,7 +61,6 @@ CLASS IMPLEMENTATION
 FGPiston::FGPiston(FGFDMExec* exec, Element* el, int engine_number, struct Inputs& input)
   : FGEngine(exec, engine_number, input),
   R_air(287.3),                  // Gas constant for air J/Kg/K
-  rho_fuel(800),                 // estimate
   calorific_value_fuel(47.3e6),  // J/Kg
   Cp_air(1005),                  // Specific heat (constant pressure) J/Kg/K
   Cp_fuel(1700),
index 3f3ae89008801d34c2d69e48aecb8905395960ec..b23a51c29435e8e20cf31da51088ae79439a1299 100644 (file)
@@ -46,7 +46,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_PISTON "$Id: FGPiston.h,v 1.35 2012/04/07 01:50:54 jentron Exp $"
+#define ID_PISTON "$Id: FGPiston.h,v 1.37 2015/02/27 20:36:47 bcoconni Exp $"
 #define FG_MAX_BOOST_SPEEDS 3
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -211,7 +211,7 @@ boostspeed they refer to:
     @author David Megginson (initial porting and additional code)
     @author Ron Jensen (additional engine code)
     @see Taylor, Charles Fayette, "The Internal Combustion Engine in Theory and Practice"
-    @version $Id: FGPiston.h,v 1.35 2012/04/07 01:50:54 jentron Exp $
+    @version $Id: FGPiston.h,v 1.37 2015/02/27 20:36:47 bcoconni Exp $
   */
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -252,12 +252,12 @@ private:
   int crank_counter;
 
   double IndicatedHorsePower;
-  double IndicatedPower;
+  //double IndicatedPower;
   double PMEP;
   double FMEP;
   double FMEPDynamic;
   double FMEPStatic;
-  double T_Intake;
+  //double T_Intake;
 
   void doEngineStartup(void);
   void doBoostControl(void);
@@ -278,7 +278,7 @@ private:
   //
 
   const double R_air;
-  const double rho_fuel;    // kg/m^3
+  //const double rho_fuel;    // kg/m^3
   const double calorific_value_fuel;  // J/Kg (approximate)
   const double Cp_air;      // J/KgK
   const double Cp_fuel;     // J/KgK
@@ -293,7 +293,7 @@ private:
   //
   double MinManifoldPressure_inHg; // Inches Hg
   double MaxManifoldPressure_inHg; // Inches Hg
-  double MaxManifoldPressure_Percent; // MaxManifoldPressure / 29.92
+  //double MaxManifoldPressure_Percent; // MaxManifoldPressure / 29.92
   double ManifoldPressureLag;      // Manifold Pressure delay in seconds.
   double Displacement;             // cubic inches
   double displacement_SI;          // cubic meters
@@ -368,7 +368,7 @@ private:
   double rho_air;
   double volumetric_efficiency;
   double volumetric_efficiency_reduced;
-  double map_coefficient;
+  //double map_coefficient;
   double m_dot_air;
   double v_dot_air;
   double equivalence_ratio;
old mode 100644 (file)
new mode 100755 (executable)
index bb70f86..b41a35f
@@ -46,7 +46,7 @@ INCLUDES
 #include "FGEngine.h"
 #include "math/FGTable.h"
 
-#define ID_TURBOPROP "$Id: FGTurboProp.h,v 1.18 2013/11/24 14:22:22 bcoconni Exp $"
+#define ID_TURBOPROP "$Id: FGTurboProp.h,v 1.19 2015/02/27 20:36:48 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -190,8 +190,8 @@ private:
   double StarterN1;            // rotates of generator maked by starter [%]
   double MaxStartingTime;      // maximal time for start [s] (-1 means not used)
   double RPM;                  // shaft RPM
-  double Velocity;
-  double rho;
+  //double Velocity;
+  //double rho;
   double PSFC;                 // Power specific fuel comsumption [lb/(HP*hr)] at best efficiency
   double CombustionEfficiency;