X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FInstrumentation%2Fdme.cxx;h=485412a122ebcf32290cbb5d07904a707986584f;hb=5c101b8021a14ac1e5d60b77b76140b1365460dc;hp=3b74e5e8acd530f2b64a50ed99d010d43d3cce29;hpb=d3f63543328ff242650d84aeb9454375945e6160;p=flightgear.git diff --git a/src/Instrumentation/dme.cxx b/src/Instrumentation/dme.cxx index 3b74e5e8a..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" @@ -30,18 +33,50 @@ adjust_range (double transmitter_elevation_ft, double aircraft_altitude_ft, double range_nm = 1.23 * sqrt(delta_elevation_ft); if (range_nm > max_range_nm) range_nm = max_range_nm; + else if (range_nm < 20.0) + range_nm = 20.0; double rand = sg_random(); return range_nm + (range_nm * rand * rand); } +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) { } @@ -52,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 @@ -76,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; @@ -114,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); @@ -143,48 +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; - } else { - _transmitter_valid = false; - 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() * SG_METER_TO_FEET; - _transmitter_range_nm = nav->get_range(); // fixme - return; - } - } else { - _transmitter_valid = false; - 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