]> git.mxchange.org Git - flightgear.git/blobdiff - src/Network/atc610x.cxx
Updated adf property names.
[flightgear.git] / src / Network / atc610x.cxx
index 5d0e9b0d2a29b0501db7d179eebe1f050bd6cf74..6e41ef7bc2a9b5d2448d46ec960253d14ecd9cc8 100644 (file)
@@ -396,8 +396,16 @@ bool FGATC610x::open() {
     nav2_stby_freq
        = fgGetNode( "/radios/nav[1]/frequencies/standby-mhz", true );
 
-    adf_freq = fgGetNode( "/radios/adf/frequencies/selected-khz", true );
-    adf_stby_freq = fgGetNode( "/radios/adf/frequencies/standby-khz", true );
+    adf_on_off_vol = fgGetNode( "/radios/kr-87/on-off-volume", true );
+    adf_adf_btn = fgGetNode( "/radios/kr-87/adf-btn", true );
+    adf_bfo_btn = fgGetNode( "/radios/kr-87/bfo-btn", true );
+    adf_freq = fgGetNode( "/radios/kr-87/frequencies/selected-khz", true );
+    adf_stby_freq = fgGetNode( "/radios/kr-87/frequencies/standby-khz", true );
+    adf_stby_mode = fgGetNode( "/radios/kr-87/stby-mode", true );
+    adf_timer_mode = fgGetNode( "/radios/kr-87/timer-mode", true );
+    adf_count_mode = fgGetNode( "/radios/kr-87/count-mode", true );
+    adf_flight_timer = fgGetNode( "/radios/kr-87/flight-timer", true );
+    adf_elapsed_timer = fgGetNode( "/radios/kr-87/elapsed-timer", true );
 
     inner = fgGetNode( "/radios/marker-beacon/inner", true );
     middle = fgGetNode( "/radios/marker-beacon/middle", true );
@@ -464,7 +472,7 @@ bool FGATC610x::do_analog_in() {
 
     // adf volume
     tmp = (float)analog_in_data[26] / 1024.0f;
-    fgSetFloat( "/radios/adf/volume", tmp );
+    fgSetFloat( "/radios/kr-87/on-off-volume", tmp );
 
     // nav2 obs tuner
     tmp = (float)analog_in_data[29] * 360.0f / 1024.0f;
@@ -483,12 +491,46 @@ bool FGATC610x::do_analog_in() {
 // Write the lights
 /////////////////////////////////////////////////////////////////////
 
-bool FGATC610x::do_lights() {
+bool FGATC610x::do_lights( double dt ) {
 
+    // Marker beacons
     ATC610xSetLamp( lamps_fd, 4, inner->getBoolValue() );
     ATC610xSetLamp( lamps_fd, 5, middle->getBoolValue() );
     ATC610xSetLamp( lamps_fd, 3, outer->getBoolValue() );
 
+    // ADF annunciators
+    if ( adf_on_off_vol->getDoubleValue() >= 0.01 ) {
+        ATC610xSetLamp( lamps_fd, 11, !adf_adf_btn->getBoolValue() ); // ANT
+        ATC610xSetLamp( lamps_fd, 12, adf_adf_btn->getBoolValue() ); // ADF
+        ATC610xSetLamp( lamps_fd, 13, adf_bfo_btn->getBoolValue() ); // BFO
+        ATC610xSetLamp( lamps_fd, 14, !adf_stby_mode->getBoolValue() ); // FRQ
+        ATC610xSetLamp( lamps_fd, 15, adf_stby_mode->getBoolValue() &&
+                        !adf_timer_mode->getBoolValue() ); // FLT
+
+        // ET needs to blink when we are in ET set countdown time
+        if ( adf_count_mode->getIntValue() < 2 ) {
+            ATC610xSetLamp( lamps_fd, 16, adf_stby_mode->getBoolValue() &&
+                            adf_timer_mode->getBoolValue() ); // ET
+        } else {
+            et_flash_time += dt;
+            if ( et_flash && et_flash_time > 0.5 ) {
+                et_flash = false;
+                et_flash_time -= 0.5;
+            } else if ( !et_flash && et_flash_time > 0.2 ) {
+                et_flash = true;
+                et_flash_time -= 0.2;
+            }
+            ATC610xSetLamp( lamps_fd, 16, et_flash ); // ET
+        }
+    } else {
+        ATC610xSetLamp( lamps_fd, 11, false ); // ANT
+        ATC610xSetLamp( lamps_fd, 12, false ); // ADF
+        ATC610xSetLamp( lamps_fd, 13, false ); // BFO
+        ATC610xSetLamp( lamps_fd, 14, false ); // FRQ
+        ATC610xSetLamp( lamps_fd, 15, false ); // FLT
+        ATC610xSetLamp( lamps_fd, 16, false ); // ET
+    }
+
     return true;
 }
 
@@ -498,7 +540,7 @@ bool FGATC610x::do_lights() {
 /////////////////////////////////////////////////////////////////////
 
 bool FGATC610x::do_radio_switches() {
-    float freq, coarse_freq, fine_freq;
+    double freq, coarse_freq, fine_freq, value;
     int diff;
 
     ATC610xReadRadios( radios_fd, radio_switch_data );
@@ -543,7 +585,7 @@ bool FGATC610x::do_radio_switches() {
     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",
+       fgSetFloat( "/radios/nav[0]/freqencies/selected-mhz",
                   nav1_stby_freq->getFloatValue() );
        fgSetFloat( "/radios/nav[0]/frequencies/standby-mhz", tmp );
     }
@@ -766,7 +808,17 @@ bool FGATC610x::do_radio_switches() {
     static int last_adf_tuner_fine = adf_tuner_fine;
     static int last_adf_tuner_coarse = adf_tuner_coarse;
 
-    freq = adf_stby_freq->getFloatValue();
+    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();
+        } else {
+            value = adf_stby_freq->getFloatValue();
+        }
+    }
 
     if ( adf_tuner_fine != last_adf_tuner_fine ) {
         diff = adf_tuner_fine - last_adf_tuner_fine;
@@ -780,7 +832,7 @@ bool FGATC610x::do_radio_switches() {
                 diff = adf_tuner_fine - 12 - last_adf_tuner_fine;
             }
         }
-        freq += diff;
+        value += diff;
     }
 
     if ( adf_tuner_coarse != last_adf_tuner_coarse ) {
@@ -795,15 +847,45 @@ bool FGATC610x::do_radio_switches() {
                 diff = adf_tuner_coarse - 12 - last_adf_tuner_coarse;
             }
         }
-        freq += 25 * diff;
+        if ( adf_count_mode->getIntValue() == 2 ) {
+            value += 60 * diff;
+        } else {
+            value += 25 * diff;
+        }
+    }
+    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; }
     }
-    if ( freq < 100 ) { freq += 1200; }
-    if ( freq > 1299 ) { freq -= 1200; }
  
     last_adf_tuner_fine = adf_tuner_fine;
     last_adf_tuner_coarse = adf_tuner_coarse;
 
-    fgSetFloat( "/radios/adf/frequencies/selected-khz", freq );
+    if ( adf_count_mode->getIntValue() == 2 ) {
+        fgSetFloat( "/radios/kr-87/elapsed-timer", value );
+    } else {
+        if ( adf_stby_mode->getIntValue() == 1 ) {
+            fgSetFloat( "/radios/kr-87/frequencies/selected-khz", value );
+        } else {
+            fgSetFloat( "/radios/kr-87/frequencies/standby-khz", value );
+        }
+    }
+
+    // ADF Modes 
+    fgSetInt( "/radios/kr-87/adf-btn", !(radio_switch_data[23] & 0x01) );
+    fgSetInt( "/radios/kr-87/bfo-btn", !(radio_switch_data[23] >> 1 & 0x01) );
+    fgSetInt( "/radios/kr-87/frq-btn", !(radio_switch_data[23] >> 2 & 0x01) );
+    fgSetInt( "/radios/kr-87/flt-et-btn", !(radio_switch_data[23] >> 3 & 0x01) );
+    fgSetInt( "/radios/kr-87/set-rst-btn", !(radio_switch_data[23] >> 4 & 0x01) );
+    /* cout << "adf = " << !(radio_switch_data[23] & 0x01)
+         << " bfo = " << !(radio_switch_data[23] >> 1 & 0x01)
+         << " stby = " << !(radio_switch_data[23] >> 2 & 0x01)
+         << " timer = " << !(radio_switch_data[23] >> 3 & 0x01)
+         << " set/rst = " << !(radio_switch_data[23] >> 4 & 0x01)
+         << endl; */
 
     return true;
 }
