1
0
Fork 0

Merge branch 'ehofman/jsbsim'

This commit is contained in:
Tim Moore 2009-11-26 23:31:59 +01:00
commit ad9366ed99
136 changed files with 2017 additions and 1649 deletions

View file

@ -43,29 +43,32 @@ INCLUDES
#include "FGFDMExec.h" #include "FGFDMExec.h"
#include "FGState.h" #include "FGState.h"
#include <models/FGAtmosphere.h> #include "models/FGAtmosphere.h"
#include <models/atmosphere/FGMSIS.h> #include "models/atmosphere/FGMSIS.h"
#include <models/atmosphere/FGMars.h> #include "models/atmosphere/FGMars.h"
#include <models/FGFCS.h> #include "models/FGFCS.h"
#include <models/FGPropulsion.h> #include "models/FGPropulsion.h"
#include <models/FGMassBalance.h> #include "models/FGMassBalance.h"
#include <models/FGGroundReactions.h> #include "models/FGGroundReactions.h"
#include <models/FGExternalReactions.h> #include "models/FGExternalReactions.h"
#include <models/FGBuoyantForces.h> #include "models/FGBuoyantForces.h"
#include <models/FGAerodynamics.h> #include "models/FGAerodynamics.h"
#include <models/FGInertial.h> #include "models/FGInertial.h"
#include <models/FGAircraft.h> #include "models/FGAircraft.h"
#include <models/FGPropagate.h> #include "models/FGPropagate.h"
#include <models/FGAuxiliary.h> #include "models/FGAuxiliary.h"
#include <models/FGInput.h> #include "models/FGInput.h"
#include <models/FGOutput.h> #include "models/FGOutput.h"
#include <initialization/FGInitialCondition.h> #include "initialization/FGInitialCondition.h"
//#include <initialization/FGTrimAnalysis.h> // Remove until later //#include "initialization/FGTrimAnalysis.h" // Remove until later
#include <input_output/FGPropertyManager.h> #include "input_output/FGPropertyManager.h"
#include <input_output/FGScript.h> #include "input_output/FGScript.h"
#include <iostream> #include <iostream>
#include <iterator> #include <iterator>
#include <cstdlib>
using namespace std;
namespace JSBSim { namespace JSBSim {
@ -713,13 +716,13 @@ void FGFDMExec::BuildPropertyCatalog(struct PropertyCatalogStructure* pcs)
{ {
struct PropertyCatalogStructure* pcsNew = new struct PropertyCatalogStructure; struct PropertyCatalogStructure* pcsNew = new struct PropertyCatalogStructure;
int node_idx = 0; int node_idx = 0;
char int_buf[10];
for (unsigned int i=0; i<pcs->node->nChildren(); i++) { for (int i=0; i<pcs->node->nChildren(); i++) {
pcsNew->base_string = pcs->base_string + "/" + pcs->node->getChild(i)->getName(); pcsNew->base_string = pcs->base_string + "/" + pcs->node->getChild(i)->getName();
node_idx = pcs->node->getChild(i)->getIndex(); node_idx = pcs->node->getChild(i)->getIndex();
sprintf(int_buf, "[%d]", node_idx); if (node_idx != 0) {
if (node_idx != 0) pcsNew->base_string += string(int_buf); pcsNew->base_string = CreateIndexedPropertyName(pcsNew->base_string, node_idx);
}
if (pcs->node->getChild(i)->nChildren() == 0) { if (pcs->node->getChild(i)->nChildren() == 0) {
if (pcsNew->base_string.substr(0,11) == string("/fdm/jsbsim")) { if (pcsNew->base_string.substr(0,11) == string("/fdm/jsbsim")) {
pcsNew->base_string = pcsNew->base_string.erase(0,12); pcsNew->base_string = pcsNew->base_string.erase(0,12);

View file

@ -41,17 +41,17 @@ SENTRY
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <models/FGModel.h> #include "models/FGModel.h"
#include <models/FGOutput.h> #include "models/FGOutput.h"
#include <models/FGInput.h> #include "models/FGInput.h"
#include <initialization/FGTrim.h> #include "initialization/FGTrim.h"
#include <initialization/FGInitialCondition.h> #include "initialization/FGInitialCondition.h"
#include <FGJSBBase.h> #include "FGJSBBase.h"
#include <input_output/FGPropertyManager.h> #include "input_output/FGPropertyManager.h"
#include <input_output/FGGroundCallback.h> #include "input_output/FGGroundCallback.h"
#include <input_output/FGXMLFileRead.h> #include "input_output/FGXMLFileRead.h"
#include <models/FGPropagate.h> #include "models/FGPropagate.h"
#include <math/FGColumnVector3.h> #include "math/FGColumnVector3.h"
#include <vector> #include <vector>
#include <string> #include <string>

View file

@ -39,6 +39,8 @@ INCLUDES
#include "FGJSBBase.h" #include "FGJSBBase.h"
#include <iostream> #include <iostream>
#include <sstream>
#include <cstdlib>
namespace JSBSim { namespace JSBSim {
@ -240,5 +242,43 @@ void FGJSBBase::disableHighLighting(void) {
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
string FGJSBBase::CreateIndexedPropertyName(const string& Property, int index)
{
std::ostringstream buf;
buf << Property << '[' << index << ']';
return buf.str();
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
double FGJSBBase::GaussianRandomNumber(void)
{
static double V1, V2, S;
static int phase = 0;
double X;
if (phase == 0) {
V1 = V2 = S = X = 0.0;
do {
double U1 = (double)rand() / RAND_MAX;
double U2 = (double)rand() / RAND_MAX;
V1 = 2 * U1 - 1;
V2 = 2 * U2 - 1;
S = V1 * V1 + V2 * V2;
} while(S >= 1 || S == 0);
X = V1 * sqrt(-2 * log(S) / S);
} else
X = V2 * sqrt(-2 * log(S) / S);
phase = 1 - phase;
return X;
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
} // namespace JSBSim } // namespace JSBSim

View file

@ -41,21 +41,22 @@ INCLUDES
#include <float.h> #include <float.h>
#include <queue> #include <queue>
#include <string> #include <string>
#include <sstream>
#include <cmath> #include <cmath>
#include <cstdlib>
#include "input_output/string_utilities.h" #include "input_output/string_utilities.h"
using std::fabs;
using std::string;
#ifndef M_PI #ifndef M_PI
# define M_PI 3.14159265358979323846 # define M_PI 3.14159265358979323846
#endif #endif
#if !defined(WIN32) || defined(__GNUC__) || (defined(_MSC_VER) && (_MSC_VER >= 1300)) #if defined(_MSC_VER) && (_MSC_VER < 1300)
using std::max; namespace std
{
template <class T> inline T max(const T& a, const T& b)
{
return (a > b) ? a : b;
}
}
#endif #endif
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -98,8 +99,8 @@ public:
public: public:
unsigned int fdmId; unsigned int fdmId;
unsigned int messageId; unsigned int messageId;
string text; std::string text;
string subsystem; std::string subsystem;
enum mType {eText, eInteger, eDouble, eBool} type; enum mType {eText, eInteger, eDouble, eBool} type;
bool bVal; bool bVal;
int iVal; int iVal;
@ -162,22 +163,22 @@ public:
/** Creates a message with the given text and places it on the queue. /** Creates a message with the given text and places it on the queue.
@param text message text @param text message text
@return pointer to a Message structure */ @return pointer to a Message structure */
void PutMessage(const string& text); void PutMessage(const std::string& text);
/** Creates a message with the given text and boolean value and places it on the queue. /** Creates a message with the given text and boolean value and places it on the queue.
@param text message text @param text message text
@param bVal boolean value associated with the message @param bVal boolean value associated with the message
@return pointer to a Message structure */ @return pointer to a Message structure */
void PutMessage(const string& text, bool bVal); void PutMessage(const std::string& text, bool bVal);
/** Creates a message with the given text and integer value and places it on the queue. /** Creates a message with the given text and integer value and places it on the queue.
@param text message text @param text message text
@param iVal integer value associated with the message @param iVal integer value associated with the message
@return pointer to a Message structure */ @return pointer to a Message structure */
void PutMessage(const string& text, int iVal); void PutMessage(const std::string& text, int iVal);
/** Creates a message with the given text and double value and places it on the queue. /** Creates a message with the given text and double value and places it on the queue.
@param text message text @param text message text
@param dVal double value associated with the message @param dVal double value associated with the message
@return pointer to a Message structure */ @return pointer to a Message structure */
void PutMessage(const string& text, double dVal); void PutMessage(const std::string& text, double dVal);
/** Reads the message on the queue (but does not delete it). /** Reads the message on the queue (but does not delete it).
@return 1 if some messages */ @return 1 if some messages */
int SomeMessages(void); int SomeMessages(void);
@ -192,7 +193,7 @@ public:
/** Returns the version number of JSBSim. /** Returns the version number of JSBSim.
* @return The version number of JSBSim. */ * @return The version number of JSBSim. */
string GetVersion(void) {return JSBSim_version;} std::string GetVersion(void) {return JSBSim_version;}
/// Disables highlighting in the console output. /// Disables highlighting in the console output.
void disableHighLighting(void); void disableHighLighting(void);
@ -268,7 +269,7 @@ public:
@return if the two values can be considered equal up to roundoff */ @return if the two values can be considered equal up to roundoff */
static bool EqualToRoundoff(double a, double b) { static bool EqualToRoundoff(double a, double b) {
double eps = 2.0*DBL_EPSILON; double eps = 2.0*DBL_EPSILON;
return fabs(a - b) <= eps*max(fabs(a), fabs(b)); return std::fabs(a - b) <= eps*std::max(std::fabs(a), std::fabs(b));
} }
/** Finite precision comparison. /** Finite precision comparison.
@ -277,7 +278,7 @@ public:
@return if the two values can be considered equal up to roundoff */ @return if the two values can be considered equal up to roundoff */
static bool EqualToRoundoff(float a, float b) { static bool EqualToRoundoff(float a, float b) {
float eps = 2.0*FLT_EPSILON; float eps = 2.0*FLT_EPSILON;
return fabs(a - b) <= eps*max(fabs(a), fabs(b)); return std::fabs(a - b) <= eps*std::max(std::fabs(a), std::fabs(b));
} }
/** Finite precision comparison. /** Finite precision comparison.
@ -331,44 +332,12 @@ protected:
static const double slugtolb; static const double slugtolb;
static const double kgtolb; static const double kgtolb;
static const double kgtoslug; static const double kgtoslug;
static const string needed_cfg_version; static const std::string needed_cfg_version;
static const string JSBSim_version; static const std::string JSBSim_version;
static string CreateIndexedPropertyName(string Property, int index) static std::string CreateIndexedPropertyName(const std::string& Property, int index);
{
std::stringstream str;
str << index;
string tmp;
str >> tmp;
return Property + "[" + tmp + "]";
}
static double GaussianRandomNumber(void) static double GaussianRandomNumber(void);
{
static double V1, V2, S;
static int phase = 0;
double X;
if (phase == 0) {
V1 = V2 = S = X = 0.0;
do {
double U1 = (double)rand() / RAND_MAX;
double U2 = (double)rand() / RAND_MAX;
V1 = 2 * U1 - 1;
V2 = 2 * U2 - 1;
S = V1 * V1 + V2 * V2;
} while(S >= 1 || S == 0);
X = V1 * sqrt(-2 * log(S) / S);
} else
X = V2 * sqrt(-2 * log(S) / S);
phase = 1 - phase;
return X;
}
public: public:
/// Moments L, M, N /// Moments L, M, N

View file

@ -37,9 +37,12 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <cmath> #include <cmath>
#include <iostream>
#include "FGState.h" #include "FGState.h"
using namespace std;
namespace JSBSim { namespace JSBSim {
static const char *IdSrc = "$Id$"; static const char *IdSrc = "$Id$";

View file

@ -45,18 +45,18 @@ INCLUDES
#include <string> #include <string>
#include <map> #include <map>
#include "FGJSBBase.h" #include "FGJSBBase.h"
#include <initialization/FGInitialCondition.h> #include "initialization/FGInitialCondition.h"
#include <math/FGColumnVector3.h> #include "math/FGColumnVector3.h"
#include <math/FGQuaternion.h> #include "math/FGQuaternion.h"
#include "FGFDMExec.h" #include "FGFDMExec.h"
#include <models/FGAtmosphere.h> #include "models/FGAtmosphere.h"
#include <models/FGFCS.h> #include "models/FGFCS.h"
#include <models/FGPropagate.h> #include "models/FGPropagate.h"
#include <models/FGAuxiliary.h> #include "models/FGAuxiliary.h"
#include <models/FGAerodynamics.h> #include "models/FGAerodynamics.h"
#include <models/FGAircraft.h> #include "models/FGAircraft.h"
#include <models/FGGroundReactions.h> #include "models/FGGroundReactions.h"
#include <models/FGPropulsion.h> #include "models/FGPropulsion.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS

View file

@ -258,6 +258,10 @@ FGJSBsim::FGJSBsim( double dt )
speedbrake_pos_pct->setDoubleValue(0); speedbrake_pos_pct->setDoubleValue(0);
spoilers_pos_pct->setDoubleValue(0); spoilers_pos_pct->setDoubleValue(0);
ab_brake_engaged = fgGetNode("/autopilot/autobrake/engaged", true);
ab_brake_left_pct = fgGetNode("/autopilot/autobrake/brake-left-output", true);
ab_brake_right_pct = fgGetNode("/autopilot/autobrake/brake-right-output", true);
temperature = fgGetNode("/environment/temperature-degc",true); temperature = fgGetNode("/environment/temperature-degc",true);
pressure = fgGetNode("/environment/pressure-inhg",true); pressure = fgGetNode("/environment/pressure-inhg",true);
density = fgGetNode("/environment/density-slugft3",true); density = fgGetNode("/environment/density-slugft3",true);
@ -542,8 +546,18 @@ bool FGJSBsim::copy_to_JSBsim()
// Parking brake sets minimum braking // Parking brake sets minimum braking
// level for mains. // level for mains.
double parking_brake = globals->get_controls()->get_brake_parking(); double parking_brake = globals->get_controls()->get_brake_parking();
FCS->SetLBrake(FMAX(globals->get_controls()->get_brake_left(), parking_brake)); double left_brake = globals->get_controls()->get_brake_left();
FCS->SetRBrake(FMAX(globals->get_controls()->get_brake_right(), parking_brake)); double right_brake = globals->get_controls()->get_brake_right();
if (ab_brake_engaged->getBoolValue()) {
left_brake = ab_brake_left_pct->getDoubleValue();
right_brake = ab_brake_right_pct->getDoubleValue();
}
FCS->SetLBrake(FMAX(left_brake, parking_brake));
FCS->SetRBrake(FMAX(right_brake, parking_brake));
FCS->SetCBrake( 0.0 ); FCS->SetCBrake( 0.0 );
// FCS->SetCBrake( globals->get_controls()->get_brake(2) ); // FCS->SetCBrake( globals->get_controls()->get_brake(2) );
@ -741,9 +755,7 @@ bool FGJSBsim::copy_from_JSBsim()
// Copy the engine values from JSBSim. // Copy the engine values from JSBSim.
for ( i=0; i < Propulsion->GetNumEngines(); i++ ) { for ( i=0; i < Propulsion->GetNumEngines(); i++ ) {
SGPropertyNode * node = fgGetNode("engines/engine", i, true); SGPropertyNode * node = fgGetNode("engines/engine", i, true);
char buf[30]; SGPropertyNode * tnode = node->getChild("thruster", 0, true);
sprintf(buf, "engines/engine[%d]/thruster", i);
SGPropertyNode * tnode = fgGetNode(buf, true);
FGThruster * thruster = Propulsion->GetEngine(i)->GetThruster(); FGThruster * thruster = Propulsion->GetEngine(i)->GetThruster();
switch (Propulsion->GetEngine(i)->GetType()) { switch (Propulsion->GetEngine(i)->GetType()) {

View file

@ -254,6 +254,10 @@ private:
SGPropertyNode_ptr speedbrake_pos_pct; SGPropertyNode_ptr speedbrake_pos_pct;
SGPropertyNode_ptr spoilers_pos_pct; SGPropertyNode_ptr spoilers_pos_pct;
SGPropertyNode_ptr ab_brake_engaged;
SGPropertyNode_ptr ab_brake_left_pct;
SGPropertyNode_ptr ab_brake_right_pct;
SGPropertyNode_ptr gear_pos_pct; SGPropertyNode_ptr gear_pos_pct;
SGPropertyNode_ptr wing_fold_pos_pct; SGPropertyNode_ptr wing_fold_pos_pct;
SGPropertyNode_ptr tailhook_pos_pct; SGPropertyNode_ptr tailhook_pos_pct;

View file

@ -43,16 +43,21 @@ INCLUDES
*******************************************************************************/ *******************************************************************************/
#include "FGInitialCondition.h" #include "FGInitialCondition.h"
#include <FGFDMExec.h> #include "FGFDMExec.h"
#include <models/FGInertial.h> #include "models/FGInertial.h"
#include <models/FGAtmosphere.h> #include "models/FGAtmosphere.h"
#include <models/FGAerodynamics.h> #include "models/FGAerodynamics.h"
#include <models/FGPropagate.h> #include "models/FGPropagate.h"
#include <input_output/FGPropertyManager.h> #include "input_output/FGPropertyManager.h"
#include <models/FGPropulsion.h> #include "input_output/FGXMLElement.h"
#include <input_output/FGXMLParse.h> #include "models/FGPropulsion.h"
#include <math/FGQuaternion.h> #include "input_output/FGXMLParse.h"
#include "math/FGQuaternion.h"
#include <iostream>
#include <fstream> #include <fstream>
#include <cstdlib>
using namespace std;
namespace JSBSim { namespace JSBSim {

View file

@ -47,10 +47,10 @@ SENTRY
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <FGFDMExec.h> #include "FGFDMExec.h"
#include <FGJSBBase.h> #include "FGJSBBase.h"
#include <math/FGColumnVector3.h> #include "math/FGColumnVector3.h"
#include <input_output/FGXMLFileRead.h> #include "input_output/FGXMLFileRead.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS

View file

@ -44,19 +44,21 @@ INCLUDES
#include <cstdlib> #include <cstdlib>
#include <iomanip> #include <iomanip>
#include "FGTrim.h" #include "FGTrim.h"
#include <models/FGAtmosphere.h> #include "models/FGAtmosphere.h"
#include "FGInitialCondition.h" #include "FGInitialCondition.h"
#include <models/FGAircraft.h> #include "models/FGAircraft.h"
#include <models/FGMassBalance.h> #include "models/FGMassBalance.h"
#include <models/FGGroundReactions.h> #include "models/FGGroundReactions.h"
#include <models/FGInertial.h> #include "models/FGInertial.h"
#include <models/FGAerodynamics.h> #include "models/FGAerodynamics.h"
#include <math/FGColumnVector3.h> #include "math/FGColumnVector3.h"
#if _MSC_VER #if _MSC_VER
#pragma warning (disable : 4786 4788) #pragma warning (disable : 4786 4788)
#endif #endif
using namespace std;
namespace JSBSim { namespace JSBSim {
static const char *IdSrc = "$Id$"; static const char *IdSrc = "$Id$";

View file

@ -38,13 +38,20 @@ INCLUDES
#include <string> #include <string>
#include <cstdlib> #include <cstdlib>
#include <FGFDMExec.h> #include <iomanip>
#include <models/FGAtmosphere.h> #include "FGFDMExec.h"
#include "models/FGAtmosphere.h"
#include "FGInitialCondition.h" #include "FGInitialCondition.h"
#include "FGTrimAxis.h" #include "FGTrimAxis.h"
#include <models/FGAircraft.h> #include "models/FGAircraft.h"
#include <models/FGPropulsion.h> #include "models/FGPropulsion.h"
#include <models/FGAerodynamics.h> #include "models/FGAerodynamics.h"
#include "models/FGFCS.h"
#include "models/propulsion/FGEngine.h"
#include "models/FGAuxiliary.h"
#include "models/FGGroundReactions.h"
using namespace std;
namespace JSBSim { namespace JSBSim {
@ -427,13 +434,11 @@ void FGTrimAxis::setThrottlesPct(void) {
/*****************************************************************************/ /*****************************************************************************/
void FGTrimAxis::AxisReport(void) { void FGTrimAxis::AxisReport(void) {
cout << " " << setw(20) << GetControlName() << ": ";
char out[80]; cout << setw(6) << setprecision(2) << GetControl()*control_convert << ' ';
cout << setw(5) << GetStateName() << ": ";
sprintf(out," %20s: %6.2f %5s: %9.2e Tolerance: %3.0e", cout << setw(9) << setprecision(2) << scientific << GetState()+state_target;
GetControlName().c_str(), GetControl()*control_convert, cout << " Tolerance: " << setw(3) << setprecision(0) << scientific << GetTolerance();
GetStateName().c_str(), GetState()+state_target, GetTolerance());
cout << out;
if( fabs(GetState()+state_target) < fabs(GetTolerance()) ) if( fabs(GetState()+state_target) < fabs(GetTolerance()) )
cout << " Passed" << endl; cout << " Passed" << endl;

View file

@ -31,8 +31,8 @@ HISTORY
SENTRY SENTRY
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <math/FGColumnVector3.h> #include "math/FGColumnVector3.h"
#include <math/FGLocation.h> #include "math/FGLocation.h"
#include "FGGroundCallback.h" #include "FGGroundCallback.h"
namespace JSBSim { namespace JSBSim {

View file

@ -38,8 +38,8 @@ SENTRY
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <math/FGColumnVector3.h> #include "math/FGColumnVector3.h"
#include <math/FGLocation.h> #include "math/FGLocation.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS

View file

@ -42,10 +42,9 @@ INCLUDES
#endif #endif
#include <string> #include <string>
#include <iostream> #include "simgear/props/props.hxx"
#include <simgear/props/props.hxx>
#if !PROPS_STANDALONE #if !PROPS_STANDALONE
# include <simgear/math/SGMath.hxx> # include "simgear/math/SGMath.hxx"
#endif #endif
#include "FGJSBBase.h" #include "FGJSBBase.h"
@ -60,8 +59,6 @@ DEFINITIONS
FORWARD DECLARATIONS FORWARD DECLARATIONS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
using namespace std;
namespace JSBSim { namespace JSBSim {
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -93,7 +90,7 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
* NOTE: this function changes its argument and thus relies * NOTE: this function changes its argument and thus relies
* on pass by value * on pass by value
*/ */
string mkPropertyName(string name, bool lowercase); std::string mkPropertyName(std::string name, bool lowercase);
/** /**
* Get a property node. * Get a property node.
@ -103,10 +100,10 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
* @return The node, or 0 if none exists and none was created. * @return The node, or 0 if none exists and none was created.
*/ */
FGPropertyManager* FGPropertyManager*
GetNode (const string &path, bool create = false); GetNode (const std::string &path, bool create = false);
FGPropertyManager* FGPropertyManager*
GetNode (const string &relpath, int index, bool create = false); GetNode (const std::string &relpath, int index, bool create = false);
/** /**
* Test whether a given node exists. * Test whether a given node exists.
@ -114,23 +111,23 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
* @param path The path of the node, relative to root. * @param path The path of the node, relative to root.
* @return true if the node exists, false otherwise. * @return true if the node exists, false otherwise.
*/ */
bool HasNode (const string &path); bool HasNode (const std::string &path);
/** /**
* Get the name of a node * Get the name of a node
*/ */
string GetName( void ); std::string GetName( void );
/** /**
* Get the name of a node without underscores, etc. * Get the name of a node without underscores, etc.
*/ */
string GetPrintableName( void ); std::string GetPrintableName( void );
/** /**
* Get the fully qualified name of a node * Get the fully qualified name of a node
* This function is very slow, so is probably useful for debugging only. * This function is very slow, so is probably useful for debugging only.
*/ */
string GetFullyQualifiedName(void); std::string GetFullyQualifiedName(void);
/** /**
* Get a bool value for a property. * Get a bool value for a property.
@ -146,7 +143,7 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
* does not exist. * does not exist.
* @return The property's value as a bool, or the default value provided. * @return The property's value as a bool, or the default value provided.
*/ */
bool GetBool (const string &name, bool defaultValue = false); bool GetBool (const std::string &name, bool defaultValue = false);
/** /**
@ -163,7 +160,7 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
* does not exist. * does not exist.
* @return The property's value as an int, or the default value provided. * @return The property's value as an int, or the default value provided.
*/ */
int GetInt (const string &name, int defaultValue = 0); int GetInt (const std::string &name, int defaultValue = 0);
/** /**
@ -180,7 +177,7 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
* does not exist. * does not exist.
* @return The property's value as a long, or the default value provided. * @return The property's value as a long, or the default value provided.
*/ */
int GetLong (const string &name, long defaultValue = 0L); int GetLong (const std::string &name, long defaultValue = 0L);
/** /**
@ -197,7 +194,7 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
* does not exist. * does not exist.
* @return The property's value as a float, or the default value provided. * @return The property's value as a float, or the default value provided.
*/ */
float GetFloat (const string &name, float defaultValue = 0.0); float GetFloat (const std::string &name, float defaultValue = 0.0);
/** /**
@ -214,7 +211,7 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
* does not exist. * does not exist.
* @return The property's value as a double, or the default value provided. * @return The property's value as a double, or the default value provided.
*/ */
double GetDouble (const string &name, double defaultValue = 0.0); double GetDouble (const std::string &name, double defaultValue = 0.0);
/** /**
@ -231,7 +228,7 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
* does not exist. * does not exist.
* @return The property's value as a string, or the default value provided. * @return The property's value as a string, or the default value provided.
*/ */
string GetString (const string &name, string defaultValue = ""); std::string GetString (const std::string &name, std::string defaultValue = "");
/** /**
@ -247,7 +244,7 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
* @param val The new value for the property. * @param val The new value for the property.
* @return true if the assignment succeeded, false otherwise. * @return true if the assignment succeeded, false otherwise.
*/ */
bool SetBool (const string &name, bool val); bool SetBool (const std::string &name, bool val);
/** /**
@ -263,7 +260,7 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
* @param val The new value for the property. * @param val The new value for the property.
* @return true if the assignment succeeded, false otherwise. * @return true if the assignment succeeded, false otherwise.
*/ */
bool SetInt (const string &name, int val); bool SetInt (const std::string &name, int val);
/** /**
@ -279,7 +276,7 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
* @param val The new value for the property. * @param val The new value for the property.
* @return true if the assignment succeeded, false otherwise. * @return true if the assignment succeeded, false otherwise.
*/ */
bool SetLong (const string &name, long val); bool SetLong (const std::string &name, long val);
/** /**
@ -295,7 +292,7 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
* @param val The new value for the property. * @param val The new value for the property.
* @return true if the assignment succeeded, false otherwise. * @return true if the assignment succeeded, false otherwise.
*/ */
bool SetFloat (const string &name, float val); bool SetFloat (const std::string &name, float val);
/** /**
@ -311,7 +308,7 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
* @param val The new value for the property. * @param val The new value for the property.
* @return true if the assignment succeeded, false otherwise. * @return true if the assignment succeeded, false otherwise.
*/ */
bool SetDouble (const string &name, double val); bool SetDouble (const std::string &name, double val);
/** /**
@ -327,7 +324,7 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
* @param val The new value for the property. * @param val The new value for the property.
* @return true if the assignment succeeded, false otherwise. * @return true if the assignment succeeded, false otherwise.
*/ */
bool SetString (const string &name, const string &val); bool SetString (const std::string &name, const std::string &val);
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
@ -347,7 +344,7 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
* @param name The property name. * @param name The property name.
* @param state The state of the archive attribute (defaults to true). * @param state The state of the archive attribute (defaults to true).
*/ */
void SetArchivable (const string &name, bool state = true); void SetArchivable (const std::string &name, bool state = true);
/** /**
@ -362,7 +359,7 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
* @param name The property name. * @param name The property name.
* @param state The state of the read attribute (defaults to true). * @param state The state of the read attribute (defaults to true).
*/ */
void SetReadable (const string &name, bool state = true); void SetReadable (const std::string &name, bool state = true);
/** /**
@ -377,7 +374,7 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
* @param name The property name. * @param name The property name.
* @param state The state of the write attribute (defaults to true). * @param state The state of the write attribute (defaults to true).
*/ */
void SetWritable (const string &name, bool state = true); void SetWritable (const std::string &name, bool state = true);
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
@ -391,7 +388,7 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
* Classes should use this function to release control of any * Classes should use this function to release control of any
* properties they are managing. * properties they are managing.
*/ */
void Untie (const string &name); void Untie (const std::string &name);
// Templates cause ambiguity here // Templates cause ambiguity here
@ -409,7 +406,7 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
* be modified; defaults to true. * be modified; defaults to true.
*/ */
void void
Tie (const string &name, bool *pointer, bool useDefault = true); Tie (const std::string &name, bool *pointer, bool useDefault = true);
/** /**
@ -425,7 +422,7 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
* be modified; defaults to true. * be modified; defaults to true.
*/ */
void void
Tie (const string &name, int *pointer, bool useDefault = true); Tie (const std::string &name, int *pointer, bool useDefault = true);
/** /**
@ -441,7 +438,7 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
* be modified; defaults to true. * be modified; defaults to true.
*/ */
void void
Tie (const string &name, long *pointer, bool useDefault = true); Tie (const std::string &name, long *pointer, bool useDefault = true);
/** /**
@ -457,7 +454,7 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
* be modified; defaults to true. * be modified; defaults to true.
*/ */
void void
Tie (const string &name, float *pointer, bool useDefault = true); Tie (const std::string &name, float *pointer, bool useDefault = true);
/** /**
* Tie a property to an external double variable. * Tie a property to an external double variable.
@ -472,7 +469,7 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
* be modified; defaults to true. * be modified; defaults to true.
*/ */
void void
Tie (const string &name, double *pointer, bool useDefault = true); Tie (const std::string &name, double *pointer, bool useDefault = true);
//============================================================================ //============================================================================
// //
@ -482,19 +479,19 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
//============================================================================ //============================================================================
/* template <class V> void /* template <class V> void
Tie (const string &name, V (*getter)(), void (*setter)(V) = 0, Tie (const std::string &name, V (*getter)(), void (*setter)(V) = 0,
bool useDefault = true); bool useDefault = true);
template <class V> void template <class V> void
Tie (const string &name, int index, V (*getter)(int), Tie (const std::string &name, int index, V (*getter)(int),
void (*setter)(int, V) = 0, bool useDefault = true); void (*setter)(int, V) = 0, bool useDefault = true);
template <class T, class V> void template <class T, class V> void
Tie (const string &name, T * obj, V (T::*getter)() const, Tie (const std::string &name, T * obj, V (T::*getter)() const,
void (T::*setter)(V) = 0, bool useDefault = true); void (T::*setter)(V) = 0, bool useDefault = true);
template <class T, class V> void template <class T, class V> void
Tie (const string &name, T * obj, int index, Tie (const std::string &name, T * obj, int index,
V (T::*getter)(int) const, void (T::*setter)(int, V) = 0, V (T::*getter)(int) const, void (T::*setter)(int, V) = 0,
bool useDefault = true); */ bool useDefault = true); */
@ -516,12 +513,12 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
*/ */
template <class V> inline void template <class V> inline void
Tie (const string &name, V (*getter)(), void (*setter)(V) = 0, bool useDefault = true) Tie (const std::string &name, V (*getter)(), void (*setter)(V) = 0, bool useDefault = true)
{ {
if (!tie(name.c_str(), SGRawValueFunctions<V>(getter, setter), useDefault)) if (!tie(name.c_str(), SGRawValueFunctions<V>(getter, setter), useDefault))
cout << "Failed to tie property " << name << " to functions" << endl; std::cout << "Failed to tie property " << name << " to functions" << std::endl;
else if (debug_lvl & 0x20) else if (debug_lvl & 0x20)
cout << name << endl; std::cout << name << std::endl;
} }
@ -543,13 +540,13 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
* property value should there be one; false if the old value should be * property value should there be one; false if the old value should be
* discarded; defaults to true. * discarded; defaults to true.
*/ */
template <class V> inline void Tie (const string &name, int index, V (*getter)(int), template <class V> inline void Tie (const std::string &name, int index, V (*getter)(int),
void (*setter)(int, V) = 0, bool useDefault = true) void (*setter)(int, V) = 0, bool useDefault = true)
{ {
if (!tie(name.c_str(), SGRawValueFunctionsIndexed<V>(index, getter, setter), useDefault)) if (!tie(name.c_str(), SGRawValueFunctionsIndexed<V>(index, getter, setter), useDefault))
cout << "Failed to tie property " << name << " to indexed functions" << endl; std::cout << "Failed to tie property " << name << " to indexed functions" << std::endl;
else if (debug_lvl & 0x20) else if (debug_lvl & 0x20)
cout << name << endl; std::cout << name << std::endl;
} }
@ -573,13 +570,13 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
* discarded; defaults to true. * discarded; defaults to true.
*/ */
template <class T, class V> inline void template <class T, class V> inline void
Tie (const string &name, T * obj, V (T::*getter)() const, Tie (const std::string &name, T * obj, V (T::*getter)() const,
void (T::*setter)(V) = 0, bool useDefault = true) void (T::*setter)(V) = 0, bool useDefault = true)
{ {
if (!tie(name.c_str(), SGRawValueMethods<T,V>(*obj, getter, setter), useDefault)) if (!tie(name.c_str(), SGRawValueMethods<T,V>(*obj, getter, setter), useDefault))
cout << "Failed to tie property " << name << " to object methods" << endl; std::cout << "Failed to tie property " << name << " to object methods" << std::endl;
else if (debug_lvl & 0x20) else if (debug_lvl & 0x20)
cout << name << endl; std::cout << name << std::endl;
} }
/** /**
@ -602,13 +599,13 @@ class FGPropertyManager : public SGPropertyNode, public FGJSBBase
* discarded; defaults to true. * discarded; defaults to true.
*/ */
template <class T, class V> inline void template <class T, class V> inline void
Tie (const string &name, T * obj, int index, V (T::*getter)(int) const, Tie (const std::string &name, T * obj, int index, V (T::*getter)(int) const,
void (T::*setter)(int, V) = 0, bool useDefault = true) void (T::*setter)(int, V) = 0, bool useDefault = true)
{ {
if (!tie(name.c_str(), SGRawValueMethodsIndexed<T,V>(*obj, index, getter, setter), useDefault)) if (!tie(name.c_str(), SGRawValueMethodsIndexed<T,V>(*obj, index, getter, setter), useDefault))
cout << "Failed to tie property " << name << " to indexed object methods" << endl; std::cout << "Failed to tie property " << name << " to indexed object methods" << std::endl;
else if (debug_lvl & 0x20) else if (debug_lvl & 0x20)
cout << name << endl; std::cout << name << std::endl;
} }
}; };
} }

View file

@ -42,10 +42,13 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGScript.h" #include "FGScript.h"
#include <input_output/FGXMLParse.h> #include "input_output/FGXMLParse.h"
#include <initialization/FGTrim.h> #include "initialization/FGTrim.h"
#include <iostream> #include <iostream>
#include <cstdlib>
using namespace std;
namespace JSBSim { namespace JSBSim {

View file

@ -40,10 +40,10 @@ INCLUDES
#include "FGJSBBase.h" #include "FGJSBBase.h"
#include "FGState.h" #include "FGState.h"
#include "FGFDMExec.h" #include "FGFDMExec.h"
#include <math/FGFunction.h> #include "math/FGFunction.h"
#include <math/FGCondition.h> #include "math/FGCondition.h"
#include <vector> #include <vector>
#include <input_output/FGXMLFileRead.h> #include "input_output/FGXMLFileRead.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS

View file

@ -32,6 +32,9 @@ INCLUDES
#include <cmath> #include <cmath>
#include <cstdlib> #include <cstdlib>
#include <iostream>
using namespace std;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FORWARD DECLARATIONS FORWARD DECLARATIONS
@ -42,159 +45,171 @@ namespace JSBSim {
static const char *IdSrc = "$Id$"; static const char *IdSrc = "$Id$";
static const char *IdHdr = ID_XMLELEMENT; static const char *IdHdr = ID_XMLELEMENT;
bool Element::converterIsInitialized = false;
map <string, map <string, double> > Element::convert;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS IMPLEMENTATION CLASS IMPLEMENTATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
Element::Element(string nm) Element::Element(const string& nm)
{ {
name = nm; name = nm;
parent = 0L; parent = 0L;
element_index = 0; element_index = 0;
// convert ["from"]["to"] = factor, so: from * factor = to if (!converterIsInitialized) {
// Length converterIsInitialized = true;
convert["M"]["FT"] = 3.2808399; // convert ["from"]["to"] = factor, so: from * factor = to
convert["FT"]["M"] = 1.0/convert["M"]["FT"]; // Length
convert["FT"]["IN"] = 12.0; convert["M"]["FT"] = 3.2808399;
convert["IN"]["FT"] = 1.0/convert["FT"]["IN"]; convert["FT"]["M"] = 1.0/convert["M"]["FT"];
convert["IN"]["M"] = convert["IN"]["FT"] * convert["FT"]["M"]; convert["FT"]["IN"] = 12.0;
convert["M"]["IN"] = convert["M"]["FT"] * convert["FT"]["IN"]; convert["IN"]["FT"] = 1.0/convert["FT"]["IN"];
// Area convert["IN"]["M"] = convert["IN"]["FT"] * convert["FT"]["M"];
convert["M2"]["FT2"] = convert["M"]["FT"]*convert["M"]["FT"]; convert["M"]["IN"] = convert["M"]["FT"] * convert["FT"]["IN"];
convert["FT2"]["M2"] = 1.0/convert["M2"]["FT2"]; // Area
convert["M2"]["IN2"] = convert["M"]["IN"]*convert["M"]["IN"]; convert["M2"]["FT2"] = convert["M"]["FT"]*convert["M"]["FT"];
convert["IN2"]["M2"] = 1.0/convert["M2"]["IN2"]; convert["FT2"]["M2"] = 1.0/convert["M2"]["FT2"];
convert["FT2"]["IN2"] = 144.0; convert["M2"]["IN2"] = convert["M"]["IN"]*convert["M"]["IN"];
convert["IN2"]["FT2"] = 1.0/convert["FT2"]["IN2"]; convert["IN2"]["M2"] = 1.0/convert["M2"]["IN2"];
// Volume convert["FT2"]["IN2"] = 144.0;
convert["IN3"]["CC"] = 16.387064; convert["IN2"]["FT2"] = 1.0/convert["FT2"]["IN2"];
convert["CC"]["IN3"] = 1.0/convert["IN3"]["CC"]; // Volume
convert["FT3"]["IN3"] = 1728.0; convert["IN3"]["CC"] = 16.387064;
convert["IN3"]["FT3"] = 1.0/convert["FT3"]["IN3"]; convert["CC"]["IN3"] = 1.0/convert["IN3"]["CC"];
convert["M3"]["FT3"] = 35.3146667; convert["FT3"]["IN3"] = 1728.0;
convert["FT3"]["M3"] = 1.0/convert["M3"]["FT3"]; convert["IN3"]["FT3"] = 1.0/convert["FT3"]["IN3"];
convert["LTR"]["IN3"] = 61.0237441; convert["M3"]["FT3"] = 35.3146667;
convert["IN3"]["LTR"] = 1.0/convert["LTR"]["IN3"]; convert["FT3"]["M3"] = 1.0/convert["M3"]["FT3"];
// Mass & Weight convert["LTR"]["IN3"] = 61.0237441;
convert["LBS"]["KG"] = 0.45359237; convert["IN3"]["LTR"] = 1.0/convert["LTR"]["IN3"];
convert["KG"]["LBS"] = 1.0/convert["LBS"]["KG"]; // Mass & Weight
convert["SLUG"]["KG"] = 14.59390; convert["LBS"]["KG"] = 0.45359237;
convert["KG"]["SLUG"] = 1.0/convert["SLUG"]["KG"]; convert["KG"]["LBS"] = 1.0/convert["LBS"]["KG"];
// Moments of Inertia convert["SLUG"]["KG"] = 14.59390;
convert["SLUG*FT2"]["KG*M2"] = 1.35594; convert["KG"]["SLUG"] = 1.0/convert["SLUG"]["KG"];
convert["KG*M2"]["SLUG*FT2"] = 1.0/convert["SLUG*FT2"]["KG*M2"]; // Moments of Inertia
// Angles convert["SLUG*FT2"]["KG*M2"] = 1.35594;
convert["RAD"]["DEG"] = 360.0/(2.0*3.1415926); convert["KG*M2"]["SLUG*FT2"] = 1.0/convert["SLUG*FT2"]["KG*M2"];
convert["DEG"]["RAD"] = 1.0/convert["RAD"]["DEG"]; // Angles
// Spring force convert["RAD"]["DEG"] = 360.0/(2.0*3.1415926);
convert["LBS/FT"]["N/M"] = 14.5939; convert["DEG"]["RAD"] = 1.0/convert["RAD"]["DEG"];
convert["N/M"]["LBS/FT"] = 1.0/convert["LBS/FT"]["N/M"]; // Spring force
// Damping force convert["LBS/FT"]["N/M"] = 14.5939;
convert["LBS/FT/SEC"]["N/M/SEC"] = 14.5939; convert["N/M"]["LBS/FT"] = 1.0/convert["LBS/FT"]["N/M"];
convert["N/M/SEC"]["LBS/FT/SEC"] = 1.0/convert["LBS/FT/SEC"]["N/M/SEC"]; // Damping force
// Damping force (Square Law) convert["LBS/FT/SEC"]["N/M/SEC"] = 14.5939;
convert["LBS/FT2/SEC2"]["N/M2/SEC2"] = 47.880259; convert["N/M/SEC"]["LBS/FT/SEC"] = 1.0/convert["LBS/FT/SEC"]["N/M/SEC"];
convert["N/M2/SEC2"]["LBS/FT2/SEC2"] = 1.0/convert["LBS/FT2/SEC2"]["N/M2/SEC2"]; // Damping force (Square Law)
// Power convert["LBS/FT2/SEC2"]["N/M2/SEC2"] = 47.880259;
convert["WATTS"]["HP"] = 0.001341022; convert["N/M2/SEC2"]["LBS/FT2/SEC2"] = 1.0/convert["LBS/FT2/SEC2"]["N/M2/SEC2"];
convert["HP"]["WATTS"] = 1.0/convert["WATTS"]["HP"]; // Power
// Force convert["WATTS"]["HP"] = 0.001341022;
convert["N"]["LBS"] = 0.22482; convert["HP"]["WATTS"] = 1.0/convert["WATTS"]["HP"];
convert["LBS"]["N"] = 1.0/convert["N"]["LBS"]; // Force
// Velocity convert["N"]["LBS"] = 0.22482;
convert["KTS"]["FT/SEC"] = 1.68781; convert["LBS"]["N"] = 1.0/convert["N"]["LBS"];
convert["FT/SEC"]["KTS"] = 1.0/convert["KTS"]["FT/SEC"]; // Velocity
convert["M/S"]["FT/S"] = 3.2808399; convert["KTS"]["FT/SEC"] = 1.68781;
convert["FT/S"]["M/S"] = 1.0/convert["M/S"]["FT/S"]; convert["FT/SEC"]["KTS"] = 1.0/convert["KTS"]["FT/SEC"];
// Torque convert["M/S"]["FT/S"] = 3.2808399;
convert["FT*LBS"]["N*M"] = 1.35581795; convert["FT/S"]["M/S"] = 1.0/convert["M/S"]["FT/S"];
convert["N*M"]["FT*LBS"] = 1/convert["FT*LBS"]["N*M"]; // Torque
// Valve convert["FT*LBS"]["N*M"] = 1.35581795;
convert["M4*SEC/KG"]["FT4*SEC/SLUG"] = convert["M"]["FT"]*convert["M"]["FT"]* convert["N*M"]["FT*LBS"] = 1/convert["FT*LBS"]["N*M"];
convert["M"]["FT"]*convert["M"]["FT"]/convert["KG"]["SLUG"]; // Valve
convert["FT4*SEC/SLUG"]["M4*SEC/KG"] = convert["M4*SEC/KG"]["FT4*SEC/SLUG"] = convert["M"]["FT"]*convert["M"]["FT"]*
1.0/convert["M4*SEC/KG"]["FT4*SEC/SLUG"]; convert["M"]["FT"]*convert["M"]["FT"]/convert["KG"]["SLUG"];
// Pressure convert["FT4*SEC/SLUG"]["M4*SEC/KG"] =
convert["INHG"]["PSF"] = 70.7180803; 1.0/convert["M4*SEC/KG"]["FT4*SEC/SLUG"];
convert["PSF"]["INHG"] = 1.0/convert["INHG"]["PSF"]; // Pressure
convert["ATM"]["INHG"] = 29.9246899; convert["INHG"]["PSF"] = 70.7180803;
convert["INHG"]["ATM"] = 1.0/convert["ATM"]["INHG"]; convert["PSF"]["INHG"] = 1.0/convert["INHG"]["PSF"];
convert["PSI"]["INHG"] = 2.03625437; convert["ATM"]["INHG"] = 29.9246899;
convert["INHG"]["PSI"] = 1.0/convert["PSI"]["INHG"]; convert["INHG"]["ATM"] = 1.0/convert["ATM"]["INHG"];
convert["INHG"]["PA"] = 3386.0; // inches Mercury to pascals convert["PSI"]["INHG"] = 2.03625437;
convert["PA"]["INHG"] = 1.0/convert["INHG"]["PA"]; convert["INHG"]["PSI"] = 1.0/convert["PSI"]["INHG"];
convert["LBS/FT2"]["N/M2"] = 14.5939/convert["FT"]["M"]; convert["INHG"]["PA"] = 3386.0; // inches Mercury to pascals
convert["N/M2"]["LBS/FT2"] = 1.0/convert["LBS/FT2"]["N/M2"]; convert["PA"]["INHG"] = 1.0/convert["INHG"]["PA"];
convert["LBS/FT2"]["PA"] = convert["LBS/FT2"]["N/M2"]; convert["LBS/FT2"]["N/M2"] = 14.5939/convert["FT"]["M"];
convert["PA"]["LBS/FT2"] = 1.0/convert["LBS/FT2"]["PA"]; convert["N/M2"]["LBS/FT2"] = 1.0/convert["LBS/FT2"]["N/M2"];
// Mass flow convert["LBS/FT2"]["PA"] = convert["LBS/FT2"]["N/M2"];
convert["KG/MIN"]["LBS/MIN"] = convert["KG"]["LBS"]; convert["PA"]["LBS/FT2"] = 1.0/convert["LBS/FT2"]["PA"];
// Fuel Consumption // Mass flow
convert["LBS/HP*HR"]["KG/KW*HR"] = 0.6083; convert["KG/MIN"]["LBS/MIN"] = convert["KG"]["LBS"];
convert["KG/KW*HR"]["LBS/HP*HR"] = 1.0/convert["LBS/HP*HR"]["KG/KW*HR"]; // Fuel Consumption
convert["LBS/HP*HR"]["KG/KW*HR"] = 0.6083;
convert["KG/KW*HR"]["LBS/HP*HR"] = 1.0/convert["LBS/HP*HR"]["KG/KW*HR"];
// Density
convert["KG/L"]["LBS/GAL"] = 8.3454045;
convert["LBS/GAL"]["KG/L"] = 1.0/convert["KG/L"]["LBS/GAL"];
// Length // Length
convert["M"]["M"] = 1.00; convert["M"]["M"] = 1.00;
convert["FT"]["FT"] = 1.00; convert["FT"]["FT"] = 1.00;
convert["IN"]["IN"] = 1.00; convert["IN"]["IN"] = 1.00;
// Area // Area
convert["M2"]["M2"] = 1.00; convert["M2"]["M2"] = 1.00;
convert["FT2"]["FT2"] = 1.00; convert["FT2"]["FT2"] = 1.00;
// Volume // Volume
convert["IN3"]["IN3"] = 1.00; convert["IN3"]["IN3"] = 1.00;
convert["CC"]["CC"] = 1.0; convert["CC"]["CC"] = 1.0;
convert["M3"]["M3"] = 1.0; convert["M3"]["M3"] = 1.0;
convert["FT3"]["FT3"] = 1.0; convert["FT3"]["FT3"] = 1.0;
convert["LTR"]["LTR"] = 1.0; convert["LTR"]["LTR"] = 1.0;
// Mass & Weight // Mass & Weight
convert["KG"]["KG"] = 1.00; convert["KG"]["KG"] = 1.00;
convert["LBS"]["LBS"] = 1.00; convert["LBS"]["LBS"] = 1.00;
// Moments of Inertia // Moments of Inertia
convert["KG*M2"]["KG*M2"] = 1.00; convert["KG*M2"]["KG*M2"] = 1.00;
convert["SLUG*FT2"]["SLUG*FT2"] = 1.00; convert["SLUG*FT2"]["SLUG*FT2"] = 1.00;
// Angles // Angles
convert["DEG"]["DEG"] = 1.00; convert["DEG"]["DEG"] = 1.00;
convert["RAD"]["RAD"] = 1.00; convert["RAD"]["RAD"] = 1.00;
// Spring force // Spring force
convert["LBS/FT"]["LBS/FT"] = 1.00; convert["LBS/FT"]["LBS/FT"] = 1.00;
convert["N/M"]["N/M"] = 1.00; convert["N/M"]["N/M"] = 1.00;
// Damping force // Damping force
convert["LBS/FT/SEC"]["LBS/FT/SEC"] = 1.00; convert["LBS/FT/SEC"]["LBS/FT/SEC"] = 1.00;
convert["N/M/SEC"]["N/M/SEC"] = 1.00; convert["N/M/SEC"]["N/M/SEC"] = 1.00;
// Damping force (Square law) // Damping force (Square law)
convert["LBS/FT2/SEC2"]["LBS/FT2/SEC2"] = 1.00; convert["LBS/FT2/SEC2"]["LBS/FT2/SEC2"] = 1.00;
convert["N/M2/SEC2"]["N/M2/SEC2"] = 1.00; convert["N/M2/SEC2"]["N/M2/SEC2"] = 1.00;
// Power // Power
convert["HP"]["HP"] = 1.00; convert["HP"]["HP"] = 1.00;
convert["WATTS"]["WATTS"] = 1.00; convert["WATTS"]["WATTS"] = 1.00;
// Force // Force
convert["N"]["N"] = 1.00; convert["N"]["N"] = 1.00;
// Velocity // Velocity
convert["FT/SEC"]["FT/SEC"] = 1.00; convert["FT/SEC"]["FT/SEC"] = 1.00;
convert["KTS"]["KTS"] = 1.00; convert["KTS"]["KTS"] = 1.00;
convert["M/S"]["M/S"] = 1.0; convert["M/S"]["M/S"] = 1.0;
// Torque // Torque
convert["FT*LBS"]["FT*LBS"] = 1.00; convert["FT*LBS"]["FT*LBS"] = 1.00;
convert["N*M"]["N*M"] = 1.00; convert["N*M"]["N*M"] = 1.00;
// Valve // Valve
convert["M4*SEC/KG"]["M4*SEC/KG"] = 1.0; convert["M4*SEC/KG"]["M4*SEC/KG"] = 1.0;
convert["FT4*SEC/SLUG"]["FT4*SEC/SLUG"] = 1.0; convert["FT4*SEC/SLUG"]["FT4*SEC/SLUG"] = 1.0;
// Pressure // Pressure
convert["PSI"]["PSI"] = 1.00; convert["PSI"]["PSI"] = 1.00;
convert["PSF"]["PSF"] = 1.00; convert["PSF"]["PSF"] = 1.00;
convert["INHG"]["INHG"] = 1.00; convert["INHG"]["INHG"] = 1.00;
convert["ATM"]["ATM"] = 1.0; convert["ATM"]["ATM"] = 1.0;
convert["PA"]["PA"] = 1.0; convert["PA"]["PA"] = 1.0;
convert["N/M2"]["N/M2"] = 1.00; convert["N/M2"]["N/M2"] = 1.00;
convert["LBS/FT2"]["LBS/FT2"] = 1.00; convert["LBS/FT2"]["LBS/FT2"] = 1.00;
// Mass flow // Mass flow
convert["LBS/SEC"]["LBS/SEC"] = 1.00; convert["LBS/SEC"]["LBS/SEC"] = 1.00;
convert["KG/MIN"]["KG/MIN"] = 1.0; convert["KG/MIN"]["KG/MIN"] = 1.0;
convert["LBS/MIN"]["LBS/MIN"] = 1.0; convert["LBS/MIN"]["LBS/MIN"] = 1.0;
// Fuel Consumption // Fuel Consumption
convert["LBS/HP*HR"]["LBS/HP*HR"] = 1.0; convert["LBS/HP*HR"]["LBS/HP*HR"] = 1.0;
convert["KG/KW*HR"]["KG/KW*HR"] = 1.0; convert["KG/KW*HR"]["KG/KW*HR"] = 1.0;
// Density
convert["KG/L"]["KG/L"] = 1.0;
convert["LBS/GAL"]["LBS/GAL"] = 1.0;
}
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -209,7 +224,7 @@ Element::~Element(void)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
string Element::GetAttributeValue(string attr) string Element::GetAttributeValue(const string& attr)
{ {
int select=-1; int select=-1;
for (unsigned int i=0; i<attribute_key.size(); i++) { for (unsigned int i=0; i<attribute_key.size(); i++) {
@ -221,7 +236,7 @@ string Element::GetAttributeValue(string attr)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
double Element::GetAttributeValueAsNumber(string attr) double Element::GetAttributeValueAsNumber(const string& attr)
{ {
string attribute = GetAttributeValue(attr); string attribute = GetAttributeValue(attr);
@ -280,7 +295,7 @@ double Element::GetDataAsNumber(void)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
unsigned int Element::GetNumElements(string element_name) unsigned int Element::GetNumElements(const string& element_name)
{ {
unsigned int number_of_elements=0; unsigned int number_of_elements=0;
Element* el=FindElement(element_name); Element* el=FindElement(element_name);
@ -293,7 +308,7 @@ unsigned int Element::GetNumElements(string element_name)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Element* Element::FindElement(string el) Element* Element::FindElement(const string& el)
{ {
if (el.empty() && children.size() >= 1) { if (el.empty() && children.size() >= 1) {
element_index = 1; element_index = 1;
@ -311,7 +326,7 @@ Element* Element::FindElement(string el)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Element* Element::FindNextElement(string el) Element* Element::FindNextElement(const string& el)
{ {
if (el.empty()) { if (el.empty()) {
if (element_index < children.size()) { if (element_index < children.size()) {
@ -333,7 +348,7 @@ Element* Element::FindNextElement(string el)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
double Element::FindElementValueAsNumber(string el) double Element::FindElementValueAsNumber(const string& el)
{ {
Element* element = FindElement(el); Element* element = FindElement(el);
if (element) { if (element) {
@ -346,7 +361,7 @@ double Element::FindElementValueAsNumber(string el)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
string Element::FindElementValue(string el) string Element::FindElementValue(const string& el)
{ {
Element* element = FindElement(el); Element* element = FindElement(el);
if (element) { if (element) {
@ -358,7 +373,7 @@ string Element::FindElementValue(string el)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
double Element::FindElementValueAsNumberConvertTo(string el, string target_units) double Element::FindElementValueAsNumberConvertTo(const string& el, const string& target_units)
{ {
Element* element = FindElement(el); Element* element = FindElement(el);
@ -392,9 +407,9 @@ double Element::FindElementValueAsNumberConvertTo(string el, string target_units
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
double Element::FindElementValueAsNumberConvertFromTo( string el, double Element::FindElementValueAsNumberConvertFromTo( const string& el,
string supplied_units, const string& supplied_units,
string target_units) const string& target_units)
{ {
Element* element = FindElement(el); Element* element = FindElement(el);
@ -426,7 +441,7 @@ double Element::FindElementValueAsNumberConvertFromTo( string el,
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FGColumnVector3 Element::FindElementTripletConvertTo( string target_units) FGColumnVector3 Element::FindElementTripletConvertTo( const string& target_units)
{ {
FGColumnVector3 triplet; FGColumnVector3 triplet;
Element* item; Element* item;
@ -506,7 +521,7 @@ void Element::Print(unsigned int level)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void Element::AddAttribute(string name, string value) void Element::AddAttribute(const string& name, const string& value)
{ {
attribute_key.push_back(name); attribute_key.push_back(name);
attributes[name] = value; attributes[name] = value;
@ -516,8 +531,8 @@ void Element::AddAttribute(string name, string value)
void Element::AddData(string d) void Element::AddData(string d)
{ {
unsigned int string_start = (unsigned int)d.find_first_not_of(" \t"); string::size_type string_start = d.find_first_not_of(" \t");
if (string_start > 0) { if (string_start != string::npos && string_start > 0) {
d.erase(0,string_start); d.erase(0,string_start);
} }
data_lines.push_back(d); data_lines.push_back(d);

View file

@ -36,16 +36,9 @@ INCLUDES
#include <string> #include <string>
#include <map> #include <map>
#include <iostream>
#include <vector> #include <vector>
using std::string; #include "math/FGColumnVector3.h"
using std::map;
using std::vector;
using std::cout;
using std::endl;
#include <math/FGColumnVector3.h>
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS
@ -92,6 +85,7 @@ CLASS DOCUMENTATION
- convert["KG/MIN"]["LBS/MIN"] = convert["KG"]["LBS"]; - convert["KG/MIN"]["LBS/MIN"] = convert["KG"]["LBS"];
- convert["LBS/HP*HR"]["KG/KW*HR"] = 0.6083; - convert["LBS/HP*HR"]["KG/KW*HR"] = 0.6083;
- convert["KG/KW*HR"]["LBS/HP*HR"] = 1/convert["LBS/HP*HR"]["KG/KW*HR"]; - convert["KG/KW*HR"]["LBS/HP*HR"] = 1/convert["LBS/HP*HR"]["KG/KW*HR"];
- convert["KG/L"]["LBS/GAL"] = 8.3454045;
- convert["M"]["M"] = 1.00; - convert["M"]["M"] = 1.00;
- convert["FT"]["FT"] = 1.00; - convert["FT"]["FT"] = 1.00;
@ -119,6 +113,8 @@ CLASS DOCUMENTATION
- convert["LBS/MIN"]["LBS/MIN"] = 1.0; - convert["LBS/MIN"]["LBS/MIN"] = 1.0;
- convert["LBS/HP*HR"]["LBS/HP*HR"] = 1.0; - convert["LBS/HP*HR"]["LBS/HP*HR"] = 1.0;
- convert["KG/KW*HR"]["KG/KW*HR"] = 1.0; - convert["KG/KW*HR"]["KG/KW*HR"] = 1.0;
- convert["KG/L"]["KG/L"] = 1.0;
- convert["LBS/GAL"]["LBS/GAL"] = 1.0;
Where: Where:
- N = newtons - N = newtons
@ -136,6 +132,8 @@ CLASS DOCUMENTATION
- WATTS = watts - WATTS = watts
- HP = horsepower - HP = horsepower
- HR = hour - HR = hour
- L = liter
- GAL = gallon (U.S. liquid)
@author Jon S. Berndt @author Jon S. Berndt
@version $Id$ @version $Id$
@ -150,7 +148,7 @@ public:
/** Constructor /** Constructor
@param nm the name of this element (if given) @param nm the name of this element (if given)
*/ */
Element(string nm); Element(const std::string& nm);
/// Destructor /// Destructor
~Element(void); ~Element(void);
@ -158,23 +156,23 @@ public:
@param key specifies the attribute key to retrieve the value of. @param key specifies the attribute key to retrieve the value of.
@return the key value (as a string), or the empty string if no such @return the key value (as a string), or the empty string if no such
attribute exists. */ attribute exists. */
string GetAttributeValue(string key); std::string GetAttributeValue(const std::string& key);
/** Retrieves an attribute value as a double precision real number. /** Retrieves an attribute value as a double precision real number.
@param key specifies the attribute key to retrieve the value of. @param key specifies the attribute key to retrieve the value of.
@return the key value (as a number), or the HUGE_VAL if no such @return the key value (as a number), or the HUGE_VAL if no such
attribute exists. */ attribute exists. */
double GetAttributeValueAsNumber(string key); double GetAttributeValueAsNumber(const std::string& key);
/** Retrieves the element name. /** Retrieves the element name.
@return the element name, or the empty string if no name has been set.*/ @return the element name, or the empty string if no name has been set.*/
string GetName(void) {return name;} const std::string& GetName(void) const {return name;}
/** Gets a line of data belonging to an element. /** Gets a line of data belonging to an element.
@param i the index of the data line to return (0 by default). @param i the index of the data line to return (0 by default).
@return a string representing the data line requested, or the empty string @return a string representing the data line requested, or the empty string
if none exists.*/ if none exists.*/
string GetDataLine(unsigned int i=0); std::string GetDataLine(unsigned int i=0);
/// Returns the number of lines of data stored /// Returns the number of lines of data stored
unsigned int GetNumDataLines(void) {return (unsigned int)data_lines.size();} unsigned int GetNumDataLines(void) {return (unsigned int)data_lines.size();}
@ -183,7 +181,7 @@ public:
unsigned int GetNumElements(void) {return (unsigned int)children.size();} unsigned int GetNumElements(void) {return (unsigned int)children.size();}
/// Returns the number of named child elements for this element. /// Returns the number of named child elements for this element.
unsigned int GetNumElements(string); unsigned int GetNumElements(const std::string& element_name);
/** Converts the element data to a number. /** Converts the element data to a number.
This function attempts to convert the first (and presumably only) line of This function attempts to convert the first (and presumably only) line of
@ -221,7 +219,7 @@ public:
element counter to the first element. element counter to the first element.
@param el the search string (empty string by default). @param el the search string (empty string by default).
@return a pointer to the first element that matches the supplied search string. */ @return a pointer to the first element that matches the supplied search string. */
Element* FindElement(string el=""); Element* FindElement(const std::string& el="");
/** Searches for the next element as specified. /** Searches for the next element as specified.
This function would be called after FindElement() is first called (in order to This function would be called after FindElement() is first called (in order to
@ -232,7 +230,7 @@ public:
@param el the name of the next element to find. @param el the name of the next element to find.
@return the pointer to the found element, or 0 if no appropriate element us @return the pointer to the found element, or 0 if no appropriate element us
found.*/ found.*/
Element* FindNextElement(string el=""); Element* FindNextElement(const std::string& el="");
/** Searches for the named element and returns the string data belonging to it. /** Searches for the named element and returns the string data belonging to it.
This function allows the data belonging to a named element to be returned This function allows the data belonging to a named element to be returned
@ -242,7 +240,7 @@ public:
default) default)
@return the data value for the named element as a string, or the empty @return the data value for the named element as a string, or the empty
string if the element cannot be found. */ string if the element cannot be found. */
string FindElementValue(string el=""); std::string FindElementValue(const std::string& el="");
/** Searches for the named element and returns the data belonging to it as a number. /** Searches for the named element and returns the data belonging to it as a number.
This function allows the data belonging to a named element to be returned This function allows the data belonging to a named element to be returned
@ -252,7 +250,7 @@ public:
default) default)
@return the data value for the named element as a double, or HUGE_VAL if the @return the data value for the named element as a double, or HUGE_VAL if the
data is missing. */ data is missing. */
double FindElementValueAsNumber(string el=""); double FindElementValueAsNumber(const std::string& el="");
/** Searches for the named element and converts and returns the data belonging to it. /** Searches for the named element and converts and returns the data belonging to it.
This function allows the data belonging to a named element to be returned This function allows the data belonging to a named element to be returned
@ -269,7 +267,7 @@ public:
to which the value returned will be converted. to which the value returned will be converted.
@return the unit-converted data value for the named element as a double, @return the unit-converted data value for the named element as a double,
or HUGE_VAL if the data is missing. */ or HUGE_VAL if the data is missing. */
double FindElementValueAsNumberConvertTo(string el, string target_units); double FindElementValueAsNumberConvertTo(const std::string& el, const std::string& target_units);
/** Searches for the named element and converts and returns the data belonging to it. /** Searches for the named element and converts and returns the data belonging to it.
This function allows the data belonging to a named element to be returned This function allows the data belonging to a named element to be returned
@ -288,9 +286,9 @@ public:
to which the value returned will be converted. to which the value returned will be converted.
@return the unit-converted data value for the named element as a double, @return the unit-converted data value for the named element as a double,
or HUGE_VAL if the data is missing. */ or HUGE_VAL if the data is missing. */
double FindElementValueAsNumberConvertFromTo( string el, double FindElementValueAsNumberConvertFromTo( const std::string& el,
string supplied_units, const std::string& supplied_units,
string target_units); const std::string& target_units);
/** Composes a 3-element column vector for the supplied location or orientation. /** Composes a 3-element column vector for the supplied location or orientation.
This function processes a LOCATION or ORIENTATION construct, returning a This function processes a LOCATION or ORIENTATION construct, returning a
@ -301,7 +299,7 @@ public:
@param target_units the string representing the native units used by JSBSim @param target_units the string representing the native units used by JSBSim
to which the value returned will be converted. to which the value returned will be converted.
@return a column vector object built from the LOCATION or ORIENT components. */ @return a column vector object built from the LOCATION or ORIENT components. */
FGColumnVector3 FindElementTripletConvertTo( string target_units); FGColumnVector3 FindElementTripletConvertTo( const std::string& target_units);
/** This function sets the value of the parent class attribute to the supplied /** This function sets the value of the parent class attribute to the supplied
Element pointer. Element pointer.
@ -315,11 +313,11 @@ public:
/** Stores an attribute belonging to this element. /** Stores an attribute belonging to this element.
* @param name The string name of the attribute. * @param name The string name of the attribute.
* @param value The string value of the attribute. */ * @param value The string value of the attribute. */
void AddAttribute(string name, string value); void AddAttribute(const std::string& name, const std::string& value);
/** Stores data belonging to this element. /** Stores data belonging to this element.
* @param d the data to store. */ * @param d the data to store. */
void AddData(string d); void AddData(std::string d);
/** Prints the element. /** Prints the element.
* Prints this element and calls the Print routine for child elements. * Prints this element and calls the Print routine for child elements.
@ -327,15 +325,16 @@ public:
void Print(unsigned int level=0); void Print(unsigned int level=0);
private: private:
string name; std::string name;
map <string, string> attributes; std::map <std::string, std::string> attributes;
vector <string> data_lines; std::vector <std::string> data_lines;
vector <Element*> children; std::vector <Element*> children;
vector <string> attribute_key; std::vector <std::string> attribute_key;
Element *parent; Element *parent;
unsigned int element_index; unsigned int element_index;
typedef map <string, map <string, double> > tMapConvert; typedef std::map <std::string, std::map <std::string, double> > tMapConvert;
tMapConvert convert; static tMapConvert convert;
static bool converterIsInitialized;
}; };
} // namespace JSBSim } // namespace JSBSim

View file

@ -35,7 +35,9 @@ SENTRY
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <input_output/FGXMLParse.h> #include "input_output/FGXMLParse.h"
#include <iostream>
#include <fstream>
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS
@ -56,19 +58,19 @@ public:
protected: protected:
Element* document; Element* document;
Element* LoadXMLDocument(string XML_filename) Element* LoadXMLDocument(std::string XML_filename)
{ {
ifstream infile; std::ifstream infile;
if ( !XML_filename.empty() ) { if ( !XML_filename.empty() ) {
if (XML_filename.find(".xml") == string::npos) XML_filename += ".xml"; if (XML_filename.find(".xml") == std::string::npos) XML_filename += ".xml";
infile.open(XML_filename.c_str()); infile.open(XML_filename.c_str());
if ( !infile.is_open()) { if ( !infile.is_open()) {
cerr << "Could not open file: " << XML_filename << endl; std::cerr << "Could not open file: " << XML_filename << std::endl;
return 0L; return 0L;
} }
} else { } else {
cerr << "No filename given." << endl; std::cerr << "No filename given." << std::endl;
return 0L; return 0L;
} }

View file

@ -30,9 +30,14 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGXMLParse.h" #include "FGXMLParse.h"
#include "FGXMLElement.h"
#include <string>
#include <iostream>
#include <cstdlib> #include <cstdlib>
#include "input_output/string_utilities.h" #include "input_output/string_utilities.h"
using namespace std;
namespace JSBSim { namespace JSBSim {
static const char *IdSrc = "$Id$"; static const char *IdSrc = "$Id$";

View file

@ -34,15 +34,6 @@ SENTRY
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <string>
#include <iostream>
using std::string;
using std::cout;
using std::cerr;
using std::endl;
#include "FGXMLElement.h"
#include "simgear/xml/easyxml.hxx" #include "simgear/xml/easyxml.hxx"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -58,6 +49,8 @@ FORWARD DECLARATIONS
namespace JSBSim { namespace JSBSim {
class Element;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS DOCUMENTATION CLASS DOCUMENTATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

View file

@ -38,8 +38,17 @@ HISTORY
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGfdmSocket.h" #include <iostream>
#include <iomanip>
#include <cstring> #include <cstring>
#include <cstdio>
#include "FGfdmSocket.h"
#include "string_utilities.h"
using std::cout;
using std::cerr;
using std::endl;
using std::string;
namespace JSBSim { namespace JSBSim {
@ -50,9 +59,9 @@ static const char *IdHdr = ID_FDMSOCKET;
CLASS IMPLEMENTATION CLASS IMPLEMENTATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
FGfdmSocket::FGfdmSocket(string address, int port, int protocol) FGfdmSocket::FGfdmSocket(const string& address, int port, int protocol)
{ {
sckt = sckt_in = size = 0; sckt = sckt_in = 0;
connected = false; connected = false;
#if defined(_MSC_VER) || defined(__MINGW32__) #if defined(_MSC_VER) || defined(__MINGW32__)
@ -104,9 +113,9 @@ FGfdmSocket::FGfdmSocket(string address, int port, int protocol)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FGfdmSocket::FGfdmSocket(string address, int port) FGfdmSocket::FGfdmSocket(const string& address, int port)
{ {
sckt = sckt_in = size = 0; sckt = sckt_in = 0;
connected = false; connected = false;
#if defined(_MSC_VER) || defined(__MINGW32__) #if defined(_MSC_VER) || defined(__MINGW32__)
@ -158,7 +167,6 @@ FGfdmSocket::FGfdmSocket(string address, int port)
FGfdmSocket::FGfdmSocket(int port) FGfdmSocket::FGfdmSocket(int port)
{ {
size = 0;
connected = false; connected = false;
unsigned long NoBlock = true; unsigned long NoBlock = true;
@ -217,9 +225,8 @@ string FGfdmSocket::Receive(void)
char buf[1024]; char buf[1024];
int len = sizeof(struct sockaddr_in); int len = sizeof(struct sockaddr_in);
int num_chars=0; int num_chars=0;
int total_chars = 0;
unsigned long NoBlock = true; unsigned long NoBlock = true;
string data = ""; // todo: should allocate this with a standard size as a string data; // todo: should allocate this with a standard size as a
// class attribute and pass as a reference? // class attribute and pass as a reference?
if (sckt_in <= 0) { if (sckt_in <= 0) {
@ -239,9 +246,8 @@ string FGfdmSocket::Receive(void)
} }
if (sckt_in > 0) { if (sckt_in > 0) {
while ((num_chars = recv(sckt_in, buf, 1024, 0)) > 0) { while ((num_chars = recv(sckt_in, buf, sizeof buf, 0)) > 0) {
data += string(buf).substr(0,num_chars); data.append(buf, num_chars);
total_chars += num_chars;
} }
#if defined(_MSC_VER) #if defined(_MSC_VER)
@ -258,12 +264,12 @@ string FGfdmSocket::Receive(void)
#endif #endif
} }
return data.substr(0, total_chars); return data;
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
int FGfdmSocket::Reply(string text) int FGfdmSocket::Reply(const string& text)
{ {
int num_chars_sent=0; int num_chars_sent=0;
@ -288,71 +294,58 @@ void FGfdmSocket::Close(void)
void FGfdmSocket::Clear(void) void FGfdmSocket::Clear(void)
{ {
buffer = ""; buffer.str(string());
size = 0;
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGfdmSocket::Clear(string s) void FGfdmSocket::Clear(const string& s)
{ {
buffer = s + " "; Clear();
size = buffer.size(); buffer << s << ' ';
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGfdmSocket::Append(const char* item) void FGfdmSocket::Append(const char* item)
{ {
if (size == 0) buffer += string(item); if (buffer.tellp() > 0) buffer << ',';
else buffer += string(",") + string(item); buffer << item;
size++;
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGfdmSocket::Append(double item) void FGfdmSocket::Append(double item)
{ {
char s[25]; if (buffer.tellp() > 0) buffer << ',';
buffer << std::setw(12) << std::setprecision(7) << item;
sprintf(s,"%12.7f",item);
if (size == 0) buffer += string(s);
else buffer += string(",") + string(s);
size++;
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGfdmSocket::Append(long item) void FGfdmSocket::Append(long item)
{ {
char s[25]; if (buffer.tellp() > 0) buffer << ',';
buffer << std::setw(12) << item;
sprintf(s,"%12ld",item);
if (size == 0) buffer += string(s);
else buffer += string(",") + string(s);
size++;
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGfdmSocket::Send(void) void FGfdmSocket::Send(void)
{ {
buffer += string("\n"); buffer << '\n';
if ((send(sckt,buffer.c_str(),buffer.size(),0)) <= 0) { string str = buffer.str();
if ((send(sckt,str.c_str(),str.size(),0)) <= 0) {
perror("send"); perror("send");
} else {
} }
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGfdmSocket::Send(char *data, int length) void FGfdmSocket::Send(const char *data, int length)
{ {
if ((send(sckt,data,length,0)) <= 0) { if ((send(sckt,data,length,0)) <= 0) {
perror("send"); perror("send");
} else {
} }
} }

View file

@ -39,16 +39,11 @@ SENTRY
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <cstdio>
#include <string> #include <string>
#include <iostream> #include <sstream>
#include <fstream>
#include <sys/types.h> #include <sys/types.h>
#include "FGJSBBase.h" #include "FGJSBBase.h"
using std::cout;
using std::endl;
#if defined(_MSC_VER) || defined(__MINGW32__) #if defined(_MSC_VER) || defined(__MINGW32__)
#include <winsock.h> #include <winsock.h>
#include <io.h> #include <io.h>
@ -90,27 +85,24 @@ CLASS DOCUMENTATION
CLASS DECLARATION CLASS DECLARATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
using std::string;
using std::cerr;
class FGfdmSocket : public FGJSBBase class FGfdmSocket : public FGJSBBase
{ {
public: public:
FGfdmSocket(string, int); FGfdmSocket(const std::string&, int);
FGfdmSocket(string, int, int); FGfdmSocket(const std::string&, int, int);
FGfdmSocket(int); FGfdmSocket(int);
~FGfdmSocket(); ~FGfdmSocket();
void Send(void); void Send(void);
void Send(char *data, int length); void Send(const char *data, int length);
string Receive(void); std::string Receive(void);
int Reply(string text); int Reply(const std::string& text);
void Append(const string s) {Append(s.c_str());} void Append(const std::string& s) {Append(s.c_str());}
void Append(const char*); void Append(const char*);
void Append(double); void Append(double);
void Append(long); void Append(long);
void Clear(void); void Clear(void);
void Clear(string s); void Clear(const std::string& s);
void Close(void); void Close(void);
bool GetConnectStatus(void) {return connected;} bool GetConnectStatus(void) {return connected;}
@ -119,10 +111,9 @@ public:
private: private:
int sckt; int sckt;
int sckt_in; int sckt_in;
int size;
struct sockaddr_in scktName; struct sockaddr_in scktName;
struct hostent *host; struct hostent *host;
string buffer; std::ostringstream buffer;
bool connected; bool connected;
void Debug(int from); void Debug(int from);
}; };

View file

@ -15,12 +15,7 @@
#include <time.h> // time_t #include <time.h> // time_t
#ifdef _MSC_VER #include <simgear/misc/stdint.hxx> //not required for JSBSim
typedef unsigned long uint32_t;
typedef long int32_t;
#endif
//--->>>#include <simgear/misc/stdint.hxx> //not required for JSBSim
// NOTE: this file defines an external interface structure. Due to // NOTE: this file defines an external interface structure. Due to

View file

@ -4,7 +4,7 @@
Author: Jon S. Berndt Author: Jon S. Berndt
Date started: 06/01/09 Date started: 06/01/09
------------- Copyright (C) 2009 Jon S. Berndt (jsb@hal-pc.org) ------------- ------------- Copyright (C) 2009 Jon S. Berndt (jon@jsbsim.org) -------------
This program is free software; you can redistribute it and/or modify it under 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 the terms of the GNU Lesser General Public License as published by the Free Software
@ -38,8 +38,8 @@ SENTRY
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <string>
#include <vector> #include <vector>
#include <ctype.h>
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS
@ -51,8 +51,6 @@ DEFINITIONS
FORWARD DECLARATIONS FORWARD DECLARATIONS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
using namespace std;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS DOCUMENTATION CLASS DOCUMENTATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
@ -63,29 +61,30 @@ CLASS DECLARATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if !defined(BASE) #if !defined(BASE)
extern string& trim_left(string& str); extern std::string& trim_left(std::string& str);
extern string& trim_right(string& str); extern std::string& trim_right(std::string& str);
extern string& trim(string& str); extern std::string& trim(std::string& str);
extern string& to_upper(string& str); extern std::string& to_upper(std::string& str);
extern string& to_lower(string& str); extern std::string& to_lower(std::string& str);
extern bool is_number(string& str); extern bool is_number(const std::string& str);
vector <string> split(string str, char d); std::vector <std::string> split(std::string str, char d);
#else #else
#include <ctype.h>
using namespace std;
string& trim_left(string& str) string& trim_left(string& str)
{ {
while ( !isgraph(str[0]) ) { while (str.size() && !isgraph(str[0])) {
str = str.erase(0,1); str = str.erase(0,1);
if (str.size() == 0) break;
} }
return str; return str;
} }
string& trim_right(string& str) string& trim_right(string& str)
{ {
while (!isgraph(str[str.size()-1])) { while (str.size() && !isgraph(str[str.size()-1])) {
str = str.erase(str.size()-1,1); str = str.erase(str.size()-1,1);
if (str.size() == 0) break;
} }
return str; return str;
} }
@ -99,17 +98,17 @@ CLASS DECLARATION
string& to_upper(string& str) string& to_upper(string& str)
{ {
for (int i=0; i<str.size(); i++) str[i] = toupper(str[i]); for (size_t i=0; i<str.size(); i++) str[i] = toupper(str[i]);
return str; return str;
} }
string& to_lower(string& str) string& to_lower(string& str)
{ {
for (int i=0; i<str.size(); i++) str[i] = tolower(str[i]); for (size_t i=0; i<str.size(); i++) str[i] = tolower(str[i]);
return str; return str;
} }
bool is_number(string& str) bool is_number(const string& str)
{ {
return (str.find_first_not_of("+-.0123456789Ee") == string::npos); return (str.find_first_not_of("+-.0123456789Ee") == string::npos);
} }
@ -117,7 +116,7 @@ CLASS DECLARATION
vector <string> split(string str, char d) vector <string> split(string str, char d)
{ {
vector <string> str_array; vector <string> str_array;
int index=0; size_t index=0;
string temp = ""; string temp = "";
trim(str); trim(str);
@ -142,3 +141,4 @@ CLASS DECLARATION
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#endif #endif

View file

@ -38,7 +38,12 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGColumnVector3.h" #include "FGColumnVector3.h"
#include <cstdio> #include <iostream>
#include <sstream>
#include <iomanip>
#include <cmath>
using namespace std;
namespace JSBSim { namespace JSBSim {
@ -57,11 +62,13 @@ FGColumnVector3::FGColumnVector3(void)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
string FGColumnVector3::Dump(string delimeter) const string FGColumnVector3::Dump(const string& delimiter) const
{ {
char buffer[256]; ostringstream buffer;
sprintf(buffer, "%18.16f%s%18.16f%s%18.16f", Entry(1), delimeter.c_str(), Entry(2), delimeter.c_str(), Entry(3)); buffer << std::setw(18) << std::setprecision(16) << Entry(1) << delimiter;
return string(buffer); buffer << std::setw(18) << std::setprecision(16) << Entry(2) << delimiter;
buffer << std::setw(18) << std::setprecision(16) << Entry(3);
return buffer.str();
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View file

@ -39,20 +39,8 @@ SENTRY
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <cstdlib> #include <iosfwd>
#include <string> #include <string>
#include <fstream>
#include <iostream>
#include <cmath>
using std::ostream;
using std::istream;
using std::cerr;
using std::cout;
using std::endl;
using std::sqrt;
using std::string;
#include "FGJSBBase.h" #include "FGJSBBase.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -149,7 +137,7 @@ public:
/** Prints the contents of the vector /** Prints the contents of the vector
@param delimeter the item separator (tab or comma) @param delimeter the item separator (tab or comma)
@return a string with the delimeter-separated contents of the vector */ @return a string with the delimeter-separated contents of the vector */
string Dump(string delimeter) const; std::string Dump(const std::string& delimeter) const;
/** Assignment operator. /** Assignment operator.
@param b source vector. @param b source vector.
@ -291,7 +279,7 @@ inline FGColumnVector3 operator*(double scalar, const FGColumnVector3& A) {
@param os Stream to write to. @param os Stream to write to.
@param M Matrix to write. @param M Matrix to write.
Write the matrix to a stream.*/ Write the matrix to a stream.*/
ostream& operator<<(ostream& os, const FGColumnVector3& col); std::ostream& operator<<(std::ostream& os, const FGColumnVector3& col);
} // namespace JSBSim } // namespace JSBSim

View file

@ -35,7 +35,12 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGCondition.h" #include "FGCondition.h"
#include <vector> #include "input_output/FGXMLElement.h"
#include "input_output/FGPropertyManager.h"
#include <iostream>
#include <cstdlib>
using namespace std;
namespace JSBSim { namespace JSBSim {
@ -91,7 +96,7 @@ FGCondition::FGCondition(Element* element, FGPropertyManager* PropertyManager) :
// This constructor is called when there are no nested test groups inside the // This constructor is called when there are no nested test groups inside the
// condition // condition
FGCondition::FGCondition(string test, FGPropertyManager* PropertyManager) : FGCondition::FGCondition(const string& test, FGPropertyManager* PropertyManager) :
PropertyManager(PropertyManager), isGroup(false) PropertyManager(PropertyManager), isGroup(false)
{ {
string property1, property2, compare_string; string property1, property2, compare_string;

View file

@ -38,9 +38,7 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <map> #include <map>
#include <FGJSBBase.h> #include "FGJSBBase.h"
#include <input_output/FGXMLElement.h>
#include <input_output/FGPropertyManager.h>
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS
@ -54,6 +52,9 @@ FORWARD DECLARATIONS
namespace JSBSim { namespace JSBSim {
class FGPropertyManager;
class Element;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS DOCUMENTATION CLASS DOCUMENTATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
@ -69,7 +70,7 @@ class FGCondition : public FGJSBBase
{ {
public: public:
FGCondition(Element* element, FGPropertyManager* PropertyManager); FGCondition(Element* element, FGPropertyManager* PropertyManager);
FGCondition(string test, FGPropertyManager* PropertyManager); FGCondition(const std::string& test, FGPropertyManager* PropertyManager);
~FGCondition(void); ~FGCondition(void);
bool Evaluate(void); bool Evaluate(void);
@ -78,18 +79,18 @@ public:
private: private:
enum eComparison {ecUndef=0, eEQ, eNE, eGT, eGE, eLT, eLE}; enum eComparison {ecUndef=0, eEQ, eNE, eGT, eGE, eLT, eLE};
enum eLogic {elUndef=0, eAND, eOR}; enum eLogic {elUndef=0, eAND, eOR};
map <string, eComparison> mComparison; std::map <std::string, eComparison> mComparison;
eLogic Logic; eLogic Logic;
FGPropertyManager *TestParam1, *TestParam2, *PropertyManager; FGPropertyManager *TestParam1, *TestParam2, *PropertyManager;
double TestValue; double TestValue;
eComparison Comparison; eComparison Comparison;
bool isGroup; bool isGroup;
string conditional; std::string conditional;
static string indent; static std::string indent;
vector <FGCondition*> conditions; std::vector <FGCondition*> conditions;
void InitializeConditionals(void); void InitializeConditionals(void);
void Debug(int from); void Debug(int from);

View file

@ -28,12 +28,17 @@ Purpose: Stores various parameter types for functions
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <stdio.h> #include <sstream>
#include <iomanip>
#include <cstdlib>
#include "FGFunction.h" #include "FGFunction.h"
#include "FGTable.h" #include "FGTable.h"
#include "FGPropertyValue.h" #include "FGPropertyValue.h"
#include "FGRealValue.h" #include "FGRealValue.h"
#include "input_output/FGXMLElement.h"
#include "input_output/FGPropertyManager.h"
using namespace std;
namespace JSBSim { namespace JSBSim {
@ -44,12 +49,11 @@ static const char *IdHdr = ID_FUNCTION;
CLASS IMPLEMENTATION CLASS IMPLEMENTATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
FGFunction::FGFunction(FGPropertyManager* propMan, Element* el, string prefix) FGFunction::FGFunction(FGPropertyManager* propMan, Element* el, const string& prefix)
: PropertyManager(propMan), Prefix(prefix) : PropertyManager(propMan), Prefix(prefix)
{ {
Element* element; Element* element;
string operation, property_name; string operation, property_name;
int size = el->GetNumElements();
cached = false; cached = false;
cachedValue = -HUGE_VAL; cachedValue = -HUGE_VAL;
@ -320,12 +324,10 @@ double FGFunction::GetValue(void) const
string FGFunction::GetValueAsString(void) const string FGFunction::GetValueAsString(void) const
{ {
char buffer[20]; ostringstream buffer;
string value;
sprintf(buffer,"%9.6f",GetValue()); buffer << setw(9) << setprecision(6) << GetValue();
value = string(buffer); return buffer.str();
return value;
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View file

@ -37,8 +37,6 @@ INCLUDES
#include <vector> #include <vector>
#include <string> #include <string>
#include "FGParameter.h" #include "FGParameter.h"
#include <input_output/FGXMLElement.h>
#include <input_output/FGPropertyManager.h>
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS
@ -52,6 +50,9 @@ FORWARD DECLARATIONS
namespace JSBSim { namespace JSBSim {
class FGPropertyManager;
class Element;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS DOCUMENTATION CLASS DOCUMENTATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
@ -165,7 +166,7 @@ public:
@param prefix an optional prefix to prepend to the name given to the property @param prefix an optional prefix to prepend to the name given to the property
that represents this function (if given). that represents this function (if given).
*/ */
FGFunction(FGPropertyManager* PropertyManager, Element* element, string prefix=""); FGFunction(FGPropertyManager* PropertyManager, Element* element, const std::string& prefix="");
/// Destructor. /// Destructor.
virtual ~FGFunction(); virtual ~FGFunction();
@ -175,10 +176,10 @@ public:
/** The value that the function evaluates to, as a string. /** The value that the function evaluates to, as a string.
@return the value of the function as a string. */ @return the value of the function as a string. */
string GetValueAsString(void) const; std::string GetValueAsString(void) const;
/// Retrieves the name of the function. /// Retrieves the name of the function.
string GetName(void) const {return Name;} std::string GetName(void) const {return Name;}
/** Specifies whether to cache the value of the function, so it is calculated only /** Specifies whether to cache the value of the function, so it is calculated only
once per frame. once per frame.
@ -189,44 +190,44 @@ public:
void cacheValue(bool shouldCache); void cacheValue(bool shouldCache);
private: private:
vector <FGParameter*> Parameters; std::vector <FGParameter*> Parameters;
FGPropertyManager* const PropertyManager; FGPropertyManager* const PropertyManager;
bool cached; bool cached;
string Prefix; std::string Prefix;
string description_string; std::string description_string;
string property_string; std::string property_string;
string value_string; std::string value_string;
string table_string; std::string table_string;
string p_string; std::string p_string;
string v_string; std::string v_string;
string t_string; std::string t_string;
string function_string; std::string function_string;
string sum_string; std::string sum_string;
string difference_string; std::string difference_string;
string product_string; std::string product_string;
string quotient_string; std::string quotient_string;
string pow_string; std::string pow_string;
string exp_string; std::string exp_string;
string abs_string; std::string abs_string;
string sin_string; std::string sin_string;
string cos_string; std::string cos_string;
string tan_string; std::string tan_string;
string asin_string; std::string asin_string;
string acos_string; std::string acos_string;
string atan_string; std::string atan_string;
string atan2_string; std::string atan2_string;
string min_string; std::string min_string;
string max_string; std::string max_string;
string avg_string; std::string avg_string;
string fraction_string; std::string fraction_string;
string mod_string; std::string mod_string;
string random_string; std::string random_string;
string integer_string; std::string integer_string;
double cachedValue; double cachedValue;
enum functionType {eTopLevel=0, eProduct, eDifference, eSum, eQuotient, ePow, enum functionType {eTopLevel=0, eProduct, eDifference, eSum, eQuotient, ePow,
eExp, eAbs, eSin, eCos, eTan, eASin, eACos, eATan, eATan2, eExp, eAbs, eSin, eCos, eTan, eASin, eACos, eATan, eATan2,
eMin, eMax, eAvg, eFrac, eInteger, eMod, eRandom} Type; eMin, eMax, eAvg, eFrac, eInteger, eMod, eRandom} Type;
string Name; std::string Name;
void bind(void); void bind(void);
void Debug(int from); void Debug(int from);
}; };

View file

@ -41,7 +41,7 @@ INCLUDES
#include <cmath> #include <cmath>
#include "FGLocation.h" #include "FGLocation.h"
#include <input_output/FGPropertyManager.h> #include "input_output/FGPropertyManager.h"
namespace JSBSim { namespace JSBSim {

View file

@ -39,8 +39,8 @@ SENTRY
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <FGJSBBase.h> #include "FGJSBBase.h"
#include <input_output/FGPropertyManager.h> #include "input_output/FGPropertyManager.h"
#include "FGColumnVector3.h" #include "FGColumnVector3.h"
#include "FGMatrix33.h" #include "FGMatrix33.h"

View file

@ -40,6 +40,10 @@ INCLUDES
#include "FGMatrix33.h" #include "FGMatrix33.h"
#include "FGColumnVector3.h" #include "FGColumnVector3.h"
#include <iostream>
using namespace std;
namespace JSBSim { namespace JSBSim {
static const char *IdSrc = "$Id$"; static const char *IdSrc = "$Id$";

View file

@ -40,18 +40,8 @@ SENTRY
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <cstdlib>
#include <string> #include <string>
#include <fstream> #include <iosfwd>
#include <iostream>
#include <cmath>
using std::ostream;
using std::istream;
using std::cerr;
using std::cout;
using std::endl;
using std::string;
#include "FGColumnVector3.h" #include "FGColumnVector3.h"
#include "FGJSBBase.h" #include "FGJSBBase.h"
@ -84,7 +74,7 @@ DECLARATION: MatrixException
class MatrixException : public FGJSBBase class MatrixException : public FGJSBBase
{ {
public: public:
string Message; std::string Message;
}; };
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -450,7 +440,7 @@ inline FGMatrix33 operator*(double scalar, const FGMatrix33& A) {
Write the matrix to a stream. Write the matrix to a stream.
*/ */
ostream& operator<<(ostream& os, const FGMatrix33& M); std::ostream& operator<<(std::ostream& os, const FGMatrix33& M);
/** Read matrix from a stream. /** Read matrix from a stream.
@ -459,7 +449,7 @@ ostream& operator<<(ostream& os, const FGMatrix33& M);
Read matrix from a stream. Read matrix from a stream.
*/ */
istream& operator>>(istream& is, FGMatrix33& M); std::istream& operator>>(std::istream& is, FGMatrix33& M);
} // namespace JSBSim } // namespace JSBSim

View file

@ -35,7 +35,7 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGParameter.h" #include "FGParameter.h"
#include <input_output/FGPropertyManager.h> #include "input_output/FGPropertyManager.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS

View file

@ -40,10 +40,10 @@ SENTRY
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <FGJSBBase.h> #include "FGJSBBase.h"
#include "FGMatrix33.h" #include "FGMatrix33.h"
#include "FGColumnVector3.h" #include "FGColumnVector3.h"
#include <input_output/FGPropertyManager.h> #include "input_output/FGPropertyManager.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS

View file

@ -37,7 +37,11 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGTable.h" #include "FGTable.h"
#include <iomanip> #include "input_output/FGXMLElement.h"
#include "input_output/FGPropertyManager.h"
#include <iostream>
#include <sstream>
#include <cstdlib>
using namespace std; using namespace std;
@ -307,7 +311,7 @@ FGTable::~FGTable()
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
unsigned int FGTable::FindNumColumns(string test_line) unsigned int FGTable::FindNumColumns(const string& test_line)
{ {
// determine number of data columns in table (first column is row lookup - don't count) // determine number of data columns in table (first column is row lookup - don't count)
size_t position=0; size_t position=0;
@ -466,7 +470,7 @@ double FGTable::GetValue(double rowKey, double colKey, double tableKey) const
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGTable::operator<<(stringstream& in_stream) void FGTable::operator<<(istream& in_stream)
{ {
int startRow=0; int startRow=0;
int startCol=0; int startCol=0;
@ -488,7 +492,7 @@ void FGTable::operator<<(stringstream& in_stream)
FGTable& FGTable::operator<<(const double n) FGTable& FGTable::operator<<(const double n)
{ {
Data[rowCounter][colCounter] = n; Data[rowCounter][colCounter] = n;
if (colCounter == nCols) { if (colCounter == (int)nCols) {
colCounter = 0; colCounter = 0;
rowCounter++; rowCounter++;
} else { } else {

View file

@ -38,11 +38,10 @@ SENTRY
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <input_output/FGXMLElement.h>
#include "FGParameter.h" #include "FGParameter.h"
#include <input_output/FGPropertyManager.h> #include <iosfwd>
#include <sstream>
#include <vector> #include <vector>
#include <string>
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS
@ -54,11 +53,11 @@ DEFINITIONS
FORWARD DECLARATIONS FORWARD DECLARATIONS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
using std::vector;
using std::stringstream;
namespace JSBSim { namespace JSBSim {
class FGPropertyManager;
class Element;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS DOCUMENTATION CLASS DOCUMENTATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
@ -280,7 +279,7 @@ public:
</pre> </pre>
*/ */
void operator<<(stringstream&); void operator<<(std::istream&);
FGTable& operator<<(const double n); FGTable& operator<<(const double n);
FGTable& operator<<(const int n); FGTable& operator<<(const int n);
@ -298,16 +297,16 @@ private:
bool internal; bool internal;
FGPropertyManager *lookupProperty[3]; FGPropertyManager *lookupProperty[3];
double** Data; double** Data;
vector <FGTable*> Tables; std::vector <FGTable*> Tables;
unsigned int FindNumColumns(string);
unsigned int nRows, nCols, nTables, dimension; unsigned int nRows, nCols, nTables, dimension;
int colCounter, rowCounter, tableCounter; int colCounter, rowCounter, tableCounter;
mutable int lastRowIndex, lastColumnIndex, lastTableIndex; mutable int lastRowIndex, lastColumnIndex, lastTableIndex;
double** Allocate(void); double** Allocate(void);
FGPropertyManager* const PropertyManager; FGPropertyManager* const PropertyManager;
string Name; std::string Name;
void bind(void); void bind(void);
unsigned int FindNumColumns(const std::string&);
void Debug(int from); void Debug(int from);
}; };
} }

View file

@ -36,13 +36,19 @@ HISTORY
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <iostream>
#include <sstream>
#include <iomanip>
#include <cstdlib>
#include <FGFDMExec.h> #include <FGFDMExec.h>
#include "FGAerodynamics.h" #include "FGAerodynamics.h"
#include "FGPropagate.h" #include "FGPropagate.h"
#include "FGAircraft.h" #include "FGAircraft.h"
#include "FGAuxiliary.h" #include "FGAuxiliary.h"
#include "FGMassBalance.h" #include "FGMassBalance.h"
#include <input_output/FGPropertyManager.h> #include "input_output/FGPropertyManager.h"
using namespace std;
namespace JSBSim { namespace JSBSim {
@ -324,21 +330,21 @@ bool FGAerodynamics::Load(Element *element)
Debug(2); Debug(2);
if (temp_element = document->FindElement("alphalimits")) { if ((temp_element = document->FindElement("alphalimits"))) {
scratch_unit = temp_element->GetAttributeValue("unit"); scratch_unit = temp_element->GetAttributeValue("unit");
if (scratch_unit.empty()) scratch_unit = "RAD"; if (scratch_unit.empty()) scratch_unit = "RAD";
alphaclmin = temp_element->FindElementValueAsNumberConvertFromTo("min", scratch_unit, "RAD"); alphaclmin = temp_element->FindElementValueAsNumberConvertFromTo("min", scratch_unit, "RAD");
alphaclmax = temp_element->FindElementValueAsNumberConvertFromTo("max", scratch_unit, "RAD"); alphaclmax = temp_element->FindElementValueAsNumberConvertFromTo("max", scratch_unit, "RAD");
} }
if (temp_element = document->FindElement("hysteresis_limits")) { if ((temp_element = document->FindElement("hysteresis_limits"))) {
scratch_unit = temp_element->GetAttributeValue("unit"); scratch_unit = temp_element->GetAttributeValue("unit");
if (scratch_unit.empty()) scratch_unit = "RAD"; if (scratch_unit.empty()) scratch_unit = "RAD";
alphahystmin = temp_element->FindElementValueAsNumberConvertFromTo("min", scratch_unit, "RAD"); alphahystmin = temp_element->FindElementValueAsNumberConvertFromTo("min", scratch_unit, "RAD");
alphahystmax = temp_element->FindElementValueAsNumberConvertFromTo("max", scratch_unit, "RAD"); alphahystmax = temp_element->FindElementValueAsNumberConvertFromTo("max", scratch_unit, "RAD");
} }
if (temp_element = document->FindElement("aero_ref_pt_shift_x")) { if ((temp_element = document->FindElement("aero_ref_pt_shift_x"))) {
function_element = temp_element->FindElement("function"); function_element = temp_element->FindElement("function");
AeroRPShift = new FGFunction(PropertyManager, function_element); AeroRPShift = new FGFunction(PropertyManager, function_element);
} }
@ -415,7 +421,7 @@ void FGAerodynamics::DetermineAxisSystem()
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
string FGAerodynamics::GetCoefficientStrings(string delimeter) string FGAerodynamics::GetCoefficientStrings(const string& delimeter) const
{ {
string CoeffStrings = ""; string CoeffStrings = "";
bool firstime = true; bool firstime = true;
@ -445,33 +451,24 @@ string FGAerodynamics::GetCoefficientStrings(string delimeter)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
string FGAerodynamics::GetCoefficientValues(string delimeter) string FGAerodynamics::GetCoefficientValues(const string& delimeter) const
{ {
string SDValues = ""; ostringstream buf;
bool firstime = true;
unsigned int sd;
for (sd = 0; sd < variables.size(); sd++) { buf.precision(6);
if (firstime) { for (unsigned int sd = 0; sd < variables.size(); sd++) {
firstime = false; if (buf.tellp() > 0) buf << delimeter;
} else { buf << setw(9) << variables[sd]->GetValue();
SDValues += delimeter;
}
SDValues += variables[sd]->GetValueAsString();
} }
for (unsigned int axis = 0; axis < 6; axis++) { for (unsigned int axis = 0; axis < 6; axis++) {
for (unsigned int sd = 0; sd < Coeff[axis].size(); sd++) { for (unsigned int sd = 0; sd < Coeff[axis].size(); sd++) {
if (firstime) { if (buf.tellp() > 0) buf << delimeter;
firstime = false; buf << setw(9) << Coeff[axis][sd]->GetValue();
} else {
SDValues += delimeter;
}
SDValues += Coeff[axis][sd]->GetValueAsString();
} }
} }
return SDValues; return buf.str();
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -558,6 +555,9 @@ void FGAerodynamics::Debug(int from)
case (atBodyXYZ): case (atBodyXYZ):
cout << endl << " Aerodynamics (X|Y|Z axes):" << endl << endl; cout << endl << " Aerodynamics (X|Y|Z axes):" << endl << endl;
break; break;
case (atNone):
cout << endl << " Aerodynamics (undefined axes):" << endl << endl;
break;
} }
} }
} }

View file

@ -38,14 +38,15 @@ SENTRY
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <string>
#include <vector> #include <vector>
#include <map> #include <map>
#include "FGModel.h" #include "FGModel.h"
#include <math/FGFunction.h> #include "math/FGFunction.h"
#include <math/FGColumnVector3.h> #include "math/FGColumnVector3.h"
#include <math/FGMatrix33.h> #include "math/FGMatrix33.h"
#include <input_output/FGXMLFileRead.h> #include "input_output/FGXMLFileRead.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS
@ -188,13 +189,13 @@ public:
/** Gets the strings for the current set of coefficients. /** Gets the strings for the current set of coefficients.
@param delimeter either a tab or comma string depending on output type @param delimeter either a tab or comma string depending on output type
@return a string containing the descriptive names for all coefficients */ @return a string containing the descriptive names for all coefficients */
string GetCoefficientStrings(string delimeter); std::string GetCoefficientStrings(const std::string& delimeter) const;
/** Gets the coefficient values. /** Gets the coefficient values.
@param delimeter either a tab or comma string depending on output type @param delimeter either a tab or comma string depending on output type
@return a string containing the numeric values for the current set of @return a string containing the numeric values for the current set of
coefficients */ coefficients */
string GetCoefficientValues(string delimeter); std::string GetCoefficientValues(const std::string& delimeter) const;
/** Calculates and returns the wind-to-body axis transformation matrix. /** Calculates and returns the wind-to-body axis transformation matrix.
@return a reference to the wind-to-body transformation matrix. @return a reference to the wind-to-body transformation matrix.
@ -206,14 +207,14 @@ public:
*/ */
FGMatrix33& GetTb2w(void); FGMatrix33& GetTb2w(void);
vector <FGFunction*> * GetCoeff(void) const { return Coeff; } std::vector <FGFunction*> * GetCoeff(void) const { return Coeff; }
private: private:
enum eAxisType {atNone, atLiftDrag, atAxialNormal, atBodyXYZ} axisType; enum eAxisType {atNone, atLiftDrag, atAxialNormal, atBodyXYZ} axisType;
typedef map<string,int> AxisIndex; typedef std::map<std::string,int> AxisIndex;
AxisIndex AxisIdx; AxisIndex AxisIdx;
FGFunction* AeroRPShift; FGFunction* AeroRPShift;
vector <FGFunction*> variables; std::vector <FGFunction*> variables;
typedef vector <FGFunction*> CoeffArray; typedef vector <FGFunction*> CoeffArray;
CoeffArray* Coeff; CoeffArray* Coeff;
FGColumnVector3 vFnative; FGColumnVector3 vFnative;

View file

@ -50,9 +50,13 @@ INCLUDES
#include "FGExternalReactions.h" #include "FGExternalReactions.h"
#include "FGBuoyantForces.h" #include "FGBuoyantForces.h"
#include "FGAerodynamics.h" #include "FGAerodynamics.h"
#include <FGFDMExec.h> #include "FGFDMExec.h"
#include "FGPropagate.h" #include "FGPropagate.h"
#include <input_output/FGPropertyManager.h> #include "FGPropulsion.h"
#include "input_output/FGPropertyManager.h"
#include <iostream>
using namespace std;
namespace JSBSim { namespace JSBSim {

View file

@ -38,11 +38,12 @@ SENTRY
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <string>
#include <vector> #include <vector>
#include "FGModel.h" #include "FGModel.h"
#include <input_output/FGXMLElement.h> #include "input_output/FGXMLElement.h"
#include <math/FGColumnVector3.h> #include "math/FGColumnVector3.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS
@ -131,7 +132,7 @@ public:
/** Gets the aircraft name /** Gets the aircraft name
@return the name of the aircraft as a string type */ @return the name of the aircraft as a string type */
inline string GetAircraftName(void) { return AircraftName; } const std::string& GetAircraftName(void) const { return AircraftName; }
/// Gets the wing area /// Gets the wing area
double GetWingArea(void) const { return WingArea; } double GetWingArea(void) const { return WingArea; }
@ -163,7 +164,7 @@ public:
inline double GetXYZrp(int idx) const { return vXYZrp(idx); } inline double GetXYZrp(int idx) const { return vXYZrp(idx); }
inline double GetXYZvrp(int idx) const { return vXYZvrp(idx); } inline double GetXYZvrp(int idx) const { return vXYZvrp(idx); }
inline double GetXYZep(int idx) const { return vXYZep(idx); } inline double GetXYZep(int idx) const { return vXYZep(idx); }
inline void SetAircraftName(string name) {AircraftName = name;} inline void SetAircraftName(const std::string& name) {AircraftName = name;}
inline void SetHoldDown(int hd) {HoldDown = hd;} inline void SetHoldDown(int hd) {HoldDown = hd;}
inline int GetHoldDown(void) const {return HoldDown;} inline int GetHoldDown(void) const {return HoldDown;}
@ -193,7 +194,7 @@ private:
double HTailArea, VTailArea, HTailArm, VTailArm; double HTailArea, VTailArea, HTailArm, VTailArm;
double lbarh,lbarv,vbarh,vbarv; double lbarh,lbarv,vbarh,vbarv;
int HoldDown; int HoldDown;
string AircraftName; std::string AircraftName;
void Debug(int from); void Debug(int from);
}; };

View file

@ -48,12 +48,16 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGAtmosphere.h" #include "FGAtmosphere.h"
#include <FGState.h> #include "FGState.h"
#include <FGFDMExec.h> #include "FGFDMExec.h"
#include "FGAircraft.h" #include "FGAircraft.h"
#include "FGPropagate.h" #include "FGPropagate.h"
#include "FGInertial.h" #include "FGInertial.h"
#include <input_output/FGPropertyManager.h> #include "input_output/FGPropertyManager.h"
#include <iostream>
#include <cstdlib>
using namespace std;
namespace JSBSim { namespace JSBSim {
@ -454,10 +458,12 @@ void FGAtmosphere::Turbulence(void)
vDirectiondAccelDt(eX) = GaussianRandomNumber(); vDirectiondAccelDt(eX) = GaussianRandomNumber();
vDirectiondAccelDt(eY) = GaussianRandomNumber(); vDirectiondAccelDt(eY) = GaussianRandomNumber();
vDirectiondAccelDt(eZ) = GaussianRandomNumber(); vDirectiondAccelDt(eZ) = GaussianRandomNumber();
/*
MagnitudedAccelDt = GaussianRandomNumber(); MagnitudedAccelDt = GaussianRandomNumber();
MagnitudeAccel += MagnitudedAccelDt * DeltaT; MagnitudeAccel += MagnitudedAccelDt * DeltaT;
Magnitude += MagnitudeAccel * DeltaT; Magnitude += MagnitudeAccel * DeltaT;
*/
Magnitude += GaussianRandomNumber() * DeltaT;
vDirectiondAccelDt.Normalize(); vDirectiondAccelDt.Normalize();
vDirectionAccel += TurbRate * vDirectiondAccelDt * DeltaT; vDirectionAccel += TurbRate * vDirectiondAccelDt * DeltaT;

View file

@ -43,7 +43,7 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGModel.h" #include "FGModel.h"
#include <math/FGColumnVector3.h> #include "math/FGColumnVector3.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS

View file

@ -44,14 +44,18 @@ INCLUDES
#include "FGAerodynamics.h" #include "FGAerodynamics.h"
#include "FGPropagate.h" #include "FGPropagate.h"
#include "FGAtmosphere.h" #include "FGAtmosphere.h"
#include <FGFDMExec.h> #include "FGFDMExec.h"
#include "FGAircraft.h" #include "FGAircraft.h"
#include "FGInertial.h" #include "FGInertial.h"
#include "FGExternalReactions.h" #include "FGExternalReactions.h"
#include "FGBuoyantForces.h" #include "FGBuoyantForces.h"
#include "FGGroundReactions.h" #include "FGGroundReactions.h"
#include "FGPropulsion.h" #include "FGPropulsion.h"
#include <input_output/FGPropertyManager.h> #include "FGMassBalance.h"
#include "input_output/FGPropertyManager.h"
#include <iostream>
using namespace std;
namespace JSBSim { namespace JSBSim {
@ -392,6 +396,13 @@ void FGAuxiliary::CalculateRelativePosition(void)
relative_position = sqrt(lat_relative_position*lat_relative_position + lon_relative_position*lon_relative_position); relative_position = sqrt(lat_relative_position*lat_relative_position + lon_relative_position*lon_relative_position);
}; };
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
double FGAuxiliary::BadUnits(void) const
{
cerr << "Bad units" << endl; return 0.0;
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// The bitmasked value choices are as follows: // The bitmasked value choices are as follows:
// unset: In this case (the default) JSBSim would only print // unset: In this case (the default) JSBSim would only print

View file

@ -40,9 +40,8 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGModel.h" #include "FGModel.h"
#include <FGFDMExec.h> #include "math/FGColumnVector3.h"
#include <math/FGColumnVector3.h> #include "math/FGLocation.h"
#include <math/FGLocation.h>
#include "FGPropagate.h" #include "FGPropagate.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -172,15 +171,15 @@ public:
double GetMagBeta (void) const { return fabs(beta); } double GetMagBeta (void) const { return fabs(beta); }
double Getalpha (int unit) const { if (unit == inDegrees) return alpha*radtodeg; double Getalpha (int unit) const { if (unit == inDegrees) return alpha*radtodeg;
else cerr << "Bad units" << endl; return 0.0;} else return BadUnits(); }
double Getbeta (int unit) const { if (unit == inDegrees) return beta*radtodeg; double Getbeta (int unit) const { if (unit == inDegrees) return beta*radtodeg;
else cerr << "Bad units" << endl; return 0.0;} else return BadUnits(); }
double Getadot (int unit) const { if (unit == inDegrees) return adot*radtodeg; double Getadot (int unit) const { if (unit == inDegrees) return adot*radtodeg;
else cerr << "Bad units" << endl; return 0.0;} else return BadUnits(); }
double Getbdot (int unit) const { if (unit == inDegrees) return bdot*radtodeg; double Getbdot (int unit) const { if (unit == inDegrees) return bdot*radtodeg;
else cerr << "Bad units" << endl; return 0.0;} else return BadUnits(); }
double GetMagBeta (int unit) const { if (unit == inDegrees) return fabs(beta)*radtodeg; double GetMagBeta (int unit) const { if (unit == inDegrees) return fabs(beta)*radtodeg;
else cerr << "Bad units" << endl; return 0.0;} else return BadUnits(); }
double Getqbar (void) const { return qbar; } double Getqbar (void) const { return qbar; }
double GetqbarUW (void) const { return qbarUW; } double GetqbarUW (void) const { return qbarUW; }
@ -281,6 +280,7 @@ private:
void CalculateRelativePosition(void); void CalculateRelativePosition(void);
void bind(void); void bind(void);
double BadUnits(void) const;
void Debug(int from); void Debug(int from);
}; };

View file

@ -38,7 +38,10 @@ INCLUDES
#include "FGBuoyantForces.h" #include "FGBuoyantForces.h"
#include "FGMassBalance.h" #include "FGMassBalance.h"
#include <input_output/FGPropertyManager.h> // Need? #include "input_output/FGPropertyManager.h" // Need?
#include <iostream>
using namespace std;
namespace JSBSim { namespace JSBSim {

View file

@ -44,8 +44,8 @@ INCLUDES
#include "FGModel.h" #include "FGModel.h"
#include "FGGasCell.h" #include "FGGasCell.h"
#include <math/FGColumnVector3.h> #include "math/FGColumnVector3.h"
#include <input_output/FGXMLFileRead.h> #include "input_output/FGXMLFileRead.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS

View file

@ -53,6 +53,10 @@
*/ */
#include "FGExternalForce.h" #include "FGExternalForce.h"
#include "input_output/FGXMLElement.h"
#include <iostream>
using namespace std;
namespace JSBSim { namespace JSBSim {

View file

@ -39,13 +39,13 @@ SENTRY
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <FGFDMExec.h> #include "FGFDMExec.h"
#include <FGJSBBase.h> #include "FGJSBBase.h"
#include <models/propulsion/FGForce.h> #include "models/propulsion/FGForce.h"
#include <string> #include <string>
#include <input_output/FGPropertyManager.h> #include "input_output/FGPropertyManager.h"
#include <math/FGColumnVector3.h> #include "math/FGColumnVector3.h"
#include <math/FGFunction.h> #include "math/FGFunction.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS

View file

@ -37,8 +37,12 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGExternalReactions.h" #include "FGExternalReactions.h"
#include "input_output/FGXMLElement.h"
#include <iostream>
#include <string> #include <string>
using namespace std;
namespace JSBSim { namespace JSBSim {
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View file

@ -40,7 +40,7 @@ INCLUDES
#include "FGModel.h" #include "FGModel.h"
#include "FGExternalForce.h" #include "FGExternalForce.h"
#include <input_output/FGXMLElement.h> #include <vector>
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS
@ -54,6 +54,8 @@ FORWARD DECLARATIONS
namespace JSBSim { namespace JSBSim {
class Element;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS DOCUMENTATION CLASS DOCUMENTATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
@ -154,7 +156,7 @@ public:
private: private:
vector <FGExternalForce*> Forces; std::vector <FGExternalForce*> Forces;
unsigned int numForces; unsigned int numForces;
FGColumnVector3 vTotalForces; FGColumnVector3 vTotalForces;
FGColumnVector3 vTotalMoments; FGColumnVector3 vTotalMoments;

View file

@ -38,24 +38,28 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGFCS.h" #include "FGFCS.h"
#include <FGFDMExec.h> #include "FGFDMExec.h"
#include <input_output/FGPropertyManager.h> #include "FGGroundReactions.h"
#include "input_output/FGPropertyManager.h"
#include <fstream> #include <fstream>
#include <sstream> #include <sstream>
#include <iomanip> #include <iomanip>
#include <models/flight_control/FGFilter.h> #include "models/flight_control/FGFilter.h"
#include <models/flight_control/FGDeadBand.h> #include "models/flight_control/FGDeadBand.h"
#include <models/flight_control/FGGain.h> #include "models/flight_control/FGGain.h"
#include <models/flight_control/FGPID.h> #include "models/flight_control/FGPID.h"
#include <models/flight_control/FGSwitch.h> #include "models/flight_control/FGSwitch.h"
#include <models/flight_control/FGSummer.h> #include "models/flight_control/FGSummer.h"
#include <models/flight_control/FGKinemat.h> #include "models/flight_control/FGKinemat.h"
#include <models/flight_control/FGFCSFunction.h> #include "models/flight_control/FGFCSFunction.h"
#include <models/flight_control/FGSensor.h> #include "models/flight_control/FGSensor.h"
#include <models/flight_control/FGActuator.h> #include "models/flight_control/FGActuator.h"
#include <models/flight_control/FGAccelerometer.h> #include "models/flight_control/FGAccelerometer.h"
#include <models/flight_control/FGGyro.h> #include "models/flight_control/FGMagnetometer.h"
#include "models/flight_control/FGGyro.h"
using namespace std;
namespace JSBSim { namespace JSBSim {
@ -643,6 +647,8 @@ bool FGFCS::Load(Element* el, SystemType systype)
Components->push_back(new FGSensor(this, component_element)); Components->push_back(new FGSensor(this, component_element));
} else if (component_element->GetName() == string("accelerometer")) { } else if (component_element->GetName() == string("accelerometer")) {
Components->push_back(new FGAccelerometer(this, component_element)); Components->push_back(new FGAccelerometer(this, component_element));
} else if (component_element->GetName() == string("magnetometer")) {
Components->push_back(new FGMagnetometer(this, component_element));
} else if (component_element->GetName() == string("gyro")) { } else if (component_element->GetName() == string("gyro")) {
Components->push_back(new FGGyro(this, component_element)); Components->push_back(new FGGyro(this, component_element));
} else { } else {
@ -682,7 +688,7 @@ double FGFCS::GetBrake(FGLGear::BrakeGroup bg)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
string FGFCS::FindSystemFullPathname(string system_filename) string FGFCS::FindSystemFullPathname(const string& system_filename)
{ {
string fullpath, localpath; string fullpath, localpath;
string systemPath = FDMExec->GetSystemsPath(); string systemPath = FDMExec->GetSystemsPath();
@ -710,7 +716,7 @@ string FGFCS::FindSystemFullPathname(string system_filename)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ifstream* FGFCS::FindSystemFile(string system_filename) ifstream* FGFCS::FindSystemFile(const string& system_filename)
{ {
string fullpath, localpath; string fullpath, localpath;
string systemPath = FDMExec->GetSystemsPath(); string systemPath = FDMExec->GetSystemsPath();
@ -735,7 +741,7 @@ ifstream* FGFCS::FindSystemFile(string system_filename)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
string FGFCS::GetComponentStrings(string delimeter) string FGFCS::GetComponentStrings(const string& delimiter)
{ {
unsigned int comp; unsigned int comp;
string CompStrings = ""; string CompStrings = "";
@ -744,7 +750,7 @@ string FGFCS::GetComponentStrings(string delimeter)
for (unsigned int i=0; i<Systems.size(); i++) { for (unsigned int i=0; i<Systems.size(); i++) {
if (firstime) firstime = false; if (firstime) firstime = false;
else CompStrings += delimeter; else CompStrings += delimiter;
CompStrings += Systems[i]->GetName(); CompStrings += Systems[i]->GetName();
total_count++; total_count++;
@ -753,7 +759,7 @@ string FGFCS::GetComponentStrings(string delimeter)
for (comp = 0; comp < APComponents.size(); comp++) for (comp = 0; comp < APComponents.size(); comp++)
{ {
if (firstime) firstime = false; if (firstime) firstime = false;
else CompStrings += delimeter; else CompStrings += delimiter;
CompStrings += APComponents[comp]->GetName(); CompStrings += APComponents[comp]->GetName();
total_count++; total_count++;
@ -761,7 +767,7 @@ string FGFCS::GetComponentStrings(string delimeter)
for (comp = 0; comp < FCSComponents.size(); comp++) { for (comp = 0; comp < FCSComponents.size(); comp++) {
if (firstime) firstime = false; if (firstime) firstime = false;
else CompStrings += delimeter; else CompStrings += delimiter;
CompStrings += FCSComponents[comp]->GetName(); CompStrings += FCSComponents[comp]->GetName();
total_count++; total_count++;
@ -772,7 +778,7 @@ string FGFCS::GetComponentStrings(string delimeter)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
string FGFCS::GetComponentValues(string delimeter) string FGFCS::GetComponentValues(const string& delimiter)
{ {
std::ostringstream buf; std::ostringstream buf;
@ -782,7 +788,7 @@ string FGFCS::GetComponentValues(string delimeter)
for (unsigned int i=0; i<Systems.size(); i++) { for (unsigned int i=0; i<Systems.size(); i++) {
if (firstime) firstime = false; if (firstime) firstime = false;
else buf << delimeter; else buf << delimiter;
buf << setprecision(9) << Systems[i]->GetOutput(); buf << setprecision(9) << Systems[i]->GetOutput();
total_count++; total_count++;
@ -790,7 +796,7 @@ string FGFCS::GetComponentValues(string delimeter)
for (comp = 0; comp < APComponents.size(); comp++) { for (comp = 0; comp < APComponents.size(); comp++) {
if (firstime) firstime = false; if (firstime) firstime = false;
else buf << delimeter; else buf << delimiter;
buf << setprecision(9) << APComponents[comp]->GetOutput(); buf << setprecision(9) << APComponents[comp]->GetOutput();
total_count++; total_count++;
@ -798,7 +804,7 @@ string FGFCS::GetComponentValues(string delimeter)
for (comp = 0; comp < FCSComponents.size(); comp++) { for (comp = 0; comp < FCSComponents.size(); comp++) {
if (firstime) firstime = false; if (firstime) firstime = false;
else buf << delimeter; else buf << delimiter;
buf << setprecision(9) << FCSComponents[comp]->GetOutput(); buf << setprecision(9) << FCSComponents[comp]->GetOutput();
total_count++; total_count++;

View file

@ -38,13 +38,14 @@ SENTRY
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <iosfwd>
#include <vector> #include <vector>
#include <string> #include <string>
#include <models/flight_control/FGFCSComponent.h> #include "models/flight_control/FGFCSComponent.h"
#include <models/FGModel.h> #include "models/FGModel.h"
#include <models/FGLGear.h> #include "models/FGLGear.h"
#include <input_output/FGXMLFileRead.h> #include "input_output/FGXMLFileRead.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS
@ -352,15 +353,15 @@ public:
FGState* GetState(void) { return State; } FGState* GetState(void) { return State; }
/** Retrieves all component names for inclusion in output stream /** Retrieves all component names for inclusion in output stream
@param delimeter either a tab or comma string depending on output type @param delimiter either a tab or comma string depending on output type
@return a string containing the descriptive names for all components */ @return a string containing the descriptive names for all components */
string GetComponentStrings(string delimeter); std::string GetComponentStrings(const std::string& delimiter);
/** Retrieves all component outputs for inclusion in output stream /** Retrieves all component outputs for inclusion in output stream
@param delimeter either a tab or comma string depending on output type @param delimiter either a tab or comma string depending on output type
@return a string containing the numeric values for the current set of @return a string containing the numeric values for the current set of
component outputs */ component outputs */
string GetComponentValues(string delimeter); std::string GetComponentValues(const std::string& delimiter);
/// @name Pilot input command setting /// @name Pilot input command setting
//@{ //@{
@ -537,8 +538,8 @@ public:
@return true if succesful */ @return true if succesful */
bool Load(Element* el, SystemType systype); bool Load(Element* el, SystemType systype);
ifstream* FindSystemFile(string system_filename); std::ifstream* FindSystemFile(const std::string& system_filename);
string FindSystemFullPathname(string system_filename); std::string FindSystemFullPathname(const std::string& system_filename);
void AddThrottle(void); void AddThrottle(void);
void AddGear(void); void AddGear(void);
@ -551,20 +552,20 @@ private:
double DePos[NForms], DaLPos[NForms], DaRPos[NForms], DrPos[NForms]; double DePos[NForms], DaLPos[NForms], DaRPos[NForms], DrPos[NForms];
double DfPos[NForms], DsbPos[NForms], DspPos[NForms]; double DfPos[NForms], DsbPos[NForms], DspPos[NForms];
double PTrimCmd, YTrimCmd, RTrimCmd; double PTrimCmd, YTrimCmd, RTrimCmd;
vector <double> ThrottleCmd; std::vector <double> ThrottleCmd;
vector <double> ThrottlePos; std::vector <double> ThrottlePos;
vector <double> MixtureCmd; std::vector <double> MixtureCmd;
vector <double> MixturePos; std::vector <double> MixturePos;
vector <double> PropAdvanceCmd; std::vector <double> PropAdvanceCmd;
vector <double> PropAdvance; std::vector <double> PropAdvance;
vector <bool> PropFeatherCmd; std::vector <bool> PropFeatherCmd;
vector <bool> PropFeather; std::vector <bool> PropFeather;
vector <double> SteerPosDeg; std::vector <double> SteerPosDeg;
double LeftBrake, RightBrake, CenterBrake; // Brake settings double LeftBrake, RightBrake, CenterBrake; // Brake settings
double GearCmd,GearPos; double GearCmd,GearPos;
double TailhookPos, WingFoldPos; double TailhookPos, WingFoldPos;
typedef vector <FGFCSComponent*> FCSCompVec; typedef std::vector <FGFCSComponent*> FCSCompVec;
FCSCompVec Systems; FCSCompVec Systems;
FCSCompVec FCSComponents; FCSCompVec FCSComponents;
FCSCompVec APComponents; FCSCompVec APComponents;

View file

@ -35,16 +35,21 @@ HISTORY
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <FGFDMExec.h> #include "FGFDMExec.h"
#include <models/FGAuxiliary.h> #include "models/FGAuxiliary.h"
#include <models/FGAtmosphere.h> #include "models/FGAtmosphere.h"
#include <models/FGInertial.h> #include "models/FGInertial.h"
#include <models/FGMassBalance.h> #include "models/FGMassBalance.h"
#include "FGGasCell.h" #include "FGGasCell.h"
#include "input_output/FGXMLElement.h"
#include <iostream>
#include <cstdlib>
using std::cerr; using std::cerr;
using std::endl; using std::endl;
using std::cout; using std::cout;
using std::string;
using std::max;
namespace JSBSim { namespace JSBSim {

View file

@ -39,17 +39,12 @@ SENTRY
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <FGJSBBase.h> #include "FGJSBBase.h"
#include <input_output/FGXMLElement.h> #include "math/FGColumnVector3.h"
#include <math/FGColumnVector3.h> #include "models/propulsion/FGForce.h"
#include <models/propulsion/FGForce.h> #include "math/FGFunction.h"
#include <math/FGFunction.h>
#include <string> #include <string>
using std::string;
using std::cerr;
using std::endl;
using std::cout;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS
@ -64,6 +59,7 @@ FORWARD DECLARATIONS
namespace JSBSim { namespace JSBSim {
class FGBallonet; class FGBallonet;
class Element;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS DOCUMENTATION CLASS DOCUMENTATION
@ -230,7 +226,7 @@ private:
enum GasType {ttUNKNOWN, ttHYDROGEN, ttHELIUM, ttAIR}; enum GasType {ttUNKNOWN, ttHYDROGEN, ttHELIUM, ttAIR};
GasType Type; GasType Type;
string type; std::string type;
int CellNum; int CellNum;
// Structural constants // Structural constants
double MaxVolume; // [ft<66>] double MaxVolume; // [ft<66>]

View file

@ -39,7 +39,10 @@ INCLUDES
#include <iomanip> #include <iomanip>
#include "FGGroundReactions.h" #include "FGGroundReactions.h"
#include <input_output/FGPropertyManager.h> #include "FGFCS.h"
#include "input_output/FGPropertyManager.h"
using namespace std;
namespace JSBSim { namespace JSBSim {
@ -95,8 +98,8 @@ bool FGGroundReactions::Run(void)
// Perhaps there is some commonality for things which only need to be // Perhaps there is some commonality for things which only need to be
// calculated once. // calculated once.
for (unsigned int i=0; i<lGear.size(); i++) { for (unsigned int i=0; i<lGear.size(); i++) {
vForces += lGear[i]->Force(); vForces += lGear[i]->GetBodyForces();
vMoments += lGear[i]->Moment(); vMoments += lGear[i]->GetMoments();
} }
return false; return false;

View file

@ -42,8 +42,8 @@ INCLUDES
#include "FGModel.h" #include "FGModel.h"
#include "FGLGear.h" #include "FGLGear.h"
#include <math/FGColumnVector3.h> #include "math/FGColumnVector3.h"
#include <input_output/FGXMLElement.h> #include "input_output/FGXMLElement.h"
#define ID_GROUNDREACTIONS "$Id$" #define ID_GROUNDREACTIONS "$Id$"

View file

@ -36,10 +36,13 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGInertial.h" #include "FGInertial.h"
#include <FGFDMExec.h> #include "FGFDMExec.h"
#include "FGPropagate.h" #include "FGPropagate.h"
#include "FGState.h" #include "FGState.h"
#include "FGMassBalance.h" #include "FGMassBalance.h"
#include <iostream>
using namespace std;
namespace JSBSim { namespace JSBSim {

View file

@ -41,7 +41,7 @@ INCLUDES
#include <vector> #include <vector>
#include "FGModel.h" #include "FGModel.h"
#include <math/FGColumnVector3.h> #include "math/FGColumnVector3.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS

View file

@ -42,8 +42,14 @@ INCLUDES
#include "FGState.h" #include "FGState.h"
#include "FGFDMExec.h" #include "FGFDMExec.h"
#include <fstream> #include "input_output/FGfdmSocket.h"
#include "input_output/FGXMLElement.h"
#include <sstream>
#include <iomanip> #include <iomanip>
#include <cstdlib>
using namespace std;
namespace JSBSim { namespace JSBSim {
@ -89,10 +95,8 @@ bool FGInput::InitModel(void)
bool FGInput::Run(void) bool FGInput::Run(void)
{ {
string line, token, info_string; string line, token;
int start=0, string_start=0, string_end=0; size_t start=0, string_start=0, string_end=0;
int token_start=0, token_end=0;
char buf[100];
double value=0; double value=0;
FGPropertyManager* node=0; FGPropertyManager* node=0;
@ -158,8 +162,9 @@ bool FGInput::Run(void)
socket->Reply("Must be in HOLD to search properties\n"); socket->Reply("Must be in HOLD to search properties\n");
} }
} else if (node > 0) { } else if (node > 0) {
sprintf(buf, "%s = %12.6f\n", argument.c_str(), node->getDoubleValue()); ostringstream buf;
socket->Reply(buf); buf << argument << " = " << setw(12) << setprecision(6) << node->getDoubleValue() << endl;
socket->Reply(buf.str());
} }
} else if (command == "hold") { // PAUSE } else if (command == "hold") { // PAUSE
@ -181,12 +186,12 @@ bool FGInput::Run(void)
} else if (command == "info") { // INFO } else if (command == "info") { // INFO
// get info about the sim run and/or aircraft, etc. // get info about the sim run and/or aircraft, etc.
sprintf(buf, "%8.3f\0", State->Getsim_time()); ostringstream info;
info_string = "JSBSim version: " + JSBSim_version + "\n"; info << "JSBSim version: " << JSBSim_version << endl;
info_string += "Config File version: " + needed_cfg_version + "\n"; info << "Config File version: " << needed_cfg_version << endl;
info_string += "Aircraft simulated: " + Aircraft->GetAircraftName() + "\n"; info << "Aircraft simulated: " << Aircraft->GetAircraftName() << endl;
info_string += "Simulation time: " + string(buf) + "\n"; info << "Simulation time: " << setw(8) << setprecision(3) << State->Getsim_time() << endl;
socket->Reply(info_string); socket->Reply(info.str());
} else if (command == "help") { // HELP } else if (command == "help") { // HELP

View file

@ -40,11 +40,7 @@ INCLUDES
#include "FGModel.h" #include "FGModel.h"
#include <iostream> #include <string>
#include <fstream>
#include <input_output/FGfdmSocket.h>
#include <input_output/FGXMLElement.h>
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS
@ -58,6 +54,10 @@ FORWARD DECLARATIONS
namespace JSBSim { namespace JSBSim {
class FGFDMExec;
class Element;
class FGfdmSocket;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS DOCUMENTATION CLASS DOCUMENTATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
@ -78,7 +78,6 @@ public:
bool InitModel(void); bool InitModel(void);
bool Run(void); bool Run(void);
void SetType(string);
inline void Enable(void) { enabled = true; } inline void Enable(void) { enabled = true; }
inline void Disable(void) { enabled = false; } inline void Disable(void) { enabled = false; }
inline bool Toggle(void) {enabled = !enabled; return enabled;} inline bool Toggle(void) {enabled = !enabled; return enabled;}
@ -88,7 +87,7 @@ private:
bool sFirstPass, dFirstPass, enabled; bool sFirstPass, dFirstPass, enabled;
unsigned int port; unsigned int port;
FGfdmSocket* socket; FGfdmSocket* socket;
string data; std::string data;
void Debug(int from); void Debug(int from);
}; };
} }

View file

@ -41,6 +41,16 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGLGear.h" #include "FGLGear.h"
#include "FGState.h"
#include "FGGroundReactions.h"
#include "FGFCS.h"
#include "FGAuxiliary.h"
#include "FGAtmosphere.h"
#include "FGMassBalance.h"
#include "math/FGTable.h"
#include <cstdlib>
using namespace std;
namespace JSBSim { namespace JSBSim {
@ -55,13 +65,18 @@ GLOBAL DATA
static const char *IdSrc = "$Id$"; static const char *IdSrc = "$Id$";
static const char *IdHdr = ID_LGEAR; static const char *IdHdr = ID_LGEAR;
// Body To Structural (body frame is rotated 180 deg about Y and lengths are given in
// ft instead of inches)
const FGMatrix33 FGLGear::Tb2s(-1./inchtoft, 0., 0., 0., 1./inchtoft, 0., 0., 0., -1./inchtoft);
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS IMPLEMENTATION CLASS IMPLEMENTATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
FGLGear::FGLGear(Element* el, FGFDMExec* fdmex, int number) : FGLGear::FGLGear(Element* el, FGFDMExec* fdmex, int number) :
FGForce(fdmex),
GearNumber(number), GearNumber(number),
Exec(fdmex) SteerAngle(0.0)
{ {
Element *force_table=0; Element *force_table=0;
Element *dampCoeff=0; Element *dampCoeff=0;
@ -81,7 +96,8 @@ FGLGear::FGLGear(Element* el, FGFDMExec* fdmex, int number) :
} else if (sContactType == "STRUCTURE") { } else if (sContactType == "STRUCTURE") {
eContactType = ctSTRUCTURE; eContactType = ctSTRUCTURE;
} else { } else {
eContactType = ctUNKNOWN; // Unknown contact point types will be treated as STRUCTURE.
eContactType = ctSTRUCTURE;
} }
if (el->FindElement("spring_coeff")) if (el->FindElement("spring_coeff"))
@ -125,7 +141,7 @@ FGLGear::FGLGear(Element* el, FGFDMExec* fdmex, int number) :
while (force_table) { while (force_table) {
force_type = force_table->GetAttributeValue("type"); force_type = force_table->GetAttributeValue("type");
if (force_type == "CORNERING_COEFF") { if (force_type == "CORNERING_COEFF") {
ForceY_Table = new FGTable(Exec->GetPropertyManager(), force_table); ForceY_Table = new FGTable(fdmex->GetPropertyManager(), force_table);
} else { } else {
cerr << "Undefined force table for " << name << " contact point" << endl; cerr << "Undefined force table for " << name << " contact point" << endl;
} }
@ -139,8 +155,37 @@ FGLGear::FGLGear(Element* el, FGFDMExec* fdmex, int number) :
else sSteerType = "STEERABLE"; else sSteerType = "STEERABLE";
Element* element = el->FindElement("location"); Element* element = el->FindElement("location");
if (element) vXYZ = element->FindElementTripletConvertTo("IN"); if (element) vXYZn = element->FindElementTripletConvertTo("IN");
else {cerr << "No location given for contact " << name << endl; exit(-1);} else {cerr << "No location given for contact " << name << endl; exit(-1);}
SetTransformType(FGForce::tCustom);
element = el->FindElement("orientation");
if (element && (eContactType == ctBOGEY)) {
vGearOrient = element->FindElementTripletConvertTo("RAD");
double cp,sp,cr,sr,cy,sy;
cp=cos(vGearOrient(ePitch)); sp=sin(vGearOrient(ePitch));
cr=cos(vGearOrient(eRoll)); sr=sin(vGearOrient(eRoll));
cy=cos(vGearOrient(eYaw)); sy=sin(vGearOrient(eYaw));
mTGear(1,1) = cp*cy;
mTGear(2,1) = cp*sy;
mTGear(3,1) = -sp;
mTGear(1,2) = sr*sp*cy - cr*sy;
mTGear(2,2) = sr*sp*sy + cr*cy;
mTGear(3,2) = sr*cp;
mTGear(1,3) = cr*sp*cy + sr*sy;
mTGear(2,3) = cr*sp*sy - sr*cy;
mTGear(3,3) = cr*cp;
}
else {
mTGear(1,1) = 1.;
mTGear(2,2) = 1.;
mTGear(3,3) = 1.;
}
if (sBrakeGroup == "LEFT" ) eBrakeGrp = bgLeft; if (sBrakeGroup == "LEFT" ) eBrakeGrp = bgLeft;
else if (sBrakeGroup == "RIGHT" ) eBrakeGrp = bgRight; else if (sBrakeGroup == "RIGHT" ) eBrakeGrp = bgRight;
@ -178,7 +223,13 @@ FGLGear::FGLGear(Element* el, FGFDMExec* fdmex, int number) :
} }
} }
State = Exec->GetState(); State = fdmex->GetState();
Aircraft = fdmex->GetAircraft();
Propagate = fdmex->GetPropagate();
Auxiliary = fdmex->GetAuxiliary();
FCS = fdmex->GetFCS();
MassBalance = fdmex->GetMassBalance();
LongForceLagFilterCoeff = 1/State->Getdt(); // default longitudinal force filter coefficient LongForceLagFilterCoeff = 1/State->Getdt(); // default longitudinal force filter coefficient
LatForceLagFilterCoeff = 1/State->Getdt(); // default lateral force filter coefficient LatForceLagFilterCoeff = 1/State->Getdt(); // default lateral force filter coefficient
@ -213,13 +264,6 @@ FGLGear::FGLGear(Element* el, FGFDMExec* fdmex, int number) :
// Add some AI here to determine if gear is located properly according to its // Add some AI here to determine if gear is located properly according to its
// brake group type ?? // brake group type ??
State = Exec->GetState();
Aircraft = Exec->GetAircraft();
Propagate = Exec->GetPropagate();
Auxiliary = Exec->GetAuxiliary();
FCS = Exec->GetFCS();
MassBalance = Exec->GetMassBalance();
WOW = lastWOW = false; WOW = lastWOW = false;
ReportEnable = true; ReportEnable = true;
FirstContact = false; FirstContact = false;
@ -229,11 +273,9 @@ FGLGear::FGLGear(Element* el, FGFDMExec* fdmex, int number) :
MaximumStrutForce = MaximumStrutTravel = 0.0; MaximumStrutForce = MaximumStrutTravel = 0.0;
SinkRate = GroundSpeed = 0.0; SinkRate = GroundSpeed = 0.0;
vWhlBodyVec = MassBalance->StructuralToBody(vXYZ); vWhlBodyVec = MassBalance->StructuralToBody(vXYZn);
vLocalGear = Propagate->GetTb2l() * vWhlBodyVec; vLocalGear = Propagate->GetTb2l() * vWhlBodyVec;
vWhlVelVec.InitMatrix();
vLocalWhlVel.InitMatrix();
compressLength = 0.0; compressLength = 0.0;
compressSpeed = 0.0; compressSpeed = 0.0;
@ -263,36 +305,38 @@ FGLGear::~FGLGear()
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FGColumnVector3& FGLGear::Force(void) FGColumnVector3& FGLGear::GetBodyForces(void)
{ {
double t = Exec->GetState()->Getsim_time(); double t = fdmex->GetState()->Getsim_time();
dT = State->Getdt()*Exec->GetGroundReactions()->GetRate(); dT = State->Getdt()*fdmex->GetGroundReactions()->GetRate();
vForce.InitMatrix(); vFn.InitMatrix();
vLocalForce.InitMatrix();
vMoment.InitMatrix();
if (isRetractable) ComputeRetractionState(); if (isRetractable) ComputeRetractionState();
if (GearDown) { if (GearDown) {
double verticalZProj = 0.;
vWhlBodyVec = MassBalance->StructuralToBody(vXYZ); // Get wheel in body frame vWhlBodyVec = MassBalance->StructuralToBody(vXYZn); // Get wheel in body frame
vLocalGear = Propagate->GetTb2l() * vWhlBodyVec; // Get local frame wheel location vLocalGear = Propagate->GetTb2l() * vWhlBodyVec; // Get local frame wheel location
gearLoc = Propagate->GetLocation().LocalToLocation(vLocalGear); gearLoc = Propagate->GetLocation().LocalToLocation(vLocalGear);
// Compute the height of the theoretical location of the wheel (if strut is not compressed) with // Compute the height of the theoretical location of the wheel (if strut is not compressed) with
// respect to the ground level // respect to the ground level
double height = Exec->GetGroundCallback()->GetAGLevel(t, gearLoc, contact, normal, cvel); double height = fdmex->GetGroundCallback()->GetAGLevel(t, gearLoc, contact, normal, cvel);
vGroundNormal = -1. * Propagate->GetTec2b() * normal; vGroundNormal = -1. * Propagate->GetTec2b() * normal;
// The height returned above is the AGL and is expressed in the Z direction of the local
// coordinate frame. We now need to transform this height in actual compression of the strut (BOGEY)
// of in the normal direction to the ground (STRUCTURE)
switch (eContactType) { switch (eContactType) {
case ctBOGEY: case ctBOGEY:
// Project the height in the local coordinate frame of the strut to compute the actual compression verticalZProj = (Propagate->GetTb2l()*mTGear*FGColumnVector3(0.,0.,1.))(eZ);
// length. The strut is assumed to be parallel to Z in the body frame. compressLength = verticalZProj > 0.0 ? -height / verticalZProj : 0.0;
compressLength = vGroundNormal(eZ) < 0.0 ? height / vGroundNormal(eZ) : 0.0;
break; break;
case ctSTRUCTURE: case ctSTRUCTURE:
compressLength = -height; verticalZProj = (Propagate->GetTec2l()*normal)(eZ);
compressLength = fabs(verticalZProj) > 0.0 ? -height / verticalZProj : 0.0;
break; break;
} }
@ -303,20 +347,28 @@ FGColumnVector3& FGLGear::Force(void)
// [The next equation should really use the vector to the contact patch of // [The next equation should really use the vector to the contact patch of
// the tire including the strut compression and not the original vWhlBodyVec.] // the tire including the strut compression and not the original vWhlBodyVec.]
FGColumnVector3 vWhlContactVec = vWhlBodyVec - FGColumnVector3(0., 0., compressLength); FGColumnVector3 vWhlDisplVec = mTGear * FGColumnVector3(0., 0., compressLength);
vWhlVelVec = Propagate->GetPQR() * vWhlContactVec; FGColumnVector3 vWhlContactVec = vWhlBodyVec - vWhlDisplVec;
vWhlVelVec += Propagate->GetUVW() - Propagate->GetTec2b() * cvel; vActingXYZn = vXYZn - Tb2s * vWhlDisplVec;
FGColumnVector3 vBodyWhlVel = Propagate->GetPQR() * vWhlContactVec;
vBodyWhlVel += Propagate->GetUVW() - Propagate->GetTec2b() * cvel;
vWhlVelVec = mTGear.Transposed() * vBodyWhlVel;
InitializeReporting(); InitializeReporting();
ComputeSteeringAngle(); ComputeSteeringAngle();
ComputeGroundCoordSys(); ComputeGroundCoordSys();
vLocalWhlVel = Tb2g * vWhlVelVec; vLocalWhlVel = Transform().Transposed() * vBodyWhlVel;
compressSpeed = -vLocalWhlVel(eZ); switch (eContactType) {
if (eContactType == ctBOGEY) case ctBOGEY:
// Project the compression speed in the local coordinate frame of the strut // Compression speed along the strut
compressSpeed /= -vGroundNormal(eZ); compressSpeed = -vWhlVelVec(eZ);
case ctSTRUCTURE:
// Compression speed along the ground normal
compressSpeed = -vLocalWhlVel(eX);
}
ComputeVerticalStrutForce(); ComputeVerticalStrutForce();
@ -325,15 +377,15 @@ FGColumnVector3& FGLGear::Force(void)
ComputeSlipAngle(); ComputeSlipAngle();
ComputeBrakeForceCoefficient(); ComputeBrakeForceCoefficient();
ComputeSideForceCoefficient(); ComputeSideForceCoefficient();
double sign = vLocalWhlVel(eX)>0?1.0:(vLocalWhlVel(eX)<0?-1.0:0.0); double sign = vLocalWhlVel(eY)>0?1.0:(vLocalWhlVel(eY)<0?-1.0:0.0);
vLocalForce(eX) = - ((1.0 - TirePressureNorm) * 30 + vLocalForce(eZ) * BrakeFCoeff) * sign; vFn(eY) = - ((1.0 - TirePressureNorm) * 30 + vFn(eX) * BrakeFCoeff) * sign;
vLocalForce(eY) = vLocalForce(eZ) * FCoeff; vFn(eZ) = vFn(eX) * FCoeff;
} }
else if (eContactType == ctSTRUCTURE) { else if (eContactType == ctSTRUCTURE) {
FGColumnVector3 vSlipVec = vLocalWhlVel; FGColumnVector3 vSlipVec = vLocalWhlVel;
vSlipVec(eZ) = 0.; vSlipVec(eX) = 0.;
vSlipVec.Normalize(); vSlipVec.Normalize();
vLocalForce -= staticFCoeff * vLocalForce(eZ) * vSlipVec; vFn -= staticFCoeff * vFn(eX) * vSlipVec;
} }
// Lag and attenuate the XY-plane forces dependent on velocity. This code // Lag and attenuate the XY-plane forces dependent on velocity. This code
@ -343,28 +395,25 @@ FGColumnVector3& FGLGear::Force(void)
// If a coefficient is set to something equal to or less than zero, the // If a coefficient is set to something equal to or less than zero, the
// filter is bypassed. // filter is bypassed.
if (LongForceLagFilterCoeff > 0) vLocalForce(eX) = LongForceFilter.execute(vLocalForce(eX)); if (LongForceLagFilterCoeff > 0) vFn(eY) = LongForceFilter.execute(vFn(eY));
if (LatForceLagFilterCoeff > 0) vLocalForce(eY) = LatForceFilter.execute(vLocalForce(eY)); if (LatForceLagFilterCoeff > 0) vFn(eZ) = LatForceFilter.execute(vFn(eZ));
if ((fabs(vLocalWhlVel(eX)) <= RFRV) && RFRV > 0) vLocalForce(eX) *= fabs(vLocalWhlVel(eX))/RFRV; if ((fabs(vLocalWhlVel(eY)) <= RFRV) && RFRV > 0) vFn(eY) *= fabs(vLocalWhlVel(eY))/RFRV;
if ((fabs(vLocalWhlVel(eY)) <= SFRV) && SFRV > 0) vLocalForce(eY) *= fabs(vLocalWhlVel(eY))/SFRV; if ((fabs(vLocalWhlVel(eZ)) <= SFRV) && SFRV > 0) vFn(eZ) *= fabs(vLocalWhlVel(eZ))/SFRV;
// End section for attenuating gear jitter // End section for attenuating gear jitter
// Transform the forces back to the body frame and compute the moment.
vForce = Tg2b * vLocalForce;
vMoment = vWhlContactVec * vForce;
} else { // Gear is NOT compressed } else { // Gear is NOT compressed
WOW = false; WOW = false;
compressLength = 0.0; compressLength = 0.0;
compressSpeed = 0.0; compressSpeed = 0.0;
WheelSlip = 0.0;
StrutForce = 0.0;
// Let wheel spin down slowly // Let wheel spin down slowly
vLocalWhlVel(eX) -= 13.0*dT; vWhlVelVec(eX) -= 13.0*dT;
if (vLocalWhlVel(eX) < 0.0) vLocalWhlVel(eX) = 0.0; if (vWhlVelVec(eX) < 0.0) vWhlVelVec(eX) = 0.0;
// Return to neutral position between 1.0 and 0.8 gear pos. // Return to neutral position between 1.0 and 0.8 gear pos.
SteerAngle *= max(GetGearUnitPos()-0.8, 0.0)/0.2; SteerAngle *= max(GetGearUnitPos()-0.8, 0.0)/0.2;
@ -381,64 +430,46 @@ FGColumnVector3& FGLGear::Force(void)
lastWOW = WOW; lastWOW = WOW;
return vForce; return FGForce::GetBodyForces();
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// Build a local "ground" coordinate system defined by // Build a local "ground" coordinate system defined by
// eX : projection of the rolling direction on the ground // eX : normal to the ground
// eY : projection of the sliping direction on the ground // eY : projection of the rolling direction on the ground
// eZ : normal to the ground // eZ : projection of the sliping direction on the ground
void FGLGear::ComputeGroundCoordSys(void) void FGLGear::ComputeGroundCoordSys(void)
{ {
FGColumnVector3 vRollingGroundVec; // Euler angles are built up to create a local frame to describe the forces
// applied to the gear by the ground. Here pitch, yaw and roll do not have
// any physical meaning. It is just a convenient notation.
// First, "pitch" and "yaw" are determined in order to align eX with the
// ground normal.
if (vGroundNormal(eZ) < -1.0)
vOrient(ePitch) = 0.5*M_PI;
else if (1.0 < vGroundNormal(eZ))
vOrient(ePitch) = -0.5*M_PI;
else
vOrient(ePitch) = asin(-vGroundNormal(eZ));
if (fabs(vOrient(ePitch)) == 0.5*M_PI)
vOrient(eYaw) = 0.;
else
vOrient(eYaw) = atan2(vGroundNormal(eY), vGroundNormal(eX));
vOrient(eRoll) = 0.;
UpdateCustomTransformMatrix();
if (eContactType == ctBOGEY) { if (eContactType == ctBOGEY) {
// Compute the rolling direction projected on the ground // In the case of a bogey, the third angle "roll" is used to align the axis eY and eZ
// It consists in finding a vector 'r' such that 'r' lies in the plane (w,z) and r.n = 0 (scalar // to the rolling and sliping direction respectively.
// product) where: FGColumnVector3 updatedRollingAxis = Transform().Transposed() * mTGear
// 'n' is the normal to the ground, * FGColumnVector3(-sin(SteerAngle), cos(SteerAngle), 0.);
// (x,y,z) are the directions defined in the body coord system
// and 'w' is 'x' rotated by the steering angle (SteerAngle) in the plane (x,y). vOrient(eRoll) = atan2(updatedRollingAxis(eY), -updatedRollingAxis(eZ));
// r = u * w + v * z and r.n = 0 => v/u = -w.n/z.n = a UpdateCustomTransformMatrix();
// We also want u**2+v**2=1 and u > 0 (i.e. r orientated in the same 'direction' than w)
// after some arithmetic, one finds that :
double a = -(vGroundNormal(eX)*cos(SteerAngle)+vGroundNormal(eY)*sin(SteerAngle)) / vGroundNormal(eZ);
double u = 1. / sqrt(1. + a*a);
double v = a * u;
vRollingGroundVec = FGColumnVector3(u * cos(SteerAngle), u * sin(SteerAngle), v);
} }
else {
// Here the only significant direction is the normal to the ground "vGroundNormal". Since there is
// no wheel the 2 other vectors of the orthonormal basis are not meaningful and are only used to
// create the transformation matrix Tg2b. So we are building vRollingGroundVec as an arbitrary
// vector normal to vGroundNormal
if (fabs(vGroundNormal(eX)) > 0.)
vRollingGroundVec = FGColumnVector3(-vGroundNormal(eZ)/vGroundNormal(eX), 0., 1.);
else if (fabs(vGroundNormal(eY)) > 0.)
vRollingGroundVec = FGColumnVector3(0., -vGroundNormal(eZ)/vGroundNormal(eY), 1.);
else
vRollingGroundVec = FGColumnVector3(1., 0., -vGroundNormal(eX)/vGroundNormal(eZ));
vRollingGroundVec.Normalize();
}
// The sliping direction is the cross product multiplication of the ground normal and rolling
// directions
FGColumnVector3 vSlipGroundVec = vGroundNormal * vRollingGroundVec;
Tg2b(1,1) = vRollingGroundVec(eX);
Tg2b(2,1) = vRollingGroundVec(eY);
Tg2b(3,1) = vRollingGroundVec(eZ);
Tg2b(1,2) = vSlipGroundVec(eX);
Tg2b(2,2) = vSlipGroundVec(eY);
Tg2b(3,2) = vSlipGroundVec(eZ);
Tg2b(1,3) = vGroundNormal(eX);
Tg2b(2,3) = vGroundNormal(eY);
Tg2b(3,3) = vGroundNormal(eZ);
Tb2g = Tg2b.Transposed();
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -450,7 +481,7 @@ void FGLGear::ComputeRetractionState(void)
GearUp = true; GearUp = true;
WOW = false; WOW = false;
GearDown = false; GearDown = false;
vLocalWhlVel.InitMatrix(); vWhlVelVec.InitMatrix();
} else if (gearPos > 0.99) { } else if (gearPos > 0.99) {
GearDown = true; GearDown = true;
GearUp = false; GearUp = false;
@ -465,7 +496,7 @@ void FGLGear::ComputeRetractionState(void)
void FGLGear::ComputeSlipAngle(void) void FGLGear::ComputeSlipAngle(void)
{ {
// Calculate tire slip angle. // Calculate tire slip angle.
WheelSlip = -atan2(vLocalWhlVel(eY), fabs(vLocalWhlVel(eX)))*radtodeg; WheelSlip = -atan2(vLocalWhlVel(eZ), fabs(vLocalWhlVel(eY)))*radtodeg;
// Filter the wheel slip angle // Filter the wheel slip angle
if (WheelSlipLagFilterCoeff > 0) WheelSlip = WheelSlipFilter.execute(WheelSlip); if (WheelSlipLagFilterCoeff > 0) WheelSlip = WheelSlipFilter.execute(WheelSlip);
@ -485,7 +516,7 @@ void FGLGear::ComputeSteeringAngle(void)
SteerAngle = 0.0; SteerAngle = 0.0;
break; break;
case stCaster: case stCaster:
SteerAngle = atan2(fabs(vWhlVelVec(eX)), vWhlVelVec(eY)); SteerAngle = atan2(vWhlVelVec(eY), fabs(vWhlVelVec(eX)));
break; break;
default: default:
cerr << "Improper steering type membership detected for this gear." << endl; cerr << "Improper steering type membership detected for this gear." << endl;
@ -540,7 +571,7 @@ void FGLGear::InitializeReporting(void)
void FGLGear::ReportTakeoffOrLanding(void) void FGLGear::ReportTakeoffOrLanding(void)
{ {
double deltaT = State->Getdt()*Exec->GetGroundReactions()->GetRate(); double deltaT = State->Getdt()*fdmex->GetGroundReactions()->GetRate();
if (FirstContact) if (FirstContact)
LandingDistanceTraveled += Auxiliary->GetVground()*deltaT; LandingDistanceTraveled += Auxiliary->GetVground()*deltaT;
@ -553,7 +584,7 @@ void FGLGear::ReportTakeoffOrLanding(void)
if ( ReportEnable if ( ReportEnable
&& Auxiliary->GetVground() <= 0.05 && Auxiliary->GetVground() <= 0.05
&& !LandingReported && !LandingReported
&& Exec->GetGroundReactions()->GetWOW()) && fdmex->GetGroundReactions()->GetWOW())
{ {
if (debug_lvl > 0) Report(erLand); if (debug_lvl > 0) Report(erLand);
} }
@ -561,7 +592,7 @@ void FGLGear::ReportTakeoffOrLanding(void)
if ( ReportEnable if ( ReportEnable
&& !TakeoffReported && !TakeoffReported
&& (Propagate->GetDistanceAGL() - vLocalGear(eZ)) > 50.0 && (Propagate->GetDistanceAGL() - vLocalGear(eZ)) > 50.0
&& !Exec->GetGroundReactions()->GetWOW()) && !fdmex->GetGroundReactions()->GetWOW())
{ {
if (debug_lvl > 0) Report(erTakeoff); if (debug_lvl > 0) Report(erTakeoff);
} }
@ -575,8 +606,8 @@ void FGLGear::ReportTakeoffOrLanding(void)
void FGLGear::CrashDetect(void) void FGLGear::CrashDetect(void)
{ {
if ( (compressLength > 500.0 || if ( (compressLength > 500.0 ||
vForce.Magnitude() > 100000000.0 || vFn.Magnitude() > 100000000.0 ||
vMoment.Magnitude() > 5000000000.0 || GetMoments().Magnitude() > 5000000000.0 ||
SinkRate > 1.4666*30 ) && !State->IntegrationSuspended()) SinkRate > 1.4666*30 ) && !State->IntegrationSuspended())
{ {
PutMessage("Crash Detected: Simulation FREEZE."); PutMessage("Crash Detected: Simulation FREEZE.");
@ -678,10 +709,10 @@ void FGLGear::ComputeVerticalStrutForce(void)
switch (eContactType) { switch (eContactType) {
case ctBOGEY: case ctBOGEY:
// Project back the strut force in the local coordinate frame of the ground // Project back the strut force in the local coordinate frame of the ground
vLocalForce(eZ) = StrutForce / vGroundNormal(eZ); vFn(eX) = StrutForce / (mTGear.Transposed()*vGroundNormal)(eZ);
break; break;
case ctSTRUCTURE: case ctSTRUCTURE:
vLocalForce(eZ) = -StrutForce; vFn(eX) = -StrutForce;
break; break;
} }
@ -711,30 +742,33 @@ void FGLGear::bind(void)
base_property_name = CreateIndexedPropertyName("gear/unit", GearNumber); base_property_name = CreateIndexedPropertyName("gear/unit", GearNumber);
if (eContactType == ctBOGEY) { if (eContactType == ctBOGEY) {
property_name = base_property_name + "/slip-angle-deg"; property_name = base_property_name + "/slip-angle-deg";
Exec->GetPropertyManager()->Tie( property_name.c_str(), &WheelSlip ); fdmex->GetPropertyManager()->Tie( property_name.c_str(), &WheelSlip );
property_name = base_property_name + "/WOW"; property_name = base_property_name + "/WOW";
Exec->GetPropertyManager()->Tie( property_name.c_str(), &WOW ); fdmex->GetPropertyManager()->Tie( property_name.c_str(), &WOW );
property_name = base_property_name + "/wheel-speed-fps"; property_name = base_property_name + "/wheel-speed-fps";
Exec->GetPropertyManager()->Tie( property_name.c_str(), (FGLGear*)this, fdmex->GetPropertyManager()->Tie( property_name.c_str(), (FGLGear*)this,
&FGLGear::GetWheelRollVel); &FGLGear::GetWheelRollVel);
property_name = base_property_name + "/z-position"; property_name = base_property_name + "/z-position";
Exec->GetPropertyManager()->Tie( property_name.c_str(), (FGLGear*)this, fdmex->GetPropertyManager()->Tie( property_name.c_str(), (FGForce*)this,
&FGLGear::GetZPosition, &FGLGear::SetZPosition); &FGForce::GetLocationZ, &FGForce::SetLocationZ);
property_name = base_property_name + "/compression-ft"; property_name = base_property_name + "/compression-ft";
Exec->GetPropertyManager()->Tie( property_name.c_str(), &compressLength ); fdmex->GetPropertyManager()->Tie( property_name.c_str(), &compressLength );
property_name = base_property_name + "/side_friction_coeff"; property_name = base_property_name + "/side_friction_coeff";
Exec->GetPropertyManager()->Tie( property_name.c_str(), &FCoeff ); fdmex->GetPropertyManager()->Tie( property_name.c_str(), &FCoeff );
property_name = base_property_name + "/static_friction_coeff"; property_name = base_property_name + "/static_friction_coeff";
Exec->GetPropertyManager()->Tie( property_name.c_str(), &staticFCoeff ); fdmex->GetPropertyManager()->Tie( property_name.c_str(), &staticFCoeff );
if (eSteerType == stCaster) {
property_name = base_property_name + "/steering-angle-rad";
fdmex->GetPropertyManager()->Tie( property_name.c_str(), &SteerAngle );
}
} }
if( isRetractable ) { if( isRetractable ) {
property_name = base_property_name + "/pos-norm"; property_name = base_property_name + "/pos-norm";
Exec->GetPropertyManager()->Tie( property_name.c_str(), &GearPos ); fdmex->GetPropertyManager()->Tie( property_name.c_str(), &GearPos );
} }
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -746,7 +780,7 @@ void FGLGear::Report(ReportType repType)
switch(repType) { switch(repType) {
case erLand: case erLand:
cout << endl << "Touchdown report for " << name << " (WOW at time: " cout << endl << "Touchdown report for " << name << " (WOW at time: "
<< Exec->GetState()->Getsim_time() << " seconds)" << endl; << fdmex->GetState()->Getsim_time() << " seconds)" << endl;
cout << " Sink rate at contact: " << SinkRate << " fps, " cout << " Sink rate at contact: " << SinkRate << " fps, "
<< SinkRate*0.3048 << " mps" << endl; << SinkRate*0.3048 << " mps" << endl;
cout << " Contact ground speed: " << GroundSpeed*.5925 << " knots, " cout << " Contact ground speed: " << GroundSpeed*.5925 << " knots, "
@ -761,18 +795,20 @@ void FGLGear::Report(ReportType repType)
break; break;
case erTakeoff: case erTakeoff:
cout << endl << "Takeoff report for " << name << " (Liftoff at time: " cout << endl << "Takeoff report for " << name << " (Liftoff at time: "
<< Exec->GetState()->Getsim_time() << " seconds)" << endl; << fdmex->GetState()->Getsim_time() << " seconds)" << endl;
cout << " Distance traveled: " << TakeoffDistanceTraveled cout << " Distance traveled: " << TakeoffDistanceTraveled
<< " ft, " << TakeoffDistanceTraveled*0.3048 << " meters" << endl; << " ft, " << TakeoffDistanceTraveled*0.3048 << " meters" << endl;
cout << " Distance traveled (over 50'): " << TakeoffDistanceTraveled50ft cout << " Distance traveled (over 50'): " << TakeoffDistanceTraveled50ft
<< " ft, " << TakeoffDistanceTraveled50ft*0.3048 << " meters" << endl; << " ft, " << TakeoffDistanceTraveled50ft*0.3048 << " meters" << endl;
cout << " [Altitude (ASL): " << Exec->GetPropagate()->GetAltitudeASL() << " ft. / " cout << " [Altitude (ASL): " << fdmex->GetPropagate()->GetAltitudeASL() << " ft. / "
<< Exec->GetPropagate()->GetAltitudeASLmeters() << " m | Temperature: " << fdmex->GetPropagate()->GetAltitudeASLmeters() << " m | Temperature: "
<< Exec->GetAtmosphere()->GetTemperature() - 459.67 << " F / " << fdmex->GetAtmosphere()->GetTemperature() - 459.67 << " F / "
<< RankineToCelsius(Exec->GetAtmosphere()->GetTemperature()) << " C]" << endl; << RankineToCelsius(fdmex->GetAtmosphere()->GetTemperature()) << " C]" << endl;
cout << " [Velocity (KCAS): " << Exec->GetAuxiliary()->GetVcalibratedKTS() << "]" << endl; cout << " [Velocity (KCAS): " << fdmex->GetAuxiliary()->GetVcalibratedKTS() << "]" << endl;
TakeoffReported = true; TakeoffReported = true;
break; break;
case erNone:
break;
} }
} }
@ -802,7 +838,7 @@ void FGLGear::Debug(int from)
if (debug_lvl & 1) { // Standard console startup message output if (debug_lvl & 1) { // Standard console startup message output
if (from == 0) { // Constructor - loading and initialization if (from == 0) { // Constructor - loading and initialization
cout << " " << sContactType << " " << name << endl; cout << " " << sContactType << " " << name << endl;
cout << " Location: " << vXYZ << endl; cout << " Location: " << vXYZn << endl;
cout << " Spring Constant: " << kSpring << endl; cout << " Spring Constant: " << kSpring << endl;
if (eDampType == dtLinear) if (eDampType == dtLinear)

View file

@ -38,11 +38,8 @@ SENTRY
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <FGJSBBase.h> #include "models/propulsion/FGForce.h"
#include <FGFDMExec.h> #include "math/FGColumnVector3.h"
#include <input_output/FGXMLElement.h>
#include <math/FGColumnVector3.h>
#include <math/FGTable.h>
#include <string> #include <string>
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -63,6 +60,8 @@ class FGFCS;
class FGState; class FGState;
class FGMassBalance; class FGMassBalance;
class FGAuxiliary; class FGAuxiliary;
class FGTable;
class Element;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS DOCUMENTATION CLASS DOCUMENTATION
@ -199,7 +198,7 @@ CLASS DOCUMENTATION
CLASS DECLARATION CLASS DECLARATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
class FGLGear : public FGJSBBase class FGLGear : public FGForce
{ {
public: public:
/// Brake grouping enumerators /// Brake grouping enumerators
@ -207,7 +206,7 @@ public:
/// Steering group membership enumerators /// Steering group membership enumerators
enum SteerType {stSteer, stFixed, stCaster}; enum SteerType {stSteer, stFixed, stCaster};
/// Contact point type /// Contact point type
enum ContactType {ctBOGEY, ctSTRUCTURE, ctUNKNOWN}; enum ContactType {ctBOGEY, ctSTRUCTURE};
/// Report type enumerators /// Report type enumerators
enum ReportType {erNone=0, erTakeoff, erLand}; enum ReportType {erNone=0, erTakeoff, erLand};
/// Damping types /// Damping types
@ -222,9 +221,7 @@ public:
~FGLGear(); ~FGLGear();
/// The Force vector for this gear /// The Force vector for this gear
FGColumnVector3& Force(void); FGColumnVector3& GetBodyForces(void);
/// The Moment vector for this gear
FGColumnVector3& Moment(void) {return vMoment;}
/// Gets the location of the gear in Body axes /// Gets the location of the gear in Body axes
FGColumnVector3& GetBodyLocation(void) { return vWhlBodyVec; } FGColumnVector3& GetBodyLocation(void) { return vWhlBodyVec; }
@ -269,35 +266,34 @@ public:
int GetBrakeGroup(void) const { return (int)eBrakeGrp; } int GetBrakeGroup(void) const { return (int)eBrakeGrp; }
int GetSteerType(void) const { return (int)eSteerType; } int GetSteerType(void) const { return (int)eSteerType; }
double GetZPosition(void) const { return vXYZ(3); } bool GetSteerable(void) const { return eSteerType != stFixed; }
void SetZPosition(double z) { vXYZ(3) = z; }
bool GetSteerable(void) const { return eSteerType != stFixed; }
bool GetRetractable(void) const { return isRetractable; } bool GetRetractable(void) const { return isRetractable; }
bool GetGearUnitUp(void) const { return GearUp; } bool GetGearUnitUp(void) const { return GearUp; }
bool GetGearUnitDown(void) const { return GearDown; } bool GetGearUnitDown(void) const { return GearDown; }
double GetWheelSideForce(void) const { return vLocalForce(eY); } double GetWheelRollForce(void) {
double GetWheelRollForce(void) const { return vLocalForce(eX); } FGColumnVector3 vForce = mTGear.Transposed() * FGForce::GetBodyForces();
double GetWheelSideVel(void) const { return vWhlVelVec(eY); } return vForce(eX)*cos(SteerAngle) + vForce(eY)*sin(SteerAngle); }
double GetWheelRollVel(void) const { return vWhlVelVec(eX); } double GetWheelSideForce(void) {
double GetBodyXForce(void) const { return vForce(eX); } FGColumnVector3 vForce = mTGear.Transposed() * FGForce::GetBodyForces();
double GetBodyYForce(void) const { return vForce(eY); } return vForce(eY)*cos(SteerAngle) - vForce(eX)*sin(SteerAngle); }
double GetWheelRollVel(void) const { return vWhlVelVec(eX)*cos(SteerAngle)
+ vWhlVelVec(eY)*sin(SteerAngle); }
double GetWheelSideVel(void) const { return vWhlVelVec(eY)*cos(SteerAngle)
- vWhlVelVec(eX)*sin(SteerAngle); }
double GetWheelSlipAngle(void) const { return WheelSlip; } double GetWheelSlipAngle(void) const { return WheelSlip; }
double GetWheelVel(int axis) const { return vWhlVelVec(axis);} double GetWheelVel(int axis) const { return vWhlVelVec(axis);}
bool IsBogey(void) const { return (eContactType == ctBOGEY);} bool IsBogey(void) const { return (eContactType == ctBOGEY);}
double GetGearUnitPos(void); double GetGearUnitPos(void);
void bind(void); void bind(void);
private: private:
int GearNumber; int GearNumber;
FGMatrix33 Tg2b, Tb2g; static const FGMatrix33 Tb2s;
FGColumnVector3 vXYZ; FGMatrix33 mTGear;
FGColumnVector3 vMoment; FGColumnVector3 vGearOrient;
FGColumnVector3 vWhlBodyVec; FGColumnVector3 vWhlBodyVec;
FGColumnVector3 vLocalGear; FGColumnVector3 vLocalGear;
FGColumnVector3 vForce;
FGColumnVector3 vLocalForce;
FGColumnVector3 vWhlVelVec, vLocalWhlVel; // Velocity of this wheel FGColumnVector3 vWhlVelVec, vLocalWhlVel; // Velocity of this wheel
FGColumnVector3 normal, cvel, vGroundNormal; FGColumnVector3 normal, cvel, vGroundNormal;
FGLocation contact, gearLoc; FGLocation contact, gearLoc;
@ -336,11 +332,11 @@ private:
bool isRetractable; bool isRetractable;
bool GearUp, GearDown; bool GearUp, GearDown;
bool Servicable; bool Servicable;
string name; std::string name;
string sSteerType; std::string sSteerType;
string sBrakeGroup; std::string sBrakeGroup;
string sRetractable; std::string sRetractable;
string sContactType; std::string sContactType;
BrakeGroup eBrakeGrp; BrakeGroup eBrakeGrp;
ContactType eContactType; ContactType eContactType;
@ -358,7 +354,6 @@ private:
Filter LatForceFilter; Filter LatForceFilter;
Filter WheelSlipFilter; Filter WheelSlipFilter;
FGFDMExec* Exec;
FGState* State; FGState* State;
FGAircraft* Aircraft; FGAircraft* Aircraft;
FGPropagate* Propagate; FGPropagate* Propagate;
@ -381,12 +376,6 @@ private:
void Debug(int from); void Debug(int from);
}; };
} }
#include "FGAircraft.h"
#include "FGPropagate.h"
#include "FGAuxiliary.h"
#include "FGFCS.h"
#include "FGMassBalance.h"
#include "FGState.h"
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View file

@ -41,7 +41,11 @@ INCLUDES
#include "FGMassBalance.h" #include "FGMassBalance.h"
#include "FGPropulsion.h" #include "FGPropulsion.h"
#include "FGBuoyantForces.h" #include "FGBuoyantForces.h"
#include <input_output/FGPropertyManager.h> #include "input_output/FGPropertyManager.h"
#include <iostream>
#include <cstdlib>
using namespace std;
namespace JSBSim { namespace JSBSim {
@ -338,6 +342,24 @@ void FGMassBalance::bind(void)
(PMF)&FGMassBalance::GetXYZcg); (PMF)&FGMassBalance::GetXYZcg);
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGMassBalance::PointMass::bind(FGPropertyManager* PropertyManager, int num) {
string tmp = CreateIndexedPropertyName("inertia/pointmass-weight-lbs", num);
PropertyManager->Tie( tmp.c_str(), this, &PointMass::GetPointMassWeight,
&PointMass::SetPointMassWeight);
tmp = CreateIndexedPropertyName("inertia/pointmass-location-X-inches", num);
PropertyManager->Tie( tmp.c_str(), this, eX, &PointMass::GetPointMassLocation,
&PointMass::SetPointMassLocation);
tmp = CreateIndexedPropertyName("inertia/pointmass-location-Y-inches", num);
PropertyManager->Tie( tmp.c_str(), this, eY, &PointMass::GetPointMassLocation,
&PointMass::SetPointMassLocation);
tmp = CreateIndexedPropertyName("inertia/pointmass-location-Z-inches", num);
PropertyManager->Tie( tmp.c_str(), this, eZ, &PointMass::GetPointMassLocation,
&PointMass::SetPointMassLocation);
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// The bitmasked value choices are as follows: // The bitmasked value choices are as follows:
// unset: In this case (the default) JSBSim would only print // unset: In this case (the default) JSBSim would only print

View file

@ -39,9 +39,9 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGModel.h" #include "FGModel.h"
#include <math/FGColumnVector3.h> #include "math/FGColumnVector3.h"
#include <math/FGMatrix33.h> #include "math/FGMatrix33.h"
#include <input_output/FGXMLElement.h> #include "input_output/FGXMLElement.h"
#include <vector> #include <vector>
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -189,24 +189,10 @@ private:
void SetPointMassWeight(double wt) {Weight = wt;} void SetPointMassWeight(double wt) {Weight = wt;}
double GetPointMassWeight(void) const {return Weight;} double GetPointMassWeight(void) const {return Weight;}
void bind(FGPropertyManager* PropertyManager, int num) { void bind(FGPropertyManager* PropertyManager, int num);
string tmp = CreateIndexedPropertyName("inertia/pointmass-weight-lbs", num);
PropertyManager->Tie( tmp.c_str(), this, &PointMass::GetPointMassWeight,
&PointMass::SetPointMassWeight);
tmp = CreateIndexedPropertyName("inertia/pointmass-location-X-inches", num);
PropertyManager->Tie( tmp.c_str(), this, eX, &PointMass::GetPointMassLocation,
&PointMass::SetPointMassLocation);
tmp = CreateIndexedPropertyName("inertia/pointmass-location-Y-inches", num);
PropertyManager->Tie( tmp.c_str(), this, eY, &PointMass::GetPointMassLocation,
&PointMass::SetPointMassLocation);
tmp = CreateIndexedPropertyName("inertia/pointmass-location-Z-inches", num);
PropertyManager->Tie( tmp.c_str(), this, eZ, &PointMass::GetPointMassLocation,
&PointMass::SetPointMassLocation);
}
}; };
vector <struct PointMass*> PointMasses; std::vector <struct PointMass*> PointMasses;
void bind(void); void bind(void);
void Debug(int from); void Debug(int from);

View file

@ -52,6 +52,9 @@ INCLUDES
#include "FGAircraft.h" #include "FGAircraft.h"
#include "FGPropagate.h" #include "FGPropagate.h"
#include "FGAuxiliary.h" #include "FGAuxiliary.h"
#include <iostream>
using namespace std;
namespace JSBSim { namespace JSBSim {

View file

@ -38,11 +38,8 @@ SENTRY
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <FGJSBBase.h> #include "FGJSBBase.h"
#include <input_output/FGPropertyManager.h>
#include <input_output/FGXMLElement.h>
#include <iostream>
#include <string> #include <string>
#include <vector> #include <vector>
@ -52,8 +49,6 @@ DEFINITIONS
#define ID_MODEL "$Id$" #define ID_MODEL "$Id$"
using namespace std;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FORWARD DECLARATIONS FORWARD DECLARATIONS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
@ -74,6 +69,8 @@ class FGBuoyantForces;
class FGAircraft; class FGAircraft;
class FGPropagate; class FGPropagate;
class FGAuxiliary; class FGAuxiliary;
class Element;
class FGPropertyManager;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS DOCUMENTATION CLASS DOCUMENTATION
@ -102,7 +99,7 @@ public:
virtual bool Load(Element* el); virtual bool Load(Element* el);
FGModel* NextModel; FGModel* NextModel;
string Name; std::string Name;
/** Runs the model; called by the Executive /** Runs the model; called by the Executive
@see JSBSim.cpp documentation @see JSBSim.cpp documentation
@ -137,7 +134,7 @@ protected:
FGAuxiliary* Auxiliary; FGAuxiliary* Auxiliary;
FGPropertyManager* PropertyManager; FGPropertyManager* PropertyManager;
vector <double*> interface_properties; std::vector <double*> interface_properties;
}; };
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View file

@ -53,13 +53,16 @@ INCLUDES
#include "FGPropagate.h" #include "FGPropagate.h"
#include "FGAuxiliary.h" #include "FGAuxiliary.h"
#include "FGInertial.h" #include "FGInertial.h"
#include "FGPropulsion.h" //access to FGEngine, FGTank #include "models/propulsion/FGEngine.h"
#include "models/propulsion/FGTank.h"
#include "models/propulsion/FGPiston.h" #include "models/propulsion/FGPiston.h"
#include <fstream> #include <sstream>
#include <iomanip> #include <iomanip>
#include <cstring> #include <cstring>
#include <cstdlib>
#include "input_output/net_fdm.hxx" #include "input_output/net_fdm.hxx"
#include "input_output/FGfdmSocket.h"
#if defined(WIN32) && !defined(__CYGWIN__) #if defined(WIN32) && !defined(__CYGWIN__)
# include <windows.h> # include <windows.h>
@ -70,6 +73,8 @@ INCLUDES
static const int endianTest = 1; static const int endianTest = 1;
#define isLittleEndian (*((char *) &endianTest ) != 0) #define isLittleEndian (*((char *) &endianTest ) != 0)
using namespace std;
namespace JSBSim { namespace JSBSim {
static const char *IdSrc = "$Id$"; static const char *IdSrc = "$Id$";
@ -157,20 +162,17 @@ FGOutput::~FGOutput()
bool FGOutput::InitModel(void) bool FGOutput::InitModel(void)
{ {
char fname[1000] = "";
if (!FGModel::InitModel()) return false; if (!FGModel::InitModel()) return false;
if (Filename.size() > 0 && StartNewFile) { if (Filename.size() > 0 && StartNewFile) {
int idx = BaseFilename.find_last_of("."); ostringstream buf;
int len = BaseFilename.length(); string::size_type dot = BaseFilename.find_last_of('.');
string extension = ""; if (dot != string::npos) {
if (idx != string::npos) { buf << BaseFilename.substr(0, dot) << '_' << runID_postfix++ << BaseFilename.substr(dot);
extension = BaseFilename.substr(idx, len-idx); } else {
len -= extension.length(); buf << BaseFilename << '_' << runID_postfix++;
} }
sprintf(fname, "%s_%d%s", BaseFilename.substr(0,len).c_str(), runID_postfix++, extension.c_str()); Filename = buf.str();
Filename = string(fname);
datafile.close(); datafile.close();
StartNewFile = false; StartNewFile = false;
dFirstPass = true; dFirstPass = true;
@ -205,7 +207,7 @@ bool FGOutput::Run(void)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGOutput::SetType(string type) void FGOutput::SetType(const string& type)
{ {
if (type == "CSV") { if (type == "CSV") {
Type = otCSV; Type = otCSV;
@ -227,7 +229,7 @@ void FGOutput::SetType(string type)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGOutput::DelimitedOutput(string fname) void FGOutput::DelimitedOutput(const string& fname)
{ {
streambuf* buffer; streambuf* buffer;
string scratch = ""; string scratch = "";
@ -918,7 +920,7 @@ void FGOutput::SocketOutput(void)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGOutput::SocketStatusOutput(string out_str) void FGOutput::SocketStatusOutput(const string& out_str)
{ {
string asciiData; string asciiData;
@ -1084,6 +1086,7 @@ void FGOutput::Debug(int from)
cout << scratch << " in CSV format output at rate " << 1/(State->Getdt()*rate) << " Hz" << endl; cout << scratch << " in CSV format output at rate " << 1/(State->Getdt()*rate) << " Hz" << endl;
break; break;
case otNone: case otNone:
default:
cout << " No log output" << endl; cout << " No log output" << endl;
break; break;
} }

View file

@ -41,14 +41,11 @@ INCLUDES
#include "FGModel.h" #include "FGModel.h"
#include <iostream>
#include <fstream> #include <fstream>
#include "input_output/FGfdmSocket.h"
#include "input_output/FGXMLFileRead.h" #include "input_output/FGXMLFileRead.h"
#include "input_output/net_fdm.hxx" #include "input_output/net_fdm.hxx"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
@ -61,6 +58,8 @@ FORWARD DECLARATIONS
namespace JSBSim { namespace JSBSim {
class FGfdmSocket;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS DOCUMENTATION CLASS DOCUMENTATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
@ -140,22 +139,22 @@ public:
bool InitModel(void); bool InitModel(void);
bool Run(void); bool Run(void);
void DelimitedOutput(string); void DelimitedOutput(const std::string&);
void SocketOutput(void); void SocketOutput(void);
void FlightGearSocketOutput(void); void FlightGearSocketOutput(void);
void SocketStatusOutput(string); void SocketStatusOutput(const std::string&);
void SocketDataFill(FGNetFDM* net); void SocketDataFill(FGNetFDM* net);
void SetType(string); void SetType(const std::string& type);
void SetStartNewFile(bool tt) {StartNewFile = tt;} void SetStartNewFile(bool tt) {StartNewFile = tt;}
void SetSubsystems(int tt) {SubSystems = tt;} void SetSubsystems(int tt) {SubSystems = tt;}
void Enable(void) { enabled = true; } void Enable(void) { enabled = true; }
void Disable(void) { enabled = false; } void Disable(void) { enabled = false; }
bool Toggle(void) {enabled = !enabled; return enabled;} bool Toggle(void) {enabled = !enabled; return enabled;}
bool Load(Element* el); bool Load(Element* el);
void SetOutputFileName(string fname) {Filename = fname;} void SetOutputFileName(const std::string& fname) {Filename = fname;}
void SetDirectivesFile(string fname) {DirectivesFile = fname;} void SetDirectivesFile(const std::string& fname) {DirectivesFile = fname;}
void SetRate(int rt); void SetRate(int rt);
string GetOutputFileName(void) const {return Filename;} string GetOutputFileName(void) const {return Filename;}
@ -185,11 +184,11 @@ private:
int SubSystems; int SubSystems;
int runID_postfix; int runID_postfix;
bool StartNewFile; bool StartNewFile;
string output_file_name, delimeter, BaseFilename, Filename, DirectivesFile; std::string output_file_name, delimeter, BaseFilename, Filename, DirectivesFile;
ofstream datafile; std::ofstream datafile;
FGfdmSocket* socket; FGfdmSocket* socket;
FGfdmSocket* flightGearSocket; FGfdmSocket* flightGearSocket;
vector <FGPropertyManager*> OutputProperties; std::vector <FGPropertyManager*> OutputProperties;
void Debug(int from); void Debug(int from);
}; };

View file

@ -54,15 +54,18 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <cmath> #include <cmath>
#include <iomanip> #include <cstdlib>
#include <iostream>
#include "FGPropagate.h" #include "FGPropagate.h"
#include <FGFDMExec.h> #include "FGFDMExec.h"
#include <FGState.h> #include "FGState.h"
#include "FGAircraft.h" #include "FGAircraft.h"
#include "FGMassBalance.h" #include "FGMassBalance.h"
#include "FGInertial.h" #include "FGInertial.h"
#include <input_output/FGPropertyManager.h> #include "input_output/FGPropertyManager.h"
using namespace std;
namespace JSBSim { namespace JSBSim {

View file

@ -38,11 +38,11 @@ SENTRY
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <models/FGModel.h> #include "models/FGModel.h"
#include <math/FGColumnVector3.h> #include "math/FGColumnVector3.h"
#include <math/FGLocation.h> #include "math/FGLocation.h"
#include <math/FGQuaternion.h> #include "math/FGQuaternion.h"
#include <math/FGMatrix33.h> #include "math/FGMatrix33.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS
@ -538,6 +538,6 @@ private:
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#include <initialization/FGInitialCondition.h> #include "initialization/FGInitialCondition.h"
#endif #endif

View file

@ -45,15 +45,24 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGPropulsion.h" #include "FGPropulsion.h"
#include <models/propulsion/FGRocket.h> #include "FGState.h"
#include <models/propulsion/FGTurbine.h> #include "models/FGFCS.h"
#include <models/propulsion/FGPiston.h> #include "models/FGMassBalance.h"
#include <models/propulsion/FGElectric.h> #include "models/propulsion/FGThruster.h"
#include <models/propulsion/FGTurboProp.h> #include "models/propulsion/FGRocket.h"
#include <input_output/FGPropertyManager.h> #include "models/propulsion/FGTurbine.h"
#include <input_output/FGXMLParse.h> #include "models/propulsion/FGPiston.h"
#include <math/FGColumnVector3.h> #include "models/propulsion/FGElectric.h"
#include "models/propulsion/FGTurboProp.h"
#include "models/propulsion/FGTank.h"
#include "input_output/FGPropertyManager.h"
#include "input_output/FGXMLParse.h"
#include "math/FGColumnVector3.h"
#include <iostream>
#include <sstream> #include <sstream>
#include <cstdlib>
using namespace std;
namespace JSBSim { namespace JSBSim {
@ -255,6 +264,20 @@ bool FGPropulsion::Load(Element* el)
FGModel::Load(el); // Perform base class Load. FGModel::Load(el); // Perform base class Load.
// Process tank definitions first to establish the number of fuel tanks
Element* tank_element = el->FindElement("tank");
while (tank_element) {
Tanks.push_back(new FGTank(FDMExec, tank_element, numTanks));
if (Tanks.back()->GetType() == FGTank::ttFUEL) numFuelTanks++;
else if (Tanks.back()->GetType() == FGTank::ttOXIDIZER) numOxiTanks++;
else {cerr << "Unknown tank type specified." << endl; return false;}
numTanks++;
tank_element = el->FindNextElement("tank");
}
numSelectedFuelTanks = numFuelTanks;
numSelectedOxiTanks = numOxiTanks;
Element* engine_element = el->FindElement("engine"); Element* engine_element = el->FindElement("engine");
while (engine_element) { while (engine_element) {
engine_filename = engine_element->GetAttributeValue("file"); engine_filename = engine_element->GetAttributeValue("file");
@ -303,20 +326,6 @@ bool FGPropulsion::Load(Element* el)
ResetParser(); ResetParser();
} }
// Process tank definitions
Element* tank_element = el->FindElement("tank");
while (tank_element) {
Tanks.push_back(new FGTank(FDMExec, tank_element, numTanks));
if (Tanks.back()->GetType() == FGTank::ttFUEL) numFuelTanks++;
else if (Tanks.back()->GetType() == FGTank::ttOXIDIZER) numOxiTanks++;
else {cerr << "Unknown tank type specified." << endl; return false;}
numTanks++;
tank_element = el->FindNextElement("tank");
}
numSelectedFuelTanks = numFuelTanks;
numSelectedOxiTanks = numOxiTanks;
CalculateTankInertias(); CalculateTankInertias();
if (!ThrottleAdded) FCS->AddThrottle(); // need to have at least one throttle if (!ThrottleAdded) FCS->AddThrottle(); // need to have at least one throttle
@ -330,7 +339,7 @@ bool FGPropulsion::Load(Element* el)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
string FGPropulsion::FindEngineFullPathname(string engine_filename) string FGPropulsion::FindEngineFullPathname(const string& engine_filename)
{ {
string fullpath, localpath; string fullpath, localpath;
string enginePath = FDMExec->GetEnginePath(); string enginePath = FDMExec->GetEnginePath();
@ -358,7 +367,7 @@ string FGPropulsion::FindEngineFullPathname(string engine_filename)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ifstream* FGPropulsion::FindEngineFile(string engine_filename) ifstream* FGPropulsion::FindEngineFile(const string& engine_filename)
{ {
string fullpath, localpath; string fullpath, localpath;
string enginePath = FDMExec->GetEnginePath(); string enginePath = FDMExec->GetEnginePath();
@ -383,7 +392,7 @@ ifstream* FGPropulsion::FindEngineFile(string engine_filename)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
string FGPropulsion::GetPropulsionStrings(string delimeter) string FGPropulsion::GetPropulsionStrings(const string& delimiter)
{ {
unsigned int i; unsigned int i;
@ -393,13 +402,13 @@ string FGPropulsion::GetPropulsionStrings(string delimeter)
for (i=0; i<Engines.size(); i++) { for (i=0; i<Engines.size(); i++) {
if (firstime) firstime = false; if (firstime) firstime = false;
else PropulsionStrings += delimeter; else PropulsionStrings += delimiter;
PropulsionStrings += Engines[i]->GetEngineLabels(delimeter); PropulsionStrings += Engines[i]->GetEngineLabels(delimiter);
} }
for (i=0; i<Tanks.size(); i++) { for (i=0; i<Tanks.size(); i++) {
if (Tanks[i]->GetType() == FGTank::ttFUEL) buf << delimeter << "Fuel Tank " << i; if (Tanks[i]->GetType() == FGTank::ttFUEL) buf << delimiter << "Fuel Tank " << i;
else if (Tanks[i]->GetType() == FGTank::ttOXIDIZER) buf << delimeter << "Oxidizer Tank " << i; else if (Tanks[i]->GetType() == FGTank::ttOXIDIZER) buf << delimiter << "Oxidizer Tank " << i;
} }
return PropulsionStrings; return PropulsionStrings;
@ -407,7 +416,7 @@ string FGPropulsion::GetPropulsionStrings(string delimeter)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
string FGPropulsion::GetPropulsionValues(string delimeter) string FGPropulsion::GetPropulsionValues(const string& delimiter)
{ {
unsigned int i; unsigned int i;
@ -417,12 +426,12 @@ string FGPropulsion::GetPropulsionValues(string delimeter)
for (i=0; i<Engines.size(); i++) { for (i=0; i<Engines.size(); i++) {
if (firstime) firstime = false; if (firstime) firstime = false;
else PropulsionValues += delimeter; else PropulsionValues += delimiter;
PropulsionValues += Engines[i]->GetEngineValues(delimeter); PropulsionValues += Engines[i]->GetEngineValues(delimiter);
} }
for (i=0; i<Tanks.size(); i++) { for (i=0; i<Tanks.size(); i++) {
buf << delimeter; buf << delimiter;
buf << Tanks[i]->GetContents(); buf << Tanks[i]->GetContents();
} }

View file

@ -39,13 +39,11 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <vector> #include <vector>
#include <fstream> #include <iosfwd>
#include "FGModel.h" #include "FGModel.h"
#include <models/propulsion/FGEngine.h> #include "math/FGMatrix33.h"
#include <models/propulsion/FGTank.h> #include "input_output/FGXMLFileRead.h"
#include <math/FGMatrix33.h>
#include <input_output/FGXMLFileRead.h>
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS
@ -59,6 +57,9 @@ FORWARD DECLARATIONS
namespace JSBSim { namespace JSBSim {
class FGTank;
class FGEngine;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS DOCUMENTATION CLASS DOCUMENTATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
@ -157,8 +158,8 @@ public:
/** Sets up the engines as running */ /** Sets up the engines as running */
void InitRunning(int n); void InitRunning(int n);
string GetPropulsionStrings(string delimeter); std::string GetPropulsionStrings(const std::string& delimiter);
string GetPropulsionValues(string delimeter); std::string GetPropulsionValues(const std::string& delimiter);
inline FGColumnVector3& GetForces(void) {return vForces; } inline FGColumnVector3& GetForces(void) {return vForces; }
inline double GetForces(int n) const { return vForces(n);} inline double GetForces(int n) const { return vForces(n);}
@ -176,8 +177,8 @@ public:
FGColumnVector3& GetTanksMoment(void); FGColumnVector3& GetTanksMoment(void);
double GetTanksWeight(void); double GetTanksWeight(void);
ifstream* FindEngineFile(string filename); std::ifstream* FindEngineFile(const std::string& filename);
string FindEngineFullPathname(string engine_filename); std::string FindEngineFullPathname(const std::string& engine_filename);
inline int GetActiveEngine(void) const {return ActiveEngine;} inline int GetActiveEngine(void) const {return ActiveEngine;}
inline bool GetFuelFreeze(void) {return fuel_freeze;} inline bool GetFuelFreeze(void) {return fuel_freeze;}
double GetTotalFuelQuantity(void) const {return TotalFuelQuantity;} double GetTotalFuelQuantity(void) const {return TotalFuelQuantity;}
@ -190,8 +191,8 @@ public:
FGMatrix33& CalculateTankInertias(void); FGMatrix33& CalculateTankInertias(void);
private: private:
vector <FGEngine*> Engines; std::vector <FGEngine*> Engines;
vector <FGTank*> Tanks; std::vector <FGTank*> Tanks;
unsigned int numSelectedFuelTanks; unsigned int numSelectedFuelTanks;
unsigned int numSelectedOxiTanks; unsigned int numSelectedOxiTanks;
unsigned int numFuelTanks; unsigned int numFuelTanks;

View file

@ -59,11 +59,11 @@ INCLUDES
#include "FGMSIS.h" #include "FGMSIS.h"
#include "FGState.h" #include "FGState.h"
#include <math.h> /* maths functions */ #include <cmath> /* maths functions */
#include <stdlib.h> /* for malloc/free */
#include <stdio.h> /* for printf */
#include <iostream> // for cout, endl #include <iostream> // for cout, endl
using namespace std;
namespace JSBSim { namespace JSBSim {
static const char *IdSrc = "$Id$"; static const char *IdSrc = "$Id$";
@ -322,7 +322,7 @@ double MSIS::dnet (double dd, double dm, double zhm, double xmm, double xm)
double ylog; double ylog;
a = zhm / (xmm-xm); a = zhm / (xmm-xm);
if (!((dm>0) && (dd>0))) { if (!((dm>0) && (dd>0))) {
printf("dnet log error %e %e %e\n",dm,dd,xm); cerr << "dnet log error " << dm << ' ' << dd << ' ' << xm << ' ' << endl;
if ((dd==0) && (dm==0)) if ((dd==0) && (dm==0))
dd=1; dd=1;
if (dm==0) if (dm==0)
@ -400,7 +400,7 @@ void MSIS::splint (double *xa, double *ya, double *y2a, int n, double x, double
} }
h = xa[khi] - xa[klo]; h = xa[khi] - xa[klo];
if (h==0.0) if (h==0.0)
printf("bad XA input to splint"); cerr << "bad XA input to splint" << endl;
a = (xa[khi] - x)/h; a = (xa[khi] - x)/h;
b = (x - xa[klo])/h; b = (x - xa[klo])/h;
yi = a * ya[klo] + b * ya[khi] + ((a*a*a - a) * y2a[klo] + (b*b*b - b) * y2a[khi]) * h * h/6.0; yi = a * ya[klo] + b * ya[khi] + ((a*a*a - a) * y2a[klo] + (b*b*b - b) * y2a[khi]) * h * h/6.0;
@ -422,9 +422,9 @@ void MSIS::spline (double *x, double *y, int n, double yp1, double ypn, double *
double *u; double *u;
double sig, p, qn, un; double sig, p, qn, un;
int i, k; int i, k;
u=(double*)malloc(sizeof(double)*n); u=new double[n];
if (u==NULL) { if (u==NULL) {
printf("Out Of Memory in spline - ERROR"); cerr << "Out Of Memory in spline - ERROR" << endl;
return; return;
} }
if (yp1>0.99E30) { if (yp1>0.99E30) {
@ -451,7 +451,7 @@ void MSIS::spline (double *x, double *y, int n, double yp1, double ypn, double *
for (k=n-2;k>=0;k--) for (k=n-2;k>=0;k--)
y2[k] = y2[k] * y2[k+1] + u[k]; y2[k] = y2[k] * y2[k+1] + u[k];
free(u); delete u;
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -964,7 +964,7 @@ double MSIS::glob7s(double *p, struct nrlmsise_input *input,
if (p[99]==0) if (p[99]==0)
p[99]=pset; p[99]=pset;
if (p[99]!=pset) { if (p[99]!=pset) {
printf("Wrong parameter set for glob7s\n"); cerr << "Wrong parameter set for glob7s" << endl;
return -1; return -1;
} }
for (j=0;j<14;j++) for (j=0;j<14;j++)
@ -1247,7 +1247,7 @@ void MSIS::ghp7(struct nrlmsise_input *input, struct nrlmsise_flags *flags,
if (sqrt(diff*diff)<test) if (sqrt(diff*diff)<test)
return; return;
if (l==ltest) { if (l==ltest) {
printf("ERROR: ghp7 not converging for press %e, diff %e",press,diff); cerr << "ERROR: ghp7 not converging for press " << press << ", diff " << diff << endl;
return; return;
} }
xm = output->d[5] / xn / 1.66E-24; xm = output->d[5] / xn / 1.66E-24;

View file

@ -40,7 +40,7 @@ SENTRY
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <models/FGAtmosphere.h> #include "models/FGAtmosphere.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS

View file

@ -43,6 +43,9 @@ INCLUDES
#include "FGMars.h" #include "FGMars.h"
#include "FGState.h" #include "FGState.h"
#include <iostream>
using namespace std;
namespace JSBSim { namespace JSBSim {

View file

@ -38,7 +38,7 @@ SENTRY
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <models/FGAtmosphere.h> #include "models/FGAtmosphere.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS

View file

@ -38,6 +38,10 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGAccelerometer.h" #include "FGAccelerometer.h"
#include <iostream>
#include <cstdlib>
using namespace std;
namespace JSBSim { namespace JSBSim {
@ -48,7 +52,9 @@ static const char *IdHdr = ID_ACCELEROMETER;
CLASS IMPLEMENTATION CLASS IMPLEMENTATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
FGAccelerometer::FGAccelerometer(FGFCS* fcs, Element* element) : FGSensor(fcs, element) FGAccelerometer::FGAccelerometer(FGFCS* fcs, Element* element)
: FGSensor(fcs, element),
FGSensorOrientation(element)
{ {
Propagate = fcs->GetExec()->GetPropagate(); Propagate = fcs->GetExec()->GetPropagate();
MassBalance = fcs->GetExec()->GetMassBalance(); MassBalance = fcs->GetExec()->GetMassBalance();
@ -60,27 +66,6 @@ FGAccelerometer::FGAccelerometer(FGFCS* fcs, Element* element) : FGSensor(fcs, e
vRadius = MassBalance->StructuralToBody(vLocation); vRadius = MassBalance->StructuralToBody(vLocation);
Element* orient_element = element->FindElement("orientation");
if (orient_element) vOrient = orient_element->FindElementTripletConvertTo("RAD");
else {cerr << "No orientation given for accelerometer. " << endl;}
Element* axis_element = element->FindElement("axis");
if (axis_element) {
string sAxis = element->FindElementValue("axis");
if (sAxis == "X" || sAxis == "x") {
axis = 1;
} else if (sAxis == "Y" || sAxis == "y") {
axis = 2;
} else if (sAxis == "Z" || sAxis == "z") {
axis = 3;
} else {
cerr << " Incorrect/no axis specified for accelerometer; assuming X axis" << endl;
axis = 1;
}
}
CalculateTransformMatrix();
Debug(0); Debug(0);
} }
@ -96,7 +81,7 @@ FGAccelerometer::~FGAccelerometer()
bool FGAccelerometer::Run(void ) bool FGAccelerometer::Run(void )
{ {
// There is no input assumed. This is a dedicated acceleration sensor. // There is no input assumed. This is a dedicated acceleration sensor.
vRadius = MassBalance->StructuralToBody(vLocation); vRadius = MassBalance->StructuralToBody(vLocation);
//gravitational forces //gravitational forces
@ -112,59 +97,11 @@ bool FGAccelerometer::Run(void )
Input = vAccel(axis); Input = vAccel(axis);
Output = Input; // perfect accelerometer ProcessSensorSignal();
// Degrade signal as specified
if (fail_stuck) {
Output = PreviousOutput;
return true;
}
if (lag != 0.0) Lag(); // models accelerometer lag
if (noise_variance != 0.0) Noise(); // models noise
if (drift_rate != 0.0) Drift(); // models drift over time
if (bias != 0.0) Bias(); // models a finite bias
if (gain != 0.0) Gain(); // models a gain
if (fail_low) Output = -HUGE_VAL;
if (fail_high) Output = HUGE_VAL;
if (bits != 0) Quantize(); // models quantization degradation
// if (delay != 0.0) Delay(); // models system signal transport latencies
Clip(); // Is it right to clip an accelerometer?
return true; return true;
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGAccelerometer::CalculateTransformMatrix(void)
{
double cp,sp,cr,sr,cy,sy;
cp=cos(vOrient(ePitch)); sp=sin(vOrient(ePitch));
cr=cos(vOrient(eRoll)); sr=sin(vOrient(eRoll));
cy=cos(vOrient(eYaw)); sy=sin(vOrient(eYaw));
mT(1,1) = cp*cy;
mT(1,2) = cp*sy;
mT(1,3) = -sp;
mT(2,1) = sr*sp*cy - cr*sy;
mT(2,2) = sr*sp*sy + cr*cy;
mT(2,3) = sr*cp;
mT(3,1) = cr*sp*cy + sr*sy;
mT(3,2) = cr*sp*sy - sr*cy;
mT(3,3) = cr*cp;
// This transform is different than for FGForce, where we want a native nozzle
// force in body frame. Here we calculate the body frame accel and want it in
// the transformed accelerometer frame. So, the next line is commented out.
// mT = mT.Inverse();
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// The bitmasked value choices are as follows: // The bitmasked value choices are as follows:
// unset: In this case (the default) JSBSim would only print // unset: In this case (the default) JSBSim would only print

View file

@ -38,12 +38,13 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGSensor.h" #include "FGSensor.h"
#include <input_output/FGXMLElement.h> #include "input_output/FGXMLElement.h"
#include "models/FGPropagate.h" #include "models/FGPropagate.h"
#include "models/FGMassBalance.h" #include "models/FGMassBalance.h"
#include "models/FGInertial.h" #include "models/FGInertial.h"
#include "math/FGColumnVector3.h" #include "math/FGColumnVector3.h"
#include "math/FGMatrix33.h" #include "math/FGMatrix33.h"
#include "FGSensorOrientation.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS
@ -116,7 +117,7 @@ time.
CLASS DECLARATION CLASS DECLARATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
class FGAccelerometer : public FGSensor class FGAccelerometer : public FGSensor, public FGSensorOrientation
{ {
public: public:
FGAccelerometer(FGFCS* fcs, Element* element); FGAccelerometer(FGFCS* fcs, Element* element);
@ -129,12 +130,8 @@ private:
FGMassBalance* MassBalance; FGMassBalance* MassBalance;
FGInertial* Inertial; FGInertial* Inertial;
FGColumnVector3 vLocation; FGColumnVector3 vLocation;
FGColumnVector3 vOrient;
FGColumnVector3 vRadius; FGColumnVector3 vRadius;
FGColumnVector3 vAccel; FGColumnVector3 vAccel;
FGMatrix33 mT;
void CalculateTransformMatrix(void);
int axis;
void Debug(int from); void Debug(int from);
}; };

View file

@ -39,6 +39,8 @@ INCLUDES
#include "FGActuator.h" #include "FGActuator.h"
using namespace std;
namespace JSBSim { namespace JSBSim {
static const char *IdSrc = "$Id$"; static const char *IdSrc = "$Id$";
@ -52,7 +54,6 @@ CLASS IMPLEMENTATION
FGActuator::FGActuator(FGFCS* fcs, Element* element) : FGFCSComponent(fcs, element) FGActuator::FGActuator(FGFCS* fcs, Element* element) : FGFCSComponent(fcs, element)
{ {
double denom; double denom;
dt = fcs->GetDt();
// inputs are read from the base class constructor // inputs are read from the base class constructor
@ -101,8 +102,6 @@ FGActuator::~FGActuator()
bool FGActuator::Run(void ) bool FGActuator::Run(void )
{ {
dt = fcs->GetDt();
Input = InputNodes[0]->getDoubleValue() * InputSigns[0]; Input = InputNodes[0]->getDoubleValue() * InputSigns[0];
if (fail_zero) Input = 0; if (fail_zero) Input = 0;
@ -237,7 +236,10 @@ void FGActuator::Debug(int from)
else else
cout << " INPUT: " << InputNodes[0]->getName() << endl; cout << " INPUT: " << InputNodes[0]->getName() << endl;
if (IsOutput) cout << " OUTPUT: " << OutputNode->getName() << endl; if (IsOutput) {
for (unsigned int i=0; i<OutputNodes.size(); i++)
cout << " OUTPUT: " << OutputNodes[i]->getName() << endl;
}
if (bias != 0.0) cout << " Bias: " << bias << endl; if (bias != 0.0) cout << " Bias: " << bias << endl;
if (rate_limit != 0) cout << " Rate limit: " << rate_limit << endl; if (rate_limit != 0) cout << " Rate limit: " << rate_limit << endl;
if (lag != 0) cout << " Actuator lag: " << lag << endl; if (lag != 0) cout << " Actuator lag: " << lag << endl;

View file

@ -38,7 +38,7 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGFCSComponent.h" #include "FGFCSComponent.h"
#include <input_output/FGXMLElement.h> #include "input_output/FGXMLElement.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS
@ -144,7 +144,6 @@ public:
inline bool GetFailStuck(void) const {return fail_stuck;} inline bool GetFailStuck(void) const {return fail_stuck;}
private: private:
double dt;
double span; double span;
double bias; double bias;
double rate_limit; double rate_limit;

View file

@ -38,6 +38,11 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGDeadBand.h" #include "FGDeadBand.h"
#include "input_output/FGXMLElement.h"
#include "input_output/FGPropertyManager.h"
#include <iostream>
using namespace std;
namespace JSBSim { namespace JSBSim {
@ -144,7 +149,10 @@ void FGDeadBand::Debug(int from)
cout << " DEADBAND WIDTH: " << width << endl; cout << " DEADBAND WIDTH: " << width << endl;
} }
cout << " GAIN: " << gain << endl; cout << " GAIN: " << gain << endl;
if (IsOutput) cout << " OUTPUT: " << OutputNode->getName() << endl; if (IsOutput) {
for (unsigned int i=0; i<OutputNodes.size(); i++)
cout << " OUTPUT: " << OutputNodes[i]->getName() << endl;
}
} }
} }
if (debug_lvl & 2 ) { // Instantiation/Destruction notification if (debug_lvl & 2 ) { // Instantiation/Destruction notification

View file

@ -38,7 +38,6 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGFCSComponent.h" #include "FGFCSComponent.h"
#include <input_output/FGXMLElement.h>
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS
@ -53,6 +52,8 @@ FORWARD DECLARATIONS
namespace JSBSim { namespace JSBSim {
class FGFCS; class FGFCS;
class Element;
class FGPropertyManager;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS DOCUMENTATION CLASS DOCUMENTATION

View file

@ -38,6 +38,12 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGFCSComponent.h" #include "FGFCSComponent.h"
#include "input_output/FGPropertyManager.h"
#include "input_output/FGXMLElement.h"
#include <iostream>
#include <cstdlib>
using namespace std;
namespace JSBSim { namespace JSBSim {
@ -52,11 +58,13 @@ FGFCSComponent::FGFCSComponent(FGFCS* _fcs, Element* element) : fcs(_fcs)
{ {
Element *input_element, *clip_el; Element *input_element, *clip_el;
Input = Output = clipmin = clipmax = 0.0; Input = Output = clipmin = clipmax = 0.0;
OutputNode = treenode = 0; treenode = 0;
delay = index = 0;
ClipMinPropertyNode = ClipMaxPropertyNode = 0; ClipMinPropertyNode = ClipMaxPropertyNode = 0;
clipMinSign = clipMaxSign = 1.0; clipMinSign = clipMaxSign = 1.0;
IsOutput = clip = false; IsOutput = clip = false;
string input, clip_string; string input, clip_string;
dt = fcs->GetDt();
PropertyManager = fcs->GetPropertyManager(); PropertyManager = fcs->GetPropertyManager();
if (element->GetName() == string("lag_filter")) { if (element->GetName() == string("lag_filter")) {
@ -91,6 +99,8 @@ FGFCSComponent::FGFCSComponent(FGFCS* _fcs, Element* element) : fcs(_fcs)
Type = "SENSOR"; Type = "SENSOR";
} else if (element->GetName() == string("accelerometer")) { } else if (element->GetName() == string("accelerometer")) {
Type = "ACCELEROMETER"; Type = "ACCELEROMETER";
} else if (element->GetName() == string("magnetometer")) {
Type = "MAGNETOMETER";
} else if (element->GetName() == string("gyro")) { } else if (element->GetName() == string("gyro")) {
Type = "GYRO"; Type = "GYRO";
} else if (element->GetName() == string("actuator")) { } else if (element->GetName() == string("actuator")) {
@ -123,13 +133,36 @@ FGFCSComponent::FGFCSComponent(FGFCS* _fcs, Element* element) : fcs(_fcs)
input_element = element->FindNextElement("input"); input_element = element->FindNextElement("input");
} }
if (element->FindElement("output")) { Element *out_elem = element->FindElement("output");
while (out_elem) {
IsOutput = true; IsOutput = true;
OutputNode = PropertyManager->GetNode( element->FindElementValue("output"), true ); string output_node_name = out_elem->GetDataLine();
FGPropertyManager* OutputNode = PropertyManager->GetNode( output_node_name, true );
OutputNodes.push_back(OutputNode);
if (!OutputNode) { if (!OutputNode) {
cerr << endl << " Unable to process property: " << element->FindElementValue("output") << endl; cerr << endl << " Unable to process property: " << output_node_name << endl;
throw(string("Invalid output property name in flight control definition")); throw(string("Invalid output property name in flight control definition"));
} }
out_elem = element->FindNextElement("output");
}
Element* delay_elem = element->FindElement("delay");
if ( delay_elem ) {
delay = (unsigned int)delay_elem->GetDataAsNumber();
string delayType = delay_elem->GetAttributeValue("type");
if (delayType.length() > 0) {
if (delayType == "time") {
delay = (int)(delay / dt);
} else if (delayType == "frames") {
// no op. the delay type of "frames" is assumed and is the default.
} else {
cerr << "Unallowed delay type" << endl;
}
} else {
delay = (int)(delay / dt);
}
output_array.resize(delay);
for (int i=0; i<delay; i++) output_array[i] = 0.0;
} }
clip_el = element->FindElement("clipto"); clip_el = element->FindElement("clipto");
@ -171,7 +204,7 @@ FGFCSComponent::~FGFCSComponent()
void FGFCSComponent::SetOutput(void) void FGFCSComponent::SetOutput(void)
{ {
OutputNode->setDoubleValue(Output); for (unsigned int i=0; i<OutputNodes.size(); i++) OutputNodes[i]->setDoubleValue(Output);
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -183,6 +216,16 @@ bool FGFCSComponent::Run(void)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGFCSComponent::Delay(void)
{
output_array[index] = Output;
if (index == delay-1) index = 0;
else index++;
Output = output_array[index];
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGFCSComponent::Clip(void) void FGFCSComponent::Clip(void)
{ {
if (clip) { if (clip) {
@ -258,6 +301,8 @@ void FGFCSComponent::Debug(int from)
cout << " Maximum limit: " << clipmax << endl; cout << " Maximum limit: " << clipmax << endl;
} }
} }
if (delay > 0) cout <<" Frame delay: " << delay
<< " frames (" << delay*dt << " sec)" << endl;
} }
} }
if (debug_lvl & 2 ) { // Instantiation/Destruction notification if (debug_lvl & 2 ) { // Instantiation/Destruction notification

View file

@ -37,9 +37,7 @@ SENTRY
INCLUDES INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include <FGJSBBase.h> #include "FGJSBBase.h"
#include <input_output/FGPropertyManager.h>
#include <input_output/FGXMLElement.h>
#include <string> #include <string>
#include <vector> #include <vector>
@ -49,9 +47,6 @@ DEFINITIONS
#define ID_FCSCOMPONENT "$Id$" #define ID_FCSCOMPONENT "$Id$"
using std::string;
using std::vector;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FORWARD DECLARATIONS FORWARD DECLARATIONS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
@ -59,6 +54,8 @@ FORWARD DECLARATIONS
namespace JSBSim { namespace JSBSim {
class FGFCS; class FGFCS;
class FGPropertyManager;
class Element;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS DOCUMENTATION CLASS DOCUMENTATION
@ -101,30 +98,34 @@ public:
virtual bool Run(void); virtual bool Run(void);
virtual void SetOutput(void); virtual void SetOutput(void);
inline double GetOutput (void) const {return Output;} double GetOutput (void) const {return Output;}
inline FGPropertyManager* GetOutputNode(void) { return OutputNode; } std::string GetName(void) const {return Name;}
inline string GetName(void) const {return Name;} std::string GetType(void) const { return Type; }
inline string GetType(void) const { return Type; }
virtual double GetOutputPct(void) const { return 0; } virtual double GetOutputPct(void) const { return 0; }
protected: protected:
FGFCS* fcs; FGFCS* fcs;
FGPropertyManager* PropertyManager; FGPropertyManager* PropertyManager;
FGPropertyManager* treenode; FGPropertyManager* treenode;
FGPropertyManager* OutputNode; std::vector <FGPropertyManager*> OutputNodes;
FGPropertyManager* ClipMinPropertyNode; FGPropertyManager* ClipMinPropertyNode;
FGPropertyManager* ClipMaxPropertyNode; FGPropertyManager* ClipMaxPropertyNode;
vector <FGPropertyManager*> InputNodes; std::vector <FGPropertyManager*> InputNodes;
vector <float> InputSigns; std::vector <float> InputSigns;
string Type; std::vector <double> output_array;
string Name; std::string Type;
std::string Name;
double Input; double Input;
double Output; double Output;
double clipmax, clipmin; double clipmax, clipmin;
int delay;
int index;
float clipMinSign, clipMaxSign; float clipMinSign, clipMaxSign;
double dt;
bool IsOutput; bool IsOutput;
bool clip; bool clip;
void Delay(void);
void Clip(void); void Clip(void);
virtual void bind(); virtual void bind();
virtual void Debug(int from); virtual void Debug(int from);

View file

@ -38,6 +38,10 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGFCSFunction.h" #include "FGFCSFunction.h"
#include <cstdlib>
#include <iostream>
using namespace std;
namespace JSBSim { namespace JSBSim {
@ -119,7 +123,10 @@ void FGFCSFunction::Debug(int from)
if (InputNodes.size()>0) if (InputNodes.size()>0)
cout << " INPUT: " << InputNodes[0]->getName() << endl; cout << " INPUT: " << InputNodes[0]->getName() << endl;
// cout << " Function: " << endl; // cout << " Function: " << endl;
if (IsOutput) cout << " OUTPUT: " << OutputNode->getName() << endl; if (IsOutput) {
for (unsigned int i=0; i<OutputNodes.size(); i++)
cout << " OUTPUT: " << OutputNodes[i]->getName() << endl;
}
} }
} }
if (debug_lvl & 2 ) { // Instantiation/Destruction notification if (debug_lvl & 2 ) { // Instantiation/Destruction notification

View file

@ -38,8 +38,8 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGFCSComponent.h" #include "FGFCSComponent.h"
#include <input_output/FGXMLElement.h> #include "input_output/FGXMLElement.h"
#include <math/FGFunction.h> #include "math/FGFunction.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS

View file

@ -38,6 +38,13 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGFilter.h" #include "FGFilter.h"
#include "input_output/FGXMLElement.h"
#include "input_output/FGPropertyManager.h"
#include <iostream>
#include <string>
using namespace std;
namespace JSBSim { namespace JSBSim {
@ -50,14 +57,14 @@ CLASS IMPLEMENTATION
FGFilter::FGFilter(FGFCS* fcs, Element* element) : FGFCSComponent(fcs, element) FGFilter::FGFilter(FGFCS* fcs, Element* element) : FGFCSComponent(fcs, element)
{ {
dt = fcs->GetState()->Getdt();
Trigger = 0; Trigger = 0;
DynamicFilter = false; DynamicFilter = false;
C[1] = C[2] = C[3] = C[4] = C[5] = C[6] = 0.0; C[1] = C[2] = C[3] = C[4] = C[5] = C[6] = 0.0;
for (int i=0; i<7; i++) { for (int i=1; i<7; i++) {
PropertySign[i] = 1.0; PropertySign[i] = 1.0;
PropertyNode[i] = 0L; PropertyNode[i] = 0L;
ReadFilterCoefficients(element, i);
} }
if (Type == "LAG_FILTER") FilterType = eLag ; if (Type == "LAG_FILTER") FilterType = eLag ;
@ -67,13 +74,6 @@ FGFilter::FGFilter(FGFCS* fcs, Element* element) : FGFCSComponent(fcs, element)
else if (Type == "INTEGRATOR") FilterType = eIntegrator ; else if (Type == "INTEGRATOR") FilterType = eIntegrator ;
else FilterType = eUnknown ; else FilterType = eUnknown ;
ReadFilterCoefficients(element, 1);
ReadFilterCoefficients(element, 2);
ReadFilterCoefficients(element, 3);
ReadFilterCoefficients(element, 4);
ReadFilterCoefficients(element, 5);
ReadFilterCoefficients(element, 6);
if (element->FindElement("trigger")) { if (element->FindElement("trigger")) {
Trigger = PropertyManager->GetNode(element->FindElementValue("trigger")); Trigger = PropertyManager->GetNode(element->FindElementValue("trigger"));
} }
@ -98,13 +98,13 @@ FGFilter::~FGFilter()
void FGFilter::ReadFilterCoefficients(Element* element, int index) void FGFilter::ReadFilterCoefficients(Element* element, int index)
{ {
char buf[3]; // index is known to be 1-7.
sprintf(buf, "c%d", index); // A stringstream would be overkill, but also trying to avoid sprintf
string coefficient = string(buf); string coefficient = "c0";
string property_string=""; coefficient[1] += index;
if ( element->FindElement(coefficient) ) { if ( element->FindElement(coefficient) ) {
property_string = element->FindElementValue(coefficient); string property_string = element->FindElementValue(coefficient);
if (!is_number(property_string)) { // property if (!is_number(property_string)) { // property
if (property_string[0] == '-') { if (property_string[0] == '-') {
PropertySign[index] = -1.0; PropertySign[index] = -1.0;
@ -323,8 +323,13 @@ void FGFilter::Debug(int from)
if (PropertyNode[1] == 0L) cout << " C[1]: " << C[1] << endl; if (PropertyNode[1] == 0L) cout << " C[1]: " << C[1] << endl;
else cout << " C[1] is the value of property: " << sgn << PropertyNode[1]->GetName() << endl; else cout << " C[1] is the value of property: " << sgn << PropertyNode[1]->GetName() << endl;
break; break;
case eUnknown:
break;
} }
if (IsOutput) cout << " OUTPUT: " << OutputNode->getName() << endl; if (IsOutput) {
for (unsigned int i=0; i<OutputNodes.size(); i++)
cout << " OUTPUT: " << OutputNodes[i]->getName() << endl;
}
} }
} }
if (debug_lvl & 2 ) { // Instantiation/Destruction notification if (debug_lvl & 2 ) { // Instantiation/Destruction notification

View file

@ -38,7 +38,6 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGFCSComponent.h" #include "FGFCSComponent.h"
#include <input_output/FGXMLElement.h>
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS
@ -52,6 +51,10 @@ FORWARD DECLARATIONS
namespace JSBSim { namespace JSBSim {
class Element;
class FGPropertyManager;
class FGFCS;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS DOCUMENTATION CLASS DOCUMENTATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
@ -249,7 +252,6 @@ public:
enum {eLag, eLeadLag, eOrder2, eWashout, eIntegrator, eUnknown} FilterType; enum {eLag, eLeadLag, eOrder2, eWashout, eIntegrator, eUnknown} FilterType;
private: private:
double dt;
double ca; double ca;
double cb; double cb;
double cc; double cc;

View file

@ -38,6 +38,12 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGGain.h" #include "FGGain.h"
#include "input_output/FGXMLElement.h"
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
namespace JSBSim { namespace JSBSim {
@ -212,7 +218,10 @@ void FGGain::Debug(int from)
} else { } else {
cout << " GAIN: " << Gain << endl; cout << " GAIN: " << Gain << endl;
} }
if (IsOutput) cout << " OUTPUT: " << OutputNode->getName() << endl; if (IsOutput) {
for (unsigned int i=0; i<OutputNodes.size(); i++)
cout << " OUTPUT: " << OutputNodes[i]->getName() << endl;
}
if (Type == "AEROSURFACE_SCALE") { if (Type == "AEROSURFACE_SCALE") {
cout << " In/Out Mapping:" << endl; cout << " In/Out Mapping:" << endl;
cout << " Input MIN: " << InMin << endl; cout << " Input MIN: " << InMin << endl;

View file

@ -38,11 +38,7 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGFCSComponent.h" #include "FGFCSComponent.h"
#include <string> #include "math/FGTable.h"
#include <input_output/FGXMLElement.h>
#include <math/FGTable.h>
using std::string;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS
@ -57,6 +53,7 @@ FORWARD DECLARATIONS
namespace JSBSim { namespace JSBSim {
class FGFCS; class FGFCS;
class Element;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS DOCUMENTATION CLASS DOCUMENTATION

View file

@ -38,6 +38,9 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGGradient.h" #include "FGGradient.h"
#include <iostream>
using namespace std;
namespace JSBSim { namespace JSBSim {

View file

@ -38,7 +38,7 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGFCSComponent.h" #include "FGFCSComponent.h"
#include <input_output/FGXMLElement.h> #include "input_output/FGXMLElement.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS

View file

@ -38,6 +38,9 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGGyro.h" #include "FGGyro.h"
#include <iostream>
using namespace std;
namespace JSBSim { namespace JSBSim {
@ -48,31 +51,11 @@ static const char *IdHdr = ID_GYRO;
CLASS IMPLEMENTATION CLASS IMPLEMENTATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
FGGyro::FGGyro(FGFCS* fcs, Element* element) : FGSensor(fcs, element) FGGyro::FGGyro(FGFCS* fcs, Element* element) : FGSensor(fcs, element),
FGSensorOrientation(element)
{ {
Propagate = fcs->GetExec()->GetPropagate(); Propagate = fcs->GetExec()->GetPropagate();
Element* orient_element = element->FindElement("orientation");
if (orient_element) vOrient = orient_element->FindElementTripletConvertTo("RAD");
else {cerr << "No orientation given for gyro. " << endl;}
Element* axis_element = element->FindElement("axis");
if (axis_element) {
string sAxis = element->FindElementValue("axis");
if (sAxis == "ROLL" || sAxis == "roll") {
axis = 1;
} else if (sAxis == "PITCH" || sAxis == "pitch") {
axis = 2;
} else if (sAxis == "YAW" || sAxis == "yaw") {
axis = 3;
} else {
cerr << " Incorrect/no axis specified for gyro; assuming Roll axis" << endl;
axis = 1;
}
}
CalculateTransformMatrix();
Debug(0); Debug(0);
} }
@ -94,59 +77,11 @@ bool FGGyro::Run(void )
Input = vAccel(axis); Input = vAccel(axis);
Output = Input; // perfect gyro ProcessSensorSignal();
// Degrade signal as specified
if (fail_stuck) {
Output = PreviousOutput;
return true;
}
if (lag != 0.0) Lag(); // models gyro lag
if (noise_variance != 0.0) Noise(); // models noise
if (drift_rate != 0.0) Drift(); // models drift over time
if (bias != 0.0) Bias(); // models a finite bias
if (gain != 0.0) Gain(); // models a gain
if (fail_low) Output = -HUGE_VAL;
if (fail_high) Output = HUGE_VAL;
if (bits != 0) Quantize(); // models quantization degradation
// if (delay != 0.0) Delay(); // models system signal transport latencies
Clip(); // Is it right to clip a gyro?
return true; return true;
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGGyro::CalculateTransformMatrix(void)
{
double cp,sp,cr,sr,cy,sy;
cp=cos(vOrient(ePitch)); sp=sin(vOrient(ePitch));
cr=cos(vOrient(eRoll)); sr=sin(vOrient(eRoll));
cy=cos(vOrient(eYaw)); sy=sin(vOrient(eYaw));
mT(1,1) = cp*cy;
mT(1,2) = cp*sy;
mT(1,3) = -sp;
mT(2,1) = sr*sp*cy - cr*sy;
mT(2,2) = sr*sp*sy + cr*cy;
mT(2,3) = sr*cp;
mT(3,1) = cr*sp*cy + sr*sy;
mT(3,2) = cr*sp*sy - sr*cy;
mT(3,3) = cr*cp;
// This transform is different than for FGForce, where we want a native nozzle
// force in body frame. Here we calculate the body frame accel and want it in
// the transformed gyro frame. So, the next line is commented out.
// mT = mT.Inverse();
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// The bitmasked value choices are as follows: // The bitmasked value choices are as follows:
// unset: In this case (the default) JSBSim would only print // unset: In this case (the default) JSBSim would only print

View file

@ -38,12 +38,13 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGSensor.h" #include "FGSensor.h"
#include <input_output/FGXMLElement.h> #include "input_output/FGXMLElement.h"
#include "models/FGPropagate.h" #include "models/FGPropagate.h"
#include "models/FGMassBalance.h" #include "models/FGMassBalance.h"
#include "models/FGInertial.h" #include "models/FGInertial.h"
#include "math/FGColumnVector3.h" #include "math/FGColumnVector3.h"
#include "math/FGMatrix33.h" #include "math/FGMatrix33.h"
#include "FGSensorOrientation.h"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS
@ -116,7 +117,7 @@ time.
CLASS DECLARATION CLASS DECLARATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
class FGGyro : public FGSensor class FGGyro : public FGSensor, public FGSensorOrientation
{ {
public: public:
FGGyro(FGFCS* fcs, Element* element); FGGyro(FGFCS* fcs, Element* element);
@ -126,11 +127,8 @@ public:
private: private:
FGPropagate* Propagate; FGPropagate* Propagate;
FGColumnVector3 vOrient;
FGColumnVector3 vAccel; FGColumnVector3 vAccel;
FGMatrix33 mT;
void CalculateTransformMatrix(void); void CalculateTransformMatrix(void);
int axis;
void Debug(int from); void Debug(int from);
}; };

View file

@ -38,8 +38,11 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGKinemat.h" #include "FGKinemat.h"
#include <math.h> #include "input_output/FGXMLElement.h"
#include <float.h> #include <iostream>
#include <cstdlib>
using namespace std;
namespace JSBSim { namespace JSBSim {
@ -98,13 +101,13 @@ FGKinemat::~FGKinemat()
bool FGKinemat::Run(void ) bool FGKinemat::Run(void )
{ {
double dt = fcs->GetState()->Getdt(); double dt0 = dt;
Input = InputNodes[0]->getDoubleValue() * InputSigns[0]; Input = InputNodes[0]->getDoubleValue() * InputSigns[0];
if (DoScale) Input *= Detents[NumDetents-1]; if (DoScale) Input *= Detents[NumDetents-1];
if (IsOutput) Output = OutputNode->getDoubleValue(); if (IsOutput) Output = OutputNodes[0]->getDoubleValue();
if (Input < Detents[0]) if (Input < Detents[0])
Input = Detents[0]; Input = Detents[0];
@ -113,7 +116,7 @@ bool FGKinemat::Run(void )
// Process all detent intervals the movement traverses until either the // Process all detent intervals the movement traverses until either the
// final value is reached or the time interval has finished. // final value is reached or the time interval has finished.
while ( 0.0 < dt && !EqualToRoundoff(Input, Output) ) { while ( dt0 > 0.0 && !EqualToRoundoff(Input, Output) ) {
// Find the area where Output is in // Find the area where Output is in
int ind; int ind;
@ -137,8 +140,8 @@ bool FGKinemat::Run(void )
double ThisDt = fabs((ThisInput-Output)/Rate); double ThisDt = fabs((ThisInput-Output)/Rate);
// and clip to the timestep size // and clip to the timestep size
if (dt < ThisDt) { if (dt0 < ThisDt) {
ThisDt = dt; ThisDt = dt0;
if (Output < Input) if (Output < Input)
Output += ThisDt*Rate; Output += ThisDt*Rate;
else else
@ -148,7 +151,7 @@ bool FGKinemat::Run(void )
// is met even in inexact arithmetics ... // is met even in inexact arithmetics ...
Output = ThisInput; Output = ThisInput;
dt -= ThisDt; dt0 -= ThisDt;
} }
} }
@ -190,7 +193,10 @@ void FGKinemat::Debug(int from)
for (int i=0;i<NumDetents;i++) { for (int i=0;i<NumDetents;i++) {
cout << " " << Detents[i] << " " << TransitionTimes[i] << endl; cout << " " << Detents[i] << " " << TransitionTimes[i] << endl;
} }
if (IsOutput) cout << " OUTPUT: " << OutputNode->getName() << endl; if (IsOutput) {
for (unsigned int i=0; i<OutputNodes.size(); i++)
cout << " OUTPUT: " << OutputNodes[i]->getName() << endl;
}
if (!DoScale) cout << " NOSCALE" << endl; if (!DoScale) cout << " NOSCALE" << endl;
} }
} }

View file

@ -38,12 +38,7 @@ INCLUDES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGFCSComponent.h" #include "FGFCSComponent.h"
#include <input_output/FGXMLElement.h>
#include <vector> #include <vector>
#include <string>
using std::vector;
using std::string;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DEFINITIONS DEFINITIONS
@ -134,8 +129,8 @@ public:
bool Run (void); bool Run (void);
private: private:
vector<double> Detents; std::vector<double> Detents;
vector<double> TransitionTimes; std::vector<double> TransitionTimes;
int NumDetents; int NumDetents;
double OutputPct; double OutputPct;
bool DoScale; bool DoScale;

Some files were not shown because too many files have changed in this diff Show more