]> git.mxchange.org Git - flightgear.git/commitdiff
PerformanceDB improvements.
authorJames Turner <zakalawe@mac.com>
Mon, 29 Oct 2012 10:01:52 +0000 (10:01 +0000)
committerJames Turner <zakalawe@mac.com>
Mon, 29 Oct 2012 10:01:52 +0000 (10:01 +0000)
Support cascading (inheriting) performance data, so common values don't need to be repeated.

src/AIModel/performancedata.cxx
src/AIModel/performancedata.hxx
src/AIModel/performancedb.cxx

index f8da70de615ac9c2566fa46b1bfeb0b84c2aead6..8e5dfa9f317a354ef3703534a1578cd811502db4 100644 (file)
@@ -4,8 +4,9 @@
 #endif
 
 #include "performancedata.hxx"
-#include "AIAircraft.hxx"
 
+#include <simgear/props/props.hxx>
+#include "AIAircraft.hxx"
 
 // For now, make this a define
 // Later on, additional class variables can simulate settings such as braking power
 // to the AIAircraft.
 #define BRAKE_SETTING 1.6
 
-PerformanceData::PerformanceData(double acceleration,
-                                double deceleration,
-                                double climbRate,
-                                double descentRate,
-                                double vRotate,
-                                double vTakeOff,
-                                double vClimb,
-                                double vCruise,
-                                double vDescent,
-                                double vApproach,
-                                double vTouchdown,
-                                double vTaxi) :
-    _acceleration(acceleration),
-    _deceleration(deceleration),
-    _climbRate(climbRate),
-    _descentRate(descentRate),
-    _vRotate(vRotate),
-    _vTakeOff(vTakeOff),
-    _vClimb(vClimb),
-    _vCruise(vCruise),
-    _vDescent(vDescent),
-    _vApproach(vApproach),
-    _vTouchdown(vTouchdown),
-    _vTaxi(vTaxi)
+PerformanceData::PerformanceData() :
+  _acceleration(4.0),
+  _deceleration(2.0),
+  _climbRate(3000.0),
+  _descentRate(1500.0),
+  _vRotate(150.0),
+  _vTakeOff(160.0),
+  _vClimb(300.0),
+  _vCruise(430.0),
+  _vDescent(300.0),
+  _vApproach(170.0),
+  _vTouchdown(150.0),
+  _vTaxi(15.0)
 {
-    _rollrate = 9.0; // degrees per second
-    _maxbank = 30.0; // passenger friendly bank angle
+  _rollrate = 9.0; // degrees per second
+  _maxbank = 30.0; // passenger friendly bank angle
+
 }
 
-// read perf data from file
-PerformanceData::PerformanceData( const std::string& filename)
-{}
+PerformanceData::PerformanceData(PerformanceData* clone) :
+  _acceleration(clone->_acceleration),
+  _deceleration(clone->_deceleration),
+  _climbRate(clone->_climbRate),
+  _descentRate(clone->_descentRate),
+  _vRotate(clone->_vRotate),
+  _vTakeOff(clone->_vTakeOff),
+  _vClimb(clone->_vClimb),
+  _vCruise(clone->_vCruise),
+  _vDescent(clone->_vDescent),
+  _vApproach(clone->_vApproach),
+  _vTouchdown(clone->_vTouchdown),
+  _vTaxi(clone->_vTaxi)
+{
+  _rollrate = clone->_rollrate;
+  _maxbank = clone->_maxbank;
+}
 
 PerformanceData::~PerformanceData()
 {}
 
