%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGExternalReactions.h"
+#include "input_output/FGXMLElement.h"
+#include <iostream>
#include <string>
+using namespace std;
+
namespace JSBSim {
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
GLOBAL DATA
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-static const char *IdSrc = "$Id$";
+static const char *IdSrc = "$Id: FGExternalReactions.cpp,v 1.12 2011/07/20 12:16:34 jberndt Exp $";
static const char *IdHdr = ID_EXTERNALREACTIONS;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FGExternalReactions::FGExternalReactions(FGFDMExec* fdmex) : FGModel(fdmex)
{
NoneDefined = true;
+
Debug(0);
}
bool FGExternalReactions::Load(Element* el)
{
- Debug(2);
-
- // Interface properties are all stored in the interface properties array.
- // ToDo: Interface properties should not be created if they already exist.
- // A check should be done prior to creation. This ought to make it easier
- // to work with FlightGear, where some properties used in definitions may
- // already have been created, but would not be seen when JSBSim is run
- // in standalone mode.
-
- Element* property_element;
- property_element = el->FindElement("property");
- while (property_element) {
- double value=0.0;
- if ( ! property_element->GetAttributeValue("value").empty())
- value = property_element->GetAttributeValueAsNumber("value");
- interface_properties.push_back(new double(value));
- string interface_property_string = property_element->GetDataLine();
- PropertyManager->Tie(interface_property_string, interface_properties.back());
- property_element = el->FindNextElement("property");
+ // check if a file attribute was specified
+ string fname = el->GetAttributeValue("file");
+ if (!fname.empty()) {
+ string file = FDMExec->GetFullAircraftPath() + "/" + fname;
+ el = LoadXMLDocument(file);
+ if (el == 0L) return false;
}
+ FGModel::Load(el); // Call the base class Load() function to load interface properties.
+
+ Debug(2);
+
// Parse force elements
int index=0;
force_element = el->FindNextElement("force");
}
+ PostLoad(el, PropertyManager);
+
+ if (!NoneDefined) bind();
+
return true;
}
{
for (unsigned int i=0; i<Forces.size(); i++) delete Forces[i];
Forces.clear();
- for (unsigned int i=0; i<interface_properties.size(); i++) delete interface_properties[i];
- interface_properties.clear();
+
Debug(1);
}
bool FGExternalReactions::InitModel(void)
{
- if (!FGModel::InitModel()) return false;
-
return true;
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-bool FGExternalReactions::Run()
+bool FGExternalReactions::Run(bool Holding)
{
- if (FGModel::Run()) return true;
- if (FDMExec->Holding()) return false; // if paused don't execute
+ if (FGModel::Run(Holding)) return true;
+ if (Holding) return false; // if paused don't execute
if (NoneDefined) return true;
+ RunPreFunctions();
+
vTotalForces.InitMatrix();
vTotalMoments.InitMatrix();
vTotalMoments += Forces[i]->GetMoments();
}
+ RunPostFunctions();
+
return false;
}
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+void FGExternalReactions::bind(void)
+{
+ typedef double (FGExternalReactions::*PMF)(int) const;
+ PropertyManager->Tie("moments/l-external-lbsft", this, eL, (PMF)&FGExternalReactions::GetMoments);
+ PropertyManager->Tie("moments/m-external-lbsft", this, eM, (PMF)&FGExternalReactions::GetMoments);
+ PropertyManager->Tie("moments/n-external-lbsft", this, eN, (PMF)&FGExternalReactions::GetMoments);
+ PropertyManager->Tie("forces/fbx-external-lbs", this, eX, (PMF)&FGExternalReactions::GetForces);
+ PropertyManager->Tie("forces/fby-external-lbs", this, eY, (PMF)&FGExternalReactions::GetForces);
+ PropertyManager->Tie("forces/fbz-external-lbs", this, eZ, (PMF)&FGExternalReactions::GetForces);
+}
+
+
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// The bitmasked value choices are as follows:
// unset: In this case (the default) JSBSim would only print