X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FFDM%2FYASim%2FYASim.cxx;h=70c7459d2fabba8d304638c191ac435c5ee3fa81;hb=d66903e9ad63b91182ccc25d9bb82f18f8dd98b6;hp=cd5e0dd6b464b56fa36aee572399726623bcffb9;hpb=7eb194b3f8bf4280c994fcea0edf177f6a92cff4;p=flightgear.git diff --git a/src/FDM/YASim/YASim.cxx b/src/FDM/YASim/YASim.cxx index cd5e0dd6b..70c7459d2 100644 --- a/src/FDM/YASim/YASim.cxx +++ b/src/FDM/YASim/YASim.cxx @@ -1,4 +1,8 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + #include #include #include @@ -24,8 +28,6 @@ #include "YASim.hxx" -#include // SIGFPE DEBUG - using namespace yasim; static const float YASIM_PI = 3.14159265358979323846; @@ -41,7 +43,8 @@ static const float W2HP = 1.3416e-3; 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(); @@ -52,6 +55,11 @@ YASim::YASim(double dt) _fdm->getAirplane()->getModel()->getIntegrator()->setInterval(_dt); } +YASim::~YASim() +{ + delete _fdm; +} + void YASim::report() { Airplane* a = _fdm->getAirplane(); @@ -93,10 +101,11 @@ void YASim::bind() 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); } } @@ -144,9 +153,9 @@ void YASim::init() 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 @@ -194,14 +203,14 @@ void YASim::update(double dt) // 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 @@ -209,21 +218,22 @@ void YASim::update(double dt) int i; for(i=0; isetTimeOffset(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(); @@ -368,12 +378,17 @@ void YASim::copyFromYASim() 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); @@ -403,7 +418,7 @@ void YASim::copyFromYASim() _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); @@ -433,7 +448,7 @@ void YASim::copyFromYASim() // orientation float alpha, beta; - Glue::calcAlphaBeta(s, &alpha, &beta); + Glue::calcAlphaBeta(s, wind, &alpha, &beta); _set_Alpha(alpha); _set_Beta(beta); @@ -461,8 +476,11 @@ void YASim::copyFromYASim() 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(); @@ -475,5 +493,9 @@ void YASim::copyFromYASim() 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()); } + }