]> git.mxchange.org Git - flightgear.git/blob - src/AIModel/performancedb.cxx
Removed hardcoded performance data.
[flightgear.git] / src / AIModel / performancedb.cxx
1 #include <simgear/misc/sg_path.hxx>
2 #include <simgear/props/props.hxx>
3 #include <simgear/props/props_io.hxx>
4 #include <simgear/xml/easyxml.hxx>
5
6 #include <Main/globals.hxx>
7 #include <iostream>
8 #include <fstream>
9
10 #include "performancedb.hxx"
11
12 using std::string;
13 using std::cerr;
14
15 PerformanceDB::PerformanceDB()
16 {
17     SGPath dbpath( globals->get_fg_root() );
18     
19
20     dbpath.append( "/AI/Aircraft/" );
21     dbpath.append( "performancedb.xml"); 
22     load(dbpath);
23 }
24
25
26 PerformanceDB::~PerformanceDB()
27 {}
28
29 void PerformanceDB::registerPerformanceData(const std::string& id, PerformanceData* data) {
30     //TODO if key exists already replace data "inplace", i.e. copy to existing PerfData instance
31     // this updates all aircraft currently using the PerfData instance.
32     _db[id] = data;
33 }
34
35 void PerformanceDB::registerPerformanceData(const std::string& id, const std::string& filename) {
36     registerPerformanceData(id, new PerformanceData(filename));
37 }
38
39 PerformanceData* PerformanceDB::getDataFor(const std::string& id) {
40     if (_db.find(id) == _db.end()) // id not found -> return jet_transport data
41         return _db["jet_transport"];
42
43     return _db[id];
44 }
45
46 void PerformanceDB::load(SGPath filename) {
47     string name;
48     double acceleration;
49     double deceleration;
50     double climbRate;
51     double descentRate;
52     double vRotate;
53     double vTakeOff;
54     double vClimb;
55     double vCruise;
56     double vDescent;
57     double vApproach;
58     double vTouchdown;
59     double vTaxi;
60     SGPropertyNode root;
61     try {
62         readProperties(filename.str(), &root);
63     } catch (const sg_exception &e) {
64         SG_LOG(SG_GENERAL, SG_ALERT,
65             "Error reading AI aircraft performance database: " << filename.str());
66         return;
67     }
68
69     SGPropertyNode * node = root.getNode("performancedb");
70     for (int i = 0; i < node->nChildren(); i++) { 
71         SGPropertyNode * db_node = node->getChild(i);
72             name         = db_node->getStringValue("type", "heavy_jet");
73             acceleration = db_node->getDoubleValue("acceleration-kts-hour", 4.0);
74             deceleration = db_node->getDoubleValue("deceleration-kts-hour", 2.0);
75             climbRate    = db_node->getDoubleValue("climbrate-fpm", 3000.0);
76             descentRate  = db_node->getDoubleValue("decentrate-fpm", 1500.0);
77             vRotate      = db_node->getDoubleValue("rotate-speed-kts", 150.0);
78             vTakeOff     = db_node->getDoubleValue("takeoff-speed-kts", 160.0);
79             vClimb       = db_node->getDoubleValue("climb-speed-kts", 300.0);
80             vCruise      = db_node->getDoubleValue("cruise-speed-kts", 430.0);
81             vDescent     = db_node->getDoubleValue("decent-speed-kts", 300.0);
82             vApproach    = db_node->getDoubleValue("approach-speed-kts", 170.0);
83             vTouchdown   = db_node->getDoubleValue("touchdown-speed-kts", 150.0);
84             vTaxi        = db_node->getDoubleValue("taxi-speed-kts", 15.0);
85
86             registerPerformanceData(name, new PerformanceData(
87                 acceleration, deceleration, climbRate, descentRate, vRotate, vTakeOff, vClimb, vCruise, vDescent, vApproach, vTouchdown, vTaxi));
88     }
89 }
90