1
0
Fork 0

Melchior FRANZ:

All necessary elements for an ADF gauge had been migrated from
Cockpit/kr_87.cxx to Instrumentation/adf.cxx. Migrating the sound
related elements was apparently planned, but not done yet. This
intermediate state broke the ident morse sound: it couldn't get
turned off and it always indicated "SF", regardless of the tuned-in
frequency. The following patches continue the migration:


adf-radio.diff     => Base/Aircraft/Instruments/adf-radio.xml:
---------------------------------------------------------------
* sets maximum volume to 1 (rather than 2); Not only is 1
  loud enough (and 2 unpleasantly noisy), it also prevents
  the knob from being turned to non-existant positions.  :-)
* fixes wrong use of /instrumentation/adf/ident
* the voice/ident selector(?) remains unchanged, but as it's
  not switched to "IDENT", there'll be no ident sound by default
  this is consistent with other sounds and DME.


radiostack.diff    => src/Cockpit/radiostack.[ch]xx:
---------------------------------------------------------------
* comment out use of FGKR_87 class. kr_87.[ch]xx is now no
  longer used. kr-87adf.xml would no longer work, either, but
  isn't used anywhere, anyway. Future adf radios have to use
  the adf instrument, using xml/Nasal for specific hardware
  implementation details.


adf.diff           => src/Instrumentation/adf.[ch]xx:
---------------------------------------------------------------
* adds ident morse sound capability using two new input
  properties:
  - /instrumentation/adf/volume-norm  (double)
  - /instrumentation/adf/ident-audible  (bool)
This commit is contained in:
ehofman 2004-08-19 11:54:57 +00:00
parent 02d721f8c9
commit 5c18572c64
4 changed files with 77 additions and 11 deletions

View file

