7#include <simgear/sg_inlines.h>
8#include <simgear/misc/sg_path.hxx>
9#include <simgear/props/props.hxx>
10#include <simgear/props/props_io.hxx>
11#include <simgear/structure/exception.hxx>
23 SGPath dbpath(
globals->get_fg_root() );
24 dbpath.append(
"/AI/Aircraft/" );
25 dbpath.append(
"performancedb.xml");
29 SG_LOG(SG_AI, SG_WARN,
"PerformanceDB: no default performance data found/loaded");
35 PerformanceDataDict::iterator it;
36 for (it = _db.begin(); it != _db.end(); ++it) {
50void PerformanceDB::registerPerformanceData(
const std::string&
id,
PerformanceData* data) {
59 PerformanceDataDict::const_iterator it;
60 it = _db.find(acType);
61 if (it != _db.end()) {
65 const string& alias = findAlias(acType);
67 if (it != _db.end()) {
71 it = _db.find(acClass);
72 if (it == _db.end()) {
81 PerformanceDataDict::const_iterator it = _db.find(
"jet_transport");
90 PerformanceDataDict::const_iterator it = _db.find(acType);
94 const std::string alias(findAlias(acType));
95 return (_db.find(alias) != _db.end());
98void PerformanceDB::load(
const SGPath& filename)
102 readProperties(filename, &root);
103 }
catch (
const sg_exception &) {
104 SG_LOG(SG_AI, SG_ALERT,
105 "Error reading AI aircraft performance database: " << filename);
109 SGPropertyNode * node = root.getNode(
"performancedb");
110 for (
int i = 0;
i < node->nChildren();
i++) {
111 SGPropertyNode * db_node = node->getChild(
i);
112 if (db_node->getNameString() ==
"aircraft") {
113 PerformanceData* data = NULL;
114 if (db_node->hasChild(
"base")) {
115 std::string baseName = db_node->getStringValue(
"base");
116 PerformanceData* baseData = _db[baseName];
118 SG_LOG(SG_AI, SG_ALERT,
119 "Error reading AI aircraft performance database: unknown base type " << baseName);
124 data =
new PerformanceData(baseData);
126 data =
new PerformanceData;
130 std::string
name = db_node->getStringValue(
"type",
"heavy_jet");
131 registerPerformanceData(
name, data);
132 }
else if (db_node->getNameString() ==
"alias") {
133 std::string alias = db_node->getStringValue(
"alias");
135 SG_LOG(SG_AI, SG_ALERT,
"performance DB alias entry with no <alias> definition");
139 for (
auto matchNode : db_node->getChildren(
"match")) {
140 std::string match = matchNode->getStringValue();
141 _aliases.push_back(StringPair(match, alias));
144 SG_LOG(SG_AI, SG_ALERT,
"unrecognized performance DB entry:" << db_node->getNameString());
149const string& PerformanceDB::findAlias(
const string& acType)
const
151 for (
const auto& alias : _aliases) {
152 if (acType.find(alias.first) == 0) {
157 static const string empty;
164 SGSubsystemMgr::POST_FDM);