+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
#include <simgear/debug/logstream.hxx>
#include <simgear/math/sg_geodesy.hxx>
#include <simgear/misc/sg_path.hxx>
static const float INHG2PA = 3386.389;
static const float SLUG2KG = 14.59390;
-YASim::YASim(double dt)
+YASim::YASim(double dt) :
+ _simTime(0)
{
// set_delta_t(dt);
_fdm = new FGFDM();
_fdm->getAirplane()->getModel()->getIntegrator()->setInterval(_dt);
}
+YASim::~YASim()
+{
+ delete _fdm;
+}
+
void YASim::report()
{
Airplane* a = _fdm->getAirplane();
char buf[256];
for(int i=0; i<_fdm->getAirplane()->getModel()->numThrusters(); i++) {
- sprintf(buf, "/engines/engine[%d]/fuel-flow-gph", i); fgUntie(buf);
- sprintf(buf, "/engines/engine[%d]/rpm", i); fgUntie(buf);
- sprintf(buf, "/engines/engine[%d]/mp-osi", i); fgUntie(buf);
- sprintf(buf, "/engines/engine[%d]/egt-degf", i); fgUntie(buf);
+ sprintf(buf, "/engines/engine[%d]/fuel-flow-gph", i); fgUntie(buf);
+ sprintf(buf, "/engines/engine[%d]/rpm", i); fgUntie(buf);
+ sprintf(buf, "/engines/engine[%d]/mp-osi", i); fgUntie(buf);
+ sprintf(buf, "/engines/engine[%d]/egt-degf", i); fgUntie(buf);
+ sprintf(buf, "/engines/engine[%d]/oil-temperature-degf", i); fgUntie(buf);
}
}
SGPropertyNode * node = fgGetNode("gear/gear", i, true);
float pos[3];
g->getPosition(pos);
- node->setDoubleValue("xoffset-in", pos[0]);
- node->setDoubleValue("yoffset-in", pos[1]);
- node->setDoubleValue("zoffset-in", pos[2]);
+ node->setDoubleValue("xoffset-in", pos[0] * M2FT * 12);
+ node->setDoubleValue("yoffset-in", pos[1] * M2FT * 12);
+ node->setDoubleValue("zoffset-in", pos[2] * M2FT * 12);
}
// Are we at ground level? If so, lift the plane up so the gear
// ground. Calculate a cartesian coordinate for the ground under
// us, find the (geodetic) up vector normal to the ground, then
// use that to find the final (radius) term of the plane equation.
- float v[3] = { get_uBody()*FT2M, get_vBody()*FT2M, get_wBody()*FT2M };
+ float v[3] = { get_uBody(), get_vBody(), get_wBody() };
float lat = get_Latitude(); float lon = get_Longitude();
- double xyz[3];
- sgGeodToCart(lat, lon, 0.0, xyz);
+ float alt = get_Altitude() * FT2M; double xyz[3];
+ sgGeodToCart(lat, lon, alt, xyz);
// build the environment cache.
float vr = _fdm->getVehicleRadius();
- vr += 2.0*dt*Math::mag3(v);
- prepare_ground_cache_m( 0.0, xyz, vr );
+ vr += 2.0*FT2M*dt*Math::mag3(v);
+ prepare_ground_cache_m( _simTime, _simTime + dt, xyz, vr );
// Track time increments.
FGGround* gr
int i;
for(i=0; i<iterations; i++) {
- gr->setTimeOffset(iterations*_dt);
+ gr->setTimeOffset(_simTime + i*_dt);
copyToYASim(false);
_fdm->iterate(_dt);
copyFromYASim();
}
- // Reset the time increment.
- gr->setTimeOffset(0.0);
+ // Increment the local sim time
+ _simTime += dt;
+ gr->setTimeOffset(_simTime);
}
void YASim::copyToYASim(bool copyState)
{
// Physical state
- float lat = get_Latitude();
- float lon = get_Longitude();
+ double lat = get_Latitude();
+ double lon = get_Longitude();
float alt = get_Altitude() * FT2M;
float roll = get_Phi();
float pitch = get_Theta();
double lat, lon, alt;
sgCartToGeod(s->pos, &lat, &lon, &alt);
_set_Geodetic_Position(lat, lon, alt*M2FT);
+ double groundlevel_m = get_groundlevel_m(lat, lon, alt);
+ _set_Runway_altitude(groundlevel_m*SG_METER_TO_FEET);
+ _set_Altitude_AGL((alt-groundlevel_m)*SG_METER_TO_FEET);
+
+ // the smallest agl of all gears
+ fgSetFloat("/position/gear-agl-m", model->getAGL());
+ fgSetFloat("/position/gear-agl-ft", model->getAGL()*M2FT);
// UNUSED
//_set_Geocentric_Position(Glue::geod2geocLat(lat), lon, alt*M2FT);
- _set_Altitude_AGL(model->getAGL() * M2FT);
-
// useful conversion matrix
float xyz2ned[9];
Glue::xyz2nedMat(lat, lon, xyz2ned);
_set_V_rel_wind(Math::mag3(v)*M2FT); // units?
float P = fgGetDouble("/environment/pressure-inhg") * INHG2PA;
- float T = fgGetDouble("/environment/temperature-degC") + 273.15;
+ float T = fgGetDouble("/environment/temperature-degc") + 273.15;
float D = fgGetFloat("/environment/density-slugft3")
*SLUG2KG * M2FT*M2FT*M2FT;
_set_V_equiv_kts(Atmosphere::calcVEAS(v[0], P, T, D)*MPS2KTS);
// orientation
float alpha, beta;
- Glue::calcAlphaBeta(s, &alpha, &beta);
+ Glue::calcAlphaBeta(s, wind, &alpha, &beta);
_set_Alpha(alpha);
_set_Beta(beta);
node->setBoolValue("has-brake", g->getBrake() != 0);
node->setBoolValue("wow", g->getCompressFraction() != 0);
node->setFloatValue("compression-norm", g->getCompressFraction());
+ node->setFloatValue("compression-m", g->getCompressDist());
node->setFloatValue("caster-angle-deg", g->getCasterAngle() * RAD2DEG);
node->setFloatValue("rollspeed-ms", g->getRollSpeed());
+ node->setBoolValue("ground-is-solid", g->getGroundIsSolid()!=0);
+ node->setFloatValue("ground-friction-factor", g->getGroundFrictionFactor());
}
Hook* h = airplane->getHook();
if(l) {
SGPropertyNode * node = fgGetNode("gear/launchbar", 0, true);
node->setFloatValue("position-norm", l->getCompressFraction());
+ node->setFloatValue("holdback-position-norm", l->getHoldbackCompressFraction());
+ node->setStringValue("state", l->getState());
+ node->setBoolValue("strop", l->getStrop());
}
+
}