X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FFDM%2FYASim%2FYASim.cxx;h=70c7459d2fabba8d304638c191ac435c5ee3fa81;hb=d66903e9ad63b91182ccc25d9bb82f18f8dd98b6;hp=9c260ce2b7e836e8fdb78da356f10fb8ba2504e4;hpb=807d2cc3ca8092c7bbcb310e614d0d27839eaeb8;p=flightgear.git diff --git a/src/FDM/YASim/YASim.cxx b/src/FDM/YASim/YASim.cxx index 9c260ce2b..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 @@ -39,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(); @@ -50,6 +55,11 @@ YASim::YASim(double dt) _fdm->getAirplane()->getModel()->getIntegrator()->setInterval(_dt); } +YASim::~YASim() +{ + delete _fdm; +} + void YASim::report() { Airplane* a = _fdm->getAirplane(); @@ -91,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); } } @@ -142,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 @@ -199,7 +210,7 @@ void YASim::update(double dt) // build the environment cache. float vr = _fdm->getVehicleRadius(); vr += 2.0*FT2M*dt*Math::mag3(v); - prepare_ground_cache_m( 0.0, xyz, vr ); + prepare_ground_cache_m( _simTime, _simTime + dt, xyz, vr ); // Track time increments. FGGround* gr @@ -207,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(); @@ -366,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); @@ -401,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); @@ -431,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); @@ -459,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(); @@ -473,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()); } + }