X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCockpit%2Fmarker_beacon.cxx;h=eed3f1a032f83147c7bb337cac87d0136b3e2120;hb=56db994994a891acd491da24b4b36420b4e54a88;hp=8f0475914aba5c5211cd36d60490eaf03391c285;hpb=f38c88b762bc6c317669e8e0b00a92b09ee4671a;p=flightgear.git diff --git a/src/Cockpit/marker_beacon.cxx b/src/Cockpit/marker_beacon.cxx index 8f0475914..eed3f1a03 100644 --- a/src/Cockpit/marker_beacon.cxx +++ b/src/Cockpit/marker_beacon.cxx @@ -40,36 +40,16 @@ SG_USING_STD(string); -/** - * Boy, this is ugly! Make the VOR range vary by altitude difference. - */ -static double kludgeRange ( double stationElev, double aircraftElev, - double nominalRange) -{ - // Assume that the nominal range (usually - // 50nm) applies at a 5,000 ft difference. - // Just a wild guess! - double factor = ((aircraftElev*SG_METER_TO_FEET) - stationElev) / 5000.0; - double range = fabs(nominalRange * factor); - - // Clamp the range to keep it sane; for - // now, never less than 25% or more than - // 500% of nominal range. - if (range < nominalRange/4.0) { - range = nominalRange/4.0; - } else if (range > nominalRange*5.0) { - range = nominalRange*5.0; - } - - return range; -} - - // Constructor FGMarkerBeacon::FGMarkerBeacon() : lon_node(fgGetNode("/position/longitude-deg", true)), lat_node(fgGetNode("/position/latitude-deg", true)), alt_node(fgGetNode("/position/altitude-ft", true)), + bus_power(fgGetNode("/systems/electrical/outputs/navcom[0]", true)), + power_btn(fgGetNode("/radios/marker-beacon/power-btn", true)), + audio_btn(fgGetNode("/radios/marker-beacon/audio-btn", true)), + servicable(fgGetNode("/instrumentation/marker-beacons/servicable", true)), + need_update(true), outer_blink(false), middle_blink(false), @@ -86,6 +66,10 @@ FGMarkerBeacon::FGMarkerBeacon() : term_tbl = new SGInterpTable( term.str() ); low_tbl = new SGInterpTable( low.str() ); high_tbl = new SGInterpTable( high.str() ); + + power_btn->setBoolValue( true ); + audio_btn->setBoolValue( true ); + servicable->setBoolValue( true ); } @@ -137,38 +121,43 @@ FGMarkerBeacon::update(double dt) { need_update = false; - // marker beacon blinking - bool light_on = ( outer_blink || middle_blink || inner_blink ); - SGTimeStamp current; - current.stamp(); - - if ( light_on && (current - blink > 400000) ) { - light_on = false; - blink.stamp(); - } else if ( !light_on && (current - blink > 100000) ) { - light_on = true; - blink.stamp(); - } - - if ( outer_marker ) { - outer_blink = light_on; - } else { - outer_blink = false; - } - - if ( middle_marker ) { - middle_blink = light_on; - } else { - middle_blink = false; - } - - if ( inner_marker ) { - inner_blink = light_on; + if ( has_power() && servicable->getBoolValue() ) { + // marker beacon blinking + bool light_on = ( outer_blink || middle_blink || inner_blink ); + SGTimeStamp current; + current.stamp(); + + if ( light_on && (current - blink > 400000) ) { + light_on = false; + blink.stamp(); + } else if ( !light_on && (current - blink > 100000) ) { + light_on = true; + blink.stamp(); + } + + if ( outer_marker ) { + outer_blink = light_on; + } else { + outer_blink = false; + } + + if ( middle_marker ) { + middle_blink = light_on; + } else { + middle_blink = false; + } + + if ( inner_marker ) { + inner_blink = light_on; + } else { + inner_blink = false; + } + + // cout << outer_blink << " " << middle_blink << " " + // << inner_blink << endl; } else { - inner_blink = false; + inner_blink = middle_blink = outer_blink = false; } - - // cout << outer_blink << " " << middle_blink << " " << inner_blink << endl; } @@ -191,58 +180,65 @@ void FGMarkerBeacon::search() outer_marker = middle_marker = inner_marker = false; - if ( beacon_type == FGMkrBeacon::OUTER ) { + if ( beacon_type == FGMkrBeacon::NOBEACON + || !has_power() || !servicable->getBoolValue() ) + { + // cout << "no marker" << endl; + beacon_type = FGMkrBeacon::NOBEACON; + globals->get_soundmgr()->stop( "outer-marker" ); + globals->get_soundmgr()->stop( "middle-marker" ); + globals->get_soundmgr()->stop( "inner-marker" ); + } else if ( beacon_type == FGMkrBeacon::OUTER ) { outer_marker = true; // cout << "OUTER MARKER" << endl; -#ifdef ENABLE_AUDIO_SUPPORT - if ( last_beacon != FGMkrBeacon::OUTER ) { - if ( ! globals->get_soundmgr()->exists( "outer-marker" ) ) { - FGSimpleSound *sound = beacon.get_outer(); - sound->set_volume( 0.3 ); - globals->get_soundmgr()->add( sound, "outer-marker" ); - } - if ( !globals->get_soundmgr()->is_playing("outer-marker") ) { - globals->get_soundmgr()->play_looped( "outer-marker" ); - } - } -#endif + if ( last_beacon != FGMkrBeacon::OUTER ) { + if ( ! globals->get_soundmgr()->exists( "outer-marker" ) ) { + SGSimpleSound *sound = beacon.get_outer(); + sound->set_volume( 0.3 ); + globals->get_soundmgr()->add( sound, "outer-marker" ); + } + } + if ( audio_btn->getBoolValue() ) { + if ( !globals->get_soundmgr()->is_playing("outer-marker") ) { + globals->get_soundmgr()->play_looped( "outer-marker" ); + } + } else { + globals->get_soundmgr()->stop( "outer-marker" ); + } } else if ( beacon_type == FGMkrBeacon::MIDDLE ) { middle_marker = true; // cout << "MIDDLE MARKER" << endl; -#ifdef ENABLE_AUDIO_SUPPORT if ( last_beacon != FGMkrBeacon::MIDDLE ) { if ( ! globals->get_soundmgr()->exists( "middle-marker" ) ) { - FGSimpleSound *sound = beacon.get_middle(); + SGSimpleSound *sound = beacon.get_middle(); sound->set_volume( 0.3 ); globals->get_soundmgr()->add( sound, "middle-marker" ); } - if ( !globals->get_soundmgr()->is_playing("middle-marker") ) { - globals->get_soundmgr()->play_looped( "middle-marker" ); - } - } -#endif + } + if ( audio_btn->getBoolValue() ) { + if ( !globals->get_soundmgr()->is_playing("middle-marker") ) { + globals->get_soundmgr()->play_looped( "middle-marker" ); + } + } else { + globals->get_soundmgr()->stop( "middle-marker" ); + } } else if ( beacon_type == FGMkrBeacon::INNER ) { inner_marker = true; // cout << "INNER MARKER" << endl; -#ifdef ENABLE_AUDIO_SUPPORT if ( last_beacon != FGMkrBeacon::INNER ) { if ( ! globals->get_soundmgr()->exists( "inner-marker" ) ) { - FGSimpleSound *sound = beacon.get_inner(); + SGSimpleSound *sound = beacon.get_inner(); sound->set_volume( 0.3 ); globals->get_soundmgr()->add( sound, "inner-marker" ); } - if ( !globals->get_soundmgr()->is_playing("inner-marker") ) { - globals->get_soundmgr()->play_looped( "inner-marker" ); - } - } -#endif - } else { - // cout << "no marker" << endl; -#ifdef ENABLE_AUDIO_SUPPORT - globals->get_soundmgr()->stop( "outer-marker" ); - globals->get_soundmgr()->stop( "middle-marker" ); - globals->get_soundmgr()->stop( "inner-marker" ); -#endif + } + if ( audio_btn->getBoolValue() ) { + if ( !globals->get_soundmgr()->is_playing("inner-marker") ) { + globals->get_soundmgr()->play_looped( "inner-marker" ); + } + } else { + globals->get_soundmgr()->stop( "inner-marker" ); + } } last_beacon = beacon_type; }