X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FInstrumentation%2Fdme.cxx;h=5685dbabec606efc20f7d21e2429efd58cc1b8a1;hb=c6045147544badd6daefdcab9d4de1ed6936533b;hp=b660f15396ead9893b1de6c544d44a692cea704c;hpb=b2b33f75820359670ca4d8b326370fc3771ee08c;p=flightgear.git diff --git a/src/Instrumentation/dme.cxx b/src/Instrumentation/dme.cxx index b660f1539..5685dbabe 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,14 +40,16 @@ adjust_range (double transmitter_elevation_ft, double aircraft_altitude_ft, } -DME::DME () +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) + _transmitter_bias(0.0), + _name(node->getStringValue("name", "dme")), + _num(node->getIntValue("number", 0)) { } @@ -55,22 +60,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 @@ -79,11 +85,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; @@ -117,19 +125,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 - _transmitter_bias); + 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); @@ -150,14 +165,14 @@ DME::search (double frequency_mhz, double longitude_rad, _time_before_search_sec = 1.0; // try the ILS list first - FGNavRecord *dme - = globals->get_dmelist()->findByFreq( frequency_mhz, longitude_rad, - latitude_rad, altitude_m); + + FGNavRecord *dme = globals->get_dmelist()->findByFreq( frequency_mhz, + SGGeod::fromRadM(longitude_rad, latitude_rad, altitude_m)); _transmitter_valid = (dme != NULL); if ( _transmitter_valid ) { - _transmitter = Point3D(dme->get_x(), dme->get_y(), dme->get_z()); + _transmitter = dme->cart(); _transmitter_elevation_ft = dme->get_elev_ft(); _transmitter_range_nm = dme->get_range(); _transmitter_bias = dme->get_multiuse();