X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNetwork%2Ffgcom.cxx;h=f9445ead5487eb791f3dd9233ca64634c5db4f87;hb=d5b70e98e0673f27a127aae58bd26bdfe4730825;hp=4804a164c17607655fa344ef063c507d0f8ba2c8;hpb=2bf62464cfc6d5f32b86e552d1b599913aab5f24;p=flightgear.git diff --git a/src/Network/fgcom.cxx b/src/Network/fgcom.cxx index 4804a164c..f9445ead5 100644 --- a/src/Network/fgcom.cxx +++ b/src/Network/fgcom.cxx @@ -1,6 +1,6 @@ // fgcom.cxx -- FGCom: Voice communication // -// Written by Clement de l'Hamaide, started Mai 2013. +// Written by Clement de l'Hamaide, started May 2013. // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as @@ -39,7 +39,7 @@ #include #include -#include +#include <3rdparty/iaxclient/lib/iaxclient.h> #define NUM_CALLS 4 @@ -64,11 +64,43 @@ const int special_freq[] = { // Define some freq who need to be used with NULL_I 121000, 723340 }; +static FGCom* static_instance = NULL; + + + +static int iaxc_callback( iaxc_event e ) +{ + switch( e.type ) + { + case IAXC_EVENT_TEXT: + static_instance->iaxTextEvent(e.ev.text); + break; + default: + return 0; + } + return 1; +} + + + +void FGCom::iaxTextEvent(struct iaxc_ev_text text) +{ + if( (text.type == IAXC_TEXT_TYPE_STATUS || + text.type == IAXC_TEXT_TYPE_IAX) && + _showMessages_node->getBoolValue() ) + { + _text_node->setStringValue(text.message); + } +} + + FGCom::FGCom() : - _register(true) + _register(true), + _enabled(false), + _initialized(false), + _listener_active(0) { - _listener_active = 0; } @@ -90,18 +122,19 @@ void FGCom::bind() _speakerLevel_node = node->getChild( "speaker-level", 0, true ); _selectedInput_node = node->getChild( "device-input", 0, true ); _selectedOutput_node = node->getChild( "device-output", 0, true ); + _showMessages_node = node->getChild( "show-messages", 0, true ); SGPropertyNode *reg_node = node->getChild("register", 0, true); _register_node = reg_node->getChild( "enabled", 0, true ); _username_node = reg_node->getChild( "username", 0, true ); _password_node = reg_node->getChild( "password", 0, true ); - //_nav0_node = fgGetNode("/instrumentation/nav[0]/frequencies/selected-mhz", true); - //_nav1_node = fgGetNode("/instrumentation/nav[1]/frequencies/selected-mhz", true); _comm0_node = fgGetNode("/instrumentation/comm[0]/frequencies/selected-mhz", true); - //_comm1_node = fgGetNode("/instrumentation/comm[1]/frequencies/selected-mhz", true); + _comm1_node = fgGetNode("/instrumentation/comm[1]/frequencies/selected-mhz", true); _ptt0_node = fgGetNode("/instrumentation/comm[0]/ptt", true); //FIXME: what about /instrumentation/comm[1]/ptt ? _callsign_node = fgGetNode("/sim/multiplay/callsign", true); + _text_node = fgGetNode("/sim/messages/atc", true ); + _version_node = fgGetNode("/sim/version/flightgear", true ); // Set default values if not provided if ( !_enabled_node->hasValue() ) @@ -131,6 +164,9 @@ void FGCom::bind() if ( !_password_node->hasValue() ) _password_node->setStringValue("guest"); + if ( !_showMessages_node->hasValue() ) + _showMessages_node->setBoolValue(false); + _selectedOutput_node->addChangeListener(this); _selectedInput_node->addChangeListener(this); _speakerLevel_node->addChangeListener(this); @@ -138,9 +174,7 @@ void FGCom::bind() _micLevel_node->addChangeListener(this); _enabled_node->addChangeListener(this); _comm0_node->addChangeListener(this); - //_comm1_node->addChangeListener(this); - //_nav0_node->addChangeListener(this); - //_nav1_node->addChangeListener(this); + _comm1_node->addChangeListener(this); _ptt0_node->addChangeListener(this); _test_node->addChangeListener(this); } @@ -160,16 +194,13 @@ void FGCom::init() _register = _register_node->getBoolValue(); _username = _username_node->getStringValue(); _password = _password_node->getStringValue(); + _selectedComm = 0; _currentComm0 = _comm0_node->getDoubleValue(); - //_currentComm1 = _comm1_node->getDoubleValue(); - //_currentNav0 = _nav0_node->getDoubleValue(); - //_currentNav1 = _nav1_node->getDoubleValue(); + _currentComm1 = _comm1_node->getDoubleValue(); _comm0Changed = false; - //_comm1Changed = false; - //_nav0Changed = false; - //_nav1Changed = false; + _comm1Changed = false; _maxRange = MAX_RANGE; _minRange = MIN_RANGE; @@ -189,10 +220,21 @@ void FGCom::postinit() _enabled = false; return; } + + assert( static_instance == NULL ); + static_instance = this; + iaxc_set_event_callback( iaxc_callback ); // FIXME: To be implemented in IAX audio driver //iaxc_mic_boost_set( _micBoost_node->getIntValue() ); - iaxc_set_formats( IAXC_FORMAT_GSM, IAXC_FORMAT_GSM ); + std::string app = "FGFS-"; + app += _version_node->getStringValue(); + + iaxc_set_callerid( _callsign_node->getStringValue(), app.c_str() ); + iaxc_set_formats (IAXC_FORMAT_SPEEX, IAXC_FORMAT_SPEEX); + iaxc_set_speex_settings(1, 5, 0, 1, 0, 3); + iaxc_set_filters(IAXC_FILTER_AGC | IAXC_FILTER_DENOISE); + iaxc_set_silence_threshold(-20.0); iaxc_start_processing_thread (); // Now IAXClient is initialized @@ -312,7 +354,7 @@ void FGCom::updateCall(bool& changed, int& callNo, double freqMHz) if( !isInRange(freqMHz) ) return; if( !num.empty() ) { - callNo = iaxc_call_ex(num.c_str(), _callsign.c_str(), NULL, 0 /* no video */); + callNo = iaxc_call(num.c_str()); if( callNo == -1 ) SG_LOG( SG_IO, SG_DEBUG, "FGCom: cannot call " << num.c_str() ); @@ -332,10 +374,11 @@ void FGCom::update(double dt) // For now we manage FGCom for only one freq because IAXClient // is not able to handle multiple calls at same time. - updateCall(_comm0Changed, _callComm0, _comm0_node->getDoubleValue()); - // updateCall(_comm1Changed, _callComm1, _comm1_node->getDoubleValue()); - // updateCall(_nav0Changed, _callNav0, _nav0_node->getDoubleValue()); - // updateCall(_nav1Changed, _callNav1, _nav1_node->getDoubleValue()); + if( _selectedComm == 0) { + updateCall(_comm0Changed, _callComm0, _comm0_node->getDoubleValue()); + } else { + updateCall(_comm1Changed, _callComm0, _comm1_node->getDoubleValue()); + } } @@ -349,9 +392,13 @@ void FGCom::shutdown() _initialized = false; _enabled = false; + iaxc_set_event_callback(NULL); iaxc_unregister(_regId); iaxc_stop_processing_thread(); iaxc_shutdown(); + + assert( static_instance == this ); + static_instance = NULL; } @@ -359,7 +406,12 @@ void FGCom::shutdown() void FGCom::valueChanged(SGPropertyNode *prop) { if (prop == _enabled_node) { - if( prop->getBoolValue() ) { + bool isEnabled = prop->getBoolValue(); + if (_enabled == isEnabled) { + return; + } + + if( isEnabled ) { init(); postinit(); } else { @@ -369,6 +421,18 @@ void FGCom::valueChanged(SGPropertyNode *prop) } if (prop == _ptt0_node && _enabled) { + if( _ptt0_node->getIntValue() == 2 ) { + if( _selectedComm == 0 ) { + SG_LOG( SG_IO, SG_INFO, "FGCom: change comm source to comm[1]" ); + _comm1Changed = true; + _selectedComm = 1; + } else { + SG_LOG( SG_IO, SG_INFO, "FGCom: change comm source to comm[0]" ); + _comm0Changed = true; + _selectedComm = 0; + } + return; + } if( _ptt0_node->getBoolValue() ) { iaxc_output_level_set( 0.0 ); iaxc_input_level_set( _micLevel_node->getFloatValue() ); //0.0 = min , 1.0 = max @@ -425,7 +489,7 @@ void FGCom::valueChanged(SGPropertyNode *prop) _comm0Changed = true; } } -/* + if (prop == _comm1_node) { if( _currentComm1 != prop->getDoubleValue() ) { _currentComm1 = prop->getDoubleValue(); @@ -434,21 +498,6 @@ void FGCom::valueChanged(SGPropertyNode *prop) } } - if (prop == _nav0_node) { - if( _currentNav0 != prop->getDoubleValue() ) { - _currentNav0 = prop->getDoubleValue(); - _nav0Changed = true; - } - } - - if (prop == _nav1_node) { - if( _currentNav1 != prop->getDoubleValue() ) { - _currentNav1 = prop->getDoubleValue(); - _nav1Changed = true; - } - } -*/ - _listener_active--; } @@ -458,8 +507,8 @@ void FGCom::testMode(bool testMode) { if(testMode && _initialized) { _enabled = false; - iaxc_dump_call_number(_callComm0); - iaxc_input_level_set( _micLevel_node->getFloatValue() ); + iaxc_dump_all_calls(); + iaxc_input_level_set( 1.0 ); iaxc_output_level_set( _speakerLevel_node->getFloatValue() ); std::string num = computePhoneNumber(TEST_FREQ, NULL_ICAO); if( num.size() > 0 ) { @@ -470,8 +519,10 @@ void FGCom::testMode(bool testMode) SG_LOG( SG_IO, SG_DEBUG, "FGCom: cannot call " << num.c_str() ); } else { if( _initialized ) { - iaxc_dump_call_number(_callComm0); + iaxc_dump_all_calls(); iaxc_millisleep(IAX_DELAY); + iaxc_input_level_set( 0.0 ); + iaxc_output_level_set( _speakerLevel_node->getFloatValue() ); _callComm0 = -1; _enabled = true; } @@ -517,26 +568,6 @@ std::string FGCom::getAirportCode(const double& freq) -/* - \param freq The requested frequency e.g 112.7 - \return The ICAO code as string e.g ITS -*/ -/* -std::string FGCom::getVorCode(const double& freq) const -{ - SGGeod aircraftPos = globals->get_aircraft_position(); - FGNavList::TypeFilter filter(FGPositioned::VOR); - - FGNavRecord* vor = FGNavList::findByFreq( freq, aircraftPos, &filter); - if( !vor ) { - return std::string(); - } - - return vor->get_ident(); -} -*/ - - /* \param freq The requested frequency e.g 120.825 \param iaco The associated ICAO code e.g LFMV