X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FInstrumentation%2Fdme.cxx;h=bcea965d83b596c766f49a772f4d50406e6f428b;hb=caf0138ab35b03bbe7bf367ff2222d0a31be3157;hp=485412a122ebcf32290cbb5d07904a707986584f;hpb=ef52b23e3a1aaf44d1a2283c920a70367960abff;p=flightgear.git diff --git a/src/Instrumentation/dme.cxx b/src/Instrumentation/dme.cxx index 485412a12..bcea965d8 100644 --- a/src/Instrumentation/dme.cxx +++ b/src/Instrumentation/dme.cxx @@ -8,15 +8,16 @@ #endif #include +#include #include #include #include
#include +#include #include "dme.hxx" - /** * Adjust the range. * @@ -44,57 +45,26 @@ 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_bias(0.0) + _navrecord(NULL), + _name(node->getStringValue("name", "dme")), + _num(node->getIntValue("number", 0)), + _audioIdent(NULL) { } DME::~DME () { + delete _audioIdent; } void DME::init () { string branch; - branch = "/instrumentation/" + name; + branch = "/instrumentation/" + _name; - SGPropertyNode *node = fgGetNode(branch.c_str(), num, true ); + 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 = node->getChild("serviceable", 0, true); _electrical_node = fgGetNode("/systems/electrical/outputs/dme", true); SGPropertyNode *fnode = node->getChild("frequencies", 0, true); @@ -104,16 +74,33 @@ DME::init () _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); + + double d = node->getDoubleValue( "volume", 1.0 ); + _volume_node = node->getChild("volume", 0, true); + _volume_node->setDoubleValue( d ); + + bool b = node->getBoolValue( "ident", false ); + _ident_btn_node = node->getChild("ident", 0, true); + _ident_btn_node->setBoolValue( b ); + + std::ostringstream temp; + temp << _name << "-ident-" << _num; + if( NULL == _audioIdent ) + _audioIdent = new DMEAudioIdent( temp.str() ); + _audioIdent->init(); } void DME::update (double delta_time_sec) { + if( delta_time_sec < SGLimitsd::min() ) + return; //paused + // Figure out the source const char * source = _source_node->getStringValue(); if (source[0] == '\0') { string branch; - branch = "/instrumentation/" + name + "/frequencies/selected-mhz"; + branch = "/instrumentation/" + _name + "/frequencies/selected-mhz"; _source_node->setStringValue(branch.c_str()); source = _source_node->getStringValue(); } @@ -124,56 +111,69 @@ DME::update (double delta_time_sec) _time_before_search_sec = 0; _last_frequency_mhz = frequency_mhz; } + _frequency_node->setDoubleValue(frequency_mhz); // Get the aircraft position - double longitude_rad = - _longitude_node->getDoubleValue() * SGD_DEGREES_TO_RADIANS; - double latitude_rad = - _latitude_node->getDoubleValue() * SGD_DEGREES_TO_RADIANS; - double altitude_m = - _altitude_node->getDoubleValue() * SG_FEET_TO_METER; - - // On timeout, scan again + // On timeout, scan again _time_before_search_sec -= delta_time_sec; - if (_time_before_search_sec < 0) - search(frequency_mhz, longitude_rad, - latitude_rad, altitude_m); + if (_time_before_search_sec < 0) { + _time_before_search_sec = 1.0; + + if( fgGetBool( "/sim/realism/dme-fallback-to-loc", true ) ) { + if( NULL == (_navrecord = globals->get_loclist()->findByFreq( frequency_mhz, + globals->get_aircraft_position())) ) { - // If it's off, don't bother. + _navrecord = globals->get_dmelist()->findByFreq( frequency_mhz, + globals->get_aircraft_position()); + } + } else { + _navrecord = globals->get_dmelist()->findByFreq( frequency_mhz, + globals->get_aircraft_position()); + } + } + + // If it's off, don't bother. if (!_serviceable_node->getBoolValue() || !_electrical_node->getBoolValue() || - !_transmitter_valid) { + NULL == _navrecord ) { _last_distance_nm = 0; _in_range_node->setBoolValue(false); _distance_node->setDoubleValue(0); _speed_node->setDoubleValue(0); _time_node->setDoubleValue(0); + _audioIdent->setIdent("", 0.0 ); return; } - // Calculate the distance to the transmitter - SGGeod geod = SGGeod::fromRadM(longitude_rad, latitude_rad, altitude_m); - SGVec3d location = SGVec3d::fromGeod(geod); + // Calculate the distance to the transmitter + SGVec3d location = SGVec3d::fromGeod(globals->get_aircraft_position()); - double distance_nm = dist(_transmitter, location) * SG_METER_TO_NM; + double distance_nm = dist(_navrecord->cart(), location) * SG_METER_TO_NM; - double range_nm = adjust_range(_transmitter_elevation_ft, - altitude_m * SG_METER_TO_FEET, - _transmitter_range_nm); + double range_nm = adjust_range(_navrecord->get_elev_ft(), + globals->get_aircraft_position().getElevationFt(), + _navrecord->get_range()); if (distance_nm <= range_nm) { + double volume = _volume_node->getDoubleValue(); + if( false == _ident_btn_node->getBoolValue() ) + volume = 0.0; + + _audioIdent->setIdent(_navrecord->ident(), volume ); + 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); - double tmp_dist = distance_nm - _transmitter_bias; + double tmp_dist = distance_nm - _navrecord->get_multiuse(); 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); + if (SGLimitsd::min() < fabs(speed_kt)) + _time_node->setDoubleValue(distance_nm/speed_kt*60.0); } else { _last_distance_nm = 0; @@ -181,29 +181,10 @@ DME::update (double delta_time_sec) _distance_node->setDoubleValue(0); _speed_node->setDoubleValue(0); _time_node->setDoubleValue(0); + _audioIdent->setIdent("", 0.0 ); } -} - -void -DME::search (double frequency_mhz, double longitude_rad, - double latitude_rad, double altitude_m) -{ - // reset search time - _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); - - _transmitter_valid = (dme != NULL); - - 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(); - } + + _audioIdent->update( delta_time_sec ); } // end of dme.cxx