From c5d537394de100e9d1fa5c535a215fa5ea7c7ee3 Mon Sep 17 00:00:00 2001 From: david Date: Wed, 6 Feb 2002 04:07:12 +0000 Subject: [PATCH] Latest JSBSim changes, including a kludge from Tony to keep the slip/skid ball still when the plane is stationary. --- src/FDM/JSBSim.cxx | 6 +- src/FDM/JSBSim/FGAircraft.h | 2 + src/FDM/JSBSim/FGAuxiliary.cpp | 20 +- src/FDM/JSBSim/FGInitialCondition.cpp | 1 - src/FDM/JSBSim/FGOutput.cpp | 61 +-- src/FDM/JSBSim/FGfdmSocket.cpp | 2 + src/FDM/JSBSim/FGfdmSocket.h | 2 + src/FDM/JSBSim/JSBSim.cpp | 686 +++++++++++++------------- 8 files changed, 397 insertions(+), 383 deletions(-) diff --git a/src/FDM/JSBSim.cxx b/src/FDM/JSBSim.cxx index d45f0bb5c..c7dd94bb8 100644 --- a/src/FDM/JSBSim.cxx +++ b/src/FDM/JSBSim.cxx @@ -373,9 +373,9 @@ bool FGJSBsim::copy_from_JSBsim() { Aircraft->GetNcg()(2), Aircraft->GetNcg()(3) ); - _set_Accels_Pilot_Body( Auxiliary->GetNpilot()(1), - Auxiliary->GetNpilot()(2), - Auxiliary->GetNpilot()(3) ); + _set_Accels_Pilot_Body( Auxiliary->GetPilotAccel()(1), + Auxiliary->GetPilotAccel()(2), + Auxiliary->GetPilotAccel()(3) ); // _set_Accels_Pilot_Body_N( Auxiliary->GetPilotAccel()(1)/32.1739, // Auxiliary->GetNpilot(2)/32.1739, diff --git a/src/FDM/JSBSim/FGAircraft.h b/src/FDM/JSBSim/FGAircraft.h index 240d75259..b9624792d 100644 --- a/src/FDM/JSBSim/FGAircraft.h +++ b/src/FDM/JSBSim/FGAircraft.h @@ -145,7 +145,9 @@ public: inline double Getvbarh(void) { return vbarh; } // H. Tail Volume inline double Getvbarv(void) { return vbarv; } // V. Tail Volume inline FGColumnVector3& GetMoments(void) { return vMoments; } + inline double GetMoments(int idx) { return vMoments(idx); } inline FGColumnVector3& GetForces(void) { return vForces; } + inline double GetForces(int idx) { return vForces(idx); } inline FGColumnVector3& GetBodyAccel(void) { return vBodyAccel; } inline FGColumnVector3& GetNcg (void) { return vNcg; } inline FGColumnVector3& GetXYZrp(void) { return vXYZrp; } diff --git a/src/FDM/JSBSim/FGAuxiliary.cpp b/src/FDM/JSBSim/FGAuxiliary.cpp index d744579d3..84232e89b 100644 --- a/src/FDM/JSBSim/FGAuxiliary.cpp +++ b/src/FDM/JSBSim/FGAuxiliary.cpp @@ -145,14 +145,18 @@ bool FGAuxiliary::Run() // mass, the acceleration vector is calculated. The term wdot is equivalent // to the JSBSim vPQRdot vector, and the w parameter is equivalent to vPQR. // The radius R is calculated below in the vector vToEyePt. - - vToEyePt = Aircraft->GetXYZep() - MassBalance->GetXYZcg(); - - vPilotAccel = Aircraft->GetBodyAccel() - + Rotation->GetPQRdot() * vToEyePt - + Rotation->GetPQR() * (Rotation->GetPQR() * vToEyePt) - + Inertial->GetGravity(); - + + vPilotAccel.InitMatrix(); + if( Translation->GetVt() > 1 ) { + vToEyePt = Aircraft->GetXYZep() - MassBalance->GetXYZcg(); + + vPilotAccel = Aerodynamics->GetForces() + + Propulsion->GetForces() + + GroundReactions->GetForces(); + vPilotAccel /= MassBalance->GetMass(); + vPilotAccel += Rotation->GetPQRdot() * vToEyePt; + vPilotAccel += Rotation->GetPQR() * (Rotation->GetPQR() * vToEyePt); + } earthPosAngle += State->Getdt()*Inertial->omega(); return false; } else { diff --git a/src/FDM/JSBSim/FGInitialCondition.cpp b/src/FDM/JSBSim/FGInitialCondition.cpp index a76ef2a92..1b70824ad 100644 --- a/src/FDM/JSBSim/FGInitialCondition.cpp +++ b/src/FDM/JSBSim/FGInitialCondition.cpp @@ -671,7 +671,6 @@ bool FGInitialCondition::solve(double *y,double x) i=0; while ((fabs(d) > eps) && (i < 100)) { d=(x3-x1)/d0; - cout << "f3-f1= " << f3-f1 << endl; x2 = x1-d*d0*f1/(f3-f1); f2=(this->*sfunc)(x2)-x; diff --git a/src/FDM/JSBSim/FGOutput.cpp b/src/FDM/JSBSim/FGOutput.cpp index 5b1d3501a..77bd0f663 100644 --- a/src/FDM/JSBSim/FGOutput.cpp +++ b/src/FDM/JSBSim/FGOutput.cpp @@ -69,9 +69,6 @@ FGOutput::FGOutput(FGFDMExec* fdmex) : FGModel(fdmex) SubSystems = 0; enabled = true; -#ifdef FG_WITH_JSBSIM_SOCKET - socket = new FGfdmSocket("localhost",1138); -#endif Debug(0); } @@ -302,8 +299,9 @@ void FGOutput::DelimitedOutput(string fname) void FGOutput::SocketOutput(void) { string asciiData; - /* + if (socket == NULL) return; + if (!socket->GetConnectStatus()) return; socket->Clear(); if (sFirstPass) { @@ -343,10 +341,10 @@ void FGOutput::SocketOutput(void) socket->Append("L"); socket->Append("M"); socket->Append("N"); - socket->Append("Throttle"); - socket->Append("Aileron"); - socket->Append("Elevator"); - socket->Append("Rudder"); + socket->Append("Throttle Position"); + socket->Append("Aileron Position"); + socket->Append("Elevator Position"); + socket->Append("Rudder Position"); sFirstPass = false; socket->Send(); } @@ -368,30 +366,30 @@ void FGOutput::SocketOutput(void) socket->Append(Position->GetVn()); socket->Append(Position->GetVe()); socket->Append(Position->GetVd()); - socket->Append(Translation->GetUdot()); - socket->Append(Translation->GetVdot()); - socket->Append(Translation->GetWdot()); - socket->Append(Rotation->GetP()); - socket->Append(Rotation->GetQ()); - socket->Append(Rotation->GetR()); - socket->Append(Rotation->GetPdot()); - socket->Append(Rotation->GetQdot()); - socket->Append(Rotation->GetRdot()); - socket->Append(Aircraft->GetFx()); - socket->Append(Aircraft->GetFy()); - socket->Append(Aircraft->GetFz()); + socket->Append(Translation->GetUVWdot(eU)); + socket->Append(Translation->GetUVWdot(eV)); + socket->Append(Translation->GetUVWdot(eW)); + socket->Append(Rotation->GetPQR(eP)); + socket->Append(Rotation->GetPQR(eQ)); + socket->Append(Rotation->GetPQR(eR)); + socket->Append(Rotation->GetPQRdot(eP)); + socket->Append(Rotation->GetPQRdot(eQ)); + socket->Append(Rotation->GetPQRdot(eR)); + socket->Append(Aircraft->GetForces(eX)); + socket->Append(Aircraft->GetForces(eY)); + socket->Append(Aircraft->GetForces(eZ)); socket->Append(Position->GetLatitude()); socket->Append(Position->GetLongitude()); socket->Append(Translation->Getqbar()); socket->Append(Translation->Getalpha()); - socket->Append(Aircraft->GetL()); - socket->Append(Aircraft->GetM()); - socket->Append(Aircraft->GetN()); - socket->Append(FCS->GetThrottle(0)); - socket->Append(FCS->GetDa()); - socket->Append(FCS->GetDe()); - socket->Append(FCS->GetDr()); - socket->Send(); */ + socket->Append(Aircraft->GetMoments(eL)); + socket->Append(Aircraft->GetMoments(eM)); + socket->Append(Aircraft->GetMoments(eN)); + socket->Append(FCS->GetThrottlePos(0)); + socket->Append(FCS->GetDaPos()); + socket->Append(FCS->GetDePos()); + socket->Append(FCS->GetDrPos()); + socket->Send(); } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -419,6 +417,13 @@ bool FGOutput::Load(FGConfigFile* AC_cfg) Output->SetFilename(token); token = AC_cfg->GetValue("TYPE"); Output->SetType(token); + +#if defined( FG_WITH_JSBSIM_SOCKET ) || !defined( FGFS ) + if (token == "SOCKET") { + socket = new FGfdmSocket("localhost",1138); + } +#endif + AC_cfg->GetNextConfigLine(); while ((token = AC_cfg->GetValue()) != string("/OUTPUT")) { diff --git a/src/FDM/JSBSim/FGfdmSocket.cpp b/src/FDM/JSBSim/FGfdmSocket.cpp index a20a79ad7..190d17598 100644 --- a/src/FDM/JSBSim/FGfdmSocket.cpp +++ b/src/FDM/JSBSim/FGfdmSocket.cpp @@ -49,6 +49,7 @@ CLASS IMPLEMENTATION FGfdmSocket::FGfdmSocket(string address, int port) { size = 0; + connected = false; #if defined(__BORLANDC__) || defined(_MSC_VER) || defined(__MINGW32__) WSADATA wsaData; @@ -80,6 +81,7 @@ FGfdmSocket::FGfdmSocket(string address, int port) int len = sizeof(struct sockaddr_in); if (connect(sckt, (struct sockaddr*)&scktName, len) == 0) { // successful cout << "Successfully connected to socket ..." << endl; + connected = true; } else { // unsuccessful cout << "Could not connect to socket ..." << endl; } diff --git a/src/FDM/JSBSim/FGfdmSocket.h b/src/FDM/JSBSim/FGfdmSocket.h index 0a405f32b..df9c3ec7b 100644 --- a/src/FDM/JSBSim/FGfdmSocket.h +++ b/src/FDM/JSBSim/FGfdmSocket.h @@ -100,6 +100,7 @@ public: void Append(double); void Append(long); void Clear(void); + bool GetConnectStatus(void) {return connected;} private: int sckt; @@ -107,6 +108,7 @@ private: struct sockaddr_in scktName; struct hostent *host; string buffer; + bool connected; void Debug(int from); }; diff --git a/src/FDM/JSBSim/JSBSim.cpp b/src/FDM/JSBSim/JSBSim.cpp index cbe40ff0b..5dd4add9d 100644 --- a/src/FDM/JSBSim/JSBSim.cpp +++ b/src/FDM/JSBSim/JSBSim.cpp @@ -1,343 +1,343 @@ -/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - Module: JSBSim.cpp - Author: Jon S. Berndt - Date started: 08/17/99 - Purpose: Standalone version of JSBSim. - Called by: The USER. - - ------------- Copyright (C) 1999 Jon S. Berndt (jsb@hal-pc.org) ------------- - - This program is free software; you can redistribute it and/or modify it under - the terms of the GNU General Public License as published by the Free Software - Foundation; either version 2 of the License, or (at your option) any later - version. - - This program is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - details. - - You should have received a copy of the GNU General Public License along with - this program; if not, write to the Free Software Foundation, Inc., 59 Temple - Place - Suite 330, Boston, MA 02111-1307, USA. - - Further information about the GNU General Public License can also be found on - the world wide web at http://www.gnu.org. - -FUNCTIONAL DESCRIPTION --------------------------------------------------------------------------------- - -This class Handles calling JSBSim standalone. It is set up for compilation under -Borland C+Builder or other compiler. - -HISTORY --------------------------------------------------------------------------------- -08/17/99 JSB Created - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -INCLUDES -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ - -#include "FGFDMExec.h" -#include "FGRotation.h" -#include "FGAtmosphere.h" -#include "FGState.h" -#include "FGFCS.h" -#include "FGAircraft.h" -#include "FGTranslation.h" -#include "FGPosition.h" -#include "FGAuxiliary.h" -#include "FGOutput.h" -#include "FGConfigFile.h" -#include "FGScript.h" -#include "FGJSBBase.h" - -#ifdef FGFS -#include -#include STL_IOSTREAM -#else -# if defined(sgi) && !defined(__GNUC__) -# include -# else -# include -# endif -#endif - -#if __BCPLUSPLUS__ == 0x540 -#pragma hdrstop -#include -//--------------------------------------------------------------------------- -USERES("JSBSim.res"); -USEUNIT("FGUtility.cpp"); -USEUNIT("FGAircraft.cpp"); -USEUNIT("FGAtmosphere.cpp"); -USEUNIT("FGAuxiliary.cpp"); -USEUNIT("FGCoefficient.cpp"); -USEUNIT("FGColumnVector3.cpp"); -USEUNIT("FGColumnVector4.cpp"); -USEUNIT("FGConfigFile.cpp"); -USEUNIT("FGEngine.cpp"); -USEUNIT("FGFactorGroup.cpp"); -USEUNIT("FGFCS.cpp"); -USEUNIT("FGFDMExec.cpp"); -USEUNIT("FGfdmSocket.cpp"); -USEUNIT("FGForce.cpp"); -USEUNIT("FGGroundReactions.cpp"); -USEUNIT("FGInertial.cpp"); -USEUNIT("FGInitialCondition.cpp"); -USEUNIT("FGJSBBase.cpp"); -USEUNIT("FGLGear.cpp"); -USEUNIT("FGMassBalance.cpp"); -USEUNIT("FGMatrix33.cpp"); -USEUNIT("FGModel.cpp"); -USEUNIT("FGNozzle.cpp"); -USEUNIT("FGOutput.cpp"); -USEUNIT("FGPiston.cpp"); -USEUNIT("FGPosition.cpp"); -USEUNIT("FGPropeller.cpp"); -USEUNIT("FGPropulsion.cpp"); -USEUNIT("FGRocket.cpp"); -USEUNIT("FGRotation.cpp"); -USEUNIT("FGRotor.cpp"); -USEUNIT("FGScript.cpp"); -USEUNIT("FGState.cpp"); -USEUNIT("FGTable.cpp"); -USEUNIT("FGTank.cpp"); -USEUNIT("FGThruster.cpp"); -USEUNIT("FGTranslation.cpp"); -USEUNIT("FGTrim.cpp"); -USEUNIT("FGTrimAxis.cpp"); -USEUNIT("FGTurboJet.cpp"); -USEUNIT("FGTurboProp.cpp"); -USEUNIT("FGTurboShaft.cpp"); -USEUNIT("FGAerodynamics.cpp"); -USEUNIT("filtersjb\FGSwitch.cpp"); -USEUNIT("filtersjb\FGFCSComponent.cpp"); -USEUNIT("filtersjb\FGFilter.cpp"); -USEUNIT("filtersjb\FGGain.cpp"); -USEUNIT("filtersjb\FGGradient.cpp"); -USEUNIT("filtersjb\FGKinemat.cpp"); -USEUNIT("filtersjb\FGSummer.cpp"); -USEUNIT("filtersjb\FGDeadBand.cpp"); -//--------------------------------------------------------------------------- -#pragma argsused -#endif - -/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -DEFINITIONS -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ - -/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GLOBAL DATA -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ - -static const char *IdSrc = "$Id$"; - -string ScriptName; -string AircraftName; -string ResetName; -string LogOutputName; -string LogDirectiveName; -FGFDMExec* FDMExec; - -/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -COMMENTS, REFERENCES, and NOTES [use "class documentation" below for API docs] -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ - -/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -FORWARD DECLARATIONS -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ - -void options(int, char**); - -/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -DOCUMENTATION -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ - -/** Standalone JSBSim main program - This is the wrapper program used to instantiate the JSBSim system and control - it. Use this program to build a version of JSBSim that can be run from the - command line. To get any use out of this, you will have to create a script - to run a test case and specify what kind of output you would like. - @author Jon S. Berndt - @version $Id$ - @see - -*/ - -/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -IMPLEMENTATION -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ - -int main(int argc, char* argv[]) -{ - ScriptName = ""; - AircraftName = ""; - ResetName = ""; - LogOutputName = ""; - LogDirectiveName = ""; - bool result = false; - bool Scripted = false; - FGScript* Script; - - options(argc, argv); - - FDMExec = new FGFDMExec(); - - if (!ScriptName.empty()) { // SCRIPTED CASE - - Script = new FGScript(FDMExec); - result = Script->LoadScript(ScriptName); - - if (!result) { - cerr << "Script file " << ScriptName << " was not successfully loaded" << endl; - exit(-1); - } - - Scripted = true; - - } else if (!AircraftName.empty() || !ResetName.empty()) { // form jsbsim - - if ( ! FDMExec->LoadModel("aircraft", "engine", AircraftName)) { - cerr << " JSBSim could not be started" << endl << endl; - exit(-1); - } - - FGInitialCondition IC(FDMExec); - if ( ! IC.Load("aircraft",AircraftName,ResetName)) { - cerr << "Initialization unsuccessful" << endl; - exit(-1); - } - } else { - cout << " No Aircraft, Script, or Reset information given" << endl << endl; - exit(-1); - } - -// -// RUN loop. MESSAGES are read inside the Run() loop and output as necessary. -// - - FGJSBBase::Message* msg; - result = FDMExec->Run(); - while (result) { - while (FDMExec->ReadMessage()) { - msg = FDMExec->ProcessMessage(); - switch (msg->type) { - case FGJSBBase::Message::eText: - cout << msg->messageId << ": " << msg->text << endl; - break; - case FGJSBBase::Message::eBool: - cout << msg->messageId << ": " << msg->text << " " << msg->bVal << endl; - break; - case FGJSBBase::Message::eInteger: - cout << msg->messageId << ": " << msg->text << " " << msg->iVal << endl; - break; - case FGJSBBase::Message::eDouble: - cout << msg->messageId << ": " << msg->text << " " << msg->dVal << endl; - break; - default: - cerr << "Unrecognized message type." << endl; - break; - } - } - - if (Scripted) { - if (!Script->RunScript()) break; - } - - result = FDMExec->Run(); - } - - delete FDMExec; - - return 0; -} - -//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -void options(int count, char **arg) -{ - int i; - - if (count == 1) { - cout << endl << " JSBSim version " << FDMExec->GetVersion() << endl << endl; - cout << " Usage: jsbsim " << endl << endl; - cout << " options:" << endl; - cout << " --help returns this message" << endl; - cout << " --version returns the version number" << endl; - cout << " --outputlogfile= sets the name of the data output file" << endl; - cout << " --logdirectivefile= specifies the name of the data logging directives file" << endl; - cout << " --aircraft= specifies the name of the aircraft to be modeled" << endl; - cout << " --script= specifies a script to run" << endl; - cout << " --initfile= specifies an initilization file" << endl << endl; - cout << " NOTE: There can be no spaces around the = sign when" << endl; - cout << " an option is followed by a filename" << endl << endl; - } - - for (i=1; iGetVersion() << endl << endl; - cout << " Usage: jsbsim " << endl << endl; - cout << " options:" << endl; - cout << " --help returns this message" << endl; - cout << " --version returns the version number" << endl; - cout << " --outputlogfile= sets the name of the data output file" << endl; - cout << " --logdirectivefile= specifies the name of the data logging directives file" << endl; - cout << " --aircraft= specifies the name of the aircraft to be modeled" << endl; - cout << " --script= specifies a script to run" << endl; - cout << " --initfile= specifies an initilization file" << endl << endl; - cout << " NOTE: There can be no spaces around the = sign when" << endl; - cout << " an option is followed by a filename" << endl << endl; - exit(0); - } else if (argument.find("--version") != string::npos) { - cout << endl << " JSBSim Version: " << FDMExec->GetVersion() << endl << endl; - exit (0); - } else if (argument.find("--outputlogfile") != string::npos) { - n = argument.find("=")+1; - if (n > 0) { - LogOutputName = argument.substr(argument.find("=")+1); - } else { - LogOutputName = "JSBout.csv"; - cerr << " Output log file name not valid or not understood. Using JSBout.csv as default"; - } - } else if (argument.find("--logdirectivefile") != string::npos) { - n = argument.find("=")+1; - if (n > 0) { - LogDirectiveName = argument.substr(argument.find("=")+1); - } else { - cerr << " Log directives file not valid or not understood." << endl << endl; - exit(1); - } - } else if (argument.find("--aircraft") != string::npos) { - n = argument.find("=")+1; - if (n > 0) { - AircraftName = argument.substr(argument.find("=")+1); - } else { - cerr << " Aircraft name not valid or not understood." << endl << endl; - exit(1); - } - } else if (argument.find("--script") != string::npos) { - n = argument.find("=")+1; - if (n > 0) { - ScriptName = argument.substr(argument.find("=")+1); - } else { - cerr << " Script name not valid or not understood." << endl << endl; - exit(1); - } - } else if (argument.find("--initfile") != string::npos) { - n = argument.find("=")+1; - if (n > 0) { - ResetName = argument.substr(argument.find("=")+1); - } else { - cerr << " Reset name not valid or not understood." << endl << endl; - exit(1); - } - } else { - cerr << endl << " Parameter: " << argument << " not understood" << endl; - } - } - -} - +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + Module: JSBSim.cpp + Author: Jon S. Berndt + Date started: 08/17/99 + Purpose: Standalone version of JSBSim. + Called by: The USER. + + ------------- Copyright (C) 1999 Jon S. Berndt (jsb@hal-pc.org) ------------- + + This program is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free Software + Foundation; either version 2 of the License, or (at your option) any later + version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + details. + + You should have received a copy of the GNU General Public License along with + this program; if not, write to the Free Software Foundation, Inc., 59 Temple + Place - Suite 330, Boston, MA 02111-1307, USA. + + Further information about the GNU General Public License can also be found on + the world wide web at http://www.gnu.org. + +FUNCTIONAL DESCRIPTION +-------------------------------------------------------------------------------- + +This class Handles calling JSBSim standalone. It is set up for compilation under +Borland C+Builder or other compiler. + +HISTORY +-------------------------------------------------------------------------------- +08/17/99 JSB Created + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +INCLUDES +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +#include "FGFDMExec.h" +#include "FGRotation.h" +#include "FGAtmosphere.h" +#include "FGState.h" +#include "FGFCS.h" +#include "FGAircraft.h" +#include "FGTranslation.h" +#include "FGPosition.h" +#include "FGAuxiliary.h" +#include "FGOutput.h" +#include "FGConfigFile.h" +#include "FGScript.h" +#include "FGJSBBase.h" + +#ifdef FGFS +#include +#include STL_IOSTREAM +#else +# if defined(sgi) && !defined(__GNUC__) +# include +# else +# include +# endif +#endif + +#if __BCPLUSPLUS__ == 0x540 +#pragma hdrstop +#include +//--------------------------------------------------------------------------- +USERES("JSBSim.res"); +USEUNIT("FGUtility.cpp"); +USEUNIT("FGAircraft.cpp"); +USEUNIT("FGAtmosphere.cpp"); +USEUNIT("FGAuxiliary.cpp"); +USEUNIT("FGCoefficient.cpp"); +USEUNIT("FGColumnVector3.cpp"); +USEUNIT("FGColumnVector4.cpp"); +USEUNIT("FGConfigFile.cpp"); +USEUNIT("FGEngine.cpp"); +USEUNIT("FGFactorGroup.cpp"); +USEUNIT("FGFCS.cpp"); +USEUNIT("FGFDMExec.cpp"); +USEUNIT("FGfdmSocket.cpp"); +USEUNIT("FGForce.cpp"); +USEUNIT("FGGroundReactions.cpp"); +USEUNIT("FGInertial.cpp"); +USEUNIT("FGInitialCondition.cpp"); +USEUNIT("FGJSBBase.cpp"); +USEUNIT("FGLGear.cpp"); +USEUNIT("FGMassBalance.cpp"); +USEUNIT("FGMatrix33.cpp"); +USEUNIT("FGModel.cpp"); +USEUNIT("FGNozzle.cpp"); +USEUNIT("FGOutput.cpp"); +USEUNIT("FGPiston.cpp"); +USEUNIT("FGPosition.cpp"); +USEUNIT("FGPropeller.cpp"); +USEUNIT("FGPropulsion.cpp"); +USEUNIT("FGRocket.cpp"); +USEUNIT("FGRotation.cpp"); +USEUNIT("FGRotor.cpp"); +USEUNIT("FGScript.cpp"); +USEUNIT("FGState.cpp"); +USEUNIT("FGTable.cpp"); +USEUNIT("FGTank.cpp"); +USEUNIT("FGThruster.cpp"); +USEUNIT("FGTranslation.cpp"); +USEUNIT("FGTrim.cpp"); +USEUNIT("FGTrimAxis.cpp"); +USEUNIT("FGTurboJet.cpp"); +USEUNIT("FGTurboProp.cpp"); +USEUNIT("FGTurboShaft.cpp"); +USEUNIT("FGAerodynamics.cpp"); +USEUNIT("filtersjb\FGSwitch.cpp"); +USEUNIT("filtersjb\FGFCSComponent.cpp"); +USEUNIT("filtersjb\FGFilter.cpp"); +USEUNIT("filtersjb\FGGain.cpp"); +USEUNIT("filtersjb\FGGradient.cpp"); +USEUNIT("filtersjb\FGKinemat.cpp"); +USEUNIT("filtersjb\FGSummer.cpp"); +USEUNIT("filtersjb\FGDeadBand.cpp"); +//--------------------------------------------------------------------------- +#pragma argsused +#endif + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +DEFINITIONS +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +GLOBAL DATA +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +static const char *IdSrc = "$Id$"; + +string ScriptName; +string AircraftName; +string ResetName; +string LogOutputName; +string LogDirectiveName; +FGFDMExec* FDMExec; + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +COMMENTS, REFERENCES, and NOTES [use "class documentation" below for API docs] +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +FORWARD DECLARATIONS +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +void options(int, char**); + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +DOCUMENTATION +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +/** Standalone JSBSim main program + This is the wrapper program used to instantiate the JSBSim system and control + it. Use this program to build a version of JSBSim that can be run from the + command line. To get any use out of this, you will have to create a script + to run a test case and specify what kind of output you would like. + @author Jon S. Berndt + @version $Id$ + @see - +*/ + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +IMPLEMENTATION +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +int main(int argc, char* argv[]) +{ + ScriptName = ""; + AircraftName = ""; + ResetName = ""; + LogOutputName = ""; + LogDirectiveName = ""; + bool result = false; + bool Scripted = false; + FGScript* Script; + + options(argc, argv); + + FDMExec = new FGFDMExec(); + + if (!ScriptName.empty()) { // SCRIPTED CASE + + Script = new FGScript(FDMExec); + result = Script->LoadScript(ScriptName); + + if (!result) { + cerr << "Script file " << ScriptName << " was not successfully loaded" << endl; + exit(-1); + } + + Scripted = true; + + } else if (!AircraftName.empty() || !ResetName.empty()) { // form jsbsim + + if ( ! FDMExec->LoadModel("aircraft", "engine", AircraftName)) { + cerr << " JSBSim could not be started" << endl << endl; + exit(-1); + } + + FGInitialCondition IC(FDMExec); + if ( ! IC.Load("aircraft",AircraftName,ResetName)) { + cerr << "Initialization unsuccessful" << endl; + exit(-1); + } + } else { + cout << " No Aircraft, Script, or Reset information given" << endl << endl; + exit(-1); + } + +// +// RUN loop. MESSAGES are read inside the Run() loop and output as necessary. +// + + FGJSBBase::Message* msg; + result = FDMExec->Run(); + while (result) { + while (FDMExec->ReadMessage()) { + msg = FDMExec->ProcessMessage(); + switch (msg->type) { + case FGJSBBase::Message::eText: + cout << msg->messageId << ": " << msg->text << endl; + break; + case FGJSBBase::Message::eBool: + cout << msg->messageId << ": " << msg->text << " " << msg->bVal << endl; + break; + case FGJSBBase::Message::eInteger: + cout << msg->messageId << ": " << msg->text << " " << msg->iVal << endl; + break; + case FGJSBBase::Message::eDouble: + cout << msg->messageId << ": " << msg->text << " " << msg->dVal << endl; + break; + default: + cerr << "Unrecognized message type." << endl; + break; + } + } + + if (Scripted) { + if (!Script->RunScript()) break; + } + + result = FDMExec->Run(); + } + + delete FDMExec; + + return 0; +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +void options(int count, char **arg) +{ + int i; + + if (count == 1) { + cout << endl << " JSBSim version " << FDMExec->GetVersion() << endl << endl; + cout << " Usage: jsbsim " << endl << endl; + cout << " options:" << endl; + cout << " --help returns this message" << endl; + cout << " --version returns the version number" << endl; + cout << " --outputlogfile= sets the name of the data output file" << endl; + cout << " --logdirectivefile= specifies the name of the data logging directives file" << endl; + cout << " --aircraft= specifies the name of the aircraft to be modeled" << endl; + cout << " --script= specifies a script to run" << endl; + cout << " --initfile= specifies an initilization file" << endl << endl; + cout << " NOTE: There can be no spaces around the = sign when" << endl; + cout << " an option is followed by a filename" << endl << endl; + } + + for (i=1; iGetVersion() << endl << endl; + cout << " Usage: jsbsim " << endl << endl; + cout << " options:" << endl; + cout << " --help returns this message" << endl; + cout << " --version returns the version number" << endl; + cout << " --outputlogfile= sets the name of the data output file" << endl; + cout << " --logdirectivefile= specifies the name of the data logging directives file" << endl; + cout << " --aircraft= specifies the name of the aircraft to be modeled" << endl; + cout << " --script= specifies a script to run" << endl; + cout << " --initfile= specifies an initilization file" << endl << endl; + cout << " NOTE: There can be no spaces around the = sign when" << endl; + cout << " an option is followed by a filename" << endl << endl; + exit(0); + } else if (argument.find("--version") != string::npos) { + cout << endl << " JSBSim Version: " << FDMExec->GetVersion() << endl << endl; + exit (0); + } else if (argument.find("--outputlogfile") != string::npos) { + n = argument.find("=")+1; + if (n > 0) { + LogOutputName = argument.substr(argument.find("=")+1); + } else { + LogOutputName = "JSBout.csv"; + cerr << " Output log file name not valid or not understood. Using JSBout.csv as default"; + } + } else if (argument.find("--logdirectivefile") != string::npos) { + n = argument.find("=")+1; + if (n > 0) { + LogDirectiveName = argument.substr(argument.find("=")+1); + } else { + cerr << " Log directives file not valid or not understood." << endl << endl; + exit(1); + } + } else if (argument.find("--aircraft") != string::npos) { + n = argument.find("=")+1; + if (n > 0) { + AircraftName = argument.substr(argument.find("=")+1); + } else { + cerr << " Aircraft name not valid or not understood." << endl << endl; + exit(1); + } + } else if (argument.find("--script") != string::npos) { + n = argument.find("=")+1; + if (n > 0) { + ScriptName = argument.substr(argument.find("=")+1); + } else { + cerr << " Script name not valid or not understood." << endl << endl; + exit(1); + } + } else if (argument.find("--initfile") != string::npos) { + n = argument.find("=")+1; + if (n > 0) { + ResetName = argument.substr(argument.find("=")+1); + } else { + cerr << " Reset name not valid or not understood." << endl << endl; + exit(1); + } + } else { + cerr << endl << " Parameter: " << argument << " not understood" << endl; + } + } + +} + -- 2.39.5