X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FInstrumentation%2Fdme.cxx;h=f12b4f80e6938ea39670c2cc0b61d5123a35ce95;hb=61812ef4b88f5aa74e9cc0630c84d6fc6b4a51cd;hp=afc3f1efd9ad92030aa577aa4b1dec81cd8fe7a3;hpb=1f7e33b73d1c550547ddedb896496f4668b58a0b;p=flightgear.git diff --git a/src/Instrumentation/dme.cxx b/src/Instrumentation/dme.cxx index afc3f1efd..f12b4f80e 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,23 @@ 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 () +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_range_nm(0), + _transmitter_bias(0.0), + _name(node->getStringValue("name", "dme")), + _num(node->getIntValue("number", 0)) { } @@ -52,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-deg", true); - _serviceable_node = fgGetNode("/instrumentation/dme/serviceable", true); + _altitude_node = fgGetNode("/position/altitude-ft", 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 +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; @@ -93,7 +104,7 @@ DME::update (double delta_time_sec) double latitude_rad = _latitude_node->getDoubleValue() * SGD_DEGREES_TO_RADIANS; double altitude_m = - _altitude_node->getDoubleValue() * SGD_DEGREES_TO_RADIANS; + _altitude_node->getDoubleValue() * SG_FEET_TO_METER; // On timeout, scan again _time_before_search_sec -= delta_time_sec; @@ -114,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); + 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,41 +161,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) - 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; - } + _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