1
0
Fork 0

Added interface to ATC xponder hardware.

This commit is contained in:
curt 2002-07-04 21:38:37 +00:00
parent 5f37f2eaa5
commit 667f9e0dbf
2 changed files with 145 additions and 7 deletions

View file

@ -418,6 +418,21 @@ bool FGATC610x::open() {
middle = fgGetNode( "/radios/marker-beacon/middle", true );
outer = fgGetNode( "/radios/marker-beacon/outer", true );
xpdr_ident_btn = fgGetNode( "/radios/kt-70/inputs/ident-btn", true );
xpdr_digit1 = fgGetNode( "/radios/kt-70/inputs/digit1", true );
xpdr_digit2 = fgGetNode( "/radios/kt-70/inputs/digit2", true );
xpdr_digit3 = fgGetNode( "/radios/kt-70/inputs/digit3", true );
xpdr_digit4 = fgGetNode( "/radios/kt-70/inputs/digit4", true );
xpdr_func_knob = fgGetNode( "/radios/kt-70/inputs/func-knob", true );
xpdr_id_code = fgGetNode( "/radios/kt-70/outputs/id-code", true );
xpdr_flight_level = fgGetNode( "/radios/kt-70/outputs/flight-level", true );
xpdr_fl_ann = fgGetNode( "/radios/kt-70/annunciators/fl", true );
xpdr_alt_ann = fgGetNode( "/radios/kt-70/annunciators/alt", true );
xpdr_gnd_ann = fgGetNode( "/radios/kt-70/annunciators/gnd", true );
xpdr_on_ann = fgGetNode( "/radios/kt-70/annunciators/on", true );
xpdr_sby_ann = fgGetNode( "/radios/kt-70/annunciators/sby", true );
xpdr_reply_ann = fgGetNode( "/radios/kt-70/annunciators/reply", true );
return true;
}
@ -513,6 +528,14 @@ bool FGATC610x::do_lights() {
ATC610xSetLamp( lamps_fd, 15, adf_flt_ann->getBoolValue() ); // FLT
ATC610xSetLamp( lamps_fd, 16, adf_et_ann->getBoolValue() ); // ET
// Transponder annunciators
ATC610xSetLamp( lamps_fd, 17, xpdr_fl_ann->getBoolValue() ); // FL
ATC610xSetLamp( lamps_fd, 18, xpdr_alt_ann->getBoolValue() ); // ALT
ATC610xSetLamp( lamps_fd, 19, xpdr_gnd_ann->getBoolValue() ); // GND
ATC610xSetLamp( lamps_fd, 20, xpdr_on_ann->getBoolValue() ); // ON
ATC610xSetLamp( lamps_fd, 21, xpdr_sby_ann->getBoolValue() ); // SBY
ATC610xSetLamp( lamps_fd, 22, xpdr_reply_ann->getBoolValue() ); // R
return true;
}
@ -567,7 +590,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]/freqencies/selected-mhz",
fgSetFloat( "/radios/nav[0]/frequencies/selected-mhz",
nav1_stby_freq->getFloatValue() );
fgSetFloat( "/radios/nav[0]/frequencies/standby-mhz", tmp );
}
@ -856,12 +879,17 @@ bool FGATC610x::do_radio_switches() {
}
}
// ADF Modes
fgSetInt( "/radios/kr-87/inputs/adf-btn", !(radio_switch_data[23] & 0x01) );
fgSetInt( "/radios/kr-87/inputs/bfo-btn", !(radio_switch_data[23] >> 1 & 0x01) );
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) );
fgSetInt( "/radios/kr-87/inputs/set-rst-btn", !(radio_switch_data[23] >> 4 & 0x01) );
// ADF buttons
fgSetInt( "/radios/kr-87/inputs/adf-btn",
!(radio_switch_data[23] & 0x01) );
fgSetInt( "/radios/kr-87/inputs/bfo-btn",
!(radio_switch_data[23] >> 1 & 0x01) );
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) );
fgSetInt( "/radios/kr-87/inputs/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)
@ -869,6 +897,67 @@ bool FGATC610x::do_radio_switches() {
<< " set/rst = " << !(radio_switch_data[23] >> 4 & 0x01)
<< endl; */
// 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];
if ( first_time ) {
first_time = false;
for ( i = 0; i < 4; ++i ) {
last_digit_tuner[i] = digit_tuner[i];
}
}
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];
}
}
digit[i] += diff;
}
while ( digit[i] >= 8 ) { digit[i] -= 8; }
while ( digit[i] < 0 ) { digit[i] += 8; }
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 ( int i = 0; i < 5; ++i ) {
if ( radio_switch_data[27] >> i & 0x01 ) {
tmp = i + 1;
}
}
fgSetInt( "/radios/kt-70/inputs/func-knob", tmp );
fgSetInt( "/radios/kt-70/inputs/ident-btn",
!(radio_switch_data[27] >> 5 & 0x01) );
return true;
}
@ -1120,6 +1209,50 @@ bool FGATC610x::do_radio_display() {
radio_display_data[34] = 0xff;
}
// 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
sprintf(digits, "%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
radio_display_data[36] = 0xff;
radio_display_data[37] = 0xff;
radio_display_data[38] = 0xff;
radio_display_data[39] = 0xff;
radio_display_data[40] = 0xff;
}
ATC610xSetRadios( radios_fd, radio_display_data );

View file

@ -84,6 +84,11 @@ class FGATC610x : public FGProtocol {
SGPropertyNode *adf_ant_ann, *adf_adf_ann, *adf_bfo_ann, *adf_frq_ann;
SGPropertyNode *adf_flt_ann, *adf_et_ann;
SGPropertyNode *inner, *middle, *outer;
SGPropertyNode *xpdr_ident_btn;
SGPropertyNode *xpdr_digit1, *xpdr_digit2, *xpdr_digit3, *xpdr_digit4;
SGPropertyNode *xpdr_func_knob, *xpdr_id_code, *xpdr_flight_level;
SGPropertyNode *xpdr_fl_ann, *xpdr_alt_ann, *xpdr_gnd_ann, *xpdr_on_ann;
SGPropertyNode *xpdr_sby_ann, *xpdr_reply_ann;
int dme_switch;