YASim parser: add support for metric and imperial attibutes, e.g. mass-lbs, mass-kg
This commit is contained in:
parent
cecdfd0832
commit
0f472efe9b
1 changed files with 80 additions and 25 deletions
|
@ -29,6 +29,7 @@ namespace yasim {
|
||||||
|
|
||||||
// Some conversion factors
|
// Some conversion factors
|
||||||
static const float KTS2MPS = 0.514444444444;
|
static const float KTS2MPS = 0.514444444444;
|
||||||
|
static const float KMH2MPS = 1/3.6;
|
||||||
static const float FT2M = 0.3048;
|
static const float FT2M = 0.3048;
|
||||||
static const float DEG2RAD = 0.0174532925199;
|
static const float DEG2RAD = 0.0174532925199;
|
||||||
static const float RPM2RAD = 0.10471975512;
|
static const float RPM2RAD = 0.10471975512;
|
||||||
|
@ -240,9 +241,17 @@ void FGFDM::startElement(const char* name, const XMLAttributes &atts)
|
||||||
XMLAttributes* a = (XMLAttributes*)&atts;
|
XMLAttributes* a = (XMLAttributes*)&atts;
|
||||||
float v[3];
|
float v[3];
|
||||||
char buf[64];
|
char buf[64];
|
||||||
|
float f = 0;
|
||||||
|
|
||||||
if(eq(name, "airplane")) {
|
if(eq(name, "airplane")) {
|
||||||
_airplane.setEmptyWeight(attrf(a, "mass") * LBS2KG);
|
if(a->hasAttribute("mass")) { f = attrf(a, "mass") * LBS2KG; }
|
||||||
|
else if (a->hasAttribute("mass-lbs")) { f = attrf(a, "mass-lbs") * LBS2KG; }
|
||||||
|
else if (a->hasAttribute("mass-kg")) { f = attrf(a, "mass-kg"); }
|
||||||
|
else {
|
||||||
|
SG_LOG(SG_FLIGHT,SG_ALERT,"YASim fatal: missing attribute, airplane needs one of {mass-lbs, mass-kg}");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
_airplane.setEmptyWeight(f);
|
||||||
if(a->hasAttribute("version")) {
|
if(a->hasAttribute("version")) {
|
||||||
_airplane.setVersion( a->getValue("version") );
|
_airplane.setVersion( a->getValue("version") );
|
||||||
}
|
}
|
||||||
|
@ -250,22 +259,46 @@ void FGFDM::startElement(const char* name, const XMLAttributes &atts)
|
||||||
SG_LOG(SG_FLIGHT, SG_DEV_ALERT, "This aircraft does not use the latest yasim configuration version.");
|
SG_LOG(SG_FLIGHT, SG_DEV_ALERT, "This aircraft does not use the latest yasim configuration version.");
|
||||||
}
|
}
|
||||||
} else if(eq(name, "approach")) {
|
} else if(eq(name, "approach")) {
|
||||||
float spd = attrf(a, "speed") * KTS2MPS;
|
float spd, alt = 0;
|
||||||
float alt = attrf(a, "alt", 0) * FT2M;
|
if (a->hasAttribute("speed")) { spd = attrf(a, "speed") * KTS2MPS; }
|
||||||
|
else if (a->hasAttribute("speed-kt")) { spd = attrf(a, "speed-kt") * KTS2MPS; }
|
||||||
|
else if (a->hasAttribute("speed-kmh")) { spd = attrf(a, "speed-kmh") * KMH2MPS; }
|
||||||
|
else {
|
||||||
|
SG_LOG(SG_FLIGHT,SG_ALERT,"YASim fatal: missing attribute, approach needs one of {speed-kt, speed-kmh}");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (a->hasAttribute("alt")) { alt = attrf(a, "alt") * FT2M; }
|
||||||
|
else if (a->hasAttribute("alt-ft")) { alt = attrf(a, "alt-ft") * FT2M; }
|
||||||
|
else if (a->hasAttribute("alt-m")) { alt = attrf(a, "alt-m"); }
|
||||||
float aoa = attrf(a, "aoa", 0) * DEG2RAD;
|
float aoa = attrf(a, "aoa", 0) * DEG2RAD;
|
||||||
float gla = attrf(a, "glide-angle", 0) * DEG2RAD;
|
float gla = attrf(a, "glide-angle", 0) * DEG2RAD;
|
||||||
_airplane.setApproach(spd, alt, aoa, attrf(a, "fuel", 0.2), gla);
|
_airplane.setApproach(spd, alt, aoa, attrf(a, "fuel", 0.2), gla);
|
||||||
_cruiseCurr = false;
|
_cruiseCurr = false;
|
||||||
} else if(eq(name, "cruise")) {
|
} else if(eq(name, "cruise")) {
|
||||||
float spd = attrf(a, "speed") * KTS2MPS;
|
float spd, alt = 0;
|
||||||
float alt = attrf(a, "alt") * FT2M;
|
if (a->hasAttribute("speed")) { spd = attrf(a, "speed") * KTS2MPS; }
|
||||||
|
else if (a->hasAttribute("speed-kt")) { spd = attrf(a, "speed-kt") * KTS2MPS; }
|
||||||
|
else if (a->hasAttribute("speed-kmh")) { spd = attrf(a, "speed-kmh") * KMH2MPS; }
|
||||||
|
else {
|
||||||
|
SG_LOG(SG_FLIGHT,SG_ALERT,"YASim fatal: missing attribute, approach needs one of {speed-kt, speed-kmh}");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (a->hasAttribute("alt")) { alt = attrf(a, "alt") * FT2M; }
|
||||||
|
else if (a->hasAttribute("alt-ft")) { alt = attrf(a, "alt-ft") * FT2M; }
|
||||||
|
else if (a->hasAttribute("alt-m")) { alt = attrf(a, "alt-m"); }
|
||||||
float gla = attrf(a, "glide-angle", 0) * DEG2RAD;
|
float gla = attrf(a, "glide-angle", 0) * DEG2RAD;
|
||||||
_airplane.setCruise(spd, alt, attrf(a, "fuel", 0.5),gla);
|
_airplane.setCruise(spd, alt, attrf(a, "fuel", 0.5),gla);
|
||||||
_cruiseCurr = true;
|
_cruiseCurr = true;
|
||||||
} else if(eq(name, "solve-weight")) {
|
} else if(eq(name, "solve-weight")) {
|
||||||
int idx = attri(a, "idx");
|
int idx = attri(a, "idx");
|
||||||
float wgt = attrf(a, "weight") * LBS2KG;
|
if(a->hasAttribute("weight")) { f = attrf(a, "weight") * LBS2KG; }
|
||||||
_airplane.addSolutionWeight(!_cruiseCurr, idx, wgt);
|
else if(a->hasAttribute("weight-lbs")) { f = attrf(a, "weight-lbs") * LBS2KG; }
|
||||||
|
else if(a->hasAttribute("weight-kg")) { f = attrf(a, "weight-kg"); }
|
||||||
|
else {
|
||||||
|
SG_LOG(SG_FLIGHT,SG_ALERT,"YASim fatal: missing attribute, solve-weight needs one of {weight-lbs, weight-kg}");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
_airplane.addSolutionWeight(!_cruiseCurr, idx, f);
|
||||||
} else if(eq(name, "cockpit")) {
|
} else if(eq(name, "cockpit")) {
|
||||||
v[0] = attrf(a, "x");
|
v[0] = attrf(a, "x");
|
||||||
v[1] = attrf(a, "y");
|
v[1] = attrf(a, "y");
|
||||||
|
@ -315,7 +348,14 @@ void FGFDM::startElement(const char* name, const XMLAttributes &atts)
|
||||||
v[0] = attrf(a, "x");
|
v[0] = attrf(a, "x");
|
||||||
v[1] = attrf(a, "y");
|
v[1] = attrf(a, "y");
|
||||||
v[2] = attrf(a, "z");
|
v[2] = attrf(a, "z");
|
||||||
float mass = attrf(a, "mass") * LBS2KG;
|
float mass;
|
||||||
|
if(a->hasAttribute("mass")) { mass = attrf(a, "mass") * LBS2KG; }
|
||||||
|
else if(a->hasAttribute("mass-lbs")) { mass = attrf(a, "mass-lbs") * LBS2KG; }
|
||||||
|
else if(a->hasAttribute("mass-kg")) { mass = attrf(a, "mass-kg"); }
|
||||||
|
else {
|
||||||
|
SG_LOG(SG_FLIGHT,SG_ALERT,"YASim fatal: missing attribute, jet needs one of {mass-lbs, mass-kg}");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
j->setMaxThrust(attrf(a, "thrust") * LBS2N,
|
j->setMaxThrust(attrf(a, "thrust") * LBS2N,
|
||||||
attrf(a, "afterburner", 0) * LBS2N);
|
attrf(a, "afterburner", 0) * LBS2N);
|
||||||
j->setVectorAngle(attrf(a, "rotate", 0) * DEG2RAD);
|
j->setVectorAngle(attrf(a, "rotate", 0) * DEG2RAD);
|
||||||
|
@ -483,12 +523,27 @@ void FGFDM::startElement(const char* name, const XMLAttributes &atts)
|
||||||
float density = 6.0; // gasoline, in lbs/gal
|
float density = 6.0; // gasoline, in lbs/gal
|
||||||
if(a->hasAttribute("jet")) density = 6.72;
|
if(a->hasAttribute("jet")) density = 6.72;
|
||||||
density *= LBS2KG*CM2GALS;
|
density *= LBS2KG*CM2GALS;
|
||||||
_airplane.addTank(v, attrf(a, "capacity") * LBS2KG, density);
|
float capacity = 0;
|
||||||
|
if(a->hasAttribute("capacity")) { capacity = attrf(a, "capacity") * LBS2KG; }
|
||||||
|
else if(a->hasAttribute("capacity-lbs")) { capacity = attrf(a, "capacity-lbs") * LBS2KG; }
|
||||||
|
else if(a->hasAttribute("capacity-kg")) { capacity = attrf(a, "capacity-kg"); }
|
||||||
|
else {
|
||||||
|
SG_LOG(SG_FLIGHT,SG_ALERT,"YASim fatal: missing attribute, tank needs one of {capacity-lbs, capacity-kg}");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
_airplane.addTank(v, capacity, density);
|
||||||
} else if(eq(name, "ballast")) {
|
} else if(eq(name, "ballast")) {
|
||||||
v[0] = attrf(a, "x");
|
v[0] = attrf(a, "x");
|
||||||
v[1] = attrf(a, "y");
|
v[1] = attrf(a, "y");
|
||||||
v[2] = attrf(a, "z");
|
v[2] = attrf(a, "z");
|
||||||
_airplane.addBallast(v, attrf(a, "mass") * LBS2KG);
|
if(a->hasAttribute("mass")) { f = attrf(a, "mass") * LBS2KG; }
|
||||||
|
else if (a->hasAttribute("mass-lbs")) { f = attrf(a, "mass-lbs") * LBS2KG; }
|
||||||
|
else if (a->hasAttribute("mass-kg")) { f = attrf(a, "mass-kg"); }
|
||||||
|
else {
|
||||||
|
SG_LOG(SG_FLIGHT,SG_ALERT,"YASim fatal: missing attribute, airplane needs one of {mass-lbs, mass-kg}");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
_airplane.addBallast(v, f);
|
||||||
} else if(eq(name, "weight")) {
|
} else if(eq(name, "weight")) {
|
||||||
parseWeight(a);
|
parseWeight(a);
|
||||||
} else if(eq(name, "stall")) {
|
} else if(eq(name, "stall")) {
|
||||||
|
|
Loading…
Reference in a new issue