]> git.mxchange.org Git - flightgear.git/blobdiff - src/Network/atc610x.cxx
Added static port system and a new altimeter model connected to it.
[flightgear.git] / src / Network / atc610x.cxx
index 1541814eddd37ee5c444b2749f7f1181a65d634d..2a618c011580b350e6ffd6150d0dd30518869b1b 100644 (file)
@@ -44,6 +44,7 @@
 #include <simgear/io/iochannel.hxx>
 #include <simgear/math/sg_types.hxx>
 #include <simgear/misc/props.hxx>
+#include <simgear/misc/sg_path.hxx>
 
 #include <Main/fg_props.hxx>
 #include <Main/globals.hxx>
@@ -204,6 +205,19 @@ void ATC610xSetLamp( int fd, int channel, bool value ) {
 }
 
 
+void FGATC610x::init_config() {
+#if defined( unix ) || defined( __CYGWIN__ )
+    // Next check home directory for .fgfsrc.hostname file
+    char *envp = ::getenv( "HOME" );
+    if ( envp != NULL ) {
+        SGPath atc610x_config( envp );
+        atc610x_config.append( ".fgfs-atc610x.xml" );
+        readProperties( atc610x_config.str(), globals->get_props() );
+    }
+#endif
+}
+
+
 // Open and initialize ATC 610x hardware
 bool FGATC610x::open() {
     if ( is_enabled() ) {
@@ -212,6 +226,9 @@ bool FGATC610x::open() {
        return false;
     }
 
+    // This loads the config parameters generated by "simcal"
+    init_config();
+
     SG_LOG( SG_IO, SG_ALERT,
            "Initializing ATC 610x hardware, please wait ..." );
 
@@ -381,9 +398,22 @@ bool FGATC610x::open() {
     dme_kt = fgGetNode( "/radios/dme/speed-kt", true );
     dme_nm = fgGetNode( "/radios/dme/distance-nm", true );
 
+    adf_bus_power = fgGetNode( "/systems/electrical/outputs/adf", true );
+    dme_bus_power = fgGetNode( "/systems/electrical/outputs/dme", true );
+    navcom1_bus_power = fgGetNode( "/systems/electrical/outputs/navcom[0]",
+                                   true );
+    navcom2_bus_power = fgGetNode( "/systems/electrical/outputs/navcom[1]",
+                                   true );
+    xpdr_bus_power = fgGetNode( "/systems/electrical/outputs/transponder",
+                                 true );
+
+    navcom1_power_btn = fgGetNode( "/radios/comm[0]/inputs/power-btn", true );
+    navcom2_power_btn = fgGetNode( "/radios/comm[1]/inputs/power-btn", true );
+
     com1_freq = fgGetNode( "/radios/comm[0]/frequencies/selected-mhz", true );
     com1_stby_freq
        = fgGetNode( "/radios/comm[0]/frequencies/standby-mhz", true );
+
     com2_freq = fgGetNode( "/radios/comm[1]/frequencies/selected-mhz", true );
     com2_stby_freq
        = fgGetNode( "/radios/comm[1]/frequencies/standby-mhz", true );
@@ -396,7 +426,7 @@ bool FGATC610x::open() {
     nav2_stby_freq
        = fgGetNode( "/radios/nav[1]/frequencies/standby-mhz", true );
 
-    adf_power = fgGetNode( "/radios/kr-87/inputs/power-btn", true );
+    adf_power_btn = fgGetNode( "/radios/kr-87/inputs/power-btn", true );
     adf_vol = fgGetNode( "/radios/kr-87/inputs/volume", true );
     adf_adf_btn = fgGetNode( "/radios/kr-87/inputs/adf-btn", true );
     adf_bfo_btn = fgGetNode( "/radios/kr-87/inputs/bfo-btn", true );
@@ -434,6 +464,34 @@ bool FGATC610x::open() {
     xpdr_sby_ann = fgGetNode( "/radios/kt-70/annunciators/sby", true );
     xpdr_reply_ann = fgGetNode( "/radios/kt-70/annunciators/reply", true );
 
+    elevator_center = fgGetNode( "/input/atc610x/elevator/center", 0 );
+    elevator_min = fgGetNode( "/input/atc610x/elevator/min", 0 );
+    elevator_max = fgGetNode( "/input/atc610x/elevator/max", 0 );
+
+    ailerons_center = fgGetNode( "/input/atc610x/ailerons/center", 0 );
+    ailerons_min = fgGetNode( "/input/atc610x/ailerons/min", 0 );
+    ailerons_max = fgGetNode( "/input/atc610x/ailerons/max", 0 );
+
+    rudder_center = fgGetNode( "/input/atc610x/rudder/center", 0 );
+    rudder_min = fgGetNode( "/input/atc610x/rudder/min", 0 );
+    rudder_max = fgGetNode( "/input/atc610x/rudder/max", 0 );
+
+    throttle_min = fgGetNode( "/input/atc610x/throttle/min", 0 );
+    throttle_max = fgGetNode( "/input/atc610x/throttle/max", 0 );
+
+    mixture_min = fgGetNode( "/input/atc610x/mixture/min", 0 );
+    mixture_max = fgGetNode( "/input/atc610x/mixture/max", 0 );
+
+    trim_center = fgGetNode( "/input/atc610x/trim/center", 0 );
+    trim_min = fgGetNode( "/input/atc610x/trim/min", 0 );
+    trim_max = fgGetNode( "/input/atc610x/trim/max", 0 );
+
+    nav1vol_min = fgGetNode( "/input/atc610x/nav1vol/min", 0 );
+    nav1vol_max = fgGetNode( "/input/atc610x/nav1vol/max", 0 );
+
+    nav2vol_min = fgGetNode( "/input/atc610x/nav2vol/min", 0 );
+    nav2vol_max = fgGetNode( "/input/atc610x/nav2vol/max", 0 );
+
     return true;
 }
 
@@ -447,6 +505,48 @@ bool FGATC610x::open() {
 #define ATC_ELEVATOR_CENTER 543
 #define ATC_RUDDER_CENTER 519
 
+// scale a number between min and max (with center defined) to a scale
+// from -1.0 to 1.0
+static double scale( int center, int min, int max, int value ) {
+    // cout << center << " " << min << " " << max << " " << value << " ";
+    double result;
+    double range;
+
+    if ( value <= center ) {
+        range = center - min;
+        result = (value - center) / range;
+    } else {
+        range = max - center;
+        result = (value - center) / range;            
+    }
+
+    if ( result < -1.0 ) result = -1.0;
+    if ( result > 1.0 ) result = 1.0;
+
+    // cout << result << endl;
+
+    return result;
+}
+
+
+// scale a number between min and max to a scale from 0.0 to 1.0
+static double scale( int min, int max, int value ) {
+    // cout << center << " " << min << " " << max << " " << value << " ";
+    double result;
+    double range;
+
+    range = max - min;
+    result = (value - min) / range;
+
+    if ( result < 0.0 ) result = 0.0;
+    if ( result > 1.0 ) result = 1.0;
+
+    // cout << result << endl;
+
+    return result;
+}
+
+
 bool FGATC610x::do_analog_in() {
     // Read raw data in byte form
     ATC610xReadAnalogInputs( analog_in_fd, analog_in_bytes );
@@ -464,33 +564,39 @@ bool FGATC610x::do_analog_in() {
     float tmp, tmp1, tmp2;
 
     // aileron
-    tmp = (float)(analog_in_data[0] - ATC_AILERON_CENTER) / 256.0f;
+    tmp = scale( ailerons_center->getIntValue(), ailerons_min->getIntValue(),
+                 ailerons_max->getIntValue(), analog_in_data[0] );
     fgSetFloat( "/controls/aileron", tmp );
     // cout << "aileron = " << analog_in_data[0] << " = " << tmp;
 
     // elevator
-    tmp = (float)(analog_in_data[4] - ATC_ELEVATOR_TRIM_CENTER) / 512.0f;
-    fgSetFloat( "/controls/elevator-trim", tmp );
+    tmp = -scale( elevator_center->getIntValue(), elevator_min->getIntValue(),
+                  elevator_max->getIntValue(), analog_in_data[5] );
+    fgSetFloat( "/controls/elevator", tmp );
     // cout << "trim = " << analog_in_data[4] << " = " << tmp;
 
-    // trim
-    tmp = (float)(ATC_ELEVATOR_CENTER - analog_in_data[5]) / 100.0f;
-    fgSetFloat( "/controls/elevator", tmp );
+    // elevator trim
+    tmp = scale( trim_center->getIntValue(), trim_min->getIntValue(),
+                 trim_max->getIntValue(), analog_in_data[4] );
+    fgSetFloat( "/controls/elevator-trim", tmp );
     // cout << " elev = " << analog_in_data[5] << " = " << tmp << endl;
 
     // mixture
-    tmp = (float)analog_in_data[7] / 680.0f;
+    tmp = scale( mixture_min->getIntValue(), mixture_max->getIntValue(),
+                 analog_in_data[6] );
     fgSetFloat( "/controls/mixture[0]", tmp );
     fgSetFloat( "/controls/mixture[1]", tmp );
 
     // throttle
-    tmp = ((float)analog_in_data[8] - 141.0) / 632.0f;
+    tmp = scale( mixture_min->getIntValue(), mixture_max->getIntValue(),
+                 analog_in_data[8] );
     fgSetFloat( "/controls/throttle[0]", tmp );
     fgSetFloat( "/controls/throttle[1]", tmp );
 
 #if 0
     // rudder
-    tmp = (float)(ATC_RUDDER_CENTER - analog_in_data[10]) / 145.0f;
+    tmp = scale( rudder_center->getIntValue(), rudder_min->getIntValue(),
+                 rudder_max->getIntValue(), analog_in_data[10] );
     fgSetFloat( "/controls/rudder", tmp );
 #endif
 
@@ -573,330 +679,349 @@ bool FGATC610x::do_radio_switches() {
        fgSetInt( "/radios/dme/switch-position", 3 );
     }
 
-    // Com1 Power
+    // NavCom1 Power
     fgSetBool( "/radios/comm[0]/inputs/power-btn",
                radio_switch_data[7] & 0x01 );
 
-    // Com1 Swap
-    int com1_swap = !((radio_switch_data[7] >> 1) & 0x01);
-    static int last_com1_swap;
-    if ( com1_swap && (last_com1_swap != com1_swap) ) {
-       float tmp = com1_freq->getFloatValue();
-       fgSetFloat( "/radios/comm[0]/frequencies/selected-mhz",
-                  com1_stby_freq->getFloatValue() );
-       fgSetFloat( "/radios/comm[0]/frequencies/standby-mhz", tmp );
+    if ( navcom1_has_power() ) {
+        // Com1 Swap
+        int com1_swap = !((radio_switch_data[7] >> 1) & 0x01);
+        static int last_com1_swap;
+        if ( com1_swap && (last_com1_swap != com1_swap) ) {
+            float tmp = com1_freq->getFloatValue();
+            fgSetFloat( "/radios/comm[0]/frequencies/selected-mhz",
+                        com1_stby_freq->getFloatValue() );
+            fgSetFloat( "/radios/comm[0]/frequencies/standby-mhz", tmp );
+        }
+        last_com1_swap = com1_swap;
     }
-    last_com1_swap = com1_swap;
 
-    // Com2 Power
+    // NavCom2 Power
     fgSetBool( "/radios/comm[1]/inputs/power-btn",
                radio_switch_data[15] & 0x01 );
 
-    // Com2 Swap
-    int com2_swap = !((radio_switch_data[15] >> 1) & 0x01);
-    static int last_com2_swap;
-    if ( com2_swap && (last_com2_swap != com2_swap) ) {
-       float tmp = com2_freq->getFloatValue();
-       fgSetFloat( "/radios/comm[1]/frequencies/selected-mhz",
-                  com2_stby_freq->getFloatValue() );
-       fgSetFloat( "/radios/comm[1]/frequencies/standby-mhz", tmp );
-    }
-    last_com2_swap = com2_swap;
-
-    // Nav1 Swap
-    int nav1_swap = radio_switch_data[11] & 0x01;
-    static int last_nav1_swap;
-    if ( nav1_swap && (last_nav1_swap != nav1_swap) ) {
-       float tmp = nav1_freq->getFloatValue();
-       fgSetFloat( "/radios/nav[0]/frequencies/selected-mhz",
-                  nav1_stby_freq->getFloatValue() );
-       fgSetFloat( "/radios/nav[0]/frequencies/standby-mhz", tmp );
-    }
-    last_nav1_swap = nav1_swap;
-
-    // Nav2 Swap
-    int nav2_swap = !(radio_switch_data[19] & 0x01);
-    static int last_nav2_swap;
-    if ( nav2_swap && (last_nav2_swap != nav2_swap) ) {
-       float tmp = nav2_freq->getFloatValue();
-       fgSetFloat( "/radios/nav[1]/frequencies/selected-mhz",
-                  nav2_stby_freq->getFloatValue() );
-       fgSetFloat( "/radios/nav[1]/frequencies/standby-mhz", tmp );
+    if ( navcom2_has_power() ) {
+        // Com2 Swap
+        int com2_swap = !((radio_switch_data[15] >> 1) & 0x01);
+        static int last_com2_swap;
+        if ( com2_swap && (last_com2_swap != com2_swap) ) {
+            float tmp = com2_freq->getFloatValue();
+            fgSetFloat( "/radios/comm[1]/frequencies/selected-mhz",
+                        com2_stby_freq->getFloatValue() );
+            fgSetFloat( "/radios/comm[1]/frequencies/standby-mhz", tmp );
+        }
+        last_com2_swap = com2_swap;
+    }
+
+    if ( navcom1_has_power() ) {
+        // Nav1 Swap
+        int nav1_swap = radio_switch_data[11] & 0x01;
+        static int last_nav1_swap;
+        if ( nav1_swap && (last_nav1_swap != nav1_swap) ) {
+            float tmp = nav1_freq->getFloatValue();
+            fgSetFloat( "/radios/nav[0]/frequencies/selected-mhz",
+                        nav1_stby_freq->getFloatValue() );
+            fgSetFloat( "/radios/nav[0]/frequencies/standby-mhz", tmp );
+        }
+        last_nav1_swap = nav1_swap;
+    }
+
+    if ( navcom2_has_power() ) {
+        // Nav2 Swap
+        int nav2_swap = !(radio_switch_data[19] & 0x01);
+        static int last_nav2_swap;
+        if ( nav2_swap && (last_nav2_swap != nav2_swap) ) {
+            float tmp = nav2_freq->getFloatValue();
+            fgSetFloat( "/radios/nav[1]/frequencies/selected-mhz",
+                        nav2_stby_freq->getFloatValue() );
+            fgSetFloat( "/radios/nav[1]/frequencies/standby-mhz", tmp );
+        }
+        last_nav2_swap = nav2_swap;
     }
-    last_nav2_swap = nav2_swap;
-
-    // Com1 Tuner
-    int com1_tuner_fine = ((radio_switch_data[5] >> 4) & 0x0f) - 1;
-    int com1_tuner_coarse = (radio_switch_data[5] & 0x0f) - 1;
-    static int last_com1_tuner_fine = com1_tuner_fine;
-    static int last_com1_tuner_coarse = com1_tuner_coarse;
-
-    freq = com1_stby_freq->getFloatValue();
-    coarse_freq = (int)freq;
-    fine_freq = (int)((freq - coarse_freq) * 40 + 0.5);
-
-    if ( com1_tuner_fine != last_com1_tuner_fine ) {
-        diff = com1_tuner_fine - last_com1_tuner_fine;
-        if ( abs(diff) > 4 ) {
-            // roll over
-            if ( com1_tuner_fine < last_com1_tuner_fine ) {
-                // going up
-                diff = 12 - last_com1_tuner_fine + com1_tuner_fine;
-            } else {
-                // going down
-                diff = com1_tuner_fine - 12 - last_com1_tuner_fine;
+
+    if ( navcom1_has_power() ) {
+        // Com1 Tuner
+        int com1_tuner_fine = ((radio_switch_data[5] >> 4) & 0x0f) - 1;
+        int com1_tuner_coarse = (radio_switch_data[5] & 0x0f) - 1;
+        static int last_com1_tuner_fine = com1_tuner_fine;
+        static int last_com1_tuner_coarse = com1_tuner_coarse;
+
+        freq = com1_stby_freq->getFloatValue();
+        coarse_freq = (int)freq;
+        fine_freq = (int)((freq - coarse_freq) * 40 + 0.5);
+
+        if ( com1_tuner_fine != last_com1_tuner_fine ) {
+            diff = com1_tuner_fine - last_com1_tuner_fine;
+            if ( abs(diff) > 4 ) {
+                // roll over
+                if ( com1_tuner_fine < last_com1_tuner_fine ) {
+                    // going up
+                    diff = 12 - last_com1_tuner_fine + com1_tuner_fine;
+                } else {
+                    // going down
+                    diff = com1_tuner_fine - 12 - last_com1_tuner_fine;
+                }
             }
+            fine_freq += diff;
         }
-        fine_freq += diff;
-    }
-    while ( fine_freq >= 40.0 ) { fine_freq -= 40.0; }
-    while ( fine_freq < 0.0 )  { fine_freq += 40.0; }
-
-    if ( com1_tuner_coarse != last_com1_tuner_coarse ) {
-        diff = com1_tuner_coarse - last_com1_tuner_coarse;
-        if ( abs(diff) > 4 ) {
-            // roll over
-            if ( com1_tuner_coarse < last_com1_tuner_coarse ) {
-                // going up
-                diff = 12 - last_com1_tuner_coarse + com1_tuner_coarse;
-            } else {
-                // going down
-                diff = com1_tuner_coarse - 12 - last_com1_tuner_coarse;
+        while ( fine_freq >= 40.0 ) { fine_freq -= 40.0; }
+        while ( fine_freq < 0.0 )  { fine_freq += 40.0; }
+
+        if ( com1_tuner_coarse != last_com1_tuner_coarse ) {
+            diff = com1_tuner_coarse - last_com1_tuner_coarse;
+            if ( abs(diff) > 4 ) {
+                // roll over
+                if ( com1_tuner_coarse < last_com1_tuner_coarse ) {
+                    // going up
+                    diff = 12 - last_com1_tuner_coarse + com1_tuner_coarse;
+                } else {
+                    // going down
+                    diff = com1_tuner_coarse - 12 - last_com1_tuner_coarse;
+                }
             }
+            coarse_freq += diff;
         }
-        coarse_freq += diff;
+        if ( coarse_freq < 118.0 ) { coarse_freq += 19.0; }
+        if ( coarse_freq > 136.0 ) { coarse_freq -= 19.0; }
+
+        last_com1_tuner_fine = com1_tuner_fine;
+        last_com1_tuner_coarse = com1_tuner_coarse;
+
+        fgSetFloat( "/radios/comm[0]/frequencies/standby-mhz", 
+                    coarse_freq + fine_freq / 40.0 );
     }
-    if ( coarse_freq < 118.0 ) { coarse_freq += 19.0; }
-    if ( coarse_freq > 136.0 ) { coarse_freq -= 19.0; }
-
-    last_com1_tuner_fine = com1_tuner_fine;
-    last_com1_tuner_coarse = com1_tuner_coarse;
-
-    fgSetFloat( "/radios/comm[0]/frequencies/standby-mhz", 
-                coarse_freq + fine_freq / 40.0 );
-
-    // Com2 Tuner
-    int com2_tuner_fine = ((radio_switch_data[13] >> 4) & 0x0f) - 1;
-    int com2_tuner_coarse = (radio_switch_data[13] & 0x0f) - 1;
-    static int last_com2_tuner_fine = com2_tuner_fine;
-    static int last_com2_tuner_coarse = com2_tuner_coarse;
-
-    freq = com2_stby_freq->getFloatValue();
-    coarse_freq = (int)freq;
-    fine_freq = (int)((freq - coarse_freq) * 40 + 0.5);
-
-    if ( com2_tuner_fine != last_com2_tuner_fine ) {
-        diff = com2_tuner_fine - last_com2_tuner_fine;
-        if ( abs(diff) > 4 ) {
-            // roll over
-            if ( com2_tuner_fine < last_com2_tuner_fine ) {
-                // going up
-                diff = 12 - last_com2_tuner_fine + com2_tuner_fine;
-            } else {
-                // going down
-                diff = com2_tuner_fine - 12 - last_com2_tuner_fine;
+
+    if ( navcom2_has_power() ) {
+        // Com2 Tuner
+        int com2_tuner_fine = ((radio_switch_data[13] >> 4) & 0x0f) - 1;
+        int com2_tuner_coarse = (radio_switch_data[13] & 0x0f) - 1;
+        static int last_com2_tuner_fine = com2_tuner_fine;
+        static int last_com2_tuner_coarse = com2_tuner_coarse;
+
+        freq = com2_stby_freq->getFloatValue();
+        coarse_freq = (int)freq;
+        fine_freq = (int)((freq - coarse_freq) * 40 + 0.5);
+
+        if ( com2_tuner_fine != last_com2_tuner_fine ) {
+            diff = com2_tuner_fine - last_com2_tuner_fine;
+            if ( abs(diff) > 4 ) {
+                // roll over
+                if ( com2_tuner_fine < last_com2_tuner_fine ) {
+                    // going up
+                    diff = 12 - last_com2_tuner_fine + com2_tuner_fine;
+                } else {
+                    // going down
+                    diff = com2_tuner_fine - 12 - last_com2_tuner_fine;
+                }
             }
+            fine_freq += diff;
         }
-        fine_freq += diff;
-    }
-    while ( fine_freq >= 40.0 ) { fine_freq -= 40.0; }
-    while ( fine_freq < 0.0 )  { fine_freq += 40.0; }
-
-    if ( com2_tuner_coarse != last_com2_tuner_coarse ) {
-        diff = com2_tuner_coarse - last_com2_tuner_coarse;
-        if ( abs(diff) > 4 ) {
-            // roll over
-            if ( com2_tuner_coarse < last_com2_tuner_coarse ) {
-                // going up
-                diff = 12 - last_com2_tuner_coarse + com2_tuner_coarse;
-            } else {
-                // going down
-                diff = com2_tuner_coarse - 12 - last_com2_tuner_coarse;
+        while ( fine_freq >= 40.0 ) { fine_freq -= 40.0; }
+        while ( fine_freq < 0.0 )  { fine_freq += 40.0; }
+
+        if ( com2_tuner_coarse != last_com2_tuner_coarse ) {
+            diff = com2_tuner_coarse - last_com2_tuner_coarse;
+            if ( abs(diff) > 4 ) {
+                // roll over
+                if ( com2_tuner_coarse < last_com2_tuner_coarse ) {
+                    // going up
+                    diff = 12 - last_com2_tuner_coarse + com2_tuner_coarse;
+                } else {
+                    // going down
+                    diff = com2_tuner_coarse - 12 - last_com2_tuner_coarse;
+                }
             }
+            coarse_freq += diff;
         }
-        coarse_freq += diff;
+        if ( coarse_freq < 118.0 ) { coarse_freq += 19.0; }
+        if ( coarse_freq > 136.0 ) { coarse_freq -= 19.0; }
+
+        last_com2_tuner_fine = com2_tuner_fine;
+        last_com2_tuner_coarse = com2_tuner_coarse;
+
+        fgSetFloat( "/radios/comm[1]/frequencies/standby-mhz",
+                    coarse_freq + fine_freq / 40.0 );
     }
-    if ( coarse_freq < 118.0 ) { coarse_freq += 19.0; }
-    if ( coarse_freq > 136.0 ) { coarse_freq -= 19.0; }
-
-    last_com2_tuner_fine = com2_tuner_fine;
-    last_com2_tuner_coarse = com2_tuner_coarse;
-
-    fgSetFloat( "/radios/comm[1]/frequencies/standby-mhz",
-                coarse_freq + fine_freq / 40.0 );
-
-    // Nav1 Tuner
-    int nav1_tuner_fine = ((radio_switch_data[9] >> 4) & 0x0f) - 1;
-    int nav1_tuner_coarse = (radio_switch_data[9] & 0x0f) - 1;
-    static int last_nav1_tuner_fine = nav1_tuner_fine;
-    static int last_nav1_tuner_coarse = nav1_tuner_coarse;
-
-    freq = nav1_stby_freq->getFloatValue();
-    coarse_freq = (int)freq;
-    fine_freq = (int)((freq - coarse_freq) * 20 + 0.5);
-
-    if ( nav1_tuner_fine != last_nav1_tuner_fine ) {
-        diff = nav1_tuner_fine - last_nav1_tuner_fine;
-        if ( abs(diff) > 4 ) {
-            // roll over
-            if ( nav1_tuner_fine < last_nav1_tuner_fine ) {
-                // going up
-                diff = 12 - last_nav1_tuner_fine + nav1_tuner_fine;
-            } else {
-                // going down
-                diff = nav1_tuner_fine - 12 - last_nav1_tuner_fine;
+
+    if ( navcom1_has_power() ) {
+        // Nav1 Tuner
+        int nav1_tuner_fine = ((radio_switch_data[9] >> 4) & 0x0f) - 1;
+        int nav1_tuner_coarse = (radio_switch_data[9] & 0x0f) - 1;
+        static int last_nav1_tuner_fine = nav1_tuner_fine;
+        static int last_nav1_tuner_coarse = nav1_tuner_coarse;
+
+        freq = nav1_stby_freq->getFloatValue();
+        coarse_freq = (int)freq;
+        fine_freq = (int)((freq - coarse_freq) * 20 + 0.5);
+
+        if ( nav1_tuner_fine != last_nav1_tuner_fine ) {
+            diff = nav1_tuner_fine - last_nav1_tuner_fine;
+            if ( abs(diff) > 4 ) {
+                // roll over
+                if ( nav1_tuner_fine < last_nav1_tuner_fine ) {
+                    // going up
+                    diff = 12 - last_nav1_tuner_fine + nav1_tuner_fine;
+                } else {
+                    // going down
+                    diff = nav1_tuner_fine - 12 - last_nav1_tuner_fine;
+                }
             }
+            fine_freq += diff;
         }
-        fine_freq += diff;
-    }
-    while ( fine_freq >= 20.0 ) { fine_freq -= 20.0; }
-    while ( fine_freq < 0.0 )  { fine_freq += 20.0; }
-
-    if ( nav1_tuner_coarse != last_nav1_tuner_coarse ) {
-        diff = nav1_tuner_coarse - last_nav1_tuner_coarse;
-        if ( abs(diff) > 4 ) {
-            // roll over
-            if ( nav1_tuner_coarse < last_nav1_tuner_coarse ) {
-                // going up
-                diff = 12 - last_nav1_tuner_coarse + nav1_tuner_coarse;
-            } else {
-                // going down
-                diff = nav1_tuner_coarse - 12 - last_nav1_tuner_coarse;
+        while ( fine_freq >= 20.0 ) { fine_freq -= 20.0; }
+        while ( fine_freq < 0.0 )  { fine_freq += 20.0; }
+
+        if ( nav1_tuner_coarse != last_nav1_tuner_coarse ) {
+            diff = nav1_tuner_coarse - last_nav1_tuner_coarse;
+            if ( abs(diff) > 4 ) {
+                // roll over
+                if ( nav1_tuner_coarse < last_nav1_tuner_coarse ) {
+                    // going up
+                    diff = 12 - last_nav1_tuner_coarse + nav1_tuner_coarse;
+                } else {
+                    // going down
+                    diff = nav1_tuner_coarse - 12 - last_nav1_tuner_coarse;
+                }
             }
+            coarse_freq += diff;
         }
-        coarse_freq += diff;
+        if ( coarse_freq < 108.0 ) { coarse_freq += 10.0; }
+        if ( coarse_freq > 117.0 ) { coarse_freq -= 10.0; }
+
+        last_nav1_tuner_fine = nav1_tuner_fine;
+        last_nav1_tuner_coarse = nav1_tuner_coarse;
+
+        fgSetFloat( "/radios/nav[0]/frequencies/standby-mhz",
+                    coarse_freq + fine_freq / 20.0 );
     }
-    if ( coarse_freq < 108.0 ) { coarse_freq += 10.0; }
-    if ( coarse_freq > 117.0 ) { coarse_freq -= 10.0; }
-
-    last_nav1_tuner_fine = nav1_tuner_fine;
-    last_nav1_tuner_coarse = nav1_tuner_coarse;
-
-    fgSetFloat( "/radios/nav[0]/frequencies/standby-mhz",
-                coarse_freq + fine_freq / 20.0 );
-
-    // Nav2 Tuner
-    int nav2_tuner_fine = ((radio_switch_data[17] >> 4) & 0x0f) - 1;
-    int nav2_tuner_coarse = (radio_switch_data[17] & 0x0f) - 1;
-    static int last_nav2_tuner_fine = nav2_tuner_fine;
-    static int last_nav2_tuner_coarse = nav2_tuner_coarse;
-
-    freq = nav2_stby_freq->getFloatValue();
-    coarse_freq = (int)freq;
-    fine_freq = (int)((freq - coarse_freq) * 20 + 0.5);
-
-    if ( nav2_tuner_fine != last_nav2_tuner_fine ) {
-        diff = nav2_tuner_fine - last_nav2_tuner_fine;
-        if ( abs(diff) > 4 ) {
-            // roll over
-            if ( nav2_tuner_fine < last_nav2_tuner_fine ) {
-                // going up
-                diff = 12 - last_nav2_tuner_fine + nav2_tuner_fine;
-            } else {
-                // going down
-                diff = nav2_tuner_fine - 12 - last_nav2_tuner_fine;
+
+    if ( navcom2_has_power() ) {
+        // Nav2 Tuner
+        int nav2_tuner_fine = ((radio_switch_data[17] >> 4) & 0x0f) - 1;
+        int nav2_tuner_coarse = (radio_switch_data[17] & 0x0f) - 1;
+        static int last_nav2_tuner_fine = nav2_tuner_fine;
+        static int last_nav2_tuner_coarse = nav2_tuner_coarse;
+
+        freq = nav2_stby_freq->getFloatValue();
+        coarse_freq = (int)freq;
+        fine_freq = (int)((freq - coarse_freq) * 20 + 0.5);
+
+        if ( nav2_tuner_fine != last_nav2_tuner_fine ) {
+            diff = nav2_tuner_fine - last_nav2_tuner_fine;
+            if ( abs(diff) > 4 ) {
+                // roll over
+                if ( nav2_tuner_fine < last_nav2_tuner_fine ) {
+                    // going up
+                    diff = 12 - last_nav2_tuner_fine + nav2_tuner_fine;
+                } else {
+                    // going down
+                    diff = nav2_tuner_fine - 12 - last_nav2_tuner_fine;
+                }
             }
+            fine_freq += diff;
         }
-        fine_freq += diff;
-    }
-    while ( fine_freq >= 20.0 ) { fine_freq -= 20.0; }
-    while ( fine_freq < 0.0 )  { fine_freq += 20.0; }
-
-    if ( nav2_tuner_coarse != last_nav2_tuner_coarse ) {
-        diff = nav2_tuner_coarse - last_nav2_tuner_coarse;
-        if ( abs(diff) > 4 ) {
-            // roll over
-            if ( nav2_tuner_coarse < last_nav2_tuner_coarse ) {
-                // going up
-                diff = 12 - last_nav2_tuner_coarse + nav2_tuner_coarse;
-            } else {
-                // going down
-                diff = nav2_tuner_coarse - 12 - last_nav2_tuner_coarse;
+        while ( fine_freq >= 20.0 ) { fine_freq -= 20.0; }
+        while ( fine_freq < 0.0 )  { fine_freq += 20.0; }
+
+        if ( nav2_tuner_coarse != last_nav2_tuner_coarse ) {
+            diff = nav2_tuner_coarse - last_nav2_tuner_coarse;
+            if ( abs(diff) > 4 ) {
+                // roll over
+                if ( nav2_tuner_coarse < last_nav2_tuner_coarse ) {
+                    // going up
+                    diff = 12 - last_nav2_tuner_coarse + nav2_tuner_coarse;
+                } else {
+                    // going down
+                    diff = nav2_tuner_coarse - 12 - last_nav2_tuner_coarse;
+                }
             }
+            coarse_freq += diff;
         }
-        coarse_freq += diff;
-    }
-    if ( coarse_freq < 108.0 ) { coarse_freq += 10.0; }
-    if ( coarse_freq > 117.0 ) { coarse_freq -= 10.0; }
+        if ( coarse_freq < 108.0 ) { coarse_freq += 10.0; }
+        if ( coarse_freq > 117.0 ) { coarse_freq -= 10.0; }
 
-    last_nav2_tuner_fine = nav2_tuner_fine;
-    last_nav2_tuner_coarse = nav2_tuner_coarse;
+        last_nav2_tuner_fine = nav2_tuner_fine;
+        last_nav2_tuner_coarse = nav2_tuner_coarse;
 
-    fgSetFloat( "/radios/nav[1]/frequencies/standby-mhz", 
-                coarse_freq + fine_freq / 20.0);
+        fgSetFloat( "/radios/nav[1]/frequencies/standby-mhz", 
+                    coarse_freq + fine_freq / 20.0);
+    }
 
     // ADF Tuner
+    
     int adf_tuner_fine = ((radio_switch_data[21] >> 4) & 0x0f) - 1;
     int adf_tuner_coarse = (radio_switch_data[21] & 0x0f) - 1;
     static int last_adf_tuner_fine = adf_tuner_fine;
     static int last_adf_tuner_coarse = adf_tuner_coarse;
 
-    // cout << "adf_stby_mode = " << adf_stby_mode->getIntValue() << endl;
-    if ( adf_count_mode->getIntValue() == 2 ) {
-        // tune count down timer
-        value = adf_elapsed_timer->getDoubleValue();
-    } else {
-        // tune frequency
-        if ( adf_stby_mode->getIntValue() == 1 ) {
-            value = adf_freq->getFloatValue();
+    if ( adf_has_power() ) {
+        // cout << "adf_stby_mode = " << adf_stby_mode->getIntValue() << endl;
+        if ( adf_count_mode->getIntValue() == 2 ) {
+            // tune count down timer
+            value = adf_elapsed_timer->getDoubleValue();
         } else {
-            value = adf_stby_freq->getFloatValue();
+            // tune frequency
+            if ( adf_stby_mode->getIntValue() == 1 ) {
+                value = adf_freq->getFloatValue();
+            } else {
+                value = adf_stby_freq->getFloatValue();
+            }
         }
-    }
 
-    if ( adf_tuner_fine != last_adf_tuner_fine ) {
-        diff = adf_tuner_fine - last_adf_tuner_fine;
-        if ( abs(diff) > 4 ) {
-            // roll over
-            if ( adf_tuner_fine < last_adf_tuner_fine ) {
-                // going up
-                diff = 12 - last_adf_tuner_fine + adf_tuner_fine;
-            } else {
-                // going down
-                diff = adf_tuner_fine - 12 - last_adf_tuner_fine;
+        if ( adf_tuner_fine != last_adf_tuner_fine ) {
+            diff = adf_tuner_fine - last_adf_tuner_fine;
+            if ( abs(diff) > 4 ) {
+                // roll over
+                if ( adf_tuner_fine < last_adf_tuner_fine ) {
+                    // going up
+                    diff = 12 - last_adf_tuner_fine + adf_tuner_fine;
+                } else {
+                    // going down
+                    diff = adf_tuner_fine - 12 - last_adf_tuner_fine;
+                }
             }
+            value += diff;
         }
-        value += diff;
-    }
 
-    if ( adf_tuner_coarse != last_adf_tuner_coarse ) {
-        diff = adf_tuner_coarse - last_adf_tuner_coarse;
-        if ( abs(diff) > 4 ) {
-            // roll over
-            if ( adf_tuner_coarse < last_adf_tuner_coarse ) {
-                // going up
-                diff = 12 - last_adf_tuner_coarse + adf_tuner_coarse;
+        if ( adf_tuner_coarse != last_adf_tuner_coarse ) {
+            diff = adf_tuner_coarse - last_adf_tuner_coarse;
+            if ( abs(diff) > 4 ) {
+                // roll over
+                if ( adf_tuner_coarse < last_adf_tuner_coarse ) {
+                    // going up
+                    diff = 12 - last_adf_tuner_coarse + adf_tuner_coarse;
+                } else {
+                    // going down
+                    diff = adf_tuner_coarse - 12 - last_adf_tuner_coarse;
+                }
+            }
+            if ( adf_count_mode->getIntValue() == 2 ) {
+                value += 60 * diff;
             } else {
-                // going down
-                diff = adf_tuner_coarse - 12 - last_adf_tuner_coarse;
+                value += 25 * diff;
             }
         }
         if ( adf_count_mode->getIntValue() == 2 ) {
-            value += 60 * diff;
+            if ( value < 0 ) { value += 3600; }
+            if ( value > 3599 ) { value -= 3600; }
         } else {
-            value += 25 * diff;
+            if ( value < 200 ) { value += 1600; }
+            if ( value > 1799 ) { value -= 1600; }
         }
-    }
-    if ( adf_count_mode->getIntValue() == 2 ) {
-        if ( value < 0 ) { value += 3600; }
-        if ( value > 3599 ) { value -= 3600; }
-    } else {
-        if ( value < 200 ) { value += 1600; }
-        if ( value > 1799 ) { value -= 1600; }
-    }
  
-    last_adf_tuner_fine = adf_tuner_fine;
-    last_adf_tuner_coarse = adf_tuner_coarse;
-
-    if ( adf_count_mode->getIntValue() == 2 ) {
-        fgSetFloat( "/radios/kr-87/outputs/elapsed-timer", value );
-    } else {
-        if ( adf_stby_mode->getIntValue() == 1 ) {
-            fgSetFloat( "/radios/kr-87/outputs/selected-khz", value );
+        if ( adf_count_mode->getIntValue() == 2 ) {
+            fgSetFloat( "/radios/kr-87/outputs/elapsed-timer", value );
         } else {
-            fgSetFloat( "/radios/kr-87/outputs/standby-khz", value );
+            if ( adf_stby_mode->getIntValue() == 1 ) {
+                fgSetFloat( "/radios/kr-87/outputs/selected-khz", value );
+            } else {
+                fgSetFloat( "/radios/kr-87/outputs/standby-khz", value );
+            }
         }
     }
+    last_adf_tuner_fine = adf_tuner_fine;
+    last_adf_tuner_coarse = adf_tuner_coarse;
+
 
     // ADF buttons 
     fgSetInt( "/radios/kr-87/inputs/adf-btn",
@@ -906,11 +1031,11 @@ bool FGATC610x::do_radio_switches() {
     fgSetInt( "/radios/kr-87/inputs/frq-btn",
               (radio_switch_data[23] >> 2 & 0x01) );
     fgSetInt( "/radios/kr-87/inputs/flt-et-btn",
-             !(radio_switch_data[23] >> 3 & 0x01) );
+                  !(radio_switch_data[23] >> 3 & 0x01) );
     fgSetInt( "/radios/kr-87/inputs/set-rst-btn",
               !(radio_switch_data[23] >> 4 & 0x01) );
     fgSetInt( "/radios/kr-87/inputs/power-btn",
-              radio_switch_data[23] >> 4 & 0x01 );
+              radio_switch_data[23] >> 5 & 0x01 );
     /* cout << "adf = " << !(radio_switch_data[23] & 0x01)
          << " bfo = " << !(radio_switch_data[23] >> 1 & 0x01)
          << " stby = " << !(radio_switch_data[23] >> 2 & 0x01)
@@ -921,13 +1046,13 @@ bool FGATC610x::do_radio_switches() {
     // Transponder Tuner
     int i;
     int digit_tuner[4];
-
     digit_tuner[0] = radio_switch_data[25] & 0x0f;
     digit_tuner[1] = ( radio_switch_data[25] >> 4 ) & 0x0f;
     digit_tuner[2] = radio_switch_data[29] & 0x0f;
     digit_tuner[3] = ( radio_switch_data[29] >> 4 ) & 0x0f;
-    static bool first_time = true;
+
     static int last_digit_tuner[4];
+    static bool first_time = true;
     if ( first_time ) {
         first_time = false;
         for ( i = 0; i < 4; ++i ) {
@@ -935,40 +1060,44 @@ bool FGATC610x::do_radio_switches() {
         }
     }
 
-    int id_code = xpdr_id_code->getIntValue();
-    int digit[4];
-    int place = 1000;
-    for ( i = 0; i < 4; ++i ) {
-        digit[i] = id_code / place;
-        id_code -= digit[i] * place;
-        place /= 10;
-    }
+    if ( xpdr_has_power() ) {
+        int id_code = xpdr_id_code->getIntValue();
+        int digit[4];
+        int place = 1000;
+        for ( i = 0; i < 4; ++i ) {
+            digit[i] = id_code / place;
+            id_code -= digit[i] * place;
+            place /= 10;
+        }
 
-    for ( i = 0; i < 4; ++i ) {
-        if ( digit_tuner[i] != last_digit_tuner[i] ) {
-            diff = digit_tuner[i] - last_digit_tuner[i];
-            if ( abs(diff) > 4 ) {
-                // roll over
-                if ( digit_tuner[i] < last_digit_tuner[i] ) {
-                    // going up
-                    diff = 15 - last_digit_tuner[i] + digit_tuner[i];
-                } else {
-                    // going down
-                    diff = digit_tuner[i] - 15 - last_digit_tuner[i];
+        for ( i = 0; i < 4; ++i ) {
+            if ( digit_tuner[i] != last_digit_tuner[i] ) {
+                diff = digit_tuner[i] - last_digit_tuner[i];
+                if ( abs(diff) > 4 ) {
+                    // roll over
+                    if ( digit_tuner[i] < last_digit_tuner[i] ) {
+                        // going up
+                        diff = 15 - last_digit_tuner[i] + digit_tuner[i];
+                    } else {
+                        // going down
+                        diff = digit_tuner[i] - 15 - last_digit_tuner[i];
+                    }
                 }
+                digit[i] += diff;
             }
-            digit[i] += diff;
+            while ( digit[i] >= 8 ) { digit[i] -= 8; }
+            while ( digit[i] < 0 )  { digit[i] += 8; }
         }
-        while ( digit[i] >= 8 ) { digit[i] -= 8; }
-        while ( digit[i] < 0 )  { digit[i] += 8; }
+
+        fgSetInt( "/radios/kt-70/inputs/digit1", digit[0] );
+        fgSetInt( "/radios/kt-70/inputs/digit2", digit[1] );
+        fgSetInt( "/radios/kt-70/inputs/digit3", digit[2] );
+        fgSetInt( "/radios/kt-70/inputs/digit4", digit[3] );
+    }
+    for ( i = 0; i < 4; ++i ) {
         last_digit_tuner[i] = digit_tuner[i];
     }
 
-    fgSetInt( "/radios/kt-70/inputs/digit1", digit[0] );
-    fgSetInt( "/radios/kt-70/inputs/digit2", digit[1] );
-    fgSetInt( "/radios/kt-70/inputs/digit3", digit[2] );
-    fgSetInt( "/radios/kt-70/inputs/digit4", digit[3] );
-
     int tmp = 0;
     for ( i = 0; i < 5; ++i ) {
         if ( radio_switch_data[27] >> i & 0x01 ) {
@@ -992,7 +1121,7 @@ bool FGATC610x::do_radio_display() {
     char digits[10];
     int i;
 
-    if ( dme_switch != 0 ) {
+    if ( dme_has_power() ) {
        // DME minutes
        float minutes = dme_min->getFloatValue();
        if ( minutes > 999 ) {
@@ -1037,120 +1166,156 @@ bool FGATC610x::do_radio_display() {
        }
     }
 
-    // Com1 standby frequency
-    float com1_stby = com1_stby_freq->getFloatValue();
-    if ( fabs(com1_stby) > 999.99 ) {
-       com1_stby = 0.0;
-    }
-    snprintf(digits, 7, "%06.3f", com1_stby);
-    for ( i = 0; i < 6; ++i ) {
-       digits[i] -= '0';
-    }
-    radio_display_data[6] = digits[4] << 4 | digits[5];
-    radio_display_data[7] = digits[1] << 4 | digits[2];
-    radio_display_data[8] = 0xf0 | digits[0];
-
-    // Com1 in use frequency
-    float com1 = com1_freq->getFloatValue();
-    if ( fabs(com1) > 999.99 ) {
-       com1 = 0.0;
-    }
-    snprintf(digits, 7, "%06.3f", com1);
-    for ( i = 0; i < 6; ++i ) {
-       digits[i] -= '0';
-    }
-    radio_display_data[9] = digits[4] << 4 | digits[5];
-    radio_display_data[10] = digits[1] << 4 | digits[2];
-    radio_display_data[11] = 0x00 | digits[0];
-    // the 0x00 in the upper nibble of the 6th byte of each display
-    // turns on the decimal point
-
-    // Com2 standby frequency
-    float com2_stby = com2_stby_freq->getFloatValue();
-    if ( fabs(com2_stby) > 999.99 ) {
-       com2_stby = 0.0;
-    }
-    snprintf(digits, 7, "%06.3f", com2_stby);
-    for ( i = 0; i < 6; ++i ) {
-       digits[i] -= '0';
-    }
-    radio_display_data[18] = digits[4] << 4 | digits[5];
-    radio_display_data[19] = digits[1] << 4 | digits[2];
-    radio_display_data[20] = 0xf0 | digits[0];
+    if ( navcom1_has_power() ) {
+        // Com1 standby frequency
+        float com1_stby = com1_stby_freq->getFloatValue();
+        if ( fabs(com1_stby) > 999.99 ) {
+            com1_stby = 0.0;
+        }
+        snprintf(digits, 7, "%06.3f", com1_stby);
+        for ( i = 0; i < 6; ++i ) {
+            digits[i] -= '0';
+        }
+        radio_display_data[6] = digits[4] << 4 | digits[5];
+        radio_display_data[7] = digits[1] << 4 | digits[2];
+        radio_display_data[8] = 0xf0 | digits[0];
+
+        // Com1 in use frequency
+        float com1 = com1_freq->getFloatValue();
+        if ( fabs(com1) > 999.99 ) {
+            com1 = 0.0;
+        }
+        snprintf(digits, 7, "%06.3f", com1);
+        for ( i = 0; i < 6; ++i ) {
+            digits[i] -= '0';
+        }
+        radio_display_data[9] = digits[4] << 4 | digits[5];
+        radio_display_data[10] = digits[1] << 4 | digits[2];
+        radio_display_data[11] = 0x00 | digits[0];
+        // the 0x00 in the upper nibble of the 6th byte of each display
+        // turns on the decimal point
+    } else {
+        radio_display_data[6] = 0xff;
+        radio_display_data[7] = 0xff;
+        radio_display_data[8] = 0xff;
+        radio_display_data[9] = 0xff;
+        radio_display_data[10] = 0xff;
+        radio_display_data[11] = 0xff;
+    }
+
+    if ( navcom2_has_power() ) {
+        // Com2 standby frequency
+        float com2_stby = com2_stby_freq->getFloatValue();
+        if ( fabs(com2_stby) > 999.99 ) {
+            com2_stby = 0.0;
+        }
+        snprintf(digits, 7, "%06.3f", com2_stby);
+        for ( i = 0; i < 6; ++i ) {
+            digits[i] -= '0';
+        }
+        radio_display_data[18] = digits[4] << 4 | digits[5];
+        radio_display_data[19] = digits[1] << 4 | digits[2];
+        radio_display_data[20] = 0xf0 | digits[0];
 
-    // Com2 in use frequency
-    float com2 = com2_freq->getFloatValue();
-    if ( fabs(com2) > 999.99 ) {
+        // Com2 in use frequency
+        float com2 = com2_freq->getFloatValue();
+        if ( fabs(com2) > 999.99 ) {
        com2 = 0.0;
-    }
-    snprintf(digits, 7, "%06.3f", com2);
-    for ( i = 0; i < 6; ++i ) {
-       digits[i] -= '0';
-    }
-    radio_display_data[21] = digits[4] << 4 | digits[5];
-    radio_display_data[22] = digits[1] << 4 | digits[2];
-    radio_display_data[23] = 0x00 | digits[0];
-    // the 0x00 in the upper nibble of the 6th byte of each display
-    // turns on the decimal point
-
-    // Nav1 standby frequency
-    float nav1_stby = nav1_stby_freq->getFloatValue();
-    if ( fabs(nav1_stby) > 999.99 ) {
+        }
+        snprintf(digits, 7, "%06.3f", com2);
+        for ( i = 0; i < 6; ++i ) {
+            digits[i] -= '0';
+        }
+        radio_display_data[21] = digits[4] << 4 | digits[5];
+        radio_display_data[22] = digits[1] << 4 | digits[2];
+        radio_display_data[23] = 0x00 | digits[0];
+        // the 0x00 in the upper nibble of the 6th byte of each display
+        // turns on the decimal point
+    } else {
+        radio_display_data[18] = 0xff;
+        radio_display_data[19] = 0xff;
+        radio_display_data[20] = 0xff;
+        radio_display_data[21] = 0xff;
+        radio_display_data[22] = 0xff;
+        radio_display_data[23] = 0xff;
+    }
+
+    if ( navcom1_has_power() ) {
+        // Nav1 standby frequency
+        float nav1_stby = nav1_stby_freq->getFloatValue();
+        if ( fabs(nav1_stby) > 999.99 ) {
        nav1_stby = 0.0;
+        }
+        snprintf(digits, 7, "%06.2f", nav1_stby);
+        for ( i = 0; i < 6; ++i ) {
+            digits[i] -= '0';
+        }
+        radio_display_data[12] = digits[4] << 4 | digits[5];
+        radio_display_data[13] = digits[1] << 4 | digits[2];
+        radio_display_data[14] = 0xf0 | digits[0];
+
+        // Nav1 in use frequency
+        float nav1 = nav1_freq->getFloatValue();
+        if ( fabs(nav1) > 999.99 ) {
+            nav1 = 0.0;
+        }
+        snprintf(digits, 7, "%06.2f", nav1);
+        for ( i = 0; i < 6; ++i ) {
+            digits[i] -= '0';
+        }
+        radio_display_data[15] = digits[4] << 4 | digits[5];
+        radio_display_data[16] = digits[1] << 4 | digits[2];
+        radio_display_data[17] = 0x00 | digits[0];
+        // the 0x00 in the upper nibble of the 6th byte of each display
+        // turns on the decimal point
+    } else {
+        radio_display_data[12] = 0xff;
+        radio_display_data[13] = 0xff;
+        radio_display_data[14] = 0xff;
+        radio_display_data[15] = 0xff;
+        radio_display_data[16] = 0xff;
+        radio_display_data[17] = 0xff;
+    }
+
+    if ( navcom2_has_power() ) {
+        // Nav2 standby frequency
+        float nav2_stby = nav2_stby_freq->getFloatValue();
+        if ( fabs(nav2_stby) > 999.99 ) {
+            nav2_stby = 0.0;
+        }
+        snprintf(digits, 7, "%06.2f", nav2_stby);
+        for ( i = 0; i < 6; ++i ) {
+            digits[i] -= '0';
+        }
+        radio_display_data[24] = digits[4] << 4 | digits[5];
+        radio_display_data[25] = digits[1] << 4 | digits[2];
+        radio_display_data[26] = 0xf0 | digits[0];
+
+        // Nav2 in use frequency
+        float nav2 = nav2_freq->getFloatValue();
+        if ( fabs(nav2) > 999.99 ) {
+            nav2 = 0.0;
+        }
+        snprintf(digits, 7, "%06.2f", nav2);
+        for ( i = 0; i < 6; ++i ) {
+            digits[i] -= '0';
+        }
+        radio_display_data[27] = digits[4] << 4 | digits[5];
+        radio_display_data[28] = digits[1] << 4 | digits[2];
+        radio_display_data[29] = 0x00 | digits[0];
+        // the 0x00 in the upper nibble of the 6th byte of each display
+        // turns on the decimal point
+    } else {
+        radio_display_data[24] = 0xff;
+        radio_display_data[25] = 0xff;
+        radio_display_data[26] = 0xff;
+        radio_display_data[27] = 0xff;
+        radio_display_data[28] = 0xff;
+        radio_display_data[29] = 0xff;
     }
-    snprintf(digits, 7, "%06.2f", nav1_stby);
-    for ( i = 0; i < 6; ++i ) {
-       digits[i] -= '0';
-    }
-    radio_display_data[12] = digits[4] << 4 | digits[5];
-    radio_display_data[13] = digits[1] << 4 | digits[2];
-    radio_display_data[14] = 0xf0 | digits[0];
-
-    // Nav1 in use frequency
-    float nav1 = nav1_freq->getFloatValue();
-    if ( fabs(nav1) > 999.99 ) {
-       nav1 = 0.0;
-    }
-    snprintf(digits, 7, "%06.2f", nav1);
-    for ( i = 0; i < 6; ++i ) {
-       digits[i] -= '0';
-    }
-    radio_display_data[15] = digits[4] << 4 | digits[5];
-    radio_display_data[16] = digits[1] << 4 | digits[2];
-    radio_display_data[17] = 0x00 | digits[0];
-    // the 0x00 in the upper nibble of the 6th byte of each display
-    // turns on the decimal point
-
-    // Nav2 standby frequency
-    float nav2_stby = nav2_stby_freq->getFloatValue();
-    if ( fabs(nav2_stby) > 999.99 ) {
-       nav2_stby = 0.0;
-    }
-    snprintf(digits, 7, "%06.2f", nav2_stby);
-    for ( i = 0; i < 6; ++i ) {
-       digits[i] -= '0';
-    }
-    radio_display_data[24] = digits[4] << 4 | digits[5];
-    radio_display_data[25] = digits[1] << 4 | digits[2];
-    radio_display_data[26] = 0xf0 | digits[0];
-
-    // Nav2 in use frequency
-    float nav2 = nav2_freq->getFloatValue();
-    if ( fabs(nav2) > 999.99 ) {
-       nav2 = 0.0;
-    }
-    snprintf(digits, 7, "%06.2f", nav2);
-    for ( i = 0; i < 6; ++i ) {
-       digits[i] -= '0';
-    }
-    radio_display_data[27] = digits[4] << 4 | digits[5];
-    radio_display_data[28] = digits[1] << 4 | digits[2];
-    radio_display_data[29] = 0x00 | digits[0];
-    // the 0x00 in the upper nibble of the 6th byte of each display
-    // turns on the decimal point
 
     // ADF standby frequency / timer
-    if ( adf_vol->getDoubleValue() >= 0.01 ) {
+    if ( adf_has_power() ) {
         if ( adf_stby_mode->getIntValue() == 0 ) {
             // frequency
             float adf_stby = adf_stby_freq->getFloatValue();
@@ -1231,40 +1396,42 @@ bool FGATC610x::do_radio_display() {
     }
     
     // Transponder code and flight level
-    if ( xpdr_func_knob->getIntValue() == 2 ) {
-        // test mode
-        radio_display_data[36] = 8 << 4 | 8;
-        radio_display_data[37] = 8 << 4 | 8;
-        radio_display_data[38] = 0xff;
-        radio_display_data[39] = 8 << 4 | 0x0f;
-        radio_display_data[40] = 8 << 4 | 8;
-    } else if ( xpdr_func_knob->getIntValue() > 0 ) {
-        // other on modes
-        int id_code = xpdr_id_code->getIntValue();
-        int place = 1000;
-        for ( i = 0; i < 4; ++i ) {
-            digits[i] = id_code / place;
-            id_code -= digits[i] * place;
-            place /= 10;
-        }
-        radio_display_data[36] = digits[2] << 4 | digits[3];
-        radio_display_data[37] = digits[0] << 4 | digits[1];
-        radio_display_data[38] = 0xff;
-
-        if ( xpdr_func_knob->getIntValue() == 3 ||
-             xpdr_func_knob->getIntValue() == 5 )
-        {
-            // do flight level display
-            snprintf(digits, 7, "%03d", xpdr_flight_level->getIntValue() );
-            for ( i = 0; i < 6; ++i ) {
-                digits[i] -= '0';
-            }
-           radio_display_data[39] = digits[2] << 4 | 0x0f;
-           radio_display_data[40] = digits[0] << 4 | digits[1];
+    if ( xpdr_has_power() ) {
+        if ( xpdr_func_knob->getIntValue() == 2 ) {
+            // test mode
+            radio_display_data[36] = 8 << 4 | 8;
+            radio_display_data[37] = 8 << 4 | 8;
+            radio_display_data[38] = 0xff;
+            radio_display_data[39] = 8 << 4 | 0x0f;
+            radio_display_data[40] = 8 << 4 | 8;
         } else {
-            // blank flight level display
-            radio_display_data[39] = 0xff;
-            radio_display_data[40] = 0xff;
+            // other on modes
+            int id_code = xpdr_id_code->getIntValue();
+            int place = 1000;
+            for ( i = 0; i < 4; ++i ) {
+                digits[i] = id_code / place;
+                id_code -= digits[i] * place;
+                place /= 10;
+            }
+            radio_display_data[36] = digits[2] << 4 | digits[3];
+            radio_display_data[37] = digits[0] << 4 | digits[1];
+            radio_display_data[38] = 0xff;
+
+            if ( xpdr_func_knob->getIntValue() == 3 ||
+                 xpdr_func_knob->getIntValue() == 5 )
+            {
+                // do flight level display
+                snprintf(digits, 7, "%03d", xpdr_flight_level->getIntValue() );
+                for ( i = 0; i < 6; ++i ) {
+                    digits[i] -= '0';
+                }
+                radio_display_data[39] = digits[2] << 4 | 0x0f;
+                radio_display_data[40] = digits[0] << 4 | digits[1];
+            } else {
+                // blank flight level display
+                radio_display_data[39] = 0xff;
+                radio_display_data[40] = 0xff;
+            }
         }
     } else {
         // off
@@ -1341,6 +1508,12 @@ bool FGATC610x::do_switches() {
     int switch_matrix[2][ATC_NUM_COLS][ATC_SWITCH_BYTES];
     update_switch_matrix( board, switch_data, switch_matrix );
 
+    // master switches
+    fgSetBool( "/controls/switches/master-bat", switch_matrix[board][4][1] );
+    fgSetBool( "/controls/switches/master-alt", switch_matrix[board][5][1] );
+    fgSetBool( "/controls/switches/master-avionics",
+               switch_matrix[board][0][3] );
+
     // magnetos and starter switch
     int magnetos = 0;
     bool starter = false;
@@ -1378,6 +1551,17 @@ bool FGATC610x::do_switches() {
         fgSetBool( "/controls/starter[0]", starter );
     }
 
+    // other toggle switches
+    fgSetBool( "/controls/fuel-pump[0]", switch_matrix[board][0][2] );
+    fgSetBool( "/controls/switches/flashing-beacon",
+               switch_matrix[board][1][2] );
+    fgSetBool( "/controls/switches/landing-light", switch_matrix[board][2][2] );
+    fgSetBool( "/controls/switches/taxi-lights", switch_matrix[board][3][2] );
+    fgSetBool( "/controls/switches/nav-lights",
+               switch_matrix[board][4][2] );
+    fgSetBool( "/controls/switches/strobe-lights", switch_matrix[board][5][2] );
+    fgSetBool( "/controls/switches/pitot-heat", switch_matrix[board][6][2] );
+
     // flaps
     float flaps = 0.0;
     if ( switch_matrix[board][6][3] ) {
@@ -1425,6 +1609,24 @@ bool FGATC610x::do_switches() {
         fgSetBool( "/controls/fuel-selector[1]", (fuel & 0x02) > 0 );
     }
 
+    // circuit breakers
+    fgSetBool( "/controls/circuit-breakers/cabin-lights-pwr",
+               switch_matrix[board][0][0] );
+    fgSetBool( "/controls/circuit-breakers/instr-ignition-switch",
+               switch_matrix[board][1][0] );
+    fgSetBool( "/controls/circuit-breakers/flaps",
+               switch_matrix[board][2][0] );
+    fgSetBool( "/controls/circuit-breakers/avn-bus-1",
+               switch_matrix[board][3][0] );
+    fgSetBool( "/controls/circuit-breakers/avn-bus-2",
+               switch_matrix[board][4][0] );
+    fgSetBool( "/controls/circuit-breakers/turn-coordinator",
+               switch_matrix[board][5][0] );
+    fgSetBool( "/controls/circuit-breakers/instrument-lights",
+               switch_matrix[board][6][0] );
+    fgSetBool( "/controls/circuit-breakers/annunciators",
+               switch_matrix[board][7][0] );
+
     return true;
 }