From 7c8ad455a327276e09687b380fb4147ae90b6c8c Mon Sep 17 00:00:00 2001 From: James Turner Date: Mon, 29 Oct 2012 10:01:52 +0000 Subject: [PATCH] PerformanceDB improvements. Support cascading (inheriting) performance data, so common values don't need to be repeated. --- src/AIModel/performancedata.cxx | 82 +++++++++++++++++++++------------ src/AIModel/performancedata.hxx | 20 +++----- src/AIModel/performancedb.cxx | 55 +++++++++------------- 3 files changed, 80 insertions(+), 77 deletions(-) diff --git a/src/AIModel/performancedata.cxx b/src/AIModel/performancedata.cxx index f8da70de6..8e5dfa9f3 100644 --- a/src/AIModel/performancedata.cxx +++ b/src/AIModel/performancedata.cxx @@ -4,8 +4,9 @@ #endif #include "performancedata.hxx" -#include "AIAircraft.hxx" +#include +#include "AIAircraft.hxx" // For now, make this a define // Later on, additional class variables can simulate settings such as braking power @@ -13,42 +14,63 @@ // 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; diff --git a/src/AIModel/performancedata.hxx b/src/AIModel/performancedata.hxx index 41b89ca7c..fd6deb53d 100644 --- a/src/AIModel/performancedata.hxx +++ b/src/AIModel/performancedata.hxx @@ -5,6 +5,7 @@ #include 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); diff --git a/src/AIModel/performancedb.cxx b/src/AIModel/performancedb.cxx index f218e851d..a5230a59a 100644 --- a/src/AIModel/performancedb.cxx +++ b/src/AIModel/performancedb.cxx @@ -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()) { -- 2.39.5