@ -50,7 +50,7 @@ FGRadioStack::FGRadioStack() {
// Destructor // Destructor
FGRadioStack::~FGRadioStack() FGRadioStack::~FGRadioStack()
{ {
adf.unbind(); //adf.unbind();
beacon.unbind(); beacon.unbind();
navcom1.unbind(); navcom1.unbind();
navcom2.unbind(); navcom2.unbind();
@ -67,7 +67,7 @@ FGRadioStack::init ()
navcom2.set_bind_index( 1 ); navcom2.set_bind_index( 1 );
navcom2.init(); navcom2.init();
adf.init(); //adf.init();
beacon.init(); beacon.init();
xponder.init(); xponder.init();
@ -83,7 +83,7 @@ FGRadioStack::init ()
void void
FGRadioStack::bind () FGRadioStack::bind ()
{ {
adf.bind(); //adf.bind();
beacon.bind(); beacon.bind();
dme.bind(); dme.bind();
navcom1.set_bind_index( 0 ); navcom1.set_bind_index( 0 );
@ -97,7 +97,7 @@ FGRadioStack::bind ()
void void
FGRadioStack::unbind () FGRadioStack::unbind ()
{ {
adf.unbind(); //adf.unbind();
beacon.unbind(); beacon.unbind();
dme.unbind(); dme.unbind();
navcom1.unbind(); navcom1.unbind();
@ -110,7 +110,7 @@ FGRadioStack::unbind ()
void void
FGRadioStack::update(double dt) FGRadioStack::update(double dt)
{ {
adf.update( dt ); //adf.update( dt );
beacon.update( dt ); beacon.update( dt );
navcom1.update( dt ); navcom1.update( dt );
navcom2.update( dt ); navcom2.update( dt );
@ -122,7 +122,7 @@ FGRadioStack::update(double dt)
// Update current nav/adf radio stations based on current postition // Update current nav/adf radio stations based on current postition
void FGRadioStack::search() void FGRadioStack::search()
{ {
adf.search(); //adf.search();
beacon.search(); beacon.search();
navcom1.search(); navcom1.search();
navcom2.search(); navcom2.search();

View file

@ -46,7 +46,7 @@
class FGRadioStack : public SGSubsystem class FGRadioStack : public SGSubsystem
{ {
FGDME dme; FGDME dme;
FGKR_87 adf; // King KR 87 Digital ADF model //FGKR_87 adf; // King KR 87 Digital ADF model
FGKT_70 xponder; // Bendix/King KT 70 Panel-Mounted Transponder FGKT_70 xponder; // Bendix/King KT 70 Panel-Mounted Transponder
FGMarkerBeacon beacon; FGMarkerBeacon beacon;
FGNavCom navcom1; FGNavCom navcom1;

View file

@ -53,7 +53,10 @@ ADF::ADF ()
_last_frequency_khz(-1), _last_frequency_khz(-1),
_transmitter_valid(false), _transmitter_valid(false),
_transmitter_elevation_ft(0), _transmitter_elevation_ft(0),
_transmitter_range_nm(0) _transmitter_range_nm(0),
_ident_count(0),
_last_ident_time(0),
_last_volume(-1)
{ {
} }
@ -79,6 +82,9 @@ ADF::init ()
_bearing_node = _bearing_node =
fgGetNode("/instrumentation/adf/indicated-bearing-deg", true); fgGetNode("/instrumentation/adf/indicated-bearing-deg", true);
_ident_node = fgGetNode("/instrumentation/adf/ident", true); _ident_node = fgGetNode("/instrumentation/adf/ident", true);
_volume_node = fgGetNode("/instrumentation/adf/volume-norm", true);
_ident_audible = fgGetNode("/instrumentation/adf/ident-audible", true);
morse.init();
} }
void void
@ -146,10 +152,42 @@ ADF::update (double delta_time_sec)
if (bearing < 0) if (bearing < 0)
bearing += 360; bearing += 360;
set_bearing(delta_time_sec, bearing); set_bearing(delta_time_sec, bearing);
// adf ident sound
double volume;
if ( _ident_audible->getBoolValue() )
volume = _volume_node->getDoubleValue();
else
volume = 0.0;
if ( volume != _last_volume ) {
_last_volume = volume;
SGSoundSample *sound;
sound = globals->get_soundmgr()->find( "adf-ident" );
if ( sound != NULL )
sound->set_volume( volume );
else
SG_LOG( SG_GENERAL, SG_ALERT, "Can't find adf-ident sound" );
}
double cur_time = globals->get_time_params()->get_cur_time();
if ( _last_ident_time < cur_time - 30 ) {
_last_ident_time = cur_time;
_ident_count = 0;
}
if ( _ident_count < 4 ) {
if ( !globals->get_soundmgr()->is_playing("adf-ident") ) {
globals->get_soundmgr()->play_once( "adf-ident" );
++_ident_count;
}
}
} else { } else {
_in_range_node->setBoolValue(false); _in_range_node->setBoolValue(false);
set_bearing(delta_time_sec, 90); set_bearing(delta_time_sec, 90);
_ident_node->setStringValue(""); _ident_node->setStringValue("");
globals->get_soundmgr()->stop( "adf-ident" );
} }
} }
@ -158,7 +196,6 @@ ADF::search (double frequency_khz, double longitude_rad,
double latitude_rad, double altitude_m) double latitude_rad, double altitude_m)
{ {
string ident = ""; string ident = "";
// reset search time // reset search time
_time_before_search_sec = 1.0; _time_before_search_sec = 1.0;
@ -178,8 +215,27 @@ ADF::search (double frequency_khz, double longitude_rad,
_transmitter_range_nm = nav->get_range(); _transmitter_range_nm = nav->get_range();
} }
} }
_last_ident = ident;
_ident_node->setStringValue(ident.c_str()); if ( _last_ident != ident ) {
_last_ident = ident;
_ident_node->setStringValue(ident.c_str());
if ( globals->get_soundmgr()->exists( "adf-ident" ) ) {
globals->get_soundmgr()->stop( "adf-ident" );
globals->get_soundmgr()->remove( "adf-ident" );
}
SGSoundSample *sound;
sound = morse.make_ident( ident, LO_FREQUENCY );
sound->set_volume(0);
_last_volume = -1;
globals->get_soundmgr()->add( sound, "adf-ident" );
int offset = (int)(sg_random() * 30.0);
_ident_count = offset / 4;
_last_ident_time = globals->get_time_params()->get_cur_time() -
offset;
}
} }
void void

View file

@ -17,6 +17,7 @@
#include <simgear/props/props.hxx> #include <simgear/props/props.hxx>
#include <simgear/structure/subsystem_mgr.hxx> #include <simgear/structure/subsystem_mgr.hxx>
#include <Sound/morse.hxx>
SG_USING_STD(string); SG_USING_STD(string);
@ -35,6 +36,8 @@ SG_USING_STD(string);
* /instrumentation/adf/error-deg * /instrumentation/adf/error-deg
* /instrumentation/adf/frequencies/selected-khz * /instrumentation/adf/frequencies/selected-khz
* /instrumentation/adf/mode * /instrumentation/adf/mode
* /instrumentation/adf/ident-audible
* /instrumentation/adf/volume-norm
* *
* Output properties: * Output properties:
* *
@ -73,6 +76,13 @@ private:
SGPropertyNode_ptr _in_range_node; SGPropertyNode_ptr _in_range_node;
SGPropertyNode_ptr _bearing_node; SGPropertyNode_ptr _bearing_node;
SGPropertyNode_ptr _ident_node; SGPropertyNode_ptr _ident_node;
SGPropertyNode_ptr _ident_audible;
SGPropertyNode_ptr _volume_node;
FGMorse morse;
int _ident_count;
time_t _last_ident_time;
double _last_volume;
double _time_before_search_sec; double _time_before_search_sec;