/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/
// System includes
#include <QScopedPointer>
#include <QProcess>
#include <QFile>
#ifdef BUILD_WIN32
# include <QSettings>
#else
# include <qsysteminfo.h>
using namespace QtMobility;
#endif // WIN32_BUILD
// User includes
#include "radiouiengine.h"
#include "radiouiengine_p.h"
#include "radiologger.h"
#include "radioenginewrapper.h"
#include "radiostationmodel.h"
#include "radiohistorymodel.h"
#include "radiosettings.h"
#include "radiostationfiltermodel.h"
#include "radioscannerengine.h"
#ifdef BUILD_WIN32
# include "radiomonitorservice_win32.h"
#else
# include "radiomonitorservice.h"
#endif
// Constants
const QString KPathFormatter = "%1:%2%3";
const QString KApplicationDir = "\\sys\\bin\\";
const QString KSongRecognitionApp = "Shazam_0x200265B3.exe";
const QString KSongRecognitionAppParams = "-listen";
struct GenreStruct
{
int mGenreCode;
const char* mInCarousel;
const char* mInStationsList;
const char* mInHomeScreen;
};
const GenreStruct EuropeanGenres[] =
{
{ GenreEurope::RdsNone, "", "", "" }
,{ GenreEurope::RdsNews, "txt_rad_info_news", "txt_rad_dblist_l1_mhz_val_news", "txt_rad_info_news_hs" }
,{ GenreEurope::RdsCurrentAffairs, "txt_rad_info_current_affairs", "txt_rad_dblist_l1_mhz_val_current_affairs", "txt_rad_info_current_affairs_hs" }
,{ GenreEurope::RdsInformation, "txt_rad_info_information", "txt_rad_dblist_l1_mhz_val_information", "txt_rad_info_information_hs" }
,{ GenreEurope::RdsSport, "txt_rad_info_sport", "txt_rad_dblist_l1_mhz_val_sport", "txt_rad_info_sport_hs" }
,{ GenreEurope::RdsEducation, "txt_rad_info_education", "txt_rad_dblist_l1_mhz_val_education", "txt_rad_info_education_hs" }
,{ GenreEurope::RdsDrama, "txt_rad_info_drama", "txt_rad_dblist_l1_mhz_val_drama", "txt_rad_info_drama_hs" }
,{ GenreEurope::RdsCulture, "txt_rad_info_culture", "txt_rad_dblist_l1_mhz_val_culture", "txt_rad_info_culture_hs" }
,{ GenreEurope::RdsScience, "txt_rad_info_science", "txt_rad_dblist_l1_mhz_val_science", "txt_rad_info_science_hs" }
,{ GenreEurope::RdsVariedSpeech, "txt_rad_info_varied", "txt_rad_dblist_l1_mhz_val_varied", "txt_rad_info_varied_hs" }
,{ GenreEurope::RdsPopMusic, "txt_rad_info_pop_music", "txt_rad_dblist_l1_mhz_val_pop_music", "txt_rad_info_pop_music_hs" }
,{ GenreEurope::RdsRockMusic, "txt_rad_info_rock_music", "txt_rad_dblist_l1_mhz_val_rock_music", "txt_rad_info_rock_music_hs" }
,{ GenreEurope::RdsEasyListening, "txt_rad_info_easy_listening", "txt_rad_dblist_l1_mhz_val_easy_listening", "txt_rad_info_easy_listening_hs" }
,{ GenreEurope::RdsLightClassical, "txt_rad_info_light_classical", "txt_rad_dblist_l1_mhz_val_light_classical", "txt_rad_info_light_classical_hs" }
,{ GenreEurope::RdsSeriousClassical, "txt_rad_info_serious_classical", "txt_rad_dblist_l1_mhz_val_serious_classical", "txt_rad_info_serious_classical_hs" }
,{ GenreEurope::RdsOtherMusic, "txt_rad_info_other_music", "txt_rad_dblist_l1_mhz_val_other_music", "txt_rad_info_other_music_hs" }
,{ GenreEurope::RdsWeather, "txt_rad_info_weather", "txt_rad_dblist_l1_mhz_val_weather", "txt_rad_info_weather_hs" }
,{ GenreEurope::RdsFinance, "txt_rad_info_finance", "txt_rad_dblist_l1_mhz_val_finance", "txt_rad_info_finance_hs" }
,{ GenreEurope::RdsChildrensProgrammes, "txt_rad_info_childrens_programmes", "txt_rad_dblist_l1_mhz_val_childrens_programmes", "txt_rad_info_childrens_programmes_hs" }
,{ GenreEurope::RdsSocialAffairs, "txt_rad_info_social_affairs", "txt_rad_dblist_l1_mhz_val_social_affairs", "txt_rad_info_social_affairs_hs" }
,{ GenreEurope::RdsReligion, "txt_rad_info_religion", "txt_rad_dblist_l1_mhz_val_religion", "txt_rad_info_religion_hs" }
,{ GenreEurope::RdsPhoneIn, "txt_rad_info_phone_in", "txt_rad_dblist_l1_mhz_val_phone_in", "txt_rad_info_phone_in_hs" }
,{ GenreEurope::RdsTravel, "txt_rad_info_travel", "txt_rad_dblist_l1_mhz_val_travel", "txt_rad_info_travel_hs" }
,{ GenreEurope::RdsLeisure, "txt_rad_info_leisure", "txt_rad_dblist_l1_mhz_val_leisure", "txt_rad_info_leisure_hs" }
,{ GenreEurope::RdsJazzMusic, "txt_rad_info_jazz_music", "txt_rad_dblist_l1_mhz_val_jazz_music", "txt_rad_info_jazz_music_hs" }
,{ GenreEurope::RdsCountryMusic, "txt_rad_info_country_music", "txt_rad_dblist_l1_mhz_val_country_music", "txt_rad_info_country_music_hs" }
,{ GenreEurope::RdsNationalMusic, "txt_rad_info_national_music", "txt_rad_dblist_l1_mhz_val_national_music", "txt_rad_info_national_music_hs" }
,{ GenreEurope::RdsOldiesMusic, "txt_rad_info_oldies_music", "txt_rad_dblist_l1_mhz_val_oldies_music", "txt_rad_info_oldies_music_hs" }
,{ GenreEurope::RdsFolkMusic, "txt_rad_info_folk_music", "txt_rad_dblist_l1_mhz_val_folk_music", "txt_rad_info_folk_music_hs" }
,{ GenreEurope::RdsDocumentary, "txt_rad_info_documentary", "txt_rad_dblist_l1_mhz_val_documentary", "txt_rad_info_documentary_hs" }
,{ GenreEurope::RdsAlarmTest, "txt_rad_info_alarm_test", "txt_rad_dblist_l1_mhz_val_alarm_test", "txt_rad_info_alarm_test_hs" }
,{ GenreEurope::RdsAlarm, "txt_rad_info_alarm", "txt_rad_dblist_l1_mhz_val_alarm", "txt_rad_info_alarm_hs" }
};
const int EuropeanGenresCount = sizeof( EuropeanGenres ) / sizeof ( EuropeanGenres[0] );
const GenreStruct AmericanGenres[] =
{
{ GenreAmerica::RbdsNone, "", "", "" }
,{ GenreAmerica::RbdsNews, "txt_rad_info_news", "txt_rad_dblist_l1_mhz_val_news", "txt_rad_info_news_hs" }
,{ GenreAmerica::RbdsInformation, "txt_rad_info_information", "txt_rad_dblist_l1_mhz_val_information", "txt_rad_info_information_hs" }
,{ GenreAmerica::RbdsSports, "txt_rad_info_sport", "txt_rad_dblist_l1_mhz_val_sport", "txt_rad_info_sport_hs" }
,{ GenreAmerica::RbdsTalk, "txt_rad_info_talk", "txt_rad_dblist_l1_mhz_val_talk", "txt_rad_info_talk_hs" }
,{ GenreAmerica::RbdsRock, "txt_rad_info_rock_music", "txt_rad_dblist_l1_mhz_val_rock_music", "txt_rad_info_rock_music_hs" } //TODO: Check
,{ GenreAmerica::RbdsClassicRock, "txt_rad_info_classic_rock", "txt_rad_dblist_l1_mhz_val_classic_rock", "txt_rad_info_classic_rock_hs" }
,{ GenreAmerica::RbdsAdultHits, "txt_rad_info_adult_hits", "txt_rad_dblist_l1_mhz_val_adult_hits", "txt_rad_info_adult_hits_hs" }
,{ GenreAmerica::RbdsSoftRock, "txt_rad_info_soft_rock", "txt_rad_dblist_l1_mhz_val_soft_rock", "txt_rad_info_soft_rock_hs" }
,{ GenreAmerica::RbdsTop40, "txt_rad_info_top_40", "txt_rad_dblist_l1_mhz_val_top_40", "txt_rad_info_top_40_hs" }
,{ GenreAmerica::RbdsCountry, "txt_rad_info_country_music", "txt_rad_dblist_l1_mhz_val_country_music", "txt_rad_info_country_music_hs" } //TODO: Check
,{ GenreAmerica::RbdsOldies, "txt_rad_info_oldies_music", "txt_rad_dblist_l1_mhz_val_oldies_music", "txt_rad_info_oldies_music_hs" } //TODO: Check
,{ GenreAmerica::RbdsSoft, "txt_rad_info_soft", "txt_rad_dblist_l1_mhz_val_soft", "txt_rad_info_soft_hs" }
,{ GenreAmerica::RbdsNostalgia, "txt_rad_info_nostalgia", "txt_rad_dblist_l1_mhz_val_nostalgia", "txt_rad_info_nostalgia_hs" }
,{ GenreAmerica::RbdsJazz, "txt_rad_info_jazz_music", "txt_rad_dblist_l1_mhz_val_jazz_music", "txt_rad_info_jazz_music_hs" } //TODO: Check
,{ GenreAmerica::RbdsClassical, "txt_rad_info_classical", "txt_rad_dblist_l1_mhz_val_classical", "txt_rad_info_classical_hs" }
,{ GenreAmerica::RbdsRhythmAndBlues, "txt_rad_info_rhythm_and_blues", "txt_rad_dblist_l1_mhz_val_rhythm_and_blues", "txt_rad_info_rhythm_and_blues_hs" }
,{ GenreAmerica::RbdsSoftRhythmAndBlues, "txt_rad_info_soft_rhythm_and_blues", "txt_rad_dblist_l1_mhz_val_soft_rhythm_and_blues", "txt_rad_info_soft_rhythm_and_blues_hs" }
,{ GenreAmerica::RbdsLanguage, "txt_rad_info_language", "txt_rad_dblist_l1_mhz_val_language", "txt_rad_info_language_hs" }
,{ GenreAmerica::RbdsReligiousMusic, "txt_rad_info_religious_music", "txt_rad_dblist_l1_mhz_val_religious_music", "txt_rad_info_religious_music_hs" }
,{ GenreAmerica::RbdsReligiousTalk, "txt_rad_info_religious_talk", "txt_rad_dblist_l1_mhz_val_religious_talk", "txt_rad_info_religious_talk_hs" }
,{ GenreAmerica::RbdsPersonality, "txt_rad_info_personality", "txt_rad_dblist_l1_mhz_val_personality", "txt_rad_info_personality_hs" }
,{ GenreAmerica::RbdsPublic, "txt_rad_info_public", "txt_rad_dblist_l1_mhz_val_public", "txt_rad_info_public_hs" }
,{ GenreAmerica::RbdsCollege, "txt_rad_info_college", "txt_rad_dblist_l1_mhz_val_college", "txt_rad_info_college_hs" }
,{ GenreAmerica::RbdsUnassigned1, "", "", "" }
,{ GenreAmerica::RbdsUnassigned2, "", "", "" }
,{ GenreAmerica::RbdsUnassigned3, "", "", "" }
,{ GenreAmerica::RbdsUnassigned4, "", "", "" }
,{ GenreAmerica::RbdsUnassigned5, "", "", "" }
,{ GenreAmerica::RbdsWeather, "txt_rad_info_weather", "txt_rad_dblist_l1_mhz_val_weather", "txt_rad_info_weather_hs" }//TODO: Check
,{ GenreAmerica::RbdsEmergencyTest, "txt_rad_info_alarm_test", "txt_rad_dblist_l1_mhz_val_alarm_test", "txt_rad_info_alarm_test_hs" }//TODO: Check
,{ GenreAmerica::RbdsEmergency, "txt_rad_info_alarm", "txt_rad_dblist_l1_mhz_val_alarm", "txt_rad_info_alarm_hs" }//TODO: Check
};
const int AmericanGenresCount = sizeof( AmericanGenres ) / sizeof ( AmericanGenres[0] );
/*!
*
*/
bool RadioUiEngine::isOfflineProfile()
{
bool offline = false;
#ifdef BUILD_WIN32
QScopedPointer<QSettings> settings( new QSettings( "Nokia", "QtFmRadio" ) );
offline = settings->value( "Offline", false ).toBool();
#else
QSystemDeviceInfo deviceInfo;
if ( deviceInfo.currentProfile() == QSystemDeviceInfo::OfflineProfile ) {
offline = true;
}
#endif
return offline;
}
/*!
*
*/
RadioUiEngine::RadioUiEngine( QObject* parent ) :
QObject( parent ),
d_ptr( new RadioUiEnginePrivate( this ) )
{
}
/*!
*
*/
RadioUiEngine::~RadioUiEngine()
{
delete d_ptr;
}
/*!
*
*/
bool RadioUiEngine::startRadio()
{
Q_D( RadioUiEngine );
return d->startRadio();
}
/*!
*
*/
bool RadioUiEngine::isFirstTimeStart()
{
Q_D( RadioUiEngine );
return d->mEngineWrapper->settings().isFirstTimeStart();
}
/*!
* Returns the settings handler owned by the engine
*/
RadioSettings& RadioUiEngine::settings()
{
Q_D( RadioUiEngine );
return d->mEngineWrapper->settings();
}
/*!
* Returns the station model
*/
RadioStationModel& RadioUiEngine::model()
{
Q_D( RadioUiEngine );
return *d->mStationModel;
}
/*!
* Returns the history model
*/
RadioHistoryModel& RadioUiEngine::historyModel()
{
Q_D( RadioUiEngine );
if ( !d->mHistoryModel ) {
d->mHistoryModel = new RadioHistoryModel( *this );
}
return *d->mHistoryModel;
}
/*!
* Returns the stations list
*/
RadioStationFilterModel* RadioUiEngine::createNewFilterModel( QObject* parent )
{
return new RadioStationFilterModel( *this, parent );
}
/*!
*
*/
RadioScannerEngine* RadioUiEngine::createScannerEngine()
{
Q_D( RadioUiEngine );
if ( d->mScannerEngine.isNull() ) {
d->mScannerEngine = new RadioScannerEngine( *d );
}
return d->mScannerEngine;
}
/*!
* Returns the stations list
*/
RadioMonitorService& RadioUiEngine::monitor()
{
Q_D( const RadioUiEngine );
return *d->mMonitorService;
}
/*!
*
*/
bool RadioUiEngine::isRadioOn() const
{
Q_D( const RadioUiEngine );
return d->mEngineWrapper->isRadioOn();
}
/*!
*
*/
bool RadioUiEngine::isScanning() const
{
Q_D( const RadioUiEngine );
return d->mScannerEngine != 0;
}
/*!
*
*/
bool RadioUiEngine::isMuted() const
{
Q_D( const RadioUiEngine );
return d->mEngineWrapper->isMuted();
}
/*!
*
*/
bool RadioUiEngine::isAntennaAttached() const
{
Q_D( const RadioUiEngine );
return d->mEngineWrapper->isAntennaAttached();
}
/*!
*
*/
bool RadioUiEngine::isUsingLoudspeaker() const
{
Q_D( const RadioUiEngine );
return d->mEngineWrapper->isUsingLoudspeaker();
}
/*!
* Returns the selected radio region
*/
RadioRegion::Region RadioUiEngine::region() const
{
Q_D( const RadioUiEngine );
return d->mEngineWrapper->region();
}
/*!
* Returns the currently tuned frequency
*/
uint RadioUiEngine::currentFrequency() const
{
Q_D( const RadioUiEngine );
return d->mEngineWrapper->currentFrequency();
}
/*!
* Returns the minimum frequency
*/
uint RadioUiEngine::minFrequency() const
{
Q_D( const RadioUiEngine );
return d->mEngineWrapper->minFrequency();
}
/*!
* Returns the maximum frequency
*/
uint RadioUiEngine::maxFrequency() const
{
Q_D( const RadioUiEngine );
return d->mEngineWrapper->maxFrequency();
}
/*!
* Returns the frequency step size from the selected region
*/
uint RadioUiEngine::frequencyStepSize() const
{
Q_D( const RadioUiEngine );
return d->mEngineWrapper->frequencyStepSize();
}
/*!
*
*/
QList<RadioStation> RadioUiEngine::stationsInRange( uint minFrequency, uint maxFrequency )
{
Q_D( RadioUiEngine );
return d->mStationModel->stationsInRange( minFrequency, maxFrequency );
}
/*!
*
*/
QString RadioUiEngine::genreToString( int genre, GenreTarget::Target target )
{
RadioRegion::Region currentRegion = region();
const GenreStruct* genreArray = currentRegion == RadioRegion::America ? AmericanGenres : EuropeanGenres;
const int genreCount = currentRegion == RadioRegion::America ? AmericanGenresCount : EuropeanGenresCount;
for( int i = 0; i < genreCount; ++i ) {
if ( genreArray[i].mGenreCode == genre ) {
if ( target == GenreTarget::Carousel ) {
return qtTrId( genreArray[i].mInCarousel );
} else if ( target == GenreTarget::StationsList ) {
return qtTrId( genreArray[i].mInStationsList );
} else if ( target == GenreTarget::HomeScreen ) {
return qtTrId( genreArray[i].mInHomeScreen );
}
}
}
return "";
}
/*!
*
*/
bool RadioUiEngine::isSongRecognitionAppAvailable()
{
//TODO: Check if there is a better way to check if an application is available
bool available = false;
// Check the Z: drive
QString fullPath = QString( KPathFormatter ).arg( "Z" ).arg( KApplicationDir ).arg( KSongRecognitionApp );
available = QFile::exists( fullPath );
LOG_FORMAT( "Checking file: %s. found %d", GETSTRING( fullPath ), available );
if ( !available ) {
// Check the C: drive
fullPath = QString( KPathFormatter ).arg( "C" ).arg( KApplicationDir ).arg( KSongRecognitionApp );
available = QFile::exists( fullPath );
LOG_FORMAT( "Checking file: %s. found %d", GETSTRING( fullPath ), available );
if ( !available ) {
// Check the E: drive
fullPath = QString( KPathFormatter ).arg( "E" ).arg( KApplicationDir ).arg( KSongRecognitionApp );
available = QFile::exists( fullPath );
LOG_FORMAT( "Checking file: %s. found %d", GETSTRING( fullPath ), available );
}
}
return available;
}
/*!
*
*/
void RadioUiEngine::addRecognizedSong( const QString& artist, const QString& title, const RadioStation& station )
{
Q_D( RadioUiEngine );
d->mHistoryModel->addItem( artist, title, station );
}
/*!
* Public slot
* Tunes to the given frequency
*/
void RadioUiEngine::tuneFrequency( uint frequency, const int sender )
{
Q_D( RadioUiEngine );
if ( frequency != d->mStationModel->currentStation().frequency() && d->mEngineWrapper->isFrequencyValid( frequency ) ) {
LOG_FORMAT( "RadioUiEngine::tuneFrequency, frequency: %d", frequency );
d->cancelSeeking();
d->mEngineWrapper->tuneFrequency( frequency, sender );
}
}
/*!
* Public slot
* Tunes to the given frequency after a delay
*/
void RadioUiEngine::tuneWithDelay( uint frequency, const int sender )
{
Q_D( RadioUiEngine );
if ( frequency != d->mStationModel->currentStation().frequency() && d->mEngineWrapper->isFrequencyValid( frequency ) ) {
LOG_FORMAT( "RadioEngineWrapperPrivate::tuneWithDelay, frequency: %d", frequency );
d->cancelSeeking();
d->mEngineWrapper->tuneWithDelay( frequency, sender );
}
}
/*!
* Public slot
* Tunes to the given preset
*/
void RadioUiEngine::tunePreset( int presetIndex )
{
Q_D( RadioUiEngine );
if ( presetIndex != d->mStationModel->currentStation().presetIndex() ) {
RadioStation station;
if ( d->mStationModel->findPresetIndex( presetIndex, station ) != RadioStation::NotFound &&
d->mEngineWrapper->isFrequencyValid( station.frequency() ) ) {
LOG_FORMAT( "RadioEngineWrapperPrivate::tunePreset, presetIndexPosition: %d", presetIndex );
d->mEngineWrapper->tuneFrequency( station.frequency(), TuneReason::Unspecified );
}
}
}
/*!
* Public slot
* volume update command slot for the engine
*/
void RadioUiEngine::setVolume( int volume )
{
Q_D( RadioUiEngine );
d->mEngineWrapper->setVolume( volume );
}
/*!
* Public slot
*
*/
void RadioUiEngine::toggleMute()
{
Q_D( RadioUiEngine );
d->mEngineWrapper->toggleMute();
}
/*!
* Public slot
*
*/
void RadioUiEngine::toggleAudioRoute()
{
Q_D( RadioUiEngine );
d->mEngineWrapper->toggleAudioRoute();
}
/*!
* Public slot
*
*/
void RadioUiEngine::skipPrevious()
{
Q_D( RadioUiEngine );
d->skip( RadioUiEnginePrivate::Previous );
}
/*!
* Public slot
*
*/
void RadioUiEngine::skipNext()
{
Q_D( RadioUiEngine );
d->skip( RadioUiEnginePrivate::Next );
}
/*!
* Public slot
*
*/
void RadioUiEngine::seekUp()
{
if ( isAntennaAttached() ) {
Q_D( RadioUiEngine );
emitSeekingStarted( Seeking::Up );
d->mEngineWrapper->startSeeking( Seeking::Up, TuneReason::Seek );
}
}
/*!
* Public slot
*
*/
void RadioUiEngine::seekDown()
{
if ( isAntennaAttached() ) {
Q_D( RadioUiEngine );
emitSeekingStarted( Seeking::Down );
d->mEngineWrapper->startSeeking( Seeking::Down, TuneReason::Seek );
}
}
/*!
* Public slot
*
*/
void RadioUiEngine::launchSongRecognition()
{
LOG_FORMAT("RadioUiEngine::launchSongRecognition() starting: %s", GETSTRING( KSongRecognitionApp ) );
QStringList arguments;
arguments << KSongRecognitionAppParams;
bool started = QProcess::startDetached( KSongRecognitionApp, arguments );
LOG_ASSERT( started, LOG_FORMAT("RadioUiEngine::launchSongRecognition() failed to start %s", GETSTRING( KSongRecognitionApp ) ) );
}
/*!
* Function used by the private implementation to emit a tunedToFrequency signal
*/
void RadioUiEngine::emitTunedToFrequency( uint frequency, int commandSender )
{
emit tunedToFrequency( frequency, commandSender );
}
/*!
* Function used by the private implementation to emit a seekingStarted signal
*/
void RadioUiEngine::emitSeekingStarted( Seeking::Direction direction )
{
emit seekingStarted( direction );
Q_D( RadioUiEngine );
d->mMonitorService->notifyRadioStatus( RadioStatus::Seeking );
}
/*!
* Function used by the private implementation to emit a radioStatusChanged signal
*/
void RadioUiEngine::emitRadioStatusChanged( bool radioIsOn )
{
emit radioStatusChanged( radioIsOn );
}
/*!
* Function used by the private implementation to emit a rdsAvailabilityChanged signal
*/
void RadioUiEngine::emitRdsAvailabilityChanged( bool available )
{
emit rdsAvailabilityChanged( available );
}
/*!
* Function used by the private implementation to emit a volumeChanged signal
*/
void RadioUiEngine::emitVolumeChanged( int volume )
{
emit volumeChanged( volume );
}
/*!
* Function used by the private implementation to emit a muteChanged signal
*/
void RadioUiEngine::emitMuteChanged( bool muted )
{
emit muteChanged( muted );
}
/*!
* Function used by the private implementation to emit a audioRouteChanged signal
*/
void RadioUiEngine::emitAudioRouteChanged( bool loudspeaker )
{
emit audioRouteChanged( loudspeaker );
}
/*!
* Function used by the private implementation to emit a antennaStatusChanged signal
*/
void RadioUiEngine::emitAntennaStatusChanged( bool connected )
{
emit antennaStatusChanged( connected );
}