]> git.mxchange.org Git - flightgear.git/blobdiff - src/Cockpit/marker_beacon.cxx
Moved src/Model/loader.[ch]xx and src/Model/model.[ch]xx to
[flightgear.git] / src / Cockpit / marker_beacon.cxx
index 8f0475914aba5c5211cd36d60490eaf03391c285..eed3f1a032f83147c7bb337cac87d0136b3e2120 100644 (file)
 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;
 }