+void PerformanceData::initFromProps(SGPropertyNode *db_node)
+{
+// read the values, using the existing values as defaults
+  _acceleration = db_node->getDoubleValue("acceleration-kts-hour", _acceleration);
+  _deceleration = db_node->getDoubleValue("deceleration-kts-hour", _deceleration);
+  _climbRate    = db_node->getDoubleValue("climbrate-fpm", _climbRate);
+  _descentRate  = db_node->getDoubleValue("decentrate-fpm", _descentRate);
+  _vRotate      = db_node->getDoubleValue("rotate-speed-kts", _vRotate);
+  _vTakeOff     = db_node->getDoubleValue("takeoff-speed-kts", _vTakeOff);
+  _vClimb       = db_node->getDoubleValue("climb-speed-kts", _vClimb);
+  _vCruise      = db_node->getDoubleValue("cruise-speed-kts", _vCruise);
+  _vDescent     = db_node->getDoubleValue("decent-speed-kts", _vDescent);
+  _vApproach    = db_node->getDoubleValue("approach-speed-kts", _vApproach);
+  _vTouchdown   = db_node->getDoubleValue("touchdown-speed-kts", _vTouchdown);
+  _vTaxi        = db_node->getDoubleValue("taxi-speed-kts", _vTaxi);
+}
+
 double PerformanceData::actualSpeed(FGAIAircraft* ac, double tgt_speed, double dt, bool maxBrakes) {
     // if (tgt_speed > _vTaxi & ac->onGround()) // maximum taxi speed on ground
     //    tgt_speed = _vTaxi;
index 41b89ca7ced8599a2f8ae0ee717bb4ecfd18b9d4..fd6deb53d6aea2e542cc2e01202a3a18ca1ba3c8 100644 (file)
@@ -5,6 +5,7 @@
 #include <map>
 
 class FGAIAircraft;
+class SGPropertyNode;
 
 /**
 Data storage for aircraft performance data. This is used to properly simulate the flight of AIAircrafts.
@@ -14,19 +15,12 @@ Data storage for aircraft performance data. This is used to properly simulate th
 class PerformanceData
 {
 public:
-    PerformanceData(double acceleration,
-                    double deceleration,
-                    double climbRate,
-                    double descentRate,
-                    double vRotate,
-                    double vTakeOff,
-                    double vClimb,
-                    double vCruise,
-                    double vDescent,
-                    double vApproach,
-                    double vTouchdown,
-                    double vTaxi);
-    PerformanceData(const std::string& filename);
+    PerformanceData();
+    
+    PerformanceData(PerformanceData* clone);
+  
+    void initFromProps(SGPropertyNode* props);
+  
     ~PerformanceData();
 
     double actualSpeed(FGAIAircraft* ac, double tgt_speed, double dt, bool needMaxBrake);
index f218e851dab340f809f3b7d4f382009c47d7f01d..a5230a59a1f3d7a196bed6ba88720a0b1f4be053 100644 (file)
@@ -40,10 +40,6 @@ void PerformanceDB::registerPerformanceData(const std::string& id, PerformanceDa
     _db[id] = data;
 }
 
-void PerformanceDB::registerPerformanceData(const std::string& id, const std::string& filename) {
-    registerPerformanceData(id, new PerformanceData(filename));
-}
-
 PerformanceData* PerformanceDB::getDataFor(const string& acType, const string& acClass)
 {
   // first, try with the specific aircraft type, such as 738 or A322
@@ -65,20 +61,8 @@ PerformanceData* PerformanceDB::getDataFor(const string& acType, const string& a
     return _db[acClass];
 }
 
-void PerformanceDB::load(const SGPath& filename) {
-    string name;
-    double acceleration;
-    double deceleration;
-    double climbRate;
-    double descentRate;
-    double vRotate;
-    double vTakeOff;
-    double vClimb;
-    double vCruise;
-    double vDescent;
-    double vApproach;
-    double vTouchdown;
-    double vTaxi;
+void PerformanceDB::load(const SGPath& filename)
+{
     SGPropertyNode root;
     try {
         readProperties(filename.str(), &root);
@@ -92,22 +76,25 @@ void PerformanceDB::load(const SGPath& filename) {
     for (int i = 0; i < node->nChildren(); i++) {
         SGPropertyNode * db_node = node->getChild(i);
         if (!strcmp(db_node->getName(), "aircraft")) {
-            name         = db_node->getStringValue("type", "heavy_jet");
-            acceleration = db_node->getDoubleValue("acceleration-kts-hour", 4.0);
-            deceleration = db_node->getDoubleValue("deceleration-kts-hour", 2.0);
-            climbRate    = db_node->getDoubleValue("climbrate-fpm", 3000.0);
-            descentRate  = db_node->getDoubleValue("decentrate-fpm", 1500.0);
-            vRotate      = db_node->getDoubleValue("rotate-speed-kts", 150.0);
-            vTakeOff     = db_node->getDoubleValue("takeoff-speed-kts", 160.0);
-            vClimb       = db_node->getDoubleValue("climb-speed-kts", 300.0);
-            vCruise      = db_node->getDoubleValue("cruise-speed-kts", 430.0);
-            vDescent     = db_node->getDoubleValue("decent-speed-kts", 300.0);
-            vApproach    = db_node->getDoubleValue("approach-speed-kts", 170.0);
-            vTouchdown   = db_node->getDoubleValue("touchdown-speed-kts", 150.0);
-            vTaxi        = db_node->getDoubleValue("taxi-speed-kts", 15.0);
-
-            registerPerformanceData(name, new PerformanceData(
-                acceleration, deceleration, climbRate, descentRate, vRotate, vTakeOff, vClimb, vCruise, vDescent, vApproach, vTouchdown, vTaxi));
+            PerformanceData* data = NULL;
+            if (db_node->hasChild("base")) {
+              string baseName = db_node->getStringValue("base");
+              PerformanceData* baseData = _db[baseName];
+              if (!baseData) {
+                SG_LOG(SG_AI, SG_ALERT,
+                       "Error reading AI aircraft performance database: unknown base type " << baseName);
+                return;
+              }
+              
+              // clone base data to 'inherit' from it
+              data = new PerformanceData(baseData); 
+            } else {
+              data = new PerformanceData;
+            }
+          
+            data->initFromProps(db_node);
+            string name  = db_node->getStringValue("type", "heavy_jet");
+            registerPerformanceData(name, data);
         } else if (!strcmp(db_node->getName(), "alias")) {
             string alias(db_node->getStringValue("alias"));
             if (alias.empty()) {