X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FInstrumentation%2Fdme.cxx;h=485412a122ebcf32290cbb5d07904a707986584f;hb=5c101b8021a14ac1e5d60b77b76140b1365460dc;hp=d474e976dc6d8132c8429ebc0aa35d348a70fe3e;hpb=2caa017a79761637f04375eaa7642a5d3483f66d;p=flightgear.git diff --git a/src/Instrumentation/dme.cxx b/src/Instrumentation/dme.cxx index d474e976d..485412a12 100644 --- a/src/Instrumentation/dme.cxx +++ b/src/Instrumentation/dme.cxx @@ -3,12 +3,15 @@ // // This file is in the Public Domain and comes with no warranty. +#ifdef HAVE_CONFIG_H +# include +#endif + #include #include #include #include
-#include #include #include "dme.hxx" @@ -37,13 +40,43 @@ adjust_range (double transmitter_elevation_ft, double aircraft_altitude_ft, } +DME::DME ( SGPropertyNode *node ) + : _last_distance_nm(0), + _last_frequency_mhz(-1), + _time_before_search_sec(0), + _transmitter_valid(false), + _transmitter_elevation_ft(0), + _transmitter_range_nm(0), + _transmitter_bias(0.0), + name("dme"), + num(0) +{ + int i; + for ( i = 0; i < node->nChildren(); ++i ) { + SGPropertyNode *child = node->getChild(i); + string cname = child->getName(); + string cval = child->getStringValue(); + if ( cname == "name" ) { + name = cval; + } else if ( cname == "number" ) { + num = child->getIntValue(); + } else { + SG_LOG( SG_INSTR, SG_WARN, "Error in dme config logic" ); + if ( name.length() ) { + SG_LOG( SG_INSTR, SG_WARN, "Section = " << name ); + } + } + } +} + DME::DME () : _last_distance_nm(0), _last_frequency_mhz(-1), _time_before_search_sec(0), _transmitter_valid(false), _transmitter_elevation_ft(0), - _transmitter_range_nm(0) + _transmitter_range_nm(0), + _transmitter_bias(0.0) { } @@ -54,22 +87,23 @@ DME::~DME () void DME::init () { + string branch; + branch = "/instrumentation/" + name; + + SGPropertyNode *node = fgGetNode(branch.c_str(), num, true ); + _longitude_node = fgGetNode("/position/longitude-deg", true); _latitude_node = fgGetNode("/position/latitude-deg", true); _altitude_node = fgGetNode("/position/altitude-ft", true); - _serviceable_node = fgGetNode("/instrumentation/dme/serviceable", true); + _serviceable_node = node->getChild("serviceable", 0, true); _electrical_node = fgGetNode("/systems/electrical/outputs/dme", true); - _source_node = fgGetNode("/instrumentation/dme/frequencies/source", true); - _frequency_node = - fgGetNode("/instrumentation/dme/frequencies/selected-mhz", true); - - _in_range_node = fgGetNode("/instrumentation/dme/in-range", true); - _distance_node = - fgGetNode("/instrumentation/dme/indicated-distance-nm", true); - _speed_node = - fgGetNode("/instrumentation/dme/indicated-ground-speed-kt", true); - _time_node = - fgGetNode("/instrumentation/dme/indicated-time-min", true); + SGPropertyNode *fnode = node->getChild("frequencies", 0, true); + _source_node = fnode->getChild("source", 0, true); + _frequency_node = fnode->getChild("selected-mhz", 0, true); + _in_range_node = node->getChild("in-range", 0, true); + _distance_node = node->getChild("indicated-distance-nm", 0, true); + _speed_node = node->getChild("indicated-ground-speed-kt", 0, true); + _time_node = node->getChild("indicated-time-min", 0, true); } void @@ -78,11 +112,13 @@ DME::update (double delta_time_sec) // Figure out the source const char * source = _source_node->getStringValue(); if (source[0] == '\0') { - source = "/instrumentation/dme/frequencies/selected-mhz"; - _source_node->setStringValue(source); + string branch; + branch = "/instrumentation/" + name + "/frequencies/selected-mhz"; + _source_node->setStringValue(branch.c_str()); + source = _source_node->getStringValue(); } - // Get the frequency + double frequency_mhz = fgGetDouble(source, 108.0); if (frequency_mhz != _last_frequency_mhz) { _time_before_search_sec = 0; @@ -116,19 +152,26 @@ DME::update (double delta_time_sec) } // Calculate the distance to the transmitter - Point3D location = - sgGeodToCart(Point3D(longitude_rad, latitude_rad, altitude_m)); - double distance_nm = _transmitter.distance3D(location) * SG_METER_TO_NM; + SGGeod geod = SGGeod::fromRadM(longitude_rad, latitude_rad, altitude_m); + SGVec3d location = SGVec3d::fromGeod(geod); + + double distance_nm = dist(_transmitter, location) * SG_METER_TO_NM; + double range_nm = adjust_range(_transmitter_elevation_ft, altitude_m * SG_METER_TO_FEET, _transmitter_range_nm); + if (distance_nm <= range_nm) { double speed_kt = (fabs(distance_nm - _last_distance_nm) * ((1 / delta_time_sec) * 3600.0)); _last_distance_nm = distance_nm; _in_range_node->setBoolValue(true); - _distance_node->setDoubleValue(distance_nm); + double tmp_dist = distance_nm - _transmitter_bias; + if ( tmp_dist < 0.0 ) { + tmp_dist = 0.0; + } + _distance_node->setDoubleValue( tmp_dist ); _speed_node->setDoubleValue(speed_kt); _time_node->setDoubleValue(distance_nm/speed_kt*60.0); @@ -145,40 +188,22 @@ void DME::search (double frequency_mhz, double longitude_rad, double latitude_rad, double altitude_m) { - // reset search time + // reset search time _time_before_search_sec = 1.0; - // try the ILS list first - FGILS * ils = current_ilslist->findByFreq(frequency_mhz, - longitude_rad, - latitude_rad, - altitude_m); - if (ils !=0 && ils->get_has_dme()) { - _transmitter_valid = true; - _transmitter = Point3D(ils->get_dme_x(), - ils->get_dme_y(), - ils->get_dme_z()); - _transmitter_elevation_ft = ils->get_gselev() * SG_METER_TO_FEET; - _transmitter_range_nm = 50; // arbitrary - return; - } + // try the ILS list first + FGNavRecord *dme + = globals->get_dmelist()->findByFreq( frequency_mhz, longitude_rad, + latitude_rad, altitude_m); - // try the VORs next - FGNav * nav = current_navlist->findByFreq(frequency_mhz, - longitude_rad, - latitude_rad, - altitude_m); - if (nav != 0 && nav->get_has_dme()) { - _transmitter_valid = true; - _transmitter = Point3D(nav->get_x(), - nav->get_y(), - nav->get_z()); - _transmitter_elevation_ft = nav->get_elev_ft(); - _transmitter_range_nm = nav->get_range(); // fixme - return; - } + _transmitter_valid = (dme != NULL); - _transmitter_valid = false; + if ( _transmitter_valid ) { + _transmitter = dme->get_cart(); + _transmitter_elevation_ft = dme->get_elev_ft(); + _transmitter_range_nm = dme->get_range(); + _transmitter_bias = dme->get_multiuse(); + } } // end of dme.cxx