Sync. with JSBSim just in time for the official JSBSim release.
This commit is contained in:
parent
a56694f962
commit
aa63e65122
53 changed files with 1642 additions and 346 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
2
src/FDM/JSBSim/initialization/FGSimplexTrim.cpp
Normal file → Executable file
2
src/FDM/JSBSim/initialization/FGSimplexTrim.cpp
Normal file → Executable file
|
@ -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");
|
||||
|
|
266
src/FDM/JSBSim/input_output/FGInputSocket.cpp
Normal file
266
src/FDM/JSBSim/input_output/FGInputSocket.cpp
Normal file
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
99
src/FDM/JSBSim/input_output/FGInputSocket.h
Normal file
99
src/FDM/JSBSim/input_output/FGInputSocket.h
Normal file
|
@ -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
|
171
src/FDM/JSBSim/input_output/FGInputType.cpp
Normal file
171
src/FDM/JSBSim/input_output/FGInputType.cpp
Normal file
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
145
src/FDM/JSBSim/input_output/FGInputType.h
Normal file
145
src/FDM/JSBSim/input_output/FGInputType.h
Normal file
|
@ -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
|
|
@ -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";
|
||||
|
|
|
@ -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;
|
||||
|
|
2
src/FDM/JSBSim/input_output/FGPropertyManager.cpp
Normal file → Executable file
2
src/FDM/JSBSim/input_output/FGPropertyManager.cpp
Normal file → Executable file
|
@ -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+= "/";
|
||||
}
|
||||
|
|
168
src/FDM/JSBSim/input_output/FGUDPInputSocket.cpp
Normal file
168
src/FDM/JSBSim/input_output/FGUDPInputSocket.cpp
Normal file
|
@ -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]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
101
src/FDM/JSBSim/input_output/FGUDPInputSocket.h
Normal file
101
src/FDM/JSBSim/input_output/FGUDPInputSocket.h
Normal file
|
@ -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
|
147
src/FDM/JSBSim/input_output/FGUDPOutputSocket.cpp
Normal file
147
src/FDM/JSBSim/input_output/FGUDPOutputSocket.cpp
Normal file
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
106
src/FDM/JSBSim/input_output/FGUDPOutputSocket.h
Normal file
106
src/FDM/JSBSim/input_output/FGUDPOutputSocket.h
Normal file
|
@ -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
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
8
src/FDM/JSBSim/math/FGFunction.cpp
Normal file → Executable file
8
src/FDM/JSBSim/math/FGFunction.cpp
Normal file → Executable file
|
@ -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()) {
|
||||
|
|
6
src/FDM/JSBSim/math/FGModelFunctions.cpp
Normal file → Executable file
6
src/FDM/JSBSim/math/FGModelFunctions.cpp
Normal file → Executable file
|
@ -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);
|
||||
}
|
||||
|
|
4
src/FDM/JSBSim/math/FGNelderMead.cpp
Normal file → Executable file
4
src/FDM/JSBSim/math/FGNelderMead.cpp
Normal file → Executable file
|
@ -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;
|
||||
|
|
3
src/FDM/JSBSim/math/FGNelderMead.h
Normal file → Executable file
3
src/FDM/JSBSim/math/FGNelderMead.h
Normal file → Executable file
|
@ -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;
|
||||
|
|
14
src/FDM/JSBSim/math/FGStateSpace.cpp
Normal file → Executable file
14
src/FDM/JSBSim/math/FGStateSpace.cpp
Normal file → Executable file
|
@ -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++)
|
||||
{
|
||||
|
|
2
src/FDM/JSBSim/math/FGStateSpace.h
Normal file → Executable file
2
src/FDM/JSBSim/math/FGStateSpace.h
Normal file → Executable file
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
4
src/FDM/JSBSim/models/FGFCSChannel.h
Normal file → Executable file
4
src/FDM/JSBSim/models/FGFCSChannel.h
Normal file → Executable file
|
@ -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()) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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]
|
||||
|
|
310
src/FDM/JSBSim/models/FGInput.cpp
Normal file → Executable file
310
src/FDM/JSBSim/models/FGInput.cpp
Normal file → Executable file
|
@ -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;
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
FGXMLFileRead XMLFile;
|
||||
Element* document = XMLFile.LoadXMLDocument(fname);
|
||||
bool result = Load(document);
|
||||
|
||||
// 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;
|
||||
}
|
||||
if (!result)
|
||||
cerr << endl << "Aircraft input element has problems in file " << fname << endl;
|
||||
|
||||
port = int(element->GetAttributeValueAsNumber("port"));
|
||||
if (port == 0) {
|
||||
cerr << endl << "No port assigned in input element" << endl;
|
||||
} else {
|
||||
socket = new FGfdmSocket(port);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
Debug(2);
|
||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
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
|
||||
|
|
89
src/FDM/JSBSim/models/FGInput.h
Normal file → Executable file
89
src/FDM/JSBSim/models/FGInput.h
Normal file → Executable file
|
@ -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
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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")) {
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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;
|
||||
|
|
6
src/FDM/JSBSim/models/flight_control/FGAccelerometer.h
Normal file → Executable file
6
src/FDM/JSBSim/models/flight_control/FGAccelerometer.h
Normal file → Executable file
|
@ -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 $
|
||||
*/
|
||||
|
||||
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
|
|
@ -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;
|
||||
|
|
4
src/FDM/JSBSim/models/flight_control/FGDistributor.cpp
Normal file → Executable file
4
src/FDM/JSBSim/models/flight_control/FGDistributor.cpp
Normal file → Executable file
|
@ -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");
|
||||
|
|
6
src/FDM/JSBSim/models/flight_control/FGDistributor.h
Normal file → Executable file
6
src/FDM/JSBSim/models/flight_control/FGDistributor.h
Normal file → Executable file
|
@ -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(); }
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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;
|
||||
|
|
6
src/FDM/JSBSim/models/propulsion/FGTurboProp.h
Normal file → Executable file
6
src/FDM/JSBSim/models/propulsion/FGTurboProp.h
Normal file → Executable file
|
@ -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;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue