# include STL_IOSTREAM
# include STL_ITERATOR
#else
-# if defined(sgi) && !defined(__GNUC__)
+# if defined(sgi) && !defined(__GNUC__) && (_COMPILER_VERSION < 740)
# include <iostream.h>
# else
# include <iostream>
#include "FGState.h"
#include "FGAtmosphere.h"
#include "FGFCS.h"
+#include "FGGroundCallback.h"
#include "FGPropulsion.h"
#include "FGMassBalance.h"
#include "FGGroundReactions.h"
#include "FGAerodynamics.h"
#include "FGInertial.h"
#include "FGAircraft.h"
-#include "FGTranslation.h"
-#include "FGRotation.h"
-#include "FGPosition.h"
+#include "FGPropagate.h"
#include "FGAuxiliary.h"
#include "FGOutput.h"
#include "FGConfigFile.h"
#include "FGInitialCondition.h"
#include "FGPropertyManager.h"
+namespace JSBSim {
+
static const char *IdSrc = "$Id$";
static const char *IdHdr = ID_FDMEXEC;
CLASS IMPLEMENTATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-void checkTied( FGPropertyManager *node ) {
+void checkTied ( FGPropertyManager *node )
+{
int N = node->nChildren();
string name;
- for(int i=0;i<N;i++) {
- if(node->getChild(i)->nChildren() ) {
+
+ for (int i=0; i<N; i++) {
+ if (node->getChild(i)->nChildren() ) {
checkTied( (FGPropertyManager*)node->getChild(i) );
- } else if( node->getChild(i)->isTied() ) {
- name=((FGPropertyManager*)node->getChild(i))->GetFullyQualifiedName();
+ } else if ( node->getChild(i)->isTied() ) {
+ name = ((FGPropertyManager*)node->getChild(i))->GetFullyQualifiedName();
cerr << name << " is tied" << endl;
- }
+ }
}
-}
+}
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// Constructor
FGFDMExec::FGFDMExec(FGPropertyManager* root)
{
-
+
Frame = 0;
FirstModel = 0;
Error = 0;
Inertial = 0;
GroundReactions = 0;
Aircraft = 0;
- Translation = 0;
- Rotation = 0;
- Position = 0;
+ GroundCallback = 0;
+ Propagate = 0;
Auxiliary = 0;
Output = 0;
IC = 0;
try {
char* num = getenv("JSBSIM_DEBUG");
- if (!num) debug_lvl = 1;
- else debug_lvl = atoi(num); // set debug level
+ if (num) debug_lvl = atoi(num); // set debug level
} catch (...) { // if error set to 1
debug_lvl = 1;
}
instance = master->GetNode("/fdm/jsbsim",IdFDM,true);
-
+
Debug(0);
-
+
// this is here to catch errors in binding member functions
// to the property tree.
try {
} catch ( string msg ) {
cout << "Caught error: " << msg << endl;
exit(1);
- }
+ }
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
checkTied( instance );
} catch ( string msg ) {
cout << "Caught error: " << msg << endl;
- }
-
+ }
+
for (unsigned int i=1; i<SlaveFDMList.size(); i++) delete SlaveFDMList[i]->exec;
SlaveFDMList.clear();
-
+
Debug(1);
}
Inertial = new FGInertial(this);
GroundReactions = new FGGroundReactions(this);
Aircraft = new FGAircraft(this);
- Translation = new FGTranslation(this);
- Rotation = new FGRotation(this);
- Position = new FGPosition(this);
+ GroundCallback = new FGGroundCallback();
+ Propagate = new FGPropagate(this);
Auxiliary = new FGAuxiliary(this);
Output = new FGOutput(this);
State = new FGState(this); // This must be done here, as the FGState
// class needs valid pointers to the above
// model classes
-
+
// Initialize models so they can communicate with each other
if (!Atmosphere->InitModel()) {
if (!Aircraft->InitModel()) {
cerr << fgred << "Aircraft model init failed" << fgdef << endl;
Error+=128;}
- if (!Translation->InitModel()) {
- cerr << fgred << "Translation model init failed" << fgdef << endl;
- Error+=256;}
- if (!Rotation->InitModel()) {
- cerr << fgred << "Rotation model init failed" << fgdef << endl;
+ if (!Propagate->InitModel()) {
+ cerr << fgred << "Propagate model init failed" << fgdef << endl;
Error+=512;}
- if (!Position->InitModel()) {
- cerr << fgred << "Position model init failed" << fgdef << endl;
- Error+=1024;}
if (!Auxiliary->InitModel()) {
cerr << fgred << "Auxiliary model init failed" << fgdef << endl;
Error+=2058;}
Error+=4096;}
if (Error > 0) result = false;
-
- IC = new FGInitialCondition(this);
- //Trim is allocated as needed by GetTrim()
-
+ IC = new FGInitialCondition(this);
+
// Schedule a model. The second arg (the integer) is the pass number. For
// instance, the atmosphere model gets executed every fifth pass it is called
// by the executive. Everything else here gets executed each pass.
+ // IC and Trim objects are NOT scheduled.
Schedule(Atmosphere, 1);
Schedule(FCS, 1);
Schedule(Inertial, 1);
Schedule(GroundReactions, 1);
Schedule(Aircraft, 1);
- Schedule(Rotation, 1);
- Schedule(Translation, 1);
- Schedule(Position, 1);
+ Schedule(Propagate, 1);
Schedule(Auxiliary, 1);
Schedule(Output, 1);
- //IC and Trim are *not* scheduled objects
-
-
modelLoaded = false;
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-bool FGFDMExec::DeAllocate(void) {
-
+bool FGFDMExec::DeAllocate(void)
+{
delete Atmosphere;
delete FCS;
delete Propulsion;
delete Inertial;
delete GroundReactions;
delete Aircraft;
- delete Translation;
- delete Rotation;
- delete Position;
+ delete Propagate;
delete Auxiliary;
delete Output;
delete State;
-
+
delete IC;
delete Trim;
-
-
-
+
+ delete GroundCallback;
+
FirstModel = 0L;
Error = 0;
Inertial = 0;
GroundReactions = 0;
Aircraft = 0;
- Translation = 0;
- Rotation = 0;
- Position = 0;
+ Propagate = 0;
Auxiliary = 0;
Output = 0;
model_iterator->NextModel->SetRate(rate);
}
-
+
return 0;
}
State->Initialize(IC);
Run();
State->Resume();
+
return true;
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+void FGFDMExec::SetGroundCallback(FGGroundCallback* p) {
+ if (GroundCallback)
+ delete GroundCallback;
+ GroundCallback = p;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
vector <string> FGFDMExec::EnumerateFDMs(void)
{
vector <string> FDMList;
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-bool FGFDMExec::LoadModel(string AircraftPath, string EnginePath, string model) {
- FGFDMExec::AircraftPath=AircraftPath;
- FGFDMExec::EnginePath=EnginePath;
- return LoadModel(model);
-}
+bool FGFDMExec::LoadModel(string AircraftPath, string EnginePath, string model,
+ bool addModelToPath)
+{
+
+ FGFDMExec::AircraftPath = AircraftPath;
+ FGFDMExec::EnginePath = EnginePath;
+
+ return LoadModel(model, addModelToPath);
+}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-bool FGFDMExec::LoadModel(string model)
+
+bool FGFDMExec::LoadModel(string model, bool addModelToPath)
{
+
bool result = true;
string token;
string aircraftCfgFileName;
cerr << "aircraft and engine paths" << endl;
return false;
}
-
+
+ aircraftCfgFileName = AircraftPath;
# ifndef macintosh
- aircraftCfgFileName = AircraftPath + "/" + model + "/" + model + ".xml";
+ if (addModelToPath) aircraftCfgFileName += "/" + model;
+ aircraftCfgFileName += "/" + model + ".xml";
# else
- aircraftCfgFileName = AircraftPath + ";" + model + ";" + model + ".xml";
+ if (addModelToPath) aircraftCfgFileName += ";" + model;
+ aircraftCfgFileName += ";" + model + ".xml";
# endif
FGConfigFile AC_cfg(aircraftCfgFileName);
if (!AC_cfg.IsOpen()) return false;
-
+
modelName = model;
-
+
if (modelLoaded) {
DeAllocate();
Allocate();
scratch = AC_cfg->GetValue("VERSION").c_str();
CFGVersion = AC_cfg->GetValue("VERSION");
+ Release = AC_cfg->GetValue("RELEASE");
if (debug_lvl > 0)
cout << " Version: " << highint << CFGVersion
return false;
}
+ if (Release == "ALPHA" && debug_lvl > 0) {
+#ifndef _MSC_VER
+ system("banner ALPHA");
+#endif
+ cout << endl << endl
+ << highint << "This aircraft model is an " << fgred << Release
+ << reset << highint << " release!!!" << endl << endl << reset
+ << "This aircraft model may not even properly load, and probably"
+ << " will not fly as expected." << endl << endl
+ << fgred << highint << "Use this model for development purposes ONLY!!!"
+ << normint << reset << endl << endl;
+ } else if (Release == "BETA" && debug_lvl > 0) {
+#ifndef _MSC_VER
+ system("banner BETA");
+#endif
+ cout << endl << endl
+ << highint << "This aircraft model is a " << fgred << Release
+ << reset << highint << " release!!!" << endl << endl << reset
+ << "This aircraft model probably will not fly as expected." << endl << endl
+ << fgblue << highint << "Use this model for development purposes ONLY!!!"
+ << normint << reset << endl << endl;
+ }
+
return true;
}
string AircraftName = AC_cfg->GetValue("FILE");
debug_lvl = 0; // turn off debug output for slave vehicle
-
+
SlaveFDMList.back()->exec->SetAircraftPath( AircraftPath );
SlaveFDMList.back()->exec->SetEnginePath( EnginePath );
SlaveFDMList.back()->exec->LoadModel(AircraftName);
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-FGPropertyManager* FGFDMExec::GetPropertyManager(void) {
+FGPropertyManager* FGFDMExec::GetPropertyManager(void) {
return instance;
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-FGTrim* FGFDMExec::GetTrim(void) {
+FGTrim* FGFDMExec::GetTrim(void) {
delete Trim;
Trim = new FGTrim(this,tNone);
return Trim;
}
-
+
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// The bitmasked value choices are as follows:
// unset: In this case (the default) JSBSim would only print
}
}
}
+}