@@ -975,29 +1057,87 @@ bool FGATC610x::do_radio_display() {
     // the 0x00 in the upper nibble of the 6th byte of each display
     // turns on the decimal point
 
-    // ADF standby frequency
-    float adf_stby = adf_stby_freq->getFloatValue();
-    if ( fabs(adf_stby) > 999.99 ) {
-       adf_stby = 0.0;
-    }
-    sprintf(digits, "%03.0f", adf_stby);
-    for ( i = 0; i < 6; ++i ) {
-       digits[i] -= '0';
-    }
-    radio_display_data[30] = digits[2] << 4 | 0x0f;
-    radio_display_data[31] = digits[0] << 4 | digits[1];
+    // ADF standby frequency / timer
+    if ( adf_on_off_vol->getDoubleValue() >= 0.01 ) {
+        if ( adf_stby_mode->getIntValue() == 0 ) {
+            // frequency
+            float adf_stby = adf_stby_freq->getFloatValue();
+            if ( fabs(adf_stby) > 1799 ) {
+                adf_stby = 1799;
+            }
+            sprintf(digits, "%04.0f", adf_stby);
+            for ( i = 0; i < 6; ++i ) {
+                digits[i] -= '0';
+            }
+            radio_display_data[30] = digits[3] << 4 | 0x0f;
+            radio_display_data[31] = digits[1] << 4 | digits[2];
+            if ( digits[0] == 0 ) {
+                radio_display_data[32] = 0xff;
+            } else {
+                radio_display_data[32] = 0xf0 | digits[0];
+            }
+        } else {
+            // timer
+            double time;
+            int hours, min, sec;
+            if ( adf_timer_mode->getIntValue() == 0 ) {
+                time = adf_flight_timer->getDoubleValue();
+            } else {
+                time = adf_elapsed_timer->getDoubleValue();
+            }
+            // cout << time << endl;
+            hours = (int)(time / 3600.0);
+            time -= hours * 3600.00;
+            min = (int)(time / 60.0);
+            time -= min * 60.0;
+            sec = (int)time;
+            int big, small;
+            if ( hours > 0 ) {
+                big = hours;
+                if ( big > 99 ) {
+                    big = 99;
+                }
+                small = min;
+            } else {
+                big = min;
+                small = sec;
+            }
+            if ( big > 99 ) {
+                big = 99;
+            }
+            // cout << big << ":" << small << endl;
+            sprintf(digits, "%02d%02d", big, small);
+            for ( i = 0; i < 6; ++i ) {
+                digits[i] -= '0';
+            }
+            radio_display_data[30] = digits[3] << 4 | 0x0f;
+            radio_display_data[31] = digits[1] << 4 | digits[2];
+            radio_display_data[32] = 0xf0 | digits[0];
+        }
 
-    // ADF in use frequency
-    float adf = adf_freq->getFloatValue();
-    if ( fabs(adf) > 999.99 ) {
-       adf = 0.0;
-    }
-    sprintf(digits, "%03.0f", adf);
-    for ( i = 0; i < 6; ++i ) {
-       digits[i] -= '0';
+        // ADF in use frequency
+        float adf = adf_freq->getFloatValue();
+        if ( fabs(adf) > 1799 ) {
+            adf = 1799;
+        }
+        sprintf(digits, "%04.0f", adf);
+        for ( i = 0; i < 6; ++i ) {
+            digits[i] -= '0';
+        }
+        radio_display_data[33] = digits[2] << 4 | digits[3];
+        if ( digits[0] == 0 ) {
+            radio_display_data[34] = 0xf0 | digits[1];
+        } else {
+            radio_display_data[34] = digits[0] << 4 | digits[1];
+        }
+    } else {
+        radio_display_data[30] = 0xff;
+        radio_display_data[31] = 0xff;
+        radio_display_data[32] = 0xff;
+        radio_display_data[33] = 0xff;
+        radio_display_data[34] = 0xff;
     }
-    radio_display_data[33] = digits[1] << 4 | digits[2];
-    radio_display_data[34] = 0xf0 | digits[0];
+    
 
     ATC610xSetRadios( radios_fd, radio_display_data );
 
@@ -1128,12 +1268,17 @@ bool FGATC610x::do_switches() {
 
 
 bool FGATC610x::process() {
+    SGTimeStamp current;
+    current.stamp();
+
+    double dt = (double)(current - last_time_stamp) / 1000000;
+    last_time_stamp.stamp();
 
     // Lock the hardware, skip if it's not ready yet
     if ( ATC610xLock( lock_fd ) > 0 ) {
 
        do_analog_in();
-       do_lights();
+       do_lights( dt );
        do_radio_switches();
        do_radio_display();
        do_steppers();